Skip to content

Commit e959056

Browse files
committed
[ckan#9277] Improve Organization List Action performance for Org List pages
1 parent df12c38 commit e959056

1 file changed

Lines changed: 34 additions & 12 deletions

File tree

ckan/lib/dictization/model_dictize.py

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,30 @@ def group_dictize(group: model.Group, context: Context,
374374
if packages_field:
375375
def get_packages_for_this_group(group_: model.Group,
376376
just_the_count: bool = False):
377+
if just_the_count:
378+
# Get dataset count from Member table
379+
query = model.Session.query(model.Member.id).filter(
380+
model.Member.group_id == group_.id,
381+
model.Member.table_name == 'package',
382+
model.Member.state == 'active'
383+
)
384+
385+
if group_.is_organization:
386+
is_group_member = (context.get('user') and
387+
authz.has_user_permission_for_group_or_org(
388+
group_.id, context.get('user'), 'read'))
389+
390+
# Make sure not to show private datasets to non-members
391+
if not is_group_member and not config.get('ckan.auth.allow_dataset_collaborators'):
392+
query = query.join(
393+
model.Package,
394+
model.Member.table_id == model.Package.id
395+
).filter(model.Package.private == False)
396+
397+
member_count = query.count()
398+
399+
return member_count, []
400+
377401
# Ask SOLR for the list of packages for this org/group
378402
q: dict[str, Any] = {
379403
'facet': 'false',
@@ -382,10 +406,7 @@ def get_packages_for_this_group(group_: model.Group,
382406

383407
if group_.is_organization:
384408
q['fq'] = '+owner_org:"{0}"'.format(group_.id)
385-
else:
386-
q['fq'] = '+groups:"{0}"'.format(group_.name)
387409

388-
if group_.is_organization:
389410
is_group_member = (context.get('user') and
390411
authz.has_user_permission_for_group_or_org(
391412
group_.id, context.get('user'), 'read'))
@@ -394,16 +415,17 @@ def get_packages_for_this_group(group_: model.Group,
394415
else:
395416
if config.get('ckan.auth.allow_dataset_collaborators'):
396417
q['include_private'] = True
418+
else:
419+
q['fq'] = '+groups:"{0}"'.format(group_.name)
397420

398-
if not just_the_count:
399-
# package_search limits 'rows' anyway, so this is only if you
400-
# want even fewer
401-
try:
402-
packages_limit = context['limits']['packages']
403-
except KeyError:
404-
del q['rows'] # leave it to package_search to limit it
405-
else:
406-
q['rows'] = packages_limit
421+
# package_search limits 'rows' anyway, so this is only if you
422+
# want even fewer
423+
try:
424+
packages_limit = context['limits']['packages']
425+
except KeyError:
426+
del q['rows'] # leave it to package_search to limit it
427+
else:
428+
q['rows'] = packages_limit
407429

408430
search_context = cast(
409431
Context, dict((k, v) for (k, v) in context.items()

0 commit comments

Comments
 (0)