Finish API
This commit is contained in:
parent
8c635adcc7
commit
4bb70b207e
34
libdb.py
34
libdb.py
@ -6,7 +6,9 @@ Library for interacting with InvMan DB using SQLAlchemy
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
from configparser import ConfigParser
|
from configparser import ConfigParser
|
||||||
from sqlalchemy import create_engine, Column, String, Text, BigInteger, Float
|
from sqlalchemy import create_engine, Column
|
||||||
|
from sqlalchemy import String, Text, Date
|
||||||
|
from sqlalchemy import BigInteger, Integer, SmallInteger, Float
|
||||||
from sqlalchemy.ext.declarative import declarative_base
|
from sqlalchemy.ext.declarative import declarative_base
|
||||||
from sqlalchemy.orm import sessionmaker
|
from sqlalchemy.orm import sessionmaker
|
||||||
|
|
||||||
@ -74,3 +76,33 @@ class Brand(Base):
|
|||||||
|
|
||||||
name = Column(String(length=63), primary_key=True)
|
name = Column(String(length=63), primary_key=True)
|
||||||
description = Column(Text)
|
description = Column(Text)
|
||||||
|
|
||||||
|
|
||||||
|
class Unit(Base):
|
||||||
|
"""unit table"""
|
||||||
|
__tablename__ = 'unit'
|
||||||
|
|
||||||
|
name = Column(String(length=32), primary_key=True)
|
||||||
|
description = Column(Text)
|
||||||
|
|
||||||
|
|
||||||
|
class Purchase(Base):
|
||||||
|
"""purchase table"""
|
||||||
|
__tablename__ = 'purchase'
|
||||||
|
|
||||||
|
id = Column(Integer, primary_key=True)
|
||||||
|
product_upc = Column(String(length=32))
|
||||||
|
quantity = Column(SmallInteger)
|
||||||
|
date = Column(Date)
|
||||||
|
location = Column(String(length=32))
|
||||||
|
|
||||||
|
|
||||||
|
class Use(Base):
|
||||||
|
"""use table"""
|
||||||
|
__tablename__ = 'use'
|
||||||
|
|
||||||
|
id = Column(Integer, primary_key=True)
|
||||||
|
product_upc = Column(String(length=32))
|
||||||
|
quantity = Column(SmallInteger)
|
||||||
|
date = Column(Date)
|
||||||
|
location = Column(String(length=32))
|
||||||
|
177
webapi.py
177
webapi.py
@ -10,8 +10,7 @@ from flask import Flask, jsonify, request
|
|||||||
from flask_api import status
|
from flask_api import status
|
||||||
|
|
||||||
from sqlalchemy.orm.exc import NoResultFound
|
from sqlalchemy.orm.exc import NoResultFound
|
||||||
import sqlalchemy
|
from libdb import Session, Location, ProductQuantity, Product, Brand, Unit, Purchase, Use
|
||||||
from libdb import Session, Location, ProductQuantity, Product, Brand
|
|
||||||
|
|
||||||
|
|
||||||
app = Flask(__name__) # app is the Flask app
|
app = Flask(__name__) # app is the Flask app
|
||||||
@ -147,14 +146,102 @@ def api_get_brand_by_name(search):
|
|||||||
"""Route to get information about a location"""
|
"""Route to get information about a location"""
|
||||||
session = Session()
|
session = Session()
|
||||||
try:
|
try:
|
||||||
data = session.query(Brand.name, Brand.description). \
|
data = session.query(Brand.name, Brand.description).filter(
|
||||||
filter(Brand.name == search).one()
|
Brand.name == search).one()
|
||||||
except NoResultFound:
|
except NoResultFound:
|
||||||
return jsonify({'error': 'NO_RESULT_FOUND'}), status.HTTP_404_NOT_FOUND
|
return jsonify({'error': 'NO_RESULT_FOUND'}), status.HTTP_404_NOT_FOUND
|
||||||
data2 = {'name': data.name, 'description': data.description}
|
data2 = {'name': data.name, 'description': data.description}
|
||||||
return jsonify(data2)
|
return jsonify(data2)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/api/v1/units", methods=["GET"])
|
||||||
|
def api_list_units():
|
||||||
|
"""Route to list all units"""
|
||||||
|
session = Session()
|
||||||
|
try:
|
||||||
|
data = {}
|
||||||
|
for name, description in session.query(Unit.name, Unit.description).all():
|
||||||
|
data[name] = {'description': description}
|
||||||
|
return jsonify(data)
|
||||||
|
except NoResultFound:
|
||||||
|
return jsonify({'error': 'NO_RESULT_FOUND'}), status.HTTP_404_NOT_FOUND
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/api/v1/unit/name/<search>", methods=["GET"])
|
||||||
|
def api_get_unit_by_name(search):
|
||||||
|
"""Route to get information about a unit"""
|
||||||
|
session = Session()
|
||||||
|
try:
|
||||||
|
data = session.query(Unit.name, Unit.description).filter(
|
||||||
|
Unit.name == search).one()
|
||||||
|
except NoResultFound:
|
||||||
|
return jsonify({'error': 'NO_RESULT_FOUND'}), status.HTTP_404_NOT_FOUND
|
||||||
|
data2 = {'name': data.name, 'description': data.description}
|
||||||
|
return jsonify(data2)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/api/v1/purchases", methods=["GET"])
|
||||||
|
def api_list_purchases():
|
||||||
|
"""Route to list all purchases"""
|
||||||
|
session = Session()
|
||||||
|
try:
|
||||||
|
data = {}
|
||||||
|
query = session.query(Purchase.id,
|
||||||
|
Purchase.product_upc, Purchase.quantity, Purchase.date,
|
||||||
|
Purchase.location)
|
||||||
|
for purchase_id, upc, quantity, date, location in query:
|
||||||
|
data[purchase_id] = {'upc': upc, 'quantity': quantity,
|
||||||
|
'date': str(date), 'location': location}
|
||||||
|
return jsonify(data)
|
||||||
|
except NoResultFound:
|
||||||
|
return jsonify({'error': 'NO_RESULT_FOUND'}), status.HTTP_404_NOT_FOUND
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/api/v1/purchase/id/<search>", methods=["GET"])
|
||||||
|
def api_get_purchase_by_id(search):
|
||||||
|
"""Route to get information about a purchase"""
|
||||||
|
session = Session()
|
||||||
|
try:
|
||||||
|
data = session.query(Purchase.id, Purchase.product_upc, Purchase.quantity,
|
||||||
|
Purchase.date, Purchase.location).filter(Purchase.id == search).one()
|
||||||
|
except NoResultFound:
|
||||||
|
return jsonify({'error': 'NO_RESULT_FOUND'}), status.HTTP_404_NOT_FOUND
|
||||||
|
data2 = {'id': data.id, 'upc': data.product_upc,
|
||||||
|
'quantity': data.quantity, 'date': str(data.date), 'location': data.location}
|
||||||
|
return jsonify(data2)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/api/v1/uses", methods=["GET"])
|
||||||
|
def api_list_uses():
|
||||||
|
"""Route to list all uses"""
|
||||||
|
session = Session()
|
||||||
|
try:
|
||||||
|
data = {}
|
||||||
|
query = session.query(Use.id,
|
||||||
|
Use.product_upc, Use.quantity, Use.date,
|
||||||
|
Use.location)
|
||||||
|
for use_id, upc, quantity, date, location in query:
|
||||||
|
data[use_id] = {'upc': upc, 'quantity': quantity,
|
||||||
|
'date': str(date), 'location': location}
|
||||||
|
return jsonify(data)
|
||||||
|
except NoResultFound:
|
||||||
|
return jsonify({'error': 'NO_RESULT_FOUND'}), status.HTTP_404_NOT_FOUND
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/api/v1/use/id/<search>", methods=["GET"])
|
||||||
|
def api_get_use_by_id(search):
|
||||||
|
"""Route to get information about a use"""
|
||||||
|
session = Session()
|
||||||
|
try:
|
||||||
|
data = session.query(Use.id, Use.product_upc, Use.quantity,
|
||||||
|
Use.date, Use.location).filter(Use.id == search).one()
|
||||||
|
except NoResultFound:
|
||||||
|
return jsonify({'error': 'NO_RESULT_FOUND'}), status.HTTP_404_NOT_FOUND
|
||||||
|
data2 = {'id': data.id, 'upc': data.product_upc,
|
||||||
|
'quantity': data.quantity, 'date': str(data.date), 'location': data.location}
|
||||||
|
return jsonify(data2)
|
||||||
|
|
||||||
|
|
||||||
@app.route("/api/v1/create_location", methods=["POST"])
|
@app.route("/api/v1/create_location", methods=["POST"])
|
||||||
def api_create_location():
|
def api_create_location():
|
||||||
"""Route to create a new location"""
|
"""Route to create a new location"""
|
||||||
@ -168,10 +255,9 @@ def api_create_location():
|
|||||||
else:
|
else:
|
||||||
locdesc = None
|
locdesc = None
|
||||||
|
|
||||||
ins = sqlalchemy.insert(Location).values(name=locname, description=locdesc)
|
newlocation = Location(name=locname, description=locdesc)
|
||||||
print(f"ins is {ins}")
|
session.add(newlocation)
|
||||||
session.execute(ins)
|
print("added newlocation")
|
||||||
print("executed ins")
|
|
||||||
session.commit()
|
session.commit()
|
||||||
print("committed")
|
print("committed")
|
||||||
|
|
||||||
@ -191,11 +277,9 @@ def api_create_brand():
|
|||||||
else:
|
else:
|
||||||
branddesc = None
|
branddesc = None
|
||||||
|
|
||||||
ins = sqlalchemy.insert(Brand).values(
|
newbrand = Brand(name=brandname, description=branddesc)
|
||||||
name=brandname, description=branddesc)
|
session.add(newbrand)
|
||||||
print(f"ins is {ins}")
|
print("added newbrand")
|
||||||
session.execute(ins)
|
|
||||||
print("executed ins")
|
|
||||||
session.commit()
|
session.commit()
|
||||||
print("committed")
|
print("committed")
|
||||||
|
|
||||||
@ -215,13 +299,12 @@ def api_create_product():
|
|||||||
else:
|
else:
|
||||||
desc = None
|
desc = None
|
||||||
|
|
||||||
ins = sqlalchemy.insert(Product).values(upc=request.form['upc'], brand=request.form['brand'],
|
newproduct = Product(upc=request.form['upc'], brand=request.form['brand'],
|
||||||
name=request.form['name'], size=request.form['size'],
|
name=request.form['name'], size=request.form['size'],
|
||||||
sizeunit=request.form['sizeunit'],
|
sizeunit=request.form['sizeunit'],
|
||||||
description=desc)
|
description=desc)
|
||||||
print(f"ins is {ins}")
|
session.add(newproduct)
|
||||||
session.execute(ins)
|
print("added newproduct")
|
||||||
print("executed ins")
|
|
||||||
session.commit()
|
session.commit()
|
||||||
print("committed")
|
print("committed")
|
||||||
|
|
||||||
@ -229,5 +312,65 @@ def api_create_product():
|
|||||||
f'/api/v1/product/name/{request.form["name"]}']})
|
f'/api/v1/product/name/{request.form["name"]}']})
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/api/v1/create_unit", methods=["POST"])
|
||||||
|
def api_create_unit():
|
||||||
|
"""Route to create a new unit"""
|
||||||
|
session = Session()
|
||||||
|
if "name" not in request.form:
|
||||||
|
return jsonify({'error': 'NO_NAME_PROVIDED'}), status.HTTP_400_BAD_REQUEST
|
||||||
|
else:
|
||||||
|
unitname = request.form['name']
|
||||||
|
if "description" in request.form:
|
||||||
|
unitdesc = request.form['description']
|
||||||
|
else:
|
||||||
|
unitdesc = None
|
||||||
|
|
||||||
|
newunit = Unit(name=unitname, description=unitdesc)
|
||||||
|
session.add(newunit)
|
||||||
|
print("added newunit")
|
||||||
|
session.commit()
|
||||||
|
print("committed")
|
||||||
|
|
||||||
|
return jsonify({'api_endpoints': [f'/api/v1/unit/name/{unitname}']})
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/api/v1/create_purchase", methods=["POST"])
|
||||||
|
def api_create_purchase():
|
||||||
|
"""Route to create a new purchase"""
|
||||||
|
session = Session()
|
||||||
|
reqfields = ['upc', 'quantity', 'date', 'location']
|
||||||
|
for field in reqfields:
|
||||||
|
if field not in request.form:
|
||||||
|
return jsonify({'error': f'NO_{field.upper()}_PROVIDED'}), status.HTTP_400_BAD_REQUEST
|
||||||
|
|
||||||
|
newpurchase = Purchase(product_upc=request.form['upc'], quantity=request.form['quantity'],
|
||||||
|
date=request.form['date'], location=request.form['location'])
|
||||||
|
session.add(newpurchase)
|
||||||
|
print("added newpurchase")
|
||||||
|
session.commit()
|
||||||
|
print("committed")
|
||||||
|
|
||||||
|
return jsonify({'api_endpoints': [f'/api/v1/purchase/id/{newpurchase.id}']})
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/api/v1/create_use", methods=["POST"])
|
||||||
|
def api_create_use():
|
||||||
|
"""Route to create a new use"""
|
||||||
|
session = Session()
|
||||||
|
reqfields = ['upc', 'quantity', 'date', 'location']
|
||||||
|
for field in reqfields:
|
||||||
|
if field not in request.form:
|
||||||
|
return jsonify({'error': f'NO_{field.upper()}_PROVIDED'}), status.HTTP_400_BAD_REQUEST
|
||||||
|
|
||||||
|
newuse = Use(product_upc=request.form['upc'], quantity=request.form['quantity'],
|
||||||
|
date=request.form['date'], location=request.form['location'])
|
||||||
|
session.add(newuse)
|
||||||
|
print("added newuse")
|
||||||
|
session.commit()
|
||||||
|
print("committed")
|
||||||
|
|
||||||
|
return jsonify({'api_endpoints': [f'/api/v1/use/id/{newuse.id}']})
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
print("Run with `flask` or a WSGI server!")
|
print("Run with `flask` or a WSGI server!")
|
||||||
|
Loading…
Reference in New Issue
Block a user