diff --git a/api/core.py b/api/core.py index 392c48b..4184663 100644 --- a/api/core.py +++ b/api/core.py @@ -26,11 +26,13 @@ def create_app(config_name="config"): return response # register resources - from api.resources import server, designers, categories, prices + from api.resources import server, designers, categories, prices, orders, order_rows app.register_blueprint(server.mod) app.register_blueprint(designers.mod) app.register_blueprint(categories.mod) app.register_blueprint(prices.mod) + app.register_blueprint(orders.mod) + app.register_blueprint(order_rows.mod) return app diff --git a/api/models/__init__.py b/api/models/__init__.py index e005499..c565c8b 100644 --- a/api/models/__init__.py +++ b/api/models/__init__.py @@ -5,3 +5,4 @@ from .category import Category from .contract_customer import ContractCustomer from .inquiry import Inquiry from .product import Material, Product +from .order import Order, OrderField, OrderRow, OrderRowField, OrderRowDetail, OrderOrderField diff --git a/api/models/order.py b/api/models/order.py new file mode 100644 index 0000000..0434ed8 --- /dev/null +++ b/api/models/order.py @@ -0,0 +1,109 @@ +# coding=UTF-8 + +from datetime import datetime +from api.extensions import db +from flask_sqlalchemy import BaseQuery + + +class Order(db.Model): + __tablename__ = "order-orders" + id = db.Column("orderid", db.Integer, primary_key=True) + inserted = db.Column(db.DateTime, default=datetime.utcnow, nullable=False) + updated = db.Column(db.DateTime) + + fields = db.relationship("OrderOrderField", backref="order", lazy="dynamic") + rows = db.relationship("OrderRow", backref="order", lazy="dynamic") + + +class OrderFieldQuery(BaseQuery): + def by_name(self, name): + return self.filter( + OrderField.name==name + ).first() + + +class OrderField(db.Model): + __tablename__ = "order-fields" + + query_class = OrderFieldQuery + + id = db.Column("fieldid", db.Integer, primary_key=True) + name = db.Column(db.String) + inserted = db.Column(db.DateTime, default=datetime.utcnow, nullable=False) + + +class OrderOrderField(db.Model): + __tablename__ = "order-orders_fields" + + orderid = db.Column( + db.Integer, db.ForeignKey("order-orders.orderid"), nullable=False + ) + fieldid = db.Column( + db.Integer, db.ForeignKey("order-fields.fieldid"), nullable=False + ) + value = db.Column(db.String, nullable=False) + inserted = db.Column(db.DateTime, default=datetime.utcnow, nullable=False) + updated = db.Column(db.DateTime) + + field = db.relationship("OrderField", uselist=False) + + __table_args__ = (db.PrimaryKeyConstraint(orderid, fieldid),) + + def to_json(self): + return { + "orderid": self.orderid, + "fieldid": self.fieldid, + "value": self.value, + "inserted": self.inserted + } + + +class OrderRow(db.Model): + __tablename__ = "order-rows" + + id = db.Column("rowid", db.Integer, primary_key=True) + orderid = db.Column( + db.Integer, db.ForeignKey("order-orders.orderid"), nullable=False + ) + details = db.relationship("OrderRowDetail", backref="OrderRow", lazy="dynamic") + + +class OrderRowFieldQuery(BaseQuery): + def by_name(self, name): + return self.filter( + OrderRowField.name==name + ).first() + +class OrderRowField(db.Model): + __tablename__ = "order-row_fields" + + query_class = OrderRowFieldQuery + + id = db.Column("fieldid", db.Integer, primary_key=True, nullable=False) + name = db.Column(db.String) + inserted = db.Column(db.DateTime, default=datetime.utcnow, nullable=False) + updated = db.Column(db.DateTime) + + +class OrderRowDetail(db.Model): + __tablename__ = "order-rows_details" + + rowid = db.Column(db.Integer, db.ForeignKey("order-rows.rowid"), nullable=False) + fieldid = db.Column( + db.Integer, db.ForeignKey("order-row_fields.fieldid"), nullable=False + ) + value = db.Column(db.String) + inserted = db.Column(db.DateTime, default=datetime.utcnow, nullable=False) + updated = db.Column(db.DateTime) + + field = db.relationship("OrderRowField", uselist=False) + + __table_args__ = (db.PrimaryKeyConstraint(rowid, fieldid),) + + def to_json(self): + return { + "rowid": self.rowid, + "fieldid": self.fieldid, + "value": self.value, + "inserted": self.inserted, + } diff --git a/api/resources/order_rows.py b/api/resources/order_rows.py new file mode 100644 index 0000000..e0e6120 --- /dev/null +++ b/api/resources/order_rows.py @@ -0,0 +1,24 @@ +from flask import Blueprint, jsonify, abort, request +from api import db +from api.helpers import check_api_key +from api.models import OrderRow, OrderRowField, OrderRowDetail + +mod = Blueprint("order_rows", __name__, url_prefix="/order-rows") + +mod.before_request(check_api_key) + + +@mod.route("//pwinty_image_id", methods=["POST"]) +def save_pwinty_image_id(row_id): + data = request.json + row = OrderRow.query.get_or_404(row_id) + field = OrderRowField.query.filter_by(name="pwinty_image_id").first() + detail = row.details.filter_by(fieldid=field.id).first() + if not detail: + detail = OrderRowDetail(rowid=row.id, fieldid=field.id) + + setattr(detail, "value", data["value"]) + db.session.add(detail) + db.session.commit() + + return jsonify(detail.to_json()) diff --git a/api/resources/orders.py b/api/resources/orders.py new file mode 100644 index 0000000..799dbef --- /dev/null +++ b/api/resources/orders.py @@ -0,0 +1,24 @@ +from flask import Blueprint, jsonify, abort, request +from api import db +from api.helpers import check_api_key +from api.models import Order, OrderField, OrderOrderField + +mod = Blueprint("orders", __name__, url_prefix="/orders") + +mod.before_request(check_api_key) + + +@mod.route("//pwinty_id", methods=["POST"]) +def save_pwinty_id(order_id): + data = request.json + order = Order.query.get_or_404(order_id) + field = OrderField.query.by_name(name="pwinty_id") + order_field = order.fields.filter_by(fieldid=field.id).first() + if not order_field: + order_field = OrderOrderField(orderid=order.id, fieldid=field.id) + + setattr(order_field, "value", data["value"]) + db.session.add(order_field) + db.session.commit() + + return jsonify(order_field.to_json()) diff --git a/docs/README.md b/docs/README.md index 3d66933..06b6a98 100644 --- a/docs/README.md +++ b/docs/README.md @@ -7,6 +7,7 @@ Welcome to the documentation for Photowall API 2. * [Categories](categories.md) * [Designers](designers.md) * [Prices](prices.md) +* [Orders](orders.md) ## Authentication @@ -37,4 +38,4 @@ The response will contain a pagination object with the following attributes: * `per_page` The number of items to be displayed on a page * `has_next` True if a next page exists * `has_prev` True if a previous page exists -* `total` The total number of items \ No newline at end of file +* `total` The total number of items diff --git a/docs/orders.md b/docs/orders.md new file mode 100644 index 0000000..d4716e9 --- /dev/null +++ b/docs/orders.md @@ -0,0 +1,13 @@ +# Orders + +## Update pwinty_id + +``` +curl -X POST https://api2.photowall.com/orders/1/pwinty_id -H "Content-Type: application/json" -d '{"value": 123}' +``` + +## Update pwinty_image_id + +``` +curl -X POST https://api2.photowall.com/order-rows/1/pwinty_image_id -H "Content-Type: application/json" -d '{"value": 123}' +```