models.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. from django.apps import apps
  2. from django.db import models
  3. from django.urls import reverse
  4. from django_extensions.db.models import TimeStampedModel
  5. from imagekit.models import ImageSpecField
  6. from imagekit.processors import ResizeToFit
  7. from scrobbles.dataclasses import BeerLogData
  8. from scrobbles.mixins import ScrobblableMixin
  9. BNULL = {"blank": True, "null": True}
  10. class BeerProducer(TimeStampedModel):
  11. description = models.TextField(**BNULL)
  12. location = models.CharField(max_length=255, **BNULL)
  13. beeradvocate_id = models.CharField(max_length=255, **BNULL)
  14. untappd_id = models.CharField(max_length=255, **BNULL)
  15. def find_or_create(cls, title: str) -> "BeerProducer":
  16. return cls.objects.filter(title=title).first()
  17. class Beer(ScrobblableMixin):
  18. description = models.TextField(**BNULL)
  19. ibu = models.SmallIntegerField(**BNULL)
  20. abv = models.FloatField(**BNULL)
  21. style = models.CharField(max_length=100, **BNULL)
  22. non_alcoholic = models.BooleanField(default=False)
  23. beeradvocate_id = models.CharField(max_length=255, **BNULL)
  24. beeradvocate_score = models.SmallIntegerField(**BNULL)
  25. untappd_image = models.ImageField(upload_to="beers/untappd/", **BNULL)
  26. untappd_image_small = ImageSpecField(
  27. source="untappd_image",
  28. processors=[ResizeToFit(100, 100)],
  29. format="JPEG",
  30. options={"quality": 60},
  31. )
  32. untappd_image_medium = ImageSpecField(
  33. source="untappd_image",
  34. processors=[ResizeToFit(300, 300)],
  35. format="JPEG",
  36. options={"quality": 75},
  37. )
  38. untappd_id = models.CharField(max_length=255, **BNULL)
  39. untappd_rating = models.FloatField(**BNULL)
  40. producer = models.ForeignKey(
  41. BeerProducer, on_delete=models.DO_NOTHING, **BNULL
  42. )
  43. def get_absolute_url(self):
  44. return reverse("beers:beer_detail", kwargs={"slug": self.uuid})
  45. def beeradvocate_link(self):
  46. link = ""
  47. if self.beeradvocate_id and self.producer:
  48. link = f"https://www.beeradvocate.com/beer/profile/{self.producer.beeradvocate_id}/{self.beeradvocate_id}/"
  49. return link
  50. def primary_image_url(self) -> str:
  51. url = ""
  52. if self.beeradvocate_image:
  53. url = self.beeradvocate_image.url
  54. return url
  55. @property
  56. def logdata_cls(self):
  57. return BeerLogData
  58. @classmethod
  59. def find_or_create(cls, title: str) -> "Beer":
  60. return cls.objects.filter(title=title).first()
  61. def scrobbles(self, user_id):
  62. Scrobble = apps.get_model("scrobbles", "Scrobble")
  63. return Scrobble.objects.filter(
  64. user_id=user_id, life_event=self
  65. ).order_by("-timestamp")