diff --git a/db/models.py b/db/models.py index 8adbda0..091bca6 100644 --- a/db/models.py +++ b/db/models.py @@ -40,6 +40,14 @@ class OrdersPool(BaseModel): 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, @@ -50,6 +58,7 @@ class OrdersPool(BaseModel): '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, @@ -90,19 +99,10 @@ class OrderAddOn(BaseModel): # # Order State # -class PunishmentStatus(BaseModel): - confirmed_at = DateTimeField(null=True) # TIMESTAMP - created_at = DateTimeField() # TIMESTAMP - mastodon_id = TextField() - text = TextField() - - class Meta: - table_name = 'punishment_status' - class OrderStatus(BaseModel): confirmed_at = DateTimeField(null=True) # TIMESTAMP created_at = DateTimeField() # TIMESTAMP - due_at = DateTimeField() # TIMESTAMP + due_at = DateTimeField(null=True) # TIMESTAMP mastodon_id = TextField() text = TextField() @@ -121,6 +121,14 @@ class OrderStatus(BaseModel): 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' diff --git a/db/queries.py b/db/queries.py index 952a6e5..ee7d607 100644 --- a/db/queries.py +++ b/db/queries.py @@ -1,14 +1,13 @@ import datetime -from .models import database, User, OrdersPool, DomSubUsers, Repeat, SkipDay, OrderStatus, PunishmentStatus +from .models import database, User, OrdersPool, DomSubUsers, Repeat, SkipDay, OrderStatus def initdb(): database.connect() database.create_tables([ Repeat, SkipDay, - OrderStatus, - PunishmentStatus + OrderStatus ]) def user_add(username, chat_id): @@ -90,24 +89,20 @@ def skip_day_contains(date): q = SkipDay.select().where(SkipDay.date == date) return len(q) > 0 -def order_status_put(orders_pool, user, mastodon_id, created_at, due_at, text): +def order_status_put(orders_pool, user, mastodon_id, created_at, due_at, text, punishment_for=None): return OrderStatus.create( orders_pool_id=orders_pool.id, user_id=user.id, mastodon_id=mastodon_id, created_at=created_at, due_at=due_at, - text=text + text=text, + punishment_for=punishment_for ) def order_status_by_id(order_status_id): return OrderStatus.get(id=order_status_id) -def order_status_outstanding(): - return OrderStatus.select().where( - (OrderStatus.confirmed_at.is_null()) & (OrderStatus.punishment_id.is_null()) - ) - def order_status_confirm(id, confirmed_at): q = OrderStatus.update( confirmed_at=confirmed_at @@ -115,17 +110,3 @@ def order_status_confirm(id, confirmed_at): OrderStatus.id == id ) return q.execute() - -def punishment_status_put(order_status_id, mastodon_id, created_at, text): - punishment_status = PunishmentStatus.create( - mastodon_id=mastodon_id, - created_at=created_at, - text=text - ) - - q = OrderStatus.update( - punishment_id=punishment_status.id - ).where( - OrderStatus.id == order_status_id - ) - q.execute() diff --git a/flask/api.py b/flask/api.py index d6cd334..8d074b3 100644 --- a/flask/api.py +++ b/flask/api.py @@ -152,6 +152,14 @@ def sub_order_set(username, set_id, sub): try: op.name = request.json['name'] + if ('punishment_pool_id' in request.json and + request.json['punishment_pool_id'] in [ + op.id for op in orders_pool_list(sub.id) + ]): + op.punishment_pool_id = request.json['punishment_pool_id'] + else: + op.punishment_pool_id = None + op.scheduled = request.json['scheduled'] if op.scheduled: op.probability = request.json['probability'] @@ -198,4 +206,14 @@ def sub_order_set(username, set_id, sub): op.delete_instance(recursive=True) return ('', 204) - return jsonify(op.to_dict()) + return jsonify({ + "orderSets": [ + { + 'id': op.id, + 'name': op.name, + } + for op + in orders_pool_list(sub.id) + ], + "orderSet": op.to_dict() + }) diff --git a/flask/vite/src/OrderSet.tsx b/flask/vite/src/OrderSet.tsx index bd4d3e6..39be9d5 100644 --- a/flask/vite/src/OrderSet.tsx +++ b/flask/vite/src/OrderSet.tsx @@ -15,6 +15,7 @@ import { Collapse, NumberInput, Text, + Select, } from "@mantine/core"; import { notifications } from "@mantine/notifications"; import { TimeInput } from "@mantine/dates"; @@ -68,24 +69,41 @@ type FormOrderSetOrder = Omit & { add_ons: FormOrderSetOrderAddOn[]; }; -type FormOrderSet = Omit & { +type FormOrderSet = Omit & { orders: FormOrderSetOrder[]; + punishment_pool_id?: string | number; }; export const OrderSet: React.FC = () => { const navigate = useNavigate(); const { username, set_id } = useParams(); - const orderSet = useLoaderData(); + const { orderSets, orderSet } = useLoaderData<{ + orderSets: Pick[]; + orderSet: OrderSet; + }>(); const [showScheduling, setShowScheduling] = React.useState( orderSet?.scheduled, ); + const punishmentOptions = React.useMemo( + () => + orderSets.map(({ id, name }) => ({ id, value: `${id}`, label: name })), + [orderSets], + ); + const form = useForm>({ mode: "uncontrolled", - initialValues: orderSet ?? { - scheduled: false, - orders: [], - }, + initialValues: orderSet + ? { + ...orderSet, + punishment_pool_id: orderSet.punishment_pool_id + ? `${orderSet.punishment_pool_id}` + : undefined, + } + : { + scheduled: false, + orders: [], + }, validate: { name: (value: string) => value.length < 1 ? "Please enter a name" : null, @@ -105,12 +123,22 @@ export const OrderSet: React.FC = () => { value.length < 1 ? "Please enter a name" : null, }, }, + punishment_pool_id: (value: string) => + !value || orderSets.some(({ id }) => id === Number(value)) + ? null + : "Please select a valid pool", }, onValuesChange: (values) => { if (values.scheduled !== showScheduling) { setShowScheduling(values.scheduled); } }, + transformValues: (values) => ({ + ...values, + punishment_pool_id: values.punishment_pool_id + ? Number(values.punishment_pool_id) + : undefined, + }), }); const handleSubmit = React.useCallback( @@ -235,6 +263,13 @@ export const OrderSet: React.FC = () => { /> +