diff --git a/analytics/urls.py b/analytics/urls.py index cac8c8c..5b97d15 100644 --- a/analytics/urls.py +++ b/analytics/urls.py @@ -3,5 +3,8 @@ from analytics import views urlpatterns = [ url(r'^$', views.index_view), - url(r'^new/$', views.new_view), + url(r'^theme/$', views.index_view_access_theme), + url(r'^theme/new/$', views.new_view_access_theme), + url(r'^homework/$', views.index_view_homework_wait), + url(r'^homework/new/$', views.new_view_homework_wait), ] \ No newline at end of file diff --git a/analytics/views.py b/analytics/views.py index bc19e5b..47a51b9 100644 --- a/analytics/views.py +++ b/analytics/views.py @@ -1,88 +1,140 @@ -from django.shortcuts import render_to_response, redirect +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 -from journals.models import CourseThemeJ - - -def index_view(request): - start = request.GET.get('start', '') - end = request.GET.get('end', '') - - path = MEDIA_ROOT + '/analytics/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("/analytics/new/?start=" + start + "&end=" + end) - - date_create = time.ctime(os.stat(path).st_atime) - - return render_to_response('analytics.html', - {'body': res, 'header': first, 'date_create': date_create, 'start': start, 'end': end}) - - -def new_view(request): - start = request.GET.get('start', '') - end = request.GET.get('end', '') - - path = MEDIA_ROOT + '/analytics/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("/analytics/") - - try: - with open(path, 'w', newline='') as 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) - return redirect("/analytics/?start=" + start + "&end=" + end) - - except FileNotFoundError: - os.makedirs(MEDIA_ROOT + '/analytics') - return redirect("/analytics/new/?start=" + start + "&end=" + end) +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): diff --git a/templates/analytics.html b/templates/analytics.html deleted file mode 100644 index e431c17..0000000 --- a/templates/analytics.html +++ /dev/null @@ -1,37 +0,0 @@ -
| {{ i }} | - {% endfor %} -
|---|
| {{ j.value }} | - {% endfor %} -
- В данной таблице представлены данные о том, сколько студентов прошло заданную тему.
- Темы не всегда проходятся последовательно, поэтому порой тему с большим порядковым номером прошло большее количество пользовавтелей.
- Вы можите выставить фильтр по последней акутивности пользователя, фильтр может быть ограничивающим с одной стороны или может отсутствовать,
- в случае ввода невалидных данных ошибки не происходит вас просто перенапровляет на начальную страницу.
- Вы можите скачать отчёт в формате csv метка $-$yellow говорит о том что в данной теме есть экзамен,
- в таблице темы содержашие экзамен подсвечены жёлтым светом
-
| {{ i }} | + {% endfor %} +
|---|
| {{ j.value }} | + {% endfor %} +
+ {% block description %}{% endblock %} +
+ +