Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 30 additions & 31 deletions ESSArch_Core/auth/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -148,32 +148,30 @@ def get_objects_for_user(user, klass, perms=None, include_no_auth_objs=True, cur
ctype = ContentType.objects.get_for_model(queryset.model)
handle_pk_field = _handle_pk_field(queryset)

groups_objs_total_queryset = queryset.model.objects.none()
groups_objs_values = []
groups_objs_total_field_pk = 'pk'
orgs = []

if current_organization:
group_objs_model = get_group_objs_model(queryset.model)

if group_objs_model.objects.is_generic():
groups_objs_total_queryset = group_objs_model.objects.filter(content_type=ctype)
groups_objs_total_field_pk = 'object_id'
if handle_pk_field is not None and include_no_auth_objs:
groups_objs_total_queryset = groups_objs_total_queryset.annotate(
obj_pk=handle_pk_field(expression=groups_objs_total_field_pk))
groups_objs_total_field_pk = 'obj_pk'
else:
groups_objs_total_queryset = group_objs_model.objects.all()
groups_objs_total_field_pk = 'content_object_id'
group_objs_model = get_group_objs_model(queryset.model)

if group_objs_model.objects.is_generic():
groups_objs_total_queryset = group_objs_model.objects.filter(content_type=ctype)
groups_objs_total_field_pk = 'object_id'
if handle_pk_field is not None and include_no_auth_objs:
groups_objs_total_queryset = groups_objs_total_queryset.annotate(
obj_pk=handle_pk_field(expression=groups_objs_total_field_pk))
groups_objs_total_field_pk = 'obj_pk'
else:
groups_objs_total_queryset = group_objs_model.objects.all()
groups_objs_total_field_pk = 'content_object_id'

if current_organization:
if isinstance(current_organization, Group):
org = current_organization
else:
org = user.user_profile.current_organization

if org is not None:
groups_objs_queryset = group_objs_model.objects.none()
orgs = []
ctype = None

for org_descendant in org.get_descendants(include_self=True):
Expand All @@ -185,20 +183,22 @@ def get_objects_for_user(user, klass, perms=None, include_no_auth_objs=True, cur
roles__in=roles).values_list('codename', flat=True))
if not len(set(codenames).difference(set(role_perms_codenames))):
orgs.append(org_descendant)
# print('orgs: {}'.format(orgs))

if group_objs_model.objects.is_generic():
field_pk = 'object_id'
groups_objs_queryset = groups_objs_total_queryset.filter(group__in=orgs)
if handle_pk_field is not None:
groups_objs_queryset = groups_objs_queryset.annotate(obj_pk=handle_pk_field(expression=field_pk))
field_pk = 'obj_pk'
else:
field_pk = 'content_object_id'
groups_objs_queryset = groups_objs_total_queryset.filter(group__in=orgs)
groups_objs_values = groups_objs_queryset.values_list(field_pk, flat=True)
# print('groups_objs_queryset: {}'.format(groups_objs_queryset))
else:
orgs = list(get_user_groups(user))

# print('orgs: {}'.format(orgs))

