diff --git a/vrobbler/apps/beers/migrations/0002_beer_beeradvocate_image_beer_producer_and_more.py b/vrobbler/apps/beers/migrations/0002_beer_beeradvocate_image_beer_producer_and_more.py new file mode 100644 index 0000000..45c10d5 --- /dev/null +++ b/vrobbler/apps/beers/migrations/0002_beer_beeradvocate_image_beer_producer_and_more.py @@ -0,0 +1,36 @@ +# Generated by Django 4.2.16 on 2024-10-22 21:34 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ("beers", "0001_initial"), + ] + + operations = [ + migrations.AddField( + model_name="beer", + name="beeradvocate_image", + field=models.ImageField( + blank=True, null=True, upload_to="beers/beeradvcoate/" + ), + ), + migrations.AddField( + model_name="beer", + name="producer", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + to="beers.beerproducer", + ), + ), + migrations.AddField( + model_name="beerproducer", + name="beeradvocate_id", + field=models.CharField(blank=True, max_length=255, null=True), + ), + ] diff --git a/vrobbler/apps/beers/models.py b/vrobbler/apps/beers/models.py index 7e06a5d..1e15bdd 100644 --- a/vrobbler/apps/beers/models.py +++ b/vrobbler/apps/beers/models.py @@ -2,6 +2,8 @@ from django.apps import apps from django.db import models from django.urls import reverse from django_extensions.db.models import TimeStampedModel +from imagekit.models import ImageSpecField +from imagekit.processors import ResizeToFit from scrobbles.dataclasses import BeerLogData from scrobbles.mixins import ScrobblableMixin @@ -11,6 +13,10 @@ BNULL = {"blank": True, "null": True} class BeerProducer(TimeStampedModel): description = models.TextField(**BNULL) location = models.CharField(max_length=255, **BNULL) + beeradvocate_id = models.CharField(max_length=255, **BNULL) + + def find_or_create(cls, title: str) -> "BeerProducer": + return cls.objects.filter(title=title).first() class Beer(ScrobblableMixin): @@ -21,11 +27,41 @@ class Beer(ScrobblableMixin): non_alcoholic = models.BooleanField(default=False) beeradvocate_id = models.CharField(max_length=255, **BNULL) beeradvocate_score = models.SmallIntegerField(**BNULL) + beeradvocate_image = models.ImageField( + upload_to="beers/beeradvcoate/", **BNULL + ) + beeradvocate_image_small = ImageSpecField( + source="cover", + processors=[ResizeToFit(100, 100)], + format="JPEG", + options={"quality": 60}, + ) + beeradvocate_image_medium = ImageSpecField( + source="cover", + processors=[ResizeToFit(300, 300)], + format="JPEG", + options={"quality": 75}, + ) untappd_id = models.CharField(max_length=255, **BNULL) + producer = models.ForeignKey( + BeerProducer, on_delete=models.DO_NOTHING, **BNULL + ) def get_absolute_url(self): return reverse("beers:beer_detail", kwargs={"slug": self.uuid}) + def beeradvocate_link(self): + link = "" + if self.beeradvocate_id and self.producer: + link = f"https://www.beeradvocate.com/beer/profile/{self.producer.beeradvocate_id}/{self.beeradvocate_id}/" + return link + + def primary_image_url(self) -> str: + url = "" + if self.beeradvocate_image: + url = self.beeradvocate_image.url + return url + @property def logdata_cls(self): return BeerLogData diff --git a/vrobbler/apps/boardgames/models.py b/vrobbler/apps/boardgames/models.py index 6b7eb20..de42198 100644 --- a/vrobbler/apps/boardgames/models.py +++ b/vrobbler/apps/boardgames/models.py @@ -112,9 +112,6 @@ class BoardGame(ScrobblableMixin): link = f"https://boardgamegeek.com/boardgame/{self.bggeek_id}" return link - def get_start_url(self): - return reverse("scrobbles:start", kwargs={"uuid": self.uuid}) - def fix_metadata(self, data: dict = {}, force_update=False) -> None: if not self.published_date or force_update: