From bd38a04747e7d4ed4e28dd75ba1b43583d883e65 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Tue, 5 Nov 2024 12:12:30 +0100 Subject: ✨ ishtar account sheet MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ishtar_common/models.py | 51 ++- ishtar_common/models_common.py | 3 +- ishtar_common/models_imports.py | 2 +- .../ishtar/blocks/sheet_permission_detail.html | 13 + .../templates/ishtar/blocks/window_nav.html | 5 +- .../templates/ishtar/sheet_ishtaruser.html | 489 +++++++++++++++++++++ .../templates/ishtar/sheet_ishtaruser_window.html | 3 + ishtar_common/templates/ishtar/sheet_person.html | 2 +- ishtar_common/templatetags/ishtar_helpers.py | 5 + ishtar_common/templatetags/link_to_window.py | 8 +- ishtar_common/templatetags/window_tables.py | 5 +- ishtar_common/urls.py | 5 + ishtar_common/utils.py | 10 + ishtar_common/views.py | 3 + ishtar_common/views_item.py | 62 ++- 15 files changed, 634 insertions(+), 32 deletions(-) create mode 100644 ishtar_common/templates/ishtar/blocks/sheet_permission_detail.html create mode 100644 ishtar_common/templates/ishtar/sheet_ishtaruser.html create mode 100644 ishtar_common/templates/ishtar/sheet_ishtaruser_window.html diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 5b2e3fdbf..424648854 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -3609,7 +3609,8 @@ class UserProfile(models.Model): print("ishtar_common/models.py - 3600", item_ids, ishtar_user, content_type, permission_type) return item_ids - def generate_permission(self, content_type, permission_type): + def generate_permission(self, content_type, permission_type, + base_permission_only=False): ishtar_user = self.person.ishtaruser if self.expiration_date and self.expiration_date < datetime.date.today(): @@ -3618,8 +3619,12 @@ class UserProfile(models.Model): # add base permissions for group in self.profile_type.groups.all(): for perm in group.permissions.filter( + content_type=content_type, codename__startswith=permission_type).all(): ishtar_user.user_ptr.user_permissions.add(perm) + if base_permission_only: + return + q_has_perm = self.profile_type.groups.filter( permissions__content_type=content_type, permissions__codename__startswith=f"{permission_type}_own_", @@ -3772,6 +3777,7 @@ class IshtarUser(FullSearch): SearchVectorConfig("person__town"), SearchVectorConfig("person__attached_to__name"), ] + SHEET_ALTERNATIVES = [] CACHED_LABELS = [] # needed to force search vector update @@ -3926,12 +3932,15 @@ class IshtarUser(FullSearch): def generate_permission(self): # models to treat first in this order to manage cascade permissions model_names = [ + ("archaeological_files", "file"), ("archaeological_operations", "operation"), + ("archaeological_operations", "archaeologicalsite"), ("archaeological_context_records", "contextrecord"), ("archaeological_warehouse", "warehouse"), - ("archaeological_finds", "treatment"), ("archaeological_warehouse", "container"), ("archaeological_finds", "find"), + ("archaeological_finds", "treatmentfile"), + ("archaeological_finds", "treatment"), ] # cascade permission to treat at the end last_model_names = [ @@ -3958,9 +3967,47 @@ class IshtarUser(FullSearch): for ct in content_types: for profile in self.person.profiles.all(): + profile.generate_permission(ct, "add", base_permission_only=True) for permission_type in ("view", "change", "delete"): profile.generate_permission(ct, permission_type) + def has_permission_dict(self): + """ + Get permission dict with permission codename as key and True or False as result. + Used by ishtaruser sheet + """ + permission_list = [] + model_list = [ + ("archaeological_context_records", "contextrecord"), + ("archaeological_files", "file"), + ("archaeological_finds", "find"), + ("archaeological_finds", "treatment"), + ("archaeological_finds", "treatmentfile"), + ("archaeological_operations", "operation"), + ("archaeological_operations", "archaeologicalsite"), + ("archaeological_warehouse", "warehouse"), + ("archaeological_warehouse", "container"), + ("ishtar_common", "document"), + ("ishtar_common", "person"), + ("ishtar_common", "organization"), + ("archaeological_operations", "administrativeact"), + ] + for app_label, model in model_list: + for permission in ("change", "delete", "view"): + permission_list.append( + (app_label, model, f"{permission}_own_{model}") + ) + permission_dict = {} + for app_label, model, permission_codename in permission_list: + ct = ContentType.objects.get(app_label=app_label, model=model) + q = UserObjectPermission.objects.filter( + user_id=self.pk, + permission__codename=permission_codename, + content_type=ct + ) + permission_dict[permission_codename] = q.exists() + return permission_dict + def full_label(self): return self.person.full_label() diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py index 920b71584..011c71a8a 100644 --- a/ishtar_common/models_common.py +++ b/ishtar_common/models_common.py @@ -1575,7 +1575,7 @@ class BaseHistorizedItem( null=True, ) ishtar_users = models.ManyToManyField( - "ishtar_common.IshtarUser", blank=True, related_name='%(class)s_permission_associated' + "ishtar_common.IshtarUser", blank=True, related_name='%(class)s_associated' ) class Meta: @@ -3304,6 +3304,7 @@ class MainItem(ShortMenuItem, SerializeItem, SheetItem): SHOW_URL = None DOWN_MODEL_UPDATE = [] INITIAL_VALUES = [] # list of field checkable if changed on save + OLD_SHEET_EXPORT = True def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/ishtar_common/models_imports.py b/ishtar_common/models_imports.py index ddb23e490..8f4686666 100644 --- a/ishtar_common/models_imports.py +++ b/ishtar_common/models_imports.py @@ -1441,7 +1441,7 @@ class BaseImport(models.Model, OwnPerms, SheetItem): ) state = None - NO_ODTPDF_EXPORT = True + OLD_SHEET_EXPORT = False class Meta: abstract = True diff --git a/ishtar_common/templates/ishtar/blocks/sheet_permission_detail.html b/ishtar_common/templates/ishtar/blocks/sheet_permission_detail.html new file mode 100644 index 000000000..aaf88b034 --- /dev/null +++ b/ishtar_common/templates/ishtar/blocks/sheet_permission_detail.html @@ -0,0 +1,13 @@ +{% load i18n ishtar_helpers window_tables %} + +{% if item|user_can_do:full_permission %} +

{{table_label}}

+ +{% else %} +{% if has_own_permission %} +{% dynamic_table_document table_label table_name permission item.pk '' output %} +{% endif %} +{% endif %} diff --git a/ishtar_common/templates/ishtar/blocks/window_nav.html b/ishtar_common/templates/ishtar/blocks/window_nav.html index 63aafb93a..d318fe264 100644 --- a/ishtar_common/templates/ishtar/blocks/window_nav.html +++ b/ishtar_common/templates/ishtar/blocks/window_nav.html @@ -81,7 +81,7 @@ {% endif %} - {% if not item.NO_ODTPDF_EXPORT or extra_templates %} + {% if item.OLD_SHEET_EXPORT or extra_templates or item.HAS_QR_CODE or item.get_absolute_url %}