Skip to content

Commit 0ac4531

Browse files
committed
feat: grouped draft changes (DraftChangeLog)
Create a way to group Draft modifications, as well as represent side-effects (for the parent-child use case). (Need to flesh this out a lot more before we merge.)
1 parent 98b8d15 commit 0ac4531

10 files changed

Lines changed: 938 additions & 148 deletions

File tree

openedx_learning/apps/authoring/publishing/admin.py

Lines changed: 73 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,19 @@
44
from __future__ import annotations
55

66
from django.contrib import admin
7+
from django.db.models import Count
78

9+
from .models.publish_log import Published
810
from openedx_learning.lib.admin_utils import ReadOnlyModelAdmin, one_to_one_related_model_html
911

10-
from .models import LearningPackage, PublishableEntity, Published, PublishLog, PublishLogRecord
11-
12+
from .models import (
13+
DraftChangeLogRecord,
14+
DraftChangeLog,
15+
LearningPackage,
16+
PublishableEntity,
17+
PublishLog,
18+
PublishLogRecord,
19+
)
1220

1321
@admin.register(LearningPackage)
1422
class LearningPackageAdmin(ReadOnlyModelAdmin):
@@ -171,3 +179,66 @@ def published_at(self, published_obj):
171179

172180
def message(self, published_obj):
173181
return published_obj.publish_log_record.publish_log.message
182+
183+
184+
class DraftChangeTabularInline(admin.TabularInline):
185+
model = DraftChangeLogRecord
186+
187+
fields = (
188+
"entity",
189+
"title",
190+
"old_version_num",
191+
"new_version_num",
192+
)
193+
readonly_fields = fields
194+
195+
def get_queryset(self, request):
196+
queryset = super().get_queryset(request)
197+
return queryset.select_related("entity", "old_version", "new_version") \
198+
.order_by("entity__key")
199+
200+
def old_version_num(self, draft_change: DraftChangeLogRecord):
201+
if draft_change.old_version is None:
202+
return "-"
203+
return draft_change.old_version.version_num
204+
205+
def new_version_num(self, draft_change: DraftChangeLogRecord):
206+
if draft_change.new_version is None:
207+
return "-"
208+
return draft_change.new_version.version_num
209+
210+
def title(self, draft_change: DraftChangeLogRecord):
211+
"""
212+
Get the title to display for the DraftChange
213+
"""
214+
if draft_change.new_version:
215+
return draft_change.new_version.title
216+
if draft_change.old_version:
217+
return draft_change.old_version.title
218+
return ""
219+
220+
221+
@admin.register(DraftChangeLog)
222+
class DraftChangeSetAdmin(ReadOnlyModelAdmin):
223+
"""
224+
Read-only admin to view Draft changes (via inline tables)
225+
"""
226+
inlines = [DraftChangeTabularInline]
227+
fields = (
228+
"uuid",
229+
"learning_package",
230+
"num_changes",
231+
"changed_at",
232+
"changed_by",
233+
)
234+
readonly_fields = fields
235+
list_display = fields
236+
list_filter = ["learning_package",]
237+
238+
def num_changes(self, draft_change_set):
239+
return draft_change_set.num_changes
240+
241+
def get_queryset(self, request):
242+
queryset = super().get_queryset(request)
243+
return queryset.select_related("learning_package", "changed_by") \
244+
.annotate(num_changes=Count("changes"))

0 commit comments

Comments
 (0)