From d6f21b05615b2fcd9980d6af9ae6057225e47bac Mon Sep 17 00:00:00 2001 From: Billy Date: Thu, 2 May 2024 19:53:37 -0400 Subject: [PATCH] Added some QoL features * added function for selecting from a list of available cards * added function for selecting from a list of available assets * did some other shit... dont ask, just keep coding... --- app.py | 51 +++++++++++++++-- static/add.js | 125 ++++++++++++++++++++++++++++++++++++++---- templates/adding.html | 20 +++++-- utils/sql_utils.py | 2 +- 4 files changed, 177 insertions(+), 21 deletions(-) diff --git a/app.py b/app.py index 1ad466d..7ce79b1 100644 --- a/app.py +++ b/app.py @@ -51,11 +51,10 @@ left join users u on u.assigned_asset=a.asset_id @app.route('/card_list') def card_list(): query = ''' -select c.card_number,c.display_number,u.name assigned_user -from access_cards c -left join users u on u.assigned_card=c.card_number +select card_number from access_cards ''' data = sql_utils.read_query(connection,query) + data = [x[0] for x in data] return data @app.route('/user_list') def user_list(): @@ -67,6 +66,38 @@ select * from users; ### add.html paths +@app.route("/get_available_assets") +def get_available_assets(): + + query = ''' +SELECT asset_id +FROM assets +WHERE NOT asset_id IN ( + SELECT assigned_asset FROM users WHERE assigned_asset IS NOT NULL +); +''' + + data = sql_utils.read_query(connection,query) + data = [x[0] for x in data] + return data + +@app.route("/get_available_cards") +def get_available_cards(): + + query = ''' +SELECT card_number +FROM access_cards +WHERE NOT card_number IN ( + SELECT assigned_card FROM users WHERE assigned_card IS NOT NULL +); +''' + + data = sql_utils.read_query(connection,query) + data = [x[0] for x in data] + return data + +@app.route('/get_all_cards') + @app.route("/add_asset", methods=['POST']) def add_asset(): data = request.json @@ -93,9 +124,19 @@ def add_user(): else: return "failure" -@app.route("/add_card") +@app.route("/add_card",methods=['POST']) def add_card(): - return None + data = request.json + query = f''' + insert into access_cards (card_number,display_number) values + (%(card_number)s,%(display_number)s) + ''' + result = sql_utils.send_query(connection, query, data); + if result: + return "success" + else: + return "failure" + @app.route("/modify_asset") def modify_asset(): return None diff --git a/static/add.js b/static/add.js index a5a3245..470069f 100644 --- a/static/add.js +++ b/static/add.js @@ -52,8 +52,8 @@ async function add_user() { let id_data = (id.value == "") ? null : id.value; let username_data = (username.value == "") ? null : username.value; - let asset_data = (asset.value == "") ? null : asset.value; - let card_data = (card.value == "") ? null : card.value; + let asset_data = (asset.value == "null") ? null : asset.value; + let card_data = (card.value == "null") ? null : card.value; let data = { "id": id_data, @@ -63,10 +63,10 @@ async function add_user() { } - await fetch("/add_user",{ + await fetch("/add_user", { method: "POST", headers: { - "Content-Type":"application/json", + "Content-Type": "application/json", }, body: JSON.stringify(data), }) @@ -79,9 +79,11 @@ async function add_user() { username.value = ""; asset.value = ""; card.value = ""; + + await populate_data(); } -function add_card() { +async function add_card() { let display = document.getElementById("add-display-number"); let card = document.getElementById("add-card-number"); @@ -89,12 +91,45 @@ function add_card() { alert("Add card error:\nCard number field cannot be null"); return; } - console.log( - (display.value == "") ? null : display.value, - (card.value == "") ? null : card.value - ) + let display_data = (display.value == "") ? null : parseInt(display.value); + let card_data = (card.value == "") ? null : parseInt(card.value); + + if (existing_cards.includes(card_data)) { + console.log("alert thrown"); + alert("Add card error\nCard number: " + card_data + " already exists!"); + return; + } + + // For card validation + await fetch('/card_list') + .then(response => response.json()) + .then(data => { + if (data.includes(card_data)) { + console.log("alert thrown"); + alert("Add card error\nCard number: " + card_data + " already exists!"); + return; + } + }); + + data = { + "card_number": card_data, + "display_number": display_data + } + + await fetch("/add_card", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(data), + }) + .then(response => response.text()) + .then(data => { + console.log(data); + }); + display.value = ""; - card.value = ""; + await get_next_card(); } function post_data_format(argsObject) { @@ -103,4 +138,72 @@ function post_data_format(argsObject) { args.push(`${property}=${argsObject[property]}`) } return "?" + args.join('&'); -} \ No newline at end of file +} + +async function populate_available_assets() { + + let elements = document.getElementsByClassName("available-asset-list-data"); + while (elements[0]) { + elements[0].remove(); + } + + await fetch('/get_available_assets') + .then(response => response.json()) + .then(data => { + let add_asset_list = document.getElementById("add-assigned-asset"); + let mod_asset_list = document.getElementById("modify-assigned-asset"); + for (let entry of data) { + let option = document.createElement("option"); + option.innerHTML = entry; + option.value = entry; + option.classList.add("available-asset-list-data"); + mod_asset_list.appendChild(option.cloneNode(true)); + add_asset_list.appendChild(option); + } + }); + +} + +async function populate_available_cards() { + let elements = document.getElementsByClassName("available-card-list-data"); + while (elements[0]) { + elements[0].remove(); + } + existing_cards = []; + await fetch('/get_available_cards') + .then(response => response.json()) + .then(data => { + let add_card_list = document.getElementById("add-assigned-card"); + let mod_card_list = document.getElementById("modify-assigned-card"); + for (let entry of data) { + let option = document.createElement("option"); + option.innerHTML = entry; + option.value = entry; + option.classList.add("available-card-list-data"); + mod_card_list.appendChild(option.cloneNode(true)); + add_card_list.appendChild(option); + existing_cards.push(entry); + } + }); +} + +async function get_next_card() { + await fetch('/card_list') + .then(response => response.json()) + .then(data => { + console.log(data); + let next_card = parseInt(data.slice(-1)) + 1; + document.getElementById('add-card-number') + .value = next_card; + }); +} + +async function populate_data() { + await populate_available_assets(); + await populate_available_cards(); + await get_next_card(); +} + +let existing_cards = []; + +populate_data(); \ No newline at end of file diff --git a/templates/adding.html b/templates/adding.html index bd88b6d..d68fe89 100644 --- a/templates/adding.html +++ b/templates/adding.html @@ -108,11 +108,17 @@

- + +

- + +

@@ -177,11 +183,17 @@

- + +

- + +

diff --git a/utils/sql_utils.py b/utils/sql_utils.py index 645ae3a..210546a 100644 --- a/utils/sql_utils.py +++ b/utils/sql_utils.py @@ -16,7 +16,7 @@ def connect_database(host, username, password, database): return connection -def send_query(connection, query, parameters): +def send_query(connection, query, parameters=None): cursor = connection.cursor() try: cursor.execute(query, parameters)