summaryrefslogtreecommitdiff
path: root/ishtar_common/wizards.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2025-03-20 12:37:21 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2025-03-20 13:04:05 +0100
commitb1d246d7045e07200b21049a714027dd72060f84 (patch)
tree8549ee5ced0ff1a90eedb1d14fd450d71ac16e96 /ishtar_common/wizards.py
parentf3926450e8b990a8b773aa76c5d58c63fdc5758d (diff)
downloadIshtar-b1d246d7045e07200b21049a714027dd72060f84.tar.bz2
Ishtar-b1d246d7045e07200b21049a714027dd72060f84.zip
✨ wizards: improve performance when many are attached
Diffstat (limited to 'ishtar_common/wizards.py')
-rw-r--r--ishtar_common/wizards.py36
1 files changed, 24 insertions, 12 deletions
diff --git a/ishtar_common/wizards.py b/ishtar_common/wizards.py
index ddf701ce7..8308deed3 100644
--- a/ishtar_common/wizards.py
+++ b/ishtar_common/wizards.py
@@ -846,10 +846,18 @@ class Wizard(IshtarWizard):
# material_index management for baseitems
obj._cached_label_checked = False
obj.save()
+
+ m2m_dict = {}
+ for k, v in m2m:
+ if k not in m2m_dict:
+ m2m_dict[k] = []
+ if not hasattr(v, "pk"):
+ m2m_dict[k].append(v)
+ continue
+ m2m_dict[k].append(v.pk)
m2m_items = {}
- # clear
- # TODO! perf - to be really optimized
old_m2ms = {}
+ obj._no_m2m_process = True
for model in whole_associated_models:
try:
related_model = getattr(obj, model + "s")
@@ -865,16 +873,20 @@ class Wizard(IshtarWizard):
).lower()
if hasattr(obj, related_set_name):
related_model = getattr(obj, related_set_name)
- # clear real m2m
- if hasattr(related_model, "clear"):
- old_m2ms[model] = []
- # stock items in order to not recreate them
- for old_item in related_model.all():
- old_m2ms[model].append(old_item)
- related_model.clear()
- else:
- for r in related_model.all():
+ old_m2ms[model] = []
+ for r in related_model.all():
+ old_m2ms[model].append(r)
+ if not hasattr(r, "pk"):
+ print(f"no pk for {model} - to be managed in wizards")
+ continue
+ if model in m2m_dict and r.pk in m2m_dict[model]:
+ # value kept
+ continue
+ if hasattr(related_model, "remove"):
+ related_model.remove(r)
+ else:
r.delete()
+ obj._no_m2m_process = False
need_update = False
for key, value in m2m:
try:
@@ -943,7 +955,7 @@ class Wizard(IshtarWizard):
val_empty = False
if k.startswith("__empty-"):
val_empty = True
- k = k[len("__empty-") :]
+ k = k[len("__empty-"):]
if not hasattr(old_item, k):
continue
old_val = getattr(old_item, k)