from flask import Blueprint, jsonify, abort, request from flask_login import current_user from db.models import database, Order, OrderAddOn from db.queries import user_get, domsubusers_list, orders_pool_list, orders_pool 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) ] ) @api.route('/subs//sets') def sub_order_sets(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 return jsonify([ { 'id': op.id, 'name': op.name, 'scheduled': op.scheduled, 'time': op.time, 'weekends': op.weekends, 'weekdays': op.weekdays, 'orders': [{ 'id': order.id, } for order in op.orders] } for op in orders_pool_list(sub.id) ]) @api.route('/subs//sets/', 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': 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'] ) 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']: 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() update_add_ons(order_to_update, updated_order['add_ons']) else: order_to_update = Order.create( pool=op, name=updated_order['name'], weight=updated_order['weight'], repeat=updated_order['repeat'] ) update_add_ons(order_to_update, updated_order['add_ons']) except: 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] } )