Skip to content

Commit 686f8dd

Browse files
committed
return back resource class container_* attributes
1 parent 285d616 commit 686f8dd

5 files changed

Lines changed: 64 additions & 32 deletions

File tree

CHANGELOG.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ Changelog
3636
over the uploading process if needed
3737
- Removed ``resource_paths`` argument from Redmine object since ``ResourceManager`` now uses a special resource
3838
registry, to which, all resources that inherit from any Python-Redmine resource are being automatically added
39+
- Removed ``container_many`` in favor of ``container_filter``, ``container_create`` and ``container_update``
40+
attributes on ``Resource`` object to allow more fine-grained resource setup
3941

4042
**Bugfixes**:
4143

redminelib/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,10 +164,12 @@ def search(self, query, **options):
164164

165165
for name, details in resources.registry.items():
166166
if details['class'].search_hints is not None:
167+
container = details['class'].container_all or details['class'].container_filter
168+
167169
for hint in details['class'].search_hints:
168-
container_map[hint] = details['class'].container_many
170+
container_map[hint] = container
169171

170-
manager_map[details['class'].container_many] = getattr(self, name)
172+
manager_map[container] = getattr(self, name)
171173

172174
raw_resources, _ = self.engine.bulk_request('get', '{0}/search.json'.format(self.url), 'results', **options)
173175

redminelib/managers.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,12 @@ def all(self, **params):
117117
118118
:param dict params: (optional). Parameters used for resources retrieval.
119119
"""
120-
if self.resource_class.query_all is None or self.resource_class.container_many is None:
120+
if self.resource_class.query_all is None or self.resource_class.container_all is None:
121121
raise exceptions.ResourceBadMethodError
122122

123123
self.url = self.redmine.url + self.resource_class.query_all
124124
self.params = self.resource_class.bulk_decode(params, self)
125-
self.container = self.resource_class.container_many
125+
self.container = self.resource_class.container_all
126126
return resultsets.ResourceSet(self)
127127

128128
def filter(self, **filters):
@@ -131,15 +131,15 @@ def filter(self, **filters):
131131
132132
:param dict filters: (optional). Filters used for resources retrieval.
133133
"""
134-
if self.resource_class.query_filter is None or self.resource_class.container_many is None:
134+
if self.resource_class.query_filter is None or self.resource_class.container_filter is None:
135135
raise exceptions.ResourceBadMethodError
136136

137137
if not filters:
138138
raise exceptions.ResourceNoFiltersProvidedError
139139

140140
try:
141141
self.url = self.redmine.url + self.resource_class.query_filter.format(**filters)
142-
self.container = self.resource_class.container_many.format(**filters)
142+
self.container = self.resource_class.container_filter.format(**filters)
143143
except KeyError:
144144
raise exceptions.ResourceFilterError
145145

@@ -152,7 +152,7 @@ def create(self, **fields):
152152
153153
:param dict fields: (optional). Fields used for resource creation.
154154
"""
155-
if self.resource_class.query_create is None or self.resource_class.container_one is None:
155+
if self.resource_class.query_create is None or self.resource_class.container_create is None:
156156
raise exceptions.ResourceBadMethodError
157157

158158
if not fields:
@@ -165,8 +165,8 @@ def create(self, **fields):
165165
except KeyError as exception:
166166
raise exceptions.ValidationError('{0} field is required'.format(exception))
167167

168-
self.container = self.resource_class.container_one
169-
data = {self.resource_class.container_one: self.resource_class.bulk_decode(formatter.unused_kwargs, self)}
168+
self.container = self.resource_class.container_create
169+
data = {self.resource_class.container_create: self.resource_class.bulk_decode(formatter.unused_kwargs, self)}
170170
response = self.redmine.engine.request(self.resource_class.http_method_create, url, data=data)
171171

172172
try:
@@ -186,7 +186,7 @@ def update(self, resource_id, **fields):
186186
:type resource_id: int or string
187187
:param dict fields: (optional). Fields which will be updated for the resource.
188188
"""
189-
if self.resource_class.query_update is None or self.resource_class.container_one is None:
189+
if self.resource_class.query_update is None or self.resource_class.container_update is None:
190190
raise exceptions.ResourceBadMethodError
191191

192192
if not fields:
@@ -206,7 +206,7 @@ def update(self, resource_id, **fields):
206206
raise exceptions.ValidationError('{0} argument is required'.format(exception))
207207

