нет времени объяснять

remotes/origin/pm_task_31703
andrey 8 years ago
parent 266fa6ae5d
commit 2856764163
  1. 5
      analytics/urls.py
  2. 84
      analytics/views.py
  3. 37
      templates/analytics.html
  4. 41
      templates/analytics/base.html
  5. 12
      templates/analytics/index.html
  6. 9
      templates/analytics/theme.html

@ -3,5 +3,8 @@ from analytics import views
urlpatterns = [ urlpatterns = [
url(r'^$', views.index_view), 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),
] ]

@ -1,18 +1,22 @@
from django.shortcuts import render_to_response, redirect from django.shortcuts import render_to_response, redirect, render
import time, os, csv import time, os, csv
from datetime import date from datetime import date
from lms.settings import MEDIA_ROOT from lms.settings import MEDIA_ROOT
from courses.models import Course, CourseTheme from courses.models import Course, CourseTheme, Homework, Exam
from journals.models import CourseThemeJ from journals.models import CourseThemeJ, HomeworkTry, ExamTry
index_view = lambda request: render_to_response('analytics/index.html')
def index_view(request):
def index_view_decor(url):
def wrap(func):
def get_request(request):
start = request.GET.get('start', '') start = request.GET.get('start', '')
end = request.GET.get('end', '') end = request.GET.get('end', '')
path = MEDIA_ROOT + '/analytics/s' + start + 'e' + end + 'progress.csv' path = MEDIA_ROOT + url + 's' + start + 'e' + end + 'progress.csv'
try: try:
with open(path, newline='') as file: with open(path, newline='') as file:
@ -25,7 +29,8 @@ def index_view(request):
for i in row: for i in row:
k = i.split("$-$") k = i.split("$-$")
k = {'value': k[0], 'background': 'none'} if len(i.split("$-$")) == 1 else {'value': k[0], k = {'value': k[0], 'background': 'none'} if len(i.split("$-$")) == 1 else {'value': k[0],
'background': k[1]} 'background': k[
1]}
res1.append(k) res1.append(k)
res.append(res1) res.append(res1)
for i in res: for i in res:
@ -35,19 +40,37 @@ def index_view(request):
for i in range(max - 1): for i in range(max - 1):
first.append("Тема " + str(i + 1)) first.append("Тема " + str(i + 1))
except FileNotFoundError: except FileNotFoundError:
return redirect("/analytics/new/?start=" + start + "&end=" + end) return redirect(url + "new/?start=" + start + "&end=" + end)
date_create = time.ctime(os.stat(path).st_atime) date_create = time.ctime(os.stat(path).st_atime)
return render_to_response('analytics.html', context = {'body': res, 'header': first, 'date_create': date_create, 'start': start, 'end': end}
{'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(request):
def new_view_decor(url):
def wrap(func):
def get_request(request):
start = request.GET.get('start', '') start = request.GET.get('start', '')
end = request.GET.get('end', '') end = request.GET.get('end', '')
path = MEDIA_ROOT + '/analytics/s' + start + 'e' + end + 'progress.csv' path = MEDIA_ROOT + url + 's' + start + 'e' + end + 'progress.csv'
start_date = None start_date = None
end_date = None end_date = None
@ -59,10 +82,24 @@ def new_view(request):
pass pass
if not check_date_validate(start_date, end_date): if not check_date_validate(start_date, end_date):
return redirect("/analytics/") return redirect(url)
try: try:
with open(path, 'w', newline='') as csvfile: 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'): for course in Course.objects.order_by('sort'):
list = [course.title] list = [course.title]
for i in CourseTheme.objects.filter(course=course): for i in CourseTheme.objects.filter(course=course):
@ -78,11 +115,26 @@ def new_view(request):
"$-$yellow" if i._type == 'Ex' or i._type == 'M' else "")) "$-$yellow" if i._type == 'Ex' or i._type == 'M' else ""))
writercsv = csv.writer(csvfile, delimiter=',', quotechar='|') writercsv = csv.writer(csvfile, delimiter=',', quotechar='|')
writercsv.writerow(list) writercsv.writerow(list)
return redirect("/analytics/?start=" + start + "&end=" + end)
except FileNotFoundError:
os.makedirs(MEDIA_ROOT + '/analytics') @new_view_decor("/analytics/homework/")
return redirect("/analytics/new/?start=" + start + "&end=" + end) 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): def check_date_validate(start=None, end=None):

