Skip to content
This repository was archived by the owner on Dec 6, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
118 changes: 58 additions & 60 deletions src/config_files/verity_schema.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
database_name: verity
tables:
- table_name: budget

- table_name: user
table_columns:
- column_name: id
is_pk: True
Expand All @@ -10,11 +11,8 @@ tables:
is_pk: False
datatype: TEXT
nullable: False
- column_name: created_date
is_pk: False
datatype: TEXT
nullable: False
- table_name: account_types

- table_name: account_type
table_columns:
- column_name: id
is_pk: True
Expand All @@ -24,110 +22,110 @@ tables:
is_pk: False
datatype: TEXT
nullable: False
- column_name: created_date
is_pk: False
datatype: TEXT
nullable: False

- table_name: account
table_columns:
- column_name: id
is_pk: True
datatype: INTEGER
nullable: False
- column_name: name
- column_name: user_id
is_pk: False
datatype: INTEGER
is_fk: user.id
nullable: False
- column_name: budget_id
- column_name: type_id
is_pk: False
datatype: INTEGER
is_fk: budget.id
is_fk: account_type.id
nullable: False
- column_name: account_type
- column_name: name
is_pk: False
datatype: INTEGER
datatype: TEXT
nullable: False
table_foreign_keys:
- column: account_type
references: account
reference_column: id
- table_name: category
table_foreign_keys:
- column: parent_category
references: category #self join for hierarchy
reference_column: id

- table_name: party
table_columns:
- column_name: id
is_pk: True
datatype: INTEGER
nullable: False
- column_name: parent_category
is_pk: False
datatype: INTEGER
nullable: True
- column_name: name
is_pk: False
datatype: TEXT
nullable: False
- column_name: created_date
is_pk: False
datatype: TEXT

- table_name: transaction_type
table_columns:
- column_name: id
is_pk: True
datatype: INTEGER
nullable: False
- column_name: current_money_assigned
- column_name: name
is_pk: False
datatype: INTEGER
datatype: TEXT
nullable: False
- table_name: party

- table_name: category
table_columns:
- column_name: id
is_pk: True
datatype: INTEGER
nullable: False
- column_name: user_id
is_pk: False
datatype: INTEGER
is_fk: user.id
nullable: False
- column_name: name
is_pk: False
datatype: TEXT
nullable: False
- column_name: last_category
- column_name: budget_value
is_pk: False
datatype: TEXT
datatype: REAL
nullable: True
table_foreign_keys:
- column: last_category
references: category #self join for hierarchy
reference_column: id
- table_name: movement
- column_name: parent_id
is_pk: False
datatype: INTEGER
is_fk: category.id
nullable: True

- table_name: transaction_log
table_columns:
- column_name: id
is_pk: True
datatype: INTEGER
nullable: False
- column_name: date
is_pk: False
datatype: TEXT
nullable: False
- column_name: amount
- column_name: account_id
is_pk: False
datatype: INTEGER
is_fk: account.id
nullable: False
- column_name: category
- column_name: party_id
is_pk: False
datatype: INTEGER
nullable: False
- column_name: account
is_fk: party.id
nullable: True
- column_name: type_id
is_pk: False
datatype: INTEGER
is_fk: transaction_type.id
nullable: False
- column_name: party
- column_name: category_id
is_pk: False
datatype: INTEGER
is_fk: category.id
nullable: True
- column_name: amount
is_pk: False
datatype: REAL
nullable: False
table_foreign_keys:
- column: category
references: category #self join for hierarchy
reference_column: id
- column: account
references: account
reference_column: id
- column: party
references: party
reference_column: id
- column_name: notes
is_pk: False
datatype: TEXT
nullable: True
- column_name: datetime
is_pk: False
datatype: TEXT
nullable: False
42 changes: 18 additions & 24 deletions src/data_handler.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import sqlite3
import logging
from datetime import datetime

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -151,49 +150,44 @@ def print_table_schema(self, table_name):
except Exception as e:
logger.error(e)

