[beers] Connect beers with producers
This commit is contained in:
@ -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),
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -2,6 +2,8 @@ from django.apps import apps
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django_extensions.db.models import TimeStampedModel
|
from django_extensions.db.models import TimeStampedModel
|
||||||
|
from imagekit.models import ImageSpecField
|
||||||
|
from imagekit.processors import ResizeToFit
|
||||||
from scrobbles.dataclasses import BeerLogData
|
from scrobbles.dataclasses import BeerLogData
|
||||||
from scrobbles.mixins import ScrobblableMixin
|
from scrobbles.mixins import ScrobblableMixin
|
||||||
|
|
||||||
@ -11,6 +13,10 @@ BNULL = {"blank": True, "null": True}
|
|||||||
class BeerProducer(TimeStampedModel):
|
class BeerProducer(TimeStampedModel):
|
||||||
description = models.TextField(**BNULL)
|
description = models.TextField(**BNULL)
|
||||||
location = models.CharField(max_length=255, **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):
|
class Beer(ScrobblableMixin):
|
||||||
@ -21,11 +27,41 @@ class Beer(ScrobblableMixin):
|
|||||||
non_alcoholic = models.BooleanField(default=False)
|
non_alcoholic = models.BooleanField(default=False)
|
||||||
beeradvocate_id = models.CharField(max_length=255, **BNULL)
|
beeradvocate_id = models.CharField(max_length=255, **BNULL)
|
||||||
beeradvocate_score = models.SmallIntegerField(**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)
|
untappd_id = models.CharField(max_length=255, **BNULL)
|
||||||
|
producer = models.ForeignKey(
|
||||||
|
BeerProducer, on_delete=models.DO_NOTHING, **BNULL
|
||||||
|
)
|
||||||
|
|
||||||
def get_absolute_url(self):
|
def get_absolute_url(self):
|
||||||
return reverse("beers:beer_detail", kwargs={"slug": self.uuid})
|
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
|
@property
|
||||||
def logdata_cls(self):
|
def logdata_cls(self):
|
||||||
return BeerLogData
|
return BeerLogData
|
||||||
|
|||||||
@ -112,9 +112,6 @@ class BoardGame(ScrobblableMixin):
|
|||||||
link = f"https://boardgamegeek.com/boardgame/{self.bggeek_id}"
|
link = f"https://boardgamegeek.com/boardgame/{self.bggeek_id}"
|
||||||
return link
|
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:
|
def fix_metadata(self, data: dict = {}, force_update=False) -> None:
|
||||||
|
|
||||||
if not self.published_date or force_update:
|
if not self.published_date or force_update:
|
||||||
|
|||||||
Reference in New Issue
Block a user