|
4 | 4 | from __future__ import annotations |
5 | 5 |
|
6 | 6 | from django.contrib import admin |
| 7 | +from django.db.models import Count |
7 | 8 |
|
8 | 9 | from openedx_learning.lib.admin_utils import ReadOnlyModelAdmin, one_to_one_related_model_html |
9 | 10 |
|
10 | | -from .models import LearningPackage, PublishableEntity, Published, PublishLog, PublishLogRecord |
| 11 | +from .models import ( |
| 12 | + DraftChangeLog, |
| 13 | + DraftChangeLogRecord, |
| 14 | + LearningPackage, |
| 15 | + PublishableEntity, |
| 16 | + PublishLog, |
| 17 | + PublishLogRecord, |
| 18 | +) |
| 19 | +from .models.publish_log import Published |
11 | 20 |
|
12 | 21 |
|
13 | 22 | @admin.register(LearningPackage) |
@@ -171,3 +180,69 @@ def published_at(self, published_obj): |
171 | 180 |
|
172 | 181 | def message(self, published_obj): |
173 | 182 | return published_obj.publish_log_record.publish_log.message |
| 183 | + |
| 184 | + |
| 185 | +class DraftChangeLogRecordTabularInline(admin.TabularInline): |
| 186 | + """ |
| 187 | + Tabular inline for a single Draft change. |
| 188 | + """ |
| 189 | + model = DraftChangeLogRecord |
| 190 | + |
| 191 | + fields = ( |
| 192 | + "entity", |
| 193 | + "title", |
| 194 | + "old_version_num", |
| 195 | + "new_version_num", |
| 196 | + ) |
| 197 | + readonly_fields = fields |
| 198 | + |
| 199 | + def get_queryset(self, request): |
| 200 | + queryset = super().get_queryset(request) |
| 201 | + return queryset.select_related("entity", "old_version", "new_version") \ |
| 202 | + .order_by("entity__key") |
| 203 | + |
| 204 | + def old_version_num(self, draft_change: DraftChangeLogRecord): |
| 205 | + if draft_change.old_version is None: |
| 206 | + return "-" |
| 207 | + return draft_change.old_version.version_num |
| 208 | + |
| 209 | + def new_version_num(self, draft_change: DraftChangeLogRecord): |
| 210 | + if draft_change.new_version is None: |
| 211 | + return "-" |
| 212 | + return draft_change.new_version.version_num |
| 213 | + |
| 214 | + def title(self, draft_change: DraftChangeLogRecord): |
| 215 | + """ |
| 216 | + Get the title to display for the DraftChange |
| 217 | + """ |
| 218 | + if draft_change.new_version: |
| 219 | + return draft_change.new_version.title |
| 220 | + if draft_change.old_version: |
| 221 | + return draft_change.old_version.title |
| 222 | + return "" |
| 223 | + |
| 224 | + |
| 225 | +@admin.register(DraftChangeLog) |
| 226 | +class DraftChangeSetAdmin(ReadOnlyModelAdmin): |
| 227 | + """ |
| 228 | + Read-only admin to view Draft changes (via inline tables) |
| 229 | + """ |
| 230 | + inlines = [DraftChangeLogRecordTabularInline] |
| 231 | + fields = ( |
| 232 | + "uuid", |
| 233 | + "learning_package", |
| 234 | + "num_changes", |
| 235 | + "changed_at", |
| 236 | + "changed_by", |
| 237 | + ) |
| 238 | + readonly_fields = fields |
| 239 | + list_display = fields |
| 240 | + list_filter = ["learning_package"] |
| 241 | + |
| 242 | + def num_changes(self, draft_change_set): |
| 243 | + return draft_change_set.num_changes |
| 244 | + |
| 245 | + def get_queryset(self, request): |
| 246 | + queryset = super().get_queryset(request) |
| 247 | + return queryset.select_related("learning_package", "changed_by") \ |
| 248 | + .annotate(num_changes=Count("records")) |
0 commit comments