示例#1
0
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,
        })
示例#2
0
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)
示例#3
0
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
        })
示例#4
0
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)
        })