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.
 
 
 
 
 
 

145 lines
5.2 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}
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' or i._type == 'M' 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,
}
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))
) + ("$-$yellow" if i._type == 'Ex' or i._type == 'M' else ""))
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