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.
338 lines
19 KiB
338 lines
19 KiB
# 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
|
|
|