From 0511e0f488e5d9df65d09214e36f389f43eaa8ce Mon Sep 17 00:00:00 2001 From: Johnny Gear Date: Thu, 29 Jan 2026 18:36:06 -0600 Subject: [PATCH] Save and edit order pool scheduling --- db/models.py | 7 +++ flask/api.py | 21 ++++++++ flask/vite/package.json | 1 + flask/vite/src/SubOrderSet.tsx | 67 ++++++++++++++++++++++++-- flask/vite/src/index.d.ts | 6 +++ flask/vite/src/main.tsx | 1 + migrations/003_add_order_scheduling.py | 54 +++++++++++++++++++++ 7 files changed, 154 insertions(+), 3 deletions(-) create mode 100644 migrations/003_add_order_scheduling.py diff --git a/db/models.py b/db/models.py index 5e966cf..ea8e53b 100644 --- a/db/models.py +++ b/db/models.py @@ -32,6 +32,13 @@ class OrdersPool(BaseModel): user = ForeignKeyField(column_name='user_id', field='id', model=User, backref='orders_pools') + 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) + class Meta: table_name = 'orders_pool' diff --git a/flask/api.py b/flask/api.py index 73f2c7f..9fb11a2 100644 --- a/flask/api.py +++ b/flask/api.py @@ -73,6 +73,21 @@ def sub_order_set(username, set_id): with database.atomic() as transaction: try: op.name = request.json['name'] + + op.scheduled = request.json['scheduled'] + if op.scheduled: + op.probability = request.json['probability'] + op.weekdays = request.json['weekdays'] + op.weekends = request.json['weekends'] + op.time = request.json['time'] + op.confirm_delay = request.json['confirm_delay'] + else: + op.probability = None + op.weekdays = None + op.weekends = None + op.time = None + op.confirm_delay = None + op.save() for updated_order in request.json['orders']: @@ -106,6 +121,12 @@ def sub_order_set(username, set_id): { '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, diff --git a/flask/vite/package.json b/flask/vite/package.json index 39f5510..f18324e 100644 --- a/flask/vite/package.json +++ b/flask/vite/package.json @@ -15,6 +15,7 @@ }, "dependencies": { "@mantine/core": "^8.3.12", + "@mantine/dates": "^8.3.13", "@mantine/form": "^8.3.13", "@mantine/notifications": "^8.3.13", "@tabler/icons-react": "^3.36.1", diff --git a/flask/vite/src/SubOrderSet.tsx b/flask/vite/src/SubOrderSet.tsx index 04aa6a9..afdaf4b 100644 --- a/flask/vite/src/SubOrderSet.tsx +++ b/flask/vite/src/SubOrderSet.tsx @@ -10,8 +10,14 @@ import { Title, Box, Affix, + Checkbox, + Chip, + Collapse, + NumberInput, + Text, } from "@mantine/core"; import { notifications } from "@mantine/notifications"; +import { TimeInput } from "@mantine/dates"; import { randomId } from "@mantine/hooks"; import { useForm } from "@mantine/form"; import React from "react"; @@ -51,14 +57,25 @@ type FormOrderSet = Omit & { export const SubOrderSet: React.FC = () => { const navigate = useNavigate(); const { username, set_id } = useParams(); - const { id, name, orders } = useLoaderData(); + const orderSet = useLoaderData(); + const [showScheduling, setShowScheduling] = React.useState( + orderSet.scheduled, + ); const form = useForm({ mode: "uncontrolled", - initialValues: { id, name, orders }, + initialValues: orderSet, validate: { name: (value: string) => value.length < 1 ? "Please enter a name" : null, + time: (value: string, values: FormOrderSet) => + values.scheduled && (!value || value.length < 1) + ? "Please set a time" + : null, + probability: (value: number, values: FormOrderSet) => + values.scheduled && (!value || value === 0.0) + ? "Please set a probability > 0" + : null, orders: { name: (value: string) => value.length < 1 ? "Please enter a name" : null, @@ -68,6 +85,11 @@ export const SubOrderSet: React.FC = () => { }, }, }, + onValuesChange: (values) => { + if (values.scheduled !== showScheduling) { + setShowScheduling(values.scheduled); + } + }, }); const handleSubmit = React.useCallback( @@ -151,11 +173,50 @@ export const SubOrderSet: React.FC = () => { return ( - {name} + {orderSet.name} Return to {username}
+ + + + + + + + + Weekdays + + + Weekends + + + + hours} + /> + + + Orders diff --git a/flask/vite/src/index.d.ts b/flask/vite/src/index.d.ts index 2405b77..2faef75 100644 --- a/flask/vite/src/index.d.ts +++ b/flask/vite/src/index.d.ts @@ -16,4 +16,10 @@ type OrderSet = { id: number; name: string; orders: OrderSetOrder[]; + scheduled: boolean; + probability: number; + weekdays: boolean; + weekends: boolean; + time: string; + confirm_delay: string; } diff --git a/flask/vite/src/main.tsx b/flask/vite/src/main.tsx index 475830d..362aaba 100644 --- a/flask/vite/src/main.tsx +++ b/flask/vite/src/main.tsx @@ -12,6 +12,7 @@ import { import { Notifications } from "@mantine/notifications"; import "@mantine/core/styles.css"; +import "@mantine/dates/styles.css"; import "@mantine/notifications/styles.css"; import { SubsList, subsListLoader } from "./SubsList"; diff --git a/migrations/003_add_order_scheduling.py b/migrations/003_add_order_scheduling.py new file mode 100644 index 0000000..c40423a --- /dev/null +++ b/migrations/003_add_order_scheduling.py @@ -0,0 +1,54 @@ +"""Peewee migrations -- 003_add_order_scheduling.py. + +Some examples (model - class or model name):: + + > Model = migrator.orm['table_name'] # Return model in current state by name + > Model = migrator.ModelClass # Return model in current state by name + + > migrator.sql(sql) # Run custom SQL + > migrator.run(func, *args, **kwargs) # Run python function with the given args + > migrator.create_model(Model) # Create a model (could be used as decorator) + > migrator.remove_model(model, cascade=True) # Remove a model + > migrator.add_fields(model, **fields) # Add fields to a model + > migrator.change_fields(model, **fields) # Change fields + > migrator.remove_fields(model, *field_names, cascade=True) + > migrator.rename_field(model, old_field_name, new_field_name) + > migrator.rename_table(model, new_table_name) + > migrator.add_index(model, *col_names, unique=False) + > migrator.add_not_null(model, *field_names) + > migrator.add_default(model, field_name, default) + > migrator.add_constraint(model, name, sql) + > migrator.drop_index(model, *col_names) + > migrator.drop_not_null(model, *field_names) + > migrator.drop_constraints(model, *constraints) + +""" + +from contextlib import suppress + +import peewee as pw +from peewee_migrate import Migrator + + +with suppress(ImportError): + import playhouse.postgres_ext as pw_pext + + +def migrate(migrator: Migrator, database: pw.Database, *, fake=False): + """Write your migrations here.""" + + migrator.add_fields( + 'orders_pool', + + scheduled=pw.BooleanField(default=False), + probability=pw.FloatField(null=True), + weekdays=pw.BooleanField(null=True), + weekends=pw.BooleanField(null=True), + time=pw.TextField(null=True), + confirm_delay=pw.IntegerField(null=True)) + + +def rollback(migrator: Migrator, database: pw.Database, *, fake=False): + """Write your rollback migrations here.""" + + migrator.remove_fields('orders_pool', 'scheduled', 'probability', 'weekdays', 'weekends', 'time', 'confirm_delay')