Set up db and fixed view page
This commit is contained in:
parent
414550e7b1
commit
1ebe5b1df7
@ -4,13 +4,12 @@ from models import *
|
||||
import csv
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///inventory.db'
|
||||
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://assetadmin:1234@localhost/asset_test_db'
|
||||
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
|
||||
db.init_app(app)
|
||||
|
||||
|
||||
@app.before_first_request
|
||||
def create_table():
|
||||
with app.app_context():
|
||||
db.create_all()
|
||||
|
||||
|
||||
@ -25,16 +24,16 @@ def create():
|
||||
return render_template('create.html')
|
||||
|
||||
if request.method == 'POST':
|
||||
sku = request.form['sku']
|
||||
name = request.form['name']
|
||||
description = request.form['description']
|
||||
price = request.form['price']
|
||||
assettag = request.form['assettag']
|
||||
hostname = request.form['hostname']
|
||||
warrantyfrom = request.form['warrantyfrom']
|
||||
status = request.form['status']
|
||||
try:
|
||||
qty = int(request.form['qty'])
|
||||
staffnum = int(request.form['staffnum'])
|
||||
except ValueError:
|
||||
return render_template('create.html', exc='qty')
|
||||
return render_template('create.html', exc='staffnum')
|
||||
|
||||
item = Item(sku=sku, name=name, description=description, price=price, qty=qty)
|
||||
item = Asset(assettag=assettag, hostname=hostname, warrantyfrom=warrantyfrom, status=status, staffnum=staffnum)
|
||||
|
||||
try:
|
||||
db.session.add(item)
|
||||
@ -42,7 +41,7 @@ def create():
|
||||
except exc.IntegrityError:
|
||||
return render_template('create.html', exc='integrity')
|
||||
except exc.StatementError:
|
||||
return render_template('create.html', exc='price')
|
||||
return render_template('create.html', exc='status')
|
||||
|
||||
return redirect('/view')
|
||||
|
||||
@ -52,63 +51,63 @@ def view_list():
|
||||
if request.method == 'POST':
|
||||
outfile = open('inventory_export.csv', 'w', newline='')
|
||||
outcsv = csv.writer(outfile)
|
||||
records = db.session.query(Item).all()
|
||||
outcsv.writerow([column.name for column in Item.__mapper__.columns])
|
||||
[outcsv.writerow([getattr(curr, column.name) for column in Item.__mapper__.columns]) for curr in records]
|
||||
records = db.session.query(Asset).all()
|
||||
outcsv.writerow([column.hostname for column in Asset.__mapper__.columns])
|
||||
[outcsv.writerow([getattr(curr, column.hostname) for column in Asset.__mapper__.columns]) for curr in records]
|
||||
outfile.close()
|
||||
return send_file('inventory_export.csv', as_attachment=True)
|
||||
|
||||
items = Item.query.all()
|
||||
return render_template('viewlist.html', items=items)
|
||||
items = Asset.query.all()
|
||||
return render_template('viewList.html', items=items)
|
||||
|
||||
|
||||
@app.route('/view/<int:sku>/')
|
||||
def view_item(sku):
|
||||
item = Item.query.filter_by(sku=sku).first()
|
||||
@app.route('/view/<int:assettag>/')
|
||||
def view_item(assettag):
|
||||
item = Asset.query.filter_by(assettag=assettag).first()
|
||||
if item:
|
||||
return render_template('viewitem.html', item=item)
|
||||
return f"Item {sku} is not found"
|
||||
return f"Asset {assettag} is not found"
|
||||
|
||||
|
||||
@app.route('/update/<int:sku>/', methods=['GET', 'POST'])
|
||||
def update(sku):
|
||||
item = Item.query.filter_by(sku=sku).first()
|
||||
@app.route('/update/<int:assettag>/', methods=['GET', 'POST'])
|
||||
def update(assettag):
|
||||
item = Asset.query.filter_by(assettag=assettag).first()
|
||||
if request.method == 'POST':
|
||||
if item:
|
||||
sku = request.form['sku']
|
||||
name = request.form['name']
|
||||
description = request.form['description']
|
||||
assettag = request.form['assettag']
|
||||
hostname = request.form['hostname']
|
||||
warrantyfrom = request.form['warrantyfrom']
|
||||
try:
|
||||
price = float(request.form['price'])
|
||||
status = float(request.form['status'])
|
||||
except ValueError:
|
||||
return render_template('update.html', item=item, exc='price')
|
||||
return render_template('update.html', item=item, exc='status')
|
||||
try:
|
||||
qty = int(request.form['qty'])
|
||||
staffnum = int(request.form['staffnum'])
|
||||
except ValueError:
|
||||
return render_template('update.html', item=item, exc='qty')
|
||||
return render_template('update.html', item=item, exc='staffnum')
|
||||
|
||||
try:
|
||||
setattr(item, 'sku', sku)
|
||||
setattr(item, 'name', name)
|
||||
setattr(item, 'description', description)
|
||||
setattr(item, 'price', price)
|
||||
setattr(item, 'qty', qty)
|
||||
setattr(item, 'assettag', assettag)
|
||||
setattr(item, 'hostname', hostname)
|
||||
setattr(item, 'warrantyfrom', warrantyfrom)
|
||||
setattr(item, 'status', status)
|
||||
setattr(item, 'staffnum', staffnum)
|
||||
|
||||
db.session.commit()
|
||||
except exc.IntegrityError:
|
||||
return render_template('update.html', item=item, exc='integrity')
|
||||
except (exc.StatementError, exc.InvalidRequestError) as e:
|
||||
return render_template('update.html', item=item, exc='price')
|
||||
return render_template('update.html', item=item, exc='status')
|
||||
|
||||
return redirect(f'/view/')
|
||||
return f"Item {sku} is not found"
|
||||
return f"Asset {assettag} is not found"
|
||||
|
||||
return render_template('update.html', item=item)
|
||||
|
||||
|
||||
@app.route('/delete/<int:sku>/', methods=['GET', 'POST'])
|
||||
def delete(sku):
|
||||
item = Item.query.filter_by(sku=sku).first()
|
||||
@app.route('/delete/<int:assettag>/', methods=['GET', 'POST'])
|
||||
def delete(assettag):
|
||||
item = Asset.query.filter_by(assettag=assettag).first()
|
||||
if request.method == 'POST':
|
||||
if item:
|
||||
db.session.delete(item)
|
21
models.py
21
models.py
@ -2,7 +2,27 @@ from flask_sqlalchemy import SQLAlchemy
|
||||
|
||||
db = SQLAlchemy()
|
||||
|
||||
class Asset(db.Model):
|
||||
__tablename__ = "asset_test" # Table in MySQL
|
||||
|
||||
assettag = db.Column(db.String(50), primary_key=True) # Primary key
|
||||
hostname = db.Column(db.String(50)) # VARCHAR(50)
|
||||
warrantyfrom = db.Column(db.Date) # DATE
|
||||
status = db.Column(db.Enum('Active', 'Inactive')) # ENUM('Active', 'Inactive')
|
||||
#staffnum = db.Column(db.Integer, unsigned=True) # INT(8) UNSIGNED
|
||||
staffnum = db.Column(db.Integer) # INT(8) UNSIGNED
|
||||
|
||||
def __init__(self, assettag, hostname=None, warrantyfrom=None, status=None, staffnum=None):
|
||||
self.assettag = assettag
|
||||
self.hostname = hostname
|
||||
self.warrantyfrom = warrantyfrom
|
||||
self.status = status
|
||||
self.staffnum = staffnum
|
||||
|
||||
def __repr__(self):
|
||||
return f"<AssetTest {self.assettag}: {self.hostname}>"
|
||||
|
||||
""" Original code
|
||||
class Item(db.Model):
|
||||
__tablename__ = "Item"
|
||||
|
||||
@ -22,3 +42,4 @@ class Item(db.Model):
|
||||
|
||||
def __repr__(self):
|
||||
return f"{self.name}:{self.sku}"
|
||||
"""
|
||||
|
@ -20,37 +20,37 @@
|
||||
|
||||
<form method = "POST">
|
||||
<p>
|
||||
<label for="sku">SKU:</label>
|
||||
<input id="sku" type = "text" name = "sku" required/>
|
||||
<label for="assettag">Asset Tag:</label>
|
||||
<input id="assettag" type = "text" name = "assettag" required/>
|
||||
</p>
|
||||
<p>
|
||||
<label for="name">Name:</label>
|
||||
<input id="name" type = "text" name = "name" required/>
|
||||
<label for="hostname">Host Name:</label>
|
||||
<input id="hostname" type = "text" name = "hostname" required/>
|
||||
</p>
|
||||
<p>
|
||||
<label for="desc">Description:</label>
|
||||
<input id="desc" type = "text" name = "description" required/>
|
||||
<label for="warrantyfrom">Warranty From:</label>
|
||||
<input id="warrantyfrom" type = "text" name = "warrantyfrom" required/>
|
||||
</p>
|
||||
<p>
|
||||
<label for="price">Price:</label>
|
||||
<input id="price" type = "integer" name = "price" required/>
|
||||
<label for="status">Status:</label>
|
||||
<input id="status" type = "integer" name = "status" required/>
|
||||
</p>
|
||||
<p>
|
||||
<label for="qty">Quantity:</label>
|
||||
<input id="qty" type = "integer" name = "qty" required/>
|
||||
<label for="staffnum">Staff No.:</label>
|
||||
<input id="staffnum" type = "integer" name = "staffnum" required/>
|
||||
</p>
|
||||
<p><input type = "submit" value = "Submit" /></p>
|
||||
</form>
|
||||
|
||||
<p align="center">
|
||||
{% if exc == 'integrity' %}
|
||||
Item with such SKU already exists
|
||||
Item with the same assettag already exists
|
||||
{% endif %}
|
||||
{% if exc == 'price' %}
|
||||
{% if exc == 'status' %}
|
||||
Data input error. Price must have a numeric value
|
||||
{% endif %}
|
||||
{% if exc == 'qty' %}
|
||||
Data input error. Quantity must be an integer
|
||||
{% if exc == 'staffnum' %}
|
||||
Data input error. Staff number must be an integer
|
||||
{% endif %}
|
||||
</p>
|
||||
</body>
|
||||
|
@ -20,24 +20,24 @@
|
||||
|
||||
<form action='' method = "POST">
|
||||
<p>
|
||||
<label for="sku">SKU:</label>
|
||||
<input id="sku" type = "text" name = "sku" value="{{item.sku}}" required/>
|
||||
<label for="assettag">SKU:</label>
|
||||
<input id="assettag" type = "text" name = "assettag" value="{{item.assettag}}" required/>
|
||||
</p>
|
||||
<p>
|
||||
<label for="name">Name:</label>
|
||||
<input id="name" type = "text" name = "name" value="{{item.name}}" required/>
|
||||
<label for="hostname">Name:</label>
|
||||
<input id="hostname" type = "text" name = "hostname" value="{{item.hostname}}" required/>
|
||||
</p>
|
||||
<p>
|
||||
<label for="desc">Description:</label>
|
||||
<input id="desc" type = "text" name = "description" value="{{item.description}}" required/>
|
||||
<label for="warrantyfrom">Description:</label>
|
||||
<input id="warrantyfrom" type = "text" name = "warrantyfrom" value="{{item.warrantyfrom}}" required/>
|
||||
</p>
|
||||
<p>
|
||||
<label for="price">Price:</label>
|
||||
<input id="price" type = "integer" name = "price" value="{{item.price}}" required/>
|
||||
<label for="status">Price:</label>
|
||||
<input id="status" type = "integer" name = "status" value="{{item.status}}" required/>
|
||||
</p>
|
||||
<p>
|
||||
<label for="qty">Quantity:</label>
|
||||
<input id="qty" type = "integer" name = "qty" value="{{item.qty}}" required/>
|
||||
<label for="staffnum">Quantity:</label>
|
||||
<input id="staffnum" type = "integer" name = "staffnum" value="{{item.staffnum}}" required/>
|
||||
</p>
|
||||
<p>
|
||||
<input type = "submit" value = "Update" />
|
||||
@ -48,11 +48,11 @@
|
||||
{% if exc == 'integrity' %}
|
||||
Item with such SKU already exists
|
||||
{% endif %}
|
||||
{% if exc == 'price' %}
|
||||
{% if exc == 'status' %}
|
||||
Data input error. Price must have a numeric value
|
||||
{% endif %}
|
||||
{% if exc == 'qty' %}
|
||||
Data input error. Quantity must be an integer
|
||||
{% if exc == 'staffnum' %}
|
||||
Data input error. Staff number must be an integer
|
||||
{% endif %}
|
||||
</p>
|
||||
</body>
|
||||
|
@ -14,36 +14,36 @@
|
||||
|
||||
<table border="1" align="center">
|
||||
<tr>
|
||||
<th>SKU</th>
|
||||
<th>Name</th>
|
||||
<th>Description</th>
|
||||
<th>Price</th>
|
||||
<th>Quantity</th>
|
||||
<th>Asset Tag</th>
|
||||
<th>Host Name</th>
|
||||
<th>Warranty From</th>
|
||||
<th>Status</th>
|
||||
<th>Staff No.</th>
|
||||
</tr>
|
||||
{% for item in items %}
|
||||
<tr>
|
||||
<td>
|
||||
{{item.sku}}
|
||||
{{item.assettag}}
|
||||
</td>
|
||||
<td>
|
||||
{{item.name}}
|
||||
{{item.hostname}}
|
||||
</td>
|
||||
<td>
|
||||
{{item.description}}
|
||||
{{item.warrantyfrom}}
|
||||
</td>
|
||||
<td>
|
||||
${{item.price}}
|
||||
${{item.status}}
|
||||
</td>
|
||||
<td>
|
||||
{{item.qty}}
|
||||
{{item.staffnum}}
|
||||
</td>
|
||||
<td>
|
||||
<form action="/update/{{item.sku}}" method="get">
|
||||
<form action="/update/{{item.assettag}}" method="get">
|
||||
<button type="submit">Edit</button>
|
||||
</form>
|
||||
</td>
|
||||
<td>
|
||||
<form action="/delete/{{item.sku}}" method="get">
|
||||
<form action="/delete/{{item.assettag}}" method="get">
|
||||
<button type="submit">Delete</button>
|
||||
</form>
|
||||
</td>
|
||||
|
Loading…
Reference in New Issue
Block a user