diff --git a/src/wuttafarm/farmos/importing/model.py b/src/wuttafarm/farmos/importing/model.py index 0593d22..9994f55 100644 --- a/src/wuttafarm/farmos/importing/model.py +++ b/src/wuttafarm/farmos/importing/model.py @@ -632,6 +632,7 @@ class ToFarmOSLog(ToFarmOS): "quick", "assets", "locations", + "groups", "quantities", ] @@ -697,6 +698,7 @@ class ToFarmOSLog(ToFarmOS): "locations": [ (l["asset_type"], UUID(l["uuid"])) for l in normal["locations"] ], + "groups": [(g["asset_type"], UUID(g["uuid"])) for g in normal["groups"]], "quantities": [UUID(uuid) for uuid in normal["quantity_uuids"]], } @@ -739,6 +741,16 @@ class ToFarmOSLog(ToFarmOS): } ) rels["location"] = {"data": locations} + if "groups" in self.fields: + groups = [] + for asset_type, uuid in source_data["groups"]: + groups.append( + { + "type": f"asset--{asset_type}", + "id": str(uuid), + } + ) + rels["group"] = {"data": groups} if "quantities" in self.fields: quantities = [] for uuid in source_data["quantities"]: diff --git a/src/wuttafarm/farmos/importing/wuttafarm.py b/src/wuttafarm/farmos/importing/wuttafarm.py index 74b2b7e..8b682a3 100644 --- a/src/wuttafarm/farmos/importing/wuttafarm.py +++ b/src/wuttafarm/farmos/importing/wuttafarm.py @@ -459,6 +459,7 @@ class FromWuttaFarmLog(FromWuttaFarm): "quick", "assets", "locations", + "groups", "quantities", ] @@ -474,6 +475,7 @@ class FromWuttaFarmLog(FromWuttaFarm): "quick": self.config.parse_list(log.quick) if log.quick else [], "assets": [(a.asset_type, a.farmos_uuid) for a in log.assets], "locations": [(l.asset_type, l.farmos_uuid) for l in log.locations], + "groups": [(g.asset_type, g.farmos_uuid) for g in log.groups], "quantities": [qty.farmos_uuid for qty in log.quantities], "_src_object": log, } diff --git a/src/wuttafarm/web/forms/schema.py b/src/wuttafarm/web/forms/schema.py index ac5279b..2d56cd4 100644 --- a/src/wuttafarm/web/forms/schema.py +++ b/src/wuttafarm/web/forms/schema.py @@ -402,10 +402,13 @@ class AssetRefs(WuttaSet): Schema type for Assets field (on a Log record) """ - def __init__(self, request, for_asset=None, is_location=None, **kwargs): + def __init__( + self, request, for_asset=None, is_group=None, is_location=None, **kwargs + ): super().__init__(request, **kwargs) - self.for_asset = for_asset + self.is_group = is_group self.is_location = is_location + self.for_asset = for_asset def serialize(self, node, appstruct): if not appstruct: @@ -421,6 +424,8 @@ class AssetRefs(WuttaSet): if "values" not in kwargs: query = session.query(model.Asset) + if self.is_group is not None: + query = query.join(model.GroupAsset) if self.is_location is not None: query = query.filter(model.Asset.is_location == self.is_location) if self.for_asset: diff --git a/src/wuttafarm/web/views/logs.py b/src/wuttafarm/web/views/logs.py index ce08097..9f53f50 100644 --- a/src/wuttafarm/web/views/logs.py +++ b/src/wuttafarm/web/views/logs.py @@ -263,10 +263,8 @@ class LogMasterView(WuttaFarmMasterView): f.set_default("assets", log.assets) # groups - if self.creating or self.editing: - f.remove("groups") # TODO: need to support this - else: - f.set_node("groups", AssetRefs(self.request)) + f.set_node("groups", AssetRefs(self.request, is_group=True)) + if not self.creating: # nb. must explicity declare value for non-standard field f.set_default("groups", log.groups) @@ -333,6 +331,7 @@ class LogMasterView(WuttaFarmMasterView): self.set_assets(log, data["assets"]) self.set_locations(log, data["locations"]) + self.set_groups(log, data["groups"]) return log @@ -370,6 +369,23 @@ class LogMasterView(WuttaFarmMasterView): assert location log.locations.remove(location) + def set_groups(self, log, desired): + model = self.app.model + session = self.Session() + current = [g.uuid for g in log.groups] + + for uuid in desired: + if uuid not in current: + group = session.get(model.Asset, uuid) + assert group + log.groups.append(group) + + for uuid in current: + if uuid not in desired: + group = session.get(model.Asset, uuid) + assert group + log.groups.remove(group) + def get_farmos_url(self, log): return self.app.get_farmos_url(f"/log/{log.drupal_id}")