BonPrinter v1.2.0
Thermal Printer tool
Loading...
Searching...
No Matches
authentication.py
Go to the documentation of this file.
1"""!
2********************************************************************************
3@file authentication.py
4@brief User authentication
5********************************************************************************
6"""
7
8import logging
9import enum
10from typing import Optional, TYPE_CHECKING
11
12from Source.version import __title__
13from Source.Util.app_data import EUser, L_CONFIG_USER
14from Source.Util.gui_toolkit import create_timer
15if TYPE_CHECKING:
16 from Source.Controller.main_window import MainWindow
17
18log = logging.getLogger(__title__)
19
20
21class EWindowView(str, enum.Enum):
22 """!
23 @brief View of window.
24 """
25 MAIN = "main"
26 CALC = "calc"
27 MULTI = "multi"
28
29
31 """!
32 @brief Class Authentication: Part of the module to hold the data of the current authentication session
33 @param ui : main window object
34 """
35
36 def __init__(self, ui: "MainWindow") -> None:
37 self.ui = ui
38 self.s_login_user: str | None = None
39 self.b_login_state = False
40 self.e_view = EWindowView.MAIN
41 self.s_pw = ""
42 self.logout_timer = create_timer(parent=self.ui, callback=self.logout_callback) # statusbar timer
43
44 def logout_callback(self) -> None:
45 """!
46 @brief Logout timer callback
47 """
48 b_logout = True
49 if b_logout:
50 self.ui.btn_lock_clicked(b_auto_logout=True)
51 self.ui.set_status(["Inactivity - automatic logout", "Inaktivität - automatische Abmeldung"])
52
53 def start_timer(self) -> None:
54 """!
55 @brief Start auto logout.
56 """
57 f_timeout = self.ui.model.c_config.get_logout_time()
58 self.logout_timer.start(int(f_timeout * 1000))
59
60 def stop_timer(self) -> None:
61 """!
62 @brief deactivate auto logout.
63 """
64 self.logout_timer.stop()
65
66 def refresh_timer(self) -> None:
67 """!
68 @brief Start auto logout.
69 """
70 if self.logout_timer.isActive():
71 self.start_timer()
72
73 def check_user_login(self, user: EUser | list[EUser], user_to_check: Optional[EUser | str] = None) -> bool:
74 """!
75 @brief Check if user log in.
76 @param user : check if this user is logged in or list
77 @param user_to_check : check this user (not logged in user)
78 @return status if this user is logged in
79 """
80 b_user_logged_in = False
81 check_user = self.s_login_user if (user_to_check is None) else user_to_check
82 if check_user is not None:
83 if isinstance(user, list):
84 if check_user in user:
85 b_user_logged_in = True
86 elif EUser.B in user:
87 if check_user[0] == EUser.B:
88 b_user_logged_in = True
89 else:
90 match user:
91 case EUser.B:
92 if check_user[0] == user:
93 b_user_logged_in = True
94 case _:
95 if check_user == user:
96 b_user_logged_in = True
97 return b_user_logged_in
98
99 def get_user_position(self, user: Optional[EUser | str] = None) -> int | None:
100 """!
101 @brief Get user position.
102 @param user : get position of this user
103 @return user position
104 """
105 i_user_pos = None
106 get_user = self.s_login_user if (user is None) else user
107 match get_user:
108 case EUser.LOCAL | EUser.FREE:
109 i_user_pos = 0
110 case _:
111 if self.check_user_login(EUser.B, user_to_check=get_user):
112 if get_user is not None:
113 i_user_pos = int(get_user[1:])
114 else:
115 i_user_pos = None
116 self.ui.set_status("Invalid User for B", True) # state not possible
117 else:
118 i_user_pos = None
119 if not self.check_user_login(EUser.USER, user_to_check=get_user):
120 self.ui.set_status(f"Invalid User for position: {get_user}", True) # state not possible
121 return i_user_pos
122
123 def get_user_name_from_position(self, position: int) -> str:
124 """!
125 @brief Get user name from position
126 @param position : user position
127 @return user name
128 """
129 if position == 0:
130 user = EUser.LOCAL.value
131 else:
132 user = EUser.B.value + str(position)
133 return user
134
135 def log_in(self) -> None:
136 """!
137 @brief Log in user.
138 """
139 self.b_login_state = True
140 if self.check_user_login(EUser.B) or (self.check_user_login(EUser.FREE) and self.ui.model.c_config.get_free_auto_logout()):
141 self.start_timer()
142 self.ui.clear_status() # to update user in statusbar
143
144 def log_out(self) -> None:
145 """!
146 @brief Log out user.
147 """
148 if self.b_login_state:
149 self.e_view = EWindowView.MAIN
150 self.b_login_state = False
151 self.s_login_user = None
152 self.stop_timer()
153 self.ui.clear_status() # to update user in statusbar
154
155 def get_article_view_state(self) -> bool:
156 """!
157 @brief Get status if articles view.
158 @return status of article view
159 """
160 return bool(self.b_login_state and (self.e_view == EWindowView.MAIN))
Class Authentication: Part of the module to hold the data of the current authentication session.
bool get_article_view_state(self)
Get status if articles view.
None refresh_timer(self)
Start auto logout.
None start_timer(self)
Start auto logout.
None logout_callback(self)
Logout timer callback.
bool check_user_login(self, EUser|list[EUser] user, Optional[EUser|str] user_to_check=None)
Check if user log in.
None stop_timer(self)
deactivate auto logout.
int|None get_user_position(self, Optional[EUser|str] user=None)
Get user position.
str get_user_name_from_position(self, int position)
Get user name from position.