-
Notifications
You must be signed in to change notification settings - Fork 26
Expand file tree
/
Copy pathadmin.py
More file actions
144 lines (110 loc) · 4.52 KB
/
admin.py
File metadata and controls
144 lines (110 loc) · 4.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
"""Django admin for Pathways."""
from django.contrib import admin
from openedx_django_lib.admin_utils import ReadOnlyModelAdmin
from .models import Pathway, PathwayEnrollment, PathwayEnrollmentAllowed, PathwayEnrollmentAudit, PathwayStep
class PathwayStepInline(admin.TabularInline):
"""Inline table for pathway steps within a pathway."""
model = PathwayStep
fields = ["order", "step_type", "context_key"]
ordering = ["order"]
extra = 0
@admin.register(Pathway)
class PathwayAdmin(admin.ModelAdmin):
"""Admin for Pathway model."""
list_display = ["key", "display_name", "org", "is_active", "sequential", "created"]
list_filter = ["is_active", "sequential", "invite_only", "org"]
search_fields = ["key", "display_name"]
inlines = [PathwayStepInline]
class PathwayEnrollmentAuditInline(admin.TabularInline):
"""Inline admin for PathwayEnrollmentAudit records."""
model = PathwayEnrollmentAudit
fk_name = "enrollment"
extra = 0
exclude = ["enrollment_allowed"]
readonly_fields = [
"state_transition",
"enrolled_by",
"reason",
"org",
"role",
"created",
]
def has_add_permission(self, request, obj=None):
"""Disable manual creation of audit records."""
return False
def has_delete_permission(self, request, obj=None):
"""Disable deletion of audit records."""
return False
@admin.register(PathwayEnrollment)
class PathwayEnrollmentAdmin(admin.ModelAdmin):
"""Admin for PathwayEnrollment model."""
raw_id_fields = ("user",)
autocomplete_fields = ["pathway"]
list_display = ["id", "user", "pathway", "is_active", "created"]
list_filter = ["pathway__key", "created", "is_active"]
search_fields = ["id", "user__username", "pathway__key", "pathway__display_name"]
inlines = [PathwayEnrollmentAuditInline]
class PathwayEnrollmentAllowedAuditInline(admin.TabularInline):
"""Inline admin for PathwayEnrollmentAudit records related to enrollment allowed."""
model = PathwayEnrollmentAudit
fk_name = "enrollment_allowed"
extra = 0
exclude = ["enrollment"]
readonly_fields = [
"state_transition",
"enrolled_by",
"reason",
"org",
"role",
"created",
]
def has_add_permission(self, request, obj=None):
"""Disable manual creation of audit records."""
return False
def has_delete_permission(self, request, obj=None):
"""Disable deletion of audit records."""
return False
@admin.register(PathwayEnrollmentAllowed)
class PathwayEnrollmentAllowedAdmin(admin.ModelAdmin):
"""Admin for PathwayEnrollmentAllowed model."""
autocomplete_fields = ["pathway"]
list_display = ["id", "email", "get_user", "pathway", "created"]
list_filter = ["pathway", "created"]
search_fields = ["email", "user__username", "user__email", "pathway__key"]
readonly_fields = ["user", "created"]
inlines = [PathwayEnrollmentAllowedAuditInline]
def get_user(self, obj):
"""Get the associated user, if any."""
return obj.user.username if obj.user else "-"
get_user.short_description = "User" # type: ignore[attr-defined]
@admin.register(PathwayEnrollmentAudit)
class PathwayEnrollmentAuditAdmin(ReadOnlyModelAdmin):
"""Admin configuration for PathwayEnrollmentAudit model."""
list_display = ["id", "state_transition", "enrolled_by", "get_enrollee", "get_pathway", "created", "org", "role"]
list_filter = ["state_transition", "created", "org", "role"]
search_fields = [
"enrolled_by__username",
"enrolled_by__email",
"enrollment__user__username",
"enrollment__user__email",
"enrollment_allowed__email",
"enrollment__pathway__key",
"enrollment_allowed__pathway__key",
"reason",
]
def get_enrollee(self, obj):
"""Get the enrollee (user or email)."""
if obj.enrollment:
return obj.enrollment.user.username
elif obj.enrollment_allowed:
return obj.enrollment_allowed.user.username if obj.enrollment_allowed.user else obj.enrollment_allowed.email
return "-"
get_enrollee.short_description = "Enrollee" # type: ignore[attr-defined]
def get_pathway(self, obj):
"""Get the pathway title."""
if obj.enrollment:
return obj.enrollment.pathway_id
elif obj.enrollment_allowed:
return obj.enrollment_allowed.pathway_id
return "-"
get_pathway.short_description = "Pathway" # type: ignore[attr-defined]