gear-orders/db/models.py
2026-03-05 11:55:33 -06:00

175 lines
4.3 KiB
Python

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'