Пример #1
0
class GetUserInfoForm(forms.Form):
    user = UserSelectionField(label=_("Username"))

    def __init__(self, request, *args, **kwargs):
        super(GetUserInfoForm, self).__init__(*args, **kwargs)
        self.fields['user'].hints_url = reverse(
            'contest_user_hints', kwargs={'contest_id': request.contest.id})
Пример #2
0
class FilterMessageAdminForm(FilterMessageForm):
    author = UserSelectionField(label=_("Author username"), required=False)

    def __init__(self, request, *args, **kwargs):
        super(FilterMessageAdminForm, self).__init__(request, *args, **kwargs)
        self.fields['author'].hints_url = reverse(
            'get_messages_authors', kwargs={'contest_id': request.contest.id})
Пример #3
0
class AddFriendshipForm(forms.Form):
    user = UserSelectionField(queryset=User.objects.filter(
        teacher__isnull=False))

    def __init__(self, *args, **kwargs):
        super(AddFriendshipForm, self).__init__(*args, **kwargs)
        self.fields['user'].hints_url = reverse('problemsharing_friend_hints')
Пример #4
0
class FilterUsersInRankingForm(forms.Form):
    user = UserSelectionField(label=_("Username"), required=False)

    def __init__(self, request, *args, **kwargs):
        super(FilterUsersInRankingForm, self).__init__(*args, **kwargs)
        self.fields['user'].hints_url = reverse(
            'get_users_in_ranking', kwargs={'contest_id': request.contest.id})
        self.fields['user'].widget.attrs['placeholder'] = \
                _('Search for user...')
Пример #5
0
class SuForm(forms.Form):
    user = UserSelectionField(label=_("Username"), validators=[
        no_superuser_validator])
    backend = forms.ChoiceField(label=_("Authentication backend"),
        required=False, choices=authentication_backends())

    def __init__(self, *args, **kwargs):
        super(SuForm, self).__init__(*args, **kwargs)
        self.fields['user'].hints_url = reverse('get_suable_users')
Пример #6
0
    def adjust_submission_form(self, request, form, problem_instance):
        super(TeamsMixinForContestController, self).adjust_submission_form(
            request, form, problem_instance
        )
        try:
            tm = TeamMembership.objects.get(
                user=request.user, team__contest=request.contest
            )
            if not is_contest_admin(request):
                form.fields['user'] = UserSelectionField(
                    initial=tm.team.user,
                    label=_("Team name"),
                    widget=forms.TextInput(attrs={'readonly': 'readonly'}),
                    help_text=_(
                        "You are in the team, so submission will"
                        " be sent as the team."
                    ),
                )

                def clean_user():
                    user = form.cleaned_data['user']
                    try:
                        tm = TeamMembership.objects.get(
                            user=request.user, team__contest=request.contest
                        )
                        if user != tm.team.user:
                            raise forms.ValidationError(
                                _("You can't submit a" " solution for another team!")
                            )
                        return user
                    except TeamMembership.DoesNotExist:
                        raise forms.ValidationError(_("Team does not exist"))

                form.clean_user = clean_user
            else:
                form.fields['team'] = forms.CharField(
                    initial=tm.team.name,
                    label=_("Team name"),
                    widget=forms.TextInput(attrs={'readonly': 'readonly'}),
                    help_text=_(
                        "You are in the team, but you are also the "
                        "admin, so you can send solution as the "
                        "team user or as yourself."
                    ),
                )
        except TeamMembership.DoesNotExist:
            pass
