Let the annoying commence.
[edumed.git] / wtem / admin.py
index 08cff0d..d4b6682 100644 (file)
@@ -7,7 +7,11 @@ from django import forms
 from django.utils import simplejson
 from django.utils.safestring import mark_safe
 from django.core.urlresolvers import reverse
-
+from django.conf.urls import url, patterns
+from django.shortcuts import render
+from django.contrib.auth.models import User
+from django.http import HttpResponse
+from django.template.loader import render_to_string
 from .models import Submission, Assignment, Attachment, exercises
 from .middleware import get_current_request
 
@@ -28,12 +32,12 @@ class AttachmentWidget(forms.Widget):
             a_tag = '<a href="%s">%s</a>' % (value, value)
         else:
             a_tag = 'brak'
-        return mark_safe(('<input type="hidden" name="%s" value="%s"/>' + a_tag) % (name, value))
+        return mark_safe(('<input type="hidden" name="%s" value="%s"/>' % (name, value)) + a_tag)
 
 class SubmissionFormBase(forms.ModelForm):
     class Meta:
         model = Submission
-        exclude = ('answers', 'marks', 'contact') + readonly_fields
+        exclude = ('answers', 'marks', 'contact', 'end_time') + readonly_fields
 
 
 def get_open_answer(answers, exercise):
@@ -55,9 +59,10 @@ def get_open_answer(answers, exercise):
     if exercise['type'] == 'edumed_wybor':
         ok = set(map(str, exercise['answer'])) == set(map(str,answer['closed_part']))
         toret = u'Czesc testowa [%s]:\n' % ('poprawna' if ok else 'niepoprawna')
-        for selected in answer['closed_part']:
-            option = get_option(exercise['options'], selected)
-            toret += '%s: %s\n' % (selected, option['text'])
+        if len(answer['closed_part']):
+            for selected in answer['closed_part']:
+                option = get_option(exercise['options'], selected)
+                toret += '%s: %s\n' % (selected, option['text'])
         else:
             toret += u'<nie wybrano odpowiedzi>\n'
         toret += u'\nCzesc otwarta (%s):\n\n' % ' '.join(exercise['open_part'])
@@ -167,6 +172,34 @@ class SubmissionAdmin(admin.ModelAdmin):
             qs = qs.filter(examiners = request.user)
         return qs
 
+    def get_urls(self):
+        urls = super(SubmissionAdmin, self).get_urls()
+        return patterns('',
+            url(r'^report/$', self.admin_site.admin_view(report_view), name='wtem_admin_report')
+        ) + super(SubmissionAdmin, self).get_urls()
+
+
+class SubmissionsSet:
+    def __init__(self, submissions):
+        self.submissions = submissions
+        self.examiners_by_exercise = dict()
+        for submission in submissions:
+            for user_id, marks in submission.marks.items():
+                user = User.objects.get(pk=user_id)
+                for exercise_id in marks.keys():
+                    examiners = self.examiners_by_exercise.setdefault(exercise_id, [])
+                    if not user in examiners:
+                        examiners.append(user)
+
+def report_view(request):
+    submissions = sorted(Submission.objects.all(), key = lambda s: -s.final_result)
+    toret = render_to_string('wtem/admin_report.csv', dict(
+        submissionsSet = SubmissionsSet(submissions),
+        exercise_ids = map(str, range(1,len(exercises)+1))
+    ))
+    response = HttpResponse(toret, content_type = 'text/csv')
+    response['Content-Disposition'] = 'attachment; filename="wyniki.csv"'
+    return response
 
 admin.site.register(Submission, SubmissionAdmin)
 admin.site.register(Assignment)
\ No newline at end of file