55
66from questionpy_common .environment import PackagePermissions as EnvironmentPackagePermissions
77from questionpy_common .error import QPyBaseError
8+ from questionpy_server .cache import LRUCacheMemory
89from questionpy_server .package import Package
910from questionpy_server .settings import (
1011 CompletePackagePermissions ,
1112 MainProcessExecutionModeValues ,
1213 PackagePermissionsSettings ,
1314 SpecificPackagePermissions ,
1415)
15- from questionpy_server .worker .selector import Selector , SelectorQuery
16+ from questionpy_server .worker .selector import SelectorQuery , get_matching
1617
1718_log = logging .getLogger (__name__ )
1819
@@ -31,12 +32,12 @@ def _has_enough_permissions(allowed: CompletePackagePermissions, requested: Comp
3132 )
3233
3334
34- class PackagePermissionsHandler ( Selector [ SpecificPackagePermissions , EnvironmentPackagePermissions ]) :
35+ class PackagePermissionsHandler :
3536 """Handles package permissions for a request."""
3637
3738 def __init__ (self , settings : PackagePermissionsSettings ):
38- super (). __init__ ( settings . packages )
39-
39+ self . _cache : LRUCacheMemory [ SelectorQuery , EnvironmentPackagePermissions ] = LRUCacheMemory ( max_size = 128 )
40+ self . _package_permissions = settings . packages
4041 self ._default_permissions = CompletePackagePermissions ()
4142 self ._auto_grant_permissions = settings .auto_grant_permissions
4243
@@ -69,11 +70,14 @@ def _get_actual_auto_grant_permissions(self, permissions: SpecificPackagePermiss
6970 specific_auto_grant_permissions = permissions .auto_grant_permissions .model_dump (exclude_none = True )
7071 return self ._auto_grant_permissions .model_copy (update = specific_auto_grant_permissions )
7172
72- def _get (self , query : SelectorQuery ) -> EnvironmentPackagePermissions :
73+ def get (self , query : SelectorQuery ) -> EnvironmentPackagePermissions :
74+ if cached_permissions := self ._cache .get (query ):
75+ return cached_permissions
76+
7377 auto_grant_permissions = self ._auto_grant_permissions
7478 requested_permissions = self ._get_requested_permissions (query .package )
7579
76- if specific_permissions := self ._get_matching ( query ):
80+ if specific_permissions := get_matching ( self ._package_permissions , query ):
7781 auto_grant_permissions = self ._get_actual_auto_grant_permissions (specific_permissions )
7882
7983 if specific_permissions .override_permissions :
@@ -89,4 +93,7 @@ def _get(self, query: SelectorQuery) -> EnvironmentPackagePermissions:
8993 # Only keep explicitly allowed lms attributes.
9094 requested_permissions .lms_attributes .intersection_update (auto_grant_permissions .lms_attributes )
9195
92- return EnvironmentPackagePermissions (** requested_permissions .model_dump ())
96+ environment_package_permissions = EnvironmentPackagePermissions (** requested_permissions .model_dump ())
97+ self ._cache .put (query , environment_package_permissions )
98+
99+ return environment_package_permissions
0 commit comments