gear-orders/flask/api.py

145 lines
4 KiB
Python
Raw Normal View History

2026-01-29 21:30:51 +00:00
from flask import Blueprint, jsonify, abort, request
2026-01-10 03:44:55 +00:00
from flask_login import current_user
2026-01-29 21:47:06 +00:00
from db.models import database, Order, OrderAddOn
2026-01-29 21:30:51 +00:00
from db.queries import user_get, domsubusers_list, orders_pool_list, orders_pool
2026-01-10 03:44:55 +00:00
api = Blueprint('api', __name__)
@api.route('/subs')
def subs():
return jsonify(
[
{"sub_username": dsu.sub.telegram_username}
for dsu
in domsubusers_list(current_user.db_user)
]
)
2026-01-29 21:30:51 +00:00
@api.route('/subs/<username>/sets')
def sub_order_sets(username):
2026-01-10 03:44:55 +00:00
try:
sub = user_get(username)
except:
2026-01-29 21:30:51 +00:00
abort(403)
2026-01-10 03:44:55 +00:00
return
if sub.telegram_username not in [dsu.sub.telegram_username for dsu in domsubusers_list(current_user.db_user)]:
2026-01-29 21:30:51 +00:00
abort(403)
2026-01-10 03:44:55 +00:00
return
return jsonify([
2026-01-29 21:30:51 +00:00
{
'id': op.id,
'name': op.name,
}
for op
in orders_pool_list(sub.id)
])
@api.route('/subs/<username>/sets/<set_id>', methods = ['GET', 'POST'])
def sub_order_set(username, set_id):
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
op = orders_pool(sub.id, set_id)
if request.method == 'POST':
2026-01-29 21:47:06 +00:00
def update_add_ons(order, add_ons):
for updated_add_on in add_ons:
if isinstance(updated_add_on['id'], int):
add_on_to_update = order.add_ons.where(OrderAddOn.id == updated_add_on['id']).get()
if '_delete' in updated_add_on:
add_on_to_update.delete_instance(recursive=True)
else:
add_on_to_update.name = updated_add_on['name']
add_on_to_update.probability = updated_add_on['probability']
add_on_to_update.save()
else:
OrderAddOn.create(
order=order,
name=updated_add_on['name'],
probability=updated_add_on['probability']
)
2026-01-29 21:30:51 +00:00
with database.atomic() as transaction:
try:
op.name = request.json['name']
2026-01-30 00:36:06 +00:00
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
2026-01-29 21:30:51 +00:00
op.save()
for updated_order in request.json['orders']:
if isinstance(updated_order['id'], int):
order_to_update = op.orders.where(Order.id == updated_order['id']).get()
if '_delete' in updated_order:
order_to_update.delete_instance(recursive=True)
else:
order_to_update.name = updated_order['name']
order_to_update.weight = updated_order['weight']
order_to_update.repeat = updated_order['repeat']
order_to_update.save()
2026-01-29 21:47:06 +00:00
update_add_ons(order_to_update, updated_order['add_ons'])
2026-01-29 21:30:51 +00:00
else:
2026-01-29 22:23:20 +00:00
order_to_update = Order.create(
2026-01-29 21:30:51 +00:00
pool=op,
name=updated_order['name'],
weight=updated_order['weight'],
repeat=updated_order['repeat']
)
2026-01-29 21:47:06 +00:00
update_add_ons(order_to_update, updated_order['add_ons'])
2026-01-29 21:30:51 +00:00
except:
transaction.rollback()
2026-01-29 21:47:06 +00:00
abort(500)
2026-01-29 21:30:51 +00:00
return jsonify(
2026-01-10 03:44:55 +00:00
{
'id': op.id,
'name': op.name,
2026-01-30 00:36:06 +00:00
'scheduled': op.scheduled,
'probability': op.probability,
'weekdays': op.weekdays,
'weekends': op.weekends,
'time': op.time,
'confirm_delay': op.confirm_delay,
2026-01-10 03:44:55 +00:00
'orders': [{
'id': order.id,
'name': order.name,
'weight': order.weight,
2026-01-29 21:30:51 +00:00
'repeat': order.repeat,
'add_ons': [
{
2026-01-29 21:47:06 +00:00
'id': add_on.id,
'name': add_on.name,
'probability': add_on.probability
} for add_on in order.add_ons
2026-01-29 21:30:51 +00:00
]
2026-01-10 03:44:55 +00:00
} for order in op.orders]
}
2026-01-29 21:30:51 +00:00
)