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

SchedulerOption   A

Complexity

Total Complexity 22

Size/Duplication

Total Lines 94
Duplicated Lines 0 %

Test Coverage

Coverage 19.57%
Metric Value
dl 0
loc 94
ccs 9
cts 46
cp 0.1957
rs 10
wmc 22

6 Methods

Rating   Name   Duplication   Size   Complexity  
A __init__() 0 4 1
A value() 0 7 2
D get() 0 32 8
A get_next() 0 6 2
C update() 0 28 7
A update_trigger() 0 11 2
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