Passed
Push — develop ( 58c12a...6a842a )
by Dean
02:43
created

SchedulerOption.get()   D

Complexity

Conditions 8

Size

Total Lines 32

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 59.2467
Metric Value
cc 8
dl 0
loc 32
ccs 1
cts 14
cp 0.0714
crap 59.2467
rs 4
1 1
from plugin.models import SchedulerTask, SchedulerJob
2 1
from plugin.preferences.options.core.base.base import Option
3
4 1
import logging
5
6 1
log = logging.getLogger(__name__)
7
8
9 1
class SchedulerOption(Option):
0 ignored issues
show
Bug introduced by
The method on_plex_changed which was declared abstract in the super-class Option
was not overridden.

Methods which raise NotImplementedError should be overridden in concrete child classes.

Loading history...
10 1
    def __init__(self, preferences, task=None, job=None):
11 1
        super(SchedulerOption, self).__init__(preferences, job)
12
13 1
        self._task = task
14
15 1
    @property
16
    def value(self):
17
        if self._option is None:
18
            log.warn('Tried to retrieve value from an option without "get()"')
19
            return None
20
21
        return self._option.trigger
22
23 1
    def get(self, account=None):
24
        # Verify get() call is valid
25
        if self.scope == 'account':
26
            if account is None:
27
                raise ValueError('Account option requires the "account" parameter')
28
29
            if not self._validate_account(account):
30
                raise ValueError('Invalid value for "account" parameter: %r' % account)
31
32
        if self.scope == 'server' and account is not None:
33
            raise ValueError("Server option can't be called with the \"account\" parameter")
34
35
        # Get/Create `SchedulerTask`
36
        task, _ = SchedulerTask.get_or_create(
37
            key=self.key
38
        )
39
40
        # Get/Create `SchedulerJob`
41
        job, _ = SchedulerJob.get_or_create(
42
            account=account or 0,
43
            task=task,
44
45
            defaults={
46
                'trigger': self.default
47
            }
48
        )
49
50
        if job.trigger and job.due_at is None:
0 ignored issues
show
Bug introduced by
The Instance of Model does not seem to have a member named trigger.

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...
51
            job.due_at = self.get_next(job)
52
            job.save()
53
54
        return self._clone(task, job)
55
56 1
    def update(self, value, account=None, emit=True):
57
        if self.scope == 'account':
58
            if account is None:
59
                raise ValueError('Account option requires the "account" parameter')
60
61
            if not self._validate_account(account):
62
                raise ValueError('Invalid value for "account" parameter: %r' % account)
63
64
        if self.scope == 'server' and account is not None:
65
            raise ValueError("Server option can't be called with the \"account\" parameter")
66
67
        # Get/Create `SchedulerTask`
68
        task, _ = SchedulerTask.get_or_create(
69
            key=self.key
70
        )
71
72
        # Get/Create `SchedulerJob`
73
        job, _ = SchedulerJob.get_or_create(
74
            account=account or 0,
75
            task=task
76
        )
77
78
        # Update job
79
        self.update_trigger(job, value)
80
81
        # Emit database change to handler (if enabled)
82
        if emit:
83
            self._preferences.on_database_changed(self.key, value, account=account)
84
85 1
    def update_trigger(self, job, value):
86
        if job.trigger == value:
87
            # Trigger hasn't changed
88
            return
89
90
        # Update `trigger` and `due_at` properties
91
        job.trigger = value
92
        job.due_at = self.get_next(job)
93
94
        # Save changes
95
        job.save()
96
97 1
    @classmethod
98
    def get_next(cls, job):
99
        if job.trigger is None:
100
            return None
101
102
        return job.next_at()
103