summaryrefslogtreecommitdiff
path: root/archivist/bl.py
blob: 0815cf65bfba0bef41d06df27c0aa202fef28e83 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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