Coverage for src/lexigram/admin/dashboard/permission_filter.py: 54%

13 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-24 23:39 +0800

1from __future__ import annotations 

2 

3from collections.abc import Callable, Sequence 

4from typing import TypeVar 

5 

6from lexigram.admin.types import AdminUser 

7 

8T = TypeVar("T") 

9 

10 

11class PermissionFilter: 

12 """Filters contributor surface items based on user permissions.""" 

13 

14 def filter( 

15 self, 

16 items: Sequence[T], 

17 user: AdminUser | None, 

18 get_required_permissions: Callable[[T], frozenset[str]], 

19 ) -> list[T]: 

20 """Return only items whose required permissions the *user* holds. 

21 

22 If *user* is ``None`` only items with empty required_permissions 

23 are returned. 

24 """ 

25 result: list[T] = [] 

26 for item in items: 

27 perms = get_required_permissions(item) 

28 if not perms or ( 

29 user is not None and perms.issubset(user.permissions or frozenset()) 

30 ): 

31 result.append(item) 

32 return result