Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ Changelog
raised during processing validation errors from Redmine when one of the errors was returned as
a list)

- Fixed: `Issue #59 <https://github.com/maxtepkeev/python-redmine/issues/59>`__ (Raise ForbiddenError when a 403 is encountered)

1.0.1 (2014-09-23)
++++++++++++++++++

Expand Down
5 changes: 4 additions & 1 deletion redmine/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@
VersionMismatchError,
ResourceNotFoundError,
RequestEntityTooLargeError,
UnknownError
UnknownError,
ForbiddenError
)


Expand Down Expand Up @@ -120,6 +121,8 @@ def request(self, method, url, headers=None, params=None, data=None, raw_respons
return json_response(response.json)
elif response.status_code == 401:
raise AuthError
elif response.status_code == 403:
raise ForbiddenError
elif response.status_code == 404:
raise ResourceNotFoundError
elif response.status_code == 409:
Expand Down
6 changes: 6 additions & 0 deletions redmine/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,3 +156,9 @@ class FileUrlError(BaseRedmineError):
"""URL provided to download a file can't be parsed"""
def __init__(self):
super(FileUrlError, self).__init__("URL provided to download a file can't be parsed")


class ForbiddenError(BaseRedmineError):
"""Requested resource is forbidden"""
def __init__(self):
super(ForbiddenError, self).__init__("Requested resource is forbidden")
5 changes: 5 additions & 0 deletions tests/test_redmine.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,11 @@ def test_auth_error_exception(self):
self.response.status_code = 401
self.assertRaises(AuthError, lambda: self.redmine.request('get', self.url))

def test_forbidden_error_exception(self):
from redmine.exceptions import ForbiddenError
self.response.status_code = 403
self.assertRaises(ForbiddenError, lambda: self.redmine.request('get', self.url))

def test_impersonate_error_exception(self):
from redmine.exceptions import ImpersonateError
self.redmine.impersonate = 'not_exists'
Expand Down