forked from Screenly/Anthias
/
schedules_helper.py
87 lines (64 loc) · 2.92 KB
/
schedules_helper.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import db
import queries
import datetime
FIELDS = ["id", "asset_id", "name", "start_date", "end_date", "duration", "repeat", "priority", "pattern_type", "pattern_days"]
create_schedules_table = 'CREATE TABLE schedules(id integer primary key autoincrement, asset_id text, name text, start_date timestamp, end_date timestamp, duration integer, repeat integer default 0, priority integer default 0, pattern_days text, pattern_type text)'
get_time = datetime.datetime.utcnow
def is_active(schedule, at_time=None):
"""Accepts a schedule dictionary and determines if it
is active at the given time. If no time is specified, 'now' is used.
>>> asset = {'asset_id': u'4c8dbce552edb5812d3a866cfe5f159d', 'mimetype': u'web', 'name': u'WireLoad', 'end_date': datetime.datetime(2013, 1, 19, 23, 59), 'uri': u'http://www.wireload.net', 'duration': u'5', 'is_enabled': True, 'nocache': 0, 'play_order': 1, 'start_date': datetime.datetime(2013, 1, 16, 0, 0)};
>>> is_active(asset, datetime.datetime(2013, 1, 16, 12, 00))
True
>>> is_active(asset, datetime.datetime(2014, 1, 1))
False
>>> asset['is_enabled'] = False
>>> is_active(asset, datetime.datetime(2013, 1, 16, 12, 00))
False
"""
if schedule['start_date'] and schedule['end_date']:
if scheule['repeat']:
at = at_time or get_time()
return schedule['start_date'] < at and schedule['end_date'] > at
# schedule repeats
# get value of repeats_when with case statement
return False
def get_schedules(asset_id, conn):
"""Returns all currently active schedules for an asset."""
return filter(is_active, read(conn, asset_id))
def mkdict(keys):
"""Returns a function that creates a dict from a database record."""
return lambda row: dict([(keys[ki], v) for ki, v in enumerate(row)])
def create(conn, schedule):
"""
Create a database record for an schedule.
Returns the schedule.
Asset's is_active field is updated before returning.
"""
with db.commit(conn) as c:
c.execute(queries.create_schedule(schedule.keys()), schedule.values())
return schedule
def read(conn, asset_id, keys=FIELDS):
"""
Fetch one or more schedules from the database.
Returns a list of dicts or one dict.
"""
schedules = []
mk = mkdict(keys)
with db.cursor(conn) as c:
c.execute(queries.read_schedule(keys), [asset_id])
schedules = [mk(schedule) for schedule in c.fetchall()]
return schedules
def update(conn, id, schedule):
"""
Update an schedule in the database.
Returns the schedule.
schedule's id field is updated before returning.
"""
with db.commit(conn) as c:
c.execute(queries.update_schedule(schedule.keys()), schedule.values() + [id])
return schedule
def delete(conn, schedule_id):
"""Remove a schedule from the database."""
with db.commit(conn) as c:
c.execute(queries.remove_schedule, [schedule_id])