summaryrefslogtreecommitdiff
path: root/archivist/bl.py
diff options
context:
space:
mode:
Diffstat (limited to 'archivist/bl.py')
-rw-r--r--archivist/bl.py52
1 files changed, 52 insertions, 0 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