X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/1cf4fb4598e03f90dc3be408a9b6b16c9442be9a..21cd47e315b2e86edeff93bac5d1eca5b5d2c428:/src/catalogue/utils.py diff --git a/src/catalogue/utils.py b/src/catalogue/utils.py deleted file mode 100644 index 00f71878..00000000 --- a/src/catalogue/utils.py +++ /dev/null @@ -1,49 +0,0 @@ -# This file is part of FNP-Redakcja, licensed under GNU Affero GPLv3 or later. -# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. -# -from collections import defaultdict -from django.db.models import QuerySet -from django.db.models.manager import BaseManager - - -class UnrelatedQuerySet(QuerySet): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self._prefetch_unrelated_lookups = {} - self._prefetch_unrelated_done = False - - def _clone(self): - c = super()._clone() - c._prefetch_unrelated_lookups = self._prefetch_unrelated_lookups.copy() - return c - - def prefetch_unrelated(self, attribute, field, other_model, other_field): - clone = self._clone() - clone._prefetch_unrelated_lookups[field] = (attribute, other_model, other_field) - return clone - - def _fetch_all(self): - prefetch_done = self._prefetch_done - super()._fetch_all() - if self._prefetch_unrelated_lookups and not prefetch_done: - self._prefetch_unrelated_objects() - - def _prefetch_unrelated_objects(self): - for ( - field, - (attribute, other_model, other_field), - ) in self._prefetch_unrelated_lookups.items(): - values = set([getattr(obj, field) for obj in self._result_cache]) - other_objects = other_model._default_manager.filter( - **{f"{other_field}__in": values} - ) - results = defaultdict(list) - for other_obj in other_objects: - results[getattr(other_obj, other_field)].append(other_obj) - for obj in self._result_cache: - setattr(obj, attribute, results.get(getattr(obj, field))) - self._prefetch_unrelated_done = True - - -class UnrelatedManager(BaseManager.from_queryset(UnrelatedQuerySet)): - pass