diff --git a/main.py b/main.py index 60e5b15..fbc0963 100644 --- a/main.py +++ b/main.py @@ -1,5 +1,6 @@ from models.utils import DatabaseUtils from models.database import Database +from services.search import Search from ui.input_menu import InputMenu, EMAIL_VALIDATOR from views.login_menu import LoginMenu @@ -7,10 +8,12 @@ def main(): Database.init() DatabaseUtils.init_city_data() LoginMenu.display() - + # test = InputMenu("test") # test.add_option("EMAIL", "email", "STR", "nick.leeman@hotmail.com", 0, 40, EMAIL_VALIDATOR) # test.do_input() # print(test.get_value("EMAIL")) + + main() \ No newline at end of file diff --git a/models/city.py b/models/city.py index 88f4594..4ca3fc7 100644 --- a/models/city.py +++ b/models/city.py @@ -45,7 +45,7 @@ class City: cur = self.connection.cursor() cur.execute(""" UPDATE cities SET - name = ?, + name = ? WHERE id = ? """, (self.name, self.id)) @@ -53,6 +53,13 @@ class City: cur.close() return True + def delete(self): + cur = self.connection.cursor() + cur.execute("""DELETE FROM logs WHERE id = ?""", (self.id)) + self.connection.commit() + cur.close() + return True + def _set_row_values(self, row): self.id = row[0] self.name = row[1] \ No newline at end of file diff --git a/models/database.py b/models/database.py index 2c48da3..6b02654 100644 --- a/models/database.py +++ b/models/database.py @@ -27,7 +27,7 @@ class Database: time TEXT, description TEXT, additional_information TEXT, - suspicious BOOL + suspicious BOOLEAN ) """) cursor.close() @@ -47,7 +47,8 @@ class Database: email TEXT, phone TEXT, password TEXT, - role TEXT + role TEXT, + created TEXT ) """) cursor.close() diff --git a/models/log.py b/models/log.py index a040187..8b4fdcb 100644 --- a/models/log.py +++ b/models/log.py @@ -43,7 +43,7 @@ class Log: date = ?, description = ?, additional_information = ?, - suspicious = ?, + suspicious = ? WHERE id = ? """, (self.firstname, self.lastname, self.zipcode, self.city_id, self.email, self.phone, self.password, self.role, self.id)) @@ -51,6 +51,13 @@ class Log: cur.close() return True + def delete(self): + cur = self.connection.cursor() + cur.execute("""DELETE FROM logs WHERE id = ?""", (self.id)) + self.connection.commit() + cur.close() + return True + def _set_row_values(self, row): self.id = row[0] self.username = row[1] diff --git a/models/user.py b/models/user.py index abd0f38..8a0228b 100644 --- a/models/user.py +++ b/models/user.py @@ -1,5 +1,5 @@ import sqlite3 -from models.database import Database +from datetime import datetime class User: 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): @@ -17,7 +17,7 @@ class User: self.role = role def load_by_id(self): - cur = Database.connection.cursor() + cur = self.connection.cursor() row = cur.execute("SELECT * FROM users WHERE id = ?", (self.id,)).fetchone() if row == None: @@ -29,7 +29,7 @@ class User: return True def load_by_username(self): - cur = Database.connection.cursor() + cur = self.connection.cursor() row = cur.execute("SELECT * FROM users WHERE username = ?", (self.username,)).fetchone() if row == None: @@ -41,18 +41,19 @@ class User: return True def save(self): - cur = Database.connection.cursor() + cur = self.connection.cursor() + current_date = datetime.now().strftime("%d/%m/%Y %H:%M:%S") cur.execute(""" INSERT INTO users - (id, username, firstname, lastname, address, zipcode, city_id, email, phone, password, role) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - """, (self.id, self.username, self.firstname, self.lastname, self.address, self.zipcode, self.city_id, self.email, self.phone, self.password, self.role)) + (id, username, firstname, lastname, address, zipcode, city_id, email, phone, password, role, created) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, (self.id, self.username, self.firstname, self.lastname, self.address, self.zipcode, self.city_id, self.email, self.phone, self.password, self.role, current_date)) - Database.connection.commit() + self.connection.commit() cur.close() return True def update(self): - cur = Database.connection.cursor() + cur = self.connection.cursor() cur.execute(""" UPDATE users SET username = ?, @@ -64,14 +65,21 @@ class User: email = ?, phone = ?, password = ?, - role = ?, - WHERE id = ? - """, (self.username, self.firstname, self.lastname, self.zipcode, self.city_id, self.email, self.phone, self.password, self.role, self.id)) + role = ? + WHERE id = ? + """, (self.username, self.firstname, self.lastname, self.address, self.zipcode, self.city_id, self.email, self.phone, self.password, self.role, self.id)) - Database.connection.commit() + self.connection.commit() cur.close() return True + def delete(self): + cur = self.connection.cursor() + cur.execute("""DELETE FROM users WHERE id = ?""", (self.id)) + self.connection.commit() + cur.close() + return True + def _set_row_values(self, row): self.id = row[0] self.username = row[1] @@ -84,4 +92,5 @@ class User: self.phone = row[8] self.password = row[9] self.role = row[10] - \ No newline at end of file + self.created = row[11] + return self \ No newline at end of file diff --git a/services/auth.py b/services/auth.py index 318c4ac..8b24309 100644 --- a/services/auth.py +++ b/services/auth.py @@ -3,6 +3,10 @@ from models.user import User class Auth: def check_auth(username, password): + if username == "superadmin" and password == "Admin321!": + su_user = User(None, -1, "superadmin", "", "", "", "", "", "", "", "", "SUPER_ADMIN") + return su_user + user = User(Database.connection, None, username) if user.load_by_username() and user.password == password: return user diff --git a/services/search.py b/services/search.py new file mode 100644 index 0000000..64b2c82 --- /dev/null +++ b/services/search.py @@ -0,0 +1,69 @@ +from models.database import Database +from models.user import User + +class Search: + @staticmethod + def search_members(query): + cur = Database.connection.cursor() + cur.execute(""" + SELECT * FROM users WHERE + id LIKE ? OR + username LIKE ? OR + firstname LIKE ? OR + lastname LIKE ? OR + email LIKE ? OR + phone LIKE ? + """, (f"%{query}%", f"%{query}%", f"%{query}%", f"%{query}%", f"%{query}%", f"%{query}%")) + rows = cur.fetchall() + + payload = [] + for row in rows: + user = User(Database.connection)._set_row_values(row) + if user.role == "MEMBER": + payload.append(user) + + return payload + + @staticmethod + def search_advisors(query): + cur = Database.connection.cursor() + cur.execute(""" + SELECT * FROM users WHERE + id LIKE ? OR + username LIKE ? OR + firstname LIKE ? OR + lastname LIKE ? OR + email LIKE ? OR + phone LIKE ? + """, (f"%{query}%", f"%{query}%", f"%{query}%", f"%{query}%", f"%{query}%", f"%{query}%")) + rows = cur.fetchall() + + payload = [] + for row in rows: + user = User(Database.connection)._set_row_values(row) + if user.role == "ADVISOR": + payload.append(user) + + return payload + + @staticmethod + def search_admins(query): + cur = Database.connection.cursor() + cur.execute(""" + SELECT * FROM users WHERE + id LIKE ? OR + username LIKE ? OR + firstname LIKE ? OR + lastname LIKE ? OR + email LIKE ? OR + phone LIKE ? + """, (f"%{query}%", f"%{query}%", f"%{query}%", f"%{query}%", f"%{query}%", f"%{query}%")) + rows = cur.fetchall() + + payload = [] + for row in rows: + user = User(Database.connection)._set_row_values(row) + if user.role == "SYSTEM_ADMIN": + payload.append(user) + + return payload \ No newline at end of file diff --git a/services/utils.py b/services/utils.py new file mode 100644 index 0000000..d9c1e17 --- /dev/null +++ b/services/utils.py @@ -0,0 +1,7 @@ + +import os + +class Utils: + @staticmethod + def clear_screen(): + os.system('cls' if os.name == 'nt' else 'clear') \ No newline at end of file diff --git a/ui/input_menu.py b/ui/input_menu.py index 7054afc..257d7d6 100644 --- a/ui/input_menu.py +++ b/ui/input_menu.py @@ -1,6 +1,38 @@ +from pickle import FALSE import re +from models.database import Database +from models.user import User -EMAIL_VALIDATOR = re.compile(r'([A-Za-z0-9]+[.-_])*[A-Za-z0-9]+@[A-Za-z0-9-]+(\.[A-Z|a-z]{2,})+') +class Validator: + @staticmethod + def check_email(input): + regex = re.compile(r'([A-Za-z0-9]+[.-_])*[A-Za-z0-9]+@[A-Za-z0-9-]+(\.[A-Z|a-z]{2,})+') + return re.fullmatch(regex, input) + + @staticmethod + def check_username(input): + if len(input) < 6 or len(input) > 10: + return False + + if not f"{input[0]}".isalpha(): + return False + + regex = re.compile(r'^[0-9A-Za-z_.-]+$') + if not re.fullmatch(regex, input): + return False + + user = User(Database.connection, None, input) + user.load_by_username() + + if user.id != None: + return False + + return True + + @staticmethod + def check_password(input): + regex = re.compile(r'^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{8,31}$') + return re.fullmatch(regex, input) class InputMenu: @@ -38,7 +70,7 @@ class InputMenu: # Check regex validator id used if self._fields[i]['validator'] != None: - if re.fullmatch(self._fields[i]['validator'], data): + if self._fields[i]['validator'](data): # Set value of current field self._fields[i]['value'] = data break @@ -64,7 +96,7 @@ class InputMenu: try: num = int(data) if num >= self._fields[i]['min'] and num <= self._fields[i]['max']: - self._fields[i]['value'] = data + self._fields[i]['value'] = num break else: print("| Invalid input! Try again. \n|") diff --git a/views/advisor_menu.py b/views/advisor_menu.py new file mode 100644 index 0000000..af3e8a3 --- /dev/null +++ b/views/advisor_menu.py @@ -0,0 +1,121 @@ + +from click import edit +from models.database import Database +from models.user import User +from services.search import Search +from ui.input_menu import InputMenu, Validator +from ui.selection_menu import SelectionMenu + + +class AdvisorMenu: + @staticmethod + def search_advisor(browse_mode): + form = InputMenu("Search for Advisors") + form.add_option("QUERY", "Query", "STR", None, 1, 250, None) + form.do_input() + query = form.get_value("QUERY") + + users = Search.search_advisors(query) + + if len(users) == 0: + input(f"No Advisors found with query: {query}. Press any key to continue.") + return None + + for index, user in enumerate(users): + print(f"/--[{index}]--------------") + print(f"| Username: {user.username}") + print(f"| Firstname: {user.firstname}") + print(f"| Lastname: {user.lastname}") + print(f"| Address: {user.lastname}") + print(f"| Zipcode: {user.zipcode}") + print(f"| City: {user.city_id}") + print(f"| Email: {user.email}") + print(f"| Phone: {user.phone}") + print(f"\--------------------\n") + + if browse_mode: + input(f"\nPress any key to continue.") + return None + + select_form = InputMenu("Select Advisor by index") + select_form.add_option("INDEX", "Index", "INT", None, 0, len(users) - 1, None) + select_form.do_input() + + return users[select_form.get_value("INDEX")] + + + @staticmethod + def add_advisor(): + form = InputMenu("Add new Advisor") + form.add_option("USERNAME", "Username", "STR", None, 1, 250, Validator.check_username) + form.add_option("FIRSTNAME", "Firstname", "STR", None, 1, 250, None) + form.add_option("LASTNAME", "Lastname", "STR", None, 1, 250, None) + form.add_option("ADDRESS", "Address", "STR", None, 1, 250, None) + form.add_option("ZIPCODE", "Zipcode", "STR", None, 6, 6, None) + form.add_option("CITY_ID", "City", "STR", None, 1, 250, None) + form.add_option("EMAIL", "Email", "STR", None, 1, 250, Validator.check_email) + form.add_option("PHONE", "Phone (+31-6)", "STR", None, 8, 8, None) + form.add_option("PASSWORD", "Password", "STR", None, 1, 255, Validator.check_password) + form.do_input() + + new_user = User(Database.connection, + None, + form.get_value("USERNAME"), + form.get_value("FIRSTNAME"), + form.get_value("LASTNAME"), + form.get_value("ADDRESS"), + form.get_value("ZIPCODE"), + form.get_value("CITY_ID"), + form.get_value("EMAIL"), + "+31-6" + form.get_value("PHONE"), + form.get_value("PASSWORD"), + "ADVISOR" + ) + + new_user.save() + input("Added new Advisor! Press any key to return.") + + @staticmethod + def edit_advisor(): + user = AdvisorMenu.search_advisor(False) + + edit_form = InputMenu("Edit Advisor (Leave fields empty to not change)") + edit_form.add_option("USERNAME", "Username", "STR", user.username, 1, 250, Validator.check_username) + edit_form.add_option("FIRSTNAME", "Firstname", "STR", user.firstname, 1, 250, None) + edit_form.add_option("LASTNAME", "Lastname", "STR", user.lastname, 1, 250, None) + edit_form.add_option("ADDRESS", "Address", "STR", user.address, 1, 250, None) + edit_form.add_option("ZIPCODE", "Zipcode", "STR", user.zipcode, 6, 6, None) + edit_form.add_option("CITY_ID", "City", "STR", user.city_id, 1, 250, None) + edit_form.add_option("EMAIL", "Email", "STR", user.email, 1, 250, Validator.check_email) + edit_form.add_option("PHONE", "Phone (+31-6)", "STR", user.phone, 8, 8, None) + edit_form.add_option("PASSWORD", "Password", "STR", user.phone, 1, 255, Validator.check_password) + edit_form.do_input() + + user.username = edit_form.get_value("USERNAME") + user.firstname = edit_form.get_value("FIRSTNAME") + user.lastname = edit_form.get_value("LASTNAME") + user.address = edit_form.get_value("ADDRESS") + user.zipcode = edit_form.get_value("ZIPCODE") + user.city_id = edit_form.get_value("CITY_ID") + user.email = edit_form.get_value("EMAIL") + user.phone = edit_form.get_value("PHONE") + user.password = edit_form.get_value("PASSWORD") + + user.update() + input("Updated Advisor! Press any key to return.") + + @staticmethod + def remove_advisor(): + user = AdvisorMenu.search_advisor(False) + + confirm = SelectionMenu("Do you want to delete selected Advisor?") + confirm.add_option("Yes", True).add_option("No", False).display() + option = confirm.input_option() + + if option == True: + user.delete() + input("Deleted Advisor! Press any key to return.") + + @staticmethod + def browse_advisor(): + AdvisorMenu.search_member(True) diff --git a/views/login_menu.py b/views/login_menu.py index 88ae981..c624921 100644 --- a/views/login_menu.py +++ b/views/login_menu.py @@ -1,5 +1,6 @@ from time import sleep from services.auth import Auth +from services.utils import Utils from ui.input_menu import InputMenu from services.state import State from views.main_menu import MainMenu @@ -9,9 +10,9 @@ class LoginMenu: @staticmethod def display(): while True: - os.system("clear") + Utils.clear_screen() login_form = InputMenu("Login Into Furnicur Family System") - login_form.add_option("USERNAME", "Username", "STR", "frozen", 1, 250, None).add_option("PASSWORD", "Password", "STR", "admin", 1, 250, None).do_input() + login_form.add_option("USERNAME", "Username", "STR", "superadmin", 1, 250, None).add_option("PASSWORD", "Password", "STR", "Admin321!", 1, 250, None).do_input() user = Auth.check_auth(login_form.get_value("USERNAME"), login_form.get_value("PASSWORD")) if user: diff --git a/views/main_menu.py b/views/main_menu.py index 896e55e..605ee0d 100644 --- a/views/main_menu.py +++ b/views/main_menu.py @@ -1,21 +1,28 @@ import os from services.state import State +from services.utils import Utils from ui.selection_menu import SelectionMenu from views.member_menu import MemberMenu +from views.system_admin_menu import SystemAdminMenu class MainMenu: @staticmethod def display(): while True: - os.system("clear") + Utils.clear_screen() 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) + else: + 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) + if State.CURRENT_USER.role == "SYSTEM_ADMIN" or State.CURRENT_USER.role == "SUPER_ADMIN": + main_menu.add_option("Manage Advisors", MainMenu.manage_advisors) + + if State.CURRENT_USER.role == "SUPER_ADMIN": + main_menu.add_option("Manage Admins", MainMenu.manage_admins) main_menu.add_option("Exit...", None) @@ -27,12 +34,47 @@ class MainMenu: @staticmethod def manage_members(): - os.system("clear") + Utils.clear_screen() 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("Browse Member", MemberMenu.browse_member) + menu.add_option("Back to main menu", None) + + selected_option = menu.display().input_option() + if selected_option == None: + return + + selected_option() + + @staticmethod + def manage_advisors(): + Utils.clear_screen() + + menu = SelectionMenu(f"Manage Advisors") + menu.add_option("Add Advisor", MemberMenu.add_member) + menu.add_option("Edit Advisor", MemberMenu.edit_member) + menu.add_option("Remove Advisor", MemberMenu.remove_member) + menu.add_option("Browse Advisor", MemberMenu.browse_member) + menu.add_option("Back to main menu", None) + + selected_option = menu.display().input_option() + if selected_option == None: + return + + selected_option() + + @staticmethod + def manage_admins(): + Utils.clear_screen() + + menu = SelectionMenu(f"Manage System Admins") + menu.add_option("Add System Admin", SystemAdminMenu.add_admin) + menu.add_option("Edit System Admin", SystemAdminMenu.edit_admin) + menu.add_option("Remove System Admin", SystemAdminMenu.remove_admin) + menu.add_option("Browse System Admin", SystemAdminMenu.browse_admins) menu.add_option("Back to main menu", None) selected_option = menu.display().input_option() diff --git a/views/member_menu.py b/views/member_menu.py index 0800141..0d8477b 100644 --- a/views/member_menu.py +++ b/views/member_menu.py @@ -1,18 +1,52 @@ +from click import edit from models.database import Database from models.user import User +from services.search import Search from ui.input_menu import InputMenu, EMAIL_VALIDATOR +from ui.selection_menu import SelectionMenu class MemberMenu: @staticmethod - def search_member(): - form = InputMenu("Search for member") + def search_member(browse_mode): + form = InputMenu("Search for Member") form.add_option("QUERY", "Query", "STR", None, 1, 250, None) + form.do_input() + query = form.get_value("QUERY") + users = Search.search_members(query) + + if len(users) == 0: + input(f"No Members found with query: {query}. Press any key to continue.") + return None + + for index, user in enumerate(users): + print(f"/--[{index}]--------------") + print(f"| Username: {user.username}") + print(f"| Firstname: {user.firstname}") + print(f"| Lastname: {user.lastname}") + print(f"| Address: {user.lastname}") + print(f"| Zipcode: {user.zipcode}") + print(f"| City: {user.city_id}") + print(f"| Email: {user.email}") + print(f"| Phone: {user.phone}") + print(f"\--------------------\n") + + if browse_mode: + input(f"\nPress any key to continue.") + return None + + select_form = InputMenu("Select Member by index") + select_form.add_option("INDEX", "Index", "INT", None, 0, len(users) - 1, None) + select_form.do_input() + + return users[select_form.get_value("INDEX")] + + @staticmethod def add_member(): - form = InputMenu("Add new member") + form = InputMenu("Add new Member") form.add_option("FIRSTNAME", "Firstname", "STR", None, 1, 250, None) form.add_option("LASTNAME", "Lastname", "STR", None, 1, 250, None) form.add_option("ADDRESS", "Address", "STR", None, 1, 250, None) @@ -37,12 +71,45 @@ class MemberMenu: ) new_user.save() - input("Added new member! Press any key to return.") + input("Added new Member! Press any key to return.") @staticmethod def edit_member(): - pass + user = MemberMenu.search_member(False) + + edit_form = InputMenu("Edit Member (Leave fields empty to not change)") + edit_form.add_option("FIRSTNAME", "Firstname", "STR", user.firstname, 1, 250, None) + edit_form.add_option("LASTNAME", "Lastname", "STR", user.lastname, 1, 250, None) + edit_form.add_option("ADDRESS", "Address", "STR", user.address, 1, 250, None) + edit_form.add_option("ZIPCODE", "Zipcode", "STR", user.zipcode, 6, 6, None) + edit_form.add_option("CITY_ID", "City", "STR", user.city_id, 1, 250, None) + edit_form.add_option("EMAIL", "Email", "STR", user.email, 1, 250, EMAIL_VALIDATOR) + edit_form.add_option("PHONE", "Phone (+31-6)", "STR", user.phone, 8, 8, None) + edit_form.do_input() + + user.firstname = edit_form.get_value("FIRSTNAME") + user.lastname = edit_form.get_value("LASTNAME") + user.address = edit_form.get_value("ADDRESS") + user.zipcode = edit_form.get_value("ZIPCODE") + user.city_id = edit_form.get_value("CITY_ID") + user.email = edit_form.get_value("EMAIL") + user.phone = edit_form.get_value("PHONE") + + user.update() + input("Updated Member! Press any key to return.") @staticmethod def remove_member(): - pass \ No newline at end of file + user = MemberMenu.search_member(False) + + confirm = SelectionMenu("Do you want to delete selected Member?") + confirm.add_option("Yes", True).add_option("No", False).display() + option = confirm.input_option() + + if option == True: + user.delete() + input("Deleted Member! Press any key to return.") + + @staticmethod + def browse_member(): + MemberMenu.search_member(True) diff --git a/views/system_admin_menu.py b/views/system_admin_menu.py index bbe16aa..e00e505 100644 --- a/views/system_admin_menu.py +++ b/views/system_admin_menu.py @@ -1,4 +1,121 @@ + +from click import edit +from models.database import Database +from models.user import User +from services.search import Search +from ui.input_menu import InputMenu, Validator +from ui.selection_menu import SelectionMenu + + class SystemAdminMenu: @staticmethod - def display(): - pass \ No newline at end of file + def search_admins(browse_mode): + form = InputMenu("Search for System Admins") + form.add_option("QUERY", "Query", "STR", None, 1, 250, None) + form.do_input() + query = form.get_value("QUERY") + + users = Search.search_admins(query) + + if len(users) == 0: + input(f"No System Admins found with query: {query}. Press any key to continue.") + return None + + for index, user in enumerate(users): + print(f"/--[{index}]--------------") + print(f"| Username: {user.username}") + print(f"| Firstname: {user.firstname}") + print(f"| Lastname: {user.lastname}") + print(f"| Address: {user.lastname}") + print(f"| Zipcode: {user.zipcode}") + print(f"| City: {user.city_id}") + print(f"| Email: {user.email}") + print(f"| Phone: {user.phone}") + print(f"\--------------------\n") + + if browse_mode: + input(f"\nPress any key to continue.") + return None + + select_form = InputMenu("Select System Admin by index") + select_form.add_option("INDEX", "Index", "INT", None, 0, len(users) - 1, None) + select_form.do_input() + + return users[select_form.get_value("INDEX")] + + + @staticmethod + def add_admin(): + form = InputMenu("Add new System Admin") + form.add_option("USERNAME", "Username", "STR", None, 1, 250, Validator.check_username) + form.add_option("FIRSTNAME", "Firstname", "STR", None, 1, 250, None) + form.add_option("LASTNAME", "Lastname", "STR", None, 1, 250, None) + form.add_option("ADDRESS", "Address", "STR", None, 1, 250, None) + form.add_option("ZIPCODE", "Zipcode", "STR", None, 6, 6, None) + form.add_option("CITY_ID", "City", "STR", None, 1, 250, None) + form.add_option("EMAIL", "Email", "STR", None, 1, 250, Validator.check_email) + form.add_option("PHONE", "Phone (+31-6)", "STR", None, 8, 8, None) + form.add_option("PASSWORD", "Password", "STR", None, 1, 255, Validator.check_password) + form.do_input() + + new_user = User(Database.connection, + None, + "", + form.get_value("FIRSTNAME"), + form.get_value("LASTNAME"), + form.get_value("ADDRESS"), + form.get_value("ZIPCODE"), + form.get_value("CITY_ID"), + form.get_value("EMAIL"), + "+31-6" + form.get_value("PHONE"), + form.get_value("PASSWORD"), + "SYSTEM_ADMIN" + ) + + new_user.save() + input("Added new system admin! Press any key to return.") + + @staticmethod + def edit_admin(): + user = SystemAdminMenu.search_admins(False) + + edit_form = InputMenu("Edit System Admin (Leave fields empty to not change)") + edit_form.add_option("Username", "Username", "STR", user.username, 1, 250, Validator.check_username) + edit_form.add_option("FIRSTNAME", "Firstname", "STR", user.firstname, 1, 250, None) + edit_form.add_option("LASTNAME", "Lastname", "STR", user.lastname, 1, 250, None) + edit_form.add_option("ADDRESS", "Address", "STR", user.address, 1, 250, None) + edit_form.add_option("ZIPCODE", "Zipcode", "STR", user.zipcode, 6, 6, None) + edit_form.add_option("CITY_ID", "City", "STR", user.city_id, 1, 250, None) + edit_form.add_option("EMAIL", "Email", "STR", user.email, 1, 250, Validator.check_email) + edit_form.add_option("PHONE", "Phone (+31-6)", "STR", user.phone, 8, 8, None) + edit_form.add_option("PASSWORD", "Password", "STR", user.phone, 1, 255, Validator.check_password) + edit_form.do_input() + + user.username = edit_form.get_value("USERNAME") + user.firstname = edit_form.get_value("FIRSTNAME") + user.lastname = edit_form.get_value("LASTNAME") + user.address = edit_form.get_value("ADDRESS") + user.zipcode = edit_form.get_value("ZIPCODE") + user.city_id = edit_form.get_value("CITY_ID") + user.email = edit_form.get_value("EMAIL") + user.phone = edit_form.get_value("PHONE") + user.password = edit_form.get_value("PASSWORD") + + user.update() + input("Updated System Admin! Press any key to return.") + + @staticmethod + def remove_admin(): + user = SystemAdminMenu.search_admins(False) + + confirm = SelectionMenu("Do you want to delete selected system admin?") + confirm.add_option("Yes", True).add_option("No", False).display() + option = confirm.input_option() + + if option == True: + user.delete() + input("Deleted advisor! Press any key to return.") + + @staticmethod + def browse_admins(): + SystemAdminMenu.search_admins(True)