diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2025-07-17 16:31:50 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2025-07-18 12:44:38 +0200 |
commit | d5442e9d37717a1c9d0d8767e669042f98cad19d (patch) | |
tree | 83929bc2c68028a57402751c683cb93994f125b6 | |
parent | 0e3018b681eea2c37db559c529a236ce6084efbc (diff) | |
download | Ishtar-d5442e9d37717a1c9d0d8767e669042f98cad19d.tar.bz2 Ishtar-d5442e9d37717a1c9d0d8767e669042f98cad19d.zip |
🐛 relations forms - clean duplicates, fix deletion (refs #6399)
-rw-r--r-- | archaeological_operations/views.py | 8 | ||||
-rw-r--r-- | ishtar_common/models.py | 18 |
2 files changed, 21 insertions, 5 deletions
diff --git a/archaeological_operations/views.py b/archaeological_operations/views.py index cc6eef0c2..c5105973b 100644 --- a/archaeological_operations/views.py +++ b/archaeological_operations/views.py @@ -510,7 +510,7 @@ def _formset_get_deleted(request, data, pk_key): continue try: form_number = int(k.split("-")[1]) - except (ValueError, IndexError) as __: + except (ValueError, IndexError): continue if k.endswith("-DELETE"): if new_data.get(f"form-{form_number}-{pk_key}", None): @@ -521,10 +521,6 @@ def _formset_get_deleted(request, data, pk_key): new_data.pop(k) elif form_number in no_values and form_number not in deleted: no_values.pop(no_values.index(form_number)) - for no_value in no_values: - for k in list(new_data.keys()): - if k.startswith(f"form-{no_value}-"): - new_data.pop(k) data["form-TOTAL_FORMS"] = data["form-TOTAL_FORMS"] - len(no_values) new_data.update(data) return new_data, deleted @@ -608,6 +604,8 @@ def get_relation_modify(model, model_relation, formset_class, url_name, filter_o } ) if is_valid: + if hasattr(item, "clean_relations"): + item.clean_relations() return redirect(reverse(url_name, args=[pk])) else: formset = formset_class(initial=initial, data=data, form_kwargs=form_kwargs) diff --git a/ishtar_common/models.py b/ishtar_common/models.py index ad7616b53..b370624fb 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -668,6 +668,21 @@ class RelationItem(models.Model): full=full, ) + def clean_relations(self): + # clean duplicates + for side in ("right", "left"): + currents = [] + rels = getattr(self, f"{side}_relations") + for relation in list(rels.all()): + key = (getattr(relation, f"{side}_record_id"), + relation.relation_type_id) + if key not in currents: + currents.append(key) + else: + relation._no_cascade_delete = True + # prevent cascade delete + relation.delete() + class JsonDataSectionManager(models.Manager): def get_by_natural_key(self, name, app_label, model): @@ -862,6 +877,9 @@ class GeneralRecordRelations(Imported): def post_delete_record_relation(sender, instance, **kwargs): + if getattr(instance, "_no_cascade_delete", False): + # do not delete on "clean_relations" call + return # delete symmetrical or inverse relation sym_rel_type = instance.relation_type if not instance.relation_type.symmetrical: |