views.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. from django.db.models import Q
  2. from django.http import HttpResponse
  3. from django.shortcuts import render, redirect
  4. from apps.main.models import Playlist
  5. from django.contrib.auth.decorators import login_required # redirects user to settings.LOGIN_URL
  6. from allauth.socialaccount.models import SocialToken
  7. from django.views.decorators.http import require_POST
  8. from django.contrib import messages
  9. from django.template import Context, loader
  10. # Create your views here.
  11. @login_required
  12. def home(request):
  13. user_profile = request.user.profile
  14. user_playlists = user_profile.playlists.order_by("-num_of_accesses")
  15. watching = user_profile.playlists.filter(marked_as="watching").order_by("-num_of_accesses")
  16. #### FOR NEWLY JOINED USERS ######
  17. channel_found = True
  18. if user_profile.just_joined:
  19. if user_profile.import_in_progress:
  20. return render(request, "import_in_progress.html")
  21. else:
  22. if user_profile.access_token == "" or user_profile.refresh_token == "":
  23. user_social_token = SocialToken.objects.get(account__user=request.user)
  24. print("refresh toekn", user_social_token.token_secret)
  25. print("access token", user_social_token.token)
  26. user_profile.access_token = user_social_token.token
  27. user_profile.refresh_token = user_social_token.token_secret
  28. user_profile.expires_at = user_social_token.expires_at
  29. request.user.save()
  30. user_profile.just_joined = False
  31. user_profile.save()
  32. return render(request, "home.html", {"import_successful": True})
  33. # if Playlist.objects.getUserYTChannelID(request.user) == -1: # user channel not found
  34. # channel_found = False
  35. # else:
  36. # Playlist.objects.initPlaylist(request.user, None) # get all playlists from user's YT channel
  37. # return render(request, "home.html", {"import_successful": True})
  38. ##################################
  39. if request.method == "POST":
  40. print(request.POST)
  41. if Playlist.objects.initPlaylist(request.user, request.POST['playlist-id'].strip()) == -1:
  42. print("No such playlist found.")
  43. playlist = []
  44. videos = []
  45. else:
  46. playlist = user_profile.playlists.get(playlist_id__exact=request.POST['playlist-id'].strip())
  47. videos = playlist.videos.all()
  48. else: # GET request
  49. videos = []
  50. playlist = []
  51. print("TESTING")
  52. return render(request, 'home.html', {"channel_found": channel_found,
  53. "playlist": playlist,
  54. "videos": videos,
  55. "user_playlists": user_playlists,
  56. "watching": watching})
  57. @login_required
  58. def view_video(request, playlist_id, video_id):
  59. video = request.user.profile.playlists.get(playlist_id=playlist_id).videos.get(video_id=video_id)
  60. print(video.name)
  61. return HttpResponse(loader.get_template("intercooler/video_details.html").render({"video": video}))
  62. @login_required
  63. def video_notes(request, playlist_id, video_id):
  64. video = request.user.profile.playlists.get(playlist_id=playlist_id).videos.get(video_id=video_id)
  65. if request.method == "POST":
  66. if 'video-notes-text-area' in request.POST:
  67. video.user_notes = request.POST['video-notes-text-area']
  68. video.save()
  69. return HttpResponse(loader.get_template("intercooler/messages.html").render(
  70. {"message_type": "success", "message_content": "Saved!"}))
  71. else:
  72. print("GET VIDEO NOTES")
  73. return HttpResponse(loader.get_template("intercooler/video_notes.html").render({"video": video,
  74. "playlist_id": playlist_id}))
  75. @login_required
  76. def view_playlist(request, playlist_id):
  77. user_profile = request.user.profile
  78. user_playlists = user_profile.playlists.all()
  79. # specific playlist requested
  80. playlist = user_profile.playlists.get(playlist_id__exact=playlist_id)
  81. playlist.num_of_accesses += 1
  82. playlist.save()
  83. videos = playlist.videos.all()
  84. if not playlist.has_playlist_changed:
  85. Playlist.objects.checkIfPlaylistChangedOnYT(request.user, playlist_id)
  86. return render(request, 'view_playlist.html', {"playlist": playlist,
  87. "videos": videos,
  88. "user_playlists": user_playlists})
  89. @login_required
  90. def all_playlists(request, playlist_type):
  91. if playlist_type == "" or playlist_type.lower() == "all":
  92. playlists = request.user.profile.playlists.all()
  93. playlist_type_display = "All Playlists"
  94. elif playlist_type.lower() == "favorites":
  95. playlists = request.user.profile.playlists.filter(marked_as="favorite")
  96. playlist_type_display = "Favorites"
  97. elif playlist_type.lower() == "watching":
  98. playlists = request.user.profile.playlists.filter(marked_as="watching")
  99. playlist_type_display = "Watching"
  100. elif playlist_type.lower() == "home": # displays cards of all playlist types
  101. return render(request, 'playlists_home.html')
  102. else:
  103. return redirect('home')
  104. return render(request, 'all_playlists.html', {"playlists": playlists,
  105. "playlist_type": playlist_type,
  106. "playlist_type_display": playlist_type_display})
  107. @login_required
  108. def order_playlist_by(request, playlist_id, order_by):
  109. playlist = request.user.profile.playlists.get(playlist_id=playlist_id)
  110. if order_by == "popularity":
  111. videos = playlist.videos.order_by("-like_count")
  112. elif order_by == "date-published":
  113. videos = playlist.videos.order_by("-published_at")
  114. elif order_by == "views":
  115. videos = playlist.videos.order_by("-view_count")
  116. elif order_by == "has-cc":
  117. videos = playlist.videos.filter(has_cc=True)
  118. elif order_by == "duration":
  119. videos = playlist.videos.order_by("-duration_in_seconds")
  120. else:
  121. return redirect('home')
  122. return HttpResponse(loader.get_template("intercooler/videos.html").render({"playlist": playlist, "videos": videos}))
  123. @login_required
  124. def order_playlists_by(request, playlist_type, order_by):
  125. if playlist_type == "" or playlist_type.lower() == "all":
  126. playlists = request.user.profile.playlists.all().order_by(f"-{order_by.replace('-', '_')}")
  127. playlist_type = "All Playlists"
  128. elif playlist_type.lower() == "favorites":
  129. playlists = request.user.profile.playlists.filter(is_favorite=True).order_by(f"-{order_by.replace('-', '_')}")
  130. playlist_type = "Favorites"
  131. elif playlist_type.lower() == "watching":
  132. playlists = request.user.profile.playlists.filter(on_watch=True).order_by(f"-{order_by.replace('-', '_')}")
  133. playlist_type = "Watching"
  134. else:
  135. return redirect('home')
  136. return render(request, 'all_playlists.html', {"playlists": playlists, "playlist_type": playlist_type})
  137. @login_required
  138. def mark_playlist_as(request, playlist_id, mark_as):
  139. playlist = request.user.profile.playlists.get(playlist_id=playlist_id)
  140. if mark_as in ["none", "watching", "on-hold", "plan-to-watch"]:
  141. playlist.marked_as = mark_as.replace("-", " ")
  142. playlist.save()
  143. videos = playlist.videos.all()
  144. else:
  145. return render('home')
  146. return HttpResponse(mark_as.replace("-", " "))
  147. @login_required
  148. def playlists_home(request):
  149. return render(request, 'playlists_home.html')
  150. @login_required
  151. @require_POST
  152. def delete_videos(request):
  153. print(request.POST)
  154. return HttpResponse("Worked!")
  155. @login_required
  156. @require_POST
  157. def search_playlists(request, playlist_type):
  158. # TODO: make an AJAX call to /search to search for a name in user's playlists
  159. print(request.POST) # prints <QueryDict: {'search': ['aa']}>
  160. search_query = request.POST["search"]
  161. print(search_query)
  162. if playlist_type == "all":
  163. try:
  164. playlists = request.user.profile.playlists.filter(name__startswith=search_query)
  165. except:
  166. playlists = request.user.profile.playlists.all()
  167. playlist_type_display = "All Playlists"
  168. elif playlist_type == "watching":
  169. try:
  170. playlists = request.user.profile.playlists.filter(
  171. Q(name__startswith=search_query) & Q(marked_as=playlist_type))
  172. except:
  173. playlists = request.user.profile.playlists.all()
  174. playlist_type_display = "Watching"
  175. return HttpResponse(loader.get_template("intercooler/playlists.html")
  176. .render({"playlists": playlists,
  177. "playlist_type_display": playlist_type_display,
  178. "playlist_type": playlist_type,
  179. "search_query": search_query}))
  180. #### MANAGE VIDEOS
  181. def mark_video_favortie(request, playlist_id, video_id):
  182. video = request.user.profile.playlists.get(playlist_id=playlist_id).videos.get(video_id=video_id)
  183. if video.is_favorite:
  184. video.is_favorite = False
  185. video.save()
  186. return HttpResponse('<i class="far fa-heart"></i>')
  187. else:
  188. video.is_favorite = True
  189. video.save()
  190. return HttpResponse('<i class="fas fa-heart"></i>')
  191. @login_required
  192. @require_POST
  193. def search_UnTube(request):
  194. print(request.POST)
  195. search_query = request.POST["search"]
  196. all_playlists = request.user.profile.playlists.all()
  197. videos = []
  198. starts_with = False
  199. contains = False
  200. if request.POST['search-settings'] == 'starts-with':
  201. playlists = request.user.profile.playlists.filter(name__startswith=search_query) if search_query != "" else []
  202. if search_query != "":
  203. for playlist in all_playlists:
  204. pl_videos = playlist.videos.filter(name__startswith=search_query)
  205. if pl_videos.count() != 0:
  206. for v in pl_videos.all():
  207. videos.append(v)
  208. starts_with = True
  209. else:
  210. playlists = request.user.profile.playlists.filter(name__contains=search_query) if search_query != "" else []
  211. if search_query != "":
  212. for playlist in all_playlists:
  213. pl_videos = playlist.videos.filter(name__contains=search_query)
  214. if pl_videos.count() != 0:
  215. for v in pl_videos.all():
  216. videos.append(v)
  217. contains = True
  218. return HttpResponse(loader.get_template("intercooler/search_untube.html")
  219. .render({"playlists": playlists,
  220. "videos": videos,
  221. "videos_count": len(videos),
  222. "search_query": search_query,
  223. "starts_with": starts_with,
  224. "contains": contains}))