def review_enrollment_type_for_user(request, user_id): user = get_object_or_404(users.models.User, id=user_id) entrance_step = get_object_or_404( models.SelectEnrollmentTypeEntranceStep, school=request.school, ) selected_enrollment_type = get_object_or_404( models.SelectedEnrollmentType, user=user, step=entrance_step, enrollment_type__needs_moderation=True, ) # TODO(artemtab): add locking # locked_by_me = True # with transaction.atomic(): base_entrance_level = upgrades.get_base_entrance_level( request.school, user) level_upgrades = models.EntranceLevelUpgrade.objects.filter( upgraded_to__school=request.school, user=user) topics_entrance_level = upgrades.get_topics_entrance_level( request.school, user) if request.method == 'POST': pass # Handle review else: pass # Initialize review form add_checking_comment_form = forms.AddCheckingCommentForm() checking_comments = models.CheckingComment.objects.filter( school=request.school, user=user) # TODO(artemtab): better ordering, now it's not exactly chronological participations = (user.school_participations.order_by( '-school__year', '-school__name')) return render( request, 'entrance/staff/enrollment_review_user.html', { 'user_for_review': user, 'participations': participations, 'base_entrance_level': base_entrance_level, 'level_upgrades': level_upgrades, 'topics_entrance_level': topics_entrance_level, 'selected_enrollment_type': selected_enrollment_type, 'review_info': entrance_step.review_info, # 'locked_by_me': locked_by_me, 'add_checking_comment_form': add_checking_comment_form, 'checking_comments': checking_comments, })
def add_comment(request, user_id): redirect_url = request.POST.get('next', '') if not is_safe_url(redirect_url, request.get_host()): redirect_url = reverse('school:entrance:enrolling_user', kwargs={ 'school_name': request.school.short_name, 'user_id': user_id, }) form = forms.AddCheckingCommentForm(data=request.POST) if form.is_valid(): models.CheckingComment.objects.create( school=request.school, user_id=user_id, comment=form.cleaned_data['comment'], commented_by=request.user, ) else: messages.add_message(request, messages.ERROR, form['comment'].errors[0]) return redirect(redirect_url)
def check_users_task(request, task_id, user_id, group_name=None): _remove_old_checking_locks() if group_name is not None: checking_group = get_object_or_404(models.CheckingGroup, school=request.school, short_name=group_name) else: checking_group = None user = get_object_or_404(users.models.User, id=user_id) task = get_object_or_404(models.FileEntranceExamTask, id=task_id) task.mark_field_id = ( forms.FileEntranceExamTasksMarkForm.FIELD_ID_TEMPLATE % task.id) task.comment_field_id = ( forms.FileEntranceExamTasksMarkForm.COMMENT_ID_TEMPLATE % task.id) if checking_group is None: group_user_ids = list({ user_id for g in request.school.entrance_checking_groups.all() for user_id in g.group.user_ids }) else: # Select users from group group_user_ids = checking_group.group.user_ids task.total_solutions_count = users.models.User.objects.filter( id__in=nested_query_list(group_user_ids), entrance_exam_solutions__task=task).distinct().count() task.checked_solutions_count = users.models.User.objects.filter( id__in=nested_query_list(group_user_ids), entrance_exam_solutions__task=task, entrance_exam_solutions__checks__isnull=False).distinct().count() locked_by_me = True with transaction.atomic(): lock = models.CheckingLock.objects.filter( user=user, task=task, ).first() if lock is None: lock = models.CheckingLock.objects.create( user_id=user_id, task_id=task_id, locked_by=request.user, ) else: locked_by_me = lock.locked_by_id == request.user.id base_entrance_level = upgrades.get_base_entrance_level( request.school, user) level_upgrades = models.EntranceLevelUpgrade.objects.filter( upgraded_to__school=request.school, user=user) solutions = task.solutions.filter(user=user).order_by('-created_at') if not solutions.exists(): lock.delete() messages.add_message(request, messages.INFO, 'Этот пользователь не решал выбранную задачу') if checking_group is None: return redirect('school:entrance:enrolling_user', school_name=request.school.short_name, user_id=user.id) return redirect('school:entrance:check_task', school_name=request.school.short_name, group_name=group_name, task_id=task.id) solutions = list(solutions) last_solution = solutions[0] if request.method == 'POST': if 'refuse' in request.POST: lock.delete() return redirect( 'school:entrance:check', school_name=request.school.short_name, ) mark_form = forms.FileEntranceExamTasksMarkForm([task], request.POST, with_comment=True) if mark_form.is_valid(): score = mark_form.cleaned_data[task.mark_field_id] comment = mark_form.cleaned_data[task.comment_field_id] models.CheckedSolution.objects.create(solution=last_solution, checked_by=request.user, score=score, comment=comment) lock.delete() messages.add_message( request, messages.INFO, 'Баллы пользователю %s успешно сохранены' % (user.get_full_name(), )) if checking_group is None: return redirect('school:entrance:enrolling_user', school_name=request.school.short_name, user_id=user.id) return redirect('school:entrance:check_task', school_name=request.school.short_name, group_name=group_name, task_id=task.id) else: mark_form = forms.FileEntranceExamTasksMarkForm([task], with_comment=True) checks = list( models.CheckedSolution.objects.filter( solution=last_solution).order_by('-created_at')) last_mark = None if len(checks) == 0 else checks[0].score if last_mark is not None: mark_form.set_initial_mark(task.id, last_mark) checking_comments = models.CheckingComment.objects.filter( school=request.school, user=user) add_checking_comment_form = forms.AddCheckingCommentForm() return render( request, 'entrance/staff/check_users_task.html', { 'group': checking_group, 'user_for_checking': user, 'locked_by_me': locked_by_me, 'task': task, 'base_entrance_level': base_entrance_level, 'level_upgrades': level_upgrades, 'solutions': solutions, 'last_solution': last_solution, 'checks': checks, 'last_mark': last_mark, 'checking_comments': checking_comments, 'add_checking_comment_form': add_checking_comment_form, 'mark_form': mark_form })
def check_user(request, user, group=None): entrance_exam = (models.EntranceExam.objects.filter( school=request.school).first()) checking_comments = user.entrance_checking_comments.filter( school=request.school).order_by('created_at') add_checking_comment_form = forms.AddCheckingCommentForm() base_entrance_level = None level_upgrades = [] test_tasks = [] file_tasks = [] program_tasks = [] if entrance_exam is not None: base_entrance_level = upgrades.get_base_entrance_level( request.school, user) level_upgrades = models.EntranceLevelUpgrade.objects.filter( upgraded_to__school=request.school, user=user) tasks = upgrades.get_entrance_tasks(request.school, user, base_entrance_level) tasks_solutions = group_by( user.entrance_exam_solutions.filter( task__exam=entrance_exam).order_by('-created_at'), operator.attrgetter('task_id')) for task in tasks: task.user_solutions = tasks_solutions[task.id] task.is_solved = task.is_solved_by_user(user) if type(task) is models.TestEntranceExamTask: if len(task.user_solutions) > 0: task.last_try = task.user_solutions[0].solution task.is_last_correct = task.is_solution_correct( task.last_try) else: task.last_try = None task.is_last_correct = None if type(task) is models.FileEntranceExamTask: if len(task.user_solutions) > 0: task.last_solution = task.user_solutions[0] task.checks = list(task.last_solution.checks.all()) else: task.last_solution = None task.checks = [] test_tasks = list( filter(lambda t: type(t) is models.TestEntranceExamTask, tasks)) file_tasks = list( filter(lambda t: type(t) is models.FileEntranceExamTask, tasks)) program_tasks = list( filter(lambda t: isinstance(t, models.EjudgeEntranceExamTask), tasks)) return render( request, 'entrance/staff/check_user.html', { 'group': group, 'user_for_checking': user, 'base_entrance_level': base_entrance_level, 'level_upgrades': level_upgrades, 'test_tasks': test_tasks, 'file_tasks': file_tasks, 'program_tasks': program_tasks, 'checking_comments': checking_comments, 'add_checking_comment_form': add_checking_comment_form, 'user_summary': UserSummary.summary_for_user(request.school, user), 'clone_accounts': _find_clones(user) })