Cybrkyd's Git Repositories

python-budget - commit: d79e8b3

commit d79e8b3d2f58d9aef30ec398b5e38eae2b36b25e2e9569d9de42e2701df77d59
author Cybrkyd <git@cybrkyd.com> 2026-05-30 13:14:28 +0100
committer Cybrkyd <git@cybrkyd.com> 2026-05-30 13:14:28 +0100

Commit Message

added update budget table row function

📊 Diffstat

budget.py 78
1 files changed, 59 insertions(+), 19 deletions(-)

Diff

diff --git a/budget.py b/budget.py
index f59e65d..c59cb30 100644
--- a/budget.py
+++ b/budget.py
@@ -64,6 +64,14 @@ def delete_budget(category):
with sqlite3.connect(DB) as conn:
conn.execute("DELETE FROM budget WHERE category = ?", (category,))
+ def update_budget(category, planned_amount, original_category):
+ with sqlite3.connect(DB) as conn:
+ if category != original_category:
+ conn.execute("DELETE FROM budget WHERE category = ?", (original_category,))
+ conn.execute("INSERT INTO budget (category, planned_amount) VALUES (?, ?)", (category, planned_amount))
+ else:
+ conn.execute("UPDATE budget SET planned_amount = ? WHERE category = ?", (planned_amount, category))
+
HTML = """
<!doctype html>
<html>
@@ -107,6 +115,12 @@ th {{
.actions {{
display: inline;
}}
+
+ .budget-input {{
+ width: 100px;
+ padding: 4px;
+ margin: -4px 0;
+ }}
</style>
<script>
function autoFillAmount() {{
@@ -170,14 +184,16 @@ function autoFillAmount() {{
<button type="submit">Save Budget</button>
</form>
- <table>
- <tr>
- <th>Category</th>
- <th>Planned</th>
- <th>Actions</th>
- </tr>
- {budget_rows}
- </table>
+ <form method="POST" action="/budget/update">
+ <table>
+ <tr>
+ <th>Category</th>
+ <th>Planned</th>
+ <th>Actions</th>
+ </tr>
+ {budget_rows}
+ </table>
+ </form>
</div>
</body>
@@ -192,16 +208,15 @@ class Handler(BaseHTTPRequestHandler):
budget_items = get_budget_items()
budget_rows = ""
- for item in budget_items:
+ for idx, item in enumerate(budget_items):
budget_rows += f"""
<tr>
- <td>{item['category']}</td>
- <td>{item['planned_amount']:.2f}</td>
+ <td><input type="text" name="category_{idx}" value="{item['category']}" class="budget-input" style="width:150px"></td>
+ <td><input type="text" name="planned_amount_{idx}" value="{item['planned_amount']:.2f}" class="budget-input"></td>
<td>
- <form method="POST" action="/budget/delete" class="actions">
- <input type="hidden" name="category" value="{item['category']}">
- <button type="submit" onclick="return confirm('Delete budget for {item['category']}?')">Delete</button>
- </form>
+ <input type="hidden" name="original_category_{idx}" value="{item['category']}">
+ <button type="submit" name="update_{idx}" value="1">Update</button>
+ <button type="submit" name="delete_{idx}" value="1" formaction="/budget/delete" onclick="return confirm('Delete?')">Delete</button>
</td>
</tr>
"""
@@ -225,7 +240,6 @@ class Handler(BaseHTTPRequestHandler):
description = data.get("description", [""])[0]
details = data.get("details", [""])[0]
- # Determine if the amount should be credit or debit
if amount > 0:
credit = amount
debit = 0
@@ -258,15 +272,41 @@ class Handler(BaseHTTPRequestHandler):
self.send_header("Location", "/")
self.end_headers()
+ elif self.path == "/budget/update":
+ length = int(self.headers["Content-Length"])
+ body = self.rfile.read(length).decode()
+ data = parse_qs(body)
+
+ # Find which row was updated
+ for key in data:
+ if key.startswith("update_"):
+ idx = key.split("_")[1]
+ category = data.get(f"category_{idx}", [""])[0]
+ planned_amount = float(data.get(f"planned_amount_{idx}", [0])[0])
+ original_category = data.get(f"original_category_{idx}", [""])[0]
+
+ if category and planned_amount:
+ update_budget(category, planned_amount, original_category)
+ break
+
+ self.send_response(303)
+ self.send_header("Location", "/")
+ self.end_headers()
+
elif self.path == "/budget/delete":
length = int(self.headers["Content-Length"])
body = self.rfile.read(length).decode()
data = parse_qs(body)
- category = data.get("category", [""])[0]
+ # Find which row was deleted
+ for key in data:
+ if key.startswith("delete_"):
+ idx = key.split("_")[1]
+ original_category = data.get(f"original_category_{idx}", [""])[0]
- if category:
- delete_budget(category)
+ if original_category:
+ delete_budget(original_category)
+ break
self.send_response(303)
self.send_header("Location", "/")