diff --git a/db/models.py b/db/models.py index c0bb329..5e966cf 100644 --- a/db/models.py +++ b/db/models.py @@ -45,6 +45,15 @@ class Order(BaseModel): class Meta: table_name = 'order' +class OrderAddOn(BaseModel): + name = TextField() + probability = FloatField() + + order = ForeignKeyField(column_name='order_id', field='id', model=Order, backref='add_ons') + + class Meta: + table_name = 'order_add_on' + # # Order State # diff --git a/flask/api.py b/flask/api.py index fc00969..fd32bc1 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 +from db.models import database, Order, OrderAddOn from db.queries import user_get, domsubusers_list, orders_pool_list, orders_pool api = Blueprint('api', __name__) @@ -51,6 +51,25 @@ def sub_order_set(username, set_id): 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'] @@ -68,6 +87,8 @@ def sub_order_set(username, set_id): order_to_update.repeat = updated_order['repeat'] order_to_update.save() + + update_add_ons(order_to_update, updated_order['add_ons']) else: Order.create( pool=op, @@ -75,8 +96,11 @@ def sub_order_set(username, set_id): 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( { @@ -89,17 +113,11 @@ def sub_order_set(username, set_id): 'repeat': order.repeat, 'add_ons': [ { - 'id': 1, - 'name': 'Leg Shackles', - 'probability': 0.9 - }, - { - 'id': 2, - 'name': 'Leather Collar', - 'probability': 0.5 - } + 'id': add_on.id, + 'name': add_on.name, + 'probability': add_on.probability + } for add_on in order.add_ons ] } for order in op.orders] } ) - diff --git a/migrations/002_add_order_add_on.py b/migrations/002_add_order_add_on.py new file mode 100644 index 0000000..8324367 --- /dev/null +++ b/migrations/002_add_order_add_on.py @@ -0,0 +1,54 @@ +"""Peewee migrations -- 002_add_order_add_on.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.create_model + class OrderAddOn(pw.Model): + id = pw.AutoField() + name = pw.TextField() + probability = pw.FloatField() + order = pw.ForeignKeyField(column_name='order_id', field='id', model=migrator.orm['order']) + + class Meta: + table_name = "order_add_on" + + +def rollback(migrator: Migrator, database: pw.Database, *, fake=False): + """Write your rollback migrations here.""" + + migrator.remove_model('order_add_on')