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

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