Skip to content
Snippets Groups Projects

Draft:Generic api v1

Open David Beniamine requested to merge generic-api-v1 into master
3 files
+ 40
30
Compare changes
  • Side-by-side
  • Inline

Files

+ 29
20
from apispec.ext.marshmallow import MarshmallowPlugin
from flask_apispec.extension import FlaskApiSpec
from marshmallow import Schema, fields
from apispec import APISpec
from flask import request
from flask_restful import Resource, abort
from flask_restful_swagger import swagger
from flask_apispec.views import MethodResource
from flask_apispec import marshal_with, doc, use_kwargs
from flask_apispec import doc
from flask_restful import marshal, fields
from Mirador_backend.models import BaseModel, NotFound
@@ -25,19 +25,18 @@ class ResourceGroup(MethodResource, Resource):
def get(self):
"""Handle a get request"""
return [x.serialized for x in self.get_queryset()]
data = {x.id: x for x in self.get_queryset()}
list_fields = {x: fields.Nested(self.Model.fields) for x in data.keys()}
return marshal(data, list_fields), 200
def post(self):
"""Handle a post request"""
return Model().create(self.parseData(request)).serialized
m = Model().create(self.parseData(request))
return marshal(m, self.Model.fields), 200
def genDoc(descr, tags, klass):
def genDoc(descr, tags):
doc(description=f'Get all {descr}', tags=tags)(ResourceGroup.get)
doc(description=f'Create a {descr}', tags=tags)(ResourceGroup.post)
klass_fields = {x: fields.Raw() for x in klass.data_fields}
# TODO marshal
#marshal_with(klass_fields)(ResourceGroup.post)
#marshal_with(fields.List(klass_fields))(ResourceGroup.get)
class ResourceItem(MethodResource, Resource):
@@ -45,8 +44,12 @@ class ResourceItem(MethodResource, Resource):
def get_queryset(self, id):
"""Get the queryset for the request"""
return self.Model.find(id)
def get_queryset_or_abort(self, id):
"""Get the queryset for the request or aborts with a 404"""
try:
return self.Model.find(id).serialized
return self.get_queryset(id)
except NotFound:
abort(404)
@@ -56,29 +59,35 @@ class ResourceItem(MethodResource, Resource):
def get(self, id):
"""Handle a get request"""
return self.get_queryset(id).serialized
return marshal(self.get_queryset_or_abort(id), self.Model.fields), 200
def put(self, id):
"""Handle a put request"""
m = self.get_queryset(id)
m.clear()
m.fill(self.parseData(request))
return m.save().serialized
data = self.parseData(request)
try:
m = self.get_queryset(id)
m.clear()
m.fill(data)
m = m.save()
except NotFound:
m = self.Model.create(data)
return marshal(model, self.Model.fields), 200
def patch(self, id):
"""Handle a patch request"""
m = self.get_queryset(id)
m = self.get_queryset_or_abort(id)
m.clear()
m.fill(self.parseData(request))
return m.save().serialized
return marshal(m.save(), self.Model.fields), 200
def delete(self, id):
"""Handle a delete request"""
return self.get_queryset(id).delete()
m = self.get_queryset_or_abort(id)
return marshal(m.delete(), fields.Boolean), 200
def genDoc(descr, tags, klass):
def genDoc(descr, tags):
doc(description=f'Get {descr} by id', tags=tags)(ResourceItem.get)
doc(description=f'Create or Update a {descr} by id', tags=tags)(ResourceItem.put)
doc(description=f'Updates partially a {descr} by id', tags=tags)(ResourceItem.patch)
doc(description=f'deletes a {descr} by id', tags=tags)(ResourceItem.delete)
# TODO marshal
Loading