From 9994319ea5c86bad2f88ab737b9b82dfae43cd6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20=27Necoro=27=20Neumann?= Date: Thu, 5 Oct 2017 18:05:21 +0200 Subject: Webservice to create a new tag --- archivist/bl.py | 22 +++++++++++----------- archivist/model.py | 1 + archivist/server/__init__.py | 14 ++++++++++++-- archivist/server/tag.py | 14 ++++++++++++++ 4 files changed, 38 insertions(+), 13 deletions(-) diff --git a/archivist/bl.py b/archivist/bl.py index 0815cf6..849f2bb 100644 --- a/archivist/bl.py +++ b/archivist/bl.py @@ -34,19 +34,19 @@ class PrefixTag: def load(self): return m.Tag.get(name = self.name, prefix = self.prefix) + @db.atomic() def create(self): - with db.atomic(): - if self.prefix: - prefix, created = m.Prefix.get_or_create(name = self.prefix) + if self.prefix: + prefix, created = m.Prefix.get_or_create(name = self.prefix) - if not created and prefix.virtual: - raise BusinessException("Prefix '%s' is not allowed to carry additional tags." % self.prefix) - else: - prefix = None + if not created and prefix.virtual: + raise BusinessException("Prefix '%s' is not allowed to carry additional tags." % self.prefix) + else: + prefix = None - tag, created = m.Tag.create_or_get(name = self.name, prefix = self.prefix, description = self.description) + tag, created = m.Tag.create_or_get(name = self.name, prefix = self.prefix, description = self.description) - if prefix is not None: - m.TagImplications.try_create(tag = tag, implies_tag = prefix.default_tag) + if prefix is not None: + m.TagImplications.try_create(tag = tag, implies_tag = prefix.default_tag) - return tag, created + return tag, created diff --git a/archivist/model.py b/archivist/model.py index 2d9476a..1544f3f 100644 --- a/archivist/model.py +++ b/archivist/model.py @@ -13,6 +13,7 @@ from .peewee_fixes import * # dummy to force evaluation of those fixes db = SqliteExtDatabase('test.db', pragmas=[('foreign_keys', 'ON')]) db.load_extension(resource_filename(__name__, 'sqlext/closure')) +db.set_autocommit(False) __tables__ = [] __all__ = ['create_tables', 'drop_tables'] diff --git a/archivist/server/__init__.py b/archivist/server/__init__.py index f5ae194..913cff3 100644 --- a/archivist/server/__init__.py +++ b/archivist/server/__init__.py @@ -4,6 +4,9 @@ from flask.cli import FlaskGroup, ScriptInfo from flask import Flask from flask_restplus import Api, Resource, fields +from ..model import db + +app = Flask('archivist') api = Api(version='0.1', title='Archivist API', description='API for the Archivist Document System') @@ -12,9 +15,16 @@ NAMESPACES=( 'prefix', ) -def create_app(info): - app = Flask('archivist') +@app.before_request +def before_request(): + db.connect() +@app.after_request +def after_request(response): + db.close() + return response + +def create_app(info): for ns in NAMESPACES: mod = import_module('.' + ns, __name__) api.add_namespace(mod.api) diff --git a/archivist/server/tag.py b/archivist/server/tag.py index 96fafcd..8142cd1 100644 --- a/archivist/server/tag.py +++ b/archivist/server/tag.py @@ -1,6 +1,8 @@ +from flask import request from flask_restplus import Resource, fields, Namespace from .. import model as m +from .. import bl api = Namespace('tag', description = 'Operations on tags') @@ -17,3 +19,15 @@ class TagList(Resource): def get(self): """List all available tags.""" return list(m.Tag.select().where(~m.Tag.default).dicts().iterator()) + + @api.expect(tag, validate=True) + @api.response(201, "Tag created") + @api.response(409, "Tag already exists") + def put(self): + """Create a new tag.""" + data = request.get_json() + tag, created = bl.PrefixTag(**data).create() + if created: + return '',201 + else: + return '',409 -- cgit v1.2.3