# Обновление журналов # Получить все материалы курса 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 в журналах