summaryrefslogtreecommitdiff
path: root/ishtar_common
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2025-03-19 11:54:38 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2025-03-19 12:44:45 +0100
commitb0c2ded8e95dcf61b36685fec4b40d9bcf82bef0 (patch)
tree72a8ac0ec7b8c779516bd2d22bb057163b64243d /ishtar_common
parentc1fa91b2acb68aff15ca1dfbabaf51d8ea83e166 (diff)
downloadIshtar-b0c2ded8e95dcf61b36685fec4b40d9bcf82bef0.tar.bz2
Ishtar-b0c2ded8e95dcf61b36685fec4b40d9bcf82bef0.zip
🚑️ fix huge performance problems on permissions when too many items are attached
Diffstat (limited to 'ishtar_common')
-rw-r--r--ishtar_common/models.py4
-rw-r--r--ishtar_common/models_common.py2
-rw-r--r--ishtar_common/models_imports.py1
-rw-r--r--ishtar_common/utils.py7
4 files changed, 10 insertions, 4 deletions
diff --git a/ishtar_common/models.py b/ishtar_common/models.py
index 012bf920d..b5e6d705b 100644
--- a/ishtar_common/models.py
+++ b/ishtar_common/models.py
@@ -5510,13 +5510,13 @@ class Document(
query_own_list.append((rel_model + "__", q_own_dct))
q = None
for prefix, owns in query_own_list:
- subq = cls._construct_query_own(prefix, owns)
+ subq = cls._construct_query_own(cls, prefix, owns)
if subq:
if not q:
q = subq
else:
q |= subq
- q |= cls._construct_query_own("", [{"history_creator": ishtaruser.user_ptr}])
+ q |= cls._construct_query_own(cls, "", [{"history_creator": ishtaruser.user_ptr}])
return q
def get_associated_operation(self):
diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py
index 8f6ff5338..e2495bcd5 100644
--- a/ishtar_common/models_common.py
+++ b/ishtar_common/models_common.py
@@ -2499,7 +2499,7 @@ class GeoVectorData(Imported, OwnPerms):
):
model = apps.get_model(app_label, model_name)
sub_q = cls._construct_query_own(
- "", model._get_query_owns_dicts(ishtaruser)
+ model, "", model._get_query_owns_dicts(ishtaruser)
)
if not sub_q:
continue
diff --git a/ishtar_common/models_imports.py b/ishtar_common/models_imports.py
index b1af1912f..55bbd1906 100644
--- a/ishtar_common/models_imports.py
+++ b/ishtar_common/models_imports.py
@@ -1491,6 +1491,7 @@ class BaseImport(models.Model, OwnPerms, SheetItem):
@classmethod
def get_query_owns(cls, ishtaruser):
return cls._construct_query_own(
+ cls,
"",
[
{"importer_type__users__pk": ishtaruser.pk},
diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py
index 4e80ac60a..cf58216a4 100644
--- a/ishtar_common/utils.py
+++ b/ishtar_common/utils.py
@@ -750,12 +750,17 @@ class OwnPerms:
return []
@classmethod
- def _construct_query_own(cls, prefix, dct_list):
+ def _construct_query_own(cls, model, prefix, dct_list):
q = None
for subquery_dict in dct_list:
subquery = None
for k in subquery_dict:
subsubquery = Q(**{prefix + k: subquery_dict[k]})
+ # slice in multiple queries in order to prevent too complicated queries
+ subsubquery = Q(id__in=(
+ model.objects.filter(subsubquery).values_list("id", flat=True)
+ )
+ )
if subquery:
subquery |= subsubquery
else: