ckanext-userdatasets 2.2.0__tar.gz → 2.2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/PKG-INFO +1 -1
  2. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/ckanext/userdatasets/logic/auth/auth.py +10 -13
  3. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/ckanext/userdatasets/logic/auth/create.py +3 -3
  4. ckanext_userdatasets-2.2.2/ckanext/userdatasets/logic/utils.py +21 -0
  5. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/ckanext/userdatasets/logic/validators.py +3 -3
  6. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/ckanext_userdatasets.egg-info/PKG-INFO +1 -1
  7. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/ckanext_userdatasets.egg-info/SOURCES.txt +1 -0
  8. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/pyproject.toml +2 -2
  9. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/tests/test_auth_actions_unit.py +42 -6
  10. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/LICENSE +0 -0
  11. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/README.md +0 -0
  12. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/ckanext/__init__.py +0 -0
  13. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/ckanext/userdatasets/__init__.py +0 -0
  14. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/ckanext/userdatasets/logic/__init__.py +0 -0
  15. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/ckanext/userdatasets/logic/action/__init__.py +0 -0
  16. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/ckanext/userdatasets/logic/action/create.py +0 -0
  17. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/ckanext/userdatasets/logic/action/get.py +0 -0
  18. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/ckanext/userdatasets/logic/action/update.py +0 -0
  19. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/ckanext/userdatasets/logic/auth/__init__.py +0 -0
  20. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/ckanext/userdatasets/logic/auth/delete.py +0 -0
  21. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/ckanext/userdatasets/logic/auth/get.py +0 -0
  22. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/ckanext/userdatasets/logic/auth/update.py +0 -0
  23. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/ckanext/userdatasets/plugin.py +0 -0
  24. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/ckanext_userdatasets.egg-info/dependency_links.txt +0 -0
  25. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/ckanext_userdatasets.egg-info/entry_points.txt +0 -0
  26. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/ckanext_userdatasets.egg-info/not-zip-safe +0 -0
  27. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/ckanext_userdatasets.egg-info/requires.txt +0 -0
  28. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/ckanext_userdatasets.egg-info/top_level.txt +0 -0
  29. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/docs/_scripts/gen_api_pages.py +0 -0
  30. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/setup.cfg +0 -0
  31. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/setup.py +0 -0
  32. {ckanext_userdatasets-2.2.0 → ckanext_userdatasets-2.2.2}/tests/test_functional.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ckanext-userdatasets
3
- Version: 2.2.0
3
+ Version: 2.2.2
4
4
  Summary: A CKAN extension that allows organisation members to create datasets, and edit or delete the datasets they have created.
5
5
  Author-email: Natural History Museum <data@nhm.ac.uk>
6
6
  License: GPL-3.0-or-later
@@ -4,36 +4,33 @@
4
4
  # This file is part of ckanext-userdatasets
5
5
  # Created by the Natural History Museum in London, UK
6
6
 
7
- from ckan.authz import users_role_for_group_or_org
8
7
  from ckan.plugins import toolkit
9
8
 
9
+ from ckanext.userdatasets.logic.utils import org_role_is_valid
10
+
10
11
 
11
12
  def user_is_member_of_package_org(user, package):
12
13
  """
13
- Return True if the package is in an organization and the user has the member role in
14
- that organization.
14
+ Return True if the package is in an organisation and the user has a valid role in
15
+ that organisation.
15
16
 
16
17
  :param user: A user object
17
18
  :param package: A package object
18
- :returns: True if the user has the 'member' role in the organization that owns the
19
+ :returns: True if the user has a valid role in the organisation that owns the
19
20
  package, False otherwise
20
21
  """
21
- if package.owner_org:
22
- role_in_org = users_role_for_group_or_org(package.owner_org, user.name)
23
- if role_in_org == 'member':
24
- return True
25
- return False
22
+ return bool(package.owner_org) and org_role_is_valid(package.owner_org, user.name)
26
23
 
27
24
 
28
25
  def user_owns_package_as_member(user, package):
29
26
  """
30
- Checks that the given user created the package, and has the 'member' role in the
31
- organization that owns the package.
27
+ Checks that the given user created the package, and has a valid role in the
28
+ organisation that owns the package.
32
29
 
33
30
  :param user: A user object
34
31
  :param package: A package object
35
- :returns: True if the user created the package and has the 'member' role in the
36
- organization to which package belongs. False otherwise.
32
+ :returns: True if the user created the package and has a valid role in the
33
+ organisation to which package belongs. False otherwise.
37
34
  """
38
35
  if user_is_member_of_package_org(user, package):
39
36
  return package.creator_user_id and user.id == package.creator_user_id
@@ -4,7 +4,7 @@
4
4
  # This file is part of ckanext-userdatasets
5
5
  # Created by the Natural History Museum in London, UK
6
6
 
