diff --git a/main.py b/main.py index b576950..efc2b8a 100644 --- a/main.py +++ b/main.py @@ -1,27 +1,10 @@ from models.utils import DatabaseUtils -from ui.selection_menu import SelectionMenu -from ui.input_menu import InputMenu -from services.encryption import Encryption from models.database import Database +from views.login_menu import LoginMenu def main(): - # main_menu = SelectionMenu("Main Menu").add_option("Login", damn).add_option("Exit", damn).display() - # action = main_menu.input_option() - # action() - - # main_form = InputMenu("User Information") - # main_form.add_option("USERNAME", "STR", "Username", 1, 254) - # main_form.add_option("PASSWORD", "STR", "Password", 1, 254) - # main_form.add_option("AGE", "INT", "Age", 5, 100) - - # main_form.do_input() - - # print(main_form.get_value("USERNAME")) Database.init() DatabaseUtils.init_city_data() - - -def damn(): - print("dsdd") + LoginMenu.display() main() \ No newline at end of file diff --git a/models/database.py b/models/database.py index 888e739..2c48da3 100644 --- a/models/database.py +++ b/models/database.py @@ -37,7 +37,8 @@ class Database: cursor = Database.connection.cursor() cursor.execute(""" CREATE TABLE IF NOT EXISTS users ( - id INTEGER PRIMARY KEY, + id INTEGER PRIMARY KEY, + username TEXT, firstname TEXT, lastname TEXT, address TEXT, diff --git a/models/user.py b/models/user.py index 48c8c40..2b67f82 100644 --- a/models/user.py +++ b/models/user.py @@ -2,9 +2,10 @@ import sqlite3 from models.database import Database class User: - def __init__(self, connection : sqlite3.Connection, id = None, firstname = None, lastname = None, address = None, zipcode = None, city_id = None, email = None, phone = None, password = None, role = None): + def __init__(self, connection : sqlite3.Connection, id = None, username = None, firstname = None, lastname = None, address = None, zipcode = None, city_id = None, email = None, phone = None, password = None, role = None): self.connection = connection self.id = id + self.username = username self.firstname = firstname self.lastname = lastname self.address = address @@ -27,12 +28,24 @@ class User: cur.close() return True + def load_by_username(self): + cur = Database.connection.cursor() + row = cur.execute("SELECT * FROM users WHERE username = ?", (self.username,)).fetchone() + + if row == None: + return False + + self._set_row_values(row) + + cur.close() + return True + def save(self): cur = Database.connection.cursor() cur.execute(""" INSERT INTO users - (id, fistname, lastname, address, zipcode, city_id, email, phone, password, role) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - """, (self.id, self.firstname, self.lastname, self.zipcode, self.city_id, self.email, self.phone, self.password, self.role)) + (id, username, fistname, lastname, address, zipcode, city_id, email, phone, password, role) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, (self.id, self.username, self.firstname, self.lastname, self.zipcode, self.city_id, self.email, self.phone, self.password, self.role)) Database.connection.commit() cur.close() @@ -42,6 +55,7 @@ class User: cur = Database.connection.cursor() cur.execute(""" UPDATE users SET + username = ?, fistname = ?, lastname = ?, address = ?, @@ -52,7 +66,7 @@ class User: password = ?, role = ?, WHERE id = ? - """, (self.firstname, self.lastname, self.zipcode, self.city_id, self.email, self.phone, self.password, self.role, self.id)) + """, (self.username, self.firstname, self.lastname, self.zipcode, self.city_id, self.email, self.phone, self.password, self.role, self.id)) Database.connection.commit() cur.close() @@ -60,13 +74,14 @@ class User: def _set_row_values(self, row): self.id = row[0] - self.firstname = row[1] - self.lastname = row[2] - self.address = row[3] - self.zipcode = row[4] - self.city_id = row[5] - self.email = row[6] - self.phone = row[7] - self.password = row[8] - self.role = row[9] + self.username = row[1] + self.firstname = row[2] + self.lastname = row[3] + self.address = row[4] + self.zipcode = row[5] + self.city_id = row[6] + self.email = row[7] + self.phone = row[8] + self.password = row[9] + self.role = row[10] \ No newline at end of file diff --git a/services/auth.py b/services/auth.py new file mode 100644 index 0000000..318c4ac --- /dev/null +++ b/services/auth.py @@ -0,0 +1,9 @@ +from models.database import Database +from models.user import User + +class Auth: + def check_auth(username, password): + user = User(Database.connection, None, username) + if user.load_by_username() and user.password == password: + return user + return None \ No newline at end of file diff --git a/services/state.py b/services/state.py new file mode 100644 index 0000000..3b470d4 --- /dev/null +++ b/services/state.py @@ -0,0 +1,5 @@ +from ast import Import +from models.user import User + +class State: + CURRENT_USER: User = None \ No newline at end of file diff --git a/ui/input_menu.py b/ui/input_menu.py index 0d91503..e6520ad 100644 --- a/ui/input_menu.py +++ b/ui/input_menu.py @@ -11,7 +11,7 @@ class InputMenu: def do_input(self): print("") - print(f"/--[ {self._title} ]----------------------------") + print(f"/--[ {self._title} ]-------------") for i in range(len(self._fields)): data = None diff --git a/views/login_menu.py b/views/login_menu.py new file mode 100644 index 0000000..ed4320f --- /dev/null +++ b/views/login_menu.py @@ -0,0 +1,24 @@ +from time import sleep +from services.auth import Auth +from ui.input_menu import InputMenu +from services.state import State +from views.main_menu import MainMenu +import os + +class LoginMenu: + @staticmethod + def display(): + while True: + os.system("clear") + login_form = InputMenu("Login Into Furnicur Family System") + login_form.add_option("USERNAME", "STR", "Username", 1, 250).add_option("PASSWORD", "STR", "Password", 1, 250).do_input() + + user = Auth.check_auth(login_form.get_value("USERNAME"), login_form.get_value("PASSWORD")) + if user: + State.CURRENT_USER = user + break + + print("Invalid Credentials! Please try again.") + sleep(1) + + MainMenu.display() \ No newline at end of file diff --git a/views/main_menu.py b/views/main_menu.py new file mode 100644 index 0000000..896e55e --- /dev/null +++ b/views/main_menu.py @@ -0,0 +1,44 @@ +import os +from services.state import State +from ui.selection_menu import SelectionMenu +from views.member_menu import MemberMenu + +class MainMenu: + @staticmethod + def display(): + while True: + os.system("clear") + main_menu = SelectionMenu(f"Welcome {State.CURRENT_USER.username}!") + + if State.CURRENT_USER.role == "ADVISOR" or State.CURRENT_USER.role == "SYSTEM_ADMIN": + main_menu.add_option("Update My Password", None) + main_menu.add_option("Manage Members", MainMenu.manage_members) + + if State.CURRENT_USER.role == "SYSTEM_ADMIN" and State.CURRENT_USER.role == "SUPER_ADMIN": + main_menu.add_option("Manage Advisors", None) + + main_menu.add_option("Exit...", None) + + selected_option = main_menu.display().input_option() + if selected_option == None: + exit(0) + + selected_option() + + @staticmethod + def manage_members(): + os.system("clear") + + menu = SelectionMenu(f"Manage Members") + menu.add_option("Add Member", MemberMenu.add_member) + menu.add_option("Edit Member", MemberMenu.edit_member) + menu.add_option("Remove Member", MemberMenu.remove_member) + menu.add_option("Back to main menu", None) + + selected_option = menu.display().input_option() + if selected_option == None: + return + + selected_option() + + diff --git a/views/member_menu.py b/views/member_menu.py new file mode 100644 index 0000000..7dd84b9 --- /dev/null +++ b/views/member_menu.py @@ -0,0 +1,27 @@ + +from ui.input_menu import InputMenu + + +class MemberMenu: + @staticmethod + def add_member(): + menu = InputMenu() + menu.add_option("USERNAME", "STR", "Username", 1, 250) + menu.add_option("FIRSTNAME", "STR", "Firstname", 1, 250) + menu.add_option("LASTNAME", "STR", "Lastname", 1, 250) + menu.add_option("ADDRESS", "STR", "Address", 1, 250) + menu.add_option("ZIPCODE", "STR", "Zipcode", 1, 250) + menu.add_option("CITY_ID", "STR", "City", 1, 250) + menu.add_option("EMAIL", "STR", "Email", 1, 250) + menu.add_option("PHONE", "STR", "Phone", 1, 250) + menu.add_option("PASSWORD", "STR", "Password", 1, 250) + + pass + + @staticmethod + def edit_member(): + pass + + @staticmethod + def remove_member(): + pass \ No newline at end of file diff --git a/views/system_admin_menu.py b/views/system_admin_menu.py new file mode 100644 index 0000000..bbe16aa --- /dev/null +++ b/views/system_admin_menu.py @@ -0,0 +1,4 @@ +class SystemAdminMenu: + @staticmethod + def display(): + pass \ No newline at end of file