2
0

models.py 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import re
  2. from django.contrib.auth.hashers import make_password, check_password
  3. from django.db import models
  4. from django.contrib.auth.models import User
  5. from django.db.models import Count, Q
  6. from django.db.models.signals import post_save
  7. from django.dispatch import receiver
  8. # Create your models here.
  9. class ProfileManager(models.Manager):
  10. def updateUserProfile(self, details):
  11. pass
  12. class Untube(models.Model):
  13. page_likes = models.IntegerField(default=0)
  14. # extension of the built in User model made by Django
  15. class Profile(models.Model):
  16. untube_user = models.OneToOneField(User, on_delete=models.CASCADE)
  17. created_at = models.DateTimeField(auto_now_add=True)
  18. updated_at = models.DateTimeField(auto_now=True)
  19. # settings
  20. robohash_set = models.IntegerField(default=3) # determines profile picture from https://robohash.org/
  21. user_summary = models.CharField(max_length=300, default="I think my arm is on backward.")
  22. user_location = models.CharField(max_length=100, default="Hell, Earth")
  23. ### GLOBAL preferences ###
  24. # site preferences
  25. open_search_new_tab = models.BooleanField(default=True) # open search page in new tab by default
  26. enable_gradient_bg = models.BooleanField(default=False)
  27. # playlist preferences (this will apply to all playlists)
  28. hide_unavailable_videos = models.BooleanField(default=True)
  29. confirm_before_deleting = models.BooleanField(default=True)
  30. ###########################
  31. # manage user
  32. objects = ProfileManager()
  33. show_import_page = models.BooleanField(default=True) # shows the user tips for a week
  34. yt_channel_id = models.TextField(default='')
  35. import_in_progress = models.BooleanField(
  36. default=False) # if True, will not let the user access main site until they import their YT playlists
  37. imported_yt_playlists = models.BooleanField(default=False) # True if user imported all their YT playlists
  38. # google api token details
  39. access_token = models.TextField(default="")
  40. refresh_token = models.TextField(default="")
  41. expires_at = models.DateTimeField(blank=True, null=True)
  42. # import playlist page
  43. manage_playlists_import_textarea = models.TextField(default="")
  44. # create playlist page
  45. create_playlist_name = models.CharField(max_length=50, default="")
  46. create_playlist_desc = models.CharField(max_length=50, default="")
  47. create_playlist_type = models.CharField(max_length=50, default="")
  48. create_playlist_add_vids_from_collection = models.CharField(max_length=50, default="")
  49. create_playlist_add_vids_from_links = models.CharField(max_length=50, default="")
  50. def get_channels_list(self):
  51. channels_list = []
  52. videos = self.untube_user.videos.filter(Q(is_unavailable_on_yt=False) & Q(was_deleted_on_yt=False))
  53. queryset = videos.values(
  54. 'channel_name').annotate(channel_videos_count=Count('video_id')).order_by('-channel_videos_count')
  55. for entry in queryset:
  56. channels_list.append(entry['channel_name'])
  57. return channels_list
  58. def get_playlists_list(self):
  59. return self.untube_user.playlists.all().filter(is_in_db=True)
  60. # as soon as one User object is created, create an associated profile object
  61. @receiver(post_save, sender=User)
  62. def create_user_profile(sender, instance, created, **kwargs):
  63. if created:
  64. Profile.objects.create(untube_user=instance)
  65. # whenever User.save() happens, Profile.save() also happens
  66. @receiver(post_save, sender=User)
  67. def save_user_profile(sender, instance, **kwargs):
  68. instance.profile.save()