Skip to content

Commit bc65990

Browse files
refactor: run ruff with compliant config
1 parent 14ccccf commit bc65990

29 files changed

Lines changed: 173 additions & 507 deletions

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ quality: ## check coding style with pycodestyle and pylint
5959
tox -e quality
6060

6161
format: ## format code with black and isort
62-
black openedx_authz tests
63-
isort openedx_authz tests
62+
ruff format openedx_authz tests --line-length 120
63+
ruff check --select I --fix --line-length 120
6464

6565
pii_check: ## check for PII annotations on all Django models
6666
tox -e pii_check

openedx_authz/api/data.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -248,9 +248,7 @@ def get_subclass_by_external_key(mcs, external_key: str) -> Type["ScopeData"]:
248248
scope_subclass = mcs.scope_registry.get(namespace)
249249

250250
if not scope_subclass:
251-
raise ValueError(
252-
f"Unknown scope: {namespace} for external_key: {external_key}"
253-
)
251+
raise ValueError(f"Unknown scope: {namespace} for external_key: {external_key}")
254252

255253
if not scope_subclass.validate_external_key(external_key):
256254
raise ValueError(f"Invalid external_key format: {external_key}")
@@ -281,9 +279,7 @@ def validate_external_key(mcs, external_key: str) -> bool:
281279
Returns:
282280
bool: True if valid, False otherwise.
283281
"""
284-
raise NotImplementedError(
285-
"Subclasses must implement validate_external_key method."
286-
)
282+
raise NotImplementedError("Subclasses must implement validate_external_key method.")
287283

288284

289285
@define

openedx_authz/api/permissions.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,7 @@ def get_all_permissions_in_scope(scope: ScopeData) -> list[PermissionData]:
4343
list of PermissionData: A list of PermissionData objects associated with the given scope.
4444
"""
4545
enforcer = AuthzEnforcer.get_enforcer()
46-
actions = enforcer.get_filtered_policy(
47-
PolicyIndex.SCOPE.value, scope.namespaced_key
48-
)
46+
actions = enforcer.get_filtered_policy(PolicyIndex.SCOPE.value, scope.namespaced_key)
4947
return [get_permission_from_policy(action) for action in actions]
5048

5149

