st-ten-1/src/ui/users_management/users_management.py

87 lines
3.5 KiB
Python
Raw Normal View History

2022-06-01 16:37:19 +00:00
import traceback
from lib.db import Users
from PyQt5.QtWidgets import QMessageBox
from ui.crud import Crud, Line_Edit_Cell_Widget
from ui.widget import Widget
class Users_Management(Widget):
def __init__(self):
super().__init__()
class Username_Line_Edit_Cell_Widget(Line_Edit_Cell_Widget):
def parse(self, row_number=None, crud=None):
data = super().parse(row_number=row_number, crud=crud)
if data is not None and len(data):
return data.upper()
return None
class Password_Line_Edit_Cell_Widget(Line_Edit_Cell_Widget):
2022-09-21 11:37:37 +00:00
def _render(self, data, *args, **kwargs):
data = [data, True] # mark as hash
super()._render(data, *args, **kwargs)
2022-06-01 16:37:19 +00:00
def render(self, data, row_number=None, crud=None):
2022-09-21 11:37:37 +00:00
if data is not None and data[0] is not None and len(data[0]):
2022-06-01 16:37:19 +00:00
data = u"\u2022" * 8
else:
data = None
self.setText(data)
def parse(self, row_number=None, crud=None):
data = self.text()
if data is not None and len(data):
2022-09-21 11:37:37 +00:00
return [data, False] # mark as NOT hash
2022-06-01 16:37:19 +00:00
return None
class Roles_Line_Edit_Cell_Widget(Line_Edit_Cell_Widget):
def render(self, data, row_number=None, crud=None):
super().render(", ".join(data) if data is not None else None, row_number=row_number, crud=crud)
def parse(self, row_number=None, crud=None):
return Users.parse_roles(self.text())
crud_aliases = {
"id": "Id",
"username": "Nome utente",
"password": "Password",
"roles": "Ruoli",
}
self.crud = Crud(
"users",
display_name="GESTIONE UTENTI",
readonly=["id"],
select=list(crud_aliases.keys()),
fields_aliases=crud_aliases,
autocomplete={"archived": False},
widget_classes={
"username": Username_Line_Edit_Cell_Widget,
"password": Password_Line_Edit_Cell_Widget,
"roles": Roles_Line_Edit_Cell_Widget,
},
row_filter=self.row_filter
)
self.layout().addWidget(self.crud, 0, 0, -1, -1)
def row_filter(self, row, row_number, crud):
2022-09-21 11:37:37 +00:00
if row["password"] is not None and all(map(lambda x: x == u"\u2022", row["password"][0])):
2022-06-01 16:37:19 +00:00
row.pop("password", None)
else:
try:
2022-09-21 11:37:37 +00:00
if row["password"] is not None:
if row["password"][1] is False:
user = Users.generate(username=row["username"], password=row["password"][0], roles=row["roles"])
else: # if user's password did not change it is already a hash
user = Users.generate(username=row["username"], password="temporary", roles=row["roles"])
user["password"] = row["password"][0]
else:
user = Users.generate(username=row["username"], password=row["password"], roles=row["roles"])
2022-06-01 16:37:19 +00:00
except AssertionError as e:
self.log.exception(traceback.format_exc())
2022-09-21 11:37:37 +00:00
self.crud.set_row_color(row_number, "red")
2022-06-01 16:37:19 +00:00
QMessageBox.critical(None, "Errore Salvataggio DB", f"Errore alla riga {row_number}:\n{str(e)}")
return False, None, True
row.update(user)
return True, row, False