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.
155 lines
5.1 KiB
155 lines
5.1 KiB
from django.shortcuts import render_to_response, redirect, render
|
|
import time, os, csv
|
|
from datetime import date
|
|
|
|
from lms.settings import MEDIA_ROOT
|
|
|
|
from courses.models import Course, CourseTheme, Homework, Exam
|
|
from journals.models import CourseThemeJ, HomeworkTry, ExamTry
|
|
|
|
index_view = lambda request: render_to_response('analytics/index.html')
|
|
|
|
|
|
def index_view_decor(url):
|
|
def wrap(func):
|
|
def get_request(request):
|
|
start = request.GET.get('start', '')
|
|
end = request.GET.get('end', '')
|
|
|
|
path = MEDIA_ROOT + url + 's' + start + 'e' + end + 'progress.csv'
|
|
|
|
try:
|
|
with open(path, newline='') as file:
|
|
reader = csv.reader(file, delimiter=',', quotechar='|')
|
|
max = 0
|
|
res = []
|
|
for row in reader:
|
|
max = max if max > len(row) else len(row)
|
|
res1 = []
|
|
for i in row:
|
|
k = i.split("$-$")
|
|
k = {'value': k[0], 'background': 'none'}\
|
|
if len(i.split("$-$")) == 1 else {'value': k[0],'background': k[1]}
|
|
res1.append(k)
|
|
|
|
res.append(res1)
|
|
for i in res:
|
|
for j in range(max - len(i)):
|
|
i.append({'value': 0, 'background': 'none'})
|
|
first = ['Курсы']
|
|
for i in range(max - 1):
|
|
first.append("Тема " + str(i + 1))
|
|
except FileNotFoundError:
|
|
return redirect(url + "new/?start=" + start + "&end=" + end)
|
|
|
|
date_create = time.ctime(os.stat(path).st_atime)
|
|
|
|
context = {
|
|
'body': res,
|
|
'header': first,
|
|
'date_create': date_create,
|
|
'start': start,
|
|
'end': end,
|
|
'url': url,
|
|
}
|
|
|
|
context.update(func())
|
|
|
|
return render(request, url[1:-1] + '.html', context=context)
|
|
|
|
return get_request
|
|
|
|
return wrap
|
|
|
|
|
|
@index_view_decor("/analytics/theme/")
|
|
def index_view_access_theme():
|
|
return {}
|
|
|
|
|
|
@index_view_decor("/analytics/homework/")
|
|
def index_view_homework_wait():
|
|
return {}
|
|
|
|
|
|
def new_view_decor(url):
|
|
def wrap(func):
|
|
def get_request(request):
|
|
start = request.GET.get('start', '')
|
|
end = request.GET.get('end', '')
|
|
|
|
path = MEDIA_ROOT + url + 's' + start + 'e' + end + 'progress.csv'
|
|
|
|
start_date = None
|
|
end_date = None
|
|
|
|
try:
|
|
start_date = date(*[int(i) for i in start.split('-')])
|
|
end_date = date(*[int(i) for i in end.split('-')])
|
|
except ValueError:
|
|
pass
|
|
|
|
if not check_date_validate(start_date, end_date):
|
|
return redirect(url)
|
|
|
|
try:
|
|
with open(path, 'w', newline='') as csvfile:
|
|
func(end_date, start_date, csvfile)
|
|
return redirect(url + "?start=" + start + "&end=" + end)
|
|
|
|
except FileNotFoundError:
|
|
os.makedirs(MEDIA_ROOT + url)
|
|
return redirect(url + "new/?start=" + start + "&end=" + end)
|
|
|
|
return get_request
|
|
|
|
return wrap
|
|
|
|
|
|
@new_view_decor("/analytics/theme/")
|
|
def new_view_access_theme(end_date, start_date, csvfile):
|
|
for course in Course.objects.order_by('sort'):
|
|
list = [course.title]
|
|
for i in CourseTheme.objects.filter(course=course):
|
|
kwargs = {
|
|
'material': i,
|
|
'success': True,
|
|
}
|
|
if end_date:
|
|
kwargs['student__last_time__lte'] = end_date
|
|
if start_date:
|
|
kwargs['student__last_time__gte'] = start_date
|
|
list.append(str(len(CourseThemeJ.objects.filter(**kwargs))) + (
|
|
"$-$yellow" if i._type == 'Ex' else ""))
|
|
writercsv = csv.writer(csvfile, delimiter=',', quotechar='|')
|
|
writercsv.writerow(list)
|
|
|
|
|
|
@new_view_decor("/analytics/homework/")
|
|
def new_view_homework_wait(end_date, start_date, csvfile):
|
|
for course in Course.objects.order_by('sort'):
|
|
list = [course.title]
|
|
for i in CourseTheme.objects.filter(course=course):
|
|
kwargs = {
|
|
'success': False,
|
|
'expired': False,
|
|
'f_date': None
|
|
}
|
|
if end_date:
|
|
kwargs['student__last_time__lte'] = end_date
|
|
if start_date:
|
|
kwargs['student__last_time__gte'] = start_date
|
|
list.append(str(
|
|
len(HomeworkTry.objects.filter(material=Homework.objects.filter(theme=i), **kwargs)) +
|
|
len(ExamTry.objects.filter(material=Exam.objects.filter(theme=i), **kwargs))
|
|
))
|
|
writercsv = csv.writer(csvfile, delimiter=',', quotechar='|')
|
|
writercsv.writerow(list)
|
|
|
|
|
|
def check_date_validate(start=None, end=None):
|
|
if start:
|
|
if end:
|
|
return (start < end) and (end < date.today())
|
|
return start < date.today()
|
|
return end < date.today() if end else True
|
|
|