/whambush/apps/api/v1_2/services.py

https://gitlab.com/urbanjunglestudio/whambush-api · Python · 117 lines · 91 code · 23 blank · 3 comment · 26 complexity · d7fedd6664096fdb18705788882d0fba MD5 · raw file

  1. from django.http import Http404
  2. from rest_framework import status
  3. from rest_framework.response import Response
  4. from whambush.apps.accounts.models import WhamUser
  5. from whambush.apps.likes.models import Like
  6. from whambush.apps.videos.models import Video
  7. from whambush.apps.promotions.models import PromotionKey
  8. import warnings
  9. def response_invalid_args():
  10. return Response(
  11. {'success': False, 'detail': 'Invalid arguments'},
  12. status=status.HTTP_400_BAD_REQUEST
  13. )
  14. def user_likes_video(user, video_id, point=1):
  15. try:
  16. like = Like.objects.get(user=user, video=video_id)
  17. if like.point == point*-1:
  18. like.delete()
  19. raise Like.DoesNotExist()
  20. except Like.DoesNotExist:
  21. try:
  22. video = Video.objects.get(pk=video_id)
  23. except Video.DoesNotExist:
  24. return False
  25. Like.objects.create(user=user, video=video, point=point)
  26. return get_likes_on_video(video_id)
  27. def user_unlikes_video(user, video_id, point=1):
  28. try:
  29. like = Like.objects.get(user=user, video=video_id, point=point)
  30. except Like.DoesNotExist:
  31. return get_likes_on_video(video_id)
  32. like.delete()
  33. return get_likes_on_video(video_id)
  34. def get_likes_on_video(video_id):
  35. if video_id is None or not video_id.isdigit():
  36. return response_invalid_args()
  37. likes = Like.objects.filter(video=video_id, point=1).count()
  38. dislikes = Like.objects.filter(video=video_id, point=-1).count()
  39. return [likes, dislikes]
  40. def user_owns(user, obj):
  41. if isinstance(user, WhamUser):
  42. if obj.user is not None:
  43. return obj.user == user
  44. else:
  45. return True
  46. else:
  47. return False
  48. def delete_comment(comment, user):
  49. video = comment.content_object
  50. if user_owns(user, comment) or user_owns(user, video):
  51. comment.is_removed = True
  52. comment.save()
  53. return True
  54. else:
  55. return False
  56. def get_serializer_listview(cls):
  57. cls.object_list = cls.filter_queryset(cls.get_queryset())
  58. # Default is to allow empty querysets. This can be altered by setting
  59. # `.allow_empty = False`, to raise 404 errors on empty querysets.
  60. if not cls.allow_empty and not cls.object_list:
  61. warnings.warn(
  62. 'The `allow_empty` parameter is due to be deprecated. '
  63. 'To use `allow_empty=False` style behavior, You should override '
  64. '`get_queryset()` and explicitly raise a 404 on empty querysets.',
  65. PendingDeprecationWarning
  66. )
  67. class_name = cls.__class__.__name__
  68. error_msg = cls.empty_error % {'class_name': class_name}
  69. raise Http404(error_msg)
  70. # Switch between paginated or standard style responses
  71. page = cls.paginate_queryset(cls.object_list)
  72. if page is not None:
  73. return cls.get_pagination_serializer(page)
  74. else:
  75. return cls.get_serializer(cls.object_list, many=True)
  76. def verify_promo_code(code):
  77. if not code:
  78. return (
  79. False,
  80. {'promocode': 'Promocode is required.'},
  81. )
  82. try:
  83. key = PromotionKey.objects.get(key=code)
  84. except PromotionKey.DoesNotExist:
  85. return (False, {'promocode': 'Invalid code.'})
  86. else:
  87. if key.is_used:
  88. return (
  89. False, {'promocode': 'Code is already used.'}
  90. )
  91. else:
  92. key.is_used = True
  93. key.save()
  94. return (True, None)