Source code for s4.clarity.exception
# Copyright 2016 Semaphore Solutions, Inc.
# ---------------------------------------------------------------------------
from s4.clarity import ETree
class ClarityException(Exception):
"""
Exceptions that are returned as XML from Clarity LIMS.
"""
def __init__(self, msg):
super(ClarityException, self).__init__(msg)
self.request_body = None
[docs] @classmethod
def raise_if_present(cls, response, data=None, username=None):
"""
:type response: requests.Response
:type data: any
:type username: str
"""
if cls.is_redirect(response):
raise cls("Redirects are disabled, verify Clarity URI. Did you use http instead of https?")
if cls.is_authentication_error(response):
raise ClarityAuthenticationException("Password or username incorrect -- user '%s'" % username)
# TODO detect when a user is authenticated but not authorized
# a 'Forbidden' message is returned in the case when your
# password is correct but you don't have API access, for example.
cls.raise_on_exception(response, data)
# this does nothing if it's 200 OK
response.raise_for_status()
[docs] @staticmethod
def is_redirect(response):
return response.status_code == 301
[docs] @staticmethod
def is_authentication_error(response):
return response.status_code == 401
[docs] @staticmethod
def is_response_exception(response):
return "<exc:exception" in response.text
[docs] @classmethod
def raise_on_exception(cls, response, data=None):
# Make sure we are an exception, if not carry on
if not cls.is_response_exception(response):
return
root = ETree.XML(response.content)
try:
msg = root.find('message').text
except AttributeError:
msg = "No message provided by Clarity."
try:
msg += "\nSuggested actions: " + root.find('suggested-actions').text
except AttributeError:
# no suggested-actions
pass
extra = root.get('category')
if extra is not None:
msg += "\nException category: " + extra
extra = root.get('code')
if extra is not None:
msg += "\nException code: " + extra
if "File does not exist" in msg:
raise FileNotFoundException(msg)
else:
instance = cls(msg)
instance.request_body = data.decode("UTF-8") if isinstance(data, bytes) else data
raise instance
class ClarityAuthenticationException(ClarityException):
pass
class FileNotFoundException(ClarityException):
pass