diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2024-11-14 17:31:15 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2025-02-19 14:45:55 +0100 |
commit | a2de2eb42009de3b8bf56f2af2a6071a4a98fd8f (patch) | |
tree | 6fff18a18e727775fd9fa497577a2c22bb113cf8 | |
parent | 87502f2d4c71663771ee98d5b32ad7179610c1d7 (diff) | |
download | Ishtar-a2de2eb42009de3b8bf56f2af2a6071a4a98fd8f.tar.bz2 Ishtar-a2de2eb42009de3b8bf56f2af2a6071a4a98fd8f.zip |
✨ filter sheets by profile type
-rw-r--r-- | ishtar_common/models.py | 17 | ||||
-rw-r--r-- | ishtar_common/models_common.py | 8 | ||||
-rw-r--r-- | ishtar_common/views_item.py | 37 |
3 files changed, 60 insertions, 2 deletions
diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 8542c8963..f46331eb5 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -406,7 +406,7 @@ class HistoryModel(models.Model): if not models.endswith(".models"): models += ".models" models = import_module(models) - model = getattr(models, self.__class__.__name__[len("Historical") :]) + model = getattr(models, self.__class__.__name__[len("Historical"):]) field = getattr(model, key) if hasattr(field, "rel"): field = field.rel @@ -3456,6 +3456,21 @@ class ProfileType(GeneralType): ordering = ("label",) ADMIN_SECTION = _("Account") + def get_filters(self, model_class): + """ + Return (exclude (True if exclude, False for include), key list) + """ + q = self.filtered_sheets.filter( + content_type=ContentType.objects.get_for_model(model_class) + ) + if not q.count(): + return (None, None) + filter_sheet = q.all()[0] + return ( + filter_sheet.exclude_or_include == "E", + list(filter_sheet.filters.values_list("key", flat=True)) + ) + def clean_groups(self): """ Remove "own" groups if generic group is associated diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py index f42b6a08a..e2fa9988c 100644 --- a/ishtar_common/models_common.py +++ b/ishtar_common/models_common.py @@ -920,6 +920,11 @@ class FilteredSheet(models.Model): def __str__(self): return f"{self.content_type.model_class()._meta.verbose_name} | {self.name}" + @property + def exclude_or_include(self): + q = self.filters.filter(exclude_or_include="E") + return "E" if q.count() else "I" + class FullSearch(models.Model): search_vector = SearchVectorField( @@ -3099,12 +3104,15 @@ class GeographicItem(models.Model): @property def geodata_list(self): + if getattr(self, "_geodata_list", None): + return self._geodata_list lst = [] if self.main_geodata: lst.append(self.main_geodata) for geo in self.geodata.all(): if geo != self.main_geodata: lst.append(geo) + self._geodata_list = lst return lst diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py index 9f72171b9..9570687bf 100644 --- a/ishtar_common/views_item.py +++ b/ishtar_common/views_item.py @@ -376,6 +376,39 @@ def show_source_item(request, source_id, model, name, base_dct, extra_dct): return HttpResponse(content, content_type="application/xhtml") +def filter_sheet(ishtar_user, item): + if not ishtar_user or ishtar_user.is_ishtaradmin: + return item + profile = ishtar_user.current_profile + if not profile: + return item + exclude, keys = profile.profile_type.get_filters(item.__class__) + if exclude is None: + return item + base_keys = [ + "id", "pk", "locked", "is_locked", "SLUG", "APP", "MODEL", + "HAS_QR_CODE", "get_absolute_url", "get_extra_actions", + "get_extra_templates", "can_edit", "can_delete", "DELETE_URL" + ] + base_keys += getattr(item, "SHEET_BASE_KEYS", []) + if exclude: + # cannot exclude base keys + len_keys = len(keys) + for idx, key in enumerate(reversed(keys)): + if key in base_keys: + keys.pop(len_keys - 1 - idx) + else: + keys += base_keys + if exclude: + for key in keys: + setattr(item, key, None) + return item + new_item = type("BaseObject", (object,), {}) + for key in keys: + setattr(new_item, key, getattr(item, key, None)) + return new_item + + def show_item(model, name, extra_dct=None, model_for_perms=None, callback=None): def func(request, pk, **dct): check_model = model @@ -489,7 +522,9 @@ def show_item(model, name, extra_dct=None, model_for_perms=None, callback=None): and (not item.qrcode or not item.qrcode.name) ): item.generate_qrcode(request=request) - dct["item"], dct["item_name"] = item, name + + ishtaruser = hasattr(request.user, "ishtaruser") and request.user.ishtaruser + dct["item"], dct["item_name"] = filter_sheet(ishtaruser, item), name # add context if extra_dct: dct.update(extra_dct(request, item)) |