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) @db.atomic() def create(self): 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