Skip to content

Commit

Permalink
Merge pull request #9 from smartdec/select/integral-stat
Browse files Browse the repository at this point in the history
Select/integral stat
  • Loading branch information
PYushchenko committed Apr 29, 2014
2 parents efaa0b7 + 27fcb69 commit 9d85215
Show file tree
Hide file tree
Showing 3 changed files with 163 additions and 1 deletion.
100 changes: 100 additions & 0 deletions lms/djangoapps/courseware/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,112 @@
from xmodule.tabs import CourseTabList, StaffGradingTab, PeerGradingTab, OpenEndedGradingTab
import shoppingcart

#new
import csv
import datetime
from django.http import HttpResponse
from django.core.servers.basehttp import FileWrapper
import logging

from microsite_configuration import microsite

log = logging.getLogger("edx.courseware")

template_imports = {'urllib': urllib}

def stat(request):

if not request.user.is_staff:
raise Http404

context = {}
context['csrf'] = csrf(request)['csrf_token']
filename = '/edx/app/edxapp/edx-platform/fullstat.csv'
if request.method == 'POST':
if 'download_stat_unfiltered' in request.POST:
return return_fullstat_csv(filename)
elif 'download_stat_filtered' in request.POST:
context['value_error_in_input'] = True
try:
register_date_min = None
register_date_max = None
if request.POST.get('min_date') != '':
register_date_min = datetime.datetime.strptime(request.POST.get('min_date'), "%d/%m/%Y")
if request.POST.get('max_date') != '':
register_date_max = datetime.datetime.strptime(request.POST.get('max_date'), "%d/%m/%Y")
context['value_error_in_input'] = False
return return_filtered_stat_csv(\
school_login=request.POST.get('school_login'),\
register_date_min=register_date_min,\
register_date_max=register_date_max,\
account_activated=request.POST.get('activated'),\
complete70=request.POST.get('complete70'),\
complete100=request.POST.get('complete100')\
)
except:
return render_to_response('stat.html', context)

return render_to_response('stat.html', context)


def return_fullstat_csv(filename):
"""
Returns fullstat.csv file.
"""
wrapper = FileWrapper(file(filename))
response = HttpResponse(wrapper, content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename=fullstat.csv'
return response


def return_filtered_stat_csv(school_login='', register_date_min=None, register_date_max=None, account_activated=None, complete70=None, complete100=None):
"""
Returns file with data from fullstat.csv filtered according to the parameters given (indices of columns can be changed):
[6] - school_login
[13] - register_date_min & register_date_max (changed)
[09] - account_activated
[14] - complete70
[15] - complete100
If no values are chosen, returns a filtered file with all row of fullstat.csv which contain a valid registration date in the corresponding field.
"""

response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="stat_filtered.csv"'
writer = csv.writer(response)

with open("/edx/app/edxapp/edx-platform/fullstat.csv", "r") as fullstatfile:
header_row = True
first_rows = True
for row in csv.reader(fullstatfile):
if header_row:
writer.writerow(row)
header_row = False
elif first_rows:
if len(row)>0 and row[0]=='-':
writer.writerow(row)
else:
first_rows = False
else:
if len(row) >= 16: # must contain at least 16 columns # change if new columns are added

# no text in a text input --> str type
# no choice in radio input --> NoneType

try:
register_date = datetime.datetime.strptime(row[13], "%d/%m/%Y")
if (school_login == '' or row[6] == school_login) and\
(register_date_min == None or register_date_min <= register_date) and\
(register_date_max == None or register_date <= register_date_max) and\
(account_activated == None or (len(row[9]) == 4) == bool(account_activated)) and\
(complete70 == None or (len(row[14]) == 4) == bool(complete70)) and\
(complete100 == None or (len(row[15]) == 4) == bool(complete100)): # ultimate hack: len('da') == 4
writer.writerow(row)
except:
pass

return response


def user_groups(user):
"""
Expand Down
61 changes: 61 additions & 0 deletions lms/templates/stat.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
<%! from django.utils.translation import ugettext as _ %>
<%! from microsite_configuration import page_title_breadcrumbs %>
<%! from django.core.urlresolvers import reverse %>
<%inherit file="/main.html" />
<%namespace name='static' file='/static_content.html'/><!DOCTYPE html>

<center>
<h1>
Страница статистики
</h1>
<h2>
Статистика по оценкам
</h2>
<p>
<form method="post">
<input type="hidden" name="csrfmiddlewaretoken" value="${ csrf_token }">
<p>
Логин школы:
<input type="text" name="school_login">
</p>
<p>
Активирован ли аккаунт?<br/>
<input type="radio" name="activated" value="1">Да
<input type="radio" name="activated" value="">Нет
</p>
<p>
Выполнено ли 70 % заданий?<br/>
<input type="radio" name="complete70" value="1">Да
<input type="radio" name="complete70" value="">Нет
</p>
<p>
Выполнено ли 100 % заданий?<br/>
<input type="radio" name="complete100" value="1">Да
<input type="radio" name="complete100" value="">Нет
</p>
<p>
Дата регистрации на курс (в формате дд/мм/гггг):<br/>
От: <input type="text" name="min_date"><br>
До: <input type="text" name="max_date">
</p>
% if value_error_in_input:
<p>
Пожалуйста, введите дату в корректном формате.
</p>
% endif
<p>
<input type="reset" value="Сбросить фильтры">
</p>
<p>
<input type="submit" name="download_stat_filtered" value="Скачать статистику с фильтрами" />
</p>
</form>
</p>
<p>
<form method="post">
<input type="hidden" name="csrfmiddlewaretoken" value="${ csrf_token }">
<input type="submit" name="download_stat_unfiltered" value="Скачать полную статистику" />
</form>
</p>
</center>

3 changes: 2 additions & 1 deletion lms/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,9 @@

url(r'^embargo$', 'student.views.embargo', name="embargo"),

url(r'^announcements/announcement_list$', 'student.views.announcement_list', name='announcement_list')
url(r'^stat$', 'courseware.views.stat', name='stat'),

url(r'^announcements/announcement_list$', 'student.views.announcement_list', name='announcement_list'),
)

# if settings.FEATURES.get("MULTIPLE_ENROLLMENT_ROLES"):
Expand Down

0 comments on commit 9d85215

Please sign in to comment.