def wrapped_f(*a, **ka): try: #if this decorator is used the function must return all messages that should be described as a list messages = f(*a, **ka) #first check if there is an response object #if not nothing to return so HTTP 204 #otherwise process response if messages == None: if self.before_send_hook != None: self.before_send_hook(204,None,None) return None else: if isinstance(messages, (list, tuple)) == False: raise Exception('Methods using the "describe" decorator have to return a list of subclasses of DataMessage to describe.') msg_descriptions = [] for msg in messages: if issubclass(msg,DataMessage) == False: raise Exception('All returned classes in the returned list have to be a subclass of DataMessage.') msg_descriptions.append(msg().describe()) meta = {'message-types':msg_descriptions} message = JsonApiMessage(meta=meta).to_json() #render json response if self.before_send_hook != None: #fire before send hook self.before_send_hook(self.success_status,message,None) return message except Exception as e: err_msg = ErrorMessage.from_exception(e) tb = traceback.format_exc() if self.include_traceback_in_errors: if err_msg.meta == None: err_msg.meta = {} err_msg.traceback = tb if self.error_hook != None: self.error_hook(int(err_msg.status),err_msg,tb) message = JsonApiMessage(errors=err_msg).to_json() return message
def wrapped_f(*a, **ka): try: #first check if this is not a HTTP OPTIONS call using a method defined based on the WS framework. #if it is one return empty array and do nothing else. if self.options_hook != None: if self.options_hook() == True: janus_logger.debug("This was an OPTIONS request.") return {} response_obj = f(*a, **ka) #first check if there is an response object #if not nothing to return so HTTP 204 #otherwise process response if response_obj == None: if self.before_send_hook != None: self.before_send_hook(204,None,None) janus_logger.debug("Decorated function returned None. Nothing to map.") return None else: #check response object if isinstance(response_obj,JanusResponse) == False: janus_logger.error("Expected JanusResponse got " + str(type(response_obj))) raise Exception('Return value has to be instance of JanusResponse') message = None #caching loaded_from_cache = False if self.cached_get_hook != None: cached_object = self.cached_get_hook(response_obj) if cached_object != None: loaded_from_cache = True message = cached_object #returned cached, already mapped, response janus_logger.info("Will return cached message: " + str(loaded_from_cache)) if loaded_from_cache == False: #nothing in cache or cache deactivated self.message = response_obj.message #get the message type to return obj = response_obj.data #get the data to return data = DataMessage.from_object(obj,self.message) #generate data message with data #take care of includes if response_obj.include_relationships != None: self.include_relationships = response_obj.include_relationships included = None janus_logger.info("Should map included: " + str(self.include_relationships)) if self.include_relationships: included = self.__load_included(data) #is there custome meta? if response_obj.meta != None: if self.meta == None: self.meta = response_obj.meta else: self.meta.update(response_obj.meta) message = JsonApiMessage(data=data,included=included,meta=self.meta).to_json() #render json response #caching if self.cached_set_hook != None and loaded_from_cache == False: janus_logger.debug("Caching message") self.cached_set_hook(response_obj,message) if self.before_send_hook != None: #fire before send hook self.before_send_hook(self.success_status,message,response_obj) return message except Exception as e: err_msg = ErrorMessage.from_exception(e) tb = traceback.format_exc() if self.include_traceback_in_errors: if err_msg.meta == None: err_msg.meta = {} err_msg.traceback = tb if self.error_hook != None: self.error_hook(int(err_msg.status),err_msg,tb) message = JsonApiMessage(errors=err_msg,meta=self.meta).to_json() janus_logger.error("Traceback: " + tb) return message