diff --git a/peewee_test.py b/peewee_test.py new file mode 100644 index 0000000..3430a55 --- /dev/null +++ b/peewee_test.py @@ -0,0 +1,99 @@ +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(True if m else False) + return bit_list + + @repeat.setter + def repeat(self, bit_list): + if len(bit_list) != 7: + raise ValueError(f"Given list is of length {len(bit_list)} " + f"instead of 7") + reduced = 0 + for i, b in enumerate(bit_list): + reduced += (1 if b else 0) * 2**i + self._repeat = reduced + self.save() + + +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=127, + ).save() + + Event(name='test event 2', + start_date=datetime.now(), + stop_date=datetime.now()+timedelta(days=2), + schedule=s2, + _repeat=1, + ).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}") \ No newline at end of file