Merge pull request #1 from tomchristie/master

sync with upstream
This commit is contained in:
pkrzyzaniak 2016-11-07 00:14:37 +08:00 committed by GitHub
commit aad0b03e74
250 changed files with 10319 additions and 6976 deletions

View File

@ -14,7 +14,6 @@ env:
- TOX_ENV=py35-django18 - TOX_ENV=py35-django18
- TOX_ENV=py34-django18 - TOX_ENV=py34-django18
- TOX_ENV=py33-django18 - TOX_ENV=py33-django18
- TOX_ENV=py32-django18
- TOX_ENV=py27-django18 - TOX_ENV=py27-django18
- TOX_ENV=py27-django110 - TOX_ENV=py27-django110
- TOX_ENV=py35-django110 - TOX_ENV=py35-django110

View File

@ -61,6 +61,7 @@ To run the tests, clone the repository, and then:
# Setup the virtual environment # Setup the virtual environment
virtualenv env virtualenv env
source env/bin/activate source env/bin/activate
pip install django
pip install -r requirements.txt pip install -r requirements.txt
# Run the tests # Run the tests

View File

@ -18,16 +18,16 @@ REST framework commercially we strongly encourage you to invest in its
continued development by **[signing up for a paid plan][funding]**. continued development by **[signing up for a paid plan][funding]**.
The initial aim is to provide a single full-time position on REST framework. The initial aim is to provide a single full-time position on REST framework.
Right now we're a little over 45% of the way towards achieving that. *Every single sign-up makes a significant impact towards making that possible.*
*Every single sign-up makes a significant impact.* Taking out a
[basic tier sponsorship](https://fund.django-rest-framework.org/topics/funding/#corporate-plans) moves us about 1% closer to our funding target.
<p align="center"> <p align="center">
<a href="http://jobs.rover.com/"><img src="https://raw.githubusercontent.com/tomchristie/django-rest-framework/master/docs/img/premium/rover-readme.png"/></a> <a href="http://jobs.rover.com/"><img src="https://raw.githubusercontent.com/tomchristie/django-rest-framework/master/docs/img/premium/rover-readme.png"/></a>
<a href="https://getsentry.com/welcome/"><img src="https://raw.githubusercontent.com/tomchristie/django-rest-framework/master/docs/img/premium/sentry-readme.png"/></a> <a href="https://getsentry.com/welcome/"><img src="https://raw.githubusercontent.com/tomchristie/django-rest-framework/master/docs/img/premium/sentry-readme.png"/></a>
<a href="https://getstream.io/?utm_source=drf&utm_medium=banner&utm_campaign=drf"><img src="https://raw.githubusercontent.com/tomchristie/django-rest-framework/master/docs/img/premium/stream-readme.png"/></a>
<a href="http://www.machinalis.com/#services"><img src="https://raw.githubusercontent.com/tomchristie/django-rest-framework/master/docs/img/premium/machinalis-readme.png"/></a>
</p> </p>
*Many thanks to all our [awesome sponsors][sponsors], and in particular to our premium backers, [Rover](http://jobs.rover.com/) and [Sentry](https://getsentry.com/welcome/).* *Many thanks to all our [wonderful sponsors][sponsors], and in particular to our premium backers, [Rover](http://jobs.rover.com/), [Sentry](https://getsentry.com/welcome/), [Stream](https://getstream.io/?utm_source=drf&utm_medium=banner&utm_campaign=drf), and [Machinalis](http://www.machinalis.com/#services).*
--- ---
@ -52,7 +52,7 @@ There is a live example API for testing purposes, [available here][sandbox].
# Requirements # Requirements
* Python (2.7, 3.2, 3.3, 3.4, 3.5) * Python (2.7, 3.2, 3.3, 3.4, 3.5)
* Django (1.8, 1.9) * Django (1.8, 1.9, 1.10)
# Installation # Installation
@ -170,7 +170,7 @@ You may also want to [follow the author on Twitter][twitter].
# Security # Security
If you believe youve found something in Django REST framework which has security implications, please **do not raise the issue in a public forum**. If you believe you've found something in Django REST framework which has security implications, please **do not raise the issue in a public forum**.
Send a description of the issue via email to [rest-framework-security@googlegroups.com][security-mail]. The project maintainers will then work with you to resolve any issues where required, prior to any public disclosure. Send a description of the issue via email to [rest-framework-security@googlegroups.com][security-mail]. The project maintainers will then work with you to resolve any issues where required, prior to any public disclosure.

View File

@ -44,7 +44,7 @@ The default authentication schemes may be set globally, using the `DEFAULT_AUTHE
} }
You can also set the authentication scheme on a per-view or per-viewset basis, You can also set the authentication scheme on a per-view or per-viewset basis,
using the `APIView` class based views. using the `APIView` class-based views.
from rest_framework.authentication import SessionAuthentication, BasicAuthentication from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import IsAuthenticated
@ -148,7 +148,7 @@ For clients to authenticate, the token key should be included in the `Authorizat
If successfully authenticated, `TokenAuthentication` provides the following credentials. If successfully authenticated, `TokenAuthentication` provides the following credentials.
* `request.user` will be a Django `User` instance. * `request.user` will be a Django `User` instance.
* `request.auth` will be a `rest_framework.authtoken.models.BasicToken` instance. * `request.auth` will be a `rest_framework.authtoken.models.Token` instance.
Unauthenticated responses that are denied permission will result in an `HTTP 401 Unauthorized` response with an appropriate WWW-Authenticate header. For example: Unauthenticated responses that are denied permission will result in an `HTTP 401 Unauthorized` response with an appropriate WWW-Authenticate header. For example:

View File

@ -77,7 +77,7 @@ The default content negotiation class may be set globally, using the `DEFAULT_CO
'DEFAULT_CONTENT_NEGOTIATION_CLASS': 'myapp.negotiation.IgnoreClientContentNegotiation', 'DEFAULT_CONTENT_NEGOTIATION_CLASS': 'myapp.negotiation.IgnoreClientContentNegotiation',
} }
You can also set the content negotiation used for an individual view, or viewset, using the `APIView` class based views. You can also set the content negotiation used for an individual view, or viewset, using the `APIView` class-based views.
from myapp.negotiation import IgnoreClientContentNegotiation from myapp.negotiation import IgnoreClientContentNegotiation
from rest_framework.response import Response from rest_framework.response import Response

View File

@ -98,7 +98,7 @@ Note that the exception handler will only be called for responses generated by r
The **base class** for all exceptions raised inside an `APIView` class or `@api_view`. The **base class** for all exceptions raised inside an `APIView` class or `@api_view`.
To provide a custom exception, subclass `APIException` and set the `.status_code` and `.default_detail` properties on the class. To provide a custom exception, subclass `APIException` and set the `.status_code`, `.default_detail`, and `default_code` attributes on the class.
For example, if your API relies on a third party service that may sometimes be unreachable, you might want to implement an exception for the "503 Service Unavailable" HTTP response code. You could do this like so: For example, if your API relies on a third party service that may sometimes be unreachable, you might want to implement an exception for the "503 Service Unavailable" HTTP response code. You could do this like so:
@ -107,10 +107,42 @@ For example, if your API relies on a third party service that may sometimes be u
class ServiceUnavailable(APIException): class ServiceUnavailable(APIException):
status_code = 503 status_code = 503
default_detail = 'Service temporarily unavailable, try again later.' default_detail = 'Service temporarily unavailable, try again later.'
default_code = 'service_unavailable'
#### Inspecting API exceptions
There are a number of different properties available for inspecting the status
of an API exception. You can use these to build custom exception handling
for your project.
The available attributes and methods are:
* `.detail` - Return the textual description of the error.
* `.get_codes()` - Return the code identifier of the error.
* `.get_full_details()` - Return both the textual description and the code identifier.
In most cases the error detail will be a simple item:
>>> print(exc.detail)
You do not have permission to perform this action.
>>> print(exc.get_codes())
permission_denied
>>> print(exc.get_full_details())
{'message':'You do not have permission to perform this action.','code':'permission_denied'}
In the case of validation errors the error detail will be either a list or
dictionary of items:
>>> print(exc.detail)
{"name":"This field is required.","age":"A valid integer is required."}
>>> print(exc.get_codes())
{"name":"required","age":"invalid"}
>>> print(exc.get_full_details())
{"name":{"message":"This field is required.","code":"required"},"age":{"message":"A valid integer is required.","code":"invalid"}}
## ParseError ## ParseError
**Signature:** `ParseError(detail=None)` **Signature:** `ParseError(detail=None, code=None)`
Raised if the request contains malformed data when accessing `request.data`. Raised if the request contains malformed data when accessing `request.data`.
@ -118,7 +150,7 @@ By default this exception results in a response with the HTTP status code "400 B
## AuthenticationFailed ## AuthenticationFailed
**Signature:** `AuthenticationFailed(detail=None)` **Signature:** `AuthenticationFailed(detail=None, code=None)`
Raised when an incoming request includes incorrect authentication. Raised when an incoming request includes incorrect authentication.
@ -126,7 +158,7 @@ By default this exception results in a response with the HTTP status code "401 U
## NotAuthenticated ## NotAuthenticated
**Signature:** `NotAuthenticated(detail=None)` **Signature:** `NotAuthenticated(detail=None, code=None)`
Raised when an unauthenticated request fails the permission checks. Raised when an unauthenticated request fails the permission checks.
@ -134,7 +166,7 @@ By default this exception results in a response with the HTTP status code "401 U
## PermissionDenied ## PermissionDenied
**Signature:** `PermissionDenied(detail=None)` **Signature:** `PermissionDenied(detail=None, code=None)`
Raised when an authenticated request fails the permission checks. Raised when an authenticated request fails the permission checks.
@ -142,7 +174,7 @@ By default this exception results in a response with the HTTP status code "403 F
## NotFound ## NotFound
**Signature:** `NotFound(detail=None)` **Signature:** `NotFound(detail=None, code=None)`
Raised when a resource does not exists at the given URL. This exception is equivalent to the standard `Http404` Django exception. Raised when a resource does not exists at the given URL. This exception is equivalent to the standard `Http404` Django exception.
@ -150,7 +182,7 @@ By default this exception results in a response with the HTTP status code "404 N
## MethodNotAllowed ## MethodNotAllowed
**Signature:** `MethodNotAllowed(method, detail=None)` **Signature:** `MethodNotAllowed(method, detail=None, code=None)`
Raised when an incoming request occurs that does not map to a handler method on the view. Raised when an incoming request occurs that does not map to a handler method on the view.
@ -158,7 +190,7 @@ By default this exception results in a response with the HTTP status code "405 M
## NotAcceptable ## NotAcceptable
**Signature:** `NotAcceptable(detail=None)` **Signature:** `NotAcceptable(detail=None, code=None)`
Raised when an incoming request occurs with an `Accept` header that cannot be satisfied by any of the available renderers. Raised when an incoming request occurs with an `Accept` header that cannot be satisfied by any of the available renderers.
@ -166,7 +198,7 @@ By default this exception results in a response with the HTTP status code "406 N
## UnsupportedMediaType ## UnsupportedMediaType
**Signature:** `UnsupportedMediaType(media_type, detail=None)` **Signature:** `UnsupportedMediaType(media_type, detail=None, code=None)`
Raised if there are no parsers that can handle the content type of the request data when accessing `request.data`. Raised if there are no parsers that can handle the content type of the request data when accessing `request.data`.
@ -174,7 +206,7 @@ By default this exception results in a response with the HTTP status code "415 U
## Throttled ## Throttled
**Signature:** `Throttled(wait=None, detail=None)` **Signature:** `Throttled(wait=None, detail=None, code=None)`
Raised when an incoming request fails the throttling checks. Raised when an incoming request fails the throttling checks.
@ -182,7 +214,7 @@ By default this exception results in a response with the HTTP status code "429 T
## ValidationError ## ValidationError
**Signature:** `ValidationError(detail)` **Signature:** `ValidationError(detail, code=None)`
The `ValidationError` exception is slightly different from the other `APIException` classes: The `ValidationError` exception is slightly different from the other `APIException` classes:

View File

@ -49,7 +49,9 @@ Defaults to `False`
### `default` ### `default`
If set, this gives the default value that will be used for the field if no input value is supplied. If not set the default behavior is to not populate the attribute at all. If set, this gives the default value that will be used for the field if no input value is supplied. If not set the default behaviour is to not populate the attribute at all.
The `default` is not applied during partial update operations. In the partial update case only fields that are provided in the incoming data will have a validated value returned.
May be set to a function or other callable, in which case the value will be evaluated each time it is used. When called, it will receive no arguments. If the callable has a `set_context` method, that will be called each time before getting the value with the field instance as only argument. This works the same way as for [validators](validators.md#using-set_context). May be set to a function or other callable, in which case the value will be evaluated each time it is used. When called, it will receive no arguments. If the callable has a `set_context` method, that will be called each time before getting the value with the field instance as only argument. This works the same way as for [validators](validators.md#using-set_context).
@ -261,9 +263,10 @@ Corresponds to `django.db.models.fields.DecimalField`.
- `max_digits` The maximum number of digits allowed in the number. Note that this number must be greater than or equal to decimal_places. - `max_digits` The maximum number of digits allowed in the number. Note that this number must be greater than or equal to decimal_places.
- `decimal_places` The number of decimal places to store with the number. - `decimal_places` The number of decimal places to store with the number.
- `coerce_to_string` Set to `True` if string values should be returned for the representation, or `False` if `Decimal` objects should be returned. Defaults to the same value as the `COERCE_DECIMAL_TO_STRING` settings key, which will be `True` unless overridden. If `Decimal` objects are returned by the serializer, then the final output format will be determined by the renderer. - `coerce_to_string` Set to `True` if string values should be returned for the representation, or `False` if `Decimal` objects should be returned. Defaults to the same value as the `COERCE_DECIMAL_TO_STRING` settings key, which will be `True` unless overridden. If `Decimal` objects are returned by the serializer, then the final output format will be determined by the renderer. Note that setting `localize` will force the value to `True`.
- `max_value` Validate that the number provided is no greater than this value. - `max_value` Validate that the number provided is no greater than this value.
- `min_value` Validate that the number provided is no less than this value. - `min_value` Validate that the number provided is no less than this value.
- `localize` Set to `True` to enable localization of input and output based on the current locale. This will also force `coerce_to_string` to `True`. Defaults to `False`. Note that data formatting is enabled if you have set `USE_L10N=True` in your settings file.
#### Example usage #### Example usage
@ -289,7 +292,7 @@ A date and time representation.
Corresponds to `django.db.models.fields.DateTimeField`. Corresponds to `django.db.models.fields.DateTimeField`.
**Signature:** `DateTimeField(format=None, input_formats=None)` **Signature:** `DateTimeField(format=api_settings.DATETIME_FORMAT, input_formats=None)`
* `format` - A string representing the output format. If not specified, this defaults to the same value as the `DATETIME_FORMAT` settings key, which will be `'iso-8601'` unless set. Setting to a format string indicates that `to_representation` return values should be coerced to string output. Format strings are described below. Setting this value to `None` indicates that Python `datetime` objects should be returned by `to_representation`. In this case the datetime encoding will be determined by the renderer. * `format` - A string representing the output format. If not specified, this defaults to the same value as the `DATETIME_FORMAT` settings key, which will be `'iso-8601'` unless set. Setting to a format string indicates that `to_representation` return values should be coerced to string output. Format strings are described below. Setting this value to `None` indicates that Python `datetime` objects should be returned by `to_representation`. In this case the datetime encoding will be determined by the renderer.
* `input_formats` - A list of strings representing the input formats which may be used to parse the date. If not specified, the `DATETIME_INPUT_FORMATS` setting will be used, which defaults to `['iso-8601']`. * `input_formats` - A list of strings representing the input formats which may be used to parse the date. If not specified, the `DATETIME_INPUT_FORMATS` setting will be used, which defaults to `['iso-8601']`.
@ -320,7 +323,7 @@ A date representation.
Corresponds to `django.db.models.fields.DateField` Corresponds to `django.db.models.fields.DateField`
**Signature:** `DateField(format=None, input_formats=None)` **Signature:** `DateField(format=api_settings.DATE_FORMAT, input_formats=None)`
* `format` - A string representing the output format. If not specified, this defaults to the same value as the `DATE_FORMAT` settings key, which will be `'iso-8601'` unless set. Setting to a format string indicates that `to_representation` return values should be coerced to string output. Format strings are described below. Setting this value to `None` indicates that Python `date` objects should be returned by `to_representation`. In this case the date encoding will be determined by the renderer. * `format` - A string representing the output format. If not specified, this defaults to the same value as the `DATE_FORMAT` settings key, which will be `'iso-8601'` unless set. Setting to a format string indicates that `to_representation` return values should be coerced to string output. Format strings are described below. Setting this value to `None` indicates that Python `date` objects should be returned by `to_representation`. In this case the date encoding will be determined by the renderer.
* `input_formats` - A list of strings representing the input formats which may be used to parse the date. If not specified, the `DATE_INPUT_FORMATS` setting will be used, which defaults to `['iso-8601']`. * `input_formats` - A list of strings representing the input formats which may be used to parse the date. If not specified, the `DATE_INPUT_FORMATS` setting will be used, which defaults to `['iso-8601']`.
@ -335,7 +338,7 @@ A time representation.
Corresponds to `django.db.models.fields.TimeField` Corresponds to `django.db.models.fields.TimeField`
**Signature:** `TimeField(format=None, input_formats=None)` **Signature:** `TimeField(format=api_settings.TIME_FORMAT, input_formats=None)`
* `format` - A string representing the output format. If not specified, this defaults to the same value as the `TIME_FORMAT` settings key, which will be `'iso-8601'` unless set. Setting to a format string indicates that `to_representation` return values should be coerced to string output. Format strings are described below. Setting this value to `None` indicates that Python `time` objects should be returned by `to_representation`. In this case the time encoding will be determined by the renderer. * `format` - A string representing the output format. If not specified, this defaults to the same value as the `TIME_FORMAT` settings key, which will be `'iso-8601'` unless set. Setting to a format string indicates that `to_representation` return values should be coerced to string output. Format strings are described below. Setting this value to `None` indicates that Python `time` objects should be returned by `to_representation`. In this case the time encoding will be determined by the renderer.
* `input_formats` - A list of strings representing the input formats which may be used to parse the date. If not specified, the `TIME_INPUT_FORMATS` setting will be used, which defaults to `['iso-8601']`. * `input_formats` - A list of strings representing the input formats which may be used to parse the date. If not specified, the `TIME_INPUT_FORMATS` setting will be used, which defaults to `['iso-8601']`.
@ -485,7 +488,7 @@ This field is used by default with `ModelSerializer` when including field names
**Signature**: `ReadOnlyField()` **Signature**: `ReadOnlyField()`
For example, is `has_expired` was a property on the `Account` model, then the following serializer would automatically generate it as a `ReadOnlyField`: For example, if `has_expired` was a property on the `Account` model, then the following serializer would automatically generate it as a `ReadOnlyField`:
class AccountSerializer(serializers.ModelSerializer): class AccountSerializer(serializers.ModelSerializer):
class Meta: class Meta:
@ -623,7 +626,6 @@ The `.fail()` method is a shortcut for raising `ValidationError` that takes a me
def to_internal_value(self, data): def to_internal_value(self, data):
if not isinstance(data, six.text_type): if not isinstance(data, six.text_type):
msg = 'Incorrect type. Expected a string, but got %s'
self.fail('incorrect_type', input_type=type(data).__name__) self.fail('incorrect_type', input_type=type(data).__name__)
if not re.match(r'^rgb\([0-9]+,[0-9]+,[0-9]+\)$', data): if not re.match(r'^rgb\([0-9]+,[0-9]+,[0-9]+\)$', data):

View File

@ -92,21 +92,21 @@ Generic filters can also present themselves as HTML controls in the browsable AP
The default filter backends may be set globally, using the `DEFAULT_FILTER_BACKENDS` setting. For example. The default filter backends may be set globally, using the `DEFAULT_FILTER_BACKENDS` setting. For example.
REST_FRAMEWORK = { REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',) 'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
} }
You can also set the filter backends on a per-view, or per-viewset basis, You can also set the filter backends on a per-view, or per-viewset basis,
using the `GenericAPIView` class based views. using the `GenericAPIView` class-based views.
import django_filters
from django.contrib.auth.models import User from django.contrib.auth.models import User
from myapp.serializers import UserSerializer from myapp.serializers import UserSerializer
from rest_framework import filters
from rest_framework import generics from rest_framework import generics
class UserListView(generics.ListAPIView): class UserListView(generics.ListAPIView):
queryset = User.objects.all() queryset = User.objects.all()
serializer_class = UserSerializer serializer_class = UserSerializer
filter_backends = (filters.DjangoFilterBackend,) filter_backends = (django_filters.rest_framework.DjangoFilterBackend,)
## Filtering and object lookups ## Filtering and object lookups
@ -139,12 +139,27 @@ Note that you can use both an overridden `.get_queryset()` and generic filtering
## DjangoFilterBackend ## DjangoFilterBackend
The `DjangoFilterBackend` class supports highly customizable field filtering, using the [django-filter package][django-filter]. The `django-filter` library includes a `DjangoFilterBackend` class which
supports highly customizable field filtering for REST framework.
To use REST framework's `DjangoFilterBackend`, first install `django-filter`. To use `DjangoFilterBackend`, first install `django-filter`.
pip install django-filter pip install django-filter
You should now either add the filter backend to your settings:
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}
Or add the filter backend to an individual View or ViewSet.
from django_filters.rest_framework import DjangoFilterBackend
class UserListView(generics.ListAPIView):
...
filter_backends = (DjangoFilterBackend,)
If you are using the browsable API or admin API you may also want to install `django-crispy-forms`, which will enhance the presentation of the filter forms in HTML views, by allowing them to render Bootstrap 3 HTML. If you are using the browsable API or admin API you may also want to install `django-crispy-forms`, which will enhance the presentation of the filter forms in HTML views, by allowing them to render Bootstrap 3 HTML.
pip install django-crispy-forms pip install django-crispy-forms
@ -174,12 +189,11 @@ For more advanced filtering requirements you can specify a `FilterSet` class tha
import django_filters import django_filters
from myapp.models import Product from myapp.models import Product
from myapp.serializers import ProductSerializer from myapp.serializers import ProductSerializer
from rest_framework import filters
from rest_framework import generics from rest_framework import generics
class ProductFilter(filters.FilterSet): class ProductFilter(django_filters.rest_framework.FilterSet):
min_price = django_filters.NumberFilter(name="price", lookup_type='gte') min_price = django_filters.NumberFilter(name="price", lookup_expr='gte')
max_price = django_filters.NumberFilter(name="price", lookup_type='lte') max_price = django_filters.NumberFilter(name="price", lookup_expr='lte')
class Meta: class Meta:
model = Product model = Product
fields = ['category', 'in_stock', 'min_price', 'max_price'] fields = ['category', 'in_stock', 'min_price', 'max_price']
@ -187,7 +201,7 @@ For more advanced filtering requirements you can specify a `FilterSet` class tha
class ProductList(generics.ListAPIView): class ProductList(generics.ListAPIView):
queryset = Product.objects.all() queryset = Product.objects.all()
serializer_class = ProductSerializer serializer_class = ProductSerializer
filter_backends = (filters.DjangoFilterBackend,) filter_backends = (django_filters.rest_framework.DjangoFilterBackend,)
filter_class = ProductFilter filter_class = ProductFilter
@ -199,12 +213,12 @@ You can also span relationships using `django-filter`, let's assume that each
product has foreign key to `Manufacturer` model, so we create filter that product has foreign key to `Manufacturer` model, so we create filter that
filters using `Manufacturer` name. For example: filters using `Manufacturer` name. For example:
import django_filters
from myapp.models import Product from myapp.models import Product
from myapp.serializers import ProductSerializer from myapp.serializers import ProductSerializer
from rest_framework import filters
from rest_framework import generics from rest_framework import generics
class ProductFilter(filters.FilterSet): class ProductFilter(django_filters.rest_framework.FilterSet):
class Meta: class Meta:
model = Product model = Product
fields = ['category', 'in_stock', 'manufacturer__name'] fields = ['category', 'in_stock', 'manufacturer__name']
@ -218,10 +232,9 @@ This is nice, but it exposes the Django's double underscore convention as part o
import django_filters import django_filters
from myapp.models import Product from myapp.models import Product
from myapp.serializers import ProductSerializer from myapp.serializers import ProductSerializer
from rest_framework import filters
from rest_framework import generics from rest_framework import generics
class ProductFilter(filters.FilterSet): class ProductFilter(django_filters.rest_framework.FilterSet):
manufacturer = django_filters.CharFilter(name="manufacturer__name") manufacturer = django_filters.CharFilter(name="manufacturer__name")
class Meta: class Meta:
@ -241,7 +254,6 @@ For more details on using filter sets see the [django-filter documentation][djan
* By default filtering is not enabled. If you want to use `DjangoFilterBackend` remember to make sure it is installed by using the `'DEFAULT_FILTER_BACKENDS'` setting. * By default filtering is not enabled. If you want to use `DjangoFilterBackend` remember to make sure it is installed by using the `'DEFAULT_FILTER_BACKENDS'` setting.
* When using boolean fields, you should use the values `True` and `False` in the URL query parameters, rather than `0`, `1`, `true` or `false`. (The allowed boolean values are currently hardwired in Django's [NullBooleanSelect implementation][nullbooleanselect].) * When using boolean fields, you should use the values `True` and `False` in the URL query parameters, rather than `0`, `1`, `true` or `false`. (The allowed boolean values are currently hardwired in Django's [NullBooleanSelect implementation][nullbooleanselect].)
* `django-filter` supports filtering across relationships, using Django's double-underscore syntax. * `django-filter` supports filtering across relationships, using Django's double-underscore syntax.
* For Django 1.3 support, make sure to install `django-filter` version 0.5.4, as later versions drop support for 1.3.
--- ---
@ -417,6 +429,12 @@ Generic filters may also present an interface in the browsable API. To do so you
The method should return a rendered HTML string. The method should return a rendered HTML string.
## Pagination & schemas
You can also make the filter controls available to the schema autogeneration
that REST framework provides, by implementing a `get_schema_fields()` method,
which should return a list of `coreapi.Field` instances.
# Third party packages # Third party packages
The following third party packages provide additional filter implementations. The following third party packages provide additional filter implementations.
@ -433,6 +451,10 @@ The [djangorestframework-word-filter][django-rest-framework-word-search-filter]
[django-url-filter][django-url-filter] provides a safe way to filter data via human-friendly URLs. It works very similar to DRF serializers and fields in a sense that they can be nested except they are called filtersets and filters. That provides easy way to filter related data. Also this library is generic-purpose so it can be used to filter other sources of data and not only Django `QuerySet`s. [django-url-filter][django-url-filter] provides a safe way to filter data via human-friendly URLs. It works very similar to DRF serializers and fields in a sense that they can be nested except they are called filtersets and filters. That provides easy way to filter related data. Also this library is generic-purpose so it can be used to filter other sources of data and not only Django `QuerySet`s.
## drf-url-filters
[drf-url-filter][drf-url-filter] is a simple Django app to apply filters on drf `ModelViewSet`'s `Queryset` in a clean, simple and configurable way. It also supports validations on incoming query params and their values. A beautiful python package `Voluptuous` is being used for validations on the incoming query parameters. The best part about voluptuous is you can define your own validations as per your query params requirements.
[cite]: https://docs.djangoproject.com/en/dev/topics/db/queries/#retrieving-specific-objects-with-filters [cite]: https://docs.djangoproject.com/en/dev/topics/db/queries/#retrieving-specific-objects-with-filters
[django-filter]: https://github.com/alex/django-filter [django-filter]: https://github.com/alex/django-filter
[django-filter-docs]: https://django-filter.readthedocs.io/en/latest/index.html [django-filter-docs]: https://django-filter.readthedocs.io/en/latest/index.html
@ -444,3 +466,4 @@ The [djangorestframework-word-filter][django-rest-framework-word-search-filter]
[django-rest-framework-filters]: https://github.com/philipn/django-rest-framework-filters [django-rest-framework-filters]: https://github.com/philipn/django-rest-framework-filters
[django-rest-framework-word-search-filter]: https://github.com/trollknurr/django-rest-framework-word-search-filter [django-rest-framework-word-search-filter]: https://github.com/trollknurr/django-rest-framework-word-search-filter
[django-url-filter]: https://github.com/miki725/django-url-filter [django-url-filter]: https://github.com/miki725/django-url-filter
[drf-url-filter]: https://github.com/manjitkumar/drf-url-filters

View File

@ -42,7 +42,7 @@ When using `format_suffix_patterns`, you must make sure to add the `'format'` ke
def comment_list(request, format=None): def comment_list(request, format=None):
# do stuff... # do stuff...
Or with class based views: Or with class-based views:
class CommentList(APIView): class CommentList(APIView):
def get(self, request, format=None): def get(self, request, format=None):

View File

@ -7,7 +7,7 @@ source: mixins.py
> >
> &mdash; [Django Documentation][cite] > &mdash; [Django Documentation][cite]
One of the key benefits of class based views is the way they allow you to compose bits of reusable behavior. REST framework takes advantage of this by providing a number of pre-built views that provide for commonly used patterns. One of the key benefits of class-based views is the way they allow you to compose bits of reusable behavior. REST framework takes advantage of this by providing a number of pre-built views that provide for commonly used patterns.
The generic views provided by REST framework allow you to quickly build API views that map closely to your database models. The generic views provided by REST framework allow you to quickly build API views that map closely to your database models.
@ -220,8 +220,6 @@ Also provides a `.partial_update(request, *args, **kwargs)` method, which is sim
If an object is updated this returns a `200 OK` response, with a serialized representation of the object as the body of the response. If an object is updated this returns a `200 OK` response, with a serialized representation of the object as the body of the response.
If an object is created, for example when making a `DELETE` request followed by a `PUT` request to the same URL, this returns a `201 Created` response, with a serialized representation of the object as the body of the response.
If the request data provided for updating the object was invalid, a `400 Bad Request` response will be returned, with the error details as the body of the response. If the request data provided for updating the object was invalid, a `400 Bad Request` response will be returned, with the error details as the body of the response.
## DestroyModelMixin ## DestroyModelMixin
@ -330,6 +328,7 @@ For example, if you need to lookup objects based on multiple fields in the URL c
queryset = self.filter_queryset(queryset) # Apply any filter backends queryset = self.filter_queryset(queryset) # Apply any filter backends
filter = {} filter = {}
for field in self.lookup_fields: for field in self.lookup_fields:
if self.kwargs[field]: # Ignore empty fields.
filter[field] = self.kwargs[field] filter[field] = self.kwargs[field]
return get_object_or_404(queryset, **filter) # Lookup the object return get_object_or_404(queryset, **filter) # Lookup the object

View File

@ -21,12 +21,15 @@ Pagination can be turned off by setting the pagination class to `None`.
## Setting the pagination style ## Setting the pagination style
The default pagination style may be set globally, using the `DEFAULT_PAGINATION_CLASS` settings key. For example, to use the built-in limit/offset pagination, you would do: The default pagination style may be set globally, using the `DEFAULT_PAGINATION_CLASS` and `PAGE_SIZE` setting keys. For example, to use the built-in limit/offset pagination, you would do something like this:
REST_FRAMEWORK = { REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination' 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 100
} }
Note that you need to set both the pagination class, and the page size that should be used.
You can also set the pagination class on an individual view by using the `pagination_class` attribute. Typically you'll want to use the same pagination style throughout your API, although you might want to vary individual aspects of the pagination, such as default or maximum page size, on a per-view basis. You can also set the pagination class on an individual view by using the `pagination_class` attribute. Typically you'll want to use the same pagination style throughout your API, although you might want to vary individual aspects of the pagination, such as default or maximum page size, on a per-view basis.
## Modifying the pagination style ## Modifying the pagination style
@ -273,6 +276,12 @@ To have your custom pagination class be used by default, use the `DEFAULT_PAGINA
API responses for list endpoints will now include a `Link` header, instead of including the pagination links as part of the body of the response, for example: API responses for list endpoints will now include a `Link` header, instead of including the pagination links as part of the body of the response, for example:
## Pagination & schemas
You can also make the pagination controls available to the schema autogeneration
that REST framework provides, by implementing a `get_schema_fields()` method,
which should return a list of `coreapi.Field` instances.
--- ---
![Link Header][link-header] ![Link Header][link-header]
@ -312,9 +321,14 @@ The following third party packages are also available.
The [`DRF-extensions` package][drf-extensions] includes a [`PaginateByMaxMixin` mixin class][paginate-by-max-mixin] that allows your API clients to specify `?page_size=max` to obtain the maximum allowed page size. The [`DRF-extensions` package][drf-extensions] includes a [`PaginateByMaxMixin` mixin class][paginate-by-max-mixin] that allows your API clients to specify `?page_size=max` to obtain the maximum allowed page size.
## drf-proxy-pagination
The [`drf-proxy-pagination` package][drf-proxy-pagination] includes a `ProxyPagination` class which allows to choose pagination class with a query parameter.
[cite]: https://docs.djangoproject.com/en/dev/topics/pagination/ [cite]: https://docs.djangoproject.com/en/dev/topics/pagination/
[github-link-pagination]: https://developer.github.com/guides/traversing-with-pagination/ [github-link-pagination]: https://developer.github.com/guides/traversing-with-pagination/
[link-header]: ../img/link-header-pagination.png [link-header]: ../img/link-header-pagination.png
[drf-extensions]: http://chibisov.github.io/drf-extensions/docs/ [drf-extensions]: http://chibisov.github.io/drf-extensions/docs/
[paginate-by-max-mixin]: http://chibisov.github.io/drf-extensions/docs/#paginatebymaxmixin [paginate-by-max-mixin]: http://chibisov.github.io/drf-extensions/docs/#paginatebymaxmixin
[drf-proxy-pagination]: https://github.com/tuffnatty/drf-proxy-pagination
[disqus-cursor-api]: http://cramer.io/2011/03/08/building-cursors-for-the-disqus-api [disqus-cursor-api]: http://cramer.io/2011/03/08/building-cursors-for-the-disqus-api

View File

@ -35,7 +35,7 @@ The default set of parsers may be set globally, using the `DEFAULT_PARSER_CLASSE
} }
You can also set the parsers used for an individual view, or viewset, You can also set the parsers used for an individual view, or viewset,
using the `APIView` class based views. using the `APIView` class-based views.
from rest_framework.parsers import JSONParser from rest_framework.parsers import JSONParser
from rest_framework.response import Response from rest_framework.response import Response

View File

@ -71,7 +71,7 @@ If not specified, this setting defaults to allowing unrestricted access:
) )
You can also set the authentication policy on a per-view, or per-viewset basis, You can also set the authentication policy on a per-view, or per-viewset basis,
using the `APIView` class based views. using the `APIView` class-based views.
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response from rest_framework.response import Response
@ -92,7 +92,7 @@ Or, if you're using the `@api_view` decorator with function based views.
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response from rest_framework.response import Response
@api_view('GET') @api_view(['GET'])
@permission_classes((IsAuthenticated, )) @permission_classes((IsAuthenticated, ))
def example_view(request, format=None): def example_view(request, format=None):
content = { content = {
@ -132,7 +132,7 @@ This permission is suitable if you want to your API to allow read permissions to
## DjangoModelPermissions ## DjangoModelPermissions
This permission class ties into Django's standard `django.contrib.auth` [model permissions][contribauth]. This permission must only be applied to views that has a `.queryset` property set. Authorization will only be granted if the user *is authenticated* and has the *relevant model permissions* assigned. This permission class ties into Django's standard `django.contrib.auth` [model permissions][contribauth]. This permission must only be applied to views that have a `.queryset` property set. Authorization will only be granted if the user *is authenticated* and has the *relevant model permissions* assigned.
* `POST` requests require the user to have the `add` permission on the model. * `POST` requests require the user to have the `add` permission on the model.
* `PUT` and `PATCH` requests require the user to have the `change` permission on the model. * `PUT` and `PATCH` requests require the user to have the `change` permission on the model.
@ -261,6 +261,10 @@ The [REST Condition][rest-condition] package is another extension for building c
The [DRY Rest Permissions][dry-rest-permissions] package provides the ability to define different permissions for individual default and custom actions. This package is made for apps with permissions that are derived from relationships defined in the app's data model. It also supports permission checks being returned to a client app through the API's serializer. Additionally it supports adding permissions to the default and custom list actions to restrict the data they retrive per user. The [DRY Rest Permissions][dry-rest-permissions] package provides the ability to define different permissions for individual default and custom actions. This package is made for apps with permissions that are derived from relationships defined in the app's data model. It also supports permission checks being returned to a client app through the API's serializer. Additionally it supports adding permissions to the default and custom list actions to restrict the data they retrive per user.
## Django Rest Framework Roles
The [Django Rest Framework Roles][django-rest-framework-roles] package makes it easier to parameterize your API over multiple types of users.
[cite]: https://developer.apple.com/library/mac/#documentation/security/Conceptual/AuthenticationAndAuthorizationGuide/Authorization/Authorization.html [cite]: https://developer.apple.com/library/mac/#documentation/security/Conceptual/AuthenticationAndAuthorizationGuide/Authorization/Authorization.html
[authentication]: authentication.md [authentication]: authentication.md
[throttling]: throttling.md [throttling]: throttling.md
@ -275,3 +279,4 @@ The [DRY Rest Permissions][dry-rest-permissions] package provides the ability to
[composed-permissions]: https://github.com/niwibe/djangorestframework-composed-permissions [composed-permissions]: https://github.com/niwibe/djangorestframework-composed-permissions
[rest-condition]: https://github.com/caxap/rest_condition [rest-condition]: https://github.com/caxap/rest_condition
[dry-rest-permissions]: https://github.com/Helioscene/dry-rest-permissions [dry-rest-permissions]: https://github.com/Helioscene/dry-rest-permissions
[django-rest-framework-roles]: https://github.com/computer-lab/django-rest-framework-roles

View File

@ -39,7 +39,7 @@ In order to explain the various types of relational fields, we'll use a couple o
artist = models.CharField(max_length=100) artist = models.CharField(max_length=100)
class Track(models.Model): class Track(models.Model):
album = models.ForeignKey(Album, related_name='tracks') album = models.ForeignKey(Album, related_name='tracks', on_delete=models.CASCADE)
order = models.IntegerField() order = models.IntegerField()
title = models.CharField(max_length=100) title = models.CharField(max_length=100)
duration = models.IntegerField() duration = models.IntegerField()
@ -99,8 +99,8 @@ For example, the following serializer:
Would serialize to a representation like this: Would serialize to a representation like this:
{ {
'album_name': 'The Roots', 'album_name': 'Undun',
'artist': 'Undun', 'artist': 'The Roots',
'tracks': [ 'tracks': [
89, 89,
90, 90,
@ -286,7 +286,7 @@ Would serialize to a nested representation like this:
], ],
} }
# Writable nested serializers ## Writable nested serializers
By default nested serializers are read-only. If you want to support write-operations to a nested serializer field you'll need to create `create()` and/or `update()` methods in order to explicitly specify how the child relationships should be saved. By default nested serializers are read-only. If you want to support write-operations to a nested serializer field you'll need to create `create()` and/or `update()` methods in order to explicitly specify how the child relationships should be saved.
@ -324,8 +324,14 @@ By default nested serializers are read-only. If you want to support write-operat
>>> serializer.save() >>> serializer.save()
<Album: Album object> <Album: Album object>
---
# Custom relational fields # Custom relational fields
In rare cases where none of the existing relational styles fit the representation you need,
you can implement a completely custom relational field, that describes exactly how the
output representation should be generated from the model instance.
To implement a custom relational field, you should override `RelatedField`, and implement the `.to_representation(self, value)` method. This method takes the target of the field as the `value` argument, and should return the representation that should be used to serialize the target. The `value` argument will typically be a model instance. To implement a custom relational field, you should override `RelatedField`, and implement the `.to_representation(self, value)` method. This method takes the target of the field as the `value` argument, and should return the representation that should be used to serialize the target. The `value` argument will typically be a model instance.
If you want to implement a read-write relational field, you must also implement the `.to_internal_value(self, data)` method. If you want to implement a read-write relational field, you must also implement the `.to_internal_value(self, data)` method.
@ -457,6 +463,8 @@ There are two keyword arguments you can use to control this behavior:
- `html_cutoff` - If set this will be the maximum number of choices that will be displayed by a HTML select drop down. Set to `None` to disable any limiting. Defaults to `1000`. - `html_cutoff` - If set this will be the maximum number of choices that will be displayed by a HTML select drop down. Set to `None` to disable any limiting. Defaults to `1000`.
- `html_cutoff_text` - If set this will display a textual indicator if the maximum number of items have been cutoff in an HTML select drop down. Defaults to `"More than {count} items…"` - `html_cutoff_text` - If set this will display a textual indicator if the maximum number of items have been cutoff in an HTML select drop down. Defaults to `"More than {count} items…"`
You can also control these globally using the settings `HTML_SELECT_CUTOFF` and `HTML_SELECT_CUTOFF_TEXT`.
In cases where the cutoff is being enforced you may want to instead use a plain input field in the HTML form. You can do so using the `style` keyword argument. For example: In cases where the cutoff is being enforced you may want to instead use a plain input field in the HTML form. You can do so using the `style` keyword argument. For example:
assigned_to = serializers.SlugRelatedField( assigned_to = serializers.SlugRelatedField(
@ -476,7 +484,7 @@ Note that reverse relationships are not automatically included by the `ModelSeri
You'll normally want to ensure that you've set an appropriate `related_name` argument on the relationship, that you can use as the field name. For example: You'll normally want to ensure that you've set an appropriate `related_name` argument on the relationship, that you can use as the field name. For example:
class Track(models.Model): class Track(models.Model):
album = models.ForeignKey(Album, related_name='tracks') album = models.ForeignKey(Album, related_name='tracks', on_delete=models.CASCADE)
... ...
If you have not set a related name for the reverse relationship, you'll need to use the automatically generated related name in the `fields` argument. For example: If you have not set a related name for the reverse relationship, you'll need to use the automatically generated related name in the `fields` argument. For example:
@ -500,7 +508,7 @@ For example, given the following model for a tag, which has a generic relationsh
See: https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/ See: https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/
""" """
tag_name = models.SlugField() tag_name = models.SlugField()
content_type = models.ForeignKey(ContentType) content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField() object_id = models.PositiveIntegerField()
tagged_object = GenericForeignKey('content_type', 'object_id') tagged_object = GenericForeignKey('content_type', 'object_id')

View File

@ -28,7 +28,7 @@ The default set of renderers may be set globally, using the `DEFAULT_RENDERER_CL
} }
You can also set the renderers used for an individual view, or viewset, You can also set the renderers used for an individual view, or viewset,
using the `APIView` class based views. using the `APIView` class-based views.
from django.contrib.auth.models import User from django.contrib.auth.models import User
from rest_framework.renderers import JSONRenderer from rest_framework.renderers import JSONRenderer

View File

@ -23,7 +23,7 @@ There's no requirement for you to use them, but if you do then the self-describi
**Signature:** `reverse(viewname, *args, **kwargs)` **Signature:** `reverse(viewname, *args, **kwargs)`
Has the same behavior as [`django.core.urlresolvers.reverse`][reverse], except that it returns a fully qualified URL, using the request to determine the host and port. Has the same behavior as [`django.urls.reverse`][reverse], except that it returns a fully qualified URL, using the request to determine the host and port.
You should **include the request as a keyword argument** to the function, for example: You should **include the request as a keyword argument** to the function, for example:
@ -44,7 +44,7 @@ You should **include the request as a keyword argument** to the function, for ex
**Signature:** `reverse_lazy(viewname, *args, **kwargs)` **Signature:** `reverse_lazy(viewname, *args, **kwargs)`
Has the same behavior as [`django.core.urlresolvers.reverse_lazy`][reverse-lazy], except that it returns a fully qualified URL, using the request to determine the host and port. Has the same behavior as [`django.urls.reverse_lazy`][reverse-lazy], except that it returns a fully qualified URL, using the request to determine the host and port.
As with the `reverse` function, you should **include the request as a keyword argument** to the function, for example: As with the `reverse` function, you should **include the request as a keyword argument** to the function, for example:

View File

@ -68,7 +68,7 @@ has to be rendered into the actual bytes that are used in the response.
REST framework includes a renderer class for handling this media type, which REST framework includes a renderer class for handling this media type, which
is available as `renderers.CoreJSONRenderer`. is available as `renderers.CoreJSONRenderer`.
Other schema formats such as [Open API][open-api] (Formerly "Swagger"), Other schema formats such as [Open API][open-api] ("Swagger"),
[JSON HyperSchema][json-hyperschema], or [API Blueprint][api-blueprint] can [JSON HyperSchema][json-hyperschema], or [API Blueprint][api-blueprint] can
also be supported by implementing a custom renderer class. also be supported by implementing a custom renderer class.
@ -102,15 +102,20 @@ REST framework includes functionality for auto-generating a schema,
or allows you to specify one explicitly. There are a few different ways to or allows you to specify one explicitly. There are a few different ways to
add a schema to your API, depending on exactly what you need. add a schema to your API, depending on exactly what you need.
## Using DefaultRouter ## The get_schema_view shortcut
If you're using `DefaultRouter` then you can include an auto-generated schema, The simplest way to include a schema in your project is to use the
simply by adding a `schema_title` argument to the router. `get_schema_view()` function.
router = DefaultRouter(schema_title='Server Monitoring API') schema_view = get_schema_view(title="Server Monitoring API")
The schema will be included at the root URL, `/`, and presented to clients urlpatterns = [
that include the Core JSON media type in their `Accept` header. url('^$', schema_view),
...
]
Once the view has been added, you'll be able to make API requests to retrieve
the auto-generated schema definition.
$ http http://127.0.0.1:8000/ Accept:application/vnd.coreapi+json $ http http://127.0.0.1:8000/ Accept:application/vnd.coreapi+json
HTTP/1.0 200 OK HTTP/1.0 200 OK
@ -125,18 +130,43 @@ that include the Core JSON media type in their `Accept` header.
... ...
} }
This is a great zero-configuration option for when you want to get up and The arguments to `get_schema_view()` are:
running really quickly. If you want a little more flexibility over the
schema output then you'll need to consider using `SchemaGenerator` instead.
## Using SchemaGenerator #### `title`
The most common way to add a schema to your API is to use the `SchemaGenerator` May be used to provide a descriptive title for the schema definition.
class to auto-generate the `Document` instance, and to return that from a view.
#### `url`
May be used to pass a canonical URL for the schema.
schema_view = get_schema_view(
title='Server Monitoring API',
url='https://www.example.org/api/'
)
#### `renderer_classes`
May be used to pass the set of renderer classes that can be used to render the API root endpoint.
from rest_framework.renderers import CoreJSONRenderer
from my_custom_package import APIBlueprintRenderer
schema_view = get_schema_view(
title='Server Monitoring API',
url='https://www.example.org/api/',
renderer_classes=[CoreJSONRenderer, APIBlueprintRenderer]
)
## Using an explicit schema view
If you need a little more control than the `get_schema_view()` shortcut gives you,
then you can use the `SchemaGenerator` class directly to auto-generate the
`Document` instance, and to return that from a view.
This option gives you the flexibility of setting up the schema endpoint This option gives you the flexibility of setting up the schema endpoint
with whatever behaviour you want. For example, you can apply different with whatever behaviour you want. For example, you can apply different
permission, throttling or authentication policies to the schema endpoint. permission, throttling, or authentication policies to the schema endpoint.
Here's an example of using `SchemaGenerator` together with a view to Here's an example of using `SchemaGenerator` together with a view to
return the schema. return the schema.
@ -144,14 +174,15 @@ return the schema.
**views.py:** **views.py:**
from rest_framework.decorators import api_view, renderer_classes from rest_framework.decorators import api_view, renderer_classes
from rest_framework import renderers, schemas from rest_framework import renderers, response, schemas
generator = schemas.SchemaGenerator(title='Bookings API') generator = schemas.SchemaGenerator(title='Bookings API')
@api_view() @api_view()
@renderer_classes([renderers.CoreJSONRenderer]) @renderer_classes([renderers.CoreJSONRenderer])
def schema_view(request): def schema_view(request):
return generator.get_schema() schema = generator.get_schema(request)
return response.Response(schema)
**urls.py:** **urls.py:**
@ -172,7 +203,8 @@ you need to pass the `request` argument to the `get_schema()` method, like so:
@api_view() @api_view()
@renderer_classes([renderers.CoreJSONRenderer]) @renderer_classes([renderers.CoreJSONRenderer])
def schema_view(request): def schema_view(request):
return generator.get_schema(request=request) generator = schemas.SchemaGenerator(title='Bookings API')
return response.Response(generator.get_schema(request=request))
## Explicit schema definition ## Explicit schema definition
@ -183,7 +215,7 @@ representation.
import coreapi import coreapi
from rest_framework.decorators import api_view, renderer_classes from rest_framework.decorators import api_view, renderer_classes
from rest_framework import renderers from rest_framework import renderers, response
schema = coreapi.Document( schema = coreapi.Document(
title='Bookings API', title='Bookings API',
@ -195,7 +227,7 @@ representation.
@api_view() @api_view()
@renderer_classes([renderers.CoreJSONRenderer]) @renderer_classes([renderers.CoreJSONRenderer])
def schema_view(request): def schema_view(request):
return schema return response.Response(schema)
## Static schema file ## Static schema file
@ -210,6 +242,95 @@ You could then either:
--- ---
# Schemas as documentation
One common usage of API schemas is to use them to build documentation pages.
The schema generation in REST framework uses docstrings to automatically
populate descriptions in the schema document.
These descriptions will be based on:
* The corresponding method docstring if one exists.
* A named section within the class docstring, which can be either single line or multi-line.
* The class docstring.
## Examples
An `APIView`, with an explicit method docstring.
class ListUsernames(APIView):
def get(self, request):
"""
Return a list of all user names in the system.
"""
usernames = [user.username for user in User.objects.all()]
return Response(usernames)
A `ViewSet`, with an explict action docstring.
class ListUsernames(ViewSet):
def list(self, request):
"""
Return a list of all user names in the system.
"""
usernames = [user.username for user in User.objects.all()]
return Response(usernames)
A generic view with sections in the class docstring, using single-line style.
class UserList(generics.ListCreateAPIView):
"""
get: Create a new user.
post: List all the users.
"""
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = (IsAdminUser,)
A generic viewset with sections in the class docstring, using multi-line style.
class UserViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows users to be viewed or edited.
retrieve:
Return a user instance.
list:
Return all users, ordered by most recently joined.
"""
queryset = User.objects.all().order_by('-date_joined')
serializer_class = UserSerializer
---
# Alternate schema formats
In order to support an alternate schema format, you need to implement a custom renderer
class that handles converting a `Document` instance into a bytestring representation.
If there is a Core API codec package that supports encoding into the format you
want to use then implementing the renderer class can be done by using the codec.
## Example
For example, the `openapi_codec` package provides support for encoding or decoding
to the Open API ("Swagger") format:
from rest_framework import renderers
from openapi_codec import OpenAPICodec
class SwaggerRenderer(renderers.BaseRenderer):
media_type = 'application/openapi+json'
format = 'swagger'
def render(self, data, media_type=None, renderer_context=None):
codec = OpenAPICodec()
return codec.dump(data)
---
# API Reference # API Reference
## SchemaGenerator ## SchemaGenerator
@ -223,22 +344,63 @@ Typically you'll instantiate `SchemaGenerator` with a single argument, like so:
Arguments: Arguments:
* `title` - The name of the API. **required** * `title` **required** - The name of the API.
* `url` - The root URL of the API schema. This option is not required unless the schema is included under path prefix.
* `patterns` - A list of URLs to inspect when generating the schema. Defaults to the project's URL conf. * `patterns` - A list of URLs to inspect when generating the schema. Defaults to the project's URL conf.
* `urlconf` - A URL conf module name to use when generating the schema. Defaults to `settings.ROOT_URLCONF`. * `urlconf` - A URL conf module name to use when generating the schema. Defaults to `settings.ROOT_URLCONF`.
### get_schema() ### get_schema(self, request)
Returns a `coreapi.Document` instance that represents the API schema. Returns a `coreapi.Document` instance that represents the API schema.
@api_view @api_view
@renderer_classes([renderers.CoreJSONRenderer]) @renderer_classes([renderers.CoreJSONRenderer])
def schema_view(request): def schema_view(request):
return generator.get_schema() generator = schemas.SchemaGenerator(title='Bookings API')
return Response(generator.get_schema())
Arguments: The `request` argument is optional, and may be used if you want to apply per-user
permissions to the resulting schema generation.
* `request` - The incoming request. Optionally used if you want to apply per-user permissions to the schema-generation. ### get_links(self, request)
Return a nested dictionary containing all the links that should be included in the API schema.
This is a good point to override if you want to modify the resulting structure of the generated schema,
as you can build a new dictionary with a different layout.
### get_link(self, path, method, view)
Returns a `coreapi.Link` instance corresponding to the given view.
You can override this if you need to provide custom behaviors for particular views.
### get_description(self, path, method, view)
Returns a string to use as the link description. By default this is based on the
view docstring as described in the "Schemas as Documentation" section above.
### get_encoding(self, path, method, view)
Returns a string to indicate the encoding for any request body, when interacting
with the given view. Eg. `'application/json'`. May return a blank string for views
that do not expect a request body.
### get_path_fields(self, path, method, view):
Return a list of `coreapi.Link()` instances. One for each path parameter in the URL.
### get_serializer_fields(self, path, method, view)
Return a list of `coreapi.Link()` instances. One for each field in the serializer class used by the view.
### get_pagination_fields(self, path, method, view
Return a list of `coreapi.Link()` instances, as returned by the `get_schema_fields()` method on any pagination class used by the view.
### get_filter_fields(self, path, method, view)
Return a list of `coreapi.Link()` instances, as returned by the `get_schema_fields()` method of any filter classes used by the view.
--- ---

View File

@ -442,7 +442,7 @@ Declaring a `ModelSerializer` looks like this:
By default, all the model fields on the class will be mapped to a corresponding serializer fields. By default, all the model fields on the class will be mapped to a corresponding serializer fields.
Any relationships such as foreign keys on the model will be mapped to `PrimaryKeyRelatedField`. Reverse relationships are not included by default unless explicitly included as described below. Any relationships such as foreign keys on the model will be mapped to `PrimaryKeyRelatedField`. Reverse relationships are not included by default unless explicitly included as specified in the [serializer relations][relations] documentation.
#### Inspecting a `ModelSerializer` #### Inspecting a `ModelSerializer`
@ -876,7 +876,7 @@ There are four methods that can be overridden, depending on what functionality y
* `.to_internal_value()` - Override this to support deserialization, for write operations. * `.to_internal_value()` - Override this to support deserialization, for write operations.
* `.create()` and `.update()` - Override either or both of these to support saving instances. * `.create()` and `.update()` - Override either or both of these to support saving instances.
Because this class provides the same interface as the `Serializer` class, you can use it with the existing generic class based views exactly as you would for a regular `Serializer` or `ModelSerializer`. Because this class provides the same interface as the `Serializer` class, you can use it with the existing generic class-based views exactly as you would for a regular `Serializer` or `ModelSerializer`.
The only difference you'll notice when doing so is the `BaseSerializer` classes will not generate HTML forms in the browsable API. This is because the data they return does not include all the field information that would allow each field to be rendered into a suitable HTML input. The only difference you'll notice when doing so is the `BaseSerializer` classes will not generate HTML forms in the browsable API. This is because the data they return does not include all the field information that would allow each field to be rendered into a suitable HTML input.
@ -1089,6 +1089,7 @@ The following third party packages are also available.
The [django-rest-marshmallow][django-rest-marshmallow] package provides an alternative implementation for serializers, using the python [marshmallow][marshmallow] library. It exposes the same API as the REST framework serializers, and can be used as a drop-in replacement in some use-cases. The [django-rest-marshmallow][django-rest-marshmallow] package provides an alternative implementation for serializers, using the python [marshmallow][marshmallow] library. It exposes the same API as the REST framework serializers, and can be used as a drop-in replacement in some use-cases.
## Serpy ## Serpy
The [serpy][serpy] package is an alternative implementation for serializers that is built for speed. [Serpy][serpy] serializes complex datatypes to simple native types. The native types can be easily converted to JSON or any other format needed. The [serpy][serpy] package is an alternative implementation for serializers that is built for speed. [Serpy][serpy] serializes complex datatypes to simple native types. The native types can be easily converted to JSON or any other format needed.
## MongoengineModelSerializer ## MongoengineModelSerializer
@ -1107,7 +1108,12 @@ The [django-rest-framework-hstore][django-rest-framework-hstore] package provide
The [dynamic-rest][dynamic-rest] package extends the ModelSerializer and ModelViewSet interfaces, adding API query parameters for filtering, sorting, and including / excluding all fields and relationships defined by your serializers. The [dynamic-rest][dynamic-rest] package extends the ModelSerializer and ModelViewSet interfaces, adding API query parameters for filtering, sorting, and including / excluding all fields and relationships defined by your serializers.
## Dynamic Fields Mixin
The [drf-dynamic-fields][drf-dynamic-fields] package provides a mixin to dynamically limit the fields per serializer to a subset specified by an URL parameter.
## HTML JSON Forms ## HTML JSON Forms
The [html-json-forms][html-json-forms] package provides an algorithm and serializer for processing `<form>` submissions per the (inactive) [HTML JSON Form specification][json-form-spec]. The serializer facilitates processing of arbitrarily nested JSON structures within HTML. For example, `<input name="items[0][id]" value="5">` will be interpreted as `{"items": [{"id": "5"}]}`. The [html-json-forms][html-json-forms] package provides an algorithm and serializer for processing `<form>` submissions per the (inactive) [HTML JSON Form specification][json-form-spec]. The serializer facilitates processing of arbitrarily nested JSON structures within HTML. For example, `<input name="items[0][id]" value="5">` will be interpreted as `{"items": [{"id": "5"}]}`.
[cite]: https://groups.google.com/d/topic/django-users/sVFaOfQi4wY/discussion [cite]: https://groups.google.com/d/topic/django-users/sVFaOfQi4wY/discussion
@ -1124,3 +1130,4 @@ The [html-json-forms][html-json-forms] package provides an algorithm and seriali
[dynamic-rest]: https://github.com/AltSchool/dynamic-rest [dynamic-rest]: https://github.com/AltSchool/dynamic-rest
[html-json-forms]: https://github.com/wq/html-json-forms [html-json-forms]: https://github.com/wq/html-json-forms
[json-form-spec]: https://www.w3.org/TR/html-json-forms/ [json-form-spec]: https://www.w3.org/TR/html-json-forms/
[drf-dynamic-fields]: https://github.com/dbrgn/drf-dynamic-fields

View File

@ -36,7 +36,7 @@ The `api_settings` object will check for any user-defined settings, and otherwis
## API policy settings ## API policy settings
*The following settings control the basic API policies, and are applied to every `APIView` class based view, or `@api_view` function based view.* *The following settings control the basic API policies, and are applied to every `APIView` class-based view, or `@api_view` function based view.*
#### DEFAULT_RENDERER_CLASSES #### DEFAULT_RENDERER_CLASSES
@ -98,7 +98,7 @@ Default: `'rest_framework.negotiation.DefaultContentNegotiation'`
## Generic view settings ## Generic view settings
*The following settings control the behavior of the generic class based views.* *The following settings control the behavior of the generic class-based views.*
#### DEFAULT_PAGINATION_SERIALIZER_CLASS #### DEFAULT_PAGINATION_SERIALIZER_CLASS
@ -181,7 +181,7 @@ If set, this value will restrict the set of versions that may be returned by the
Default: `None` Default: `None`
#### VERSION_PARAMETER #### VERSION_PARAM
The string that should used for any versioning parameters, such as in the media type or URL query parameters. The string that should used for any versioning parameters, such as in the media type or URL query parameters.
@ -234,6 +234,28 @@ Default:
--- ---
## Schema generation controls
#### SCHEMA_COERCE_PATH_PK
If set, this maps the `'pk'` identifier in the URL conf onto the actual field
name when generating a schema path parameter. Typically this will be `'id'`.
This gives a more suitable representation as "primary key" is an implementation
detail, wheras "identifier" is a more general concept.
Default: `True`
#### SCHEMA_COERCE_METHOD_NAMES
If set, this is used to map internal viewset method names onto external action
names used in the schema generation. This allows us to generate names that
are more suitable for an external representation than those that are used
internally in the codebase.
Default: `{'retrieve': 'read', 'destroy': 'delete'}`
---
## Content type controls ## Content type controls
#### URL_FORMAT_OVERRIDE #### URL_FORMAT_OVERRIDE
@ -382,6 +404,22 @@ This should be a function with the following signature:
Default: `'rest_framework.views.get_view_description'` Default: `'rest_framework.views.get_view_description'`
## HTML Select Field cutoffs
Global settings for [select field cutoffs for rendering relational fields](relations.md#select-field-cutoffs) in the browsable API.
#### HTML_SELECT_CUTOFF
Global setting for the `html_cutoff` value. Must be an integer.
Default: 1000
#### HTML_SELECT_CUTOFF_TEXT
A string representing a global setting for `html_cutoff_text`.
Default: `"More than {count} items..."`
--- ---
## Miscellaneous settings ## Miscellaneous settings

View File

@ -50,6 +50,7 @@ This class of status code indicates that the client's request was successfully r
HTTP_204_NO_CONTENT HTTP_204_NO_CONTENT
HTTP_205_RESET_CONTENT HTTP_205_RESET_CONTENT
HTTP_206_PARTIAL_CONTENT HTTP_206_PARTIAL_CONTENT
HTTP_207_MULTI_STATUS
## Redirection - 3xx ## Redirection - 3xx
@ -86,6 +87,9 @@ The 4xx class of status code is intended for cases in which the client seems to
HTTP_415_UNSUPPORTED_MEDIA_TYPE HTTP_415_UNSUPPORTED_MEDIA_TYPE
HTTP_416_REQUESTED_RANGE_NOT_SATISFIABLE HTTP_416_REQUESTED_RANGE_NOT_SATISFIABLE
HTTP_417_EXPECTATION_FAILED HTTP_417_EXPECTATION_FAILED
HTTP_422_UNPROCESSABLE_ENTITY
HTTP_423_LOCKED
HTTP_424_FAILED_DEPENDENCY
HTTP_428_PRECONDITION_REQUIRED HTTP_428_PRECONDITION_REQUIRED
HTTP_429_TOO_MANY_REQUESTS HTTP_429_TOO_MANY_REQUESTS
HTTP_431_REQUEST_HEADER_FIELDS_TOO_LARGE HTTP_431_REQUEST_HEADER_FIELDS_TOO_LARGE
@ -101,6 +105,7 @@ Response status codes beginning with the digit "5" indicate cases in which the s
HTTP_503_SERVICE_UNAVAILABLE HTTP_503_SERVICE_UNAVAILABLE
HTTP_504_GATEWAY_TIMEOUT HTTP_504_GATEWAY_TIMEOUT
HTTP_505_HTTP_VERSION_NOT_SUPPORTED HTTP_505_HTTP_VERSION_NOT_SUPPORTED
HTTP_507_INSUFFICIENT_STORAGE
HTTP_511_NETWORK_AUTHENTICATION_REQUIRED HTTP_511_NETWORK_AUTHENTICATION_REQUIRED
## Helper functions ## Helper functions

View File

@ -184,6 +184,99 @@ As usual CSRF validation will only apply to any session authenticated views. Th
--- ---
# RequestsClient
REST framework also includes a client for interacting with your application
using the popular Python library, `requests`.
This exposes exactly the same interface as if you were using a requests session
directly.
client = RequestsClient()
response = client.get('http://testserver/users/')
assert response.status_code == 200
Note that the requests client requires you to pass fully qualified URLs.
## Headers & Authentication
Custom headers and authentication credentials can be provided in the same way
as [when using a standard `requests.Session` instance](http://docs.python-requests.org/en/master/user/advanced/#session-objects).
from requests.auth import HTTPBasicAuth
client.auth = HTTPBasicAuth('user', 'pass')
client.headers.update({'x-test': 'true'})
## CSRF
If you're using `SessionAuthentication` then you'll need to include a CSRF token
for any `POST`, `PUT`, `PATCH` or `DELETE` requests.
You can do so by following the same flow that a JavaScript based client would use.
First make a `GET` request in order to obtain a CRSF token, then present that
token in the following request.
For example...
client = RequestsClient()
# Obtain a CSRF token.
response = client.get('/homepage/')
assert response.status_code == 200
csrftoken = response.cookies['csrftoken']
# Interact with the API.
response = client.post('/organisations/', json={
'name': 'MegaCorp',
'status': 'active'
}, headers={'X-CSRFToken': csrftoken})
assert response.status_code == 200
## Live tests
With careful usage both the `RequestsClient` and the `CoreAPIClient` provide
the ability to write test cases that can run either in development, or be run
directly against your staging server or production environment.
Using this style to create basic tests of a few core piece of functionality is
a powerful way to validate your live service. Doing so may require some careful
attention to setup and teardown to ensure that the tests run in a way that they
do not directly affect customer data.
---
# CoreAPIClient
The CoreAPIClient allows you to interact with your API using the Python
`coreapi` client library.
# Fetch the API schema
client = CoreAPIClient()
schema = client.get('http://testserver/schema/')
# Create a new organisation
params = {'name': 'MegaCorp', 'status': 'active'}
client.action(schema, ['organisations', 'create'], params)
# Ensure that the organisation exists in the listing
data = client.action(schema, ['organisations', 'list'])
assert(len(data) == 1)
assert(data == [{'name': 'MegaCorp', 'status': 'active'}])
## Headers & Authentication
Custom headers and authentication may be used with `CoreAPIClient` in a
similar way as with `RequestsClient`.
from requests.auth import HTTPBasicAuth
client = CoreAPIClient()
client.session.auth = HTTPBasicAuth('user', 'pass')
client.session.headers.update({'x-test': 'true'})
---
# Test cases # Test cases
REST framework includes the following test case classes, that mirror the existing Django test case classes, but use `APIClient` instead of Django's default `Client`. REST framework includes the following test case classes, that mirror the existing Django test case classes, but use `APIClient` instead of Django's default `Client`.
@ -197,7 +290,7 @@ REST framework includes the following test case classes, that mirror the existin
You can use any of REST framework's test case classes as you would for the regular Django test case classes. The `self.client` attribute will be an `APIClient` instance. You can use any of REST framework's test case classes as you would for the regular Django test case classes. The `self.client` attribute will be an `APIClient` instance.
from django.core.urlresolvers import reverse from django.urls import reverse
from rest_framework import status from rest_framework import status
from rest_framework.test import APITestCase from rest_framework.test import APITestCase
from myproject.apps.core.models import Account from myproject.apps.core.models import Account

View File

@ -41,7 +41,7 @@ The default throttling policy may be set globally, using the `DEFAULT_THROTTLE_C
The rate descriptions used in `DEFAULT_THROTTLE_RATES` may include `second`, `minute`, `hour` or `day` as the throttle period. The rate descriptions used in `DEFAULT_THROTTLE_RATES` may include `second`, `minute`, `hour` or `day` as the throttle period.
You can also set the throttling policy on a per-view or per-viewset basis, You can also set the throttling policy on a per-view or per-viewset basis,
using the `APIView` class based views. using the `APIView` class-based views.
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.throttling import UserRateThrottle from rest_framework.throttling import UserRateThrottle
@ -184,9 +184,11 @@ If the `.wait()` method is implemented and the request is throttled, then a `Ret
The following is an example of a rate throttle, that will randomly throttle 1 in every 10 requests. The following is an example of a rate throttle, that will randomly throttle 1 in every 10 requests.
import random
class RandomRateThrottle(throttling.BaseThrottle): class RandomRateThrottle(throttling.BaseThrottle):
def allow_request(self, request, view): def allow_request(self, request, view):
return random.randint(1, 10) == 1 return random.randint(1, 10) != 1
[cite]: https://dev.twitter.com/docs/error-codes-responses [cite]: https://dev.twitter.com/docs/error-codes-responses
[permissions]: permissions.md [permissions]: permissions.md

View File

@ -61,9 +61,12 @@ It takes a single required argument, and an optional `messages` argument:
* `queryset` *required* - This is the queryset against which uniqueness should be enforced. * `queryset` *required* - This is the queryset against which uniqueness should be enforced.
* `message` - The error message that should be used when validation fails. * `message` - The error message that should be used when validation fails.
* `lookup` - The lookup used to find an existing instance with the value being validated. Defaults to `'exact'`.
This validator should be applied to *serializer fields*, like so: This validator should be applied to *serializer fields*, like so:
from rest_framework.validators import UniqueValidator
slug = SlugField( slug = SlugField(
max_length=100, max_length=100,
validators=[UniqueValidator(queryset=BlogPost.objects.all())] validators=[UniqueValidator(queryset=BlogPost.objects.all())]
@ -80,6 +83,8 @@ It has two required arguments, and a single optional `messages` argument:
The validator should be applied to *serializer classes*, like so: The validator should be applied to *serializer classes*, like so:
from rest_framework.validators import UniqueTogetherValidator
class ExampleSerializer(serializers.Serializer): class ExampleSerializer(serializers.Serializer):
# ... # ...
class Meta: class Meta:
@ -114,6 +119,8 @@ These validators can be used to enforce the `unique_for_date`, `unique_for_month
The validator should be applied to *serializer classes*, like so: The validator should be applied to *serializer classes*, like so:
from rest_framework.validators import UniqueForYearValidator
class ExampleSerializer(serializers.Serializer): class ExampleSerializer(serializers.Serializer):
# ... # ...
class Meta: class Meta:
@ -183,7 +190,7 @@ It takes a single argument, which is the default value or callable that should b
created_at = serializers.DateTimeField( created_at = serializers.DateTimeField(
read_only=True, read_only=True,
default=CreateOnlyDefault(timezone.now) default=serializers.CreateOnlyDefault(timezone.now)
) )
--- ---
@ -265,9 +272,9 @@ A validator may be any callable that raises a `serializers.ValidationError` on f
if value % 2 != 0: if value % 2 != 0:
raise serializers.ValidationError('This field must be an even number.') raise serializers.ValidationError('This field must be an even number.')
## Class based ## Class-based
To write a class based validator, use the `__call__` method. Class based validators are useful as they allow you to parameterize and reuse behavior. To write a class-based validator, use the `__call__` method. Class-based validators are useful as they allow you to parameterize and reuse behavior.
class MultipleOf(object): class MultipleOf(object):
def __init__(self, base): def __init__(self, base):
@ -280,7 +287,7 @@ To write a class based validator, use the `__call__` method. Class based validat
#### Using `set_context()` #### Using `set_context()`
In some advanced cases you might want a validator to be passed the serializer field it is being used with as additional context. You can do so by declaring a `set_context` method on a class based validator. In some advanced cases you might want a validator to be passed the serializer field it is being used with as additional context. You can do so by declaring a `set_context` method on a class-based validator.
def set_context(self, serializer_field): def set_context(self, serializer_field):
# Determine if this is an update or a create operation. # Determine if this is an update or a create operation.

View File

@ -71,8 +71,8 @@ You can also set the versioning scheme on an individual view. Typically you won'
The following settings keys are also used to control versioning: The following settings keys are also used to control versioning:
* `DEFAULT_VERSION`. The value that should be used for `request.version` when no versioning information is present. Defaults to `None`. * `DEFAULT_VERSION`. The value that should be used for `request.version` when no versioning information is present. Defaults to `None`.
* `ALLOWED_VERSIONS`. If set, this value will restrict the set of versions that may be returned by the versioning scheme, and will raise an error if the provided version if not in this set. Note that the value used for the `DEFAULT_VERSION` setting is always considered to be part of the `ALLOWED_VERSIONS` set. Defaults to `None`. * `ALLOWED_VERSIONS`. If set, this value will restrict the set of versions that may be returned by the versioning scheme, and will raise an error if the provided version is not in this set. Note that the value used for the `DEFAULT_VERSION` setting is always considered to be part of the `ALLOWED_VERSIONS` set (unless it is `None`). Defaults to `None`.
* `VERSION_PARAM`. The string that should used for any versioning parameters, such as in the media type or URL query parameters. Defaults to `'version'`. * `VERSION_PARAM`. The string that should be used for any versioning parameters, such as in the media type or URL query parameters. Defaults to `'version'`.
You can also set your versioning class plus those three values on a per-view or a per-viewset basis by defining your own versioning scheme and using the `default_version`, `allowed_versions` and `version_param` class variables. For example, if you want to use `URLPathVersioning`: You can also set your versioning class plus those three values on a per-view or a per-viewset basis by defining your own versioning scheme and using the `default_version`, `allowed_versions` and `version_param` class variables. For example, if you want to use `URLPathVersioning`:

View File

@ -1,9 +1,9 @@
source: decorators.py source: decorators.py
views.py views.py
# Class Based Views # Class-based Views
> Django's class based views are a welcome departure from the old-style views. > Django's class-based views are a welcome departure from the old-style views.
> >
> &mdash; [Reinout van Rees][cite] > &mdash; [Reinout van Rees][cite]
@ -119,7 +119,7 @@ You won't typically need to override this method.
# Function Based Views # Function Based Views
> Saying [that Class based views] is always the superior solution is a mistake. > Saying [that class-based views] is always the superior solution is a mistake.
> >
> &mdash; [Nick Coghlan][cite2] > &mdash; [Nick Coghlan][cite2]
@ -127,7 +127,7 @@ REST framework also allows you to work with regular function based views. It pr
## @api_view() ## @api_view()
**Signature:** `@api_view(http_method_names=['GET'])` **Signature:** `@api_view(http_method_names=['GET'], exclude_from_schema=False)`
The core of this functionality is the `api_view` decorator, which takes a list of HTTP methods that your view should respond to. For example, this is how you would write a very simple view that just manually returns some data: The core of this functionality is the `api_view` decorator, which takes a list of HTTP methods that your view should respond to. For example, this is how you would write a very simple view that just manually returns some data:
@ -139,7 +139,7 @@ The core of this functionality is the `api_view` decorator, which takes a list o
This view will use the default renderers, parsers, authentication classes etc specified in the [settings]. This view will use the default renderers, parsers, authentication classes etc specified in the [settings].
By default only `GET` methods will be accepted. Other methods will respond with "405 Method Not Allowed". To alter this behavior, specify which methods the view allows, like so: By default only `GET` methods will be accepted. Other methods will respond with "405 Method Not Allowed". To alter this behaviour, specify which methods the view allows, like so:
@api_view(['GET', 'POST']) @api_view(['GET', 'POST'])
def hello_world(request): def hello_world(request):
@ -147,6 +147,13 @@ By default only `GET` methods will be accepted. Other methods will respond with
return Response({"message": "Got some data!", "data": request.data}) return Response({"message": "Got some data!", "data": request.data})
return Response({"message": "Hello, world!"}) return Response({"message": "Hello, world!"})
You can also mark an API view as being omitted from any [auto-generated schema][schemas],
using the `exclude_from_schema` argument.:
@api_view(['GET'], exclude_from_schema=True)
def api_docs(request):
...
## API policy decorators ## API policy decorators
To override the default settings, REST framework provides a set of additional decorators which can be added to your views. These must come *after* (below) the `@api_view` decorator. For example, to create a view that uses a [throttle][throttling] to ensure it can only be called once per day by a particular user, use the `@throttle_classes` decorator, passing a list of throttle classes: To override the default settings, REST framework provides a set of additional decorators which can be added to your views. These must come *after* (below) the `@api_view` decorator. For example, to create a view that uses a [throttle][throttling] to ensure it can only be called once per day by a particular user, use the `@throttle_classes` decorator, passing a list of throttle classes:
@ -178,3 +185,4 @@ Each of these decorators takes a single argument which must be a list or tuple o
[cite2]: http://www.boredomandlaziness.org/2012/05/djangos-cbvs-are-not-mistake-but.html [cite2]: http://www.boredomandlaziness.org/2012/05/djangos-cbvs-are-not-mistake-but.html
[settings]: settings.md [settings]: settings.md
[throttling]: throttling.md [throttling]: throttling.md
[schemas]: schemas.md

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
docs/img/raml.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

View File

@ -68,17 +68,17 @@ REST framework commercially we strongly encourage you to invest in its
continued development by **[signing up for a paid plan][funding]**. continued development by **[signing up for a paid plan][funding]**.
The initial aim is to provide a single full-time position on REST framework. The initial aim is to provide a single full-time position on REST framework.
Right now we're a little over 43% of the way towards achieving that. *Every single sign-up makes a significant impact towards making that possible.*
*Every single sign-up makes a significant impact.* Taking out a
[basic tier sponsorship](https://fund.django-rest-framework.org/topics/funding/#corporate-plans) moves us about 1% closer to our funding target.
<ul class="premium-promo promo"> <ul class="premium-promo promo">
<li><a href="http://jobs.rover.com/" style="background-image: url(https://fund-rest-framework.s3.amazonaws.com/rover_130x130.png)">Rover.com</a></li> <li><a href="http://jobs.rover.com/" style="background-image: url(https://fund-rest-framework.s3.amazonaws.com/rover_130x130.png)">Rover.com</a></li>
<li><a href="https://getsentry.com/welcome/" style="background-image: url(https://fund-rest-framework.s3.amazonaws.com/sentry130.png)">Sentry</a></li> <li><a href="https://getsentry.com/welcome/" style="background-image: url(https://fund-rest-framework.s3.amazonaws.com/sentry130.png)">Sentry</a></li>
<li><a href="https://getstream.io/?utm_source=drf&utm_medium=banner&utm_campaign=drf" style="background-image: url(https://fund-rest-framework.s3.amazonaws.com/stream-130.png)">Stream</a></li>
<li><a href="http://www.machinalis.com/#services" style="background-image: url(https://fund-rest-framework.s3.amazonaws.com/Machinalis130.png)">Machinalis</a></li>
</ul> </ul>
<div style="clear: both; padding-bottom: 20px;"></div> <div style="clear: both; padding-bottom: 20px;"></div>
*Many thanks to all our [awesome sponsors][sponsors], and in particular to our premium backers, [Rover](http://jobs.rover.com/) and [Sentry](https://getsentry.com/welcome/).* *Many thanks to all our [wonderful sponsors][sponsors], and in particular to our premium backers, [Rover](http://jobs.rover.com/), [Sentry](https://getsentry.com/welcome/), [Stream](https://getstream.io/?utm_source=drf&utm_medium=banner&utm_campaign=drf), and [Machinalis](http://www.machinalis.com/#services).*
--- ---
@ -87,11 +87,11 @@ Right now we're a little over 43% of the way towards achieving that.
REST framework requires the following: REST framework requires the following:
* Python (2.7, 3.2, 3.3, 3.4, 3.5) * Python (2.7, 3.2, 3.3, 3.4, 3.5)
* Django (1.7+, 1.8, 1.9) * Django (1.8, 1.9, 1.10)
The following packages are optional: The following packages are optional:
* [coreapi][coreapi] (1.21.0+) - Schema generation support. * [coreapi][coreapi] (1.32.0+) - Schema generation support.
* [Markdown][markdown] (2.1.0+) - Markdown support for the browsable API. * [Markdown][markdown] (2.1.0+) - Markdown support for the browsable API.
* [django-filter][django-filter] (0.9.2+) - Filtering support. * [django-filter][django-filter] (0.9.2+) - Filtering support.
* [django-crispy-forms][django-crispy-forms] - Improved HTML display for filtering. * [django-crispy-forms][django-crispy-forms] - Improved HTML display for filtering.
@ -184,10 +184,11 @@ The tutorial will walk you through the building blocks that make up REST framewo
* [1 - Serialization][tut-1] * [1 - Serialization][tut-1]
* [2 - Requests & Responses][tut-2] * [2 - Requests & Responses][tut-2]
* [3 - Class based views][tut-3] * [3 - Class-based views][tut-3]
* [4 - Authentication & permissions][tut-4] * [4 - Authentication & permissions][tut-4]
* [5 - Relationships & hyperlinked APIs][tut-5] * [5 - Relationships & hyperlinked APIs][tut-5]
* [6 - Viewsets & routers][tut-6] * [6 - Viewsets & routers][tut-6]
* [7 - Schemas & client libraries][tut-7]
There is a live example API of the finished tutorial API for testing purposes, [available here][sandbox]. There is a live example API of the finished tutorial API for testing purposes, [available here][sandbox].
@ -242,6 +243,8 @@ General guides to using REST framework.
* [3.1 Announcement][3.1-announcement] * [3.1 Announcement][3.1-announcement]
* [3.2 Announcement][3.2-announcement] * [3.2 Announcement][3.2-announcement]
* [3.3 Announcement][3.3-announcement] * [3.3 Announcement][3.3-announcement]
* [3.4 Announcement][3.4-announcement]
* [3.5 Announcement][3.5-announcement]
* [Kickstarter Announcement][kickstarter-announcement] * [Kickstarter Announcement][kickstarter-announcement]
* [Mozilla Grant][mozilla-grant] * [Mozilla Grant][mozilla-grant]
* [Funding][funding] * [Funding][funding]
@ -344,7 +347,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[versioning]: api-guide/versioning.md [versioning]: api-guide/versioning.md
[contentnegotiation]: api-guide/content-negotiation.md [contentnegotiation]: api-guide/content-negotiation.md
[metadata]: api-guide/metadata.md [metadata]: api-guide/metadata.md
[schemas]: 'api-guide/schemas.md' [schemas]: api-guide/schemas.md
[formatsuffixes]: api-guide/format-suffixes.md [formatsuffixes]: api-guide/format-suffixes.md
[reverse]: api-guide/reverse.md [reverse]: api-guide/reverse.md
[exceptions]: api-guide/exceptions.md [exceptions]: api-guide/exceptions.md
@ -367,6 +370,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[3.1-announcement]: topics/3.1-announcement.md [3.1-announcement]: topics/3.1-announcement.md
[3.2-announcement]: topics/3.2-announcement.md [3.2-announcement]: topics/3.2-announcement.md
[3.3-announcement]: topics/3.3-announcement.md [3.3-announcement]: topics/3.3-announcement.md
[3.4-announcement]: topics/3.4-announcement.md
[3.5-announcement]: topics/3.5-announcement.md
[kickstarter-announcement]: topics/kickstarter-announcement.md [kickstarter-announcement]: topics/kickstarter-announcement.md
[mozilla-grant]: topics/mozilla-grant.md [mozilla-grant]: topics/mozilla-grant.md
[funding]: topics/funding.md [funding]: topics/funding.md

View File

@ -6,7 +6,7 @@ REST framework 2.3 makes it even quicker and easier to build your Web APIs.
The 2.3 release introduces the [ViewSet][viewset] and [Router][router] classes. The 2.3 release introduces the [ViewSet][viewset] and [Router][router] classes.
A viewset is simply a type of class based view that allows you to group multiple views into a single common class. A viewset is simply a type of class-based view that allows you to group multiple views into a single common class.
Routers allow you to automatically determine the URLconf for your viewset classes. Routers allow you to automatically determine the URLconf for your viewset classes.

View File

@ -426,7 +426,7 @@ There are four methods that can be overridden, depending on what functionality y
* `.to_internal_value()` - Override this to support deserialization, for write operations. * `.to_internal_value()` - Override this to support deserialization, for write operations.
* `.create()` and `.update()` - Override either or both of these to support saving instances. * `.create()` and `.update()` - Override either or both of these to support saving instances.
Because this class provides the same interface as the `Serializer` class, you can use it with the existing generic class based views exactly as you would for a regular `Serializer` or `ModelSerializer`. Because this class provides the same interface as the `Serializer` class, you can use it with the existing generic class-based views exactly as you would for a regular `Serializer` or `ModelSerializer`.
The only difference you'll notice when doing so is the `BaseSerializer` classes will not generate HTML forms in the browsable API. This is because the data they return does not include all the field information that would allow each field to be rendered into a suitable HTML input. The only difference you'll notice when doing so is the `BaseSerializer` classes will not generate HTML forms in the browsable API. This is because the data they return does not include all the field information that would allow each field to be rendered into a suitable HTML input.
@ -801,7 +801,7 @@ This change means that you can now easily customize the style of error responses
## The metadata API ## The metadata API
Behavior for dealing with `OPTIONS` requests was previously built directly into the class based views. This has now been properly separated out into a Metadata API that allows the same pluggable style as other API policies in REST framework. Behavior for dealing with `OPTIONS` requests was previously built directly into the class-based views. This has now been properly separated out into a Metadata API that allows the same pluggable style as other API policies in REST framework.
This makes it far easier to use a different style for `OPTIONS` responses throughout your API, and makes it possible to create third-party metadata policies. This makes it far easier to use a different style for `OPTIONS` responses throughout your API, and makes it possible to create third-party metadata policies.

View File

@ -0,0 +1,194 @@
<style>
.promo li a {
float: left;
width: 130px;
height: 20px;
text-align: center;
margin: 10px 30px;
padding: 150px 0 0 0;
background-position: 0 50%;
background-size: 130px auto;
background-repeat: no-repeat;
font-size: 120%;
color: black;
}
.promo li {
list-style: none;
}
</style>
# Django REST framework 3.4
The 3.4 release is the first in a planned series that will be addressing schema
generation, hypermedia support, API clients, and finally realtime support.
---
## Funding
The 3.4 release has been made possible a recent [Mozilla grant][moss], and by our
[collaborative funding model][funding]. If you use REST framework commercially, and would
like to see this work continue, we strongly encourage you to invest in its
continued development by **[signing up for a paid plan][funding]**.
The initial aim is to provide a single full-time position on REST framework.
Right now we're over 60% of the way towards achieving that.
*Every single sign-up makes a significant impact.*
<ul class="premium-promo promo">
<li><a href="http://jobs.rover.com/" style="background-image: url(https://fund-rest-framework.s3.amazonaws.com/rover_130x130.png)">Rover.com</a></li>
<li><a href="https://getsentry.com/welcome/" style="background-image: url(https://fund-rest-framework.s3.amazonaws.com/sentry130.png)">Sentry</a></li>
<li><a href="https://getstream.io/?utm_source=drf&utm_medium=banner&utm_campaign=drf" style="background-image: url(https://fund-rest-framework.s3.amazonaws.com/stream-130.png)">Stream</a></li>
</ul>
<div style="clear: both; padding-bottom: 20px;"></div>
*Many thanks to all our [awesome sponsors][sponsors], and in particular to our premium backers, [Rover](http://jobs.rover.com/), [Sentry](https://getsentry.com/welcome/), and [Stream](https://getstream.io/?utm_source=drf&utm_medium=banner&utm_campaign=drf).*
---
## Schemas & client libraries
REST framework 3.4 brings built-in support for generating API schemas.
We provide this support by using [Core API][core-api], a Document Object Model
for describing APIs.
Because Core API represents the API schema in an format-independent
manner, we're able to render the Core API `Document` object into many different
schema formats, by allowing the renderer class to determine how the internal
representation maps onto the external schema format.
This approach should also open the door to a range of auto-generated API
documentation options in the future, by rendering the `Document` object into
HTML documentation pages.
Alongside the built-in schema support, we're also now providing the following:
* A [command line tool][command-line-client] for interacting with APIs.
* A [Python client library][client-library] for interacting with APIs.
These API clients are dynamically driven, and able to interact with any API
that exposes a supported schema format.
Dynamically driven clients allow you to interact with an API at an application
layer interface, rather than a network layer interface, while still providing
the benefits of RESTful Web API design.
We're expecting to expand the range of languages that we provide client libraries
for over the coming months.
Further work on maturing the API schema support is also planned, including
documentation on supporting file upload and download, and improved support for
documentation generation and parameter annotation.
---
Current support for schema formats is as follows:
Name | Support | PyPI package
---------------------------------|-------------------------------------|--------------------------------
[Core JSON][core-json] | Schema generation & client support. | Built-in support in `coreapi`.
[Swagger / OpenAPI][swagger] | Schema generation & client support. | The `openapi-codec` package.
[JSON Hyper-Schema][hyperschema] | Currrently client support only. | The `hyperschema-codec` package.
[API Blueprint][api-blueprint] | Not yet available. | Not yet available.
---
You can read more about any of this new functionality in the following:
* New tutorial section on [schemas & client libraries][tut-7].
* Documentation page on [schema generation][schema-generation].
* Topic page on [API clients][api-clients].
It is also worth noting that Marc Gibbons is currently working towards a 2.0 release of
the popular Django REST Swagger package, which will tie in with our new built-in support.
---
## Supported versions
The 3.4.0 release adds support for Django 1.10.
The following versions of Python and Django are now supported:
* Django versions 1.8, 1.9, and 1.10.
* Python versions 2.7, 3.2(\*), 3.3(\*), 3.4, 3.5.
(\*) Note that Python 3.2 and 3.3 are not supported from Django 1.9 onwards.
---
## Deprecations and changes
The 3.4 release includes very limited deprecation or behavioral changes, and
should present a straightforward upgrade.
### Use fields or exclude on serializer classes.
The following change in 3.3.0 is now escalated from "pending deprecation" to
"deprecated". Its usage will continue to function but will raise warnings:
`ModelSerializer` and `HyperlinkedModelSerializer` should include either a `fields`
option, or an `exclude` option. The `fields = '__all__'` shortcut may be used
to explicitly include all fields.
### Microsecond precision when returning time or datetime.
Using the default JSON renderer and directly returning a `datetime` or `time`
instance will now render with microsecond precision (6 digits), rather than
millisecond precision (3 digits). This makes the output format consistent with the
default string output of `serializers.DateTimeField` and `serializers.TimeField`.
This change *does not affect the default behavior when using serializers*,
which is to serialize `datetime` and `time` instances into strings with
microsecond precision.
The serializer behavior can be modified if needed, using the `DATETIME_FORMAT`
and `TIME_FORMAT` settings.
The renderer behavior can be modified by setting a custom `encoder_class`
attribute on a `JSONRenderer` subclass.
### Relational choices no longer displayed in OPTIONS requests.
Making an `OPTIONS` request to views that have a serializer choice field
will result in a list of the available choices being returned in the response.
In cases where there is a relational field, the previous behavior would be
to return a list of available instances to choose from for that relational field.
In order to minimise exposed information the behavior now is to *not* return
choices information for relational fields.
If you want to override this new behavior you'll need to [implement a custom
metadata class][metadata].
See [issue #3751][gh3751] for more information on this behavioral change.
---
## Other improvements
This release includes further work from a huge number of [pull requests and issues][milestone].
Many thanks to all our contributors who've been involved in the release, either through raising issues, giving feedback, improving the documentation, or suggesting and implementing code changes.
The full set of itemized release notes [are available here][release-notes].
[sponsors]: https://fund.django-rest-framework.org/topics/funding/#our-sponsors
[moss]: mozilla-grant.md
[funding]: funding.md
[core-api]: http://www.coreapi.org/
[command-line-client]: api-clients#command-line-client
[client-library]: api-clients#python-client-library
[core-json]: http://www.coreapi.org/specification/encoding/#core-json-encoding
[swagger]: https://openapis.org/specification
[hyperschema]: http://json-schema.org/latest/json-schema-hypermedia.html
[api-blueprint]: https://apiblueprint.org/
[tut-7]: ../../tutorial/7-schemas-and-client-libraries/
[schema-generation]: ../../api-guide/schemas/
[api-clients]: api-clients.md
[milestone]: https://github.com/tomchristie/django-rest-framework/milestone/35
[release-notes]: release-notes#34
[metadata]: ../../api-guide/metadata/#custom-metadata-classes
[gh3751]: https://github.com/tomchristie/django-rest-framework/issues/3751

View File

@ -0,0 +1,266 @@
<style>
.promo li a {
float: left;
width: 130px;
height: 20px;
text-align: center;
margin: 10px 30px;
padding: 150px 0 0 0;
background-position: 0 50%;
background-size: 130px auto;
background-repeat: no-repeat;
font-size: 120%;
color: black;
}
.promo li {
list-style: none;
}
</style>
# Django REST framework 3.5
The 3.5 release is the second in a planned series that is addressing schema
generation, hypermedia support, API client libraries, and finally realtime support.
---
## Funding
The 3.5 release would not have been possible without our [collaborative funding model][funding].
If you use REST framework commercially and would like to see this work continue,
we strongly encourage you to invest in its continued development by
**[signing up for a paid&nbsp;plan][funding]**.
<ul class="premium-promo promo">
<li><a href="http://jobs.rover.com/" style="background-image: url(https://fund-rest-framework.s3.amazonaws.com/rover_130x130.png)">Rover.com</a></li>
<li><a href="https://getsentry.com/welcome/" style="background-image: url(https://fund-rest-framework.s3.amazonaws.com/sentry130.png)">Sentry</a></li>
<li><a href="https://getstream.io/?utm_source=drf&utm_medium=banner&utm_campaign=drf" style="background-image: url(https://fund-rest-framework.s3.amazonaws.com/stream-130.png)">Stream</a></li>
<li><a href="http://www.machinalis.com/#services" style="background-image: url(https://fund-rest-framework.s3.amazonaws.com/Machinalis130.png)">Machinalis</a></li>
</ul>
<div style="clear: both; padding-bottom: 20px;"></div>
*Many thanks to all our [sponsors][sponsors], and in particular to our premium backers, [Rover](http://jobs.rover.com/), [Sentry](https://getsentry.com/welcome/), [Stream](https://getstream.io/?utm_source=drf&utm_medium=banner&utm_campaign=drf), and [Machinalis](http://www.machinalis.com/#services).*
---
## Improved schema generation
Docstrings on views are now pulled through into schema definitions, allowing
you to [use the schema definition to document your&nbsp;API][schema-docs].
There is now also a shortcut function, `get_schema_view()`, which makes it easier to
[adding schema views][schema-view] to your API.
For example, to include a swagger schema to your API, you would do the following:
* Run `pip install django-rest-swagger`.
* Add `'rest_framework_swagger'` to your `INSTALLED_APPS` setting.
* Include the schema view in your URL conf:
```py
from rest_framework.schemas import get_schema_view
from rest_framework_swagger.renderers import OpenAPIRenderer, SwaggerUIRenderer
schema_view = get_schema_view(
title='Example API',
renderer_classes=[OpenAPIRenderer, SwaggerUIRenderer]
)
urlpatterns = [
url(r'^swagger/$', schema_view),
...
]
```
There have been a large number of fixes to the schema generation. These should
resolve issues for anyone using the latest version of the `django-rest-swagger`
package.
Some of these changes do affect the resulting schema structure,
so if you're already using schema generation you should make sure to review
[the deprecation notes](#deprecations), particularly if you're currently using
a dynamic client library to interact with your API.
Finally, we're also now exposing the schema generation as a
[publicly documented API][schema-generation-api], allowing you to more easily
override the behaviour.
## Requests test client
You can now test your project using the `requests` library.
This exposes exactly the same interface as if you were using a standard
requests session instance.
client = RequestsClient()
response = client.get('http://testserver/users/')
assert response.status_code == 200
Rather than sending any HTTP requests to the network, this interface will
coerce all outgoing requests into WSGI, and call into your application directly.
## Core API client
You can also now test your project by interacting with it using the `coreapi`
client library.
# Fetch the API schema
client = CoreAPIClient()
schema = client.get('http://testserver/schema/')
# Create a new organisation
params = {'name': 'MegaCorp', 'status': 'active'}
client.action(schema, ['organisations', 'create'], params)
# Ensure that the organisation exists in the listing
data = client.action(schema, ['organisations', 'list'])
assert(len(data) == 1)
assert(data == [{'name': 'MegaCorp', 'status': 'active'}])
Again, this will call directly into the application using the WSGI interface,
rather than making actual network calls.
This is a good option if you are planning for clients to mainly interact with
your API using the `coreapi` client library, or some other auto-generated client.
## Live tests
One interesting aspect of both the `requests` client and the `coreapi` client
is that they allow you to write tests in such a way that they can also be made
to run against a live service.
By switching the WSGI based client instances to actual instances of `requests.Session`
or `coreapi.Client` you can have the test cases make actual network calls.
Being able to write test cases that can exercise your staging or production
environment is a powerful tool. However in order to do this, you'll need to pay
close attention to how you handle setup and teardown to ensure a strict isolation
of test data from other live or staging data.
## RAML support
We now have preliminary support for [RAML documentation generation][django-rest-raml].
![RAML Example][raml-image]
Further work on the encoding and documentation generation is planned, in order to
make features such as the 'Try it now' support available at a later date.
This work also now means that you can use the Core API client libraries to interact
with APIs that expose a RAML specification. The [RAML codec][raml-codec] gives some examples of
interacting with the Spotify API in this way.
## Validation codes
Exceptions raised by REST framework now include short code identifiers.
When used together with our customizable error handling, this now allows you to
modify the style of API error messages.
As an example, this allows for the following style of error responses:
{
"message": "You do not have permission to perform this action.",
"code": "permission_denied"
}
This is particularly useful with validation errors, which use appropriate
codes to identify differing kinds of failure...
{
"name": {"message": "This field is required.", "code": "required"},
"age": {"message": "A valid integer is required.", "code": "invalid"}
}
## Client upload & download support
The Python `coreapi` client library and the Core API command line tool both
now fully support file [uploads][uploads] and [downloads][downloads].
---
## Deprecations
### Generating schemas from Router
The router arguments for generating a schema view, such as `schema_title`,
are now pending deprecation.
Instead of using `DefaultRouter(schema_title='Example API')`, you should use
the `get_schema_view()` function, and include the view in your URL conf.
Make sure to include the view before your router urls. For example:
from rest_framework.schemas import get_schema_view
from my_project.routers import router
schema_view = get_schema_view(title='Example API')
urlpatterns = [
url('^$', schema_view),
url(r'^', include(router.urls)),
]
### Schema path representations
The `'pk'` identifier in schema paths is now mapped onto the actually model field
name by default. This will typically be `'id'`.
This gives a better external representation for schemas, with less implementation
detail being exposed. It also reflects the behaviour of using a ModelSerializer
class with `fields = '__all__'`.
You can revert to the previous behaviour by setting `'SCHEMA_COERCE_PATH_PK': False`
in the REST framework settings.
### Schema action name representations
The internal `retrieve()` and `destroy()` method names are now coerced to an
external representation of `read` and `delete`.
You can revert to the previous behaviour by setting `'SCHEMA_COERCE_METHOD_NAMES': {}`
in the REST framework settings.
### DjangoFilterBackend
The functionality of the built-in `DjangoFilterBackend` is now completely
included by the `django-filter` package.
You should change your imports and REST framework filter settings as follows:
* `rest_framework.filters.DjangoFilterBackend` becomes `django_filters.rest_framework.DjangoFilterBackend`.
* `rest_framework.filters.FilterSet` becomes `django_filters.rest_framework.FilterSet`.
The existing imports will continue to work but are now pending deprecation.
### CoreJSON media type
The media type for `CoreJSON` is now `application/json+coreapi`, rather than
the previous `application/vnd.json+coreapi`. This brings it more into line with
other custom media types, such as those used by Swagger and RAML.
The clients currently accept either media type. The old style-media type will
be deprecated at a later date.
### ModelSerializer 'fields' and 'exclude'
ModelSerializer and HyperlinkedModelSerializer must include either a fields
option, or an exclude option. The `fields = '__all__'` shortcut may be used to
explicitly include all fields.
Failing to set either `fields` or `exclude` raised a pending deprecation warning
in version 3.3 and raised a deprecation warning in 3.4. Its usage is now mandatory.
---
[sponsors]: https://fund.django-rest-framework.org/topics/funding/#our-sponsors
[funding]: funding.md
[uploads]: http://core-api.github.io/python-client/api-guide/utils/#file
[downloads]: http://core-api.github.io/python-client/api-guide/codecs/#downloadcodec
[schema-generation-api]: ../api-guide/schemas/#schemagenerator
[schema-docs]: ../api-guide/schemas/#schemas-as-documentation
[schema-view]: ../api-guide/schemas/#the-get_schema_view-shortcut
[django-rest-raml]: https://github.com/tomchristie/django-rest-raml
[raml-image]: ../img/raml.png
[raml-codec]: https://github.com/core-api/python-raml-codec

View File

@ -58,12 +58,14 @@ exposes a supported schema format.
To install the Core API command line client, use `pip`. To install the Core API command line client, use `pip`.
$ pip install coreapi Note that the command-line client is a separate package to the
python client library. Make sure to install `coreapi-cli`.
$ pip install coreapi-cli
To start inspecting and interacting with an API the schema must first be loaded To start inspecting and interacting with an API the schema must first be loaded
from the network. from the network.
$ coreapi get http://api.example.org/ $ coreapi get http://api.example.org/
<Pastebin API "http://127.0.0.1:8000/"> <Pastebin API "http://127.0.0.1:8000/">
snippets: { snippets: {
@ -120,7 +122,14 @@ To inspect the underlying HTTP request and response, use the `--debug` flag.
Some actions may include optional or required parameters. Some actions may include optional or required parameters.
$ coreapi action users create --params username example $ coreapi action users create --param username=example
When using `--param`, the type of the input will be determined automatically.
If you want to be more explicit about the parameter type then use `--data` for
any null, numeric, boolean, list, or object inputs, and use `--string` for string inputs.
$ coreapi action users edit --string username=tomchristie --data is_admin=true
## Authentication & headers ## Authentication & headers
@ -130,38 +139,53 @@ that credentials are not leaked across differing APIs.
The format for adding a new credential is: The format for adding a new credential is:
coreapi credentials add <domain> <credentials string> $ coreapi credentials add <domain> <credentials string>
For instance: For instance:
coreapi credentials add api.example.org "Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b" $ coreapi credentials add api.example.org "Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b"
The optional `--auth` flag also allows you to add specific types of authentication, The optional `--auth` flag also allows you to add specific types of authentication,
handling the encoding for you. Currently only `"basic"` is supported as an option here. handling the encoding for you. Currently only `"basic"` is supported as an option here.
For example: For example:
coreapi credentials add api.example.org tomchristie:foobar --auth basic $ coreapi credentials add api.example.org tomchristie:foobar --auth basic
You can also add specific request headers, using the `headers` command: You can also add specific request headers, using the `headers` command:
coreapi headers add api.example.org x-api-version 2 $ coreapi headers add api.example.org x-api-version 2
For more information and a listing of the available subcommands use `coreapi For more information and a listing of the available subcommands use `coreapi
credentials --help` or `coreapi headers --help`. credentials --help` or `coreapi headers --help`.
## Codecs
By default the command line client only includes support for reading Core JSON
schemas, however it includes a plugin system for installing additional codecs.
$ pip install openapi-codec jsonhyperschema-codec hal-codec
$ coreapi codecs show
Codecs
corejson application/vnd.coreapi+json encoding, decoding
hal application/hal+json encoding, decoding
openapi application/openapi+json encoding, decoding
jsonhyperschema application/schema+json decoding
json application/json data
text text/* data
## Utilities ## Utilities
The command line client includes functionality for bookmarking API URLs The command line client includes functionality for bookmarking API URLs
under a memorable name. For example, you can add a bookmark for the under a memorable name. For example, you can add a bookmark for the
existing API, like so... existing API, like so...
coreapi bookmarks add accountmanagement $ coreapi bookmarks add accountmanagement
There is also functionality for navigating forward or backward through the There is also functionality for navigating forward or backward through the
history of which API URLs have been accessed. history of which API URLs have been accessed.
coreapi history show $ coreapi history show
coreapi history back $ coreapi history back
For more information and a listing of the available subcommands use For more information and a listing of the available subcommands use
`coreapi bookmarks --help` or `coreapi history --help`. `coreapi bookmarks --help` or `coreapi history --help`.
@ -170,20 +194,24 @@ For more information and a listing of the available subcommands use
To display the current `Document`: To display the current `Document`:
coreapi show $ coreapi show
To reload the current `Document` from the network: To reload the current `Document` from the network:
coreapi reload $ coreapi reload
To load a schema file from disk: To load a schema file from disk:
coreapi load my-api-schema.json --format corejson $ coreapi load my-api-schema.json --format corejson
To dump the current document to console in a given format:
$ coreapi dump --format openapi
To remove the current document, along with all currently saved history, To remove the current document, along with all currently saved history,
credentials, headers and bookmarks: credentials, headers and bookmarks:
coreapi clear $ coreapi clear
--- ---
@ -195,7 +223,9 @@ API that exposes a supported schema format.
## Getting started ## Getting started
You'll need to install the `coreapi` package using `pip` before you can get You'll need to install the `coreapi` package using `pip` before you can get
started. Once you've done so, open up a python terminal. started.
$ pip install coreapi
In order to start working with an API, we first need a `Client` instance. The In order to start working with an API, we first need a `Client` instance. The
client holds any configuration around which codecs and transports are supported client holds any configuration around which codecs and transports are supported
@ -227,7 +257,7 @@ Codecs are responsible for encoding or decoding Documents.
The decoding process is used by a client to take a bytestring of an API schema The decoding process is used by a client to take a bytestring of an API schema
definition, and returning the Core API `Document` that represents that interface. definition, and returning the Core API `Document` that represents that interface.
A codec should be associated with a particular media type, such as **TODO**. A codec should be associated with a particular media type, such as `'application/coreapi+json'`.
This media type is used by the server in the response `Content-Type` header, This media type is used by the server in the response `Content-Type` header,
in order to indicate what kind of data is being returned in the response. in order to indicate what kind of data is being returned in the response.
@ -252,14 +282,15 @@ and subsequently to receive JSON responses made against the API.
You can use a codec directly, in order to load an existing schema definition, You can use a codec directly, in order to load an existing schema definition,
and return the resulting `Document`. and return the resulting `Document`.
schema_definition = open('my-api-schema.json', 'r').read() input_file = open('my-api-schema.json', 'rb')
schema_definition = input_file.read()
codec = codecs.CoreJSONCodec() codec = codecs.CoreJSONCodec()
schema = codec.load(schema_definition) schema = codec.load(schema_definition)
You can also use a codec directly to generate a schema definition given a `Document` instance: You can also use a codec directly to generate a schema definition given a `Document` instance:
schema_definition = codec.dump(schema) schema_definition = codec.dump(schema)
output_file = open('my-api-schema.json', 'r') output_file = open('my-api-schema.json', 'rb')
output_file.write(schema_definition) output_file.write(schema_definition)
## Transports ## Transports

View File

@ -61,6 +61,7 @@ To run the tests, clone the repository, and then:
# Setup the virtual environment # Setup the virtual environment
virtualenv env virtualenv env
source env/bin/activate source env/bin/activate
pip install django
pip install -r requirements.txt pip install -r requirements.txt
# Run the tests # Run the tests

View File

@ -165,7 +165,7 @@ Here's how differences between the old and new source files will be handled:
When a translator has finished translating their work needs to be downloaded from Transifex into the REST framework repository. To do this, run: When a translator has finished translating their work needs to be downloaded from Transifex into the REST framework repository. To do this, run:
# 3. Pull the translated django.po files from Transifex. # 3. Pull the translated django.po files from Transifex.
tx pull -a tx pull -a --minimum-perc 10
cd rest_framework cd rest_framework
# 4. Compile the binary .mo files for all supported languages. # 4. Compile the binary .mo files for all supported languages.
django-admin.py compilemessages django-admin.py compilemessages

View File

@ -38,14 +38,221 @@ You can determine your currently installed version using `pip freeze`:
--- ---
## 3.5.x series
### 3.5.2
**Date**: [1st November 2016][3.5.2-milestone]
* Restore exception tracebacks in Python 2.7. ([#4631][gh4631], [#4638][gh4638])
* Properly display dicts in the admin console. ([#4532][gh4532], [#4636][gh4636])
* Fix is_simple_callable with variable args, kwargs. ([#4622][gh4622], [#4602][gh4602])
* Support 'on'/'off' literals with BooleanField. ([#4640][gh4640], [#4624][gh4624])
* Enable cursor pagination of value querysets. ([#4569][gh4569])
* Fix support of get_full_details() for Throttled exceptions. ([#4627][gh4627])
* Fix FilterSet proxy. ([#4620][gh4620])
* Make serializer fields import explicit. ([#4628][gh4628])
* Drop redundant requests adapter. ([#4639][gh4639])
### 3.5.1
**Date**: [21st October 2016][3.5.1-milestone]
* Make `rest_framework/compat.py` imports. ([#4612][gh4612], [#4608][gh4608], [#4601][gh4601])
* Fix bug in schema base path generation. ([#4611][gh4611], [#4605][gh4605])
* Fix broken case of ListSerializer with single item. ([#4609][gh4609], [#4606][gh4606])
* Remove bare `raise` for Python 3.5 compat. ([#4600][gh4600])
### 3.5.0
**Date**: [20th October 2016][3.5.0-milestone]
---
## 3.4.x series ## 3.4.x series
### 3.4 ### 3.4.7
**Unreleased** **Date**: [21st September 2016][3.4.7-milestone]
* Dropped support for EOL Django 1.7 ([#3933][gh3933]) * Fallback behavior for request parsing when request.POST already accessed. ([#3951][gh3951], [#4500][gh4500])
* Fixed null foreign keys targeting UUIDField primary keys. ([#3936][gh3936]) * Fix regression of `RegexField`. ([#4489][gh4489], [#4490][gh4490], [#2617][gh2617])
* Missing comma in `admin.html` causing CSRF error. ([#4472][gh4472], [#4473][gh4473])
* Fix response rendering with empty context. ([#4495][gh4495])
* Fix indentation regression in API listing. ([#4493][gh4493])
* Fixed an issue where the incorrect value is set to `ResolverMatch.func_name` of api_view decorated view. ([#4465][gh4465], [#4462][gh4462])
* Fix `APIClient.get()` when path contains unicode arguments ([#4458][gh4458])
### 3.4.6
**Date**: [23rd August 2016][3.4.6-milestone]
* Fix malformed Javascript in browsable API. ([#4435][gh4435])
* Skip HiddenField from Schema fields. ([#4425][gh4425], [#4429][gh4429])
* Improve Create to show the original exception traceback. ([#3508][gh3508])
* Fix `AdminRenderer` display of PK only related fields. ([#4419][gh4419], [#4423][gh4423])
### 3.4.5
**Date**: [19th August 2016][3.4.5-milestone]
* Improve debug error handling. ([#4416][gh4416], [#4409][gh4409])
* Allow custom CSRF_HEADER_NAME setting. ([#4415][gh4415], [#4410][gh4410])
* Include .action attribute on viewsets when generating schemas. ([#4408][gh4408], [#4398][gh4398])
* Do not include request.FILES items in request.POST. ([#4407][gh4407])
* Fix rendering of checkbox multiple. ([#4403][gh4403])
* Fix docstring of Field.get_default. ([#4404][gh4404])
* Replace utf8 character with its ascii counterpart in README. ([#4412][gh4412])
### 3.4.4
**Date**: [12th August 2016][3.4.4-milestone]
* Ensure views are fully initialized when generating schemas. ([#4373][gh4373], [#4382][gh4382], [#4383][gh4383], [#4279][gh4279], [#4278][gh4278])
* Add form field descriptions to schemas. ([#4387][gh4387])
* Fix category generation for schema endpoints. ([#4391][gh4391], [#4394][gh4394], [#4390][gh4390], [#4386][gh4386], [#4376][gh4376], [#4329][gh4329])
* Don't strip empty query params when paginating. ([#4392][gh4392], [#4393][gh4393], [#4260][gh4260])
* Do not re-run query for empty results with LimitOffsetPagination. ([#4201][gh4201], [#4388][gh4388])
* Stricter type validation for CharField. ([#4380][gh4380], [#3394][gh3394])
* RelatedField.choices should preserve non-string values. ([#4111][gh4111], [#4379][gh4379], [#3365][gh3365])
* Test case for rendering checkboxes in vertical form style. ([#4378][gh4378], [#3868][gh3868], [#3868][gh3868])
* Show error traceback HTML in browsable API ([#4042][gh4042], [#4172][gh4172])
* Fix handling of ALLOWED_VERSIONS and no DEFAULT_VERSION. [#4370][gh4370]
* Allow `max_digits=None` on DecimalField. ([#4377][gh4377], [#4372][gh4372])
* Limit queryset when rendering relational choices. ([#4375][gh4375], [#4122][gh4122], [#3329][gh3329], [#3330][gh3330], [#3877][gh3877])
* Resolve form display with ChoiceField, MultipleChoiceField and non-string choices. ([#4374][gh4374], [#4119][gh4119], [#4121][gh4121], [#4137][gh4137], [#4120][gh4120])
* Fix call to TemplateHTMLRenderer.resolve_context() fallback method. ([#4371][gh4371])
### 3.4.3
**Date**: [5th August 2016][3.4.3-milestone]
* Include fallaback for users of older TemplateHTMLRenderer internal API. ([#4361][gh4361])
### 3.4.2
**Date**: [5th August 2016][3.4.2-milestone]
* Include kwargs passed to 'as_view' when generating schemas. ([#4359][gh4359], [#4330][gh4330], [#4331][gh4331])
* Access `request.user.is_authenticated` as property not method, under Django 1.10+ ([#4358][gh4358], [#4354][gh4354])
* Filter HEAD out from schemas. ([#4357][gh4357])
* extra_kwargs takes precedence over uniqueness kwargs. ([#4198][gh4198], [#4199][gh4199], [#4349][gh4349])
* Correct descriptions when tabs are used in code indentation. ([#4345][gh4345], [#4347][gh4347])*
* Change template context generation in TemplateHTMLRenderer. ([#4236][gh4236])
* Serializer defaults should not be included in partial updates. ([#4346][gh4346], [#3565][gh3565])
* Consistent behavior & descriptive error from FileUploadParser when filename not included. ([#4340][gh4340], [#3610][gh3610], [#4292][gh4292], [#4296][gh4296])
* DecimalField quantizes incoming digitals. ([#4339][gh4339], [#4318][gh4318])
* Handle non-string input for IP fields. ([#4335][gh4335], [#4336][gh4336], [#4338][gh4338])
* Fix leading slash handling when Schema generation includes a root URL. ([#4332][gh4332])
* Test cases for DictField with allow_null options. ([#4348][gh4348])
* Update tests from Django 1.10 beta to Django 1.10. ([#4344][gh4344])
### 3.4.1
**Date**: [28th July 2016][3.4.1-milestone]
* Added `root_renderers` argument to `DefaultRouter`. ([#4323][gh4323], [#4268][gh4268])
* Added `url` and `schema_url` arguments. ([#4321][gh4321], [#4308][gh4308], [#4305][gh4305])
* Unique together checks should apply to read-only fields which have a default. ([#4316][gh4316], [#4294][gh4294])
* Set view.format_kwarg in schema generator. ([#4293][gh4293], [#4315][gh4315])
* Fix schema generator for views with `pagination_class = None`. ([#4314][gh4314], [#4289][gh4289])
* Fix schema generator for views with no `get_serializer_class`. ([#4265][gh4265], [#4285][gh4285])
* Fixes for media type parameters in `Accept` and `Content-Type` headers. ([#4287][gh4287], [#4313][gh4313], [#4281][gh4281])
* Use verbose_name instead of object_name in error messages. ([#4299][gh4299])
* Minor version update to Twitter Bootstrap. ([#4307][gh4307])
* SearchFilter raises error when using with related field. ([#4302][gh4302], [#4303][gh4303], [#4298][gh4298])
* Adding support for RFC 4918 status codes. ([#4291][gh4291])
* Add LICENSE.md to the built wheel. ([#4270][gh4270])
* Serializing "complex" field returns None instead of the value since 3.4 ([#4272][gh4272], [#4273][gh4273], [#4288][gh4288])
### 3.4.0
**Date**: [14th July 2016][3.4.0-milestone]
* Don't strip microseconds in JSON output. ([#4256][gh4256])
* Two slightly different iso 8601 datetime serialization. ([#4255][gh4255])
* Resolve incorrect inclusion of media type parameters. ([#4254][gh4254])
* Response Content-Type potentially malformed. ([#4253][gh4253])
* Fix setup.py error on some platforms. ([#4246][gh4246])
* Move alternate formats in coreapi into separate packages. ([#4244][gh4244])
* Add localize keyword argument to `DecimalField`. ([#4233][gh4233])
* Fix issues with routers for custom list-route and detail-routes. ([#4229][gh4229])
* Namespace versioning with nested namespaces. ([#4219][gh4219])
* Robust uniqueness checks. ([#4217][gh4217])
* Minor refactoring of `must_call_distinct`. ([#4215][gh4215])
* Overridable offset cutoff in CursorPagination. ([#4212][gh4212])
* Pass through strings as-in with date/time fields. ([#4196][gh4196])
* Add test confirming that required=False is valid on a relational field. ([#4195][gh4195])
* In LimitOffsetPagination `limit=0` should revert to default limit. ([#4194][gh4194])
* Exclude read_only=True fields from unique_together validation & add docs. ([#4192][gh4192])
* Handle bytestrings in JSON. ([#4191][gh4191])
* JSONField(binary=True) represents using binary strings, which JSONRenderer does not support. ([#4187][gh4187])
* JSONField(binary=True) represents using binary strings, which JSONRenderer does not support. ([#4185][gh4185])
* More robust form rendering in the browsable API. ([#4181][gh4181])
* Empty cases of `.validated_data` and `.errors` as lists not dicts for ListSerializer. ([#4180][gh4180])
* Schemas & client libraries. ([#4179][gh4179])
* Removed `AUTH_USER_MODEL` compat property. ([#4176][gh4176])
* Clean up existing deprecation warnings. ([#4166][gh4166])
* Django 1.10 support. ([#4158][gh4158])
* Updated jQuery version to 1.12.4. ([#4157][gh4157])
* More robust default behavior on OrderingFilter. ([#4156][gh4156])
* description.py codes and tests removal. ([#4153][gh4153])
* Wrap guardian.VERSION in tuple. ([#4149][gh4149])
* Refine validator for fields with <source=> kwargs. ([#4146][gh4146])
* Fix None values representation in childs of ListField, DictField. ([#4118][gh4118])
* Resolve TimeField representation for midnight value. ([#4107][gh4107])
* Set proper status code in AdminRenderer for the redirection after POST/DELETE requests. ([#4106][gh4106])
* TimeField render returns None instead of 00:00:00. ([#4105][gh4105])
* Fix incorrectly named zh-hans and zh-hant locale path. ([#4103][gh4103])
* Prevent raising exception when limit is 0. ([#4098][gh4098])
* TokenAuthentication: Allow custom keyword in the header. ([#4097][gh4097])
* Handle incorrectly padded HTTP basic auth header. ([#4090][gh4090])
* LimitOffset pagination crashes Browseable API when limit=0. ([#4079][gh4079])
* Fixed DecimalField arbitrary precision support. ([#4075][gh4075])
* Added support for custom CSRF cookie names. ([#4049][gh4049])
* Fix regression introduced by #4035. ([#4041][gh4041])
* No auth view failing permission should raise 403. ([#4040][gh4040])
* Fix string_types / text_types confusion. ([#4025][gh4025])
* Do not list related field choices in OPTIONS requests. ([#4021][gh4021])
* Fix typo. ([#4008][gh4008])
* Reorder initializing the view. ([#4006][gh4006])
* Type error in DjangoObjectPermissionsFilter on Python 3.4. ([#4005][gh4005])
* Fixed use of deprecated Query.aggregates. ([#4003][gh4003])
* Fix blank lines around docstrings. ([#4002][gh4002])
* Fixed admin pagination when limit is 0. ([#3990][gh3990])
* OrderingFilter adjustements. ([#3983][gh3983])
* Non-required serializer related fields. ([#3976][gh3976])
* Using safer calling way of "@api_view" in tutorial. ([#3971][gh3971])
* ListSerializer doesn't handle unique_together constraints. ([#3970][gh3970])
* Add missing migration file. ([#3968][gh3968])
* `OrderingFilter` should call `get_serializer_class()` to determine default fields. ([#3964][gh3964])
* Remove old django checks from tests and compat. ([#3953][gh3953])
* Support callable as the value of `initial` for any `serializer.Field`. ([#3943][gh3943])
* Prevented unnecessary distinct() call in SearchFilter. ([#3938][gh3938])
* Fix None UUID ForeignKey serialization. ([#3936][gh3936])
* Drop EOL Django 1.7. ([#3933][gh3933])
* Add missing space in serializer error message. ([#3926][gh3926])
* Fixed _force_text_recursive typo. ([#3908][gh3908])
* Attempt to address Django 2.0 deprecate warnings related to `field.rel`. ([#3906][gh3906])
* Fix parsing multipart data using a nested serializer with list. ([#3820][gh3820])
* Resolving APIs URL to different namespaces. ([#3816][gh3816])
* Do not HTML-escape `help_text` in Browsable API forms. ([#3812][gh3812])
* OPTIONS fetches and shows all possible foreign keys in choices field. ([#3751][gh3751])
* Django 1.9 deprecation warnings ([#3729][gh3729])
* Test case for #3598 ([#3710][gh3710])
* Adding support for multiple values for search filter. ([#3541][gh3541])
* Use get_serializer_class in ordering filter. ([#3487][gh3487])
* Serializers with many=True should return empty list rather than empty dict. ([#3476][gh3476])
* LimitOffsetPagination limit=0 fix. ([#3444][gh3444])
* Enable Validators to defer string evaluation and handle new string format. ([#3438][gh3438])
* Unique validator is executed and breaks if field is invalid. ([#3381][gh3381])
* Do not ignore overridden View.get_view_name() in breadcrumbs. ([#3273][gh3273])
* Retry form rendering when rendering with serializer fails. ([#3164][gh3164])
* Unique constraint prevents nested serializers from updating. ([#2996][gh2996])
* Uniqueness validators should not be run for excluded (read_only) fields. ([#2848][gh2848])
* UniqueValidator raises exception for nested objects. ([#2403][gh2403])
* `lookup_type` is deprecated in favor of `lookup_expr`. ([#4259][gh4259])
---
## 3.3.x series ## 3.3.x series
@ -127,6 +334,8 @@ You can determine your currently installed version using `pip freeze`:
* Removed support for Django 1.5 & 1.6. ([#3421][gh3421], [#3429][gh3429]) * Removed support for Django 1.5 & 1.6. ([#3421][gh3421], [#3429][gh3429])
* Removed 'south' migrations. ([#3495][gh3495]) * Removed 'south' migrations. ([#3495][gh3495])
---
## 3.2.x series ## 3.2.x series
### 3.2.5 ### 3.2.5
@ -410,6 +619,17 @@ For older release notes, [please see the version 2.x documentation][old-release-
[3.3.1-milestone]: https://github.com/tomchristie/django-rest-framework/issues?q=milestone%3A%223.3.1+Release%22 [3.3.1-milestone]: https://github.com/tomchristie/django-rest-framework/issues?q=milestone%3A%223.3.1+Release%22
[3.3.2-milestone]: https://github.com/tomchristie/django-rest-framework/issues?q=milestone%3A%223.3.2+Release%22 [3.3.2-milestone]: https://github.com/tomchristie/django-rest-framework/issues?q=milestone%3A%223.3.2+Release%22
[3.3.3-milestone]: https://github.com/tomchristie/django-rest-framework/issues?q=milestone%3A%223.3.3+Release%22 [3.3.3-milestone]: https://github.com/tomchristie/django-rest-framework/issues?q=milestone%3A%223.3.3+Release%22
[3.4.0-milestone]: https://github.com/tomchristie/django-rest-framework/issues?q=milestone%3A%223.4.0+Release%22
[3.4.1-milestone]: https://github.com/tomchristie/django-rest-framework/issues?q=milestone%3A%223.4.1+Release%22
[3.4.2-milestone]: https://github.com/tomchristie/django-rest-framework/issues?q=milestone%3A%223.4.2+Release%22
[3.4.3-milestone]: https://github.com/tomchristie/django-rest-framework/issues?q=milestone%3A%223.4.3+Release%22
[3.4.4-milestone]: https://github.com/tomchristie/django-rest-framework/issues?q=milestone%3A%223.4.4+Release%22
[3.4.5-milestone]: https://github.com/tomchristie/django-rest-framework/issues?q=milestone%3A%223.4.5+Release%22
[3.4.6-milestone]: https://github.com/tomchristie/django-rest-framework/issues?q=milestone%3A%223.4.6+Release%22
[3.4.7-milestone]: https://github.com/tomchristie/django-rest-framework/issues?q=milestone%3A%223.4.7+Release%22
[3.5.0-milestone]: https://github.com/tomchristie/django-rest-framework/issues?q=milestone%3A%223.5.0+Release%22
[3.5.1-milestone]: https://github.com/tomchristie/django-rest-framework/issues?q=milestone%3A%223.5.1+Release%22
[3.5.2-milestone]: https://github.com/tomchristie/django-rest-framework/issues?q=milestone%3A%223.5.2+Release%22
<!-- 3.0.1 --> <!-- 3.0.1 -->
[gh2013]: https://github.com/tomchristie/django-rest-framework/issues/2013 [gh2013]: https://github.com/tomchristie/django-rest-framework/issues/2013
@ -726,3 +946,255 @@ For older release notes, [please see the version 2.x documentation][old-release-
[gh3636]: https://github.com/tomchristie/django-rest-framework/issues/3636 [gh3636]: https://github.com/tomchristie/django-rest-framework/issues/3636
[gh3605]: https://github.com/tomchristie/django-rest-framework/issues/3605 [gh3605]: https://github.com/tomchristie/django-rest-framework/issues/3605
[gh3604]: https://github.com/tomchristie/django-rest-framework/issues/3604 [gh3604]: https://github.com/tomchristie/django-rest-framework/issues/3604
<!-- 3.4.0 -->
[gh2403]: https://github.com/tomchristie/django-rest-framework/issues/2403
[gh2848]: https://github.com/tomchristie/django-rest-framework/issues/2848
[gh2996]: https://github.com/tomchristie/django-rest-framework/issues/2996
[gh3164]: https://github.com/tomchristie/django-rest-framework/issues/3164
[gh3273]: https://github.com/tomchristie/django-rest-framework/issues/3273
[gh3381]: https://github.com/tomchristie/django-rest-framework/issues/3381
[gh3438]: https://github.com/tomchristie/django-rest-framework/issues/3438
[gh3444]: https://github.com/tomchristie/django-rest-framework/issues/3444
[gh3476]: https://github.com/tomchristie/django-rest-framework/issues/3476
[gh3487]: https://github.com/tomchristie/django-rest-framework/issues/3487
[gh3541]: https://github.com/tomchristie/django-rest-framework/issues/3541
[gh3710]: https://github.com/tomchristie/django-rest-framework/issues/3710
[gh3729]: https://github.com/tomchristie/django-rest-framework/issues/3729
[gh3751]: https://github.com/tomchristie/django-rest-framework/issues/3751
[gh3812]: https://github.com/tomchristie/django-rest-framework/issues/3812
[gh3816]: https://github.com/tomchristie/django-rest-framework/issues/3816
[gh3820]: https://github.com/tomchristie/django-rest-framework/issues/3820
[gh3906]: https://github.com/tomchristie/django-rest-framework/issues/3906
[gh3908]: https://github.com/tomchristie/django-rest-framework/issues/3908
[gh3926]: https://github.com/tomchristie/django-rest-framework/issues/3926
[gh3933]: https://github.com/tomchristie/django-rest-framework/issues/3933
[gh3936]: https://github.com/tomchristie/django-rest-framework/issues/3936
[gh3938]: https://github.com/tomchristie/django-rest-framework/issues/3938
[gh3943]: https://github.com/tomchristie/django-rest-framework/issues/3943
[gh3953]: https://github.com/tomchristie/django-rest-framework/issues/3953
[gh3964]: https://github.com/tomchristie/django-rest-framework/issues/3964
[gh3968]: https://github.com/tomchristie/django-rest-framework/issues/3968
[gh3970]: https://github.com/tomchristie/django-rest-framework/issues/3970
[gh3971]: https://github.com/tomchristie/django-rest-framework/issues/3971
[gh3976]: https://github.com/tomchristie/django-rest-framework/issues/3976
[gh3983]: https://github.com/tomchristie/django-rest-framework/issues/3983
[gh3990]: https://github.com/tomchristie/django-rest-framework/issues/3990
[gh4002]: https://github.com/tomchristie/django-rest-framework/issues/4002
[gh4003]: https://github.com/tomchristie/django-rest-framework/issues/4003
[gh4005]: https://github.com/tomchristie/django-rest-framework/issues/4005
[gh4006]: https://github.com/tomchristie/django-rest-framework/issues/4006
[gh4008]: https://github.com/tomchristie/django-rest-framework/issues/4008
[gh4021]: https://github.com/tomchristie/django-rest-framework/issues/4021
[gh4025]: https://github.com/tomchristie/django-rest-framework/issues/4025
[gh4040]: https://github.com/tomchristie/django-rest-framework/issues/4040
[gh4041]: https://github.com/tomchristie/django-rest-framework/issues/4041
[gh4049]: https://github.com/tomchristie/django-rest-framework/issues/4049
[gh4075]: https://github.com/tomchristie/django-rest-framework/issues/4075
[gh4079]: https://github.com/tomchristie/django-rest-framework/issues/4079
[gh4090]: https://github.com/tomchristie/django-rest-framework/issues/4090
[gh4097]: https://github.com/tomchristie/django-rest-framework/issues/4097
[gh4098]: https://github.com/tomchristie/django-rest-framework/issues/4098
[gh4103]: https://github.com/tomchristie/django-rest-framework/issues/4103
[gh4105]: https://github.com/tomchristie/django-rest-framework/issues/4105
[gh4106]: https://github.com/tomchristie/django-rest-framework/issues/4106
[gh4107]: https://github.com/tomchristie/django-rest-framework/issues/4107
[gh4118]: https://github.com/tomchristie/django-rest-framework/issues/4118
[gh4146]: https://github.com/tomchristie/django-rest-framework/issues/4146
[gh4149]: https://github.com/tomchristie/django-rest-framework/issues/4149
[gh4153]: https://github.com/tomchristie/django-rest-framework/issues/4153
[gh4156]: https://github.com/tomchristie/django-rest-framework/issues/4156
[gh4157]: https://github.com/tomchristie/django-rest-framework/issues/4157
[gh4158]: https://github.com/tomchristie/django-rest-framework/issues/4158
[gh4166]: https://github.com/tomchristie/django-rest-framework/issues/4166
[gh4176]: https://github.com/tomchristie/django-rest-framework/issues/4176
[gh4179]: https://github.com/tomchristie/django-rest-framework/issues/4179
[gh4180]: https://github.com/tomchristie/django-rest-framework/issues/4180
[gh4181]: https://github.com/tomchristie/django-rest-framework/issues/4181
[gh4185]: https://github.com/tomchristie/django-rest-framework/issues/4185
[gh4187]: https://github.com/tomchristie/django-rest-framework/issues/4187
[gh4191]: https://github.com/tomchristie/django-rest-framework/issues/4191
[gh4192]: https://github.com/tomchristie/django-rest-framework/issues/4192
[gh4194]: https://github.com/tomchristie/django-rest-framework/issues/4194
[gh4195]: https://github.com/tomchristie/django-rest-framework/issues/4195
[gh4196]: https://github.com/tomchristie/django-rest-framework/issues/4196
[gh4212]: https://github.com/tomchristie/django-rest-framework/issues/4212
[gh4215]: https://github.com/tomchristie/django-rest-framework/issues/4215
[gh4217]: https://github.com/tomchristie/django-rest-framework/issues/4217
[gh4219]: https://github.com/tomchristie/django-rest-framework/issues/4219
[gh4229]: https://github.com/tomchristie/django-rest-framework/issues/4229
[gh4233]: https://github.com/tomchristie/django-rest-framework/issues/4233
[gh4244]: https://github.com/tomchristie/django-rest-framework/issues/4244
[gh4246]: https://github.com/tomchristie/django-rest-framework/issues/4246
[gh4253]: https://github.com/tomchristie/django-rest-framework/issues/4253
[gh4254]: https://github.com/tomchristie/django-rest-framework/issues/4254
[gh4255]: https://github.com/tomchristie/django-rest-framework/issues/4255
[gh4256]: https://github.com/tomchristie/django-rest-framework/issues/4256
[gh4259]: https://github.com/tomchristie/django-rest-framework/issues/4259
<!-- 3.4.1 -->
[gh4323]: https://github.com/tomchristie/django-rest-framework/issues/4323
[gh4268]: https://github.com/tomchristie/django-rest-framework/issues/4268
[gh4321]: https://github.com/tomchristie/django-rest-framework/issues/4321
[gh4308]: https://github.com/tomchristie/django-rest-framework/issues/4308
[gh4305]: https://github.com/tomchristie/django-rest-framework/issues/4305
[gh4316]: https://github.com/tomchristie/django-rest-framework/issues/4316
[gh4294]: https://github.com/tomchristie/django-rest-framework/issues/4294
[gh4293]: https://github.com/tomchristie/django-rest-framework/issues/4293
[gh4315]: https://github.com/tomchristie/django-rest-framework/issues/4315
[gh4314]: https://github.com/tomchristie/django-rest-framework/issues/4314
[gh4289]: https://github.com/tomchristie/django-rest-framework/issues/4289
[gh4265]: https://github.com/tomchristie/django-rest-framework/issues/4265
[gh4285]: https://github.com/tomchristie/django-rest-framework/issues/4285
[gh4287]: https://github.com/tomchristie/django-rest-framework/issues/4287
[gh4313]: https://github.com/tomchristie/django-rest-framework/issues/4313
[gh4281]: https://github.com/tomchristie/django-rest-framework/issues/4281
[gh4299]: https://github.com/tomchristie/django-rest-framework/issues/4299
[gh4307]: https://github.com/tomchristie/django-rest-framework/issues/4307
[gh4302]: https://github.com/tomchristie/django-rest-framework/issues/4302
[gh4303]: https://github.com/tomchristie/django-rest-framework/issues/4303
[gh4298]: https://github.com/tomchristie/django-rest-framework/issues/4298
[gh4291]: https://github.com/tomchristie/django-rest-framework/issues/4291
[gh4270]: https://github.com/tomchristie/django-rest-framework/issues/4270
[gh4272]: https://github.com/tomchristie/django-rest-framework/issues/4272
[gh4273]: https://github.com/tomchristie/django-rest-framework/issues/4273
[gh4288]: https://github.com/tomchristie/django-rest-framework/issues/4288
<!-- 3.4.2 -->
[gh3565]: https://github.com/tomchristie/django-rest-framework/issues/3565
[gh3610]: https://github.com/tomchristie/django-rest-framework/issues/3610
[gh4198]: https://github.com/tomchristie/django-rest-framework/issues/4198
[gh4199]: https://github.com/tomchristie/django-rest-framework/issues/4199
[gh4236]: https://github.com/tomchristie/django-rest-framework/issues/4236
[gh4292]: https://github.com/tomchristie/django-rest-framework/issues/4292
[gh4296]: https://github.com/tomchristie/django-rest-framework/issues/4296
[gh4318]: https://github.com/tomchristie/django-rest-framework/issues/4318
[gh4330]: https://github.com/tomchristie/django-rest-framework/issues/4330
[gh4331]: https://github.com/tomchristie/django-rest-framework/issues/4331
[gh4332]: https://github.com/tomchristie/django-rest-framework/issues/4332
[gh4335]: https://github.com/tomchristie/django-rest-framework/issues/4335
[gh4336]: https://github.com/tomchristie/django-rest-framework/issues/4336
[gh4338]: https://github.com/tomchristie/django-rest-framework/issues/4338
[gh4339]: https://github.com/tomchristie/django-rest-framework/issues/4339
[gh4340]: https://github.com/tomchristie/django-rest-framework/issues/4340
[gh4344]: https://github.com/tomchristie/django-rest-framework/issues/4344
[gh4345]: https://github.com/tomchristie/django-rest-framework/issues/4345
[gh4346]: https://github.com/tomchristie/django-rest-framework/issues/4346
[gh4347]: https://github.com/tomchristie/django-rest-framework/issues/4347
[gh4348]: https://github.com/tomchristie/django-rest-framework/issues/4348
[gh4349]: https://github.com/tomchristie/django-rest-framework/issues/4349
[gh4354]: https://github.com/tomchristie/django-rest-framework/issues/4354
[gh4357]: https://github.com/tomchristie/django-rest-framework/issues/4357
[gh4358]: https://github.com/tomchristie/django-rest-framework/issues/4358
[gh4359]: https://github.com/tomchristie/django-rest-framework/issues/4359
<!-- 3.4.3 -->
[gh4361]: https://github.com/tomchristie/django-rest-framework/issues/4361
<!-- 3.4.4 -->
[gh2829]: https://github.com/tomchristie/django-rest-framework/issues/2829
[gh3329]: https://github.com/tomchristie/django-rest-framework/issues/3329
[gh3330]: https://github.com/tomchristie/django-rest-framework/issues/3330
[gh3365]: https://github.com/tomchristie/django-rest-framework/issues/3365
[gh3394]: https://github.com/tomchristie/django-rest-framework/issues/3394
[gh3868]: https://github.com/tomchristie/django-rest-framework/issues/3868
[gh3868]: https://github.com/tomchristie/django-rest-framework/issues/3868
[gh3877]: https://github.com/tomchristie/django-rest-framework/issues/3877
[gh4042]: https://github.com/tomchristie/django-rest-framework/issues/4042
[gh4111]: https://github.com/tomchristie/django-rest-framework/issues/4111
[gh4119]: https://github.com/tomchristie/django-rest-framework/issues/4119
[gh4120]: https://github.com/tomchristie/django-rest-framework/issues/4120
[gh4121]: https://github.com/tomchristie/django-rest-framework/issues/4121
[gh4122]: https://github.com/tomchristie/django-rest-framework/issues/4122
[gh4137]: https://github.com/tomchristie/django-rest-framework/issues/4137
[gh4172]: https://github.com/tomchristie/django-rest-framework/issues/4172
[gh4201]: https://github.com/tomchristie/django-rest-framework/issues/4201
[gh4260]: https://github.com/tomchristie/django-rest-framework/issues/4260
[gh4278]: https://github.com/tomchristie/django-rest-framework/issues/4278
[gh4279]: https://github.com/tomchristie/django-rest-framework/issues/4279
[gh4329]: https://github.com/tomchristie/django-rest-framework/issues/4329
[gh4370]: https://github.com/tomchristie/django-rest-framework/issues/4370
[gh4371]: https://github.com/tomchristie/django-rest-framework/issues/4371
[gh4372]: https://github.com/tomchristie/django-rest-framework/issues/4372
[gh4373]: https://github.com/tomchristie/django-rest-framework/issues/4373
[gh4374]: https://github.com/tomchristie/django-rest-framework/issues/4374
[gh4375]: https://github.com/tomchristie/django-rest-framework/issues/4375
[gh4376]: https://github.com/tomchristie/django-rest-framework/issues/4376
[gh4377]: https://github.com/tomchristie/django-rest-framework/issues/4377
[gh4378]: https://github.com/tomchristie/django-rest-framework/issues/4378
[gh4379]: https://github.com/tomchristie/django-rest-framework/issues/4379
[gh4380]: https://github.com/tomchristie/django-rest-framework/issues/4380
[gh4382]: https://github.com/tomchristie/django-rest-framework/issues/4382
[gh4383]: https://github.com/tomchristie/django-rest-framework/issues/4383
[gh4386]: https://github.com/tomchristie/django-rest-framework/issues/4386
[gh4387]: https://github.com/tomchristie/django-rest-framework/issues/4387
[gh4388]: https://github.com/tomchristie/django-rest-framework/issues/4388
[gh4390]: https://github.com/tomchristie/django-rest-framework/issues/4390
[gh4391]: https://github.com/tomchristie/django-rest-framework/issues/4391
[gh4392]: https://github.com/tomchristie/django-rest-framework/issues/4392
[gh4393]: https://github.com/tomchristie/django-rest-framework/issues/4393
[gh4394]: https://github.com/tomchristie/django-rest-framework/issues/4394
<!-- 3.4.5 -->
[gh4416]: https://github.com/tomchristie/django-rest-framework/issues/4416
[gh4409]: https://github.com/tomchristie/django-rest-framework/issues/4409
[gh4415]: https://github.com/tomchristie/django-rest-framework/issues/4415
[gh4410]: https://github.com/tomchristie/django-rest-framework/issues/4410
[gh4408]: https://github.com/tomchristie/django-rest-framework/issues/4408
[gh4398]: https://github.com/tomchristie/django-rest-framework/issues/4398
[gh4407]: https://github.com/tomchristie/django-rest-framework/issues/4407
[gh4403]: https://github.com/tomchristie/django-rest-framework/issues/4403
[gh4404]: https://github.com/tomchristie/django-rest-framework/issues/4404
[gh4412]: https://github.com/tomchristie/django-rest-framework/issues/4412
<!-- 3.4.6 -->
[gh4435]: https://github.com/tomchristie/django-rest-framework/issues/4435
[gh4425]: https://github.com/tomchristie/django-rest-framework/issues/4425
[gh4429]: https://github.com/tomchristie/django-rest-framework/issues/4429
[gh3508]: https://github.com/tomchristie/django-rest-framework/issues/3508
[gh4419]: https://github.com/tomchristie/django-rest-framework/issues/4419
[gh4423]: https://github.com/tomchristie/django-rest-framework/issues/4423
<!-- 3.4.7 -->
[gh3951]: https://github.com/tomchristie/django-rest-framework/issues/3951
[gh4500]: https://github.com/tomchristie/django-rest-framework/issues/4500
[gh4489]: https://github.com/tomchristie/django-rest-framework/issues/4489
[gh4490]: https://github.com/tomchristie/django-rest-framework/issues/4490
[gh2617]: https://github.com/tomchristie/django-rest-framework/issues/2617
[gh4472]: https://github.com/tomchristie/django-rest-framework/issues/4472
[gh4473]: https://github.com/tomchristie/django-rest-framework/issues/4473
[gh4495]: https://github.com/tomchristie/django-rest-framework/issues/4495
[gh4493]: https://github.com/tomchristie/django-rest-framework/issues/4493
[gh4465]: https://github.com/tomchristie/django-rest-framework/issues/4465
[gh4462]: https://github.com/tomchristie/django-rest-framework/issues/4462
[gh4458]: https://github.com/tomchristie/django-rest-framework/issues/4458
<!-- 3.5.1 -->
[gh4612]: https://github.com/tomchristie/django-rest-framework/issues/4612
[gh4608]: https://github.com/tomchristie/django-rest-framework/issues/4608
[gh4601]: https://github.com/tomchristie/django-rest-framework/issues/4601
[gh4611]: https://github.com/tomchristie/django-rest-framework/issues/4611
[gh4605]: https://github.com/tomchristie/django-rest-framework/issues/4605
[gh4609]: https://github.com/tomchristie/django-rest-framework/issues/4609
[gh4606]: https://github.com/tomchristie/django-rest-framework/issues/4606
[gh4600]: https://github.com/tomchristie/django-rest-framework/issues/4600
<!-- 3.5.2 -->
[gh4631]: https://github.com/tomchristie/django-rest-framework/issues/4631
[gh4638]: https://github.com/tomchristie/django-rest-framework/issues/4638
[gh4532]: https://github.com/tomchristie/django-rest-framework/issues/4532
[gh4636]: https://github.com/tomchristie/django-rest-framework/issues/4636
[gh4622]: https://github.com/tomchristie/django-rest-framework/issues/4622
[gh4602]: https://github.com/tomchristie/django-rest-framework/issues/4602
[gh4640]: https://github.com/tomchristie/django-rest-framework/issues/4640
[gh4624]: https://github.com/tomchristie/django-rest-framework/issues/4624
[gh4569]: https://github.com/tomchristie/django-rest-framework/issues/4569
[gh4627]: https://github.com/tomchristie/django-rest-framework/issues/4627
[gh4620]: https://github.com/tomchristie/django-rest-framework/issues/4620
[gh4628]: https://github.com/tomchristie/django-rest-framework/issues/4628
[gh4639]: https://github.com/tomchristie/django-rest-framework/issues/4639

View File

@ -238,6 +238,7 @@ To submit new content, [open an issue][drf-create-issue] or [create a pull reque
* [djangorestframework-chain][djangorestframework-chain] - Allows arbitrary chaining of both relations and lookup filters. * [djangorestframework-chain][djangorestframework-chain] - Allows arbitrary chaining of both relations and lookup filters.
* [django-url-filter][django-url-filter] - Allows a safe way to filter data via human-friendly URLs. It is a generic library which is not tied to DRF but it provides easy integration with DRF. * [django-url-filter][django-url-filter] - Allows a safe way to filter data via human-friendly URLs. It is a generic library which is not tied to DRF but it provides easy integration with DRF.
* [drf-url-filter][drf-url-filter] is a simple Django app to apply filters on drf `ModelViewSet`'s `Queryset` in a clean, simple and configurable way. It also supports validations on incoming query params and their values.
### Misc ### Misc
@ -273,8 +274,6 @@ To submit new content, [open an issue][drf-create-issue] or [create a pull reque
* [Ember and Django Part 1 (Video)][ember-and-django-part 1-video] * [Ember and Django Part 1 (Video)][ember-and-django-part 1-video]
* [Django Rest Framework Part 1 (Video)][django-rest-framework-part-1-video] * [Django Rest Framework Part 1 (Video)][django-rest-framework-part-1-video]
* [Pyowa July 2013 - Django Rest Framework (Video)][pyowa-july-2013-django-rest-framework-video]
* [django-rest-framework and angularjs (Video)][django-rest-framework-and-angularjs-video]
### Articles ### Articles
@ -335,7 +334,7 @@ To submit new content, [open an issue][drf-create-issue] or [create a pull reque
[ember-django-adapter]: https://github.com/dustinfarris/ember-django-adapter [ember-django-adapter]: https://github.com/dustinfarris/ember-django-adapter
[beginners-guide-to-the-django-rest-framework]: http://code.tutsplus.com/tutorials/beginners-guide-to-the-django-rest-framework--cms-19786 [beginners-guide-to-the-django-rest-framework]: http://code.tutsplus.com/tutorials/beginners-guide-to-the-django-rest-framework--cms-19786
[getting-started-with-django-rest-framework-and-angularjs]: http://blog.kevinastone.com/getting-started-with-django-rest-framework-and-angularjs.html [getting-started-with-django-rest-framework-and-angularjs]: http://blog.kevinastone.com/getting-started-with-django-rest-framework-and-angularjs.html
[end-to-end-web-app-with-django-rest-framework-angularjs]: http://blog.mourafiq.com/post/55034504632/end-to-end-web-app-with-django-rest-framework [end-to-end-web-app-with-django-rest-framework-angularjs]: http://mourafiq.com/2013/07/01/end-to-end-web-app-with-django-angular-1.html
[start-your-api-django-rest-framework-part-1]: https://godjango.com/41-start-your-api-django-rest-framework-part-1/ [start-your-api-django-rest-framework-part-1]: https://godjango.com/41-start-your-api-django-rest-framework-part-1/
[permissions-authentication-django-rest-framework-part-2]: https://godjango.com/43-permissions-authentication-django-rest-framework-part-2/ [permissions-authentication-django-rest-framework-part-2]: https://godjango.com/43-permissions-authentication-django-rest-framework-part-2/
[viewsets-and-routers-django-rest-framework-part-3]: https://godjango.com/45-viewsets-and-routers-django-rest-framework-part-3/ [viewsets-and-routers-django-rest-framework-part-3]: https://godjango.com/45-viewsets-and-routers-django-rest-framework-part-3/
@ -343,8 +342,6 @@ To submit new content, [open an issue][drf-create-issue] or [create a pull reque
[check-credentials-using-django-rest-framework]: http://richardtier.com/2014/03/06/110/ [check-credentials-using-django-rest-framework]: http://richardtier.com/2014/03/06/110/
[ember-and-django-part 1-video]: http://www.neckbeardrepublic.com/screencasts/ember-and-django-part-1 [ember-and-django-part 1-video]: http://www.neckbeardrepublic.com/screencasts/ember-and-django-part-1
[django-rest-framework-part-1-video]: http://www.neckbeardrepublic.com/screencasts/django-rest-framework-part-1 [django-rest-framework-part-1-video]: http://www.neckbeardrepublic.com/screencasts/django-rest-framework-part-1
[pyowa-july-2013-django-rest-framework-video]: http://www.youtube.com/watch?v=e1zrehvxpbo
[django-rest-framework-and-angularjs-video]: http://www.youtube.com/watch?v=q8frbgtj020
[web-api-performance-profiling-django-rest-framework]: http://dabapps.com/blog/api-performance-profiling-django-rest-framework/ [web-api-performance-profiling-django-rest-framework]: http://dabapps.com/blog/api-performance-profiling-django-rest-framework/
[api-development-with-django-and-django-rest-framework]: https://bnotions.com/api-development-with-django-and-django-rest-framework/ [api-development-with-django-and-django-rest-framework]: https://bnotions.com/api-development-with-django-and-django-rest-framework/
[django-rest-auth]: https://github.com/Tivix/django-rest-auth/ [django-rest-auth]: https://github.com/Tivix/django-rest-auth/
@ -355,6 +352,7 @@ To submit new content, [open an issue][drf-create-issue] or [create a pull reque
[django-rest-framework-braces]: https://github.com/dealertrack/django-rest-framework-braces [django-rest-framework-braces]: https://github.com/dealertrack/django-rest-framework-braces
[dry-rest-permissions]: https://github.com/Helioscene/dry-rest-permissions [dry-rest-permissions]: https://github.com/Helioscene/dry-rest-permissions
[django-url-filter]: https://github.com/miki725/django-url-filter [django-url-filter]: https://github.com/miki725/django-url-filter
[drf-url-filter]: https://github.com/manjitkumar/drf-url-filters
[cookiecutter-django-rest]: https://github.com/agconti/cookiecutter-django-rest [cookiecutter-django-rest]: https://github.com/agconti/cookiecutter-django-rest
[drf-haystack]: https://drf-haystack.readthedocs.io/en/latest/ [drf-haystack]: https://drf-haystack.readthedocs.io/en/latest/
[django-rest-framework-version-transforms]: https://github.com/mrhwick/django-rest-framework-version-transforms [django-rest-framework-version-transforms]: https://github.com/mrhwick/django-rest-framework-version-transforms

View File

@ -88,7 +88,7 @@ The first thing we need to get started on our Web API is to provide a way of ser
class SnippetSerializer(serializers.Serializer): class SnippetSerializer(serializers.Serializer):
pk = serializers.IntegerField(read_only=True) id = serializers.IntegerField(read_only=True)
title = serializers.CharField(required=False, allow_blank=True, max_length=100) title = serializers.CharField(required=False, allow_blank=True, max_length=100)
code = serializers.CharField(style={'base_template': 'textarea.html'}) code = serializers.CharField(style={'base_template': 'textarea.html'})
linenos = serializers.BooleanField(required=False) linenos = serializers.BooleanField(required=False)
@ -144,13 +144,13 @@ We've now got a few snippet instances to play with. Let's take a look at serial
serializer = SnippetSerializer(snippet) serializer = SnippetSerializer(snippet)
serializer.data serializer.data
# {'pk': 2, 'title': u'', 'code': u'print "hello, world"\n', 'linenos': False, 'language': u'python', 'style': u'friendly'} # {'id': 2, 'title': u'', 'code': u'print "hello, world"\n', 'linenos': False, 'language': u'python', 'style': u'friendly'}
At this point we've translated the model instance into Python native datatypes. To finalize the serialization process we render the data into `json`. At this point we've translated the model instance into Python native datatypes. To finalize the serialization process we render the data into `json`.
content = JSONRenderer().render(serializer.data) content = JSONRenderer().render(serializer.data)
content content
# '{"pk": 2, "title": "", "code": "print \\"hello, world\\"\\n", "linenos": false, "language": "python", "style": "friendly"}' # '{"id": 2, "title": "", "code": "print \\"hello, world\\"\\n", "linenos": false, "language": "python", "style": "friendly"}'
Deserialization is similar. First we parse a stream into Python native datatypes... Deserialization is similar. First we parse a stream into Python native datatypes...
@ -175,7 +175,7 @@ We can also serialize querysets instead of model instances. To do so we simply
serializer = SnippetSerializer(Snippet.objects.all(), many=True) serializer = SnippetSerializer(Snippet.objects.all(), many=True)
serializer.data serializer.data
# [OrderedDict([('pk', 1), ('title', u''), ('code', u'foo = "bar"\n'), ('linenos', False), ('language', 'python'), ('style', 'friendly')]), OrderedDict([('pk', 2), ('title', u''), ('code', u'print "hello, world"\n'), ('linenos', False), ('language', 'python'), ('style', 'friendly')]), OrderedDict([('pk', 3), ('title', u''), ('code', u'print "hello, world"'), ('linenos', False), ('language', 'python'), ('style', 'friendly')])] # [OrderedDict([('id', 1), ('title', u''), ('code', u'foo = "bar"\n'), ('linenos', False), ('language', 'python'), ('style', 'friendly')]), OrderedDict([('id', 2), ('title', u''), ('code', u'print "hello, world"\n'), ('linenos', False), ('language', 'python'), ('style', 'friendly')]), OrderedDict([('id', 3), ('title', u''), ('code', u'print "hello, world"'), ('linenos', False), ('language', 'python'), ('style', 'friendly')])]
## Using ModelSerializers ## Using ModelSerializers

View File

@ -25,7 +25,7 @@ Using numeric HTTP status codes in your views doesn't always make for obvious re
REST framework provides two wrappers you can use to write API views. REST framework provides two wrappers you can use to write API views.
1. The `@api_view` decorator for working with function based views. 1. The `@api_view` decorator for working with function based views.
2. The `APIView` class for working with class based views. 2. The `APIView` class for working with class-based views.
These wrappers provide a few bits of functionality such as making sure you receive `Request` instances in your view, and adding context to `Response` objects so that content negotiation can be performed. These wrappers provide a few bits of functionality such as making sure you receive `Request` instances in your view, and adding context to `Response` objects so that content negotiation can be performed.
@ -96,7 +96,7 @@ Notice that we're no longer explicitly tying our requests or responses to a give
## Adding optional format suffixes to our URLs ## Adding optional format suffixes to our URLs
To take advantage of the fact that our responses are no longer hardwired to a single content type let's add support for format suffixes to our API endpoints. Using format suffixes gives us URLs that explicitly refer to a given format, and means our API will be able to handle URLs such as [http://example.com/api/items/4/.json][json-url]. To take advantage of the fact that our responses are no longer hardwired to a single content type let's add support for format suffixes to our API endpoints. Using format suffixes gives us URLs that explicitly refer to a given format, and means our API will be able to handle URLs such as [http://example.com/api/items/4.json][json-url].
Start by adding a `format` keyword argument to both of the views, like so. Start by adding a `format` keyword argument to both of the views, like so.
@ -200,9 +200,9 @@ See the [browsable api][browsable-api] topic for more information about the brow
## What's next? ## What's next?
In [tutorial part 3][tut-3], we'll start using class based views, and see how generic views reduce the amount of code we need to write. In [tutorial part 3][tut-3], we'll start using class-based views, and see how generic views reduce the amount of code we need to write.
[json-url]: http://example.com/api/items/4/.json [json-url]: http://example.com/api/items/4.json
[devserver]: http://127.0.0.1:8000/snippets/ [devserver]: http://127.0.0.1:8000/snippets/
[browsable-api]: ../topics/browsable-api.md [browsable-api]: ../topics/browsable-api.md
[tut-1]: 1-serialization.md [tut-1]: 1-serialization.md

View File

@ -1,10 +1,10 @@
# Tutorial 3: Class Based Views # Tutorial 3: Class-based Views
We can also write our API views using class based views, rather than function based views. As we'll see this is a powerful pattern that allows us to reuse common functionality, and helps us keep our code [DRY][dry]. We can also write our API views using class-based views, rather than function based views. As we'll see this is a powerful pattern that allows us to reuse common functionality, and helps us keep our code [DRY][dry].
## Rewriting our API using class based views ## Rewriting our API using class-based views
We'll start by rewriting the root view as a class based view. All this involves is a little bit of refactoring of `views.py`. We'll start by rewriting the root view as a class-based view. All this involves is a little bit of refactoring of `views.py`.
from snippets.models import Snippet from snippets.models import Snippet
from snippets.serializers import SnippetSerializer from snippets.serializers import SnippetSerializer
@ -62,7 +62,7 @@ So far, so good. It looks pretty similar to the previous case, but we've got be
That's looking good. Again, it's still pretty similar to the function based view right now. That's looking good. Again, it's still pretty similar to the function based view right now.
We'll also need to refactor our `urls.py` slightly now we're using class based views. We'll also need to refactor our `urls.py` slightly now we're using class-based views.
from django.conf.urls import url from django.conf.urls import url
from rest_framework.urlpatterns import format_suffix_patterns from rest_framework.urlpatterns import format_suffix_patterns
@ -79,7 +79,7 @@ Okay, we're done. If you run the development server everything should be workin
## Using mixins ## Using mixins
One of the big wins of using class based views is that it allows us to easily compose reusable bits of behaviour. One of the big wins of using class-based views is that it allows us to easily compose reusable bits of behaviour.
The create/retrieve/update/delete operations that we've been using so far are going to be pretty similar for any model-backed API views we create. Those bits of common behaviour are implemented in REST framework's mixin classes. The create/retrieve/update/delete operations that we've been using so far are going to be pretty similar for any model-backed API views we create. Those bits of common behaviour are implemented in REST framework's mixin classes.
@ -124,7 +124,7 @@ The base class provides the core functionality, and the mixin classes provide th
Pretty similar. Again we're using the `GenericAPIView` class to provide the core functionality, and adding in mixins to provide the `.retrieve()`, `.update()` and `.destroy()` actions. Pretty similar. Again we're using the `GenericAPIView` class to provide the core functionality, and adding in mixins to provide the `.retrieve()`, `.update()` and `.destroy()` actions.
## Using generic class based views ## Using generic class-based views
Using the mixin classes we've rewritten the views to use slightly less code than before, but we can go one step further. REST framework provides a set of already mixed-in generic views that we can use to trim down our `views.py` module even more. Using the mixin classes we've rewritten the views to use slightly less code than before, but we can go one step further. REST framework provides a set of already mixed-in generic views that we can use to trim down our `views.py` module even more.

View File

@ -14,7 +14,7 @@ First, let's add a couple of fields. One of those fields will be used to repres
Add the following two fields to the `Snippet` model in `models.py`. Add the following two fields to the `Snippet` model in `models.py`.
owner = models.ForeignKey('auth.User', related_name='snippets') owner = models.ForeignKey('auth.User', related_name='snippets', on_delete=models.CASCADE)
highlighted = models.TextField() highlighted = models.TextField()
We'd also need to make sure that when the model is saved, that we populate the highlighted field, using the `pygments` code highlighting library. We'd also need to make sure that when the model is saved, that we populate the highlighted field, using the `pygments` code highlighting library.
@ -67,7 +67,7 @@ Now that we've got some users to work with, we'd better add representations of t
Because `'snippets'` is a *reverse* relationship on the User model, it will not be included by default when using the `ModelSerializer` class, so we needed to add an explicit field for it. Because `'snippets'` is a *reverse* relationship on the User model, it will not be included by default when using the `ModelSerializer` class, so we needed to add an explicit field for it.
We'll also add a couple of views to `views.py`. We'd like to just use read-only views for the user representations, so we'll use the `ListAPIView` and `RetrieveAPIView` generic class based views. We'll also add a couple of views to `views.py`. We'd like to just use read-only views for the user representations, so we'll use the `ListAPIView` and `RetrieveAPIView` generic class-based views.
from django.contrib.auth.models import User from django.contrib.auth.models import User
@ -150,7 +150,7 @@ The `r'^api-auth/'` part of pattern can actually be whatever URL you want to use
Now if you open up the browser again and refresh the page you'll see a 'Login' link in the top right of the page. If you log in as one of the users you created earlier, you'll be able to create code snippets again. Now if you open up the browser again and refresh the page you'll see a 'Login' link in the top right of the page. If you log in as one of the users you created earlier, you'll be able to create code snippets again.
Once you've created a few code snippets, navigate to the '/users/' endpoint, and notice that the representation includes a list of the snippet pks that are associated with each user, in each user's 'snippets' field. Once you've created a few code snippets, navigate to the '/users/' endpoint, and notice that the representation includes a list of the snippet ids that are associated with each user, in each user's 'snippets' field.
## Object level permissions ## Object level permissions

View File

@ -67,7 +67,7 @@ In this case we'd like to use a hyperlinked style between entities. In order to
The `HyperlinkedModelSerializer` has the following differences from `ModelSerializer`: The `HyperlinkedModelSerializer` has the following differences from `ModelSerializer`:
* It does not include the `pk` field by default. * It does not include the `id` field by default.
* It includes a `url` field, using `HyperlinkedIdentityField`. * It includes a `url` field, using `HyperlinkedIdentityField`.
* Relationships use `HyperlinkedRelatedField`, * Relationships use `HyperlinkedRelatedField`,
instead of `PrimaryKeyRelatedField`. instead of `PrimaryKeyRelatedField`.
@ -80,7 +80,7 @@ We can easily re-write our existing serializers to use hyperlinking. In your `sn
class Meta: class Meta:
model = Snippet model = Snippet
fields = ('url', 'highlight', 'owner', fields = ('url', 'id', 'highlight', 'owner',
'title', 'code', 'linenos', 'language', 'style') 'title', 'code', 'linenos', 'language', 'style')
@ -89,7 +89,7 @@ We can easily re-write our existing serializers to use hyperlinking. In your `sn
class Meta: class Meta:
model = User model = User
fields = ('url', 'username', 'snippets') fields = ('url', 'id', 'username', 'snippets')
Notice that we've also added a new `'highlight'` field. This field is of the same type as the `url` field, except that it points to the `'snippet-highlight'` url pattern, instead of the `'snippet-detail'` url pattern. Notice that we've also added a new `'highlight'` field. This field is of the same type as the `url` field, except that it points to the `'snippet-highlight'` url pattern, instead of the `'snippet-detail'` url pattern.

View File

@ -51,7 +51,7 @@ This time we've used the `ModelViewSet` class in order to get the complete set o
Notice that we've also used the `@detail_route` decorator to create a custom action, named `highlight`. This decorator can be used to add any custom endpoints that don't fit into the standard `create`/`update`/`delete` style. Notice that we've also used the `@detail_route` decorator to create a custom action, named `highlight`. This decorator can be used to add any custom endpoints that don't fit into the standard `create`/`update`/`delete` style.
Custom actions which use the `@detail_route` decorator will respond to `GET` requests. We can use the `methods` argument if we wanted an action that responded to `POST` requests. Custom actions which use the `@detail_route` decorator will respond to `GET` requests by default. We can use the `methods` argument if we wanted an action that responded to `POST` requests.
The URLs for custom actions by default depend on the method name itself. If you want to change the way url should be constructed, you can include url_path as a decorator keyword argument. The URLs for custom actions by default depend on the method name itself. If you want to change the way url should be constructed, you can include url_path as a decorator keyword argument.

View File

@ -33,10 +33,17 @@ API schema.
$ pip install coreapi $ pip install coreapi
We can now include a schema for our API, by adding a `schema_title` argument to We can now include a schema for our API, by including an autogenerated schema
the router instantiation. view in our URL configuration.
router = DefaultRouter(schema_title='Pastebin API') from rest_framework.schemas import get_schema_view
schema_view = get_schema_view(title='Pastebin API')
urlpatterns = [
url('^schema/$', schema_view),
...
]
If you visit the API root endpoint in a browser you should now see `corejson` If you visit the API root endpoint in a browser you should now see `corejson`
representation become available as an option. representation become available as an option.
@ -46,10 +53,10 @@ representation become available as an option.
We can also request the schema from the command line, by specifying the desired We can also request the schema from the command line, by specifying the desired
content type in the `Accept` header. content type in the `Accept` header.
$ http http://127.0.0.1:8000/ Accept:application/vnd.coreapi+json $ http http://127.0.0.1:8000/schema/ Accept:application/coreapi+json
HTTP/1.0 200 OK HTTP/1.0 200 OK
Allow: GET, HEAD, OPTIONS Allow: GET, HEAD, OPTIONS
Content-Type: application/vnd.coreapi+json Content-Type: application/coreapi+json
{ {
"_meta": { "_meta": {
@ -67,9 +74,13 @@ also supported.
Now that our API is exposing a schema endpoint, we can use a dynamic client Now that our API is exposing a schema endpoint, we can use a dynamic client
library to interact with the API. To demonstrate this, let's use the library to interact with the API. To demonstrate this, let's use the
Core API command line client. We've already installed the `coreapi` package Core API command line client.
using `pip`, so the client tool should already be installed. Check that it
is available on the command line... The command line client is available as the `coreapi-cli` package:
$ pip install coreapi-cli
Now check that it is available on the command line...
$ coreapi $ coreapi
Usage: coreapi [OPTIONS] COMMAND [ARGS]... Usage: coreapi [OPTIONS] COMMAND [ARGS]...
@ -87,16 +98,16 @@ is available on the command line...
First we'll load the API schema using the command line client. First we'll load the API schema using the command line client.
$ coreapi get http://127.0.0.1:8000/ $ coreapi get http://127.0.0.1:8000/schema/
<Pastebin API "http://127.0.0.1:8000/"> <Pastebin API "http://127.0.0.1:8000/schema/">
snippets: { snippets: {
highlight(pk) highlight(id)
list() list()
retrieve(pk) read(id)
} }
users: { users: {
list() list()
retrieve(pk) read(id)
} }
We haven't authenticated yet, so right now we're only able to see the read only We haven't authenticated yet, so right now we're only able to see the read only
@ -108,6 +119,7 @@ Let's try listing the existing snippets, using the command line client:
[ [
{ {
"url": "http://127.0.0.1:8000/snippets/1/", "url": "http://127.0.0.1:8000/snippets/1/",
"id": 1,
"highlight": "http://127.0.0.1:8000/snippets/1/highlight/", "highlight": "http://127.0.0.1:8000/snippets/1/highlight/",
"owner": "lucy", "owner": "lucy",
"title": "Example", "title": "Example",
@ -121,7 +133,7 @@ Let's try listing the existing snippets, using the command line client:
Some of the API endpoints require named parameters. For example, to get back Some of the API endpoints require named parameters. For example, to get back
the highlight HTML for a particular snippet we need to provide an id. the highlight HTML for a particular snippet we need to provide an id.
$ coreapi action snippets highlight --param pk 1 $ coreapi action snippets highlight --param id=1
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html> <html>
@ -145,25 +157,25 @@ Now if we fetch the schema again, we should be able to see the full
set of available interactions. set of available interactions.
$ coreapi reload $ coreapi reload
Pastebin API "http://127.0.0.1:8000/"> Pastebin API "http://127.0.0.1:8000/schema/">
snippets: { snippets: {
create(code, [title], [linenos], [language], [style]) create(code, [title], [linenos], [language], [style])
destroy(pk) delete(id)
highlight(pk) highlight(id)
list() list()
partial_update(pk, [title], [code], [linenos], [language], [style]) partial_update(id, [title], [code], [linenos], [language], [style])
retrieve(pk) read(id)
update(pk, code, [title], [linenos], [language], [style]) update(id, code, [title], [linenos], [language], [style])
} }
users: { users: {
list() list()
retrieve(pk) read(id)
} }
We're now able to interact with these endpoints. For example, to create a new We're now able to interact with these endpoints. For example, to create a new
snippet: snippet:
$ coreapi action snippets create --param title "Example" --param code "print('hello, world')" $ coreapi action snippets create --param title="Example" --param code="print('hello, world')"
{ {
"url": "http://127.0.0.1:8000/snippets/7/", "url": "http://127.0.0.1:8000/snippets/7/",
"id": 7, "id": 7,
@ -178,7 +190,7 @@ snippet:
And to delete a snippet: And to delete a snippet:
$ coreapi action snippets destroy --param pk 7 $ coreapi action snippets delete --param id=7
As well as the command line client, developers can also interact with your As well as the command line client, developers can also interact with your
API using client libraries. The Python client library is the first of these API using client libraries. The Python client library is the first of these

View File

@ -104,7 +104,7 @@ Okay, now let's wire up the API URLs. On to `tutorial/urls.py`...
Because we're using viewsets instead of views, we can automatically generate the URL conf for our API, by simply registering the viewsets with a router class. Because we're using viewsets instead of views, we can automatically generate the URL conf for our API, by simply registering the viewsets with a router class.
Again, if we need more control over the API URLs we can simply drop down to using regular class based views, and writing the URL conf explicitly. Again, if we need more control over the API URLs we can simply drop down to using regular class-based views, and writing the URL conf explicitly.
Finally, we're including default login and logout views for use with the browsable API. That's optional, but useful if your API requires authentication and you want to use the browsable API. Finally, we're including default login and logout views for use with the browsable API. That's optional, but useful if your API requires authentication and you want to use the browsable API.

View File

@ -65,6 +65,8 @@ pages:
- '3.1 Announcement': 'topics/3.1-announcement.md' - '3.1 Announcement': 'topics/3.1-announcement.md'
- '3.2 Announcement': 'topics/3.2-announcement.md' - '3.2 Announcement': 'topics/3.2-announcement.md'
- '3.3 Announcement': 'topics/3.3-announcement.md' - '3.3 Announcement': 'topics/3.3-announcement.md'
- '3.4 Announcement': 'topics/3.4-announcement.md'
- '3.5 Announcement': 'topics/3.5-announcement.md'
- 'Kickstarter Announcement': 'topics/kickstarter-announcement.md' - 'Kickstarter Announcement': 'topics/kickstarter-announcement.md'
- 'Mozilla Grant': 'topics/mozilla-grant.md' - 'Mozilla Grant': 'topics/mozilla-grant.md'
- 'Funding': 'topics/funding.md' - 'Funding': 'topics/funding.md'

View File

@ -1,5 +1,5 @@
# Optional packages which may be used with REST framework. # Optional packages which may be used with REST framework.
markdown==2.6.4 markdown==2.6.4
django-guardian==1.4.3 django-guardian==1.4.6
django-filter==0.13.0 django-filter==0.15.3
coreapi==1.21.1 coreapi==2.0.8

View File

@ -8,7 +8,7 @@ ______ _____ _____ _____ __
""" """
__title__ = 'Django REST framework' __title__ = 'Django REST framework'
__version__ = '3.3.3' __version__ = '3.5.2'
__author__ = 'Tom Christie' __author__ = 'Tom Christie'
__license__ = 'BSD 2-Clause' __license__ = 'BSD 2-Clause'
__copyright__ = 'Copyright 2011-2016 Tom Christie' __copyright__ = 'Copyright 2011-2016 Tom Christie'

View File

@ -16,15 +16,18 @@ class AuthTokenSerializer(serializers.Serializer):
user = authenticate(username=username, password=password) user = authenticate(username=username, password=password)
if user: if user:
# From Django 1.10 onwards the `authenticate` call simply
# returns `None` for is_active=False users.
# (Assuming the default `ModelBackend` authentication backend.)
if not user.is_active: if not user.is_active:
msg = _('User account is disabled.') msg = _('User account is disabled.')
raise serializers.ValidationError(msg) raise serializers.ValidationError(msg, code='authorization')
else: else:
msg = _('Unable to log in with provided credentials.') msg = _('Unable to log in with provided credentials.')
raise serializers.ValidationError(msg) raise serializers.ValidationError(msg, code='authorization')
else: else:
msg = _('Must include "username" and "password".') msg = _('Must include "username" and "password".')
raise serializers.ValidationError(msg) raise serializers.ValidationError(msg, code='authorization')
attrs['user'] = user attrs['user'] = user
return attrs return attrs

View File

@ -23,6 +23,22 @@ except ImportError:
from django.utils import importlib # Will be removed in Django 1.9 from django.utils import importlib # Will be removed in Django 1.9
try:
from django.urls import (
NoReverseMatch, RegexURLPattern, RegexURLResolver, ResolverMatch, Resolver404, get_script_prefix, reverse, reverse_lazy, resolve
)
except ImportError:
from django.core.urlresolvers import ( # Will be removed in Django 2.0
NoReverseMatch, RegexURLPattern, RegexURLResolver, ResolverMatch, Resolver404, get_script_prefix, reverse, reverse_lazy, resolve
)
try:
import urlparse # Python 2.x
except ImportError:
import urllib.parse as urlparse
def unicode_repr(instance): def unicode_repr(instance):
# Get the repr of an instance, but ensure it is a unicode string # Get the repr of an instance, but ensure it is a unicode string
# on both python 3 (already the case) and 2 (not the case). # on both python 3 (already the case) and 2 (not the case).
@ -116,6 +132,18 @@ def _resolve_model(obj):
raise ValueError("{0} is not a Django model".format(obj)) raise ValueError("{0} is not a Django model".format(obj))
def is_authenticated(user):
if django.VERSION < (1, 10):
return user.is_authenticated()
return user.is_authenticated
def is_anonymous(user):
if django.VERSION < (1, 10):
return user.is_anonymous()
return user.is_anonymous
def get_related_model(field): def get_related_model(field):
if django.VERSION < (1, 9): if django.VERSION < (1, 9):
return _resolve_model(field.rel.to) return _resolve_model(field.rel.to)
@ -125,7 +153,7 @@ def get_related_model(field):
def value_from_object(field, obj): def value_from_object(field, obj):
if django.VERSION < (1, 9): if django.VERSION < (1, 9):
return field._get_val_from_obj(obj) return field._get_val_from_obj(obj)
field.value_from_object(obj) return field.value_from_object(obj)
# contrib.postgres only supported from 1.8 onwards. # contrib.postgres only supported from 1.8 onwards.
@ -142,6 +170,16 @@ except ImportError:
JSONField = None JSONField = None
# coreapi is optional (Note that uritemplate is a dependency of coreapi)
try:
import coreapi
import uritemplate
except (ImportError, SyntaxError):
# SyntaxError is possible under python 3.2
coreapi = None
uritemplate = None
# django-filter is optional # django-filter is optional
try: try:
import django_filters import django_filters
@ -156,14 +194,11 @@ except ImportError:
crispy_forms = None crispy_forms = None
# coreapi is optional (Note that uritemplate is a dependancy of coreapi) # requests is optional
try: try:
import coreapi import requests
import uritemplate except ImportError:
except (ImportError, SyntaxError): requests = None
# SyntaxError is possible under python 3.2
coreapi = None
uritemplate = None
# Django-guardian is optional. Import only if guardian is in INSTALLED_APPS # Django-guardian is optional. Import only if guardian is in INSTALLED_APPS
@ -172,7 +207,6 @@ guardian = None
try: try:
if 'guardian' in settings.INSTALLED_APPS: if 'guardian' in settings.INSTALLED_APPS:
import guardian import guardian
import guardian.shortcuts # Fixes #1624
except ImportError: except ImportError:
pass pass
@ -188,8 +222,13 @@ try:
if markdown.version <= '2.2': if markdown.version <= '2.2':
HEADERID_EXT_PATH = 'headerid' HEADERID_EXT_PATH = 'headerid'
else: LEVEL_PARAM = 'level'
elif markdown.version < '2.6':
HEADERID_EXT_PATH = 'markdown.extensions.headerid' HEADERID_EXT_PATH = 'markdown.extensions.headerid'
LEVEL_PARAM = 'level'
else:
HEADERID_EXT_PATH = 'markdown.extensions.toc'
LEVEL_PARAM = 'baselevel'
def apply_markdown(text): def apply_markdown(text):
""" """
@ -199,7 +238,7 @@ try:
extensions = [HEADERID_EXT_PATH] extensions = [HEADERID_EXT_PATH]
extension_configs = { extension_configs = {
HEADERID_EXT_PATH: { HEADERID_EXT_PATH: {
'level': '2' LEVEL_PARAM: '2'
} }
} }
md = markdown.Markdown( md = markdown.Markdown(
@ -265,3 +304,11 @@ def template_render(template, context=None, request=None):
# backends template, e.g. django.template.backends.django.Template # backends template, e.g. django.template.backends.django.Template
else: else:
return template.render(context, request=request) return template.render(context, request=request)
def set_many(instance, field, value):
if django.VERSION < (1, 10):
setattr(instance, field, value)
else:
field = getattr(instance, field)
field.set(value)

View File

@ -15,7 +15,7 @@ from django.utils import six
from rest_framework.views import APIView from rest_framework.views import APIView
def api_view(http_method_names=None): def api_view(http_method_names=None, exclude_from_schema=False):
""" """
Decorator that converts a function-based view into an APIView subclass. Decorator that converts a function-based view into an APIView subclass.
Takes a list of allowed methods for the view as an argument. Takes a list of allowed methods for the view as an argument.
@ -55,6 +55,7 @@ def api_view(http_method_names=None):
setattr(WrappedAPIView, method.lower(), handler) setattr(WrappedAPIView, method.lower(), handler)
WrappedAPIView.__name__ = func.__name__ WrappedAPIView.__name__ = func.__name__
WrappedAPIView.__module__ = func.__module__
WrappedAPIView.renderer_classes = getattr(func, 'renderer_classes', WrappedAPIView.renderer_classes = getattr(func, 'renderer_classes',
APIView.renderer_classes) APIView.renderer_classes)
@ -71,6 +72,7 @@ def api_view(http_method_names=None):
WrappedAPIView.permission_classes = getattr(func, 'permission_classes', WrappedAPIView.permission_classes = getattr(func, 'permission_classes',
APIView.permission_classes) APIView.permission_classes)
WrappedAPIView.exclude_from_schema = exclude_from_schema
return WrappedAPIView.as_view() return WrappedAPIView.as_view()
return decorator return decorator

View File

@ -17,27 +17,61 @@ from rest_framework import status
from rest_framework.utils.serializer_helpers import ReturnDict, ReturnList from rest_framework.utils.serializer_helpers import ReturnDict, ReturnList
def _force_text_recursive(data): def _get_error_details(data, default_code=None):
""" """
Descend into a nested data structure, forcing any Descend into a nested data structure, forcing any
lazy translation strings into plain text. lazy translation strings or strings into `ErrorDetail`.
""" """
if isinstance(data, list): if isinstance(data, list):
ret = [ ret = [
_force_text_recursive(item) for item in data _get_error_details(item, default_code) for item in data
] ]
if isinstance(data, ReturnList): if isinstance(data, ReturnList):
return ReturnList(ret, serializer=data.serializer) return ReturnList(ret, serializer=data.serializer)
return ret return ret
elif isinstance(data, dict): elif isinstance(data, dict):
ret = { ret = {
key: _force_text_recursive(value) key: _get_error_details(value, default_code)
for key, value in data.items() for key, value in data.items()
} }
if isinstance(data, ReturnDict): if isinstance(data, ReturnDict):
return ReturnDict(ret, serializer=data.serializer) return ReturnDict(ret, serializer=data.serializer)
return ret return ret
return force_text(data)
text = force_text(data)
code = getattr(data, 'code', default_code)
return ErrorDetail(text, code)
def _get_codes(detail):
if isinstance(detail, list):
return [_get_codes(item) for item in detail]
elif isinstance(detail, dict):
return {key: _get_codes(value) for key, value in detail.items()}
return detail.code
def _get_full_details(detail):
if isinstance(detail, list):
return [_get_full_details(item) for item in detail]
elif isinstance(detail, dict):
return {key: _get_full_details(value) for key, value in detail.items()}
return {
'message': detail,
'code': detail.code
}
class ErrorDetail(six.text_type):
"""
A string-like object that can additionally
"""
code = None
def __new__(cls, string, code=None):
self = super(ErrorDetail, cls).__new__(cls, string)
self.code = code
return self
class APIException(Exception): class APIException(Exception):
@ -47,16 +81,35 @@ class APIException(Exception):
""" """
status_code = status.HTTP_500_INTERNAL_SERVER_ERROR status_code = status.HTTP_500_INTERNAL_SERVER_ERROR
default_detail = _('A server error occurred.') default_detail = _('A server error occurred.')
default_code = 'error'
def __init__(self, detail=None): def __init__(self, detail=None, code=None):
if detail is not None: if detail is None:
self.detail = force_text(detail) detail = self.default_detail
else: if code is None:
self.detail = force_text(self.default_detail) code = self.default_code
self.detail = _get_error_details(detail, code)
def __str__(self): def __str__(self):
return self.detail return self.detail
def get_codes(self):
"""
Return only the code part of the error details.
Eg. {"name": ["required"]}
"""
return _get_codes(self.detail)
def get_full_details(self):
"""
Return both the message & code parts of the error details.
Eg. {"name": [{"message": "This field is required.", "code": "required"}]}
"""
return _get_full_details(self.detail)
# The recommended style for using `ValidationError` is to keep it namespaced # The recommended style for using `ValidationError` is to keep it namespaced
# under `serializers`, in order to minimize potential confusion with Django's # under `serializers`, in order to minimize potential confusion with Django's
@ -67,13 +120,21 @@ class APIException(Exception):
class ValidationError(APIException): class ValidationError(APIException):
status_code = status.HTTP_400_BAD_REQUEST status_code = status.HTTP_400_BAD_REQUEST
default_detail = _('Invalid input.')
default_code = 'invalid'
def __init__(self, detail): def __init__(self, detail, code=None):
# For validation errors the 'detail' key is always required. if detail is None:
# The details should always be coerced to a list if not already. detail = self.default_detail
if code is None:
code = self.default_code
# For validation failures, we may collect may errors together, so the
# details should always be coerced to a list if not already.
if not isinstance(detail, dict) and not isinstance(detail, list): if not isinstance(detail, dict) and not isinstance(detail, list):
detail = [detail] detail = [detail]
self.detail = _force_text_recursive(detail)
self.detail = _get_error_details(detail, code)
def __str__(self): def __str__(self):
return six.text_type(self.detail) return six.text_type(self.detail)
@ -82,62 +143,63 @@ class ValidationError(APIException):
class ParseError(APIException): class ParseError(APIException):
status_code = status.HTTP_400_BAD_REQUEST status_code = status.HTTP_400_BAD_REQUEST
default_detail = _('Malformed request.') default_detail = _('Malformed request.')
default_code = 'parse_error'
class AuthenticationFailed(APIException): class AuthenticationFailed(APIException):
status_code = status.HTTP_401_UNAUTHORIZED status_code = status.HTTP_401_UNAUTHORIZED
default_detail = _('Incorrect authentication credentials.') default_detail = _('Incorrect authentication credentials.')
default_code = 'authentication_failed'
class NotAuthenticated(APIException): class NotAuthenticated(APIException):
status_code = status.HTTP_401_UNAUTHORIZED status_code = status.HTTP_401_UNAUTHORIZED
default_detail = _('Authentication credentials were not provided.') default_detail = _('Authentication credentials were not provided.')
default_code = 'not_authenticated'
class PermissionDenied(APIException): class PermissionDenied(APIException):
status_code = status.HTTP_403_FORBIDDEN status_code = status.HTTP_403_FORBIDDEN
default_detail = _('You do not have permission to perform this action.') default_detail = _('You do not have permission to perform this action.')
default_code = 'permission_denied'
class NotFound(APIException): class NotFound(APIException):
status_code = status.HTTP_404_NOT_FOUND status_code = status.HTTP_404_NOT_FOUND
default_detail = _('Not found.') default_detail = _('Not found.')
default_code = 'not_found'
class MethodNotAllowed(APIException): class MethodNotAllowed(APIException):
status_code = status.HTTP_405_METHOD_NOT_ALLOWED status_code = status.HTTP_405_METHOD_NOT_ALLOWED
default_detail = _('Method "{method}" not allowed.') default_detail = _('Method "{method}" not allowed.')
default_code = 'method_not_allowed'
def __init__(self, method, detail=None): def __init__(self, method, detail=None, code=None):
if detail is not None: if detail is None:
self.detail = force_text(detail) detail = force_text(self.default_detail).format(method=method)
else: super(MethodNotAllowed, self).__init__(detail, code)
self.detail = force_text(self.default_detail).format(method=method)
class NotAcceptable(APIException): class NotAcceptable(APIException):
status_code = status.HTTP_406_NOT_ACCEPTABLE status_code = status.HTTP_406_NOT_ACCEPTABLE
default_detail = _('Could not satisfy the request Accept header.') default_detail = _('Could not satisfy the request Accept header.')
default_code = 'not_acceptable'
def __init__(self, detail=None, available_renderers=None): def __init__(self, detail=None, code=None, available_renderers=None):
if detail is not None:
self.detail = force_text(detail)
else:
self.detail = force_text(self.default_detail)
self.available_renderers = available_renderers self.available_renderers = available_renderers
super(NotAcceptable, self).__init__(detail, code)
class UnsupportedMediaType(APIException): class UnsupportedMediaType(APIException):
status_code = status.HTTP_415_UNSUPPORTED_MEDIA_TYPE status_code = status.HTTP_415_UNSUPPORTED_MEDIA_TYPE
default_detail = _('Unsupported media type "{media_type}" in request.') default_detail = _('Unsupported media type "{media_type}" in request.')
default_code = 'unsupported_media_type'
def __init__(self, media_type, detail=None): def __init__(self, media_type, detail=None, code=None):
if detail is not None: if detail is None:
self.detail = force_text(detail) detail = force_text(self.default_detail).format(media_type=media_type)
else: super(UnsupportedMediaType, self).__init__(detail, code)
self.detail = force_text(self.default_detail).format(
media_type=media_type
)
class Throttled(APIException): class Throttled(APIException):
@ -145,19 +207,17 @@ class Throttled(APIException):
default_detail = _('Request was throttled.') default_detail = _('Request was throttled.')
extra_detail_singular = 'Expected available in {wait} second.' extra_detail_singular = 'Expected available in {wait} second.'
extra_detail_plural = 'Expected available in {wait} seconds.' extra_detail_plural = 'Expected available in {wait} seconds.'
default_code = 'throttled'
def __init__(self, wait=None, detail=None): def __init__(self, wait=None, detail=None, code=None):
if detail is not None: if detail is None:
self.detail = force_text(detail) detail = force_text(self.default_detail)
else: if wait is not None:
self.detail = force_text(self.default_detail) wait = math.ceil(wait)
detail = ' '.join((
if wait is None: detail,
self.wait = None force_text(ungettext(self.extra_detail_singular.format(wait=wait),
else: self.extra_detail_plural.format(wait=wait),
self.wait = math.ceil(wait) wait))))
self.detail += ' ' + force_text(ungettext( self.wait = wait
self.extra_detail_singular.format(wait=self.wait), super(Throttled, self).__init__(detail, code)
self.extra_detail_plural.format(wait=self.wait),
self.wait
))

View File

@ -25,6 +25,7 @@ from django.utils.dateparse import (
) )
from django.utils.duration import duration_string from django.utils.duration import duration_string
from django.utils.encoding import is_protected_type, smart_text from django.utils.encoding import is_protected_type, smart_text
from django.utils.formats import localize_input, sanitize_separators
from django.utils.functional import cached_property from django.utils.functional import cached_property
from django.utils.ipv6 import clean_ipv6_address from django.utils.ipv6 import clean_ipv6_address
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
@ -33,7 +34,7 @@ from rest_framework import ISO_8601
from rest_framework.compat import ( from rest_framework.compat import (
get_remote_field, unicode_repr, unicode_to_repr, value_from_object get_remote_field, unicode_repr, unicode_to_repr, value_from_object
) )
from rest_framework.exceptions import ValidationError from rest_framework.exceptions import ErrorDetail, ValidationError
from rest_framework.settings import api_settings from rest_framework.settings import api_settings
from rest_framework.utils import html, humanize_datetime, representation from rest_framework.utils import html, humanize_datetime, representation
@ -48,18 +49,37 @@ class empty:
pass pass
if six.PY3:
def is_simple_callable(obj): def is_simple_callable(obj):
""" """
True if the object is a callable that takes no arguments. True if the object is a callable that takes no arguments.
""" """
if not (inspect.isfunction(obj) or inspect.ismethod(obj)):
return False
sig = inspect.signature(obj)
params = sig.parameters.values()
return all(
param.kind == param.VAR_POSITIONAL or
param.kind == param.VAR_KEYWORD or
param.default != param.empty
for param in params
)
else:
def is_simple_callable(obj):
function = inspect.isfunction(obj) function = inspect.isfunction(obj)
method = inspect.ismethod(obj) method = inspect.ismethod(obj)
if not (function or method): if not (function or method):
return False return False
if method:
is_unbound = obj.im_self is None
args, _, _, defaults = inspect.getargspec(obj) args, _, _, defaults = inspect.getargspec(obj)
len_args = len(args) if function else len(args) - 1
len_args = len(args) if function or is_unbound else len(args) - 1
len_defaults = len(defaults) if defaults else 0 len_defaults = len(defaults) if defaults else 0
return len_args <= len_defaults return len_args <= len_defaults
@ -209,6 +229,18 @@ def iter_options(grouped_choices, cutoff=None, cutoff_text=None):
yield Option(value='n/a', display_text=cutoff_text, disabled=True) yield Option(value='n/a', display_text=cutoff_text, disabled=True)
def get_error_detail(exc_info):
"""
Given a Django ValidationError, return a list of ErrorDetail,
with the `code` populated.
"""
code = getattr(exc_info, 'code', None) or 'invalid'
return [
ErrorDetail(msg, code=code)
for msg in exc_info.messages
]
class CreateOnlyDefault(object): class CreateOnlyDefault(object):
""" """
This class may be used to provide default values that are only used This class may be used to provide default values that are only used
@ -251,6 +283,8 @@ class SkipField(Exception):
pass pass
REGEX_TYPE = type(re.compile(''))
NOT_READ_ONLY_WRITE_ONLY = 'May not set both `read_only` and `write_only`' NOT_READ_ONLY_WRITE_ONLY = 'May not set both `read_only` and `write_only`'
NOT_READ_ONLY_REQUIRED = 'May not set both `read_only` and `required`' NOT_READ_ONLY_REQUIRED = 'May not set both `read_only` and `required`'
NOT_REQUIRED_DEFAULT = 'May not set both `required` and `default`' NOT_REQUIRED_DEFAULT = 'May not set both `required` and `default`'
@ -394,8 +428,8 @@ class Field(object):
# determine if we should use null instead. # determine if we should use null instead.
return '' if getattr(self, 'allow_blank', False) else None return '' if getattr(self, 'allow_blank', False) else None
elif ret == '' and not self.required: elif ret == '' and not self.required:
# If the field is blank, and emptyness is valid then # If the field is blank, and emptiness is valid then
# determine if we should use emptyness instead. # determine if we should use emptiness instead.
return '' if getattr(self, 'allow_blank', False) else empty return '' if getattr(self, 'allow_blank', False) else empty
return ret return ret
return dictionary.get(self.field_name, empty) return dictionary.get(self.field_name, empty)
@ -431,10 +465,11 @@ class Field(object):
is provided for this field. is provided for this field.
If a default has not been set for this field then this will simply If a default has not been set for this field then this will simply
return `empty`, indicating that no value should be set in the raise `SkipField`, indicating that no value should be set in the
validated data for this field. validated data for this field.
""" """
if self.default is empty: if self.default is empty or getattr(self.root, 'partial', False):
# No default, or this is a partial update.
raise SkipField() raise SkipField()
if callable(self.default): if callable(self.default):
if hasattr(self.default, 'set_context'): if hasattr(self.default, 'set_context'):
@ -507,7 +542,7 @@ class Field(object):
raise raise
errors.extend(exc.detail) errors.extend(exc.detail)
except DjangoValidationError as exc: except DjangoValidationError as exc:
errors.extend(exc.messages) errors.extend(get_error_detail(exc))
if errors: if errors:
raise ValidationError(errors) raise ValidationError(errors)
@ -545,7 +580,7 @@ class Field(object):
msg = MISSING_ERROR_MESSAGE.format(class_name=class_name, key=key) msg = MISSING_ERROR_MESSAGE.format(class_name=class_name, key=key)
raise AssertionError(msg) raise AssertionError(msg)
message_string = msg.format(**kwargs) message_string = msg.format(**kwargs)
raise ValidationError(message_string) raise ValidationError(message_string, code=key)
@cached_property @cached_property
def root(self): def root(self):
@ -579,16 +614,17 @@ class Field(object):
When cloning fields we instantiate using the arguments it was When cloning fields we instantiate using the arguments it was
originally created with, rather than copying the complete state. originally created with, rather than copying the complete state.
""" """
args = copy.deepcopy(self._args) # Treat regexes and validators as immutable.
kwargs = dict(self._kwargs)
# Bit ugly, but we need to special case 'validators' as Django's
# RegexValidator does not support deepcopy.
# We treat validator callables as immutable objects.
# See https://github.com/tomchristie/django-rest-framework/issues/1954 # See https://github.com/tomchristie/django-rest-framework/issues/1954
validators = kwargs.pop('validators', None) # and https://github.com/tomchristie/django-rest-framework/pull/4489
kwargs = copy.deepcopy(kwargs) args = [
if validators is not None: copy.deepcopy(item) if not isinstance(item, REGEX_TYPE) else item
kwargs['validators'] = validators for item in self._args
]
kwargs = {
key: (copy.deepcopy(value) if (key not in ('validators', 'regex')) else value)
for key, value in self._kwargs.items()
}
return self.__class__(*args, **kwargs) return self.__class__(*args, **kwargs)
def __repr__(self): def __repr__(self):
@ -608,8 +644,20 @@ class BooleanField(Field):
} }
default_empty_html = False default_empty_html = False
initial = False initial = False
TRUE_VALUES = {'t', 'T', 'true', 'True', 'TRUE', '1', 1, True} TRUE_VALUES = {
FALSE_VALUES = {'f', 'F', 'false', 'False', 'FALSE', '0', 0, 0.0, False} 't', 'T',
'true', 'True', 'TRUE',
'on', 'On', 'ON',
'1', 1,
True
}
FALSE_VALUES = {
'f', 'F',
'false', 'False', 'FALSE',
'off', 'Off', 'OFF',
'0', 0, 0.0,
False
}
def __init__(self, **kwargs): def __init__(self, **kwargs):
assert 'allow_null' not in kwargs, '`allow_null` is not a valid option. Use `NullBooleanField` instead.' assert 'allow_null' not in kwargs, '`allow_null` is not a valid option. Use `NullBooleanField` instead.'
@ -670,6 +718,7 @@ class NullBooleanField(Field):
class CharField(Field): class CharField(Field):
default_error_messages = { default_error_messages = {
'invalid': _('Not a valid string.'),
'blank': _('This field may not be blank.'), 'blank': _('This field may not be blank.'),
'max_length': _('Ensure this field has no more than {max_length} characters.'), 'max_length': _('Ensure this field has no more than {max_length} characters.'),
'min_length': _('Ensure this field has at least {min_length} characters.') 'min_length': _('Ensure this field has at least {min_length} characters.')
@ -700,6 +749,11 @@ class CharField(Field):
return super(CharField, self).run_validation(data) return super(CharField, self).run_validation(data)
def to_internal_value(self, data): def to_internal_value(self, data):
# We're lenient with allowing basic numerics to be coerced into strings,
# but other types should fail. Eg. unclear if booleans should represent as `true` or `True`,
# and composites such as lists are likely user error.
if isinstance(data, bool) or not isinstance(data, six.string_types + six.integer_types + (float,)):
self.fail('invalid')
value = six.text_type(data) value = six.text_type(data)
return value.strip() if self.trim_whitespace else value return value.strip() if self.trim_whitespace else value
@ -803,7 +857,10 @@ class IPAddressField(CharField):
self.validators.extend(validators) self.validators.extend(validators)
def to_internal_value(self, data): def to_internal_value(self, data):
if data and ':' in data: if not isinstance(data, six.string_types):
self.fail('invalid', value=data)
if ':' in data:
try: try:
if self.protocol in ('both', 'ipv6'): if self.protocol in ('both', 'ipv6'):
return clean_ipv6_address(data, self.unpack_ipv4) return clean_ipv6_address(data, self.unpack_ipv4)
@ -871,6 +928,7 @@ class FloatField(Field):
self.validators.append(MinValueValidator(self.min_value, message=message)) self.validators.append(MinValueValidator(self.min_value, message=message))
def to_internal_value(self, data): def to_internal_value(self, data):
if isinstance(data, six.text_type) and len(data) > self.MAX_STRING_LENGTH: if isinstance(data, six.text_type) and len(data) > self.MAX_STRING_LENGTH:
self.fail('max_string_length') self.fail('max_string_length')
@ -895,11 +953,15 @@ class DecimalField(Field):
} }
MAX_STRING_LENGTH = 1000 # Guard against malicious string inputs. MAX_STRING_LENGTH = 1000 # Guard against malicious string inputs.
def __init__(self, max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None, **kwargs): def __init__(self, max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None,
localize=False, **kwargs):
self.max_digits = max_digits self.max_digits = max_digits
self.decimal_places = decimal_places self.decimal_places = decimal_places
self.localize = localize
if coerce_to_string is not None: if coerce_to_string is not None:
self.coerce_to_string = coerce_to_string self.coerce_to_string = coerce_to_string
if self.localize:
self.coerce_to_string = True
self.max_value = max_value self.max_value = max_value
self.min_value = min_value self.min_value = min_value
@ -923,7 +985,12 @@ class DecimalField(Field):
Validate that the input is a decimal number and return a Decimal Validate that the input is a decimal number and return a Decimal
instance. instance.
""" """
data = smart_text(data).strip() data = smart_text(data).strip()
if self.localize:
data = sanitize_separators(data)
if len(data) > self.MAX_STRING_LENGTH: if len(data) > self.MAX_STRING_LENGTH:
self.fail('max_string_length') self.fail('max_string_length')
@ -941,7 +1008,7 @@ class DecimalField(Field):
if value in (decimal.Decimal('Inf'), decimal.Decimal('-Inf')): if value in (decimal.Decimal('Inf'), decimal.Decimal('-Inf')):
self.fail('invalid') self.fail('invalid')
return self.validate_precision(value) return self.quantize(self.validate_precision(value))
def validate_precision(self, value): def validate_precision(self, value):
""" """
@ -988,6 +1055,9 @@ class DecimalField(Field):
if not coerce_to_string: if not coerce_to_string:
return quantized return quantized
if self.localize:
return localize_input(quantized)
return '{0:f}'.format(quantized) return '{0:f}'.format(quantized)
def quantize(self, value): def quantize(self, value):
@ -998,10 +1068,12 @@ class DecimalField(Field):
return value return value
context = decimal.getcontext().copy() context = decimal.getcontext().copy()
if self.max_digits is not None:
context.prec = self.max_digits context.prec = self.max_digits
return value.quantize( return value.quantize(
decimal.Decimal('.1') ** self.decimal_places, decimal.Decimal('.1') ** self.decimal_places,
context=context) context=context
)
# Date & time fields... # Date & time fields...
@ -1327,7 +1399,7 @@ class FilePathField(ChoiceField):
def __init__(self, path, match=None, recursive=False, allow_files=True, def __init__(self, path, match=None, recursive=False, allow_files=True,
allow_folders=False, required=None, **kwargs): allow_folders=False, required=None, **kwargs):
# Defer to Django's FilePathField implmentation to get the # Defer to Django's FilePathField implementation to get the
# valid set of choices. # valid set of choices.
field = DjangoFilePathField( field = DjangoFilePathField(
path, match=match, recursive=recursive, allow_files=allow_files, path, match=match, recursive=recursive, allow_files=allow_files,
@ -1539,9 +1611,21 @@ class JSONField(Field):
self.binary = kwargs.pop('binary', False) self.binary = kwargs.pop('binary', False)
super(JSONField, self).__init__(*args, **kwargs) super(JSONField, self).__init__(*args, **kwargs)
def get_value(self, dictionary):
if html.is_html_input(dictionary) and self.field_name in dictionary:
# When HTML form input is used, mark up the input
# as being a JSON string, rather than a JSON primative.
class JSONString(six.text_type):
def __new__(self, value):
ret = six.text_type.__new__(self, value)
ret.is_json_string = True
return ret
return JSONString(dictionary[self.field_name])
return dictionary.get(self.field_name, empty)
def to_internal_value(self, data): def to_internal_value(self, data):
try: try:
if self.binary: if self.binary or getattr(data, 'is_json_string', False):
if isinstance(data, six.binary_type): if isinstance(data, six.binary_type):
data = data.decode('utf-8') data = data.decode('utf-8')
return json.loads(data) return json.loads(data)
@ -1630,7 +1714,7 @@ class SerializerMethodField(Field):
def bind(self, field_name, parent): def bind(self, field_name, parent):
# In order to enforce a consistent style, we error if a redundant # In order to enforce a consistent style, we error if a redundant
# 'method_name' argument has been used. For example: # 'method_name' argument has been used. For example:
# my_field = serializer.CharField(source='my_field') # my_field = serializer.SerializerMethodField(method_name='get_my_field')
default_method_name = 'get_{field_name}'.format(field_name=field_name) default_method_name = 'get_{field_name}'.format(field_name=field_name)
assert self.method_name != default_method_name, ( assert self.method_name != default_method_name, (
"It is redundant to specify `%s` on SerializerMethodField '%s' in " "It is redundant to specify `%s` on SerializerMethodField '%s' in "

View File

@ -5,9 +5,9 @@ returned by list views.
from __future__ import unicode_literals from __future__ import unicode_literals
import operator import operator
import warnings
from functools import reduce from functools import reduce
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
from django.db import models from django.db import models
from django.db.models.constants import LOOKUP_SEP from django.db.models.constants import LOOKUP_SEP
@ -16,50 +16,10 @@ from django.utils import six
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from rest_framework.compat import ( from rest_framework.compat import (
crispy_forms, distinct, django_filters, guardian, template_render coreapi, distinct, django_filters, guardian, template_render
) )
from rest_framework.settings import api_settings from rest_framework.settings import api_settings
if 'crispy_forms' in settings.INSTALLED_APPS and crispy_forms and django_filters:
# If django-crispy-forms is installed, use it to get a bootstrap3 rendering
# of the DjangoFilterBackend controls when displayed as HTML.
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Submit
class FilterSet(django_filters.FilterSet):
def __init__(self, *args, **kwargs):
super(FilterSet, self).__init__(*args, **kwargs)
for field in self.form.fields.values():
field.help_text = None
layout_components = list(self.form.fields.keys()) + [
Submit('', _('Submit'), css_class='btn-default'),
]
helper = FormHelper()
helper.form_method = 'GET'
helper.template_pack = 'bootstrap3'
helper.layout = Layout(*layout_components)
self.form.helper = helper
filter_template = 'rest_framework/filters/django_filter_crispyforms.html'
elif django_filters:
# If django-crispy-forms is not installed, use the standard
# 'form.as_p' rendering when DjangoFilterBackend is displayed as HTML.
class FilterSet(django_filters.FilterSet):
def __init__(self, *args, **kwargs):
super(FilterSet, self).__init__(*args, **kwargs)
for field in self.form.fields.values():
field.help_text = None
filter_template = 'rest_framework/filters/django_filter.html'
else:
FilterSet = None
filter_template = None
class BaseFilterBackend(object): class BaseFilterBackend(object):
""" """
@ -72,75 +32,56 @@ class BaseFilterBackend(object):
""" """
raise NotImplementedError(".filter_queryset() must be overridden.") raise NotImplementedError(".filter_queryset() must be overridden.")
def get_fields(self, view): def get_schema_fields(self, view):
assert coreapi is not None, 'coreapi must be installed to use `get_schema_fields()`'
return [] return []
if django_filters:
from django_filters.filterset import FilterSetMetaclass as DFFilterSetMetaclass
from django_filters.rest_framework.filterset import FilterSet as DFFilterSet
class FilterSetMetaclass(DFFilterSetMetaclass):
def __new__(cls, name, bases, attrs):
warnings.warn(
"The built in 'rest_framework.filters.FilterSet' is pending deprecation. "
"You should use 'django_filters.rest_framework.FilterSet' instead.",
PendingDeprecationWarning
)
return super(FilterSetMetaclass, cls).__new__(cls, name, bases, attrs)
_BaseFilterSet = DFFilterSet
else:
# Dummy metaclass just so we can give a user-friendly error message.
class FilterSetMetaclass(type):
def __init__(self, name, bases, attrs):
# Assert only on subclasses, so we can define FilterSet below.
if bases != (object,):
assert False, 'django-filter must be installed to use the `FilterSet` class'
super(FilterSetMetaclass, self).__init__(name, bases, attrs)
_BaseFilterSet = object
class FilterSet(six.with_metaclass(FilterSetMetaclass, _BaseFilterSet)):
pass
class DjangoFilterBackend(BaseFilterBackend): class DjangoFilterBackend(BaseFilterBackend):
""" """
A filter backend that uses django-filter. A filter backend that uses django-filter.
""" """
default_filter_set = FilterSet def __new__(cls, *args, **kwargs):
template = filter_template
def __init__(self):
assert django_filters, 'Using DjangoFilterBackend, but django-filter is not installed' assert django_filters, 'Using DjangoFilterBackend, but django-filter is not installed'
assert django_filters.VERSION >= (0, 15, 3), 'django-filter 0.15.3 and above is required'
def get_filter_class(self, view, queryset=None): warnings.warn(
""" "The built in 'rest_framework.filters.DjangoFilterBackend' is pending deprecation. "
Return the django-filters `FilterSet` used to filter the queryset. "You should use 'django_filters.rest_framework.DjangoFilterBackend' instead.",
""" PendingDeprecationWarning
filter_class = getattr(view, 'filter_class', None) )
filter_fields = getattr(view, 'filter_fields', None)
if filter_class: from django_filters.rest_framework import DjangoFilterBackend
filter_model = filter_class.Meta.model
assert issubclass(queryset.model, filter_model), \ return DjangoFilterBackend(*args, **kwargs)
'FilterSet model %s does not match queryset model %s' % \
(filter_model, queryset.model)
return filter_class
if filter_fields:
class AutoFilterSet(self.default_filter_set):
class Meta:
model = queryset.model
fields = filter_fields
return AutoFilterSet
return None
def filter_queryset(self, request, queryset, view):
filter_class = self.get_filter_class(view, queryset)
if filter_class:
return filter_class(request.query_params, queryset=queryset).qs
return queryset
def to_html(self, request, queryset, view):
filter_class = self.get_filter_class(view, queryset)
if not filter_class:
return None
filter_instance = filter_class(request.query_params, queryset=queryset)
context = {
'filter': filter_instance
}
template = loader.get_template(self.template)
return template_render(template, context)
def get_fields(self, view):
filter_class = getattr(view, 'filter_class', None)
if filter_class:
return list(filter_class().filters.keys())
filter_fields = getattr(view, 'filter_fields', None)
if filter_fields:
return filter_fields
return []
class SearchFilter(BaseFilterBackend): class SearchFilter(BaseFilterBackend):
@ -174,8 +115,8 @@ class SearchFilter(BaseFilterBackend):
""" """
Return True if 'distinct()' should be used to query the given lookups. Return True if 'distinct()' should be used to query the given lookups.
""" """
opts = queryset.model._meta
for search_field in search_fields: for search_field in search_fields:
opts = queryset.model._meta
if search_field[0] in self.lookup_prefixes: if search_field[0] in self.lookup_prefixes:
search_field = search_field[1:] search_field = search_field[1:]
parts = search_field.split(LOOKUP_SEP) parts = search_field.split(LOOKUP_SEP)
@ -214,7 +155,7 @@ class SearchFilter(BaseFilterBackend):
# Filtering against a many-to-many field requires us to # Filtering against a many-to-many field requires us to
# call queryset.distinct() in order to avoid duplicate items # call queryset.distinct() in order to avoid duplicate items
# in the resulting queryset. # in the resulting queryset.
# We try to avoid this is possible, for performance reasons. # We try to avoid this if possible, for performance reasons.
queryset = distinct(queryset, base) queryset = distinct(queryset, base)
return queryset return queryset
@ -231,8 +172,9 @@ class SearchFilter(BaseFilterBackend):
template = loader.get_template(self.template) template = loader.get_template(self.template)
return template_render(template, context) return template_render(template, context)
def get_fields(self, view): def get_schema_fields(self, view):
return [self.search_param] assert coreapi is not None, 'coreapi must be installed to use `get_schema_fields()`'
return [coreapi.Field(name=self.search_param, required=False, location='query')]
class OrderingFilter(BaseFilterBackend): class OrderingFilter(BaseFilterBackend):
@ -252,7 +194,7 @@ class OrderingFilter(BaseFilterBackend):
params = request.query_params.get(self.ordering_param) params = request.query_params.get(self.ordering_param)
if params: if params:
fields = [param.strip() for param in params.split(',')] fields = [param.strip() for param in params.split(',')]
ordering = self.remove_invalid_fields(queryset, fields, view) ordering = self.remove_invalid_fields(queryset, fields, view, request)
if ordering: if ordering:
return ordering return ordering
@ -265,7 +207,7 @@ class OrderingFilter(BaseFilterBackend):
return (ordering,) return (ordering,)
return ordering return ordering
def get_default_valid_fields(self, queryset, view): def get_default_valid_fields(self, queryset, view, context={}):
# If `ordering_fields` is not specified, then we determine a default # If `ordering_fields` is not specified, then we determine a default
# based on the serializer class, if one exists on the view. # based on the serializer class, if one exists on the view.
if hasattr(view, 'get_serializer_class'): if hasattr(view, 'get_serializer_class'):
@ -288,16 +230,16 @@ class OrderingFilter(BaseFilterBackend):
return [ return [
(field.source or field_name, field.label) (field.source or field_name, field.label)
for field_name, field in serializer_class().fields.items() for field_name, field in serializer_class(context=context).fields.items()
if not getattr(field, 'write_only', False) and not field.source == '*' if not getattr(field, 'write_only', False) and not field.source == '*'
] ]
def get_valid_fields(self, queryset, view): def get_valid_fields(self, queryset, view, context={}):
valid_fields = getattr(view, 'ordering_fields', self.ordering_fields) valid_fields = getattr(view, 'ordering_fields', self.ordering_fields)
if valid_fields is None: if valid_fields is None:
# Default to allowing filtering on serializer fields # Default to allowing filtering on serializer fields
return self.get_default_valid_fields(queryset, view) return self.get_default_valid_fields(queryset, view, context)
elif valid_fields == '__all__': elif valid_fields == '__all__':
# View explicitly allows filtering on any model field # View explicitly allows filtering on any model field
@ -316,8 +258,8 @@ class OrderingFilter(BaseFilterBackend):
return valid_fields return valid_fields
def remove_invalid_fields(self, queryset, fields, view): def remove_invalid_fields(self, queryset, fields, view, request):
valid_fields = [item[0] for item in self.get_valid_fields(queryset, view)] valid_fields = [item[0] for item in self.get_valid_fields(queryset, view, {'request': request})]
return [term for term in fields if term.lstrip('-') in valid_fields] return [term for term in fields if term.lstrip('-') in valid_fields]
def filter_queryset(self, request, queryset, view): def filter_queryset(self, request, queryset, view):
@ -332,23 +274,25 @@ class OrderingFilter(BaseFilterBackend):
current = self.get_ordering(request, queryset, view) current = self.get_ordering(request, queryset, view)
current = None if current is None else current[0] current = None if current is None else current[0]
options = [] options = []
for key, label in self.get_valid_fields(queryset, view): context = {
options.append((key, '%s - %s' % (label, _('ascending'))))
options.append(('-' + key, '%s - %s' % (label, _('descending'))))
return {
'request': request, 'request': request,
'current': current, 'current': current,
'param': self.ordering_param, 'param': self.ordering_param,
'options': options,
} }
for key, label in self.get_valid_fields(queryset, view, context):
options.append((key, '%s - %s' % (label, _('ascending'))))
options.append(('-' + key, '%s - %s' % (label, _('descending'))))
context['options'] = options
return context
def to_html(self, request, queryset, view): def to_html(self, request, queryset, view):
template = loader.get_template(self.template) template = loader.get_template(self.template)
context = self.get_template_context(request, queryset, view) context = self.get_template_context(request, queryset, view)
return template_render(template, context) return template_render(template, context)
def get_fields(self, view): def get_schema_fields(self, view):
return [self.ordering_param] assert coreapi is not None, 'coreapi must be installed to use `get_schema_fields()`'
return [coreapi.Field(name=self.ordering_param, required=False, location='query')]
class DjangoObjectPermissionsFilter(BaseFilterBackend): class DjangoObjectPermissionsFilter(BaseFilterBackend):
@ -362,6 +306,11 @@ class DjangoObjectPermissionsFilter(BaseFilterBackend):
perm_format = '%(app_label)s.view_%(model_name)s' perm_format = '%(app_label)s.view_%(model_name)s'
def filter_queryset(self, request, queryset, view): def filter_queryset(self, request, queryset, view):
# We want to defer this import until run-time, rather than import-time.
# See https://github.com/tomchristie/django-rest-framework/issues/4608
# (Also see #1624 for why we need to make this import explicitly)
from guardian.shortcuts import get_objects_for_user
extra = {} extra = {}
user = request.user user = request.user
model_cls = queryset.model model_cls = queryset.model
@ -375,4 +324,4 @@ class DjangoObjectPermissionsFilter(BaseFilterBackend):
extra = {'accept_global_perms': False} extra = {'accept_global_perms': False}
else: else:
extra = {} extra = {}
return guardian.shortcuts.get_objects_for_user(user, permission, queryset, **extra) return get_objects_for_user(user, permission, queryset, **extra)

View File

@ -7,9 +7,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django REST framework\n" "Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-01 18:38+0100\n" "POT-Creation-Date: 2016-07-12 16:13+0100\n"
"PO-Revision-Date: 2016-03-01 17:38+0000\n" "PO-Revision-Date: 2016-07-12 15:14+0000\n"
"Last-Translator: Xavier Ordoquy <xordoquy@linovia.com>\n" "Last-Translator: Thomas Christie <tom@tomchristie.com>\n"
"Language-Team: Acoli (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/ach/)\n" "Language-Team: Acoli (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/ach/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -17,40 +17,40 @@ msgstr ""
"Language: ach\n" "Language: ach\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: authentication.py:71 #: authentication.py:73
msgid "Invalid basic header. No credentials provided." msgid "Invalid basic header. No credentials provided."
msgstr "" msgstr ""
#: authentication.py:74 #: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces." msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "" msgstr ""
#: authentication.py:80 #: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded." msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "" msgstr ""
#: authentication.py:97 #: authentication.py:99
msgid "Invalid username/password." msgid "Invalid username/password."
msgstr "" msgstr ""
#: authentication.py:100 authentication.py:195 #: authentication.py:102 authentication.py:198
msgid "User inactive or deleted." msgid "User inactive or deleted."
msgstr "" msgstr ""
#: authentication.py:173 #: authentication.py:176
msgid "Invalid token header. No credentials provided." msgid "Invalid token header. No credentials provided."
msgstr "" msgstr ""
#: authentication.py:176 #: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces." msgid "Invalid token header. Token string should not contain spaces."
msgstr "" msgstr ""
#: authentication.py:182 #: authentication.py:185
msgid "" msgid ""
"Invalid token header. Token string should not contain invalid characters." "Invalid token header. Token string should not contain invalid characters."
msgstr "" msgstr ""
#: authentication.py:192 #: authentication.py:195
msgid "Invalid token." msgid "Invalid token."
msgstr "" msgstr ""
@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token" msgid "Auth Token"
msgstr "" msgstr ""
#: authtoken/models.py:21 #: authtoken/models.py:15
msgid "Key" msgid "Key"
msgstr "" msgstr ""
#: authtoken/models.py:23 #: authtoken/models.py:18
msgid "User" msgid "User"
msgstr "" msgstr ""
#: authtoken/models.py:24 #: authtoken/models.py:20
msgid "Created" msgid "Created"
msgstr "" msgstr ""
#: authtoken/models.py:33 #: authtoken/models.py:29
msgid "Token" msgid "Token"
msgstr "" msgstr ""
#: authtoken/models.py:34 #: authtoken/models.py:30
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
@ -123,7 +123,6 @@ msgid "Not found."
msgstr "" msgstr ""
#: exceptions.py:109 #: exceptions.py:109
#, python-brace-format
msgid "Method \"{method}\" not allowed." msgid "Method \"{method}\" not allowed."
msgstr "" msgstr ""
@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "" msgstr ""
#: exceptions.py:132 #: exceptions.py:132
#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request." msgid "Unsupported media type \"{media_type}\" in request."
msgstr "" msgstr ""
@ -140,214 +138,201 @@ msgstr ""
msgid "Request was throttled." msgid "Request was throttled."
msgstr "" msgstr ""
#: fields.py:266 relations.py:206 relations.py:239 validators.py:79 #: fields.py:269 relations.py:206 relations.py:239 validators.py:98
#: validators.py:162 #: validators.py:181
msgid "This field is required." msgid "This field is required."
msgstr "" msgstr ""
#: fields.py:267 #: fields.py:270
msgid "This field may not be null." msgid "This field may not be null."
msgstr "" msgstr ""
#: fields.py:603 fields.py:634 #: fields.py:608 fields.py:639
#, python-brace-format
msgid "\"{input}\" is not a valid boolean." msgid "\"{input}\" is not a valid boolean."
msgstr "" msgstr ""
#: fields.py:669 #: fields.py:674
msgid "This field may not be blank." msgid "This field may not be blank."
msgstr "" msgstr ""
#: fields.py:670 fields.py:1664 #: fields.py:675 fields.py:1675
#, python-brace-format
msgid "Ensure this field has no more than {max_length} characters." msgid "Ensure this field has no more than {max_length} characters."
msgstr "" msgstr ""
#: fields.py:671 #: fields.py:676
#, python-brace-format
msgid "Ensure this field has at least {min_length} characters." msgid "Ensure this field has at least {min_length} characters."
msgstr "" msgstr ""
#: fields.py:708 #: fields.py:713
msgid "Enter a valid email address." msgid "Enter a valid email address."
msgstr "" msgstr ""
#: fields.py:719 #: fields.py:724
msgid "This value does not match the required pattern." msgid "This value does not match the required pattern."
msgstr "" msgstr ""
#: fields.py:730 #: fields.py:735
msgid "" msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or " "Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens." "hyphens."
msgstr "" msgstr ""
#: fields.py:742 #: fields.py:747
msgid "Enter a valid URL." msgid "Enter a valid URL."
msgstr "" msgstr ""
#: fields.py:755 #: fields.py:760
#, python-brace-format
msgid "\"{value}\" is not a valid UUID." msgid "\"{value}\" is not a valid UUID."
msgstr "" msgstr ""
#: fields.py:791 #: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address." msgid "Enter a valid IPv4 or IPv6 address."
msgstr "" msgstr ""
#: fields.py:816 #: fields.py:821
msgid "A valid integer is required." msgid "A valid integer is required."
msgstr "" msgstr ""
#: fields.py:817 fields.py:852 fields.py:885 #: fields.py:822 fields.py:857 fields.py:891
#, python-brace-format
msgid "Ensure this value is less than or equal to {max_value}." msgid "Ensure this value is less than or equal to {max_value}."
msgstr "" msgstr ""
#: fields.py:818 fields.py:853 fields.py:886 #: fields.py:823 fields.py:858 fields.py:892
#, python-brace-format
msgid "Ensure this value is greater than or equal to {min_value}." msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "" msgstr ""
#: fields.py:819 fields.py:854 fields.py:890 #: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large." msgid "String value too large."
msgstr "" msgstr ""
#: fields.py:851 fields.py:884 #: fields.py:856 fields.py:890
msgid "A valid number is required." msgid "A valid number is required."
msgstr "" msgstr ""
#: fields.py:887 #: fields.py:893
#, python-brace-format
msgid "Ensure that there are no more than {max_digits} digits in total." msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "" msgstr ""
#: fields.py:888 #: fields.py:894
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places." "Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "" msgstr ""
#: fields.py:889 #: fields.py:895
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the " "Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point." "decimal point."
msgstr "" msgstr ""
#: fields.py:1004 #: fields.py:1025
#, python-brace-format
msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1005 #: fields.py:1026
msgid "Expected a datetime but got a date." msgid "Expected a datetime but got a date."
msgstr "" msgstr ""
#: fields.py:1082 #: fields.py:1103
#, python-brace-format
msgid "Date has wrong format. Use one of these formats instead: {format}." msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1083 #: fields.py:1104
msgid "Expected a date but got a datetime." msgid "Expected a date but got a datetime."
msgstr "" msgstr ""
#: fields.py:1151 #: fields.py:1170
#, python-brace-format
msgid "Time has wrong format. Use one of these formats instead: {format}." msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1215 #: fields.py:1232
#, python-brace-format
msgid "Duration has wrong format. Use one of these formats instead: {format}." msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1240 fields.py:1289 #: fields.py:1251 fields.py:1300
#, python-brace-format
msgid "\"{input}\" is not a valid choice." msgid "\"{input}\" is not a valid choice."
msgstr "" msgstr ""
#: fields.py:1243 relations.py:71 relations.py:442 #: fields.py:1254 relations.py:71 relations.py:441
#, python-brace-format
msgid "More than {count} items..." msgid "More than {count} items..."
msgstr "" msgstr ""
#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520 #: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
#, python-brace-format
msgid "Expected a list of items but got type \"{input_type}\"." msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "" msgstr ""
#: fields.py:1291 #: fields.py:1302
msgid "This selection may not be empty." msgid "This selection may not be empty."
msgstr "" msgstr ""
#: fields.py:1328 #: fields.py:1339
#, python-brace-format
msgid "\"{input}\" is not a valid path choice." msgid "\"{input}\" is not a valid path choice."
msgstr "" msgstr ""
#: fields.py:1347 #: fields.py:1358
msgid "No file was submitted." msgid "No file was submitted."
msgstr "" msgstr ""
#: fields.py:1348 #: fields.py:1359
msgid "" msgid ""
"The submitted data was not a file. Check the encoding type on the form." "The submitted data was not a file. Check the encoding type on the form."
msgstr "" msgstr ""
#: fields.py:1349 #: fields.py:1360
msgid "No filename could be determined." msgid "No filename could be determined."
msgstr "" msgstr ""
#: fields.py:1350 #: fields.py:1361
msgid "The submitted file is empty." msgid "The submitted file is empty."
msgstr "" msgstr ""
#: fields.py:1351 #: fields.py:1362
#, python-brace-format
msgid "" msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})." "Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "" msgstr ""
#: fields.py:1399 #: fields.py:1410
msgid "" msgid ""
"Upload a valid image. The file you uploaded was either not an image or a " "Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image." "corrupted image."
msgstr "" msgstr ""
#: fields.py:1438 relations.py:439 serializers.py:521 #: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty." msgid "This list may not be empty."
msgstr "" msgstr ""
#: fields.py:1491 #: fields.py:1502
#, python-brace-format
msgid "Expected a dictionary of items but got type \"{input_type}\"." msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "" msgstr ""
#: fields.py:1538 #: fields.py:1549
msgid "Value must be valid JSON." msgid "Value must be valid JSON."
msgstr "" msgstr ""
#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5 #: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit" msgid "Submit"
msgstr "" msgstr ""
#: pagination.py:189 #: filters.py:336
msgid "ascending"
msgstr ""
#: filters.py:337
msgid "descending"
msgstr ""
#: pagination.py:193
msgid "Invalid page." msgid "Invalid page."
msgstr "" msgstr ""
#: pagination.py:407 #: pagination.py:427
msgid "Invalid cursor" msgid "Invalid cursor"
msgstr "" msgstr ""
#: relations.py:207 #: relations.py:207
#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist." msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "" msgstr ""
#: relations.py:208 #: relations.py:208
#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}." msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "" msgstr ""
@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "" msgstr ""
#: relations.py:243 #: relations.py:243
#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}." msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "" msgstr ""
#: relations.py:402 #: relations.py:401
#, python-brace-format
msgid "Object with {slug_name}={value} does not exist." msgid "Object with {slug_name}={value} does not exist."
msgstr "" msgstr ""
#: relations.py:403 #: relations.py:402
msgid "Invalid value." msgid "Invalid value."
msgstr "" msgstr ""
#: serializers.py:326 #: serializers.py:326
#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}." msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "" msgstr ""
#: templates/rest_framework/admin.html:118 #: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128 #: templates/rest_framework/base.html:128
msgid "Filters" msgid "Filters"
msgstr "" msgstr ""
@ -412,27 +394,23 @@ msgstr ""
msgid "No items to select." msgid "No items to select."
msgstr "" msgstr ""
#: validators.py:24 #: validators.py:43
msgid "This field must be unique." msgid "This field must be unique."
msgstr "" msgstr ""
#: validators.py:78 #: validators.py:97
#, python-brace-format
msgid "The fields {field_names} must make a unique set." msgid "The fields {field_names} must make a unique set."
msgstr "" msgstr ""
#: validators.py:226 #: validators.py:245
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" date." msgid "This field must be unique for the \"{date_field}\" date."
msgstr "" msgstr ""
#: validators.py:241 #: validators.py:260
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" month." msgid "This field must be unique for the \"{date_field}\" month."
msgstr "" msgstr ""
#: validators.py:254 #: validators.py:273
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" year." msgid "This field must be unique for the \"{date_field}\" year."
msgstr "" msgstr ""
@ -440,15 +418,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header." msgid "Invalid version in \"Accept\" header."
msgstr "" msgstr ""
#: versioning.py:73 versioning.py:115 #: versioning.py:73
msgid "Invalid version in URL path." msgid "Invalid version in URL path."
msgstr "" msgstr ""
#: versioning.py:144 #: versioning.py:115
msgid "Invalid version in URL path. Does not match any version namespace."
msgstr ""
#: versioning.py:147
msgid "Invalid version in hostname." msgid "Invalid version in hostname."
msgstr "" msgstr ""
#: versioning.py:166 #: versioning.py:169
msgid "Invalid version in query parameter." msgid "Invalid version in query parameter."
msgstr "" msgstr ""

View File

@ -3,14 +3,15 @@
# This file is distributed under the same license as the PACKAGE package. # This file is distributed under the same license as the PACKAGE package.
# #
# Translators: # Translators:
# Bashar Al-Abdulhadi, 2016
# Eyad Toma <d.eyad.t@gmail.com>, 2015 # Eyad Toma <d.eyad.t@gmail.com>, 2015
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django REST framework\n" "Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-01 18:38+0100\n" "POT-Creation-Date: 2016-07-12 16:13+0100\n"
"PO-Revision-Date: 2016-03-01 17:38+0000\n" "PO-Revision-Date: 2016-07-12 15:14+0000\n"
"Last-Translator: Xavier Ordoquy <xordoquy@linovia.com>\n" "Last-Translator: Thomas Christie <tom@tomchristie.com>\n"
"Language-Team: Arabic (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/ar/)\n" "Language-Team: Arabic (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/ar/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -18,74 +19,74 @@ msgstr ""
"Language: ar\n" "Language: ar\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
#: authentication.py:71 #: authentication.py:73
msgid "Invalid basic header. No credentials provided." msgid "Invalid basic header. No credentials provided."
msgstr "" msgstr ""
#: authentication.py:74 #: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces." msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "" msgstr ""
#: authentication.py:80 #: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded." msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "" msgstr ""
#: authentication.py:97 #: authentication.py:99
msgid "Invalid username/password." msgid "Invalid username/password."
msgstr "اسم المستخدم/كلمة السر غير صحيحين." msgstr "اسم المستخدم/كلمة السر غير صحيحين."
#: authentication.py:100 authentication.py:195 #: authentication.py:102 authentication.py:198
msgid "User inactive or deleted." msgid "User inactive or deleted."
msgstr "المستخدم غير مفعل او تم حذفه." msgstr "المستخدم غير مفعل او تم حذفه."
#: authentication.py:173 #: authentication.py:176
msgid "Invalid token header. No credentials provided." msgid "Invalid token header. No credentials provided."
msgstr "" msgstr ""
#: authentication.py:176 #: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces." msgid "Invalid token header. Token string should not contain spaces."
msgstr "" msgstr ""
#: authentication.py:182 #: authentication.py:185
msgid "" msgid ""
"Invalid token header. Token string should not contain invalid characters." "Invalid token header. Token string should not contain invalid characters."
msgstr "" msgstr ""
#: authentication.py:192 #: authentication.py:195
msgid "Invalid token." msgid "Invalid token."
msgstr "" msgstr "رمز غير صحيح"
#: authtoken/apps.py:7 #: authtoken/apps.py:7
msgid "Auth Token" msgid "Auth Token"
msgstr "" msgstr "رمز التفويض"
#: authtoken/models.py:21 #: authtoken/models.py:15
msgid "Key" msgid "Key"
msgstr "" msgstr "المفتاح"
#: authtoken/models.py:23 #: authtoken/models.py:18
msgid "User" msgid "User"
msgstr "" msgstr "المستخدم"
#: authtoken/models.py:24 #: authtoken/models.py:20
msgid "Created" msgid "Created"
msgstr "" msgstr "أنشئ"
#: authtoken/models.py:33 #: authtoken/models.py:29
msgid "Token" msgid "Token"
msgstr "" msgstr "الرمز"
#: authtoken/models.py:34 #: authtoken/models.py:30
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr "الرموز"
#: authtoken/serializers.py:8 #: authtoken/serializers.py:8
msgid "Username" msgid "Username"
msgstr "" msgstr "اسم المستخدم"
#: authtoken/serializers.py:9 #: authtoken/serializers.py:9
msgid "Password" msgid "Password"
msgstr "" msgstr "كلمة المرور"
#: authtoken/serializers.py:20 #: authtoken/serializers.py:20
msgid "User account is disabled." msgid "User account is disabled."
@ -124,7 +125,6 @@ msgid "Not found."
msgstr "غير موجود." msgstr "غير موجود."
#: exceptions.py:109 #: exceptions.py:109
#, python-brace-format
msgid "Method \"{method}\" not allowed." msgid "Method \"{method}\" not allowed."
msgstr "" msgstr ""
@ -133,7 +133,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "" msgstr ""
#: exceptions.py:132 #: exceptions.py:132
#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request." msgid "Unsupported media type \"{media_type}\" in request."
msgstr "" msgstr ""
@ -141,214 +140,201 @@ msgstr ""
msgid "Request was throttled." msgid "Request was throttled."
msgstr "" msgstr ""
#: fields.py:266 relations.py:206 relations.py:239 validators.py:79 #: fields.py:269 relations.py:206 relations.py:239 validators.py:98
#: validators.py:162 #: validators.py:181
msgid "This field is required." msgid "This field is required."
msgstr "هذا الحقل مطلوب." msgstr "هذا الحقل مطلوب."
#: fields.py:267 #: fields.py:270
msgid "This field may not be null." msgid "This field may not be null."
msgstr "لا يمكن لهذا الحقل ان يكون فارغاً null." msgstr "لا يمكن لهذا الحقل ان يكون فارغاً null."
#: fields.py:603 fields.py:634 #: fields.py:608 fields.py:639
#, python-brace-format
msgid "\"{input}\" is not a valid boolean." msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" ليس قيمة منطقية." msgstr "\"{input}\" ليس قيمة منطقية."
#: fields.py:669 #: fields.py:674
msgid "This field may not be blank." msgid "This field may not be blank."
msgstr "لا يمكن لهذا الحقل ان يكون فارغاً." msgstr "لا يمكن لهذا الحقل ان يكون فارغاً."
#: fields.py:670 fields.py:1664 #: fields.py:675 fields.py:1675
#, python-brace-format
msgid "Ensure this field has no more than {max_length} characters." msgid "Ensure this field has no more than {max_length} characters."
msgstr "تأكد ان الحقل لا يزيد عن {max_length} محرف." msgstr "تأكد ان الحقل لا يزيد عن {max_length} محرف."
#: fields.py:671 #: fields.py:676
#, python-brace-format
msgid "Ensure this field has at least {min_length} characters." msgid "Ensure this field has at least {min_length} characters."
msgstr "تأكد ان الحقل {min_length} محرف على الاقل." msgstr "تأكد ان الحقل {min_length} محرف على الاقل."
#: fields.py:708 #: fields.py:713
msgid "Enter a valid email address." msgid "Enter a valid email address."
msgstr "عليك ان تدخل بريد إلكتروني صالح." msgstr "عليك ان تدخل بريد إلكتروني صالح."
#: fields.py:719 #: fields.py:724
msgid "This value does not match the required pattern." msgid "This value does not match the required pattern."
msgstr "هذه القيمة لا تطابق النمط المطلوب." msgstr "هذه القيمة لا تطابق النمط المطلوب."
#: fields.py:730 #: fields.py:735
msgid "" msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or " "Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens." "hyphens."
msgstr "" msgstr ""
#: fields.py:742 #: fields.py:747
msgid "Enter a valid URL." msgid "Enter a valid URL."
msgstr "الرجاء إدخال رابط إلكتروني صالح." msgstr "الرجاء إدخال رابط إلكتروني صالح."
#: fields.py:755 #: fields.py:760
#, python-brace-format
msgid "\"{value}\" is not a valid UUID." msgid "\"{value}\" is not a valid UUID."
msgstr "" msgstr ""
#: fields.py:791 #: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address." msgid "Enter a valid IPv4 or IPv6 address."
msgstr "" msgstr ""
#: fields.py:816 #: fields.py:821
msgid "A valid integer is required." msgid "A valid integer is required."
msgstr "الرجاء إدخال رقم صحيح صالح." msgstr "الرجاء إدخال رقم صحيح صالح."
#: fields.py:817 fields.py:852 fields.py:885 #: fields.py:822 fields.py:857 fields.py:891
#, python-brace-format
msgid "Ensure this value is less than or equal to {max_value}." msgid "Ensure this value is less than or equal to {max_value}."
msgstr "تأكد ان القيمة أقل أو تساوي {max_value}." msgstr "تأكد ان القيمة أقل أو تساوي {max_value}."
#: fields.py:818 fields.py:853 fields.py:886 #: fields.py:823 fields.py:858 fields.py:892
#, python-brace-format
msgid "Ensure this value is greater than or equal to {min_value}." msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "تأكد ان القيمة أكبر أو تساوي {min_value}." msgstr "تأكد ان القيمة أكبر أو تساوي {min_value}."
#: fields.py:819 fields.py:854 fields.py:890 #: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large." msgid "String value too large."
msgstr "" msgstr ""
#: fields.py:851 fields.py:884 #: fields.py:856 fields.py:890
msgid "A valid number is required." msgid "A valid number is required."
msgstr "الرجاء إدخال رقم صالح." msgstr "الرجاء إدخال رقم صالح."
#: fields.py:887 #: fields.py:893
#, python-brace-format
msgid "Ensure that there are no more than {max_digits} digits in total." msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "تأكد ان القيمة لا تحوي أكثر من {max_digits} رقم." msgstr "تأكد ان القيمة لا تحوي أكثر من {max_digits} رقم."
#: fields.py:888 #: fields.py:894
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places." "Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "" msgstr ""
#: fields.py:889 #: fields.py:895
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the " "Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point." "decimal point."
msgstr "" msgstr ""
#: fields.py:1004 #: fields.py:1025
#, python-brace-format
msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "صيغة التاريخ و الوقت غير صحيحة. عليك أن تستخدم واحدة من هذه الصيغ التالية: {format}." msgstr "صيغة التاريخ و الوقت غير صحيحة. عليك أن تستخدم واحدة من هذه الصيغ التالية: {format}."
#: fields.py:1005 #: fields.py:1026
msgid "Expected a datetime but got a date." msgid "Expected a datetime but got a date."
msgstr "" msgstr ""
#: fields.py:1082 #: fields.py:1103
#, python-brace-format
msgid "Date has wrong format. Use one of these formats instead: {format}." msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "صيغة التاريخ غير صحيحة. عليك أن تستخدم واحدة من هذه الصيغ التالية: {format}." msgstr "صيغة التاريخ غير صحيحة. عليك أن تستخدم واحدة من هذه الصيغ التالية: {format}."
#: fields.py:1083 #: fields.py:1104
msgid "Expected a date but got a datetime." msgid "Expected a date but got a datetime."
msgstr "" msgstr ""
#: fields.py:1151 #: fields.py:1170
#, python-brace-format
msgid "Time has wrong format. Use one of these formats instead: {format}." msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "صيغة الوقت غير صحيحة. عليك أن تستخدم واحدة من هذه الصيغ التالية: {format}." msgstr "صيغة الوقت غير صحيحة. عليك أن تستخدم واحدة من هذه الصيغ التالية: {format}."
#: fields.py:1215 #: fields.py:1232
#, python-brace-format
msgid "Duration has wrong format. Use one of these formats instead: {format}." msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1240 fields.py:1289 #: fields.py:1251 fields.py:1300
#, python-brace-format
msgid "\"{input}\" is not a valid choice." msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" ليست واحدة من الخيارات الصالحة." msgstr "\"{input}\" ليست واحدة من الخيارات الصالحة."
#: fields.py:1243 relations.py:71 relations.py:442 #: fields.py:1254 relations.py:71 relations.py:441
#, python-brace-format
msgid "More than {count} items..." msgid "More than {count} items..."
msgstr "" msgstr ""
#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520 #: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
#, python-brace-format
msgid "Expected a list of items but got type \"{input_type}\"." msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "" msgstr ""
#: fields.py:1291 #: fields.py:1302
msgid "This selection may not be empty." msgid "This selection may not be empty."
msgstr "" msgstr ""
#: fields.py:1328 #: fields.py:1339
#, python-brace-format
msgid "\"{input}\" is not a valid path choice." msgid "\"{input}\" is not a valid path choice."
msgstr "" msgstr ""
#: fields.py:1347 #: fields.py:1358
msgid "No file was submitted." msgid "No file was submitted."
msgstr "لم يتم إرسال أي ملف." msgstr "لم يتم إرسال أي ملف."
#: fields.py:1348 #: fields.py:1359
msgid "" msgid ""
"The submitted data was not a file. Check the encoding type on the form." "The submitted data was not a file. Check the encoding type on the form."
msgstr "" msgstr ""
#: fields.py:1349 #: fields.py:1360
msgid "No filename could be determined." msgid "No filename could be determined."
msgstr "" msgstr ""
#: fields.py:1350 #: fields.py:1361
msgid "The submitted file is empty." msgid "The submitted file is empty."
msgstr "الملف الذي تم إرساله فارغ." msgstr "الملف الذي تم إرساله فارغ."
#: fields.py:1351 #: fields.py:1362
#, python-brace-format
msgid "" msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})." "Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "تأكد ان اسم الملف لا يحوي أكثر من {max_length} محرف (الإسم المرسل يحوي {length} محرف)." msgstr "تأكد ان اسم الملف لا يحوي أكثر من {max_length} محرف (الإسم المرسل يحوي {length} محرف)."
#: fields.py:1399 #: fields.py:1410
msgid "" msgid ""
"Upload a valid image. The file you uploaded was either not an image or a " "Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image." "corrupted image."
msgstr "" msgstr ""
#: fields.py:1438 relations.py:439 serializers.py:521 #: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty." msgid "This list may not be empty."
msgstr "" msgstr ""
#: fields.py:1491 #: fields.py:1502
#, python-brace-format
msgid "Expected a dictionary of items but got type \"{input_type}\"." msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "" msgstr ""
#: fields.py:1538 #: fields.py:1549
msgid "Value must be valid JSON." msgid "Value must be valid JSON."
msgstr "" msgstr ""
#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5 #: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit" msgid "Submit"
msgstr "أرسل"
#: filters.py:336
msgid "ascending"
msgstr "" msgstr ""
#: pagination.py:189 #: filters.py:337
msgid "descending"
msgstr ""
#: pagination.py:193
msgid "Invalid page." msgid "Invalid page."
msgstr "" msgstr "صفحة غير صحيحة"
#: pagination.py:407 #: pagination.py:427
msgid "Invalid cursor" msgid "Invalid cursor"
msgstr "" msgstr ""
#: relations.py:207 #: relations.py:207
#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist." msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "معرف العنصر \"{pk_value}\" غير صالح - العنصر غير موجود." msgstr "معرف العنصر \"{pk_value}\" غير صالح - العنصر غير موجود."
#: relations.py:208 #: relations.py:208
#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}." msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "" msgstr ""
@ -365,41 +351,38 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "" msgstr ""
#: relations.py:243 #: relations.py:243
#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}." msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "" msgstr ""
#: relations.py:402 #: relations.py:401
#, python-brace-format
msgid "Object with {slug_name}={value} does not exist." msgid "Object with {slug_name}={value} does not exist."
msgstr "" msgstr ""
#: relations.py:403 #: relations.py:402
msgid "Invalid value." msgid "Invalid value."
msgstr "قيمة غير صالحة." msgstr "قيمة غير صالحة."
#: serializers.py:326 #: serializers.py:326
#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}." msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "" msgstr ""
#: templates/rest_framework/admin.html:118 #: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128 #: templates/rest_framework/base.html:128
msgid "Filters" msgid "Filters"
msgstr "" msgstr "مرشحات"
#: templates/rest_framework/filters/django_filter.html:2 #: templates/rest_framework/filters/django_filter.html:2
#: templates/rest_framework/filters/django_filter_crispyforms.html:4 #: templates/rest_framework/filters/django_filter_crispyforms.html:4
msgid "Field filters" msgid "Field filters"
msgstr "" msgstr "مرشحات الحقول"
#: templates/rest_framework/filters/ordering.html:3 #: templates/rest_framework/filters/ordering.html:3
msgid "Ordering" msgid "Ordering"
msgstr "" msgstr "الترتيب"
#: templates/rest_framework/filters/search.html:2 #: templates/rest_framework/filters/search.html:2
msgid "Search" msgid "Search"
msgstr "" msgstr "البحث"
#: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/horizontal/radio.html:2
#: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/inline/radio.html:2
@ -413,27 +396,23 @@ msgstr ""
msgid "No items to select." msgid "No items to select."
msgstr "" msgstr ""
#: validators.py:24 #: validators.py:43
msgid "This field must be unique." msgid "This field must be unique."
msgstr "" msgstr ""
#: validators.py:78 #: validators.py:97
#, python-brace-format
msgid "The fields {field_names} must make a unique set." msgid "The fields {field_names} must make a unique set."
msgstr "" msgstr ""
#: validators.py:226 #: validators.py:245
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" date." msgid "This field must be unique for the \"{date_field}\" date."
msgstr "" msgstr ""
#: validators.py:241 #: validators.py:260
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" month." msgid "This field must be unique for the \"{date_field}\" month."
msgstr "" msgstr ""
#: validators.py:254 #: validators.py:273
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" year." msgid "This field must be unique for the \"{date_field}\" year."
msgstr "" msgstr ""
@ -441,15 +420,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header." msgid "Invalid version in \"Accept\" header."
msgstr "" msgstr ""
#: versioning.py:73 versioning.py:115 #: versioning.py:73
msgid "Invalid version in URL path." msgid "Invalid version in URL path."
msgstr "" msgstr ""
#: versioning.py:144 #: versioning.py:115
msgid "Invalid version in URL path. Does not match any version namespace."
msgstr ""
#: versioning.py:147
msgid "Invalid version in hostname." msgid "Invalid version in hostname."
msgstr "" msgstr ""
#: versioning.py:166 #: versioning.py:169
msgid "Invalid version in query parameter." msgid "Invalid version in query parameter."
msgstr "" msgstr ""

View File

@ -7,9 +7,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django REST framework\n" "Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-01 18:38+0100\n" "POT-Creation-Date: 2016-07-12 16:13+0100\n"
"PO-Revision-Date: 2016-03-01 17:38+0000\n" "PO-Revision-Date: 2016-07-12 15:14+0000\n"
"Last-Translator: Xavier Ordoquy <xordoquy@linovia.com>\n" "Last-Translator: Thomas Christie <tom@tomchristie.com>\n"
"Language-Team: Belarusian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/be/)\n" "Language-Team: Belarusian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/be/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -17,40 +17,40 @@ msgstr ""
"Language: be\n" "Language: be\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
#: authentication.py:71 #: authentication.py:73
msgid "Invalid basic header. No credentials provided." msgid "Invalid basic header. No credentials provided."
msgstr "" msgstr ""
#: authentication.py:74 #: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces." msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "" msgstr ""
#: authentication.py:80 #: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded." msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "" msgstr ""
#: authentication.py:97 #: authentication.py:99
msgid "Invalid username/password." msgid "Invalid username/password."
msgstr "" msgstr ""
#: authentication.py:100 authentication.py:195 #: authentication.py:102 authentication.py:198
msgid "User inactive or deleted." msgid "User inactive or deleted."
msgstr "" msgstr ""
#: authentication.py:173 #: authentication.py:176
msgid "Invalid token header. No credentials provided." msgid "Invalid token header. No credentials provided."
msgstr "" msgstr ""
#: authentication.py:176 #: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces." msgid "Invalid token header. Token string should not contain spaces."
msgstr "" msgstr ""
#: authentication.py:182 #: authentication.py:185
msgid "" msgid ""
"Invalid token header. Token string should not contain invalid characters." "Invalid token header. Token string should not contain invalid characters."
msgstr "" msgstr ""
#: authentication.py:192 #: authentication.py:195
msgid "Invalid token." msgid "Invalid token."
msgstr "" msgstr ""
@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token" msgid "Auth Token"
msgstr "" msgstr ""
#: authtoken/models.py:21 #: authtoken/models.py:15
msgid "Key" msgid "Key"
msgstr "" msgstr ""
#: authtoken/models.py:23 #: authtoken/models.py:18
msgid "User" msgid "User"
msgstr "" msgstr ""
#: authtoken/models.py:24 #: authtoken/models.py:20
msgid "Created" msgid "Created"
msgstr "" msgstr ""
#: authtoken/models.py:33 #: authtoken/models.py:29
msgid "Token" msgid "Token"
msgstr "" msgstr ""
#: authtoken/models.py:34 #: authtoken/models.py:30
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
@ -123,7 +123,6 @@ msgid "Not found."
msgstr "" msgstr ""
#: exceptions.py:109 #: exceptions.py:109
#, python-brace-format
msgid "Method \"{method}\" not allowed." msgid "Method \"{method}\" not allowed."
msgstr "" msgstr ""
@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "" msgstr ""
#: exceptions.py:132 #: exceptions.py:132
#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request." msgid "Unsupported media type \"{media_type}\" in request."
msgstr "" msgstr ""
@ -140,214 +138,201 @@ msgstr ""
msgid "Request was throttled." msgid "Request was throttled."
msgstr "" msgstr ""
#: fields.py:266 relations.py:206 relations.py:239 validators.py:79 #: fields.py:269 relations.py:206 relations.py:239 validators.py:98
#: validators.py:162 #: validators.py:181
msgid "This field is required." msgid "This field is required."
msgstr "" msgstr ""
#: fields.py:267 #: fields.py:270
msgid "This field may not be null." msgid "This field may not be null."
msgstr "" msgstr ""
#: fields.py:603 fields.py:634 #: fields.py:608 fields.py:639
#, python-brace-format
msgid "\"{input}\" is not a valid boolean." msgid "\"{input}\" is not a valid boolean."
msgstr "" msgstr ""
#: fields.py:669 #: fields.py:674
msgid "This field may not be blank." msgid "This field may not be blank."
msgstr "" msgstr ""
#: fields.py:670 fields.py:1664 #: fields.py:675 fields.py:1675
#, python-brace-format
msgid "Ensure this field has no more than {max_length} characters." msgid "Ensure this field has no more than {max_length} characters."
msgstr "" msgstr ""
#: fields.py:671 #: fields.py:676
#, python-brace-format
msgid "Ensure this field has at least {min_length} characters." msgid "Ensure this field has at least {min_length} characters."
msgstr "" msgstr ""
#: fields.py:708 #: fields.py:713
msgid "Enter a valid email address." msgid "Enter a valid email address."
msgstr "" msgstr ""
#: fields.py:719 #: fields.py:724
msgid "This value does not match the required pattern." msgid "This value does not match the required pattern."
msgstr "" msgstr ""
#: fields.py:730 #: fields.py:735
msgid "" msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or " "Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens." "hyphens."
msgstr "" msgstr ""
#: fields.py:742 #: fields.py:747
msgid "Enter a valid URL." msgid "Enter a valid URL."
msgstr "" msgstr ""
#: fields.py:755 #: fields.py:760
#, python-brace-format
msgid "\"{value}\" is not a valid UUID." msgid "\"{value}\" is not a valid UUID."
msgstr "" msgstr ""
#: fields.py:791 #: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address." msgid "Enter a valid IPv4 or IPv6 address."
msgstr "" msgstr ""
#: fields.py:816 #: fields.py:821
msgid "A valid integer is required." msgid "A valid integer is required."
msgstr "" msgstr ""
#: fields.py:817 fields.py:852 fields.py:885 #: fields.py:822 fields.py:857 fields.py:891
#, python-brace-format
msgid "Ensure this value is less than or equal to {max_value}." msgid "Ensure this value is less than or equal to {max_value}."
msgstr "" msgstr ""
#: fields.py:818 fields.py:853 fields.py:886 #: fields.py:823 fields.py:858 fields.py:892
#, python-brace-format
msgid "Ensure this value is greater than or equal to {min_value}." msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "" msgstr ""
#: fields.py:819 fields.py:854 fields.py:890 #: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large." msgid "String value too large."
msgstr "" msgstr ""
#: fields.py:851 fields.py:884 #: fields.py:856 fields.py:890
msgid "A valid number is required." msgid "A valid number is required."
msgstr "" msgstr ""
#: fields.py:887 #: fields.py:893
#, python-brace-format
msgid "Ensure that there are no more than {max_digits} digits in total." msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "" msgstr ""
#: fields.py:888 #: fields.py:894
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places." "Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "" msgstr ""
#: fields.py:889 #: fields.py:895
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the " "Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point." "decimal point."
msgstr "" msgstr ""
#: fields.py:1004 #: fields.py:1025
#, python-brace-format
msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1005 #: fields.py:1026
msgid "Expected a datetime but got a date." msgid "Expected a datetime but got a date."
msgstr "" msgstr ""
#: fields.py:1082 #: fields.py:1103
#, python-brace-format
msgid "Date has wrong format. Use one of these formats instead: {format}." msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1083 #: fields.py:1104
msgid "Expected a date but got a datetime." msgid "Expected a date but got a datetime."
msgstr "" msgstr ""
#: fields.py:1151 #: fields.py:1170
#, python-brace-format
msgid "Time has wrong format. Use one of these formats instead: {format}." msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1215 #: fields.py:1232
#, python-brace-format
msgid "Duration has wrong format. Use one of these formats instead: {format}." msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1240 fields.py:1289 #: fields.py:1251 fields.py:1300
#, python-brace-format
msgid "\"{input}\" is not a valid choice." msgid "\"{input}\" is not a valid choice."
msgstr "" msgstr ""
#: fields.py:1243 relations.py:71 relations.py:442 #: fields.py:1254 relations.py:71 relations.py:441
#, python-brace-format
msgid "More than {count} items..." msgid "More than {count} items..."
msgstr "" msgstr ""
#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520 #: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
#, python-brace-format
msgid "Expected a list of items but got type \"{input_type}\"." msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "" msgstr ""
#: fields.py:1291 #: fields.py:1302
msgid "This selection may not be empty." msgid "This selection may not be empty."
msgstr "" msgstr ""
#: fields.py:1328 #: fields.py:1339
#, python-brace-format
msgid "\"{input}\" is not a valid path choice." msgid "\"{input}\" is not a valid path choice."
msgstr "" msgstr ""
#: fields.py:1347 #: fields.py:1358
msgid "No file was submitted." msgid "No file was submitted."
msgstr "" msgstr ""
#: fields.py:1348 #: fields.py:1359
msgid "" msgid ""
"The submitted data was not a file. Check the encoding type on the form." "The submitted data was not a file. Check the encoding type on the form."
msgstr "" msgstr ""
#: fields.py:1349 #: fields.py:1360
msgid "No filename could be determined." msgid "No filename could be determined."
msgstr "" msgstr ""
#: fields.py:1350 #: fields.py:1361
msgid "The submitted file is empty." msgid "The submitted file is empty."
msgstr "" msgstr ""
#: fields.py:1351 #: fields.py:1362
#, python-brace-format
msgid "" msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})." "Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "" msgstr ""
#: fields.py:1399 #: fields.py:1410
msgid "" msgid ""
"Upload a valid image. The file you uploaded was either not an image or a " "Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image." "corrupted image."
msgstr "" msgstr ""
#: fields.py:1438 relations.py:439 serializers.py:521 #: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty." msgid "This list may not be empty."
msgstr "" msgstr ""
#: fields.py:1491 #: fields.py:1502
#, python-brace-format
msgid "Expected a dictionary of items but got type \"{input_type}\"." msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "" msgstr ""
#: fields.py:1538 #: fields.py:1549
msgid "Value must be valid JSON." msgid "Value must be valid JSON."
msgstr "" msgstr ""
#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5 #: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit" msgid "Submit"
msgstr "" msgstr ""
#: pagination.py:189 #: filters.py:336
msgid "ascending"
msgstr ""
#: filters.py:337
msgid "descending"
msgstr ""
#: pagination.py:193
msgid "Invalid page." msgid "Invalid page."
msgstr "" msgstr ""
#: pagination.py:407 #: pagination.py:427
msgid "Invalid cursor" msgid "Invalid cursor"
msgstr "" msgstr ""
#: relations.py:207 #: relations.py:207
#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist." msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "" msgstr ""
#: relations.py:208 #: relations.py:208
#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}." msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "" msgstr ""
@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "" msgstr ""
#: relations.py:243 #: relations.py:243
#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}." msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "" msgstr ""
#: relations.py:402 #: relations.py:401
#, python-brace-format
msgid "Object with {slug_name}={value} does not exist." msgid "Object with {slug_name}={value} does not exist."
msgstr "" msgstr ""
#: relations.py:403 #: relations.py:402
msgid "Invalid value." msgid "Invalid value."
msgstr "" msgstr ""
#: serializers.py:326 #: serializers.py:326
#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}." msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "" msgstr ""
#: templates/rest_framework/admin.html:118 #: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128 #: templates/rest_framework/base.html:128
msgid "Filters" msgid "Filters"
msgstr "" msgstr ""
@ -412,27 +394,23 @@ msgstr ""
msgid "No items to select." msgid "No items to select."
msgstr "" msgstr ""
#: validators.py:24 #: validators.py:43
msgid "This field must be unique." msgid "This field must be unique."
msgstr "" msgstr ""
#: validators.py:78 #: validators.py:97
#, python-brace-format
msgid "The fields {field_names} must make a unique set." msgid "The fields {field_names} must make a unique set."
msgstr "" msgstr ""
#: validators.py:226 #: validators.py:245
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" date." msgid "This field must be unique for the \"{date_field}\" date."
msgstr "" msgstr ""
#: validators.py:241 #: validators.py:260
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" month." msgid "This field must be unique for the \"{date_field}\" month."
msgstr "" msgstr ""
#: validators.py:254 #: validators.py:273
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" year." msgid "This field must be unique for the \"{date_field}\" year."
msgstr "" msgstr ""
@ -440,15 +418,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header." msgid "Invalid version in \"Accept\" header."
msgstr "" msgstr ""
#: versioning.py:73 versioning.py:115 #: versioning.py:73
msgid "Invalid version in URL path." msgid "Invalid version in URL path."
msgstr "" msgstr ""
#: versioning.py:144 #: versioning.py:115
msgid "Invalid version in URL path. Does not match any version namespace."
msgstr ""
#: versioning.py:147
msgid "Invalid version in hostname." msgid "Invalid version in hostname."
msgstr "" msgstr ""
#: versioning.py:166 #: versioning.py:169
msgid "Invalid version in query parameter." msgid "Invalid version in query parameter."
msgstr "" msgstr ""

View File

@ -7,9 +7,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django REST framework\n" "Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-01 18:38+0100\n" "POT-Creation-Date: 2016-07-12 16:13+0100\n"
"PO-Revision-Date: 2016-03-01 17:38+0000\n" "PO-Revision-Date: 2016-07-12 15:14+0000\n"
"Last-Translator: Xavier Ordoquy <xordoquy@linovia.com>\n" "Last-Translator: Thomas Christie <tom@tomchristie.com>\n"
"Language-Team: Catalan (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/ca/)\n" "Language-Team: Catalan (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/ca/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -17,40 +17,40 @@ msgstr ""
"Language: ca\n" "Language: ca\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: authentication.py:71 #: authentication.py:73
msgid "Invalid basic header. No credentials provided." msgid "Invalid basic header. No credentials provided."
msgstr "Header Basic invàlid. No hi ha disponibles les credencials." msgstr "Header Basic invàlid. No hi ha disponibles les credencials."
#: authentication.py:74 #: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces." msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "Header Basic invàlid. Les credencials no poden contenir espais." msgstr "Header Basic invàlid. Les credencials no poden contenir espais."
#: authentication.py:80 #: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded." msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "Header Basic invàlid. Les credencials no estan codificades correctament en base64." msgstr "Header Basic invàlid. Les credencials no estan codificades correctament en base64."
#: authentication.py:97 #: authentication.py:99
msgid "Invalid username/password." msgid "Invalid username/password."
msgstr "Usuari/Contrasenya incorrectes." msgstr "Usuari/Contrasenya incorrectes."
#: authentication.py:100 authentication.py:195 #: authentication.py:102 authentication.py:198
msgid "User inactive or deleted." msgid "User inactive or deleted."
msgstr "Usuari inactiu o esborrat." msgstr "Usuari inactiu o esborrat."
#: authentication.py:173 #: authentication.py:176
msgid "Invalid token header. No credentials provided." msgid "Invalid token header. No credentials provided."
msgstr "Token header invàlid. No s'han indicat les credencials." msgstr "Token header invàlid. No s'han indicat les credencials."
#: authentication.py:176 #: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces." msgid "Invalid token header. Token string should not contain spaces."
msgstr "Token header invàlid. El token no ha de contenir espais." msgstr "Token header invàlid. El token no ha de contenir espais."
#: authentication.py:182 #: authentication.py:185
msgid "" msgid ""
"Invalid token header. Token string should not contain invalid characters." "Invalid token header. Token string should not contain invalid characters."
msgstr "Token header invàlid. El token no pot contenir caràcters invàlids." msgstr "Token header invàlid. El token no pot contenir caràcters invàlids."
#: authentication.py:192 #: authentication.py:195
msgid "Invalid token." msgid "Invalid token."
msgstr "Token invàlid." msgstr "Token invàlid."
@ -58,23 +58,23 @@ msgstr "Token invàlid."
msgid "Auth Token" msgid "Auth Token"
msgstr "" msgstr ""
#: authtoken/models.py:21 #: authtoken/models.py:15
msgid "Key" msgid "Key"
msgstr "" msgstr ""
#: authtoken/models.py:23 #: authtoken/models.py:18
msgid "User" msgid "User"
msgstr "" msgstr ""
#: authtoken/models.py:24 #: authtoken/models.py:20
msgid "Created" msgid "Created"
msgstr "" msgstr ""
#: authtoken/models.py:33 #: authtoken/models.py:29
msgid "Token" msgid "Token"
msgstr "" msgstr ""
#: authtoken/models.py:34 #: authtoken/models.py:30
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
@ -123,7 +123,6 @@ msgid "Not found."
msgstr "No trobat." msgstr "No trobat."
#: exceptions.py:109 #: exceptions.py:109
#, python-brace-format
msgid "Method \"{method}\" not allowed." msgid "Method \"{method}\" not allowed."
msgstr "Mètode \"{method}\" no permès." msgstr "Mètode \"{method}\" no permès."
@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "No s'ha pogut satisfer l'Accept header de la petició." msgstr "No s'ha pogut satisfer l'Accept header de la petició."
#: exceptions.py:132 #: exceptions.py:132
#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request." msgid "Unsupported media type \"{media_type}\" in request."
msgstr "Media type \"{media_type}\" no suportat." msgstr "Media type \"{media_type}\" no suportat."
@ -140,214 +138,201 @@ msgstr "Media type \"{media_type}\" no suportat."
msgid "Request was throttled." msgid "Request was throttled."
msgstr "La petició ha estat limitada pel número màxim de peticions definit." msgstr "La petició ha estat limitada pel número màxim de peticions definit."
#: fields.py:266 relations.py:206 relations.py:239 validators.py:79 #: fields.py:269 relations.py:206 relations.py:239 validators.py:98
#: validators.py:162 #: validators.py:181
msgid "This field is required." msgid "This field is required."
msgstr "Aquest camp és obligatori." msgstr "Aquest camp és obligatori."
#: fields.py:267 #: fields.py:270
msgid "This field may not be null." msgid "This field may not be null."
msgstr "Aquest camp no pot ser nul." msgstr "Aquest camp no pot ser nul."
#: fields.py:603 fields.py:634 #: fields.py:608 fields.py:639
#, python-brace-format
msgid "\"{input}\" is not a valid boolean." msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" no és un booleà." msgstr "\"{input}\" no és un booleà."
#: fields.py:669 #: fields.py:674
msgid "This field may not be blank." msgid "This field may not be blank."
msgstr "Aquest camp no pot estar en blanc." msgstr "Aquest camp no pot estar en blanc."
#: fields.py:670 fields.py:1664 #: fields.py:675 fields.py:1675
#, python-brace-format
msgid "Ensure this field has no more than {max_length} characters." msgid "Ensure this field has no more than {max_length} characters."
msgstr "Aquest camp no pot tenir més de {max_length} caràcters." msgstr "Aquest camp no pot tenir més de {max_length} caràcters."
#: fields.py:671 #: fields.py:676
#, python-brace-format
msgid "Ensure this field has at least {min_length} characters." msgid "Ensure this field has at least {min_length} characters."
msgstr "Aquest camp ha de tenir un mínim de {min_length} caràcters." msgstr "Aquest camp ha de tenir un mínim de {min_length} caràcters."
#: fields.py:708 #: fields.py:713
msgid "Enter a valid email address." msgid "Enter a valid email address."
msgstr "Introdueixi una adreça de correu vàlida." msgstr "Introdueixi una adreça de correu vàlida."
#: fields.py:719 #: fields.py:724
msgid "This value does not match the required pattern." msgid "This value does not match the required pattern."
msgstr "Aquest valor no compleix el patró requerit." msgstr "Aquest valor no compleix el patró requerit."
#: fields.py:730 #: fields.py:735
msgid "" msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or " "Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens." "hyphens."
msgstr "Introdueix un \"slug\" vàlid consistent en lletres, números, guions o guions baixos." msgstr "Introdueix un \"slug\" vàlid consistent en lletres, números, guions o guions baixos."
#: fields.py:742 #: fields.py:747
msgid "Enter a valid URL." msgid "Enter a valid URL."
msgstr "Introdueixi una URL vàlida." msgstr "Introdueixi una URL vàlida."
#: fields.py:755 #: fields.py:760
#, python-brace-format
msgid "\"{value}\" is not a valid UUID." msgid "\"{value}\" is not a valid UUID."
msgstr "\"{value}\" no és un UUID vàlid." msgstr "\"{value}\" no és un UUID vàlid."
#: fields.py:791 #: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address." msgid "Enter a valid IPv4 or IPv6 address."
msgstr "Introdueixi una adreça IPv4 o IPv6 vàlida." msgstr "Introdueixi una adreça IPv4 o IPv6 vàlida."
#: fields.py:816 #: fields.py:821
msgid "A valid integer is required." msgid "A valid integer is required."
msgstr "Es requereix un nombre enter vàlid." msgstr "Es requereix un nombre enter vàlid."
#: fields.py:817 fields.py:852 fields.py:885 #: fields.py:822 fields.py:857 fields.py:891
#, python-brace-format
msgid "Ensure this value is less than or equal to {max_value}." msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Aquest valor ha de ser menor o igual a {max_value}." msgstr "Aquest valor ha de ser menor o igual a {max_value}."
#: fields.py:818 fields.py:853 fields.py:886 #: fields.py:823 fields.py:858 fields.py:892
#, python-brace-format
msgid "Ensure this value is greater than or equal to {min_value}." msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Aquest valor ha de ser més gran o igual a {min_value}." msgstr "Aquest valor ha de ser més gran o igual a {min_value}."
#: fields.py:819 fields.py:854 fields.py:890 #: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large." msgid "String value too large."
msgstr "Valor del text massa gran." msgstr "Valor del text massa gran."
#: fields.py:851 fields.py:884 #: fields.py:856 fields.py:890
msgid "A valid number is required." msgid "A valid number is required."
msgstr "Es requereix un nombre vàlid." msgstr "Es requereix un nombre vàlid."
#: fields.py:887 #: fields.py:893
#, python-brace-format
msgid "Ensure that there are no more than {max_digits} digits in total." msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "No pot haver-hi més de {max_digits} dígits en total." msgstr "No pot haver-hi més de {max_digits} dígits en total."
#: fields.py:888 #: fields.py:894
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places." "Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "No pot haver-hi més de {max_decimal_places} decimals." msgstr "No pot haver-hi més de {max_decimal_places} decimals."
#: fields.py:889 #: fields.py:895
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the " "Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point." "decimal point."
msgstr "No pot haver-hi més de {max_whole_digits} dígits abans del punt decimal." msgstr "No pot haver-hi més de {max_whole_digits} dígits abans del punt decimal."
#: fields.py:1004 #: fields.py:1025
#, python-brace-format
msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "El Datetime té un format incorrecte. Utilitzi un d'aquests formats: {format}." msgstr "El Datetime té un format incorrecte. Utilitzi un d'aquests formats: {format}."
#: fields.py:1005 #: fields.py:1026
msgid "Expected a datetime but got a date." msgid "Expected a datetime but got a date."
msgstr "S'espera un Datetime però s'ha rebut un Date." msgstr "S'espera un Datetime però s'ha rebut un Date."
#: fields.py:1082 #: fields.py:1103
#, python-brace-format
msgid "Date has wrong format. Use one of these formats instead: {format}." msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "El Date té un format incorrecte. Utilitzi un d'aquests formats: {format}." msgstr "El Date té un format incorrecte. Utilitzi un d'aquests formats: {format}."
#: fields.py:1083 #: fields.py:1104
msgid "Expected a date but got a datetime." msgid "Expected a date but got a datetime."
msgstr "S'espera un Date però s'ha rebut un Datetime." msgstr "S'espera un Date però s'ha rebut un Datetime."
#: fields.py:1151 #: fields.py:1170
#, python-brace-format
msgid "Time has wrong format. Use one of these formats instead: {format}." msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "El Time té un format incorrecte. Utilitzi un d'aquests formats: {format}." msgstr "El Time té un format incorrecte. Utilitzi un d'aquests formats: {format}."
#: fields.py:1215 #: fields.py:1232
#, python-brace-format
msgid "Duration has wrong format. Use one of these formats instead: {format}." msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "La durada té un format incorrecte. Utilitzi un d'aquests formats: {format}." msgstr "La durada té un format incorrecte. Utilitzi un d'aquests formats: {format}."
#: fields.py:1240 fields.py:1289 #: fields.py:1251 fields.py:1300
#, python-brace-format
msgid "\"{input}\" is not a valid choice." msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" no és una opció vàlida." msgstr "\"{input}\" no és una opció vàlida."
#: fields.py:1243 relations.py:71 relations.py:442 #: fields.py:1254 relations.py:71 relations.py:441
#, python-brace-format
msgid "More than {count} items..." msgid "More than {count} items..."
msgstr "" msgstr ""
#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520 #: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
#, python-brace-format
msgid "Expected a list of items but got type \"{input_type}\"." msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "S'espera una llista d'ítems però s'ha rebut el tipus \"{input_type}\"." msgstr "S'espera una llista d'ítems però s'ha rebut el tipus \"{input_type}\"."
#: fields.py:1291 #: fields.py:1302
msgid "This selection may not be empty." msgid "This selection may not be empty."
msgstr "Aquesta selecció no pot estar buida." msgstr "Aquesta selecció no pot estar buida."
#: fields.py:1328 #: fields.py:1339
#, python-brace-format
msgid "\"{input}\" is not a valid path choice." msgid "\"{input}\" is not a valid path choice."
msgstr "\"{input}\" no és un path vàlid." msgstr "\"{input}\" no és un path vàlid."
#: fields.py:1347 #: fields.py:1358
msgid "No file was submitted." msgid "No file was submitted."
msgstr "No s'ha enviat cap fitxer." msgstr "No s'ha enviat cap fitxer."
#: fields.py:1348 #: fields.py:1359
msgid "" msgid ""
"The submitted data was not a file. Check the encoding type on the form." "The submitted data was not a file. Check the encoding type on the form."
msgstr "Les dades enviades no són un fitxer. Comproveu l'encoding type del formulari." msgstr "Les dades enviades no són un fitxer. Comproveu l'encoding type del formulari."
#: fields.py:1349 #: fields.py:1360
msgid "No filename could be determined." msgid "No filename could be determined."
msgstr "No s'ha pogut determinar el nom del fitxer." msgstr "No s'ha pogut determinar el nom del fitxer."
#: fields.py:1350 #: fields.py:1361
msgid "The submitted file is empty." msgid "The submitted file is empty."
msgstr "El fitxer enviat està buit." msgstr "El fitxer enviat està buit."
#: fields.py:1351 #: fields.py:1362
#, python-brace-format
msgid "" msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})." "Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "El nom del fitxer ha de tenir com a màxim {max_length} caràcters (en té {length})." msgstr "El nom del fitxer ha de tenir com a màxim {max_length} caràcters (en té {length})."
#: fields.py:1399 #: fields.py:1410
msgid "" msgid ""
"Upload a valid image. The file you uploaded was either not an image or a " "Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image." "corrupted image."
msgstr "Envieu una imatge vàlida. El fitxer enviat no és una imatge o és una imatge corrompuda." msgstr "Envieu una imatge vàlida. El fitxer enviat no és una imatge o és una imatge corrompuda."
#: fields.py:1438 relations.py:439 serializers.py:521 #: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty." msgid "This list may not be empty."
msgstr "Aquesta llista no pot estar buida." msgstr "Aquesta llista no pot estar buida."
#: fields.py:1491 #: fields.py:1502
#, python-brace-format
msgid "Expected a dictionary of items but got type \"{input_type}\"." msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "S'espera un diccionari però s'ha rebut el tipus \"{input_type}\"." msgstr "S'espera un diccionari però s'ha rebut el tipus \"{input_type}\"."
#: fields.py:1538 #: fields.py:1549
msgid "Value must be valid JSON." msgid "Value must be valid JSON."
msgstr "" msgstr ""
#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5 #: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit" msgid "Submit"
msgstr "" msgstr ""
#: pagination.py:189 #: filters.py:336
msgid "ascending"
msgstr ""
#: filters.py:337
msgid "descending"
msgstr ""
#: pagination.py:193
msgid "Invalid page." msgid "Invalid page."
msgstr "" msgstr ""
#: pagination.py:407 #: pagination.py:427
msgid "Invalid cursor" msgid "Invalid cursor"
msgstr "Cursor invàlid." msgstr "Cursor invàlid."
#: relations.py:207 #: relations.py:207
#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist." msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "PK invàlida \"{pk_value}\" - l'objecte no existeix." msgstr "PK invàlida \"{pk_value}\" - l'objecte no existeix."
#: relations.py:208 #: relations.py:208
#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}." msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Tipus incorrecte. S'espera el valor d'una PK, s'ha rebut {data_type}." msgstr "Tipus incorrecte. S'espera el valor d'una PK, s'ha rebut {data_type}."
@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Hyperlink invàlid - L'objecte no existeix." msgstr "Hyperlink invàlid - L'objecte no existeix."
#: relations.py:243 #: relations.py:243
#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}." msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Tipus incorrecte. S'espera una URL, s'ha rebut {data_type}." msgstr "Tipus incorrecte. S'espera una URL, s'ha rebut {data_type}."
#: relations.py:402 #: relations.py:401
#, python-brace-format
msgid "Object with {slug_name}={value} does not exist." msgid "Object with {slug_name}={value} does not exist."
msgstr "L'objecte amb {slug_name}={value} no existeix." msgstr "L'objecte amb {slug_name}={value} no existeix."
#: relations.py:403 #: relations.py:402
msgid "Invalid value." msgid "Invalid value."
msgstr "Valor invàlid." msgstr "Valor invàlid."
#: serializers.py:326 #: serializers.py:326
#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}." msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Dades invàlides. S'espera un diccionari però s'ha rebut {datatype}." msgstr "Dades invàlides. S'espera un diccionari però s'ha rebut {datatype}."
#: templates/rest_framework/admin.html:118 #: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128 #: templates/rest_framework/base.html:128
msgid "Filters" msgid "Filters"
msgstr "" msgstr ""
@ -412,27 +394,23 @@ msgstr "Cap"
msgid "No items to select." msgid "No items to select."
msgstr "Cap opció seleccionada." msgstr "Cap opció seleccionada."
#: validators.py:24 #: validators.py:43
msgid "This field must be unique." msgid "This field must be unique."
msgstr "Aquest camp ha de ser únic." msgstr "Aquest camp ha de ser únic."
#: validators.py:78 #: validators.py:97
#, python-brace-format
msgid "The fields {field_names} must make a unique set." msgid "The fields {field_names} must make a unique set."
msgstr "Aquests camps {field_names} han de constituir un conjunt únic." msgstr "Aquests camps {field_names} han de constituir un conjunt únic."
#: validators.py:226 #: validators.py:245
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" date." msgid "This field must be unique for the \"{date_field}\" date."
msgstr "Aquest camp ha de ser únic per a la data \"{date_field}\"." msgstr "Aquest camp ha de ser únic per a la data \"{date_field}\"."
#: validators.py:241 #: validators.py:260
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" month." msgid "This field must be unique for the \"{date_field}\" month."
msgstr "Aquest camp ha de ser únic per al mes \"{date_field}\"." msgstr "Aquest camp ha de ser únic per al mes \"{date_field}\"."
#: validators.py:254 #: validators.py:273
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" year." msgid "This field must be unique for the \"{date_field}\" year."
msgstr "Aquest camp ha de ser únic per a l'any \"{date_field}\"." msgstr "Aquest camp ha de ser únic per a l'any \"{date_field}\"."
@ -440,15 +418,19 @@ msgstr "Aquest camp ha de ser únic per a l'any \"{date_field}\"."
msgid "Invalid version in \"Accept\" header." msgid "Invalid version in \"Accept\" header."
msgstr "Versió invàlida al header \"Accept\"." msgstr "Versió invàlida al header \"Accept\"."
#: versioning.py:73 versioning.py:115 #: versioning.py:73
msgid "Invalid version in URL path." msgid "Invalid version in URL path."
msgstr "Versió invàlida a la URL." msgstr "Versió invàlida a la URL."
#: versioning.py:144 #: versioning.py:115
msgid "Invalid version in URL path. Does not match any version namespace."
msgstr ""
#: versioning.py:147
msgid "Invalid version in hostname." msgid "Invalid version in hostname."
msgstr "Versió invàlida al hostname." msgstr "Versió invàlida al hostname."
#: versioning.py:166 #: versioning.py:169
msgid "Invalid version in query parameter." msgid "Invalid version in query parameter."
msgstr "Versió invàlida al paràmetre de consulta." msgstr "Versió invàlida al paràmetre de consulta."

View File

@ -7,9 +7,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django REST framework\n" "Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-01 18:38+0100\n" "POT-Creation-Date: 2016-07-12 16:13+0100\n"
"PO-Revision-Date: 2016-03-01 17:38+0000\n" "PO-Revision-Date: 2016-07-12 15:14+0000\n"
"Last-Translator: Xavier Ordoquy <xordoquy@linovia.com>\n" "Last-Translator: Thomas Christie <tom@tomchristie.com>\n"
"Language-Team: Catalan (Spain) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/ca_ES/)\n" "Language-Team: Catalan (Spain) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/ca_ES/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -17,40 +17,40 @@ msgstr ""
"Language: ca_ES\n" "Language: ca_ES\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: authentication.py:71 #: authentication.py:73
msgid "Invalid basic header. No credentials provided." msgid "Invalid basic header. No credentials provided."
msgstr "" msgstr ""
#: authentication.py:74 #: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces." msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "" msgstr ""
#: authentication.py:80 #: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded." msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "" msgstr ""
#: authentication.py:97 #: authentication.py:99
msgid "Invalid username/password." msgid "Invalid username/password."
msgstr "" msgstr ""
#: authentication.py:100 authentication.py:195 #: authentication.py:102 authentication.py:198
msgid "User inactive or deleted." msgid "User inactive or deleted."
msgstr "" msgstr ""
#: authentication.py:173 #: authentication.py:176
msgid "Invalid token header. No credentials provided." msgid "Invalid token header. No credentials provided."
msgstr "" msgstr ""
#: authentication.py:176 #: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces." msgid "Invalid token header. Token string should not contain spaces."
msgstr "" msgstr ""
#: authentication.py:182 #: authentication.py:185
msgid "" msgid ""
"Invalid token header. Token string should not contain invalid characters." "Invalid token header. Token string should not contain invalid characters."
msgstr "" msgstr ""
#: authentication.py:192 #: authentication.py:195
msgid "Invalid token." msgid "Invalid token."
msgstr "" msgstr ""
@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token" msgid "Auth Token"
msgstr "" msgstr ""
#: authtoken/models.py:21 #: authtoken/models.py:15
msgid "Key" msgid "Key"
msgstr "" msgstr ""
#: authtoken/models.py:23 #: authtoken/models.py:18
msgid "User" msgid "User"
msgstr "" msgstr ""
#: authtoken/models.py:24 #: authtoken/models.py:20
msgid "Created" msgid "Created"
msgstr "" msgstr ""
#: authtoken/models.py:33 #: authtoken/models.py:29
msgid "Token" msgid "Token"
msgstr "" msgstr ""
#: authtoken/models.py:34 #: authtoken/models.py:30
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
@ -123,7 +123,6 @@ msgid "Not found."
msgstr "" msgstr ""
#: exceptions.py:109 #: exceptions.py:109
#, python-brace-format
msgid "Method \"{method}\" not allowed." msgid "Method \"{method}\" not allowed."
msgstr "" msgstr ""
@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "" msgstr ""
#: exceptions.py:132 #: exceptions.py:132
#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request." msgid "Unsupported media type \"{media_type}\" in request."
msgstr "" msgstr ""
@ -140,214 +138,201 @@ msgstr ""
msgid "Request was throttled." msgid "Request was throttled."
msgstr "" msgstr ""
#: fields.py:266 relations.py:206 relations.py:239 validators.py:79 #: fields.py:269 relations.py:206 relations.py:239 validators.py:98
#: validators.py:162 #: validators.py:181
msgid "This field is required." msgid "This field is required."
msgstr "" msgstr ""
#: fields.py:267 #: fields.py:270
msgid "This field may not be null." msgid "This field may not be null."
msgstr "" msgstr ""
#: fields.py:603 fields.py:634 #: fields.py:608 fields.py:639
#, python-brace-format
msgid "\"{input}\" is not a valid boolean." msgid "\"{input}\" is not a valid boolean."
msgstr "" msgstr ""
#: fields.py:669 #: fields.py:674
msgid "This field may not be blank." msgid "This field may not be blank."
msgstr "" msgstr ""
#: fields.py:670 fields.py:1664 #: fields.py:675 fields.py:1675
#, python-brace-format
msgid "Ensure this field has no more than {max_length} characters." msgid "Ensure this field has no more than {max_length} characters."
msgstr "" msgstr ""
#: fields.py:671 #: fields.py:676
#, python-brace-format
msgid "Ensure this field has at least {min_length} characters." msgid "Ensure this field has at least {min_length} characters."
msgstr "" msgstr ""
#: fields.py:708 #: fields.py:713
msgid "Enter a valid email address." msgid "Enter a valid email address."
msgstr "" msgstr ""
#: fields.py:719 #: fields.py:724
msgid "This value does not match the required pattern." msgid "This value does not match the required pattern."
msgstr "" msgstr ""
#: fields.py:730 #: fields.py:735
msgid "" msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or " "Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens." "hyphens."
msgstr "" msgstr ""
#: fields.py:742 #: fields.py:747
msgid "Enter a valid URL." msgid "Enter a valid URL."
msgstr "" msgstr ""
#: fields.py:755 #: fields.py:760
#, python-brace-format
msgid "\"{value}\" is not a valid UUID." msgid "\"{value}\" is not a valid UUID."
msgstr "" msgstr ""
#: fields.py:791 #: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address." msgid "Enter a valid IPv4 or IPv6 address."
msgstr "" msgstr ""
#: fields.py:816 #: fields.py:821
msgid "A valid integer is required." msgid "A valid integer is required."
msgstr "" msgstr ""
#: fields.py:817 fields.py:852 fields.py:885 #: fields.py:822 fields.py:857 fields.py:891
#, python-brace-format
msgid "Ensure this value is less than or equal to {max_value}." msgid "Ensure this value is less than or equal to {max_value}."
msgstr "" msgstr ""
#: fields.py:818 fields.py:853 fields.py:886 #: fields.py:823 fields.py:858 fields.py:892
#, python-brace-format
msgid "Ensure this value is greater than or equal to {min_value}." msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "" msgstr ""
#: fields.py:819 fields.py:854 fields.py:890 #: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large." msgid "String value too large."
msgstr "" msgstr ""
#: fields.py:851 fields.py:884 #: fields.py:856 fields.py:890
msgid "A valid number is required." msgid "A valid number is required."
msgstr "" msgstr ""
#: fields.py:887 #: fields.py:893
#, python-brace-format
msgid "Ensure that there are no more than {max_digits} digits in total." msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "" msgstr ""
#: fields.py:888 #: fields.py:894
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places." "Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "" msgstr ""
#: fields.py:889 #: fields.py:895
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the " "Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point." "decimal point."
msgstr "" msgstr ""
#: fields.py:1004 #: fields.py:1025
#, python-brace-format
msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1005 #: fields.py:1026
msgid "Expected a datetime but got a date." msgid "Expected a datetime but got a date."
msgstr "" msgstr ""
#: fields.py:1082 #: fields.py:1103
#, python-brace-format
msgid "Date has wrong format. Use one of these formats instead: {format}." msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1083 #: fields.py:1104
msgid "Expected a date but got a datetime." msgid "Expected a date but got a datetime."
msgstr "" msgstr ""
#: fields.py:1151 #: fields.py:1170
#, python-brace-format
msgid "Time has wrong format. Use one of these formats instead: {format}." msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1215 #: fields.py:1232
#, python-brace-format
msgid "Duration has wrong format. Use one of these formats instead: {format}." msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1240 fields.py:1289 #: fields.py:1251 fields.py:1300
#, python-brace-format
msgid "\"{input}\" is not a valid choice." msgid "\"{input}\" is not a valid choice."
msgstr "" msgstr ""
#: fields.py:1243 relations.py:71 relations.py:442 #: fields.py:1254 relations.py:71 relations.py:441
#, python-brace-format
msgid "More than {count} items..." msgid "More than {count} items..."
msgstr "" msgstr ""
#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520 #: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
#, python-brace-format
msgid "Expected a list of items but got type \"{input_type}\"." msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "" msgstr ""
#: fields.py:1291 #: fields.py:1302
msgid "This selection may not be empty." msgid "This selection may not be empty."
msgstr "" msgstr ""
#: fields.py:1328 #: fields.py:1339
#, python-brace-format
msgid "\"{input}\" is not a valid path choice." msgid "\"{input}\" is not a valid path choice."
msgstr "" msgstr ""
#: fields.py:1347 #: fields.py:1358
msgid "No file was submitted." msgid "No file was submitted."
msgstr "" msgstr ""
#: fields.py:1348 #: fields.py:1359
msgid "" msgid ""
"The submitted data was not a file. Check the encoding type on the form." "The submitted data was not a file. Check the encoding type on the form."
msgstr "" msgstr ""
#: fields.py:1349 #: fields.py:1360
msgid "No filename could be determined." msgid "No filename could be determined."
msgstr "" msgstr ""
#: fields.py:1350 #: fields.py:1361
msgid "The submitted file is empty." msgid "The submitted file is empty."
msgstr "" msgstr ""
#: fields.py:1351 #: fields.py:1362
#, python-brace-format
msgid "" msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})." "Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "" msgstr ""
#: fields.py:1399 #: fields.py:1410
msgid "" msgid ""
"Upload a valid image. The file you uploaded was either not an image or a " "Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image." "corrupted image."
msgstr "" msgstr ""
#: fields.py:1438 relations.py:439 serializers.py:521 #: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty." msgid "This list may not be empty."
msgstr "" msgstr ""
#: fields.py:1491 #: fields.py:1502
#, python-brace-format
msgid "Expected a dictionary of items but got type \"{input_type}\"." msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "" msgstr ""
#: fields.py:1538 #: fields.py:1549
msgid "Value must be valid JSON." msgid "Value must be valid JSON."
msgstr "" msgstr ""
#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5 #: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit" msgid "Submit"
msgstr "" msgstr ""
#: pagination.py:189 #: filters.py:336
msgid "ascending"
msgstr ""
#: filters.py:337
msgid "descending"
msgstr ""
#: pagination.py:193
msgid "Invalid page." msgid "Invalid page."
msgstr "" msgstr ""
#: pagination.py:407 #: pagination.py:427
msgid "Invalid cursor" msgid "Invalid cursor"
msgstr "" msgstr ""
#: relations.py:207 #: relations.py:207
#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist." msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "" msgstr ""
#: relations.py:208 #: relations.py:208
#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}." msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "" msgstr ""
@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "" msgstr ""
#: relations.py:243 #: relations.py:243
#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}." msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "" msgstr ""
#: relations.py:402 #: relations.py:401
#, python-brace-format
msgid "Object with {slug_name}={value} does not exist." msgid "Object with {slug_name}={value} does not exist."
msgstr "" msgstr ""
#: relations.py:403 #: relations.py:402
msgid "Invalid value." msgid "Invalid value."
msgstr "" msgstr ""
#: serializers.py:326 #: serializers.py:326
#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}." msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "" msgstr ""
#: templates/rest_framework/admin.html:118 #: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128 #: templates/rest_framework/base.html:128
msgid "Filters" msgid "Filters"
msgstr "" msgstr ""
@ -412,27 +394,23 @@ msgstr ""
msgid "No items to select." msgid "No items to select."
msgstr "" msgstr ""
#: validators.py:24 #: validators.py:43
msgid "This field must be unique." msgid "This field must be unique."
msgstr "" msgstr ""
#: validators.py:78 #: validators.py:97
#, python-brace-format
msgid "The fields {field_names} must make a unique set." msgid "The fields {field_names} must make a unique set."
msgstr "" msgstr ""
#: validators.py:226 #: validators.py:245
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" date." msgid "This field must be unique for the \"{date_field}\" date."
msgstr "" msgstr ""
#: validators.py:241 #: validators.py:260
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" month." msgid "This field must be unique for the \"{date_field}\" month."
msgstr "" msgstr ""
#: validators.py:254 #: validators.py:273
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" year." msgid "This field must be unique for the \"{date_field}\" year."
msgstr "" msgstr ""
@ -440,15 +418,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header." msgid "Invalid version in \"Accept\" header."
msgstr "" msgstr ""
#: versioning.py:73 versioning.py:115 #: versioning.py:73
msgid "Invalid version in URL path." msgid "Invalid version in URL path."
msgstr "" msgstr ""
#: versioning.py:144 #: versioning.py:115
msgid "Invalid version in URL path. Does not match any version namespace."
msgstr ""
#: versioning.py:147
msgid "Invalid version in hostname." msgid "Invalid version in hostname."
msgstr "" msgstr ""
#: versioning.py:166 #: versioning.py:169
msgid "Invalid version in query parameter." msgid "Invalid version in query parameter."
msgstr "" msgstr ""

View File

@ -9,9 +9,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django REST framework\n" "Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-01 18:38+0100\n" "POT-Creation-Date: 2016-07-12 16:13+0100\n"
"PO-Revision-Date: 2016-03-01 17:38+0000\n" "PO-Revision-Date: 2016-07-12 15:14+0000\n"
"Last-Translator: Xavier Ordoquy <xordoquy@linovia.com>\n" "Last-Translator: Thomas Christie <tom@tomchristie.com>\n"
"Language-Team: Czech (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/cs/)\n" "Language-Team: Czech (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/cs/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -19,40 +19,40 @@ msgstr ""
"Language: cs\n" "Language: cs\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
#: authentication.py:71 #: authentication.py:73
msgid "Invalid basic header. No credentials provided." msgid "Invalid basic header. No credentials provided."
msgstr "Chybná hlavička. Nebyly poskytnuty přihlašovací údaje." msgstr "Chybná hlavička. Nebyly poskytnuty přihlašovací údaje."
#: authentication.py:74 #: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces." msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "Chybná hlavička. Přihlašovací údaje by neměly obsahovat mezery." msgstr "Chybná hlavička. Přihlašovací údaje by neměly obsahovat mezery."
#: authentication.py:80 #: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded." msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "Chybná hlavička. Přihlašovací údaje nebyly správně zakódovány pomocí base64." msgstr "Chybná hlavička. Přihlašovací údaje nebyly správně zakódovány pomocí base64."
#: authentication.py:97 #: authentication.py:99
msgid "Invalid username/password." msgid "Invalid username/password."
msgstr "Chybné uživatelské jméno nebo heslo." msgstr "Chybné uživatelské jméno nebo heslo."
#: authentication.py:100 authentication.py:195 #: authentication.py:102 authentication.py:198
msgid "User inactive or deleted." msgid "User inactive or deleted."
msgstr "Uživatelský účet je neaktivní nebo byl smazán." msgstr "Uživatelský účet je neaktivní nebo byl smazán."
#: authentication.py:173 #: authentication.py:176
msgid "Invalid token header. No credentials provided." msgid "Invalid token header. No credentials provided."
msgstr "Chybná hlavička tokenu. Nebyly zadány přihlašovací údaje." msgstr "Chybná hlavička tokenu. Nebyly zadány přihlašovací údaje."
#: authentication.py:176 #: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces." msgid "Invalid token header. Token string should not contain spaces."
msgstr "Chybná hlavička tokenu. Přihlašovací údaje by neměly obsahovat mezery." msgstr "Chybná hlavička tokenu. Přihlašovací údaje by neměly obsahovat mezery."
#: authentication.py:182 #: authentication.py:185
msgid "" msgid ""
"Invalid token header. Token string should not contain invalid characters." "Invalid token header. Token string should not contain invalid characters."
msgstr "" msgstr ""
#: authentication.py:192 #: authentication.py:195
msgid "Invalid token." msgid "Invalid token."
msgstr "Chybný token." msgstr "Chybný token."
@ -60,23 +60,23 @@ msgstr "Chybný token."
msgid "Auth Token" msgid "Auth Token"
msgstr "" msgstr ""
#: authtoken/models.py:21 #: authtoken/models.py:15
msgid "Key" msgid "Key"
msgstr "" msgstr ""
#: authtoken/models.py:23 #: authtoken/models.py:18
msgid "User" msgid "User"
msgstr "" msgstr ""
#: authtoken/models.py:24 #: authtoken/models.py:20
msgid "Created" msgid "Created"
msgstr "" msgstr ""
#: authtoken/models.py:33 #: authtoken/models.py:29
msgid "Token" msgid "Token"
msgstr "" msgstr ""
#: authtoken/models.py:34 #: authtoken/models.py:30
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
@ -125,7 +125,6 @@ msgid "Not found."
msgstr "Nenalezeno." msgstr "Nenalezeno."
#: exceptions.py:109 #: exceptions.py:109
#, python-brace-format
msgid "Method \"{method}\" not allowed." msgid "Method \"{method}\" not allowed."
msgstr "Metoda \"{method}\" není povolena." msgstr "Metoda \"{method}\" není povolena."
@ -134,7 +133,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "Nelze vyhovět požadavku v hlavičce Accept." msgstr "Nelze vyhovět požadavku v hlavičce Accept."
#: exceptions.py:132 #: exceptions.py:132
#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request." msgid "Unsupported media type \"{media_type}\" in request."
msgstr "Nepodporovaný media type \"{media_type}\" v požadavku." msgstr "Nepodporovaný media type \"{media_type}\" v požadavku."
@ -142,214 +140,201 @@ msgstr "Nepodporovaný media type \"{media_type}\" v požadavku."
msgid "Request was throttled." msgid "Request was throttled."
msgstr "Požadavek byl limitován kvůli omezení počtu požadavků za časovou periodu." msgstr "Požadavek byl limitován kvůli omezení počtu požadavků za časovou periodu."
#: fields.py:266 relations.py:206 relations.py:239 validators.py:79 #: fields.py:269 relations.py:206 relations.py:239 validators.py:98
#: validators.py:162 #: validators.py:181
msgid "This field is required." msgid "This field is required."
msgstr "Toto pole je vyžadováno." msgstr "Toto pole je vyžadováno."
#: fields.py:267 #: fields.py:270
msgid "This field may not be null." msgid "This field may not be null."
msgstr "Toto pole nesmí být prázdné (null)." msgstr "Toto pole nesmí být prázdné (null)."
#: fields.py:603 fields.py:634 #: fields.py:608 fields.py:639
#, python-brace-format
msgid "\"{input}\" is not a valid boolean." msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" nelze použít jako typ boolean." msgstr "\"{input}\" nelze použít jako typ boolean."
#: fields.py:669 #: fields.py:674
msgid "This field may not be blank." msgid "This field may not be blank."
msgstr "Toto pole nesmí být prázdné." msgstr "Toto pole nesmí být prázdné."
#: fields.py:670 fields.py:1664 #: fields.py:675 fields.py:1675
#, python-brace-format
msgid "Ensure this field has no more than {max_length} characters." msgid "Ensure this field has no more than {max_length} characters."
msgstr "Zkontrolujte, že toto pole není delší než {max_length} znaků." msgstr "Zkontrolujte, že toto pole není delší než {max_length} znaků."
#: fields.py:671 #: fields.py:676
#, python-brace-format
msgid "Ensure this field has at least {min_length} characters." msgid "Ensure this field has at least {min_length} characters."
msgstr "Zkontrolujte, že toto pole obsahuje alespoň {min_length} znaků." msgstr "Zkontrolujte, že toto pole obsahuje alespoň {min_length} znaků."
#: fields.py:708 #: fields.py:713
msgid "Enter a valid email address." msgid "Enter a valid email address."
msgstr "Vložte platnou e-mailovou adresu." msgstr "Vložte platnou e-mailovou adresu."
#: fields.py:719 #: fields.py:724
msgid "This value does not match the required pattern." msgid "This value does not match the required pattern."
msgstr "Hodnota v tomto poli neodpovídá požadovanému formátu." msgstr "Hodnota v tomto poli neodpovídá požadovanému formátu."
#: fields.py:730 #: fields.py:735
msgid "" msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or " "Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens." "hyphens."
msgstr "Vložte platnou \"zkrácenou formu\" obsahující pouze malá písmena, čísla, spojovník nebo podtržítko." msgstr "Vložte platnou \"zkrácenou formu\" obsahující pouze malá písmena, čísla, spojovník nebo podtržítko."
#: fields.py:742 #: fields.py:747
msgid "Enter a valid URL." msgid "Enter a valid URL."
msgstr "Vložte platný odkaz." msgstr "Vložte platný odkaz."
#: fields.py:755 #: fields.py:760
#, python-brace-format
msgid "\"{value}\" is not a valid UUID." msgid "\"{value}\" is not a valid UUID."
msgstr "\"{value}\" není platné UUID." msgstr "\"{value}\" není platné UUID."
#: fields.py:791 #: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address." msgid "Enter a valid IPv4 or IPv6 address."
msgstr "" msgstr ""
#: fields.py:816 #: fields.py:821
msgid "A valid integer is required." msgid "A valid integer is required."
msgstr "Je vyžadováno celé číslo." msgstr "Je vyžadováno celé číslo."
#: fields.py:817 fields.py:852 fields.py:885 #: fields.py:822 fields.py:857 fields.py:891
#, python-brace-format
msgid "Ensure this value is less than or equal to {max_value}." msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Zkontrolujte, že hodnota je menší nebo rovna {max_value}." msgstr "Zkontrolujte, že hodnota je menší nebo rovna {max_value}."
#: fields.py:818 fields.py:853 fields.py:886 #: fields.py:823 fields.py:858 fields.py:892
#, python-brace-format
msgid "Ensure this value is greater than or equal to {min_value}." msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Zkontrolujte, že hodnota je větší nebo rovna {min_value}." msgstr "Zkontrolujte, že hodnota je větší nebo rovna {min_value}."
#: fields.py:819 fields.py:854 fields.py:890 #: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large." msgid "String value too large."
msgstr "Řetězec je příliš dlouhý." msgstr "Řetězec je příliš dlouhý."
#: fields.py:851 fields.py:884 #: fields.py:856 fields.py:890
msgid "A valid number is required." msgid "A valid number is required."
msgstr "Je vyžadováno číslo." msgstr "Je vyžadováno číslo."
#: fields.py:887 #: fields.py:893
#, python-brace-format
msgid "Ensure that there are no more than {max_digits} digits in total." msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "Zkontrolujte, že číslo neobsahuje více než {max_digits} čislic." msgstr "Zkontrolujte, že číslo neobsahuje více než {max_digits} čislic."
#: fields.py:888 #: fields.py:894
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places." "Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "Zkontrolujte, že číslo nemá více než {max_decimal_places} desetinných míst." msgstr "Zkontrolujte, že číslo nemá více než {max_decimal_places} desetinných míst."
#: fields.py:889 #: fields.py:895
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the " "Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point." "decimal point."
msgstr "Zkontrolujte, že číslo neobsahuje více než {max_whole_digits} čislic před desetinnou čárkou." msgstr "Zkontrolujte, že číslo neobsahuje více než {max_whole_digits} čislic před desetinnou čárkou."
#: fields.py:1004 #: fields.py:1025
#, python-brace-format
msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "Chybný formát data a času. Použijte jeden z těchto formátů: {format}." msgstr "Chybný formát data a času. Použijte jeden z těchto formátů: {format}."
#: fields.py:1005 #: fields.py:1026
msgid "Expected a datetime but got a date." msgid "Expected a datetime but got a date."
msgstr "Bylo zadáno pouze datum bez času." msgstr "Bylo zadáno pouze datum bez času."
#: fields.py:1082 #: fields.py:1103
#, python-brace-format
msgid "Date has wrong format. Use one of these formats instead: {format}." msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "Chybný formát data. Použijte jeden z těchto formátů: {format}." msgstr "Chybný formát data. Použijte jeden z těchto formátů: {format}."
#: fields.py:1083 #: fields.py:1104
msgid "Expected a date but got a datetime." msgid "Expected a date but got a datetime."
msgstr "Bylo zadáno datum a čas, místo samotného data." msgstr "Bylo zadáno datum a čas, místo samotného data."
#: fields.py:1151 #: fields.py:1170
#, python-brace-format
msgid "Time has wrong format. Use one of these formats instead: {format}." msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "Chybný formát času. Použijte jeden z těchto formátů: {format}." msgstr "Chybný formát času. Použijte jeden z těchto formátů: {format}."
#: fields.py:1215 #: fields.py:1232
#, python-brace-format
msgid "Duration has wrong format. Use one of these formats instead: {format}." msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1240 fields.py:1289 #: fields.py:1251 fields.py:1300
#, python-brace-format
msgid "\"{input}\" is not a valid choice." msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" není platnou možností." msgstr "\"{input}\" není platnou možností."
#: fields.py:1243 relations.py:71 relations.py:442 #: fields.py:1254 relations.py:71 relations.py:441
#, python-brace-format
msgid "More than {count} items..." msgid "More than {count} items..."
msgstr "" msgstr ""
#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520 #: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
#, python-brace-format
msgid "Expected a list of items but got type \"{input_type}\"." msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "Byl očekáván seznam položek ale nalezen \"{input_type}\"." msgstr "Byl očekáván seznam položek ale nalezen \"{input_type}\"."
#: fields.py:1291 #: fields.py:1302
msgid "This selection may not be empty." msgid "This selection may not be empty."
msgstr "" msgstr ""
#: fields.py:1328 #: fields.py:1339
#, python-brace-format
msgid "\"{input}\" is not a valid path choice." msgid "\"{input}\" is not a valid path choice."
msgstr "" msgstr ""
#: fields.py:1347 #: fields.py:1358
msgid "No file was submitted." msgid "No file was submitted."
msgstr "Nebyl zaslán žádný soubor." msgstr "Nebyl zaslán žádný soubor."
#: fields.py:1348 #: fields.py:1359
msgid "" msgid ""
"The submitted data was not a file. Check the encoding type on the form." "The submitted data was not a file. Check the encoding type on the form."
msgstr "Zaslaná data neobsahují soubor. Zkontrolujte typ kódování ve formuláři." msgstr "Zaslaná data neobsahují soubor. Zkontrolujte typ kódování ve formuláři."
#: fields.py:1349 #: fields.py:1360
msgid "No filename could be determined." msgid "No filename could be determined."
msgstr "Nebylo možné zjistit jméno souboru." msgstr "Nebylo možné zjistit jméno souboru."
#: fields.py:1350 #: fields.py:1361
msgid "The submitted file is empty." msgid "The submitted file is empty."
msgstr "Zaslaný soubor je prázdný." msgstr "Zaslaný soubor je prázdný."
#: fields.py:1351 #: fields.py:1362
#, python-brace-format
msgid "" msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})." "Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "Zajistěte, aby jméno souboru obsahovalo maximálně {max_length} znaků (teď má {length} znaků)." msgstr "Zajistěte, aby jméno souboru obsahovalo maximálně {max_length} znaků (teď má {length} znaků)."
#: fields.py:1399 #: fields.py:1410
msgid "" msgid ""
"Upload a valid image. The file you uploaded was either not an image or a " "Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image." "corrupted image."
msgstr "Nahrajte platný obrázek. Nahraný soubor buď není obrázkem nebo je poškozen." msgstr "Nahrajte platný obrázek. Nahraný soubor buď není obrázkem nebo je poškozen."
#: fields.py:1438 relations.py:439 serializers.py:521 #: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty." msgid "This list may not be empty."
msgstr "" msgstr ""
#: fields.py:1491 #: fields.py:1502
#, python-brace-format
msgid "Expected a dictionary of items but got type \"{input_type}\"." msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "Byl očekáván slovník položek ale nalezen \"{input_type}\"." msgstr "Byl očekáván slovník položek ale nalezen \"{input_type}\"."
#: fields.py:1538 #: fields.py:1549
msgid "Value must be valid JSON." msgid "Value must be valid JSON."
msgstr "" msgstr ""
#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5 #: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit" msgid "Submit"
msgstr "" msgstr ""
#: pagination.py:189 #: filters.py:336
msgid "ascending"
msgstr ""
#: filters.py:337
msgid "descending"
msgstr ""
#: pagination.py:193
msgid "Invalid page." msgid "Invalid page."
msgstr "" msgstr ""
#: pagination.py:407 #: pagination.py:427
msgid "Invalid cursor" msgid "Invalid cursor"
msgstr "Chybný kurzor." msgstr "Chybný kurzor."
#: relations.py:207 #: relations.py:207
#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist." msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "Chybný primární klíč \"{pk_value}\" - objekt neexistuje." msgstr "Chybný primární klíč \"{pk_value}\" - objekt neexistuje."
#: relations.py:208 #: relations.py:208
#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}." msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Chybný typ. Byl přijat typ {data_type} místo hodnoty primárního klíče." msgstr "Chybný typ. Byl přijat typ {data_type} místo hodnoty primárního klíče."
@ -366,25 +351,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Chybný odkaz - objekt neexistuje." msgstr "Chybný odkaz - objekt neexistuje."
#: relations.py:243 #: relations.py:243
#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}." msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Chybný typ. Byl přijat typ {data_type} místo očekávaného odkazu." msgstr "Chybný typ. Byl přijat typ {data_type} místo očekávaného odkazu."
#: relations.py:402 #: relations.py:401
#, python-brace-format
msgid "Object with {slug_name}={value} does not exist." msgid "Object with {slug_name}={value} does not exist."
msgstr "Objekt s {slug_name}={value} neexistuje." msgstr "Objekt s {slug_name}={value} neexistuje."
#: relations.py:403 #: relations.py:402
msgid "Invalid value." msgid "Invalid value."
msgstr "Chybná hodnota." msgstr "Chybná hodnota."
#: serializers.py:326 #: serializers.py:326
#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}." msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Chybná data. Byl přijat typ {datatype} místo očekávaného slovníku." msgstr "Chybná data. Byl přijat typ {datatype} místo očekávaného slovníku."
#: templates/rest_framework/admin.html:118 #: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128 #: templates/rest_framework/base.html:128
msgid "Filters" msgid "Filters"
msgstr "" msgstr ""
@ -414,27 +396,23 @@ msgstr ""
msgid "No items to select." msgid "No items to select."
msgstr "" msgstr ""
#: validators.py:24 #: validators.py:43
msgid "This field must be unique." msgid "This field must be unique."
msgstr "Tato položka musí být unikátní." msgstr "Tato položka musí být unikátní."
#: validators.py:78 #: validators.py:97
#, python-brace-format
msgid "The fields {field_names} must make a unique set." msgid "The fields {field_names} must make a unique set."
msgstr "Položka {field_names} musí tvořit unikátní množinu." msgstr "Položka {field_names} musí tvořit unikátní množinu."
#: validators.py:226 #: validators.py:245
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" date." msgid "This field must be unique for the \"{date_field}\" date."
msgstr "Tato položka musí být pro datum \"{date_field}\" unikátní." msgstr "Tato položka musí být pro datum \"{date_field}\" unikátní."
#: validators.py:241 #: validators.py:260
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" month." msgid "This field must be unique for the \"{date_field}\" month."
msgstr "Tato položka musí být pro měsíc \"{date_field}\" unikátní." msgstr "Tato položka musí být pro měsíc \"{date_field}\" unikátní."
#: validators.py:254 #: validators.py:273
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" year." msgid "This field must be unique for the \"{date_field}\" year."
msgstr "Tato položka musí být pro rok \"{date_field}\" unikátní." msgstr "Tato položka musí být pro rok \"{date_field}\" unikátní."
@ -442,15 +420,19 @@ msgstr "Tato položka musí být pro rok \"{date_field}\" unikátní."
msgid "Invalid version in \"Accept\" header." msgid "Invalid version in \"Accept\" header."
msgstr "Chybné číslo verze v hlavičce Accept." msgstr "Chybné číslo verze v hlavičce Accept."
#: versioning.py:73 versioning.py:115 #: versioning.py:73
msgid "Invalid version in URL path." msgid "Invalid version in URL path."
msgstr "Chybné číslo verze v odkazu." msgstr "Chybné číslo verze v odkazu."
#: versioning.py:144 #: versioning.py:115
msgid "Invalid version in URL path. Does not match any version namespace."
msgstr ""
#: versioning.py:147
msgid "Invalid version in hostname." msgid "Invalid version in hostname."
msgstr "Chybné číslo verze v hostname." msgstr "Chybné číslo verze v hostname."
#: versioning.py:166 #: versioning.py:169
msgid "Invalid version in query parameter." msgid "Invalid version in query parameter."
msgstr "Chybné čislo verze v URL parametru." msgstr "Chybné čislo verze v URL parametru."

View File

@ -9,9 +9,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django REST framework\n" "Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-01 18:38+0100\n" "POT-Creation-Date: 2016-07-12 16:13+0100\n"
"PO-Revision-Date: 2016-03-01 17:38+0000\n" "PO-Revision-Date: 2016-07-12 15:14+0000\n"
"Last-Translator: Xavier Ordoquy <xordoquy@linovia.com>\n" "Last-Translator: Thomas Christie <tom@tomchristie.com>\n"
"Language-Team: Danish (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/da/)\n" "Language-Team: Danish (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/da/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -19,40 +19,40 @@ msgstr ""
"Language: da\n" "Language: da\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: authentication.py:71 #: authentication.py:73
msgid "Invalid basic header. No credentials provided." msgid "Invalid basic header. No credentials provided."
msgstr "Ugyldig basic header. Ingen legitimation angivet." msgstr "Ugyldig basic header. Ingen legitimation angivet."
#: authentication.py:74 #: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces." msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "Ugyldig basic header. Legitimationsstrenge må ikke indeholde mellemrum." msgstr "Ugyldig basic header. Legitimationsstrenge må ikke indeholde mellemrum."
#: authentication.py:80 #: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded." msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "Ugyldig basic header. Legitimationen er ikke base64 encoded på korrekt vis." msgstr "Ugyldig basic header. Legitimationen er ikke base64 encoded på korrekt vis."
#: authentication.py:97 #: authentication.py:99
msgid "Invalid username/password." msgid "Invalid username/password."
msgstr "Ugyldigt brugernavn/kodeord." msgstr "Ugyldigt brugernavn/kodeord."
#: authentication.py:100 authentication.py:195 #: authentication.py:102 authentication.py:198
msgid "User inactive or deleted." msgid "User inactive or deleted."
msgstr "Inaktiv eller slettet bruger." msgstr "Inaktiv eller slettet bruger."
#: authentication.py:173 #: authentication.py:176
msgid "Invalid token header. No credentials provided." msgid "Invalid token header. No credentials provided."
msgstr "Ugyldig token header." msgstr "Ugyldig token header."
#: authentication.py:176 #: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces." msgid "Invalid token header. Token string should not contain spaces."
msgstr "Ugyldig token header. Token-strenge må ikke indeholde mellemrum." msgstr "Ugyldig token header. Token-strenge må ikke indeholde mellemrum."
#: authentication.py:182 #: authentication.py:185
msgid "" msgid ""
"Invalid token header. Token string should not contain invalid characters." "Invalid token header. Token string should not contain invalid characters."
msgstr "Ugyldig token header. Token streng bør ikke indeholde ugyldige karakterer." msgstr "Ugyldig token header. Token streng bør ikke indeholde ugyldige karakterer."
#: authentication.py:192 #: authentication.py:195
msgid "Invalid token." msgid "Invalid token."
msgstr "Ugyldigt token." msgstr "Ugyldigt token."
@ -60,23 +60,23 @@ msgstr "Ugyldigt token."
msgid "Auth Token" msgid "Auth Token"
msgstr "" msgstr ""
#: authtoken/models.py:21 #: authtoken/models.py:15
msgid "Key" msgid "Key"
msgstr "" msgstr ""
#: authtoken/models.py:23 #: authtoken/models.py:18
msgid "User" msgid "User"
msgstr "" msgstr ""
#: authtoken/models.py:24 #: authtoken/models.py:20
msgid "Created" msgid "Created"
msgstr "" msgstr ""
#: authtoken/models.py:33 #: authtoken/models.py:29
msgid "Token" msgid "Token"
msgstr "" msgstr ""
#: authtoken/models.py:34 #: authtoken/models.py:30
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
@ -125,7 +125,6 @@ msgid "Not found."
msgstr "Ikke fundet." msgstr "Ikke fundet."
#: exceptions.py:109 #: exceptions.py:109
#, python-brace-format
msgid "Method \"{method}\" not allowed." msgid "Method \"{method}\" not allowed."
msgstr "Metoden \"{method}\" er ikke tilladt." msgstr "Metoden \"{method}\" er ikke tilladt."
@ -134,7 +133,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "Kunne ikke efterkomme forespørgslens Accept header." msgstr "Kunne ikke efterkomme forespørgslens Accept header."
#: exceptions.py:132 #: exceptions.py:132
#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request." msgid "Unsupported media type \"{media_type}\" in request."
msgstr "Forespørgslens media type, \"{media_type}\", er ikke understøttet." msgstr "Forespørgslens media type, \"{media_type}\", er ikke understøttet."
@ -142,214 +140,201 @@ msgstr "Forespørgslens media type, \"{media_type}\", er ikke understøttet."
msgid "Request was throttled." msgid "Request was throttled."
msgstr "Forespørgslen blev neddroslet." msgstr "Forespørgslen blev neddroslet."
#: fields.py:266 relations.py:206 relations.py:239 validators.py:79 #: fields.py:269 relations.py:206 relations.py:239 validators.py:98
#: validators.py:162 #: validators.py:181
msgid "This field is required." msgid "This field is required."
msgstr "Dette felt er påkrævet." msgstr "Dette felt er påkrævet."
#: fields.py:267 #: fields.py:270
msgid "This field may not be null." msgid "This field may not be null."
msgstr "Dette felt må ikke være null." msgstr "Dette felt må ikke være null."
#: fields.py:603 fields.py:634 #: fields.py:608 fields.py:639
#, python-brace-format
msgid "\"{input}\" is not a valid boolean." msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" er ikke en tilladt boolsk værdi." msgstr "\"{input}\" er ikke en tilladt boolsk værdi."
#: fields.py:669 #: fields.py:674
msgid "This field may not be blank." msgid "This field may not be blank."
msgstr "Dette felt må ikke være tomt." msgstr "Dette felt må ikke være tomt."
#: fields.py:670 fields.py:1664 #: fields.py:675 fields.py:1675
#, python-brace-format
msgid "Ensure this field has no more than {max_length} characters." msgid "Ensure this field has no more than {max_length} characters."
msgstr "Tjek at dette felt ikke indeholder flere end {max_length} tegn." msgstr "Tjek at dette felt ikke indeholder flere end {max_length} tegn."
#: fields.py:671 #: fields.py:676
#, python-brace-format
msgid "Ensure this field has at least {min_length} characters." msgid "Ensure this field has at least {min_length} characters."
msgstr "Tjek at dette felt indeholder mindst {min_length} tegn." msgstr "Tjek at dette felt indeholder mindst {min_length} tegn."
#: fields.py:708 #: fields.py:713
msgid "Enter a valid email address." msgid "Enter a valid email address."
msgstr "Angiv en gyldig e-mailadresse." msgstr "Angiv en gyldig e-mailadresse."
#: fields.py:719 #: fields.py:724
msgid "This value does not match the required pattern." msgid "This value does not match the required pattern."
msgstr "Denne værdi passer ikke med det påkrævede mønster." msgstr "Denne værdi passer ikke med det påkrævede mønster."
#: fields.py:730 #: fields.py:735
msgid "" msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or " "Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens." "hyphens."
msgstr "Indtast en gyldig \"slug\", bestående af bogstaver, tal, bund- og bindestreger." msgstr "Indtast en gyldig \"slug\", bestående af bogstaver, tal, bund- og bindestreger."
#: fields.py:742 #: fields.py:747
msgid "Enter a valid URL." msgid "Enter a valid URL."
msgstr "Indtast en gyldig URL." msgstr "Indtast en gyldig URL."
#: fields.py:755 #: fields.py:760
#, python-brace-format
msgid "\"{value}\" is not a valid UUID." msgid "\"{value}\" is not a valid UUID."
msgstr "\"{value}\" er ikke et gyldigt UUID." msgstr "\"{value}\" er ikke et gyldigt UUID."
#: fields.py:791 #: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address." msgid "Enter a valid IPv4 or IPv6 address."
msgstr "Indtast en gyldig IPv4 eller IPv6 adresse." msgstr "Indtast en gyldig IPv4 eller IPv6 adresse."
#: fields.py:816 #: fields.py:821
msgid "A valid integer is required." msgid "A valid integer is required."
msgstr "Et gyldigt heltal er påkrævet." msgstr "Et gyldigt heltal er påkrævet."
#: fields.py:817 fields.py:852 fields.py:885 #: fields.py:822 fields.py:857 fields.py:891
#, python-brace-format
msgid "Ensure this value is less than or equal to {max_value}." msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Tjek at værdien er mindre end eller lig med {max_value}." msgstr "Tjek at værdien er mindre end eller lig med {max_value}."
#: fields.py:818 fields.py:853 fields.py:886 #: fields.py:823 fields.py:858 fields.py:892
#, python-brace-format
msgid "Ensure this value is greater than or equal to {min_value}." msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Tjek at værdien er større end eller lig med {min_value}." msgstr "Tjek at værdien er større end eller lig med {min_value}."
#: fields.py:819 fields.py:854 fields.py:890 #: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large." msgid "String value too large."
msgstr "Strengværdien er for stor." msgstr "Strengværdien er for stor."
#: fields.py:851 fields.py:884 #: fields.py:856 fields.py:890
msgid "A valid number is required." msgid "A valid number is required."
msgstr "Et gyldigt tal er påkrævet." msgstr "Et gyldigt tal er påkrævet."
#: fields.py:887 #: fields.py:893
#, python-brace-format
msgid "Ensure that there are no more than {max_digits} digits in total." msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "Tjek at der ikke er flere end {max_digits} cifre i alt." msgstr "Tjek at der ikke er flere end {max_digits} cifre i alt."
#: fields.py:888 #: fields.py:894
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places." "Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "Tjek at der ikke er flere end {max_decimal_places} cifre efter kommaet." msgstr "Tjek at der ikke er flere end {max_decimal_places} cifre efter kommaet."
#: fields.py:889 #: fields.py:895
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the " "Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point." "decimal point."
msgstr "Tjek at der ikke er flere end {max_whole_digits} cifre før kommaet." msgstr "Tjek at der ikke er flere end {max_whole_digits} cifre før kommaet."
#: fields.py:1004 #: fields.py:1025
#, python-brace-format
msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "Datotid har et forkert format. Brug i stedet et af disse formater: {format}." msgstr "Datotid har et forkert format. Brug i stedet et af disse formater: {format}."
#: fields.py:1005 #: fields.py:1026
msgid "Expected a datetime but got a date." msgid "Expected a datetime but got a date."
msgstr "Forventede en datotid, men fik en dato." msgstr "Forventede en datotid, men fik en dato."
#: fields.py:1082 #: fields.py:1103
#, python-brace-format
msgid "Date has wrong format. Use one of these formats instead: {format}." msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "Dato har et forkert format. Brug i stedet et af disse formater: {format}." msgstr "Dato har et forkert format. Brug i stedet et af disse formater: {format}."
#: fields.py:1083 #: fields.py:1104
msgid "Expected a date but got a datetime." msgid "Expected a date but got a datetime."
msgstr "Forventede en dato men fik en datotid." msgstr "Forventede en dato men fik en datotid."
#: fields.py:1151 #: fields.py:1170
#, python-brace-format
msgid "Time has wrong format. Use one of these formats instead: {format}." msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "Klokkeslæt har forkert format. Brug i stedet et af disse formater: {format}. " msgstr "Klokkeslæt har forkert format. Brug i stedet et af disse formater: {format}. "
#: fields.py:1215 #: fields.py:1232
#, python-brace-format
msgid "Duration has wrong format. Use one of these formats instead: {format}." msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "Varighed har forkert format. Brug istedet et af følgende formater: {format}." msgstr "Varighed har forkert format. Brug istedet et af følgende formater: {format}."
#: fields.py:1240 fields.py:1289 #: fields.py:1251 fields.py:1300
#, python-brace-format
msgid "\"{input}\" is not a valid choice." msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" er ikke et gyldigt valg." msgstr "\"{input}\" er ikke et gyldigt valg."
#: fields.py:1243 relations.py:71 relations.py:442 #: fields.py:1254 relations.py:71 relations.py:441
#, python-brace-format
msgid "More than {count} items..." msgid "More than {count} items..."
msgstr "Flere end {count} objekter..." msgstr "Flere end {count} objekter..."
#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520 #: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
#, python-brace-format
msgid "Expected a list of items but got type \"{input_type}\"." msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "Forventede en liste, men fik noget af typen \"{input_type}\"." msgstr "Forventede en liste, men fik noget af typen \"{input_type}\"."
#: fields.py:1291 #: fields.py:1302
msgid "This selection may not be empty." msgid "This selection may not be empty."
msgstr "Dette valg kan være tomt." msgstr "Dette valg kan være tomt."
#: fields.py:1328 #: fields.py:1339
#, python-brace-format
msgid "\"{input}\" is not a valid path choice." msgid "\"{input}\" is not a valid path choice."
msgstr "\"{input}\" er ikke et gyldigt valg af adresse." msgstr "\"{input}\" er ikke et gyldigt valg af adresse."
#: fields.py:1347 #: fields.py:1358
msgid "No file was submitted." msgid "No file was submitted."
msgstr "Ingen medsendt fil." msgstr "Ingen medsendt fil."
#: fields.py:1348 #: fields.py:1359
msgid "" msgid ""
"The submitted data was not a file. Check the encoding type on the form." "The submitted data was not a file. Check the encoding type on the form."
msgstr "Det medsendte data var ikke en fil. Tjek typen af indkodning på formularen." msgstr "Det medsendte data var ikke en fil. Tjek typen af indkodning på formularen."
#: fields.py:1349 #: fields.py:1360
msgid "No filename could be determined." msgid "No filename could be determined."
msgstr "Filnavnet kunne ikke afgøres." msgstr "Filnavnet kunne ikke afgøres."
#: fields.py:1350 #: fields.py:1361
msgid "The submitted file is empty." msgid "The submitted file is empty."
msgstr "Den medsendte fil er tom." msgstr "Den medsendte fil er tom."
#: fields.py:1351 #: fields.py:1362
#, python-brace-format
msgid "" msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})." "Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "Sørg for at filnavnet er højst {max_length} langt (det er {length})." msgstr "Sørg for at filnavnet er højst {max_length} langt (det er {length})."
#: fields.py:1399 #: fields.py:1410
msgid "" msgid ""
"Upload a valid image. The file you uploaded was either not an image or a " "Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image." "corrupted image."
msgstr "Medsend et gyldigt billede. Den medsendte fil var enten ikke et billede eller billedfilen var ødelagt." msgstr "Medsend et gyldigt billede. Den medsendte fil var enten ikke et billede eller billedfilen var ødelagt."
#: fields.py:1438 relations.py:439 serializers.py:521 #: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty." msgid "This list may not be empty."
msgstr "Denne liste er muligvis ikke tom." msgstr "Denne liste er muligvis ikke tom."
#: fields.py:1491 #: fields.py:1502
#, python-brace-format
msgid "Expected a dictionary of items but got type \"{input_type}\"." msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "Forventede en dictionary, men fik noget af typen \"{input_type}\"." msgstr "Forventede en dictionary, men fik noget af typen \"{input_type}\"."
#: fields.py:1538 #: fields.py:1549
msgid "Value must be valid JSON." msgid "Value must be valid JSON."
msgstr "Værdi skal være gyldig JSON." msgstr "Værdi skal være gyldig JSON."
#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5 #: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit" msgid "Submit"
msgstr "Indsend." msgstr "Indsend."
#: pagination.py:189 #: filters.py:336
msgid "ascending"
msgstr ""
#: filters.py:337
msgid "descending"
msgstr ""
#: pagination.py:193
msgid "Invalid page." msgid "Invalid page."
msgstr "" msgstr ""
#: pagination.py:407 #: pagination.py:427
msgid "Invalid cursor" msgid "Invalid cursor"
msgstr "Ugyldig cursor" msgstr "Ugyldig cursor"
#: relations.py:207 #: relations.py:207
#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist." msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "Ugyldig primærnøgle \"{pk_value}\" - objektet findes ikke." msgstr "Ugyldig primærnøgle \"{pk_value}\" - objektet findes ikke."
#: relations.py:208 #: relations.py:208
#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}." msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Ugyldig type. Forventet værdi er primærnøgle, fik {data_type}." msgstr "Ugyldig type. Forventet værdi er primærnøgle, fik {data_type}."
@ -366,25 +351,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Ugyldigt hyperlink - objektet findes ikke." msgstr "Ugyldigt hyperlink - objektet findes ikke."
#: relations.py:243 #: relations.py:243
#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}." msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Forkert type. Forventede en URL-streng, fik {data_type}." msgstr "Forkert type. Forventede en URL-streng, fik {data_type}."
#: relations.py:402 #: relations.py:401
#, python-brace-format
msgid "Object with {slug_name}={value} does not exist." msgid "Object with {slug_name}={value} does not exist."
msgstr "Object med {slug_name}={value} findes ikke." msgstr "Object med {slug_name}={value} findes ikke."
#: relations.py:403 #: relations.py:402
msgid "Invalid value." msgid "Invalid value."
msgstr "Ugyldig værdi." msgstr "Ugyldig værdi."
#: serializers.py:326 #: serializers.py:326
#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}." msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Ugyldig data. Forventede en dictionary, men fik {datatype}." msgstr "Ugyldig data. Forventede en dictionary, men fik {datatype}."
#: templates/rest_framework/admin.html:118 #: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128 #: templates/rest_framework/base.html:128
msgid "Filters" msgid "Filters"
msgstr "Filtre" msgstr "Filtre"
@ -414,27 +396,23 @@ msgstr "Ingen"
msgid "No items to select." msgid "No items to select."
msgstr "Intet at vælge." msgstr "Intet at vælge."
#: validators.py:24 #: validators.py:43
msgid "This field must be unique." msgid "This field must be unique."
msgstr "Dette felt skal være unikt." msgstr "Dette felt skal være unikt."
#: validators.py:78 #: validators.py:97
#, python-brace-format
msgid "The fields {field_names} must make a unique set." msgid "The fields {field_names} must make a unique set."
msgstr "Felterne {field_names} skal udgøre et unikt sæt." msgstr "Felterne {field_names} skal udgøre et unikt sæt."
#: validators.py:226 #: validators.py:245
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" date." msgid "This field must be unique for the \"{date_field}\" date."
msgstr "Dette felt skal være unikt for \"{date_field}\"-datoen." msgstr "Dette felt skal være unikt for \"{date_field}\"-datoen."
#: validators.py:241 #: validators.py:260
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" month." msgid "This field must be unique for the \"{date_field}\" month."
msgstr "Dette felt skal være unikt for \"{date_field}\"-måneden." msgstr "Dette felt skal være unikt for \"{date_field}\"-måneden."
#: validators.py:254 #: validators.py:273
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" year." msgid "This field must be unique for the \"{date_field}\" year."
msgstr "Dette felt skal være unikt for \"{date_field}\"-året." msgstr "Dette felt skal være unikt for \"{date_field}\"-året."
@ -442,15 +420,19 @@ msgstr "Dette felt skal være unikt for \"{date_field}\"-året."
msgid "Invalid version in \"Accept\" header." msgid "Invalid version in \"Accept\" header."
msgstr "Ugyldig version i \"Accept\" headeren." msgstr "Ugyldig version i \"Accept\" headeren."
#: versioning.py:73 versioning.py:115 #: versioning.py:73
msgid "Invalid version in URL path." msgid "Invalid version in URL path."
msgstr "Ugyldig version i URL-stien." msgstr "Ugyldig version i URL-stien."
#: versioning.py:144 #: versioning.py:115
msgid "Invalid version in URL path. Does not match any version namespace."
msgstr ""
#: versioning.py:147
msgid "Invalid version in hostname." msgid "Invalid version in hostname."
msgstr "Ugyldig version i hostname." msgstr "Ugyldig version i hostname."
#: versioning.py:166 #: versioning.py:169
msgid "Invalid version in query parameter." msgid "Invalid version in query parameter."
msgstr "Ugyldig version i forespørgselsparameteren." msgstr "Ugyldig version i forespørgselsparameteren."

View File

@ -1,457 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-01 18:38+0100\n"
"PO-Revision-Date: 2016-03-01 17:38+0000\n"
"Last-Translator: Xavier Ordoquy <xordoquy@linovia.com>\n"
"Language-Team: Danish (Denmark) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/da_DK/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: da_DK\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: authentication.py:71
msgid "Invalid basic header. No credentials provided."
msgstr ""
#: authentication.py:74
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr ""
#: authentication.py:80
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr ""
#: authentication.py:97
msgid "Invalid username/password."
msgstr ""
#: authentication.py:100 authentication.py:195
msgid "User inactive or deleted."
msgstr ""
#: authentication.py:173
msgid "Invalid token header. No credentials provided."
msgstr ""
#: authentication.py:176
msgid "Invalid token header. Token string should not contain spaces."
msgstr ""
#: authentication.py:182
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
#: authentication.py:192
msgid "Invalid token."
msgstr ""
#: authtoken/apps.py:7
msgid "Auth Token"
msgstr ""
#: authtoken/models.py:21
msgid "Key"
msgstr ""
#: authtoken/models.py:23
msgid "User"
msgstr ""
#: authtoken/models.py:24
msgid "Created"
msgstr ""
#: authtoken/models.py:33
msgid "Token"
msgstr ""
#: authtoken/models.py:34
msgid "Tokens"
msgstr ""
#: authtoken/serializers.py:8
msgid "Username"
msgstr ""
#: authtoken/serializers.py:9
msgid "Password"
msgstr ""
#: authtoken/serializers.py:20
msgid "User account is disabled."
msgstr ""
#: authtoken/serializers.py:23
msgid "Unable to log in with provided credentials."
msgstr ""
#: authtoken/serializers.py:26
msgid "Must include \"username\" and \"password\"."
msgstr ""
#: exceptions.py:49
msgid "A server error occurred."
msgstr ""
#: exceptions.py:84
msgid "Malformed request."
msgstr ""
#: exceptions.py:89
msgid "Incorrect authentication credentials."
msgstr ""
#: exceptions.py:94
msgid "Authentication credentials were not provided."
msgstr ""
#: exceptions.py:99
msgid "You do not have permission to perform this action."
msgstr ""
#: exceptions.py:104 views.py:81
msgid "Not found."
msgstr ""
#: exceptions.py:109
#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr ""
#: exceptions.py:120
msgid "Could not satisfy the request Accept header."
msgstr ""
#: exceptions.py:132
#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr ""
#: exceptions.py:145
msgid "Request was throttled."
msgstr ""
#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
#: validators.py:162
msgid "This field is required."
msgstr ""
#: fields.py:267
msgid "This field may not be null."
msgstr ""
#: fields.py:603 fields.py:634
#, python-brace-format
msgid "\"{input}\" is not a valid boolean."
msgstr ""
#: fields.py:669
msgid "This field may not be blank."
msgstr ""
#: fields.py:670 fields.py:1664
#, python-brace-format
msgid "Ensure this field has no more than {max_length} characters."
msgstr ""
#: fields.py:671
#, python-brace-format
msgid "Ensure this field has at least {min_length} characters."
msgstr ""
#: fields.py:708
msgid "Enter a valid email address."
msgstr ""
#: fields.py:719
msgid "This value does not match the required pattern."
msgstr ""
#: fields.py:730
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr ""
#: fields.py:742
msgid "Enter a valid URL."
msgstr ""
#: fields.py:755
#, python-brace-format
msgid "\"{value}\" is not a valid UUID."
msgstr ""
#: fields.py:791
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
#: fields.py:816
msgid "A valid integer is required."
msgstr ""
#: fields.py:817 fields.py:852 fields.py:885
#, python-brace-format
msgid "Ensure this value is less than or equal to {max_value}."
msgstr ""
#: fields.py:818 fields.py:853 fields.py:886
#, python-brace-format
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr ""
#: fields.py:819 fields.py:854 fields.py:890
msgid "String value too large."
msgstr ""
#: fields.py:851 fields.py:884
msgid "A valid number is required."
msgstr ""
#: fields.py:887
#, python-brace-format
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr ""
#: fields.py:888
#, python-brace-format
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr ""
#: fields.py:889
#, python-brace-format
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr ""
#: fields.py:1004
#, python-brace-format
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr ""
#: fields.py:1005
msgid "Expected a datetime but got a date."
msgstr ""
#: fields.py:1082
#, python-brace-format
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr ""
#: fields.py:1083
msgid "Expected a date but got a datetime."
msgstr ""
#: fields.py:1151
#, python-brace-format
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr ""
#: fields.py:1215
#, python-brace-format
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
#: fields.py:1240 fields.py:1289
#, python-brace-format
msgid "\"{input}\" is not a valid choice."
msgstr ""
#: fields.py:1243 relations.py:71 relations.py:442
#, python-brace-format
msgid "More than {count} items..."
msgstr ""
#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
#, python-brace-format
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr ""
#: fields.py:1291
msgid "This selection may not be empty."
msgstr ""
#: fields.py:1328
#, python-brace-format
msgid "\"{input}\" is not a valid path choice."
msgstr ""
#: fields.py:1347
msgid "No file was submitted."
msgstr ""
#: fields.py:1348
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr ""
#: fields.py:1349
msgid "No filename could be determined."
msgstr ""
#: fields.py:1350
msgid "The submitted file is empty."
msgstr ""
#: fields.py:1351
#, python-brace-format
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr ""
#: fields.py:1399
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
#: fields.py:1438 relations.py:439 serializers.py:521
msgid "This list may not be empty."
msgstr ""
#: fields.py:1491
#, python-brace-format
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
#: fields.py:1538
msgid "Value must be valid JSON."
msgstr ""
#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
msgid "Submit"
msgstr ""
#: pagination.py:189
msgid "Invalid page."
msgstr ""
#: pagination.py:407
msgid "Invalid cursor"
msgstr ""
#: relations.py:207
#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr ""
#: relations.py:208
#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr ""
#: relations.py:240
msgid "Invalid hyperlink - No URL match."
msgstr ""
#: relations.py:241
msgid "Invalid hyperlink - Incorrect URL match."
msgstr ""
#: relations.py:242
msgid "Invalid hyperlink - Object does not exist."
msgstr ""
#: relations.py:243
#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr ""
#: relations.py:402
#, python-brace-format
msgid "Object with {slug_name}={value} does not exist."
msgstr ""
#: relations.py:403
msgid "Invalid value."
msgstr ""
#: serializers.py:326
#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr ""
#: templates/rest_framework/admin.html:118
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
#: templates/rest_framework/filters/django_filter.html:2
#: templates/rest_framework/filters/django_filter_crispyforms.html:4
msgid "Field filters"
msgstr ""
#: templates/rest_framework/filters/ordering.html:3
msgid "Ordering"
msgstr ""
#: templates/rest_framework/filters/search.html:2
msgid "Search"
msgstr ""
#: templates/rest_framework/horizontal/radio.html:2
#: templates/rest_framework/inline/radio.html:2
#: templates/rest_framework/vertical/radio.html:2
msgid "None"
msgstr ""
#: templates/rest_framework/horizontal/select_multiple.html:2
#: templates/rest_framework/inline/select_multiple.html:2
#: templates/rest_framework/vertical/select_multiple.html:2
msgid "No items to select."
msgstr ""
#: validators.py:24
msgid "This field must be unique."
msgstr ""
#: validators.py:78
#, python-brace-format
msgid "The fields {field_names} must make a unique set."
msgstr ""
#: validators.py:226
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" date."
msgstr ""
#: validators.py:241
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" month."
msgstr ""
#: validators.py:254
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" year."
msgstr ""
#: versioning.py:42
msgid "Invalid version in \"Accept\" header."
msgstr ""
#: versioning.py:73 versioning.py:115
msgid "Invalid version in URL path."
msgstr ""
#: versioning.py:144
msgid "Invalid version in hostname."
msgstr ""
#: versioning.py:166
msgid "Invalid version in query parameter."
msgstr ""
#: views.py:88
msgid "Permission denied."
msgstr ""

View File

@ -5,7 +5,7 @@
# Translators: # Translators:
# Fabian Büchler <fabian@buechler.io>, 2015 # Fabian Büchler <fabian@buechler.io>, 2015
# Mads Jensen <mje@inducks.org>, 2015 # Mads Jensen <mje@inducks.org>, 2015
# Niklas P <contact@niklasplessing.net>, 2015 # Niklas P <contact@niklasplessing.net>, 2015-2016
# Thomas Tanner, 2015 # Thomas Tanner, 2015
# Tom Jaster <futur3.tom@googlemail.com>, 2015 # Tom Jaster <futur3.tom@googlemail.com>, 2015
# Xavier Ordoquy <xordoquy@linovia.com>, 2015 # Xavier Ordoquy <xordoquy@linovia.com>, 2015
@ -13,9 +13,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django REST framework\n" "Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-01 18:38+0100\n" "POT-Creation-Date: 2016-07-12 16:13+0100\n"
"PO-Revision-Date: 2016-03-01 17:38+0000\n" "PO-Revision-Date: 2016-07-12 15:14+0000\n"
"Last-Translator: Xavier Ordoquy <xordoquy@linovia.com>\n" "Last-Translator: Thomas Christie <tom@tomchristie.com>\n"
"Language-Team: German (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/de/)\n" "Language-Team: German (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/de/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -23,74 +23,74 @@ msgstr ""
"Language: de\n" "Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: authentication.py:71 #: authentication.py:73
msgid "Invalid basic header. No credentials provided." msgid "Invalid basic header. No credentials provided."
msgstr "Ungültiger basic header. Keine Zugangsdaten angegeben." msgstr "Ungültiger basic header. Keine Zugangsdaten angegeben."
#: authentication.py:74 #: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces." msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "Ungültiger basic header. Zugangsdaten sollen keine Leerzeichen enthalten." msgstr "Ungültiger basic header. Zugangsdaten sollen keine Leerzeichen enthalten."
#: authentication.py:80 #: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded." msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "Ungültiger basic header. Zugangsdaten sind nicht korrekt mit base64 kodiert." msgstr "Ungültiger basic header. Zugangsdaten sind nicht korrekt mit base64 kodiert."
#: authentication.py:97 #: authentication.py:99
msgid "Invalid username/password." msgid "Invalid username/password."
msgstr "Ungültiger Benutzername/Passwort" msgstr "Ungültiger Benutzername/Passwort"
#: authentication.py:100 authentication.py:195 #: authentication.py:102 authentication.py:198
msgid "User inactive or deleted." msgid "User inactive or deleted."
msgstr "Benutzer inaktiv oder gelöscht." msgstr "Benutzer inaktiv oder gelöscht."
#: authentication.py:173 #: authentication.py:176
msgid "Invalid token header. No credentials provided." msgid "Invalid token header. No credentials provided."
msgstr "Ungültiger token header. Keine Zugangsdaten angegeben." msgstr "Ungültiger token header. Keine Zugangsdaten angegeben."
#: authentication.py:176 #: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces." msgid "Invalid token header. Token string should not contain spaces."
msgstr "Ungültiger token header. Zugangsdaten sollen keine Leerzeichen enthalten." msgstr "Ungültiger token header. Zugangsdaten sollen keine Leerzeichen enthalten."
#: authentication.py:182 #: authentication.py:185
msgid "" msgid ""
"Invalid token header. Token string should not contain invalid characters." "Invalid token header. Token string should not contain invalid characters."
msgstr "Ungültiger Token Header. Tokens dürfen keine ungültigen Zeichen enthalten." msgstr "Ungültiger Token Header. Tokens dürfen keine ungültigen Zeichen enthalten."
#: authentication.py:192 #: authentication.py:195
msgid "Invalid token." msgid "Invalid token."
msgstr "Ungültiges Token" msgstr "Ungültiges Token"
#: authtoken/apps.py:7 #: authtoken/apps.py:7
msgid "Auth Token" msgid "Auth Token"
msgstr "" msgstr "Auth Token"
#: authtoken/models.py:21 #: authtoken/models.py:15
msgid "Key" msgid "Key"
msgstr "" msgstr "Schlüssel"
#: authtoken/models.py:23 #: authtoken/models.py:18
msgid "User" msgid "User"
msgstr "" msgstr "Benutzer"
#: authtoken/models.py:24 #: authtoken/models.py:20
msgid "Created" msgid "Created"
msgstr "" msgstr ""
#: authtoken/models.py:33 #: authtoken/models.py:29
msgid "Token" msgid "Token"
msgstr "" msgstr "Token"
#: authtoken/models.py:34 #: authtoken/models.py:30
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr "Tokens"
#: authtoken/serializers.py:8 #: authtoken/serializers.py:8
msgid "Username" msgid "Username"
msgstr "" msgstr "Benutzername"
#: authtoken/serializers.py:9 #: authtoken/serializers.py:9
msgid "Password" msgid "Password"
msgstr "" msgstr "Passwort"
#: authtoken/serializers.py:20 #: authtoken/serializers.py:20
msgid "User account is disabled." msgid "User account is disabled."
@ -129,7 +129,6 @@ msgid "Not found."
msgstr "Nicht gefunden." msgstr "Nicht gefunden."
#: exceptions.py:109 #: exceptions.py:109
#, python-brace-format
msgid "Method \"{method}\" not allowed." msgid "Method \"{method}\" not allowed."
msgstr "Methode \"{method}\" nicht erlaubt." msgstr "Methode \"{method}\" nicht erlaubt."
@ -138,7 +137,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "Kann die Accept Kopfzeile der Anfrage nicht erfüllen." msgstr "Kann die Accept Kopfzeile der Anfrage nicht erfüllen."
#: exceptions.py:132 #: exceptions.py:132
#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request." msgid "Unsupported media type \"{media_type}\" in request."
msgstr "Nicht unterstützter Medientyp \"{media_type}\" in der Anfrage." msgstr "Nicht unterstützter Medientyp \"{media_type}\" in der Anfrage."
@ -146,214 +144,201 @@ msgstr "Nicht unterstützter Medientyp \"{media_type}\" in der Anfrage."
msgid "Request was throttled." msgid "Request was throttled."
msgstr "Die Anfrage wurde gedrosselt." msgstr "Die Anfrage wurde gedrosselt."
#: fields.py:266 relations.py:206 relations.py:239 validators.py:79 #: fields.py:269 relations.py:206 relations.py:239 validators.py:98
#: validators.py:162 #: validators.py:181
msgid "This field is required." msgid "This field is required."
msgstr "Dieses Feld ist erforderlich." msgstr "Dieses Feld ist erforderlich."
#: fields.py:267 #: fields.py:270
msgid "This field may not be null." msgid "This field may not be null."
msgstr "Dieses Feld darf nicht Null sein." msgstr "Dieses Feld darf nicht Null sein."
#: fields.py:603 fields.py:634 #: fields.py:608 fields.py:639
#, python-brace-format
msgid "\"{input}\" is not a valid boolean." msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" ist kein gültiger Wahrheitswert." msgstr "\"{input}\" ist kein gültiger Wahrheitswert."
#: fields.py:669 #: fields.py:674
msgid "This field may not be blank." msgid "This field may not be blank."
msgstr "Dieses Feld darf nicht leer sein." msgstr "Dieses Feld darf nicht leer sein."
#: fields.py:670 fields.py:1664 #: fields.py:675 fields.py:1675
#, python-brace-format
msgid "Ensure this field has no more than {max_length} characters." msgid "Ensure this field has no more than {max_length} characters."
msgstr "Stelle sicher, dass dieses Feld nicht mehr als {max_length} Zeichen lang ist." msgstr "Stelle sicher, dass dieses Feld nicht mehr als {max_length} Zeichen lang ist."
#: fields.py:671 #: fields.py:676
#, python-brace-format
msgid "Ensure this field has at least {min_length} characters." msgid "Ensure this field has at least {min_length} characters."
msgstr "Stelle sicher, dass dieses Feld mindestens {min_length} Zeichen lang ist." msgstr "Stelle sicher, dass dieses Feld mindestens {min_length} Zeichen lang ist."
#: fields.py:708 #: fields.py:713
msgid "Enter a valid email address." msgid "Enter a valid email address."
msgstr "Gib eine gültige E-Mail Adresse an." msgstr "Gib eine gültige E-Mail Adresse an."
#: fields.py:719 #: fields.py:724
msgid "This value does not match the required pattern." msgid "This value does not match the required pattern."
msgstr "Dieser Wert passt nicht zu dem erforderlichen Muster." msgstr "Dieser Wert passt nicht zu dem erforderlichen Muster."
#: fields.py:730 #: fields.py:735
msgid "" msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or " "Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens." "hyphens."
msgstr "Gib ein gültiges \"slug\" aus Buchstaben, Ziffern, Unterstrichen und Minuszeichen ein." msgstr "Gib ein gültiges \"slug\" aus Buchstaben, Ziffern, Unterstrichen und Minuszeichen ein."
#: fields.py:742 #: fields.py:747
msgid "Enter a valid URL." msgid "Enter a valid URL."
msgstr "Gib eine gültige URL ein." msgstr "Gib eine gültige URL ein."
#: fields.py:755 #: fields.py:760
#, python-brace-format
msgid "\"{value}\" is not a valid UUID." msgid "\"{value}\" is not a valid UUID."
msgstr "\"{value}\" ist keine gültige UUID." msgstr "\"{value}\" ist keine gültige UUID."
#: fields.py:791 #: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address." msgid "Enter a valid IPv4 or IPv6 address."
msgstr "Geben Sie eine gültige UPv4 oder IPv6 Adresse an" msgstr "Geben Sie eine gültige UPv4 oder IPv6 Adresse an"
#: fields.py:816 #: fields.py:821
msgid "A valid integer is required." msgid "A valid integer is required."
msgstr "Eine gültige Ganzzahl ist erforderlich." msgstr "Eine gültige Ganzzahl ist erforderlich."
#: fields.py:817 fields.py:852 fields.py:885 #: fields.py:822 fields.py:857 fields.py:891
#, python-brace-format
msgid "Ensure this value is less than or equal to {max_value}." msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Stelle sicher, dass dieser Wert kleiner oder gleich {max_value} ist." msgstr "Stelle sicher, dass dieser Wert kleiner oder gleich {max_value} ist."
#: fields.py:818 fields.py:853 fields.py:886 #: fields.py:823 fields.py:858 fields.py:892
#, python-brace-format
msgid "Ensure this value is greater than or equal to {min_value}." msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Stelle sicher, dass dieser Wert größer oder gleich {min_value} ist." msgstr "Stelle sicher, dass dieser Wert größer oder gleich {min_value} ist."
#: fields.py:819 fields.py:854 fields.py:890 #: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large." msgid "String value too large."
msgstr "Zeichenkette zu lang." msgstr "Zeichenkette zu lang."
#: fields.py:851 fields.py:884 #: fields.py:856 fields.py:890
msgid "A valid number is required." msgid "A valid number is required."
msgstr "Eine gültige Zahl ist erforderlich." msgstr "Eine gültige Zahl ist erforderlich."
#: fields.py:887 #: fields.py:893
#, python-brace-format
msgid "Ensure that there are no more than {max_digits} digits in total." msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "Stelle sicher, dass es insgesamt nicht mehr als {max_digits} Ziffern lang ist." msgstr "Stelle sicher, dass es insgesamt nicht mehr als {max_digits} Ziffern lang ist."
#: fields.py:888 #: fields.py:894
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places." "Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "Stelle sicher, dass es nicht mehr als {max_decimal_places} Nachkommastellen lang ist." msgstr "Stelle sicher, dass es nicht mehr als {max_decimal_places} Nachkommastellen lang ist."
#: fields.py:889 #: fields.py:895
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the " "Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point." "decimal point."
msgstr "Stelle sicher, dass es nicht mehr als {max_whole_digits} Stellen vor dem Komma lang ist." msgstr "Stelle sicher, dass es nicht mehr als {max_whole_digits} Stellen vor dem Komma lang ist."
#: fields.py:1004 #: fields.py:1025
#, python-brace-format
msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "Datums- und Zeitangabe hat das falsche Format. Nutze stattdessen eines dieser Formate: {format}." msgstr "Datums- und Zeitangabe hat das falsche Format. Nutze stattdessen eines dieser Formate: {format}."
#: fields.py:1005 #: fields.py:1026
msgid "Expected a datetime but got a date." msgid "Expected a datetime but got a date."
msgstr "Erwarte eine Datums- und Zeitangabe, erhielt aber ein Datum." msgstr "Erwarte eine Datums- und Zeitangabe, erhielt aber ein Datum."
#: fields.py:1082 #: fields.py:1103
#, python-brace-format
msgid "Date has wrong format. Use one of these formats instead: {format}." msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "Datum hat das falsche Format. Nutze stattdessen eines dieser Formate: {format}." msgstr "Datum hat das falsche Format. Nutze stattdessen eines dieser Formate: {format}."
#: fields.py:1083 #: fields.py:1104
msgid "Expected a date but got a datetime." msgid "Expected a date but got a datetime."
msgstr "Erwarte ein Datum, erhielt aber eine Datums- und Zeitangabe." msgstr "Erwarte ein Datum, erhielt aber eine Datums- und Zeitangabe."
#: fields.py:1151 #: fields.py:1170
#, python-brace-format
msgid "Time has wrong format. Use one of these formats instead: {format}." msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "Zeitangabe hat das falsche Format. Nutze stattdessen eines dieser Formate: {format}." msgstr "Zeitangabe hat das falsche Format. Nutze stattdessen eines dieser Formate: {format}."
#: fields.py:1215 #: fields.py:1232
#, python-brace-format
msgid "Duration has wrong format. Use one of these formats instead: {format}." msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "Laufzeit hat das falsche Format. Benutze stattdessen eines dieser Formate {format}." msgstr "Laufzeit hat das falsche Format. Benutze stattdessen eines dieser Formate {format}."
#: fields.py:1240 fields.py:1289 #: fields.py:1251 fields.py:1300
#, python-brace-format
msgid "\"{input}\" is not a valid choice." msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" ist keine gültige Option." msgstr "\"{input}\" ist keine gültige Option."
#: fields.py:1243 relations.py:71 relations.py:442 #: fields.py:1254 relations.py:71 relations.py:441
#, python-brace-format
msgid "More than {count} items..." msgid "More than {count} items..."
msgstr "Mehr als {count} Ergebnisse" msgstr "Mehr als {count} Ergebnisse"
#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520 #: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
#, python-brace-format
msgid "Expected a list of items but got type \"{input_type}\"." msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "Erwarte eine Liste von Elementen, erhielt aber den Typ \"{input_type}\"." msgstr "Erwarte eine Liste von Elementen, erhielt aber den Typ \"{input_type}\"."
#: fields.py:1291 #: fields.py:1302
msgid "This selection may not be empty." msgid "This selection may not be empty."
msgstr "Diese Auswahl darf nicht leer sein" msgstr "Diese Auswahl darf nicht leer sein"
#: fields.py:1328 #: fields.py:1339
#, python-brace-format
msgid "\"{input}\" is not a valid path choice." msgid "\"{input}\" is not a valid path choice."
msgstr "\"{input}\" ist ein ungültiger Pfad Wahl." msgstr "\"{input}\" ist ein ungültiger Pfad Wahl."
#: fields.py:1347 #: fields.py:1358
msgid "No file was submitted." msgid "No file was submitted."
msgstr "Es wurde keine Datei übermittelt." msgstr "Es wurde keine Datei übermittelt."
#: fields.py:1348 #: fields.py:1359
msgid "" msgid ""
"The submitted data was not a file. Check the encoding type on the form." "The submitted data was not a file. Check the encoding type on the form."
msgstr "Die übermittelten Daten stellen keine Datei dar. Prüfe den Kodierungstyp im Formular." msgstr "Die übermittelten Daten stellen keine Datei dar. Prüfe den Kodierungstyp im Formular."
#: fields.py:1349 #: fields.py:1360
msgid "No filename could be determined." msgid "No filename could be determined."
msgstr "Der Dateiname konnte nicht ermittelt werden." msgstr "Der Dateiname konnte nicht ermittelt werden."
#: fields.py:1350 #: fields.py:1361
msgid "The submitted file is empty." msgid "The submitted file is empty."
msgstr "Die übermittelte Datei ist leer." msgstr "Die übermittelte Datei ist leer."
#: fields.py:1351 #: fields.py:1362
#, python-brace-format
msgid "" msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})." "Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "Stelle sicher, dass dieser Dateiname höchstens {max_length} Zeichen lang ist (er hat {length})." msgstr "Stelle sicher, dass dieser Dateiname höchstens {max_length} Zeichen lang ist (er hat {length})."
#: fields.py:1399 #: fields.py:1410
msgid "" msgid ""
"Upload a valid image. The file you uploaded was either not an image or a " "Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image." "corrupted image."
msgstr "Lade ein gültiges Bild hoch. Die hochgeladene Datei ist entweder kein Bild oder ein beschädigtes Bild." msgstr "Lade ein gültiges Bild hoch. Die hochgeladene Datei ist entweder kein Bild oder ein beschädigtes Bild."
#: fields.py:1438 relations.py:439 serializers.py:521 #: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty." msgid "This list may not be empty."
msgstr "Diese Liste darf nicht leer sein." msgstr "Diese Liste darf nicht leer sein."
#: fields.py:1491 #: fields.py:1502
#, python-brace-format
msgid "Expected a dictionary of items but got type \"{input_type}\"." msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "Erwarte ein Dictionary mit Elementen, erhielt aber den Typ \"{input_type}\"." msgstr "Erwarte ein Dictionary mit Elementen, erhielt aber den Typ \"{input_type}\"."
#: fields.py:1538 #: fields.py:1549
msgid "Value must be valid JSON." msgid "Value must be valid JSON."
msgstr "Wert muss gültiges JSON sein." msgstr "Wert muss gültiges JSON sein."
#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5 #: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit" msgid "Submit"
msgstr "Abschicken" msgstr "Abschicken"
#: pagination.py:189 #: filters.py:336
msgid "ascending"
msgstr ""
#: filters.py:337
msgid "descending"
msgstr ""
#: pagination.py:193
msgid "Invalid page." msgid "Invalid page."
msgstr "" msgstr ""
#: pagination.py:407 #: pagination.py:427
msgid "Invalid cursor" msgid "Invalid cursor"
msgstr "Ungültiger Zeiger" msgstr "Ungültiger Zeiger"
#: relations.py:207 #: relations.py:207
#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist." msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "Ungültiger pk \"{pk_value}\" - Object existiert nicht." msgstr "Ungültiger pk \"{pk_value}\" - Object existiert nicht."
#: relations.py:208 #: relations.py:208
#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}." msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Falscher Typ. Erwarte pk Wert, erhielt aber {data_type}." msgstr "Falscher Typ. Erwarte pk Wert, erhielt aber {data_type}."
@ -370,25 +355,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Ungültiger Hyperlink - Objekt existiert nicht." msgstr "Ungültiger Hyperlink - Objekt existiert nicht."
#: relations.py:243 #: relations.py:243
#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}." msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Falscher Typ. Erwarte URL Zeichenkette, erhielt aber {data_type}." msgstr "Falscher Typ. Erwarte URL Zeichenkette, erhielt aber {data_type}."
#: relations.py:402 #: relations.py:401
#, python-brace-format
msgid "Object with {slug_name}={value} does not exist." msgid "Object with {slug_name}={value} does not exist."
msgstr "Objekt mit {slug_name}={value} existiert nicht." msgstr "Objekt mit {slug_name}={value} existiert nicht."
#: relations.py:403 #: relations.py:402
msgid "Invalid value." msgid "Invalid value."
msgstr "Ungültiger Wert." msgstr "Ungültiger Wert."
#: serializers.py:326 #: serializers.py:326
#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}." msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Ungültige Daten. Dictionary erwartet, aber {datatype} erhalten." msgstr "Ungültige Daten. Dictionary erwartet, aber {datatype} erhalten."
#: templates/rest_framework/admin.html:118 #: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128 #: templates/rest_framework/base.html:128
msgid "Filters" msgid "Filters"
msgstr "Filter" msgstr "Filter"
@ -418,27 +400,23 @@ msgstr "Nichts"
msgid "No items to select." msgid "No items to select."
msgstr "Keine Elemente zum Auswählen." msgstr "Keine Elemente zum Auswählen."
#: validators.py:24 #: validators.py:43
msgid "This field must be unique." msgid "This field must be unique."
msgstr "Dieses Feld muss eindeutig sein." msgstr "Dieses Feld muss eindeutig sein."
#: validators.py:78 #: validators.py:97
#, python-brace-format
msgid "The fields {field_names} must make a unique set." msgid "The fields {field_names} must make a unique set."
msgstr "Die Felder {field_names} müssen eine eindeutige Menge bilden." msgstr "Die Felder {field_names} müssen eine eindeutige Menge bilden."
#: validators.py:226 #: validators.py:245
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" date." msgid "This field must be unique for the \"{date_field}\" date."
msgstr "Dieses Feld muss bezüglich des \"{date_field}\" Datums eindeutig sein." msgstr "Dieses Feld muss bezüglich des \"{date_field}\" Datums eindeutig sein."
#: validators.py:241 #: validators.py:260
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" month." msgid "This field must be unique for the \"{date_field}\" month."
msgstr "Dieses Feld muss bezüglich des \"{date_field}\" Monats eindeutig sein." msgstr "Dieses Feld muss bezüglich des \"{date_field}\" Monats eindeutig sein."
#: validators.py:254 #: validators.py:273
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" year." msgid "This field must be unique for the \"{date_field}\" year."
msgstr "Dieses Feld muss bezüglich des \"{date_field}\" Jahrs eindeutig sein." msgstr "Dieses Feld muss bezüglich des \"{date_field}\" Jahrs eindeutig sein."
@ -446,15 +424,19 @@ msgstr "Dieses Feld muss bezüglich des \"{date_field}\" Jahrs eindeutig sein."
msgid "Invalid version in \"Accept\" header." msgid "Invalid version in \"Accept\" header."
msgstr "Ungültige Version in der \"Accept\" Kopfzeile." msgstr "Ungültige Version in der \"Accept\" Kopfzeile."
#: versioning.py:73 versioning.py:115 #: versioning.py:73
msgid "Invalid version in URL path." msgid "Invalid version in URL path."
msgstr "Ungültige Version im URL Pfad." msgstr "Ungültige Version im URL Pfad."
#: versioning.py:144 #: versioning.py:115
msgid "Invalid version in URL path. Does not match any version namespace."
msgstr ""
#: versioning.py:147
msgid "Invalid version in hostname." msgid "Invalid version in hostname."
msgstr "Ungültige Version im Hostname." msgstr "Ungültige Version im Hostname."
#: versioning.py:166 #: versioning.py:169
msgid "Invalid version in query parameter." msgid "Invalid version in query parameter."
msgstr "Ungültige Version im Anfrageparameter." msgstr "Ungültige Version im Anfrageparameter."

View File

@ -3,13 +3,14 @@
# This file is distributed under the same license as the PACKAGE package. # This file is distributed under the same license as the PACKAGE package.
# #
# Translators: # Translators:
# Serafeim Papastefanos <spapas@gmail.com>, 2016
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django REST framework\n" "Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-01 18:38+0100\n" "POT-Creation-Date: 2016-07-12 16:13+0100\n"
"PO-Revision-Date: 2016-03-01 17:38+0000\n" "PO-Revision-Date: 2016-07-12 15:14+0000\n"
"Last-Translator: Xavier Ordoquy <xordoquy@linovia.com>\n" "Last-Translator: Thomas Christie <tom@tomchristie.com>\n"
"Language-Team: Greek (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/el/)\n" "Language-Team: Greek (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/el/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -17,441 +18,423 @@ msgstr ""
"Language: el\n" "Language: el\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: authentication.py:71 #: authentication.py:73
msgid "Invalid basic header. No credentials provided." msgid "Invalid basic header. No credentials provided."
msgstr "" msgstr "Λανθασμένη επικεφαλίδα basic. Δεν υπάρχουν διαπιστευτήρια."
#: authentication.py:74 #: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces." msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "" msgstr "Λανθασμένη επικεφαλίδα basic. Τα διαπιστευτήρια δε μπορεί να περιέχουν κενά."
#: authentication.py:80 #: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded." msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "" msgstr "Λανθασμένη επικεφαλίδα basic. Τα διαπιστευτήρια δεν είναι κωδικοποιημένα κατά base64."
#: authentication.py:97 #: authentication.py:99
msgid "Invalid username/password." msgid "Invalid username/password."
msgstr "" msgstr "Λανθασμένο όνομα χρήστη/κωδικός."
#: authentication.py:100 authentication.py:195 #: authentication.py:102 authentication.py:198
msgid "User inactive or deleted." msgid "User inactive or deleted."
msgstr "" msgstr "Ο χρήστης είναι ανενεργός ή διεγραμμένος."
#: authentication.py:173
msgid "Invalid token header. No credentials provided."
msgstr ""
#: authentication.py:176 #: authentication.py:176
msgid "Invalid token header. Token string should not contain spaces." msgid "Invalid token header. No credentials provided."
msgstr "" msgstr "Λανθασμένη επικεφαλίδα token. Δεν υπάρχουν διαπιστευτήρια."
#: authentication.py:182 #: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr "Λανθασμένη επικεφαλίδα token. Το token δε πρέπει να περιέχει κενά."
#: authentication.py:185
msgid "" msgid ""
"Invalid token header. Token string should not contain invalid characters." "Invalid token header. Token string should not contain invalid characters."
msgstr "" msgstr "Λανθασμένη επικεφαλίδα token. Το token περιέχει μη επιτρεπτούς χαρακτήρες."
#: authentication.py:192 #: authentication.py:195
msgid "Invalid token." msgid "Invalid token."
msgstr "" msgstr "Λανθασμένο token"
#: authtoken/apps.py:7 #: authtoken/apps.py:7
msgid "Auth Token" msgid "Auth Token"
msgstr "" msgstr "Token πιστοποίησης"
#: authtoken/models.py:21 #: authtoken/models.py:15
msgid "Key" msgid "Key"
msgstr "" msgstr "Κλειδί"
#: authtoken/models.py:23 #: authtoken/models.py:18
msgid "User" msgid "User"
msgstr "" msgstr "Χρήστης"
#: authtoken/models.py:24 #: authtoken/models.py:20
msgid "Created" msgid "Created"
msgstr "" msgstr "Δημιουργήθηκε"
#: authtoken/models.py:33 #: authtoken/models.py:29
msgid "Token" msgid "Token"
msgstr "" msgstr "Token"
#: authtoken/models.py:34 #: authtoken/models.py:30
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr "Tokens"
#: authtoken/serializers.py:8 #: authtoken/serializers.py:8
msgid "Username" msgid "Username"
msgstr "" msgstr "Όνομα χρήστη"
#: authtoken/serializers.py:9 #: authtoken/serializers.py:9
msgid "Password" msgid "Password"
msgstr "" msgstr "Κωδικός"
#: authtoken/serializers.py:20 #: authtoken/serializers.py:20
msgid "User account is disabled." msgid "User account is disabled."
msgstr "" msgstr "Ο λογαριασμός χρήστη είναι απενεργοποιημένος."
#: authtoken/serializers.py:23 #: authtoken/serializers.py:23
msgid "Unable to log in with provided credentials." msgid "Unable to log in with provided credentials."
msgstr "" msgstr "Δεν είναι δυνατή η σύνδεση με τα διαπιστευτήρια."
#: authtoken/serializers.py:26 #: authtoken/serializers.py:26
msgid "Must include \"username\" and \"password\"." msgid "Must include \"username\" and \"password\"."
msgstr "" msgstr "Πρέπει να περιέχει \"όνομα χρήστη\" και \"κωδικό\"."
#: exceptions.py:49 #: exceptions.py:49
msgid "A server error occurred." msgid "A server error occurred."
msgstr "" msgstr "Σφάλμα διακομιστή."
#: exceptions.py:84 #: exceptions.py:84
msgid "Malformed request." msgid "Malformed request."
msgstr "" msgstr "Λανθασμένο αίτημα."
#: exceptions.py:89 #: exceptions.py:89
msgid "Incorrect authentication credentials." msgid "Incorrect authentication credentials."
msgstr "" msgstr "Λάθος διαπιστευτήρια."
#: exceptions.py:94 #: exceptions.py:94
msgid "Authentication credentials were not provided." msgid "Authentication credentials were not provided."
msgstr "" msgstr "Δεν δόθηκαν διαπιστευτήρια."
#: exceptions.py:99 #: exceptions.py:99
msgid "You do not have permission to perform this action." msgid "You do not have permission to perform this action."
msgstr "" msgstr "Δεν έχετε δικαίωματα για αυτή την ενέργεια."
#: exceptions.py:104 views.py:81 #: exceptions.py:104 views.py:81
msgid "Not found." msgid "Not found."
msgstr "" msgstr "Δε βρέθηκε."
#: exceptions.py:109 #: exceptions.py:109
#, python-brace-format
msgid "Method \"{method}\" not allowed." msgid "Method \"{method}\" not allowed."
msgstr "" msgstr "Η μέθοδος \"{method\"} δεν επιτρέπεται."
#: exceptions.py:120 #: exceptions.py:120
msgid "Could not satisfy the request Accept header." msgid "Could not satisfy the request Accept header."
msgstr "" msgstr "Δεν ήταν δυνατή η ικανοποίηση της επικεφαλίδας Accept της αίτησης."
#: exceptions.py:132 #: exceptions.py:132
#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request." msgid "Unsupported media type \"{media_type}\" in request."
msgstr "" msgstr "Δεν υποστηρίζεται το media type \"{media_type}\" της αίτησης."
#: exceptions.py:145 #: exceptions.py:145
msgid "Request was throttled." msgid "Request was throttled."
msgstr "" msgstr "Το αίτημα έγινε throttle."
#: fields.py:266 relations.py:206 relations.py:239 validators.py:79 #: fields.py:269 relations.py:206 relations.py:239 validators.py:98
#: validators.py:162 #: validators.py:181
msgid "This field is required." msgid "This field is required."
msgstr "" msgstr "Το πεδίο είναι απαραίτητο."
#: fields.py:267 #: fields.py:270
msgid "This field may not be null." msgid "This field may not be null."
msgstr "" msgstr "Το πεδίο δε μπορεί να είναι null."
#: fields.py:603 fields.py:634 #: fields.py:608 fields.py:639
#, python-brace-format
msgid "\"{input}\" is not a valid boolean." msgid "\"{input}\" is not a valid boolean."
msgstr "" msgstr "Το \"{input}\" δεν είναι έγκυρο boolean."
#: fields.py:669 #: fields.py:674
msgid "This field may not be blank." msgid "This field may not be blank."
msgstr "" msgstr "Το πεδίο δε μπορεί να είναι κενό."
#: fields.py:670 fields.py:1664 #: fields.py:675 fields.py:1675
#, python-brace-format
msgid "Ensure this field has no more than {max_length} characters." msgid "Ensure this field has no more than {max_length} characters."
msgstr "" msgstr "Επιβεβαιώσατε ότι το πεδίο δεν έχει περισσότερους από {max_length} χαρακτήρες."
#: fields.py:671 #: fields.py:676
#, python-brace-format
msgid "Ensure this field has at least {min_length} characters." msgid "Ensure this field has at least {min_length} characters."
msgstr "" msgstr "Επιβεβαιώσατε ότι το πεδίο έχει τουλάχιστον {min_length} χαρακτήρες."
#: fields.py:708 #: fields.py:713
msgid "Enter a valid email address." msgid "Enter a valid email address."
msgstr "" msgstr "Συμπληρώσατε μια έγκυρη διεύθυνση e-mail."
#: fields.py:719 #: fields.py:724
msgid "This value does not match the required pattern." msgid "This value does not match the required pattern."
msgstr "" msgstr "Η τιμή δε ταιριάζει με το pattern."
#: fields.py:730 #: fields.py:735
msgid "" msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or " "Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens." "hyphens."
msgstr "" msgstr "Εισάγετε ένα έγκυρο \"slug\" που αποτελείται από γράμματα, αριθμούς παύλες και κάτω παύλες."
#: fields.py:742 #: fields.py:747
msgid "Enter a valid URL." msgid "Enter a valid URL."
msgstr "" msgstr "Εισάγετε έγκυρο URL."
#: fields.py:755 #: fields.py:760
#, python-brace-format
msgid "\"{value}\" is not a valid UUID." msgid "\"{value}\" is not a valid UUID."
msgstr "" msgstr "Το \"{value}\" δεν είναι έγκυρο UUID."
#: fields.py:791 #: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address." msgid "Enter a valid IPv4 or IPv6 address."
msgstr "" msgstr "Εισάγετε μια έγκυρη διεύθυνση IPv4 ή IPv6."
#: fields.py:816 #: fields.py:821
msgid "A valid integer is required." msgid "A valid integer is required."
msgstr "" msgstr "Ένας έγκυρος ακέραιος είναι απαραίτητος."
#: fields.py:817 fields.py:852 fields.py:885 #: fields.py:822 fields.py:857 fields.py:891
#, python-brace-format
msgid "Ensure this value is less than or equal to {max_value}." msgid "Ensure this value is less than or equal to {max_value}."
msgstr "" msgstr "Επιβεβαιώσατε ότι η τιμή είναι μικρότερη ή ίση του {max_value}."
#: fields.py:818 fields.py:853 fields.py:886 #: fields.py:823 fields.py:858 fields.py:892
#, python-brace-format
msgid "Ensure this value is greater than or equal to {min_value}." msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "" msgstr "Επιβεβαιώσατε ότι η τιμή είναι μεγαλύτερη ή ίση του {min_value}."
#: fields.py:819 fields.py:854 fields.py:890 #: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large." msgid "String value too large."
msgstr "" msgstr "Το κείμενο είναι πολύ μεγάλο."
#: fields.py:851 fields.py:884 #: fields.py:856 fields.py:890
msgid "A valid number is required." msgid "A valid number is required."
msgstr "" msgstr "Ένας έγκυρος αριθμός είναι απαραίτητος."
#: fields.py:887 #: fields.py:893
#, python-brace-format
msgid "Ensure that there are no more than {max_digits} digits in total." msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "" msgstr "Επιβεβαιώσατε ότι δεν υπάρχουν παραπάνω από {max_digits} ψηφία."
#: fields.py:888 #: fields.py:894
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places." "Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "" msgstr "Επιβεβαιώσατε ότι δεν υπάρχουν παραπάνω από {max_decimal_places} δεκαδικά ψηφία."
#: fields.py:889 #: fields.py:895
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the " "Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point." "decimal point."
msgstr "" msgstr "Επιβεβαιώσατε ότι δεν υπάρχουν παραπάνω από {max_whole_digits} ακέραια ψηφία."
#: fields.py:1004 #: fields.py:1025
#, python-brace-format
msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr "Η ημερομηνία έχεi λάθος μορφή. Χρησιμοποιήστε μια από τις ακόλουθες μορφές: {format}"
#: fields.py:1005 #: fields.py:1026
msgid "Expected a datetime but got a date." msgid "Expected a datetime but got a date."
msgstr "" msgstr "Αναμένεται ημερομηνία και ώρα αλλά δόθηκε μόνο ημερομηνία."
#: fields.py:1082 #: fields.py:1103
#, python-brace-format
msgid "Date has wrong format. Use one of these formats instead: {format}." msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr "Η ημερομηνία έχεi λάθος μορφή. Χρησιμοποιήστε μια από τις ακόλουθες μορφές: {format}"
#: fields.py:1083 #: fields.py:1104
msgid "Expected a date but got a datetime." msgid "Expected a date but got a datetime."
msgstr "" msgstr "Αναμένεται ημερομηνία αλλά δόθηκε ημερομηνία και ώρα."
#: fields.py:1151 #: fields.py:1170
#, python-brace-format
msgid "Time has wrong format. Use one of these formats instead: {format}." msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr "Η ώρα έχει λάθος μορφή. Χρησιμοποιήστε μια από τις ακόλουθες μορφές: {format}"
#: fields.py:1215 #: fields.py:1232
#, python-brace-format
msgid "Duration has wrong format. Use one of these formats instead: {format}." msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr "Η διάρκεια έχει λάθος μορφή. Χρησιμοποιήστε μια από τις ακόλουθες μορφές: {format}"
#: fields.py:1240 fields.py:1289 #: fields.py:1251 fields.py:1300
#, python-brace-format
msgid "\"{input}\" is not a valid choice." msgid "\"{input}\" is not a valid choice."
msgstr "" msgstr "Το \"{input}\" δεν είναι έγκυρη επιλογή."
#: fields.py:1243 relations.py:71 relations.py:442 #: fields.py:1254 relations.py:71 relations.py:441
#, python-brace-format
msgid "More than {count} items..." msgid "More than {count} items..."
msgstr "" msgstr "Περισσότερα από {count} αντικείμενα..."
#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520 #: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
#, python-brace-format
msgid "Expected a list of items but got type \"{input_type}\"." msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "" msgstr "Αναμένεται μια λίστα αντικειμένον αλλά δόθηκε ο τύπος \"{input_type}\""
#: fields.py:1291 #: fields.py:1302
msgid "This selection may not be empty." msgid "This selection may not be empty."
msgstr "" msgstr "Η επιλογή δε μπορεί να είναι κενή."
#: fields.py:1328 #: fields.py:1339
#, python-brace-format
msgid "\"{input}\" is not a valid path choice." msgid "\"{input}\" is not a valid path choice."
msgstr "" msgstr "Το \"{input}\" δεν είναι έγκυρη επιλογή διαδρομής."
#: fields.py:1347 #: fields.py:1358
msgid "No file was submitted." msgid "No file was submitted."
msgstr "" msgstr "Δεν υποβλήθηκε αρχείο."
#: fields.py:1348 #: fields.py:1359
msgid "" msgid ""
"The submitted data was not a file. Check the encoding type on the form." "The submitted data was not a file. Check the encoding type on the form."
msgstr "" msgstr "Τα δεδομένα που υποβλήθηκαν δεν ήταν αρχείο. Ελέγξατε την κωδικοποίηση της φόρμας."
#: fields.py:1349 #: fields.py:1360
msgid "No filename could be determined." msgid "No filename could be determined."
msgstr "" msgstr "Δε βρέθηκε όνομα αρχείου."
#: fields.py:1350 #: fields.py:1361
msgid "The submitted file is empty." msgid "The submitted file is empty."
msgstr "" msgstr "Το αρχείο που υποβλήθηκε είναι κενό."
#: fields.py:1351 #: fields.py:1362
#, python-brace-format
msgid "" msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})." "Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "" msgstr "Επιβεβαιώσατε ότι το όνομα αρχείου έχει ως {max_length} χαρακτήρες (έχει {length})."
#: fields.py:1399 #: fields.py:1410
msgid "" msgid ""
"Upload a valid image. The file you uploaded was either not an image or a " "Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image." "corrupted image."
msgstr "" msgstr "Ανεβάστε μια έγκυρη εικόνα. Το αρχείο που ανεβάσατε είτε δεν είναι εικόνα είτε έχει καταστραφεί."
#: fields.py:1438 relations.py:439 serializers.py:521 #: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty." msgid "This list may not be empty."
msgstr "" msgstr "Η λίστα δε μπορεί να είναι κενή."
#: fields.py:1491 #: fields.py:1502
#, python-brace-format
msgid "Expected a dictionary of items but got type \"{input_type}\"." msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "" msgstr "Αναμένεται ένα λεξικό αντικείμενων αλλά δόθηκε ο τύπος \"{input_type}\"."
#: fields.py:1538 #: fields.py:1549
msgid "Value must be valid JSON." msgid "Value must be valid JSON."
msgstr "" msgstr "Η τιμή πρέπει να είναι μορφής JSON."
#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5 #: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit" msgid "Submit"
msgstr "Υποβολή"
#: filters.py:336
msgid "ascending"
msgstr "" msgstr ""
#: pagination.py:189 #: filters.py:337
msgid "descending"
msgstr ""
#: pagination.py:193
msgid "Invalid page." msgid "Invalid page."
msgstr "" msgstr "Λάθος σελίδα."
#: pagination.py:407 #: pagination.py:427
msgid "Invalid cursor" msgid "Invalid cursor"
msgstr "" msgstr "Λάθος cursor."
#: relations.py:207 #: relations.py:207
#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist." msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "" msgstr "Λάθος κλειδί \"{pk_value}\" - το αντικείμενο δεν υπάρχει."
#: relations.py:208 #: relations.py:208
#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}." msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "" msgstr "Λάθος τύπος. Αναμένεται τιμή κλειδιού, δόθηκε {data_type}."
#: relations.py:240 #: relations.py:240
msgid "Invalid hyperlink - No URL match." msgid "Invalid hyperlink - No URL match."
msgstr "" msgstr "Λάθος σύνδεση - δε ταιριάζει κάποιο URL."
#: relations.py:241 #: relations.py:241
msgid "Invalid hyperlink - Incorrect URL match." msgid "Invalid hyperlink - Incorrect URL match."
msgstr "" msgstr "Λάθος σύνδεση - δε ταιριάζει κάποιο URL."
#: relations.py:242 #: relations.py:242
msgid "Invalid hyperlink - Object does not exist." msgid "Invalid hyperlink - Object does not exist."
msgstr "" msgstr "Λάθος σύνδεση - το αντικείμενο δεν υπάρχει."
#: relations.py:243 #: relations.py:243
#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}." msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "" msgstr "Λάθος τύπος. Αναμένεται URL, δόθηκε {data_type}."
#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr "Το αντικείμενο {slug_name}={value} δεν υπάρχει."
#: relations.py:402 #: relations.py:402
#, python-brace-format
msgid "Object with {slug_name}={value} does not exist."
msgstr ""
#: relations.py:403
msgid "Invalid value." msgid "Invalid value."
msgstr "" msgstr "Λάθος τιμή."
#: serializers.py:326 #: serializers.py:326
#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}." msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "" msgstr "Λάθος δεδομένα. Αναμένεται λεξικό αλλά δόθηκε {datatype}."
#: templates/rest_framework/admin.html:118 #: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128 #: templates/rest_framework/base.html:128
msgid "Filters" msgid "Filters"
msgstr "" msgstr "Φίλτρα"
#: templates/rest_framework/filters/django_filter.html:2 #: templates/rest_framework/filters/django_filter.html:2
#: templates/rest_framework/filters/django_filter_crispyforms.html:4 #: templates/rest_framework/filters/django_filter_crispyforms.html:4
msgid "Field filters" msgid "Field filters"
msgstr "" msgstr "Φίλτρα πεδίων"
#: templates/rest_framework/filters/ordering.html:3 #: templates/rest_framework/filters/ordering.html:3
msgid "Ordering" msgid "Ordering"
msgstr "" msgstr "Ταξινόμηση"
#: templates/rest_framework/filters/search.html:2 #: templates/rest_framework/filters/search.html:2
msgid "Search" msgid "Search"
msgstr "" msgstr "Αναζήτηση"
#: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/horizontal/radio.html:2
#: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/inline/radio.html:2
#: templates/rest_framework/vertical/radio.html:2 #: templates/rest_framework/vertical/radio.html:2
msgid "None" msgid "None"
msgstr "" msgstr "None"
#: templates/rest_framework/horizontal/select_multiple.html:2 #: templates/rest_framework/horizontal/select_multiple.html:2
#: templates/rest_framework/inline/select_multiple.html:2 #: templates/rest_framework/inline/select_multiple.html:2
#: templates/rest_framework/vertical/select_multiple.html:2 #: templates/rest_framework/vertical/select_multiple.html:2
msgid "No items to select." msgid "No items to select."
msgstr "" msgstr "Δεν υπάρχουν αντικείμενα προς επιλογή."
#: validators.py:24 #: validators.py:43
msgid "This field must be unique." msgid "This field must be unique."
msgstr "" msgstr "Το πεδίο πρέπει να είναι μοναδικό"
#: validators.py:78 #: validators.py:97
#, python-brace-format
msgid "The fields {field_names} must make a unique set." msgid "The fields {field_names} must make a unique set."
msgstr "" msgstr "Τα πεδία {field_names} πρέπει να αποτελούν ένα μοναδικό σύνολο."
#: validators.py:226 #: validators.py:245
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" date." msgid "This field must be unique for the \"{date_field}\" date."
msgstr "" msgstr "Το πεδίο πρέπει να είναι μοναδικό για την ημερομηνία \"{date_field}\"."
#: validators.py:241 #: validators.py:260
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" month." msgid "This field must be unique for the \"{date_field}\" month."
msgstr "" msgstr "Το πεδίο πρέπει να είναι μοναδικό για το μήνα \"{date_field}\"."
#: validators.py:254 #: validators.py:273
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" year." msgid "This field must be unique for the \"{date_field}\" year."
msgstr "" msgstr "Το πεδίο πρέπει να είναι μοναδικό για το έτος \"{date_field}\"."
#: versioning.py:42 #: versioning.py:42
msgid "Invalid version in \"Accept\" header." msgid "Invalid version in \"Accept\" header."
msgstr "" msgstr "Λάθος έκδοση στην επικεφαλίδα \"Accept\"."
#: versioning.py:73 versioning.py:115 #: versioning.py:73
msgid "Invalid version in URL path." msgid "Invalid version in URL path."
msgstr "Λάθος έκδοση στη διαδρομή URL."
#: versioning.py:115
msgid "Invalid version in URL path. Does not match any version namespace."
msgstr "" msgstr ""
#: versioning.py:144 #: versioning.py:147
msgid "Invalid version in hostname." msgid "Invalid version in hostname."
msgstr "" msgstr "Λάθος έκδοση στο hostname."
#: versioning.py:166 #: versioning.py:169
msgid "Invalid version in query parameter." msgid "Invalid version in query parameter."
msgstr "" msgstr "Λάθος έκδοση στην παράμετρο"
#: views.py:88 #: views.py:88
msgid "Permission denied." msgid "Permission denied."
msgstr "" msgstr "Απόρριψη πρόσβασης"

View File

@ -7,9 +7,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django REST framework\n" "Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-01 18:38+0100\n" "POT-Creation-Date: 2016-07-12 16:13+0100\n"
"PO-Revision-Date: 2016-03-01 17:38+0000\n" "PO-Revision-Date: 2016-07-12 15:14+0000\n"
"Last-Translator: Xavier Ordoquy <xordoquy@linovia.com>\n" "Last-Translator: Thomas Christie <tom@tomchristie.com>\n"
"Language-Team: Greek (Greece) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/el_GR/)\n" "Language-Team: Greek (Greece) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/el_GR/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -17,40 +17,40 @@ msgstr ""
"Language: el_GR\n" "Language: el_GR\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: authentication.py:71 #: authentication.py:73
msgid "Invalid basic header. No credentials provided." msgid "Invalid basic header. No credentials provided."
msgstr "" msgstr ""
#: authentication.py:74 #: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces." msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "" msgstr ""
#: authentication.py:80 #: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded." msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "" msgstr ""
#: authentication.py:97 #: authentication.py:99
msgid "Invalid username/password." msgid "Invalid username/password."
msgstr "" msgstr ""
#: authentication.py:100 authentication.py:195 #: authentication.py:102 authentication.py:198
msgid "User inactive or deleted." msgid "User inactive or deleted."
msgstr "" msgstr ""
#: authentication.py:173 #: authentication.py:176
msgid "Invalid token header. No credentials provided." msgid "Invalid token header. No credentials provided."
msgstr "" msgstr ""
#: authentication.py:176 #: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces." msgid "Invalid token header. Token string should not contain spaces."
msgstr "" msgstr ""
#: authentication.py:182 #: authentication.py:185
msgid "" msgid ""
"Invalid token header. Token string should not contain invalid characters." "Invalid token header. Token string should not contain invalid characters."
msgstr "" msgstr ""
#: authentication.py:192 #: authentication.py:195
msgid "Invalid token." msgid "Invalid token."
msgstr "" msgstr ""
@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token" msgid "Auth Token"
msgstr "" msgstr ""
#: authtoken/models.py:21 #: authtoken/models.py:15
msgid "Key" msgid "Key"
msgstr "" msgstr ""
#: authtoken/models.py:23 #: authtoken/models.py:18
msgid "User" msgid "User"
msgstr "" msgstr ""
#: authtoken/models.py:24 #: authtoken/models.py:20
msgid "Created" msgid "Created"
msgstr "" msgstr ""
#: authtoken/models.py:33 #: authtoken/models.py:29
msgid "Token" msgid "Token"
msgstr "" msgstr ""
#: authtoken/models.py:34 #: authtoken/models.py:30
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
@ -123,7 +123,6 @@ msgid "Not found."
msgstr "" msgstr ""
#: exceptions.py:109 #: exceptions.py:109
#, python-brace-format
msgid "Method \"{method}\" not allowed." msgid "Method \"{method}\" not allowed."
msgstr "" msgstr ""
@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "" msgstr ""
#: exceptions.py:132 #: exceptions.py:132
#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request." msgid "Unsupported media type \"{media_type}\" in request."
msgstr "" msgstr ""
@ -140,214 +138,201 @@ msgstr ""
msgid "Request was throttled." msgid "Request was throttled."
msgstr "" msgstr ""
#: fields.py:266 relations.py:206 relations.py:239 validators.py:79 #: fields.py:269 relations.py:206 relations.py:239 validators.py:98
#: validators.py:162 #: validators.py:181
msgid "This field is required." msgid "This field is required."
msgstr "" msgstr ""
#: fields.py:267 #: fields.py:270
msgid "This field may not be null." msgid "This field may not be null."
msgstr "" msgstr ""
#: fields.py:603 fields.py:634 #: fields.py:608 fields.py:639
#, python-brace-format
msgid "\"{input}\" is not a valid boolean." msgid "\"{input}\" is not a valid boolean."
msgstr "" msgstr ""
#: fields.py:669 #: fields.py:674
msgid "This field may not be blank." msgid "This field may not be blank."
msgstr "" msgstr ""
#: fields.py:670 fields.py:1664 #: fields.py:675 fields.py:1675
#, python-brace-format
msgid "Ensure this field has no more than {max_length} characters." msgid "Ensure this field has no more than {max_length} characters."
msgstr "" msgstr ""
#: fields.py:671 #: fields.py:676
#, python-brace-format
msgid "Ensure this field has at least {min_length} characters." msgid "Ensure this field has at least {min_length} characters."
msgstr "" msgstr ""
#: fields.py:708 #: fields.py:713
msgid "Enter a valid email address." msgid "Enter a valid email address."
msgstr "" msgstr ""
#: fields.py:719 #: fields.py:724
msgid "This value does not match the required pattern." msgid "This value does not match the required pattern."
msgstr "" msgstr ""
#: fields.py:730 #: fields.py:735
msgid "" msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or " "Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens." "hyphens."
msgstr "" msgstr ""
#: fields.py:742 #: fields.py:747
msgid "Enter a valid URL." msgid "Enter a valid URL."
msgstr "" msgstr ""
#: fields.py:755 #: fields.py:760
#, python-brace-format
msgid "\"{value}\" is not a valid UUID." msgid "\"{value}\" is not a valid UUID."
msgstr "" msgstr ""
#: fields.py:791 #: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address." msgid "Enter a valid IPv4 or IPv6 address."
msgstr "" msgstr ""
#: fields.py:816 #: fields.py:821
msgid "A valid integer is required." msgid "A valid integer is required."
msgstr "" msgstr ""
#: fields.py:817 fields.py:852 fields.py:885 #: fields.py:822 fields.py:857 fields.py:891
#, python-brace-format
msgid "Ensure this value is less than or equal to {max_value}." msgid "Ensure this value is less than or equal to {max_value}."
msgstr "" msgstr ""
#: fields.py:818 fields.py:853 fields.py:886 #: fields.py:823 fields.py:858 fields.py:892
#, python-brace-format
msgid "Ensure this value is greater than or equal to {min_value}." msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "" msgstr ""
#: fields.py:819 fields.py:854 fields.py:890 #: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large." msgid "String value too large."
msgstr "" msgstr ""
#: fields.py:851 fields.py:884 #: fields.py:856 fields.py:890
msgid "A valid number is required." msgid "A valid number is required."
msgstr "" msgstr ""
#: fields.py:887 #: fields.py:893
#, python-brace-format
msgid "Ensure that there are no more than {max_digits} digits in total." msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "" msgstr ""
#: fields.py:888 #: fields.py:894
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places." "Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "" msgstr ""
#: fields.py:889 #: fields.py:895
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the " "Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point." "decimal point."
msgstr "" msgstr ""
#: fields.py:1004 #: fields.py:1025
#, python-brace-format
msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1005 #: fields.py:1026
msgid "Expected a datetime but got a date." msgid "Expected a datetime but got a date."
msgstr "" msgstr ""
#: fields.py:1082 #: fields.py:1103
#, python-brace-format
msgid "Date has wrong format. Use one of these formats instead: {format}." msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1083 #: fields.py:1104
msgid "Expected a date but got a datetime." msgid "Expected a date but got a datetime."
msgstr "" msgstr ""
#: fields.py:1151 #: fields.py:1170
#, python-brace-format
msgid "Time has wrong format. Use one of these formats instead: {format}." msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1215 #: fields.py:1232
#, python-brace-format
msgid "Duration has wrong format. Use one of these formats instead: {format}." msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1240 fields.py:1289 #: fields.py:1251 fields.py:1300
#, python-brace-format
msgid "\"{input}\" is not a valid choice." msgid "\"{input}\" is not a valid choice."
msgstr "" msgstr ""
#: fields.py:1243 relations.py:71 relations.py:442 #: fields.py:1254 relations.py:71 relations.py:441
#, python-brace-format
msgid "More than {count} items..." msgid "More than {count} items..."
msgstr "" msgstr ""
#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520 #: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
#, python-brace-format
msgid "Expected a list of items but got type \"{input_type}\"." msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "" msgstr ""
#: fields.py:1291 #: fields.py:1302
msgid "This selection may not be empty." msgid "This selection may not be empty."
msgstr "" msgstr ""
#: fields.py:1328 #: fields.py:1339
#, python-brace-format
msgid "\"{input}\" is not a valid path choice." msgid "\"{input}\" is not a valid path choice."
msgstr "" msgstr ""
#: fields.py:1347 #: fields.py:1358
msgid "No file was submitted." msgid "No file was submitted."
msgstr "" msgstr ""
#: fields.py:1348 #: fields.py:1359
msgid "" msgid ""
"The submitted data was not a file. Check the encoding type on the form." "The submitted data was not a file. Check the encoding type on the form."
msgstr "" msgstr ""
#: fields.py:1349 #: fields.py:1360
msgid "No filename could be determined." msgid "No filename could be determined."
msgstr "" msgstr ""
#: fields.py:1350 #: fields.py:1361
msgid "The submitted file is empty." msgid "The submitted file is empty."
msgstr "" msgstr ""
#: fields.py:1351 #: fields.py:1362
#, python-brace-format
msgid "" msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})." "Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "" msgstr ""
#: fields.py:1399 #: fields.py:1410
msgid "" msgid ""
"Upload a valid image. The file you uploaded was either not an image or a " "Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image." "corrupted image."
msgstr "" msgstr ""
#: fields.py:1438 relations.py:439 serializers.py:521 #: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty." msgid "This list may not be empty."
msgstr "" msgstr ""
#: fields.py:1491 #: fields.py:1502
#, python-brace-format
msgid "Expected a dictionary of items but got type \"{input_type}\"." msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "" msgstr ""
#: fields.py:1538 #: fields.py:1549
msgid "Value must be valid JSON." msgid "Value must be valid JSON."
msgstr "" msgstr ""
#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5 #: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit" msgid "Submit"
msgstr "" msgstr ""
#: pagination.py:189 #: filters.py:336
msgid "ascending"
msgstr ""
#: filters.py:337
msgid "descending"
msgstr ""
#: pagination.py:193
msgid "Invalid page." msgid "Invalid page."
msgstr "" msgstr ""
#: pagination.py:407 #: pagination.py:427
msgid "Invalid cursor" msgid "Invalid cursor"
msgstr "" msgstr ""
#: relations.py:207 #: relations.py:207
#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist." msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "" msgstr ""
#: relations.py:208 #: relations.py:208
#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}." msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "" msgstr ""
@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "" msgstr ""
#: relations.py:243 #: relations.py:243
#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}." msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "" msgstr ""
#: relations.py:402 #: relations.py:401
#, python-brace-format
msgid "Object with {slug_name}={value} does not exist." msgid "Object with {slug_name}={value} does not exist."
msgstr "" msgstr ""
#: relations.py:403 #: relations.py:402
msgid "Invalid value." msgid "Invalid value."
msgstr "" msgstr ""
#: serializers.py:326 #: serializers.py:326
#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}." msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "" msgstr ""
#: templates/rest_framework/admin.html:118 #: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128 #: templates/rest_framework/base.html:128
msgid "Filters" msgid "Filters"
msgstr "" msgstr ""
@ -412,27 +394,23 @@ msgstr ""
msgid "No items to select." msgid "No items to select."
msgstr "" msgstr ""
#: validators.py:24 #: validators.py:43
msgid "This field must be unique." msgid "This field must be unique."
msgstr "" msgstr ""
#: validators.py:78 #: validators.py:97
#, python-brace-format
msgid "The fields {field_names} must make a unique set." msgid "The fields {field_names} must make a unique set."
msgstr "" msgstr ""
#: validators.py:226 #: validators.py:245
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" date." msgid "This field must be unique for the \"{date_field}\" date."
msgstr "" msgstr ""
#: validators.py:241 #: validators.py:260
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" month." msgid "This field must be unique for the \"{date_field}\" month."
msgstr "" msgstr ""
#: validators.py:254 #: validators.py:273
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" year." msgid "This field must be unique for the \"{date_field}\" year."
msgstr "" msgstr ""
@ -440,15 +418,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header." msgid "Invalid version in \"Accept\" header."
msgstr "" msgstr ""
#: versioning.py:73 versioning.py:115 #: versioning.py:73
msgid "Invalid version in URL path." msgid "Invalid version in URL path."
msgstr "" msgstr ""
#: versioning.py:144 #: versioning.py:115
msgid "Invalid version in URL path. Does not match any version namespace."
msgstr ""
#: versioning.py:147
msgid "Invalid version in hostname." msgid "Invalid version in hostname."
msgstr "" msgstr ""
#: versioning.py:166 #: versioning.py:169
msgid "Invalid version in query parameter." msgid "Invalid version in query parameter."
msgstr "" msgstr ""

View File

@ -7,9 +7,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django REST framework\n" "Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-01 18:38+0100\n" "POT-Creation-Date: 2016-07-12 16:13+0100\n"
"PO-Revision-Date: 2016-03-01 17:38+0000\n" "PO-Revision-Date: 2016-07-12 15:14+0000\n"
"Last-Translator: Xavier Ordoquy <xordoquy@linovia.com>\n" "Last-Translator: Thomas Christie <tom@tomchristie.com>\n"
"Language-Team: English (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/en/)\n" "Language-Team: English (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/en/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -17,40 +17,40 @@ msgstr ""
"Language: en\n" "Language: en\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: authentication.py:71 #: authentication.py:73
msgid "Invalid basic header. No credentials provided." msgid "Invalid basic header. No credentials provided."
msgstr "Invalid basic header. No credentials provided." msgstr "Invalid basic header. No credentials provided."
#: authentication.py:74 #: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces." msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "Invalid basic header. Credentials string should not contain spaces." msgstr "Invalid basic header. Credentials string should not contain spaces."
#: authentication.py:80 #: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded." msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "Invalid basic header. Credentials not correctly base64 encoded." msgstr "Invalid basic header. Credentials not correctly base64 encoded."
#: authentication.py:97 #: authentication.py:99
msgid "Invalid username/password." msgid "Invalid username/password."
msgstr "Invalid username/password." msgstr "Invalid username/password."
#: authentication.py:100 authentication.py:195 #: authentication.py:102 authentication.py:198
msgid "User inactive or deleted." msgid "User inactive or deleted."
msgstr "User inactive or deleted." msgstr "User inactive or deleted."
#: authentication.py:173 #: authentication.py:176
msgid "Invalid token header. No credentials provided." msgid "Invalid token header. No credentials provided."
msgstr "Invalid token header. No credentials provided." msgstr "Invalid token header. No credentials provided."
#: authentication.py:176 #: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces." msgid "Invalid token header. Token string should not contain spaces."
msgstr "Invalid token header. Token string should not contain spaces." msgstr "Invalid token header. Token string should not contain spaces."
#: authentication.py:182 #: authentication.py:185
msgid "" msgid ""
"Invalid token header. Token string should not contain invalid characters." "Invalid token header. Token string should not contain invalid characters."
msgstr "Invalid token header. Token string should not contain invalid characters." msgstr "Invalid token header. Token string should not contain invalid characters."
#: authentication.py:192 #: authentication.py:195
msgid "Invalid token." msgid "Invalid token."
msgstr "Invalid token." msgstr "Invalid token."
@ -58,23 +58,23 @@ msgstr "Invalid token."
msgid "Auth Token" msgid "Auth Token"
msgstr "Auth Token" msgstr "Auth Token"
#: authtoken/models.py:21 #: authtoken/models.py:15
msgid "Key" msgid "Key"
msgstr "Key" msgstr "Key"
#: authtoken/models.py:23 #: authtoken/models.py:18
msgid "User" msgid "User"
msgstr "User" msgstr "User"
#: authtoken/models.py:24 #: authtoken/models.py:20
msgid "Created" msgid "Created"
msgstr "Created" msgstr "Created"
#: authtoken/models.py:33 #: authtoken/models.py:29
msgid "Token" msgid "Token"
msgstr "Token" msgstr "Token"
#: authtoken/models.py:34 #: authtoken/models.py:30
msgid "Tokens" msgid "Tokens"
msgstr "Tokens" msgstr "Tokens"
@ -123,7 +123,6 @@ msgid "Not found."
msgstr "Not found." msgstr "Not found."
#: exceptions.py:109 #: exceptions.py:109
#, python-brace-format
msgid "Method \"{method}\" not allowed." msgid "Method \"{method}\" not allowed."
msgstr "Method \"{method}\" not allowed." msgstr "Method \"{method}\" not allowed."
@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "Could not satisfy the request Accept header." msgstr "Could not satisfy the request Accept header."
#: exceptions.py:132 #: exceptions.py:132
#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request." msgid "Unsupported media type \"{media_type}\" in request."
msgstr "Unsupported media type \"{media_type}\" in request." msgstr "Unsupported media type \"{media_type}\" in request."
@ -140,214 +138,201 @@ msgstr "Unsupported media type \"{media_type}\" in request."
msgid "Request was throttled." msgid "Request was throttled."
msgstr "Request was throttled." msgstr "Request was throttled."
#: fields.py:266 relations.py:206 relations.py:239 validators.py:79 #: fields.py:269 relations.py:206 relations.py:239 validators.py:98
#: validators.py:162 #: validators.py:181
msgid "This field is required." msgid "This field is required."
msgstr "This field is required." msgstr "This field is required."
#: fields.py:267 #: fields.py:270
msgid "This field may not be null." msgid "This field may not be null."
msgstr "This field may not be null." msgstr "This field may not be null."
#: fields.py:603 fields.py:634 #: fields.py:608 fields.py:639
#, python-brace-format
msgid "\"{input}\" is not a valid boolean." msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" is not a valid boolean." msgstr "\"{input}\" is not a valid boolean."
#: fields.py:669 #: fields.py:674
msgid "This field may not be blank." msgid "This field may not be blank."
msgstr "This field may not be blank." msgstr "This field may not be blank."
#: fields.py:670 fields.py:1664 #: fields.py:675 fields.py:1675
#, python-brace-format
msgid "Ensure this field has no more than {max_length} characters." msgid "Ensure this field has no more than {max_length} characters."
msgstr "Ensure this field has no more than {max_length} characters." msgstr "Ensure this field has no more than {max_length} characters."
#: fields.py:671 #: fields.py:676
#, python-brace-format
msgid "Ensure this field has at least {min_length} characters." msgid "Ensure this field has at least {min_length} characters."
msgstr "Ensure this field has at least {min_length} characters." msgstr "Ensure this field has at least {min_length} characters."
#: fields.py:708 #: fields.py:713
msgid "Enter a valid email address." msgid "Enter a valid email address."
msgstr "Enter a valid email address." msgstr "Enter a valid email address."
#: fields.py:719 #: fields.py:724
msgid "This value does not match the required pattern." msgid "This value does not match the required pattern."
msgstr "This value does not match the required pattern." msgstr "This value does not match the required pattern."
#: fields.py:730 #: fields.py:735
msgid "" msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or " "Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens." "hyphens."
msgstr "Enter a valid \"slug\" consisting of letters, numbers, underscores or hyphens." msgstr "Enter a valid \"slug\" consisting of letters, numbers, underscores or hyphens."
#: fields.py:742 #: fields.py:747
msgid "Enter a valid URL." msgid "Enter a valid URL."
msgstr "Enter a valid URL." msgstr "Enter a valid URL."
#: fields.py:755 #: fields.py:760
#, python-brace-format
msgid "\"{value}\" is not a valid UUID." msgid "\"{value}\" is not a valid UUID."
msgstr "\"{value}\" is not a valid UUID." msgstr "\"{value}\" is not a valid UUID."
#: fields.py:791 #: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address." msgid "Enter a valid IPv4 or IPv6 address."
msgstr "Enter a valid IPv4 or IPv6 address." msgstr "Enter a valid IPv4 or IPv6 address."
#: fields.py:816 #: fields.py:821
msgid "A valid integer is required." msgid "A valid integer is required."
msgstr "A valid integer is required." msgstr "A valid integer is required."
#: fields.py:817 fields.py:852 fields.py:885 #: fields.py:822 fields.py:857 fields.py:891
#, python-brace-format
msgid "Ensure this value is less than or equal to {max_value}." msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Ensure this value is less than or equal to {max_value}." msgstr "Ensure this value is less than or equal to {max_value}."
#: fields.py:818 fields.py:853 fields.py:886 #: fields.py:823 fields.py:858 fields.py:892
#, python-brace-format
msgid "Ensure this value is greater than or equal to {min_value}." msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Ensure this value is greater than or equal to {min_value}." msgstr "Ensure this value is greater than or equal to {min_value}."
#: fields.py:819 fields.py:854 fields.py:890 #: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large." msgid "String value too large."
msgstr "String value too large." msgstr "String value too large."
#: fields.py:851 fields.py:884 #: fields.py:856 fields.py:890
msgid "A valid number is required." msgid "A valid number is required."
msgstr "A valid number is required." msgstr "A valid number is required."
#: fields.py:887 #: fields.py:893
#, python-brace-format
msgid "Ensure that there are no more than {max_digits} digits in total." msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "Ensure that there are no more than {max_digits} digits in total." msgstr "Ensure that there are no more than {max_digits} digits in total."
#: fields.py:888 #: fields.py:894
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places." "Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "Ensure that there are no more than {max_decimal_places} decimal places."
#: fields.py:889 #: fields.py:895
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the " "Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point." "decimal point."
msgstr "Ensure that there are no more than {max_whole_digits} digits before the decimal point." msgstr "Ensure that there are no more than {max_whole_digits} digits before the decimal point."
#: fields.py:1004 #: fields.py:1025
#, python-brace-format
msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "Datetime has wrong format. Use one of these formats instead: {format}."
#: fields.py:1005 #: fields.py:1026
msgid "Expected a datetime but got a date." msgid "Expected a datetime but got a date."
msgstr "Expected a datetime but got a date." msgstr "Expected a datetime but got a date."
#: fields.py:1082 #: fields.py:1103
#, python-brace-format
msgid "Date has wrong format. Use one of these formats instead: {format}." msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "Date has wrong format. Use one of these formats instead: {format}." msgstr "Date has wrong format. Use one of these formats instead: {format}."
#: fields.py:1083 #: fields.py:1104
msgid "Expected a date but got a datetime." msgid "Expected a date but got a datetime."
msgstr "Expected a date but got a datetime." msgstr "Expected a date but got a datetime."
#: fields.py:1151 #: fields.py:1170
#, python-brace-format
msgid "Time has wrong format. Use one of these formats instead: {format}." msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "Time has wrong format. Use one of these formats instead: {format}." msgstr "Time has wrong format. Use one of these formats instead: {format}."
#: fields.py:1215 #: fields.py:1232
#, python-brace-format
msgid "Duration has wrong format. Use one of these formats instead: {format}." msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "Duration has wrong format. Use one of these formats instead: {format}." msgstr "Duration has wrong format. Use one of these formats instead: {format}."
#: fields.py:1240 fields.py:1289 #: fields.py:1251 fields.py:1300
#, python-brace-format
msgid "\"{input}\" is not a valid choice." msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" is not a valid choice." msgstr "\"{input}\" is not a valid choice."
#: fields.py:1243 relations.py:71 relations.py:442 #: fields.py:1254 relations.py:71 relations.py:441
#, python-brace-format
msgid "More than {count} items..." msgid "More than {count} items..."
msgstr "More than {count} items..." msgstr "More than {count} items..."
#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520 #: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
#, python-brace-format
msgid "Expected a list of items but got type \"{input_type}\"." msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "Expected a list of items but got type \"{input_type}\"." msgstr "Expected a list of items but got type \"{input_type}\"."
#: fields.py:1291 #: fields.py:1302
msgid "This selection may not be empty." msgid "This selection may not be empty."
msgstr "This selection may not be empty." msgstr "This selection may not be empty."
#: fields.py:1328 #: fields.py:1339
#, python-brace-format
msgid "\"{input}\" is not a valid path choice." msgid "\"{input}\" is not a valid path choice."
msgstr "\"{input}\" is not a valid path choice." msgstr "\"{input}\" is not a valid path choice."
#: fields.py:1347 #: fields.py:1358
msgid "No file was submitted." msgid "No file was submitted."
msgstr "No file was submitted." msgstr "No file was submitted."
#: fields.py:1348 #: fields.py:1359
msgid "" msgid ""
"The submitted data was not a file. Check the encoding type on the form." "The submitted data was not a file. Check the encoding type on the form."
msgstr "The submitted data was not a file. Check the encoding type on the form." msgstr "The submitted data was not a file. Check the encoding type on the form."
#: fields.py:1349 #: fields.py:1360
msgid "No filename could be determined." msgid "No filename could be determined."
msgstr "No filename could be determined." msgstr "No filename could be determined."
#: fields.py:1350 #: fields.py:1361
msgid "The submitted file is empty." msgid "The submitted file is empty."
msgstr "The submitted file is empty." msgstr "The submitted file is empty."
#: fields.py:1351 #: fields.py:1362
#, python-brace-format
msgid "" msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})." "Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "Ensure this filename has at most {max_length} characters (it has {length})."
#: fields.py:1399 #: fields.py:1410
msgid "" msgid ""
"Upload a valid image. The file you uploaded was either not an image or a " "Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image." "corrupted image."
msgstr "Upload a valid image. The file you uploaded was either not an image or a corrupted image." msgstr "Upload a valid image. The file you uploaded was either not an image or a corrupted image."
#: fields.py:1438 relations.py:439 serializers.py:521 #: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty." msgid "This list may not be empty."
msgstr "This list may not be empty." msgstr "This list may not be empty."
#: fields.py:1491 #: fields.py:1502
#, python-brace-format
msgid "Expected a dictionary of items but got type \"{input_type}\"." msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Expected a dictionary of items but got type \"{input_type}\"."
#: fields.py:1538 #: fields.py:1549
msgid "Value must be valid JSON." msgid "Value must be valid JSON."
msgstr "Value must be valid JSON." msgstr "Value must be valid JSON."
#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5 #: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit" msgid "Submit"
msgstr "Submit" msgstr "Submit"
#: pagination.py:189 #: filters.py:336
msgid "ascending"
msgstr "ascending"
#: filters.py:337
msgid "descending"
msgstr "descending"
#: pagination.py:193
msgid "Invalid page." msgid "Invalid page."
msgstr "Invalid page." msgstr "Invalid page."
#: pagination.py:407 #: pagination.py:427
msgid "Invalid cursor" msgid "Invalid cursor"
msgstr "Invalid cursor" msgstr "Invalid cursor"
#: relations.py:207 #: relations.py:207
#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist." msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Invalid pk \"{pk_value}\" - object does not exist."
#: relations.py:208 #: relations.py:208
#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}." msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Incorrect type. Expected pk value, received {data_type}." msgstr "Incorrect type. Expected pk value, received {data_type}."
@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Invalid hyperlink - Object does not exist." msgstr "Invalid hyperlink - Object does not exist."
#: relations.py:243 #: relations.py:243
#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}." msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Incorrect type. Expected URL string, received {data_type}." msgstr "Incorrect type. Expected URL string, received {data_type}."
#: relations.py:402 #: relations.py:401
#, python-brace-format
msgid "Object with {slug_name}={value} does not exist." msgid "Object with {slug_name}={value} does not exist."
msgstr "Object with {slug_name}={value} does not exist." msgstr "Object with {slug_name}={value} does not exist."
#: relations.py:403 #: relations.py:402
msgid "Invalid value." msgid "Invalid value."
msgstr "Invalid value." msgstr "Invalid value."
#: serializers.py:326 #: serializers.py:326
#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}." msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Invalid data. Expected a dictionary, but got {datatype}." msgstr "Invalid data. Expected a dictionary, but got {datatype}."
#: templates/rest_framework/admin.html:118 #: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128 #: templates/rest_framework/base.html:128
msgid "Filters" msgid "Filters"
msgstr "Filters" msgstr "Filters"
@ -412,27 +394,23 @@ msgstr "None"
msgid "No items to select." msgid "No items to select."
msgstr "No items to select." msgstr "No items to select."
#: validators.py:24 #: validators.py:43
msgid "This field must be unique." msgid "This field must be unique."
msgstr "This field must be unique." msgstr "This field must be unique."
#: validators.py:78 #: validators.py:97
#, python-brace-format
msgid "The fields {field_names} must make a unique set." msgid "The fields {field_names} must make a unique set."
msgstr "The fields {field_names} must make a unique set." msgstr "The fields {field_names} must make a unique set."
#: validators.py:226 #: validators.py:245
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" date." msgid "This field must be unique for the \"{date_field}\" date."
msgstr "This field must be unique for the \"{date_field}\" date." msgstr "This field must be unique for the \"{date_field}\" date."
#: validators.py:241 #: validators.py:260
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" month." msgid "This field must be unique for the \"{date_field}\" month."
msgstr "This field must be unique for the \"{date_field}\" month." msgstr "This field must be unique for the \"{date_field}\" month."
#: validators.py:254 #: validators.py:273
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" year." msgid "This field must be unique for the \"{date_field}\" year."
msgstr "This field must be unique for the \"{date_field}\" year." msgstr "This field must be unique for the \"{date_field}\" year."
@ -440,15 +418,19 @@ msgstr "This field must be unique for the \"{date_field}\" year."
msgid "Invalid version in \"Accept\" header." msgid "Invalid version in \"Accept\" header."
msgstr "Invalid version in \"Accept\" header." msgstr "Invalid version in \"Accept\" header."
#: versioning.py:73 versioning.py:115 #: versioning.py:73
msgid "Invalid version in URL path." msgid "Invalid version in URL path."
msgstr "Invalid version in URL path." msgstr "Invalid version in URL path."
#: versioning.py:144 #: versioning.py:115
msgid "Invalid version in URL path. Does not match any version namespace."
msgstr "Invalid version in URL path. Does not match any version namespace."
#: versioning.py:147
msgid "Invalid version in hostname." msgid "Invalid version in hostname."
msgstr "Invalid version in hostname." msgstr "Invalid version in hostname."
#: versioning.py:166 #: versioning.py:169
msgid "Invalid version in query parameter." msgid "Invalid version in query parameter."
msgstr "Invalid version in query parameter." msgstr "Invalid version in query parameter."

View File

@ -7,9 +7,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django REST framework\n" "Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-01 18:38+0100\n" "POT-Creation-Date: 2016-07-12 16:13+0100\n"
"PO-Revision-Date: 2016-03-01 17:38+0000\n" "PO-Revision-Date: 2016-07-12 15:14+0000\n"
"Last-Translator: Xavier Ordoquy <xordoquy@linovia.com>\n" "Last-Translator: Thomas Christie <tom@tomchristie.com>\n"
"Language-Team: English (Australia) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/en_AU/)\n" "Language-Team: English (Australia) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/en_AU/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -17,40 +17,40 @@ msgstr ""
"Language: en_AU\n" "Language: en_AU\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: authentication.py:71 #: authentication.py:73
msgid "Invalid basic header. No credentials provided." msgid "Invalid basic header. No credentials provided."
msgstr "" msgstr ""
#: authentication.py:74 #: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces." msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "" msgstr ""
#: authentication.py:80 #: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded." msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "" msgstr ""
#: authentication.py:97 #: authentication.py:99
msgid "Invalid username/password." msgid "Invalid username/password."
msgstr "" msgstr ""
#: authentication.py:100 authentication.py:195 #: authentication.py:102 authentication.py:198
msgid "User inactive or deleted." msgid "User inactive or deleted."
msgstr "" msgstr ""
#: authentication.py:173 #: authentication.py:176
msgid "Invalid token header. No credentials provided." msgid "Invalid token header. No credentials provided."
msgstr "" msgstr ""
#: authentication.py:176 #: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces." msgid "Invalid token header. Token string should not contain spaces."
msgstr "" msgstr ""
#: authentication.py:182 #: authentication.py:185
msgid "" msgid ""
"Invalid token header. Token string should not contain invalid characters." "Invalid token header. Token string should not contain invalid characters."
msgstr "" msgstr ""
#: authentication.py:192 #: authentication.py:195
msgid "Invalid token." msgid "Invalid token."
msgstr "" msgstr ""
@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token" msgid "Auth Token"
msgstr "" msgstr ""
#: authtoken/models.py:21 #: authtoken/models.py:15
msgid "Key" msgid "Key"
msgstr "" msgstr ""
#: authtoken/models.py:23 #: authtoken/models.py:18
msgid "User" msgid "User"
msgstr "" msgstr ""
#: authtoken/models.py:24 #: authtoken/models.py:20
msgid "Created" msgid "Created"
msgstr "" msgstr ""
#: authtoken/models.py:33 #: authtoken/models.py:29
msgid "Token" msgid "Token"
msgstr "" msgstr ""
#: authtoken/models.py:34 #: authtoken/models.py:30
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
@ -123,7 +123,6 @@ msgid "Not found."
msgstr "" msgstr ""
#: exceptions.py:109 #: exceptions.py:109
#, python-brace-format
msgid "Method \"{method}\" not allowed." msgid "Method \"{method}\" not allowed."
msgstr "" msgstr ""
@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "" msgstr ""
#: exceptions.py:132 #: exceptions.py:132
#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request." msgid "Unsupported media type \"{media_type}\" in request."
msgstr "" msgstr ""
@ -140,214 +138,201 @@ msgstr ""
msgid "Request was throttled." msgid "Request was throttled."
msgstr "" msgstr ""
#: fields.py:266 relations.py:206 relations.py:239 validators.py:79 #: fields.py:269 relations.py:206 relations.py:239 validators.py:98
#: validators.py:162 #: validators.py:181
msgid "This field is required." msgid "This field is required."
msgstr "" msgstr ""
#: fields.py:267 #: fields.py:270
msgid "This field may not be null." msgid "This field may not be null."
msgstr "" msgstr ""
#: fields.py:603 fields.py:634 #: fields.py:608 fields.py:639
#, python-brace-format
msgid "\"{input}\" is not a valid boolean." msgid "\"{input}\" is not a valid boolean."
msgstr "" msgstr ""
#: fields.py:669 #: fields.py:674
msgid "This field may not be blank." msgid "This field may not be blank."
msgstr "" msgstr ""
#: fields.py:670 fields.py:1664 #: fields.py:675 fields.py:1675
#, python-brace-format
msgid "Ensure this field has no more than {max_length} characters." msgid "Ensure this field has no more than {max_length} characters."
msgstr "" msgstr ""
#: fields.py:671 #: fields.py:676
#, python-brace-format
msgid "Ensure this field has at least {min_length} characters." msgid "Ensure this field has at least {min_length} characters."
msgstr "" msgstr ""
#: fields.py:708 #: fields.py:713
msgid "Enter a valid email address." msgid "Enter a valid email address."
msgstr "" msgstr ""
#: fields.py:719 #: fields.py:724
msgid "This value does not match the required pattern." msgid "This value does not match the required pattern."
msgstr "" msgstr ""
#: fields.py:730 #: fields.py:735
msgid "" msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or " "Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens." "hyphens."
msgstr "" msgstr ""
#: fields.py:742 #: fields.py:747
msgid "Enter a valid URL." msgid "Enter a valid URL."
msgstr "" msgstr ""
#: fields.py:755 #: fields.py:760
#, python-brace-format
msgid "\"{value}\" is not a valid UUID." msgid "\"{value}\" is not a valid UUID."
msgstr "" msgstr ""
#: fields.py:791 #: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address." msgid "Enter a valid IPv4 or IPv6 address."
msgstr "" msgstr ""
#: fields.py:816 #: fields.py:821
msgid "A valid integer is required." msgid "A valid integer is required."
msgstr "" msgstr ""
#: fields.py:817 fields.py:852 fields.py:885 #: fields.py:822 fields.py:857 fields.py:891
#, python-brace-format
msgid "Ensure this value is less than or equal to {max_value}." msgid "Ensure this value is less than or equal to {max_value}."
msgstr "" msgstr ""
#: fields.py:818 fields.py:853 fields.py:886 #: fields.py:823 fields.py:858 fields.py:892
#, python-brace-format
msgid "Ensure this value is greater than or equal to {min_value}." msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "" msgstr ""
#: fields.py:819 fields.py:854 fields.py:890 #: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large." msgid "String value too large."
msgstr "" msgstr ""
#: fields.py:851 fields.py:884 #: fields.py:856 fields.py:890
msgid "A valid number is required." msgid "A valid number is required."
msgstr "" msgstr ""
#: fields.py:887 #: fields.py:893
#, python-brace-format
msgid "Ensure that there are no more than {max_digits} digits in total." msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "" msgstr ""
#: fields.py:888 #: fields.py:894
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places." "Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "" msgstr ""
#: fields.py:889 #: fields.py:895
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the " "Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point." "decimal point."
msgstr "" msgstr ""
#: fields.py:1004 #: fields.py:1025
#, python-brace-format
msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1005 #: fields.py:1026
msgid "Expected a datetime but got a date." msgid "Expected a datetime but got a date."
msgstr "" msgstr ""
#: fields.py:1082 #: fields.py:1103
#, python-brace-format
msgid "Date has wrong format. Use one of these formats instead: {format}." msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1083 #: fields.py:1104
msgid "Expected a date but got a datetime." msgid "Expected a date but got a datetime."
msgstr "" msgstr ""
#: fields.py:1151 #: fields.py:1170
#, python-brace-format
msgid "Time has wrong format. Use one of these formats instead: {format}." msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1215 #: fields.py:1232
#, python-brace-format
msgid "Duration has wrong format. Use one of these formats instead: {format}." msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1240 fields.py:1289 #: fields.py:1251 fields.py:1300
#, python-brace-format
msgid "\"{input}\" is not a valid choice." msgid "\"{input}\" is not a valid choice."
msgstr "" msgstr ""
#: fields.py:1243 relations.py:71 relations.py:442 #: fields.py:1254 relations.py:71 relations.py:441
#, python-brace-format
msgid "More than {count} items..." msgid "More than {count} items..."
msgstr "" msgstr ""
#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520 #: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
#, python-brace-format
msgid "Expected a list of items but got type \"{input_type}\"." msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "" msgstr ""
#: fields.py:1291 #: fields.py:1302
msgid "This selection may not be empty." msgid "This selection may not be empty."
msgstr "" msgstr ""
#: fields.py:1328 #: fields.py:1339
#, python-brace-format
msgid "\"{input}\" is not a valid path choice." msgid "\"{input}\" is not a valid path choice."
msgstr "" msgstr ""
#: fields.py:1347 #: fields.py:1358
msgid "No file was submitted." msgid "No file was submitted."
msgstr "" msgstr ""
#: fields.py:1348 #: fields.py:1359
msgid "" msgid ""
"The submitted data was not a file. Check the encoding type on the form." "The submitted data was not a file. Check the encoding type on the form."
msgstr "" msgstr ""
#: fields.py:1349 #: fields.py:1360
msgid "No filename could be determined." msgid "No filename could be determined."
msgstr "" msgstr ""
#: fields.py:1350 #: fields.py:1361
msgid "The submitted file is empty." msgid "The submitted file is empty."
msgstr "" msgstr ""
#: fields.py:1351 #: fields.py:1362
#, python-brace-format
msgid "" msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})." "Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "" msgstr ""
#: fields.py:1399 #: fields.py:1410
msgid "" msgid ""
"Upload a valid image. The file you uploaded was either not an image or a " "Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image." "corrupted image."
msgstr "" msgstr ""
#: fields.py:1438 relations.py:439 serializers.py:521 #: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty." msgid "This list may not be empty."
msgstr "" msgstr ""
#: fields.py:1491 #: fields.py:1502
#, python-brace-format
msgid "Expected a dictionary of items but got type \"{input_type}\"." msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "" msgstr ""
#: fields.py:1538 #: fields.py:1549
msgid "Value must be valid JSON." msgid "Value must be valid JSON."
msgstr "" msgstr ""
#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5 #: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit" msgid "Submit"
msgstr "" msgstr ""
#: pagination.py:189 #: filters.py:336
msgid "ascending"
msgstr ""
#: filters.py:337
msgid "descending"
msgstr ""
#: pagination.py:193
msgid "Invalid page." msgid "Invalid page."
msgstr "" msgstr ""
#: pagination.py:407 #: pagination.py:427
msgid "Invalid cursor" msgid "Invalid cursor"
msgstr "" msgstr ""
#: relations.py:207 #: relations.py:207
#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist." msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "" msgstr ""
#: relations.py:208 #: relations.py:208
#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}." msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "" msgstr ""
@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "" msgstr ""
#: relations.py:243 #: relations.py:243
#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}." msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "" msgstr ""
#: relations.py:402 #: relations.py:401
#, python-brace-format
msgid "Object with {slug_name}={value} does not exist." msgid "Object with {slug_name}={value} does not exist."
msgstr "" msgstr ""
#: relations.py:403 #: relations.py:402
msgid "Invalid value." msgid "Invalid value."
msgstr "" msgstr ""
#: serializers.py:326 #: serializers.py:326
#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}." msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "" msgstr ""
#: templates/rest_framework/admin.html:118 #: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128 #: templates/rest_framework/base.html:128
msgid "Filters" msgid "Filters"
msgstr "" msgstr ""
@ -412,27 +394,23 @@ msgstr ""
msgid "No items to select." msgid "No items to select."
msgstr "" msgstr ""
#: validators.py:24 #: validators.py:43
msgid "This field must be unique." msgid "This field must be unique."
msgstr "" msgstr ""
#: validators.py:78 #: validators.py:97
#, python-brace-format
msgid "The fields {field_names} must make a unique set." msgid "The fields {field_names} must make a unique set."
msgstr "" msgstr ""
#: validators.py:226 #: validators.py:245
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" date." msgid "This field must be unique for the \"{date_field}\" date."
msgstr "" msgstr ""
#: validators.py:241 #: validators.py:260
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" month." msgid "This field must be unique for the \"{date_field}\" month."
msgstr "" msgstr ""
#: validators.py:254 #: validators.py:273
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" year." msgid "This field must be unique for the \"{date_field}\" year."
msgstr "" msgstr ""
@ -440,15 +418,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header." msgid "Invalid version in \"Accept\" header."
msgstr "" msgstr ""
#: versioning.py:73 versioning.py:115 #: versioning.py:73
msgid "Invalid version in URL path." msgid "Invalid version in URL path."
msgstr "" msgstr ""
#: versioning.py:144 #: versioning.py:115
msgid "Invalid version in URL path. Does not match any version namespace."
msgstr ""
#: versioning.py:147
msgid "Invalid version in hostname." msgid "Invalid version in hostname."
msgstr "" msgstr ""
#: versioning.py:166 #: versioning.py:169
msgid "Invalid version in query parameter." msgid "Invalid version in query parameter."
msgstr "" msgstr ""

View File

@ -7,9 +7,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django REST framework\n" "Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-01 18:38+0100\n" "POT-Creation-Date: 2016-07-12 16:13+0100\n"
"PO-Revision-Date: 2016-03-01 17:38+0000\n" "PO-Revision-Date: 2016-07-12 15:14+0000\n"
"Last-Translator: Xavier Ordoquy <xordoquy@linovia.com>\n" "Last-Translator: Thomas Christie <tom@tomchristie.com>\n"
"Language-Team: English (Canada) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/en_CA/)\n" "Language-Team: English (Canada) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/en_CA/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -17,40 +17,40 @@ msgstr ""
"Language: en_CA\n" "Language: en_CA\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: authentication.py:71 #: authentication.py:73
msgid "Invalid basic header. No credentials provided." msgid "Invalid basic header. No credentials provided."
msgstr "" msgstr ""
#: authentication.py:74 #: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces." msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "" msgstr ""
#: authentication.py:80 #: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded." msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "" msgstr ""
#: authentication.py:97 #: authentication.py:99
msgid "Invalid username/password." msgid "Invalid username/password."
msgstr "" msgstr ""
#: authentication.py:100 authentication.py:195 #: authentication.py:102 authentication.py:198
msgid "User inactive or deleted." msgid "User inactive or deleted."
msgstr "" msgstr ""
#: authentication.py:173 #: authentication.py:176
msgid "Invalid token header. No credentials provided." msgid "Invalid token header. No credentials provided."
msgstr "" msgstr ""
#: authentication.py:176 #: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces." msgid "Invalid token header. Token string should not contain spaces."
msgstr "" msgstr ""
#: authentication.py:182 #: authentication.py:185
msgid "" msgid ""
"Invalid token header. Token string should not contain invalid characters." "Invalid token header. Token string should not contain invalid characters."
msgstr "" msgstr ""
#: authentication.py:192 #: authentication.py:195
msgid "Invalid token." msgid "Invalid token."
msgstr "" msgstr ""
@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token" msgid "Auth Token"
msgstr "" msgstr ""
#: authtoken/models.py:21 #: authtoken/models.py:15
msgid "Key" msgid "Key"
msgstr "" msgstr ""
#: authtoken/models.py:23 #: authtoken/models.py:18
msgid "User" msgid "User"
msgstr "" msgstr ""
#: authtoken/models.py:24 #: authtoken/models.py:20
msgid "Created" msgid "Created"
msgstr "" msgstr ""
#: authtoken/models.py:33 #: authtoken/models.py:29
msgid "Token" msgid "Token"
msgstr "" msgstr ""
#: authtoken/models.py:34 #: authtoken/models.py:30
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
@ -123,7 +123,6 @@ msgid "Not found."
msgstr "" msgstr ""
#: exceptions.py:109 #: exceptions.py:109
#, python-brace-format
msgid "Method \"{method}\" not allowed." msgid "Method \"{method}\" not allowed."
msgstr "" msgstr ""
@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "" msgstr ""
#: exceptions.py:132 #: exceptions.py:132
#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request." msgid "Unsupported media type \"{media_type}\" in request."
msgstr "" msgstr ""
@ -140,214 +138,201 @@ msgstr ""
msgid "Request was throttled." msgid "Request was throttled."
msgstr "" msgstr ""
#: fields.py:266 relations.py:206 relations.py:239 validators.py:79 #: fields.py:269 relations.py:206 relations.py:239 validators.py:98
#: validators.py:162 #: validators.py:181
msgid "This field is required." msgid "This field is required."
msgstr "" msgstr ""
#: fields.py:267 #: fields.py:270
msgid "This field may not be null." msgid "This field may not be null."
msgstr "" msgstr ""
#: fields.py:603 fields.py:634 #: fields.py:608 fields.py:639
#, python-brace-format
msgid "\"{input}\" is not a valid boolean." msgid "\"{input}\" is not a valid boolean."
msgstr "" msgstr ""
#: fields.py:669 #: fields.py:674
msgid "This field may not be blank." msgid "This field may not be blank."
msgstr "" msgstr ""
#: fields.py:670 fields.py:1664 #: fields.py:675 fields.py:1675
#, python-brace-format
msgid "Ensure this field has no more than {max_length} characters." msgid "Ensure this field has no more than {max_length} characters."
msgstr "" msgstr ""
#: fields.py:671 #: fields.py:676
#, python-brace-format
msgid "Ensure this field has at least {min_length} characters." msgid "Ensure this field has at least {min_length} characters."
msgstr "" msgstr ""
#: fields.py:708 #: fields.py:713
msgid "Enter a valid email address." msgid "Enter a valid email address."
msgstr "" msgstr ""
#: fields.py:719 #: fields.py:724
msgid "This value does not match the required pattern." msgid "This value does not match the required pattern."
msgstr "" msgstr ""
#: fields.py:730 #: fields.py:735
msgid "" msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or " "Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens." "hyphens."
msgstr "" msgstr ""
#: fields.py:742 #: fields.py:747
msgid "Enter a valid URL." msgid "Enter a valid URL."
msgstr "" msgstr ""
#: fields.py:755 #: fields.py:760
#, python-brace-format
msgid "\"{value}\" is not a valid UUID." msgid "\"{value}\" is not a valid UUID."
msgstr "" msgstr ""
#: fields.py:791 #: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address." msgid "Enter a valid IPv4 or IPv6 address."
msgstr "" msgstr ""
#: fields.py:816 #: fields.py:821
msgid "A valid integer is required." msgid "A valid integer is required."
msgstr "" msgstr ""
#: fields.py:817 fields.py:852 fields.py:885 #: fields.py:822 fields.py:857 fields.py:891
#, python-brace-format
msgid "Ensure this value is less than or equal to {max_value}." msgid "Ensure this value is less than or equal to {max_value}."
msgstr "" msgstr ""
#: fields.py:818 fields.py:853 fields.py:886 #: fields.py:823 fields.py:858 fields.py:892
#, python-brace-format
msgid "Ensure this value is greater than or equal to {min_value}." msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "" msgstr ""
#: fields.py:819 fields.py:854 fields.py:890 #: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large." msgid "String value too large."
msgstr "" msgstr ""
#: fields.py:851 fields.py:884 #: fields.py:856 fields.py:890
msgid "A valid number is required." msgid "A valid number is required."
msgstr "" msgstr ""
#: fields.py:887 #: fields.py:893
#, python-brace-format
msgid "Ensure that there are no more than {max_digits} digits in total." msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "" msgstr ""
#: fields.py:888 #: fields.py:894
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places." "Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "" msgstr ""
#: fields.py:889 #: fields.py:895
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the " "Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point." "decimal point."
msgstr "" msgstr ""
#: fields.py:1004 #: fields.py:1025
#, python-brace-format
msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1005 #: fields.py:1026
msgid "Expected a datetime but got a date." msgid "Expected a datetime but got a date."
msgstr "" msgstr ""
#: fields.py:1082 #: fields.py:1103
#, python-brace-format
msgid "Date has wrong format. Use one of these formats instead: {format}." msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1083 #: fields.py:1104
msgid "Expected a date but got a datetime." msgid "Expected a date but got a datetime."
msgstr "" msgstr ""
#: fields.py:1151 #: fields.py:1170
#, python-brace-format
msgid "Time has wrong format. Use one of these formats instead: {format}." msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1215 #: fields.py:1232
#, python-brace-format
msgid "Duration has wrong format. Use one of these formats instead: {format}." msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1240 fields.py:1289 #: fields.py:1251 fields.py:1300
#, python-brace-format
msgid "\"{input}\" is not a valid choice." msgid "\"{input}\" is not a valid choice."
msgstr "" msgstr ""
#: fields.py:1243 relations.py:71 relations.py:442 #: fields.py:1254 relations.py:71 relations.py:441
#, python-brace-format
msgid "More than {count} items..." msgid "More than {count} items..."
msgstr "" msgstr ""
#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520 #: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
#, python-brace-format
msgid "Expected a list of items but got type \"{input_type}\"." msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "" msgstr ""
#: fields.py:1291 #: fields.py:1302
msgid "This selection may not be empty." msgid "This selection may not be empty."
msgstr "" msgstr ""
#: fields.py:1328 #: fields.py:1339
#, python-brace-format
msgid "\"{input}\" is not a valid path choice." msgid "\"{input}\" is not a valid path choice."
msgstr "" msgstr ""
#: fields.py:1347 #: fields.py:1358
msgid "No file was submitted." msgid "No file was submitted."
msgstr "" msgstr ""
#: fields.py:1348 #: fields.py:1359
msgid "" msgid ""
"The submitted data was not a file. Check the encoding type on the form." "The submitted data was not a file. Check the encoding type on the form."
msgstr "" msgstr ""
#: fields.py:1349 #: fields.py:1360
msgid "No filename could be determined." msgid "No filename could be determined."
msgstr "" msgstr ""
#: fields.py:1350 #: fields.py:1361
msgid "The submitted file is empty." msgid "The submitted file is empty."
msgstr "" msgstr ""
#: fields.py:1351 #: fields.py:1362
#, python-brace-format
msgid "" msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})." "Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "" msgstr ""
#: fields.py:1399 #: fields.py:1410
msgid "" msgid ""
"Upload a valid image. The file you uploaded was either not an image or a " "Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image." "corrupted image."
msgstr "" msgstr ""
#: fields.py:1438 relations.py:439 serializers.py:521 #: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty." msgid "This list may not be empty."
msgstr "" msgstr ""
#: fields.py:1491 #: fields.py:1502
#, python-brace-format
msgid "Expected a dictionary of items but got type \"{input_type}\"." msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "" msgstr ""
#: fields.py:1538 #: fields.py:1549
msgid "Value must be valid JSON." msgid "Value must be valid JSON."
msgstr "" msgstr ""
#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5 #: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit" msgid "Submit"
msgstr "" msgstr ""
#: pagination.py:189 #: filters.py:336
msgid "ascending"
msgstr ""
#: filters.py:337
msgid "descending"
msgstr ""
#: pagination.py:193
msgid "Invalid page." msgid "Invalid page."
msgstr "" msgstr ""
#: pagination.py:407 #: pagination.py:427
msgid "Invalid cursor" msgid "Invalid cursor"
msgstr "" msgstr ""
#: relations.py:207 #: relations.py:207
#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist." msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "" msgstr ""
#: relations.py:208 #: relations.py:208
#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}." msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "" msgstr ""
@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "" msgstr ""
#: relations.py:243 #: relations.py:243
#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}." msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "" msgstr ""
#: relations.py:402 #: relations.py:401
#, python-brace-format
msgid "Object with {slug_name}={value} does not exist." msgid "Object with {slug_name}={value} does not exist."
msgstr "" msgstr ""
#: relations.py:403 #: relations.py:402
msgid "Invalid value." msgid "Invalid value."
msgstr "" msgstr ""
#: serializers.py:326 #: serializers.py:326
#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}." msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "" msgstr ""
#: templates/rest_framework/admin.html:118 #: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128 #: templates/rest_framework/base.html:128
msgid "Filters" msgid "Filters"
msgstr "" msgstr ""
@ -412,27 +394,23 @@ msgstr ""
msgid "No items to select." msgid "No items to select."
msgstr "" msgstr ""
#: validators.py:24 #: validators.py:43
msgid "This field must be unique." msgid "This field must be unique."
msgstr "" msgstr ""
#: validators.py:78 #: validators.py:97
#, python-brace-format
msgid "The fields {field_names} must make a unique set." msgid "The fields {field_names} must make a unique set."
msgstr "" msgstr ""
#: validators.py:226 #: validators.py:245
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" date." msgid "This field must be unique for the \"{date_field}\" date."
msgstr "" msgstr ""
#: validators.py:241 #: validators.py:260
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" month." msgid "This field must be unique for the \"{date_field}\" month."
msgstr "" msgstr ""
#: validators.py:254 #: validators.py:273
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" year." msgid "This field must be unique for the \"{date_field}\" year."
msgstr "" msgstr ""
@ -440,15 +418,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header." msgid "Invalid version in \"Accept\" header."
msgstr "" msgstr ""
#: versioning.py:73 versioning.py:115 #: versioning.py:73
msgid "Invalid version in URL path." msgid "Invalid version in URL path."
msgstr "" msgstr ""
#: versioning.py:144 #: versioning.py:115
msgid "Invalid version in URL path. Does not match any version namespace."
msgstr ""
#: versioning.py:147
msgid "Invalid version in hostname." msgid "Invalid version in hostname."
msgstr "" msgstr ""
#: versioning.py:166 #: versioning.py:169
msgid "Invalid version in query parameter." msgid "Invalid version in query parameter."
msgstr "" msgstr ""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-01 18:38+0100\n" "POT-Creation-Date: 2016-07-12 16:13+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -17,40 +17,40 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: authentication.py:71 #: authentication.py:73
msgid "Invalid basic header. No credentials provided." msgid "Invalid basic header. No credentials provided."
msgstr "" msgstr ""
#: authentication.py:74 #: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces." msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "" msgstr ""
#: authentication.py:80 #: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded." msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "" msgstr ""
#: authentication.py:97 #: authentication.py:99
msgid "Invalid username/password." msgid "Invalid username/password."
msgstr "" msgstr ""
#: authentication.py:100 authentication.py:195 #: authentication.py:102 authentication.py:198
msgid "User inactive or deleted." msgid "User inactive or deleted."
msgstr "" msgstr ""
#: authentication.py:173 #: authentication.py:176
msgid "Invalid token header. No credentials provided." msgid "Invalid token header. No credentials provided."
msgstr "" msgstr ""
#: authentication.py:176 #: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces." msgid "Invalid token header. Token string should not contain spaces."
msgstr "" msgstr ""
#: authentication.py:182 #: authentication.py:185
msgid "" msgid ""
"Invalid token header. Token string should not contain invalid characters." "Invalid token header. Token string should not contain invalid characters."
msgstr "" msgstr ""
#: authentication.py:192 #: authentication.py:195
msgid "Invalid token." msgid "Invalid token."
msgstr "" msgstr ""
@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token" msgid "Auth Token"
msgstr "" msgstr ""
#: authtoken/models.py:21 #: authtoken/models.py:15
msgid "Key" msgid "Key"
msgstr "" msgstr ""
#: authtoken/models.py:23 #: authtoken/models.py:18
msgid "User" msgid "User"
msgstr "" msgstr ""
#: authtoken/models.py:24 #: authtoken/models.py:20
msgid "Created" msgid "Created"
msgstr "" msgstr ""
#: authtoken/models.py:33 #: authtoken/models.py:29
msgid "Token" msgid "Token"
msgstr "" msgstr ""
#: authtoken/models.py:34 #: authtoken/models.py:30
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
@ -123,7 +123,6 @@ msgid "Not found."
msgstr "" msgstr ""
#: exceptions.py:109 #: exceptions.py:109
#, python-brace-format
msgid "Method \"{method}\" not allowed." msgid "Method \"{method}\" not allowed."
msgstr "" msgstr ""
@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "" msgstr ""
#: exceptions.py:132 #: exceptions.py:132
#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request." msgid "Unsupported media type \"{media_type}\" in request."
msgstr "" msgstr ""
@ -140,212 +138,199 @@ msgstr ""
msgid "Request was throttled." msgid "Request was throttled."
msgstr "" msgstr ""
#: fields.py:266 relations.py:206 relations.py:239 validators.py:79 #: fields.py:269 relations.py:206 relations.py:239 validators.py:98
#: validators.py:162 #: validators.py:181
msgid "This field is required." msgid "This field is required."
msgstr "" msgstr ""
#: fields.py:267 #: fields.py:270
msgid "This field may not be null." msgid "This field may not be null."
msgstr "" msgstr ""
#: fields.py:603 fields.py:634 #: fields.py:608 fields.py:639
#, python-brace-format
msgid "\"{input}\" is not a valid boolean." msgid "\"{input}\" is not a valid boolean."
msgstr "" msgstr ""
#: fields.py:669 #: fields.py:674
msgid "This field may not be blank." msgid "This field may not be blank."
msgstr "" msgstr ""
#: fields.py:670 fields.py:1664 #: fields.py:675 fields.py:1675
#, python-brace-format
msgid "Ensure this field has no more than {max_length} characters." msgid "Ensure this field has no more than {max_length} characters."
msgstr "" msgstr ""
#: fields.py:671 #: fields.py:676
#, python-brace-format
msgid "Ensure this field has at least {min_length} characters." msgid "Ensure this field has at least {min_length} characters."
msgstr "" msgstr ""
#: fields.py:708 #: fields.py:713
msgid "Enter a valid email address." msgid "Enter a valid email address."
msgstr "" msgstr ""
#: fields.py:719 #: fields.py:724
msgid "This value does not match the required pattern." msgid "This value does not match the required pattern."
msgstr "" msgstr ""
#: fields.py:730 #: fields.py:735
msgid "" msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or " "Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens." "hyphens."
msgstr "" msgstr ""
#: fields.py:742 #: fields.py:747
msgid "Enter a valid URL." msgid "Enter a valid URL."
msgstr "" msgstr ""
#: fields.py:755 #: fields.py:760
#, python-brace-format
msgid "\"{value}\" is not a valid UUID." msgid "\"{value}\" is not a valid UUID."
msgstr "" msgstr ""
#: fields.py:791 #: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address." msgid "Enter a valid IPv4 or IPv6 address."
msgstr "" msgstr ""
#: fields.py:816 #: fields.py:821
msgid "A valid integer is required." msgid "A valid integer is required."
msgstr "" msgstr ""
#: fields.py:817 fields.py:852 fields.py:885 #: fields.py:822 fields.py:857 fields.py:891
#, python-brace-format
msgid "Ensure this value is less than or equal to {max_value}." msgid "Ensure this value is less than or equal to {max_value}."
msgstr "" msgstr ""
#: fields.py:818 fields.py:853 fields.py:886 #: fields.py:823 fields.py:858 fields.py:892
#, python-brace-format
msgid "Ensure this value is greater than or equal to {min_value}." msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "" msgstr ""
#: fields.py:819 fields.py:854 fields.py:890 #: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large." msgid "String value too large."
msgstr "" msgstr ""
#: fields.py:851 fields.py:884 #: fields.py:856 fields.py:890
msgid "A valid number is required." msgid "A valid number is required."
msgstr "" msgstr ""
#: fields.py:887 #: fields.py:893
#, python-brace-format
msgid "Ensure that there are no more than {max_digits} digits in total." msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "" msgstr ""
#: fields.py:888 #: fields.py:894
#, python-brace-format
msgid "Ensure that there are no more than {max_decimal_places} decimal places." msgid "Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "" msgstr ""
#: fields.py:889 #: fields.py:895
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the " "Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point." "decimal point."
msgstr "" msgstr ""
#: fields.py:1004 #: fields.py:1025
#, python-brace-format
msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1005 #: fields.py:1026
msgid "Expected a datetime but got a date." msgid "Expected a datetime but got a date."
msgstr "" msgstr ""
#: fields.py:1082 #: fields.py:1103
#, python-brace-format
msgid "Date has wrong format. Use one of these formats instead: {format}." msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1083 #: fields.py:1104
msgid "Expected a date but got a datetime." msgid "Expected a date but got a datetime."
msgstr "" msgstr ""
#: fields.py:1151 #: fields.py:1170
#, python-brace-format
msgid "Time has wrong format. Use one of these formats instead: {format}." msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1215 #: fields.py:1232
#, python-brace-format
msgid "Duration has wrong format. Use one of these formats instead: {format}." msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1240 fields.py:1289 #: fields.py:1251 fields.py:1300
#, python-brace-format
msgid "\"{input}\" is not a valid choice." msgid "\"{input}\" is not a valid choice."
msgstr "" msgstr ""
#: fields.py:1243 relations.py:71 relations.py:442 #: fields.py:1254 relations.py:71 relations.py:441
#, python-brace-format
msgid "More than {count} items..." msgid "More than {count} items..."
msgstr "" msgstr ""
#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520 #: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
#, python-brace-format
msgid "Expected a list of items but got type \"{input_type}\"." msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "" msgstr ""
#: fields.py:1291 #: fields.py:1302
msgid "This selection may not be empty." msgid "This selection may not be empty."
msgstr "" msgstr ""
#: fields.py:1328 #: fields.py:1339
#, python-brace-format
msgid "\"{input}\" is not a valid path choice." msgid "\"{input}\" is not a valid path choice."
msgstr "" msgstr ""
#: fields.py:1347 #: fields.py:1358
msgid "No file was submitted." msgid "No file was submitted."
msgstr "" msgstr ""
#: fields.py:1348 #: fields.py:1359
msgid "The submitted data was not a file. Check the encoding type on the form." msgid "The submitted data was not a file. Check the encoding type on the form."
msgstr "" msgstr ""
#: fields.py:1349 #: fields.py:1360
msgid "No filename could be determined." msgid "No filename could be determined."
msgstr "" msgstr ""
#: fields.py:1350 #: fields.py:1361
msgid "The submitted file is empty." msgid "The submitted file is empty."
msgstr "" msgstr ""
#: fields.py:1351 #: fields.py:1362
#, python-brace-format
msgid "" msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})." "Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "" msgstr ""
#: fields.py:1399 #: fields.py:1410
msgid "" msgid ""
"Upload a valid image. The file you uploaded was either not an image or a " "Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image." "corrupted image."
msgstr "" msgstr ""
#: fields.py:1438 relations.py:439 serializers.py:521 #: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty." msgid "This list may not be empty."
msgstr "" msgstr ""
#: fields.py:1491 #: fields.py:1502
#, python-brace-format
msgid "Expected a dictionary of items but got type \"{input_type}\"." msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "" msgstr ""
#: fields.py:1538 #: fields.py:1549
msgid "Value must be valid JSON." msgid "Value must be valid JSON."
msgstr "" msgstr ""
#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5 #: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit" msgid "Submit"
msgstr "" msgstr ""
#: pagination.py:189 #: filters.py:336
msgid "ascending"
msgstr ""
#: filters.py:337
msgid "descending"
msgstr ""
#: pagination.py:193
msgid "Invalid page." msgid "Invalid page."
msgstr "" msgstr ""
#: pagination.py:407 #: pagination.py:427
msgid "Invalid cursor" msgid "Invalid cursor"
msgstr "" msgstr ""
#: relations.py:207 #: relations.py:207
#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist." msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "" msgstr ""
#: relations.py:208 #: relations.py:208
#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}." msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "" msgstr ""
@ -362,25 +347,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "" msgstr ""
#: relations.py:243 #: relations.py:243
#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}." msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "" msgstr ""
#: relations.py:402 #: relations.py:401
#, python-brace-format
msgid "Object with {slug_name}={value} does not exist." msgid "Object with {slug_name}={value} does not exist."
msgstr "" msgstr ""
#: relations.py:403 #: relations.py:402
msgid "Invalid value." msgid "Invalid value."
msgstr "" msgstr ""
#: serializers.py:326 #: serializers.py:326
#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}." msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "" msgstr ""
#: templates/rest_framework/admin.html:118 #: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128 #: templates/rest_framework/base.html:128
msgid "Filters" msgid "Filters"
msgstr "" msgstr ""
@ -410,27 +392,23 @@ msgstr ""
msgid "No items to select." msgid "No items to select."
msgstr "" msgstr ""
#: validators.py:24 #: validators.py:43
msgid "This field must be unique." msgid "This field must be unique."
msgstr "" msgstr ""
#: validators.py:78 #: validators.py:97
#, python-brace-format
msgid "The fields {field_names} must make a unique set." msgid "The fields {field_names} must make a unique set."
msgstr "" msgstr ""
#: validators.py:226 #: validators.py:245
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" date." msgid "This field must be unique for the \"{date_field}\" date."
msgstr "" msgstr ""
#: validators.py:241 #: validators.py:260
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" month." msgid "This field must be unique for the \"{date_field}\" month."
msgstr "" msgstr ""
#: validators.py:254 #: validators.py:273
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" year." msgid "This field must be unique for the \"{date_field}\" year."
msgstr "" msgstr ""
@ -438,15 +416,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header." msgid "Invalid version in \"Accept\" header."
msgstr "" msgstr ""
#: versioning.py:73 versioning.py:115 #: versioning.py:73
msgid "Invalid version in URL path." msgid "Invalid version in URL path."
msgstr "" msgstr ""
#: versioning.py:144 #: versioning.py:115
msgid "Invalid version in URL path. Does not match any version namespace."
msgstr ""
#: versioning.py:147
msgid "Invalid version in hostname." msgid "Invalid version in hostname."
msgstr "" msgstr ""
#: versioning.py:166 #: versioning.py:169
msgid "Invalid version in query parameter." msgid "Invalid version in query parameter."
msgstr "" msgstr ""

View File

@ -3,18 +3,18 @@
# This file is distributed under the same license as the PACKAGE package. # This file is distributed under the same license as the PACKAGE package.
# #
# Translators: # Translators:
# nnrcschmdt <e.rico.schmidt@gmail.com>, 2015 # Ernesto Rico-Schmidt <e.rico.schmidt@gmail.com>, 2015
# José Padilla <jpadilla@webapplicate.com>, 2015 # José Padilla <jpadilla@webapplicate.com>, 2015
# Miguel González <migonzalvar@gmail.com>, 2015 # Miguel Gonzalez <migonzalvar@gmail.com>, 2015
# Miguel González <migonzalvar@gmail.com>, 2015-2016 # Miguel Gonzalez <migonzalvar@gmail.com>, 2015-2016
# Sergio Infante <rsinfante@gmail.com>, 2015 # Sergio Infante <rsinfante@gmail.com>, 2015
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django REST framework\n" "Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-01 18:38+0100\n" "POT-Creation-Date: 2016-07-12 16:13+0100\n"
"PO-Revision-Date: 2016-03-01 18:16+0000\n" "PO-Revision-Date: 2016-07-12 15:14+0000\n"
"Last-Translator: Miguel González <migonzalvar@gmail.com>\n" "Last-Translator: Thomas Christie <tom@tomchristie.com>\n"
"Language-Team: Spanish (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/es/)\n" "Language-Team: Spanish (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/es/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -22,40 +22,40 @@ msgstr ""
"Language: es\n" "Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: authentication.py:71 #: authentication.py:73
msgid "Invalid basic header. No credentials provided." msgid "Invalid basic header. No credentials provided."
msgstr "Cabecera básica inválida. Las credenciales no fueron suministradas." msgstr "Cabecera básica inválida. Las credenciales no fueron suministradas."
#: authentication.py:74 #: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces." msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "Cabecera básica inválida. La cadena con las credenciales no debe contener espacios." msgstr "Cabecera básica inválida. La cadena con las credenciales no debe contener espacios."
#: authentication.py:80 #: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded." msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "Cabecera básica inválida. Las credenciales incorrectamente codificadas en base64." msgstr "Cabecera básica inválida. Las credenciales incorrectamente codificadas en base64."
#: authentication.py:97 #: authentication.py:99
msgid "Invalid username/password." msgid "Invalid username/password."
msgstr "Nombre de usuario/contraseña inválidos." msgstr "Nombre de usuario/contraseña inválidos."
#: authentication.py:100 authentication.py:195 #: authentication.py:102 authentication.py:198
msgid "User inactive or deleted." msgid "User inactive or deleted."
msgstr "Usuario inactivo o borrado." msgstr "Usuario inactivo o borrado."
#: authentication.py:173 #: authentication.py:176
msgid "Invalid token header. No credentials provided." msgid "Invalid token header. No credentials provided."
msgstr "Cabecera token inválida. Las credenciales no fueron suministradas." msgstr "Cabecera token inválida. Las credenciales no fueron suministradas."
#: authentication.py:176 #: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces." msgid "Invalid token header. Token string should not contain spaces."
msgstr "Cabecera token inválida. La cadena token no debe contener espacios." msgstr "Cabecera token inválida. La cadena token no debe contener espacios."
#: authentication.py:182 #: authentication.py:185
msgid "" msgid ""
"Invalid token header. Token string should not contain invalid characters." "Invalid token header. Token string should not contain invalid characters."
msgstr "Cabecera token inválida. La cadena token no debe contener caracteres inválidos." msgstr "Cabecera token inválida. La cadena token no debe contener caracteres inválidos."
#: authentication.py:192 #: authentication.py:195
msgid "Invalid token." msgid "Invalid token."
msgstr "Token inválido." msgstr "Token inválido."
@ -63,23 +63,23 @@ msgstr "Token inválido."
msgid "Auth Token" msgid "Auth Token"
msgstr "Token de autenticación" msgstr "Token de autenticación"
#: authtoken/models.py:21 #: authtoken/models.py:15
msgid "Key" msgid "Key"
msgstr "Clave" msgstr "Clave"
#: authtoken/models.py:23 #: authtoken/models.py:18
msgid "User" msgid "User"
msgstr "Usuario" msgstr "Usuario"
#: authtoken/models.py:24 #: authtoken/models.py:20
msgid "Created" msgid "Created"
msgstr "Fecha de creación" msgstr "Fecha de creación"
#: authtoken/models.py:33 #: authtoken/models.py:29
msgid "Token" msgid "Token"
msgstr "Token" msgstr "Token"
#: authtoken/models.py:34 #: authtoken/models.py:30
msgid "Tokens" msgid "Tokens"
msgstr "Tokens" msgstr "Tokens"
@ -128,7 +128,6 @@ msgid "Not found."
msgstr "No encontrado." msgstr "No encontrado."
#: exceptions.py:109 #: exceptions.py:109
#, python-brace-format
msgid "Method \"{method}\" not allowed." msgid "Method \"{method}\" not allowed."
msgstr "Método \"{method}\" no permitido." msgstr "Método \"{method}\" no permitido."
@ -137,7 +136,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "No se ha podido satisfacer la solicitud de cabecera de Accept." msgstr "No se ha podido satisfacer la solicitud de cabecera de Accept."
#: exceptions.py:132 #: exceptions.py:132
#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request." msgid "Unsupported media type \"{media_type}\" in request."
msgstr "Tipo de medio \"{media_type}\" incompatible en la solicitud." msgstr "Tipo de medio \"{media_type}\" incompatible en la solicitud."
@ -145,214 +143,201 @@ msgstr "Tipo de medio \"{media_type}\" incompatible en la solicitud."
msgid "Request was throttled." msgid "Request was throttled."
msgstr "Solicitud fue regulada (throttled)." msgstr "Solicitud fue regulada (throttled)."
#: fields.py:266 relations.py:206 relations.py:239 validators.py:79 #: fields.py:269 relations.py:206 relations.py:239 validators.py:98
#: validators.py:162 #: validators.py:181
msgid "This field is required." msgid "This field is required."
msgstr "Este campo es requerido." msgstr "Este campo es requerido."
#: fields.py:267 #: fields.py:270
msgid "This field may not be null." msgid "This field may not be null."
msgstr "Este campo no puede ser nulo." msgstr "Este campo no puede ser nulo."
#: fields.py:603 fields.py:634 #: fields.py:608 fields.py:639
#, python-brace-format
msgid "\"{input}\" is not a valid boolean." msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" no es un booleano válido." msgstr "\"{input}\" no es un booleano válido."
#: fields.py:669 #: fields.py:674
msgid "This field may not be blank." msgid "This field may not be blank."
msgstr "Este campo no puede estar en blanco." msgstr "Este campo no puede estar en blanco."
#: fields.py:670 fields.py:1664 #: fields.py:675 fields.py:1675
#, python-brace-format
msgid "Ensure this field has no more than {max_length} characters." msgid "Ensure this field has no more than {max_length} characters."
msgstr "Asegúrese de que este campo no tenga más de {max_length} caracteres." msgstr "Asegúrese de que este campo no tenga más de {max_length} caracteres."
#: fields.py:671 #: fields.py:676
#, python-brace-format
msgid "Ensure this field has at least {min_length} characters." msgid "Ensure this field has at least {min_length} characters."
msgstr "Asegúrese de que este campo tenga al menos {min_length} caracteres." msgstr "Asegúrese de que este campo tenga al menos {min_length} caracteres."
#: fields.py:708 #: fields.py:713
msgid "Enter a valid email address." msgid "Enter a valid email address."
msgstr "Introduzca una dirección de correo electrónico válida." msgstr "Introduzca una dirección de correo electrónico válida."
#: fields.py:719 #: fields.py:724
msgid "This value does not match the required pattern." msgid "This value does not match the required pattern."
msgstr "Este valor no coincide con el patrón requerido." msgstr "Este valor no coincide con el patrón requerido."
#: fields.py:730 #: fields.py:735
msgid "" msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or " "Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens." "hyphens."
msgstr "Introduzca un \"slug\" válido consistente en letras, números, guiones o guiones bajos." msgstr "Introduzca un \"slug\" válido consistente en letras, números, guiones o guiones bajos."
#: fields.py:742 #: fields.py:747
msgid "Enter a valid URL." msgid "Enter a valid URL."
msgstr "Introduzca una URL válida." msgstr "Introduzca una URL válida."
#: fields.py:755 #: fields.py:760
#, python-brace-format
msgid "\"{value}\" is not a valid UUID." msgid "\"{value}\" is not a valid UUID."
msgstr "\"{value}\" no es un UUID válido." msgstr "\"{value}\" no es un UUID válido."
#: fields.py:791 #: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address." msgid "Enter a valid IPv4 or IPv6 address."
msgstr "Introduzca una dirección IPv4 o IPv6 válida." msgstr "Introduzca una dirección IPv4 o IPv6 válida."
#: fields.py:816 #: fields.py:821
msgid "A valid integer is required." msgid "A valid integer is required."
msgstr "Introduzca un número entero válido." msgstr "Introduzca un número entero válido."
#: fields.py:817 fields.py:852 fields.py:885 #: fields.py:822 fields.py:857 fields.py:891
#, python-brace-format
msgid "Ensure this value is less than or equal to {max_value}." msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Asegúrese de que este valor es menor o igual a {max_value}." msgstr "Asegúrese de que este valor es menor o igual a {max_value}."
#: fields.py:818 fields.py:853 fields.py:886 #: fields.py:823 fields.py:858 fields.py:892
#, python-brace-format
msgid "Ensure this value is greater than or equal to {min_value}." msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Asegúrese de que este valor es mayor o igual a {min_value}." msgstr "Asegúrese de que este valor es mayor o igual a {min_value}."
#: fields.py:819 fields.py:854 fields.py:890 #: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large." msgid "String value too large."
msgstr "Cadena demasiado larga." msgstr "Cadena demasiado larga."
#: fields.py:851 fields.py:884 #: fields.py:856 fields.py:890
msgid "A valid number is required." msgid "A valid number is required."
msgstr "Se requiere un número válido." msgstr "Se requiere un número válido."
#: fields.py:887 #: fields.py:893
#, python-brace-format
msgid "Ensure that there are no more than {max_digits} digits in total." msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "Asegúrese de que no haya más de {max_digits} dígitos en total." msgstr "Asegúrese de que no haya más de {max_digits} dígitos en total."
#: fields.py:888 #: fields.py:894
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places." "Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "Asegúrese de que no haya más de {max_decimal_places} decimales." msgstr "Asegúrese de que no haya más de {max_decimal_places} decimales."
#: fields.py:889 #: fields.py:895
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the " "Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point." "decimal point."
msgstr "Asegúrese de que no haya más de {max_whole_digits} dígitos en la parte entera." msgstr "Asegúrese de que no haya más de {max_whole_digits} dígitos en la parte entera."
#: fields.py:1004 #: fields.py:1025
#, python-brace-format
msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "Fecha/hora con formato erróneo. Use uno de los siguientes formatos en su lugar: {format}." msgstr "Fecha/hora con formato erróneo. Use uno de los siguientes formatos en su lugar: {format}."
#: fields.py:1005 #: fields.py:1026
msgid "Expected a datetime but got a date." msgid "Expected a datetime but got a date."
msgstr "Se esperaba un fecha/hora en vez de una fecha." msgstr "Se esperaba un fecha/hora en vez de una fecha."
#: fields.py:1082 #: fields.py:1103
#, python-brace-format
msgid "Date has wrong format. Use one of these formats instead: {format}." msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "Fecha con formato erróneo. Use uno de los siguientes formatos en su lugar: {format}." msgstr "Fecha con formato erróneo. Use uno de los siguientes formatos en su lugar: {format}."
#: fields.py:1083 #: fields.py:1104
msgid "Expected a date but got a datetime." msgid "Expected a date but got a datetime."
msgstr "Se esperaba una fecha en vez de una fecha/hora." msgstr "Se esperaba una fecha en vez de una fecha/hora."
#: fields.py:1151 #: fields.py:1170
#, python-brace-format
msgid "Time has wrong format. Use one of these formats instead: {format}." msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "Hora con formato erróneo. Use uno de los siguientes formatos en su lugar: {format}." msgstr "Hora con formato erróneo. Use uno de los siguientes formatos en su lugar: {format}."
#: fields.py:1215 #: fields.py:1232
#, python-brace-format
msgid "Duration has wrong format. Use one of these formats instead: {format}." msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "Duración con formato erróneo. Use uno de los siguientes formatos en su lugar: {format}." msgstr "Duración con formato erróneo. Use uno de los siguientes formatos en su lugar: {format}."
#: fields.py:1240 fields.py:1289 #: fields.py:1251 fields.py:1300
#, python-brace-format
msgid "\"{input}\" is not a valid choice." msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" no es una elección válida." msgstr "\"{input}\" no es una elección válida."
#: fields.py:1243 relations.py:71 relations.py:442 #: fields.py:1254 relations.py:71 relations.py:441
#, python-brace-format
msgid "More than {count} items..." msgid "More than {count} items..."
msgstr "Más de {count} elementos..." msgstr "Más de {count} elementos..."
#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520 #: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
#, python-brace-format
msgid "Expected a list of items but got type \"{input_type}\"." msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "Se esperaba una lista de elementos en vez del tipo \"{input_type}\"." msgstr "Se esperaba una lista de elementos en vez del tipo \"{input_type}\"."
#: fields.py:1291 #: fields.py:1302
msgid "This selection may not be empty." msgid "This selection may not be empty."
msgstr "Esta selección no puede estar vacía." msgstr "Esta selección no puede estar vacía."
#: fields.py:1328 #: fields.py:1339
#, python-brace-format
msgid "\"{input}\" is not a valid path choice." msgid "\"{input}\" is not a valid path choice."
msgstr "\"{input}\" no es una elección de ruta válida." msgstr "\"{input}\" no es una elección de ruta válida."
#: fields.py:1347 #: fields.py:1358
msgid "No file was submitted." msgid "No file was submitted."
msgstr "No se envió ningún archivo." msgstr "No se envió ningún archivo."
#: fields.py:1348 #: fields.py:1359
msgid "" msgid ""
"The submitted data was not a file. Check the encoding type on the form." "The submitted data was not a file. Check the encoding type on the form."
msgstr "La información enviada no era un archivo. Compruebe el tipo de codificación del formulario." msgstr "La información enviada no era un archivo. Compruebe el tipo de codificación del formulario."
#: fields.py:1349 #: fields.py:1360
msgid "No filename could be determined." msgid "No filename could be determined."
msgstr "No se pudo determinar un nombre de archivo." msgstr "No se pudo determinar un nombre de archivo."
#: fields.py:1350 #: fields.py:1361
msgid "The submitted file is empty." msgid "The submitted file is empty."
msgstr "El archivo enviado está vació." msgstr "El archivo enviado está vació."
#: fields.py:1351 #: fields.py:1362
#, python-brace-format
msgid "" msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})." "Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "Asegúrese de que el nombre de archivo no tenga más de {max_length} caracteres (tiene {length})." msgstr "Asegúrese de que el nombre de archivo no tenga más de {max_length} caracteres (tiene {length})."
#: fields.py:1399 #: fields.py:1410
msgid "" msgid ""
"Upload a valid image. The file you uploaded was either not an image or a " "Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image." "corrupted image."
msgstr "Adjunte una imagen válida. El archivo adjunto o bien no es una imagen o bien está dañado." msgstr "Adjunte una imagen válida. El archivo adjunto o bien no es una imagen o bien está dañado."
#: fields.py:1438 relations.py:439 serializers.py:521 #: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty." msgid "This list may not be empty."
msgstr "Esta lista no puede estar vacía." msgstr "Esta lista no puede estar vacía."
#: fields.py:1491 #: fields.py:1502
#, python-brace-format
msgid "Expected a dictionary of items but got type \"{input_type}\"." msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "Se esperaba un diccionario de elementos en vez del tipo \"{input_type}\"." msgstr "Se esperaba un diccionario de elementos en vez del tipo \"{input_type}\"."
#: fields.py:1538 #: fields.py:1549
msgid "Value must be valid JSON." msgid "Value must be valid JSON."
msgstr "El valor debe ser JSON válido." msgstr "El valor debe ser JSON válido."
#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5 #: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit" msgid "Submit"
msgstr "Enviar" msgstr "Enviar"
#: pagination.py:189 #: filters.py:336
msgid "ascending"
msgstr ""
#: filters.py:337
msgid "descending"
msgstr ""
#: pagination.py:193
msgid "Invalid page." msgid "Invalid page."
msgstr "Página inválida." msgstr "Página inválida."
#: pagination.py:407 #: pagination.py:427
msgid "Invalid cursor" msgid "Invalid cursor"
msgstr "Cursor inválido" msgstr "Cursor inválido"
#: relations.py:207 #: relations.py:207
#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist." msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "Clave primaria \"{pk_value}\" inválida - objeto no existe." msgstr "Clave primaria \"{pk_value}\" inválida - objeto no existe."
#: relations.py:208 #: relations.py:208
#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}." msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Tipo incorrecto. Se esperaba valor de clave primaria y se recibió {data_type}." msgstr "Tipo incorrecto. Se esperaba valor de clave primaria y se recibió {data_type}."
@ -369,25 +354,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Hiperenlace inválido - Objeto no existe." msgstr "Hiperenlace inválido - Objeto no existe."
#: relations.py:243 #: relations.py:243
#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}." msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Tipo incorrecto. Se esperaba una URL y se recibió {data_type}." msgstr "Tipo incorrecto. Se esperaba una URL y se recibió {data_type}."
#: relations.py:402 #: relations.py:401
#, python-brace-format
msgid "Object with {slug_name}={value} does not exist." msgid "Object with {slug_name}={value} does not exist."
msgstr "Objeto con {slug_name}={value} no existe." msgstr "Objeto con {slug_name}={value} no existe."
#: relations.py:403 #: relations.py:402
msgid "Invalid value." msgid "Invalid value."
msgstr "Valor inválido." msgstr "Valor inválido."
#: serializers.py:326 #: serializers.py:326
#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}." msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Datos inválidos. Se esperaba un diccionario pero es un {datatype}." msgstr "Datos inválidos. Se esperaba un diccionario pero es un {datatype}."
#: templates/rest_framework/admin.html:118 #: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128 #: templates/rest_framework/base.html:128
msgid "Filters" msgid "Filters"
msgstr "Filtros" msgstr "Filtros"
@ -417,27 +399,23 @@ msgstr "Ninguno"
msgid "No items to select." msgid "No items to select."
msgstr "No hay elementos para seleccionar." msgstr "No hay elementos para seleccionar."
#: validators.py:24 #: validators.py:43
msgid "This field must be unique." msgid "This field must be unique."
msgstr "Este campo debe ser único." msgstr "Este campo debe ser único."
#: validators.py:78 #: validators.py:97
#, python-brace-format
msgid "The fields {field_names} must make a unique set." msgid "The fields {field_names} must make a unique set."
msgstr "Los campos {field_names} deben formar un conjunto único." msgstr "Los campos {field_names} deben formar un conjunto único."
#: validators.py:226 #: validators.py:245
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" date." msgid "This field must be unique for the \"{date_field}\" date."
msgstr "Este campo debe ser único para el día \"{date_field}\"." msgstr "Este campo debe ser único para el día \"{date_field}\"."
#: validators.py:241 #: validators.py:260
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" month." msgid "This field must be unique for the \"{date_field}\" month."
msgstr "Este campo debe ser único para el mes \"{date_field}\"." msgstr "Este campo debe ser único para el mes \"{date_field}\"."
#: validators.py:254 #: validators.py:273
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" year." msgid "This field must be unique for the \"{date_field}\" year."
msgstr "Este campo debe ser único para el año \"{date_field}\"." msgstr "Este campo debe ser único para el año \"{date_field}\"."
@ -445,15 +423,19 @@ msgstr "Este campo debe ser único para el año \"{date_field}\"."
msgid "Invalid version in \"Accept\" header." msgid "Invalid version in \"Accept\" header."
msgstr "Versión inválida en la cabecera \"Accept\"." msgstr "Versión inválida en la cabecera \"Accept\"."
#: versioning.py:73 versioning.py:115 #: versioning.py:73
msgid "Invalid version in URL path." msgid "Invalid version in URL path."
msgstr "Versión inválida en la ruta de la URL." msgstr "Versión inválida en la ruta de la URL."
#: versioning.py:144 #: versioning.py:115
msgid "Invalid version in URL path. Does not match any version namespace."
msgstr ""
#: versioning.py:147
msgid "Invalid version in hostname." msgid "Invalid version in hostname."
msgstr "Versión inválida en el nombre de host." msgstr "Versión inválida en el nombre de host."
#: versioning.py:166 #: versioning.py:169
msgid "Invalid version in query parameter." msgid "Invalid version in query parameter."
msgstr "Versión inválida en el parámetro de consulta." msgstr "Versión inválida en el parámetro de consulta."

View File

@ -8,9 +8,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django REST framework\n" "Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-01 18:38+0100\n" "POT-Creation-Date: 2016-07-12 16:13+0100\n"
"PO-Revision-Date: 2016-03-01 17:38+0000\n" "PO-Revision-Date: 2016-07-12 15:14+0000\n"
"Last-Translator: Xavier Ordoquy <xordoquy@linovia.com>\n" "Last-Translator: Thomas Christie <tom@tomchristie.com>\n"
"Language-Team: Estonian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/et/)\n" "Language-Team: Estonian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/et/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -18,40 +18,40 @@ msgstr ""
"Language: et\n" "Language: et\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: authentication.py:71 #: authentication.py:73
msgid "Invalid basic header. No credentials provided." msgid "Invalid basic header. No credentials provided."
msgstr "Sobimatu lihtpäis. Kasutajatunnus on esitamata." msgstr "Sobimatu lihtpäis. Kasutajatunnus on esitamata."
#: authentication.py:74 #: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces." msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "Sobimatu lihtpäis. Kasutajatunnus ei tohi sisaldada tühikuid." msgstr "Sobimatu lihtpäis. Kasutajatunnus ei tohi sisaldada tühikuid."
#: authentication.py:80 #: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded." msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "Sobimatu lihtpäis. Kasutajatunnus pole korrektselt base64-kodeeritud." msgstr "Sobimatu lihtpäis. Kasutajatunnus pole korrektselt base64-kodeeritud."
#: authentication.py:97 #: authentication.py:99
msgid "Invalid username/password." msgid "Invalid username/password."
msgstr "Sobimatu kasutajatunnus/salasõna." msgstr "Sobimatu kasutajatunnus/salasõna."
#: authentication.py:100 authentication.py:195 #: authentication.py:102 authentication.py:198
msgid "User inactive or deleted." msgid "User inactive or deleted."
msgstr "Kasutaja on inaktiivne või kustutatud." msgstr "Kasutaja on inaktiivne või kustutatud."
#: authentication.py:173 #: authentication.py:176
msgid "Invalid token header. No credentials provided." msgid "Invalid token header. No credentials provided."
msgstr "Sobimatu lubakaardi päis. Kasutajatunnus on esitamata." msgstr "Sobimatu lubakaardi päis. Kasutajatunnus on esitamata."
#: authentication.py:176 #: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces." msgid "Invalid token header. Token string should not contain spaces."
msgstr "Sobimatu lubakaardi päis. Loa sõne ei tohi sisaldada tühikuid." msgstr "Sobimatu lubakaardi päis. Loa sõne ei tohi sisaldada tühikuid."
#: authentication.py:182 #: authentication.py:185
msgid "" msgid ""
"Invalid token header. Token string should not contain invalid characters." "Invalid token header. Token string should not contain invalid characters."
msgstr "" msgstr ""
#: authentication.py:192 #: authentication.py:195
msgid "Invalid token." msgid "Invalid token."
msgstr "Sobimatu lubakaart." msgstr "Sobimatu lubakaart."
@ -59,23 +59,23 @@ msgstr "Sobimatu lubakaart."
msgid "Auth Token" msgid "Auth Token"
msgstr "" msgstr ""
#: authtoken/models.py:21 #: authtoken/models.py:15
msgid "Key" msgid "Key"
msgstr "" msgstr ""
#: authtoken/models.py:23 #: authtoken/models.py:18
msgid "User" msgid "User"
msgstr "" msgstr ""
#: authtoken/models.py:24 #: authtoken/models.py:20
msgid "Created" msgid "Created"
msgstr "" msgstr ""
#: authtoken/models.py:33 #: authtoken/models.py:29
msgid "Token" msgid "Token"
msgstr "" msgstr ""
#: authtoken/models.py:34 #: authtoken/models.py:30
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
@ -124,7 +124,6 @@ msgid "Not found."
msgstr "Ei leidnud." msgstr "Ei leidnud."
#: exceptions.py:109 #: exceptions.py:109
#, python-brace-format
msgid "Method \"{method}\" not allowed." msgid "Method \"{method}\" not allowed."
msgstr "Meetod \"{method}\" pole lubatud." msgstr "Meetod \"{method}\" pole lubatud."
@ -133,7 +132,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "Päringu Accept-päist ei suutnud täita." msgstr "Päringu Accept-päist ei suutnud täita."
#: exceptions.py:132 #: exceptions.py:132
#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request." msgid "Unsupported media type \"{media_type}\" in request."
msgstr "Meedia tüüpi {media_type} päringus ei toetata." msgstr "Meedia tüüpi {media_type} päringus ei toetata."
@ -141,214 +139,201 @@ msgstr "Meedia tüüpi {media_type} päringus ei toetata."
msgid "Request was throttled." msgid "Request was throttled."
msgstr "Liiga palju päringuid." msgstr "Liiga palju päringuid."
#: fields.py:266 relations.py:206 relations.py:239 validators.py:79 #: fields.py:269 relations.py:206 relations.py:239 validators.py:98
#: validators.py:162 #: validators.py:181
msgid "This field is required." msgid "This field is required."
msgstr "Väli on kohustuslik." msgstr "Väli on kohustuslik."
#: fields.py:267 #: fields.py:270
msgid "This field may not be null." msgid "This field may not be null."
msgstr "Väli ei tohi olla tühi." msgstr "Väli ei tohi olla tühi."
#: fields.py:603 fields.py:634 #: fields.py:608 fields.py:639
#, python-brace-format
msgid "\"{input}\" is not a valid boolean." msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" pole kehtiv kahendarv." msgstr "\"{input}\" pole kehtiv kahendarv."
#: fields.py:669 #: fields.py:674
msgid "This field may not be blank." msgid "This field may not be blank."
msgstr "See väli ei tohi olla tühi." msgstr "See väli ei tohi olla tühi."
#: fields.py:670 fields.py:1664 #: fields.py:675 fields.py:1675
#, python-brace-format
msgid "Ensure this field has no more than {max_length} characters." msgid "Ensure this field has no more than {max_length} characters."
msgstr "Veendu, et see väli poleks pikem kui {max_length} tähemärki." msgstr "Veendu, et see väli poleks pikem kui {max_length} tähemärki."
#: fields.py:671 #: fields.py:676
#, python-brace-format
msgid "Ensure this field has at least {min_length} characters." msgid "Ensure this field has at least {min_length} characters."
msgstr "Veendu, et see väli oleks vähemalt {min_length} tähemärki pikk." msgstr "Veendu, et see väli oleks vähemalt {min_length} tähemärki pikk."
#: fields.py:708 #: fields.py:713
msgid "Enter a valid email address." msgid "Enter a valid email address."
msgstr "Sisestage kehtiv e-posti aadress." msgstr "Sisestage kehtiv e-posti aadress."
#: fields.py:719 #: fields.py:724
msgid "This value does not match the required pattern." msgid "This value does not match the required pattern."
msgstr "Väärtus ei ühti etteantud mustriga." msgstr "Väärtus ei ühti etteantud mustriga."
#: fields.py:730 #: fields.py:735
msgid "" msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or " "Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens." "hyphens."
msgstr "Sisestage kehtiv \"slug\", mis koosneks tähtedest, numbritest, ala- või sidekriipsudest." msgstr "Sisestage kehtiv \"slug\", mis koosneks tähtedest, numbritest, ala- või sidekriipsudest."
#: fields.py:742 #: fields.py:747
msgid "Enter a valid URL." msgid "Enter a valid URL."
msgstr "Sisestage korrektne URL." msgstr "Sisestage korrektne URL."
#: fields.py:755 #: fields.py:760
#, python-brace-format
msgid "\"{value}\" is not a valid UUID." msgid "\"{value}\" is not a valid UUID."
msgstr "\"{value}\" pole kehtiv UUID." msgstr "\"{value}\" pole kehtiv UUID."
#: fields.py:791 #: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address." msgid "Enter a valid IPv4 or IPv6 address."
msgstr "" msgstr ""
#: fields.py:816 #: fields.py:821
msgid "A valid integer is required." msgid "A valid integer is required."
msgstr "Sisendiks peab olema täisarv." msgstr "Sisendiks peab olema täisarv."
#: fields.py:817 fields.py:852 fields.py:885 #: fields.py:822 fields.py:857 fields.py:891
#, python-brace-format
msgid "Ensure this value is less than or equal to {max_value}." msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Veenduge, et väärtus on väiksem kui või võrdne väärtusega {max_value}. " msgstr "Veenduge, et väärtus on väiksem kui või võrdne väärtusega {max_value}. "
#: fields.py:818 fields.py:853 fields.py:886 #: fields.py:823 fields.py:858 fields.py:892
#, python-brace-format
msgid "Ensure this value is greater than or equal to {min_value}." msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Veenduge, et väärtus on suurem kui või võrdne väärtusega {min_value}." msgstr "Veenduge, et väärtus on suurem kui või võrdne väärtusega {min_value}."
#: fields.py:819 fields.py:854 fields.py:890 #: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large." msgid "String value too large."
msgstr "Sõne on liiga pikk." msgstr "Sõne on liiga pikk."
#: fields.py:851 fields.py:884 #: fields.py:856 fields.py:890
msgid "A valid number is required." msgid "A valid number is required."
msgstr "Sisendiks peab olema arv." msgstr "Sisendiks peab olema arv."
#: fields.py:887 #: fields.py:893
#, python-brace-format
msgid "Ensure that there are no more than {max_digits} digits in total." msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "Veenduge, et kokku pole rohkem kui {max_digits} numbit." msgstr "Veenduge, et kokku pole rohkem kui {max_digits} numbit."
#: fields.py:888 #: fields.py:894
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places." "Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "Veenduge, et komakohti pole rohkem kui {max_decimal_places}. " msgstr "Veenduge, et komakohti pole rohkem kui {max_decimal_places}. "
#: fields.py:889 #: fields.py:895
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the " "Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point." "decimal point."
msgstr "Veenduge, et täiskohti poleks rohkem kui {max_whole_digits}." msgstr "Veenduge, et täiskohti poleks rohkem kui {max_whole_digits}."
#: fields.py:1004 #: fields.py:1025
#, python-brace-format
msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "Valesti formaaditud kuupäev-kellaaeg. Kasutage mõnda neist: {format}." msgstr "Valesti formaaditud kuupäev-kellaaeg. Kasutage mõnda neist: {format}."
#: fields.py:1005 #: fields.py:1026
msgid "Expected a datetime but got a date." msgid "Expected a datetime but got a date."
msgstr "Ootasin kuupäev-kellaaeg andmetüüpi, kuid sain hoopis kuupäeva." msgstr "Ootasin kuupäev-kellaaeg andmetüüpi, kuid sain hoopis kuupäeva."
#: fields.py:1082 #: fields.py:1103
#, python-brace-format
msgid "Date has wrong format. Use one of these formats instead: {format}." msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "Valesti formaaditud kuupäev. Kasutage mõnda neist: {format}." msgstr "Valesti formaaditud kuupäev. Kasutage mõnda neist: {format}."
#: fields.py:1083 #: fields.py:1104
msgid "Expected a date but got a datetime." msgid "Expected a date but got a datetime."
msgstr "Ootasin kuupäeva andmetüüpi, kuid sain hoopis kuupäev-kellaaja." msgstr "Ootasin kuupäeva andmetüüpi, kuid sain hoopis kuupäev-kellaaja."
#: fields.py:1151 #: fields.py:1170
#, python-brace-format
msgid "Time has wrong format. Use one of these formats instead: {format}." msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "Valesti formaaditud kellaaeg. Kasutage mõnda neist: {format}." msgstr "Valesti formaaditud kellaaeg. Kasutage mõnda neist: {format}."
#: fields.py:1215 #: fields.py:1232
#, python-brace-format
msgid "Duration has wrong format. Use one of these formats instead: {format}." msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1240 fields.py:1289 #: fields.py:1251 fields.py:1300
#, python-brace-format
msgid "\"{input}\" is not a valid choice." msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" on sobimatu valik." msgstr "\"{input}\" on sobimatu valik."
#: fields.py:1243 relations.py:71 relations.py:442 #: fields.py:1254 relations.py:71 relations.py:441
#, python-brace-format
msgid "More than {count} items..." msgid "More than {count} items..."
msgstr "" msgstr ""
#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520 #: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
#, python-brace-format
msgid "Expected a list of items but got type \"{input_type}\"." msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "Ootasin kirjete järjendit, kuid sain \"{input_type}\" - tüübi." msgstr "Ootasin kirjete järjendit, kuid sain \"{input_type}\" - tüübi."
#: fields.py:1291 #: fields.py:1302
msgid "This selection may not be empty." msgid "This selection may not be empty."
msgstr "" msgstr ""
#: fields.py:1328 #: fields.py:1339
#, python-brace-format
msgid "\"{input}\" is not a valid path choice." msgid "\"{input}\" is not a valid path choice."
msgstr "" msgstr ""
#: fields.py:1347 #: fields.py:1358
msgid "No file was submitted." msgid "No file was submitted."
msgstr "Ühtegi faili ei esitatud." msgstr "Ühtegi faili ei esitatud."
#: fields.py:1348 #: fields.py:1359
msgid "" msgid ""
"The submitted data was not a file. Check the encoding type on the form." "The submitted data was not a file. Check the encoding type on the form."
msgstr "Esitatud andmetes ei olnud faili. Kontrollige vormi kodeeringut." msgstr "Esitatud andmetes ei olnud faili. Kontrollige vormi kodeeringut."
#: fields.py:1349 #: fields.py:1360
msgid "No filename could be determined." msgid "No filename could be determined."
msgstr "Ei suutnud tuvastada failinime." msgstr "Ei suutnud tuvastada failinime."
#: fields.py:1350 #: fields.py:1361
msgid "The submitted file is empty." msgid "The submitted file is empty."
msgstr "Esitatud fail oli tühi." msgstr "Esitatud fail oli tühi."
#: fields.py:1351 #: fields.py:1362
#, python-brace-format
msgid "" msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})." "Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "Veenduge, et failinimi oleks maksimaalselt {max_length} tähemärki pikk (praegu on {length})." msgstr "Veenduge, et failinimi oleks maksimaalselt {max_length} tähemärki pikk (praegu on {length})."
#: fields.py:1399 #: fields.py:1410
msgid "" msgid ""
"Upload a valid image. The file you uploaded was either not an image or a " "Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image." "corrupted image."
msgstr "Laadige üles kehtiv pildifail. Üles laetud fail ei olnud pilt või oli see katki." msgstr "Laadige üles kehtiv pildifail. Üles laetud fail ei olnud pilt või oli see katki."
#: fields.py:1438 relations.py:439 serializers.py:521 #: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty." msgid "This list may not be empty."
msgstr "" msgstr ""
#: fields.py:1491 #: fields.py:1502
#, python-brace-format
msgid "Expected a dictionary of items but got type \"{input_type}\"." msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "Ootasin kirjete sõnastikku, kuid sain \"{input_type}\"." msgstr "Ootasin kirjete sõnastikku, kuid sain \"{input_type}\"."
#: fields.py:1538 #: fields.py:1549
msgid "Value must be valid JSON." msgid "Value must be valid JSON."
msgstr "" msgstr ""
#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5 #: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit" msgid "Submit"
msgstr "" msgstr ""
#: pagination.py:189 #: filters.py:336
msgid "ascending"
msgstr ""
#: filters.py:337
msgid "descending"
msgstr ""
#: pagination.py:193
msgid "Invalid page." msgid "Invalid page."
msgstr "" msgstr ""
#: pagination.py:407 #: pagination.py:427
msgid "Invalid cursor" msgid "Invalid cursor"
msgstr "Sobimatu kursor." msgstr "Sobimatu kursor."
#: relations.py:207 #: relations.py:207
#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist." msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "Sobimatu primaarvõti \"{pk_value}\" - objekti pole olemas." msgstr "Sobimatu primaarvõti \"{pk_value}\" - objekti pole olemas."
#: relations.py:208 #: relations.py:208
#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}." msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Sobimatu andmetüüp. Ootasin primaarvõtit, sain {data_type}." msgstr "Sobimatu andmetüüp. Ootasin primaarvõtit, sain {data_type}."
@ -365,25 +350,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Sobimatu hüperlink - objekti ei eksisteeri." msgstr "Sobimatu hüperlink - objekti ei eksisteeri."
#: relations.py:243 #: relations.py:243
#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}." msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Sobimatu andmetüüp. Ootasin URLi sõne, sain {data_type}." msgstr "Sobimatu andmetüüp. Ootasin URLi sõne, sain {data_type}."
#: relations.py:402 #: relations.py:401
#, python-brace-format
msgid "Object with {slug_name}={value} does not exist." msgid "Object with {slug_name}={value} does not exist."
msgstr "Objekti {slug_name}={value} ei eksisteeri." msgstr "Objekti {slug_name}={value} ei eksisteeri."
#: relations.py:403 #: relations.py:402
msgid "Invalid value." msgid "Invalid value."
msgstr "Sobimatu väärtus." msgstr "Sobimatu väärtus."
#: serializers.py:326 #: serializers.py:326
#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}." msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Sobimatud andmed. Ootasin sõnastikku, kuid sain {datatype}." msgstr "Sobimatud andmed. Ootasin sõnastikku, kuid sain {datatype}."
#: templates/rest_framework/admin.html:118 #: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128 #: templates/rest_framework/base.html:128
msgid "Filters" msgid "Filters"
msgstr "" msgstr ""
@ -413,27 +395,23 @@ msgstr ""
msgid "No items to select." msgid "No items to select."
msgstr "" msgstr ""
#: validators.py:24 #: validators.py:43
msgid "This field must be unique." msgid "This field must be unique."
msgstr "Selle välja väärtus peab olema unikaalne." msgstr "Selle välja väärtus peab olema unikaalne."
#: validators.py:78 #: validators.py:97
#, python-brace-format
msgid "The fields {field_names} must make a unique set." msgid "The fields {field_names} must make a unique set."
msgstr "Veerud {field_names} peavad moodustama unikaalse hulga." msgstr "Veerud {field_names} peavad moodustama unikaalse hulga."
#: validators.py:226 #: validators.py:245
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" date." msgid "This field must be unique for the \"{date_field}\" date."
msgstr "Selle välja väärtus peab olema unikaalne veerus \"{date_field}\" märgitud kuupäeval." msgstr "Selle välja väärtus peab olema unikaalne veerus \"{date_field}\" märgitud kuupäeval."
#: validators.py:241 #: validators.py:260
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" month." msgid "This field must be unique for the \"{date_field}\" month."
msgstr "Selle välja väärtus peab olema unikaalneveerus \"{date_field}\" märgitud kuul." msgstr "Selle välja väärtus peab olema unikaalneveerus \"{date_field}\" märgitud kuul."
#: validators.py:254 #: validators.py:273
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" year." msgid "This field must be unique for the \"{date_field}\" year."
msgstr "Selle välja väärtus peab olema unikaalneveerus \"{date_field}\" märgitud aastal." msgstr "Selle välja väärtus peab olema unikaalneveerus \"{date_field}\" märgitud aastal."
@ -441,15 +419,19 @@ msgstr "Selle välja väärtus peab olema unikaalneveerus \"{date_field}\" märg
msgid "Invalid version in \"Accept\" header." msgid "Invalid version in \"Accept\" header."
msgstr "Sobimatu versioon \"Accept\" päises." msgstr "Sobimatu versioon \"Accept\" päises."
#: versioning.py:73 versioning.py:115 #: versioning.py:73
msgid "Invalid version in URL path." msgid "Invalid version in URL path."
msgstr "Sobimatu versioon URLi rajas." msgstr "Sobimatu versioon URLi rajas."
#: versioning.py:144 #: versioning.py:115
msgid "Invalid version in URL path. Does not match any version namespace."
msgstr ""
#: versioning.py:147
msgid "Invalid version in hostname." msgid "Invalid version in hostname."
msgstr "Sobimatu versioon hostinimes." msgstr "Sobimatu versioon hostinimes."
#: versioning.py:166 #: versioning.py:169
msgid "Invalid version in query parameter." msgid "Invalid version in query parameter."
msgstr "Sobimatu versioon päringu parameetris." msgstr "Sobimatu versioon päringu parameetris."

View File

@ -7,9 +7,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django REST framework\n" "Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-01 18:38+0100\n" "POT-Creation-Date: 2016-07-12 16:13+0100\n"
"PO-Revision-Date: 2016-03-01 17:38+0000\n" "PO-Revision-Date: 2016-07-12 15:14+0000\n"
"Last-Translator: Xavier Ordoquy <xordoquy@linovia.com>\n" "Last-Translator: Thomas Christie <tom@tomchristie.com>\n"
"Language-Team: Persian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/fa/)\n" "Language-Team: Persian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/fa/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -17,40 +17,40 @@ msgstr ""
"Language: fa\n" "Language: fa\n"
"Plural-Forms: nplurals=1; plural=0;\n" "Plural-Forms: nplurals=1; plural=0;\n"
#: authentication.py:71 #: authentication.py:73
msgid "Invalid basic header. No credentials provided." msgid "Invalid basic header. No credentials provided."
msgstr "" msgstr ""
#: authentication.py:74 #: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces." msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "" msgstr ""
#: authentication.py:80 #: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded." msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "" msgstr ""
#: authentication.py:97 #: authentication.py:99
msgid "Invalid username/password." msgid "Invalid username/password."
msgstr "" msgstr ""
#: authentication.py:100 authentication.py:195 #: authentication.py:102 authentication.py:198
msgid "User inactive or deleted." msgid "User inactive or deleted."
msgstr "" msgstr ""
#: authentication.py:173 #: authentication.py:176
msgid "Invalid token header. No credentials provided." msgid "Invalid token header. No credentials provided."
msgstr "" msgstr ""
#: authentication.py:176 #: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces." msgid "Invalid token header. Token string should not contain spaces."
msgstr "" msgstr ""
#: authentication.py:182 #: authentication.py:185
msgid "" msgid ""
"Invalid token header. Token string should not contain invalid characters." "Invalid token header. Token string should not contain invalid characters."
msgstr "" msgstr ""
#: authentication.py:192 #: authentication.py:195
msgid "Invalid token." msgid "Invalid token."
msgstr "" msgstr ""
@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token" msgid "Auth Token"
msgstr "" msgstr ""
#: authtoken/models.py:21 #: authtoken/models.py:15
msgid "Key" msgid "Key"
msgstr "" msgstr ""
#: authtoken/models.py:23 #: authtoken/models.py:18
msgid "User" msgid "User"
msgstr "" msgstr ""
#: authtoken/models.py:24 #: authtoken/models.py:20
msgid "Created" msgid "Created"
msgstr "" msgstr ""
#: authtoken/models.py:33 #: authtoken/models.py:29
msgid "Token" msgid "Token"
msgstr "" msgstr ""
#: authtoken/models.py:34 #: authtoken/models.py:30
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
@ -123,7 +123,6 @@ msgid "Not found."
msgstr "" msgstr ""
#: exceptions.py:109 #: exceptions.py:109
#, python-brace-format
msgid "Method \"{method}\" not allowed." msgid "Method \"{method}\" not allowed."
msgstr "" msgstr ""
@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "" msgstr ""
#: exceptions.py:132 #: exceptions.py:132
#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request." msgid "Unsupported media type \"{media_type}\" in request."
msgstr "" msgstr ""
@ -140,214 +138,201 @@ msgstr ""
msgid "Request was throttled." msgid "Request was throttled."
msgstr "" msgstr ""
#: fields.py:266 relations.py:206 relations.py:239 validators.py:79 #: fields.py:269 relations.py:206 relations.py:239 validators.py:98
#: validators.py:162 #: validators.py:181
msgid "This field is required." msgid "This field is required."
msgstr "" msgstr ""
#: fields.py:267 #: fields.py:270
msgid "This field may not be null." msgid "This field may not be null."
msgstr "" msgstr ""
#: fields.py:603 fields.py:634 #: fields.py:608 fields.py:639
#, python-brace-format
msgid "\"{input}\" is not a valid boolean." msgid "\"{input}\" is not a valid boolean."
msgstr "" msgstr ""
#: fields.py:669 #: fields.py:674
msgid "This field may not be blank." msgid "This field may not be blank."
msgstr "" msgstr ""
#: fields.py:670 fields.py:1664 #: fields.py:675 fields.py:1675
#, python-brace-format
msgid "Ensure this field has no more than {max_length} characters." msgid "Ensure this field has no more than {max_length} characters."
msgstr "" msgstr ""
#: fields.py:671 #: fields.py:676
#, python-brace-format
msgid "Ensure this field has at least {min_length} characters." msgid "Ensure this field has at least {min_length} characters."
msgstr "" msgstr ""
#: fields.py:708 #: fields.py:713
msgid "Enter a valid email address." msgid "Enter a valid email address."
msgstr "" msgstr ""
#: fields.py:719 #: fields.py:724
msgid "This value does not match the required pattern." msgid "This value does not match the required pattern."
msgstr "" msgstr ""
#: fields.py:730 #: fields.py:735
msgid "" msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or " "Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens." "hyphens."
msgstr "" msgstr ""
#: fields.py:742 #: fields.py:747
msgid "Enter a valid URL." msgid "Enter a valid URL."
msgstr "" msgstr ""
#: fields.py:755 #: fields.py:760
#, python-brace-format
msgid "\"{value}\" is not a valid UUID." msgid "\"{value}\" is not a valid UUID."
msgstr "" msgstr ""
#: fields.py:791 #: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address." msgid "Enter a valid IPv4 or IPv6 address."
msgstr "" msgstr ""
#: fields.py:816 #: fields.py:821
msgid "A valid integer is required." msgid "A valid integer is required."
msgstr "" msgstr ""
#: fields.py:817 fields.py:852 fields.py:885 #: fields.py:822 fields.py:857 fields.py:891
#, python-brace-format
msgid "Ensure this value is less than or equal to {max_value}." msgid "Ensure this value is less than or equal to {max_value}."
msgstr "" msgstr ""
#: fields.py:818 fields.py:853 fields.py:886 #: fields.py:823 fields.py:858 fields.py:892
#, python-brace-format
msgid "Ensure this value is greater than or equal to {min_value}." msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "" msgstr ""
#: fields.py:819 fields.py:854 fields.py:890 #: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large." msgid "String value too large."
msgstr "" msgstr ""
#: fields.py:851 fields.py:884 #: fields.py:856 fields.py:890
msgid "A valid number is required." msgid "A valid number is required."
msgstr "" msgstr ""
#: fields.py:887 #: fields.py:893
#, python-brace-format
msgid "Ensure that there are no more than {max_digits} digits in total." msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "" msgstr ""
#: fields.py:888 #: fields.py:894
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places." "Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "" msgstr ""
#: fields.py:889 #: fields.py:895
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the " "Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point." "decimal point."
msgstr "" msgstr ""
#: fields.py:1004 #: fields.py:1025
#, python-brace-format
msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1005 #: fields.py:1026
msgid "Expected a datetime but got a date." msgid "Expected a datetime but got a date."
msgstr "" msgstr ""
#: fields.py:1082 #: fields.py:1103
#, python-brace-format
msgid "Date has wrong format. Use one of these formats instead: {format}." msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1083 #: fields.py:1104
msgid "Expected a date but got a datetime." msgid "Expected a date but got a datetime."
msgstr "" msgstr ""
#: fields.py:1151 #: fields.py:1170
#, python-brace-format
msgid "Time has wrong format. Use one of these formats instead: {format}." msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1215 #: fields.py:1232
#, python-brace-format
msgid "Duration has wrong format. Use one of these formats instead: {format}." msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1240 fields.py:1289 #: fields.py:1251 fields.py:1300
#, python-brace-format
msgid "\"{input}\" is not a valid choice." msgid "\"{input}\" is not a valid choice."
msgstr "" msgstr ""
#: fields.py:1243 relations.py:71 relations.py:442 #: fields.py:1254 relations.py:71 relations.py:441
#, python-brace-format
msgid "More than {count} items..." msgid "More than {count} items..."
msgstr "" msgstr ""
#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520 #: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
#, python-brace-format
msgid "Expected a list of items but got type \"{input_type}\"." msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "" msgstr ""
#: fields.py:1291 #: fields.py:1302
msgid "This selection may not be empty." msgid "This selection may not be empty."
msgstr "" msgstr ""
#: fields.py:1328 #: fields.py:1339
#, python-brace-format
msgid "\"{input}\" is not a valid path choice." msgid "\"{input}\" is not a valid path choice."
msgstr "" msgstr ""
#: fields.py:1347 #: fields.py:1358
msgid "No file was submitted." msgid "No file was submitted."
msgstr "" msgstr ""
#: fields.py:1348 #: fields.py:1359
msgid "" msgid ""
"The submitted data was not a file. Check the encoding type on the form." "The submitted data was not a file. Check the encoding type on the form."
msgstr "" msgstr ""
#: fields.py:1349 #: fields.py:1360
msgid "No filename could be determined." msgid "No filename could be determined."
msgstr "" msgstr ""
#: fields.py:1350 #: fields.py:1361
msgid "The submitted file is empty." msgid "The submitted file is empty."
msgstr "" msgstr ""
#: fields.py:1351 #: fields.py:1362
#, python-brace-format
msgid "" msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})." "Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "" msgstr ""
#: fields.py:1399 #: fields.py:1410
msgid "" msgid ""
"Upload a valid image. The file you uploaded was either not an image or a " "Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image." "corrupted image."
msgstr "" msgstr ""
#: fields.py:1438 relations.py:439 serializers.py:521 #: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty." msgid "This list may not be empty."
msgstr "" msgstr ""
#: fields.py:1491 #: fields.py:1502
#, python-brace-format
msgid "Expected a dictionary of items but got type \"{input_type}\"." msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "" msgstr ""
#: fields.py:1538 #: fields.py:1549
msgid "Value must be valid JSON." msgid "Value must be valid JSON."
msgstr "" msgstr ""
#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5 #: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit" msgid "Submit"
msgstr "" msgstr ""
#: pagination.py:189 #: filters.py:336
msgid "ascending"
msgstr ""
#: filters.py:337
msgid "descending"
msgstr ""
#: pagination.py:193
msgid "Invalid page." msgid "Invalid page."
msgstr "" msgstr ""
#: pagination.py:407 #: pagination.py:427
msgid "Invalid cursor" msgid "Invalid cursor"
msgstr "" msgstr ""
#: relations.py:207 #: relations.py:207
#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist." msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "" msgstr ""
#: relations.py:208 #: relations.py:208
#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}." msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "" msgstr ""
@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "" msgstr ""
#: relations.py:243 #: relations.py:243
#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}." msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "" msgstr ""
#: relations.py:402 #: relations.py:401
#, python-brace-format
msgid "Object with {slug_name}={value} does not exist." msgid "Object with {slug_name}={value} does not exist."
msgstr "" msgstr ""
#: relations.py:403 #: relations.py:402
msgid "Invalid value." msgid "Invalid value."
msgstr "" msgstr ""
#: serializers.py:326 #: serializers.py:326
#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}." msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "" msgstr ""
#: templates/rest_framework/admin.html:118 #: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128 #: templates/rest_framework/base.html:128
msgid "Filters" msgid "Filters"
msgstr "" msgstr ""
@ -412,27 +394,23 @@ msgstr ""
msgid "No items to select." msgid "No items to select."
msgstr "" msgstr ""
#: validators.py:24 #: validators.py:43
msgid "This field must be unique." msgid "This field must be unique."
msgstr "" msgstr ""
#: validators.py:78 #: validators.py:97
#, python-brace-format
msgid "The fields {field_names} must make a unique set." msgid "The fields {field_names} must make a unique set."
msgstr "" msgstr ""
#: validators.py:226 #: validators.py:245
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" date." msgid "This field must be unique for the \"{date_field}\" date."
msgstr "" msgstr ""
#: validators.py:241 #: validators.py:260
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" month." msgid "This field must be unique for the \"{date_field}\" month."
msgstr "" msgstr ""
#: validators.py:254 #: validators.py:273
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" year." msgid "This field must be unique for the \"{date_field}\" year."
msgstr "" msgstr ""
@ -440,15 +418,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header." msgid "Invalid version in \"Accept\" header."
msgstr "" msgstr ""
#: versioning.py:73 versioning.py:115 #: versioning.py:73
msgid "Invalid version in URL path." msgid "Invalid version in URL path."
msgstr "" msgstr ""
#: versioning.py:144 #: versioning.py:115
msgid "Invalid version in URL path. Does not match any version namespace."
msgstr ""
#: versioning.py:147
msgid "Invalid version in hostname." msgid "Invalid version in hostname."
msgstr "" msgstr ""
#: versioning.py:166 #: versioning.py:169
msgid "Invalid version in query parameter." msgid "Invalid version in query parameter."
msgstr "" msgstr ""

View File

@ -7,9 +7,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django REST framework\n" "Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-01 18:38+0100\n" "POT-Creation-Date: 2016-07-12 16:13+0100\n"
"PO-Revision-Date: 2016-03-01 17:38+0000\n" "PO-Revision-Date: 2016-07-12 15:14+0000\n"
"Last-Translator: Xavier Ordoquy <xordoquy@linovia.com>\n" "Last-Translator: Thomas Christie <tom@tomchristie.com>\n"
"Language-Team: Persian (Iran) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/fa_IR/)\n" "Language-Team: Persian (Iran) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/fa_IR/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -17,40 +17,40 @@ msgstr ""
"Language: fa_IR\n" "Language: fa_IR\n"
"Plural-Forms: nplurals=1; plural=0;\n" "Plural-Forms: nplurals=1; plural=0;\n"
#: authentication.py:71 #: authentication.py:73
msgid "Invalid basic header. No credentials provided." msgid "Invalid basic header. No credentials provided."
msgstr "" msgstr ""
#: authentication.py:74 #: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces." msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "" msgstr ""
#: authentication.py:80 #: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded." msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "" msgstr ""
#: authentication.py:97 #: authentication.py:99
msgid "Invalid username/password." msgid "Invalid username/password."
msgstr "" msgstr ""
#: authentication.py:100 authentication.py:195 #: authentication.py:102 authentication.py:198
msgid "User inactive or deleted." msgid "User inactive or deleted."
msgstr "" msgstr ""
#: authentication.py:173 #: authentication.py:176
msgid "Invalid token header. No credentials provided." msgid "Invalid token header. No credentials provided."
msgstr "" msgstr ""
#: authentication.py:176 #: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces." msgid "Invalid token header. Token string should not contain spaces."
msgstr "" msgstr ""
#: authentication.py:182 #: authentication.py:185
msgid "" msgid ""
"Invalid token header. Token string should not contain invalid characters." "Invalid token header. Token string should not contain invalid characters."
msgstr "" msgstr ""
#: authentication.py:192 #: authentication.py:195
msgid "Invalid token." msgid "Invalid token."
msgstr "" msgstr ""
@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token" msgid "Auth Token"
msgstr "" msgstr ""
#: authtoken/models.py:21 #: authtoken/models.py:15
msgid "Key" msgid "Key"
msgstr "" msgstr ""
#: authtoken/models.py:23 #: authtoken/models.py:18
msgid "User" msgid "User"
msgstr "" msgstr ""
#: authtoken/models.py:24 #: authtoken/models.py:20
msgid "Created" msgid "Created"
msgstr "" msgstr ""
#: authtoken/models.py:33 #: authtoken/models.py:29
msgid "Token" msgid "Token"
msgstr "" msgstr ""
#: authtoken/models.py:34 #: authtoken/models.py:30
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
@ -123,7 +123,6 @@ msgid "Not found."
msgstr "" msgstr ""
#: exceptions.py:109 #: exceptions.py:109
#, python-brace-format
msgid "Method \"{method}\" not allowed." msgid "Method \"{method}\" not allowed."
msgstr "" msgstr ""
@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "" msgstr ""
#: exceptions.py:132 #: exceptions.py:132
#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request." msgid "Unsupported media type \"{media_type}\" in request."
msgstr "" msgstr ""
@ -140,214 +138,201 @@ msgstr ""
msgid "Request was throttled." msgid "Request was throttled."
msgstr "" msgstr ""
#: fields.py:266 relations.py:206 relations.py:239 validators.py:79 #: fields.py:269 relations.py:206 relations.py:239 validators.py:98
#: validators.py:162 #: validators.py:181
msgid "This field is required." msgid "This field is required."
msgstr "" msgstr ""
#: fields.py:267 #: fields.py:270
msgid "This field may not be null." msgid "This field may not be null."
msgstr "" msgstr ""
#: fields.py:603 fields.py:634 #: fields.py:608 fields.py:639
#, python-brace-format
msgid "\"{input}\" is not a valid boolean." msgid "\"{input}\" is not a valid boolean."
msgstr "" msgstr ""
#: fields.py:669 #: fields.py:674
msgid "This field may not be blank." msgid "This field may not be blank."
msgstr "" msgstr ""
#: fields.py:670 fields.py:1664 #: fields.py:675 fields.py:1675
#, python-brace-format
msgid "Ensure this field has no more than {max_length} characters." msgid "Ensure this field has no more than {max_length} characters."
msgstr "" msgstr ""
#: fields.py:671 #: fields.py:676
#, python-brace-format
msgid "Ensure this field has at least {min_length} characters." msgid "Ensure this field has at least {min_length} characters."
msgstr "" msgstr ""
#: fields.py:708 #: fields.py:713
msgid "Enter a valid email address." msgid "Enter a valid email address."
msgstr "" msgstr ""
#: fields.py:719 #: fields.py:724
msgid "This value does not match the required pattern." msgid "This value does not match the required pattern."
msgstr "" msgstr ""
#: fields.py:730 #: fields.py:735
msgid "" msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or " "Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens." "hyphens."
msgstr "" msgstr ""
#: fields.py:742 #: fields.py:747
msgid "Enter a valid URL." msgid "Enter a valid URL."
msgstr "" msgstr ""
#: fields.py:755 #: fields.py:760
#, python-brace-format
msgid "\"{value}\" is not a valid UUID." msgid "\"{value}\" is not a valid UUID."
msgstr "" msgstr ""
#: fields.py:791 #: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address." msgid "Enter a valid IPv4 or IPv6 address."
msgstr "" msgstr ""
#: fields.py:816 #: fields.py:821
msgid "A valid integer is required." msgid "A valid integer is required."
msgstr "" msgstr ""
#: fields.py:817 fields.py:852 fields.py:885 #: fields.py:822 fields.py:857 fields.py:891
#, python-brace-format
msgid "Ensure this value is less than or equal to {max_value}." msgid "Ensure this value is less than or equal to {max_value}."
msgstr "" msgstr ""
#: fields.py:818 fields.py:853 fields.py:886 #: fields.py:823 fields.py:858 fields.py:892
#, python-brace-format
msgid "Ensure this value is greater than or equal to {min_value}." msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "" msgstr ""
#: fields.py:819 fields.py:854 fields.py:890 #: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large." msgid "String value too large."
msgstr "" msgstr ""
#: fields.py:851 fields.py:884 #: fields.py:856 fields.py:890
msgid "A valid number is required." msgid "A valid number is required."
msgstr "" msgstr ""
#: fields.py:887 #: fields.py:893
#, python-brace-format
msgid "Ensure that there are no more than {max_digits} digits in total." msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "" msgstr ""
#: fields.py:888 #: fields.py:894
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places." "Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "" msgstr ""
#: fields.py:889 #: fields.py:895
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the " "Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point." "decimal point."
msgstr "" msgstr ""
#: fields.py:1004 #: fields.py:1025
#, python-brace-format
msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1005 #: fields.py:1026
msgid "Expected a datetime but got a date." msgid "Expected a datetime but got a date."
msgstr "" msgstr ""
#: fields.py:1082 #: fields.py:1103
#, python-brace-format
msgid "Date has wrong format. Use one of these formats instead: {format}." msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1083 #: fields.py:1104
msgid "Expected a date but got a datetime." msgid "Expected a date but got a datetime."
msgstr "" msgstr ""
#: fields.py:1151 #: fields.py:1170
#, python-brace-format
msgid "Time has wrong format. Use one of these formats instead: {format}." msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1215 #: fields.py:1232
#, python-brace-format
msgid "Duration has wrong format. Use one of these formats instead: {format}." msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "" msgstr ""
#: fields.py:1240 fields.py:1289 #: fields.py:1251 fields.py:1300
#, python-brace-format
msgid "\"{input}\" is not a valid choice." msgid "\"{input}\" is not a valid choice."
msgstr "" msgstr ""
#: fields.py:1243 relations.py:71 relations.py:442 #: fields.py:1254 relations.py:71 relations.py:441
#, python-brace-format
msgid "More than {count} items..." msgid "More than {count} items..."
msgstr "" msgstr ""
#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520 #: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
#, python-brace-format
msgid "Expected a list of items but got type \"{input_type}\"." msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "" msgstr ""
#: fields.py:1291 #: fields.py:1302
msgid "This selection may not be empty." msgid "This selection may not be empty."
msgstr "" msgstr ""
#: fields.py:1328 #: fields.py:1339
#, python-brace-format
msgid "\"{input}\" is not a valid path choice." msgid "\"{input}\" is not a valid path choice."
msgstr "" msgstr ""
#: fields.py:1347 #: fields.py:1358
msgid "No file was submitted." msgid "No file was submitted."
msgstr "" msgstr ""
#: fields.py:1348 #: fields.py:1359
msgid "" msgid ""
"The submitted data was not a file. Check the encoding type on the form." "The submitted data was not a file. Check the encoding type on the form."
msgstr "" msgstr ""
#: fields.py:1349 #: fields.py:1360
msgid "No filename could be determined." msgid "No filename could be determined."
msgstr "" msgstr ""
#: fields.py:1350 #: fields.py:1361
msgid "The submitted file is empty." msgid "The submitted file is empty."
msgstr "" msgstr ""
#: fields.py:1351 #: fields.py:1362
#, python-brace-format
msgid "" msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})." "Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "" msgstr ""
#: fields.py:1399 #: fields.py:1410
msgid "" msgid ""
"Upload a valid image. The file you uploaded was either not an image or a " "Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image." "corrupted image."
msgstr "" msgstr ""
#: fields.py:1438 relations.py:439 serializers.py:521 #: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty." msgid "This list may not be empty."
msgstr "" msgstr ""
#: fields.py:1491 #: fields.py:1502
#, python-brace-format
msgid "Expected a dictionary of items but got type \"{input_type}\"." msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "" msgstr ""
#: fields.py:1538 #: fields.py:1549
msgid "Value must be valid JSON." msgid "Value must be valid JSON."
msgstr "" msgstr ""
#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5 #: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit" msgid "Submit"
msgstr "" msgstr ""
#: pagination.py:189 #: filters.py:336
msgid "ascending"
msgstr ""
#: filters.py:337
msgid "descending"
msgstr ""
#: pagination.py:193
msgid "Invalid page." msgid "Invalid page."
msgstr "" msgstr ""
#: pagination.py:407 #: pagination.py:427
msgid "Invalid cursor" msgid "Invalid cursor"
msgstr "" msgstr ""
#: relations.py:207 #: relations.py:207
#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist." msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "" msgstr ""
#: relations.py:208 #: relations.py:208
#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}." msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "" msgstr ""
@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "" msgstr ""
#: relations.py:243 #: relations.py:243
#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}." msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "" msgstr ""
#: relations.py:402 #: relations.py:401
#, python-brace-format
msgid "Object with {slug_name}={value} does not exist." msgid "Object with {slug_name}={value} does not exist."
msgstr "" msgstr ""
#: relations.py:403 #: relations.py:402
msgid "Invalid value." msgid "Invalid value."
msgstr "" msgstr ""
#: serializers.py:326 #: serializers.py:326
#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}." msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "" msgstr ""
#: templates/rest_framework/admin.html:118 #: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128 #: templates/rest_framework/base.html:128
msgid "Filters" msgid "Filters"
msgstr "" msgstr ""
@ -412,27 +394,23 @@ msgstr ""
msgid "No items to select." msgid "No items to select."
msgstr "" msgstr ""
#: validators.py:24 #: validators.py:43
msgid "This field must be unique." msgid "This field must be unique."
msgstr "" msgstr ""
#: validators.py:78 #: validators.py:97
#, python-brace-format
msgid "The fields {field_names} must make a unique set." msgid "The fields {field_names} must make a unique set."
msgstr "" msgstr ""
#: validators.py:226 #: validators.py:245
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" date." msgid "This field must be unique for the \"{date_field}\" date."
msgstr "" msgstr ""
#: validators.py:241 #: validators.py:260
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" month." msgid "This field must be unique for the \"{date_field}\" month."
msgstr "" msgstr ""
#: validators.py:254 #: validators.py:273
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" year." msgid "This field must be unique for the \"{date_field}\" year."
msgstr "" msgstr ""
@ -440,15 +418,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header." msgid "Invalid version in \"Accept\" header."
msgstr "" msgstr ""
#: versioning.py:73 versioning.py:115 #: versioning.py:73
msgid "Invalid version in URL path." msgid "Invalid version in URL path."
msgstr "" msgstr ""
#: versioning.py:144 #: versioning.py:115
msgid "Invalid version in URL path. Does not match any version namespace."
msgstr ""
#: versioning.py:147
msgid "Invalid version in hostname." msgid "Invalid version in hostname."
msgstr "" msgstr ""
#: versioning.py:166 #: versioning.py:169
msgid "Invalid version in query parameter." msgid "Invalid version in query parameter."
msgstr "" msgstr ""

View File

@ -9,9 +9,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django REST framework\n" "Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-01 18:38+0100\n" "POT-Creation-Date: 2016-07-12 16:13+0100\n"
"PO-Revision-Date: 2016-03-01 17:38+0000\n" "PO-Revision-Date: 2016-07-12 15:14+0000\n"
"Last-Translator: Xavier Ordoquy <xordoquy@linovia.com>\n" "Last-Translator: Thomas Christie <tom@tomchristie.com>\n"
"Language-Team: Finnish (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/fi/)\n" "Language-Team: Finnish (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/fi/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -19,40 +19,40 @@ msgstr ""
"Language: fi\n" "Language: fi\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: authentication.py:71 #: authentication.py:73
msgid "Invalid basic header. No credentials provided." msgid "Invalid basic header. No credentials provided."
msgstr "Epäkelpo perusotsake. Ei annettuja tunnuksia." msgstr "Epäkelpo perusotsake. Ei annettuja tunnuksia."
#: authentication.py:74 #: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces." msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "Epäkelpo perusotsake. Tunnusmerkkijono ei saa sisältää välilyöntejä." msgstr "Epäkelpo perusotsake. Tunnusmerkkijono ei saa sisältää välilyöntejä."
#: authentication.py:80 #: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded." msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "Epäkelpo perusotsake. Tunnukset eivät ole base64-koodattu." msgstr "Epäkelpo perusotsake. Tunnukset eivät ole base64-koodattu."
#: authentication.py:97 #: authentication.py:99
msgid "Invalid username/password." msgid "Invalid username/password."
msgstr "Epäkelpo käyttäjänimi tai salasana." msgstr "Epäkelpo käyttäjänimi tai salasana."
#: authentication.py:100 authentication.py:195 #: authentication.py:102 authentication.py:198
msgid "User inactive or deleted." msgid "User inactive or deleted."
msgstr "Käyttäjä ei-aktiivinen tai poistettu." msgstr "Käyttäjä ei-aktiivinen tai poistettu."
#: authentication.py:173 #: authentication.py:176
msgid "Invalid token header. No credentials provided." msgid "Invalid token header. No credentials provided."
msgstr "Epäkelpo Token-otsake. Ei annettuja tunnuksia." msgstr "Epäkelpo Token-otsake. Ei annettuja tunnuksia."
#: authentication.py:176 #: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces." msgid "Invalid token header. Token string should not contain spaces."
msgstr "Epäkelpo Token-otsake. Tunnusmerkkijono ei saa sisältää välilyöntejä." msgstr "Epäkelpo Token-otsake. Tunnusmerkkijono ei saa sisältää välilyöntejä."
#: authentication.py:182 #: authentication.py:185
msgid "" msgid ""
"Invalid token header. Token string should not contain invalid characters." "Invalid token header. Token string should not contain invalid characters."
msgstr "Epäkelpo Token-otsake. Tunnusmerkkijono ei saa sisältää epäkelpoja merkkejä." msgstr "Epäkelpo Token-otsake. Tunnusmerkkijono ei saa sisältää epäkelpoja merkkejä."
#: authentication.py:192 #: authentication.py:195
msgid "Invalid token." msgid "Invalid token."
msgstr "Epäkelpo Token." msgstr "Epäkelpo Token."
@ -60,23 +60,23 @@ msgstr "Epäkelpo Token."
msgid "Auth Token" msgid "Auth Token"
msgstr "" msgstr ""
#: authtoken/models.py:21 #: authtoken/models.py:15
msgid "Key" msgid "Key"
msgstr "" msgstr ""
#: authtoken/models.py:23 #: authtoken/models.py:18
msgid "User" msgid "User"
msgstr "" msgstr ""
#: authtoken/models.py:24 #: authtoken/models.py:20
msgid "Created" msgid "Created"
msgstr "" msgstr ""
#: authtoken/models.py:33 #: authtoken/models.py:29
msgid "Token" msgid "Token"
msgstr "" msgstr ""
#: authtoken/models.py:34 #: authtoken/models.py:30
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
@ -125,7 +125,6 @@ msgid "Not found."
msgstr "Ei löydy." msgstr "Ei löydy."
#: exceptions.py:109 #: exceptions.py:109
#, python-brace-format
msgid "Method \"{method}\" not allowed." msgid "Method \"{method}\" not allowed."
msgstr "Metodi \"{method}\" ei ole sallittu." msgstr "Metodi \"{method}\" ei ole sallittu."
@ -134,7 +133,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "Ei voitu vastata pyynnön Accept-otsakkeen mukaisesti." msgstr "Ei voitu vastata pyynnön Accept-otsakkeen mukaisesti."
#: exceptions.py:132 #: exceptions.py:132
#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request." msgid "Unsupported media type \"{media_type}\" in request."
msgstr "Pyynnön mediatyyppiä \"{media_type}\" ei tueta." msgstr "Pyynnön mediatyyppiä \"{media_type}\" ei tueta."
@ -142,214 +140,201 @@ msgstr "Pyynnön mediatyyppiä \"{media_type}\" ei tueta."
msgid "Request was throttled." msgid "Request was throttled."
msgstr "Pyyntö hidastettu." msgstr "Pyyntö hidastettu."
#: fields.py:266 relations.py:206 relations.py:239 validators.py:79 #: fields.py:269 relations.py:206 relations.py:239 validators.py:98
#: validators.py:162 #: validators.py:181
msgid "This field is required." msgid "This field is required."
msgstr "Tämä kenttä vaaditaan." msgstr "Tämä kenttä vaaditaan."
#: fields.py:267 #: fields.py:270
msgid "This field may not be null." msgid "This field may not be null."
msgstr "Tämän kentän arvo ei voi olla \"null\"." msgstr "Tämän kentän arvo ei voi olla \"null\"."
#: fields.py:603 fields.py:634 #: fields.py:608 fields.py:639
#, python-brace-format
msgid "\"{input}\" is not a valid boolean." msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" ei ole kelvollinen totuusarvo." msgstr "\"{input}\" ei ole kelvollinen totuusarvo."
#: fields.py:669 #: fields.py:674
msgid "This field may not be blank." msgid "This field may not be blank."
msgstr "Tämä kenttä ei voi olla tyhjä." msgstr "Tämä kenttä ei voi olla tyhjä."
#: fields.py:670 fields.py:1664 #: fields.py:675 fields.py:1675
#, python-brace-format
msgid "Ensure this field has no more than {max_length} characters." msgid "Ensure this field has no more than {max_length} characters."
msgstr "Arvo saa olla enintään {max_length} merkkiä pitkä." msgstr "Arvo saa olla enintään {max_length} merkkiä pitkä."
#: fields.py:671 #: fields.py:676
#, python-brace-format
msgid "Ensure this field has at least {min_length} characters." msgid "Ensure this field has at least {min_length} characters."
msgstr "Arvo tulee olla vähintään {min_length} merkkiä pitkä." msgstr "Arvo tulee olla vähintään {min_length} merkkiä pitkä."
#: fields.py:708 #: fields.py:713
msgid "Enter a valid email address." msgid "Enter a valid email address."
msgstr "Syötä kelvollinen sähköpostiosoite." msgstr "Syötä kelvollinen sähköpostiosoite."
#: fields.py:719 #: fields.py:724
msgid "This value does not match the required pattern." msgid "This value does not match the required pattern."
msgstr "Arvo ei täsmää vaadittuun kuvioon." msgstr "Arvo ei täsmää vaadittuun kuvioon."
#: fields.py:730 #: fields.py:735
msgid "" msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or " "Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens." "hyphens."
msgstr "Tässä voidaan käyttää vain kirjaimia (a-z), numeroita (0-9) sekä ala- ja tavuviivoja (_ -)." msgstr "Tässä voidaan käyttää vain kirjaimia (a-z), numeroita (0-9) sekä ala- ja tavuviivoja (_ -)."
#: fields.py:742 #: fields.py:747
msgid "Enter a valid URL." msgid "Enter a valid URL."
msgstr "Syötä oikea URL-osoite." msgstr "Syötä oikea URL-osoite."
#: fields.py:755 #: fields.py:760
#, python-brace-format
msgid "\"{value}\" is not a valid UUID." msgid "\"{value}\" is not a valid UUID."
msgstr "{value} ei ole kelvollinen UUID." msgstr "{value} ei ole kelvollinen UUID."
#: fields.py:791 #: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address." msgid "Enter a valid IPv4 or IPv6 address."
msgstr "Syötä kelvollinen IPv4- tai IPv6-osoite." msgstr "Syötä kelvollinen IPv4- tai IPv6-osoite."
#: fields.py:816 #: fields.py:821
msgid "A valid integer is required." msgid "A valid integer is required."
msgstr "Syötä kelvollinen kokonaisluku." msgstr "Syötä kelvollinen kokonaisluku."
#: fields.py:817 fields.py:852 fields.py:885 #: fields.py:822 fields.py:857 fields.py:891
#, python-brace-format
msgid "Ensure this value is less than or equal to {max_value}." msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Tämän arvon on oltava enintään {max_value}." msgstr "Tämän arvon on oltava enintään {max_value}."
#: fields.py:818 fields.py:853 fields.py:886 #: fields.py:823 fields.py:858 fields.py:892
#, python-brace-format
msgid "Ensure this value is greater than or equal to {min_value}." msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Tämän luvun on oltava vähintään {min_value}." msgstr "Tämän luvun on oltava vähintään {min_value}."
#: fields.py:819 fields.py:854 fields.py:890 #: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large." msgid "String value too large."
msgstr "Liian suuri merkkijonoarvo." msgstr "Liian suuri merkkijonoarvo."
#: fields.py:851 fields.py:884 #: fields.py:856 fields.py:890
msgid "A valid number is required." msgid "A valid number is required."
msgstr "Kelvollinen luku vaaditaan." msgstr "Kelvollinen luku vaaditaan."
#: fields.py:887 #: fields.py:893
#, python-brace-format
msgid "Ensure that there are no more than {max_digits} digits in total." msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "Tässä luvussa voi olla yhteensä enintään {max_digits} numeroa." msgstr "Tässä luvussa voi olla yhteensä enintään {max_digits} numeroa."
#: fields.py:888 #: fields.py:894
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places." "Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "Tässä luvussa saa olla enintään {max_decimal_places} desimaalia." msgstr "Tässä luvussa saa olla enintään {max_decimal_places} desimaalia."
#: fields.py:889 #: fields.py:895
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the " "Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point." "decimal point."
msgstr "Tässä luvussa saa olla enintään {max_whole_digits} numeroa ennen desimaalipilkkua." msgstr "Tässä luvussa saa olla enintään {max_whole_digits} numeroa ennen desimaalipilkkua."
#: fields.py:1004 #: fields.py:1025
#, python-brace-format
msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "Virheellinen päivämäärän/ajan muotoilu. Käytä jotain näistä muodoista: {format}" msgstr "Virheellinen päivämäärän/ajan muotoilu. Käytä jotain näistä muodoista: {format}"
#: fields.py:1005 #: fields.py:1026
msgid "Expected a datetime but got a date." msgid "Expected a datetime but got a date."
msgstr "Odotettiin päivämäärää ja aikaa, saatiin vain päivämäärä." msgstr "Odotettiin päivämäärää ja aikaa, saatiin vain päivämäärä."
#: fields.py:1082 #: fields.py:1103
#, python-brace-format
msgid "Date has wrong format. Use one of these formats instead: {format}." msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "Virheellinen päivämäärän muotoilu. Käytä jotain näistä muodoista: {format}" msgstr "Virheellinen päivämäärän muotoilu. Käytä jotain näistä muodoista: {format}"
#: fields.py:1083 #: fields.py:1104
msgid "Expected a date but got a datetime." msgid "Expected a date but got a datetime."
msgstr "Odotettiin päivämäärää, saatiin päivämäärä ja aika." msgstr "Odotettiin päivämäärää, saatiin päivämäärä ja aika."
#: fields.py:1151 #: fields.py:1170
#, python-brace-format
msgid "Time has wrong format. Use one of these formats instead: {format}." msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "Virheellinen kellonajan muotoilu. Käytä jotain näistä muodoista: {format}" msgstr "Virheellinen kellonajan muotoilu. Käytä jotain näistä muodoista: {format}"
#: fields.py:1215 #: fields.py:1232
#, python-brace-format
msgid "Duration has wrong format. Use one of these formats instead: {format}." msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "Virheellinen keston muotoilu. Käytä jotain näistä muodoista: {format}" msgstr "Virheellinen keston muotoilu. Käytä jotain näistä muodoista: {format}"
#: fields.py:1240 fields.py:1289 #: fields.py:1251 fields.py:1300
#, python-brace-format
msgid "\"{input}\" is not a valid choice." msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" ei ole kelvollinen valinta." msgstr "\"{input}\" ei ole kelvollinen valinta."
#: fields.py:1243 relations.py:71 relations.py:442 #: fields.py:1254 relations.py:71 relations.py:441
#, python-brace-format
msgid "More than {count} items..." msgid "More than {count} items..."
msgstr "Enemmän kuin {count} kappaletta..." msgstr "Enemmän kuin {count} kappaletta..."
#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520 #: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
#, python-brace-format
msgid "Expected a list of items but got type \"{input_type}\"." msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "Odotettiin listaa, saatiin tyyppi {input_type}." msgstr "Odotettiin listaa, saatiin tyyppi {input_type}."
#: fields.py:1291 #: fields.py:1302
msgid "This selection may not be empty." msgid "This selection may not be empty."
msgstr "Valinta ei saa olla tyhjä." msgstr "Valinta ei saa olla tyhjä."
#: fields.py:1328 #: fields.py:1339
#, python-brace-format
msgid "\"{input}\" is not a valid path choice." msgid "\"{input}\" is not a valid path choice."
msgstr "\"{input}\" ei ole kelvollinen polku." msgstr "\"{input}\" ei ole kelvollinen polku."
#: fields.py:1347 #: fields.py:1358
msgid "No file was submitted." msgid "No file was submitted."
msgstr "Yhtään tiedostoa ei ole lähetetty." msgstr "Yhtään tiedostoa ei ole lähetetty."
#: fields.py:1348 #: fields.py:1359
msgid "" msgid ""
"The submitted data was not a file. Check the encoding type on the form." "The submitted data was not a file. Check the encoding type on the form."
msgstr "Tiedostoa ei lähetetty. Tarkista lomakkeen koodaus (encoding)." msgstr "Tiedostoa ei lähetetty. Tarkista lomakkeen koodaus (encoding)."
#: fields.py:1349 #: fields.py:1360
msgid "No filename could be determined." msgid "No filename could be determined."
msgstr "Tiedostonimeä ei voitu päätellä." msgstr "Tiedostonimeä ei voitu päätellä."
#: fields.py:1350 #: fields.py:1361
msgid "The submitted file is empty." msgid "The submitted file is empty."
msgstr "Lähetetty tiedosto on tyhjä." msgstr "Lähetetty tiedosto on tyhjä."
#: fields.py:1351 #: fields.py:1362
#, python-brace-format
msgid "" msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})." "Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "Varmista että tiedostonimi on enintään {max_length} merkkiä pitkä (nyt {length})." msgstr "Varmista että tiedostonimi on enintään {max_length} merkkiä pitkä (nyt {length})."
#: fields.py:1399 #: fields.py:1410
msgid "" msgid ""
"Upload a valid image. The file you uploaded was either not an image or a " "Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image." "corrupted image."
msgstr "Kuva ei kelpaa. Lähettämäsi tiedosto ei ole kuva, tai tiedosto on vioittunut." msgstr "Kuva ei kelpaa. Lähettämäsi tiedosto ei ole kuva, tai tiedosto on vioittunut."
#: fields.py:1438 relations.py:439 serializers.py:521 #: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty." msgid "This list may not be empty."
msgstr "Lista ei saa olla tyhjä." msgstr "Lista ei saa olla tyhjä."
#: fields.py:1491 #: fields.py:1502
#, python-brace-format
msgid "Expected a dictionary of items but got type \"{input_type}\"." msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "Odotettiin sanakirjaa, saatiin tyyppi {input_type}." msgstr "Odotettiin sanakirjaa, saatiin tyyppi {input_type}."
#: fields.py:1538 #: fields.py:1549
msgid "Value must be valid JSON." msgid "Value must be valid JSON."
msgstr "Arvon pitää olla kelvollista JSONia." msgstr "Arvon pitää olla kelvollista JSONia."
#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5 #: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit" msgid "Submit"
msgstr "Lähetä" msgstr "Lähetä"
#: pagination.py:189 #: filters.py:336
msgid "ascending"
msgstr ""
#: filters.py:337
msgid "descending"
msgstr ""
#: pagination.py:193
msgid "Invalid page." msgid "Invalid page."
msgstr "" msgstr ""
#: pagination.py:407 #: pagination.py:427
msgid "Invalid cursor" msgid "Invalid cursor"
msgstr "Epäkelpo kursori" msgstr "Epäkelpo kursori"
#: relations.py:207 #: relations.py:207
#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist." msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "Epäkelpo pääavain {pk_value} - objektia ei ole olemassa." msgstr "Epäkelpo pääavain {pk_value} - objektia ei ole olemassa."
#: relations.py:208 #: relations.py:208
#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}." msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Väärä tyyppi. Odotettiin pääavainarvoa, saatiin {data_type}." msgstr "Väärä tyyppi. Odotettiin pääavainarvoa, saatiin {data_type}."
@ -366,25 +351,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Epäkelpo linkki - objektia ei ole." msgstr "Epäkelpo linkki - objektia ei ole."
#: relations.py:243 #: relations.py:243
#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}." msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Epäkelpo tyyppi. Odotettiin URL-merkkijonoa, saatiin {data_type}." msgstr "Epäkelpo tyyppi. Odotettiin URL-merkkijonoa, saatiin {data_type}."
#: relations.py:402 #: relations.py:401
#, python-brace-format
msgid "Object with {slug_name}={value} does not exist." msgid "Object with {slug_name}={value} does not exist."
msgstr "Objektia ({slug_name}={value}) ei ole." msgstr "Objektia ({slug_name}={value}) ei ole."
#: relations.py:403 #: relations.py:402
msgid "Invalid value." msgid "Invalid value."
msgstr "Epäkelpo arvo." msgstr "Epäkelpo arvo."
#: serializers.py:326 #: serializers.py:326
#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}." msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Odotettiin sanakirjaa, saatiin tyyppi {datatype}." msgstr "Odotettiin sanakirjaa, saatiin tyyppi {datatype}."
#: templates/rest_framework/admin.html:118 #: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128 #: templates/rest_framework/base.html:128
msgid "Filters" msgid "Filters"
msgstr "Suotimet" msgstr "Suotimet"
@ -414,27 +396,23 @@ msgstr "Ei mitään"
msgid "No items to select." msgid "No items to select."
msgstr "Ei valittavia kohteita." msgstr "Ei valittavia kohteita."
#: validators.py:24 #: validators.py:43
msgid "This field must be unique." msgid "This field must be unique."
msgstr "Arvon tulee olla uniikki." msgstr "Arvon tulee olla uniikki."
#: validators.py:78 #: validators.py:97
#, python-brace-format
msgid "The fields {field_names} must make a unique set." msgid "The fields {field_names} must make a unique set."
msgstr "Kenttien {field_names} tulee muodostaa uniikki joukko." msgstr "Kenttien {field_names} tulee muodostaa uniikki joukko."
#: validators.py:226 #: validators.py:245
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" date." msgid "This field must be unique for the \"{date_field}\" date."
msgstr "Kentän tulee olla uniikki päivämäärän {date_field} suhteen." msgstr "Kentän tulee olla uniikki päivämäärän {date_field} suhteen."
#: validators.py:241 #: validators.py:260
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" month." msgid "This field must be unique for the \"{date_field}\" month."
msgstr "Kentän tulee olla uniikki kuukauden {date_field} suhteen." msgstr "Kentän tulee olla uniikki kuukauden {date_field} suhteen."
#: validators.py:254 #: validators.py:273
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" year." msgid "This field must be unique for the \"{date_field}\" year."
msgstr "Kentän tulee olla uniikki vuoden {date_field} suhteen." msgstr "Kentän tulee olla uniikki vuoden {date_field} suhteen."
@ -442,15 +420,19 @@ msgstr "Kentän tulee olla uniikki vuoden {date_field} suhteen."
msgid "Invalid version in \"Accept\" header." msgid "Invalid version in \"Accept\" header."
msgstr "Epäkelpo versio Accept-otsakkeessa." msgstr "Epäkelpo versio Accept-otsakkeessa."
#: versioning.py:73 versioning.py:115 #: versioning.py:73
msgid "Invalid version in URL path." msgid "Invalid version in URL path."
msgstr "Epäkelpo versio URL-polussa." msgstr "Epäkelpo versio URL-polussa."
#: versioning.py:144 #: versioning.py:115
msgid "Invalid version in URL path. Does not match any version namespace."
msgstr ""
#: versioning.py:147
msgid "Invalid version in hostname." msgid "Invalid version in hostname."
msgstr "Epäkelpo versio palvelinosoitteessa." msgstr "Epäkelpo versio palvelinosoitteessa."
#: versioning.py:166 #: versioning.py:169
msgid "Invalid version in query parameter." msgid "Invalid version in query parameter."
msgstr "Epäkelpo versio kyselyparametrissa." msgstr "Epäkelpo versio kyselyparametrissa."

View File

@ -11,9 +11,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django REST framework\n" "Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-01 18:38+0100\n" "POT-Creation-Date: 2016-07-12 16:13+0100\n"
"PO-Revision-Date: 2016-03-01 17:40+0000\n" "PO-Revision-Date: 2016-07-12 15:14+0000\n"
"Last-Translator: Xavier Ordoquy <xordoquy@linovia.com>\n" "Last-Translator: Thomas Christie <tom@tomchristie.com>\n"
"Language-Team: French (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/fr/)\n" "Language-Team: French (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/fr/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -21,40 +21,40 @@ msgstr ""
"Language: fr\n" "Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: authentication.py:71 #: authentication.py:73
msgid "Invalid basic header. No credentials provided." msgid "Invalid basic header. No credentials provided."
msgstr "En-tête « basic » non valide. Informations d'identification non fournies." msgstr "En-tête « basic » non valide. Informations d'identification non fournies."
#: authentication.py:74 #: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces." msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "En-tête « basic » non valide. Les informations d'identification ne doivent pas contenir d'espaces." msgstr "En-tête « basic » non valide. Les informations d'identification ne doivent pas contenir d'espaces."
#: authentication.py:80 #: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded." msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "En-tête « basic » non valide. Encodage base64 des informations d'identification incorrect." msgstr "En-tête « basic » non valide. Encodage base64 des informations d'identification incorrect."
#: authentication.py:97 #: authentication.py:99
msgid "Invalid username/password." msgid "Invalid username/password."
msgstr "Nom d'utilisateur et/ou mot de passe non valide(s)." msgstr "Nom d'utilisateur et/ou mot de passe non valide(s)."
#: authentication.py:100 authentication.py:195 #: authentication.py:102 authentication.py:198
msgid "User inactive or deleted." msgid "User inactive or deleted."
msgstr "Utilisateur inactif ou supprimé." msgstr "Utilisateur inactif ou supprimé."
#: authentication.py:173 #: authentication.py:176
msgid "Invalid token header. No credentials provided." msgid "Invalid token header. No credentials provided."
msgstr "En-tête « token » non valide. Informations d'identification non fournies." msgstr "En-tête « token » non valide. Informations d'identification non fournies."
#: authentication.py:176 #: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces." msgid "Invalid token header. Token string should not contain spaces."
msgstr "En-tête « token » non valide. Un token ne doit pas contenir d'espaces." msgstr "En-tête « token » non valide. Un token ne doit pas contenir d'espaces."
#: authentication.py:182 #: authentication.py:185
msgid "" msgid ""
"Invalid token header. Token string should not contain invalid characters." "Invalid token header. Token string should not contain invalid characters."
msgstr "En-tête « token » non valide. Un token ne doit pas contenir de caractères invalides." msgstr "En-tête « token » non valide. Un token ne doit pas contenir de caractères invalides."
#: authentication.py:192 #: authentication.py:195
msgid "Invalid token." msgid "Invalid token."
msgstr "Token non valide." msgstr "Token non valide."
@ -62,23 +62,23 @@ msgstr "Token non valide."
msgid "Auth Token" msgid "Auth Token"
msgstr "Jeton d'authentification" msgstr "Jeton d'authentification"
#: authtoken/models.py:21 #: authtoken/models.py:15
msgid "Key" msgid "Key"
msgstr "Clef" msgstr "Clef"
#: authtoken/models.py:23 #: authtoken/models.py:18
msgid "User" msgid "User"
msgstr "Utilisateur" msgstr "Utilisateur"
#: authtoken/models.py:24 #: authtoken/models.py:20
msgid "Created" msgid "Created"
msgstr "Création" msgstr "Création"
#: authtoken/models.py:33 #: authtoken/models.py:29
msgid "Token" msgid "Token"
msgstr "Jeton" msgstr "Jeton"
#: authtoken/models.py:34 #: authtoken/models.py:30
msgid "Tokens" msgid "Tokens"
msgstr "Jetons" msgstr "Jetons"
@ -127,7 +127,6 @@ msgid "Not found."
msgstr "Pas trouvé." msgstr "Pas trouvé."
#: exceptions.py:109 #: exceptions.py:109
#, python-brace-format
msgid "Method \"{method}\" not allowed." msgid "Method \"{method}\" not allowed."
msgstr "Méthode \"{method}\" non autorisée." msgstr "Méthode \"{method}\" non autorisée."
@ -136,7 +135,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "L'en-tête « Accept » n'a pas pu être satisfaite." msgstr "L'en-tête « Accept » n'a pas pu être satisfaite."
#: exceptions.py:132 #: exceptions.py:132
#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request." msgid "Unsupported media type \"{media_type}\" in request."
msgstr "Type de média \"{media_type}\" non supporté." msgstr "Type de média \"{media_type}\" non supporté."
@ -144,214 +142,201 @@ msgstr "Type de média \"{media_type}\" non supporté."
msgid "Request was throttled." msgid "Request was throttled."
msgstr "Requête ralentie." msgstr "Requête ralentie."
#: fields.py:266 relations.py:206 relations.py:239 validators.py:79 #: fields.py:269 relations.py:206 relations.py:239 validators.py:98
#: validators.py:162 #: validators.py:181
msgid "This field is required." msgid "This field is required."
msgstr "Ce champ est obligatoire." msgstr "Ce champ est obligatoire."
#: fields.py:267 #: fields.py:270
msgid "This field may not be null." msgid "This field may not be null."
msgstr "Ce champ ne peut être nul." msgstr "Ce champ ne peut être nul."
#: fields.py:603 fields.py:634 #: fields.py:608 fields.py:639
#, python-brace-format
msgid "\"{input}\" is not a valid boolean." msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" n'est pas un booléen valide." msgstr "\"{input}\" n'est pas un booléen valide."
#: fields.py:669 #: fields.py:674
msgid "This field may not be blank." msgid "This field may not be blank."
msgstr "Ce champ ne peut être vide." msgstr "Ce champ ne peut être vide."
#: fields.py:670 fields.py:1664 #: fields.py:675 fields.py:1675
#, python-brace-format
msgid "Ensure this field has no more than {max_length} characters." msgid "Ensure this field has no more than {max_length} characters."
msgstr "Assurez-vous que ce champ comporte au plus {max_length} caractères." msgstr "Assurez-vous que ce champ comporte au plus {max_length} caractères."
#: fields.py:671 #: fields.py:676
#, python-brace-format
msgid "Ensure this field has at least {min_length} characters." msgid "Ensure this field has at least {min_length} characters."
msgstr "Assurez-vous que ce champ comporte au moins {min_length} caractères." msgstr "Assurez-vous que ce champ comporte au moins {min_length} caractères."
#: fields.py:708 #: fields.py:713
msgid "Enter a valid email address." msgid "Enter a valid email address."
msgstr "Saisissez une adresse email valable." msgstr "Saisissez une adresse email valable."
#: fields.py:719 #: fields.py:724
msgid "This value does not match the required pattern." msgid "This value does not match the required pattern."
msgstr "Cette valeur ne satisfait pas le motif imposé." msgstr "Cette valeur ne satisfait pas le motif imposé."
#: fields.py:730 #: fields.py:735
msgid "" msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or " "Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens." "hyphens."
msgstr "Ce champ ne doit contenir que des lettres, des nombres, des tirets bas _ et des traits d'union." msgstr "Ce champ ne doit contenir que des lettres, des nombres, des tirets bas _ et des traits d'union."
#: fields.py:742 #: fields.py:747
msgid "Enter a valid URL." msgid "Enter a valid URL."
msgstr "Saisissez une URL valide." msgstr "Saisissez une URL valide."
#: fields.py:755 #: fields.py:760
#, python-brace-format
msgid "\"{value}\" is not a valid UUID." msgid "\"{value}\" is not a valid UUID."
msgstr "\"{value}\" n'est pas un UUID valide." msgstr "\"{value}\" n'est pas un UUID valide."
#: fields.py:791 #: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address." msgid "Enter a valid IPv4 or IPv6 address."
msgstr "Saisissez une adresse IPv4 ou IPv6 valide." msgstr "Saisissez une adresse IPv4 ou IPv6 valide."
#: fields.py:816 #: fields.py:821
msgid "A valid integer is required." msgid "A valid integer is required."
msgstr "Un nombre entier valide est requis." msgstr "Un nombre entier valide est requis."
#: fields.py:817 fields.py:852 fields.py:885 #: fields.py:822 fields.py:857 fields.py:891
#, python-brace-format
msgid "Ensure this value is less than or equal to {max_value}." msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Assurez-vous que cette valeur est inférieure ou égale à {max_value}." msgstr "Assurez-vous que cette valeur est inférieure ou égale à {max_value}."
#: fields.py:818 fields.py:853 fields.py:886 #: fields.py:823 fields.py:858 fields.py:892
#, python-brace-format
msgid "Ensure this value is greater than or equal to {min_value}." msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Assurez-vous que cette valeur est supérieure ou égale à {min_value}." msgstr "Assurez-vous que cette valeur est supérieure ou égale à {min_value}."
#: fields.py:819 fields.py:854 fields.py:890 #: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large." msgid "String value too large."
msgstr "Chaîne de caractères trop longue." msgstr "Chaîne de caractères trop longue."
#: fields.py:851 fields.py:884 #: fields.py:856 fields.py:890
msgid "A valid number is required." msgid "A valid number is required."
msgstr "Un nombre valide est requis." msgstr "Un nombre valide est requis."
#: fields.py:887 #: fields.py:893
#, python-brace-format
msgid "Ensure that there are no more than {max_digits} digits in total." msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "Assurez-vous qu'il n'y a pas plus de {max_digits} chiffres au total." msgstr "Assurez-vous qu'il n'y a pas plus de {max_digits} chiffres au total."
#: fields.py:888 #: fields.py:894
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places." "Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "Assurez-vous qu'il n'y a pas plus de {max_decimal_places} chiffres après la virgule." msgstr "Assurez-vous qu'il n'y a pas plus de {max_decimal_places} chiffres après la virgule."
#: fields.py:889 #: fields.py:895
#, python-brace-format
msgid "" msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the " "Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point." "decimal point."
msgstr "Assurez-vous qu'il n'y a pas plus de {max_whole_digits} chiffres avant la virgule." msgstr "Assurez-vous qu'il n'y a pas plus de {max_whole_digits} chiffres avant la virgule."
#: fields.py:1004 #: fields.py:1025
#, python-brace-format
msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "La date + heure n'a pas le bon format. Utilisez un des formats suivants : {format}." msgstr "La date + heure n'a pas le bon format. Utilisez un des formats suivants : {format}."
#: fields.py:1005 #: fields.py:1026
msgid "Expected a datetime but got a date." msgid "Expected a datetime but got a date."
msgstr "Attendait une date + heure mais a reçu une date." msgstr "Attendait une date + heure mais a reçu une date."
#: fields.py:1082 #: fields.py:1103
#, python-brace-format
msgid "Date has wrong format. Use one of these formats instead: {format}." msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "La date n'a pas le bon format. Utilisez un des formats suivants : {format}." msgstr "La date n'a pas le bon format. Utilisez un des formats suivants : {format}."
#: fields.py:1083 #: fields.py:1104
msgid "Expected a date but got a datetime." msgid "Expected a date but got a datetime."
msgstr "Attendait une date mais a reçu une date + heure." msgstr "Attendait une date mais a reçu une date + heure."
#: fields.py:1151 #: fields.py:1170
#, python-brace-format
msgid "Time has wrong format. Use one of these formats instead: {format}." msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "L'heure n'a pas le bon format. Utilisez un des formats suivants : {format}." msgstr "L'heure n'a pas le bon format. Utilisez un des formats suivants : {format}."
#: fields.py:1215 #: fields.py:1232
#, python-brace-format
msgid "Duration has wrong format. Use one of these formats instead: {format}." msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "La durée n'a pas le bon format. Utilisez l'un des formats suivants: {format}." msgstr "La durée n'a pas le bon format. Utilisez l'un des formats suivants: {format}."
#: fields.py:1240 fields.py:1289 #: fields.py:1251 fields.py:1300
#, python-brace-format
msgid "\"{input}\" is not a valid choice." msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" n'est pas un choix valide." msgstr "\"{input}\" n'est pas un choix valide."
#: fields.py:1243 relations.py:71 relations.py:442 #: fields.py:1254 relations.py:71 relations.py:441
#, python-brace-format
msgid "More than {count} items..." msgid "More than {count} items..."
msgstr "Plus de {count} éléments..." msgstr "Plus de {count} éléments..."
#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520 #: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
#, python-brace-format
msgid "Expected a list of items but got type \"{input_type}\"." msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "Attendait une liste d'éléments mais a reçu \"{input_type}\"." msgstr "Attendait une liste d'éléments mais a reçu \"{input_type}\"."
#: fields.py:1291 #: fields.py:1302
msgid "This selection may not be empty." msgid "This selection may not be empty."
msgstr "Cette sélection ne peut être vide." msgstr "Cette sélection ne peut être vide."
#: fields.py:1328 #: fields.py:1339
#, python-brace-format
msgid "\"{input}\" is not a valid path choice." msgid "\"{input}\" is not a valid path choice."
msgstr "\"{input}\" n'est pas un choix de chemin valide." msgstr "\"{input}\" n'est pas un choix de chemin valide."
#: fields.py:1347 #: fields.py:1358
msgid "No file was submitted." msgid "No file was submitted."
msgstr "Aucun fichier n'a été soumis." msgstr "Aucun fichier n'a été soumis."
#: fields.py:1348 #: fields.py:1359
msgid "" msgid ""
"The submitted data was not a file. Check the encoding type on the form." "The submitted data was not a file. Check the encoding type on the form."
msgstr "La donnée soumise n'est pas un fichier. Vérifiez le type d'encodage du formulaire." msgstr "La donnée soumise n'est pas un fichier. Vérifiez le type d'encodage du formulaire."
#: fields.py:1349 #: fields.py:1360
msgid "No filename could be determined." msgid "No filename could be determined."
msgstr "Le nom de fichier n'a pu être déterminé." msgstr "Le nom de fichier n'a pu être déterminé."
#: fields.py:1350 #: fields.py:1361
msgid "The submitted file is empty." msgid "The submitted file is empty."
msgstr "Le fichier soumis est vide." msgstr "Le fichier soumis est vide."
#: fields.py:1351 #: fields.py:1362
#, python-brace-format
msgid "" msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})." "Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "Assurez-vous que le nom de fichier comporte au plus {max_length} caractères (il en comporte {length})." msgstr "Assurez-vous que le nom de fichier comporte au plus {max_length} caractères (il en comporte {length})."
#: fields.py:1399 #: fields.py:1410
msgid "" msgid ""
"Upload a valid image. The file you uploaded was either not an image or a " "Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image." "corrupted image."
msgstr "Transférez une image valide. Le fichier que vous avez transféré n'est pas une image, ou il est corrompu." msgstr "Transférez une image valide. Le fichier que vous avez transféré n'est pas une image, ou il est corrompu."
#: fields.py:1438 relations.py:439 serializers.py:521 #: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty." msgid "This list may not be empty."
msgstr "Cette liste ne peut pas être vide." msgstr "Cette liste ne peut pas être vide."
#: fields.py:1491 #: fields.py:1502
#, python-brace-format
msgid "Expected a dictionary of items but got type \"{input_type}\"." msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "Attendait un dictionnaire d'éléments mais a reçu \"{input_type}\"." msgstr "Attendait un dictionnaire d'éléments mais a reçu \"{input_type}\"."
#: fields.py:1538 #: fields.py:1549
msgid "Value must be valid JSON." msgid "Value must be valid JSON."
msgstr "La valeur doit être un JSON valide." msgstr "La valeur doit être un JSON valide."
#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5 #: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit" msgid "Submit"
msgstr "Envoyer" msgstr "Envoyer"
#: pagination.py:189 #: filters.py:336
msgid "ascending"
msgstr ""
#: filters.py:337
msgid "descending"
msgstr ""
#: pagination.py:193
msgid "Invalid page." msgid "Invalid page."
msgstr "Page invalide." msgstr "Page invalide."
#: pagination.py:407 #: pagination.py:427
msgid "Invalid cursor" msgid "Invalid cursor"
msgstr "Curseur non valide" msgstr "Curseur non valide"
#: relations.py:207 #: relations.py:207
#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist." msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "Clé primaire \"{pk_value}\" non valide - l'objet n'existe pas." msgstr "Clé primaire \"{pk_value}\" non valide - l'objet n'existe pas."
#: relations.py:208 #: relations.py:208
#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}." msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Type incorrect. Attendait une clé primaire, a reçu {data_type}." msgstr "Type incorrect. Attendait une clé primaire, a reçu {data_type}."
@ -368,25 +353,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Lien non valide : l'objet n'existe pas." msgstr "Lien non valide : l'objet n'existe pas."
#: relations.py:243 #: relations.py:243
#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}." msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Type incorrect. Attendait une URL, a reçu {data_type}." msgstr "Type incorrect. Attendait une URL, a reçu {data_type}."
#: relations.py:402 #: relations.py:401
#, python-brace-format
msgid "Object with {slug_name}={value} does not exist." msgid "Object with {slug_name}={value} does not exist."
msgstr "L'object avec {slug_name}={value} n'existe pas." msgstr "L'object avec {slug_name}={value} n'existe pas."
#: relations.py:403 #: relations.py:402
msgid "Invalid value." msgid "Invalid value."
msgstr "Valeur non valide." msgstr "Valeur non valide."
#: serializers.py:326 #: serializers.py:326
#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}." msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Donnée non valide. Attendait un dictionnaire, a reçu {datatype}." msgstr "Donnée non valide. Attendait un dictionnaire, a reçu {datatype}."
#: templates/rest_framework/admin.html:118 #: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128 #: templates/rest_framework/base.html:128
msgid "Filters" msgid "Filters"
msgstr "Filtres" msgstr "Filtres"
@ -416,27 +398,23 @@ msgstr "Aucune"
msgid "No items to select." msgid "No items to select."
msgstr "Aucun élément à sélectionner." msgstr "Aucun élément à sélectionner."
#: validators.py:24 #: validators.py:43
msgid "This field must be unique." msgid "This field must be unique."
msgstr "Ce champ doit être unique." msgstr "Ce champ doit être unique."
#: validators.py:78 #: validators.py:97
#, python-brace-format
msgid "The fields {field_names} must make a unique set." msgid "The fields {field_names} must make a unique set."
msgstr "Les champs {field_names} doivent former un ensemble unique." msgstr "Les champs {field_names} doivent former un ensemble unique."
#: validators.py:226 #: validators.py:245
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" date." msgid "This field must be unique for the \"{date_field}\" date."
msgstr "Ce champ doit être unique pour la date \"{date_field}\"." msgstr "Ce champ doit être unique pour la date \"{date_field}\"."
#: validators.py:241 #: validators.py:260
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" month." msgid "This field must be unique for the \"{date_field}\" month."
msgstr "Ce champ doit être unique pour le mois \"{date_field}\"." msgstr "Ce champ doit être unique pour le mois \"{date_field}\"."
#: validators.py:254 #: validators.py:273
#, python-brace-format
msgid "This field must be unique for the \"{date_field}\" year." msgid "This field must be unique for the \"{date_field}\" year."
msgstr "Ce champ doit être unique pour l'année \"{date_field}\"." msgstr "Ce champ doit être unique pour l'année \"{date_field}\"."
@ -444,15 +422,19 @@ msgstr "Ce champ doit être unique pour l'année \"{date_field}\"."
msgid "Invalid version in \"Accept\" header." msgid "Invalid version in \"Accept\" header."
msgstr "Version non valide dans l'en-tête « Accept »." msgstr "Version non valide dans l'en-tête « Accept »."
#: versioning.py:73 versioning.py:115 #: versioning.py:73
msgid "Invalid version in URL path." msgid "Invalid version in URL path."
msgstr "Version non valide dans l'URL." msgstr "Version non valide dans l'URL."
#: versioning.py:144 #: versioning.py:115
msgid "Invalid version in URL path. Does not match any version namespace."
msgstr ""
#: versioning.py:147
msgid "Invalid version in hostname." msgid "Invalid version in hostname."
msgstr "Version non valide dans le nom d'hôte." msgstr "Version non valide dans le nom d'hôte."
#: versioning.py:166 #: versioning.py:169
msgid "Invalid version in query parameter." msgid "Invalid version in query parameter."
msgstr "Version non valide dans le paramètre de requête." msgstr "Version non valide dans le paramètre de requête."

Some files were not shown because too many files have changed in this diff Show More