def list(self, request): try: list_serializer_class = self.list_serializer_class except AttributeError: list_serializer_class = self.serializer_class serializer_context = {'request': request} try: queryset = self.get_queryset() except ValidationError: raise ApiValidationError(f'Invalid query parameters.') try: page = self.paginate_queryset(queryset) except FieldError: raise ApiValidationError(f'Invalid query parameters.') fields = request.query_params.get('fields', None) if fields is not None: fields = fields.split(',') serializer = list_serializer_class(page, context=serializer_context, many=True, fields=fields) return self.get_paginated_response(serializer.data)
def post(self, *args, **kwargs): old_password = self.request.data.get('old_password') new_password = self.request.data.get('new_password') user = self.request.user if not user.check_password(old_password): raise ApiValidationError({'old_password': '******'}) if not new_password: raise ApiValidationError({'new_password': '******'}) try: validate_password(new_password) except ValidationError as error: raise ApiValidationError({'password': error.messages[0]}) user.set_password(new_password) user.save() return Response({'message': 'New password set'})
def update(self, instance, validated_data): """ Surcharge la mise à jour de l'instance pour effectuer la validation complète :param instance: Instance à mettre à jour :param validated_data: Données validées :return: Instance mise à jour """ m2m_data = {} for attr, value in validated_data.items(): try: field = instance._meta.get_field(attr) if field.many_to_many: m2m_data[attr] = value continue except FieldDoesNotExist: continue setattr(instance, attr, value) try: instance.full_clean() instance.save() for attr, value in m2m_data.items(): getattr(instance, attr).set(value) except ModelValidationError as error: raise ApiValidationError(error.messages) return instance
def action_error(request, target, value): if value == '404': raise Http404() if value == '404_reason': raise Http404("something was removed") if value == 'perm': raise PermissionDenied("yo ain't doing that!") if value == 'invalid': raise ValidationError("invalid data here!") if value == 'api_invalid': raise ApiValidationError("invalid api data here!")
def create(self, validated_data): groups = validated_data.pop('groups', []) permissions = validated_data.pop('user_permissions', []) is_superuser = validated_data.pop('is_superuser', False) password = validated_data.get('password', None) try: validate_password(password) except ModelValidationError as error: raise ApiValidationError({'password': error.messages}) if is_superuser: user = User.objects.create_superuser(**validated_data) else: user = User.objects.create_user(**validated_data) user.groups.set(groups) user.user_permissions.set(permissions) return user
def update(self, instance, validated_data): groups = validated_data.pop('groups', None) or instance.groups.all() permissions = validated_data.pop( 'user_permissions', None) or instance.user_permissions.all() password = validated_data.pop('password', None) for attr, value in validated_data.items(): setattr(instance, attr, value) if password: try: validate_password(password, user=instance) except ModelValidationError as error: raise ApiValidationError({'password': error.messages}) instance.set_password(password) instance.save() instance.groups.set(groups) instance.user_permissions.set(permissions) return instance
def create(self, validated_data): """ Surcharge la création de l'instance pour effectuer la validation complète :param validated_data: Données validées :return: Instance créée """ try: model = self.Meta.model model_field_names = [field.name for field in model._meta.fields] instance = model( **{ key: value for key, value in validated_data.items() if key in model_field_names }) instance.full_clean() except ModelValidationError as error: raise ApiValidationError(error.messages) return super().create(validated_data)