summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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
commita2de2eb42009de3b8bf56f2af2a6071a4a98fd8f (patch)
tree6fff18a18e727775fd9fa497577a2c22bb113cf8
parent87502f2d4c71663771ee98d5b32ad7179610c1d7 (diff)
downloadIshtar-a2de2eb42009de3b8bf56f2af2a6071a4a98fd8f.tar.bz2
Ishtar-a2de2eb42009de3b8bf56f2af2a6071a4a98fd8f.zip
✨ filter sheets by profile type
-rw-r--r--ishtar_common/models.py17
-rw-r--r--ishtar_common/models_common.py8
-rw-r--r--ishtar_common/views_item.py37
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))