Пример #7
0
class OIReportForm(forms.Form):
    is_single_report = forms.BooleanField(required=False,
                                          label=_("Single report"))
    single_report_user = UserSelectionField(
        required=False,
        widget=UserSelectionWidget(attrs={'placeholder': _("User")}),
        label=_("Username"))
    form_type = forms.ChoiceField(choices=report_types, label=_("Report type"))

    def __init__(self, request, *args, **kwargs):
        super(OIReportForm, self).__init__(*args, **kwargs)
        rounds = _rounds(request)
        last_finished_round_id = _last_finished_round_id(request)
        regions = _regions(request)
        testgroups = _testgroups(request)
        self.fields['report_round'] = forms.ChoiceField(
            choices=rounds, label=_("Round"), initial=last_finished_round_id)
        self.fields['report_region'] = forms.ChoiceField(choices=regions,
                                                         label=_("Region"))

        self.fields['single_report_user'].hints_url = \
                reverse('get_report_users',
                    kwargs={'contest_id': request.contest.id})
        self.fields['single_report_user'].queryset = \
                request.contest.controller.registration_controller() \
                    .filter_participants(User.objects.all())

        for round in testgroups:
            for task in round['tasks']:
                field_name = 'testgroup[%s]' % (task['short_name'])
                field_choices = [(group, group)
                                 for group in task['testgroups']]
                self.fields[field_name] = forms.MultipleChoiceField(
                    choices=field_choices,
                    widget=OIReportCheckboxSelectMultiple(),
                    label=task['short_name'],
                    required=False)
                self.fields[field_name].round = round['id']

    def control_fields(self):
        for name in self.fields:
            if name.startswith('testgroup') or 'single' in name:
                continue
            else:
                yield self[name]

    def testgroup_fields(self):
        for name in self.fields:
            if name.startswith('testgroup'):
                yield self[name]
            else:
                continue

    def clean(self):
        cleaned_data = super(OIReportForm, self).clean()

        if cleaned_data['is_single_report']:
            report_user = cleaned_data.get('single_report_user')
            if report_user is None:
                self._errors['single_report_user'] \
                    = self.error_class([_("No user specified.")])
                del cleaned_data['single_report_user']

        return cleaned_data

    def get_testgroups(self, request):
        testgroups = defaultdict(list)
        regex = re.compile(r'testgroup\[(.*)\]$')
        for field_name in self.fields:
            match = regex.match(field_name)
            if match:
                groups = self.cleaned_data[field_name]
                problem_instance = ProblemInstance.objects.get(
                    short_name=match.group(1), round__contest=request.contest)
                if groups:
                    testgroups[problem_instance] += groups
        return testgroups
Пример #8
0
    def __init__(self, request, *args, **kwargs):
        problem_instance = kwargs.pop('problem_instance', None)
        if problem_instance is None:
            # if problem_instance does not exist any from the current
            # contest is chosen. To change in future.
            # ALSO in mailsubmit.forms
            contest = request.contest
            assert contest is not None
            problem_instances = ProblemInstance.objects \
                    .filter(contest=contest)
            problem_instance = problem_instances[0]
        else:
            problem_instances = [problem_instance]
            contest = None
        self.all_problem_instances = problem_instances

        # Default kind is selected based on
        # the first problem_instance assigned to this form.
        # This is an arbitrary choice.
        self.kind = kwargs.pop(
            'kind',
            problem_instance.controller.get_default_submission_kind(
                request, problem_instance=problem_instance))
        problem_filter = kwargs.pop('problem_filter', None)
        self.request = request

        # taking the available problems
        pis = self.get_problem_instances()
        if problem_filter:
            pis = problem_filter(pis)
        pi_choices = [(pi.id, six.text_type(pi)) for pi in pis]

        # pylint: disable=non-parent-init-called
        # init form with previously sent data
        forms.Form.__init__(self, *args, **kwargs)

        # prepare problem instance selector
        pi_field = self.fields['problem_instance_id']
        pi_field.widget.attrs['class'] = 'input-xlarge'
        self._set_field_show_always('problem_instance_id')

        if len(pi_choices) > 1:
            pi_field.choices = [('', '')] + pi_choices
        else:
            pi_field.choices = pi_choices

        narrow_input_field(pi_field)

        # if contest admin, add kind and 'as other user' field
        if contest and is_contest_basicadmin(request):
            self.fields['user'] = UserSelectionField(
                label=_("User"),
                hints_url=reverse('contest_user_hints',
                                  kwargs={'contest_id': request.contest.id}),
                initial=request.user)
            self._set_field_show_always('user')

            def clean_user():
                try:
                    user = self.cleaned_data['user']
                    if user == request.user:
                        return user
                    if not request.user.is_superuser:
                        contest.controller.registration_controller() \
                            .filter_participants(
                                User.objects.filter(pk=user.pk)).get()
                    return user
                except User.DoesNotExist:
                    raise forms.ValidationError(
                        _("User does not exist or "
                          "you do not have enough privileges"))

            self.clean_user = clean_user
            self.fields['kind'] = forms.ChoiceField(choices=[
                ('NORMAL', _("Normal")), ('IGNORED', _("Ignored"))
            ],
                                                    initial=self.kind,
                                                    label=_("Kind"))
            self._set_field_show_always('kind')
            narrow_input_fields([self.fields['kind'], self.fields['user']])

        # adding additional fields, etc
        for pi in pis:
            pi.controller.adjust_submission_form(request, self, pi)

        self._set_default_fields_attributes()

        # fix field order (put kind and user at the end)
        self._move_field_to_end('user')
        self._move_field_to_end('kind')