7
- from ckan.authz import has_user_permission_for_some_org, users_role_for_group_or_org
7
+ from ckan.authz import has_user_permission_for_some_org
8
8
  from ckan.logic.auth import get_package_object, get_resource_object
9
9
  from ckan.plugins import toolkit
10
10
  from ckantools.decorators import auth
@@ -12,6 +12,7 @@ from ckantools.decorators import auth
12
12
  from ckanext.userdatasets.logic.auth.auth import (
13
13
  user_owns_package_as_member,
14
14
  )
15
+ from ckanext.userdatasets.logic.utils import org_role_is_valid
15
16
 
16
17
 
17
18
  @auth()
@@ -19,8 +20,7 @@ from ckanext.userdatasets.logic.auth.auth import (
19
20
  def package_create(next_auth, context, data_dict):
20
21
  user = context['auth_user_obj']
21
22
  if data_dict and 'owner_org' in data_dict:
22
- role = users_role_for_group_or_org(data_dict['owner_org'], user.name)
23
- if role == 'member':
23
+ if org_role_is_valid(data_dict['owner_org'], user.name):
24
24
  return {'success': True}
25
25
  else:
26
26
  # If there is no organisation, then this should return success if the user can
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env python3
2
+ # encoding: utf-8
3
+ #
4
+ # This file is part of ckanext-userdatasets
5
+ # Created by the Natural History Museum in London, UK
6
+
7
+ from ckan.authz import users_role_for_group_or_org
8
+
9
+
10
+ def org_role_is_valid(group_or_org_id, username):
11
+ """
12
+ Determine whether the given user has a valid role in the specified group or
13
+ organisation.
14
+
15
+ :param group_or_org_id: ID of a group or organisation
16
+ :param username: username for the user to check
17
+ :returns: True if the role is valid (member, editor, or admin), False otherwise
18
+ :rtype: bool
19
+ """
20
+ role = users_role_for_group_or_org(group_or_org_id, username)
21
+ return role in ['member', 'editor', 'admin']
@@ -4,10 +4,11 @@
4
4
  # This file is part of ckanext-userdatasets
5
5
  # Created by the Natural History Museum in London, UK
6
6
 
7
- from ckan.authz import users_role_for_group_or_org
8
7
  from ckan.logic.validators import owner_org_validator as default_owner_org_validator
9
8
  from ckan.plugins import toolkit
10
9
 
10
+ from ckanext.userdatasets.logic.utils import org_role_is_valid
11
+
11
12
 
12
13
  def owner_org_validator(key, data, errors, context):
13
14
  owner_org = data.get(key)
@@ -17,8 +18,7 @@ def owner_org_validator(key, data, errors, context):
17
18
  else:
18
19
  username = context['user']
19
20
 
20
- role = users_role_for_group_or_org(owner_org, username)
21
- if role == 'member':
21
+ if org_role_is_valid(owner_org, username):
22
22
  return
23
23
 
24
24
  default_owner_org_validator(key, data, errors, context)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ckanext-userdatasets
3
- Version: 2.2.0
3
+ Version: 2.2.2
4
4
  Summary: A CKAN extension that allows organisation members to create datasets, and edit or delete the datasets they have created.
5
5
  Author-email: Natural History Museum <data@nhm.ac.uk>
6
6
  License: GPL-3.0-or-later
@@ -6,6 +6,7 @@ ckanext/__init__.py
6
6
  ckanext/userdatasets/__init__.py
7
7
  ckanext/userdatasets/plugin.py
8
8
  ckanext/userdatasets/logic/__init__.py
9
+ ckanext/userdatasets/logic/utils.py
9
10
  ckanext/userdatasets/logic/validators.py
10
11
  ckanext/userdatasets/logic/action/__init__.py
11
12
  ckanext/userdatasets/logic/action/create.py
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ckanext-userdatasets"
3
- version = "2.2.0"
3
+ version = "2.2.2"
4
4
  description = "A CKAN extension that allows organisation members to create datasets, and edit or delete the datasets they have created."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.6"
@@ -55,7 +55,7 @@ exclude = ["tests", "docs"]
55
55
 
56
56
  [tool.commitizen]
57
57
  name = "cz_nhm"
58
- version = "2.2.0"
58
+ version = "2.2.2"
59
59
  tag_format = "v$version"
60
60
  update_changelog_on_bump = true
61
61
  changelog_incremental = true
@@ -35,7 +35,7 @@ class TestAuthActionsUnit(object):
35
35
  Perform unit tests on the auth functions in ckanext.userdatasets.logic.auth.
36
36
  """
37
37
 
38
- @patch('ckanext.userdatasets.logic.auth.auth.users_role_for_group_or_org')
38
+ @patch('ckanext.userdatasets.logic.utils.users_role_for_group_or_org')
39
39
  def test_user_is_member_of_package_org(self, mock_users_role):
40
40
  """
41
41
  Test ckanext.userdatasets.logic.auth.auth.user_is_member_of_package_org.
@@ -54,6 +54,18 @@ class TestAuthActionsUnit(object):
54
54
  'package': MagicMock(owner_org='carrot'),
55
55
  'user': MagicMock(name='turtle'),
56
56
  'role': 'editor',
57
+ 'result': True,
58
+ },
59
+ {
60
+ 'package': MagicMock(owner_org='carrot'),
61
+ 'user': MagicMock(name='turtle'),
62
+ 'role': 'admin',
63
+ 'result': True,
64
+ },
65
+ {
66
+ 'package': MagicMock(owner_org='carrot'),
67
+ 'user': MagicMock(name='turtle'),
68
+ 'role': None,
57
69
  'result': False,
58
70
  },
