from urllib.parse import urljoin from flask import Flask from mongoengine import Document from restapi.views import ApiView from restapi import Methods class MongoApi: app: Flask = None authentication_methods: list = [] def __init__(self, app: Flask, authentication_methods=[]): self.app = app self.authentication_methods = authentication_methods def register_model(self, model: any, uri: str = None, name: str = None) -> None: if not getattr(model, '_meta').get('methods'): raise Exception("{} model methods not set".format(model.__name__)) if not uri: uri = model.__name__.lower() if uri[:-1] != "/": uri = uri + "/" if uri[0] != "/": uri = "/" + uri if not name: name = model.__name__ self.app.add_url_rule( uri, methods=(method.method for method in getattr(model, '_meta').get('methods') if method not in (Methods.Get, Methods.Update)), view_func=ApiView.as_view(name, model=model, authentication_methods=self.authentication_methods)) single = [] if Methods.Update in getattr(model, '_meta').get('methods'): single.append('PUT') if Methods.Get in getattr(model, '_meta').get('methods'): single.append('GET') if single: self.app.add_url_rule( urljoin(uri, '/'), methods=single, view_func=ApiView.as_view("{}_GET_PUT".format(name), model=model, authentication_methods=self.authentication_methods))