models.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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 BrickSetLogData
  8. from scrobbles.mixins import LongPlayScrobblableMixin
  9. BNULL = {"blank": True, "null": True}
  10. class BrickSet(LongPlayScrobblableMixin):
  11. """"""
  12. number = models.CharField(max_length=10, **BNULL)
  13. release_year = models.IntegerField(**BNULL)
  14. piece_count = models.IntegerField(**BNULL)
  15. brickset_rating = models.DecimalField(
  16. max_digits=3, decimal_places=1, **BNULL
  17. )
  18. lego_item_number = models.CharField(max_length=10, **BNULL)
  19. box_image = models.ImageField(upload_to="brickset/boxes/", **BNULL)
  20. box_image_small = ImageSpecField(
  21. source="box_image",
  22. processors=[ResizeToFit(100, 100)],
  23. format="JPEG",
  24. options={"quality": 60},
  25. )
  26. box_image_medium = ImageSpecField(
  27. source="box_image",
  28. processors=[ResizeToFit(300, 300)],
  29. format="JPEG",
  30. options={"quality": 75},
  31. )
  32. set_image = models.ImageField(upload_to="brickset/sets/", **BNULL)
  33. set_image_small = ImageSpecField(
  34. source="set_image",
  35. processors=[ResizeToFit(100, 100)],
  36. format="JPEG",
  37. options={"quality": 60},
  38. )
  39. set_image_medium = ImageSpecField(
  40. source="set_image",
  41. processors=[ResizeToFit(300, 300)],
  42. format="JPEG",
  43. options={"quality": 75},
  44. )
  45. def get_absolute_url(self):
  46. return reverse("bricksets:brickset_detail", kwargs={"slug": self.uuid})
  47. @property
  48. def logdata_cls(self):
  49. return BrickSetLogData
  50. @classmethod
  51. def find_or_create(cls, brickset_id: str) -> "BrickSet":
  52. brickset = cls.objects.filter(number=brickset_id).first()
  53. if not brickset:
  54. # TODO: enrich this from the website
  55. brickset = cls.objects.create(number=brickset_id)
  56. return brickset
  57. @property
  58. def primary_image_url(self) -> str:
  59. if self.box_image:
  60. return self.box_image.url
  61. return ""