17 lines
689 B
Python
17 lines
689 B
Python
from ..models import Share, Permission, ShareTarget
|
|
|
|
def permission_rank(p: str) -> int:
|
|
return {"view": 1, "edit": 2, "manage": 3}.get(p, 0)
|
|
|
|
def has_permission(user, target_type: str, target_id: int, required: str, owner_id: int) -> bool:
|
|
if user.is_authenticated and getattr(user, "is_admin", lambda: False)():
|
|
return True
|
|
if user.is_authenticated and user.id == owner_id:
|
|
return True
|
|
if not user.is_authenticated:
|
|
return False
|
|
share = Share.query.filter_by(target_type=target_type, target_id=target_id, user_id=user.id).first()
|
|
if not share:
|
|
return False
|
|
return permission_rank(share.permission) >= permission_rank(required)
|