Passed
Push — develop ( 5ef58f...571732 )
by Dean
02:53
created

Account.refresh_required()   A

Complexity

Conditions 3

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 8.2077

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 8
ccs 1
cts 6
cp 0.1666
rs 9.4285
cc 3
crap 8.2077
1 1
from plugin.models.core import db
2
3 1
from datetime import datetime, timedelta
4 1
from playhouse.apsw_ext import *
0 ignored issues
show
Coding Style introduced by
The usage of wildcard imports like playhouse.apsw_ext should generally be avoided.
Loading history...
5 1
import logging
6 1
import requests
7
8 1
REFRESH_INTERVAL = timedelta(days=1)
9
10 1
log = logging.getLogger(__name__)
11
12
13 1
class Account(Model):
14 1
    class Meta:
15 1
        database = db
16
17 1
    name = CharField(null=True, unique=True)
18 1
    thumb = TextField(null=True)
19
20 1
    deleted = BooleanField(default=False)
21 1
    refreshed_at = DateTimeField(null=True)
22
23 1
    def __init__(self, *args, **kwargs):
24
        super(Account, self).__init__(*args, **kwargs)
25
26
        self._plex_account = None
27
        self._trakt_account = None
28
29 1
    @property
30
    def plex(self):
31
        if self._plex_account:
32
            return self._plex_account
33
34
        return self.plex_accounts.first()
0 ignored issues
show
Bug introduced by
The Instance of Account does not seem to have a member named plex_accounts.

This check looks for calls to members that are non-existent. These calls will fail.

The member could have been renamed or removed.

Loading history...
35
36 1
    @plex.setter
37
    def plex(self, value):
38
        self._plex_account = value
39
40 1
    @property
41
    def trakt(self):
42
        if self._trakt_account:
43
            return self._trakt_account
44
45
        return self.trakt_accounts.first()
0 ignored issues
show
Bug introduced by
The Instance of Account does not seem to have a member named trakt_accounts.

This check looks for calls to members that are non-existent. These calls will fail.

The member could have been renamed or removed.

Loading history...
46
47 1
    @trakt.setter
48
    def trakt(self, value):
49
        self._trakt_account = value
50
51 1
    @property
52
    def refreshed_ts(self):
53
        if self.refreshed_at is None:
54
            return None
55
56
        return (self.refreshed_at - datetime(1970, 1, 1)).total_seconds()
57
58 1
    def thumb_url(self, update=False):
59
        if self.deleted or (self.thumb and not update):
60
            return self.thumb
61
62
        # Build thumb from `plex` and `trakt` accounts
63
        thumb = self.build_thumb()
64
65
        # If `thumb` has changed, store in database
66
        if thumb != self.thumb:
67
            self.thumb = thumb
68
            self.save()
69
70
        return thumb
71
72 1
    def refresh(self, force=False, save=True):
73
        if self.deleted:
74
            return False
75
76
        # Check if refresh is required
77
        if self.refresh_required():
78
            force = True
79
80
        # Only refresh account every `REFRESH_INTERVAL`
81
        if not force and self.refreshed_at:
82
            since_refresh = datetime.utcnow() - self.refreshed_at
83
84
            if since_refresh < REFRESH_INTERVAL:
85
                return False
86
87
        # Retrieve trakt/plex accounts
88
        p = self.plex
89
        t = self.trakt
90
91
        # Set `name` to trakt/plex username (if `name` isn't already set)
92
        if (self.name is None or self.name == 'administrator') and (t or p):
93
            self.name = t.username or p.username
94
95
        # Update account thumb
96
        self.thumb = self.build_thumb(
97
            plex=p,
98
            trakt=t
99
        )
100
101
        # Store changes in database
102
        self.refreshed_at = datetime.utcnow()
103
104
        if save:
105
            self.save()
106
107
        return True
108
109 1
    def refresh_required(self):
110
        if self.name is None:
111
            return True
112
113
        if self.thumb is None:
114
            return True
115
116
        return False
117
118 1
    def build_thumb(self, plex=None, trakt=None):
119
        if self.deleted:
120
            return None
121
122
        # Check if trakt thumbnail exists
123
        t = trakt or self.trakt
124
        t_thumb = t.thumb_url('404') if t else None
125
126
        if t_thumb:
127
            response = requests.get(t_thumb)
128
129
            # Check response is valid
130
            if 200 <= response.status_code < 300:
131
                log.debug('Using trakt account thumbnail')
132
                return t.thumb_url()
133
134
        # Return plex thumbnail
135
        p = plex or self.plex
136
        p_thumb = p.thumb_url() if p else None
137
138
        return p_thumb
139
140 1
    def to_json(self, full=False):
141
        result = {
142
            'id': self.id,
0 ignored issues
show
Bug introduced by
The Instance of Account does not seem to have a member named id.

This check looks for calls to members that are non-existent. These calls will fail.

The member could have been renamed or removed.

Loading history...
143
            'name': self.name,
144
            'deleted': self.deleted,
145
146
            'thumb_url': self.thumb_url()
147
        }
148
149
        if not full:
150
            return result
151
152
        # plex
153
        plex = self.plex
154
155
        if plex:
156
            result['plex'] = plex.to_json(full=full)
157
158
        # trakt
159
        trakt = self.trakt
160
161
        if trakt:
162
            result['trakt'] = trakt.to_json(full=full)
163
164
        return result
165
166 1
    def __repr__(self):
167
        return '<Account name: %r>' % (
168
            self.name
169
        )
170