@ -1,37 +0,0 @@
<h2>Дата создания отчёта {{ date_create }}</h2>
<button><a href="new?start={{ start }}&end={{ end }}">Сгенирировать отчёт</a></button>
<button style="margin-bottom: 20px"><a href="/media/analytics/s{{ start }}e{{ end }}progress.csv">Скачать отчёт</a></button>
<form action="">
<label>от</label>
<input name="start" type="date" value="{{ start }}">
<label>до</label>
<input name="end" type="date" value="{{ end }}">
<button type="submit">Подготовить отчёт</button>
</form>
<table border="1px">
<tr>
{% for i in header %}
<th>{{ i }}</th>
{% endfor %}
</tr>
{% for i in body %}
<tr>
{% for j in i %}
<td style="background: {{j.background}}">{{ j.value }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
<p>
В данной таблице представлены данные о том, сколько студентов прошло заданную тему. <br>
Темы не всегда проходятся последовательно, поэтому порой тему с большим порядковым номером прошло большее количество пользовавтелей. <br>
Вы можите выставить фильтр по последней акутивности пользователя, фильтр может быть ограничивающим с одной стороны или может отсутствовать, <br>
в случае ввода невалидных данных ошибки не происходит вас просто перенапровляет на начальную страницу. <br>
Вы можите скачать отчёт в формате csv метка $-$yellow говорит о том что в данной теме есть экзамен,<br>
в таблице темы содержашие экзамен подсвечены жёлтым светом
</p>
<h2>Внимание! Новый отчёт генерируется 1 раз! Следите за записью в хедоре страницы, если вы нуждаетесь в обновлении <br>
данных жмите кнопку "Сгенерировать отчёт" таким образом вы получите обновлённые данные для заданных пораметров фильтрации</h2>

@ -0,0 +1,41 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Аналитика</title>
</head>
<body>
<h2>Дата создания отчёта {{ date_create }}</h2>
<button><a href="new?start={{ start }}&end={{ end }}">Сгенирировать отчёт</a></button>
<button style="margin-bottom: 20px"><a href="/media/analytics/theme/s{{ start }}e{{ end }}progress.csv">Скачать отчёт</a></button>
<button><a href="/analytics">На главную</a></button>
<form action="">
<label>от</label>
<input name="start" type="date" value="{{ start }}">
<label>до</label>
<input name="end" type="date" value="{{ end }}">
<button type="submit">Подготовить отчёт</button>
</form>
<table border="1px">
<tr>
{% for i in header %}
<th>{{ i }}</th>
{% endfor %}
</tr>
{% for i in body %}
<tr>
{% for j in i %}
<td style="background: {{j.background}}">{{ j.value }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
<p>
{% block description %}{% endblock %}
</p>
<h2>Внимание! Новый отчёт генерируется 1 раз! Следите за записью в хедоре страницы, если вы нуждаетесь в обновлении <br>
данных жмите кнопку "Сгенерировать отчёт" таким образом вы получите обновлённые данные для заданных пораметров фильтрации</h2>
</body>
</html>

@ -0,0 +1,12 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Аналитика</title>
</head>
<body>
<h2>Меню поиска</h2>
<h4><a href="theme">Студентов успешно прошедших тему</a></h4>
<h4><a href="homework">Студентов ожидающих проверки домашки</a></h4>
</body>
</html>

@ -0,0 +1,9 @@
{% extends 'analytics/base.html' %}
{% block description %}
В данной таблице представлены данные о том, сколько студентов прошло заданную тему. <br>
Темы не всегда проходятся последовательно, поэтому порой тему с большим порядковым номером прошло большее количество пользовавтелей. <br>
Вы можите выставить фильтр по последней акутивности пользователя, фильтр может быть ограничивающим с одной стороны или может отсутствовать, <br>
в случае ввода невалидных данных ошибки не происходит вас просто перенапровляет на начальную страницу. <br>
Вы можите скачать отчёт в формате csv метка $-$yellow говорит о том что в данной теме есть экзамен,<br>
в таблице темы содержашие экзамен подсвечены жёлтым светом
{% endblock %}
Loading…
Cancel
Save