mixins.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import logging
  2. from typing import Optional
  3. from uuid import uuid4
  4. from django.db import models
  5. from django.urls import reverse
  6. from django_extensions.db.models import TimeStampedModel
  7. from taggit.managers import TaggableManager
  8. from scrobbles.utils import get_scrobbles_for_media
  9. from taggit.models import TagBase, GenericTaggedItemBase
  10. BNULL = {"blank": True, "null": True}
  11. logger = logging.getLogger(__name__)
  12. class Genre(TagBase):
  13. source = models.CharField(max_length=255, **BNULL)
  14. class Meta:
  15. verbose_name = "Genre"
  16. verbose_name_plural = "Genres"
  17. class ObjectWithGenres(GenericTaggedItemBase):
  18. tag = models.ForeignKey(
  19. Genre,
  20. on_delete=models.CASCADE,
  21. related_name="%(app_label)s_%(class)s_items",
  22. )
  23. class ScrobblableMixin(TimeStampedModel):
  24. SECONDS_TO_STALE = 1600
  25. uuid = models.UUIDField(default=uuid4, editable=False, **BNULL)
  26. title = models.CharField(max_length=255, **BNULL)
  27. run_time_seconds = models.IntegerField(**BNULL)
  28. run_time_ticks = models.PositiveBigIntegerField(**BNULL)
  29. genre = TaggableManager(through=ObjectWithGenres)
  30. class Meta:
  31. abstract = True
  32. @property
  33. def primary_image_url(self) -> str:
  34. logger.warn(f"Not implemented yet")
  35. return ""
  36. def fix_metadata(self):
  37. logger.warn("fix_metadata() not implemented yet")
  38. @classmethod
  39. def find_or_create(cls):
  40. logger.warn("find_or_create() not implemented yet")
  41. class LongPlayScrobblableMixin(ScrobblableMixin):
  42. class Meta:
  43. abstract = True
  44. def get_longplay_finish_url(self):
  45. return reverse("scrobbles:longplay-finish", kwargs={"uuid": self.uuid})
  46. def last_long_play_scrobble_for_user(self, user) -> Optional["Scrobble"]:
  47. return (
  48. get_scrobbles_for_media(self, user)
  49. .filter(long_play_complete=False)
  50. .order_by("-timestamp")
  51. .first()
  52. )