def to_internal_value(self, data): try: http_prefix = data.startswith(('http:', 'https:')) except AttributeError: self.fail('incorrect_type', data_type=type(data).__name__) if http_prefix: # If needed convert absolute URLs to relative path data = urlparse.urlparse(data).path prefix = get_script_prefix() if data.startswith(prefix): data = '/' + data[len(prefix):] try: match = self.resolve(data) except Resolver404: self.fail('no_match') if match.view_name != self.view_name: self.fail('incorrect_match') try: return self.get_object(match.view_name, match.args, match.kwargs) except (ObjectDoesNotExist, TypeError, ValueError): self.fail('does_not_exist')
def from_native(self, value): # Convert URL -> model instance pk # TODO: Use values_list queryset = self.queryset if queryset is None: raise Exception('Writable related fields must include a `queryset` argument') try: http_prefix = value.startswith('http:') or value.startswith('https:') except AttributeError: msg = self.error_messages['incorrect_type'] raise ValidationError(msg % type(value).__name__) if http_prefix: # If needed convert absolute URLs to relative path value = urlparse.urlparse(value).path prefix = get_script_prefix() if value.startswith(prefix): value = '/' + value[len(prefix):] try: match = resolve(value) except Exception: raise ValidationError(self.error_messages['no_match']) if match.view_name != self.view_name: raise ValidationError(self.error_messages['incorrect_match']) try: return self.get_object(queryset, match.view_name, match.args, match.kwargs) except (ObjectDoesNotExist, TypeError, ValueError): raise ValidationError(self.error_messages['does_not_exist'])
def from_native(self, value): # Convert URL -> model instance pk # TODO: Use values_list queryset = self.queryset if queryset is None: raise Exception( 'Writable related fields must include a `queryset` argument') try: http_prefix = value.startswith(('http:', 'https:')) except AttributeError: msg = self.error_messages['incorrect_type'] raise ValidationError(msg % type(value).__name__) if http_prefix: # If needed convert absolute URLs to relative path value = urlparse.urlparse(value).path prefix = get_script_prefix() if value.startswith(prefix): value = '/' + value[len(prefix):] try: match = resolve(value) except Exception: raise ValidationError(self.error_messages['no_match']) if match.view_name != self.view_name: raise ValidationError(self.error_messages['incorrect_match']) try: return self.get_object(queryset, match.view_name, match.args, match.kwargs) except (ObjectDoesNotExist, TypeError, ValueError): raise ValidationError(self.error_messages['does_not_exist'])
def from_native(self, value): from django.core.urlresolvers import resolve from rest_framework.compat import urlparse value = urlparse.urlparse(value).path match = resolve(value) content_object = match.func.cls.queryset.get(**match.kwargs) return ObjectTask(content_object=content_object)
def get_paths(self, document): paths = {} tag = None for name, link in document.links.items(): path = urlparse.urlparse(link.url).path method = link.action.lower() paths.setdefault(path, {}) paths[path][method] = self.get_operation(link, name, tag=tag) for tag, section in document.data.items(): for name, link in section.links.items(): path = urlparse.urlparse(link.url).path method = link.action.lower() paths.setdefault(path, {}) paths[path][method] = self.get_operation(link, name, tag=tag) return paths
def from_native(self, value): # Convert URL -> model instance pk # TODO: Use values_list if self.queryset is None: raise Exception( 'Writable related fields must include a `queryset` argument') try: http_prefix = value.startswith('http:') or value.startswith( 'https:') except AttributeError: msg = self.error_messages['incorrect_type'] raise ValidationError(msg % type(value).__name__) if http_prefix: # If needed convert absolute URLs to relative path value = urlparse.urlparse(value).path prefix = get_script_prefix() if value.startswith(prefix): value = '/' + value[len(prefix):] try: match = resolve(value) except Exception: raise ValidationError(self.error_messages['no_match']) if match.view_name != self.view_name: raise ValidationError(self.error_messages['incorrect_match']) pk = match.kwargs.get(self.pk_url_kwarg, None) slug = match.kwargs.get(self.slug_url_kwarg, None) # Try explicit primary key. if pk is not None: queryset = self.queryset.filter(pk=pk) # Next, try looking up by slug. elif slug is not None: slug_field = self.get_slug_field() queryset = self.queryset.filter(**{slug_field: slug}) # If none of those are defined, it's probably a configuation error. else: raise ValidationError(self.error_messages['configuration_error']) try: obj = queryset.get() except ObjectDoesNotExist: raise ValidationError(self.error_messages['does_not_exist']) except (TypeError, ValueError): msg = self.error_messages['incorrect_type'] raise ValidationError(msg % type(value).__name__) return obj
def from_native(self, value): # Convert URL -> model instance pk # TODO: Use values_list if self.queryset is None: raise Exception('Writable related fields must include a `queryset` argument') try: http_prefix = value.startswith('http:') or value.startswith('https:') except AttributeError: msg = self.error_messages['incorrect_type'] raise ValidationError(msg % type(value).__name__) if http_prefix: # If needed convert absolute URLs to relative path value = urlparse.urlparse(value).path prefix = get_script_prefix() if value.startswith(prefix): value = '/' + value[len(prefix):] try: match = resolve(value) except Exception: raise ValidationError(self.error_messages['no_match']) if match.view_name != self.view_name: raise ValidationError(self.error_messages['incorrect_match']) pk = match.kwargs.get(self.pk_url_kwarg, None) slug = match.kwargs.get(self.slug_url_kwarg, None) # Try explicit primary key. if pk is not None: queryset = self.queryset.filter(pk=pk) # Next, try looking up by slug. elif slug is not None: slug_field = self.get_slug_field() queryset = self.queryset.filter(**{slug_field: slug}) # If none of those are defined, it's probably a configuation error. else: raise ValidationError(self.error_messages['configuration_error']) try: obj = queryset.get() except ObjectDoesNotExist: raise ValidationError(self.error_messages['does_not_exist']) except (TypeError, ValueError): msg = self.error_messages['incorrect_type'] raise ValidationError(msg % type(value).__name__) return obj
def patch(self, path, data={}, content_type=MULTIPART_CONTENT, **extra): "Construct a PATCH request." patch_data = self._encode_data(data, content_type) parsed = urlparse.urlparse(path) r = { 'CONTENT_LENGTH': len(patch_data), 'CONTENT_TYPE': content_type, 'PATH_INFO': self._get_path(parsed), 'QUERY_STRING': parsed[4], 'REQUEST_METHOD': 'PATCH', 'wsgi.input': FakePayload(patch_data), } r.update(extra) return self.request(**r)