Skip to content
Snippets Groups Projects

Draft:Generic api v1

4 files
+ 76
27
Compare changes
  • Side-by-side
  • Inline

Files

 
from apispec.ext.marshmallow import MarshmallowPlugin
 
from flask_apispec.extension import FlaskApiSpec
 
 
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 doc
 
from flask_restful import marshal, fields
 
 
from Mirador_backend.models import BaseModel, NotFound
 
from Mirador_backend.utils.app import getApp
 
 
logger = getApp().logger
 
 
 
class ResourceGroup(MethodResource, Resource):
 
Model = BaseModel
 
 
def parseData(self, request):
 
"""Read the request and return only the useful data"""
 
return request.json
 
 
def get_queryset(self):
 
"""Get the queryset for the request"""
 
return self.Model.all()
 
 
def get(self):
 
"""Handle a get request"""
 
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"""
 
m = self.Model().create(self.parseData(request))
 
return marshal(m, self.Model.fields), 200
 
 
def genDoc(descr, tags):
 
doc(description=f'Get all {descr}', tags=tags)(ResourceGroup.get)
 
doc(description=f'Create a {descr}', tags=tags)(ResourceGroup.post)
 
 
 
class ResourceItem(MethodResource, Resource):
 
Model = BaseModel
 
 
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.get_queryset(id)
 
except NotFound:
 
abort(404)
 
 
def parseData(self, request):
 
"""Read the request and return only the useful data"""
 
return request.json
 
 
def get(self, id):
 
"""Handle a get request"""
 
return marshal(self.get_queryset_or_abort(id), self.Model.fields), 200
 
 
def put(self, id):
 
"""Handle a put request"""
 
data = self.parseData(request)
 
try:
 
m = self.get_queryset(id)
 
m.clear()
 
m.fill(data)
 
m = m.save()
 
except NotFound:
 
data['id'] = id
 
m = self.Model().create(data)
 
return marshal(m, self.Model.fields), 200
 
 
def patch(self, id):
 
"""Handle a patch request"""
 
m = self.get_queryset_or_abort(id)
 
m.fill(self.parseData(request))
 
m.save()
 
return marshal(m, self.Model.fields), 200
 
 
def delete(self, id):
 
"""Handle a delete request"""
 
m = self.get_queryset_or_abort(id)
 
return marshal({'success': m.delete()}, {'success': fields.Boolean}), 200
 
 
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)
Loading