Passed
Push — develop ( e15ceb...5f9839 )
by Dean
02:51
created

SyncIntervalHandler   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 44
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
wmc 8
dl 0
loc 44
ccs 0
cts 23
cp 0
rs 10
c 0
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A run() 0 20 4
A check() 0 20 4
1
from plugin.models import SyncResult
2
from plugin.modules.scheduler.handlers.core.base import Handler
3
from plugin.preferences.options import SyncIntervalOption
4
from plugin.sync.core.enums import SyncMode
5
from plugin.sync.core.exceptions import QueueError
6
from plugin.sync.main import Sync
7
8
from datetime import datetime
9
import logging
10
11
log = logging.getLogger(__name__)
12
13
14
class SyncIntervalHandler(Handler):
15
    key = 'sync.interval'
16
17
    def check(self, job):
18
        last_result = SyncIntervalOption.get_last_result(job.account, SyncMode.Full)
19
20
        if last_result is None or last_result.started_at <= job.due_at:
21
            return True
22
23
        # Re-schedule job
24
        job.due_at = job.next_at(last_result.started_at)
25
26
        log.debug('Job re-scheduled to %r', job.due_at)
27
28
        # Check if a trigger is required
29
        if job.due_at <= datetime.utcnow():
30
            return True
31
32
        # Trigger ignored, update job
33
        job.save()
34
35
        log.debug('Ignoring scheduled sync interval (already triggered)')
36
        return False
37
38
    def run(self, job):
39
        # Ensure sync hasn't already been triggered
40
        if not self.check(job):
41
            return False
42
43
        try:
44
            # Queue sync
45
            Sync.queue(
46
                account=job.account,
47
                mode=SyncMode.Full,
48
49
                priority=100,
50
                trigger=SyncResult.Trigger.Schedule
51
            )
52
        except QueueError, ex:
53
            log.info('Queue error: %s', ex)
54
        except Exception, ex:
55
            log.error('Unable to queue sync: %s', ex, exc_info=True)
56
57
        return True
58