diff options
| -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)) | 
