100 lines
2.9 KiB
Python
100 lines
2.9 KiB
Python
from peewee import *
|
|
|
|
|
|
db = SqliteDatabase(':memory:')
|
|
|
|
class BaseModel(Model):
|
|
class Meta:
|
|
database = db
|
|
|
|
|
|
class Schedule(BaseModel):
|
|
name = TextField()
|
|
description = TextField(null=True)
|
|
priority = IntegerField(default=0)
|
|
|
|
def add_step(self, s_time, s_target, s_comment=None):
|
|
Step.create(time=s_time,
|
|
target=s_target,
|
|
comment=s_comment,
|
|
schedule=self,
|
|
)
|
|
|
|
|
|
class Step(BaseModel):
|
|
time = TimeField()
|
|
target = FloatField()
|
|
comment = TextField(null=True)
|
|
schedule = ForeignKeyField(Schedule, backref='steps')
|
|
|
|
|
|
class Event(BaseModel):
|
|
name = TextField()
|
|
description = TextField(null=True)
|
|
start_date = DateField()
|
|
stop_date = DateField(null=True)
|
|
_repeat = SmallIntegerField()
|
|
schedule = ForeignKeyField(Schedule, backref='events')
|
|
|
|
@property
|
|
def repeat(self):
|
|
bit_list = []
|
|
r = self._repeat
|
|
for _ in range(7):
|
|
r, m = divmod(r, 2)
|
|
bit_list.append(bool(m))
|
|
return bit_list
|
|
|
|
@repeat.setter
|
|
def repeat(self, bit_list):
|
|
self._repeat = int_from_list(bit_list)
|
|
self.save()
|
|
|
|
|
|
def int_from_list(bit_list):
|
|
if len(bit_list) != 7:
|
|
raise ValueError(f"Given list is of length {len(bit_list)} instead of 7")
|
|
reduced = 0
|
|
for i, b in enumerate(bit_list):
|
|
reduced += b * 2**i
|
|
return reduced
|
|
|
|
|
|
if __name__ == "__main__":
|
|
from datetime import datetime, date, time, timedelta
|
|
|
|
db.create_tables([Schedule, Step, Event])
|
|
|
|
s1 = Schedule.create(name='semaine', description='Les jours de semaine')
|
|
[s1.add_step(hr, 18.5) for hr in [time(i) for i in range(10)]]
|
|
|
|
s2 = Schedule.create(name='weekend', description='Les jours de weekend')
|
|
[s2.add_step(hr, 20.0) for hr in [time(i) for i in range(14)]]
|
|
|
|
schedules = Schedule.select()
|
|
for schedule in schedules:
|
|
print(f"Schedule '{schedule.name}' has {len(schedule.steps)} step(s).")
|
|
|
|
schedules[0].steps[0].target = 22.0
|
|
schedules[0].steps[0].save()
|
|
|
|
Event.create(name='test event',
|
|
start_date=datetime.now(),
|
|
schedule=s1,
|
|
_repeat=int_from_list([True for _ in range(7)]),
|
|
)
|
|
|
|
Event.create(name='test event 2',
|
|
start_date=datetime.now(),
|
|
stop_date=datetime.now()+timedelta(days=2),
|
|
schedule=s2,
|
|
_repeat=int_from_list([True] + [False for _ in range(6)]),
|
|
)
|
|
|
|
events = Event.select()
|
|
for event in events:
|
|
str_stop = ""
|
|
if event.stop_date:
|
|
str_stop = f", stops it on {event.stop_date}"
|
|
print(f"Event '{event.name}' starts schedule '{event.schedule.name}'",
|
|
f"on {event.start_date}{str_stop}") |