208208
url = self.redmine.url + query_update
209-
data = {self.resource_class.container_one: self.resource_class.bulk_decode(formatter.unused_kwargs, self)}
209+
data = {self.resource_class.container_update: self.resource_class.bulk_decode(formatter.unused_kwargs, self)}
210210
return self.redmine.engine.request(self.resource_class.http_method_update, url, data=data)
211211

212212
def delete(self, resource_id, **params):
@@ -235,11 +235,12 @@ def search(self, query, **options):
235235
:param string query: (required). What to search.
236236
:param dict options: (optional). Dictionary of search options.
237237
"""
238-
if self.resource_class.search_hints is None or self.resource_class.container_many is None:
238+
if self.resource_class.search_hints is None:
239239
raise exceptions.ResourceBadMethodError
240240

241-
results = self.redmine.search(query, **dict(resources=[self.resource_class.container_many], **options))
242-
return results.get(self.resource_class.container_many) if results is not None else results
241+
container = self.resource_class.container_all or self.resource_class.container_filter
242+
results = self.redmine.search(query, **dict(resources=[container], **options))
243+
return results.get(container) if results is not None else results
243244

244245
def __repr__(self):
245246
"""

redminelib/resources/base.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,11 @@ class BaseResource(utilities.with_metaclass(Registrar)):
8383
internal_id_key = 'id'
8484
redmine_version = None
8585
requirements = []
86-
container_many = None
86+
container_all = None
8787
container_one = None
88+
container_filter = None
89+
container_create = None
90+
container_update = None
8891
query_all_export = None
8992
query_one_export = None
9093
query_all = None

redminelib/resources/standard.py

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@
1212

1313
class Project(BaseResource):
1414
redmine_version = '1.0'
15-
container_many = 'projects'
15+
container_all = 'projects'
1616
container_one = 'project'
17+
container_create = 'project'
18+
container_update = 'project'
1719
query_all_export = '/projects.{format}'
1820
query_all = '/projects.json'
1921
query_one = '/projects/{0}.json'
@@ -55,8 +57,11 @@ def encode(cls, attr, value, manager):
5557

5658
class Issue(BaseResource):
5759
redmine_version = '1.0'
58-
container_many = 'issues'
60+
container_all = 'issues'
5961
container_one = 'issue'
62+
container_filter = 'issues'
63+
container_create = 'issue'
64+
container_update = 'issue'
6065
query_all_export = '/issues.{format}'
6166
query_one_export = '/issues/{0}.{format}'
6267
query_all = '/issues.json?status_id=*'
@@ -162,8 +167,11 @@ def decode(cls, attr, value, manager):
162167

163168
class TimeEntry(BaseResource):
164169
redmine_version = '1.1'
165-
container_many = 'time_entries'
170+
container_all = 'time_entries'
166171
container_one = 'time_entry'
172+
container_filter = 'time_entries'
173+
container_create = 'time_entry'
174+
container_update = 'time_entry'
167175
query_all_export = '/time_entries.{format}'
168176
query_all = '/time_entries.json'
169177
query_one = '/time_entries/{0}.json'
@@ -189,7 +197,7 @@ def decode(cls, attr, value, manager):
189197

190198
class Enumeration(BaseResource):
191199
redmine_version = '2.2'
192-
container_many = '{resource}'
200+
container_filter = '{resource}'
193201
query_filter = '/enumerations/{resource}.json'
194202

195203
_resource_set_map = {'custom_fields': 'CustomField'}
@@ -202,6 +210,7 @@ def url(self):
202210
class Attachment(BaseResource):
203211
redmine_version = '1.3'
204212
container_one = 'attachment'
213+
container_update = 'attachment'
205214
query_one = '/attachments/{0}.json'
206215
query_update = '/attachments/{0}.json'
207216
query_delete = '/attachments/{0}.json'
@@ -225,8 +234,10 @@ class IssueJournal(BaseResource):
225234
class WikiPage(BaseResource):
226235
internal_id_key = 'title'
227236
redmine_version = '2.2'
228-
container_many = 'wiki_pages'
237+
container_filter = 'wiki_pages'
229238
container_one = 'wiki_page'
239+
container_create = 'wiki_page'
240+
container_update = 'wiki_page'
230241
query_one_export = '/projects/{project_id}/wiki/{0}.{format}'
231242
query_filter = '/projects/{project_id}/wiki/index.json'
232243
query_one = '/projects/{project_id}/wiki/{0}.json'
@@ -288,8 +299,10 @@ def __int__(self):
288299

