views.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. from django.shortcuts import render, redirect
  2. from django.contrib.auth import logout
  3. from django.views.decorators.http import require_POST
  4. from django.contrib.auth.decorators import login_required
  5. from allauth.socialaccount.models import SocialToken
  6. from django.http import HttpResponse
  7. from django.contrib.auth.models import User
  8. from django.contrib import messages
  9. from apps.main.models import Playlist
  10. from django.template import loader
  11. # Create your views here.
  12. def index(request):
  13. if request.user.is_anonymous:
  14. return render(request, 'index.html')
  15. else:
  16. return redirect('home')
  17. @require_POST
  18. def update_settings(request):
  19. print(request.POST)
  20. user = request.user
  21. username_input = request.POST['username'].strip()
  22. message_content = "Saved! Refresh to see changes!"
  23. message_type = "success"
  24. if username_input != user.username:
  25. if User.objects.filter(username__exact=username_input).count() != 0:
  26. message_type = "danger"
  27. message_content = f"Username {request.POST['username'].strip()} already taken"
  28. else:
  29. user.username = request.POST['username'].strip()
  30. user.save()
  31. message_content = f"Username updated to {username_input}!"
  32. return HttpResponse(loader.get_template("intercooler/messages.html").render(
  33. {"message_type": message_type, "message_content": message_content}))
  34. @login_required
  35. def delete_account(request):
  36. request.user.profile.delete()
  37. request.user.delete()
  38. request.session.flush()
  39. messages.success(request, "Account data deleted successfully.")
  40. return redirect('index')
  41. def log_out(request):
  42. request.session.flush() # delete all stored session keys
  43. logout(request) # log out authenticated user
  44. return redirect('/')
  45. def start_import(request):
  46. '''
  47. Initializes only the user's playlist data in the database. Returns the progress bar, which will
  48. keep calling continue_import
  49. :param request:
  50. :return:
  51. '''
  52. user_profile = request.user.profile
  53. if user_profile.access_token.strip() == "" or user_profile.refresh_token.strip() == "":
  54. user_social_token = SocialToken.objects.get(account__user=request.user)
  55. user_profile.access_token = user_social_token.token
  56. user_profile.refresh_token = user_social_token.token_secret
  57. user_profile.expires_at = user_social_token.expires_at
  58. request.user.save()
  59. result = Playlist.objects.getAllPlaylistsFromYT(request.user)
  60. channel_found = True
  61. if result["status"] == -1:
  62. print("User has no YT channel")
  63. channel_found = False
  64. return HttpResponse(loader.get_template('intercooler/progress_bar.html').render(
  65. {"channel_found": channel_found}
  66. ))
  67. elif result["status"] == -2:
  68. print("User has no playlists on YT")
  69. return HttpResponse(loader.get_template('intercooler/progress_bar.html').render(
  70. {"total_playlists": 0,
  71. "playlists_imported": 0,
  72. "done": True,
  73. "progress": 100,
  74. "channel_found": channel_found}))
  75. else:
  76. return HttpResponse(loader.get_template('intercooler/progress_bar.html').render(
  77. {"total_playlists": result["num_of_playlists"],
  78. "playlist_name": result["first_playlist_name"],
  79. "playlists_imported": 0,
  80. "progress": 0,
  81. "channel_found": channel_found}
  82. ))
  83. def continue_import(request):
  84. if request.user.profile.import_in_progress is False:
  85. return redirect('home')
  86. num_of_playlists = request.user.profile.playlists.count()
  87. try:
  88. remaining_playlists = request.user.profile.playlists.filter(is_in_db=False)
  89. playlists_imported = num_of_playlists - remaining_playlists.count() + 1
  90. playlist = remaining_playlists.order_by("created_at")[0]
  91. playlist_name = playlist.name
  92. playlist_id = playlist.playlist_id
  93. Playlist.objects.getAllVideosForPlaylist(request.user, playlist.playlist_id)
  94. except:
  95. playlist_id = -1
  96. if playlist_id != -1:
  97. return HttpResponse(loader.get_template('intercooler/progress_bar.html').render(
  98. {"total_playlists": num_of_playlists,
  99. "playlists_imported": playlists_imported,
  100. "playlist_name": playlist_name,
  101. "progress": round((playlists_imported / num_of_playlists) * 100, 1),
  102. "channel_found": True}))
  103. else:
  104. # request.user.profile.just_joined = False
  105. request.user.profile.import_in_progress = False
  106. request.user.save()
  107. return HttpResponse(loader.get_template('intercooler/progress_bar.html').render(
  108. {"total_playlists": num_of_playlists,
  109. "playlists_imported": num_of_playlists,
  110. "done": True,
  111. "progress": 100,
  112. "channel_found": True}))