summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRené 'Necoro' Neumann <necoro@necoro.net>2017-10-05 16:21:16 +0200
committerRené 'Necoro' Neumann <necoro@necoro.net>2017-10-05 16:21:16 +0200
commit975b647a3274f299df7260b6597aa88be90a7bb8 (patch)
treefe5f55300df0f805cddb4a4220a7bf7adf51a7b4
parentfc11314eda6103d5055062c3035536c93784ea4c (diff)
downloadarchivist-975b647a3274f299df7260b6597aa88be90a7bb8.tar.gz
archivist-975b647a3274f299df7260b6597aa88be90a7bb8.tar.bz2
archivist-975b647a3274f299df7260b6597aa88be90a7bb8.zip
Restructure: Move some tag handling into the business logic
-rw-r--r--archivist/bl.py52
-rw-r--r--archivist/cli.py67
-rw-r--r--archivist/virtual_prefixes.py3
3 files changed, 63 insertions, 59 deletions
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