Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 8eec3e2

Browse files
authored
Merge pull request #5699 from ckan/5698-fix-missing-activities
[#5698] Filter activities from user at the database level
2 parents f834b2d + e740894 commit 8eec3e2

5 files changed

Lines changed: 93 additions & 62 deletions

File tree

changes/5699.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix missing activities from UI when internal processes are run by ignored users

ckan/logic/action/get.py

Lines changed: 16 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -53,23 +53,6 @@
5353
_text = sqlalchemy.text
5454

5555

56-
def _filter_activity_by_user(activity_list, users=[]):
57-
'''
58-
Return the given ``activity_list`` but with activities from the specified
59-
users removed. The users parameters should be a list of ids.
60-
61-
A *new* filtered list is returned, the given ``activity_list`` itself is
62-
not modified.
63-
'''
64-
if not len(users):
65-
return activity_list
66-
new_list = []
67-
for activity in activity_list:
68-
if activity.user_id not in users:
69-
new_list.append(activity)
70-
return new_list
71-
72-
7356
def _activity_stream_get_filtered_users():
7457
'''
7558
Get the list of users from the :ref:`ckan.hide_activity_from_users` config
@@ -2499,10 +2482,8 @@ def user_activity_list(context, data_dict):
24992482
offset = data_dict.get('offset', 0)
25002483
limit = data_dict['limit'] # defaulted, limited & made an int by schema
25012484

2502-
_activity_objects = model.activity.user_activity_list(
2485+
activity_objects = model.activity.user_activity_list(
25032486
user.id, limit=limit, offset=offset)
2504-
activity_objects = _filter_activity_by_user(
2505-
_activity_objects, _activity_stream_get_filtered_users())
25062487

25072488
return model_dictize.activity_list_dictize(
25082489
activity_objects, context,
@@ -2553,13 +2534,10 @@ def package_activity_list(context, data_dict):
25532534
offset = int(data_dict.get('offset', 0))
25542535
limit = data_dict['limit'] # defaulted, limited & made an int by schema
25552536

2556-
_activity_objects = model.activity.package_activity_list(
2557-
package.id, limit=limit, offset=offset)
2558-
if not include_hidden_activity:
2559-
activity_objects = _filter_activity_by_user(
2560-
_activity_objects, _activity_stream_get_filtered_users())
2561-
else:
2562-
activity_objects = _activity_objects
2537+
activity_objects = model.activity.package_activity_list(
2538+
package.id, limit=limit, offset=offset,
2539+
include_hidden_activity=include_hidden_activity,
2540+
)
25632541

25642542
return model_dictize.activity_list_dictize(
25652543
activity_objects, context, include_data=data_dict['include_data'])
@@ -2608,13 +2586,10 @@ def group_activity_list(context, data_dict):
26082586
group_show = logic.get_action('group_show')
26092587
group_id = group_show(context, {'id': group_id})['id']
26102588

2611-
_activity_objects = model.activity.group_activity_list(
2612-
group_id, limit=limit, offset=offset)
2613-
if not include_hidden_activity:
2614-
activity_objects = _filter_activity_by_user(
2615-
_activity_objects, _activity_stream_get_filtered_users())
2616-
else:
2617-
activity_objects = _activity_objects
2589+
activity_objects = model.activity.group_activity_list(
2590+
group_id, limit=limit, offset=offset,
2591+
include_hidden_activity=include_hidden_activity,
2592+
)
26182593

26192594
return model_dictize.activity_list_dictize(
26202595
activity_objects, context,
@@ -2662,13 +2637,10 @@ def organization_activity_list(context, data_dict):
26622637
org_show = logic.get_action('organization_show')
26632638
org_id = org_show(context, {'id': org_id})['id']
26642639

2665-
_activity_objects = model.activity.organization_activity_list(
2666-
org_id, limit=limit, offset=offset)
2667-
if not include_hidden_activity:
2668-
activity_objects = _filter_activity_by_user(
2669-
_activity_objects, _activity_stream_get_filtered_users())
2670-
else:
2671-
activity_objects = _activity_objects
2640+
activity_objects = model.activity.organization_activity_list(
2641+
org_id, limit=limit, offset=offset,
2642+
include_hidden_activity=include_hidden_activity,
2643+
)
26722644

26732645
return model_dictize.activity_list_dictize(
26742646
activity_objects, context,
@@ -2698,12 +2670,9 @@ def recently_changed_packages_activity_list(context, data_dict):
26982670
data_dict['include_data'] = False
26992671
limit = data_dict['limit'] # defaulted, limited & made an int by schema
27002672

2701-
_activity_objects = \
2673+
activity_objects = \
27022674
model.activity.recently_changed_packages_activity_list(
27032675
limit=limit, offset=offset)
2704-
activity_objects = _filter_activity_by_user(
2705-
_activity_objects,
2706-
_activity_stream_get_filtered_users())
27072676

27082677
return model_dictize.activity_list_dictize(
27092678
activity_objects, context,
@@ -3216,13 +3185,11 @@ def dashboard_activity_list(context, data_dict):
32163185

32173186
# FIXME: Filter out activities whose subject or object the user is not
32183187
# authorized to read.
3219-
_activity_tuple_objects = model.activity.dashboard_activity_list(
3188+
activity_objects = model.activity.dashboard_activity_list(
32203189
user_id, limit=limit, offset=offset)
32213190

3222-
activity_tuple_list = _filter_activity_by_user(
3223-
_activity_tuple_objects, _activity_stream_get_filtered_users())
32243191
activity_dicts = model_dictize.activity_list_dictize(
3225-
activity_tuple_list, context)
3192+
activity_objects, context)
32263193

32273194
# Mark the new (not yet seen by user) activities.
32283195
strptime = datetime.datetime.strptime

ckan/model/activity.py

Lines changed: 60 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
text,
1616
)
1717

18+
from ckan.common import config
1819
import ckan.model
1920
from ckan.model import meta
2021
from ckan.model import domain_object, types as _types
@@ -164,6 +165,9 @@ def user_activity_list(user_id, limit, offset):
164165
165166
'''
166167
q = _user_activity_query(user_id, limit + offset)
168+
169+
q = _filter_activitites_from_users(q)
170+
167171
return _activities_at_offset(q, limit, offset)
168172

169173

@@ -177,7 +181,8 @@ def _package_activity_query(package_id):
177181
return q
178182

179183

180-
def package_activity_list(package_id, limit, offset):
184+
def package_activity_list(
185+
package_id, limit, offset, include_hidden_activity=False):
181186
'''Return the given dataset (package)'s public activity stream.
182187
183188
Returns all activities about the given dataset, i.e. where the given
@@ -189,10 +194,14 @@ def package_activity_list(package_id, limit, offset):
189194
190195
'''
191196
q = _package_activity_query(package_id)
197+
198+
if not include_hidden_activity:
199+
q = _filter_activitites_from_users(q)
200+
192201
return _activities_at_offset(q, limit, offset)
193202

194203

195-
def _group_activity_query(group_id):
204+
def _group_activity_query(group_id, include_hidden_activity=False):
196205
'''Return an SQLAlchemy query for all activities about group_id.
197206
198207
Returns a query for all activities whose object is either the group itself
@@ -242,10 +251,13 @@ def _group_activity_query(group_id):
242251
)
243252
)
244253

254+
if not include_hidden_activity:
255+
q = _filter_activitites_from_users(q)
256+
245257
return q
246258

247259

248-
def _organization_activity_query(org_id):
260+
def _organization_activity_query(org_id, include_hidden_activity=False):
249261
'''Return an SQLAlchemy query for all activities about org_id.
250262
251263
Returns a query for all activities whose object is either the org itself
@@ -278,11 +290,14 @@ def _organization_activity_query(org_id):
278290
model.Activity.object_id == org_id
279291
)
280292
)
293+
if not include_hidden_activity:
294+
q = _filter_activitites_from_users(q)
281295

