Add user feature permissions and unified account management
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
"""Live account permissions. Invite access uses the existing users column."""
|
||||
from .db import _connect
|
||||
|
||||
FEATURES = ("stats", "requests", "new_requests", "issues", "invites")
|
||||
|
||||
|
||||
def permissions(user: dict) -> dict[str, bool]:
|
||||
if user.get("role") == "admin":
|
||||
return dict.fromkeys(FEATURES, True)
|
||||
values = dict.fromkeys(FEATURES, True)
|
||||
values["invites"] = bool(user.get("invite_management_enabled", False))
|
||||
with _connect() as conn:
|
||||
rows = conn.execute("""SELECT p.feature, p.enabled FROM user_feature_permissions p
|
||||
JOIN users u ON u.id = p.user_id WHERE u.username = ? COLLATE NOCASE""",
|
||||
(user.get("username", ""),)).fetchall()
|
||||
values.update({key: bool(enabled) for key, enabled in rows if key in FEATURES and key != "invites"})
|
||||
return values
|
||||
|
||||
|
||||
def update_permissions(changes: dict[str, bool], username: str | None = None) -> int:
|
||||
if not changes or any(key not in FEATURES or type(value) is not bool for key, value in changes.items()):
|
||||
raise ValueError("Choose valid features with true or false values")
|
||||
with _connect() as conn:
|
||||
conn.execute("BEGIN IMMEDIATE")
|
||||
users = conn.execute("SELECT id FROM users WHERE role != 'admin'" +
|
||||
(" AND username = ? COLLATE NOCASE" if username is not None else ""),
|
||||
(username,) if username is not None else ()).fetchall()
|
||||
for (user_id,) in users:
|
||||
for feature, enabled in changes.items():
|
||||
if feature == "invites":
|
||||
conn.execute("UPDATE users SET invite_management_enabled = ? WHERE id = ?", (int(enabled), user_id))
|
||||
else:
|
||||
conn.execute("""INSERT INTO user_feature_permissions(user_id, feature, enabled) VALUES (?, ?, ?)
|
||||
ON CONFLICT(user_id, feature) DO UPDATE SET enabled = excluded.enabled""",
|
||||
(user_id, feature, int(enabled)))
|
||||
return len(users)
|
||||
Reference in New Issue
Block a user