diff options
Diffstat (limited to 'ishtar_common/models.py')
-rw-r--r-- | ishtar_common/models.py | 95 |
1 files changed, 74 insertions, 21 deletions
diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 8e5b7f703..3e51f8cb1 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -97,6 +97,7 @@ from ishtar_common.utils import ( InlineClass ) from ishtar_common.utils_secretary import IshtarSecretaryRenderer +from ishtar_common.views_item import get_item from ishtar_common.alternative_configs import ( ALTERNATE_CONFIGS, @@ -140,7 +141,8 @@ from ishtar_common.utils import ( cached_label_changed, generate_relation_graph, max_size_help, - JSON_SERIALIZATION + JSON_SERIALIZATION, + SearchAltName, ) from ishtar_common.models_common import ( @@ -175,7 +177,6 @@ from ishtar_common.models_common import ( PermissionRequest, post_save_cache, QuickAction, - SearchAltName, SearchVectorConfig, SpatialReferenceSystem, TemplateItem, @@ -198,6 +199,7 @@ __all__ = [ "ImporterColumn", "ImporterDuplicateField", "Imported", + "PermissionRequest", "Regexp", "ImportTarget", "ItemKey", @@ -3466,7 +3468,8 @@ class ProfileTypeSummary(ProfileType): class UserProfile(models.Model): name = models.CharField(_("Name"), blank=True, default="", max_length=100) profile_type = models.ForeignKey( - ProfileType, verbose_name=_("Profile type"), on_delete=models.PROTECT + ProfileType, verbose_name=_("Profile type"), on_delete=models.PROTECT, + related_name="user_profiles" ) areas = models.ManyToManyField( "Area", verbose_name=_("Areas"), blank=True, related_name="profiles" @@ -3521,7 +3524,9 @@ class UserProfile(models.Model): def duplicate(self, **kwargs): areas = [area for area in self.areas.all()] - external_sources = [external_source for external_source in self.external_sources.all()] + external_sources = [ + external_source for external_source in self.external_sources.all() + ] new_item = self new_item.pk = None name = self.name @@ -3541,50 +3546,95 @@ class UserProfile(models.Model): new_item.external_sources.add(src) return new_item - def _generate_permission(self, ishtar_user, content_type, permission_request): + def _generate_permission(self, ishtar_user, content_type, permission_request, + permissions, permission_type): item_ids = [] model_class = content_type.model_class() - # TODO: gérer les paniers if permission_request.include_associated_items: - item_ids += model_class.filter( + item_ids += model_class.objects.filter( ishtar_users__pk=ishtar_user.pk ).values_list("pk", flat=True) + item_ids += model_class.objects.filter( + history_creator_id=ishtar_user.pk + ).values_list("pk", flat=True) + if content_type.model == "find" and \ + permission_type in ("view", "change"): + Find = apps.get_model("archaeological_finds", "Find") + k = "basket__shared_write_with" if permission_type == "change" \ + else "basket__shared_with" + item_ids += list( + Find.objects.filter(**{k: ishtar_user}).values_list("pk", flat=True) + ) + print("ishtar_common/models.py - 3561", item_ids, ishtar_user, content_type, permission_type) if permission_request.include_upstream_items: - # TODO.... - item_ids += model_class.get_ids_from_upper_permissions(ishtar_user.user_ptr.pk) + item_ids += model_class.get_ids_from_upper_permissions( + ishtar_user.user_ptr.pk, permissions + ) + print("ishtar_common/models.py - 3566", item_ids, ishtar_user, content_type, permission_type) if permission_request.request or permission_request.limit_to_attached_areas: - # TODO - pass - query = model_class.objects + _get_item = get_item( + content_type.model_class(), + "", "", no_permission_check=True, + ) + result = [] + query = permission_request.request + if query: + if "{USER}" in query: + query = query.replace("{USER}", f"id:{ishtar_user.person_id}") + query = {"search_vector": query} + q = _get_item(None, return_query=True, ishtaruser=ishtar_user, + query=query) + result = list(q.values_list("pk", flat=True)) + if permission_request.limit_to_attached_areas: + profile = ishtar_user.current_profile + if not profile: # no areas attached + return [] + town_ids = list(profile.query_towns.values_list("pk", flat=True)) + result_limit = [] + get_limit_to_area_query = getattr( + model_class, "get_limit_to_area_query", None + ) + q = get_limit_to_area_query(town_ids) if get_limit_to_area_query else None + if q: + result_limit = list( + model_class.objects.filter(q).values_list("pk", flat=True) + ) + if result: + result = [pk for pk in result if pk in result_limit] + else: + result = result_limit + item_ids += result + print("ishtar_common/models.py - 3600", item_ids, ishtar_user, content_type, permission_type) return item_ids - def generate_permission(self, content_type): + def generate_permission(self, content_type, permission_type): ishtar_user = self.person.ishtaruser # add base permissions for group in self.profile_type.groups.all(): - for perm in group.permissions.all(): + for perm in group.permissions.filter( + codename__startswith=permission_type).all(): ishtar_user.user_ptr.user_permissions.add(perm) q_has_perm = self.profile_type.groups.filter( permissions__content_type=content_type, - permissions__codename__contains="_own_" + permissions__codename__startswith=f"{permission_type}_own_", ) if not q_has_perm.count(): # no permission to generate return permissions = [] for group in q_has_perm.all(): - permissions += list(group.permissions.values_list("pk", flat=True)) + permissions += list(group.permissions.filter( + codename__contains=permission_type + ).all()) q_req = self.profile_type.permission_requests.filter( model=content_type, active=True ) item_ids = [] if not q_req.count(): # TODO v5: delete old behaviour - """ print(f"WARNING: no permission request for content {content_type.name} and profile {self}") print("Using old behaviour") - """ model_class = content_type.model_class() query = model_class.get_owns(user=ishtar_user, query=True, no_auth_check=True) if query: @@ -3594,13 +3644,15 @@ class UserProfile(models.Model): else: for perm_request in q_req.all(): item_ids += self._generate_permission( - ishtar_user, content_type, perm_request + ishtar_user, content_type, perm_request, permissions, + permission_type ) user_id = ishtar_user.user_ptr.pk object_permissions = [] item_ids = list(set(item_ids)) permissions = list(set(permissions)) - for permission_id in permissions: + for permission in permissions: + permission_id = permission.pk exclude = list(UserObjectPermission.objects.filter( content_type_id=content_type.pk, permission_id=permission_id, user_id=user_id @@ -3900,7 +3952,8 @@ class IshtarUser(FullSearch): for ct in content_types: for profile in self.person.profiles.all(): - profile.generate_permission(ct) + for permission_type in ("view", "change", "delete"): + profile.generate_permission(ct, permission_type) def full_label(self): return self.person.full_label() |