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.