File: filters.py

package info (click to toggle)
python-tasklib 2.5.1-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, sid, trixie
  • size: 240 kB
  • sloc: python: 2,257; makefile: 147
file content (78 lines) | stat: -rw-r--r-- 2,322 bytes parent folder | download | duplicates (2)
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
import abc
from .serializing import SerializingObject


class TaskFilter(object):
    """
    Abstract base class that defines interface of a TaskFilter.
    """

    @abc.abstractmethod
    def add_filter(self, arg):
        """
        Processes an non-keyword filter.
        """
        pass

    @abc.abstractmethod
    def add_filter_param(self, key, value):
        """
        Processes a keyword filter.
        """
        pass

    @abc.abstractmethod
    def clone(self):
        """
        Returns a new deep copy of itself.
        """
        pass


class TaskWarriorFilter(TaskFilter, SerializingObject):
    """
    A set of parameters to filter the task list with.
    """

    def __init__(self, backend, filter_params=None):
        self.filter_params = filter_params or []
        super(TaskFilter, self).__init__(backend)

    def add_filter(self, filter_str):
        self.filter_params.append(filter_str)

    def add_filter_param(self, key, value):
        key = key.replace('__', '.')

        # Replace the value with empty string, since that is the
        # convention in TW for empty values
        attribute_key = key.split('.')[0]

        # Since this is user input, we need to normalize before we serialize
        value = self._normalize(attribute_key, value)
        value = self._serialize(attribute_key, value)

        # If we are filtering by uuid:, do not use uuid keyword
        # due to TW-1452 bug
        if key == 'uuid':
            self.filter_params.insert(0, value)
        else:
            # Surround value with aphostrophes unless it's a empty string
            value = "'%s'" % value if value else ''

            # We enforce equality match by using 'is' (or 'none') modifier
            # Without using this syntax, filter fails due to TW-1479
            # which is, however, fixed in 2.4.5
            if self.backend.version < self.backend.VERSION_2_4_5:
                modifier = '.is' if value else '.none'
                key = key + modifier if '.' not in key else key

            self.filter_params.append("{0}:{1}".format(key, value))

    def get_filter_params(self):
        return [f for f in self.filter_params if f]

    def clone(self):
        c = self.__class__(self.backend)
        c.filter_params = list(self.filter_params)
        return c