def on_get(self, req, resp, rid, related): """ Find the related model & serialize it back If the parent resource of the related model doesn't exist then abort on a 404. """ signals.pre_req.send(self.model) signals.pre_req_find.send(self.model) if not hasattr(self.model, related): abort(InvalidURL(**{ 'detail': 'The "%s" resource does not have a related ' 'resource named "%s". This is an error, check ' 'your spelling & retry.' % (self.rtype, related) })) model = find(self.model, rid) try: model_related = getattr(model, related).load() except AttributeError: model_related = None if isinstance(model_related, list): props = to_rest_models(model_related, includes=req.includes) elif model: props = to_rest_model(model_related, includes=req.includes) else: props = model_related resp.serialize(props) signals.post_req.send(self.model) signals.post_req_find.send(self.model)
def on_post(self, req, resp, rid): """ Deserialize the file upload & save it to S3 File uploads are associated with a model of some kind. Ensure the associating model exists first & foremost. """ signals.pre_req.send(self.model) signals.pre_req_upload.send(self.model) props = req.deserialize(self.mimetypes) model = find(self.model, rid) signals.pre_upload.send(self.model, model=model) try: conn = s3_connect(self.key, self.secret) path = self._gen_s3_path(model, props) s3_url = s3_upload(self.acl, self.bucket, conn, props['content'], props['content-type'], path) except IOError: abort(ServiceUnavailable(**{ 'detail': 'The upload attempt failed unexpectedly', })) else: signals.post_upload.send(self.model, model=model, url=s3_url) resp.location = s3_url resp.status = falcon.HTTP_201 resp.serialize({'data': {'url': s3_url}}) signals.post_req.send(self.model) signals.post_req_upload.send(self.model)
def on_get(resc, req, resp, rid): """ Find the model by id & serialize it back """ signals.pre_req.send(resc.model) signals.pre_req_find.send(resc.model) model = find(resc.model, rid) props = to_rest_model(model, includes=req.includes) resp.last_modified = model.updated resp.serialize(props) signals.post_req.send(resc.model) signals.post_req_find.send(resc.model)
def on_delete(resc, req, resp, rid): # pylint: disable=unused-argument """ Delete the single item Upon a successful deletion an empty bodied 204 is returned. """ signals.pre_req.send(resc.model) signals.pre_req_delete.send(resc.model) model = find(resc.model, rid) goldman.sess.store.delete(model) resp.status = falcon.HTTP_204 signals.post_req.send(resc.model) signals.post_req_delete.send(resc.model)
def on_patch(resc, req, resp, rid): """ Deserialize the payload & update the single item """ signals.pre_req.send(resc.model) signals.pre_req_update.send(resc.model) props = req.deserialize() model = find(resc.model, rid) from_rest(model, props) goldman.sess.store.update(model) props = to_rest_model(model, includes=req.includes) resp.last_modified = model.updated resp.serialize(props) signals.post_req.send(resc.model) signals.post_req_update.send(resc.model)