Project

General

Profile

Task #13050 » ckan_performance_fixes_13050-1.diff

Patch without the template changes - Andrea Dell'Amico, Jan 09, 2019 05:06 PM

View differences:

src/ckan/ckan/model/activity.py 2019-01-09 16:49:03.538432923 +0100
3 3
import datetime
4 4

  
5 5
from sqlalchemy import (
6
    orm, types, Column, Table, ForeignKey, desc, or_, union_all)
6
    orm, types, Column, Table, ForeignKey, desc, or_, and_, union_all)
7 7

  
8 8
import ckan.model
9 9
import meta
......
182 182
        # Return a query with no results.
183 183
        return model.Session.query(model.Activity).filter("0=1")
184 184

  
185
    dataset_ids = [dataset.id for dataset in group.packages()]
185
    q = model.Session.query(
186
            model.Activity
187
        ).outerjoin(
188
            model.Member,
189
            and_(
190
                    model.Activity.object_id == model.Member.table_id,
191
                    model.Member.state == 'active'
192
                )
193
            ).outerjoin(
194
            model.Package,
195
            and_(
196
                    model.Package.id == model.Member.table_id,
197
                    model.Package.private == False,
198
                    model.Package.state == 'active'
199
                )
200
        ).filter(
201
            # We only care about activity either on the the group itself or on
202
            # packages within that group.
203
            # FIXME: This means that activity that occured while a package belonged
204
            # to a group but was then removed will not show up. This may not be
205
            # desired but is consistent with legacy behaviour.
206
            or_(
207
                model.Member.group_id == group_id,
208
                model.Activity.object_id == group_id
209
            ),
210
        )
186 211

  
187
    q = model.Session.query(model.Activity)
188
    if dataset_ids:
189
        q = q.filter(or_(model.Activity.object_id == group_id,
190
            model.Activity.object_id.in_(dataset_ids)))
191
    else:
192
        q = q.filter(model.Activity.object_id == group_id)
193 212
    return q
194 213

  
195 214

  
src/ckan/ckan/model/resource.py 2019-01-09 16:20:07.946037478 +0100
189 189
                            ),
190 190
    )
191 191
},
192
order_by=[resource_table.c.package_id],
193 192
extension=[vdm.sqlalchemy.Revisioner(resource_revision_table),
194 193
           extension.PluginMapperExtension(),
195 194
           ],
src/ckan/ckan/model/user.py 2019-01-09 17:03:52.992595940 +0100
9 9
from passlib.hash import pbkdf2_sha512
10 10
from sqlalchemy.sql.expression import or_
11 11
from sqlalchemy.orm import synonym
12
from sqlalchemy import types, Column, Table
12
from sqlalchemy import types, Column, Table, func
13 13
import vdm.sqlalchemy
14 14

  
15 15
import meta
......
194 194
    def number_of_edits(self):
195 195
        # have to import here to avoid circular imports
196 196
        import ckan.model as model
197
        revisions_q = meta.Session.query(model.Revision)
198
        revisions_q = revisions_q.filter_by(author=self.name)
199
        return revisions_q.count()
197
        # Get count efficiently without spawning the SQLAlchemy subquery
198
        # wrapper. Reset the VDM-forced order_by on timestamp.
199
        return meta.Session.execute(
200
            meta.Session.query(
201
                model.Revision
202
            ).filter_by(
203
                author=self.name
204
            ).statement.with_only_columns(
205
                [func.count()]
206
            ).order_by(
207
                None
208
            )
209
        ).scalar()
200 210

  
201 211
    def number_created_packages(self, include_private_and_draft=False):
202 212
        # have to import here to avoid circular imports
203 213
        import ckan.model as model
204
        q = meta.Session.query(model.Package)\
205
            .filter_by(creator_user_id=self.id)
214
        # Get count efficiently without spawning the SQLAlchemy subquery
215
        # wrapper. Reset the VDM-forced order_by on timestamp.
216
        q = meta.Session.query(
217
            model.Package
218
        ).filter_by(
219
            creator_user_id=self.id
220
        )
221
    
206 222
        if include_private_and_draft:
207 223
            q = q.filter(model.Package.state != 'deleted')
208 224
        else:
209
            q = q.filter_by(state='active')\
210
                 .filter_by(private=False)
211
        return q.count()
225
            q = q.filter_by(state='active', private=False)
226
    
227
        return meta.Session.execute(
228
            q.statement.with_only_columns(
229
                [func.count()]
230
            ).order_by(
231
                None
232
            )
233
        ).scalar()
212 234

  
213 235
    def activate(self):
214 236
        ''' Activate the user '''
src/ckan/ckan/templates/package/snippets/resource_item.html 2019-01-09 16:38:40.211725133 +0100
1
{% set can_edit = h.check_access('package_update', {'id':pkg.id }) %}
2 1
{% set url_action = 'resource_edit' if url_is_edit and can_edit else 'resource_read' %}
3 2
{% set url = h.url_for(controller='package', action=url_action, id=pkg.name, resource_id=res.id) %}
4 3

  
(1-1/2)
Add picture from clipboard (Maximum size: 8.91 MB)