En algunos casos, es necesario que los usuarios puedan acceder a los documentos según el valor de metadatos, estados, etc.
La asignación de permisos por objetos es muy útil en estos casos, pero requiere activar los automatismos necesarios para se asignen los permisos correctos.
En algunos casos, especialmente cuando tenemos millones de documentos en el sistema, aplicar los permisos por objeto puede volverse un proceso lento.
Por este motivo, Athento permite definir condiciones dinámicas que aplican en el momento de la búsqueda de documentos y la visualización de documentos.
A continuación se muestra cómo se realizaría la configuración de restricción de acceso para aquellos documentos que tengan el metadato "Contrato Aceptado" a valor "SI" y para el grupo "Consulta Contratos".
El primer paso es crear un módulo en la ruta athentose/custom/restrictions/MetadataRestriction.py como el que muestra en el ejemplo:
class MetadataRestriction(BaseRestriction): """Metadata restriction class.""" METADATA_RESTRICTION_GROUPS = ['Group1_ojbrsjqurbxbmbwyfpyaqlg'] METADATA_ORM_CLAUSE = Q(type__name='metadata.contrato_aceptado', boolean_value=True) METADATA_ES_CLAUSE = Q('term', metadatas__type__name='metadata.contrato_aceptado', metadatas__value=True) ... @staticmethod def _user_in_groups(user): """Check if a group contains the user. Args: user (:class:`~django.contrib.auth.models.User`): User to check. Returns: bool: True if groups contains the user, otherwise False """ groups = user.groups.all() for group in groups: if group.name in MetadataRestriction.METADATA_RESTRICTION_GROUPS: return True return False
@staticmethod def _restricted_by_user(user): ... result = { 'restricted': False, 'qs': File.objects.none(), 'Q': elasticQ() } if not MetadataRestriction._user_in_groups(user): return result user_series = user.get_series_read().values_list('id', flat=True) if settings.SEARCH_ENGINE == 'postgres': metadata_files = Metadata.objects.filter(MetadataRestriction.METADATA_ORM_CLAUSE).values_list('file', flat=True) result['qs'] = File.objects.filter(serie__in=user_series, id__in=metadata_files) else: series_query = elasticQ( 'bool', should=elasticQ('terms', serie__id=list(user_series)), minimum_should_match=1 ) metadata_query = Q('nested', path="metadatas", query=Q('bool', must=MetadataRestriction.METADATA_ES_CLAUSE) ) restriction_query = series_query & metadata_query print(restriction_query) result['Q'] = restriction_query result['restricted'] = True return result
El segundo paso es habilitar en local_settings.py dicha restricción del siguiente modo:
Comentarios
0 comentarios
Inicie sesión para dejar un comentario.