diff options
Diffstat (limited to 'archivist/virtual_prefixes.py')
-rw-r--r-- | archivist/virtual_prefixes.py | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/archivist/virtual_prefixes.py b/archivist/virtual_prefixes.py new file mode 100644 index 0000000..632e3cf --- /dev/null +++ b/archivist/virtual_prefixes.py @@ -0,0 +1,76 @@ +prefixes = {} +registered = False + +def register_prefixes(): + global registered + if registered: return + + if not prefixes: + _create_prefixes() + + for prefix in prefixes.values(): + prefix.get_or_create() + + registered = True + +def _create_prefixes(): + from .model import Document + + FieldVirtualPrefix('direction', 'In- or outgoing', Document.direction) + FieldVirtualPrefix('date', 'Date of creation', Document.created) + FieldVirtualPrefix('mime', 'Mime Type', Document.mimetype) + ContainsFieldVirtualPrefix('name', 'Name/description of document', Document.name) + + for part in ('day', 'month', 'year'): + FieldPartVirtualPrefix(part, part.capitalize() + ' of creation', Document.created, part) + +def query(prefix, value): + register_prefixes() + + if prefix in prefixes: + return prefixes[prefix].as_query(value) + return None + +def is_virtual(prefix): + register_prefixes() + return prefix in prefixes + +class VirtualPrefix: + def __init__(self, name, description, accessor): + self.name = name + self.accessor = accessor + self.description = description + prefixes[name] = self + + def get_or_create(self): + from .model import Prefix + return Prefix.get_or_create(name = self.name, defaults={ + 'description' : self.description, + 'virtual' : True}) + + def check_for(self, document, value): + return self.accessor(document) == value + + def as_query(self, value): + raise NotImplementedError + +class FieldVirtualPrefix(VirtualPrefix): + def __init__(self, name, description, field): + self._field = field + super().__init__(name, description, lambda doc: getattr(doc, field.name)) + + def as_query(self, value): + return self._field == value + +class ContainsFieldVirtualPrefix(FieldVirtualPrefix): + def as_query(self, value): + return self._field.contains(value) + +class FieldPartVirtualPrefix(VirtualPrefix): + def __init__(self, name, description, field, part): + self._field = field + self._field_part = getattr(field, part) + super().__init__(name, description, lambda doc: getattr(getattr(doc, field.name), part)) + + def as_query(self, value): + return self._field_part == int(value) |