-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathfilters.py
61 lines (49 loc) · 1.47 KB
/
filters.py
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
def only(lst):
if isinstance(lst, (list, tuple)):
if len(lst) > 1:
raise ValueError(f'More than one element in {lst}')
if lst:
return lst[0]
else:
return lst
return None
def _str_or_none(value):
value = only(value)
if isinstance(value, str) and value:
return value
return None
def _bool_or_none(value):
value = only(value)
if value and value is not None:
return bool(value)
return None
FIELDS = {
'class_key': _str_or_none,
'class_key_base': _str_or_none,
'instance_key': _str_or_none,
'instance_key_base': _str_or_none,
'conversation': _str_or_none,
'recipient': _str_or_none,
'sender': _str_or_none,
'is_personal': _bool_or_none,
}
class MessageFilter:
def __init__(self, **kwargs):
self.filter_dict = {}
for field, xform in FIELDS.items():
value = xform(kwargs.get(field))
if value:
self.filter_dict[field] = value
def __str__(self):
return f'<MessageFilter: {self.filter_dict}>'
def apply_to_queryset(self, qs):
if self.filter_dict:
qs = qs.filter(**self.filter_dict)
return qs
def matches_message(self, msg):
for field, value in self.filter_dict.items():
if getattr(msg, field) != value:
return False
return True
# roost defined, but did not use, an is_stricter_than(other) method.
# I'm skipping it.