summaryrefslogtreecommitdiff
path: root/archivist/virtual_prefixes.py
diff options
context:
space:
mode:
Diffstat (limited to 'archivist/virtual_prefixes.py')
-rw-r--r--archivist/virtual_prefixes.py76
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)