From 5e4cd8978dee6f925909d2db7329936555238346 Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Sat, 14 Feb 2026 20:00:39 -0600 Subject: [PATCH] fix: add / display thumbnail image for animals --- .../2a49127e974b_add_animal_thumbnail_url.py | 41 +++++++++++++++++++ src/wuttafarm/db/model/animals.py | 8 ++++ src/wuttafarm/importing/farmos.py | 4 ++ src/wuttafarm/web/views/animals.py | 26 ++++++++++++ src/wuttafarm/web/views/master.py | 2 + 5 files changed, 81 insertions(+) create mode 100644 src/wuttafarm/db/alembic/versions/2a49127e974b_add_animal_thumbnail_url.py diff --git a/src/wuttafarm/db/alembic/versions/2a49127e974b_add_animal_thumbnail_url.py b/src/wuttafarm/db/alembic/versions/2a49127e974b_add_animal_thumbnail_url.py new file mode 100644 index 0000000..7c32b29 --- /dev/null +++ b/src/wuttafarm/db/alembic/versions/2a49127e974b_add_animal_thumbnail_url.py @@ -0,0 +1,41 @@ +"""add animal thumbnail url + +Revision ID: 2a49127e974b +Revises: 8898184c5c75 +Create Date: 2026-02-14 19:41:22.039343 + +""" + +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +import wuttjamaican.db.util + + +# revision identifiers, used by Alembic. +revision: str = "2a49127e974b" +down_revision: Union[str, None] = "8898184c5c75" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + + # animal + op.add_column( + "animal", sa.Column("thumbnail_url", sa.String(length=255), nullable=True) + ) + op.add_column( + "animal_version", + sa.Column( + "thumbnail_url", sa.String(length=255), autoincrement=False, nullable=True + ), + ) + + +def downgrade() -> None: + + # animal + op.drop_column("animal_version", "thumbnail_url") + op.drop_column("animal", "thumbnail_url") diff --git a/src/wuttafarm/db/model/animals.py b/src/wuttafarm/db/model/animals.py index 4bc1f8a..1aec805 100644 --- a/src/wuttafarm/db/model/animals.py +++ b/src/wuttafarm/db/model/animals.py @@ -173,6 +173,14 @@ class Animal(model.Base): """, ) + thumbnail_url = sa.Column( + sa.String(length=255), + nullable=True, + doc=""" + Optional thumbnail URL for the animal. + """, + ) + farmos_uuid = sa.Column( model.UUID(), nullable=True, diff --git a/src/wuttafarm/importing/farmos.py b/src/wuttafarm/importing/farmos.py index f337226..e9167dc 100644 --- a/src/wuttafarm/importing/farmos.py +++ b/src/wuttafarm/importing/farmos.py @@ -194,6 +194,7 @@ class AnimalImporter(FromFarmOS, ToWutta): "notes", "archived", "image_url", + "thumbnail_url", ] def setup(self): @@ -214,6 +215,7 @@ class AnimalImporter(FromFarmOS, ToWutta): """ """ animal_type_uuid = None image_url = None + thumbnail_url = None if relationships := animal.get("relationships"): if animal_type := relationships.get("animal_type"): @@ -232,6 +234,7 @@ class AnimalImporter(FromFarmOS, ToWutta): "image_style_uri" ): image_url = image_style["large"] + thumbnail_url = image_style["thumbnail"] if not animal_type_uuid: log.warning("missing/invalid animal_type for farmOS Animal: %s", animal) @@ -267,6 +270,7 @@ class AnimalImporter(FromFarmOS, ToWutta): "archived": archived, "notes": notes, "image_url": image_url, + "thumbnail_url": thumbnail_url, } diff --git a/src/wuttafarm/web/views/animals.py b/src/wuttafarm/web/views/animals.py index 73b64ff..884c185 100644 --- a/src/wuttafarm/web/views/animals.py +++ b/src/wuttafarm/web/views/animals.py @@ -23,6 +23,8 @@ Master view for Animals """ +from webhelpers2.html import tags + from wuttaweb.forms.schema import WuttaDictEnum from wuttafarm.db.model.animals import Animal @@ -49,6 +51,7 @@ class AnimalView(WuttaFarmMasterView): } grid_columns = [ + "thumbnail", "drupal_id", "name", "animal_type", @@ -76,7 +79,9 @@ class AnimalView(WuttaFarmMasterView): "archived", "farmos_uuid", "drupal_id", + "thumbnail_url", "image_url", + "thumbnail", "image", ] @@ -86,6 +91,11 @@ class AnimalView(WuttaFarmMasterView): model = self.app.model enum = self.app.enum + # thumbnail + g.set_renderer("thumbnail", self.render_grid_thumbnail) + g.set_label("thumbnail", "", column_only=True) + g.set_centered("thumbnail") + # drupal_id g.set_label("drupal_id", "ID", column_only=True) @@ -103,6 +113,11 @@ class AnimalView(WuttaFarmMasterView): # sex g.set_enum("sex", enum.ANIMAL_SEX) + def render_grid_thumbnail(self, animal, field, value): + if animal.thumbnail_url: + return tags.image(animal.thumbnail_url, "animal thumbnail") + return None + def grid_row_class(self, animal, data, i): """ """ if animal.archived: @@ -131,10 +146,21 @@ class AnimalView(WuttaFarmMasterView): f.set_default("asset_type", "Animal") f.set_readonly("asset_type") + # thumbnail_url + if self.creating or self.editing: + f.remove("thumbnail_url") + # image_url if self.creating or self.editing: f.remove("image_url") + # thumbnail + if self.creating or self.editing: + f.remove("thumbnail") + elif animal.thumbnail_url: + f.set_widget("thumbnail", ImageWidget("animal thumbnail")) + f.set_default("thumbnail", animal.thumbnail_url) + # image if self.creating or self.editing: f.remove("image") diff --git a/src/wuttafarm/web/views/master.py b/src/wuttafarm/web/views/master.py index 482bdf2..9498db4 100644 --- a/src/wuttafarm/web/views/master.py +++ b/src/wuttafarm/web/views/master.py @@ -37,12 +37,14 @@ class WuttaFarmMasterView(MasterView): "farmos_uuid": "farmOS UUID", "drupal_id": "Drupal ID", "image_url": "Image URL", + "thumbnail_url": "Thumbnail URL", } row_labels = { "farmos_uuid": "farmOS UUID", "drupal_id": "Drupal ID", "image_url": "Image URL", + "thumbnail_url": "Thumbnail URL", } def get_farmos_url(self, obj):