Feature statystics See merge request !49remotes/origin/pm_task_31703
commit
8fe3db08d3
5 changed files with 125 additions and 1 deletions
@ -0,0 +1,7 @@ |
||||
from django.conf.urls import url |
||||
from .views import index_view, new_view |
||||
|
||||
urlpatterns = [ |
||||
url(r'^$', index_view), |
||||
url(r'^new/$', new_view), |
||||
] |
||||
@ -0,0 +1,109 @@ |
||||
from django.shortcuts import render_to_response, redirect |
||||
import time, os, csv |
||||
from datetime import date |
||||
from django.http import HttpResponseForbidden |
||||
|
||||
from lms.settings import MEDIA_ROOT |
||||
from django.contrib.auth import get_user_model |
||||
|
||||
from courses.models import Course, CourseTheme |
||||
from journals.models import CourseThemeJ |
||||
|
||||
|
||||
def index_view(request): |
||||
if not request.user.is_authenticated(): |
||||
return HttpResponseForbidden() |
||||
|
||||
if not ( |
||||
request.user.in_role == "M" or request.user.in_role == "S" or request.user.in_role == "A" or request.user.is_admin): |
||||
return HttpResponseForbidden() |
||||
|
||||
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): |
||||
if not request.user.is_authenticated(): |
||||
return HttpResponseForbidden() |
||||
|
||||
if not ( |
||||
request.user.in_role == "M" or request.user.in_role == "S" or request.user.in_role == "A" or request.user.is_admin): |
||||
return HttpResponseForbidden() |
||||
|
||||
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) |
||||
except FileNotFoundError: |
||||
os.mkdir(MEDIA_ROOT + '/analytics') |
||||
redirect("/analytics/new/?start=" + start + "&end=" + end) |
||||
|
||||
return redirect("/analytics/?start=" + start + "&end=" + end) |
||||
|
||||
|
||||
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 |
||||
Loading…
Reference in new issue