Пример #9
0
    def adjust_submission_form(self, request, form, problem_instance):
        controller = problem_instance.controller
        size_limit = controller.get_submission_size_limit(problem_instance)

        def validate_file_size(file):
            if file.size > size_limit:
                raise ValidationError(_("File size limit exceeded."))

        def validate_code_length(code):
            if len(code) > size_limit:
                raise ValidationError(_("Code length limit exceeded."))

        def validate_language(file):
            ext = controller._get_language(file, problem_instance)
            if ext not in get_allowed_languages_extensions(problem_instance):
                raise ValidationError(_(
                    "Unknown or not supported file extension."))

        def parse_problem(problem):
            available_problems = form.fields['problem_instance_id'].choices
            problem_id = None
            for (id, name) in available_problems:
                if name.find(problem) != -1:
                    if problem_id is None:
                        problem_id = id
                    else:
                        # matched more than one available problem
                        return None
            return problem_id

        form.fields['file'] = forms.FileField(required=False,
                allow_empty_file=False,
                validators=[validate_file_size, validate_language],
                label=_("File"),
                help_text=mark_safe(_(
                    "Language is determined by the file extension."
                    " It has to be one of: %s."
                    " You can paste the code below instead of"
                    " choosing file."
                    " <strong>Try drag-and-drop too!</strong>"
                ) % (', '.join(get_allowed_languages_extensions(
                        problem_instance))))
        )
        form.fields['code'] = forms.CharField(required=False,
                label=_("Code"),
                validators=[validate_code_length],
                widget=forms.widgets.Textarea(attrs={'rows': 10,
                    'class': 'monospace input-xxxlarge'})
        )

        choices = [('', '')]
        choices += [(lang, lang) for lang
                    in problem_instance.controller.get_allowed_languages()]
        form.fields['prog_lang'] = forms.ChoiceField(required=False,
                label=_("Programming language"),
                choices=choices,
                widget=forms.Select(attrs={'disabled': 'disabled'})
        )
        narrow_input_field(form.fields['prog_lang'])

        if 'dropped_solution' in request.POST:
            form.fields['code'].initial = request.POST['dropped_solution']

        # guessing problem name and extension when file dragged and dropped
        if 'dropped_solution_name' in request.POST:
            # do not validate blank fields this time
            form.is_bound = False

            fname = request.POST['dropped_solution_name']
            if fname.count('.') == 1:
                [problem, ext] = fname.split('.', 1)
                if 'problem_instance_id' not in request.POST:
                    form.fields['problem_instance_id'].initial = \
                            parse_problem(problem)
                if 'prog_lang' not in request.POST:
                    form.fields['prog_lang'].initial = \
                            get_language_by_extension(problem_instance, ext)

        if request.contest and is_contest_admin(request):
            form.fields['user'] = UserSelectionField(
                    label=_("User"),
                    hints_url=reverse('contest_user_hints',
                            kwargs={'contest_id': request.contest.id}),
                    initial=request.user)


            def clean_user():
                try:
                    user = form.cleaned_data['user']
                    if user == request.user:
                        return user
                    if not request.user.is_superuser:
                        controller.registration_controller() \
                            .filter_participants(
                                User.objects.filter(pk=user.pk)).get()
                    return user
                except User.DoesNotExist:
                    raise forms.ValidationError(_(
                            "User does not exist or "
                            "you do not have enough privileges"))
            form.clean_user = clean_user
            form.fields['kind'] = forms.ChoiceField(choices=[
                ('NORMAL', _("Normal")), ('IGNORED', _("Ignored"))],
                initial=form.kind, label=_("Kind"))
            narrow_input_fields([form.fields['kind'], form.fields['user']])
Пример #10
0
class ContestPermissionAdminForm(ModelForm):
    user = UserSelectionField(label=_("Username"))

    class Meta(object):
        model = ContestPermission
        fields = ('user', 'contest', 'permission')