diff --git a/analytics/urls.py b/analytics/urls.py new file mode 100644 index 0000000..de29679 --- /dev/null +++ b/analytics/urls.py @@ -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), +] \ No newline at end of file diff --git a/analytics/views.py b/analytics/views.py new file mode 100644 index 0000000..99ecfbb --- /dev/null +++ b/analytics/views.py @@ -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 diff --git a/lms/settings.py b/lms/settings.py index 4e062db..e3ac93e 100644 --- a/lms/settings.py +++ b/lms/settings.py @@ -180,5 +180,5 @@ REDACTOR_OPTIONS = {'lang': 'ru'} REDACTOR_UPLOAD = 'uploads/' RAVEN_CONFIG = { - 'dsn': 'http://56855e5263f04dbda3e97fb9c950cb45:02ceda8b67bc45fb800754958bca7883@s.codemy.ru/2' + 'dsn': 'http://caaea487274f4e23a9107862484c79f3:3d463ad4717942508536f7a659921950@sentry.skillbox.ru/3' } diff --git a/lms/urls.py b/lms/urls.py index a1ad487..a389dde 100644 --- a/lms/urls.py +++ b/lms/urls.py @@ -30,6 +30,7 @@ urlpatterns = [ url(r'^forum/', include('management.forum_urls')), url(r'^service/', include('service.urls')), url(r'^redactor/', include('redactor.urls')), + url(r'^analytics/', include('analytics.urls')), #url(r'^jet/', include('jet.urls', 'jet')), #url(r'^jet/dashboard/', include('jet.dashboard.urls', 'jet-dashboard')), url(r'^admin/', include(admin.site.urls)), diff --git a/templates/index_menu.html b/templates/index_menu.html index f793934..b326dfd 100755 --- a/templates/index_menu.html +++ b/templates/index_menu.html @@ -100,6 +100,13 @@ Отчеты +