# coding=utf-8 import calendar import datetime from django.http import Http404 from lms.decors import api_decor, response_decor from journals.models import TeacherJ, CourseThemeJ, HomeworkJ, LessonJ, ReportDepth from finance.models import Bill, Price from courses.models import Course, CourseTheme, CourseMap from access.models import User from lms.tools import check_role, out_date_format from lms.settings import DOMAIN from service.models import MailBox def get_now_success_hw(): now = datetime.datetime.now() return HomeworkJ.objects.filter(date__gte=datetime.datetime(now.year, now.month, 1), date__lte=datetime.datetime(now.year, now.month, calendar.mdays[datetime.date.today().month]), f_date__lte=datetime.datetime(now.year, now.month, calendar.mdays[datetime.date.today().month]), f_date__gte=datetime.datetime(now.year, now.month, 1)).count() def get_second_success_hw(): _now = datetime.datetime.now() now = datetime.date(_now.year, datetime.datetime.now().month - 1 or 12, _now.day) return HomeworkJ.objects.filter(date__gte=datetime.datetime(now.year, now.month, 1), date__lte=datetime.datetime(now.year, now.month, calendar.mdays[now.month]), f_date__lte=datetime.datetime(now.year, now.month, calendar.mdays[now.month]), f_date__gte=datetime.datetime(now.year, now.month, 1)).count() @api_decor(without_auth=False) def now_success_hw(request, context): context['code'] = '1' context['data'] = get_now_success_hw() return context @api_decor(without_auth=False) def now_second_hw(request, context): context['code'] = '1' context['data'] = get_second_success_hw() return context @response_decor(template='reports/progress.html', without_auth=False) def progress(request): courses = {} for course in Course.objects.filter(public=True): title = course.get_title() courses[title] = {'users': [], 'map': [], 'id': course.id} courses[title]['users'] = Bill.objects.filter(status='F', service__course=course).order_by( 'user__id').distinct() courses[title]['map'] = CourseMap.objects.filter(course=course) return {'courses': courses, 'get_now_success_hw': get_now_success_hw(), 'get_second_success_hw': get_second_success_hw()} @response_decor(template='reports/freeweek.html', without_auth=False) def freeweek(request): if request.GET.get('price'): result = {'get_now_success_hw': get_now_success_hw(), 'get_second_success_hw': get_second_success_hw()} price = Price.objects.get(id=request.GET['price']) result['title'] = price.course.get_title() result['b_in'] = Bill.objects.filter(status='F', service=price, finish_date__gt=datetime.datetime.now() - datetime.timedelta(days=8), user__is_active=True, user__reg_status='4').order_by( 'finish_date').distinct() all = Bill.objects.filter(status='F', service=price, finish_date__gt=datetime.datetime.now() - datetime.timedelta(days=8), user__is_active=True, user__reg_status='4').values_list('user__email', flat=True).distinct().order_by('finish_date') result['in_hw'] = HomeworkJ.objects.filter(student__email__in=all, f_date=None, success=False, material__course=price.course).exclude(date=None).order_by('date') result['out_hw'] = HomeworkJ.objects.filter(student__email__in=all, success=True, material__course=price.course).exclude( f_date=None, date=None).order_by('f_date') else: result = {'active': {}, 'get_now_success_hw': get_now_success_hw(), 'get_second_success_hw': get_second_success_hw()} # all - Всего пользователей now = datetime.datetime.now() result['all'] = int(User.objects.filter(refer='B').count()) # active - Активировалось result['active']['count'] = int(User.objects.filter(refer='B', is_active=True, reg_status='4').count()) result['active']['persent'] = result['active']['count'] * 100 / result['all'] # Проходят обучение price = Price.objects.get(id=18) result['java'] = {'title': price.course, 'id': 18} result['java']['all'] = Bill.objects.filter(status='F', service=price, user__is_active=True, user__reg_status='4').values_list('user', flat=True).distinct().count() result['java']['in'] = { 'all': Bill.objects.filter(status='F', service=price, finish_date__gt=now - datetime.timedelta(days=8), user__is_active=True, user__reg_status='4').values_list('user__email', flat=True).distinct(), 'count': Bill.objects.filter(status='F', service=price, finish_date__gte=now - datetime.timedelta(days=7), user__is_active=True, user__reg_status='4').values_list('user__email', flat=True).distinct().count()} result['java']['in_hw'] = HomeworkJ.objects.filter(student__email__in=result['java']['in']['all'], f_date=None, success=False, material__course=price.course).exclude( date=None).values_list( 'student', flat=True).distinct().count() result['java']['out_hw'] = HomeworkJ.objects.filter(student__email__in=result['java']['in']['all'], success=True, material__course=price.course).exclude( f_date=None, date=None).values_list( 'student', flat=True).distinct().count() price = Price.objects.get(id=19) result['web'] = {'title': price.course, 'id': 19} result['web']['all'] = Bill.objects.filter(status='F', service=price, user__is_active=True, user__reg_status='4').values_list('user', flat=True).distinct().count() result['web']['in'] = { 'all': Bill.objects.filter(status='F', service=price, finish_date__gt=now - datetime.timedelta(days=8), user__is_active=True, user__reg_status='4').values_list('user__email', flat=True).distinct(), 'count': Bill.objects.filter(status='F', service=price, finish_date__gte=now - datetime.timedelta(days=7), user__is_active=True, user__reg_status='4').values_list('user__email', flat=True).distinct().count()} result['web']['in_hw'] = HomeworkJ.objects.filter(student__email__in=result['web']['in']['all'], f_date=None, success=False, material__course=price.course).exclude( date=None).values_list( 'student', flat=True).distinct().count() result['web']['out_hw'] = HomeworkJ.objects.filter(student__email__in=result['web']['in']['all'], success=True, material__course=price.course).exclude( f_date=None, date=None).values_list( 'student', flat=True).distinct().count() price = Price.objects.get(id=17) result['android'] = {'title': price.course, 'id': 17} result['android']['all'] = Bill.objects.filter(status='F', service=price, user__is_active=True, user__reg_status='4').values_list('user', flat=True).distinct().count() result['android']['in'] = { 'all': Bill.objects.filter(status='F', service=price, finish_date__gt=now - datetime.timedelta(days=8), user__is_active=True, user__reg_status='4').values_list('user__email', flat=True).distinct(), 'count': Bill.objects.filter(status='F', service=price, finish_date__gte=now - datetime.timedelta(days=7), user__is_active=True, user__reg_status='4').values_list('user__email', flat=True).distinct().count()} result['android']['in_hw'] = HomeworkJ.objects.filter(student__email__in=result['android']['in']['all'], f_date=None, success=False, material__course=price.course).exclude( date=None).values_list( 'student', flat=True).distinct().count() result['android']['out_hw'] = HomeworkJ.objects.filter(student__email__in=result['android']['in']['all'], success=True, material__course=price.course).exclude( f_date=None, date=None).values_list( 'student', flat=True).distinct().count() price = Price.objects.get(id=16) result['csh'] = {'title': price.course, 'id': 16} result['csh']['all'] = Bill.objects.filter(status='F', service=price, user__is_active=True, user__reg_status='4').values_list('user', flat=True).distinct().count() result['csh']['in'] = { 'all': Bill.objects.filter(status='F', service=price, finish_date__gt=now - datetime.timedelta(days=8), user__is_active=True, user__reg_status='4').values_list('user__email', flat=True).distinct(), 'count': Bill.objects.filter(status='F', service=price, finish_date__gte=now - datetime.timedelta(days=7), user__is_active=True, user__reg_status='4').values_list('user__email', flat=True).distinct().count()} result['csh']['in_hw'] = HomeworkJ.objects.filter(student__email__in=result['csh']['in']['all'], f_date=None, success=False, material__course=price.course).exclude( date=None).values_list( 'student', flat=True).distinct().count() result['csh']['out_hw'] = HomeworkJ.objects.filter(student__email__in=result['csh']['in']['all'], success=True, material__course=price.course).exclude( f_date=None, date=None).values_list( 'student', flat=True).distinct().count() return result @response_decor(template='reports/hw_process_pp.html', without_auth=False) def hw_process_pp(request): # Ответ по ученику return {'get_now_success_hw': get_now_success_hw(), 'get_second_success_hw': get_second_success_hw()} @response_decor(template='reports/hw_process_pt.html', without_auth=False) def hw_process_pt(request): # Отчет по преподавателю return {'courses': Course.objects.filter(public=True), 'get_now_success_hw': get_now_success_hw(), 'get_second_success_hw': get_second_success_hw()} @response_decor(template='reports/mails.html', without_auth=False) def mails(request): # Контроль рассылок stat = {} m3 = datetime.datetime.now()-datetime.timedelta(weeks=12) m1 = datetime.datetime.now()-datetime.timedelta(weeks=4) w1 = datetime.datetime.now()-datetime.timedelta(weeks=1) d3 = datetime.datetime.now()-datetime.timedelta(days=3) d1 = datetime.datetime.now()-datetime.timedelta(days=1) sections = MailBox.objects.exclude(_type='').values_list('_type', flat=True).distinct() n = 0 for section in sections: stat[section] = { 'id': n, 'all': MailBox.objects.filter(_type=section).count(), 'm3': MailBox.objects.filter(_type=section, sent_date__gte=m3).count(), 'm1': MailBox.objects.filter(_type=section, sent_date__gte=m1).count(), 'w1': MailBox.objects.filter(_type=section, sent_date__gte=w1).count(), 'd3': MailBox.objects.filter(_type=section, sent_date__gte=d3).count(), 'd1': MailBox.objects.filter(_type=section, sent_date__gte=d1).count() } n += 1 return {'get_now_success_hw': get_now_success_hw(), 'get_second_success_hw': get_second_success_hw(), 'stat': stat, 'self_reports': []} @api_decor(without_auth=False, method='GET', check_request=True, need_keys=['course']) def get_course_teachers(request, context): try: course = Course.objects.get(id=request.GET['course']) except Course.DoesNotExist: context['code'] = '0' context['response'] = u'Курс не найден' context['data'] = [] else: context['code'] = '1' context['data'] = [teacher.get_face() for teacher in course.teachers.all()] return context @api_decor(without_auth=False, method='GET', check_request=True, need_keys=['teacher']) def get_teacher_students(request, context): try: journals = TeacherJ.objects.filter(teacher=User.objects.get(id=request.GET['teacher'])).exclude(user__is_active=False) except User.DoesNotExist: context['code'] = '0' context['data'] = [] context['response'] = u'Преподаватель не найден' else: context['code'] = '1' context['data'] = journals return context @api_decor(without_auth=False) def get_course_students(request, context): context['data'] = [] if request.GET.get('exc'): ex = request.GET['exc'].split('_') ex.pop() exc = map(int, ex) user = Bill.objects.filter(status='F', service__course__id=request.GET['course']).exclude( user__id__in=exc).order_by('user__id').distinct().first() else: user = Bill.objects.filter(status='F', service__course__id=request.GET['course']).order_by( 'user__id').distinct().first() if user: user = user.user context['code'] = '1' context['response'] = user.id for token in ReportDepth.objects.filter(student=user, course__id=int(request.GET['course'])).order_by( 'token__sort'): context['data'].append({ 'point': str(request.GET['course']) + '_' + str(user.id) + '_' + str(token.token.token), 's_date': '{2}{1}{0}'.format(token.s_date.day, token.s_date.month, token.s_date.year), 'f_date': '{2}{1}{0}'.format(token.f_date.day, token.f_date.month, token.f_date.year) if token.f_date else None, 'type': token.token._type, 'student': user.id}) return context @api_decor(without_auth=False, need_keys=['course', 'teacher', 's_date', 'f_date', 'expired', 'success', 'in_work'], method='GET', check_request=True) def get_process_report(request, context): if request.user.is_admin: context['data'] = { 'more': [] } q = { 'teacher__id': request.GET['teacher'], 'material__course__id': request.GET['course'], 'date__gte': datetime.datetime.strptime(request.GET['s_date'], '%d_%m_%Y'), 'date__lt': datetime.datetime.strptime(request.GET['f_date'], '%d_%m_%Y') } hw = HomeworkJ.objects.filter(**q) student = [] get_hw = [] in_work_hw = [] expired_hw = [] success_hw = [] for i in hw: if not i.set_open and len(list(i.get_tries())) > 0: exp = i.check_expired() result = True if result: context['data']['more'].append( {'course': i.material.course.get_title(), 'id': i.id, 'material': u'ID: {0} / Порядок темы: {1} / Заголовок: {2}'.format(i.material.id, i.material.theme.sort, i.material.get_title()), 'material_id': i.material.id, 'student_token': i.student.interactive_key, 'student': i.student.get_short_name(), 'teacher': i.teacher.get_short_name(), 's_date': out_date_format(i.date), 'f_date': out_date_format(i.f_date), 'status': i.get_status()['title'], 'expired': exp, 'expired_time': i.expired_time(), 'tries': len(list(i.get_tries())), 'link': '{1}teacher/workshop/homework/{0}'.format(i.id, DOMAIN)} ) if i.student.id not in student: student.append(i.student.id) if i.id not in expired_hw and exp: expired_hw.append(i.id) if i.id not in in_work_hw and not i.f_date and not i.success: in_work_hw.append(i.id) if i.id not in success_hw and i.success: success_hw.append(i.id) if i.id not in get_hw: get_hw.append(i.id) context['code'] = '1' context['data']['info'] = {'students': len(student), 'get_hw': len(get_hw), 'in_work_hw': len(in_work_hw), 'expired_hw': len(expired_hw), 'success_hw': len(success_hw)} return context raise Http404 @api_decor(without_auth=False) def progress_check_result(request, context): context['data'] = [] if int(request.GET['len']) == Bill.objects.filter(status='F', service__course__id=request.GET['course']).values_list('user', flat=True).order_by( 'user__id').distinct().count(): context['code'] = '1' else: context['code'] = '0' return context