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 FieldPseudoPrefix('direction', 'In- or outgoing', Document.direction) FieldPseudoPrefix('date', 'Date of creation', Document.created) FieldPseudoPrefix('mime', 'Mime Type', Document.file_type) for part in ('day', 'month', 'year'): FieldPartPseudoPrefix(part, part.capitalize() + ' of creation', Document.created, part) def query_pseudo_prefix(prefix, value): register_prefixes() if prefix in prefixes: return prefixes[prefix].as_query(value) return None def is_pseudo_prefix(prefix): register_prefixes() return prefix in prefixes class PseudoPrefix: 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 FieldPseudoPrefix(PseudoPrefix): 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 FieldPartPseudoPrefix(PseudoPrefix): 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 == value