@@ -66,6 +64,4 @@ def is_subject_allowed(
6664
"""
6765
enforcer = AuthzEnforcer.get_enforcer()
6866
enforcer.load_policy()
69-
return enforcer.enforce(
70-
subject.namespaced_key, action.namespaced_key, scope.namespaced_key
71-
)
67+
return enforcer.enforce(subject.namespaced_key, action.namespaced_key, scope.namespaced_key)

openedx_authz/api/roles.py

Lines changed: 19 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,7 @@ def get_permissions_for_roles(
7878
permissions_by_role = {}
7979

8080
for role in roles:
81-
permissions_by_role[role.external_key] = {
82-
"permissions": get_permissions_for_single_role(role)
83-
}
81+
permissions_by_role[role.external_key] = {"permissions": get_permissions_for_single_role(role)}
8482

8583
return permissions_by_role
8684

@@ -117,22 +115,15 @@ def get_permissions_for_active_roles_in_scope(
117115
"""
118116
enforcer = AuthzEnforcer.get_enforcer()
119117
enforcer.load_policy()
120-
filtered_policy = enforcer.get_filtered_grouping_policy(
121-
GroupingPolicyIndex.SCOPE.value, scope.namespaced_key
122-
)
118+
filtered_policy = enforcer.get_filtered_grouping_policy(GroupingPolicyIndex.SCOPE.value, scope.namespaced_key)
123119

124120
if role:
125121
filtered_policy = [
126-
policy
127-
for policy in filtered_policy
128-
if policy[GroupingPolicyIndex.ROLE.value] == role.namespaced_key
122+
policy for policy in filtered_policy if policy[GroupingPolicyIndex.ROLE.value] == role.namespaced_key
129123
]
130124

131125
return get_permissions_for_roles(
132-
[
133-
RoleData(namespaced_key=policy[GroupingPolicyIndex.ROLE.value])
134-
for policy in filtered_policy
135-
]
126+
[RoleData(namespaced_key=policy[GroupingPolicyIndex.ROLE.value]) for policy in filtered_policy]
136127
)
137128

138129

@@ -150,9 +141,7 @@ def get_role_definitions_in_scope(scope: ScopeData) -> list[RoleData]:
150141
"""
151142
enforcer = AuthzEnforcer.get_enforcer()
152143
enforcer.load_policy()
153-
policy_filtered = enforcer.get_filtered_policy(
154-
PolicyIndex.SCOPE.value, scope.namespaced_key
155-
)
144+
policy_filtered = enforcer.get_filtered_policy(PolicyIndex.SCOPE.value, scope.namespaced_key)
156145

157146
permissions_per_role = defaultdict(
158147
lambda: {
@@ -164,9 +153,7 @@ def get_role_definitions_in_scope(scope: ScopeData) -> list[RoleData]:
164153
permissions_per_role[policy[PolicyIndex.ROLE.value]]["scopes"].append(
165154
ScopeData(namespaced_key=policy[PolicyIndex.SCOPE.value])
166155
) # TODO: I don't think this actually gets used anywhere
167-
permissions_per_role[policy[PolicyIndex.ROLE.value]]["permissions"].append(
168-
get_permission_from_policy(policy)
169-
)
156+
permissions_per_role[policy[PolicyIndex.ROLE.value]]["permissions"].append(get_permission_from_policy(policy))
170157

171158
return [
172159
RoleData(
@@ -197,14 +184,10 @@ def get_all_roles_in_scope(scope: ScopeData) -> list[list[str]]:
197184
"""
198185
enforcer = AuthzEnforcer.get_enforcer()
199186
enforcer.load_policy()
200-
return enforcer.get_filtered_grouping_policy(
201-
GroupingPolicyIndex.SCOPE.value, scope.namespaced_key
202-
)
187+
return enforcer.get_filtered_grouping_policy(GroupingPolicyIndex.SCOPE.value, scope.namespaced_key)
203188

204189

205-
def assign_role_to_subject_in_scope(
206-
subject: SubjectData, role: RoleData, scope: ScopeData
207-
) -> bool:
190+
def assign_role_to_subject_in_scope(subject: SubjectData, role: RoleData, scope: ScopeData) -> bool:
208191
"""Assign a role to a subject.
209192
210193
Args:
@@ -224,9 +207,7 @@ def assign_role_to_subject_in_scope(
224207
)
225208

226209

227-
def batch_assign_role_to_subjects_in_scope(
228-
subjects: list[SubjectData], role: RoleData, scope: ScopeData
229-
) -> None:
210+
def batch_assign_role_to_subjects_in_scope(subjects: list[SubjectData], role: RoleData, scope: ScopeData) -> None:
230211
"""Assign a role to a list of subjects.
231212
232213
Args:
@@ -237,9 +218,7 @@ def batch_assign_role_to_subjects_in_scope(
237218
assign_role_to_subject_in_scope(subject, role, scope)
238219

239220

240-
def unassign_role_from_subject_in_scope(
241-
subject: SubjectData, role: RoleData, scope: ScopeData
242-
) -> bool:
221+
def unassign_role_from_subject_in_scope(subject: SubjectData, role: RoleData, scope: ScopeData) -> bool:
243222
"""Unassign a role from a subject.
244223
245224
Args:
@@ -252,14 +231,10 @@ def unassign_role_from_subject_in_scope(
252231
"""
253232
enforcer = AuthzEnforcer.get_enforcer()
254233
enforcer.load_policy()
255-
return enforcer.delete_roles_for_user_in_domain(
256-
subject.namespaced_key, role.namespaced_key, scope.namespaced_key
257-
)
234+
return enforcer.delete_roles_for_user_in_domain(subject.namespaced_key, role.namespaced_key, scope.namespaced_key)
258235

259236

260-
def batch_unassign_role_from_subjects_in_scope(
261-
subjects: list[SubjectData], role: RoleData, scope: ScopeData
262-
) -> None:
237+
def batch_unassign_role_from_subjects_in_scope(subjects: list[SubjectData], role: RoleData, scope: ScopeData) -> None:
263238
"""Unassign a role from a list of subjects.
264239
265240
Args:
@@ -282,9 +257,7 @@ def get_subject_role_assignments(subject: SubjectData) -> list[RoleAssignmentDat
282257
"""
283258
enforcer = AuthzEnforcer.get_enforcer()
284259
role_assignments = []
285-
for policy in enforcer.get_filtered_grouping_policy(
286-
GroupingPolicyIndex.SUBJECT.value, subject.namespaced_key
287-
):
260+
for policy in enforcer.get_filtered_grouping_policy(GroupingPolicyIndex.SUBJECT.value, subject.namespaced_key):
288261
role = RoleData(namespaced_key=policy[GroupingPolicyIndex.ROLE.value])
289262
role.permissions = get_permissions_for_single_role(role)
290263

@@ -298,9 +271,7 @@ def get_subject_role_assignments(subject: SubjectData) -> list[RoleAssignmentDat
298271
return role_assignments
299272

300273

301-
def get_subject_role_assignments_in_scope(
302-
subject: SubjectData, scope: ScopeData
303-
) -> list[RoleAssignmentData]:
274+
def get_subject_role_assignments_in_scope(subject: SubjectData, scope: ScopeData) -> list[RoleAssignmentData]:
304275
"""Get the roles for a subject in a specific scope.
305276
306277
Args:
@@ -314,9 +285,7 @@ def get_subject_role_assignments_in_scope(
314285
enforcer.load_policy()
315286
# TODO: we still need to get the remaining data for the role like email, etc
316287
role_assignments = []
317-
for namespaced_key in enforcer.get_roles_for_user_in_domain(
318-
subject.namespaced_key, scope.namespaced_key
319-
):
288+
for namespaced_key in enforcer.get_roles_for_user_in_domain(subject.namespaced_key, scope.namespaced_key):
320289
role = RoleData(namespaced_key=namespaced_key)
321290
role_assignments.append(
322291
RoleAssignmentData(
@@ -333,9 +302,7 @@ def get_subject_role_assignments_in_scope(
333302
return role_assignments
334303

335304

336-
def get_subject_role_assignments_for_role_in_scope(
337-
role: RoleData, scope: ScopeData
338-
) -> list[RoleAssignmentData]:
305+
def get_subject_role_assignments_for_role_in_scope(role: RoleData, scope: ScopeData) -> list[RoleAssignmentData]:
339306
"""Get the subjects assigned to a specific role in a specific scope.
340307
341308
Args:
@@ -347,9 +314,7 @@ def get_subject_role_assignments_for_role_in_scope(
347314
"""
348315
enforcer = AuthzEnforcer.get_enforcer()
349316
role_assignments = []
350-
for subject in enforcer.get_users_for_role_in_domain(
351-
role.namespaced_key, scope.namespaced_key
352-
):
317+
for subject in enforcer.get_users_for_role_in_domain(role.namespaced_key, scope.namespaced_key):
353318
if subject.startswith(f"{RoleData.NAMESPACE}{RoleData.SEPARATOR}"):
354319
# Skip roles that are also subjects
355320
continue
@@ -413,10 +378,5 @@ def get_subjects_for_role(role: RoleData) -> list[SubjectData]:
413378
"""
414379
enforcer = AuthzEnforcer.get_enforcer()
415380
enforcer.load_policy()
416-
policies = enforcer.get_filtered_grouping_policy(
417-
GroupingPolicyIndex.ROLE.value, role.namespaced_key
418-
)
419-
return [
420-
SubjectData(namespaced_key=policy[GroupingPolicyIndex.SUBJECT.value])
421-
for policy in policies
422-
]
381+
policies = enforcer.get_filtered_grouping_policy(GroupingPolicyIndex.ROLE.value, role.namespaced_key)
382+
return [SubjectData(namespaced_key=policy[GroupingPolicyIndex.SUBJECT.value]) for policy in policies]

openedx_authz/api/users.py

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,7 @@
3737
]
3838

3939

40-
def assign_role_to_user_in_scope(
41-
user_external_key: str, role_external_key: str, scope_external_key: str
42-
) -> bool:
40+
def assign_role_to_user_in_scope(user_external_key: str, role_external_key: str, scope_external_key: str) -> bool:
4341
"""Assign a role to a user in a specific scope.
4442
4543
Args:
@@ -57,9 +55,7 @@ def assign_role_to_user_in_scope(
5755
)
5856

5957

60-
def batch_assign_role_to_users_in_scope(
61-
users: list[str], role_external_key: str, scope_external_key: str
62-
):
58+
def batch_assign_role_to_users_in_scope(users: list[str], role_external_key: str, scope_external_key: str):
6359
"""Assign a role to multiple users in a specific scope.
6460
6561
Args:
@@ -75,9 +71,7 @@ def batch_assign_role_to_users_in_scope(
7571
)
7672

7773

78-
def unassign_role_from_user(
79-
user_external_key: str, role_external_key: str, scope_external_key: str
80-
):
74+
def unassign_role_from_user(user_external_key: str, role_external_key: str, scope_external_key: str):
8175
"""Unassign a role from a user in a specific scope.
8276
8377
Args:
@@ -95,9 +89,7 @@ def unassign_role_from_user(
9589
)
9690

9791

98-
def batch_unassign_role_from_users(
99-
users: list[str], role_external_key: str, scope_external_key: str
100-
):
92+
def batch_unassign_role_from_users(users: list[str], role_external_key: str, scope_external_key: str):
10193
"""Unassign a role from multiple users in a specific scope.
10294
10395
Args:
@@ -125,9 +117,7 @@ def get_user_role_assignments(user_external_key: str) -> list[RoleAssignmentData
125117
return get_subject_role_assignments(UserData(external_key=user_external_key))
126118

127119

128-
def get_user_role_assignments_in_scope(
129-
user_external_key: str, scope_external_key: str
130-
) -> list[RoleAssignmentData]:
120+
def get_user_role_assignments_in_scope(user_external_key: str, scope_external_key: str) -> list[RoleAssignmentData]:
131121
"""Get the roles assigned to a user in a specific scope.
132122
133123
Args:
@@ -172,9 +162,7 @@ def get_all_user_role_assignments_in_scope(
172162
Returns:
173163
list[RoleAssignmentData]: A list of user role assignments and all their metadata in the specified scope.
174164
"""
175-
return get_all_subject_role_assignments_in_scope(
176-
ScopeData(external_key=scope_external_key)
177-
)
165+
return get_all_subject_role_assignments_in_scope(ScopeData(external_key=scope_external_key))
178166

179167

180168
def is_user_allowed(

openedx_authz/engine/adapter.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,9 @@ def is_filtered(self) -> bool:
7777
return True
7878

7979
def load_filtered_policy(
80-
self, model: Model, filter: Filter # pylint: disable=redefined-builtin
80+
self,
81+
model: Model,
82+
filter: Filter, # pylint: disable=redefined-builtin
8183
) -> None:
8284
"""
8385
Load policy rules from storage with filtering applied.
@@ -102,7 +104,9 @@ def load_filtered_policy(
102104
persist.load_policy_line(str(line), model)
103105

104106
def filter_query(
105-
self, queryset: QuerySet, filter: Filter # pylint: disable=redefined-builtin
107+
self,
108+
queryset: QuerySet,
109+
filter: Filter, # pylint: disable=redefined-builtin
106110
) -> QuerySet:
107111
"""
108112
Apply filter criteria to the policy queryset.

openedx_authz/engine/enforcer.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -91,19 +91,15 @@ def _initialize_enforcer() -> FastEnforcer:
9191
# issues when the app is not fully loaded (e.g., while pulling translations, etc.).
9292
initialize_enforcer(db_alias)
9393
except Exception as e:
94-
logger.error(
95-
f"Failed to initialize Casbin enforcer with DB alias '{db_alias}': {e}"
96-
)
94+
logger.error(f"Failed to initialize Casbin enforcer with DB alias '{db_alias}': {e}")
9795
raise
9896

9997
adapter = ExtendedAdapter()
10098
enforcer = FastEnforcer(settings.CASBIN_MODEL, adapter, enable_log=True)
10199
enforcer.enable_auto_save(True)
102100

103101
if not Watcher:
104-
logger.warning(
105-
"Redis configuration not completed successfully. Watcher is disabled."
106-
)
102+
logger.warning("Redis configuration not completed successfully. Watcher is disabled.")
107103
return enforcer
108104

109105
try:

openedx_authz/engine/utils.py

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,7 @@ def migrate_policy_between_enforcers(
3131

3232
# Load target enforcer policies to check for duplicates
3333
target_enforcer.load_policy()
34-
logger.info(
35-
f"Target enforcer has {len(target_enforcer.get_policy())} existing policies before migration."
36-
)
34+
logger.info(f"Target enforcer has {len(target_enforcer.get_policy())} existing policies before migration.")
3735

3836
# TODO: this operations use the enforcer directly, which may not be ideal
3937
# since we have to load the policy after each addition to avoid duplicates.
@@ -53,31 +51,21 @@ def migrate_policy_between_enforcers(
5351

5452
for grouping_policy_ptype in GROUPING_POLICY_PTYPES:
5553
try:
56-
grouping_policies = source_enforcer.get_named_grouping_policy(
57-
grouping_policy_ptype
58-
)
54+
grouping_policies = source_enforcer.get_named_grouping_policy(grouping_policy_ptype)
5955
for grouping in grouping_policies:
60-
if target_enforcer.has_named_grouping_policy(
61-
grouping_policy_ptype, *grouping
62-
):
56+
if target_enforcer.has_named_grouping_policy(grouping_policy_ptype, *grouping):
6357
logger.info(
6458
f"Grouping policy {grouping_policy_ptype}, {grouping} already exists in target, skipping."
6559
)
6660
continue
67-
target_enforcer.add_named_grouping_policy(
68-
grouping_policy_ptype, *grouping
69-
)
61+
target_enforcer.add_named_grouping_policy(grouping_policy_ptype, *grouping)
7062

7163
# Ensure latest policies are loaded in the target enforcer after each addition
7264
# to avoid duplicates
7365
target_enforcer.load_policy()
7466
except KeyError as e:
75-
logger.info(
76-
f"Skipping {grouping_policy_ptype} policies: {e} not found in source enforcer."
77-
)
78-
logger.info(
79-
f"Successfully loaded policies from {source_enforcer.get_model()} into the database."
80-
)
67+
logger.info(f"Skipping {grouping_policy_ptype} policies: {e} not found in source enforcer.")
68+
logger.info(f"Successfully loaded policies from {source_enforcer.get_model()} into the database.")
8169
except Exception as e:
8270
logger.error(f"Error loading policies from file: {e}")
8371
raise

0 commit comments

Comments
 (0)