289300
class ProjectMembership(BaseResource):
290301
redmine_version = '1.4'
291-
container_many = 'memberships'
302+
container_filter = 'memberships'
292303
container_one = 'membership'
304+
container_update = 'membership'
305+
container_create = 'membership'
293306
query_filter = '/projects/{project_id}/memberships.json'
294307
query_one = '/memberships/{0}.json'
295308
query_create = '/projects/{project_id}/memberships.json'
@@ -307,8 +320,10 @@ class ProjectMembership(BaseResource):
307320

308321
class IssueCategory(BaseResource):
309322
redmine_version = '1.3'
310-
container_many = 'issue_categories'
323+
container_filter = 'issue_categories'
311324
container_one = 'issue_category'
325+
container_update = 'issue_category'
326+
container_create = 'issue_category'
312327
query_filter = '/projects/{project_id}/issue_categories.json'
313328
query_one = '/issue_categories/{0}.json'
314329
query_create = '/projects/{project_id}/issue_categories.json'
@@ -320,8 +335,9 @@ class IssueCategory(BaseResource):
320335

321336
class IssueRelation(BaseResource):
322337
redmine_version = '1.3'
323-
container_many = 'relations'
338+
container_filter = 'relations'
324339
container_one = 'relation'
340+
container_create = 'relation'
325341
query_filter = '/issues/{issue_id}/relations.json'
326342
query_one = '/relations/{0}.json'
327343
query_create = '/issues/{issue_id}/relations.json'
@@ -333,8 +349,10 @@ class IssueRelation(BaseResource):
333349

334350
class Version(BaseResource):
335351
redmine_version = '1.3'
336-
container_many = 'versions'
352+
container_filter = 'versions'
337353
container_one = 'version'
354+
container_create = 'version'
355+
container_update = 'version'
338356
query_filter = '/projects/{project_id}/versions.json'
339357
query_one = '/versions/{0}.json'
340358
query_create = '/projects/{project_id}/versions.json'
@@ -349,8 +367,11 @@ class Version(BaseResource):
349367

350368
class User(BaseResource):
351369
redmine_version = '1.1'
352-
container_many = 'users'
370+
container_all = 'users'
353371
container_one = 'user'
372+
container_filter = 'users'
373+
container_create = 'user'
374+
container_update = 'user'
354375
query_all = '/users.json'
355376
query_one = '/users/{0}.json'
356377
query_filter = '/users.json'
@@ -385,8 +406,10 @@ def __getattr__(self, attr):
385406

386407
class Group(BaseResource):
387408
redmine_version = '2.1'
388-
container_many = 'groups'
409+
container_all = 'groups'
389410
container_one = 'group'
411+
container_create = 'group'
412+
container_update = 'group'
390413
query_all = '/groups.json'
391414
query_one = '/groups/{0}.json'
392415
query_create = '/groups.json'
@@ -432,15 +455,16 @@ def __getattr__(self, attr):
432455

433456
class Role(BaseResource):
434457
redmine_version = '1.4'
435-
container_many = 'roles'
458+
container_all = 'roles'
436459
container_one = 'role'
437460
query_all = '/roles.json'
438461
query_one = '/roles/{0}.json'
439462

440463

441464
class News(BaseResource):
442465
redmine_version = '1.1'
443-
container_many = 'news'
466+
container_all = 'news'
467+
container_filter = 'news'
444468
query_all_export = '/news.{format}'
445469
query_all = '/news.json'
446470
query_filter = '/news.json'
@@ -456,7 +480,7 @@ def url(self):
456480

457481
class IssueStatus(BaseResource):
458482
redmine_version = '1.3'
459-
container_many = 'issue_statuses'
483+
container_all = 'issue_statuses'
460484
query_all = '/issue_statuses.json'
461485

462486
_relations = ['issues']
@@ -470,7 +494,7 @@ def url(self):
470494

471495
class Tracker(BaseResource):
472496
redmine_version = '1.3'
473-
container_many = 'trackers'
497+
container_all = 'trackers'
474498
query_all = '/trackers.json'
475499

476500
_relations = ['issues']
@@ -483,7 +507,7 @@ def url(self):
483507

484508
class Query(BaseResource):
485509
redmine_version = '1.3'
486-
container_many = 'queries'
510+
container_all = 'queries'
487511
query_all = '/queries.json'
488512

489513
@property
@@ -494,7 +518,7 @@ def url(self):
494518

495519
class CustomField(BaseResource):
496520
redmine_version = '2.4'
497-
container_many = 'custom_fields'
521+
container_all = 'custom_fields'
498522
query_all = '/custom_fields.json'
499523

500524
_resource_set_map = {'trackers': 'Tracker', 'roles': 'Role'}

0 commit comments

Comments
 (0)