def create(self, validated_data):
        user_dict = validated_data['user']
        tag_dict = validated_data['tag']

        first_in_required = [ f for f in self._required if f in user_dict ][0]
        user = {
            'id': lambda: UserProfile.objects.get(user__id=user_dict['id']),
            'student_id': lambda: UserProfile.get_by_student_id(user_dict['student_id']),
            'username': lambda: UserProfile.objects.get(user__username=user_dict['username']),
            'email': lambda: UserProfile.get_by_email(user_dict['email']),
        }[first_in_required]()
        tag = UserTag.objects.get(
            slug=tag_dict['slug'],
            course_instance=self.context['course_id']
        )

        obj, created = UserTagging.objects.set(user, tag)
        if not created:
            raise serializers.ValidationError(
                'User {user} already has tag {slug}'.format(
                    user=user.user.username,
                    slug=tag.slug,
                )
            )
        return obj
Beispiel #2
0
    def create(self, validated_data):
        user_dict = validated_data['user']
        tag_dict = validated_data['tag']

        first_in_required = [f for f in self._required if f in user_dict][0]
        user = {
            'id':
            lambda: UserProfile.objects.get(user__id=user_dict['id']),
            'student_id':
            lambda: UserProfile.get_by_student_id(user_dict['student_id']),
            'username':
            lambda: UserProfile.objects.get(user__username=user_dict['username'
                                                                     ]),
            'email':
            lambda: UserProfile.get_by_email(user_dict['email']),
        }[first_in_required]()
        tag = UserTag.objects.get(slug=tag_dict['slug'],
                                  course_instance=self.context['course_id'])

        obj, created = UserTagging.objects.set(user, tag)
        if not created:
            raise serializers.ValidationError(
                'User {user} already has tag {slug}'.format(
                    user=user.user.username,
                    slug=tag.slug,
                ))
        return obj
Beispiel #3
0
class SubmissionCreateAndReviewForm(SubmissionReviewForm):
    STUDENT_FIELDS = ('students', 'students_by_user_id',
                      'students_by_student_id', 'students_by_email')

    submission_time = forms.DateTimeField()
    students = forms.ModelMultipleChoiceField(
        queryset=UserProfile.objects.none(), required=False)
    students_by_user_id = forms.TypedMultipleChoiceField(
        empty_value=UserProfile.objects.none(),
        coerce=lambda user_id: User.objects.get(id=user_id).userprofile,
        choices=[],
        required=False)
    students_by_student_id = forms.TypedMultipleChoiceField(
        empty_value=UserProfile.objects.none(),
        coerce=lambda student_id: UserProfile.get_by_student_id(student_id),
        choices=[],
        required=False)
    students_by_email = forms.TypedMultipleChoiceField(
        empty_value=UserProfile.objects.none(),
        coerce=lambda email: UserProfile.get_by_email(email),
        choices=[],
        required=False)

    def __init__(self, *args, **kwargs):
        super(SubmissionCreateAndReviewForm, self).__init__(*args, **kwargs)
        self.fields["students"].queryset = \
            UserProfile.objects.all()
        self.fields["students_by_user_id"].choices = \
            [ (p.user_id, p) for p in UserProfile.objects.all() ]
        self.fields["students_by_student_id"].choices = \
            [ (p.student_id, p.student_id) for p in UserProfile.objects.all() ]
        self.fields["students_by_email"].choices = \
            [ (u.email, u.email) for u in User.objects.all() ]

    def clean(self):
        self.cleaned_data = data = super(SubmissionCreateAndReviewForm,
                                         self).clean()
        fields = self.STUDENT_FIELDS
        n = sum((1 if data.get(k) else 0) for k in fields)
        if n == 0:
            raise forms.ValidationError(
                _("One of the student fields must not be blank"))
        if n > 1:
            raise forms.ValidationError(
                _("Only one student field can be given"))
        return data

    @property
    def cleaned_students(self):
        data = self.cleaned_data
        for field in self.STUDENT_FIELDS:
            s = data.get(field)
            if s:
                return s
        raise RuntimeError("Didn't find any students")
Beispiel #4
0
class SubmissionCreateAndReviewForm(SubmissionReviewForm):

    submission_time = forms.DateTimeField()
    students = forms.ModelMultipleChoiceField(
        queryset=UserProfile.objects.none(), required=False)
    students_by_student_id = forms.TypedMultipleChoiceField(
        empty_value=UserProfile.objects.none(),
        coerce=lambda student_id: UserProfile.get_by_student_id(student_id),
        choices=[(p.student_id, p.student_id)
                 for p in UserProfile.objects.none()],
        required=False)
    students_by_email = forms.TypedMultipleChoiceField(
        empty_value=UserProfile.objects.none(),
        coerce=lambda email: UserProfile.get_by_email(email),
        choices=[(u.email, u.email) for u in User.objects.none()],
        required=False)

    def __init__(self, *args, **kwargs):
        super(SubmissionCreateAndReviewForm, self).__init__(*args, **kwargs)
        self.fields["students"].queryset = \
            UserProfile.objects.all()
        #self.exercise.course_instance.get_student_profiles()
        self.fields["students_by_student_id"].choices = \
            [ (p.student_id, p.student_id) for p in UserProfile.objects.all()
              #self.exercise.course_instance.get_student_profiles()
            ]
        self.fields["students_by_email"].choices = \
            [ (u.email, u.email) for u in User.objects.all() ]

    def clean(self):
        self.cleaned_data = super(SubmissionCreateAndReviewForm, self).clean()
        n = 0
        if self.cleaned_data.get("students"):
            n += 1
        if self.cleaned_data.get("students_by_student_id"):
            n += 1
        if self.cleaned_data.get("students_by_email"):
            n += 1
        if n == 0:
            raise forms.ValidationError(
                _("One of the student fields must not be blank: students, students_by_student_id, students_by_email"
                  ))
        if n > 1:
            raise forms.ValidationError(
                _("Only one student field can be given: students, students_by_student_id, students_by_email"
                  ))
        return self.cleaned_data
