From e289098e062ef8b7d4d3fa0d0c817c930395b606 Mon Sep 17 00:00:00 2001 From: Alex Dimmock Date: Fri, 23 May 2025 13:26:54 +0100 Subject: [PATCH 1/3] Updated database schema to v2 and updated tests acordingly --- src/config_files/verity_schema.yaml | 118 ++++++++++++++-------------- src/data_handler.py | 41 +++++----- src/front/home.py | 26 +++--- src/front/templates/home.html | 14 ++-- src/tests/test_data_handler.py | 35 ++++----- 5 files changed, 113 insertions(+), 121 deletions(-) diff --git a/src/config_files/verity_schema.yaml b/src/config_files/verity_schema.yaml index 0706249..3e0d980 100644 --- a/src/config_files/verity_schema.yaml +++ b/src/config_files/verity_schema.yaml @@ -1,6 +1,7 @@ database_name: verity tables: - - table_name: budget + + - table_name: user table_columns: - column_name: id is_pk: True @@ -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 @@ -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 \ No newline at end of file diff --git a/src/data_handler.py b/src/data_handler.py index 16eb705..da9d3ce 100644 --- a/src/data_handler.py +++ b/src/data_handler.py @@ -151,14 +151,10 @@ 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) @@ -166,34 +162,33 @@ def add_budget_name(self, budget_name: str) -> int: 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 diff --git a/src/front/home.py b/src/front/home.py index 5f0a360..3fcec52 100644 --- a/src/front/home.py +++ b/src/front/home.py @@ -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")) diff --git a/src/front/templates/home.html b/src/front/templates/home.html index 633fc07..5f5d5ed 100644 --- a/src/front/templates/home.html +++ b/src/front/templates/home.html @@ -2,23 +2,23 @@ %}

Home of Verity

-
-

New Budget Name:

+ +

New User:

- {% for budget in budgets %} -- {{ budget[0] }}
+ {% for user in users %} +- {{ user[0] }}
{% endfor %}

diff --git a/src/tests/test_data_handler.py b/src/tests/test_data_handler.py index 379c6ff..85f8f01 100644 --- a/src/tests/test_data_handler.py +++ b/src/tests/test_data_handler.py @@ -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 @@ -33,7 +32,7 @@ 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 @@ -41,20 +40,20 @@ def test_read_database(test_db_call): # 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) From a3b410b26c3fc5c29da5fafd61d49bb77d7a6b5c Mon Sep 17 00:00:00 2001 From: Alex Dimmock Date: Fri, 23 May 2025 13:30:54 +0100 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20=F0=9F=A9=B9=20remove=20unused=20dat?= =?UTF-8?q?etime=20import=20from=20data=5Fhandler.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/data_handler.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/data_handler.py b/src/data_handler.py index da9d3ce..14724f7 100644 --- a/src/data_handler.py +++ b/src/data_handler.py @@ -1,6 +1,5 @@ import sqlite3 import logging -from datetime import datetime logger = logging.getLogger(__name__) From 4cdad76b72f6910e734eb41511de8772473d6599 Mon Sep 17 00:00:00 2001 From: Alex Dimmock Date: Fri, 23 May 2025 13:32:20 +0100 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=F0=9F=A9=B9=20correct=20capitalizat?= =?UTF-8?q?ion=20in=20flash=20message=20for=20user=20name=20error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/front/home.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/front/home.py b/src/front/home.py index 3fcec52..f452074 100644 --- a/src/front/home.py +++ b/src/front/home.py @@ -30,7 +30,7 @@ def submit_user_name(): user_id = db_call.add_user_name(user_name) if user_id == 0: # db entry failed, throw error message - flash("user 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["user_id"] = user_id flash("user name saved!", "success")