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