Set up db and fixed view page

This commit is contained in:
Candifloss 2025-01-29 15:35:36 +05:30
parent 414550e7b1
commit 1ebe5b1df7
5 changed files with 99 additions and 79 deletions

View File

@ -4,13 +4,12 @@ from models import *
import csv import csv
app = Flask(__name__) 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 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app) db.init_app(app)
@app.before_first_request with app.app_context():
def create_table():
db.create_all() db.create_all()
@ -25,16 +24,16 @@ def create():
return render_template('create.html') return render_template('create.html')
if request.method == 'POST': if request.method == 'POST':
sku = request.form['sku'] assettag = request.form['assettag']
name = request.form['name'] hostname = request.form['hostname']
description = request.form['description'] warrantyfrom = request.form['warrantyfrom']
price = request.form['price'] status = request.form['status']
try: try:
qty = int(request.form['qty']) staffnum = int(request.form['staffnum'])
except ValueError: 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: try:
db.session.add(item) db.session.add(item)
@ -42,7 +41,7 @@ def create():
except exc.IntegrityError: except exc.IntegrityError:
return render_template('create.html', exc='integrity') return render_template('create.html', exc='integrity')
except exc.StatementError: except exc.StatementError:
return render_template('create.html', exc='price') return render_template('create.html', exc='status')
return redirect('/view') return redirect('/view')
@ -52,63 +51,63 @@ def view_list():
if request.method == 'POST': if request.method == 'POST':
outfile = open('inventory_export.csv', 'w', newline='') outfile = open('inventory_export.csv', 'w', newline='')
outcsv = csv.writer(outfile) outcsv = csv.writer(outfile)
records = db.session.query(Item).all() records = db.session.query(Asset).all()
outcsv.writerow([column.name for column in Item.__mapper__.columns]) outcsv.writerow([column.hostname for column in Asset.__mapper__.columns])
[outcsv.writerow([getattr(curr, column.name) for column in Item.__mapper__.columns]) for curr in records] [outcsv.writerow([getattr(curr, column.hostname) for column in Asset.__mapper__.columns]) for curr in records]
outfile.close() outfile.close()
return send_file('inventory_export.csv', as_attachment=True) return send_file('inventory_export.csv', as_attachment=True)
items = Item.query.all() items = Asset.query.all()
return render_template('viewlist.html', items=items) return render_template('viewList.html', items=items)
@app.route('/view/<int:sku>/') @app.route('/view/<int:assettag>/')
def view_item(sku): def view_item(assettag):
item = Item.query.filter_by(sku=sku).first() item = Asset.query.filter_by(assettag=assettag).first()
if item: if item:
return render_template('viewitem.html', item=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']) @app.route('/update/<int:assettag>/', methods=['GET', 'POST'])
def update(sku): def update(assettag):
item = Item.query.filter_by(sku=sku).first() item = Asset.query.filter_by(assettag=assettag).first()
if request.method == 'POST': if request.method == 'POST':
if item: if item:
sku = request.form['sku'] assettag = request.form['assettag']
name = request.form['name'] hostname = request.form['hostname']
description = request.form['description'] warrantyfrom = request.form['warrantyfrom']
try: try:
price = float(request.form['price']) status = float(request.form['status'])
except ValueError: except ValueError:
return render_template('update.html', item=item, exc='price') return render_template('update.html', item=item, exc='status')
try: try:
qty = int(request.form['qty']) staffnum = int(request.form['staffnum'])
except ValueError: except ValueError:
return render_template('update.html', item=item, exc='qty') return render_template('update.html', item=item, exc='staffnum')
try: try:
setattr(item, 'sku', sku) setattr(item, 'assettag', assettag)
setattr(item, 'name', name) setattr(item, 'hostname', hostname)
setattr(item, 'description', description) setattr(item, 'warrantyfrom', warrantyfrom)
setattr(item, 'price', price) setattr(item, 'status', status)
setattr(item, 'qty', qty) setattr(item, 'staffnum', staffnum)
db.session.commit() db.session.commit()
except exc.IntegrityError: except exc.IntegrityError:
return render_template('update.html', item=item, exc='integrity') return render_template('update.html', item=item, exc='integrity')
except (exc.StatementError, exc.InvalidRequestError) as e: 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 redirect(f'/view/')
return f"Item {sku} is not found" return f"Asset {assettag} is not found"
return render_template('update.html', item=item) return render_template('update.html', item=item)
@app.route('/delete/<int:sku>/', methods=['GET', 'POST']) @app.route('/delete/<int:assettag>/', methods=['GET', 'POST'])
def delete(sku): def delete(assettag):
item = Item.query.filter_by(sku=sku).first() item = Asset.query.filter_by(assettag=assettag).first()
if request.method == 'POST': if request.method == 'POST':
if item: if item:
db.session.delete(item) db.session.delete(item)

View File

@ -2,7 +2,27 @@ from flask_sqlalchemy import SQLAlchemy
db = 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): class Item(db.Model):
__tablename__ = "Item" __tablename__ = "Item"
@ -22,3 +42,4 @@ class Item(db.Model):
def __repr__(self): def __repr__(self):
return f"{self.name}:{self.sku}" return f"{self.name}:{self.sku}"
"""

View File

@ -20,37 +20,37 @@
<form method = "POST"> <form method = "POST">
<p> <p>
<label for="sku">SKU:</label> <label for="assettag">Asset Tag:</label>
<input id="sku" type = "text" name = "sku" required/> <input id="assettag" type = "text" name = "assettag" required/>
</p> </p>
<p> <p>
<label for="name">Name:</label> <label for="hostname">Host Name:</label>
<input id="name" type = "text" name = "name" required/> <input id="hostname" type = "text" name = "hostname" required/>
</p> </p>
<p> <p>
<label for="desc">Description:</label> <label for="warrantyfrom">Warranty From:</label>
<input id="desc" type = "text" name = "description" required/> <input id="warrantyfrom" type = "text" name = "warrantyfrom" required/>
</p> </p>
<p> <p>
<label for="price">Price:</label> <label for="status">Status:</label>
<input id="price" type = "integer" name = "price" required/> <input id="status" type = "integer" name = "status" required/>
</p> </p>
<p> <p>
<label for="qty">Quantity:</label> <label for="staffnum">Staff No.:</label>
<input id="qty" type = "integer" name = "qty" required/> <input id="staffnum" type = "integer" name = "staffnum" required/>
</p> </p>
<p><input type = "submit" value = "Submit" /></p> <p><input type = "submit" value = "Submit" /></p>
</form> </form>
<p align="center"> <p align="center">
{% if exc == 'integrity' %} {% if exc == 'integrity' %}
Item with such SKU already exists Item with the same assettag already exists
{% endif %} {% endif %}
{% if exc == 'price' %} {% if exc == 'status' %}
Data input error. Price must have a numeric value Data input error. Price must have a numeric value
{% endif %} {% endif %}
{% if exc == 'qty' %} {% if exc == 'staffnum' %}
Data input error. Quantity must be an integer Data input error. Staff number must be an integer
{% endif %} {% endif %}
</p> </p>
</body> </body>

View File

@ -20,24 +20,24 @@
<form action='' method = "POST"> <form action='' method = "POST">
<p> <p>
<label for="sku">SKU:</label> <label for="assettag">SKU:</label>
<input id="sku" type = "text" name = "sku" value="{{item.sku}}" required/> <input id="assettag" type = "text" name = "assettag" value="{{item.assettag}}" required/>
</p> </p>
<p> <p>
<label for="name">Name:</label> <label for="hostname">Name:</label>
<input id="name" type = "text" name = "name" value="{{item.name}}" required/> <input id="hostname" type = "text" name = "hostname" value="{{item.hostname}}" required/>
</p> </p>
<p> <p>
<label for="desc">Description:</label> <label for="warrantyfrom">Description:</label>
<input id="desc" type = "text" name = "description" value="{{item.description}}" required/> <input id="warrantyfrom" type = "text" name = "warrantyfrom" value="{{item.warrantyfrom}}" required/>
</p> </p>
<p> <p>
<label for="price">Price:</label> <label for="status">Price:</label>
<input id="price" type = "integer" name = "price" value="{{item.price}}" required/> <input id="status" type = "integer" name = "status" value="{{item.status}}" required/>
</p> </p>
<p> <p>
<label for="qty">Quantity:</label> <label for="staffnum">Quantity:</label>
<input id="qty" type = "integer" name = "qty" value="{{item.qty}}" required/> <input id="staffnum" type = "integer" name = "staffnum" value="{{item.staffnum}}" required/>
</p> </p>
<p> <p>
<input type = "submit" value = "Update" /> <input type = "submit" value = "Update" />
@ -48,11 +48,11 @@
{% if exc == 'integrity' %} {% if exc == 'integrity' %}
Item with such SKU already exists Item with such SKU already exists
{% endif %} {% endif %}
{% if exc == 'price' %} {% if exc == 'status' %}
Data input error. Price must have a numeric value Data input error. Price must have a numeric value
{% endif %} {% endif %}
{% if exc == 'qty' %} {% if exc == 'staffnum' %}
Data input error. Quantity must be an integer Data input error. Staff number must be an integer
{% endif %} {% endif %}
</p> </p>
</body> </body>

View File

@ -14,36 +14,36 @@
<table border="1" align="center"> <table border="1" align="center">
<tr> <tr>
<th>SKU</th> <th>Asset Tag</th>
<th>Name</th> <th>Host Name</th>
<th>Description</th> <th>Warranty From</th>
<th>Price</th> <th>Status</th>
<th>Quantity</th> <th>Staff No.</th>
</tr> </tr>
{% for item in items %} {% for item in items %}
<tr> <tr>
<td> <td>
{{item.sku}} {{item.assettag}}
</td> </td>
<td> <td>
{{item.name}} {{item.hostname}}
</td> </td>
<td> <td>
{{item.description}} {{item.warrantyfrom}}
</td> </td>
<td> <td>
${{item.price}} ${{item.status}}
</td> </td>
<td> <td>
{{item.qty}} {{item.staffnum}}
</td> </td>
<td> <td>
<form action="/update/{{item.sku}}" method="get"> <form action="/update/{{item.assettag}}" method="get">
<button type="submit">Edit</button> <button type="submit">Edit</button>
</form> </form>
</td> </td>
<td> <td>
<form action="/delete/{{item.sku}}" method="get"> <form action="/delete/{{item.assettag}}" method="get">
<button type="submit">Delete</button> <button type="submit">Delete</button>
</form> </form>
</td> </td>