From 975b647a3274f299df7260b6597aa88be90a7bb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20=27Necoro=27=20Neumann?= Date: Thu, 5 Oct 2017 16:21:16 +0200 Subject: Restructure: Move some tag handling into the business logic --- archivist/bl.py | 52 +++++++++++++++++++++++++++++++++ archivist/cli.py | 67 ++++++------------------------------------- archivist/virtual_prefixes.py | 3 ++ 3 files changed, 63 insertions(+), 59 deletions(-) create mode 100644 archivist/bl.py diff --git a/archivist/bl.py b/archivist/bl.py new file mode 100644 index 0000000..0815cf6 --- /dev/null +++ b/archivist/bl.py @@ -0,0 +1,52 @@ +from . import model as m +from .model import db +from .peewee_ext import sqlite_tuple_in +from .virtual_prefixes import is_virtual, query as query_virtual + +class BusinessException(Exception): + def __init__(self, message): + super().__init__(message) + self.message = message + +class PrefixTag: + def __init__(self, name, prefix = None, description = None): + self.name = name + self.prefix = prefix + self.description = description + + def __iter__(self): + yield self.prefix + yield self.name + + def is_virtual(self): + return is_virtual(self.prefix) + + @property + def virtual_query(self): + return query_virtual(self.prefix, self.name) + + def __str__(self): + if self.prefix: + return "%s:%s" % (self.prefix, self.name) + else: + return self.name + + def load(self): + return m.Tag.get(name = self.name, prefix = self.prefix) + + def create(self): + with db.atomic(): + 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 + + 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) + + return tag, created diff --git a/archivist/cli.py b/archivist/cli.py index fee0cd9..5478de5 100644 --- a/archivist/cli.py +++ b/archivist/cli.py @@ -6,7 +6,7 @@ from functools import reduce import operator as op import pathlib -from .virtual_prefixes import query as query_virtual, is_virtual, register_prefixes +from .virtual_prefixes import register_prefixes from .utils import ProxyCommand CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) @@ -103,49 +103,17 @@ def add_prefix(name, description): if prefix is None: print("Prefix already existed:", name) -def prefix_tag_name(name, prefix=None): - if prefix: - return "%s:%s" % (prefix, name) - else: - return name - -class PrefixTag: - def __init__(self, tag, prefix = None): - self.tag = tag - self.prefix = prefix - - def __str__(self): - if self.prefix: - return '%s:%s' % (self.prefix, self.tag) - else: - return self.tag - - def __iter__(self): - yield self.prefix - yield self.tag - - def prefixed_name(self): - return prefix_tag_name(self.tag, self.prefix) - - def is_virtual(self): - return self.prefix and is_virtual(self.prefix) - - @property - def virtual_query(self): - return query_virtual(self.prefix, self.tag) - - def __str__(self): - return self.prefixed_name() - class PrefixTagType(click.ParamType): name = 'prefixed tag' def convert(self, value, param, ctx): + from .bl import PrefixTag try: prefix, tag = value.split(':', 1) except ValueError: return PrefixTag(value) - return PrefixTag(tag, prefix) + else: + return PrefixTag(tag, prefix) TAG = PrefixTagType() @@ -167,26 +135,6 @@ def edit_prefix(name, implies, description): prefix.description = description prefix.save() - -def create_tag(name, description=None): - from .model import Tag, TagImplications, Prefix, db - - with db.atomic(): - if name.prefix: - prefix, created = Prefix.get_or_create(name = name.prefix) - - if not created and prefix.virtual: - raise click.UsageError("Prefix '%s' is not allowed to carry additional tags." % name.prefix) - else: - prefix = None - - tag, created = Tag.create_or_get(name = name.tag, prefix = prefix, description = description) - - if prefix is not None: - TagImplications.try_create(tag = tag, implies_tag = prefix.default_tag) - - return tag, created - def fetch_tags(tag_list, ignore_missing=False): if not tag_list: return [] @@ -206,7 +154,8 @@ def fetch_tags(tag_list, ignore_missing=False): @click.argument('name', type = TAG) @click.argument('description', required = False) def add_tag(name, description): - tag, created = create_tag(name, description) + tag, created = name.create() + if not created: print("Tag already existed:", tag) @@ -228,7 +177,7 @@ def edit_tag(name, implies, description): from .model import Tag, db try: - tag = Tag.get(name = name.tag, prefix = name.prefix) + tag = name.load() except Tag.DoesNotExist: raise click.UsageError("Tag '%s' does not exist." % name) @@ -259,7 +208,7 @@ def add_doc(file, tags, create_tags, ignore_missing_tags): with db.atomic(): if tags: if create_tags: - tags = [create_tag(tag)[0] for tag in tags] + tags = [tag.create()[0] for tag in tags] else: tags = fetch_tags(tags, ignore_missing_tags) diff --git a/archivist/virtual_prefixes.py b/archivist/virtual_prefixes.py index 632e3cf..6f44d2b 100644 --- a/archivist/virtual_prefixes.py +++ b/archivist/virtual_prefixes.py @@ -32,6 +32,9 @@ def query(prefix, value): return None def is_virtual(prefix): + if not prefix: + return False + register_prefixes() return prefix in prefixes -- cgit v1.2.3