From 183c2c4c3b8993bf809b44c7c7dbf2ca29099a80 Mon Sep 17 00:00:00 2001 From: Johnny Gear Date: Fri, 30 Jan 2026 10:52:32 -0600 Subject: [PATCH] Order Sets - Create --- db/models.py | 25 +++++++++++ flask/api.py | 76 +++++++++++++++++++++------------ flask/vite/src/SubOrderSet.tsx | 11 +++-- flask/vite/src/SubOrderSets.tsx | 6 ++- flask/vite/src/main.tsx | 4 ++ 5 files changed, 90 insertions(+), 32 deletions(-) diff --git a/db/models.py b/db/models.py index ea8e53b..02a76f2 100644 --- a/db/models.py +++ b/db/models.py @@ -39,6 +39,31 @@ class OrdersPool(BaseModel): time = TextField(null=True) confirm_delay = IntegerField(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, + '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' diff --git a/flask/api.py b/flask/api.py index de1853d..bf01479 100644 --- a/flask/api.py +++ b/flask/api.py @@ -1,6 +1,6 @@ from flask import Blueprint, jsonify, abort, request from flask_login import current_user -from db.models import database, Order, OrderAddOn +from db.models import database, OrdersPool, Order, OrderAddOn from db.queries import user_get, domsubusers_list, orders_pool_list, orders_pool api = Blueprint('api', __name__) @@ -26,7 +26,7 @@ def sub_order_sets(username): if sub.telegram_username not in [dsu.sub.telegram_username for dsu in domsubusers_list(current_user.db_user)]: abort(403) return - + return jsonify([ { 'id': op.id, @@ -43,6 +43,52 @@ def sub_order_sets(username): in orders_pool_list(sub.id) ]) +@api.route('/subs//sets/', methods=['POST']) +def sub_order_set_create(username): + try: + sub = user_get(username) + except: + abort(403) + return + + if sub.telegram_username not in [dsu.sub.telegram_username for dsu in domsubusers_list(current_user.db_user)]: + abort(403) + return + + # Create new + with database.atomic() as transaction: + try: + new_order_pool = OrdersPool.create( + user=sub, + name=request.json['name'], + scheduled=request.json['scheduled'], + probability=request.json['probability'] if 'probability' in request.json else None, + time=request.json['time'] if 'time' in request.json else None, + weekdays=request.json['weekdays'] if 'weekdays' in request.json else None, + weekends=request.json['weekends'] if 'weekends' in request.json else None, + confirm_delay=request.json['confirm_delay'] if 'confirm_delay' in request.json else None, + ) + + for order_to_create in request.json['orders']: + new_order = Order.create( + pool=new_order_pool, + name=order_to_create['name'], + weight=order_to_create['weight'], + repeat=order_to_create['repeat'] + ) + + for add_on_to_create in order_to_create['add_ons']: + OrderAddOn.create( + order=new_order, + name=add_on_to_create['name'], + probability=add_on_to_create['probability'] + ) + except: + transaction.rollback() + abort(500) + + return jsonify(new_order_pool.to_dict()) + @api.route('/subs//sets/', methods = ['GET', 'POST']) def sub_order_set(username, set_id): try: @@ -124,28 +170,4 @@ def sub_order_set(username, set_id): transaction.rollback() abort(500) - return jsonify( - { - 'id': op.id, - 'name': op.name, - 'scheduled': op.scheduled, - 'probability': op.probability, - 'weekdays': op.weekdays, - 'weekends': op.weekends, - 'time': op.time, - 'confirm_delay': op.confirm_delay, - '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 op.orders] - } - ) + return jsonify(op.to_dict()) diff --git a/flask/vite/src/SubOrderSet.tsx b/flask/vite/src/SubOrderSet.tsx index afdaf4b..ff46624 100644 --- a/flask/vite/src/SubOrderSet.tsx +++ b/flask/vite/src/SubOrderSet.tsx @@ -59,12 +59,15 @@ export const SubOrderSet: React.FC = () => { const { username, set_id } = useParams(); const orderSet = useLoaderData(); const [showScheduling, setShowScheduling] = React.useState( - orderSet.scheduled, + orderSet?.scheduled, ); const form = useForm({ mode: "uncontrolled", - initialValues: orderSet, + initialValues: orderSet ?? { + scheduled: false, + orders: [], + }, validate: { name: (value: string) => value.length < 1 ? "Please enter a name" : null, @@ -94,7 +97,7 @@ export const SubOrderSet: React.FC = () => { const handleSubmit = React.useCallback( form.onSubmit((values) => { - fetch(`/api/subs/${username}/sets/${set_id}`, { + fetch(`/api/subs/${username}/sets/${set_id || ""}`, { method: "POST", headers: { "Content-Type": "application/json", @@ -173,7 +176,7 @@ export const SubOrderSet: React.FC = () => { return ( - {orderSet.name} + {orderSet?.name || "New Order Set"} Return to {username}
diff --git a/flask/vite/src/SubOrderSets.tsx b/flask/vite/src/SubOrderSets.tsx index 55c7769..d15be00 100644 --- a/flask/vite/src/SubOrderSets.tsx +++ b/flask/vite/src/SubOrderSets.tsx @@ -8,7 +8,7 @@ import { Badge, } from "@mantine/core"; import { TimeValue } from "@mantine/dates"; -import { IconPencil } from "@tabler/icons-react"; +import { IconPencil, IconPlus } from "@tabler/icons-react"; import React from "react"; import { Params, useLoaderData, useParams, useNavigate } from "react-router"; @@ -90,6 +90,10 @@ export const SubOrderSets: React.FC = () => { ) : null} + + + New + ); }; diff --git a/flask/vite/src/main.tsx b/flask/vite/src/main.tsx index 362aaba..bed3924 100644 --- a/flask/vite/src/main.tsx +++ b/flask/vite/src/main.tsx @@ -56,6 +56,10 @@ const router = createBrowserRouter([ Component: SubOrderSets, loader: subOrderSetsLoader, }, + { + path: "dashboard/subs/:username/new", + Component: SubOrderSet, + }, { path: "dashboard/subs/:username/:set_id", Component: SubOrderSet,