summaryrefslogtreecommitdiff
path: root/archivist/virtual_prefixes.py
blob: 6f44d2bd6b7fe7bd4e3f5ce259ce983d428d439d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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)