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): if not prefix: return False 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)