diff --git a/_utils/check_course_journal.py b/_utils/check_course_journal.py new file mode 100644 index 0000000..e701d2c --- /dev/null +++ b/_utils/check_course_journal.py @@ -0,0 +1,62 @@ +#! coding: utf-8 + +import os +import django +import sys +import os + +from datetime import datetime + +sys.path.append("/var/www/skillbox") +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lms.settings") +django.setup() + +from lms.settings import BASE_DIR +from courses.models import Course +from finance.models import Price +from journals.models import TeacherJ, check_journal + +def check_course_journal(course_id): + print('===========\nКурс: %s\n==============\n' % Course.objects.get(id=course_id).title) + + print('Начало проверки журнала курса') + global_start = start = datetime.now() + course = Course.objects.get(id=course_id) + course.build_map() + finish = datetime.now() + print('Конец проверки журнала курса. Длительность: %s мсек\n' % (finish-start).microseconds) + + print('Начало проверки услуг') + start = datetime.now() + all = Price.objects.filter(by_time=0, post_fire=0, course__id=course_id).count() + print('Количество услуг на проверку: %s' % all) + for i in Price.objects.filter(by_time=0, post_fire=0, course__id=course_id): + i.check_points() + finish = datetime.now() + print('Конец проверки услуг. Длительность: %s мсек\n' % (finish-start).microseconds) + + print('Начало очистки двойных журналов') + start = datetime.now() + os.system('python clean_twice_course_journals.py %s' % course_id) + finish = datetime.now() + print('Конец очистки двойных журналов. Длительность: %s\n' % (finish-start).microseconds) + + print('Начало проверки журналов') + all = TeacherJ.objects.filter(progress__gt=0, course__id=course_id).count() + print('Количество журналов на проверку: %s' % all) + for i in TeacherJ.objects.filter(progress__gt=0, course__id=course_id).order_by('-id'): + check_journal(i, from_console=True) + print('Конец проверки журналов. Длительность: %s сек\n' % (finish-start).microseconds) + + print('Начало открытия уроков курса') + start = datetime.now() + os.system('python open_course_lesson.py %s' % course_id) + finish = datetime.now() + print('Конец открытия уроков курса. Длительность: %s\n' % (finish-start).microseconds) + + global_finish = datetime.now() + print('==============================\nДлительность: %s сек' % (global_finish - global_start).seconds) + +if __name__ == "__main__": + course_id = sys.argv[1] + check_course_journal(course_id) \ No newline at end of file diff --git a/_utils/clean_twice_course_journals.py b/_utils/clean_twice_course_journals.py new file mode 100644 index 0000000..41d8d59 --- /dev/null +++ b/_utils/clean_twice_course_journals.py @@ -0,0 +1,74 @@ +# coding=utf-8 +import os +import django +import sys +import datetime + +start = datetime.datetime.now() +sys.path.append("/var/www/skillbox/") +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lms.settings") +django.setup() + +from courses.models import Course, CourseTheme, Exam, Homework, Lesson +from journals.models import TeacherJ, CourseThemeJ, LessonJ, HomeworkJ, ExamJ +from access.models import User +from lms.tools import show_progress + + +def check_this(obj, collection): + if not collection.get(obj.material.id): + collection[obj.material.id] = True + else: + obj.delete() + + +def check_TJ(_course, _user): + try: + _tj = TeacherJ.objects.get(course=_course, student=_user) + except TeacherJ.DoesNotExist: + return None + except TeacherJ.MultipleObjectsReturned: + _tmp = TeacherJ.objects.filter(course=_course, student=_user).order_by('start_date') + _tj = _tmp[0] + for i in _tmp: + if i != _tj: + i.delete() + + return _tj + +course_id = sys.argv[1] + +_all = User.objects.all().count() +_n = 0 +_about_time = [] +for _user in User.objects.all(): # todo only course users + _st = datetime.datetime.now() + _course = Course.objects.filter(id=course_id) + _l = dict({i.id: False for i in Lesson.objects.filter(course=_course)}) + _h = dict({i.id: False for i in Homework.objects.filter(course=_course)}) + _e = dict({i.id: False for i in Exam.objects.filter(course=_course)}) + _t = dict({i.id: False for i in CourseTheme.objects.filter(course=_course)}) + + _tj = check_TJ(_course, _user) + + if _tj: + for _cj in CourseThemeJ.objects.filter(parent=_tj): + check_this(_cj, _t) + + for _lj in LessonJ.objects.filter(parent__parent=_tj): + check_this(_lj, _l) + + for _hj in HomeworkJ.objects.filter(parent__parent=_tj): + check_this(_hj, _h) + + for _ej in ExamJ.objects.filter(parent__parent=_tj): + check_this(_ej, _e) + + _ft = datetime.datetime.now() + _about_time.append((_ft - _st).microseconds) + _average = (((_all - _n) * (sum(_about_time) / len(_about_time)))/1000000)/60 + show_progress(_all, _n, post=' // "Удаление дуближей журналов" // Расчетное оставщееся время Этапа: {0:6.4} мин '.format(_average)) + _n += 1 + +finish = datetime.datetime.now() +print('\nTIME: %s seconds' % (finish - start).seconds) diff --git a/_utils/open_course_lesson.py b/_utils/open_course_lesson.py new file mode 100644 index 0000000..5e9325b --- /dev/null +++ b/_utils/open_course_lesson.py @@ -0,0 +1,199 @@ +# coding=utf-8 +import os +import django +import sys +import datetime + +sys.path.append("/var/www/skillbox") +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lms.settings") +django.setup() + +from journals.models import CourseMap, LessonJ, TeacherJ, HomeworkTry +from lms.tools import show_progress + +_NEED_OPEN = LessonJ.objects.get(material__id='1154', student__email='parabellum07@gmail.com') + +_TEACHERJ_FILTER = {'progress__gte': 0} +_TEACHERJ_EXCLUDE = {'teacher': None} + +_READL_FILTER = {'f_date': None} +_READL_EXCLUDE = {'date': None} + +_SUCCESSL_FILTER = {'success': True} +_SUCCESSL_EXCLUDE = {'date': None} + + +def get_all_journals(course_id): + return TeacherJ.objects.filter(**_TEACHERJ_FILTER, course__id=course__id).exclude(**_TEACHERJ_EXCLUDE).order_by('id') + + +def get_all_journals_count(): + return TeacherJ.objects.filter(**_TEACHERJ_FILTER).exclude(**_TEACHERJ_EXCLUDE).count() + + +def get_last_lessons(__journal): + # Получить последний читаемый уроки и выполненный + _READL_FILTER['student'] = __journal.student + _READL_FILTER['material__course'] = __journal.course + _SUCCESSL_FILTER['student'] = __journal.student + _SUCCESSL_FILTER['material__course'] = __journal.course + return (LessonJ.objects.filter(**_READL_FILTER).exclude(**_READL_EXCLUDE).order_by('id').last(), + LessonJ.objects.filter(**_SUCCESSL_FILTER).exclude(**_SUCCESSL_EXCLUDE).order_by('id').last()) + + +def open_lesson_befor_this(_lessonJ): + # Погружается объект последнего журнала урока + # Получаем все уроки этого журнала + _map = CourseMap.objects.get(lesson=_lessonJ.material) + for i in CourseMap.objects.filter(course=_map.course).exclude(lesson=None): + if i.sort < _map.sort: + try: + _j = LessonJ.objects.get( + material__token=i.token, + student=_lessonJ.student, + material__course=i.course + ) + except LessonJ.DoesNotExist as e: + print(e) + else: + check_to_success(_j) + + +def check_to_access(_journal): + # Проверка материала на доступ в прохождению + _journal.open_material() + + +def check_to_success(_journal): + # Проверка материала на завершенность + _journal.saw_this() + + +def check_lesson_after_hw(__journal, _target): + # Проверить - доступны ли уроки до ДЗ со статусом success + # Проверить - доступны ли видео до ДЗ не блокированного или пройденного + _last = HomeworkTry.objects.filter( + student=__journal.student, + material__course=__journal.course + ).order_by('id').last() + # Если стутс - success + _candidate = None + if _last: + try: + _candidate = CourseMap.objects.get( + sort=int(CourseMap.objects.get(token=_last.material.token).sort)+1, + course=__journal.course + ) + except CourseMap.DoesNotExist: + print('Ошибка получения карты журнала') + + else: + # Проверить - доступен ли журнал для чтения + if _candidate.lesson: + __candidate = LessonJ.objects.get( + material__token=_candidate.token, + student=_target.student, + material__course=__journal.course + ) + check_to_access(__candidate) + + if _candidate and _candidate.lesson and \ + int(CourseMap.objects.get( + token=_target.material.token, + course=__journal.course).sort) \ + < int(_candidate.sort): + + _target = LessonJ.objects.get( + material__token=_candidate.token, + student=_target.student, + material__course=__journal.course) + print('Цель изменена: %s' % _target.material.title) + + return _target + + +def main(course_id): + start = datetime.datetime.now() + _ERRORS = set() + _WARNING = set() + #for i in open('error.log'): + # _ERRORS.add(i.strip()) + _GOOD = 0 + _now = 0 + big = [] + if _NEED_OPEN: + open_lesson_befor_this(_NEED_OPEN) + + else: + if not _ERRORS: + _journals = get_all_journals(course_id) + _jcount = get_all_journals_count() + print('Количество журналов на проверку: %s' % _jcount) + else: + _journals = list([i for i in TeacherJ.objects.filter(student__email__in=_ERRORS)]) + _jcount = len(_journals) + print('Журналы с ошибками: %s' % _jcount) + + for __journal in _journals: + _start = datetime.datetime.now() + show_progress(_jcount, _now) + print('\nЖурнал: %s' % __journal.student.email) + try: + read, success = get_last_lessons(__journal) + + except Exception as e: + print('!!! Ошибка обработки') + print(e) + if __journal.course.id == 20: + _WARNING.add(__journal.student.email) + _ERROR_MAILS = open('error.log', 'a+') + _ERROR_MAILS.write('%s\n' % __journal.student.email) + _ERROR_MAILS.close() + + else: + print('%s // %s' % (read.material.title if read else ' - ', success.material.title if success else ' - ')) + + if not success and read: + _target = read + + elif read and (int(CourseMap.objects.get(lesson=read.material).sort) > int(CourseMap.objects.get(lesson=success.material).sort)): + _target = read + + elif success: + _target = success + + else: + _target = None + + if _target: + open_lesson_befor_this(check_lesson_after_hw(__journal, _target)) + + _GOOD += 1 + + _now += 1 + _finish = datetime.datetime.now() + _time_result = (_finish - _start).seconds + print('\nTIME: %s seconds' % _time_result) + if int(_time_result) > 1: + big.append(__journal.student.email) + print('Добавлено на проверку') + + print('===========\n') + + finish = datetime.datetime.now() + print('\nTIME: %s seconds' % (finish - start).seconds) + print('Нужно обратить внимание:') + for i in _WARNING: + print(i) + #print('Самые длительные записи:') + #print(big) + if _ERRORS: + if _GOOD == _now: + print('Все ошибки исправлены') + else: + print('Количество ошибок: %s' % int(_now - _GOOD)) + + +if __name__ == '__main__': + course_id = sys.argv[1] + main(course_id) diff --git a/static/css/app.css b/static/css/app.css index eb6e545..41f4f73 100755 --- a/static/css/app.css +++ b/static/css/app.css @@ -6355,4 +6355,55 @@ box-shadow: 0 12px 35px 0 rgba(134, 173, 253, 0.4); } .label-progress:hover{ height: 10px; -} \ No newline at end of file +} +#teacher_popup{ + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.8); + position: absolute; + top: 0px; + right: 0px; + z-index: 100000; +} +.teacher_popup{ + border: 2px solid #fff; + position: absolute; + width: 400px; + height: 226px; + left: 50%; + margin-left: -200px; + margin-top: 150px; + font-size: 22px; + background-color: #f9f9f9; + font-size: 22px; + padding: 30px; + bottom: 400px; +} +.realy{ + width: 100%; + height: 80px; + line-height: 40px; + text-align: center; + color: #000; + margin-bottom: 20px; +} +#yes, #no{ + border: 1px solid #fff; + width: 168px; + height: 60px; + text-align: center; + line-height: 60px; + cursor: pointer; +} +#yes{ + float: left; + font-size: 20px; + background-color: #27c24c; + border-radius: 7px 0 0 7px; +} +#no{ + float: right; + font-size: 20px; + background-color: #f05050; + border-radius: 0 7px 7px 0; +} diff --git a/static/js/homework.js b/static/js/homework.js index 0207157..da4fd46 100755 --- a/static/js/homework.js +++ b/static/js/homework.js @@ -68,9 +68,23 @@ function send_homework_down_teacher(form, root){ show_system_message('Введите текст сообщения') } } +function show_popup(){ + // нужно было сделать быстро - поэтому сделали гавно (с) skillbox + // нужно переделать под jquery + // сделать тоже самое и для кнопки отказать. + // Хороший способ передавать функцию отправки (up & down) сюда и здесь её запускать + popup = document.getElementById('teacher_popup') + popup.classList.toggle('hidden') + popup.onclick = function(e){ + if e.target == this{ + popup.classList.add('hidden') + } + } +} function send_homework_up_teacher(form, root){ // Проверить комментарий // Отправить + document.getElementById('teacher_popup').classList.add('hidden') if (CKEDITOR.instances.homework_text.getData()){ $('[name=homework_text]').val(CKEDITOR.instances.homework_text.getData()); $.ajax({ diff --git a/stud.txt b/stud.txt new file mode 100644 index 0000000..9ba59a5 --- /dev/null +++ b/stud.txt @@ -0,0 +1,127 @@ +Жиров Олег, niozuki@mail.ru, 5016 +Лавриненко Светлана, svelavs@gmail.com, 4648 +Санжар Суршанов, sanzharsurshanov@gmail.com, 4749 +Моторина Екатерина, katepainter@yandex.ru, 4424 +Белонович Гаянэ, gb.gayane@gmail.com, 4747 +Злобин Иван, baho9208@mail.ru, 4569 +Киселев Сергей, kiselev_s_l@mail.ru, 5307 +Мокичев Дмитрий, dmokichev@gmail.com, 5941 +Якухина Кира, kira.yakuhina@gmail.com, 4917 +Кулаев Виктор, geiz@yandex.ru, 4795 +Зайидова Aнна, annazayidova@gmail.com, 5039 +Демосюк Екатерина, ekde@wide-web.spb.ru, 5593 +Анастасова Светлана, zvetaan@gmail.com, 4751 +Киосов Георгий, goha@kiosov.com, 5240 +Мирзаева Кира, jalalovna@yandex.ru, 5687 +Донцов Александр, alex.dntv@gmail.com, 4659 +Попов Александр, ap@ds-p.ru, 5362 +Жоламанов Айдар, pobiz@inbox.ru, 4632 +Ковальская Станислава, skovalska@mail.ru, 5597 +Исаев Дмитрий, wrusha@yandex.ru, 4634 +Павлов Иван, pavlov@complexsys.ru, 5069 +Жарков Александр, alexzarkov@gmail.com, 5657 +Тихонов Александр, 9330733@mail.ru, 4865 +Залисский Артем, artemzig@gmail.com, 6030 +Тмур Антон, anton.tmur@gmail.com, 5877 +Масленников Михаил, mmaslennikov@mail.ru, 5510 +Пешинский Евгений, jack@creo.od.ua, 5930 +Тухачевский Дмитрий, tuhachevski@gmail.com, 5911 +Копачинский Константин, fazeful@gmail.com, 6115 +Рыжков Антон, tonyavec@gmail.com, 6029 +Сипатов Андрей, madjaw@mail.ru, 296 +Литвин Максим, corpas@gmail.com, 4730 +Шульга Игорь, ishulga86@gmail.com, 5600 +Макаров Алексей, avmakarov@asuproject.ru, 6122 +Фадеева Елена, alpha5@yandex.ru, 5926 +Палий Нина, slavinanm@gmail.com, 6117 +Портнова Оксана, portnova.ok@yandex.ru, 5947 +Копылова Христиана, blood4085@inbox.ru, 6037 +Галин Олег, ogalin@aevrika.ru, 5932 +Богданова Евгения, egysakova@gmail.com, 5945 +Дёмушкин Виктор, dinozavrix@gmail.com, 5610 +Бодров Илья, feyorz@gmail.com, 4652 +Махаева Василиса, kornblumchen@yandex.ru, 5756 +Трунова Ольга , trunovaon@gmail.com, 5759 +Аплемах Антон, a@cdnvideo.ru, 6034 +Павлов Алексей, kronos2k4@gmail.com, 4514 +Манасян Георгий, gsm_elst@rambler.ru, 5939 +Umnikov Aleksandr Сергеевич, strife88@mail.ru, 5919 +Самородова Анастасия, polgolovy@gmail.com, 4736 +Лемтюгова Катерина, lemma.ka@gmail.com, 4900 +Свинин Александр Александрович, alexandersvinin@gmail.com, 4541 +Поздняков Александр Сергеевич, alexpozdnyakof@gmail.com, 5459 +Климов Василий, vklimovs@mail.ru, 6047 +Воротникова Алена, alvo_05@mail.ru, 4742 +Аникьев Ян, yanchus@mail.ru, 6041 +Энч Андрей, captainanch@ya.ru, 5936 +Вусс Ольга, lesiawuss@gmail.com, 6619 +Крюков Денис, denis.kryukov@cyberiada.com, 5976 +Пастухова Екатерина, k-pastukhova@yandex.ru, 6832 +Кубасова Екатерина, cat.kubasova@yandex.ru, 6136 +Сутырина Евгения, jeneva7@gmail.com, 6965 +Вычик Павел, pavelvch@gmail.com, 7033 +Семашко Эдуард, info@darneo.ru, 5584 +Брюханов Денис, denisbryuhanov@gmail.com, 6962 +Плахов Павел, pplahov@gmail.com, 6775 +Подгорный Евгений, sonicmails@yandex.ru, 6977 +Пионтковская Наталья, pnz_08@mail.ru, 5977 +Ганина Ольга, onimfa@mail.ru, 6867 +Коробицин Иван, korobajr@ya.ru, 5504 +Денисов Владимир, dv@ilab.kz, 6208 +Pavlovska Anastasiia, 702752@gmail.com, 5363 +Карпов Александр Юрьевич, ikarp84@gmail.com, 6646 +Афанасьев Ярослав, ya@rl.ru, 6633 +Скробот Алексей, alekseyskrobot@gmail.com, 6942 +K Sergey, 1ngeneer@mail.ru, 6032 +Мельбурн Саша, sasha.melbourne@gmail.com, 5540 +Гулин Евгений, gulin@labizum.ru, 4759 +Литвин Артем, artemich92@mail.ru, 6779 +Киреичев Игорь, wm5soft@gmail.com, 6061 +Степанов Александр, alexsteptlt@mail.ru, 6616 +Кропанев Женя, kropev@rarus.ru, 4757 +Курылев Константин, cooryliof@gmail.com, 6241 +Казарова Елена, strekozka_l@mail.ru, 8207 +Епифанов Павел, pae1@europlan.ru, 6471 +Долженков Роман, tooob52@gmail.com, 6976 +Антоневич Алексей, atree2010@gmail.com, 7169 +Burchilina Maria, merabella00@yandex.ru, 7770 +Агарзаева Марина, agarzaeva@yandex.ru, 6939 +Сидоренко Илья , ilya@iskros.com, 7564 +Китов Владислав, vlkitov@gmail.com, 6038 +Репкин Антон, tingmann@gmail.com, 5943 +Протасевич Андрей, torus.andrey@gmail.com, 6062 +Велькин Андрей, wellkin@gmail.com, 5974 +Савченко Игорь, neo-quake@yandex.ru, 6752 +Ромаметьева Евгения, zhenyusya14@gmail.com, 6063 +Щербакова Ольга, olga@adt.ru, 7769 +Пашкевич Алексей , aplusp@yandex.ru, 6328 +Бурунин Игорь, burunin@gmail.com, 7974 +Боев Максим, skp_15@mail.ru, 6966 +Сухоставская Алла, alla.sukhostavskaya@gmail.com, 6739 +Шашкова Ольга, shashnia@gmail.com, 7007 +Малахова Екатерина, kononenko.e.p@gmail.com, 6312 +Саросек Михаил, sarosekml@yandex.ru, 7026 +Царенко Илья, itsarenko@gmail.com, 6724 +Соловьева Анна, miragann@gmail.com, 7656 +Дементьев Сергей, ldvmake@gmail.com, 8219 +Борисова Ирина, i.k.borisova@gmail.com, 8362 +Макеев Сергей , makini@ya.ru, 8313 +Гук Антон, anton.m.gook@gmail.com, 8031 +Колмогоров Дмитрий, kitt.diz@gmail.com, 7217 +Фомина Елена, efomina@msk.vtb.ru, 6120 +Назарова Евгения, nazarova-evg@yandex.ru, 7666 +Сергиенко Ольга Александровна , jayalila108@mail.ru, 7275 +Зарипов Алмаз, almazzar@gmail.com, 9381 +Ахкямова Эльвира, juniperland@gmail.com, 4929 +Рубцова Ирина, beruchie@yandex.ru, 6968 +Багаммаева Мадина, galadriel2007@mail.ru, 6951 +Четвериков Юрий, yuriy.chetverikov@gmail.com, 7168 +Маклакова Мария, tuna1706@yandex.ru, 6580 +Монаков Евгений, fridays365@gmail.com, 8637 +Прохоров Алексей, alex@space-o.ru, 6436 +Зайцев Никита, nickzaytzev@gmail.com, 6635 +Кожевников Андрей, helloandrei@mail.ru, 9536 +Лисивец Юрий Станиславович, lisivets@ya.ru, 7318 +Келемзина Софья, sofiakelemzina@gmail.com, 6204 +Зорина Алина, alinazoryna@gmail.com, 5973 +Кунакулов Ахнаф, axnaf@list.ru, 7733 diff --git a/templates/workshop_homework.html b/templates/workshop_homework.html index bb32be5..781ceb2 100755 --- a/templates/workshop_homework.html +++ b/templates/workshop_homework.html @@ -5,6 +5,12 @@ {% endblock %} {% block content %} +

Тема №{{ theme.sort }}: {{ theme.title }}