59
71
  {
@@ -62,12 +74,24 @@ class TestAuthActionsUnit(object):
62
74
  'role': 'member',
63
75
  'result': False,
64
76
  },
77
+ {
78
+ 'package': MagicMock(owner_org=''),
79
+ 'user': MagicMock(name='turtle'),
80
+ 'role': 'member',
81
+ 'result': False,
82
+ },
83
+ {
84
+ 'package': MagicMock(owner_org=False),
85
+ 'user': MagicMock(name='turtle'),
86
+ 'role': 'member',
87
+ 'result': False,
88
+ },
65
89
  ]
66
90
  for t in tests:
67
91
  mock_users_role.return_value = t['role']
68
92
  assert user_is_member_of_package_org(t['user'], t['package']) == t['result']
69
93
 
70
- @patch('ckanext.userdatasets.logic.auth.auth.users_role_for_group_or_org')
94
+ @patch('ckanext.userdatasets.logic.utils.users_role_for_group_or_org')
71
95
  def test_user_owns_package_as_member(self, mock_users_role):
72
96
  """
73
97
  Test ckanext.userdatasets.logic.auth.auth.user_owns_package_as_member.
@@ -82,6 +106,12 @@ class TestAuthActionsUnit(object):
82
106
  'role': 'member',
83
107
  'result': True,
84
108
  },
109
+ {
110
+ 'user': MagicMock(id=444, name='turtle'),
111
+ 'package': MagicMock(creator_user_id=444, owner_org='carrot'),
112
+ 'role': 'editor',
113
+ 'result': True,
114
+ },
85
115
  {
86
116
  'user': MagicMock(id=445, name='turtle'),
87
117
  'package': MagicMock(creator_user_id=444, owner_org='carrot'),
@@ -90,14 +120,14 @@ class TestAuthActionsUnit(object):
90
120
  },
91
121
  {
92
122
  'user': MagicMock(id=444, name='turtle'),
93
- 'package': MagicMock(creator_user_id=444, owner_org=False),
123
+ 'package': MagicMock(creator_user_id=444, owner_org=None),
94
124
  'role': 'member',
95
125
  'result': False,
96
126
  },
97
127
  {
98
128
  'user': MagicMock(id=444, name='turtle'),
99
129
  'package': MagicMock(creator_user_id=444, owner_org='carrot'),
100
- 'role': 'editor',
130
+ 'role': None,
101
131
  'result': False,
102
132
  },
103
133
  ]
@@ -105,7 +135,7 @@ class TestAuthActionsUnit(object):
105
135
  mock_users_role.return_value = t['role']
106
136
  assert user_owns_package_as_member(t['user'], t['package']) == t['result']
107
137
 
108
- @patch('ckanext.userdatasets.logic.auth.create.users_role_for_group_or_org')
138
+ @patch('ckanext.userdatasets.logic.utils.users_role_for_group_or_org')
109
139
  @patch('ckanext.userdatasets.logic.auth.create.has_user_permission_for_some_org')
110
140
  def test_package_create(self, mock_has_perm, mock_users_role):
111
141
  """
@@ -127,6 +157,13 @@ class TestAuthActionsUnit(object):
127
157
  'data_dict': {'owner_org': 'carrot'},
128
158
  'role': 'editor',
129
159
  'has_perm': True,
160
+ 'result': {'success': True},
161
+ },
162
+ {
163
+ 'context': {'auth_user_obj': MagicMock(name='turtle')},
164
+ 'data_dict': {'owner_org': 'carrot'},
165
+ 'role': None,
166
+ 'has_perm': True,
130
167
  'result': 'fallback',
131
168
  },
132
169
  {
@@ -195,7 +232,6 @@ class TestAuthActionsUnit(object):
195
232
 
196
233
  Ensure all routes are tested.
197
234
  """
198
-
199
235
  tests = [
200
236
  {'user_owns': True, 'user_is_member': True, 'result': {'success': True}},
201
237
  {'user_owns': False, 'user_is_member': True, 'result': 'fallback'},