38 lines
2.0 KiB
Python
38 lines
2.0 KiB
Python
"""Live account permissions. Invite access uses the existing users column."""
|
|
from .db import _connect
|
|
|
|
FEATURES = ("stats", "requests", "new_requests", "issues", "invites", "ignore_profile_limits")
|
|
|
|
|
|
def permissions(user: dict) -> dict[str, bool]:
|
|
if user.get("role") == "admin":
|
|
return dict.fromkeys(FEATURES, True)
|
|
values = dict.fromkeys(FEATURES, True)
|
|
values["ignore_profile_limits"] = False
|
|
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)
|