def add_budget_name(self, budget_name: str) -> int:
"takes budget name string, returns budget id"
now = datetime.now()
formatted_datetime = now.strftime("%Y-%m-%d %H:%M:%S")
def add_user_name(self, user_name: str) -> int:
"takes user name string, returns user id"
logger.debug(
f"attempting to insert values into budget table {budget_name} | {
formatted_datetime
}"
f"attempting to insert values into user table {user_name}"
)
try:
connection = sqlite3.connect(self.database)
logger.debug("connection to db open")
cursor = connection.cursor()
logger.debug("cursor activated")
cursor.execute(
"""INSERT INTO budget (
name,
created_date
"""INSERT INTO user (
name
)
VALUES (?,?)
VALUES (?)
""",
(budget_name, formatted_datetime),
(user_name,),
)
logger.debug("cursor executed")
connection.commit()
budget_id = cursor.lastrowid
logger.debug(f"insert attempt seems successful, budget id is {budget_id}")
user_id = cursor.lastrowid
logger.debug(f"insert attempt seems successful, user id is {user_id}")

if budget_id is None:
budget_id = 0
if user_id is None:
user_id = 0
except Exception as e:
logger.error(f"Failed to insert budget name, error: {e}")
budget_id = 0
logger.error(f"Failed to insert user name, error: {e}")
user_id = 0
finally:
try:
connection.close()
logger.debug("connection to db closed")
return budget_id
return user_id
except Exception as e:
logger.error(f"failed to close connection message: {e}")
return 0

def get_budgets(self) -> list:
get_budget_sql = "SELECT name FROM budget"
budgets = self.read_database(get_budget_sql)
return budgets
def get_users(self) -> list:
get_user_sql = "SELECT name FROM user"
users = self.read_database(get_user_sql)
return users
26 changes: 13 additions & 13 deletions src/front/home.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,26 +15,26 @@
def home_page():
logger.info("home page hit")
db_call = data_handler.database(verity_config)
budgets = db_call.get_budgets()
return render_template("home.html", budgets=budgets)
users = db_call.get_users()
return render_template("home.html", users=users)


@home_bp.route("/submit", methods=["POST"])
def submit_budget_name():
budget_name = request.form.get("budgetName")
def submit_user_name():
user_name = request.form.get("userName")
logger.debug(f"Request Received: {request.form}")
if budget_name:
logger.info(f"User submitted new budget name: {budget_name}")
session["budget_name"] = budget_name
if user_name:
logger.info(f"User submitted new user name: {user_name}")
session["user_name"] = user_name
db_call = data_handler.database(verity_config)
budget_id = db_call.add_budget_name(budget_name)
if budget_id == 0:
user_id = db_call.add_user_name(user_name)
if user_id == 0:
# db entry failed, throw error message
flash("Budget Name not saved, please check the logs", "error")
flash("User Name not saved, please check the logs", "error")
return redirect(url_for("home.home_page"))
session["budget_id"] = budget_id
flash("Budget name saved!", "success")
session["user_id"] = user_id
flash("user name saved!", "success")
return redirect(url_for("home.home_page"))
else:
flash("Please enter a budget name.", "error")
flash("Please enter a user name.", "error")
return redirect(url_for("home.home_page"))
14 changes: 7 additions & 7 deletions src/front/templates/home.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,23 @@
%}
<h1>Home of Verity</h1>
<div>
<form action="{{url_for('home.submit_budget_name')}}" method="POST">
<p>New Budget Name:</p>
<form action="{{url_for('home.submit_user_name')}}" method="POST">
<p>New User:</p>
<input
type="text"
id="budgetName"
name="budgetName"
id="userName"
name="userName"
rows="4"
cols="50"
placeholder="Enter Budget Name Here"
placeholder="Enter User Name Here"
/>
<input type="submit" value="Submit" />
</form>
</div>
<div>
<p>
{% for budget in budgets %}
- {{ budget[0] }}<br>
{% for user in users %}
- {{ user[0] }}<br>
{% endfor %}
</p>
</div>
Expand Down
35 changes: 17 additions & 18 deletions src/tests/test_data_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,10 @@ def test_db_call():


def test_execute_sql_success(test_db_call):
sql_statement = """INSERT INTO budget (
name,
created_date
sql_statement = """INSERT INTO user (
name
)
VALUES ('a_budget_name','2025-05-23 09:04:00')
VALUES ('a_user_name')
"""
result = test_db_call.execute_sql(sql_statement)
assert result
Expand All @@ -33,28 +32,28 @@ def test_execute_sql_error(test_db_call):

def test_read_database(test_db_call):
# Test reading database data
sql_statement = "SELECT name FROM budget"
sql_statement = "SELECT name FROM user"
results = test_db_call.read_database(sql_statement)
assert isinstance(results, list)
# Check the contents of the list
# self.assertIsNotNone(results)
# self.assertIsInstance(results[0], str)


def test_add_budget_name(test_db_call):
# Test adding a new budget name
budget_name = "Test Budget"
budget_id = test_db_call.add_budget_name(budget_name)
assert budget_id is not None
# Check if the budget name was actually added
def test_add_user_name(test_db_call):
# Test adding a new user name
user_name = "Test user"
user_id = test_db_call.add_user_name(user_name)
assert user_id is not None
# Check if the user name was actually added
# You might need to query the database to verify
# self.assertEqual(budget_id, 1)
# self.assertEqual(user_id, 1)


def test_get_budgets(test_db_call):
# Test getting budgets
budgets = test_db_call.get_budgets()
assert isinstance(budgets, list)
def test_get_users(test_db_call):
# Test getting users
users = test_db_call.get_users()
assert isinstance(users, list)
# Check the contents of the list
# self.assertIsNotNone(budgets)
# self.assertIsInstance(budgets[0], str)
# self.assertIsNotNone(users)
# self.assertIsInstance(users[0], str)