summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--archaeological_operations/views.py8
-rw-r--r--ishtar_common/models.py18
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: