04/22 Upgraded code commit

This commit is contained in:
2026-04-22 12:22:26 -04:00
parent 7548dfc9bf
commit c0e965f10b
9 changed files with 714 additions and 19 deletions
+89 -6
View File
@@ -97,10 +97,11 @@ class AdminWebsitesView(ttk.Frame):
if not wid:
show_error("Please select a website to edit.")
return
from models import get_website_by_id, get_website_credentials
from models import get_website_by_id, get_website_credentials, get_website_assigned_users
data = get_website_by_id(wid)
creds = get_website_credentials(wid)
data["credentials"] = creds
data["credentials"] = creds
data["assigned_users"] = get_website_assigned_users(wid)
WebsiteDialog(self, self.current_user, website_data=data,
on_save=self._load_websites)
@@ -227,6 +228,66 @@ class WebsiteDialog(tk.Toplevel):
note_frame, self.note_txt = scrolled_text(form, height=4)
note_frame.grid(row=3, column=1, sticky="ew", pady=6)
# ── Visibility ────────────────────────────────────────────────────────
ttk.Label(form, text="Visibility").grid(
row=4, column=0, sticky="w", padx=(0, 10), pady=6)
vis_frame = tk.Frame(form, bg=COLOURS["bg"])
vis_frame.grid(row=4, column=1, sticky="w", pady=6)
self.visibility_var = tk.StringVar(value="all")
for val, lbl in [("all", "👥 All Users"), ("assigned", "🔒 Assigned Only")]:
rb = tk.Radiobutton(
vis_frame, text=lbl,
variable=self.visibility_var, value=val,
bg=COLOURS["bg"], fg=COLOURS["text"],
activebackground=COLOURS["bg"],
activeforeground=COLOURS["accent"],
selectcolor=COLOURS["surface2"],
font=FONT, cursor="hand2",
command=self._on_visibility_change,
)
rb.pack(side="left", padx=(0, 16))
# ── Assigned users (shown only when visibility='assigned') ─────────────
self._user_assign_frame = ttk.Frame(self.inner)
self._user_assign_frame.pack(fill="x", padx=24, pady=(0, 4))
ttk.Label(self._user_assign_frame, text="Assigned Users",
style="Heading.TLabel").pack(anchor="w", pady=(4, 6))
# Load all active regular users for the picker
from models import get_all_users
try:
all_users = [u for u in get_all_users()
if u["is_active"] and u["role"] == "user"]
except Exception:
all_users = []
self._user_vars = {} # user_id -> BooleanVar
user_grid = tk.Frame(self._user_assign_frame, bg=COLOURS["surface"],
padx=12, pady=8)
user_grid.pack(fill="x")
for i, u in enumerate(all_users):
var = tk.BooleanVar(value=False)
self._user_vars[u["id"]] = var
col, row = i % 3, i // 3
tk.Checkbutton(
user_grid,
text=f"{u['username']} ({u['full_name'] or ''})",
variable=var,
bg=COLOURS["surface"], fg=COLOURS["text"],
activebackground=COLOURS["surface"],
activeforeground=COLOURS["accent"],
selectcolor=COLOURS["surface2"],
font=FONT_SMALL, cursor="hand2",
anchor="w",
).grid(row=row, column=col, sticky="w", padx=8, pady=2)
# Hide initially; shown when visibility='assigned'
self._user_assign_frame.pack_forget()
# ── Credentials section ───────────────────────────────────────────────
ttk.Separator(self.inner, orient="horizontal").pack(
fill="x", padx=24, pady=12)
@@ -257,11 +318,26 @@ class WebsiteDialog(tk.Toplevel):
self.url_var.set(d.get("url") or "")
self.check_type_var.set(d.get("check_type") or "daily")
self.note_txt.insert("1.0", d.get("note") or "")
vis = d.get("visibility") or "all"
self.visibility_var.set(vis)
# Pre-tick assigned users
assigned_ids = {u["id"] for u in d.get("assigned_users", [])}
for uid, var in self._user_vars.items():
var.set(uid in assigned_ids)
self._on_visibility_change()
for cred in d.get("credentials", []):
self._add_cred_row(cred)
else:
self._add_cred_row()
def _on_visibility_change(self):
"""Show or hide the user assignment panel based on visibility selection."""
if self.visibility_var.get() == "assigned":
self._user_assign_frame.pack(fill="x", padx=24, pady=(0, 4),
before=self.creds_container)
else:
self._user_assign_frame.pack_forget()
def _add_cred_row(self, cred=None):
frame = ttk.Frame(self.creds_container, style="Surface.TFrame")
frame.pack(fill="x", pady=4, ipady=4)
@@ -300,10 +376,15 @@ class WebsiteDialog(tk.Toplevel):
url = self.url_var.get().strip()
check_type = self.check_type_var.get()
note = self.note_txt.get("1.0", "end-1c").strip()
visibility = self.visibility_var.get()
assigned_user_ids = [uid for uid, var in self._user_vars.items() if var.get()]
if not name or not url:
show_error("Name and URL are required.")
return
if visibility == "assigned" and not assigned_user_ids:
show_error("Please assign at least one user, or set visibility to All Users.")
return
credentials = []
for label_var, user_var, pass_var, _ in self.cred_rows:
@@ -320,16 +401,18 @@ class WebsiteDialog(tk.Toplevel):
from models import update_website
update_website(self.current_user["id"],
self.website_data["id"],
name, url, check_type, note, credentials)
name, url, check_type, note, credentials,
visibility, assigned_user_ids)
logger.info(f"Website id={self.website_data['id']} updated "
f"check_type='{check_type}'.")
f"check_type='{check_type}' visibility='{visibility}'.")
show_info("Website updated successfully.")
else:
from models import create_website
create_website(self.current_user["id"],
name, url, check_type, note, credentials)
name, url, check_type, note, credentials,
visibility, assigned_user_ids)
logger.info(f"New website '{name}' created "
f"check_type='{check_type}'.")
f"check_type='{check_type}' visibility='{visibility}'.")
show_info("Website created successfully.")
self.on_save()
self.destroy()