|
12 | 12 | CourseModule, |
13 | 13 | CourseTask, |
14 | 14 | CourseTaskOption, |
| 15 | + UserCourseProgress, |
| 16 | + UserLessonProgress, |
| 17 | + UserModuleProgress, |
15 | 18 | UserTaskAnswer, |
16 | 19 | UserTaskAnswerFile, |
17 | 20 | UserTaskAnswerOption, |
|
32 | 35 | UserTaskAnswerOption._meta.verbose_name_plural = "Выбранные варианты" |
33 | 36 | UserTaskAnswerFile._meta.verbose_name = "Файл" |
34 | 37 | UserTaskAnswerFile._meta.verbose_name_plural = "Файлы" |
| 38 | +UserCourseProgress._meta.verbose_name = "Прогресс курса" |
| 39 | +UserCourseProgress._meta.verbose_name_plural = "Прогресс курсов" |
| 40 | +UserModuleProgress._meta.verbose_name = "Прогресс модуля" |
| 41 | +UserModuleProgress._meta.verbose_name_plural = "Прогресс модулей" |
| 42 | +UserLessonProgress._meta.verbose_name = "Прогресс урока" |
| 43 | +UserLessonProgress._meta.verbose_name_plural = "Прогресс уроков" |
35 | 44 |
|
36 | 45 | _COURSES_MODEL_ORDER = { |
37 | 46 | "Course": 1, |
|
42 | 51 | "UserTaskAnswer": 6, |
43 | 52 | "UserTaskAnswerOption": 7, |
44 | 53 | "UserTaskAnswerFile": 8, |
| 54 | + "UserCourseProgress": 9, |
| 55 | + "UserModuleProgress": 10, |
| 56 | + "UserLessonProgress": 11, |
45 | 57 | } |
46 | 58 |
|
47 | 59 |
|
@@ -593,3 +605,107 @@ class UserTaskAnswerFileAdmin(admin.ModelAdmin): |
593 | 605 | raw_id_fields = ("answer", "file") |
594 | 606 | readonly_fields = ("file_name", "file_size", "datetime_uploaded") |
595 | 607 | list_select_related = ("answer", "file", "answer__user", "answer__task") |
| 608 | + |
| 609 | + |
| 610 | +@admin.register(UserCourseProgress) |
| 611 | +class UserCourseProgressAdmin(admin.ModelAdmin): |
| 612 | + list_display = ( |
| 613 | + "id", |
| 614 | + "user", |
| 615 | + "course", |
| 616 | + "status", |
| 617 | + "percent", |
| 618 | + "started_at", |
| 619 | + "completed_at", |
| 620 | + "last_visit_at", |
| 621 | + "datetime_updated", |
| 622 | + ) |
| 623 | + list_display_links = ("id",) |
| 624 | + list_filter = ("status", "course") |
| 625 | + search_fields = ( |
| 626 | + "id", |
| 627 | + "user__email", |
| 628 | + "user__first_name", |
| 629 | + "user__last_name", |
| 630 | + "course__title", |
| 631 | + ) |
| 632 | + raw_id_fields = ("user", "course") |
| 633 | + readonly_fields = ("datetime_created", "datetime_updated") |
| 634 | + list_select_related = ("user", "course") |
| 635 | + |
| 636 | + |
| 637 | +@admin.register(UserModuleProgress) |
| 638 | +class UserModuleProgressAdmin(admin.ModelAdmin): |
| 639 | + list_display = ( |
| 640 | + "id", |
| 641 | + "user", |
| 642 | + "module", |
| 643 | + "get_course", |
| 644 | + "status", |
| 645 | + "percent", |
| 646 | + "started_at", |
| 647 | + "completed_at", |
| 648 | + "datetime_updated", |
| 649 | + ) |
| 650 | + list_display_links = ("id",) |
| 651 | + list_filter = ("status", "module__course") |
| 652 | + search_fields = ( |
| 653 | + "id", |
| 654 | + "user__email", |
| 655 | + "user__first_name", |
| 656 | + "user__last_name", |
| 657 | + "module__title", |
| 658 | + "module__course__title", |
| 659 | + ) |
| 660 | + raw_id_fields = ("user", "module") |
| 661 | + readonly_fields = ("datetime_created", "datetime_updated") |
| 662 | + list_select_related = ("user", "module", "module__course") |
| 663 | + |
| 664 | + @admin.display(description="Курс", ordering="module__course__title") |
| 665 | + def get_course(self, obj): |
| 666 | + return obj.module.course |
| 667 | + |
| 668 | + |
| 669 | +@admin.register(UserLessonProgress) |
| 670 | +class UserLessonProgressAdmin(admin.ModelAdmin): |
| 671 | + list_display = ( |
| 672 | + "id", |
| 673 | + "user", |
| 674 | + "lesson", |
| 675 | + "get_module", |
| 676 | + "get_course", |
| 677 | + "status", |
| 678 | + "percent", |
| 679 | + "current_task", |
| 680 | + "started_at", |
| 681 | + "completed_at", |
| 682 | + "datetime_updated", |
| 683 | + ) |
| 684 | + list_display_links = ("id",) |
| 685 | + list_filter = ("status", "lesson__module__course") |
| 686 | + search_fields = ( |
| 687 | + "id", |
| 688 | + "user__email", |
| 689 | + "user__first_name", |
| 690 | + "user__last_name", |
| 691 | + "lesson__title", |
| 692 | + "lesson__module__title", |
| 693 | + "lesson__module__course__title", |
| 694 | + ) |
| 695 | + raw_id_fields = ("user", "lesson", "current_task") |
| 696 | + readonly_fields = ("datetime_created", "datetime_updated") |
| 697 | + list_select_related = ( |
| 698 | + "user", |
| 699 | + "lesson", |
| 700 | + "lesson__module", |
| 701 | + "lesson__module__course", |
| 702 | + "current_task", |
| 703 | + ) |
| 704 | + |
| 705 | + @admin.display(description="Модуль", ordering="lesson__module__title") |
| 706 | + def get_module(self, obj): |
| 707 | + return obj.lesson.module |
| 708 | + |
| 709 | + @admin.display(description="Курс", ordering="lesson__module__course__title") |
| 710 | + def get_course(self, obj): |
| 711 | + return obj.lesson.module.course |
0 commit comments