Skip to content

Commit 747652c

Browse files
refactor!: use registry pattern to extend base models
1 parent 1bea73d commit 747652c

26 files changed

Lines changed: 1634 additions & 715 deletions

openedx_authz/api/roles.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,10 @@ def assign_role_to_subject_in_scope(
224224
if not role_assignment:
225225
return False
226226
extended_rule = ExtendedCasbinRule.create_based_on_policy(
227-
subject, role, scope, enforcer
227+
subject,
228+
role,
229+
scope,
230+
enforcer
228231
)
229232
if not extended_rule:
230233
raise Exception("Failed to create ExtendedCasbinRule for the assignment")
Lines changed: 58 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Generated by Django 5.2.7 on 2025-10-16 09:15
1+
# Generated by Django 5.2.7 on 2025-10-20 13:18
22

33
import django.db.models.deletion
44
from django.conf import settings
@@ -10,109 +10,82 @@ class Migration(migrations.Migration):
1010
initial = True
1111

1212
dependencies = [
13-
("casbin_adapter", "0001_initial"),
14-
("content_libraries", "0011_remove_contentlibrary_bundle_uuid_and_more"),
15-
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
16-
]
13+
('casbin_adapter', '0001_initial'),
14+
migrations.swappable_dependency(
15+
getattr(
16+
settings,
17+
"OPENEDX_AUTHZ_CONTENT_LIBRARY_MODEL",
18+
"content_libraries.ContentLibrary",
19+
)
20+
),
21+
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
22+
]
1723

1824
operations = [
1925
migrations.CreateModel(
20-
name="Scope",
26+
name='Scope',
2127
fields=[
22-
(
23-
"id",
24-
models.BigAutoField(
25-
auto_created=True,
26-
primary_key=True,
27-
serialize=False,
28-
verbose_name="ID",
29-
),
30-
),
31-
(
32-
"content_library",
33-
models.ForeignKey(
34-
blank=True,
35-
null=True,
36-
on_delete=django.db.models.deletion.CASCADE,
37-
related_name="authz_scopes",
38-
to="content_libraries.contentlibrary",
39-
),
40-
),
28+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
4129
],
30+
options={
31+
'abstract': False,
32+
},
4233
),
4334
migrations.CreateModel(
44-
name="Subject",
35+
name='Subject',
4536
fields=[
46-
(
47-
"id",
48-
models.BigAutoField(
49-
auto_created=True,
50-
primary_key=True,
51-
serialize=False,
52-
verbose_name="ID",
53-
),
54-
),
55-
(
56-
"user",
57-
models.ForeignKey(
58-
blank=True,
59-
null=True,
60-
on_delete=django.db.models.deletion.CASCADE,
61-
related_name="authz_subjects",
62-
to=settings.AUTH_USER_MODEL,
63-
),
64-
),
37+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
6538
],
39+
options={
40+
'abstract': False,
41+
},
6642
),
6743
migrations.CreateModel(
68-
name="ExtendedCasbinRule",
44+
name='ExtendedCasbinRule',
6945
fields=[
46+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
47+
('casbin_rule_key', models.CharField(max_length=255, unique=True)),
48+
('description', models.TextField(blank=True, null=True)),
49+
('created_at', models.DateTimeField(auto_now_add=True)),
50+
('updated_at', models.DateTimeField(auto_now=True)),
51+
('metadata', models.JSONField(blank=True, null=True)),
52+
('casbin_rule', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='extended_rule', to='casbin_adapter.casbinrule')),
53+
('scope', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='casbin_rules', to='openedx_authz.scope')),
54+
('subject', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='casbin_rules', to='openedx_authz.subject')),
55+
],
56+
options={
57+
'verbose_name': 'Extended Casbin Rule',
58+
'verbose_name_plural': 'Extended Casbin Rules',
59+
},
60+
),
61+
migrations.CreateModel(
62+
name='ContentLibraryScope',
63+
fields=[
64+
('scope_ptr', models.OneToOneField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID', to='openedx_authz.scope', parent_link=True, on_delete=django.db.models.deletion.CASCADE)),
7065
(
71-
"id",
72-
models.BigAutoField(
73-
auto_created=True,
74-
primary_key=True,
75-
serialize=False,
76-
verbose_name="ID",
77-
),
78-
),
79-
("casbin_rule_key", models.CharField(max_length=255, unique=True)),
80-
("description", models.TextField(blank=True, null=True)),
81-
("created_at", models.DateTimeField(auto_now_add=True)),
82-
("updated_at", models.DateTimeField(auto_now=True)),
83-
("metadata", models.JSONField(blank=True, null=True)),
84-
(
85-
"casbin_rule",
86-
models.ForeignKey(
87-
on_delete=django.db.models.deletion.CASCADE,
88-
related_name="extended_rule",
89-
to="casbin_adapter.casbinrule",
90-
),
91-
),
92-
(
93-
"scope",
94-
models.ForeignKey(
95-
blank=True,
96-
null=True,
97-
on_delete=django.db.models.deletion.CASCADE,
98-
related_name="casbin_rules",
99-
to="openedx_authz.scope",
100-
),
101-
),
102-
(
103-
"subject",
66+
'content_library',
10467
models.ForeignKey(
10568
blank=True,
69+
db_constraint=False,
10670
null=True,
10771
on_delete=django.db.models.deletion.CASCADE,
108-
related_name="casbin_rules",
109-
to="openedx_authz.subject",
72+
related_name='authz_scopes',
73+
to=getattr(
74+
settings,
75+
'OPENEDX_AUTHZ_CONTENT_LIBRARY_MODEL',
76+
'content_libraries.ContentLibrary',
77+
),
11078
),
11179
),
11280
],
113-
options={
114-
"verbose_name": "Extended Casbin Rule",
115-
"verbose_name_plural": "Extended Casbin Rules",
116-
},
81+
bases=('openedx_authz.scope',),
82+
),
83+
migrations.CreateModel(
84+
name='UserSubject',
85+
fields=[
86+
('subject_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='openedx_authz.subject')),
87+
('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='authz_subjects', to=settings.AUTH_USER_MODEL)),
88+
],
89+
bases=('openedx_authz.subject',),
11790
),
11891
]
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Generated by Django 5.2.7 on 2025-10-20 17:42
2+
3+
import django.db.models.deletion
4+
from django.db import migrations, models
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('openedx_authz', '0001_initial'),
11+
]
12+
13+
operations = [
14+
migrations.AlterField(
15+
model_name='contentlibraryscope',
16+
name='scope_ptr',
17+
field=models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='openedx_authz.scope'),
18+
),
19+
]

openedx_authz/models.py

Lines changed: 0 additions & 184 deletions
This file was deleted.

0 commit comments

Comments
 (0)