Model permissions as combinable flags with enum.IntFlag:
class Perm(IntFlag):
READ = 1; WRITE = 2; DELETE = 4; ADMIN = 8
Implement:
parse_perms(text): "read,write" → Perm.READ | Perm.WRITE (case-insensitive, spaces allowed, empty string → Perm(0)); unknown names raise ValueErrorcan(user_perms, needed): True if the user has every permission in needed, or has ADMINdescribe(perms): sorted lower-case names joined by commas (e.g. "delete,read"), or "none"