Initial commit
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
import os
|
||||
import json
|
||||
from pathlib import Path
|
||||
from app.config import get_settings
|
||||
|
||||
settings = get_settings()
|
||||
PERMISSIONS_FILE = os.path.join(settings.PERMISSIONS_DIR, "docs_permissions.json")
|
||||
|
||||
|
||||
def load_permissions() -> dict:
|
||||
if os.path.exists(PERMISSIONS_FILE):
|
||||
with open(PERMISSIONS_FILE, "r", encoding="utf-8") as f:
|
||||
return json.load(f)
|
||||
return {}
|
||||
|
||||
|
||||
def save_permissions(perms: dict):
|
||||
os.makedirs(settings.PERMISSIONS_DIR, exist_ok=True)
|
||||
with open(PERMISSIONS_FILE, "w", encoding="utf-8") as f:
|
||||
json.dump(perms, f, indent=2, ensure_ascii=False)
|
||||
|
||||
|
||||
def discover_docs() -> dict:
|
||||
docs_dir = settings.DOCS_DIR
|
||||
if not os.path.exists(docs_dir):
|
||||
return {}
|
||||
perms = load_permissions()
|
||||
existing_slugs = set(perms.keys())
|
||||
for filename in os.listdir(docs_dir):
|
||||
if filename.endswith(".md"):
|
||||
slug = Path(filename).stem
|
||||
if slug not in existing_slugs:
|
||||
title = slug.replace("-", " ").title()
|
||||
perms[slug] = {
|
||||
"title": title,
|
||||
"filename": filename,
|
||||
"sort_order": len(perms),
|
||||
"permissions": {
|
||||
"engineer": {"view": False, "edit": False, "cancel": False}
|
||||
},
|
||||
}
|
||||
save_permissions(perms)
|
||||
return perms
|
||||
|
||||
|
||||
def get_allowed_docs(role: str) -> list[dict]:
|
||||
perms = discover_docs()
|
||||
if role == "owner":
|
||||
return sorted(perms.values(), key=lambda x: x.get("sort_order", 0))
|
||||
if role == "engineer":
|
||||
return [
|
||||
doc for doc in perms.values()
|
||||
if doc.get("permissions", {}).get("engineer", {}).get("view", False)
|
||||
]
|
||||
return []
|
||||
|
||||
|
||||
def can_access_doc(role: str, slug: str, action: str = "view") -> bool:
|
||||
if role == "owner":
|
||||
return True
|
||||
if role == "engineer":
|
||||
perms = load_permissions()
|
||||
doc = perms.get(slug, {})
|
||||
return doc.get("permissions", {}).get("engineer", {}).get(action, False)
|
||||
return False
|
||||
Reference in New Issue
Block a user