From e7b493d7c993088c32ab352973d024969c1f14b3 Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Wed, 18 Feb 2026 19:31:41 -0600 Subject: [PATCH] fix: add WuttaFarm -> farmOS export for Plant Assets --- src/wuttafarm/farmos/importing/model.py | 53 +++++++++++++++++++++ src/wuttafarm/farmos/importing/wuttafarm.py | 27 +++++++++++ src/wuttafarm/web/views/plants.py | 13 ++++- 3 files changed, 91 insertions(+), 2 deletions(-) diff --git a/src/wuttafarm/farmos/importing/model.py b/src/wuttafarm/farmos/importing/model.py index d20c068..9bb0bf5 100644 --- a/src/wuttafarm/farmos/importing/model.py +++ b/src/wuttafarm/farmos/importing/model.py @@ -333,6 +333,59 @@ class LandAssetImporter(ToFarmOSAsset): return payload +class PlantAssetImporter(ToFarmOSAsset): + + model_title = "PlantAsset" + farmos_asset_type = "plant" + + supported_fields = [ + "uuid", + "asset_name", + "plant_type_uuids", + "notes", + "archived", + ] + + def normalize_target_object(self, plant): + data = super().normalize_target_object(plant) + data.update( + { + "plant_type_uuids": [ + UUID(p["id"]) for p in plant["relationships"]["plant_type"]["data"] + ], + } + ) + return data + + def get_asset_payload(self, source_data): + payload = super().get_asset_payload(source_data) + + attrs = {} + if "sex" in self.fields: + attrs["sex"] = source_data["sex"] + if "is_sterile" in self.fields: + attrs["is_sterile"] = source_data["is_sterile"] + if "birthdate" in self.fields: + attrs["birthdate"] = self.format_datetime(source_data["birthdate"]) + + rels = {} + if "plant_type_uuids" in self.fields: + rels["plant_type"] = {"data": []} + for uuid in source_data["plant_type_uuids"]: + rels["plant_type"]["data"].append( + { + "id": str(uuid), + "type": "taxonomy_term--plant_type", + } + ) + + payload["attributes"].update(attrs) + if rels: + payload.setdefault("relationships", {}).update(rels) + + return payload + + class StructureAssetImporter(ToFarmOSAsset): model_title = "StructureAsset" diff --git a/src/wuttafarm/farmos/importing/wuttafarm.py b/src/wuttafarm/farmos/importing/wuttafarm.py index ffd78b7..5b3a25e 100644 --- a/src/wuttafarm/farmos/importing/wuttafarm.py +++ b/src/wuttafarm/farmos/importing/wuttafarm.py @@ -98,6 +98,7 @@ class FromWuttaFarmToFarmOS(FromWuttaFarmHandler, ToFarmOSHandler): importers["AnimalType"] = AnimalTypeImporter importers["AnimalAsset"] = AnimalAssetImporter importers["GroupAsset"] = GroupAssetImporter + importers["PlantAsset"] = PlantAssetImporter importers["ActivityLog"] = ActivityLogImporter importers["HarvestLog"] = HarvestLogImporter importers["MedicalLog"] = MedicalLogImporter @@ -239,6 +240,32 @@ class LandAssetImporter(FromWuttaFarm, farmos_importing.model.LandAssetImporter) } +class PlantAssetImporter(FromWuttaFarm, farmos_importing.model.PlantAssetImporter): + """ + WuttaFarm → farmOS API exporter for Plant Assets + """ + + source_model_class = model.PlantAsset + + supported_fields = [ + "uuid", + "asset_name", + "plant_type_uuids", + "notes", + "archived", + ] + + def normalize_source_object(self, plant): + return { + "uuid": plant.farmos_uuid or self.app.make_true_uuid(), + "asset_name": plant.asset_name, + "plant_type_uuids": [t.plant_type.farmos_uuid for t in plant._plant_types], + "notes": plant.notes, + "archived": plant.archived, + "_src_object": plant, + } + + class StructureAssetImporter( FromWuttaFarm, farmos_importing.model.StructureAssetImporter ): diff --git a/src/wuttafarm/web/views/plants.py b/src/wuttafarm/web/views/plants.py index d92949a..4bd32c6 100644 --- a/src/wuttafarm/web/views/plants.py +++ b/src/wuttafarm/web/views/plants.py @@ -183,8 +183,17 @@ class PlantAssetView(AssetMasterView): plant = f.model_instance # plant_types - f.set_node("plant_types", PlantTypeRefs(self.request)) - f.set_default("plant_types", [t.plant_type_uuid for t in plant._plant_types]) + if self.creating or self.editing: + f.remove("plant_types") # TODO: add support for this + else: + f.set_node("plant_types", PlantTypeRefs(self.request)) + f.set_default( + "plant_types", [t.plant_type_uuid for t in plant._plant_types] + ) + + # season + if self.creating or self.editing: + f.remove("season") # TODO: add support for this def defaults(config, **kwargs):