from peewee import * from settings import SQLITE_DB database = SqliteDatabase(SQLITE_DB) class BaseModel(Model): class Meta: database = database class MastodonServer(BaseModel): name = TextField(unique=True, null=False) client_id = TextField(null=False) client_secret = TextField(null=False) class Meta: table_name = 'mastodon_server' class User(BaseModel): telegram_username = TextField(unique=True) telegram_chat_id = IntegerField() telegram_photo_url = TextField(null=True) mastodon_server = ForeignKeyField( MastodonServer, column_name='mastodon_server_id', field='id', null=True, ) mastodon_username = TextField(null=True) mastodon_access_token = TextField(null=True) class Meta: table_name = 'user' class DomSubUsers(BaseModel): dom = ForeignKeyField(column_name='dom_id', field='id', model=User) sub = ForeignKeyField(column_name='sub_id', field='id', model=User) class Meta: table_name = 'dom_sub' indexes = ( (('dom_id', 'sub_id'), True), ) # # Order Configuration # class OrdersPool(BaseModel): name = TextField() user = ForeignKeyField(column_name='user_id', field='id', model=User, backref='orders_pools') scheduled = BooleanField(default=False) probability = FloatField(null=True) weekdays = BooleanField(null=True) weekends = BooleanField(null=True) time = TextField(null=True) confirm_delay = IntegerField(null=True) punishment_pool = ForeignKeyField( 'self', column_name='punishment_pool_id', field='id', backref='punishments_for', null=True ) def to_dict(self): return { 'id': self.id, 'name': self.name, 'scheduled': self.scheduled, 'probability': self.probability, 'weekdays': self.weekdays, 'weekends': self.weekends, 'time': self.time, 'confirm_delay': self.confirm_delay, 'punishment_pool_id': self.punishment_pool_id, 'orders': [{ 'id': order.id, 'name': order.name, 'weight': order.weight, 'repeat': order.repeat, 'add_ons': [ { 'id': add_on.id, 'name': add_on.name, 'probability': add_on.probability } for add_on in order.add_ons ] } for order in self.orders] } class Meta: table_name = 'orders_pool' class Order(BaseModel): name = TextField() weight = IntegerField() repeat = FloatField() pool = ForeignKeyField(column_name='orders_pool_id', field='id', model=OrdersPool, backref='orders') class Meta: table_name = 'order' class OrderAddOn(BaseModel): name = TextField() probability = FloatField() order = ForeignKeyField(column_name='order_id', field='id', model=Order, backref='add_ons') class Meta: table_name = 'order_add_on' # # Order State # class OrderStatus(BaseModel): confirmed_at = DateTimeField(null=True) # TIMESTAMP created_at = DateTimeField() # TIMESTAMP due_at = DateTimeField(null=True) # TIMESTAMP mastodon_id = TextField() text = TextField() pool = ForeignKeyField( column_name='orders_pool_id', field='id', model=OrdersPool, backref='statuses', null=True ) user = ForeignKeyField( column_name='user_id', field='id', model=User, backref='statuses', null=False ) punishment_for = ForeignKeyField( 'self', column_name='punishment_for_id', field='id', backref='punishment', null=True ) class Meta: table_name = 'order_status' class Repeat(BaseModel): count = IntegerField(default=0) orders = TextField() probability = FloatField() orders_pool = ForeignKeyField( column_name='orders_pool_id', field='id', model=OrdersPool, null=False, unique=True, backref='repeat' ) class Meta: table_name = 'repeat' class SkipDay(BaseModel): date = DateField(unique=True) class Meta: table_name = 'skip_day'