Skip to content

Commit e02a7d3

Browse files
authored
Merge pull request #610 from PROCOLLAB-github/feature/program-courses
Добавлены answer_title для заданий и module_order в lesson detail API
2 parents 57be27b + ab57826 commit e02a7d3

7 files changed

Lines changed: 52 additions & 1 deletion

File tree

courses/admin_config/content.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,15 @@ class CourseTaskAdmin(UserFileUploadAdminMixin, admin.ModelAdmin):
195195
fieldsets = (
196196
(
197197
None,
198-
{"fields": ("lesson", "title", "status", "task_kind", "order")},
198+
{
199+
"fields": (
200+
"lesson",
201+
"title",
202+
"status",
203+
"task_kind",
204+
"order",
205+
)
206+
},
199207
),
200208
(
201209
"Типы задания",
@@ -213,6 +221,7 @@ class CourseTaskAdmin(UserFileUploadAdminMixin, admin.ModelAdmin):
213221
{
214222
"fields": (
215223
"body_text",
224+
"answer_title",
216225
"video_url",
217226
"image_file",
218227
"image_upload",

courses/api/serializers/common.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class LessonTaskSerializer(serializers.Serializer):
2727
id = serializers.IntegerField()
2828
order = serializers.IntegerField(min_value=1)
2929
title = serializers.CharField()
30+
answer_title = serializers.CharField(allow_blank=True)
3031
status = serializers.ChoiceField(choices=CourseTaskContentStatus.choices)
3132
task_kind = serializers.ChoiceField(choices=CourseTaskKind.choices)
3233
check_type = serializers.ChoiceField(

courses/api/serializers/lesson.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
class LessonDetailSerializer(serializers.Serializer):
99
id = serializers.IntegerField()
1010
module_id = serializers.IntegerField()
11+
module_order = serializers.IntegerField(min_value=1)
1112
course_id = serializers.IntegerField()
1213
title = serializers.CharField()
1314
progress_status = serializers.ChoiceField(choices=ProgressStatus.choices)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 4.2.11 on 2026-03-13 08:45
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('courses', '0006_usercourseprogress_userlessonprogress_and_more'),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name='coursetask',
15+
name='answer_title',
16+
field=models.CharField(blank=True, default='', max_length=255, verbose_name='Заголовок блока ответа'),
17+
),
18+
]

courses/models/content.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,12 @@ class CourseTask(models.Model):
162162
default="",
163163
verbose_name="Текст",
164164
)
165+
answer_title = models.CharField(
166+
max_length=255,
167+
blank=True,
168+
default="",
169+
verbose_name="Заголовок блока ответа",
170+
)
165171
status = models.CharField(
166172
max_length=16,
167173
choices=CourseTaskContentStatus.choices,

courses/queries/lesson_detail.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ def build_lesson_detail_payload(user, pk: int) -> dict:
8181
"id": task.id,
8282
"order": task.order,
8383
"title": task.title,
84+
"answer_title": task.answer_title,
8485
"status": task.status,
8586
"task_kind": task.task_kind,
8687
"check_type": task.check_type,
@@ -100,6 +101,7 @@ def build_lesson_detail_payload(user, pk: int) -> dict:
100101
return {
101102
"id": lesson.id,
102103
"module_id": lesson.module_id,
104+
"module_order": lesson.module.order,
103105
"course_id": lesson.module.course_id,
104106
"title": lesson.title,
105107
"progress_status": snapshot.status,

courses/tests/test_api_extended.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,10 @@ def test_files_and_text_and_files_flow_validates_payload_and_completes_course(se
184184
title="Explain risks",
185185
order=2,
186186
)
187+
files_task.answer_title = "Загрузите файл с расчётами"
188+
files_task.save(update_fields=["answer_title"])
189+
text_and_files_task.answer_title = "Добавьте комментарий и приложите материалы"
190+
text_and_files_task.save(update_fields=["answer_title"])
187191

188192
invalid_file_response = self.client.post(
189193
f"/courses/tasks/{files_task.id}/answer/",
@@ -208,12 +212,22 @@ def test_files_and_text_and_files_flow_validates_payload_and_completes_course(se
208212
},
209213
format="json",
210214
)
215+
lesson_detail = self.client.get(f"/courses/lessons/{lesson.id}/").json()
211216
course_detail = self.client.get(f"/courses/{course.id}/").json()
212217

213218
self.assertEqual(invalid_file_response.status_code, 400)
214219
self.assertEqual(files_response.status_code, 200)
215220
self.assertTrue(files_response.json()["can_continue"])
216221
self.assertEqual(invalid_text_and_files_response.status_code, 400)
217222
self.assertEqual(valid_text_and_files_response.status_code, 200)
223+
self.assertEqual(lesson_detail["module_order"], 1)
224+
self.assertEqual(
225+
lesson_detail["tasks"][0]["answer_title"],
226+
"Загрузите файл с расчётами",
227+
)
228+
self.assertEqual(
229+
lesson_detail["tasks"][1]["answer_title"],
230+
"Добавьте комментарий и приложите материалы",
231+
)
218232
self.assertEqual(course_detail["progress_status"], "completed")
219233
self.assertEqual(course_detail["percent"], 100)

0 commit comments

Comments
 (0)