gear-orders/db/models.py

275 lines
6.9 KiB
Python
Raw Normal View History

2026-03-07 00:33:08 +00:00
import pytz
import datetime
2025-11-14 04:03:21 +00:00
from peewee import *
2026-03-06 01:48:04 +00:00
from settings import SQLITE_DB, MASTODON_INSTANCE
2026-03-07 00:33:08 +00:00
from util import sqlite_time
2025-11-14 04:03:21 +00:00
database = SqliteDatabase(SQLITE_DB)
class BaseModel(Model):
class Meta:
database = database
2026-03-05 17:55:33 +00:00
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'
2026-01-09 22:33:38 +00:00
class User(BaseModel):
telegram_username = TextField(unique=True)
telegram_chat_id = IntegerField()
2026-01-30 20:58:37 +00:00
telegram_photo_url = TextField(null=True)
2026-01-09 22:33:38 +00:00
2026-03-05 17:55:33 +00:00
mastodon_server = ForeignKeyField(
MastodonServer,
column_name='mastodon_server_id',
field='id',
null=True,
)
mastodon_username = TextField(null=True)
mastodon_access_token = TextField(null=True)
2026-03-05 19:46:44 +00:00
mastodon_attn_list = TextField(null=True)
mastodon_post_public = BooleanField(null=True, default=False)
2026-03-30 21:18:30 +00:00
verify_mastodon_alt_text = BooleanField(null=False, default=False)
2026-03-14 21:17:41 +00:00
verify_mastodon_favorite = BooleanField(null=False, default=False)
verify_delay = IntegerField(null=True)
2026-04-23 17:35:12 +00:00
permission_orders_pools_view = BooleanField(null=False, default=True)
permission_orders_pools_details = BooleanField(null=False, default=True)
permission_orders_pools_edit = BooleanField(null=False, default=True)
2026-03-06 01:48:04 +00:00
def mastodon_account(self):
2026-03-07 17:00:49 +00:00
if self.mastodon_server is None or self.mastodon_username is None:
return
elif self.mastodon_server.name == MASTODON_INSTANCE:
2026-03-06 03:47:39 +00:00
return self.mastodon_username
2026-03-06 01:48:04 +00:00
else:
2026-03-06 03:47:39 +00:00
return f"{self.mastodon_username}@{self.mastodon_server}"
def mastodon_visibility(self):
return 'public' if self.mastodon_post_public else 'direct'
2026-03-06 01:48:04 +00:00
2026-03-08 02:28:07 +00:00
def __str__(self):
return self.telegram_username
2026-01-09 22:33:38 +00:00
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),
)
2026-03-05 17:55:33 +00:00
#
# Order Configuration
#
2026-01-09 22:33:38 +00:00
class OrdersPool(BaseModel):
name = TextField()
2026-01-10 03:44:55 +00:00
user = ForeignKeyField(column_name='user_id', field='id', model=User, backref='orders_pools')
2026-01-30 00:36:06 +00:00
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)
2026-03-05 03:01:35 +00:00
punishment_pool = ForeignKeyField(
'self',
column_name='punishment_pool_id',
field='id',
backref='punishments_for',
null=True
)
2026-03-08 00:37:59 +00:00
updated_at = DateTimeField(null=False)
2026-03-07 00:33:08 +00:00
2026-01-30 16:52:32 +00:00
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,
2026-03-05 03:01:35 +00:00
'punishment_pool_id': self.punishment_pool_id,
2026-01-30 16:52:32 +00:00
'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]
}
2026-03-07 00:33:08 +00:00
def save(self, *args, **kwargs):
self.updated_at = sqlite_time(datetime.datetime.now(datetime.UTC))
return super(OrdersPool, self).save(*args, **kwargs)
def __str__(self):
return f"{self.name}[{self.user.telegram_username}]"
2026-01-09 22:33:38 +00:00
class Meta:
table_name = 'orders_pool'
class Order(BaseModel):
name = TextField()
weight = IntegerField()
repeat = FloatField()
2026-01-10 03:44:55 +00:00
pool = ForeignKeyField(column_name='orders_pool_id', field='id', model=OrdersPool, backref='orders')
2026-01-09 22:33:38 +00:00
class Meta:
table_name = 'order'
2026-01-29 21:47:06 +00:00
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'
2026-01-09 22:33:38 +00:00
#
# Order State
#
2025-11-14 04:03:21 +00:00
class OrderStatus(BaseModel):
2026-03-07 00:33:08 +00:00
confirmed_at = DateTimeField(null=True)
created_at = DateTimeField()
due_at = DateTimeField(null=True)
2026-03-14 21:17:41 +00:00
verify_at = DateTimeField(null=True)
2025-11-14 04:03:21 +00:00
mastodon_id = TextField()
text = TextField()
2026-03-04 23:33:17 +00:00
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
)
2026-03-05 03:01:35 +00:00
punishment_for = ForeignKeyField(
'self',
column_name='punishment_for_id',
field='id',
backref='punishment',
null=True
)
2026-03-04 23:33:17 +00:00
2026-04-14 02:20:46 +00:00
def __str__(self):
return f"{self.pool} {self.id}"
2025-11-14 04:03:21 +00:00
class Meta:
table_name = 'order_status'
class Repeat(BaseModel):
count = IntegerField(default=0)
orders = TextField()
probability = FloatField()
2026-03-04 23:33:17 +00:00
orders_pool = ForeignKeyField(
column_name='orders_pool_id',
field='id',
model=OrdersPool,
null=False,
unique=True,
backref='repeat'
)
2025-11-14 04:03:21 +00:00
class Meta:
table_name = 'repeat'
class SkipDay(BaseModel):
date = DateField(unique=True)
2026-03-06 02:16:31 +00:00
user = ForeignKeyField(
User,
column_name='user_id',
field='id',
null=False,
backref='skip_days'
)
2026-03-19 17:38:17 +00:00
pool = ForeignKeyField(
column_name='orders_pool_id',
field='id',
model=OrdersPool,
backref='skip_days',
null=True
)
2025-11-14 04:03:21 +00:00
class Meta:
table_name = 'skip_day'
2026-03-08 02:28:07 +00:00
class TimelineEvent(BaseModel):
updated_at = DateTimeField(null=False)
type = TextField(null=False)
text = TextField(null=False)
extra = TextField(null=True)
user = ForeignKeyField(
User,
column_name='user_id',
field='id',
null=False,
backref="timeline_events"
)
2026-03-10 02:39:32 +00:00
actor = ForeignKeyField(
User,
column_name='actor_user_id',
field='id',
null=True,
backref="timeline_events_actor"
)
2026-03-08 02:28:07 +00:00
orders_pool = ForeignKeyField(
OrdersPool,
column_name='orders_pool_id',
field='id',
2026-03-08 19:08:03 +00:00
null=True,
2026-03-08 02:28:07 +00:00
backref="timeline_events"
)
order_status = ForeignKeyField(
OrderStatus,
column_name='order_status_id',
field='id',
null=True,
backref="timeline_events"
)
class Meta:
table_name = 'timeline_event'