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

# 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