예제 #1
0
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
예제 #2
0
파일: views.py 프로젝트: t001/Praktomat
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
예제 #3
0
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
예제 #4
0
파일: views.py 프로젝트: upsj/Praktomat
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))
예제 #5
0
파일: views.py 프로젝트: upsj/Praktomat
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))
예제 #6
0
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)
예제 #7
0
파일: views.py 프로젝트: upsj/Praktomat
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))
예제 #8
0
파일: views.py 프로젝트: t001/Praktomat
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))
예제 #9
0
파일: views.py 프로젝트: t001/Praktomat
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')
예제 #10
0
파일: views.py 프로젝트: upsj/Praktomat
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
예제 #11
0
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]))
예제 #12
0
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))
예제 #13
0
파일: views.py 프로젝트: t001/Praktomat
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')
예제 #14
0
파일: views.py 프로젝트: t001/Praktomat
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))
예제 #15
0
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))
예제 #16
0
파일: views.py 프로젝트: upsj/Praktomat
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))
예제 #17
0
파일: views.py 프로젝트: t001/Praktomat
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' )
예제 #18
0
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))
예제 #19
0
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')
예제 #20
0
파일: views.py 프로젝트: t001/Praktomat
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]))
예제 #21
0
파일: views.py 프로젝트: upsj/Praktomat
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))
예제 #22
0
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))
예제 #23
0
파일: views.py 프로젝트: upsj/Praktomat
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)
예제 #24
0
파일: views.py 프로젝트: upsj/Praktomat
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]))
예제 #25
0
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]))
예제 #26
0
파일: views.py 프로젝트: t001/Praktomat
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))
예제 #27
0
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))
예제 #28
0
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
예제 #29
0
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))
예제 #30
0
파일: admin.py 프로젝트: Drake81/Praktomat
 def is_trainer(self, user):
     return in_group(user, "Trainer")
예제 #31
0
파일: admin.py 프로젝트: Drake81/Praktomat
 def is_tutor(self, user):
     return in_group(user, "Tutor")
예제 #32
0
파일: views.py 프로젝트: upsj/Praktomat
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))
예제 #33
0
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))
예제 #34
0
파일: admin.py 프로젝트: t001/Praktomat
	def is_trainer(self, user):
		return in_group(user,"Trainer")
예제 #35
0
파일: admin.py 프로젝트: t001/Praktomat
	def is_tutor(self, user):
		return in_group(user,"Tutor")
예제 #36
0
파일: views.py 프로젝트: t001/Praktomat
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))
예제 #37
0
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))
예제 #38
0
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))