diff options
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 |
commit | b0c2ded8e95dcf61b36685fec4b40d9bcf82bef0 (patch) | |
tree | 72a8ac0ec7b8c779516bd2d22bb057163b64243d /ishtar_common | |
parent | c1fa91b2acb68aff15ca1dfbabaf51d8ea83e166 (diff) | |
download | Ishtar-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.py | 4 | ||||
-rw-r--r-- | ishtar_common/models_common.py | 2 | ||||
-rw-r--r-- | ishtar_common/models_imports.py | 1 | ||||
-rw-r--r-- | ishtar_common/utils.py | 7 |
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: |