def create_conditions(self, obj): """ Gets condition formset from context data, loops over these forms and validates the data, checking for the condition_sid field in the data to indicate whether an existing condition is being updated or a new one created from scratch. Then deletes any existing conditions that are not being updated, before calling the MeasureCreationPattern.create_condition_and_components with the appropriate parser and condition data. """ formset = self.get_context_data()["conditions_formset"] excluded_sids = [] conditions_data = [] workbasket = WorkBasket.current(self.request) existing_conditions = obj.conditions.approved_up_to_transaction( workbasket.get_current_transaction(self.request), ) for f in formset.forms: f.is_valid() condition_data = f.cleaned_data # If the form has changed and "condition_sid" is in the changed data, # this means that the condition is preexisting and needs to updated # so that its dependent_measure points to the latest version of measure if f.has_changed() and "condition_sid" in f.changed_data: excluded_sids.append(f.initial["condition_sid"]) update_type = UpdateType.UPDATE condition_data["version_group"] = existing_conditions.get( sid=f.initial["condition_sid"], ).version_group condition_data["sid"] = f.initial["condition_sid"] # If changed and condition_sid not in changed_data, then this is a newly created condition elif f.has_changed() and "condition_sid" not in f.changed_data: update_type = UpdateType.CREATE condition_data["update_type"] = update_type conditions_data.append(condition_data) workbasket = WorkBasket.current(self.request) # Delete all existing conditions from the measure instance, except those that need to be updated for condition in existing_conditions.exclude(sid__in=excluded_sids): condition.new_version( workbasket=workbasket, update_type=UpdateType.DELETE, transaction=obj.transaction, ) if conditions_data: measure_creation_pattern = MeasureCreationPattern( workbasket=workbasket, base_date=obj.valid_between.lower, ) parser = DutySentenceParser.get( obj.valid_between.lower, component_output=MeasureConditionComponent, ) # Loop over conditions_data, starting at 1 because component_sequence_number has to start at 1 for component_sequence_number, condition_data in enumerate( conditions_data, start=1, ): # Create conditions and measure condition components, using instance as `dependent_measure` measure_creation_pattern.create_condition_and_components( condition_data, component_sequence_number, obj, parser, workbasket, )
def create_measures(self, data): """Returns a list of the created measures.""" measure_start_date = data["valid_between"].lower workbasket = WorkBasket.current(self.request) measure_creation_pattern = MeasureCreationPattern( workbasket=workbasket, base_date=measure_start_date, defaults={ "generating_regulation": data["generating_regulation"], }, ) measures_data = [] for commodity_data in data.get("formset-commodities", []): if not commodity_data.get("DELETE"): for geo_area in data["geo_area_list"]: measure_data = { "measure_type": data["measure_type"], "geographical_area": geo_area, "exclusions": data.get("geo_area_exclusions", None) or [], "goods_nomenclature": commodity_data["commodity"], "additional_code": data["additional_code"], "order_number": data["order_number"], "validity_start": measure_start_date, "validity_end": data["valid_between"].upper, "footnotes": [ item["footnote"] for item in data.get("formset-footnotes", []) if not item.get("DELETE") ], # condition_sentence here, or handle separately and duty_sentence after? "duty_sentence": commodity_data["duties"], } measures_data.append(measure_data) created_measures = [] for measure_data in measures_data: measure = measure_creation_pattern.create(**measure_data) parser = DutySentenceParser.get( measure.valid_between.lower, component_output=MeasureConditionComponent, ) for component_sequence_number, condition_data in enumerate( data.get("formset-conditions", []), start=1, ): if not condition_data.get("DELETE"): measure_creation_pattern.create_condition_and_components( condition_data, component_sequence_number, measure, parser, workbasket, ) created_measures.append(measure) return created_measures