Skip to content

Commit c7c9d67

Browse files
committed
project status attr fix and some optimisations
1 parent cb63ed8 commit c7c9d67

File tree

3 files changed

+19
-24
lines changed

3 files changed

+19
-24
lines changed

CHANGELOG.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
Changelog
22
---------
33

4+
0.6.2 (2014-03-09)
5+
++++++++++++++++++
6+
7+
- Fixed: Project resource ``status`` attribute was converted to IssueStatus resource by mistake
8+
49
0.6.1 (2014-02-27)
510
++++++++++++++++++
611

redmine/resources.py

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ class _Resource(object):
9999
_changes = {}
100100
_includes = ()
101101
_relations = ()
102+
_unconvertible = ()
102103
_readonly = ('id', 'created_on', 'updated_on', 'author', 'user', 'project', 'issue')
103104
__length_hint__ = None # fixes Python 2.6 list() call on resource object
104105

@@ -121,8 +122,12 @@ def __setitem__(self, item, value):
121122
def __getattr__(self, item):
122123
"""Returns the requested attribute and makes a conversion if needed"""
123124
if item in self.attributes:
125+
# If item shouldn't be converted let's return it as it is
126+
if item in self._unconvertible:
127+
return self.attributes[item]
128+
124129
# If item should be a Resource object, let's convert it
125-
if item in _RESOURCE_MAP:
130+
elif item in _RESOURCE_MAP:
126131
manager = ResourceManager(self.manager.redmine, _RESOURCE_MAP[item])
127132
return manager.to_resource(self.attributes[item])
128133

@@ -288,6 +293,7 @@ class Project(_Resource):
288293

289294
_includes = ('trackers', 'issue_categories')
290295
_relations = ('wiki_pages', 'memberships', 'issue_categories', 'versions', 'news', 'issues')
296+
_unconvertible = ('status',)
291297
_readonly = _Resource._readonly + ('identifier',)
292298

293299

@@ -546,14 +552,7 @@ class Version(_Resource):
546552
query_update = '/versions/{0}.json'
547553
query_delete = '/versions/{0}.json'
548554

549-
def __getattr__(self, item):
550-
# We have to return status attribute as it is, otherwise it
551-
# will be automatically converted to IssueStatus resource
552-
# by the parent _Resource object which is not what we want
553-
if item == 'status':
554-
return self.attributes[item]
555-
556-
return super(Version, self).__getattr__(item)
555+
_unconvertible = ('status',)
557556

558557

559558
class User(_Resource):
@@ -571,20 +570,9 @@ class User(_Resource):
571570
query_delete = '/users/{0}.json'
572571

573572
_includes = ('memberships', 'groups')
573+
_unconvertible = ('status',)
574574
_readonly = _Resource._readonly + ('api_key', 'last_login_on', 'custom_fields')
575575

576-
def __getattr__(self, item):
577-
# We have to return status attribute as it is, otherwise it
578-
# will be automatically converted to IssueStatus resource
579-
# by the parent _Resource object which is not what we want
580-
if item == 'status':
581-
try:
582-
return self.attributes[item]
583-
except KeyError:
584-
return self.action_if_attribute_absent()
585-
586-
return super(User, self).__getattr__(item)
587-
588576
def __str__(self):
589577
try:
590578
return super(User, self).__str__()

tests/test_resources.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,11 @@ def test_project_includes(self):
271271
self.response.json.return_value = response_includes
272272
self.assertIsInstance(project.trackers, ResourceSet)
273273

274+
def test_project_returns_status_without_conversion(self):
275+
self.response.json.return_value = {'project': {'name': 'Foo', 'id': 1, 'status': 1}}
276+
project = self.redmine.project.get(1)
277+
self.assertEqual(project.status, 1)
278+
274279
def test_issue_version(self):
275280
self.assertEqual(self.redmine.issue.resource_class.redmine_version, '1.0')
276281

@@ -761,12 +766,9 @@ def test_user_includes(self):
761766
self.assertIsInstance(user.groups, ResourceSet)
762767

763768
def test_user_returns_status_without_conversion(self):
764-
from redmine.exceptions import ResourceAttrError
765769
self.response.json.return_value = {'user': {'firstname': 'John', 'lastname': 'Smith', 'id': 1, 'status': 1}}
766770
user = self.redmine.user.get(1)
767771
self.assertEqual(user.status, 1)
768-
self.response.json.return_value = responses['user']['get']
769-
self.assertRaises(ResourceAttrError, lambda: self.redmine.user.get(1).status)
770772

771773
def test_group_version(self):
772774
self.assertEqual(self.redmine.group.resource_class.redmine_version, '2.1')

0 commit comments

Comments
 (0)