feat: add sync support for MedicalLog.vet

This commit is contained in:
Lance Edgar 2026-02-28 22:27:39 -06:00
parent 7d2ae48067
commit d07f3ed716
8 changed files with 145 additions and 1 deletions

View file

@ -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")

View file

@ -23,6 +23,8 @@
Model definition for Medical Logs Model definition for Medical Logs
""" """
import sqlalchemy as sa
from wuttjamaican.db import model from wuttjamaican.db import model
from wuttafarm.db.model.log import LogMixin, add_log_proxies from wuttafarm.db.model.log import LogMixin, add_log_proxies
@ -41,5 +43,13 @@ class MedicalLog(LogMixin, model.Base):
"farmos_log_type": "medical", "farmos_log_type": "medical",
} }
vet = sa.Column(
sa.String(length=100),
nullable=True,
doc="""
Name of the veterinarian, if applicable.
""",
)
add_log_proxies(MedicalLog) add_log_proxies(MedicalLog)

View file

@ -558,6 +558,32 @@ class MedicalLogImporter(ToFarmOSLog):
model_title = "MedicalLog" model_title = "MedicalLog"
farmos_log_type = "medical" 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): class ObservationLogImporter(ToFarmOSLog):

View file

@ -401,6 +401,24 @@ class MedicalLogImporter(FromWuttaFarmLog, farmos_importing.model.MedicalLogImpo
source_model_class = model.MedicalLog 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( class ObservationLogImporter(
FromWuttaFarmLog, farmos_importing.model.ObservationLogImporter FromWuttaFarmLog, farmos_importing.model.ObservationLogImporter

View file

@ -1211,6 +1211,17 @@ class MedicalLogImporter(LogImporterBase):
model_class = model.MedicalLog 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): class ObservationLogImporter(LogImporterBase):
""" """

View file

@ -252,4 +252,6 @@ class Normalizer(GenericHandler):
"location_uuids": location_uuids, "location_uuids": location_uuids,
"owners": owner_objects, "owners": owner_objects,
"owner_uuids": owner_uuids, "owner_uuids": owner_uuids,
# TODO: should we do this here or make caller do it?
"vet": log["attributes"].get("vet"),
} }

View file

@ -24,6 +24,7 @@ View for farmOS Medical Logs
""" """
from wuttafarm.web.views.farmos.logs import LogMasterView from wuttafarm.web.views.farmos.logs import LogMasterView
from wuttafarm.web.grids import SimpleSorter, StringFilter
class MedicalLogView(LogMasterView): class MedicalLogView(LogMasterView):
@ -41,6 +42,35 @@ class MedicalLogView(LogMasterView):
farmos_log_type = "medical" farmos_log_type = "medical"
farmos_refurl_path = "/logs/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): def defaults(config, **kwargs):
base = globals() base = globals()

View file

@ -39,16 +39,26 @@ class MedicalLogView(LogMasterView):
farmos_bundle = "medical" farmos_bundle = "medical"
farmos_refurl_path = "/logs/medical" farmos_refurl_path = "/logs/medical"
labels = {
"vet": "Veterinarian",
}
grid_columns = [ grid_columns = [
"status", "status",
"drupal_id", "drupal_id",
"timestamp", "timestamp",
"message", "message",
"assets", "assets",
"veterinarian", "vet",
"owners", "owners",
] ]
def configure_form(self, f):
super().configure_form(f)
# vet
f.fields.insert_after("timestamp", "vet")
def defaults(config, **kwargs): def defaults(config, **kwargs):
base = globals() base = globals()