+ def changelist_view(self, request, extra_context=None):
+ context = dict(examiners=[])
+ assignments = Assignment.objects.all()
+ if not request.user.is_superuser:
+ assignments = assignments.filter(user=request.user)
+ for assignment in assignments:
+ examiner = dict(name=assignment.user.username, todo=0)
+ for submission in Submission.objects.filter(examiners=assignment.user):
+ for exercise_id in assignment.exercises:
+ if submission.get_mark(user_id=assignment.user.id, exercise_id=exercise_id) is None:
+ examiner['todo'] += 1
+ context['examiners'].append(examiner)
+ return super(SubmissionAdmin, self).changelist_view(request, extra_context=context)
+
+ def queryset(self, request):
+ qs = super(SubmissionAdmin, self).queryset(request)
+ if not request.user.is_superuser:
+ 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 = {}
+ 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 user not in examiners:
+ examiners.append(user)
+ if submission.contact:
+ contact_body = submission.contact.body
+ submission.school = '%s %s' % (contact_body.get('school'), contact_body.get('school_address'))
+
+
+def report_view(request):
+ submissions = sorted(Submission.objects.all(), key=lambda s: -s.final_result)
+ toret = render_to_string('wtem/admin_report.csv', {
+ 'submissionsSet': SubmissionsSet(submissions),
+ 'exercise_ids': [str(e['id']) for e in exercises]})
+ response = HttpResponse(toret, content_type='text/csv')
+ response['Content-Disposition'] = 'attachment; filename="wyniki.csv"'
+ return response