You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
3.4 KiB
72 lines
3.4 KiB
# Обновление журналов
|
|
# Получить все материалы курса
|
|
from courses.models import CourseTheme, Lesson, Exam, Homework, Course, CourseMap
|
|
from journals.models import TeacherJ, LessonJ, HomeworkJ, ExamJ
|
|
|
|
|
|
def check_material(_journal, _course_element):
|
|
# Проверка существования элемента по материалу и его типу
|
|
_type = _course_element['type']
|
|
_material = _course_element['obj']
|
|
|
|
if _type == 'lesson':
|
|
return LessonJ.objects.fitler(material=_material, parent__parent=_journal).exists()
|
|
|
|
elif _type == 'homework':
|
|
return HomeworkJ.objects.filter(material=_material, parent__parent=_journal).exists()
|
|
|
|
elif _type == 'exam':
|
|
return ExamJ.objects.filter(material=_material, parent__parent=_journal).exists()
|
|
|
|
return None
|
|
|
|
|
|
class CourseUpgrade:
|
|
def __init__(self, course=None, student=None):
|
|
self.course = course if type(course) != int else Course.objects.get(id=course)
|
|
self.student = student
|
|
self.original_map = {} #{'порядок': {'тип': '', 'Объект курса': ''}}
|
|
self._map, c = CourseMap.objects.get_or_create(course=self.course)
|
|
self._map_exclude = [] #{'материал': {'kw': {}, 'class': '', 'map': False }} К материалу привязаны его расхождения по всем студентам
|
|
if self.course and self.student:
|
|
self.main()
|
|
|
|
def init_original_map(self):
|
|
# Создается временная карта с актуальными данными
|
|
_sort = 0
|
|
for theme in CourseTheme.objects.filter(course=self.course).order_by('sort'):
|
|
for __lesson in Lesson.objects.filter(parent=theme).order_by('sort'):
|
|
self.original_map_insert('lesson', _sort, __lesson)
|
|
|
|
for __homework in Homework.objects.filter(parent=theme).order_by('sort'):
|
|
self.original_map_insert('homework', _sort, __homework)
|
|
|
|
for __exam in Exam.objects.filter(parent=theme).order_by('sort'):
|
|
self.original_map_insert('exam', _sort, __exam)
|
|
|
|
def original_map_insert(self, type, sort, obj):
|
|
self.original_map[sort] = {'type': type, 'obj': obj}
|
|
|
|
def check_map_element(self, _original_map_element, _sort):
|
|
# Сравнение карты курса и оригинальной карты
|
|
kw = {_original_map_element['type']: _original_map_element['obj'], 'sort': _sort}
|
|
try:
|
|
CourseMap.objects.get(**kw)
|
|
except CourseMap.DoesNotExist:
|
|
return False
|
|
else:
|
|
return True
|
|
|
|
def check_journals(self, _course_element):
|
|
# Проверка всех журналов на наличие конкретного материала
|
|
kw = {'course': self.course}
|
|
if self.student: kw['student'] = self.student
|
|
for journal in TeacherJ.objects.filter(**kw).order_by('-id'):
|
|
check_material(journal, _course_element)
|
|
|
|
def main(self):
|
|
# Запуск глобальной проверки
|
|
# Создание временной карты
|
|
self.init_original_map()
|
|
# Поиск пустых элементов карты - где не существует CourseMap. В результате - заполняется _map_exclude
|
|
# Поиск по пустым элементам _map_exclude в журналах
|
|
|