Beispiel #5
0
    def create(self, validated_data):
        user_dict = validated_data['user']
        tag_dict = validated_data['tag']

        first_in_required = [f for f in self._required if f in user_dict][0]
        try:
            user = {
                'id':
                lambda: UserProfile.objects.get(user__id=user_dict['id']),
                'student_id':
                lambda: UserProfile.get_by_student_id(user_dict['student_id']),
                'username':
                lambda: UserProfile.objects.get(user__username=user_dict[
                    'username']),
                'email':
                lambda: UserProfile.get_by_email(user_dict['email']),
            }[first_in_required]()
            tag = UserTag.objects.get(
                slug=tag_dict['slug'],
                course_instance=self.context['course_id'])
        except UserTag.DoesNotExist:
            # 404 with description
            raise exceptions.NotFound(
                "Tag with slug {slug} was not found".format(
                    slug=tag_dict['slug']))
        except UserProfile.DoesNotExist:
            raise exceptions.NotFound(
                "User identified with {key}:{value} was not found".format(
                    key=first_in_required, value=user_dict[first_in_required]))
        obj, created = UserTagging.objects.set(user, tag)
        if not created:
            raise serializers.ValidationError(
                "User {user} already has tag {slug}".format(
                    user=user.user.username,
                    slug=tag.slug,
                ))
        return obj
Beispiel #6
0
class SubmissionCreateAndReviewForm(SubmissionReviewForm):
    STUDENT_FIELDS = ('students', 'students_by_user_id',
                      'students_by_student_id', 'students_by_email')

    submission_time = forms.DateTimeField(label=_('LABEL_SUBMISSION_TIME'), )
    students = forms.ModelMultipleChoiceField(
        queryset=UserProfile.objects.none(),
        required=False,
        label=_('LABEL_STUDENTS'),
    )
    students_by_user_id = forms.TypedMultipleChoiceField(
        empty_value=UserProfile.objects.none(),
        coerce=lambda user_id: User.objects.get(id=user_id).userprofile,
        choices=[],
        required=False,
        label=_('LABEL_STUDENTS_BY_USER_ID'),
    )
    students_by_student_id = forms.TypedMultipleChoiceField(
        empty_value=UserProfile.objects.none(),
        coerce=lambda student_id: UserProfile.get_by_student_id(student_id),
        choices=[],
        required=False,
        label=_('LABEL_STUDENTS_BY_STUDENT_ID'),
    )
    students_by_email = forms.TypedMultipleChoiceField(
        empty_value=UserProfile.objects.none(),
        coerce=lambda email: UserProfile.get_by_email(email),
        choices=[],
        required=False,
        label=_('LABEL_STUDENTS_BY_EMAIL'),
    )

    def __init__(self, *args, **kwargs):
        super(SubmissionCreateAndReviewForm, self).__init__(*args, **kwargs)
        self.fields["students"].queryset = \
            UserProfile.objects.all()
        self.fields["students_by_user_id"].choices = \
            [ (p.user_id, p) for p in UserProfile.objects.all() ]
        self.fields["students_by_student_id"].choices = \
            [ (p.student_id, p.student_id) for p in UserProfile.objects.all() ]
        self.fields["students_by_email"].choices = \
            [ (u.email, u.email) for u in User.objects.all() ]

    def clean(self):
        self.cleaned_data = data = super(SubmissionCreateAndReviewForm,
                                         self).clean()
        fields = self.STUDENT_FIELDS
        n = sum((1 if data.get(k) else 0) for k in fields)
        if n == 0:
            raise forms.ValidationError(
                _('SUBMISSION_CREATE_AND_REVIEW_ERROR_ALL_STUDENT_FIELDS_BLANK'
                  ))
        if n > 1:
            raise forms.ValidationError(
                _('SUBMISSION_CREATE_AND_REVIEW_ERROR_ONLY_ONE_STUDENT_FIELD_CAN_BE_GIVEN'
                  ))
        return data

    @property
    def cleaned_students(self):
        data = self.cleaned_data
        for field in self.STUDENT_FIELDS:
            s = data.get(field)
            if s:
                return s
        raise RuntimeError("Didn't find any students")