04/24 Added import website in bulk
This commit is contained in:
@@ -44,9 +44,9 @@ class AdminUsersView(ttk.Frame):
|
||||
command=self._reset_password).pack(side="right", padx=(0, 8))
|
||||
|
||||
# Treeview
|
||||
cols = ("ID", "Username", "Full Name", "Role", "Active", "Created")
|
||||
cols = ("ID", "Username", "Full Name", "Email", "Role", "Active", "Created")
|
||||
self.tree = ttk.Treeview(self, columns=cols, show="headings", selectmode="browse")
|
||||
widths = [40, 140, 180, 80, 60, 160]
|
||||
widths = [40, 130, 160, 180, 80, 60, 140]
|
||||
for col, w in zip(cols, widths):
|
||||
self.tree.heading(col, text=col)
|
||||
self.tree.column(col, width=w, anchor="center" if w < 120 else "w")
|
||||
@@ -68,8 +68,8 @@ class AdminUsersView(ttk.Frame):
|
||||
created = str(u["created_at"])[:16] if u["created_at"] else ""
|
||||
self.tree.insert("", "end", iid=str(u["id"]),
|
||||
values=(u["id"], u["username"],
|
||||
u["full_name"] or "", u["role"],
|
||||
active, created))
|
||||
u["full_name"] or "", u["email"] or "",
|
||||
u["role"], active, created))
|
||||
except Exception as e:
|
||||
show_error(f"Failed to load users:\n{e}")
|
||||
|
||||
@@ -134,6 +134,7 @@ class AdminUsersView(ttk.Frame):
|
||||
user_data["full_name"],
|
||||
user_data["is_active"],
|
||||
password=pwd,
|
||||
email=user_data.get("email"),
|
||||
)
|
||||
log_action(
|
||||
self.current_user["id"], "RESET_PASSWORD", "users", uid,
|
||||
@@ -202,7 +203,7 @@ class UserDialog(tk.Toplevel):
|
||||
|
||||
def _centre(self):
|
||||
self.update_idletasks()
|
||||
w, h = 420, 420
|
||||
w, h = 440, 490
|
||||
x = (self.winfo_screenwidth() - w) // 2
|
||||
y = (self.winfo_screenheight() - h) // 2
|
||||
self.geometry(f"{w}x{h}+{x}+{y}")
|
||||
@@ -245,12 +246,21 @@ class UserDialog(tk.Toplevel):
|
||||
ttk.Checkbutton(form, variable=self.active_var).grid(row=5, column=1,
|
||||
sticky="w", pady=6)
|
||||
|
||||
ttk.Label(form, text="Email (optional)").grid(row=6, column=0, sticky="w",
|
||||
padx=(0, 10), pady=6)
|
||||
self.email_var = tk.StringVar()
|
||||
ttk.Entry(form, textvariable=self.email_var).grid(
|
||||
row=6, column=1, sticky="ew", pady=6)
|
||||
ttk.Label(form, text="Used for system reminders and notifications.",
|
||||
style="Dim.TLabel").grid(row=7, column=1, sticky="w")
|
||||
|
||||
if self.is_edit:
|
||||
d = self.user_data
|
||||
self.full_name_var.set(d.get("full_name") or "")
|
||||
self.username_var.set(d.get("username") or "")
|
||||
self.role_var.set(d.get("role") or "user")
|
||||
self.active_var.set(bool(d.get("is_active", 1)))
|
||||
self.email_var.set(d.get("email") or "")
|
||||
|
||||
btn_frame = ttk.Frame(self)
|
||||
btn_frame.pack(fill="x", padx=24, pady=(16, 20))
|
||||
@@ -264,6 +274,7 @@ class UserDialog(tk.Toplevel):
|
||||
password = self.password_var.get()
|
||||
role = self.role_var.get()
|
||||
is_active = int(self.active_var.get())
|
||||
email = self.email_var.get().strip() or None
|
||||
|
||||
if not username:
|
||||
show_error("Username is required.")
|
||||
@@ -271,6 +282,9 @@ class UserDialog(tk.Toplevel):
|
||||
if not self.is_edit and not password:
|
||||
show_error("Password is required for new users.")
|
||||
return
|
||||
if email and "@" not in email:
|
||||
show_error("Please enter a valid email address.")
|
||||
return
|
||||
|
||||
try:
|
||||
if self.is_edit:
|
||||
@@ -278,12 +292,13 @@ class UserDialog(tk.Toplevel):
|
||||
update_user(self.current_user["id"],
|
||||
self.user_data["id"],
|
||||
username, role, full_name, is_active,
|
||||
password if password else None)
|
||||
password if password else None,
|
||||
email=email)
|
||||
logger.info(f"User id={self.user_data['id']} updated by admin.")
|
||||
show_info("User updated successfully.")
|
||||
else:
|
||||
from models import create_user
|
||||
create_user(self.current_user["id"], username, password, role, full_name)
|
||||
create_user(self.current_user["id"], username, password, role, full_name, email=email)
|
||||
logger.info(f"New user '{username}' created by admin.")
|
||||
show_info("User created successfully.")
|
||||
self.on_save()
|
||||
|
||||
Reference in New Issue
Block a user