Passed
Push — develop ( b3bfc7...6fb855 )
by Dean
02:36
created

Get.__call__()   A

Complexity

Conditions 2

Size

Total Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 4.048
Metric Value
cc 2
dl 0
loc 7
ccs 1
cts 5
cp 0.2
crap 4.048
rs 9.4285
1 1
from plugin.core.helpers.variable import to_tuple
2 1
from plugin.models import db
3
4 1
import apsw
5 1
import inspect
6 1
import logging
7 1
import peewee
8
9 1
log = logging.getLogger(__name__)
10
11
12 1
class Method(object):
13 1
    def __init__(self, manager, *args, **kwargs):
14 1
        self.manager = manager
15
16 1
    @property
17
    def model(self):
18 1
        return self.manager.model
19
20
21 1
class Get(Method):
22 1
    def __call__(self, *query, **kwargs):
23
        obj = self.model.get(*query, **kwargs)
24
25
        if obj:
26
            obj._created = False
27
28
        return obj
29
30 1
    def all(self):
31
        return self.model.select()
32
33 1
    def by_id(self, id):
34
        return self(self.model.id == id)
35
36 1
    def or_create(self, *query, **kwargs):
37 1
        try:
38 1
            return self.manager.create(**kwargs)
39
        except (apsw.ConstraintError, peewee.IntegrityError), ex:
40
            log.debug('or_create() - ex: %r', ex)
41
42
        return self(*query)
43
44 1
    def where(self, *query):
45
        return self.model.select().where(*query)
46
47
48 1
class Create(Method):
49 1
    def __call__(self, **kwargs):
50 1
        if not self.model:
51
            raise Exception('Manager %r has no "model" attribute defined' % self.manager)
52
53 1
        with db.transaction():
54 1
            obj = self.model.create(**kwargs)
55
56 1
        if obj:
57
            # Set flag
58 1
            obj._created = True
59
60 1
        return obj
61
62
63 1
class Update(Method):
64 1
    keys = []
65
66 1
    def __call__(self, obj, data, save=True):
67
        changed = False
68
69
        for key, value in data.items():
70
            if not hasattr(obj, key):
71
                raise KeyError('%r has no key %r' % (obj, key))
72
73
            if getattr(obj, key) == value:
74
                continue
75
76
            changed = True
77
            setattr(obj, key, value)
78
79
        if not changed:
80
            return False
81
82
        if save:
83
            obj.save()
84
85
        return True
86
87 1
    def from_dict(self, obj, changes, save=True):
88
        if not changes:
89
            return False
90
91
        # Resolve `account`
92
        if inspect.isfunction(obj):
93
            obj = obj()
94
95
        # Update `TraktAccount`
96
        data = {}
97
98
        for key in self.keys:
99
            if key not in changes:
100
                continue
101
102
            data[key] = changes[key]
103
104
        if data and not self(obj, data, save=save):
105
            log.debug('Unable to update %r (nothing changed?)', obj)
106
107
        return True
108
109
110 1
class ManagerMeta(type):
111 1
    def __init__(cls, name, bases, attributes):
112 1
        super(ManagerMeta, cls).__init__(name, bases, attributes)
113
114 1
        if '__metaclass__' in attributes:
115 1
            return
116
117
        # Construct manager methods
118 1
        for key in ['get', 'create', 'update']:
119 1
            value = getattr(cls, key)
120
121 1
            if not value or not inspect.isclass(value):
122
                continue
123
124
            # Construct method
125 1
            setattr(cls, key, value(cls))
126
127
128 1
class Manager(object):
129 1
    __metaclass__ = ManagerMeta
130
131 1
    create = Create
132 1
    get = Get
133 1
    update = Update
134
135
    model = None
136