def solution_download(request,solution_id,full): solution = get_object_or_404(Solution, pk=solution_id) if (not (solution.author == request.user or in_group(request.user,'Trainer,Tutor'))): return access_denied(request) zip_file = get_solutions_zip([solution], full and in_group(request.user,'Trainer,Tutor')) response = HttpResponse(zip_file.read(), mimetype="application/zip") response['Content-Disposition'] = 'attachment; filename=Solution.zip' return response
def solution_download_for_task(request, task_id): if (not in_group(request.user,'Trainer,Tutor')): return access_denied(request) task = get_object_or_404(Task, pk=task_id) solutions = task.solution_set.filter(final=True) if not in_group(request.user,'Trainer'): solutions = solutions.filter(author__tutorial__id__in=request.user.tutored_tutorials.values_list('id', flat=True)) zip_file = get_solutions_zip(solutions) response = HttpResponse(zip_file.read(), mimetype="application/zip") response['Content-Disposition'] = 'attachment; filename=Solutions.zip' return response
def solution_download_for_task(request, task_id,full): if (not in_group(request.user,'Trainer,Tutor')): return access_denied(request) task = get_object_or_404(Task, pk=task_id) solutions = task.solution_set.filter(final=True) if not in_group(request.user,'Trainer'): solutions = solutions.filter(author__tutorial__id__in=request.user.tutored_tutorials.values_list('id', flat=True)) zip_file = get_solutions_zip(solutions,full) response = HttpResponse(zip_file.read(), mimetype="application/zip") response['Content-Disposition'] = 'attachment; filename=Solutions.zip' return response
def attestation_list(request, task_id): if not (in_group(request.user,'Tutor,Trainer') or request.user.is_superuser): return access_denied(request) task = Task.objects.get(pk=task_id) attestation_stats = [] if (in_group(request.user,'Trainer')): attestation_stats = [ {'tutor': tutor, 'unattested' : Solution.objects.filter(task = task, final=True, plagiarism = False, attestation = None,author__tutorial__tutors=tutor).count(), 'final': Attestation.objects.filter(solution__task = task,final=True,author=tutor).count(), 'nonfinal': Attestation.objects.filter(solution__task = task,final=False,author=tutor).count() } for tutor in User.objects.filter(groups__name="Tutor")] for entry in attestation_stats: entry['attested'] = entry['final']+entry['nonfinal'] entry['total'] = entry['final']+entry['nonfinal']+entry['unattested'] tutored_users = User.objects.filter(groups__name="User", is_active=True).order_by('last_name') if in_group(request.user,'Trainer') or request.user.is_superuser else None unattested_solutions = Solution.objects.filter(task = task, final=True, plagiarism = False, attestation = None) if in_group(request.user,'Tutor'): # the trainer sees them all unattested_solutions = unattested_solutions.filter(author__tutorial__in = request.user.tutored_tutorials.all()) my_attestations = Attestation.objects.filter(solution__task = task, author = request.user).order_by('-created') all_attestations_for_my_tutorials = Attestation.objects.filter(solution__task = task, solution__author__tutorial__in = request.user.tutored_tutorials.all()).order_by('-created') if (in_group(request.user,'Trainer')): # show all to trainer attestations_by_others = Attestation.objects.filter(solution__task = task).order_by('-created') solutions_with_plagiarism = Solution.objects.filter(task = task, plagiarism = True) else: # show from my toturials attestations_by_others = all_attestations_for_my_tutorials.exclude(author = request.user) solutions_with_plagiarism = Solution.objects.filter(task = task, plagiarism = True, author__tutorial__in = request.user.tutored_tutorials.all()) if request.method == "POST": for attestation in all_attestations_for_my_tutorials.filter(final = True, published = False): attestation.publish(request) all_attestations_published = all_attestations_for_my_tutorials.filter(published = False).count() == 0 all_attestations_final = all_attestations_for_my_tutorials.filter(final = False).count() == 0 show_author = not get_settings().anonymous_attestation or in_group(request.user,'Trainer') or published data = {'task':task, 'tutored_users':tutored_users, 'solutions_with_plagiarism':solutions_with_plagiarism, 'my_attestations':my_attestations, 'attestations_by_others':attestations_by_others, 'unattested_solutions':unattested_solutions, 'published': all_attestations_published, 'show_author': show_author, 'attestation_stats' : attestation_stats} return render_to_response("attestation/attestation_list.html", data, context_instance=RequestContext(request))
def edit_attestation(request, attestation_id): if not (in_group(request.user,'Tutor,Trainer') or request.user.is_superuser): return access_denied(request) attest = get_object_or_404(Attestation, pk=attestation_id) if attest.published or attest.author != request.user: # If if this attestation is already final or not by this user redirect to view_attestation return HttpResponseRedirect(reverse('view_attestation', args=[attestation_id])) solution = attest.solution model_solution = solution.task.model_solution if request.method == "POST": attestForm = AttestationForm(request.POST, instance=attest, prefix='attest') attestFileFormSet = AnnotatedFileFormSet(request.POST, instance=attest, prefix='attestfiles') ratingResultFormSet = RatingResultFormSet(request.POST, instance=attest, prefix='ratingresult') if attestForm.is_valid() and attestFileFormSet.is_valid() and ratingResultFormSet.is_valid(): attestForm.save() attest.final = False attest.save() attestFileFormSet.save() ratingResultFormSet.save() return HttpResponseRedirect(reverse('view_attestation', args=[attestation_id])) else: attestForm = AttestationForm(instance=attest, prefix='attest') attestFileFormSet = AnnotatedFileFormSet(instance=attest, prefix='attestfiles') ratingResultFormSet = RatingResultFormSet(instance=attest, prefix='ratingresult') show_author = not get_settings().anonymous_attestation return render_to_response("attestation/attestation_edit.html", {"attestForm": attestForm, "attestFileFormSet": attestFileFormSet, "ratingResultFormSet":ratingResultFormSet, "solution": solution, "model_solution":model_solution, "show_author":show_author}, context_instance=RequestContext(request))
def new_attestation_for_task(request, task_id): """ Start an attestation on a restrained random set of my tutored users """ if not (in_group(request.user, 'Tutor,Trainer') or request.user.is_superuser): return access_denied(request) # fetch a solution of a user i have allredy attested in the past. users_i_have_attestated = User.objects.filter( solution__attestation__author=request.user) all_available_solutions = Solution.objects.filter( task__id=task_id, final=True, plagiarism=False, author__tutorial__in=request.user.tutored_tutorials.all(), attestation=None) if (not all_available_solutions): # if an other tutor just grabed the last solution just go back to the list return HttpResponseRedirect(reverse('attestation_list', args=[task_id])) solutions = all_available_solutions.filter( author__in=users_i_have_attestated) if (solutions): solution = solutions[0] else: solution = all_available_solutions[0] return new_attestation_for_solution(request, solution.id)
def rating_overview(request): if not (in_group(request.user,'Trainer') or request.user.is_superuser): return access_denied(request) tasks = Task.objects.filter(submission_date__lt = datetime.datetime.now).order_by('publication_date','submission_date') users = User.objects.filter(groups__name='User').filter(is_active=True).order_by('last_name','first_name') rating_list = user_task_attestation_map(users, tasks) FinalGradeFormSet = modelformset_factory(User, fields=('final_grade',), extra=0) # corresponding user to user_id_list in reverse order! important for easy displaying in template user = User.objects.filter(groups__name='User').filter(is_active=True).order_by('-last_name','-first_name') script = Script.objects.get_or_create(id=1)[0] if request.method == "POST": final_grade_formset = FinalGradeFormSet(request.POST, request.FILES, queryset = user) script_form = ScriptForm(request.POST, instance=script) publish_final_grade_form = PublishFinalGradeForm(request.POST, instance=get_settings()) if final_grade_formset.is_valid() and script_form.is_valid() and publish_final_grade_form.is_valid(): final_grade_formset.save() script_form.save() publish_final_grade_form.save() else: final_grade_formset = FinalGradeFormSet(queryset = user) script_form = ScriptForm(instance=script) publish_final_grade_form = PublishFinalGradeForm(instance=get_settings()) return render_to_response("attestation/rating_overview.html", {'rating_list':rating_list, 'tasks':tasks, 'final_grade_formset':final_grade_formset, 'script_form':script_form, 'publish_final_grade_form':publish_final_grade_form}, context_instance=RequestContext(request))
def checker_result_list(request, task_id): task = get_object_or_404(Task, pk=task_id) if (not in_group(request.user, 'Trainer')): return access_denied(request) else: users_with_checkerresults = [(user,checkerresults,final_solution) \ for user in User.objects.filter(groups__name='User').order_by('mat_number') \ for final_solution in Solution.objects.filter(author=user,final=True,task=task).values() \ for checkerresults in [sorted(CheckerResult.objects.all().filter(solution=final_solution['id']),key=lambda result : result.checker.order)]] number_of_checker = None for checkerresults in users_with_checkerresults: if (number_of_checker and (len(checkerresults) != number_of_checker)): return acces_denied(request) #TODO: issue proper error message else: number_of_checker = len(checkerresults) _, prototype, _ = users_with_checkerresults[0] return render_to_response("solutions/checker_result_list.html", { "users_with_checkerresults": users_with_checkerresults, "prototype": prototype, "task": task }, context_instance=RequestContext(request))
def solution_detail(request, solution_id, full): solution = get_object_or_404(Solution, pk=solution_id) if (not (solution.author == request.user or in_group(request.user, 'Trainer') or (solution.author.tutorial and solution.author.tutorial.tutors.filter(id=request.user.id)))): return access_denied(request) if (request.method == "POST"): solution.copy() return HttpResponseRedirect( reverse('solution_list', args=[solution.task.id])) else: attestations = Attestation.objects.filter( solution__task=solution.task, author__tutored_tutorials=request.user.tutorial) attestationsPublished = attestations[ 0].published if attestations else False return object_detail(request, Solution.objects.all(), solution_id, extra_context={ "attestationsPublished": attestationsPublished, "accept_all_solutions": get_settings().accept_all_solutions, "full": full }, template_object_name='solution')
def rating_export(request): if not (in_group(request.user,'Trainer') or request.user.is_superuser): return access_denied(request) attestations = Attestation.objects.filter(published=True, solution__plagiarism=False) attestation_dict = {} #{(task_id,user_id):rating} for attestation in attestations: attestation_dict[attestation.solution.task_id, attestation.solution.author_id] = attestation task_id_list = Task.objects.filter(submission_date__lt = datetime.datetime.now).order_by('publication_date','submission_date').values_list('id', flat=True) user_id_list = User.objects.filter(groups__name='User').filter(is_active=True).order_by('last_name','first_name').values_list('id', flat=True) task_list = map(lambda task_id:Task.objects.get(id=task_id), task_id_list) rating_list = [] for user_id in user_id_list: rating_for_user_list = [User.objects.get(id=user_id)] for task_id in task_id_list: try: rating = attestation_dict[task_id,user_id] except KeyError: rating = None rating_for_user_list.append(rating) rating_list.append(rating_for_user_list) response = HttpResponse(mimetype='text/csv') response['Content-Disposition'] = 'attachment; rating_export.csv' t = loader.get_template('attestation/rating_export.csv') c = Context({'rating_list':rating_list, 'task_list':task_list}) #response.write(u'\ufeff') setting utf-8 BOM for Exel doesn't work response.write(t.render(c)) return response
def new_attestation_for_solution(request, solution_id, force_create=False): if not (in_group(request.user, 'Tutor,Trainer') or request.user.is_superuser): return access_denied(request) solution = get_object_or_404(Solution, pk=solution_id) attestations = Attestation.objects.filter(solution=solution) if ((not force_create) and attestations): return render_to_response( "attestation/attestation_already_exists_for_solution.html", { 'task': solution.task, 'attestations': attestations, 'solution': solution, 'show_author': not get_settings().anonymous_attestation }, context_instance=RequestContext(request)) attest = Attestation(solution=solution, author=request.user) attest.save() for solutionFile in solution.solutionfile_set.filter( mime_type__startswith='text'): annotatedFile = AnnotatedSolutionFile(attestation=attest, solution_file=solutionFile, content=solutionFile.content()) annotatedFile.save() for rating in solution.task.rating_set.all(): ratingResult = RatingResult(attestation=attest, rating=rating) ratingResult.save() return HttpResponseRedirect(reverse('edit_attestation', args=[attest.id]))
def view_attestation(request, attestation_id): attest = get_object_or_404(Attestation, pk=attestation_id) if not (attest.solution.author == request.user or in_group( request.user, 'Tutor,Trainer') or request.user.is_superuser): return access_denied(request) if request.method == "POST": form = AttestationPreviewForm(request.POST, instance=attest) if form.is_valid(): form.save() if 'publish' in request.POST: attest.publish(request) return HttpResponseRedirect( reverse('attestation_list', args=[attest.solution.task.id])) else: form = AttestationPreviewForm(instance=attest) submitable = attest.author == request.user and not attest.published return render_to_response( "attestation/attestation_view.html", { "attest": attest, 'submitable': submitable, 'form': form, 'show_author': not get_settings().anonymous_attestation }, context_instance=RequestContext(request))
def taskDetail(request,task_id): task = get_object_or_404(Task,pk=task_id) if (task.publication_date >= datetime.now()) and (not in_group(request.user,'Trainer')): raise Http404 my_solutions = Task.objects.get(pk=task_id).solution_set.filter(author = request.user) return object_detail(request, Task.objects.all(), task_id, extra_context={'solutions': my_solutions}, template_object_name='task')
def solution_list(request, task_id, user_id=None): if (user_id and not in_group(request.user,'Trainer')): return access_denied(request) task = get_object_or_404(Task,pk=task_id) author = get_object_or_404(User,pk=user_id) if user_id else request.user solutions = task.solution_set.filter(author = author).order_by('-id') final_solution = task.final_solution(author) if (task.publication_date >= datetime.now()) and (not in_group(request.user,'Trainer')): raise Http404 if request.method == "POST": solution = Solution(task = task, author=author) formset = SolutionFormSet(request.POST, request.FILES, instance=solution) if formset.is_valid(): solution.save() formset.save() run_all_checker = bool(User.objects.filter(id=user_id, tutorial__tutors__pk=request.user.id) or in_group(request.user,'Trainer')) solution.check(run_all_checker) if solution.accepted: # Send submission confirmation email t = loader.get_template('solutions/submission_confirmation_email.html') c = { 'protocol': request.is_secure() and "https" or "http", 'domain': RequestSite(request).domain, 'site_name': settings.SITE_NAME, 'solution': solution, } if solution.author.email: send_mail(_("%s submission confirmation") % settings.SITE_NAME, t.render(Context(c)), None, [solution.author.email]) if solution.accepted or get_settings().accept_all_solutions: solution.final = True solution.save() return HttpResponseRedirect(reverse('solution_detail', args=[solution.id])) else: formset = SolutionFormSet() attestations = Attestation.objects.filter(solution__task=task, author__tutored_tutorials=request.user.tutorial) attestationsPublished = attestations[0].published if attestations else False return render_to_response("solutions/solution_list.html", {"formset": formset, "task":task, "solutions": solutions, "final_solution":final_solution, "attestationsPublished":attestationsPublished, "author":author}, context_instance=RequestContext(request))
def tutorial_overview(request, tutorial_id=None): if not (in_group(request.user,'Trainer,Tutor') or request.user.is_superuser): return access_denied(request) if (tutorial_id): tutorial = get_object_or_404(Tutorial, pk=tutorial_id) if (in_group(request.user,'Tutor') and not tutorial.tutors.filter(id=request.user.id)): return access_denied(request) else: tutorials = request.user.tutored_tutorials.all() if (not tutorials): return render_to_response("attestation/tutorial_none.html",context_instance=RequestContext(request)) tutorial = request.user.tutored_tutorials.all()[0] if (in_group(request.user,'Tutor')): other_tutorials = request.user.tutored_tutorials.all() else: other_tutorials = Tutorial.objects.all() other_tutorials = other_tutorials.exclude(id=tutorial.id) tasks = Task.objects.filter(submission_date__lt = datetime.datetime.now).order_by('publication_date','submission_date') users = User.objects.filter(groups__name='User').filter(is_active=True, tutorial=tutorial).order_by('last_name','first_name') rating_list = user_task_attestation_map(users, tasks,False) def to_float(a,default,const): try: return (float(str(a.final_grade)),const) except (ValueError,TypeError,AttributeError): return (default,default) averages = [0.0 for i in range(len(tasks))] nr_of_grades = [0 for i in range(len(tasks))] for (user,attestations) in rating_list: averages = [avg+to_float(att,0.0,None)[0] for (avg,att) in zip(averages,attestations)] nr_of_grades = [n+to_float(att,0,1)[1] for (n,att) in zip(nr_of_grades,attestations)] nr_of_grades = [ (n if n>0 else 1) for n in nr_of_grades] averages = [a/n for (a,n) in zip(averages,nr_of_grades)] script = Script.objects.get_or_create(id=1)[0] return render_to_response("attestation/tutorial_overview.html", {'other_tutorials':other_tutorials, 'tutorial':tutorial, 'rating_list':rating_list, 'tasks':tasks, 'final_grades_published': get_settings().final_grades_published, 'script':script, 'averages':averages}, context_instance=RequestContext(request))
def solution_detail(request,solution_id,full): solution = get_object_or_404(Solution, pk=solution_id) if (not (solution.author == request.user or in_group(request.user,'Trainer') or (solution.author.tutorial and solution.author.tutorial.tutors.filter(id=request.user.id)) )): return access_denied(request) if (request.method == "POST"): solution.copy() return HttpResponseRedirect(reverse('solution_list', args=[solution.task.id])) else: attestations = Attestation.objects.filter(solution__task=solution.task, author__tutored_tutorials=request.user.tutorial) attestationsPublished = attestations[0].published if attestations else False return object_detail(request, Solution.objects.all(), solution_id, extra_context={"attestationsPublished":attestationsPublished, "accept_all_solutions":get_settings().accept_all_solutions, "full":full}, template_object_name='solution' )
def edit_attestation(request, attestation_id): if not (in_group(request.user, 'Tutor,Trainer') or request.user.is_superuser): return access_denied(request) attest = get_object_or_404(Attestation, pk=attestation_id) if attest.published or attest.author != request.user: # If if this attestation is allready final or not by this user redirect to view_attestation return HttpResponseRedirect( reverse('view_attestation', args=[attestation_id])) solution = attest.solution model_solution = solution.task.model_solution if request.method == "POST": attestForm = AttestationForm(request.POST, instance=attest, prefix='attest') attestFileFormSet = AnnotatedFileFormSet(request.POST, instance=attest, prefix='attestfiles') ratingResultFormSet = RatingResultFormSet(request.POST, instance=attest, prefix='ratingresult') if attestForm.is_valid() and attestFileFormSet.is_valid( ) and ratingResultFormSet.is_valid(): attestForm.save() attest.final = False attest.save() attestFileFormSet.save() ratingResultFormSet.save() return HttpResponseRedirect( reverse('view_attestation', args=[attestation_id])) else: attestForm = AttestationForm(instance=attest, prefix='attest') attestFileFormSet = AnnotatedFileFormSet(instance=attest, prefix='attestfiles') ratingResultFormSet = RatingResultFormSet(instance=attest, prefix='ratingresult') show_author = not get_settings().anonymous_attestation return render_to_response("attestation/attestation_edit.html", { "attestForm": attestForm, "attestFileFormSet": attestFileFormSet, "ratingResultFormSet": ratingResultFormSet, "solution": solution, "model_solution": model_solution, "show_author": show_author }, context_instance=RequestContext(request))
def taskDetail(request, task_id): task = get_object_or_404(Task, pk=task_id) if (task.publication_date >= datetime.now()) and (not in_group( request.user, 'Trainer')): raise Http404 my_solutions = Task.objects.get(pk=task_id).solution_set.filter( author=request.user) return object_detail(request, Task.objects.all(), task_id, extra_context={'solutions': my_solutions}, template_object_name='task')
def new_attestation_for_solution(request, solution_id): if not (in_group(request.user,'Tutor,Trainer') or request.user.is_superuser): return access_denied(request) solution = get_object_or_404(Solution, pk=solution_id) attest = Attestation(solution = solution, author = request.user) attest.save() for solutionFile in solution.solutionfile_set.filter(mime_type__startswith='text'): annotatedFile = AnnotatedSolutionFile(attestation = attest, solution_file=solutionFile, content=solutionFile.content()) annotatedFile.save() for rating in solution.task.rating_set.all(): ratingResult = RatingResult(attestation = attest, rating=rating) ratingResult.save() return HttpResponseRedirect(reverse('edit_attestation', args=[attest.id]))
def view_attestation(request, attestation_id): attest = get_object_or_404(Attestation, pk=attestation_id) if not (attest.solution.author == request.user or in_group(request.user,'Tutor,Trainer') or request.user.is_superuser): return access_denied(request) if request.method == "POST": form = AttestationPreviewForm(request.POST, instance=attest) if form.is_valid(): form.save() if 'publish' in request.POST: attest.publish(request) return HttpResponseRedirect(reverse('attestation_list', args=[attest.solution.task.id])) else: form = AttestationPreviewForm(instance=attest) submitable = attest.author == request.user and not attest.published return render_to_response("attestation/attestation_view.html", {"attest": attest, 'submitable':submitable, 'form':form, 'show_author': not get_settings().anonymous_attestation}, context_instance=RequestContext(request))
def rating_overview(request): if not (in_group(request.user, 'Trainer') or request.user.is_superuser): return access_denied(request) tasks = Task.objects.filter( submission_date__lt=datetime.datetime.now).order_by( 'publication_date', 'submission_date') users = User.objects.filter(groups__name='User').filter( is_active=True).order_by('last_name', 'first_name') rating_list = user_task_attestation_map(users, tasks) FinalGradeFormSet = modelformset_factory(User, fields=('final_grade', ), extra=0) # corresponding user to user_id_list in reverse order! important for easy displaying in template user = User.objects.filter(groups__name='User').filter( is_active=True).order_by('-last_name', '-first_name') script = Script.objects.get_or_create(id=1)[0] if request.method == "POST": final_grade_formset = FinalGradeFormSet(request.POST, request.FILES, queryset=user) script_form = ScriptForm(request.POST, instance=script) publish_final_grade_form = PublishFinalGradeForm( request.POST, instance=get_settings()) if final_grade_formset.is_valid() and script_form.is_valid( ) and publish_final_grade_form.is_valid(): final_grade_formset.save() script_form.save() publish_final_grade_form.save() else: final_grade_formset = FinalGradeFormSet(queryset=user) script_form = ScriptForm(instance=script) publish_final_grade_form = PublishFinalGradeForm( instance=get_settings()) return render_to_response( "attestation/rating_overview.html", { 'rating_list': rating_list, 'tasks': tasks, 'final_grade_formset': final_grade_formset, 'script_form': script_form, 'publish_final_grade_form': publish_final_grade_form }, context_instance=RequestContext(request))
def new_attestation_for_task(request, task_id): """ Start an attestation on a restrained random set of my tutored users """ if not (in_group(request.user,'Tutor,Trainer') or request.user.is_superuser): return access_denied(request) # fetch a solution of a user i have allredy attested in the past. users_i_have_attestated = User.objects.filter(solution__attestation__author = request.user) all_available_solutions = Solution.objects.filter(task__id = task_id, final=True, plagiarism = False, author__tutorial__in = request.user.tutored_tutorials.all(), attestation = None) if (not all_available_solutions): # if an other tutor just grabed the last solution just go back to the list return HttpResponseRedirect(reverse('attestation_list', args=[task_id])) solutions = all_available_solutions.filter(author__in = users_i_have_attestated) if (solutions): solution = solutions[0] else: solution = all_available_solutions[0] return new_attestation_for_solution(request, solution.id)
def new_attestation_for_solution(request, solution_id, force_create = False): if not (in_group(request.user,'Tutor,Trainer') or request.user.is_superuser): return access_denied(request) solution = get_object_or_404(Solution, pk=solution_id) attestations = Attestation.objects.filter(solution = solution) if ((not force_create) and attestations): return render_to_response("attestation/attestation_already_exists_for_solution.html", { 'task' : solution.task, 'attestations' : attestations, 'solution' : solution, 'show_author': not get_settings().anonymous_attestation }, context_instance=RequestContext(request)) attest = Attestation(solution = solution, author = request.user) attest.save() for solutionFile in solution.solutionfile_set.filter(mime_type__startswith='text'): annotatedFile = AnnotatedSolutionFile(attestation = attest, solution_file=solutionFile, content=solutionFile.content()) annotatedFile.save() for rating in solution.task.rating_set.all(): ratingResult = RatingResult(attestation = attest, rating=rating) ratingResult.save() return HttpResponseRedirect(reverse('edit_attestation', args=[attest.id]))
def new_attestation_for_solution(request, solution_id): if not (in_group(request.user, 'Tutor,Trainer') or request.user.is_superuser): return access_denied(request) solution = get_object_or_404(Solution, pk=solution_id) attest = Attestation(solution=solution, author=request.user) attest.save() for solutionFile in solution.solutionfile_set.filter( mime_type__startswith='text'): annotatedFile = AnnotatedSolutionFile(attestation=attest, solution_file=solutionFile, content=solutionFile.content()) annotatedFile.save() for rating in solution.task.rating_set.all(): ratingResult = RatingResult(attestation=attest, rating=rating) ratingResult.save() return HttpResponseRedirect(reverse('edit_attestation', args=[attest.id]))
def checker_result_list(request,task_id): task = get_object_or_404(Task, pk=task_id) if (not in_group(request.user,'Trainer')): return access_denied(request) else: users_with_checkerresults = [(user,checkerresults,final_solution) \ for user in User.objects.filter(groups__name='User').order_by('mat_number') \ for final_solution in Solution.objects.filter(author=user,final=True,task=task).values() \ for checkerresults in [sorted(CheckerResult.objects.all().filter(solution=final_solution['id']),key=lambda result : result.checker.order)]] number_of_checker = None for checkerresults in users_with_checkerresults: if (number_of_checker and (len(checkerresults) != number_of_checker)): return acces_denied(request) #TODO: issue proper error message else: number_of_checker = len(checkerresults) _, prototype,_ = users_with_checkerresults[0] return render_to_response("solutions/checker_result_list.html", {"users_with_checkerresults": users_with_checkerresults, "prototype": prototype, "task":task},context_instance=RequestContext(request))
def checker_result_list(request,task_id): task = get_object_or_404(Task, pk=task_id) if (not in_group(request.user,'Trainer')): return access_denied(request) else: users_with_checkerresults = [(user,dict(checkerresults),final_solution) \ for user in User.objects.filter(groups__name='User').order_by('mat_number') \ for final_solution in Solution.objects.filter(author=user,final=True,task=task).values() \ for checkerresults in [[ (result.checker, result) for result in CheckerResult.objects.all().filter(solution=final_solution['id'])]] ] checkers_seen = set([]) for _, results,_ in users_with_checkerresults: checkers_seen |= set(results.keys()) checkers_seen = sorted(checkers_seen, key=lambda checker: checker.order) for i,(user,results,final_solution) in enumerate(users_with_checkerresults): users_with_checkerresults[i] = (user, [results[checker] if checker in results else None for (checker) in checkers_seen], final_solution) return render_to_response("solutions/checker_result_list.html", {"users_with_checkerresults": users_with_checkerresults, 'checkers_seen':checkers_seen, "task":task},context_instance=RequestContext(request))
def rating_export(request): if not (in_group(request.user, 'Trainer') or request.user.is_superuser): return access_denied(request) attestations = Attestation.objects.filter(published=True, solution__plagiarism=False) attestation_dict = {} #{(task_id,user_id):rating} for attestation in attestations: attestation_dict[attestation.solution.task_id, attestation.solution.author_id] = attestation task_id_list = Task.objects.filter( submission_date__lt=datetime.datetime.now).order_by( 'publication_date', 'submission_date').values_list('id', flat=True) user_id_list = User.objects.filter(groups__name='User').filter( is_active=True).order_by('last_name', 'first_name').values_list('id', flat=True) task_list = map(lambda task_id: Task.objects.get(id=task_id), task_id_list) rating_list = [] for user_id in user_id_list: rating_for_user_list = [User.objects.get(id=user_id)] for task_id in task_id_list: try: rating = attestation_dict[task_id, user_id] except KeyError: rating = None rating_for_user_list.append(rating) rating_list.append(rating_for_user_list) response = HttpResponse(mimetype='text/csv') response['Content-Disposition'] = 'attachment; rating_export.csv' t = loader.get_template('attestation/rating_export.csv') c = Context({'rating_list': rating_list, 'task_list': task_list}) #response.write(u'\ufeff') setting utf-8 BOM for Exel doesn't work response.write(t.render(c)) return response
def statistics(request, task_id): task = get_object_or_404(Task, pk=task_id) if not (in_group(request.user, 'Trainer,Tutor') or request.user.is_superuser): return access_denied(request) final_solutions = task.solution_set.filter(final=True) unfinal_solutions = task.solution_set.filter(final=False) user = Group.objects.get(name='User').user_set.filter(is_active=True) tutorials = request.user.tutored_tutorials.all() if in_group(request.user, 'Tutor'): final_solutions = final_solutions.filter( author__tutorial__in=tutorials) unfinal_solutions = unfinal_solutions.filter( author__tutorial__in=tutorials) user = User.objects.filter(tutorial__in=tutorials) final_solution_count = final_solutions.count() user_count = user.count() submissions = [] submissions_final = [] acc_submissions = [0] creation_dates = map(lambda dict: dict['creation_date'].date(), unfinal_solutions.values('creation_date')) creation_dates_final = map(lambda dict: dict['creation_date'].date(), final_solutions.values('creation_date')) for date in daterange( task.publication_date.date(), min(task.submission_date.date(), datetime.date.today())): submissions.append(creation_dates.count(date)) submissions_final.append(creation_dates_final.count(date)) acc_submissions.append(acc_submissions[-1] + submissions_final[-1]) acc_submissions.pop(0) if (user_count > 0): acc_submissions = map( lambda submissions: float(submissions) / user_count, acc_submissions) else: acc_submissions = 0 creation_times = map( lambda dict: [(dict['creation_date'].time().hour * 3600 + dict[ 'creation_date'].time().minute * 60) * 1000, dict['creation_date']. weekday()], unfinal_solutions.values('creation_date')) creation_times_final = map( lambda dict: [(dict['creation_date'].time().hour * 3600 + dict[ 'creation_date'].time().minute * 60) * 1000, dict['creation_date']. weekday()], final_solutions.values('creation_date')) if in_group(request.user, 'Trainer'): attestations = Attestation.objects.filter( solution__task__id=task.id, final=True, published=False).aggregate(final=Count('id')) attestations.update( Attestation.objects.filter( solution__task__id=task.id, final=True, published=True).aggregate(published=Count('id'))) else: # Tutor attestations = Attestation.objects.filter( solution__task__id=task.id, final=True, published=False, author__tutored_tutorials__in=tutorials).aggregate( final=Count('id')) attestations.update( Attestation.objects.filter( solution__task__id=task.id, final=True, published=True, author__tutored_tutorials__in=tutorials).aggregate( published=Count('id'))) attestations['all'] = final_solution_count all_items = task.final_grade_rating_scale.ratingscaleitem_set.values_list( 'name', 'position') final_grade_rating_scale_items = "['" + "','".join( [name.strip() for (name, position) in all_items]) + "']" all_ratings = [] if in_group(request.user, 'Trainer'): # Each Tutorials ratings for t in Tutorial.objects.all(): all_ratings.append({ 'title': u"Final Grades for Students in Tutorial %s" % unicode(t), 'desc': u"This chart shows the distribution of final grades for students from Tutorial %s. Plagiarism is excluded." % unicode(t), 'ratings': RatingScaleItem.objects.filter( attestation__solution__task=task_id, attestation__solution__plagiarism=False, attestation__final=True, attestation__solution__author__tutorial=t) }) for t in User.objects.filter(groups__name='Tutor'): all_ratings.append({ 'title': u"Final Grades for Attestations created by %s" % unicode(t), 'desc': u"This chart shows the distribution of final grades for Attestations created by %s. Plagiarism is excluded." % unicode(t), 'ratings': RatingScaleItem.objects.filter( attestation__solution__task=task_id, attestation__solution__plagiarism=False, attestation__final=True, attestation__author__id=t.id) }) else: # The Tutorials ratings all_ratings.append({ 'title': u"Final grades (My Tutorials)", 'desc': u"This chart shows the distribution of final grades for students from any your tutorials. Plagiarism is excluded.", 'ratings': RatingScaleItem.objects.filter( attestation__solution__task=task_id, attestation__solution__plagiarism=False, attestation__final=True, attestation__solution__author__tutorial__in=tutorials) }) all_ratings.append({ 'title': u"Final grades (My Attestations)", 'desc': u"This chart shows the distribution of final grades for your attestations. Plagiarism is excluded.", 'ratings': RatingScaleItem.objects.filter( attestation__solution__task=task_id, attestation__solution__plagiarism=False, attestation__final=True, attestation__author__id=request.user.id) }) # Overall ratings all_ratings.append({ 'title': u"Final grades (overall)", 'desc': u"This chart shows the distribution of final grades for all students. Plagiarism is excluded.", 'ratings': RatingScaleItem.objects.filter(attestation__solution__task=task_id, attestation__solution__plagiarism=False, attestation__final=True) }) for i, r in enumerate(all_ratings): all_ratings[i]['ratings'] = [ list(rating) for rating in r['ratings'].annotate(Count('id')).values_list( 'position', 'id__count') ] return render_to_response("attestation/statistics.html", {'task':task, \ 'user_count': user_count, 'solution_count': final_solution_count,\ 'submissions':submissions, 'submissions_final':submissions_final, 'creation_times':creation_times, 'creation_times_final':creation_times_final, 'acc_submissions':acc_submissions, \ 'attestations':attestations, \ 'final_grade_rating_scale_items' :final_grade_rating_scale_items, 'all_ratings':all_ratings, \ }, context_instance=RequestContext(request))
def is_trainer(self, user): return in_group(user, "Trainer")
def is_tutor(self, user): return in_group(user, "Tutor")
def statistics(request,task_id): task = get_object_or_404(Task, pk=task_id) if not (in_group(request.user,'Trainer,Tutor') or request.user.is_superuser): return access_denied(request) final_solutions = task.solution_set.filter(final=True) unfinal_solutions = task.solution_set.filter(final=False) user = Group.objects.get(name='User').user_set.filter(is_active=True) tutorials = request.user.tutored_tutorials.all() if in_group(request.user,'Tutor'): final_solutions = final_solutions.filter(author__tutorial__in = tutorials) unfinal_solutions = unfinal_solutions.filter(author__tutorial__in = tutorials) user = User.objects.filter(tutorial__in = tutorials) final_solution_count = final_solutions.count() user_count = user.count() submissions = [] submissions_final = [] acc_submissions = [0] creation_dates = map(lambda dict:dict['creation_date'].date(), unfinal_solutions.values('creation_date')) creation_dates_final = map(lambda dict:dict['creation_date'].date(), final_solutions.values('creation_date')) for date in daterange(task.publication_date.date(), min(task.submission_date.date(), datetime.date.today())): submissions.append(creation_dates.count(date)) submissions_final.append(creation_dates_final.count(date)) acc_submissions.append(acc_submissions[-1]+submissions_final[-1]) acc_submissions.pop(0) if (user_count > 0): acc_submissions = map(lambda submissions: float(submissions)/user_count, acc_submissions) else: acc_submissions = 0; creation_times = map(lambda dict:[(dict['creation_date'].time().hour*3600+dict['creation_date'].time().minute*60)*1000, dict['creation_date'].weekday()], unfinal_solutions.values('creation_date')) creation_times_final = map(lambda dict:[(dict['creation_date'].time().hour*3600+dict['creation_date'].time().minute*60)*1000, dict['creation_date'].weekday()], final_solutions.values('creation_date')) if in_group(request.user,'Trainer'): attestations = Attestation.objects.filter(solution__task__id=task.id, final=True, published=False).aggregate(final=Count('id')) attestations.update( Attestation.objects.filter(solution__task__id=task.id, final=True, published=True).aggregate(published=Count('id')) ) else: # Tutor attestations = Attestation.objects.filter(solution__task__id=task.id, final=True, published=False, author__tutored_tutorials__in = tutorials).aggregate(final=Count('id')) attestations.update( Attestation.objects.filter(solution__task__id=task.id, final=True, published=True, author__tutored_tutorials__in = tutorials).aggregate(published=Count('id'))) attestations['all'] = final_solution_count all_items = task.final_grade_rating_scale.ratingscaleitem_set.values_list('name','position') final_grade_rating_scale_items = "['" + "','".join([name.strip() for (name,position) in all_items]) + "']" all_ratings = [] if in_group(request.user,'Trainer'): # Each Tutorials ratings for t in Tutorial.objects.all(): all_ratings.append({'title' : u"Final Grades for Students in Tutorial %s" % unicode(t), 'desc' : u"This chart shows the distribution of final grades for students from Tutorial %s. Plagiarism is excluded." % unicode(t), 'ratings' : RatingScaleItem.objects.filter(attestation__solution__task=task_id, attestation__solution__plagiarism=False, attestation__final=True, attestation__solution__author__tutorial = t)}) for t in User.objects.filter(groups__name='Tutor'): all_ratings.append({'title' : u"Final Grades for Attestations created by %s" % unicode(t), 'desc' : u"This chart shows the distribution of final grades for Attestations created by %s. Plagiarism is excluded." % unicode(t), 'ratings' : RatingScaleItem.objects.filter(attestation__solution__task=task_id, attestation__solution__plagiarism=False, attestation__final=True, attestation__author__id = t.id)}) else: # The Tutorials ratings all_ratings.append( {'title' : u"Final grades (My Tutorials)", 'desc' : u"This chart shows the distribution of final grades for students from any your tutorials. Plagiarism is excluded.", 'ratings' : RatingScaleItem.objects.filter(attestation__solution__task=task_id, attestation__solution__plagiarism=False, attestation__final=True, attestation__solution__author__tutorial__in = tutorials)}) all_ratings.append( {'title' : u"Final grades (My Attestations)", 'desc' : u"This chart shows the distribution of final grades for your attestations. Plagiarism is excluded.", 'ratings' : RatingScaleItem.objects.filter(attestation__solution__task=task_id, attestation__solution__plagiarism=False, attestation__final=True, attestation__author__id = request.user.id)}) # Overall ratings all_ratings.append( {'title' : u"Final grades (overall)", 'desc' : u"This chart shows the distribution of final grades for all students. Plagiarism is excluded.", 'ratings' : RatingScaleItem.objects.filter(attestation__solution__task=task_id, attestation__solution__plagiarism=False, attestation__final=True)}) for i,r in enumerate(all_ratings): all_ratings[i]['ratings'] = [list(rating) for rating in r['ratings'].annotate(Count('id')).values_list('position','id__count')] return render_to_response("attestation/statistics.html", {'task':task, \ 'user_count': user_count, 'solution_count': final_solution_count,\ 'submissions':submissions, 'submissions_final':submissions_final, 'creation_times':creation_times, 'creation_times_final':creation_times_final, 'acc_submissions':acc_submissions, \ 'attestations':attestations, \ 'final_grade_rating_scale_items' :final_grade_rating_scale_items, 'all_ratings':all_ratings, \ }, context_instance=RequestContext(request))
def attestation_list(request, task_id): if not (in_group(request.user, 'Tutor,Trainer') or request.user.is_superuser): return access_denied(request) task = Task.objects.get(pk=task_id) attestation_stats = [] if (in_group(request.user, 'Trainer')): attestation_stats = [{ 'tutor': tutor, 'unattested': Solution.objects.filter(task=task, final=True, plagiarism=False, attestation=None, author__tutorial__tutors=tutor).count(), 'final': Attestation.objects.filter(solution__task=task, final=True, author=tutor).count(), 'nonfinal': Attestation.objects.filter(solution__task=task, final=False, author=tutor).count() } for tutor in User.objects.filter(groups__name="Tutor")] for entry in attestation_stats: entry['attested'] = entry['final'] + entry['nonfinal'] entry['total'] = entry['final'] + entry['nonfinal'] + entry[ 'unattested'] tutored_users = User.objects.filter( groups__name="User", is_active=True).order_by('last_name') if in_group( request.user, 'Trainer') or request.user.is_superuser else None unatested_solutions = Solution.objects.filter(task=task, final=True, plagiarism=False, attestation=None) if in_group(request.user, 'Tutor'): # the trainer sees them all unatested_solutions = unatested_solutions.filter( author__tutorial__in=request.user.tutored_tutorials.all()) my_attestations = Attestation.objects.filter( solution__task=task, author=request.user).order_by('-created') all_attestations_for_my_tutorials = Attestation.objects.filter( solution__task=task, solution__author__tutorial__in=request.user.tutored_tutorials.all( )).order_by('-created') if (in_group(request.user, 'Trainer')): # show all to trainer attestations_by_others = Attestation.objects.filter( solution__task=task).order_by('-created') solutions_with_plagiarism = Solution.objects.filter(task=task, plagiarism=True) else: # show from my toturials attestations_by_others = all_attestations_for_my_tutorials.exclude( author=request.user) solutions_with_plagiarism = Solution.objects.filter( task=task, plagiarism=True, author__tutorial__in=request.user.tutored_tutorials.all()) if request.method == "POST": for attestation in all_attestations_for_my_tutorials.filter( final=True, published=False): attestation.publish(request) all_attestations_published = all_attestations_for_my_tutorials.filter( published=False).count() == 0 all_attestations_final = all_attestations_for_my_tutorials.filter( final=False).count() == 0 show_author = not get_settings().anonymous_attestation or in_group( request.user, 'Trainer') or published data = { 'task': task, 'tutored_users': tutored_users, 'solutions_with_plagiarism': solutions_with_plagiarism, 'my_attestations': my_attestations, 'attestations_by_others': attestations_by_others, 'unatested_solutions': unatested_solutions, 'published': all_attestations_published, 'show_author': show_author, 'attestation_stats': attestation_stats } return render_to_response("attestation/attestation_list.html", data, context_instance=RequestContext(request))
def is_trainer(self, user): return in_group(user,"Trainer")
def is_tutor(self, user): return in_group(user,"Tutor")
def statistics(request,task_id): task = get_object_or_404(Task, pk=task_id) if not (in_group(request.user,'Trainer,Tutor') or request.user.is_superuser): return access_denied(request) final_solutions = task.solution_set.filter(final=True) unfinal_solutions = task.solution_set.filter(final=False) user = Group.objects.get(name='User').user_set.filter(is_active=True) tutorials = request.user.tutored_tutorials.all() if in_group(request.user,'Tutor'): final_solutions = final_solutions.filter(author__tutorial__in = tutorials) unfinal_solutions = unfinal_solutions.filter(author__tutorial__in = tutorials) user = User.objects.filter(tutorial__in = tutorials) final_solution_count = final_solutions.count() user_count = user.count() submissions = [] submissions_final = [] acc_submissions = [0] creation_dates = map(lambda dict:dict['creation_date'].date(), unfinal_solutions.values('creation_date')) creation_dates_final = map(lambda dict:dict['creation_date'].date(), final_solutions.values('creation_date')) for date in daterange(task.publication_date.date(), min(task.submission_date.date(), datetime.date.today())): submissions.append(creation_dates.count(date)) submissions_final.append(creation_dates_final.count(date)) acc_submissions.append(acc_submissions[-1]+submissions_final[-1]) acc_submissions.pop(0) if (user_count > 0): acc_submissions = map(lambda submissions: float(submissions)/user_count, acc_submissions) else: acc_submissions = 0; creation_times = map(lambda dict:[(dict['creation_date'].time().hour*3600+dict['creation_date'].time().minute*60)*1000, dict['creation_date'].weekday()], unfinal_solutions.values('creation_date')) creation_times_final = map(lambda dict:[(dict['creation_date'].time().hour*3600+dict['creation_date'].time().minute*60)*1000, dict['creation_date'].weekday()], final_solutions.values('creation_date')) if in_group(request.user,'Trainer'): attestations = Attestation.objects.filter(solution__task__id=task.id, final=True, published=False).aggregate(final=Count('id')) attestations.update( Attestation.objects.filter(solution__task__id=task.id, final=True, published=True).aggregate(published=Count('id')) ) else: # Tutor attestations = Attestation.objects.filter(solution__task__id=task.id, final=True, published=False, author__tutored_tutorials__in = tutorials).aggregate(final=Count('id')) attestations.update( Attestation.objects.filter(solution__task__id=task.id, final=True, published=True, author__tutored_tutorials__in = tutorials).aggregate(published=Count('id'))) attestations['all'] = final_solution_count all_items = task.final_grade_rating_scale.ratingscaleitem_set.values_list('name','position') final_grade_rating_scale_items = "['" + "','".join([name.strip() for (name,position) in all_items]) + "']" if in_group(request.user,'Trainer'): ratings = RatingScaleItem.objects.filter(attestation__solution__task=task_id, attestation__solution__plagiarism=False, attestation__final=True) else: ratings = RatingScaleItem.objects.filter(attestation__solution__task=task_id, attestation__solution__plagiarism=False, attestation__final=True, attestation__author__tutored_tutorials__in = tutorials) ratings = ratings.annotate(Count('id')).values_list('position','id__count') ratings = map(lambda tupel:list(tupel), ratings) return render_to_response("attestation/statistics.html", {'task':task, \ 'user_count': user_count, 'solution_count': final_solution_count,\ 'submissions':submissions, 'submissions_final':submissions_final, 'creation_times':creation_times, 'creation_times_final':creation_times_final, 'acc_submissions':acc_submissions, \ 'attestations':attestations, \ 'final_grade_rating_scale_items' :final_grade_rating_scale_items, 'ratings':ratings\ }, context_instance=RequestContext(request))
def tutorial_overview(request, tutorial_id=None): if not (in_group(request.user, 'Trainer,Tutor') or request.user.is_superuser): return access_denied(request) if (tutorial_id): tutorial = get_object_or_404(Tutorial, pk=tutorial_id) if (in_group(request.user, 'Tutor') and not tutorial.tutors.filter(id=request.user.id)): return access_denied(request) else: tutorials = request.user.tutored_tutorials.all() if (not tutorials): return render_to_response("attestation/tutorial_none.html", context_instance=RequestContext(request)) tutorial = request.user.tutored_tutorials.all()[0] if (in_group(request.user, 'Tutor')): other_tutorials = request.user.tutored_tutorials.all() else: other_tutorials = Tutorial.objects.all() other_tutorials = other_tutorials.exclude(id=tutorial.id) tasks = Task.objects.filter( submission_date__lt=datetime.datetime.now).order_by( 'publication_date', 'submission_date') users = User.objects.filter(groups__name='User').filter( is_active=True, tutorial=tutorial).order_by('last_name', 'first_name') rating_list = user_task_attestation_map(users, tasks, False) def to_float(a, default, const): try: return (float(str(a.final_grade)), const) except (ValueError, TypeError, AttributeError): return (default, default) averages = [0.0 for i in range(len(tasks))] nr_of_grades = [0 for i in range(len(tasks))] for (user, attestations) in rating_list: averages = [ avg + to_float(att, 0.0, None)[0] for (avg, att) in zip(averages, attestations) ] nr_of_grades = [ n + to_float(att, 0, 1)[1] for (n, att) in zip(nr_of_grades, attestations) ] nr_of_grades = [(n if n > 0 else 1) for n in nr_of_grades] averages = [a / n for (a, n) in zip(averages, nr_of_grades)] script = Script.objects.get_or_create(id=1)[0] return render_to_response("attestation/tutorial_overview.html", { 'other_tutorials': other_tutorials, 'tutorial': tutorial, 'rating_list': rating_list, 'tasks': tasks, 'final_grades_published': get_settings().final_grades_published, 'script': script, 'averages': averages }, context_instance=RequestContext(request))
def statistics(request, task_id): task = get_object_or_404(Task, pk=task_id) if not (in_group(request.user, 'Trainer,Tutor') or request.user.is_superuser): return access_denied(request) final_solutions = task.solution_set.filter(final=True) unfinal_solutions = task.solution_set.filter(final=False) user = Group.objects.get(name='User').user_set.filter(is_active=True) tutorials = request.user.tutored_tutorials.all() if in_group(request.user, 'Tutor'): final_solutions = final_solutions.filter( author__tutorial__in=tutorials) unfinal_solutions = unfinal_solutions.filter( author__tutorial__in=tutorials) user = User.objects.filter(tutorial__in=tutorials) final_solution_count = final_solutions.count() user_count = user.count() submissions = [] submissions_final = [] acc_submissions = [0] creation_dates = map(lambda dict: dict['creation_date'].date(), unfinal_solutions.values('creation_date')) creation_dates_final = map(lambda dict: dict['creation_date'].date(), final_solutions.values('creation_date')) for date in daterange( task.publication_date.date(), min(task.submission_date.date(), datetime.date.today())): submissions.append(creation_dates.count(date)) submissions_final.append(creation_dates_final.count(date)) acc_submissions.append(acc_submissions[-1] + submissions_final[-1]) acc_submissions.pop(0) if (user_count > 0): acc_submissions = map( lambda submissions: float(submissions) / user_count, acc_submissions) else: acc_submissions = 0 creation_times = map( lambda dict: [(dict['creation_date'].time().hour * 3600 + dict[ 'creation_date'].time().minute * 60) * 1000, dict['creation_date']. weekday()], unfinal_solutions.values('creation_date')) creation_times_final = map( lambda dict: [(dict['creation_date'].time().hour * 3600 + dict[ 'creation_date'].time().minute * 60) * 1000, dict['creation_date']. weekday()], final_solutions.values('creation_date')) if in_group(request.user, 'Trainer'): attestations = Attestation.objects.filter( solution__task__id=task.id, final=True, published=False).aggregate(final=Count('id')) attestations.update( Attestation.objects.filter( solution__task__id=task.id, final=True, published=True).aggregate(published=Count('id'))) else: # Tutor attestations = Attestation.objects.filter( solution__task__id=task.id, final=True, published=False, author__tutored_tutorials__in=tutorials).aggregate( final=Count('id')) attestations.update( Attestation.objects.filter( solution__task__id=task.id, final=True, published=True, author__tutored_tutorials__in=tutorials).aggregate( published=Count('id'))) attestations['all'] = final_solution_count all_items = task.final_grade_rating_scale.ratingscaleitem_set.values_list( 'name', 'position') final_grade_rating_scale_items = "['" + "','".join( [name.strip() for (name, position) in all_items]) + "']" if in_group(request.user, 'Trainer'): ratings = RatingScaleItem.objects.filter( attestation__solution__task=task_id, attestation__solution__plagiarism=False, attestation__final=True) else: ratings = RatingScaleItem.objects.filter( attestation__solution__task=task_id, attestation__solution__plagiarism=False, attestation__final=True, attestation__author__tutored_tutorials__in=tutorials) ratings = ratings.annotate(Count('id')).values_list( 'position', 'id__count') ratings = map(lambda tupel: list(tupel), ratings) return render_to_response("attestation/statistics.html", {'task':task, \ 'user_count': user_count, 'solution_count': final_solution_count,\ 'submissions':submissions, 'submissions_final':submissions_final, 'creation_times':creation_times, 'creation_times_final':creation_times_final, 'acc_submissions':acc_submissions, \ 'attestations':attestations, \ 'final_grade_rating_scale_items' :final_grade_rating_scale_items, 'ratings':ratings\ }, context_instance=RequestContext(request))