Mercurial > p > roundup > code
comparison roundup/rest.py @ 5588:6b3a9655a7d9 REST-rebased
Move decorator to outside of the class
Change unittest to test the new format using the decorator
committer: Ralf Schlatterbeck <rsc@runtux.com>
| author | Chau Nguyen <dangchau1991@yahoo.com> |
|---|---|
| date | Wed, 30 Jan 2019 10:26:35 +0100 |
| parents | cb2b320fde16 |
| children | 5a2de4c19109 |
comparison
equal
deleted
inserted
replaced
| 5587:cb2b320fde16 | 5588:6b3a9655a7d9 |
|---|---|
| 12 import sys | 12 import sys |
| 13 import time | 13 import time |
| 14 import traceback | 14 import traceback |
| 15 from roundup import hyperdb | 15 from roundup import hyperdb |
| 16 from roundup.exceptions import * | 16 from roundup.exceptions import * |
| 17 from roundup import xmlrpc | 17 |
| 18 | |
| 19 def _data_decorator(func): | |
| 20 """Wrap the returned data into an object.""" | |
| 21 def format_object(self, *args, **kwargs): | |
| 22 # get the data / error from function | |
| 23 try: | |
| 24 code, data = func(self, *args, **kwargs) | |
| 25 except IndexError, msg: | |
| 26 code = 404 | |
| 27 data = msg | |
| 28 except Unauthorised, msg: | |
| 29 code = 403 | |
| 30 data = msg | |
| 31 except (hyperdb.DesignatorError, UsageError), msg: | |
| 32 code = 400 | |
| 33 data = msg | |
| 34 except (AttributeError, Reject), msg: | |
| 35 code = 405 | |
| 36 data = msg | |
| 37 except ValueError, msg: | |
| 38 code = 409 | |
| 39 data = msg | |
| 40 except NotImplementedError: | |
| 41 code = 402 # nothing to pay, just a mark for debugging purpose | |
| 42 data = 'Method under development' | |
| 43 except: | |
| 44 exc, val, tb = sys.exc_info() | |
| 45 code = 400 | |
| 46 # if self.DEBUG_MODE in roundup_server | |
| 47 # else data = 'An error occurred. Please check...', | |
| 48 data = val | |
| 49 | |
| 50 # out to the logfile | |
| 51 print 'EXCEPTION AT', time.ctime() | |
| 52 traceback.print_exc() | |
| 53 | |
| 54 # decorate it | |
| 55 self.client.response_code = code | |
| 56 if code >= 400: # any error require error format | |
| 57 result = { | |
| 58 'error': { | |
| 59 'status': code, | |
| 60 'msg': data | |
| 61 } | |
| 62 } | |
| 63 else: | |
| 64 result = { | |
| 65 'data': data | |
| 66 } | |
| 67 return result | |
| 68 return format_object | |
| 18 | 69 |
| 19 | 70 |
| 20 class RestfulInstance(object): | 71 class RestfulInstance(object): |
| 21 """The RestfulInstance performs REST request from the client""" | 72 """The RestfulInstance performs REST request from the client""" |
| 22 | 73 |
| 87 except hyperdb.HyperdbValueError, msg: | 138 except hyperdb.HyperdbValueError, msg: |
| 88 raise UsageError(msg) | 139 raise UsageError(msg) |
| 89 | 140 |
| 90 return prop | 141 return prop |
| 91 | 142 |
| 92 def _data_decorator(func): | |
| 93 """Wrap the returned data into an object..""" | |
| 94 def format_object(self, *args, **kwargs): | |
| 95 try: | |
| 96 code, data = func(self, *args, **kwargs) | |
| 97 except IndexError, msg: | |
| 98 code = 404 | |
| 99 data = msg | |
| 100 except Unauthorised, msg: | |
| 101 code = 403 | |
| 102 data = msg | |
| 103 except (hyperdb.DesignatorError, UsageError), msg: | |
| 104 code = 400 | |
| 105 data = msg | |
| 106 except (AttributeError, Reject), msg: | |
| 107 code = 405 | |
| 108 data = msg | |
| 109 except ValueError, msg: | |
| 110 code = 409 | |
| 111 data = msg | |
| 112 except NotImplementedError: | |
| 113 code = 402 # nothing to pay, just a mark for debugging purpose | |
| 114 data = 'Method under development' | |
| 115 except: | |
| 116 exc, val, tb = sys.exc_info() | |
| 117 code = 400 | |
| 118 # if self.DEBUG_MODE in roundup_server | |
| 119 # else data = 'An error occurred. Please check...', | |
| 120 data = val | |
| 121 | |
| 122 # out to the logfile | |
| 123 print 'EXCEPTION AT', time.ctime() | |
| 124 traceback.print_exc() | |
| 125 | |
| 126 self.client.response_code = code | |
| 127 if code >= 400: # any error require error format | |
| 128 result = { | |
| 129 'error': { | |
| 130 'status': code, | |
| 131 'msg': data | |
| 132 } | |
| 133 } | |
| 134 else: | |
| 135 result = { | |
| 136 'data': data | |
| 137 } | |
| 138 return result | |
| 139 return format_object | |
| 140 | |
| 141 @_data_decorator | 143 @_data_decorator |
| 142 def get_collection(self, class_name, input): | 144 def get_collection(self, class_name, input): |
| 143 """GET resource from class URI. | 145 """GET resource from class URI. |
| 144 | 146 |
| 145 This function returns only items have View permission | 147 This function returns only items have View permission |
