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...
This commit is contained in:
Billy 2024-05-02 19:53:37 -04:00
parent a1bb4fd78d
commit d6f21b0561
4 changed files with 177 additions and 21 deletions

51
app.py
View File

@ -51,11 +51,10 @@ left join users u on u.assigned_asset=a.asset_id
@app.route('/card_list') @app.route('/card_list')
def card_list(): def card_list():
query = ''' query = '''
select c.card_number,c.display_number,u.name assigned_user select card_number from access_cards
from access_cards c
left join users u on u.assigned_card=c.card_number
''' '''
data = sql_utils.read_query(connection,query) data = sql_utils.read_query(connection,query)
data = [x[0] for x in data]
return data return data
@app.route('/user_list') @app.route('/user_list')
def user_list(): def user_list():
@ -67,6 +66,38 @@ select * from users;
### add.html paths ### 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']) @app.route("/add_asset", methods=['POST'])
def add_asset(): def add_asset():
data = request.json data = request.json
@ -93,9 +124,19 @@ def add_user():
else: else:
return "failure" return "failure"
@app.route("/add_card") @app.route("/add_card",methods=['POST'])
def add_card(): 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") @app.route("/modify_asset")
def modify_asset(): def modify_asset():
return None return None

View File

@ -52,8 +52,8 @@ async function add_user() {
let id_data = (id.value == "") ? null : id.value; let id_data = (id.value == "") ? null : id.value;
let username_data = (username.value == "") ? null : username.value; let username_data = (username.value == "") ? null : username.value;
let asset_data = (asset.value == "") ? null : asset.value; let asset_data = (asset.value == "null") ? null : asset.value;
let card_data = (card.value == "") ? null : card.value; let card_data = (card.value == "null") ? null : card.value;
let data = { let data = {
"id": id_data, "id": id_data,
@ -63,10 +63,10 @@ async function add_user() {
} }
await fetch("/add_user",{ await fetch("/add_user", {
method: "POST", method: "POST",
headers: { headers: {
"Content-Type":"application/json", "Content-Type": "application/json",
}, },
body: JSON.stringify(data), body: JSON.stringify(data),
}) })
@ -79,9 +79,11 @@ async function add_user() {
username.value = ""; username.value = "";
asset.value = ""; asset.value = "";
card.value = ""; card.value = "";
await populate_data();
} }
function add_card() { async function add_card() {
let display = document.getElementById("add-display-number"); let display = document.getElementById("add-display-number");
let card = document.getElementById("add-card-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"); alert("Add card error:\nCard number field cannot be null");
return; return;
} }
console.log( let display_data = (display.value == "") ? null : parseInt(display.value);
(display.value == "") ? null : display.value, let card_data = (card.value == "") ? null : parseInt(card.value);
(card.value == "") ? null : 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 = ""; display.value = "";
card.value = ""; await get_next_card();
} }
function post_data_format(argsObject) { function post_data_format(argsObject) {
@ -104,3 +139,71 @@ function post_data_format(argsObject) {
} }
return "?" + args.join('&'); return "?" + args.join('&');
} }
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();

View File

@ -108,11 +108,17 @@
<br> <br>
<br> <br>
<label for="add-assigned-asset">Assigned asset tag:</label> <label for="add-assigned-asset">Assigned asset tag:</label>
<input type="number" name="add-assigned-asset" id="add-assigned-asset"> <!-- <input type="number" name="add-assigned-asset" id="add-assigned-asset"> -->
<select name="add-assigned-asset" id="add-assigned-asset">
<option value="null">N/A</option>
</select>
<br> <br>
<br> <br>
<label for="add-assigned-card">Assigned card:</label> <label for="add-assigned-card">Assigned card:</label>
<input type="number" name="add-assigned-card" id="add-assigned-card"> <!-- <input type="number" name="add-assigned-card" id="add-assigned-card"> -->
<select name="add-assigned-card" id="add-assigned-card">
<option value="null">N/A</option>
</select>
<br> <br>
<br> <br>
<button>Submit</button> <button>Submit</button>
@ -177,11 +183,17 @@
<br> <br>
<br> <br>
<label for="modify-assigned-asset">Assigned asset:</label> <label for="modify-assigned-asset">Assigned asset:</label>
<input type="number" name="modify-assigned-asset" id="modify-assigned-asset"> <!-- <input type="number" name="modify-assigned-asset" id="modify-assigned-asset"> -->
<select name="modify-assigned-asset" id="modify-assigned-asset">
<option value="null">Unassign</option>
</select>
<br> <br>
<br> <br>
<label for="modify-assigned-card">Assigned card:</label> <label for="modify-assigned-card">Assigned card:</label>
<input type="number" name="modify-assigned-card" id="modify-assigned-card"> <!-- <input type="number" name="modify-assigned-card" id="modify-assigned-card"> -->
<select name="modify-assigned-card" id="modify-assigned-card">
<option value="null">Unassign</option>
</select>
<br> <br>
<br> <br>
<button>Submit</button> <button>Submit</button>

View File

@ -16,7 +16,7 @@ def connect_database(host, username, password, database):
return connection return connection
def send_query(connection, query, parameters): def send_query(connection, query, parameters=None):
cursor = connection.cursor() cursor = connection.cursor()
try: try:
cursor.execute(query, parameters) cursor.execute(query, parameters)