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}"
|
2026-03-30 20:30:21 +00:00
|
|
|
|
|
|
|
|
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'
|