diff --git a/src/wuttafarm/db/alembic/versions/d459db991404_add_medicallog_vet.py b/src/wuttafarm/db/alembic/versions/d459db991404_add_medicallog_vet.py new file mode 100644 index 0000000..c65c93e --- /dev/null +++ b/src/wuttafarm/db/alembic/versions/d459db991404_add_medicallog_vet.py @@ -0,0 +1,37 @@ +"""add MedicalLog.vet + +Revision ID: d459db991404 +Revises: 9e875e5cbdc1 +Create Date: 2026-02-28 22:17:57.001134 + +""" + +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +import wuttjamaican.db.util + + +# revision identifiers, used by Alembic. +revision: str = "d459db991404" +down_revision: Union[str, None] = "9e875e5cbdc1" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + + # log_medical + op.add_column("log_medical", sa.Column("vet", sa.String(length=100), nullable=True)) + op.add_column( + "log_medical_version", + sa.Column("vet", sa.String(length=100), autoincrement=False, nullable=True), + ) + + +def downgrade() -> None: + + # log_medical + op.drop_column("log_medical_version", "vet") + op.drop_column("log_medical", "vet") diff --git a/src/wuttafarm/db/model/log_medical.py b/src/wuttafarm/db/model/log_medical.py index 439ee3b..6cf308f 100644 --- a/src/wuttafarm/db/model/log_medical.py +++ b/src/wuttafarm/db/model/log_medical.py @@ -23,6 +23,8 @@ Model definition for Medical Logs """ +import sqlalchemy as sa + from wuttjamaican.db import model from wuttafarm.db.model.log import LogMixin, add_log_proxies @@ -41,5 +43,13 @@ class MedicalLog(LogMixin, model.Base): "farmos_log_type": "medical", } + vet = sa.Column( + sa.String(length=100), + nullable=True, + doc=""" + Name of the veterinarian, if applicable. + """, + ) + add_log_proxies(MedicalLog) diff --git a/src/wuttafarm/farmos/importing/model.py b/src/wuttafarm/farmos/importing/model.py index 7b900ff..108ebde 100644 --- a/src/wuttafarm/farmos/importing/model.py +++ b/src/wuttafarm/farmos/importing/model.py @@ -558,6 +558,32 @@ class MedicalLogImporter(ToFarmOSLog): model_title = "MedicalLog" farmos_log_type = "medical" + def get_supported_fields(self): + fields = list(super().get_supported_fields()) + fields.extend( + [ + "vet", + ] + ) + return fields + + def normalize_target_object(self, log): + data = super().normalize_target_object(log) + data.update( + { + "vet": log["attributes"]["vet"], + } + ) + return data + + def get_log_payload(self, source_data): + payload = super().get_log_payload(source_data) + + if "vet" in self.fields: + payload["attributes"]["vet"] = source_data["vet"] + + return payload + class ObservationLogImporter(ToFarmOSLog): diff --git a/src/wuttafarm/farmos/importing/wuttafarm.py b/src/wuttafarm/farmos/importing/wuttafarm.py index 8679a78..d0ac065 100644 --- a/src/wuttafarm/farmos/importing/wuttafarm.py +++ b/src/wuttafarm/farmos/importing/wuttafarm.py @@ -401,6 +401,24 @@ class MedicalLogImporter(FromWuttaFarmLog, farmos_importing.model.MedicalLogImpo source_model_class = model.MedicalLog + def get_supported_fields(self): + fields = list(super().get_supported_fields()) + fields.extend( + [ + "vet", + ] + ) + return fields + + def normalize_source_object(self, log): + data = super().normalize_source_object(log) + data.update( + { + "vet": log.vet, + } + ) + return data + class ObservationLogImporter( FromWuttaFarmLog, farmos_importing.model.ObservationLogImporter diff --git a/src/wuttafarm/importing/farmos.py b/src/wuttafarm/importing/farmos.py index a35b35d..ebc5b55 100644 --- a/src/wuttafarm/importing/farmos.py +++ b/src/wuttafarm/importing/farmos.py @@ -1211,6 +1211,17 @@ class MedicalLogImporter(LogImporterBase): model_class = model.MedicalLog + def get_simple_fields(self): + """ """ + fields = list(super().get_simple_fields()) + # nb. must explicitly declare proxy fields + fields.extend( + [ + "vet", + ] + ) + return fields + class ObservationLogImporter(LogImporterBase): """ diff --git a/src/wuttafarm/normal.py b/src/wuttafarm/normal.py index 5c40a49..3efd443 100644 --- a/src/wuttafarm/normal.py +++ b/src/wuttafarm/normal.py @@ -252,4 +252,6 @@ class Normalizer(GenericHandler): "location_uuids": location_uuids, "owners": owner_objects, "owner_uuids": owner_uuids, + # TODO: should we do this here or make caller do it? + "vet": log["attributes"].get("vet"), } diff --git a/src/wuttafarm/web/views/farmos/logs_medical.py b/src/wuttafarm/web/views/farmos/logs_medical.py index 95a88c5..2f6a606 100644 --- a/src/wuttafarm/web/views/farmos/logs_medical.py +++ b/src/wuttafarm/web/views/farmos/logs_medical.py @@ -24,6 +24,7 @@ View for farmOS Medical Logs """ from wuttafarm.web.views.farmos.logs import LogMasterView +from wuttafarm.web.grids import SimpleSorter, StringFilter class MedicalLogView(LogMasterView): @@ -41,6 +42,35 @@ class MedicalLogView(LogMasterView): farmos_log_type = "medical" farmos_refurl_path = "/logs/medical" + labels = { + "vet": "Veterinarian", + } + + grid_columns = [ + "status", + "drupal_id", + "timestamp", + "name", + "assets", + "vet", + "owners", + ] + + def configure_grid(self, grid): + g = grid + super().configure_grid(g) + + # vet + g.set_sorter("vet", SimpleSorter("vet")) + g.set_filter("vet", StringFilter) + + def configure_form(self, form): + f = form + super().configure_form(f) + + # vet + f.fields.insert_after("timestamp", "vet") + def defaults(config, **kwargs): base = globals() diff --git a/src/wuttafarm/web/views/logs_medical.py b/src/wuttafarm/web/views/logs_medical.py index 2531237..d00d647 100644 --- a/src/wuttafarm/web/views/logs_medical.py +++ b/src/wuttafarm/web/views/logs_medical.py @@ -39,16 +39,26 @@ class MedicalLogView(LogMasterView): farmos_bundle = "medical" farmos_refurl_path = "/logs/medical" + labels = { + "vet": "Veterinarian", + } + grid_columns = [ "status", "drupal_id", "timestamp", "message", "assets", - "veterinarian", + "vet", "owners", ] + def configure_form(self, f): + super().configure_form(f) + + # vet + f.fields.insert_after("timestamp", "vet") + def defaults(config, **kwargs): base = globals()