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
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
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")
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
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
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")