Order Sets - Create

This commit is contained in:
Johnny Gear 2026-01-30 10:52:32 -06:00
parent 3c7a2ce3e5
commit 183c2c4c3b
5 changed files with 90 additions and 32 deletions

View file

@ -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'

View file

@ -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/<username>/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/<username>/sets/<set_id>', 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())

View file

@ -59,12 +59,15 @@ export const SubOrderSet: React.FC = () => {
const { username, set_id } = useParams();
const orderSet = useLoaderData<OrderSet>();
const [showScheduling, setShowScheduling] = React.useState(
orderSet.scheduled,
orderSet?.scheduled,
);
const form = useForm<FormOrderSet>({
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 (
<Container pb="xl">
<Box mb="lg">
<Title order={1}>{orderSet.name}</Title>
<Title order={1}>{orderSet?.name || "New Order Set"}</Title>
<Link to={`/dashboard/subs/${username}`}>Return to {username}</Link>
</Box>
<form id="order-set" onSubmit={handleSubmit}>

View file

@ -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}
</Flex>
<NavigateButton to={`/dashboard/subs/${sub_username}/new`}>
<IconPlus style={{ marginRight: "0.5rem" }} />
New
</NavigateButton>
</Container>
);
};

View file

@ -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,