diff -urN src.orig/ckan/ckan/model/activity.py src/ckan/ckan/model/activity.py --- src.orig/ckan/ckan/model/activity.py 2016-11-02 13:18:40.000000000 +0100 +++ src/ckan/ckan/model/activity.py 2019-01-09 16:49:03.538432923 +0100 @@ -3,7 +3,7 @@ import datetime from sqlalchemy import ( - orm, types, Column, Table, ForeignKey, desc, or_, union_all) + orm, types, Column, Table, ForeignKey, desc, or_, and_, union_all) import ckan.model import meta @@ -182,14 +182,33 @@ # Return a query with no results. return model.Session.query(model.Activity).filter("0=1") - dataset_ids = [dataset.id for dataset in group.packages()] + q = model.Session.query( + model.Activity + ).outerjoin( + model.Member, + and_( + model.Activity.object_id == model.Member.table_id, + model.Member.state == 'active' + ) + ).outerjoin( + model.Package, + and_( + model.Package.id == model.Member.table_id, + model.Package.private == False, + model.Package.state == 'active' + ) + ).filter( + # We only care about activity either on the the group itself or on + # packages within that group. + # FIXME: This means that activity that occured while a package belonged + # to a group but was then removed will not show up. This may not be + # desired but is consistent with legacy behaviour. + or_( + model.Member.group_id == group_id, + model.Activity.object_id == group_id + ), + ) - q = model.Session.query(model.Activity) - if dataset_ids: - q = q.filter(or_(model.Activity.object_id == group_id, - model.Activity.object_id.in_(dataset_ids))) - else: - q = q.filter(model.Activity.object_id == group_id) return q Binary files src.orig/ckan/ckan/model/activity.pyc and src/ckan/ckan/model/activity.pyc differ diff -urN src.orig/ckan/ckan/model/resource.py src/ckan/ckan/model/resource.py --- src.orig/ckan/ckan/model/resource.py 2016-11-02 13:18:40.000000000 +0100 +++ src/ckan/ckan/model/resource.py 2019-01-09 16:20:07.946037478 +0100 @@ -189,7 +189,6 @@ ), ) }, -order_by=[resource_table.c.package_id], extension=[vdm.sqlalchemy.Revisioner(resource_revision_table), extension.PluginMapperExtension(), ], diff -urN src.orig/ckan/ckan/model/user.py src/ckan/ckan/model/user.py --- src.orig/ckan/ckan/model/user.py 2016-11-02 13:18:40.000000000 +0100 +++ src/ckan/ckan/model/user.py 2019-01-09 17:03:52.992595940 +0100 @@ -9,7 +9,7 @@ from passlib.hash import pbkdf2_sha512 from sqlalchemy.sql.expression import or_ from sqlalchemy.orm import synonym -from sqlalchemy import types, Column, Table +from sqlalchemy import types, Column, Table, func import vdm.sqlalchemy import meta @@ -194,21 +194,43 @@ def number_of_edits(self): # have to import here to avoid circular imports import ckan.model as model - revisions_q = meta.Session.query(model.Revision) - revisions_q = revisions_q.filter_by(author=self.name) - return revisions_q.count() + # Get count efficiently without spawning the SQLAlchemy subquery + # wrapper. Reset the VDM-forced order_by on timestamp. + return meta.Session.execute( + meta.Session.query( + model.Revision + ).filter_by( + author=self.name + ).statement.with_only_columns( + [func.count()] + ).order_by( + None + ) + ).scalar() def number_created_packages(self, include_private_and_draft=False): # have to import here to avoid circular imports import ckan.model as model - q = meta.Session.query(model.Package)\ - .filter_by(creator_user_id=self.id) + # Get count efficiently without spawning the SQLAlchemy subquery + # wrapper. Reset the VDM-forced order_by on timestamp. + q = meta.Session.query( + model.Package + ).filter_by( + creator_user_id=self.id + ) + if include_private_and_draft: q = q.filter(model.Package.state != 'deleted') else: - q = q.filter_by(state='active')\ - .filter_by(private=False) - return q.count() + q = q.filter_by(state='active', private=False) + + return meta.Session.execute( + q.statement.with_only_columns( + [func.count()] + ).order_by( + None + ) + ).scalar() def activate(self): ''' Activate the user ''' diff -urN src.orig/ckan/ckan/templates/package/resources.html src/ckan/ckan/templates/package/resources.html --- src.orig/ckan/ckan/templates/package/resources.html 2016-11-02 13:18:40.000000000 +0100 +++ src/ckan/ckan/templates/package/resources.html 2019-01-09 17:47:04.523262770 +0100 @@ -11,8 +11,9 @@ {% block primary_content_inner %} {% if pkg.resources %} {% else %} @@ -28,3 +29,4 @@ {% resource 'vendor/reorder' %} {% endif %} {% endblock %} + diff -urN src.orig/ckan/ckan/templates/package/snippets/resource_item.html src/ckan/ckan/templates/package/snippets/resource_item.html --- src.orig/ckan/ckan/templates/package/snippets/resource_item.html 2016-11-02 13:18:40.000000000 +0100 +++ src/ckan/ckan/templates/package/snippets/resource_item.html 2019-01-09 16:38:40.211725133 +0100 @@ -1,4 +1,3 @@ -{% set can_edit = h.check_access('package_update', {'id':pkg.id }) %} {% set url_action = 'resource_edit' if url_is_edit and can_edit else 'resource_read' %} {% set url = h.url_for(controller='package', action=url_action, id=pkg.name, resource_id=res.id) %} diff -urN src.orig/ckan/ckan/templates/package/snippets/resources_list.html src/ckan/ckan/templates/package/snippets/resources_list.html --- src.orig/ckan/ckan/templates/package/snippets/resources_list.html 2016-11-02 13:18:40.000000000 +0100 +++ src/ckan/ckan/templates/package/snippets/resources_list.html 2019-01-09 17:48:29.927086043 +0100 @@ -15,8 +15,9 @@ {% if resources %} @@ -31,3 +32,4 @@ {% endif %} {% endblock %} +