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
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)

View File

@ -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}"
"""

View File

@ -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>

View File

@ -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>

View File

@ -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>