282296
return q
283297

284298

285-
def group_activity_list(group_id, limit, offset):
299+
def group_activity_list(group_id, limit, offset, include_hidden_activity=False):
300+
286301
'''Return the given group's public activity stream.
287302
288303
Returns activities where the given group or one of its datasets is the
@@ -293,11 +308,12 @@ def group_activity_list(group_id, limit, offset):
293308
etc.
294309
295310
'''
296-
q = _group_activity_query(group_id)
311+
q = _group_activity_query(group_id, include_hidden_activity)
297312
return _activities_at_offset(q, limit, offset)
298313

299314

300-
def organization_activity_list(group_id, limit, offset):
315+
def organization_activity_list(
316+
group_id, limit, offset, include_hidden_activity=False):
301317
'''Return the given org's public activity stream.
302318
303319
Returns activities where the given org or one of its datasets is the
@@ -308,7 +324,7 @@ def organization_activity_list(group_id, limit, offset):
308324
etc.
309325
310326
'''
311-
q = _organization_activity_query(group_id)
327+
q = _organization_activity_query(group_id, include_hidden_activity)
312328
return _activities_at_offset(q, limit, offset)
313329

314330

@@ -402,8 +418,12 @@ def dashboard_activity_list(user_id, limit, offset):
402418
403419
'''
404420
q = _dashboard_activity_query(user_id, limit + offset)
421+
422+
q = _filter_activitites_from_users(q)
423+
405424
return _activities_at_offset(q, limit, offset)
406425

426+
407427
def _changed_packages_activity_query():
408428
'''Return an SQLAlchemy query for all changed package activities.
409429
@@ -425,4 +445,37 @@ def recently_changed_packages_activity_list(limit, offset):
425445
426446
'''
427447
q = _changed_packages_activity_query()
448+
449+
q = _filter_activitites_from_users(q)
450+
428451
return _activities_at_offset(q, limit, offset)
452+
453+
454+
def _filter_activitites_from_users(q):
455+
'''
456+
Adds a filter to an existing query object ot avoid activities from users
457+
defined in :ref:`ckan.hide_activity_from_users` (defaults to the site user)
458+
'''
459+
users_to_avoid = _activity_stream_get_filtered_users()
460+
if users_to_avoid:
461+
q = q.filter(ckan.model.Activity.user_id.notin_(users_to_avoid))
462+
463+
return q
464+
465+
466+
def _activity_stream_get_filtered_users():
467+
'''
468+
Get the list of users from the :ref:`ckan.hide_activity_from_users` config
469+
option and return a list of their ids. If the config is not specified,
470+
returns the id of the site user.
471+
'''
472+
users = config.get('ckan.hide_activity_from_users')
473+
if users:
474+
users_list = users.split()
475+
else:
476+
from ckan.logic import get_action
477+
context = {'ignore_auth': True}
478+
site_user = get_action('get_site_user')(context)
479+
users_list = [site_user.get('name')]
480+
481+
return ckan.model.User.user_ids_for_name_or_id(users_list)

ckan/tests/controllers/test_package.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1864,7 +1864,8 @@ def test_redirect_when_given_id(self, app):
18641864
assert response.headers['location'] == expected_url
18651865

18661866
def test_redirect_also_with_activity_parameter(self, app):
1867-
dataset = factories.Dataset()
1867+
user = factories.User()
1868+
dataset = factories.Dataset(user=user)
18681869
activity = activity_model.package_activity_list(
18691870
dataset["id"], limit=1, offset=0
18701871
)[0]

ckan/tests/logic/action/test_get.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3164,9 +3164,11 @@ def _create_bulk_package_activities(self, count):
31643164
dataset = factories.Dataset()
31653165
from ckan import model
31663166

3167+
user = factories.User()
3168+
31673169
objs = [
31683170
model.Activity(
3169-
user_id=None,
3171+
user_id=user['id'],
31703172
object_id=dataset["id"],
31713173
activity_type=None,
31723174
data=None,
@@ -3396,9 +3398,10 @@ def test_delete_org_by_updating_state(self):
33963398
assert activities[0]["data"]["group"]["title"] == org["title"]
33973399

33983400
def _create_bulk_user_activities(self, count):
3399-
user = factories.User()
34003401
from ckan import model
34013402

3403+
user = factories.User()
3404+
34023405
objs = [
34033406
model.Activity(
34043407
user_id=user["id"],
@@ -3613,9 +3616,11 @@ def _create_bulk_group_activities(self, count):
36133616
group = factories.Group()
36143617
from ckan import model
36153618

3619+
user = factories.User()
3620+
36163621
objs = [
36173622
model.Activity(
3618-
user_id=None,
3623+
user_id=user['id'],
36193624
object_id=group["id"],
36203625
activity_type=None,
36213626
data=None,
@@ -3844,9 +3849,11 @@ def _create_bulk_org_activities(self, count):
38443849
org = factories.Organization()
38453850
from ckan import model
38463851

3852+
user = factories.User()
3853+
38473854
objs = [
38483855
model.Activity(
3849-
user_id=None,
3856+
user_id=user['id'],
38503857
object_id=org["id"],
38513858
activity_type=None,
38523859
data=None,
@@ -4013,9 +4020,11 @@ def test_delete_dataset(self):
40134020
def _create_bulk_package_activities(self, count):
40144021
from ckan import model
40154022

4023+
user = factories.User()
4024+
40164025
objs = [
40174026
model.Activity(
4018-
user_id=None,
4027+
user_id=user['id'],
40194028
object_id=None,
40204029
activity_type="new_package",
40214030
data=None,

0 commit comments

Comments
 (0)