Finish API

This commit is contained in:
BBaoVanC 2020-10-05 19:22:24 -05:00
parent 8c635adcc7
commit 4bb70b207e
Signed by: bbaovanc
GPG Key ID: 18089E4E3CCF1D3A
2 changed files with 196 additions and 21 deletions

View File

@ -6,7 +6,9 @@ Library for interacting with InvMan DB using SQLAlchemy
"""
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.orm import sessionmaker
@ -74,3 +76,33 @@ class Brand(Base):
name = Column(String(length=63), primary_key=True)
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))

183
webapi.py
View File

@ -10,8 +10,7 @@ from flask import Flask, jsonify, request
from flask_api import status
from sqlalchemy.orm.exc import NoResultFound
import sqlalchemy
from libdb import Session, Location, ProductQuantity, Product, Brand
from libdb import Session, Location, ProductQuantity, Product, Brand, Unit, Purchase, Use
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"""
session = Session()
try:
data = session.query(Brand.name, Brand.description). \
filter(Brand.name == search).one()
data = session.query(Brand.name, Brand.description).filter(
Brand.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/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"])
def api_create_location():
"""Route to create a new location"""
@ -168,10 +255,9 @@ def api_create_location():
else:
locdesc = None
ins = sqlalchemy.insert(Location).values(name=locname, description=locdesc)
print(f"ins is {ins}")
session.execute(ins)
print("executed ins")
newlocation = Location(name=locname, description=locdesc)
session.add(newlocation)
print("added newlocation")
session.commit()
print("committed")
@ -191,11 +277,9 @@ def api_create_brand():
else:
branddesc = None
ins = sqlalchemy.insert(Brand).values(
name=brandname, description=branddesc)
print(f"ins is {ins}")
session.execute(ins)
print("executed ins")
newbrand = Brand(name=brandname, description=branddesc)
session.add(newbrand)
print("added newbrand")
session.commit()
print("committed")
@ -215,13 +299,12 @@ def api_create_product():
else:
desc = None
ins = sqlalchemy.insert(Product).values(upc=request.form['upc'], brand=request.form['brand'],
name=request.form['name'], size=request.form['size'],
sizeunit=request.form['sizeunit'],
description=desc)
print(f"ins is {ins}")
session.execute(ins)
print("executed ins")
newproduct = Product(upc=request.form['upc'], brand=request.form['brand'],
name=request.form['name'], size=request.form['size'],
sizeunit=request.form['sizeunit'],
description=desc)
session.add(newproduct)
print("added newproduct")
session.commit()
print("committed")
@ -229,5 +312,65 @@ def api_create_product():
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__":
print("Run with `flask` or a WSGI server!")