if group_objs_model.objects.is_generic():
field_pk = 'object_id'
groups_objs_queryset = groups_objs_total_queryset.filter(group__in=orgs)
if handle_pk_field is not None:
groups_objs_queryset = groups_objs_queryset.annotate(obj_pk=handle_pk_field(expression=field_pk))
field_pk = 'obj_pk'
else:
field_pk = 'content_object_id'
groups_objs_queryset = groups_objs_total_queryset.filter(group__in=orgs)
groups_objs_values = groups_objs_queryset.values_list(field_pk, flat=True)
# print('groups_objs_queryset: {}'.format(groups_objs_queryset))
# Now we should extract list of pk values for which we would filter
# queryset
user_model = get_user_obj_perms_model(queryset.model)
Expand Down Expand Up @@ -282,8 +282,7 @@ def get_objects_for_user(user, klass, perms=None, include_no_auth_objs=True, cur
# print('ids_with_no_auth: {}'.format(ids_with_no_auth))

queryset_filters = Q(pk__in=user_obj_perms_values) | Q(pk__in=groups_obj_perms_values)
if current_organization:
queryset_filters = queryset_filters | Q(pk__in=groups_objs_values)
queryset_filters = queryset_filters | Q(pk__in=groups_objs_values)
if include_no_auth_objs:
queryset_filters = Q(queryset_filters) | Q(pk__in=ids_with_no_auth)
# print('queryset_filters: {}'.format(queryset_filters))
Expand Down
4 changes: 2 additions & 2 deletions ESSArch_Core/ip/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -363,8 +363,8 @@ class InformationPackageManager(OrganizationManager):
def get_queryset(self):
return InformationPackageQuerySet(self.model, using=self._db).annotate_and_prefetch()

def visible_to_user(self, user):
return self.for_user(user, 'view_informationpackage')
def visible_to_user(self, user, include_all_groups=False):
return self.for_user(user, 'view_informationpackage', include_all_groups=include_all_groups)

def migratable(self, export_path='', missing_storage=False, storage_methods=None, policy='',
include_inactive_ips=False):
Expand Down
10 changes: 6 additions & 4 deletions ESSArch_Core/ip/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -491,6 +491,7 @@ def get_related(self, qs, workareas):
def get_queryset(self):
view_type = self.request.query_params.get('view_type', 'aic')
user = self.request.user
all_groups_flag = self.request.query_params.get('all_groups', 'false').lower() == 'true'
see_all = self.request.user.has_perm('ip.see_all_in_workspaces')

workarea_params = {}
Expand All @@ -505,7 +506,8 @@ def get_queryset(self):
workareas = workareas.filter(user=self.request.user)

if not self.detail and view_type == 'aic':
simple_inner = InformationPackage.objects.visible_to_user(user).exclude(
simple_inner = InformationPackage.objects.visible_to_user(user,
include_all_groups=all_groups_flag).exclude(
Q(state='Ingest Workspace') |
Q(Q(workareas__isnull=False) & Q(workareas__read_only=False) & Q(archived=False))
)
Expand Down Expand Up @@ -556,7 +558,7 @@ def get_queryset(self):
# self.inner_queryset = simple_inner
return self.queryset
elif not self.detail and view_type == 'ip':
filtered = InformationPackage.objects.visible_to_user(user).exclude(
filtered = InformationPackage.objects.visible_to_user(user, include_all_groups=all_groups_flag).exclude(
Q(Q(state='Ingest Workspace') | Q(package_type=InformationPackage.AIC)) |
Q(Q(workareas__isnull=False) & Q(workareas__read_only=False) & Q(archived=False))
)
Expand Down Expand Up @@ -587,7 +589,7 @@ def get_queryset(self):
self.queryset = outer
return self.queryset
elif not self.detail and view_type == 'flat':
filtered = InformationPackage.objects.visible_to_user(user).exclude(
filtered = InformationPackage.objects.visible_to_user(user, include_all_groups=all_groups_flag).exclude(
Q(Q(state='Ingest Workspace') | Q(package_type=InformationPackage.AIC)) |
Q(Q(workareas__isnull=False) & Q(workareas__read_only=False) & Q(archived=False))
)
Expand Down Expand Up @@ -619,7 +621,7 @@ def get_queryset(self):
).order_by().values('aic')
lower_higher = lower_higher.annotate(min_gen=Min('generation'), max_gen=Max('generation'))

qs = InformationPackage.objects.visible_to_user(user).filter(
qs = InformationPackage.objects.visible_to_user(user, include_all_groups=all_groups_flag).filter(
Q(Q(workareas=None) | Q(workareas__read_only=True) | Q(archived=True)),
)

Expand Down
8 changes: 6 additions & 2 deletions ESSArch_Core/managers.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class OrganizationManager(models.Manager):
def get_queryset(self):
return OrganizationQuerySet(self.model, using=self._db)

def for_user(self, user, perms=None):
def for_user(self, user, perms=None, include_all_groups=False):
"""
Returns objects for which a given ``users`` groups in the
``users`` current organization has all permissions in ``perms``
Expand All @@ -22,5 +22,9 @@ def for_user(self, user, perms=None):
:param perms: single permission string, or sequence of permission
strings which should be checked
"""
if include_all_groups:
current_organization = False
else:
current_organization = True

return get_objects_for_user(user, self.model, perms)
return get_objects_for_user(user, self.model, perms, current_organization=current_organization)
4 changes: 2 additions & 2 deletions ESSArch_Core/profiles/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ def _get_agents(ip):
def _get_sip_altrecordids(ip):
sip_altrecordids = {}
try:
for k, v in ip.get_profile_data('AIP')['SIP_ALTRECORDIDS'].items():
for k, v in ip.get_profile_data('aip')['SIP_ALTRECORDIDS'].items():
sip_altrecordids[k] = {
'_SIP_ALTRECORDIDS_TYPE': k,
'_SIP_ALTRECORDIDS_VALUE': v[0]
Expand Down Expand Up @@ -230,7 +230,7 @@ def fill_specification_data(data=None, sa=None, ip=None, ignore=None):
pass

data['_AGENTS'] = (_get_agents, ip,)
data['_SIP_ALTRECORDIDS'] = _get_sip_altrecordids(ip)
data['_SIP_ALTRECORDIDS'] = (_get_sip_altrecordids, ip,)

profile_ids = zip(
lowercase_profile_types,
Expand Down
12 changes: 6 additions & 6 deletions requirements/base.txt
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
asgiref==3.9.1
boto3==1.43.14
boto3==1.43.24
celery[tblib]==5.6.3
cffi==2.0.0
channels==4.3.2
channels-redis==4.3.0
chardet==5.2.0
click==8.4.1
cryptography==45.0.7
daphne==4.2.1
daphne==4.2.2
dj-rest-auth[with-social]==7.0.1
django==5.2.14
django==5.2.15
django-allauth==65.11.1
django-cors-headers==4.9.0
django-countries-plus==2.2.0
Expand All @@ -22,7 +22,7 @@ django-languages-plus==2.1.1
django-mptt==0.18.0
django-nested-inline==0.4.6
django-picklefield==3.4.0
django-redis==6.0.0
django-redis==7.0.0
django-relativity==0.2.6
djangorestframework==3.17.1
django-json-widget==1.1.1
Expand All @@ -46,8 +46,8 @@ natsort==8.4.0
opf-fido==1.6.1
pyfakefs==6.2.0
python-dateutil==2.8.2
pywin32==311 ; platform_system=='Windows'
redis==7.4.0
pywin32==312 ; platform_system=='Windows'
redis==7.4.1
regex==2026.5.9
requests==2.34.2
requests-toolbelt==1.0.0
Expand Down
2 changes: 1 addition & 1 deletion requirements/tests.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
coverage==7.14.0
coverage==7.14.1
django-test-without-migrations==0.6
selenium==4.25.0
Loading