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(time=s_time, target=s_target, comment=s_comment, schedule=self, ).save() 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(name='semaine', description='Les jours de semaine') s1.save() [s1.add_step(hr, 18.5) for hr in [time(i) for i in range(10)]] s2 = Schedule(name='weekend', description='Les jours de weekend') s2.save() [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(name='test event', start_date=datetime.now(), schedule=s1, _repeat=int_from_list([True for _ in range(7)]), ).save() Event(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)]), ).save() 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}")