From d5edf20cee559050b70dd095bf243287bf2c2248 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Sun, 17 Nov 2013 18:26:41 +0000 Subject: [PATCH] gh-pages hosted docs --- api-guide/authentication.html | 533 ++ api-guide/content-negotiation.html | 315 + api-guide/exceptions.html | 345 + api-guide/fields.html | 487 ++ api-guide/filtering.html | 533 ++ api-guide/format-suffixes.html | 290 + api-guide/generic-views.html | 506 ++ api-guide/pagination.html | 366 ++ api-guide/parsers.html | 376 ++ api-guide/permissions.html | 419 ++ api-guide/relations.html | 616 ++ api-guide/renderers.html | 543 ++ api-guide/requests.html | 321 + api-guide/responses.html | 304 + api-guide/reverse.html | 279 + api-guide/routers.html | 369 ++ api-guide/serializers.html | 668 ++ api-guide/settings.html | 468 ++ api-guide/status-codes.html | 320 + api-guide/testing.html | 451 ++ api-guide/throttling.html | 383 ++ api-guide/views.html | 360 + api-guide/viewsets.html | 437 ++ css/bootstrap-responsive.css | 1058 +++ css/bootstrap.css | 5774 +++++++++++++++++ css/default.css | 309 + css/prettify.css | 30 + img/apiary.png | Bin 0 -> 55554 bytes img/autocomplete.png | Bin 0 -> 58140 bytes img/cerulean.png | Bin 0 -> 62558 bytes img/django-rest-swagger.png | Bin 0 -> 76945 bytes img/favicon.ico | Bin 0 -> 2238 bytes img/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes img/glyphicons-halflings.png | Bin 0 -> 12799 bytes img/grid.png | Bin 0 -> 1458 bytes img/quickstart.png | Bin 0 -> 39050 bytes img/rest-framework-docs.png | Bin 0 -> 76612 bytes img/self-describing.png | Bin 0 -> 53953 bytes img/slate.png | Bin 0 -> 65706 bytes index.html | 449 ++ js/bootstrap-2.1.1-min.js | 7 + js/jquery-1.8.1-min.js | 2 + js/prettify-1.0.js | 28 + topics/2.2-announcement.html | 350 + topics/2.3-announcement.html | 443 ++ topics/ajax-csrf-cors.html | 263 + topics/browsable-api.html | 357 + topics/browser-enhancements.html | 297 + topics/contributing.html | 351 + topics/credits.html | 432 ++ topics/documenting-your-api.html | 302 + topics/release-notes.html | 771 +++ topics/rest-framework-2-announcement.html | 298 + topics/rest-hypermedia-hateoas.html | 266 + topics/writable-nested-serializers.html | 274 + tutorial/1-serialization.html | 539 ++ tutorial/2-requests-and-responses.html | 379 ++ tutorial/3-class-based-views.html | 370 ++ .../4-authentication-and-permissions.html | 403 ++ .../5-relationships-and-hyperlinked-apis.html | 372 ++ tutorial/6-viewsets-and-routers.html | 361 ++ tutorial/quickstart.html | 385 ++ 62 files changed, 24559 insertions(+) create mode 100644 api-guide/authentication.html create mode 100644 api-guide/content-negotiation.html create mode 100644 api-guide/exceptions.html create mode 100644 api-guide/fields.html create mode 100644 api-guide/filtering.html create mode 100644 api-guide/format-suffixes.html create mode 100644 api-guide/generic-views.html create mode 100644 api-guide/pagination.html create mode 100644 api-guide/parsers.html create mode 100644 api-guide/permissions.html create mode 100644 api-guide/relations.html create mode 100644 api-guide/renderers.html create mode 100644 api-guide/requests.html create mode 100644 api-guide/responses.html create mode 100644 api-guide/reverse.html create mode 100644 api-guide/routers.html create mode 100644 api-guide/serializers.html create mode 100644 api-guide/settings.html create mode 100644 api-guide/status-codes.html create mode 100644 api-guide/testing.html create mode 100644 api-guide/throttling.html create mode 100644 api-guide/views.html create mode 100644 api-guide/viewsets.html create mode 100755 css/bootstrap-responsive.css create mode 100755 css/bootstrap.css create mode 100644 css/default.css create mode 100644 css/prettify.css create mode 100644 img/apiary.png create mode 100644 img/autocomplete.png create mode 100644 img/cerulean.png create mode 100644 img/django-rest-swagger.png create mode 100644 img/favicon.ico create mode 100644 img/glyphicons-halflings-white.png create mode 100644 img/glyphicons-halflings.png create mode 100644 img/grid.png create mode 100644 img/quickstart.png create mode 100644 img/rest-framework-docs.png create mode 100644 img/self-describing.png create mode 100644 img/slate.png create mode 100644 index.html create mode 100755 js/bootstrap-2.1.1-min.js create mode 100644 js/jquery-1.8.1-min.js create mode 100644 js/prettify-1.0.js create mode 100644 topics/2.2-announcement.html create mode 100644 topics/2.3-announcement.html create mode 100644 topics/ajax-csrf-cors.html create mode 100644 topics/browsable-api.html create mode 100644 topics/browser-enhancements.html create mode 100644 topics/contributing.html create mode 100644 topics/credits.html create mode 100644 topics/documenting-your-api.html create mode 100644 topics/release-notes.html create mode 100644 topics/rest-framework-2-announcement.html create mode 100644 topics/rest-hypermedia-hateoas.html create mode 100644 topics/writable-nested-serializers.html create mode 100644 tutorial/1-serialization.html create mode 100644 tutorial/2-requests-and-responses.html create mode 100644 tutorial/3-class-based-views.html create mode 100644 tutorial/4-authentication-and-permissions.html create mode 100644 tutorial/5-relationships-and-hyperlinked-apis.html create mode 100644 tutorial/6-viewsets-and-routers.html create mode 100644 tutorial/quickstart.html diff --git a/api-guide/authentication.html b/api-guide/authentication.html new file mode 100644 index 000000000..c28b2239b --- /dev/null +++ b/api-guide/authentication.html @@ -0,0 +1,533 @@ + + + + + Django REST framework - Authentication + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + + + +
+ +
+ +
+ + + + +
+
+ +
+

authentication.py

+

Authentication

+
+

Auth needs to be pluggable.

+

— Jacob Kaplan-Moss, "REST worst practices"

+
+

Authentication is the mechanism of associating an incoming request with a set of identifying credentials, such as the user the request came from, or the token that it was signed with. The permission and throttling policies can then use those credentials to determine if the request should be permitted.

+

REST framework provides a number of authentication schemes out of the box, and also allows you to implement custom schemes.

+

Authentication is always run at the very start of the view, before the permission and throttling checks occur, and before any other code is allowed to proceed.

+

The request.user property will typically be set to an instance of the contrib.auth package's User class.

+

The request.auth property is used for any additional authentication information, for example, it may be used to represent an authentication token that the request was signed with.

+
+

Note: Don't forget that authentication by itself won't allow or disallow an incoming request, it simply identifies the credentials that the request was made with.

+

For information on how to setup the permission polices for your API please see the permissions documentation.

+
+

How authentication is determined

+

The authentication schemes are always defined as a list of classes. REST framework will attempt to authenticate with each class in the list, and will set request.user and request.auth using the return value of the first class that successfully authenticates.

+

If no class authenticates, request.user will be set to an instance of django.contrib.auth.models.AnonymousUser, and request.auth will be set to None.

+

The value of request.user and request.auth for unauthenticated requests can be modified using the UNAUTHENTICATED_USER and UNAUTHENTICATED_TOKEN settings.

+

Setting the authentication scheme

+

The default authentication schemes may be set globally, using the DEFAULT_AUTHENTICATION setting. For example.

+
REST_FRAMEWORK = {
+    'DEFAULT_AUTHENTICATION_CLASSES': (
+        'rest_framework.authentication.BasicAuthentication',
+        'rest_framework.authentication.SessionAuthentication',
+    )
+}
+
+

You can also set the authentication scheme on a per-view or per-viewset basis, +using the APIView class based views.

+
from rest_framework.authentication import SessionAuthentication, BasicAuthentication
+from rest_framework.permissions import IsAuthenticated
+from rest_framework.response import Response
+from rest_framework.views import APIView
+
+class ExampleView(APIView):
+    authentication_classes = (SessionAuthentication, BasicAuthentication)
+    permission_classes = (IsAuthenticated,)
+
+    def get(self, request, format=None):
+        content = {
+            'user': unicode(request.user),  # `django.contrib.auth.User` instance.
+            'auth': unicode(request.auth),  # None
+        }
+        return Response(content)
+
+

Or, if you're using the @api_view decorator with function based views.

+
@api_view(['GET'])
+@authentication_classes((SessionAuthentication, BasicAuthentication))
+@permission_classes((IsAuthenticated,))
+def example_view(request, format=None):
+    content = {
+        'user': unicode(request.user),  # `django.contrib.auth.User` instance.
+        'auth': unicode(request.auth),  # None
+    }
+    return Response(content)
+
+

Unauthorized and Forbidden responses

+

When an unauthenticated request is denied permission there are two different error codes that may be appropriate.

+ +

HTTP 401 responses must always include a WWW-Authenticate header, that instructs the client how to authenticate. HTTP 403 responses do not include the WWW-Authenticate header.

+

The kind of response that will be used depends on the authentication scheme. Although multiple authentication schemes may be in use, only one scheme may be used to determine the type of response. The first authentication class set on the view is used when determining the type of response.

+

Note that when a request may successfully authenticate, but still be denied permission to perform the request, in which case a 403 Permission Denied response will always be used, regardless of the authentication scheme.

+

Apache mod_wsgi specific configuration

+

Note that if deploying to Apache using mod_wsgi, the authorization header is not passed through to a WSGI application by default, as it is assumed that authentication will be handled by Apache, rather than at an application level.

+

If you are deploying to Apache, and using any non-session based authentication, you will need to explicitly configure mod_wsgi to pass the required headers through to the application. This can be done by specifying the WSGIPassAuthorization directive in the appropriate context and setting it to 'On'.

+
# this can go in either server config, virtual host, directory or .htaccess 
+WSGIPassAuthorization On
+
+
+

API Reference

+

BasicAuthentication

+

This authentication scheme uses HTTP Basic Authentication, signed against a user's username and password. Basic authentication is generally only appropriate for testing.

+

If successfully authenticated, BasicAuthentication provides the following credentials.

+
    +
  • request.user will be a Django User instance.
  • +
  • request.auth will be None.
  • +
+

Unauthenticated responses that are denied permission will result in an HTTP 401 Unauthorized response with an appropriate WWW-Authenticate header. For example:

+
WWW-Authenticate: Basic realm="api"
+
+

Note: If you use BasicAuthentication in production you must ensure that your API is only available over https. You should also ensure that your API clients will always re-request the username and password at login, and will never store those details to persistent storage.

+

TokenAuthentication

+

This authentication scheme uses a simple token-based HTTP Authentication scheme. Token authentication is appropriate for client-server setups, such as native desktop and mobile clients.

+

To use the TokenAuthentication scheme, include rest_framework.authtoken in your INSTALLED_APPS setting:

+
INSTALLED_APPS = (
+    ...
+    'rest_framework.authtoken'
+)
+
+

Make sure to run manage.py syncdb after changing your settings. The authtoken database tables are managed by south (see Schema migrations below).

+

You'll also need to create tokens for your users.

+
from rest_framework.authtoken.models import Token
+
+token = Token.objects.create(user=...)
+print token.key
+
+

For clients to authenticate, the token key should be included in the Authorization HTTP header. The key should be prefixed by the string literal "Token", with whitespace separating the two strings. For example:

+
Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b
+
+

If successfully authenticated, TokenAuthentication provides the following credentials.

+
    +
  • request.user will be a Django User instance.
  • +
  • request.auth will be a rest_framework.authtoken.models.BasicToken instance.
  • +
+

Unauthenticated responses that are denied permission will result in an HTTP 401 Unauthorized response with an appropriate WWW-Authenticate header. For example:

+
WWW-Authenticate: Token
+
+

The curl command line tool may be useful for testing token authenticated APIs. For example:

+
curl -X GET http://127.0.0.1:8000/api/example/ -H 'Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b'
+
+
+

Note: If you use TokenAuthentication in production you must ensure that your API is only available over https.

+
+

Generating Tokens

+

If you want every user to have an automatically generated Token, you can simply catch the User's post_save signal.

+
from django.dispatch import receiver
+from rest_framework.authtoken.models import Token
+
+@receiver(post_save, sender=User)
+def create_auth_token(sender, instance=None, created=False, **kwargs):
+    if created:
+        Token.objects.create(user=instance)
+
+

Note that you'll want to ensure you place this code snippet in an installed models.py module, or some other location that will be imported by Django on startup.

+

If you've already created some users, you can generate tokens for all existing users like this:

+
from django.contrib.auth.models import User
+from rest_framework.authtoken.models import Token
+
+for user in User.objects.all():
+    Token.objects.get_or_create(user=user)
+
+

When using TokenAuthentication, you may want to provide a mechanism for clients to obtain a token given the username and password. REST framework provides a built-in view to provide this behavior. To use it, add the obtain_auth_token view to your URLconf:

+
urlpatterns += patterns('',
+    url(r'^api-token-auth/', 'rest_framework.authtoken.views.obtain_auth_token')
+)
+
+

Note that the URL part of the pattern can be whatever you want to use.

+

The obtain_auth_token view will return a JSON response when valid username and password fields are POSTed to the view using form data or JSON:

+
{ 'token' : '9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b' }
+
+

Note that the default obtain_auth_token view explicitly uses JSON requests and responses, rather than using default renderer and parser classes in your settings. If you need a customized version of the obtain_auth_token view, you can do so by overriding the ObtainAuthToken view class, and using that in your url conf instead.

+

Schema migrations

+

The rest_framework.authtoken app includes a south migration that will create the authtoken table.

+

If you're using a custom user model you'll need to make sure that any initial migration that creates the user table runs before the authtoken table is created.

+

You can do so by inserting a needed_by attribute in your user migration:

+
class Migration:
+
+    needed_by = (
+        ('authtoken', '0001_initial'),
+    )
+
+    def forwards(self):
+        ...
+
+

For more details, see the south documentation on dependencies.

+

Also note that if you're using a post_save signal to create tokens, then the first time you create the database tables, you'll need to ensure any migrations are run prior to creating any superusers. For example:

+
python manage.py syncdb --noinput  # Won't create a superuser just yet, due to `--noinput`.
+python manage.py migrate
+python manage.py createsuperuser
+
+

SessionAuthentication

+

This authentication scheme uses Django's default session backend for authentication. Session authentication is appropriate for AJAX clients that are running in the same session context as your website.

+

If successfully authenticated, SessionAuthentication provides the following credentials.

+
    +
  • request.user will be a Django User instance.
  • +
  • request.auth will be None.
  • +
+

Unauthenticated responses that are denied permission will result in an HTTP 403 Forbidden response.

+

If you're using an AJAX style API with SessionAuthentication, you'll need to make sure you include a valid CSRF token for any "unsafe" HTTP method calls, such as PUT, PATCH, POST or DELETE requests. See the Django CSRF documentation for more details.

+

OAuthAuthentication

+

This authentication uses OAuth 1.0a authentication scheme. OAuth 1.0a provides signature validation which provides a reasonable level of security over plain non-HTTPS connections. However, it may also be considered more complicated than OAuth2, as it requires clients to sign their requests.

+

This authentication class depends on the optional django-oauth-plus and oauth2 packages. In order to make it work you must install these packages and add oauth_provider to your INSTALLED_APPS:

+
INSTALLED_APPS = (
+    ...
+    `oauth_provider`,
+)
+
+

Don't forget to run syncdb once you've added the package.

+
python manage.py syncdb
+
+

Getting started with django-oauth-plus

+

The OAuthAuthentication class only provides token verification and signature validation for requests. It doesn't provide authorization flow for your clients. You still need to implement your own views for accessing and authorizing tokens.

+

The django-oauth-plus package provides simple foundation for classic 'three-legged' oauth flow. Please refer to the documentation for more details.

+

OAuth2Authentication

+

This authentication uses OAuth 2.0 authentication scheme. OAuth2 is more simple to work with than OAuth1, and provides much better security than simple token authentication. It is an unauthenticated scheme, and requires you to use an HTTPS connection.

+

This authentication class depends on the optional django-oauth2-provider project. In order to make it work you must install this package and add provider and provider.oauth2 to your INSTALLED_APPS:

+
INSTALLED_APPS = (
+    ...
+    'provider',
+    'provider.oauth2',
+)
+
+

Then add OAuth2Authentication to your global DEFAULT_AUTHENTICATION setting:

+
'DEFAULT_AUTHENTICATION_CLASSES': (
+    'rest_framework.authentication.OAuth2Authentication',
+),
+
+

You must also include the following in your root urls.py module:

+
url(r'^oauth2/', include('provider.oauth2.urls', namespace='oauth2')),
+
+

Note that the namespace='oauth2' argument is required.

+

Finally, sync your database.

+
python manage.py syncdb
+python manage.py migrate
+
+
+

Note: If you use OAuth2Authentication in production you must ensure that your API is only available over https.

+
+

Getting started with django-oauth2-provider

+

The OAuth2Authentication class only provides token verification for requests. It doesn't provide authorization flow for your clients.

+

The OAuth 2 authorization flow is taken care by the django-oauth2-provider dependency. A walkthrough is given here, but for more details you should refer to the documentation.

+

To get started:

+
1. Create a client
+

You can create a client, either through the shell, or by using the Django admin.

+

Go to the admin panel and create a new Provider.Client entry. It will create the client_id and client_secret properties for you.

+
2. Request an access token
+

To request an access token, submit a POST request to the url /oauth2/access_token with the following fields:

+
    +
  • client_id the client id you've just configured at the previous step.
  • +
  • client_secret again configured at the previous step.
  • +
  • username the username with which you want to log in.
  • +
  • password well, that speaks for itself.
  • +
+

You can use the command line to test that your local configuration is working:

+
curl -X POST -d "client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&grant_type=password&username=YOUR_USERNAME&password=YOUR_PASSWORD" http://localhost:8000/oauth2/access_token/
+
+

You should get a response that looks something like this:

+
{"access_token": "<your-access-token>", "scope": "read", "expires_in": 86399, "refresh_token": "<your-refresh-token>"}
+
+
3. Access the API
+

The only thing needed to make the OAuth2Authentication class work is to insert the access_token you've received in the Authorization request header.

+

The command line to test the authentication looks like:

+
curl -H "Authorization: Bearer <your-access-token>" http://localhost:8000/api/
+
+

Alternative OAuth 2 implementations

+

Note that Django OAuth Toolkit is an alternative external package that also includes OAuth 2.0 support for REST framework.

+
+

Custom authentication

+

To implement a custom authentication scheme, subclass BaseAuthentication and override the .authenticate(self, request) method. The method should return a two-tuple of (user, auth) if authentication succeeds, or None otherwise.

+

In some circumstances instead of returning None, you may want to raise an AuthenticationFailed exception from the .authenticate() method.

+

Typically the approach you should take is:

+
    +
  • If authentication is not attempted, return None. Any other authentication schemes also in use will still be checked.
  • +
  • If authentication is attempted but fails, raise a AuthenticationFailed exception. An error response will be returned immediately, regardless of any permissions checks, and without checking any other authentication schemes.
  • +
+

You may also override the .authenticate_header(self, request) method. If implemented, it should return a string that will be used as the value of the WWW-Authenticate header in a HTTP 401 Unauthorized response.

+

If the .authenticate_header() method is not overridden, the authentication scheme will return HTTP 403 Forbidden responses when an unauthenticated request is denied access.

+

Example

+

The following example will authenticate any incoming request as the user given by the username in a custom request header named 'X_USERNAME'.

+
from django.contrib.auth.models import User
+from rest_framework import authentication
+from rest_framework import exceptions
+
+class ExampleAuthentication(authentication.BaseAuthentication):
+    def authenticate(self, request):
+        username = request.META.get('X_USERNAME')
+        if not username:
+            return None
+
+        try:
+            user = User.objects.get(username=username)
+        except User.DoesNotExist:
+            raise exceptions.AuthenticationFailed('No such user')
+
+        return (user, None)
+
+
+

Third party packages

+

The following third party packages are also available.

+

Digest Authentication

+

HTTP digest authentication is a widely implemented scheme that was intended to replace HTTP basic authentication, and which provides a simple encrypted authentication mechanism. Juan Riaza maintains the djangorestframework-digestauth package which provides HTTP digest authentication support for REST framework.

+

Django OAuth Toolkit

+

The Django OAuth Toolkit package provides OAuth 2.0 support, and works with Python 2.7 and Python 3.3+. The package is maintained by Evonove and uses the excelllent OAuthLib. The package is well documented, and comes as a recommended alternative for OAuth 2.0 support.

+

Django OAuth2 Consumer

+

The Django OAuth2 Consumer library from Rediker Software is another package that provides OAuth 2.0 support for REST framework. The package includes token scoping permissions on tokens, which allows finer-grained access to your API.

+
+
+
+
+ +
+
+ + + + + + + + + + diff --git a/api-guide/content-negotiation.html b/api-guide/content-negotiation.html new file mode 100644 index 000000000..e7f3e693c --- /dev/null +++ b/api-guide/content-negotiation.html @@ -0,0 +1,315 @@ + + + + + Django REST framework - Content negotiation + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + + + +
+ +
+ +
+ + + + +
+
+ +
+

negotiation.py

+

Content negotiation

+
+

HTTP has provisions for several mechanisms for "content negotiation" - the process of selecting the best representation for a given response when there are multiple representations available.

+

RFC 2616, Fielding et al.

+
+

Content negotiation is the process of selecting one of multiple possible representations to return to a client, based on client or server preferences.

+

Determining the accepted renderer

+

REST framework uses a simple style of content negotiation to determine which media type should be returned to a client, based on the available renderers, the priorities of each of those renderers, and the client's Accept: header. The style used is partly client-driven, and partly server-driven.

+
    +
  1. More specific media types are given preference to less specific media types.
  2. +
  3. If multiple media types have the same specificity, then preference is given to based on the ordering of the renderers configured for the given view.
  4. +
+

For example, given the following Accept header:

+
application/json; indent=4, application/json, application/yaml, text/html, */*
+
+

The priorities for each of the given media types would be:

+
    +
  • application/json; indent=4
  • +
  • application/json, application/yaml and text/html
  • +
  • */*
  • +
+

If the requested view was only configured with renderers for YAML and HTML, then REST framework would select whichever renderer was listed first in the renderer_classes list or DEFAULT_RENDERER_CLASSES setting.

+

For more information on the HTTP Accept header, see RFC 2616

+
+

Note: "q" values are not taken into account by REST framework when determining preference. The use of "q" values negatively impacts caching, and in the author's opinion they are an unnecessary and overcomplicated approach to content negotiation.

+

This is a valid approach as the HTTP spec deliberately underspecifies how a server should weight server-based preferences against client-based preferences.

+
+

Custom content negotiation

+

It's unlikely that you'll want to provide a custom content negotiation scheme for REST framework, but you can do so if needed. To implement a custom content negotiation scheme override BaseContentNegotiation.

+

REST framework's content negotiation classes handle selection of both the appropriate parser for the request, and the appropriate renderer for the response, so you should implement both the .select_parser(request, parsers) and .select_renderer(request, renderers, format_suffix) methods.

+

The select_parser() method should return one of the parser instances from the list of available parsers, or None if none of the parsers can handle the incoming request.

+

The select_renderer() method should return a two-tuple of (renderer instance, media type), or raise a NotAcceptable exception.

+

Example

+

The following is a custom content negotiation class which ignores the client +request when selecting the appropriate parser or renderer.

+
from rest_framework.negotiation import BaseContentNegotiation
+
+class IgnoreClientContentNegotiation(BaseContentNegotiation):
+    def select_parser(self, request, parsers):
+        """
+        Select the first parser in the `.parser_classes` list.
+        """
+        return parsers[0]
+
+    def select_renderer(self, request, renderers, format_suffix):
+        """
+        Select the first renderer in the `.renderer_classes` list.
+        """
+        return (renderers[0], renderers[0].media_type)
+
+

Setting the content negotiation

+

The default content negotiation class may be set globally, using the DEFAULT_CONTENT_NEGOTIATION_CLASS setting. For example, the following settings would use our example IgnoreClientContentNegotiation class.

+
REST_FRAMEWORK = {
+    '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.

+
from myapp.negotiation import IgnoreClientContentNegotiation
+from rest_framework.response import Response
+from rest_framework.views import APIView
+
+class NoNegotiationView(APIView):
+    """
+    An example view that does not perform content negotiation.
+    """
+    content_negotiation_class = IgnoreClientContentNegotiation
+
+    def get(self, request, format=None):
+        return Response({
+            'accepted media type': request.accepted_renderer.media_type
+        })
+
+
+
+
+
+ +
+
+ + + + + + + + + + diff --git a/api-guide/exceptions.html b/api-guide/exceptions.html new file mode 100644 index 000000000..3a7a8311f --- /dev/null +++ b/api-guide/exceptions.html @@ -0,0 +1,345 @@ + + + + + Django REST framework - Exceptions + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + + + +
+ +
+ +
+ + + + +
+
+ +
+

exceptions.py

+

Exceptions

+
+

Exceptions… allow error handling to be organized cleanly in a central or high-level place within the program structure.

+

— Doug Hellmann, Python Exception Handling Techniques

+
+

Exception handling in REST framework views

+

REST framework's views handle various exceptions, and deal with returning appropriate error responses.

+

The handled exceptions are:

+
    +
  • Subclasses of APIException raised inside REST framework.
  • +
  • Django's Http404 exception.
  • +
  • Django's PermissionDenied exception.
  • +
+

In each case, REST framework will return a response with an appropriate status code and content-type. The body of the response will include any additional details regarding the nature of the error.

+

By default all error responses will include a key details in the body of the response, but other keys may also be included.

+

For example, the following request:

+
DELETE http://api.example.com/foo/bar HTTP/1.1
+Accept: application/json
+
+

Might receive an error response indicating that the DELETE method is not allowed on that resource:

+
HTTP/1.1 405 Method Not Allowed
+Content-Type: application/json
+Content-Length: 42
+
+{"detail": "Method 'DELETE' not allowed."}
+
+

Custom exception handling

+

You can implement custom exception handling by creating a handler function that converts exceptions raised in your API views into response objects. This allows you to control the style of error responses used by your API.

+

The function must take a single argument, which is the exception to be handled, and should either return a Response object, or return None if the exception cannot be handled. If the handler returns None then the exception will be re-raised and Django will return a standard HTTP 500 'server error' response.

+

For example, you might want to ensure that all error responses include the HTTP status code in the body of the response, like so:

+
HTTP/1.1 405 Method Not Allowed
+Content-Type: application/json
+Content-Length: 62
+
+{"status_code": 405, "detail": "Method 'DELETE' not allowed."}
+
+

In order to alter the style of the response, you could write the following custom exception handler:

+
from rest_framework.views import exception_handler
+
+def custom_exception_handler(exc):
+    # Call REST framework's default exception handler first,
+    # to get the standard error response.
+    response = exception_handler(exc)
+
+    # Now add the HTTP status code to the response.
+    if response is not None:
+        response.data['status_code'] = response.status_code
+
+    return response
+
+

The exception handler must also be configured in your settings, using the EXCEPTION_HANDLER setting key. For example:

+
REST_FRAMEWORK = {
+    'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler'
+}
+
+

If not specified, the 'EXCEPTION_HANDLER' setting defaults to the standard exception handler provided by REST framework:

+
REST_FRAMEWORK = {
+    'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler'
+}
+
+

Note that the exception handler will only be called for responses generated by raised exceptions. It will not be used for any responses returned directly by the view, such as the HTTP_400_BAD_REQUEST responses that are returned by the generic views when serializer validation fails.

+
+

API Reference

+

APIException

+

Signature: APIException()

+

The base class for all exceptions raised inside REST framework.

+

To provide a custom exception, subclass APIException and set the .status_code and .detail properties on the class.

+

ParseError

+

Signature: ParseError(detail=None)

+

Raised if the request contains malformed data when accessing request.DATA or request.FILES.

+

By default this exception results in a response with the HTTP status code "400 Bad Request".

+

AuthenticationFailed

+

Signature: AuthenticationFailed(detail=None)

+

Raised when an incoming request includes incorrect authentication.

+

By default this exception results in a response with the HTTP status code "401 Unauthenticated", but it may also result in a "403 Forbidden" response, depending on the authentication scheme in use. See the authentication documentation for more details.

+

NotAuthenticated

+

Signature: NotAuthenticated(detail=None)

+

Raised when an unauthenticated request fails the permission checks.

+

By default this exception results in a response with the HTTP status code "401 Unauthenticated", but it may also result in a "403 Forbidden" response, depending on the authentication scheme in use. See the authentication documentation for more details.

+

PermissionDenied

+

Signature: PermissionDenied(detail=None)

+

Raised when an authenticated request fails the permission checks.

+

By default this exception results in a response with the HTTP status code "403 Forbidden".

+

MethodNotAllowed

+

Signature: MethodNotAllowed(method, detail=None)

+

Raised when an incoming request occurs that does not map to a handler method on the view.

+

By default this exception results in a response with the HTTP status code "405 Method Not Allowed".

+

UnsupportedMediaType

+

Signature: UnsupportedMediaType(media_type, detail=None)

+

Raised if there are no parsers that can handle the content type of the request data when accessing request.DATA or request.FILES.

+

By default this exception results in a response with the HTTP status code "415 Unsupported Media Type".

+

Throttled

+

Signature: Throttled(wait=None, detail=None)

+

Raised when an incoming request fails the throttling checks.

+

By default this exception results in a response with the HTTP status code "429 Too Many Requests".

+
+
+
+
+ +
+
+ + + + + + + + + + diff --git a/api-guide/fields.html b/api-guide/fields.html new file mode 100644 index 000000000..90581f27d --- /dev/null +++ b/api-guide/fields.html @@ -0,0 +1,487 @@ + + + + + Django REST framework - Serializer fields + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + + + +
+ +
+ +
+ + + + +
+
+ +
+

fields.py

+

Serializer fields

+
+

Each field in a Form class is responsible not only for validating data, but also for "cleaning" it — normalizing it to a consistent format.

+

Django documentation

+
+

Serializer fields handle converting between primitive values and internal datatypes. They also deal with validating input values, as well as retrieving and setting the values from their parent objects.

+
+

Note: The serializer fields are declared in fields.py, but by convention you should import them using from rest_framework import serializers and refer to fields as serializers.<FieldName>.

+
+

Core arguments

+

Each serializer field class constructor takes at least these arguments. Some Field classes take additional, field-specific arguments, but the following should always be accepted:

+

source

+

The name of the attribute that will be used to populate the field. May be a method that only takes a self argument, such as Field(source='get_absolute_url'), or may use dotted notation to traverse attributes, such as Field(source='user.email').

+

The value source='*' has a special meaning, and is used to indicate that the entire object should be passed through to the field. This can be useful for creating nested representations. (See the implementation of the PaginationSerializer class for an example.)

+

Defaults to the name of the field.

+

read_only

+

Set this to True to ensure that the field is used when serializing a representation, but is not used when updating an instance during deserialization.

+

Defaults to False

+

required

+

Normally an error will be raised if a field is not supplied during deserialization. +Set to false if this field is not required to be present during deserialization.

+

Defaults to True.

+

default

+

If set, this gives the default value that will be used for the field if none is supplied. If not set the default behavior is to not populate the attribute at all.

+

May be set to a function or other callable, in which case the value will be evaluated each time it is used.

+

validators

+

A list of Django validators that should be used to validate deserialized values.

+

error_messages

+

A dictionary of error codes to error messages.

+

widget

+

Used only if rendering the field to HTML. +This argument sets the widget that should be used to render the field.

+

label

+

A short text string that may be used as the name of the field in HTML form fields or other descriptive elements.

+

help_text

+

A text string that may be used as a description of the field in HTML form fields or other descriptive elements.

+
+

Generic Fields

+

These generic fields are used for representing arbitrary model fields or the output of model methods.

+

Field

+

A generic, read-only field. You can use this field for any attribute that does not need to support write operations.

+

For example, using the following model.

+
from django.db import models
+from django.utils.timezone import now
+
+class Account(models.Model):
+    owner = models.ForeignKey('auth.user')
+    name = models.CharField(max_length=100)
+    created = models.DateTimeField(auto_now_add=True)
+    payment_expiry = models.DateTimeField()
+
+    def has_expired(self):
+        return now() > self.payment_expiry
+
+

A serializer definition that looked like this:

+
from rest_framework import serializers
+
+class AccountSerializer(serializers.HyperlinkedModelSerializer):
+    expired = serializers.Field(source='has_expired')
+
+    class Meta:
+        fields = ('url', 'owner', 'name', 'expired')
+
+

Would produce output similar to:

+
{
+    'url': 'http://example.com/api/accounts/3/',
+    'owner': 'http://example.com/api/users/12/',
+    'name': 'FooCorp business account', 
+    'expired': True
+}
+
+

By default, the Field class will perform a basic translation of the source value into primitive datatypes, falling back to unicode representations of complex datatypes when necessary.

+

You can customize this behavior by overriding the .to_native(self, value) method.

+

WritableField

+

A field that supports both read and write operations. By itself WritableField does not perform any translation of input values into a given type. You won't typically use this field directly, but you may want to override it and implement the .to_native(self, value) and .from_native(self, value) methods.

+

ModelField

+

A generic field that can be tied to any arbitrary model field. The ModelField class delegates the task of serialization/deserialization to it's associated model field. This field can be used to create serializer fields for custom model fields, without having to create a new custom serializer field.

+

The ModelField class is generally intended for internal use, but can be used by your API if needed. In order to properly instantiate a ModelField, it must be passed a field that is attached to an instantiated model. For example: ModelField(model_field=MyModel()._meta.get_field('custom_field'))

+

Signature: ModelField(model_field=<Django ModelField instance>)

+

SerializerMethodField

+

This is a read-only field. It gets its value by calling a method on the serializer class it is attached to. It can be used to add any sort of data to the serialized representation of your object. The field's constructor accepts a single argument, which is the name of the method on the serializer to be called. The method should accept a single argument (in addition to self), which is the object being serialized. It should return whatever you want to be included in the serialized representation of the object. For example:

+
from django.contrib.auth.models import User
+from django.utils.timezone import now
+from rest_framework import serializers
+
+class UserSerializer(serializers.ModelSerializer):
+    days_since_joined = serializers.SerializerMethodField('get_days_since_joined')
+
+    class Meta:
+        model = User
+
+    def get_days_since_joined(self, obj):
+        return (now() - obj.date_joined).days
+
+
+

Typed Fields

+

These fields represent basic datatypes, and support both reading and writing values.

+

BooleanField

+

A Boolean representation.

+

Corresponds to django.db.models.fields.BooleanField.

+

CharField

+

A text representation, optionally validates the text to be shorter than max_length and longer than min_length.

+

Corresponds to django.db.models.fields.CharField +or django.db.models.fields.TextField.

+

Signature: CharField(max_length=None, min_length=None)

+

URLField

+

Corresponds to django.db.models.fields.URLField. Uses Django's django.core.validators.URLValidator for validation.

+

Signature: CharField(max_length=200, min_length=None)

+

SlugField

+

Corresponds to django.db.models.fields.SlugField.

+

Signature: CharField(max_length=50, min_length=None)

+

ChoiceField

+

A field that can accept a value out of a limited set of choices.

+

EmailField

+

A text representation, validates the text to be a valid e-mail address.

+

Corresponds to django.db.models.fields.EmailField

+

RegexField

+

A text representation, that validates the given value matches against a certain regular expression.

+

Uses Django's django.core.validators.RegexValidator for validation.

+

Corresponds to django.forms.fields.RegexField

+

Signature: RegexField(regex, max_length=None, min_length=None)

+

DateTimeField

+

A date and time representation.

+

Corresponds to django.db.models.fields.DateTimeField

+

When using ModelSerializer or HyperlinkedModelSerializer, note that any model fields with auto_now=True or auto_now_add=True will use serializer fields that are read_only=True by default.

+

If you want to override this behavior, you'll need to declare the DateTimeField explicitly on the serializer. For example:

+
class CommentSerializer(serializers.ModelSerializer):
+    created = serializers.DateTimeField()
+
+    class Meta:
+        model = Comment
+
+

Note that by default, datetime representations are determined by the renderer in use, although this can be explicitly overridden as detailed below.

+

In the case of JSON this means the default datetime representation uses the ECMA 262 date time string specification. This is a subset of ISO 8601 which uses millisecond precision, and includes the 'Z' suffix for the UTC timezone, for example: 2013-01-29T12:34:56.123Z.

+

Signature: DateTimeField(format=None, input_formats=None)

+
    +
  • format - A string representing the output format. If not specified, this defaults to None, which indicates that Python datetime objects should be returned by to_native. 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'].
  • +
+

DateTime format strings may either be Python strftime formats which explicitly specify the format, or the special string 'iso-8601', which indicates that ISO 8601 style datetimes should be used. (eg '2013-01-29T12:34:56.000000Z')

+

DateField

+

A date representation.

+

Corresponds to django.db.models.fields.DateField

+

Signature: DateField(format=None, input_formats=None)

+
    +
  • format - A string representing the output format. If not specified, this defaults to None, which indicates that Python date objects should be returned by to_native. 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'].
  • +
+

Date format strings may either be Python strftime formats which explicitly specify the format, or the special string 'iso-8601', which indicates that ISO 8601 style dates should be used. (eg '2013-01-29')

+

TimeField

+

A time representation.

+

Optionally takes format as parameter to replace the matching pattern.

+

Corresponds to django.db.models.fields.TimeField

+

Signature: TimeField(format=None, input_formats=None)

+
    +
  • format - A string representing the output format. If not specified, this defaults to None, which indicates that Python time objects should be returned by to_native. 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'].
  • +
+

Time format strings may either be Python strftime formats which explicitly specify the format, or the special string 'iso-8601', which indicates that ISO 8601 style times should be used. (eg '12:34:56.000000')

+

IntegerField

+

An integer representation.

+

Corresponds to django.db.models.fields.IntegerField, django.db.models.fields.SmallIntegerField, django.db.models.fields.PositiveIntegerField and django.db.models.fields.PositiveSmallIntegerField

+

FloatField

+

A floating point representation.

+

Corresponds to django.db.models.fields.FloatField.

+

DecimalField

+

A decimal representation.

+

Corresponds to django.db.models.fields.DecimalField.

+

FileField

+

A file representation. Performs Django's standard FileField validation.

+

Corresponds to django.forms.fields.FileField.

+

Signature: FileField(max_length=None, allow_empty_file=False)

+
    +
  • +

    max_length designates the maximum length for the file name.

    +
  • +
  • +

    allow_empty_file designates if empty files are allowed.

    +
  • +
+

ImageField

+

An image representation.

+

Corresponds to django.forms.fields.ImageField.

+

Requires the PIL package.

+

Signature and validation is the same as with FileField.

+
+

Note: FileFields and ImageFields are only suitable for use with MultiPartParser, since e.g. json doesn't support file uploads. +Django's regular FILE_UPLOAD_HANDLERS are used for handling uploaded files.

+
+

Custom fields

+

If you want to create a custom field, you'll probably want to override either one or both of the .to_native() and .from_native() methods. These two methods are used to convert between the initial datatype, and a primitive, serializable datatype. Primitive datatypes may be any of a number, string, date/time/datetime or None. They may also be any list or dictionary like object that only contains other primitive objects.

+

The .to_native() method is called to convert the initial datatype into a primitive, serializable datatype. The from_native() method is called to restore a primitive datatype into it's initial representation.

+

Examples

+

Let's look at an example of serializing a class that represents an RGB color value:

+
class Color(object):
+    """
+    A color represented in the RGB colorspace.
+    """
+    def __init__(self, red, green, blue):
+        assert(red >= 0 and green >= 0 and blue >= 0)
+        assert(red < 256 and green < 256 and blue < 256)
+        self.red, self.green, self.blue = red, green, blue
+
+class ColourField(serializers.WritableField):
+    """
+    Color objects are serialized into "rgb(#, #, #)" notation.
+    """
+    def to_native(self, obj):
+        return "rgb(%d, %d, %d)" % (obj.red, obj.green, obj.blue)
+
+    def from_native(self, data):
+        data = data.strip('rgb(').rstrip(')')
+        red, green, blue = [int(col) for col in data.split(',')]
+        return Color(red, green, blue)
+
+

By default field values are treated as mapping to an attribute on the object. If you need to customize how the field value is accessed and set you need to override .field_to_native() and/or .field_from_native().

+

As an example, let's create a field that can be used represent the class name of the object being serialized:

+
class ClassNameField(serializers.Field):
+    def field_to_native(self, obj, field_name):
+        """
+        Serialize the object's class name.
+        """
+        return obj.__class__
+
+
+
+
+
+ +
+
+ + + + + + + + + + diff --git a/api-guide/filtering.html b/api-guide/filtering.html new file mode 100644 index 000000000..7cb8fdebe --- /dev/null +++ b/api-guide/filtering.html @@ -0,0 +1,533 @@ + + + + + Django REST framework - Filtering + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + + + +
+ +
+ +
+ + + + +
+
+ +
+

filters.py

+

Filtering

+
+

The root QuerySet provided by the Manager describes all objects in the database table. Usually, though, you'll need to select only a subset of the complete set of objects.

+

Django documentation

+
+

The default behavior of REST framework's generic list views is to return the entire queryset for a model manager. Often you will want your API to restrict the items that are returned by the queryset.

+

The simplest way to filter the queryset of any view that subclasses GenericAPIView is to override the .get_queryset() method.

+

Overriding this method allows you to customize the queryset returned by the view in a number of different ways.

+

Filtering against the current user

+

You might want to filter the queryset to ensure that only results relevant to the currently authenticated user making the request are returned.

+

You can do so by filtering based on the value of request.user.

+

For example:

+
from myapp.models import Purchase
+from myapp.serializers import PurchaseSerializer
+from rest_framework import generics
+
+class PurchaseList(generics.ListAPIView)
+    serializer_class = PurchaseSerializer
+
+    def get_queryset(self):
+        """
+        This view should return a list of all the purchases
+        for the currently authenticated user.
+        """
+        user = self.request.user
+        return Purchase.objects.filter(purchaser=user)
+
+

Filtering against the URL

+

Another style of filtering might involve restricting the queryset based on some part of the URL.

+

For example if your URL config contained an entry like this:

+
url('^purchases/(?P<username>.+)/$', PurchaseList.as_view()),
+
+

You could then write a view that returned a purchase queryset filtered by the username portion of the URL:

+
class PurchaseList(generics.ListAPIView)
+    serializer_class = PurchaseSerializer
+
+    def get_queryset(self):
+        """
+        This view should return a list of all the purchases for
+        the user as determined by the username portion of the URL.
+        """
+        username = self.kwargs['username']
+        return Purchase.objects.filter(purchaser__username=username)
+
+

Filtering against query parameters

+

A final example of filtering the initial queryset would be to determine the initial queryset based on query parameters in the url.

+

We can override .get_queryset() to deal with URLs such as http://example.com/api/purchases?username=denvercoder9, and filter the queryset only if the username parameter is included in the URL:

+
class PurchaseList(generics.ListAPIView)
+    serializer_class = PurchaseSerializer
+
+    def get_queryset(self):
+        """
+        Optionally restricts the returned purchases to a given user,
+        by filtering against a `username` query parameter in the URL.
+        """
+        queryset = Purchase.objects.all()
+        username = self.request.QUERY_PARAMS.get('username', None)
+        if username is not None:
+            queryset = queryset.filter(purchaser__username=username)
+        return queryset
+
+
+

Generic Filtering

+

As well as being able to override the default queryset, REST framework also includes support for generic filtering backends that allow you to easily construct complex searches and filters.

+

Setting filter backends

+

The default filter backends may be set globally, using the DEFAULT_FILTER_BACKENDS setting. For example.

+
REST_FRAMEWORK = {
+    'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',)
+}
+
+

You can also set the filter backends on a per-view, or per-viewset basis, +using the GenericAPIView class based views.

+
from django.contrib.auth.models import User
+from myapp.serializers import UserSerializer
+from rest_framework import filters
+from rest_framework import generics
+
+class UserListView(generics.ListAPIView):
+    queryset = User.objects.all()
+    serializer = UserSerializer
+    filter_backends = (filters.DjangoFilterBackend,)
+
+

Filtering and object lookups

+

Note that if a filter backend is configured for a view, then as well as being used to filter list views, it will also be used to filter the querysets used for returning a single object.

+

For instance, given the previous example, and a product with an id of 4675, the following URL would either return the corresponding object, or return a 404 response, depending on if the filtering conditions were met by the given product instance:

+
http://example.com/api/products/4675/?category=clothing&max_price=10.00
+
+

Overriding the initial queryset

+

Note that you can use both an overridden .get_queryset() and generic filtering together, and everything will work as expected. For example, if Product had a many-to-many relationship with User, named purchase, you might want to write a view like this:

+
class PurchasedProductsList(generics.ListAPIView):
+    """
+    Return a list of all the products that the authenticated
+    user has ever purchased, with optional filtering.
+    """
+    model = Product
+    serializer_class = ProductSerializer
+    filter_class = ProductFilter
+
+    def get_queryset(self):
+        user = self.request.user
+        return user.purchase_set.all()
+
+
+

API Guide

+

DjangoFilterBackend

+

The DjangoFilterBackend class supports highly customizable field filtering, using the django-filter package.

+

To use REST framework's DjangoFilterBackend, first install django-filter.

+
pip install django-filter
+
+

Specifying filter fields

+

If all you need is simple equality-based filtering, you can set a filter_fields attribute on the view, or viewset, listing the set of fields you wish to filter against.

+
class ProductList(generics.ListAPIView):
+    queryset = Product.objects.all()
+    serializer_class = ProductSerializer
+    filter_fields = ('category', 'in_stock')
+
+

This will automatically create a FilterSet class for the given fields, and will allow you to make requests such as:

+
http://example.com/api/products?category=clothing&in_stock=True
+
+

Specifying a FilterSet

+

For more advanced filtering requirements you can specify a FilterSet class that should be used by the view. For example:

+
import django_filters
+from myapp.models import Product
+from myapp.serializers import ProductSerializer
+from rest_framework import generics
+
+class ProductFilter(django_filters.FilterSet):
+    min_price = django_filters.NumberFilter(name="price", lookup_type='gte')
+    max_price = django_filters.NumberFilter(name="price", lookup_type='lte')
+    class Meta:
+        model = Product
+        fields = ['category', 'in_stock', 'min_price', 'max_price']
+
+class ProductList(generics.ListAPIView):
+    queryset = Product.objects.all()
+    serializer_class = ProductSerializer
+    filter_class = ProductFilter
+
+

Which will allow you to make requests such as:

+
http://example.com/api/products?category=clothing&max_price=10.00
+
+

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 +filters using Manufacturer name. For example:

+
import django_filters
+from myapp.models import Product
+from myapp.serializers import ProductSerializer
+from rest_framework import generics
+
+class ProductFilter(django_filters.FilterSet):
+    class Meta:
+        model = Product
+        fields = ['category', 'in_stock', 'manufacturer__name`]
+
+

This enables us to make queries like:

+
http://example.com/api/products?manufacturer__name=foo
+
+

This is nice, but it shows underlying model structure in REST API, which may +be undesired, but you can use:

+
import django_filters
+from myapp.models import Product
+from myapp.serializers import ProductSerializer
+from rest_framework import generics
+
+class ProductFilter(django_filters.FilterSet):
+
+    manufacturer = django_filters.CharFilter(name="manufacturer__name")
+
+    class Meta:
+        model = Product
+        fields = ['category', 'in_stock', 'manufacturer`]
+
+

And now you can execute:

+
http://example.com/api/products?manufacturer=foo
+
+

For more details on using filter sets see the django-filter documentation.

+
+

Hints & Tips

+
    +
  • 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.)
  • +
  • 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.
  • +
+
+

SearchFilter

+

The SearchFilter class supports simple single query parameter based searching, and is based on the Django admin's search functionality.

+

The SearchFilter class will only be applied if the view has a search_fields attribute set. The search_fields attribute should be a list of names of text type fields on the model, such as CharField or TextField.

+
class UserListView(generics.ListAPIView):
+    queryset = User.objects.all()
+    serializer = UserSerializer
+    filter_backends = (filters.SearchFilter,)
+    search_fields = ('username', 'email')
+
+

This will allow the client to filter the items in the list by making queries such as:

+
http://example.com/api/users?search=russell
+
+

You can also perform a related lookup on a ForeignKey or ManyToManyField with the lookup API double-underscore notation:

+
search_fields = ('username', 'email', 'profile__profession')
+
+

By default, searches will use case-insensitive partial matches. The search parameter may contain multiple search terms, which should be whitespace and/or comma separated. If multiple search terms are used then objects will be returned in the list only if all the provided terms are matched.

+

The search behavior may be restricted by prepending various characters to the search_fields.

+
    +
  • '^' Starts-with search.
  • +
  • '=' Exact matches.
  • +
  • '@' Full-text search. (Currently only supported Django's MySQL backend.)
  • +
+

For example:

+
search_fields = ('=username', '=email')
+
+

For more details, see the Django documentation.

+
+

OrderingFilter

+

The OrderingFilter class supports simple query parameter controlled ordering of results. To specify the result order, set a query parameter named 'ordering' to the required field name. For example:

+
http://example.com/api/users?ordering=username
+
+

The client may also specify reverse orderings by prefixing the field name with '-', like so:

+
http://example.com/api/users?ordering=-username
+
+

Multiple orderings may also be specified:

+
http://example.com/api/users?ordering=account,username
+
+

If an ordering attribute is set on the view, this will be used as the default ordering.

+

Typically you'd instead control this by setting order_by on the initial queryset, but using the ordering parameter on the view allows you to specify the ordering in a way that it can then be passed automatically as context to a rendered template. This makes it possible to automatically render column headers differently if they are being used to order the results.

+
class UserListView(generics.ListAPIView):
+    queryset = User.objects.all()
+    serializer = UserSerializer
+    filter_backends = (filters.OrderingFilter,)
+    ordering = ('username',)
+
+

The ordering attribute may be either a string or a list/tuple of strings.

+
+

DjangoObjectPermissionsFilter

+

The DjangoObjectPermissionsFilter is intended to be used together with the django-guardian package, with custom 'view' permissions added. The filter will ensure that querysets only returns objects for which the user has the appropriate view permission.

+

This filter class must be used with views that provide either a queryset or a model attribute.

+

If you're using DjangoObjectPermissionsFilter, you'll probably also want to add an appropriate object permissions class, to ensure that users can only operate on instances if they have the appropriate object permissions. The easiest way to do this is to subclass DjangoObjectPermissions and add 'view' permissions to the perms_map attribute.

+

A complete example using both DjangoObjectPermissionsFilter and DjangoObjectPermissions might look something like this.

+

permissions.py:

+
class CustomObjectPermissions(permissions.DjangoObjectPermissions):
+    """
+    Similar to `DjangoObjectPermissions`, but adding 'view' permissions.
+    """
+    perms_map = {
+        'GET': ['%(app_label)s.view_%(model_name)s'],
+        'OPTIONS': ['%(app_label)s.view_%(model_name)s'],
+        'HEAD': ['%(app_label)s.view_%(model_name)s'],
+        'POST': ['%(app_label)s.add_%(model_name)s'],
+        'PUT': ['%(app_label)s.change_%(model_name)s'],
+        'PATCH': ['%(app_label)s.change_%(model_name)s'],
+        'DELETE': ['%(app_label)s.delete_%(model_name)s'],
+    }
+
+

views.py:

+
class EventViewSet(viewsets.ModelViewSet):
+    """
+    Viewset that only lists events if user has 'view' permissions, and only
+    allows operations on individual events if user has appropriate 'view', 'add',
+    'change' or 'delete' permissions.
+    """
+    queryset = Event.objects.all()
+    serializer = EventSerializer
+    filter_backends = (filters.DjangoObjectPermissionsFilter,)
+    permission_classes = (myapp.permissions.CustomObjectPermissions,)
+
+

For more information on adding 'view' permissions for models, see the relevant section of the django-guardian documentation, and this blogpost.

+
+

Custom generic filtering

+

You can also provide your own generic filtering backend, or write an installable app for other developers to use.

+

To do so override BaseFilterBackend, and override the .filter_queryset(self, request, queryset, view) method. The method should return a new, filtered queryset.

+

As well as allowing clients to perform searches and filtering, generic filter backends can be useful for restricting which objects should be visible to any given request or user.

+

Example

+

For example, you might need to restrict users to only being able to see objects they created.

+
class IsOwnerFilterBackend(filters.BaseFilterBackend):
+    """
+    Filter that only allows users to see their own objects.
+    """
+    def filter_queryset(self, request, queryset, view):
+        return queryset.filter(owner=request.user)
+
+

We could achieve the same behavior by overriding get_queryset() on the views, but using a filter backend allows you to more easily add this restriction to multiple views, or to apply it across the entire API.

+
+
+
+
+ +
+
+ + + + + + + + + + diff --git a/api-guide/format-suffixes.html b/api-guide/format-suffixes.html new file mode 100644 index 000000000..3abdb6742 --- /dev/null +++ b/api-guide/format-suffixes.html @@ -0,0 +1,290 @@ + + + + + Django REST framework - Format suffixes + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + + + +
+ +
+ +
+ + + + +
+
+ +
+

urlpatterns.py

+

Format suffixes

+
+

Section 6.2.1 does not say that content negotiation should be +used all the time.

+

— Roy Fielding, REST discuss mailing list

+
+

A common pattern for Web APIs is to use filename extensions on URLs to provide an endpoint for a given media type. For example, 'http://example.com/api/users.json' to serve a JSON representation.

+

Adding format-suffix patterns to each individual entry in the URLconf for your API is error-prone and non-DRY, so REST framework provides a shortcut to adding these patterns to your URLConf.

+

format_suffix_patterns

+

Signature: format_suffix_patterns(urlpatterns, suffix_required=False, allowed=None)

+

Returns a URL pattern list which includes format suffix patterns appended to each of the URL patterns provided.

+

Arguments:

+
    +
  • urlpatterns: Required. A URL pattern list.
  • +
  • suffix_required: Optional. A boolean indicating if suffixes in the URLs should be optional or mandatory. Defaults to False, meaning that suffixes are optional by default.
  • +
  • allowed: Optional. A list or tuple of valid format suffixes. If not provided, a wildcard format suffix pattern will be used.
  • +
+

Example:

+
from rest_framework.urlpatterns import format_suffix_patterns
+
+urlpatterns = patterns('blog.views',
+    url(r'^/$', 'api_root'),
+    url(r'^comments/$', 'comment_list'),
+    url(r'^comments/(?P<pk>[0-9]+)/$', 'comment_detail')
+)
+
+urlpatterns = format_suffix_patterns(urlpatterns, allowed=['json', 'html'])
+
+

When using format_suffix_patterns, you must make sure to add the 'format' keyword argument to the corresponding views. For example:

+
@api_view(('GET', 'POST'))
+def comment_list(request, format=None):
+    # do stuff...
+
+

Or with class based views:

+
class CommentList(APIView):
+    def get(self, request, format=None):
+        # do stuff...
+
+    def post(self, request, format=None):
+        # do stuff...
+
+

The name of the kwarg used may be modified by using the FORMAT_SUFFIX_KWARG setting.

+

Also note that format_suffix_patterns does not support descending into include URL patterns.

+
+

Accept headers vs. format suffixes

+

There seems to be a view among some of the Web community that filename extensions are not a RESTful pattern, and that HTTP Accept headers should always be used instead.

+

It is actually a misconception. For example, take the following quote from Roy Fielding discussing the relative merits of query parameter media-type indicators vs. file extension media-type indicators:

+

“That's why I always prefer extensions. Neither choice has anything to do with REST.” — Roy Fielding, REST discuss mailing list

+

The quote does not mention Accept headers, but it does make it clear that format suffixes should be considered an acceptable pattern.

+
+
+
+
+ +
+
+ + + + + + + + + + diff --git a/api-guide/generic-views.html b/api-guide/generic-views.html new file mode 100644 index 000000000..ccf85552a --- /dev/null +++ b/api-guide/generic-views.html @@ -0,0 +1,506 @@ + + + + + Django REST framework - Generic views + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + + + +
+ +
+ +
+ + + + +
+
+ +
+

mixins.py +generics.py

+

Generic views

+
+

Django’s generic views... were developed as a shortcut for common usage patterns... They take certain common idioms and patterns found in view development and abstract them so that you can quickly write common views of data without having to repeat yourself.

+

Django Documentation

+
+

One of the key benefits of class based views is the way they allow you to compose bits of reusable behaviour. 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.

+

If the generic views don't suit the needs of your API, you can drop down to using the regular APIView class, or reuse the mixins and base classes used by the generic views to compose your own set of reusable generic views.

+

Examples

+

Typically when using the generic views, you'll override the view, and set several class attributes.

+
from django.contrib.auth.models import User
+from myapp.serializers import UserSerializer
+from rest_framework import generics
+from rest_framework.permissions import IsAdminUser
+
+class UserList(generics.ListCreateAPIView):
+    queryset = User.objects.all()
+    serializer_class = UserSerializer
+    permission_classes = (IsAdminUser,)
+    paginate_by = 100
+
+

For more complex cases you might also want to override various methods on the view class. For example.

+
class UserList(generics.ListCreateAPIView):
+    queryset = User.objects.all()
+    serializer_class = UserSerializer
+    permission_classes = (IsAdminUser,)
+
+    def get_paginate_by(self):
+        """
+        Use smaller pagination for HTML representations.
+        """
+        if self.request.accepted_renderer.format == 'html':
+            return 20
+        return 100
+
+

For very simple cases you might want to pass through any class attributes using the .as_view() method. For example, your URLconf might include something the following entry.

+
url(r'^/users/', ListCreateAPIView.as_view(model=User), name='user-list')
+
+
+

API Reference

+

GenericAPIView

+

This class extends REST framework's APIView class, adding commonly required behavior for standard list and detail views.

+

Each of the concrete generic views provided is built by combining GenericAPIView, with one or more mixin classes.

+

Attributes

+

Basic settings:

+

The following attributes control the basic view behavior.

+
    +
  • queryset - The queryset that should be used for returning objects from this view. Typically, you must either set this attribute, or override the get_queryset() method.
  • +
  • serializer_class - The serializer class that should be used for validating and deserializing input, and for serializing output. Typically, you must either set this attribute, or override the get_serializer_class() method.
  • +
  • lookup_field - The model field that should be used to for performing object lookup of individual model instances. Defaults to 'pk'. Note that when using hyperlinked APIs you'll need to ensure that both the API views and the serializer classes set the lookup fields if you need to use a custom value.
  • +
  • lookup_url_kwarg - The URL keyword argument that should be used for object lookup. The URL conf should include a keyword argument corresponding to this value. If unset this defaults to using the same value as lookup_field.
  • +
+

Shortcuts:

+
    +
  • model - This shortcut may be used instead of setting either (or both) of the queryset/serializer_class attributes, although using the explicit style is generally preferred. If used instead of serializer_class, then then DEFAULT_MODEL_SERIALIZER_CLASS setting will determine the base serializer class. Note that model is only ever used for generating a default queryset or serializer class - the queryset and serializer_class attributes are always preferred if provided.
  • +
+

Pagination:

+

The following attributes are used to control pagination when used with list views.

+
    +
  • paginate_by - The size of pages to use with paginated data. If set to None then pagination is turned off. If unset this uses the same value as the PAGINATE_BY setting, which defaults to None.
  • +
  • paginate_by_param - The name of a query parameter, which can be used by the client to override the default page size to use for pagination. If unset this uses the same value as the PAGINATE_BY_PARAM setting, which defaults to None.
  • +
  • pagination_serializer_class - The pagination serializer class to use when determining the style of paginated responses. Defaults to the same value as the DEFAULT_PAGINATION_SERIALIZER_CLASS setting.
  • +
  • page_kwarg - The name of a URL kwarg or URL query parameter which can be used by the client to control which page is requested. Defaults to 'page'.
  • +
+

Filtering:

+
    +
  • filter_backends - A list of filter backend classes that should be used for filtering the queryset. Defaults to the same value as the DEFAULT_FILTER_BACKENDS setting.
  • +
+

Methods

+

Base methods:

+

get_queryset(self)

+

Returns the queryset that should be used for list views, and that should be used as the base for lookups in detail views. Defaults to returning the queryset specified by the queryset attribute, or the default queryset for the model if the model shortcut is being used.

+

May be overridden to provide dynamic behavior such as returning a queryset that is specific to the user making the request.

+

For example:

+
def get_queryset(self):
+    user = self.request.user
+    return user.accounts.all()
+
+

get_object(self)

+

Returns an object instance that should be used for detail views. Defaults to using the lookup_field parameter to filter the base queryset.

+

May be overridden to provide more complex behavior such as object lookups based on more than one URL kwarg.

+

For example:

+
def get_object(self):
+    queryset = self.get_queryset()
+    filter = {}
+    for field in self.multiple_lookup_fields:
+        filter[field] = self.kwargs[field]
+
+    obj = get_object_or_404(queryset, **filter)
+    self.check_object_permissions(self.request, obj)
+    return obj
+
+

Note that if your API doesn't include any object level permissions, you may optionally exclude the `self.check_object_permissions, and simply return the object from theget_object_or_404` lookup.

+

get_filter_backends(self)

+

Returns the classes that should be used to filter the queryset. Defaults to returning the filter_backends attribute.

+

May be override to provide more complex behavior with filters, as using different (or even exlusive) lists of filter_backends depending on different criteria.

+

For example:

+
def get_filter_backends(self):
+    if "geo_route" in self.request.QUERY_PARAMS:
+        return (GeoRouteFilter, CategoryFilter)
+    elif "geo_point" in self.request.QUERY_PARAMS:
+        return (GeoPointFilter, CategoryFilter)
+
+    return (CategoryFilter,)
+
+

get_serializer_class(self)

+

Returns the class that should be used for the serializer. Defaults to returning the serializer_class attribute, or dynamically generating a serializer class if the model shortcut is being used.

+

May be override to provide dynamic behavior such as using different serializers for read and write operations, or providing different serializers to different types of users.

+

For example:

+
def get_serializer_class(self):
+    if self.request.user.is_staff:
+        return FullAccountSerializer
+    return BasicAccountSerializer
+
+

get_paginate_by(self)

+

Returns the page size to use with pagination. By default this uses the paginate_by attribute, and may be overridden by the client if the paginate_by_param attribute is set.

+

You may want to override this method to provide more complex behavior such as modifying page sizes based on the media type of the response.

+

For example:

+
def get_paginate_by(self):
+    if self.request.accepted_renderer.format == 'html':
+        return 20
+    return 100
+
+

Save hooks:

+

The following methods are provided as placeholder interfaces. They contain empty implementations and are not called directly by GenericAPIView, but they are overridden and used by some of the mixin classes.

+
    +
  • pre_save(self, obj) - A hook that is called before saving an object.
  • +
  • post_save(self, obj, created=False) - A hook that is called after saving an object.
  • +
+

The pre_save method in particular is a useful hook for setting attributes that are implicit in the request, but are not part of the request data. For instance, you might set an attribute on the object based on the request user, or based on a URL keyword argument.

+
def pre_save(self, obj):
+    """
+    Set the object's owner, based on the incoming request.
+    """
+    obj.owner = self.request.user
+
+

Remember that the pre_save() method is not called by GenericAPIView itself, but it is called by create() and update() methods on the CreateModelMixin and UpdateModelMixin classes.

+

Other methods:

+

You won't typically need to override the following methods, although you might need to call into them if you're writing custom views using GenericAPIView.

+
    +
  • get_serializer_context(self) - Returns a dictionary containing any extra context that should be supplied to the serializer. Defaults to including 'request', 'view' and 'format' keys.
  • +
  • get_serializer(self, instance=None, data=None, files=None, many=False, partial=False) - Returns a serializer instance.
  • +
  • get_pagination_serializer(self, page) - Returns a serializer instance to use with paginated data.
  • +
  • paginate_queryset(self, queryset) - Paginate a queryset if required, either returning a page object, or None if pagination is not configured for this view.
  • +
  • filter_queryset(self, queryset) - Given a queryset, filter it with whichever filter backends are in use, returning a new queryset.
  • +
+
+

Mixins

+

The mixin classes provide the actions that are used to provide the basic view behavior. Note that the mixin classes provide action methods rather than defining the handler methods such as .get() and .post() directly. This allows for more flexible composition of behavior.

+

ListModelMixin

+

Provides a .list(request, *args, **kwargs) method, that implements listing a queryset.

+

If the queryset is populated, this returns a 200 OK response, with a serialized representation of the queryset as the body of the response. The response data may optionally be paginated.

+

If the queryset is empty this returns a 200 OK response, unless the .allow_empty attribute on the view is set to False, in which case it will return a 404 Not Found.

+

CreateModelMixin

+

Provides a .create(request, *args, **kwargs) method, that implements creating and saving a new model instance.

+

If an object is created this returns a 201 Created response, with a serialized representation of the object as the body of the response. If the representation contains a key named url, then the Location header of the response will be populated with that value.

+

If the request data provided for creating the object was invalid, a 400 Bad Request response will be returned, with the error details as the body of the response.

+

RetrieveModelMixin

+

Provides a .retrieve(request, *args, **kwargs) method, that implements returning an existing model instance in a response.

+

If an object can be retrieved this returns a 200 OK response, with a serialized representation of the object as the body of the response. Otherwise it will return a 404 Not Found.

+

UpdateModelMixin

+

Provides a .update(request, *args, **kwargs) method, that implements updating and saving an existing model instance.

+

Also provides a .partial_update(request, *args, **kwargs) method, which is similar to the update method, except that all fields for the update will be optional. This allows support for HTTP PATCH requests.

+

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.

+

DestroyModelMixin

+

Provides a .destroy(request, *args, **kwargs) method, that implements deletion of an existing model instance.

+

If an object is deleted this returns a 204 No Content response, otherwise it will return a 404 Not Found.

+
+

Concrete View Classes

+

The following classes are the concrete generic views. If you're using generic views this is normally the level you'll be working at unless you need heavily customized behavior.

+

CreateAPIView

+

Used for create-only endpoints.

+

Provides a post method handler.

+

Extends: GenericAPIView, CreateModelMixin

+

ListAPIView

+

Used for read-only endpoints to represent a collection of model instances.

+

Provides a get method handler.

+

Extends: GenericAPIView, ListModelMixin

+

RetrieveAPIView

+

Used for read-only endpoints to represent a single model instance.

+

Provides a get method handler.

+

Extends: GenericAPIView, RetrieveModelMixin

+

DestroyAPIView

+

Used for delete-only endpoints for a single model instance.

+

Provides a delete method handler.

+

Extends: GenericAPIView, DestroyModelMixin

+

UpdateAPIView

+

Used for update-only endpoints for a single model instance.

+

Provides put and patch method handlers.

+

Extends: GenericAPIView, UpdateModelMixin

+

ListCreateAPIView

+

Used for read-write endpoints to represent a collection of model instances.

+

Provides get and post method handlers.

+

Extends: GenericAPIView, ListModelMixin, CreateModelMixin

+

RetrieveUpdateAPIView

+

Used for read or update endpoints to represent a single model instance.

+

Provides get, put and patch method handlers.

+

Extends: GenericAPIView, RetrieveModelMixin, UpdateModelMixin

+

RetrieveDestroyAPIView

+

Used for read or delete endpoints to represent a single model instance.

+

Provides get and delete method handlers.

+

Extends: GenericAPIView, RetrieveModelMixin, DestroyModelMixin

+

RetrieveUpdateDestroyAPIView

+

Used for read-write-delete endpoints to represent a single model instance.

+

Provides get, put, patch and delete method handlers.

+

Extends: GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin

+
+

Customizing the generic views

+

Often you'll want to use the existing generic views, but use some slightly customized behavior. If you find yourself reusing some bit of customized behavior in multiple places, you might want to refactor the behavior into a common class that you can then just apply to any view or viewset as needed.

+

Creating custom mixins

+

For example, if you need to lookup objects based on multiple fields in the URL conf, you could create a mixin class like the following:

+
class MultipleFieldLookupMixin(object):
+    """
+    Apply this mixin to any view or viewset to get multiple field filtering
+    based on a `lookup_fields` attribute, instead of the default single field filtering.
+    """
+    def get_object(self):
+        queryset = self.get_queryset()             # Get the base queryset
+        queryset = self.filter_queryset(queryset)  # Apply any filter backends
+        filter = {}
+        for field in self.lookup_fields:
+            filter[field] = self.kwargs[field]
+        return get_object_or_404(queryset, **filter)  # Lookup the object
+
+

You can then simply apply this mixin to a view or viewset anytime you need to apply the custom behavior.

+
class RetrieveUserView(MultipleFieldLookupMixin, generics.RetrieveAPIView):
+    queryset = User.objects.all()
+    serializer_class = UserSerializer
+    lookup_fields = ('account', 'username')
+
+

Using custom mixins is a good option if you have custom behavior that needs to be used

+

Creating custom base classes

+

If you are using a mixin across multiple views, you can take this a step further and create your own set of base views that can then be used throughout your project. For example:

+
class BaseRetrieveView(MultipleFieldLookupMixin,
+                       generics.RetrieveAPIView):
+    pass
+
+class BaseRetrieveUpdateDestroyView(MultipleFieldLookupMixin,
+                                    generics.RetrieveUpdateDestroyAPIView):
+    pass
+
+

Using custom base classes is a good option if you have custom behavior that consistently needs to be repeated across a large number of views throughout your project.

+
+
+
+
+ +
+
+ + + + + + + + + + diff --git a/api-guide/pagination.html b/api-guide/pagination.html new file mode 100644 index 000000000..7c05df0f8 --- /dev/null +++ b/api-guide/pagination.html @@ -0,0 +1,366 @@ + + + + + Django REST framework - Pagination + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + + + +
+ +
+ +
+ + + + +
+
+ +
+

pagination.py

+

Pagination

+
+

Django provides a few classes that help you manage paginated data – that is, data that’s split across several pages, with “Previous/Next” links.

+

Django documentation

+
+

REST framework includes a PaginationSerializer class that makes it easy to return paginated data in a way that can then be rendered to arbitrary media types.

+

Paginating basic data

+

Let's start by taking a look at an example from the Django documentation.

+
from django.core.paginator import Paginator
+
+objects = ['john', 'paul', 'george', 'ringo']
+paginator = Paginator(objects, 2)
+page = paginator.page(1)
+page.object_list
+# ['john', 'paul']
+
+

At this point we've got a page object. If we wanted to return this page object as a JSON response, we'd need to provide the client with context such as next and previous links, so that it would be able to page through the remaining results.

+
from rest_framework.pagination import PaginationSerializer
+
+serializer = PaginationSerializer(instance=page)
+serializer.data
+# {'count': 4, 'next': '?page=2', 'previous': None, 'results': [u'john', u'paul']}
+
+

The context argument of the PaginationSerializer class may optionally include the request. If the request is included in the context then the next and previous links returned by the serializer will use absolute URLs instead of relative URLs.

+
request = RequestFactory().get('/foobar')
+serializer = PaginationSerializer(instance=page, context={'request': request})
+serializer.data
+# {'count': 4, 'next': 'http://testserver/foobar?page=2', 'previous': None, 'results': [u'john', u'paul']}
+
+

We could now return that data in a Response object, and it would be rendered into the correct media type.

+

Paginating QuerySets

+

Our first example worked because we were using primitive objects. If we wanted to paginate a queryset or other complex data, we'd need to specify a serializer to use to serialize the result set itself.

+

We can do this using the object_serializer_class attribute on the inner Meta class of the pagination serializer. For example.

+
class UserSerializer(serializers.ModelSerializer):
+    """
+    Serializes user querysets.
+    """
+    class Meta:
+        model = User
+        fields = ('username', 'email')
+
+class PaginatedUserSerializer(pagination.PaginationSerializer):
+    """
+    Serializes page objects of user querysets.
+    """
+    class Meta:
+        object_serializer_class = UserSerializer
+
+

We could now use our pagination serializer in a view like this.

+
@api_view('GET')
+def user_list(request):
+    queryset = User.objects.all()
+    paginator = Paginator(queryset, 20)
+
+    page = request.QUERY_PARAMS.get('page')
+    try:
+        users = paginator.page(page)
+    except PageNotAnInteger:
+        # If page is not an integer, deliver first page.
+        users = paginator.page(1)
+    except EmptyPage:
+        # If page is out of range (e.g. 9999),
+        # deliver last page of results.
+        users = paginator.page(paginator.num_pages)
+
+    serializer_context = {'request': request}
+    serializer = PaginatedUserSerializer(users,
+                                         context=serializer_context)
+    return Response(serializer.data)
+
+

Pagination in the generic views

+

The generic class based views ListAPIView and ListCreateAPIView provide pagination of the returned querysets by default. You can customise this behaviour by altering the pagination style, by modifying the default number of results, by allowing clients to override the page size using a query parameter, or by turning pagination off completely.

+

The default pagination style may be set globally, using the DEFAULT_PAGINATION_SERIALIZER_CLASS, PAGINATE_BY, PAGINATE_BY_PARAM, and MAX_PAGINATE_BY settings. For example.

+
REST_FRAMEWORK = {
+    'PAGINATE_BY': 10,                 # Default to 10
+    'PAGINATE_BY_PARAM': 'page_size',  # Allow client to override, using `?page_size=xxx`.
+    'MAX_PAGINATE_BY': 100             # Maximum limit allowed when using `?page_size=xxx`.
+}
+
+

You can also set the pagination style on a per-view basis, using the ListAPIView generic class-based view.

+
class PaginatedListView(ListAPIView):
+    queryset = ExampleModel.objects.all()
+    serializer_class = ExampleModelSerializer
+    paginate_by = 10
+    paginate_by_param = 'page_size'
+    max_paginate_by = 100
+
+

Note that using a paginate_by value of None will turn off pagination for the view.

+

For more complex requirements such as serialization that differs depending on the requested media type you can override the .get_paginate_by() and .get_pagination_serializer_class() methods.

+
+

Custom pagination serializers

+

To create a custom pagination serializer class you should override pagination.BasePaginationSerializer and set the fields that you want the serializer to return.

+

You can also override the name used for the object list field, by setting the results_field attribute, which defaults to 'results'.

+

Example

+

For example, to nest a pair of links labelled 'prev' and 'next', and set the name for the results field to 'objects', you might use something like this.

+
from rest_framework import pagination
+from rest_framework import serializers
+
+class LinksSerializer(serializers.Serializer):
+    next = pagination.NextPageField(source='*')
+    prev = pagination.PreviousPageField(source='*')
+
+class CustomPaginationSerializer(pagination.BasePaginationSerializer):
+    links = LinksSerializer(source='*')  # Takes the page object as the source
+    total_results = serializers.Field(source='paginator.count')
+
+    results_field = 'objects'
+
+

Using your custom pagination serializer

+

To have your custom pagination serializer be used by default, use the DEFAULT_PAGINATION_SERIALIZER_CLASS setting:

+
REST_FRAMEWORK = {
+    'DEFAULT_PAGINATION_SERIALIZER_CLASS':
+        'example_app.pagination.CustomPaginationSerializer',
+}
+
+

Alternatively, to set your custom pagination serializer on a per-view basis, use the pagination_serializer_class attribute on a generic class based view:

+
class PaginatedListView(generics.ListAPIView):
+    model = ExampleModel
+    pagination_serializer_class = CustomPaginationSerializer
+    paginate_by = 10
+
+
+
+
+
+ +
+
+ + + + + + + + + + diff --git a/api-guide/parsers.html b/api-guide/parsers.html new file mode 100644 index 000000000..6c38f7169 --- /dev/null +++ b/api-guide/parsers.html @@ -0,0 +1,376 @@ + + + + + Django REST framework - Parsers + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + + + +
+ +
+ +
+ + + + +
+
+ +
+

parsers.py

+

Parsers

+
+

Machine interacting web services tend to use more +structured formats for sending data than form-encoded, since they're +sending more complex data than simple forms

+

— Malcom Tredinnick, Django developers group

+
+

REST framework includes a number of built in Parser classes, that allow you to accept requests with various media types. There is also support for defining your own custom parsers, which gives you the flexibility to design the media types that your API accepts.

+

How the parser is determined

+

The set of valid parsers for a view is always defined as a list of classes. When either request.DATA or request.FILES is accessed, REST framework will examine the Content-Type header on the incoming request, and determine which parser to use to parse the request content.

+
+

Note: When developing client applications always remember to make sure you're setting the Content-Type header when sending data in an HTTP request.

+

If you don't set the content type, most clients will default to using 'application/x-www-form-urlencoded', which may not be what you wanted.

+

As an example, if you are sending json encoded data using jQuery with the .ajax() method, you should make sure to include the contentType: 'application/json' setting.

+
+

Setting the parsers

+

The default set of parsers may be set globally, using the DEFAULT_PARSER_CLASSES setting. For example, the following settings would allow requests with YAML content.

+
REST_FRAMEWORK = {
+    'DEFAULT_PARSER_CLASSES': (
+        'rest_framework.parsers.YAMLParser',
+    )
+}
+
+

You can also set the parsers used for an individual view, or viewset, +using the APIView class based views.

+
from rest_framework.parsers import YAMLParser
+from rest_framework.response import Response
+from rest_framework.views import APIView
+
+class ExampleView(APIView):
+    """
+    A view that can accept POST requests with YAML content.
+    """
+    parser_classes = (YAMLParser,)
+
+    def post(self, request, format=None):
+        return Response({'received data': request.DATA})
+
+

Or, if you're using the @api_view decorator with function based views.

+
@api_view(['POST'])
+@parser_classes((YAMLParser,))
+def example_view(request, format=None):
+    """
+    A view that can accept POST requests with YAML content.
+    """
+    return Response({'received data': request.DATA})
+
+
+

API Reference

+

JSONParser

+

Parses JSON request content.

+

.media_type: application/json

+

YAMLParser

+

Parses YAML request content.

+

Requires the pyyaml package to be installed.

+

.media_type: application/yaml

+

XMLParser

+

Parses REST framework's default style of XML request content.

+

Note that the XML markup language is typically used as the base language for more strictly defined domain-specific languages, such as RSS, Atom, and XHTML.

+

If you are considering using XML for your API, you may want to consider implementing a custom renderer and parser for your specific requirements, and using an existing domain-specific media-type, or creating your own custom XML-based media-type.

+

Requires the defusedxml package to be installed.

+

.media_type: application/xml

+

FormParser

+

Parses HTML form content. request.DATA will be populated with a QueryDict of data, request.FILES will be populated with an empty QueryDict of data.

+

You will typically want to use both FormParser and MultiPartParser together in order to fully support HTML form data.

+

.media_type: application/x-www-form-urlencoded

+

MultiPartParser

+

Parses multipart HTML form content, which supports file uploads. Both request.DATA and request.FILES will be populated with a QueryDict.

+

You will typically want to use both FormParser and MultiPartParser together in order to fully support HTML form data.

+

.media_type: multipart/form-data

+

FileUploadParser

+

Parses raw file upload content. The request.DATA property will be an empty QueryDict, and request.FILES will be a dictionary with a single key 'file' containing the uploaded file.

+

If the view used with FileUploadParser is called with a filename URL keyword argument, then that argument will be used as the filename. If it is called without a filename URL keyword argument, then the client must set the filename in the Content-Disposition HTTP header. For example Content-Disposition: attachment; filename=upload.jpg.

+

.media_type: */*

+
Notes:
+
    +
  • The FileUploadParser is for usage with native clients that can upload the file as a raw data request. For web-based uploads, or for native clients with multipart upload support, you should use the MultiPartParser parser instead.
  • +
  • Since this parser's media_type matches any content type, FileUploadParser should generally be the only parser set on an API view.
  • +
  • FileUploadParser respects Django's standard FILE_UPLOAD_HANDLERS setting, and the request.upload_handlers attribute. See the Django documentation for more details.
  • +
+
Basic usage example:
+
class FileUploadView(views.APIView):
+    parser_classes = (FileUploadParser,)
+
+    def put(self, request, filename, format=None):
+        file_obj = request.FILES['file']
+        # ...
+        # do some staff with uploaded file
+        # ...
+        return Response(status=204)
+
+
+

Custom parsers

+

To implement a custom parser, you should override BaseParser, set the .media_type property, and implement the .parse(self, stream, media_type, parser_context) method.

+

The method should return the data that will be used to populate the request.DATA property.

+

The arguments passed to .parse() are:

+

stream

+

A stream-like object representing the body of the request.

+

media_type

+

Optional. If provided, this is the media type of the incoming request content.

+

Depending on the request's Content-Type: header, this may be more specific than the renderer's media_type attribute, and may include media type parameters. For example "text/plain; charset=utf-8".

+

parser_context

+

Optional. If supplied, this argument will be a dictionary containing any additional context that may be required to parse the request content.

+

By default this will include the following keys: view, request, args, kwargs.

+

Example

+

The following is an example plaintext parser that will populate the request.DATA property with a string representing the body of the request.

+
class PlainTextParser(BaseParser):
+"""
+Plain text parser.
+"""
+
+media_type = 'text/plain'
+
+def parse(self, stream, media_type=None, parser_context=None):
+    """
+    Simply return a string representing the body of the request.
+    """
+    return stream.read()
+
+
+

Third party packages

+

The following third party packages are also available.

+

MessagePack

+

MessagePack is a fast, efficient binary serialization format. Juan Riaza maintains the djangorestframework-msgpack package which provides MessagePack renderer and parser support for REST framework.

+
+
+
+
+ +
+
+ + + + + + + + + + diff --git a/api-guide/permissions.html b/api-guide/permissions.html new file mode 100644 index 000000000..7a0886b9a --- /dev/null +++ b/api-guide/permissions.html @@ -0,0 +1,419 @@ + + + + + Django REST framework - Permissions + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + + + +
+ +
+ +
+ + + + +
+
+ +
+

permissions.py

+

Permissions

+
+

Authentication or identification by itself is not usually sufficient to gain access to information or code. For that, the entity requesting access must have authorization.

+

Apple Developer Documentation

+
+

Together with authentication and throttling, permissions determine whether a request should be granted or denied access.

+

Permission checks are always run at the very start of the view, before any other code is allowed to proceed. Permission checks will typically use the authentication information in the request.user and request.auth properties to determine if the incoming request should be permitted.

+

How permissions are determined

+

Permissions in REST framework are always defined as a list of permission classes.

+

Before running the main body of the view each permission in the list is checked. +If any permission check fails an exceptions.PermissionDenied exception will be raised, and the main body of the view will not run.

+

Object level permissions

+

REST framework permissions also support object-level permissioning. Object level permissions are used to determine if a user should be allowed to act on a particular object, which will typically be a model instance.

+

Object level permissions are run by REST framework's generic views when .get_object() is called. +As with view level permissions, an exceptions.PermissionDenied exception will be raised if the user is not allowed to act on the given object.

+

If you're writing your own views and want to enforce object level permissions, +or if you override the get_object method on a generic view, then you'll need to explicitly call the .check_object_permissions(request, obj) method on the view at the point at which you've retrieved the object.

+

This will either raise a PermissionDenied or NotAuthenticated exception, or simply return if the view has the appropriate permissions.

+

For example:

+
def get_object(self):
+    obj = get_object_or_404(self.get_queryset())
+    self.check_object_permissions(self.request, obj)
+    return obj
+
+

Setting the permission policy

+

The default permission policy may be set globally, using the DEFAULT_PERMISSION_CLASSES setting. For example.

+
REST_FRAMEWORK = {
+    'DEFAULT_PERMISSION_CLASSES': (
+        'rest_framework.permissions.IsAuthenticated',
+    )
+}
+
+

If not specified, this setting defaults to allowing unrestricted access:

+
'DEFAULT_PERMISSION_CLASSES': (
+   'rest_framework.permissions.AllowAny',
+)
+
+

You can also set the authentication policy on a per-view, or per-viewset basis, +using the APIView class based views.

+
from rest_framework.permissions import IsAuthenticated
+from rest_framework.responses import Response
+from rest_framework.views import APIView
+
+class ExampleView(APIView):
+    permission_classes = (IsAuthenticated,)
+
+    def get(self, request, format=None):
+        content = {
+            'status': 'request was permitted'
+        }
+        return Response(content)
+
+

Or, if you're using the @api_view decorator with function based views.

+
@api_view('GET')
+@permission_classes((IsAuthenticated, ))
+def example_view(request, format=None):
+    content = {
+        'status': 'request was permitted'
+    }
+    return Response(content)
+
+
+

API Reference

+

AllowAny

+

The AllowAny permission class will allow unrestricted access, regardless of if the request was authenticated or unauthenticated.

+

This permission is not strictly required, since you can achieve the same result by using an empty list or tuple for the permissions setting, but you may find it useful to specify this class because it makes the intention explicit.

+

IsAuthenticated

+

The IsAuthenticated permission class will deny permission to any unauthenticated user, and allow permission otherwise.

+

This permission is suitable if you want your API to only be accessible to registered users.

+

IsAdminUser

+

The IsAdminUser permission class will deny permission to any user, unless user.is_staff is True in which case permission will be allowed.

+

This permission is suitable is you want your API to only be accessible to a subset of trusted administrators.

+

IsAuthenticatedOrReadOnly

+

The IsAuthenticatedOrReadOnly will allow authenticated users to perform any request. Requests for unauthorised users will only be permitted if the request method is one of the "safe" methods; GET, HEAD or OPTIONS.

+

This permission is suitable if you want to your API to allow read permissions to anonymous users, and only allow write permissions to authenticated users.

+

DjangoModelPermissions

+

This permission class ties into Django's standard django.contrib.auth model permissions. When applied to a view that has a .model property, 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.
  • +
  • PUT and PATCH requests require the user to have the change permission on the model.
  • +
  • DELETE requests require the user to have the delete permission on the model.
  • +
+

The default behaviour can also be overridden to support custom model permissions. For example, you might want to include a view model permission for GET requests.

+

To use custom model permissions, override DjangoModelPermissions and set the .perms_map property. Refer to the source code for details.

+

DjangoModelPermissionsOrAnonReadOnly

+

Similar to DjangoModelPermissions, but also allows unauthenticated users to have read-only access to the API.

+

DjangoObjectPermissions

+

This permission class ties into Django's standard object permissions framework that allows per-object permissions on models. In order to use this permission class, you'll also need to add a permission backend that supports object-level permissions, such as django-guardian.

+

When applied to a view that has a .model property, authorization will only be granted if the user is authenticated and has the relevant per-object permissions and relevant model permissions assigned.

+
    +
  • POST requests require the user to have the add permission on the model instance.
  • +
  • PUT and PATCH requests require the user to have the change permission on the model instance.
  • +
  • DELETE requests require the user to have the delete permission on the model instance.
  • +
+

Note that DjangoObjectPermissions does not require the django-guardian package, and should support other object-level backends equally well.

+

As with DjangoModelPermissions you can use custom model permissions by overriding DjangoModelPermissions and setting the .perms_map property. Refer to the source code for details. Note that if you add a custom view permission for GET, HEAD and OPTIONS requests, you'll probably also want to consider adding the DjangoObjectPermissionsFilter class to ensure that list endpoints only return results including objects for which the user has appropriate view permissions.

+

TokenHasReadWriteScope

+

This permission class is intended for use with either of the OAuthAuthentication and OAuth2Authentication classes, and ties into the scoping that their backends provide.

+

Requests with a safe methods of GET, OPTIONS or HEAD will be allowed if the authenticated token has read permission.

+

Requests for POST, PUT, PATCH and DELETE will be allowed if the authenticated token has write permission.

+

This permission class relies on the implementations of the django-oauth-plus and django-oauth2-provider libraries, which both provide limited support for controlling the scope of access tokens:

+
    +
  • django-oauth-plus: Tokens are associated with a Resource class which has a name, url and is_readonly properties.
  • +
  • django-oauth2-provider: Tokens are associated with a bitwise scope attribute, that defaults to providing bitwise values for read and/or write.
  • +
+

If you require more advanced scoping for your API, such as restricting tokens to accessing a subset of functionality of your API then you will need to provide a custom permission class. See the source of the django-oauth-plus or django-oauth2-provider package for more details on scoping token access.

+
+

Custom permissions

+

To implement a custom permission, override BasePermission and implement either, or both, of the following methods:

+
    +
  • .has_permission(self, request, view)
  • +
  • .has_object_permission(self, request, view, obj)
  • +
+

The methods should return True if the request should be granted access, and False otherwise.

+

If you need to test if a request is a read operation or a write operation, you should check the request method against the constant SAFE_METHODS, which is a tuple containing 'GET', 'OPTIONS' and 'HEAD'. For example:

+
if request.method in permissions.SAFE_METHODS:
+    # Check permissions for read-only request
+else:
+    # Check permissions for write request
+
+
+

Note: In versions 2.0 and 2.1, the signature for the permission checks always included an optional obj parameter, like so: .has_permission(self, request, view, obj=None). The method would be called twice, first for the global permission checks, with no object supplied, and second for the object-level check when required.

+

As of version 2.2 this signature has now been replaced with two separate method calls, which is more explicit and obvious. The old style signature continues to work, but its use will result in a PendingDeprecationWarning, which is silent by default. In 2.3 this will be escalated to a DeprecationWarning, and in 2.4 the old-style signature will be removed.

+

For more details see the 2.2 release announcement.

+
+

Examples

+

The following is an example of a permission class that checks the incoming request's IP address against a blacklist, and denies the request if the IP has been blacklisted.

+
from rest_framework import permissions
+
+class BlacklistPermission(permissions.BasePermission):
+    """
+    Global permission check for blacklisted IPs.
+    """
+
+    def has_permission(self, request, view):
+        ip_addr = request.META['REMOTE_ADDR']
+        blacklisted = Blacklist.objects.filter(ip_addr=ip_addr).exists()
+        return not blacklisted
+
+

As well as global permissions, that are run against all incoming requests, you can also create object-level permissions, that are only run against operations that affect a particular object instance. For example:

+
class IsOwnerOrReadOnly(permissions.BasePermission):
+    """
+    Object-level permission to only allow owners of an object to edit it.
+    Assumes the model instance has an `owner` attribute.
+    """
+
+    def has_object_permission(self, request, view, obj):
+        # Read permissions are allowed to any request,
+        # so we'll always allow GET, HEAD or OPTIONS requests.
+        if request.method in permissions.SAFE_METHODS:            
+            return True
+
+        # Instance must have an attribute named `owner`.
+        return obj.owner == request.user
+
+

Note that the generic views will check the appropriate object level permissions, but if you're writing your own custom views, you'll need to make sure you check the object level permission checks yourself. You can do so by calling self.check_object_permissions(request, obj) from the view once you have the object instance. This call will raise an appropriate APIException if any object-level permission checks fail, and will otherwise simply return.

+

Also note that the generic views will only check the object-level permissions for views that retrieve a single model instance. If you require object-level filtering of list views, you'll need to filter the queryset separately. See the filtering documentation for more details.

+
+

Third party packages

+

The following third party packages are also available.

+

DRF Any Permissions

+

The DRF Any Permissions packages provides a different permission behavior in contrast to REST framework. Instead of all specified permissions being required, only one of the given permissions has to be true in order to get access to the view.

+

Composed Permissions

+

The Composed Permissions package provides a simple way to define complex and multi-depth (with logic operators) permission objects, using small and reusable components.

+
+
+
+
+ +
+
+ + + + + + + + + + diff --git a/api-guide/relations.html b/api-guide/relations.html new file mode 100644 index 000000000..33805a02b --- /dev/null +++ b/api-guide/relations.html @@ -0,0 +1,616 @@ + + + + + Django REST framework - Serializer relations + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + + + +
+ +
+ +
+ + + + +
+
+ +
+

relations.py

+

Serializer relations

+
+

Bad programmers worry about the code. +Good programmers worry about data structures and their relationships.

+

Linus Torvalds

+
+

Relational fields are used to represent model relationships. They can be applied to ForeignKey, ManyToManyField and OneToOneField relationships, as well as to reverse relationships, and custom relationships such as GenericForeignKey.

+
+

Note: The relational fields are declared in relations.py, but by convention you should import them from the serializers module, using from rest_framework import serializers and refer to fields as serializers.<FieldName>.

+
+

API Reference

+

In order to explain the various types of relational fields, we'll use a couple of simple models for our examples. Our models will be for music albums, and the tracks listed on each album.

+
class Album(models.Model):
+    album_name = models.CharField(max_length=100)
+    artist = models.CharField(max_length=100)
+
+class Track(models.Model):
+    album = models.ForeignKey(Album, related_name='tracks')
+    order = models.IntegerField()
+    title = models.CharField(max_length=100)
+    duration = models.IntegerField()
+
+    class Meta:
+        unique_together = ('album', 'order')
+        order_by = 'order'
+
+    def __unicode__(self):
+        return '%d: %s' % (self.order, self.title)
+
+

RelatedField

+

RelatedField may be used to represent the target of the relationship using its __unicode__ method.

+

For example, the following serializer.

+
class AlbumSerializer(serializers.ModelSerializer):
+    tracks = RelatedField(many=True)
+
+    class Meta:
+        model = Album
+        fields = ('album_name', 'artist', 'tracks')
+
+

Would serialize to the following representation.

+
{
+    'album_name': 'Things We Lost In The Fire',
+    'artist': 'Low',
+    'tracks': [
+        '1: Sunflower',
+        '2: Whitetail',
+        '3: Dinosaur Act',
+        ...
+    ]
+}
+
+

This field is read only.

+

Arguments:

+
    +
  • many - If applied to a to-many relationship, you should set this argument to True.
  • +
+

PrimaryKeyRelatedField

+

PrimaryKeyRelatedField may be used to represent the target of the relationship using its primary key.

+

For example, the following serializer:

+
class AlbumSerializer(serializers.ModelSerializer):
+    tracks = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
+
+    class Meta:
+        model = Album
+        fields = ('album_name', 'artist', 'tracks')
+
+

Would serialize to a representation like this:

+
{
+    'album_name': 'The Roots',
+    'artist': 'Undun',
+    'tracks': [
+        89,
+        90,
+        91,
+        ...
+    ]
+}
+
+

By default this field is read-write, although you can change this behavior using the read_only flag.

+

Arguments:

+
    +
  • many - If applied to a to-many relationship, you should set this argument to True.
  • +
  • required - If set to False, the field will accept values of None or the empty-string for nullable relationships.
  • +
  • queryset - By default ModelSerializer classes will use the default queryset for the relationship. Serializer classes must either set a queryset explicitly, or set read_only=True.
  • +
+

HyperlinkedRelatedField

+

HyperlinkedRelatedField may be used to represent the target of the relationship using a hyperlink.

+

For example, the following serializer:

+
class AlbumSerializer(serializers.ModelSerializer):
+    tracks = serializers.HyperlinkedRelatedField(many=True, read_only=True,
+                                                 view_name='track-detail')
+
+    class Meta:
+        model = Album
+        fields = ('album_name', 'artist', 'tracks')
+
+

Would serialize to a representation like this:

+
{
+    'album_name': 'Graceland',
+    'artist': 'Paul Simon',
+    'tracks': [
+        'http://www.example.com/api/tracks/45/',
+        'http://www.example.com/api/tracks/46/',
+        'http://www.example.com/api/tracks/47/',
+        ...
+    ]
+}
+
+

By default this field is read-write, although you can change this behavior using the read_only flag.

+

Arguments:

+
    +
  • view_name - The view name that should be used as the target of the relationship. required.
  • +
  • many - If applied to a to-many relationship, you should set this argument to True.
  • +
  • required - If set to False, the field will accept values of None or the empty-string for nullable relationships.
  • +
  • queryset - By default ModelSerializer classes will use the default queryset for the relationship. Serializer classes must either set a queryset explicitly, or set read_only=True.
  • +
  • lookup_field - The field on the target that should be used for the lookup. Should correspond to a URL keyword argument on the referenced view. Default is 'pk'.
  • +
  • format - If using format suffixes, hyperlinked fields will use the same format suffix for the target unless overridden by using the format argument.
  • +
+

SlugRelatedField

+

SlugRelatedField may be used to represent the target of the relationship using a field on the target.

+

For example, the following serializer:

+
class AlbumSerializer(serializers.ModelSerializer):
+    tracks = serializers.SlugRelatedField(many=True, read_only=True,
+                                          slug_field='title')
+
+    class Meta:
+        model = Album
+        fields = ('album_name', 'artist', 'tracks')
+
+

Would serialize to a representation like this:

+
{
+    'album_name': 'Dear John',
+    'artist': 'Loney Dear',
+    'tracks': [
+        'Airport Surroundings',
+        'Everything Turns to You',
+        'I Was Only Going Out',
+        ...
+    ]
+}
+
+

By default this field is read-write, although you can change this behavior using the read_only flag.

+

When using SlugRelatedField as a read-write field, you will normally want to ensure that the slug field corresponds to a model field with unique=True.

+

Arguments:

+
    +
  • slug_field - The field on the target that should be used to represent it. This should be a field that uniquely identifies any given instance. For example, username. required
  • +
  • many - If applied to a to-many relationship, you should set this argument to True.
  • +
  • required - If set to False, the field will accept values of None or the empty-string for nullable relationships.
  • +
  • queryset - By default ModelSerializer classes will use the default queryset for the relationship. Serializer classes must either set a queryset explicitly, or set read_only=True.
  • +
+

HyperlinkedIdentityField

+

This field can be applied as an identity relationship, such as the 'url' field on a HyperlinkedModelSerializer. It can also be used for an attribute on the object. For example, the following serializer:

+
class AlbumSerializer(serializers.HyperlinkedModelSerializer):
+    track_listing = serializers.HyperlinkedIdentityField(view_name='track-list')
+
+    class Meta:
+        model = Album
+        fields = ('album_name', 'artist', 'track_listing')
+
+

Would serialize to a representation like this:

+
{
+    'album_name': 'The Eraser',
+    'artist': 'Thom Yorke',
+    'track_listing': 'http://www.example.com/api/track_list/12/',
+}
+
+

This field is always read-only.

+

Arguments:

+
    +
  • view_name - The view name that should be used as the target of the relationship. required.
  • +
  • lookup_field - The field on the target that should be used for the lookup. Should correspond to a URL keyword argument on the referenced view. Default is 'pk'.
  • +
  • format - If using format suffixes, hyperlinked fields will use the same format suffix for the target unless overridden by using the format argument.
  • +
+
+

Nested relationships

+

Nested relationships can be expressed by using serializers as fields.

+

If the field is used to represent a to-many relationship, you should add the many=True flag to the serializer field.

+

Example

+

For example, the following serializer:

+
class TrackSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = Track
+        fields = ('order', 'title')
+
+class AlbumSerializer(serializers.ModelSerializer):
+    tracks = TrackSerializer(many=True)
+
+    class Meta:
+        model = Album
+        fields = ('album_name', 'artist', 'tracks')
+
+

Would serialize to a nested representation like this:

+
{
+    'album_name': 'The Grey Album',
+    'artist': 'Danger Mouse',
+    'tracks': [
+        {'order': 1, 'title': 'Public Service Announcement'},
+        {'order': 2, 'title': 'What More Can I Say'},
+        {'order': 3, 'title': 'Encore'},
+        ...
+    ],
+}
+
+

Custom relational fields

+

To implement a custom relational field, you should override RelatedField, and implement the .to_native(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.

+

If you want to implement a read-write relational field, you must also implement the .from_native(self, data) method, and add read_only = False to the class definition.

+

Example

+

For, example, we could define a relational field, to serialize a track to a custom string representation, using its ordering, title, and duration.

+
import time
+
+class TrackListingField(serializers.RelatedField):
+    def to_native(self, value):
+        duration = time.strftime('%M:%S', time.gmtime(value.duration))
+        return 'Track %d: %s (%s)' % (value.order, value.name, duration)
+
+class AlbumSerializer(serializers.ModelSerializer):
+    tracks = TrackListingField(many=True)
+
+    class Meta:
+        model = Album
+        fields = ('album_name', 'artist', 'tracks')
+
+

This custom field would then serialize to the following representation.

+
{
+    'album_name': 'Sometimes I Wish We Were an Eagle',
+    'artist': 'Bill Callahan',
+    'tracks': [
+        'Track 1: Jim Cain (04:39)',
+        'Track 2: Eid Ma Clack Shaw (04:19)',
+        'Track 3: The Wind and the Dove (04:34)',
+        ...
+    ]
+}
+
+
+

Further notes

+

Reverse relations

+

Note that reverse relationships are not automatically included by the ModelSerializer and HyperlinkedModelSerializer classes. To include a reverse relationship, you must explicitly add it to the fields list. For example:

+
class AlbumSerializer(serializers.ModelSerializer):
+    class Meta:
+        fields = ('tracks', ...)
+
+

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):
+    album = models.ForeignKey(Album, related_name='tracks')
+    ...
+
+

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:

+
class AlbumSerializer(serializers.ModelSerializer):
+    class Meta:
+        fields = ('track_set', ...)
+
+

See the Django documentation on reverse relationships for more details.

+

Generic relationships

+

If you want to serialize a generic foreign key, you need to define a custom field, to determine explicitly how you want serialize the targets of the relationship.

+

For example, given the following model for a tag, which has a generic relationship with other arbitrary models:

+
class TaggedItem(models.Model):
+    """
+    Tags arbitrary model instances using a generic relation.
+
+    See: https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/
+    """
+    tag_name = models.SlugField()
+    content_type = models.ForeignKey(ContentType)
+    object_id = models.PositiveIntegerField()
+    tagged_object = GenericForeignKey('content_type', 'object_id')
+
+    def __unicode__(self):
+        return self.tag
+
+

And the following two models, which may be have associated tags:

+
class Bookmark(models.Model):
+    """
+    A bookmark consists of a URL, and 0 or more descriptive tags.
+    """
+    url = models.URLField()
+    tags = GenericRelation(TaggedItem)
+
+
+class Note(models.Model):
+    """
+    A note consists of some text, and 0 or more descriptive tags.
+    """
+    text = models.CharField(max_length=1000)
+    tags = GenericRelation(TaggedItem)
+
+

We could define a custom field that could be used to serialize tagged instances, using the type of each instance to determine how it should be serialized.

+
class TaggedObjectRelatedField(serializers.RelatedField):
+    """
+    A custom field to use for the `tagged_object` generic relationship.
+    """
+
+    def to_native(self, value):
+        """
+        Serialize tagged objects to a simple textual representation.
+        """                            
+        if isinstance(value, Bookmark):
+            return 'Bookmark: ' + value.url
+        elif isinstance(value, Note):
+            return 'Note: ' + value.text
+        raise Exception('Unexpected type of tagged object')
+
+

If you need the target of the relationship to have a nested representation, you can use the required serializers inside the .to_native() method:

+
    def to_native(self, value):
+        """
+        Serialize bookmark instances using a bookmark serializer,
+        and note instances using a note serializer.
+        """                            
+        if isinstance(value, Bookmark):
+            serializer = BookmarkSerializer(value)
+        elif isinstance(value, Note):
+            serializer = NoteSerializer(value)
+        else:
+            raise Exception('Unexpected type of tagged object')
+
+        return serializer.data
+
+

Note that reverse generic keys, expressed using the GenericRelation field, can be serialized using the regular relational field types, since the type of the target in the relationship is always known.

+

For more information see the Django documentation on generic relations.

+

ManyToManyFields with a Through Model

+

By default, relational fields that target a ManyToManyField with a +through model specified are set to read-only.

+

If you explicitly specify a relational field pointing to a +ManyToManyField with a through model, be sure to set read_only +to True.

+

Advanced Hyperlinked fields

+

If you have very specific requirements for the style of your hyperlinked relationships you can override HyperlinkedRelatedField.

+

There are two methods you'll need to override.

+

get_url(self, obj, view_name, request, format)

+

This method should return the URL that corresponds to the given object.

+

May raise a NoReverseMatch if the view_name and lookup_field +attributes are not configured to correctly match the URL conf.

+

get_object(self, queryset, view_name, view_args, view_kwargs)

+

This method should the object that corresponds to the matched URL conf arguments.

+

May raise an ObjectDoesNotExist exception.

+

Example

+

For example, if all your object URLs used both a account and a slug in the the URL to reference the object, you might create a custom field like this:

+
class CustomHyperlinkedField(serializers.HyperlinkedRelatedField):
+    def get_url(self, obj, view_name, request, format):
+        kwargs = {'account': obj.account, 'slug': obj.slug}
+        return reverse(view_name, kwargs=kwargs, request=request, format=format)
+
+    def get_object(self, queryset, view_name, view_args, view_kwargs):
+        account = view_kwargs['account']
+        slug = view_kwargs['slug']
+        return queryset.get(account=account, slug=slug)
+
+
+

Deprecated APIs

+

The following classes have been deprecated, in favor of the many=<bool> syntax. +They continue to function, but their usage will raise a PendingDeprecationWarning, which is silent by default.

+
    +
  • ManyRelatedField
  • +
  • ManyPrimaryKeyRelatedField
  • +
  • ManyHyperlinkedRelatedField
  • +
  • ManySlugRelatedField
  • +
+

The null=<bool> flag has been deprecated in favor of the required=<bool> flag. It will continue to function, but will raise a PendingDeprecationWarning.

+

In the 2.3 release, these warnings will be escalated to a DeprecationWarning, which is loud by default. +In the 2.4 release, these parts of the API will be removed entirely.

+

For more details see the 2.2 release announcement.

+
+
+
+
+ +
+
+ + + + + + + + + + diff --git a/api-guide/renderers.html b/api-guide/renderers.html new file mode 100644 index 000000000..8077c8044 --- /dev/null +++ b/api-guide/renderers.html @@ -0,0 +1,543 @@ + + + + + Django REST framework - Renderers + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + + + +
+ +
+ +
+ + + + +
+
+ +
+

renderers.py

+

Renderers

+
+

Before a TemplateResponse instance can be returned to the client, it must be rendered. The rendering process takes the intermediate representation of template and context, and turns it into the final byte stream that can be served to the client.

+

Django documentation

+
+

REST framework includes a number of built in Renderer classes, that allow you to return responses with various media types. There is also support for defining your own custom renderers, which gives you the flexibility to design your own media types.

+

How the renderer is determined

+

The set of valid renderers for a view is always defined as a list of classes. When a view is entered REST framework will perform content negotiation on the incoming request, and determine the most appropriate renderer to satisfy the request.

+

The basic process of content negotiation involves examining the request's Accept header, to determine which media types it expects in the response. Optionally, format suffixes on the URL may be used to explicitly request a particular representation. For example the URL http://example.com/api/users_count.json might be an endpoint that always returns JSON data.

+

For more information see the documentation on content negotiation.

+

Setting the renderers

+

The default set of renderers may be set globally, using the DEFAULT_RENDERER_CLASSES setting. For example, the following settings would use YAML as the main media type and also include the self describing API.

+
REST_FRAMEWORK = {
+    'DEFAULT_RENDERER_CLASSES': (
+        'rest_framework.renderers.YAMLRenderer',
+        'rest_framework.renderers.BrowsableAPIRenderer',
+    )
+}
+
+

You can also set the renderers used for an individual view, or viewset, +using the APIView class based views.

+
from django.contrib.auth.models import User
+from rest_framework.renderers import JSONRenderer, YAMLRenderer
+from rest_framework.response import Response
+from rest_framework.views import APIView
+
+class UserCountView(APIView):
+    """
+    A view that returns the count of active users, in JSON or YAML.
+    """
+    renderer_classes = (JSONRenderer, YAMLRenderer)
+
+    def get(self, request, format=None):
+        user_count = User.objects.filter(active=True).count()
+        content = {'user_count': user_count}
+        return Response(content)
+
+

Or, if you're using the @api_view decorator with function based views.

+
@api_view(['GET'])
+@renderer_classes((JSONRenderer, JSONPRenderer))
+def user_count_view(request, format=None):
+    """
+    A view that returns the count of active users, in JSON or JSONp.
+    """
+    user_count = User.objects.filter(active=True).count()
+    content = {'user_count': user_count}
+    return Response(content)
+
+

Ordering of renderer classes

+

It's important when specifying the renderer classes for your API to think about what priority you want to assign to each media type. If a client underspecifies the representations it can accept, such as sending an Accept: */* header, or not including an Accept header at all, then REST framework will select the first renderer in the list to use for the response.

+

For example if your API serves JSON responses and the HTML browsable API, you might want to make JSONRenderer your default renderer, in order to send JSON responses to clients that do not specify an Accept header.

+

If your API includes views that can serve both regular webpages and API responses depending on the request, then you might consider making TemplateHTMLRenderer your default renderer, in order to play nicely with older browsers that send broken accept headers.

+
+

API Reference

+

JSONRenderer

+

Renders the request data into JSON, using utf-8 encoding.

+

Note that non-ascii characters will be rendered using JSON's \uXXXX character escape. For example:

+
{"unicode black star": "\u2605"}
+
+

The client may additionally include an 'indent' media type parameter, in which case the returned JSON will be indented. For example Accept: application/json; indent=4.

+
{
+    "unicode black star": "\u2605"
+}
+
+

.media_type: application/json

+

.format: '.json'

+

.charset: None

+

UnicodeJSONRenderer

+

Renders the request data into JSON, using utf-8 encoding.

+

Note that non-ascii characters will not be character escaped. For example:

+
{"unicode black star": "★"}
+
+

The client may additionally include an 'indent' media type parameter, in which case the returned JSON will be indented. For example Accept: application/json; indent=4.

+
{
+    "unicode black star": "★"
+}
+
+

Both the JSONRenderer and UnicodeJSONRenderer styles conform to RFC 4627, and are syntactically valid JSON.

+

.media_type: application/json

+

.format: '.json'

+

.charset: None

+

JSONPRenderer

+

Renders the request data into JSONP. The JSONP media type provides a mechanism of allowing cross-domain AJAX requests, by wrapping a JSON response in a javascript callback.

+

The javascript callback function must be set by the client including a callback URL query parameter. For example http://example.com/api/users?callback=jsonpCallback. If the callback function is not explicitly set by the client it will default to 'callback'.

+

Note: If you require cross-domain AJAX requests, you may want to consider using the more modern approach of CORS as an alternative to JSONP. See the CORS documentation for more details.

+

.media_type: application/javascript

+

.format: '.jsonp'

+

.charset: utf-8

+

YAMLRenderer

+

Renders the request data into YAML.

+

Requires the pyyaml package to be installed.

+

.media_type: application/yaml

+

.format: '.yaml'

+

.charset: utf-8

+

XMLRenderer

+

Renders REST framework's default style of XML response content.

+

Note that the XML markup language is used typically used as the base language for more strictly defined domain-specific languages, such as RSS, Atom, and XHTML.

+

If you are considering using XML for your API, you may want to consider implementing a custom renderer and parser for your specific requirements, and using an existing domain-specific media-type, or creating your own custom XML-based media-type.

+

.media_type: application/xml

+

.format: '.xml'

+

.charset: utf-8

+

TemplateHTMLRenderer

+

Renders data to HTML, using Django's standard template rendering. +Unlike other renderers, the data passed to the Response does not need to be serialized. Also, unlike other renderers, you may want to include a template_name argument when creating the Response.

+

The TemplateHTMLRenderer will create a RequestContext, using the response.data as the context dict, and determine a template name to use to render the context.

+

The template name is determined by (in order of preference):

+
    +
  1. An explicit template_name argument passed to the response.
  2. +
  3. An explicit .template_name attribute set on this class.
  4. +
  5. The return result of calling view.get_template_names().
  6. +
+

An example of a view that uses TemplateHTMLRenderer:

+
class UserDetail(generics.RetrieveUserAPIView):
+    """
+    A view that returns a templated HTML representations of a given user.
+    """
+    queryset = User.objects.all()
+    renderer_classes = (TemplateHTMLRenderer,)
+
+    def get(self, request, *args, **kwargs)
+        self.object = self.get_object()
+        return Response({'user': self.object}, template_name='user_detail.html')
+
+

You can use TemplateHTMLRenderer either to return regular HTML pages using REST framework, or to return both HTML and API responses from a single endpoint.

+

If you're building websites that use TemplateHTMLRenderer along with other renderer classes, you should consider listing TemplateHTMLRenderer as the first class in the renderer_classes list, so that it will be prioritised first even for browsers that send poorly formed ACCEPT: headers.

+

.media_type: text/html

+

.format: '.html'

+

.charset: utf-8

+

See also: StaticHTMLRenderer

+

StaticHTMLRenderer

+

A simple renderer that simply returns pre-rendered HTML. Unlike other renderers, the data passed to the response object should be a string representing the content to be returned.

+

An example of a view that uses TemplateHTMLRenderer:

+
@api_view(('GET',))
+@renderer_classes((StaticHTMLRenderer,))
+def simple_html_view(request): 
+    data = '<html><body><h1>Hello, world</h1></body></html>'
+    return Response(data)
+
+

You can use TemplateHTMLRenderer either to return regular HTML pages using REST framework, or to return both HTML and API responses from a single endpoint.

+

.media_type: text/html

+

.format: '.html'

+

.charset: utf-8

+

See also: TemplateHTMLRenderer

+

HTMLFormRenderer

+

Renders data returned by a serializer into an HTML form. The output of this renderer does not include the enclosing <form> tags or an submit actions, as you'll probably need those to include the desired method and URL. Also note that the HTMLFormRenderer does not yet support including field error messages.

+

Note that the template used by the HTMLFormRenderer class, and the context submitted to it may be subject to change. If you need to use this renderer class it is advised that you either make a local copy of the class and templates, or follow the release note on REST framework upgrades closely.

+

.media_type: text/html

+

.format: '.form'

+

.charset: utf-8

+

.template: 'rest_framework/form.html'

+

BrowsableAPIRenderer

+

Renders data into HTML for the Browsable API. This renderer will determine which other renderer would have been given highest priority, and use that to display an API style response within the HTML page.

+

.media_type: text/html

+

.format: '.api'

+

.charset: utf-8

+

.template: 'rest_framework/api.html'

+

Customizing BrowsableAPIRenderer

+

By default the response content will be rendered with the highest priority renderer apart from BrowseableAPIRenderer. If you need to customize this behavior, for example to use HTML as the default return format, but use JSON in the browsable API, you can do so by overriding the get_default_renderer() method. For example:

+
class CustomBrowsableAPIRenderer(BrowsableAPIRenderer):
+    def get_default_renderer(self, view):
+        return JSONRenderer()
+
+

MultiPartRenderer

+

This renderer is used for rendering HTML multipart form data. It is not suitable as a response renderer, but is instead used for creating test requests, using REST framework's test client and test request factory.

+

.media_type: multipart/form-data; boundary=BoUnDaRyStRiNg

+

.format: '.multipart'

+

.charset: utf-8

+
+

Custom renderers

+

To implement a custom renderer, you should override BaseRenderer, set the .media_type and .format properties, and implement the .render(self, data, media_type=None, renderer_context=None) method.

+

The method should return a bytestring, which will be used as the body of the HTTP response.

+

The arguments passed to the .render() method are:

+

data

+

The request data, as set by the Response() instantiation.

+

media_type=None

+

Optional. If provided, this is the accepted media type, as determined by the content negotiation stage.

+

Depending on the client's Accept: header, this may be more specific than the renderer's media_type attribute, and may include media type parameters. For example "application/json; nested=true".

+

renderer_context=None

+

Optional. If provided, this is a dictionary of contextual information provided by the view.

+

By default this will include the following keys: view, request, response, args, kwargs.

+

Example

+

The following is an example plaintext renderer that will return a response with the data parameter as the content of the response.

+
from django.utils.encoding import smart_unicode
+from rest_framework import renderers
+
+
+class PlainTextRenderer(renderers.BaseRenderer):
+    media_type = 'text/plain'
+    format = 'txt'
+
+    def render(self, data, media_type=None, renderer_context=None):
+        return data.encode(self.charset)
+
+

Setting the character set

+

By default renderer classes are assumed to be using the UTF-8 encoding. To use a different encoding, set the charset attribute on the renderer.

+
class PlainTextRenderer(renderers.BaseRenderer):
+    media_type = 'text/plain'
+    format = 'txt'
+    charset = 'iso-8859-1'
+
+    def render(self, data, media_type=None, renderer_context=None):
+        return data.encode(self.charset)
+
+

Note that if a renderer class returns a unicode string, then the response content will be coerced into a bytestring by the Response class, with the charset attribute set on the renderer used to determine the encoding.

+

If the renderer returns a bytestring representing raw binary content, you should set a charset value of None, which will ensure the Content-Type header of the response will not have a charset value set.

+

In some cases you may also want to set the render_style attribute to 'binary'. Doing so will also ensure that the browsable API will not attempt to display the binary content as a string.

+
class JPEGRenderer(renderers.BaseRenderer):
+    media_type = 'image/jpeg'
+    format = 'jpg'
+    charset = None
+    render_style = 'binary'
+
+    def render(self, data, media_type=None, renderer_context=None):
+        return data
+
+
+

Advanced renderer usage

+

You can do some pretty flexible things using REST framework's renderers. Some examples...

+
    +
  • Provide either flat or nested representations from the same endpoint, depending on the requested media type.
  • +
  • Serve both regular HTML webpages, and JSON based API responses from the same endpoints.
  • +
  • Specify multiple types of HTML representation for API clients to use.
  • +
  • Underspecify a renderer's media type, such as using media_type = 'image/*', and use the Accept header to vary the encoding of the response.
  • +
+

Varying behaviour by media type

+

In some cases you might want your view to use different serialization styles depending on the accepted media type. If you need to do this you can access request.accepted_renderer to determine the negotiated renderer that will be used for the response.

+

For example:

+
@api_view(('GET',))
+@renderer_classes((TemplateHTMLRenderer, JSONRenderer))
+def list_users(request):
+    """
+    A view that can return JSON or HTML representations
+    of the users in the system.
+    """
+    queryset = Users.objects.filter(active=True)
+
+    if request.accepted_renderer.format == 'html':
+        # TemplateHTMLRenderer takes a context dict,
+        # and additionally requires a 'template_name'.
+        # It does not require serialization.
+        data = {'users': queryset}
+        return Response(data, template_name='list_users.html')
+
+    # JSONRenderer requires serialized data as normal.
+    serializer = UserSerializer(instance=queryset)
+    data = serializer.data
+    return Response(data)
+
+

Underspecifying the media type

+

In some cases you might want a renderer to serve a range of media types. +In this case you can underspecify the media types it should respond to, by using a media_type value such as image/*, or */*.

+

If you underspecify the renderer's media type, you should make sure to specify the media type explicitly when you return the response, using the content_type attribute. For example:

+
return Response(data, content_type='image/png')
+
+

Designing your media types

+

For the purposes of many Web APIs, simple JSON responses with hyperlinked relations may be sufficient. If you want to fully embrace RESTful design and HATEOAS you'll need to consider the design and usage of your media types in more detail.

+

In the words of Roy Fielding, "A REST API should spend almost all of its descriptive effort in defining the media type(s) used for representing resources and driving application state, or in defining extended relation names and/or hypertext-enabled mark-up for existing standard media types.".

+

For good examples of custom media types, see GitHub's use of a custom application/vnd.github+json media type, and Mike Amundsen's IANA approved application/vnd.collection+json JSON-based hypermedia.

+

HTML error views

+

Typically a renderer will behave the same regardless of if it's dealing with a regular response, or with a response caused by an exception being raised, such as an Http404 or PermissionDenied exception, or a subclass of APIException.

+

If you're using either the TemplateHTMLRenderer or the StaticHTMLRenderer and an exception is raised, the behavior is slightly different, and mirrors Django's default handling of error views.

+

Exceptions raised and handled by an HTML renderer will attempt to render using one of the following methods, by order of precedence.

+
    +
  • Load and render a template named {status_code}.html.
  • +
  • Load and render a template named api_exception.html.
  • +
  • Render the HTTP status code and text, for example "404 Not Found".
  • +
+

Templates will render with a RequestContext which includes the status_code and details keys.

+

Note: If DEBUG=True, Django's standard traceback error page will be displayed instead of rendering the HTTP status code and text.

+
+

Third party packages

+

The following third party packages are also available.

+

MessagePack

+

MessagePack is a fast, efficient binary serialization format. Juan Riaza maintains the djangorestframework-msgpack package which provides MessagePack renderer and parser support for REST framework.

+

CSV

+

Comma-separated values are a plain-text tabular data format, that can be easily imported into spreadsheet applications. Mjumbe Poe maintains the djangorestframework-csv package which provides CSV renderer support for REST framework.

+

UltraJSON

+

UltraJSON is an optimized C JSON encoder which can give significantly faster JSON rendering. Jacob Haslehurst maintains the drf-ujson-renderer package which implements JSON rendering using the UJSON package.

+
+
+
+
+ +
+
+ + + + + + + + + + diff --git a/api-guide/requests.html b/api-guide/requests.html new file mode 100644 index 000000000..6e8abc374 --- /dev/null +++ b/api-guide/requests.html @@ -0,0 +1,321 @@ + + + + + Django REST framework - Requests + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + + + +
+ +
+ +
+ + + + +
+
+ +
+

request.py

+

Requests

+
+

If you're doing REST-based web service stuff ... you should ignore request.POST.

+

— Malcom Tredinnick, Django developers group

+
+

REST framework's Request class extends the standard HttpRequest, adding support for REST framework's flexible request parsing and request authentication.

+
+

Request parsing

+

REST framework's Request objects provide flexible request parsing that allows you to treat requests with JSON data or other media types in the same way that you would normally deal with form data.

+

.DATA

+

request.DATA returns the parsed content of the request body. This is similar to the standard request.POST attribute except that:

+
    +
  • It supports parsing the content of HTTP methods other than POST, meaning that you can access the content of PUT and PATCH requests.
  • +
  • It supports REST framework's flexible request parsing, rather than just supporting form data. For example you can handle incoming JSON data in the same way that you handle incoming form data.
  • +
+

For more details see the parsers documentation.

+

.FILES

+

request.FILES returns any uploaded files that may be present in the content of the request body. This is the same as the standard HttpRequest behavior, except that the same flexible request parsing is used for request.DATA.

+

For more details see the parsers documentation.

+

.QUERY_PARAMS

+

request.QUERY_PARAMS is a more correctly named synonym for request.GET.

+

For clarity inside your code, we recommend using request.QUERY_PARAMS instead of the usual request.GET, as any HTTP method type may include query parameters.

+

.parsers

+

The APIView class or @api_view decorator will ensure that this property is automatically set to a list of Parser instances, based on the parser_classes set on the view or based on the DEFAULT_PARSER_CLASSES setting.

+

You won't typically need to access this property.

+
+

Note: If a client sends malformed content, then accessing request.DATA or request.FILES may raise a ParseError. By default REST framework's APIView class or @api_view decorator will catch the error and return a 400 Bad Request response.

+

If a client sends a request with a content-type that cannot be parsed then a UnsupportedMediaType exception will be raised, which by default will be caught and return a 415 Unsupported Media Type response.

+
+

Authentication

+

REST framework provides flexible, per-request authentication, that gives you the ability to:

+
    +
  • Use different authentication policies for different parts of your API.
  • +
  • Support the use of multiple authentication policies.
  • +
  • Provide both user and token information associated with the incoming request.
  • +
+

.user

+

request.user typically returns an instance of django.contrib.auth.models.User, although the behavior depends on the authentication policy being used.

+

If the request is unauthenticated the default value of request.user is an instance of django.contrib.auth.models.AnonymousUser.

+

For more details see the authentication documentation.

+

.auth

+

request.auth returns any additional authentication context. The exact behavior of request.auth depends on the authentication policy being used, but it may typically be an instance of the token that the request was authenticated against.

+

If the request is unauthenticated, or if no additional context is present, the default value of request.auth is None.

+

For more details see the authentication documentation.

+

.authenticators

+

The APIView class or @api_view decorator will ensure that this property is automatically set to a list of Authentication instances, based on the authentication_classes set on the view or based on the DEFAULT_AUTHENTICATORS setting.

+

You won't typically need to access this property.

+
+

Browser enhancements

+

REST framework supports a few browser enhancements such as browser-based PUT, PATCH and DELETE forms.

+

.method

+

request.method returns the uppercased string representation of the request's HTTP method.

+

Browser-based PUT, PATCH and DELETE forms are transparently supported.

+

For more information see the browser enhancements documentation.

+

.content_type

+

request.content_type, returns a string object representing the media type of the HTTP request's body, or an empty string if no media type was provided.

+

You won't typically need to directly access the request's content type, as you'll normally rely on REST framework's default request parsing behavior.

+

If you do need to access the content type of the request you should use the .content_type property in preference to using request.META.get('HTTP_CONTENT_TYPE'), as it provides transparent support for browser-based non-form content.

+

For more information see the browser enhancements documentation.

+

.stream

+

request.stream returns a stream representing the content of the request body.

+

You won't typically need to directly access the request's content, as you'll normally rely on REST framework's default request parsing behavior.

+

If you do need to access the raw content directly, you should use the .stream property in preference to using request.content, as it provides transparent support for browser-based non-form content.

+

For more information see the browser enhancements documentation.

+
+

Standard HttpRequest attributes

+

As REST framework's Request extends Django's HttpRequest, all the other standard attributes and methods are also available. For example the request.META and request.session dictionaries are available as normal.

+

Note that due to implementation reasons the Request class does not inherit from HttpRequest class, but instead extends the class using composition.

+
+
+
+
+ +
+
+ + + + + + + + + + diff --git a/api-guide/responses.html b/api-guide/responses.html new file mode 100644 index 000000000..749d68f08 --- /dev/null +++ b/api-guide/responses.html @@ -0,0 +1,304 @@ + + + + + Django REST framework - Responses + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + + + +
+ +
+ +
+ + + + +
+
+ +
+

response.py

+

Responses

+
+

Unlike basic HttpResponse objects, TemplateResponse objects retain the details of the context that was provided by the view to compute the response. The final output of the response is not computed until it is needed, later in the response process.

+

Django documentation

+
+

REST framework supports HTTP content negotiation by providing a Response class which allows you to return content that can be rendered into multiple content types, depending on the client request.

+

The Response class subclasses Django's SimpleTemplateResponse. Response objects are initialised with data, which should consist of native Python primitives. REST framework then uses standard HTTP content negotiation to determine how it should render the final response content.

+

There's no requirement for you to use the Response class, you can also return regular HttpResponse or StreamingHttpResponse objects from your views if required. Using the Response class simply provides a nicer interface for returning content-negotiated Web API responses, that can be rendered to multiple formats.

+

Unless you want to heavily customize REST framework for some reason, you should always use an APIView class or @api_view function for views that return Response objects. Doing so ensures that the view can perform content negotiation and select the appropriate renderer for the response, before it is returned from the view.

+
+

Creating responses

+

Response()

+

Signature: Response(data, status=None, template_name=None, headers=None, content_type=None)

+

Unlike regular HttpResponse objects, you do not instantiate Response objects with rendered content. Instead you pass in unrendered data, which may consist of any Python primitives.

+

The renderers used by the Response class cannot natively handle complex datatypes such as Django model instances, so you need to serialize the data into primitive datatypes before creating the Response object.

+

You can use REST framework's Serializer classes to perform this data serialization, or use your own custom serialization.

+

Arguments:

+
    +
  • data: The serialized data for the response.
  • +
  • status: A status code for the response. Defaults to 200. See also status codes.
  • +
  • template_name: A template name to use if HTMLRenderer is selected.
  • +
  • headers: A dictionary of HTTP headers to use in the response.
  • +
  • content_type: The content type of the response. Typically, this will be set automatically by the renderer as determined by content negotiation, but there may be some cases where you need to specify the content type explicitly.
  • +
+
+

Attributes

+

.data

+

The unrendered content of a Request object.

+

.status_code

+

The numeric status code of the HTTP response.

+

.content

+

The rendered content of the response. The .render() method must have been called before .content can be accessed.

+

.template_name

+

The template_name, if supplied. Only required if HTMLRenderer or some other custom template renderer is the accepted renderer for the response.

+

.accepted_renderer

+

The renderer instance that will be used to render the response.

+

Set automatically by the APIView or @api_view immediately before the response is returned from the view.

+

.accepted_media_type

+

The media type that was selected by the content negotiation stage.

+

Set automatically by the APIView or @api_view immediately before the response is returned from the view.

+

.renderer_context

+

A dictionary of additional context information that will be passed to the renderer's .render() method.

+

Set automatically by the APIView or @api_view immediately before the response is returned from the view.

+
+

Standard HttpResponse attributes

+

The Response class extends SimpleTemplateResponse, and all the usual attributes and methods are also available on the response. For example you can set headers on the response in the standard way:

+
response = Response()
+response['Cache-Control'] = 'no-cache'
+
+

.render()

+

Signature: .render()

+

As with any other TemplateResponse, this method is called to render the serialized data of the response into the final response content. When .render() is called, the response content will be set to the result of calling the .render(data, accepted_media_type, renderer_context) method on the accepted_renderer instance.

+

You won't typically need to call .render() yourself, as it's handled by Django's standard response cycle.

+
+
+
+
+ +
+
+ + + + + + + + + + diff --git a/api-guide/reverse.html b/api-guide/reverse.html new file mode 100644 index 000000000..d6b37f873 --- /dev/null +++ b/api-guide/reverse.html @@ -0,0 +1,279 @@ + + + + + Django REST framework - Returning URLs + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + + + +
+ +
+ +
+ + + + +
+
+ +
+

reverse.py

+

Returning URLs

+
+

The central feature that distinguishes the REST architectural style from other network-based styles is its emphasis on a uniform interface between components.

+

— Roy Fielding, Architectural Styles and the Design of Network-based Software Architectures

+
+

As a rule, it's probably better practice to return absolute URIs from your Web APIs, such as http://example.com/foobar, rather than returning relative URIs, such as /foobar.

+

The advantages of doing so are:

+
    +
  • It's more explicit.
  • +
  • It leaves less work for your API clients.
  • +
  • There's no ambiguity about the meaning of the string when it's found in representations such as JSON that do not have a native URI type.
  • +
  • It makes it easy to do things like markup HTML representations with hyperlinks.
  • +
+

REST framework provides two utility functions to make it more simple to return absolute URIs from your Web API.

+

There's no requirement for you to use them, but if you do then the self-describing API will be able to automatically hyperlink its output for you, which makes browsing the API much easier.

+

reverse

+

Signature: reverse(viewname, *args, **kwargs)

+

Has the same behavior as django.core.urlresolvers.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:

+
from rest_framework.reverse import reverse
+from rest_framework.views import APIView
+from django.utils.timezone import now
+
+class APIRootView(APIView):
+    def get(self, request):
+        year = now().year
+        data = {
+            ...
+            'year-summary-url': reverse('year-summary', args=[year], request=request)
+        }
+        return Response(data)
+
+

reverse_lazy

+

Signature: reverse_lazy(viewname, *args, **kwargs)

+

Has the same behavior as django.core.urlresolvers.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:

+
api_root = reverse_lazy('api-root', request=request)
+
+
+
+
+
+ +
+
+ + + + + + + + + + diff --git a/api-guide/routers.html b/api-guide/routers.html new file mode 100644 index 000000000..4654a8f0f --- /dev/null +++ b/api-guide/routers.html @@ -0,0 +1,369 @@ + + + + + Django REST framework - Routers + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + + + +
+ +
+ +
+ + + + +
+
+ +
+

routers.py

+

Routers

+
+

Resource routing allows you to quickly declare all of the common routes for a given resourceful controller. Instead of declaring separate routes for your index... a resourceful route declares them in a single line of code.

+

Ruby on Rails Documentation

+
+

Some Web frameworks such as Rails provide functionality for automatically determining how the URLs for an application should be mapped to the logic that deals with handling incoming requests.

+

REST framework adds support for automatic URL routing to Django, and provides you with a simple, quick and consistent way of wiring your view logic to a set of URLs.

+

Usage

+

Here's an example of a simple URL conf, that uses DefaultRouter.

+
from rest_framework import routers
+
+router = routers.SimpleRouter()
+router.register(r'users', UserViewSet)
+router.register(r'accounts', AccountViewSet)
+urlpatterns = router.urls
+
+

There are two mandatory arguments to the register() method:

+
    +
  • prefix - The URL prefix to use for this set of routes.
  • +
  • viewset - The viewset class.
  • +
+

Optionally, you may also specify an additional argument:

+
    +
  • base_name - The base to use for the URL names that are created. If unset the basename will be automatically generated based on the model or queryset attribute on the viewset, if it has one. Note that if the viewset does not include a model or queryset attribute then you must set base_name when registering the viewset.
  • +
+

The example above would generate the following URL patterns:

+
    +
  • URL pattern: ^users/$ Name: 'user-list'
  • +
  • URL pattern: ^users/{pk}/$ Name: 'user-detail'
  • +
  • URL pattern: ^accounts/$ Name: 'account-list'
  • +
  • URL pattern: ^accounts/{pk}/$ Name: 'account-detail'
  • +
+ +

Any methods on the viewset decorated with @link or @action will also be routed. +For example, given a method like this on the UserViewSet class:

+
from myapp.permissions import IsAdminOrIsSelf
+from rest_framework.decorators import action
+
+@action(permission_classes=[IsAdminOrIsSelf])
+def set_password(self, request, pk=None):
+    ...
+
+

The following URL pattern would additionally be generated:

+
    +
  • URL pattern: ^users/{pk}/set_password/$ Name: 'user-set-password'
  • +
+

API Guide

+

SimpleRouter

+

This router includes routes for the standard set of list, create, retrieve, update, partial_update and destroy actions. The viewset can also mark additional methods to be routed, using the @link or @action decorators.

+ + + + + + + + + + +
URL StyleHTTP MethodActionURL Name
{prefix}/GETlist{basename}-list
POSTcreate
{prefix}/{lookup}/GETretrieve{basename}-detail
PUTupdate
PATCHpartial_update
DELETEdestroy
{prefix}/{lookup}/{methodname}/GET@link decorated method{basename}-{methodname}
POST@action decorated method
+ +

By default the URLs created by SimpleRouter are appended with a trailing slash. +This behavior can be modified by setting the trailing_slash argument to False when instantiating the router. For example:

+
router = SimpleRouter(trailing_slash=False)
+
+

Trailing slashes are conventional in Django, but are not used by default in some other frameworks such as Rails. Which style you choose to use is largely a matter of preference, although some javascript frameworks may expect a particular routing style.

+

DefaultRouter

+

This router is similar to SimpleRouter as above, but additionally includes a default API root view, that returns a response containing hyperlinks to all the list views. It also generates routes for optional .json style format suffixes.

+ + + + + + + + + + + +
URL StyleHTTP MethodActionURL Name
[.format]GETautomatically generated root viewapi-root
{prefix}/[.format]GETlist{basename}-list
POSTcreate
{prefix}/{lookup}/[.format]GETretrieve{basename}-detail
PUTupdate
PATCHpartial_update
DELETEdestroy
{prefix}/{lookup}/{methodname}/[.format]GET@link decorated method{basename}-{methodname}
POST@action decorated method
+ +

As with SimpleRouter the trailing slashes on the URL routes can be removed by setting the trailing_slash argument to False when instantiating the router.

+
router = DefaultRouter(trailing_slash=False)
+
+

Custom Routers

+

Implementing a custom router isn't something you'd need to do very often, but it can be useful if you have specific requirements about how the your URLs for your API are structured. Doing so allows you to encapsulate the URL structure in a reusable way that ensures you don't have to write your URL patterns explicitly for each new view.

+

The simplest way to implement a custom router is to subclass one of the existing router classes. The .routes attribute is used to template the URL patterns that will be mapped to each viewset. The .routes attribute is a list of Route named tuples.

+

The arguments to the Route named tuple are:

+

url: A string representing the URL to be routed. May include the following format strings:

+
    +
  • {prefix} - The URL prefix to use for this set of routes.
  • +
  • {lookup} - The lookup field used to match against a single instance.
  • +
  • {trailing_slash} - Either a '/' or an empty string, depending on the trailing_slash argument.
  • +
+

mapping: A mapping of HTTP method names to the view methods

+

name: The name of the URL as used in reverse calls. May include the following format string:

+
    +
  • {basename} - The base to use for the URL names that are created.
  • +
+

initkwargs: A dictionary of any additional arguments that should be passed when instantiating the view. Note that the suffix argument is reserved for identifying the viewset type, used when generating the view name and breadcrumb links.

+

Example

+

The following example will only route to the list and retrieve actions, and does not use the trailing slash convention.

+
from rest_framework.routers import Route, SimpleRouter
+
+class ReadOnlyRouter(SimpleRouter):
+    """
+    A router for read-only APIs, which doesn't use trailing slashes.
+    """
+    routes = [
+        Route(url=r'^{prefix}$',
+              mapping={'get': 'list'},
+              name='{basename}-list',
+              initkwargs={'suffix': 'List'}),
+        Route(url=r'^{prefix}/{lookup}$',
+              mapping={'get': 'retrieve'},
+              name='{basename}-detail',
+              initkwargs={'suffix': 'Detail'})
+    ]
+
+

The SimpleRouter class provides another example of setting the .routes attribute.

+

Advanced custom routers

+

If you want to provide totally custom behavior, you can override BaseRouter and override the get_urls(self) method. The method should inspect the registered viewsets and return a list of URL patterns. The registered prefix, viewset and basename tuples may be inspected by accessing the self.registry attribute.

+

You may also want to override the get_default_base_name(self, viewset) method, or else always explicitly set the base_name argument when registering your viewsets with the router.

+
+
+
+
+ +
+
+ + + + + + + + + + diff --git a/api-guide/serializers.html b/api-guide/serializers.html new file mode 100644 index 000000000..96340bcb9 --- /dev/null +++ b/api-guide/serializers.html @@ -0,0 +1,668 @@ + + + + + Django REST framework - Serializers + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + + + +
+ +
+ +
+ + + + +
+
+ +
+

serializers.py

+

Serializers

+
+

Expanding the usefulness of the serializers is something that we would +like to address. However, it's not a trivial problem, and it +will take some serious design work.

+

— Russell Keith-Magee, Django users group

+
+

Serializers allow complex data such as querysets and model instances to be converted to native Python datatypes that can then be easily rendered into JSON, XML or other content types. Serializers also provide deserialization, allowing parsed data to be converted back into complex types, after first validating the incoming data.

+

REST framework's serializers work very similarly to Django's Form and ModelForm classes. It provides a Serializer class which gives you a powerful, generic way to control the output of your responses, as well as a ModelSerializer class which provides a useful shortcut for creating serializers that deal with model instances and querysets.

+

Declaring Serializers

+

Let's start by creating a simple object we can use for example purposes:

+
class Comment(object):
+    def __init__(self, email, content, created=None):
+        self.email = email
+        self.content = content
+        self.created = created or datetime.datetime.now()
+
+comment = Comment(email='leila@example.com', content='foo bar')
+
+

We'll declare a serializer that we can use to serialize and deserialize Comment objects.

+

Declaring a serializer looks very similar to declaring a form:

+
from rest_framework import serializers
+
+class CommentSerializer(serializers.Serializer):
+    email = serializers.EmailField()
+    content = serializers.CharField(max_length=200)
+    created = serializers.DateTimeField()
+
+    def restore_object(self, attrs, instance=None):
+        """
+        Given a dictionary of deserialized field values, either update
+        an existing model instance, or create a new model instance.
+        """
+        if instance is not None:
+            instance.email = attrs.get('email', instance.email)
+            instance.content = attrs.get('content', instance.content)
+            instance.created = attrs.get('created', instance.created)
+            return instance
+        return Comment(**attrs)
+
+

The first part of serializer class defines the fields that get serialized/deserialized. The restore_object method defines how fully fledged instances get created when deserializing data.

+

The restore_object method is optional, and is only required if we want our serializer to support deserialization into fully fledged object instances. If we don't define this method, then deserializing data will simply return a dictionary of items.

+

Serializing objects

+

We can now use CommentSerializer to serialize a comment, or list of comments. Again, using the Serializer class looks a lot like using a Form class.

+
serializer = CommentSerializer(comment)
+serializer.data
+# {'email': u'leila@example.com', 'content': u'foo bar', 'created': datetime.datetime(2012, 8, 22, 16, 20, 9, 822774)}
+
+

At this point we've translated the model instance into Python native datatypes. To finalise the serialization process we render the data into json.

+
from rest_framework.renderers import JSONRenderer
+
+json = JSONRenderer().render(serializer.data)
+json
+# '{"email": "leila@example.com", "content": "foo bar", "created": "2012-08-22T16:20:09.822"}'
+
+

Customizing field representation

+

Sometimes when serializing objects, you may not want to represent everything exactly the way it is in your model.

+

If you need to customize the serialized value of a particular field, you can do this by creating a transform_<fieldname> method. For example if you needed to render some markdown from a text field:

+
description = serializers.TextField()
+description_html = serializers.TextField(source='description', read_only=True)
+
+def transform_description_html(self, obj, value):
+    from django.contrib.markup.templatetags.markup import markdown
+    return markdown(value)
+
+

These methods are essentially the reverse of validate_<fieldname> (see Validation below.)

+

Deserializing objects

+

Deserialization is similar. First we parse a stream into Python native datatypes...

+
from StringIO import StringIO
+from rest_framework.parsers import JSONParser
+
+stream = StringIO(json)
+data = JSONParser().parse(stream)
+
+

...then we restore those native datatypes into a fully populated object instance.

+
serializer = CommentSerializer(data=data)
+serializer.is_valid()
+# True
+serializer.object
+# <Comment object at 0x10633b2d0>
+
+

When deserializing data, we can either create a new instance, or update an existing instance.

+
serializer = CommentSerializer(data=data)           # Create new instance
+serializer = CommentSerializer(comment, data=data)  # Update `instance`
+
+

By default, serializers must be passed values for all required fields or they will throw validation errors. You can use the partial argument in order to allow partial updates.

+
serializer = CommentSerializer(comment, data={'content': u'foo bar'}, partial=True)  # Update `instance` with partial data
+
+

Validation

+

When deserializing data, you always need to call is_valid() before attempting to access the deserialized object. If any validation errors occur, the .errors property will contain a dictionary representing the resulting error messages. For example:

+
serializer = CommentSerializer(data={'email': 'foobar', 'content': 'baz'})
+serializer.is_valid()
+# False
+serializer.errors
+# {'email': [u'Enter a valid e-mail address.'], 'created': [u'This field is required.']}
+
+

Each key in the dictionary will be the field name, and the values will be lists of strings of any error messages corresponding to that field. The non_field_errors key may also be present, and will list any general validation errors.

+

When deserializing a list of items, errors will be returned as a list of dictionaries representing each of the deserialized items.

+

Field-level validation

+

You can specify custom field-level validation by adding .validate_<fieldname> methods to your Serializer subclass. These are analogous to .clean_<fieldname> methods on Django forms, but accept slightly different arguments.

+

They take a dictionary of deserialized attributes as a first argument, and the field name in that dictionary as a second argument (which will be either the name of the field or the value of the source argument to the field, if one was provided).

+

Your validate_<fieldname> methods should either just return the attrs dictionary or raise a ValidationError. For example:

+
from rest_framework import serializers
+
+class BlogPostSerializer(serializers.Serializer):
+    title = serializers.CharField(max_length=100)
+    content = serializers.CharField()
+
+    def validate_title(self, attrs, source):
+        """
+        Check that the blog post is about Django.
+        """
+        value = attrs[source]
+        if "django" not in value.lower():
+            raise serializers.ValidationError("Blog post is not about Django")
+        return attrs
+
+

Object-level validation

+

To do any other validation that requires access to multiple fields, add a method called .validate() to your Serializer subclass. This method takes a single argument, which is the attrs dictionary. It should raise a ValidationError if necessary, or just return attrs. For example:

+
from rest_framework import serializers
+
+class EventSerializer(serializers.Serializer):
+    description = serializers.CharField(max_length=100)
+    start = serializers.DateTimeField()
+    finish = serializers.DateTimeField()
+
+    def validate(self, attrs):
+        """
+        Check that the start is before the stop.
+        """
+        if attrs['start'] < attrs['finish']:
+            raise serializers.ValidationError("finish must occur after start")
+        return attrs
+
+

Saving object state

+

To save the deserialized objects created by a serializer, call the .save() method:

+
if serializer.is_valid():
+    serializer.save()
+
+

The default behavior of the method is to simply call .save() on the deserialized object instance. You can override the default save behaviour by overriding the .save_object(obj) method on the serializer class.

+

The generic views provided by REST framework call the .save() method when updating or creating entities.

+

Dealing with nested objects

+

The previous examples are fine for dealing with objects that only have simple datatypes, but sometimes we also need to be able to represent more complex objects, where some of the attributes of an object might not be simple datatypes such as strings, dates or integers.

+

The Serializer class is itself a type of Field, and can be used to represent relationships where one object type is nested inside another.

+
class UserSerializer(serializers.Serializer):
+    email = serializers.EmailField()
+    username = serializers.CharField(max_length=100)
+
+class CommentSerializer(serializers.Serializer):
+    user = UserSerializer()
+    content = serializers.CharField(max_length=200)
+    created = serializers.DateTimeField()
+
+

If a nested representation may optionally accept the None value you should pass the required=False flag to the nested serializer.

+
class CommentSerializer(serializers.Serializer):
+    user = UserSerializer(required=False)  # May be an anonymous user.
+    content = serializers.CharField(max_length=200)
+    created = serializers.DateTimeField()
+
+

Similarly if a nested representation should be a list of items, you should pass the many=True flag to the nested serialized.

+
class CommentSerializer(serializers.Serializer):
+    user = UserSerializer(required=False)
+    edits = EditItemSerializer(many=True)  # A nested list of 'edit' items.
+    content = serializers.CharField(max_length=200)
+    created = serializers.DateTimeField()
+
+

Validation of nested objects will work the same as before. Errors with nested objects will be nested under the field name of the nested object.

+
serializer = CommentSerializer(comment, data={'user': {'email': 'foobar', 'username': 'doe'}, 'content': 'baz'})
+serializer.is_valid()
+# False
+serializer.errors
+# {'user': {'email': [u'Enter a valid e-mail address.']}, 'created': [u'This field is required.']}
+
+

Dealing with multiple objects

+

The Serializer class can also handle serializing or deserializing lists of objects.

+

Serializing multiple objects

+

To serialize a queryset or list of objects instead of a single object instance, you should pass the many=True flag when instantiating the serializer. You can then pass a queryset or list of objects to be serialized.

+
queryset = Book.objects.all()
+serializer = BookSerializer(queryset, many=True)
+serializer.data
+# [
+#     {'id': 0, 'title': 'The electric kool-aid acid test', 'author': 'Tom Wolfe'},
+#     {'id': 1, 'title': 'If this is a man', 'author': 'Primo Levi'},
+#     {'id': 2, 'title': 'The wind-up bird chronicle', 'author': 'Haruki Murakami'}
+# ]
+
+

Deserializing multiple objects for creation

+

To deserialize a list of object data, and create multiple object instances in a single pass, you should also set the many=True flag, and pass a list of data to be deserialized.

+

This allows you to write views that create multiple items when a POST request is made.

+

For example:

+
data = [
+    {'title': 'The bell jar', 'author': 'Sylvia Plath'},
+    {'title': 'For whom the bell tolls', 'author': 'Ernest Hemingway'}
+]
+serializer = BookSerializer(data=data, many=True)
+serializer.is_valid()
+# True
+serializer.save()  # `.save()` will be called on each deserialized instance
+
+

Deserializing multiple objects for update

+

You can also deserialize a list of objects as part of a bulk update of multiple existing items. +In this case you need to supply both an existing list or queryset of items, as well as a list of data to update those items with.

+

This allows you to write views that update or create multiple items when a PUT request is made.

+
# Capitalizing the titles of the books
+queryset = Book.objects.all()
+data = [
+    {'id': 3, 'title': 'The Bell Jar', 'author': 'Sylvia Plath'},
+    {'id': 4, 'title': 'For Whom the Bell Tolls', 'author': 'Ernest Hemingway'}
+]
+serializer = BookSerializer(queryset, data=data, many=True)
+serializer.is_valid()
+# True
+serializer.save()  # `.save()` will be called on each updated or newly created instance.
+
+

By default bulk updates will be limited to updating instances that already exist in the provided queryset.

+

When performing a bulk update you may want to allow new items to be created, and missing items to be deleted. To do so, pass allow_add_remove=True to the serializer.

+
serializer = BookSerializer(queryset, data=data, many=True, allow_add_remove=True)
+serializer.is_valid()
+# True
+serializer.save()  # `.save()` will be called on updated or newly created instances.
+                   # `.delete()` will be called on any other items in the `queryset`.
+
+

Passing allow_add_remove=True ensures that any update operations will completely overwrite the existing queryset, rather than simply updating existing objects.

+

How identity is determined when performing bulk updates

+

Performing a bulk update is slightly more complicated than performing a bulk creation, because the serializer needs a way to determine how the items in the incoming data should be matched against the existing object instances.

+

By default the serializer class will use the id key on the incoming data to determine the canonical identity of an object. If you need to change this behavior you should override the get_identity method on the Serializer class. For example:

+
class AccountSerializer(serializers.Serializer):
+    slug = serializers.CharField(max_length=100)
+    created = serializers.DateTimeField()
+    ...  # Various other fields
+
+    def get_identity(self, data):
+        """
+        This hook is required for bulk update.
+        We need to override the default, to use the slug as the identity.
+
+        Note that the data has not yet been validated at this point,
+        so we need to deal gracefully with incorrect datatypes.
+        """
+        try:
+            return data.get('slug', None)
+        except AttributeError:
+            return None
+
+

To map the incoming data items to their corresponding object instances, the .get_identity() method will be called both against the incoming data, and against the serialized representation of the existing objects.

+

Including extra context

+

There are some cases where you need to provide extra context to the serializer in addition to the object being serialized. One common case is if you're using a serializer that includes hyperlinked relations, which requires the serializer to have access to the current request so that it can properly generate fully qualified URLs.

+

You can provide arbitrary additional context by passing a context argument when instantiating the serializer. For example:

+
serializer = AccountSerializer(account, context={'request': request})
+serializer.data
+# {'id': 6, 'owner': u'denvercoder9', 'created': datetime.datetime(2013, 2, 12, 09, 44, 56, 678870), 'details': 'http://example.com/accounts/6/details'}
+
+

The context dictionary can be used within any serializer field logic, such as a custom .to_native() method, by accessing the self.context attribute.

+

-

+

ModelSerializer

+

Often you'll want serializer classes that map closely to model definitions. +The ModelSerializer class lets you automatically create a Serializer class with fields that correspond to the Model fields.

+
class AccountSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = Account
+
+

By default, all the model fields on the class will be mapped to corresponding serializer fields.

+

Any relationships such as foreign keys on the model will be mapped to PrimaryKeyRelatedField. Other models fields will be mapped to a corresponding serializer field.

+
+

Note: When validation is applied to a ModelSerializer, both the serializer fields, and their corresponding model fields must correctly validate. If you have optional fields on your model, make sure to correctly set blank=True on the model field, as well as setting required=False on the serializer field.

+
+

Specifying which fields should be included

+

If you only want a subset of the default fields to be used in a model serializer, you can do so using fields or exclude options, just as you would with a ModelForm.

+

For example:

+
class AccountSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = Account
+        fields = ('id', 'account_name', 'users', 'created')
+
+

Specifying nested serialization

+

The default ModelSerializer uses primary keys for relationships, but you can also easily generate nested representations using the depth option:

+
class AccountSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = Account
+        fields = ('id', 'account_name', 'users', 'created')
+        depth = 1
+
+

The depth option should be set to an integer value that indicates the depth of relationships that should be traversed before reverting to a flat representation.

+

If you want to customize the way the serialization is done (e.g. using allow_add_remove) you'll need to define the field yourself.

+

Specifying which fields should be read-only

+

You may wish to specify multiple fields as read-only. Instead of adding each field explicitly with the read_only=True attribute, you may use the read_only_fields Meta option, like so:

+
class AccountSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = Account
+        fields = ('id', 'account_name', 'users', 'created')
+        read_only_fields = ('account_name',)
+
+

Model fields which have editable=False set, and AutoField fields will be set to read-only by default, and do not need to be added to the read_only_fields option.

+

Specifying fields explicitly

+

You can add extra fields to a ModelSerializer or override the default fields by declaring fields on the class, just as you would for a Serializer class.

+
class AccountSerializer(serializers.ModelSerializer):
+    url = serializers.CharField(source='get_absolute_url', read_only=True)
+    groups = serializers.PrimaryKeyRelatedField(many=True)
+
+    class Meta:
+        model = Account
+
+

Extra fields can correspond to any property or callable on the model.

+

Relational fields

+

When serializing model instances, there are a number of different ways you might choose to represent relationships. The default representation for ModelSerializer is to use the primary keys of the related instances.

+

Alternative representations include serializing using hyperlinks, serializing complete nested representations, or serializing with a custom representation.

+

For full details see the serializer relations documentation.

+
+

HyperlinkedModelSerializer

+

The HyperlinkedModelSerializer class is similar to the ModelSerializer class except that it uses hyperlinks to represent relationships, rather than primary keys.

+

By default the serializer will include a url field instead of a primary key field.

+

The url field will be represented using a HyperlinkedIdentityField serializer field, and any relationships on the model will be represented using a HyperlinkedRelatedField serializer field.

+

You can explicitly include the primary key by adding it to the fields option, for example:

+
class AccountSerializer(serializers.HyperlinkedModelSerializer):
+    class Meta:
+        model = Account
+        fields = ('url', 'id', 'account_name', 'users', 'created')
+
+

How hyperlinked views are determined

+

There needs to be a way of determining which views should be used for hyperlinking to model instances.

+

By default hyperlinks are expected to correspond to a view name that matches the style '{model_name}-detail', and looks up the instance by a pk keyword argument.

+

You can change the field that is used for object lookups by setting the lookup_field option. The value of this option should correspond both with a kwarg in the URL conf, and with a field on the model. For example:

+
class AccountSerializer(serializers.HyperlinkedModelSerializer):
+    class Meta:
+        model = Account
+        fields = ('url', 'account_name', 'users', 'created')
+        lookup_field = 'slug'
+
+

Not that the lookup_field will be used as the default on all hyperlinked fields, including both the URL identity, and any hyperlinked relationships.

+

For more specific requirements such as specifying a different lookup for each field, you'll want to set the fields on the serializer explicitly. For example:

+
class AccountSerializer(serializers.HyperlinkedModelSerializer):
+    url = serializers.HyperlinkedIdentityField(
+        view_name='account_detail',
+        lookup_field='account_name'
+    )
+    users = serializers.HyperlinkedRelatedField(
+        view_name='user-detail',
+        lookup_field='username',
+        many=True,
+        read_only=True
+    )
+
+    class Meta:
+        model = Account
+        fields = ('url', 'account_name', 'users', 'created')
+
+
+

Advanced serializer usage

+

You can create customized subclasses of ModelSerializer or HyperlinkedModelSerializer that use a different set of default fields.

+

Doing so should be considered advanced usage, and will only be needed if you have some particular serializer requirements that you often need to repeat.

+

Dynamically modifying fields

+

Once a serializer has been initialized, the dictionary of fields that are set on the serializer may be accessed using the .fields attribute. Accessing and modifying this attribute allows you to dynamically modify the serializer.

+

Modifying the fields argument directly allows you to do interesting things such as changing the arguments on serializer fields at runtime, rather than at the point of declaring the serializer.

+

Example

+

For example, if you wanted to be able to set which fields should be used by a serializer at the point of initializing it, you could create a serializer class like so:

+
class DynamicFieldsModelSerializer(serializers.ModelSerializer):
+    """
+    A ModelSerializer that takes an additional `fields` argument that
+    controls which fields should be displayed.
+    """
+
+    def __init__(self, *args, **kwargs):
+        # Don't pass the 'fields' arg up to the superclass
+        fields = kwargs.pop('fields', None)
+
+        # Instantiate the superclass normally
+        super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs)
+
+        if fields:
+            # Drop any fields that are not specified in the `fields` argument.
+            allowed = set(fields)
+            existing = set(self.fields.keys())
+            for field_name in existing - allowed:
+                self.fields.pop(field_name)
+
+

This would then allow you to do the following:

+
>>> class UserSerializer(DynamicFieldsModelSerializer):
+>>>     class Meta:
+>>>         model = User
+>>>         fields = ('id', 'username', 'email')
+>>>
+>>> print UserSerializer(user)
+{'id': 2, 'username': 'jonwatts', 'email': 'jon@example.com'}
+>>>
+>>> print UserSerializer(user, fields=('id', 'email'))
+{'id': 2, 'email': 'jon@example.com'}
+
+

Customising the default fields

+

The field_mapping attribute is a dictionary that maps model classes to serializer classes. Overriding the attribute will let you set a different set of default serializer classes.

+

For more advanced customization than simply changing the default serializer class you can override various get_<field_type>_field methods. Doing so will allow you to customize the arguments that each serializer field is initialized with. Each of these methods may either return a field or serializer instance, or None.

+

get_pk_field

+

Signature: .get_pk_field(self, model_field)

+

Returns the field instance that should be used to represent the pk field.

+

get_nested_field

+

Signature: .get_nested_field(self, model_field, related_model, to_many)

+

Returns the field instance that should be used to represent a related field when depth is specified as being non-zero.

+

Note that the model_field argument will be None for reverse relationships. The related_model argument will be the model class for the target of the field. The to_many argument will be a boolean indicating if this is a to-one or to-many relationship.

+ +

Signature: .get_related_field(self, model_field, related_model, to_many)

+

Returns the field instance that should be used to represent a related field when depth is not specified, or when nested representations are being used and the depth reaches zero.

+

Note that the model_field argument will be None for reverse relationships. The related_model argument will be the model class for the target of the field. The to_many argument will be a boolean indicating if this is a to-one or to-many relationship.

+

get_field

+

Signature: .get_field(self, model_field)

+

Returns the field instance that should be used for non-relational, non-pk fields.

+

Example

+

The following custom model serializer could be used as a base class for model serializers that should always exclude the pk by default.

+
class NoPKModelSerializer(serializers.ModelSerializer):
+    def get_pk_field(self, model_field):
+        return None
+
+
+
+
+
+ +
+
+ + + + + + + + + + diff --git a/api-guide/settings.html b/api-guide/settings.html new file mode 100644 index 000000000..1308c0843 --- /dev/null +++ b/api-guide/settings.html @@ -0,0 +1,468 @@ + + + + + Django REST framework - Settings + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + + + +
+ +
+ +
+ + + + +
+
+ +
+

settings.py

+

Settings

+
+

Namespaces are one honking great idea - let's do more of those!

+

The Zen of Python

+
+

Configuration for REST framework is all namespaced inside a single Django setting, named REST_FRAMEWORK.

+

For example your project's settings.py file might include something like this:

+
REST_FRAMEWORK = {
+    'DEFAULT_RENDERER_CLASSES': (
+        'rest_framework.renderers.YAMLRenderer',
+    ),
+    'DEFAULT_PARSER_CLASSES': (
+        'rest_framework.parsers.YAMLParser',
+    )
+}
+
+

Accessing settings

+

If you need to access the values of REST framework's API settings in your project, +you should use the api_settings object. For example.

+
from rest_framework.settings import api_settings
+
+print api_settings.DEFAULT_AUTHENTICATION_CLASSES
+
+

The api_settings object will check for any user-defined settings, and otherwise fall back to the default values. Any setting that uses string import paths to refer to a class will automatically import and return the referenced class, instead of the string literal.

+
+

API Reference

+

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.

+

DEFAULT_RENDERER_CLASSES

+

A list or tuple of renderer classes, that determines the default set of renderers that may be used when returning a Response object.

+

Default:

+
(
+    'rest_framework.renderers.JSONRenderer',
+    'rest_framework.renderers.BrowsableAPIRenderer',
+)
+
+

DEFAULT_PARSER_CLASSES

+

A list or tuple of parser classes, that determines the default set of parsers used when accessing the request.DATA property.

+

Default:

+
(
+    'rest_framework.parsers.JSONParser',
+    'rest_framework.parsers.FormParser',
+    'rest_framework.parsers.MultiPartParser'
+)
+
+

DEFAULT_AUTHENTICATION_CLASSES

+

A list or tuple of authentication classes, that determines the default set of authenticators used when accessing the request.user or request.auth properties.

+

Default:

+
(
+    'rest_framework.authentication.SessionAuthentication',
+    'rest_framework.authentication.BasicAuthentication'
+)
+
+

DEFAULT_PERMISSION_CLASSES

+

A list or tuple of permission classes, that determines the default set of permissions checked at the start of a view.

+

Default:

+
(
+    'rest_framework.permissions.AllowAny',
+)
+
+

DEFAULT_THROTTLE_CLASSES

+

A list or tuple of throttle classes, that determines the default set of throttles checked at the start of a view.

+

Default: ()

+

DEFAULT_CONTENT_NEGOTIATION_CLASS

+

A content negotiation class, that determines how a renderer is selected for the response, given an incoming request.

+

Default: 'rest_framework.negotiation.DefaultContentNegotiation'

+
+

Generic view settings

+

The following settings control the behavior of the generic class based views.

+

DEFAULT_MODEL_SERIALIZER_CLASS

+

A class that determines the default type of model serializer that should be used by a generic view if model is specified, but serializer_class is not provided.

+

Default: 'rest_framework.serializers.ModelSerializer'

+

DEFAULT_PAGINATION_SERIALIZER_CLASS

+

A class the determines the default serialization style for paginated responses.

+

Default: rest_framework.pagination.PaginationSerializer

+

DEFAULT_FILTER_BACKENDS

+

A list of filter backend classes that should be used for generic filtering. +If set to None then generic filtering is disabled.

+

PAGINATE_BY

+

The default page size to use for pagination. If set to None, pagination is disabled by default.

+

Default: None

+

PAGINATE_BY_PARAM

+

The name of a query parameter, which can be used by the client to override the default page size to use for pagination. If set to None, clients may not override the default page size.

+

For example, given the following settings:

+
REST_FRAMEWORK = {
+    'PAGINATE_BY': 10,
+    'PAGINATE_BY_PARAM': 'page_size',
+}
+
+

A client would be able to modify the pagination size by using the page_size query parameter. For example:

+
GET http://example.com/api/accounts?page_size=25
+
+

Default: None

+

MAX_PAGINATE_BY

+

The maximum page size to allow when the page size is specified by the client. If set to None, then no maximum limit is applied.

+

For example, given the following settings:

+
REST_FRAMEWORK = {
+    'PAGINATE_BY': 10,
+    'PAGINATE_BY_PARAM': 'page_size',
+    'MAX_PAGINATE_BY': 100
+}
+
+

A client request like the following would return a paginated list of up to 100 items.

+
GET http://example.com/api/accounts?page_size=999
+
+

Default: None

+
+

Authentication settings

+

The following settings control the behavior of unauthenticated requests.

+

UNAUTHENTICATED_USER

+

The class that should be used to initialize request.user for unauthenticated requests.

+

Default: django.contrib.auth.models.AnonymousUser

+

UNAUTHENTICATED_TOKEN

+

The class that should be used to initialize request.auth for unauthenticated requests.

+

Default: None

+
+

Test settings

+

The following settings control the behavior of APIRequestFactory and APIClient

+

TEST_REQUEST_DEFAULT_FORMAT

+

The default format that should be used when making test requests.

+

This should match up with the format of one of the renderer classes in the TEST_REQUEST_RENDERER_CLASSES setting.

+

Default: 'multipart'

+

TEST_REQUEST_RENDERER_CLASSES

+

The renderer classes that are supported when building test requests.

+

The format of any of these renderer classes may be used when constructing a test request, for example: client.post('/users', {'username': 'jamie'}, format='json')

+

Default:

+
(
+    'rest_framework.renderers.MultiPartRenderer',
+    'rest_framework.renderers.JSONRenderer'
+)
+
+
+

Browser overrides

+

The following settings provide URL or form-based overrides of the default browser behavior.

+

FORM_METHOD_OVERRIDE

+

The name of a form field that may be used to override the HTTP method of the form.

+

If the value of this setting is None then form method overloading will be disabled.

+

Default: '_method'

+

FORM_CONTENT_OVERRIDE

+

The name of a form field that may be used to override the content of the form payload. Must be used together with FORM_CONTENTTYPE_OVERRIDE.

+

If either setting is None then form content overloading will be disabled.

+

Default: '_content'

+

FORM_CONTENTTYPE_OVERRIDE

+

The name of a form field that may be used to override the content type of the form payload. Must be used together with FORM_CONTENT_OVERRIDE.

+

If either setting is None then form content overloading will be disabled.

+

Default: '_content_type'

+

URL_ACCEPT_OVERRIDE

+

The name of a URL parameter that may be used to override the HTTP Accept header.

+

If the value of this setting is None then URL accept overloading will be disabled.

+

Default: 'accept'

+

URL_FORMAT_OVERRIDE

+

The name of a URL parameter that may be used to override the default Accept header based content negotiation.

+

Default: 'format'

+
+

Date and time formatting

+

The following settings are used to control how date and time representations may be parsed and rendered.

+

DATETIME_FORMAT

+

A format string that should be used by default for rendering the output of DateTimeField serializer fields. If None, then DateTimeField serializer fields will return Python datetime objects, and the datetime encoding will be determined by the renderer.

+

May be any of None, 'iso-8601' or a Python strftime format string.

+

Default: None

+

DATETIME_INPUT_FORMATS

+

A list of format strings that should be used by default for parsing inputs to DateTimeField serializer fields.

+

May be a list including the string 'iso-8601' or Python strftime format strings.

+

Default: ['iso-8601']

+

DATE_FORMAT

+

A format string that should be used by default for rendering the output of DateField serializer fields. If None, then DateField serializer fields will return Python date objects, and the date encoding will be determined by the renderer.

+

May be any of None, 'iso-8601' or a Python strftime format string.

+

Default: None

+

DATE_INPUT_FORMATS

+

A list of format strings that should be used by default for parsing inputs to DateField serializer fields.

+

May be a list including the string 'iso-8601' or Python strftime format strings.

+

Default: ['iso-8601']

+

TIME_FORMAT

+

A format string that should be used by default for rendering the output of TimeField serializer fields. If None, then TimeField serializer fields will return Python time objects, and the time encoding will be determined by the renderer.

+

May be any of None, 'iso-8601' or a Python strftime format string.

+

Default: None

+

TIME_INPUT_FORMATS

+

A list of format strings that should be used by default for parsing inputs to TimeField serializer fields.

+

May be a list including the string 'iso-8601' or Python strftime format strings.

+

Default: ['iso-8601']

+
+

View names and descriptions

+

The following settings are used to generate the view names and descriptions, as used in responses to OPTIONS requests, and as used in the browsable API.

+

VIEW_NAME_FUNCTION

+

A string representing the function that should be used when generating view names.

+

This should be a function with the following signature:

+
view_name(cls, suffix=None)
+
+
    +
  • cls: The view class. Typically the name function would inspect the name of the class when generating a descriptive name, by accessing cls.__name__.
  • +
  • suffix: The optional suffix used when differentiating individual views in a viewset.
  • +
+

Default: 'rest_framework.views.get_view_name'

+

VIEW_DESCRIPTION_FUNCTION

+

A string representing the function that should be used when generating view descriptions.

+

This setting can be changed to support markup styles other than the default markdown. For example, you can use it to support rst markup in your view docstrings being output in the browsable API.

+

This should be a function with the following signature:

+
view_description(cls, html=False)
+
+
    +
  • cls: The view class. Typically the description function would inspect the docstring of the class when generating a description, by accessing cls.__doc__
  • +
  • html: A boolean indicating if HTML output is required. True when used in the browsable API, and False when used in generating OPTIONS responses.
  • +
+

Default: 'rest_framework.views.get_view_description'

+
+

Miscellaneous settings

+

EXCEPTION_HANDLER

+

A string representing the function that should be used when returning a response for any given exception. If the function returns None, a 500 error will be raised.

+

This setting can be changed to support error responses other than the default {"detail": "Failure..."} responses. For example, you can use it to provide API responses like {"errors": [{"message": "Failure...", "code": ""} ...]}.

+

This should be a function with the following signature:

+
exception_handler(exc)
+
+
    +
  • exc: The exception.
  • +
+

Default: 'rest_framework.views.exception_handler'

+

FORMAT_SUFFIX_KWARG

+

The name of a parameter in the URL conf that may be used to provide a format suffix.

+

Default: 'format'

+
+
+
+
+ +
+
+ + + + + + + + + + diff --git a/api-guide/status-codes.html b/api-guide/status-codes.html new file mode 100644 index 000000000..c806bde54 --- /dev/null +++ b/api-guide/status-codes.html @@ -0,0 +1,320 @@ + + + + + Django REST framework - Status Codes + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + + + +
+ +
+ +
+ + + + +
+
+ +
+

status.py

+

Status Codes

+
+

418 I'm a teapot - Any attempt to brew coffee with a teapot should result in the error code "418 I'm a teapot". The resulting entity body MAY be short and stout.

+

RFC 2324, Hyper Text Coffee Pot Control Protocol

+
+

Using bare status codes in your responses isn't recommended. REST framework includes a set of named constants that you can use to make more code more obvious and readable.

+
from rest_framework import status
+from rest_framework.response import Response
+
+def empty_view(self):
+    content = {'please move along': 'nothing to see here'}
+    return Response(content, status=status.HTTP_404_NOT_FOUND)
+
+

The full set of HTTP status codes included in the status module is listed below.

+

For more information on proper usage of HTTP status codes see RFC 2616 +and RFC 6585.

+

Informational - 1xx

+

This class of status code indicates a provisional response. There are no 1xx status codes used in REST framework by default.

+
HTTP_100_CONTINUE
+HTTP_101_SWITCHING_PROTOCOLS
+
+

Successful - 2xx

+

This class of status code indicates that the client's request was successfully received, understood, and accepted.

+
HTTP_200_OK
+HTTP_201_CREATED
+HTTP_202_ACCEPTED
+HTTP_203_NON_AUTHORITATIVE_INFORMATION
+HTTP_204_NO_CONTENT
+HTTP_205_RESET_CONTENT
+HTTP_206_PARTIAL_CONTENT
+
+

Redirection - 3xx

+

This class of status code indicates that further action needs to be taken by the user agent in order to fulfill the request.

+
HTTP_300_MULTIPLE_CHOICES
+HTTP_301_MOVED_PERMANENTLY
+HTTP_302_FOUND
+HTTP_303_SEE_OTHER
+HTTP_304_NOT_MODIFIED
+HTTP_305_USE_PROXY
+HTTP_306_RESERVED
+HTTP_307_TEMPORARY_REDIRECT
+
+

Client Error - 4xx

+

The 4xx class of status code is intended for cases in which the client seems to have erred. Except when responding to a HEAD request, the server SHOULD include an entity containing an explanation of the error situation, and whether it is a temporary or permanent condition.

+
HTTP_400_BAD_REQUEST
+HTTP_401_UNAUTHORIZED
+HTTP_402_PAYMENT_REQUIRED
+HTTP_403_FORBIDDEN
+HTTP_404_NOT_FOUND
+HTTP_405_METHOD_NOT_ALLOWED
+HTTP_406_NOT_ACCEPTABLE
+HTTP_407_PROXY_AUTHENTICATION_REQUIRED
+HTTP_408_REQUEST_TIMEOUT
+HTTP_409_CONFLICT
+HTTP_410_GONE
+HTTP_411_LENGTH_REQUIRED
+HTTP_412_PRECONDITION_FAILED
+HTTP_413_REQUEST_ENTITY_TOO_LARGE
+HTTP_414_REQUEST_URI_TOO_LONG
+HTTP_415_UNSUPPORTED_MEDIA_TYPE
+HTTP_416_REQUESTED_RANGE_NOT_SATISFIABLE
+HTTP_417_EXPECTATION_FAILED
+HTTP_428_PRECONDITION_REQUIRED
+HTTP_429_TOO_MANY_REQUESTS
+HTTP_431_REQUEST_HEADER_FIELDS_TOO_LARGE
+
+

Server Error - 5xx

+

Response status codes beginning with the digit "5" indicate cases in which the server is aware that it has erred or is incapable of performing the request. Except when responding to a HEAD request, the server SHOULD include an entity containing an explanation of the error situation, and whether it is a temporary or permanent condition.

+
HTTP_500_INTERNAL_SERVER_ERROR
+HTTP_501_NOT_IMPLEMENTED
+HTTP_502_BAD_GATEWAY
+HTTP_503_SERVICE_UNAVAILABLE
+HTTP_504_GATEWAY_TIMEOUT
+HTTP_505_HTTP_VERSION_NOT_SUPPORTED
+HTTP_511_NETWORK_AUTHENTICATION_REQUIRED
+
+
+
+
+
+ +
+
+ + + + + + + + + + diff --git a/api-guide/testing.html b/api-guide/testing.html new file mode 100644 index 000000000..a289e2bde --- /dev/null +++ b/api-guide/testing.html @@ -0,0 +1,451 @@ + + + + + Django REST framework - Testing + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + + + +
+ +
+ +
+ + + + +
+
+ +
+

test.py

+

Testing

+
+

Code without tests is broken as designed.

+

Jacob Kaplan-Moss

+
+

REST framework includes a few helper classes that extend Django's existing test framework, and improve support for making API requests.

+

APIRequestFactory

+

Extends Django's existing RequestFactory class.

+

Creating test requests

+

The APIRequestFactory class supports an almost identical API to Django's standard RequestFactory class. This means the that standard .get(), .post(), .put(), .patch(), .delete(), .head() and .options() methods are all available.

+
from rest_framework.test import APIRequestFactory
+
+# Using the standard RequestFactory API to create a form POST request
+factory = APIRequestFactory()
+request = factory.post('/notes/', {'title': 'new idea'})
+
+

Using the format argument

+

Methods which create a request body, such as post, put and patch, include a format argument, which make it easy to generate requests using a content type other than multipart form data. For example:

+
# Create a JSON POST request
+factory = APIRequestFactory()
+request = factory.post('/notes/', {'title': 'new idea'}, format='json')
+
+

By default the available formats are 'multipart' and 'json'. For compatibility with Django's existing RequestFactory the default format is 'multipart'.

+

To support a wider set of request formats, or change the default format, see the configuration section.

+

Explicitly encoding the request body

+

If you need to explicitly encode the request body, you can do so by setting the content_type flag. For example:

+
request = factory.post('/notes/', json.dumps({'title': 'new idea'}), content_type='application/json')
+
+

PUT and PATCH with form data

+

One difference worth noting between Django's RequestFactory and REST framework's APIRequestFactory is that multipart form data will be encoded for methods other than just .post().

+

For example, using APIRequestFactory, you can make a form PUT request like so:

+
factory = APIRequestFactory()
+request = factory.put('/notes/547/', {'title': 'remember to email dave'})
+
+

Using Django's RequestFactory, you'd need to explicitly encode the data yourself:

+
from django.test.client import encode_multipart, RequestFactory
+
+factory = RequestFactory()
+data = {'title': 'remember to email dave'}
+content = encode_multipart('BoUnDaRyStRiNg', data)
+content_type = 'multipart/form-data; boundary=BoUnDaRyStRiNg'
+request = factory.put('/notes/547/', content, content_type=content_type)
+
+

Forcing authentication

+

When testing views directly using a request factory, it's often convenient to be able to directly authenticate the request, rather than having to construct the correct authentication credentials.

+

To forcibly authenticate a request, use the force_authenticate() method.

+
factory = APIRequestFactory()
+user = User.objects.get(username='olivia')
+view = AccountDetail.as_view()
+
+# Make an authenticated request to the view...
+request = factory.get('/accounts/django-superstars/')
+force_authenticate(request, user=user)
+response = view(request)
+
+

The signature for the method is force_authenticate(request, user=None, token=None). When making the call, either or both of the user and token may be set.

+

For example, when forcibly authenticating using a token, you might do something like the following:

+
user = User.objects.get(username='olivia')
+request = factory.get('/accounts/django-superstars/')
+force_authenticate(request, user=user, token=user.token)
+
+
+

Note: When using APIRequestFactory, the object that is returned is Django's standard HttpRequest, and not REST framework's Request object, which is only generated once the view is called.

+

This means that setting attributes directly on the request object may not always have the effect you expect. For example, setting .token directly will have no effect, and setting .user directly will only work if session authentication is being used.

+
# Request will only authenticate if `SessionAuthentication` is in use.
+request = factory.get('/accounts/django-superstars/')
+request.user = user
+response = view(request)
+
+
+

Forcing CSRF validation

+

By default, requests created with APIRequestFactory will not have CSRF validation applied when passed to a REST framework view. If you need to explicitly turn CSRF validation on, you can do so by setting the enforce_csrf_checks flag when instantiating the factory.

+
factory = APIRequestFactory(enforce_csrf_checks=True)
+
+
+

Note: It's worth noting that Django's standard RequestFactory doesn't need to include this option, because when using regular Django the CSRF validation takes place in middleware, which is not run when testing views directly. When using REST framework, CSRF validation takes place inside the view, so the request factory needs to disable view-level CSRF checks.

+
+

APIClient

+

Extends Django's existing Client class.

+

Making requests

+

The APIClient class supports the same request interface as APIRequestFactory. This means the that standard .get(), .post(), .put(), .patch(), .delete(), .head() and .options() methods are all available. For example:

+
from rest_framework.test import APIClient
+
+client = APIClient()
+client.post('/notes/', {'title': 'new idea'}, format='json')
+
+

To support a wider set of request formats, or change the default format, see the configuration section.

+

Authenticating

+

.login(**kwargs)

+

The login method functions exactly as it does with Django's regular Client class. This allows you to authenticate requests against any views which include SessionAuthentication.

+
# Make all requests in the context of a logged in session.
+client = APIClient()
+client.login(username='lauren', password='secret')
+
+

To logout, call the logout method as usual.

+
# Log out
+client.logout()
+
+

The login method is appropriate for testing APIs that use session authentication, for example web sites which include AJAX interaction with the API.

+

.credentials(**kwargs)

+

The credentials method can be used to set headers that will then be included on all subsequent requests by the test client.

+
from rest_framework.authtoken.models import Token
+from rest_framework.test import APIClient
+
+# Include an appropriate `Authorization:` header on all requests.
+token = Token.objects.get(user__username='lauren')
+client = APIClient()
+client.credentials(HTTP_AUTHORIZATION='Token ' + token.key)
+
+

Note that calling credentials a second time overwrites any existing credentials. You can unset any existing credentials by calling the method with no arguments.

+
# Stop including any credentials
+client.credentials()
+
+

The credentials method is appropriate for testing APIs that require authentication headers, such as basic authentication, OAuth1a and OAuth2 authentication, and simple token authentication schemes.

+

.force_authenticate(user=None, token=None)

+

Sometimes you may want to bypass authentication, and simple force all requests by the test client to be automatically treated as authenticated.

+

This can be a useful shortcut if you're testing the API but don't want to have to construct valid authentication credentials in order to make test requests.

+
user = User.objects.get(username='lauren')
+client = APIClient()
+client.force_authenticate(user=user)
+
+

To unauthenticate subsequent requests, call force_authenticate setting the user and/or token to None.

+
client.force_authenticate(user=None)
+
+

CSRF validation

+

By default CSRF validation is not applied when using APIClient. If you need to explicitly enable CSRF validation, you can do so by setting the enforce_csrf_checks flag when instantiating the client.

+
client = APIClient(enforce_csrf_checks=True)
+
+

As usual CSRF validation will only apply to any session authenticated views. This means CSRF validation will only occur if the client has been logged in by calling login().

+
+

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.

+
    +
  • APISimpleTestCase
  • +
  • APITransactionTestCase
  • +
  • APITestCase
  • +
  • APILiveServerTestCase
  • +
+

Example

+

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 rest_framework import status
+from rest_framework.test import APITestCase
+
+class AccountTests(APITestCase):
+    def test_create_account(self):
+        """
+        Ensure we can create a new account object.
+        """
+        url = reverse('account-list')
+        data = {'name': 'DabApps'}
+        response = self.client.post(url, data, format='json')
+        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        self.assertEqual(response.data, data)
+
+
+

Testing responses

+

Checking the response data

+

When checking the validity of test responses it's often more convenient to inspect the data that the response was created with, rather than inspecting the fully rendered response.

+

For example, it's easier to inspect request.data:

+
response = self.client.get('/users/4/')
+self.assertEqual(response.data, {'id': 4, 'username': 'lauren'})
+
+

Instead of inspecting the result of parsing request.content:

+
response = self.client.get('/users/4/')
+self.assertEqual(json.loads(response.content), {'id': 4, 'username': 'lauren'})
+
+

Rendering responses

+

If you're testing views directly using APIRequestFactory, the responses that are returned will not yet be rendered, as rendering of template responses is performed by Django's internal request-response cycle. In order to access response.content, you'll first need to render the response.

+
view = UserDetail.as_view()
+request = factory.get('/users/4')
+response = view(request, pk='4')
+response.render()  # Cannot access `response.content` without this.
+self.assertEqual(response.content, '{"username": "lauren", "id": 4}')
+
+
+

Configuration

+

Setting the default format

+

The default format used to make test requests may be set using the TEST_REQUEST_DEFAULT_FORMAT setting key. For example, to always use JSON for test requests by default instead of standard multipart form requests, set the following in your settings.py file:

+
REST_FRAMEWORK = {
+    ...
+    'TEST_REQUEST_DEFAULT_FORMAT': 'json'
+}
+
+

Setting the available formats

+

If you need to test requests using something other than multipart or json requests, you can do so by setting the TEST_REQUEST_RENDERER_CLASSES setting.

+

For example, to add support for using format='yaml' in test requests, you might have something like this in your settings.py file.

+
REST_FRAMEWORK = {
+    ...
+    'TEST_REQUEST_RENDERER_CLASSES': (
+        'rest_framework.renderers.MultiPartRenderer',
+        'rest_framework.renderers.JSONRenderer',
+        'rest_framework.renderers.YAMLRenderer'
+    )
+}
+
+
+
+
+
+ +
+
+ + + + + + + + + + diff --git a/api-guide/throttling.html b/api-guide/throttling.html new file mode 100644 index 000000000..5358b0a9f --- /dev/null +++ b/api-guide/throttling.html @@ -0,0 +1,383 @@ + + + + + Django REST framework - Throttling + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + + + +
+ +
+ +
+ + + + +
+
+ +
+

throttling.py

+

Throttling

+
+

HTTP/1.1 420 Enhance Your Calm

+

Twitter API rate limiting response

+
+

Throttling is similar to permissions, in that it determines if a request should be authorized. Throttles indicate a temporary state, and are used to control the rate of requests that clients can make to an API.

+

As with permissions, multiple throttles may be used. Your API might have a restrictive throttle for unauthenticated requests, and a less restrictive throttle for authenticated requests.

+

Another scenario where you might want to use multiple throttles would be if you need to impose different constraints on different parts of the API, due to some services being particularly resource-intensive.

+

Multiple throttles can also be used if you want to impose both burst throttling rates, and sustained throttling rates. For example, you might want to limit a user to a maximum of 60 requests per minute, and 1000 requests per day.

+

Throttles do not necessarily only refer to rate-limiting requests. For example a storage service might also need to throttle against bandwidth, and a paid data service might want to throttle against a certain number of a records being accessed.

+

How throttling is determined

+

As with permissions and authentication, throttling in REST framework is always defined as a list of classes.

+

Before running the main body of the view each throttle in the list is checked. +If any throttle check fails an exceptions.Throttled exception will be raised, and the main body of the view will not run.

+

Setting the throttling policy

+

The default throttling policy may be set globally, using the DEFAULT_THROTTLE_CLASSES and DEFAULT_THROTTLE_RATES settings. For example.

+
REST_FRAMEWORK = {
+    'DEFAULT_THROTTLE_CLASSES': (
+        'rest_framework.throttling.AnonRateThrottle',
+        'rest_framework.throttling.UserRateThrottle'
+    ),
+    'DEFAULT_THROTTLE_RATES': {
+        'anon': '100/day',
+        'user': '1000/day'
+    }        
+}
+
+

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, +using the APIView class based views.

+
from rest_framework.response import Response
+from rest_framework.throttling import UserRateThrottle
+from rest_framework.views import APIView
+
+class ExampleView(APIView):
+    throttle_classes = (UserRateThrottle,)
+
+    def get(self, request, format=None):
+        content = {
+            'status': 'request was permitted'
+        }
+        return Response(content)
+
+

Or, if you're using the @api_view decorator with function based views.

+
@api_view('GET')
+@throttle_classes([UserRateThrottle])
+def example_view(request, format=None):
+    content = {
+        'status': 'request was permitted'
+    }
+    return Response(content)
+
+

Setting up the cache

+

The throttle classes provided by REST framework use Django's cache backend. You should make sure that you've set appropriate cache settings. The default value of LocMemCache backend should be okay for simple setups. See Django's cache documentation for more details.

+

If you need to use a cache other than 'default', you can do so by creating a custom throttle class and setting the cache attribute. For example:

+
class CustomAnonRateThrottle(AnonRateThrottle):
+    cache = get_cache('alternate')
+
+

You'll need to rememeber to also set your custom throttle class in the 'DEFAULT_THROTTLE_CLASSES' settings key, or using the throttle_classes view attribute.

+
+

API Reference

+

AnonRateThrottle

+

The AnonRateThrottle will only ever throttle unauthenticated users. The IP address of the incoming request is used to generate a unique key to throttle against.

+

The allowed request rate is determined from one of the following (in order of preference).

+
    +
  • The rate property on the class, which may be provided by overriding AnonRateThrottle and setting the property.
  • +
  • The DEFAULT_THROTTLE_RATES['anon'] setting.
  • +
+

AnonRateThrottle is suitable if you want to restrict the rate of requests from unknown sources.

+

UserRateThrottle

+

The UserRateThrottle will throttle users to a given rate of requests across the API. The user id is used to generate a unique key to throttle against. Unauthenticated requests will fall back to using the IP address of the incoming request to generate a unique key to throttle against.

+

The allowed request rate is determined from one of the following (in order of preference).

+
    +
  • The rate property on the class, which may be provided by overriding UserRateThrottle and setting the property.
  • +
  • The DEFAULT_THROTTLE_RATES['user'] setting.
  • +
+

An API may have multiple UserRateThrottles in place at the same time. To do so, override UserRateThrottle and set a unique "scope" for each class.

+

For example, multiple user throttle rates could be implemented by using the following classes...

+
class BurstRateThrottle(UserRateThrottle):
+    scope = 'burst'
+
+class SustainedRateThrottle(UserRateThrottle):
+    scope = 'sustained'
+
+

...and the following settings.

+
REST_FRAMEWORK = {
+    'DEFAULT_THROTTLE_CLASSES': (
+        'example.throttles.BurstRateThrottle',
+        'example.throttles.SustainedRateThrottle'
+    ),
+    'DEFAULT_THROTTLE_RATES': {
+        'burst': '60/min',
+        'sustained': '1000/day'
+    }
+}
+
+

UserRateThrottle is suitable if you want simple global rate restrictions per-user.

+

ScopedRateThrottle

+

The ScopedRateThrottle class can be used to restrict access to specific parts of the API. This throttle will only be applied if the view that is being accessed includes a .throttle_scope property. The unique throttle key will then be formed by concatenating the "scope" of the request with the unique user id or IP address.

+

The allowed request rate is determined by the DEFAULT_THROTTLE_RATES setting using a key from the request "scope".

+

For example, given the following views...

+
class ContactListView(APIView):
+    throttle_scope = 'contacts'
+    ...
+
+class ContactDetailView(ApiView):
+    throttle_scope = 'contacts'
+    ...
+
+class UploadView(APIView):        
+    throttle_scope = 'uploads'
+    ...
+
+

...and the following settings.

+
REST_FRAMEWORK = {
+    'DEFAULT_THROTTLE_CLASSES': (
+        'rest_framework.throttling.ScopedRateThrottle'
+    ),
+    'DEFAULT_THROTTLE_RATES': {
+        'contacts': '1000/day',
+        'uploads': '20/day'
+    }
+}
+
+

User requests to either ContactListView or ContactDetailView would be restricted to a total of 1000 requests per-day. User requests to UploadView would be restricted to 20 requests per day.

+
+

Custom throttles

+

To create a custom throttle, override BaseThrottle and implement .allow_request(self, request, view). The method should return True if the request should be allowed, and False otherwise.

+

Optionally you may also override the .wait() method. If implemented, .wait() should return a recommended number of seconds to wait before attempting the next request, or None. The .wait() method will only be called if .allow_request() has previously returned False.

+

Example

+

The following is an example of a rate throttle, that will randomly throttle 1 in every 10 requests.

+
class RandomRateThrottle(throttles.BaseThrottle):
+    def allow_request(self, request, view):
+        return random.randint(1, 10) == 1
+
+
+
+
+
+ +
+
+ + + + + + + + + + diff --git a/api-guide/views.html b/api-guide/views.html new file mode 100644 index 000000000..11684c477 --- /dev/null +++ b/api-guide/views.html @@ -0,0 +1,360 @@ + + + + + Django REST framework - Class Based Views + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + + + +
+ +
+ +
+ + + + +
+
+ +
+

decorators.py views.py

+

Class Based Views

+
+

Django's class based views are a welcome departure from the old-style views.

+

Reinout van Rees

+
+

REST framework provides an APIView class, which subclasses Django's View class.

+

APIView classes are different from regular View classes in the following ways:

+
    +
  • Requests passed to the handler methods will be REST framework's Request instances, not Django's HttpRequest instances.
  • +
  • Handler methods may return REST framework's Response, instead of Django's HttpResponse. The view will manage content negotiation and setting the correct renderer on the response.
  • +
  • Any APIException exceptions will be caught and mediated into appropriate responses.
  • +
  • Incoming requests will be authenticated and appropriate permission and/or throttle checks will be run before dispatching the request to the handler method.
  • +
+

Using the APIView class is pretty much the same as using a regular View class, as usual, the incoming request is dispatched to an appropriate handler method such as .get() or .post(). Additionally, a number of attributes may be set on the class that control various aspects of the API policy.

+

For example:

+
from rest_framework.views import APIView
+from rest_framework.response import Response
+from rest_framework import authentication, permissions
+
+class ListUsers(APIView):
+    """
+    View to list all users in the system.
+
+    * Requires token authentication.
+    * Only admin users are able to access this view.
+    """
+    authentication_classes = (authentication.TokenAuthentication,)
+    permission_classes = (permissions.IsAdminUser,)
+
+    def get(self, request, format=None):
+        """
+        Return a list of all users.
+        """
+        usernames = [user.username for user in User.objects.all()]
+        return Response(usernames)
+
+

API policy attributes

+

The following attributes control the pluggable aspects of API views.

+

.renderer_classes

+

.parser_classes

+

.authentication_classes

+

.throttle_classes

+

.permission_classes

+

.content_negotiation_class

+

API policy instantiation methods

+

The following methods are used by REST framework to instantiate the various pluggable API policies. You won't typically need to override these methods.

+

.get_renderers(self)

+

.get_parsers(self)

+

.get_authenticators(self)

+

.get_throttles(self)

+

.get_permissions(self)

+

.get_content_negotiator(self)

+

API policy implementation methods

+

The following methods are called before dispatching to the handler method.

+

.check_permissions(self, request)

+

.check_throttles(self, request)

+

.perform_content_negotiation(self, request, force=False)

+

Dispatch methods

+

The following methods are called directly by the view's .dispatch() method. +These perform any actions that need to occur before or after calling the handler methods such as .get(), .post(), put(), patch() and .delete().

+

.initial(self, request, *args, **kwargs)

+

Performs any actions that need to occur before the handler method gets called. +This method is used to enforce permissions and throttling, and perform content negotiation.

+

You won't typically need to override this method.

+

.handle_exception(self, exc)

+

Any exception thrown by the handler method will be passed to this method, which either returns a Response instance, or re-raises the exception.

+

The default implementation handles any subclass of rest_framework.exceptions.APIException, as well as Django's Http404 and PermissionDenied exceptions, and returns an appropriate error response.

+

If you need to customize the error responses your API returns you should subclass this method.

+

.initialize_request(self, request, *args, **kwargs)

+

Ensures that the request object that is passed to the handler method is an instance of Request, rather than the usual Django HttpRequest.

+

You won't typically need to override this method.

+

.finalize_response(self, request, response, *args, **kwargs)

+

Ensures that any Response object returned from the handler method will be rendered into the correct content type, as determined by the content negotiation.

+

You won't typically need to override this method.

+
+

Function Based Views

+
+

Saying [that Class based views] is always the superior solution is a mistake.

+

Nick Coghlan

+
+

REST framework also allows you to work with regular function based views. It provides a set of simple decorators that wrap your function based views to ensure they receive an instance of Request (rather than the usual Django HttpRequest) and allows them to return a Response (instead of a Django HttpResponse), and allow you to configure how the request is processed.

+

@api_view()

+

Signature: @api_view(http_method_names)

+

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:

+
from rest_framework.decorators import api_view
+
+@api_view(['GET'])
+def hello_world(request):
+    return Response({"message": "Hello, world!"})
+
+

This view will use the default renderers, parsers, authentication classes etc specified in the settings.

+

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 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:

+
from rest_framework.decorators import api_view, throttle_classes
+from rest_framework.throttling import UserRateThrottle
+
+class OncePerDayUserThrottle(UserRateThrottle):
+        rate = '1/day'
+
+@api_view(['GET'])
+@throttle_classes([OncePerDayUserThrottle])
+def view(request):
+    return Response({"message": "Hello for today! See you tomorrow!"})
+
+

These decorators correspond to the attributes set on APIView subclasses, described above.

+

The available decorators are:

+
    +
  • @renderer_classes(...)
  • +
  • @parser_classes(...)
  • +
  • @authentication_classes(...)
  • +
  • @throttle_classes(...)
  • +
  • @permission_classes(...)
  • +
+

Each of these decorators takes a single argument which must be a list or tuple of classes.

+
+
+
+
+ +
+
+ + + + + + + + + + diff --git a/api-guide/viewsets.html b/api-guide/viewsets.html new file mode 100644 index 000000000..72cf2b23a --- /dev/null +++ b/api-guide/viewsets.html @@ -0,0 +1,437 @@ + + + + + Django REST framework - ViewSets + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + + + +
+ +
+ +
+ + + + +
+
+ +
+

viewsets.py

+

ViewSets

+
+

After routing has determined which controller to use for a request, your controller is responsible for making sense of the request and producing the appropriate output.

+

Ruby on Rails Documentation

+
+

Django REST framework allows you to combine the logic for a set of related views in a single class, called a ViewSet. In other frameworks you may also find conceptually similar implementations named something like 'Resources' or 'Controllers'.

+

A ViewSet class is simply a type of class-based View, that does not provide any method handlers such as .get() or .post(), and instead provides actions such as .list() and .create().

+

The method handlers for a ViewSet are only bound to the corresponding actions at the point of finalizing the view, using the .as_view() method.

+

Typically, rather than explicitly registering the views in a viewset in the urlconf, you'll register the viewset with a router class, that automatically determines the urlconf for you.

+

Example

+

Let's define a simple viewset that can be used to list or retrieve all the users in the system.

+
from django.contrib.auth.models import User
+from django.shortcuts import get_object_or_404
+from myapps.serializers import UserSerializer
+from rest_framework import viewsets
+from rest_framework.response import Response
+
+class UserViewSet(viewsets.ViewSet):
+    """
+    A simple ViewSet that for listing or retrieving users.
+    """
+    def list(self, request):
+        queryset = User.objects.all()
+        serializer = UserSerializer(queryset, many=True)
+        return Response(serializer.data)
+
+    def retrieve(self, request, pk=None):
+        queryset = User.objects.all()
+        user = get_object_or_404(queryset, pk=pk)
+        serializer = UserSerializer(user)
+        return Response(serializer.data)
+
+

If we need to, we can bind this viewset into two separate views, like so:

+
user_list = UserViewSet.as_view({'get': 'list'})
+user_detail = UserViewSet.as_view({'get': 'retrieve'})
+
+

Typically we wouldn't do this, but would instead register the viewset with a router, and allow the urlconf to be automatically generated.

+
from myapp.views import UserViewSet
+from rest_framework.routers import DefaultRouter
+
+router = DefaultRouter()
+router.register(r'users', UserViewSet)
+urlpatterns = router.urls
+
+

Rather than writing your own viewsets, you'll often want to use the existing base classes that provide a default set of behavior. For example:

+
class UserViewSet(viewsets.ModelViewSet):
+    """
+    A viewset for viewing and editing user instances.
+    """
+    serializer_class = UserSerializer
+    queryset = User.objects.all()
+
+

There are two main advantages of using a ViewSet class over using a View class.

+
    +
  • Repeated logic can be combined into a single class. In the above example, we only need to specify the queryset once, and it'll be used across multiple views.
  • +
  • By using routers, we no longer need to deal with wiring up the URL conf ourselves.
  • +
+

Both of these come with a trade-off. Using regular views and URL confs is more explicit and gives you more control. ViewSets are helpful if you want to get up and running quickly, or when you have a large API and you want to enforce a consistent URL configuration throughout.

+

Marking extra methods for routing

+

The default routers included with REST framework will provide routes for a standard set of create/retrieve/update/destroy style operations, as shown below:

+
class UserViewSet(viewsets.ViewSet):
+    """
+    Example empty viewset demonstrating the standard
+    actions that will be handled by a router class.
+
+    If you're using format suffixes, make sure to also include
+    the `format=None` keyword argument for each action.
+    """
+
+    def list(self, request):
+        pass
+
+    def create(self, request):
+        pass
+
+    def retrieve(self, request, pk=None):
+        pass
+
+    def update(self, request, pk=None):
+        pass
+
+    def partial_update(self, request, pk=None):
+        pass
+
+    def destroy(self, request, pk=None):
+        pass
+
+

If you have ad-hoc methods that you need to be routed to, you can mark them as requiring routing using the @link or @action decorators. The @link decorator will route GET requests, and the @action decorator will route POST requests.

+

For example:

+
from django.contrib.auth.models import User
+from rest_framework import viewsets
+from rest_framework import status
+from rest_framework.decorators import action
+from rest_framework.response import Response
+from myapp.serializers import UserSerializer, PasswordSerializer
+
+class UserViewSet(viewsets.ModelViewSet):
+    """
+    A viewset that provides the standard actions
+    """
+    queryset = User.objects.all()
+    serializer_class = UserSerializer
+
+    @action()
+    def set_password(self, request, pk=None):
+        user = self.get_object()
+        serializer = PasswordSerializer(data=request.DATA)
+        if serializer.is_valid():
+            user.set_password(serializer.data['password'])
+            user.save()
+            return Response({'status': 'password set'})
+        else:
+            return Response(serializer.errors,
+                            status=status.HTTP_400_BAD_REQUEST)
+
+

The @action and @link decorators can additionally take extra arguments that will be set for the routed view only. For example...

+
    @action(permission_classes=[IsAdminOrIsSelf])
+    def set_password(self, request, pk=None):
+       ...
+
+

The @action decorator will route POST requests by default, but may also accept other HTTP methods, by using the method argument. For example:

+
    @action(methods=['POST', 'DELETE'])
+    def unset_password(self, request, pk=None):
+       ...
+
+

The two new actions will then be available at the urls ^users/{pk}/set_password/$ and ^users/{pk}/unset_password/$

+
+

API Reference

+

ViewSet

+

The ViewSet class inherits from APIView. You can use any of the standard attributes such as permission_classes, authentication_classes in order to control the API policy on the viewset.

+

The ViewSet class does not provide any implementations of actions. In order to use a ViewSet class you'll override the class and define the action implementations explicitly.

+

GenericViewSet

+

The GenericViewSet class inherits from GenericAPIView, and provides the default set of get_object, get_queryset methods and other generic view base behavior, but does not include any actions by default.

+

In order to use a GenericViewSet class you'll override the class and either mixin the required mixin classes, or define the action implementations explicitly.

+

ModelViewSet

+

The ModelViewSet class inherits from GenericAPIView and includes implementations for various actions, by mixing in the behavior of the various mixin classes.

+

The actions provided by the ModelViewSet class are .list(), .retrieve(), .create(), .update(), and .destroy().

+

Example

+

Because ModelViewSet extends GenericAPIView, you'll normally need to provide at least the queryset and serializer_class attributes. For example:

+
class AccountViewSet(viewsets.ModelViewSet):
+    """
+    A simple ViewSet for viewing and editing accounts.
+    """
+    queryset = Account.objects.all()
+    serializer_class = AccountSerializer
+    permission_classes = [IsAccountAdminOrReadOnly]
+
+

Note that you can use any of the standard attributes or method overrides provided by GenericAPIView. For example, to use a ViewSet that dynamically determines the queryset it should operate on, you might do something like this:

+
class AccountViewSet(viewsets.ModelViewSet):
+    """
+    A simple ViewSet for viewing and editing the accounts
+    associated with the user.
+    """
+    serializer_class = AccountSerializer
+    permission_classes = [IsAccountAdminOrReadOnly]
+
+    def get_queryset(self):
+        return self.request.user.accounts.all()
+
+

Also note that although this class provides the complete set of create/list/retrieve/update/destroy actions by default, you can restrict the available operations by using the standard permission classes.

+

ReadOnlyModelViewSet

+

The ReadOnlyModelViewSet class also inherits from GenericAPIView. As with ModelViewSet it also includes implementations for various actions, but unlike ModelViewSet only provides the 'read-only' actions, .list() and .retrieve().

+

Example

+

As with ModelViewSet, you'll normally need to provide at least the queryset and serializer_class attributes. For example:

+
class AccountViewSet(viewsets.ReadOnlyModelViewSet):
+    """
+    A simple ViewSet for viewing accounts.
+    """
+    queryset = Account.objects.all()
+    serializer_class = AccountSerializer
+
+

Again, as with ModelViewSet, you can use any of the standard attributes and method overrides available to GenericAPIView.

+

Custom ViewSet base classes

+

You may need to provide custom ViewSet classes that do not have the full set of ModelViewSet actions, or that customize the behavior in some other way.

+

Example

+

To create a base viewset class that provides create, list and retrieve operations, inherit from GenericViewSet, and mixin the required actions:

+
class CreateListRetrieveViewSet(mixins.CreateModelMixin,
+                                mixins.ListModelMixin,
+                                mixins.RetrieveModelMixin,
+                                viewsets.GenericViewSet):
+    """
+    A viewset that provides `retrieve`, `update`, and `list` actions.
+
+    To use it, override the class and set the `.queryset` and
+    `.serializer_class` attributes.
+    """
+    pass
+
+

By creating your own base ViewSet classes, you can provide common behavior that can be reused in multiple viewsets across your API.

+
+
+
+
+ +
+
+ + + + + + + + + + diff --git a/css/bootstrap-responsive.css b/css/bootstrap-responsive.css new file mode 100755 index 000000000..a8caf451d --- /dev/null +++ b/css/bootstrap-responsive.css @@ -0,0 +1,1058 @@ +/*! + * Bootstrap Responsive v2.1.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.hidden { + display: none; + visibility: hidden; +} + +.visible-phone { + display: none !important; +} + +.visible-tablet { + display: none !important; +} + +.hidden-desktop { + display: none !important; +} + +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important ; + } + .visible-tablet { + display: inherit !important; + } + .hidden-tablet { + display: none !important; + } +} + +@media (max-width: 767px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important; + } + .visible-phone { + display: inherit !important; + } + .hidden-phone { + display: none !important; + } +} + +@media (min-width: 1200px) { + .row { + margin-left: -30px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 30px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 1170px; + } + .span12 { + width: 1170px; + } + .span11 { + width: 1070px; + } + .span10 { + width: 970px; + } + .span9 { + width: 870px; + } + .span8 { + width: 770px; + } + .span7 { + width: 670px; + } + .span6 { + width: 570px; + } + .span5 { + width: 470px; + } + .span4 { + width: 370px; + } + .span3 { + width: 270px; + } + .span2 { + width: 170px; + } + .span1 { + width: 70px; + } + .offset12 { + margin-left: 1230px; + } + .offset11 { + margin-left: 1130px; + } + .offset10 { + margin-left: 1030px; + } + .offset9 { + margin-left: 930px; + } + .offset8 { + margin-left: 830px; + } + .offset7 { + margin-left: 730px; + } + .offset6 { + margin-left: 630px; + } + .offset5 { + margin-left: 530px; + } + .offset4 { + margin-left: 430px; + } + .offset3 { + margin-left: 330px; + } + .offset2 { + margin-left: 230px; + } + .offset1 { + margin-left: 130px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.564102564102564%; + *margin-left: 2.5109110747408616%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.45299145299145%; + *width: 91.39979996362975%; + } + .row-fluid .span10 { + width: 82.90598290598291%; + *width: 82.8527914166212%; + } + .row-fluid .span9 { + width: 74.35897435897436%; + *width: 74.30578286961266%; + } + .row-fluid .span8 { + width: 65.81196581196582%; + *width: 65.75877432260411%; + } + .row-fluid .span7 { + width: 57.26495726495726%; + *width: 57.21176577559556%; + } + .row-fluid .span6 { + width: 48.717948717948715%; + *width: 48.664757228587014%; + } + .row-fluid .span5 { + width: 40.17094017094017%; + *width: 40.11774868157847%; + } + .row-fluid .span4 { + width: 31.623931623931625%; + *width: 31.570740134569924%; + } + .row-fluid .span3 { + width: 23.076923076923077%; + *width: 23.023731587561375%; + } + .row-fluid .span2 { + width: 14.52991452991453%; + *width: 14.476723040552828%; + } + .row-fluid .span1 { + width: 5.982905982905983%; + *width: 5.929714493544281%; + } + .row-fluid .offset12 { + margin-left: 105.12820512820512%; + *margin-left: 105.02182214948171%; + } + .row-fluid .offset12:first-child { + margin-left: 102.56410256410257%; + *margin-left: 102.45771958537915%; + } + .row-fluid .offset11 { + margin-left: 96.58119658119658%; + *margin-left: 96.47481360247316%; + } + .row-fluid .offset11:first-child { + margin-left: 94.01709401709402%; + *margin-left: 93.91071103837061%; + } + .row-fluid .offset10 { + margin-left: 88.03418803418803%; + *margin-left: 87.92780505546462%; + } + .row-fluid .offset10:first-child { + margin-left: 85.47008547008548%; + *margin-left: 85.36370249136206%; + } + .row-fluid .offset9 { + margin-left: 79.48717948717949%; + *margin-left: 79.38079650845607%; + } + .row-fluid .offset9:first-child { + margin-left: 76.92307692307693%; + *margin-left: 76.81669394435352%; + } + .row-fluid .offset8 { + margin-left: 70.94017094017094%; + *margin-left: 70.83378796144753%; + } + .row-fluid .offset8:first-child { + margin-left: 68.37606837606839%; + *margin-left: 68.26968539734497%; + } + .row-fluid .offset7 { + margin-left: 62.393162393162385%; + *margin-left: 62.28677941443899%; + } + .row-fluid .offset7:first-child { + margin-left: 59.82905982905982%; + *margin-left: 59.72267685033642%; + } + .row-fluid .offset6 { + margin-left: 53.84615384615384%; + *margin-left: 53.739770867430444%; + } + .row-fluid .offset6:first-child { + margin-left: 51.28205128205128%; + *margin-left: 51.175668303327875%; + } + .row-fluid .offset5 { + margin-left: 45.299145299145295%; + *margin-left: 45.1927623204219%; + } + .row-fluid .offset5:first-child { + margin-left: 42.73504273504273%; + *margin-left: 42.62865975631933%; + } + .row-fluid .offset4 { + margin-left: 36.75213675213675%; + *margin-left: 36.645753773413354%; + } + .row-fluid .offset4:first-child { + margin-left: 34.18803418803419%; + *margin-left: 34.081651209310785%; + } + .row-fluid .offset3 { + margin-left: 28.205128205128204%; + *margin-left: 28.0987452264048%; + } + .row-fluid .offset3:first-child { + margin-left: 25.641025641025642%; + *margin-left: 25.53464266230224%; + } + .row-fluid .offset2 { + margin-left: 19.65811965811966%; + *margin-left: 19.551736679396257%; + } + .row-fluid .offset2:first-child { + margin-left: 17.094017094017094%; + *margin-left: 16.98763411529369%; + } + .row-fluid .offset1 { + margin-left: 11.11111111111111%; + *margin-left: 11.004728132387708%; + } + .row-fluid .offset1:first-child { + margin-left: 8.547008547008547%; + *margin-left: 8.440625568285142%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 30px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 1156px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 1056px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 956px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 856px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 756px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 656px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 556px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 456px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 356px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 256px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 156px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 56px; + } + .thumbnails { + margin-left: -30px; + } + .thumbnails > li { + margin-left: 30px; + } + .row-fluid .thumbnails { + margin-left: 0; + } +} + +@media (min-width: 768px) and (max-width: 979px) { + .row { + margin-left: -20px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + .span12 { + width: 724px; + } + .span11 { + width: 662px; + } + .span10 { + width: 600px; + } + .span9 { + width: 538px; + } + .span8 { + width: 476px; + } + .span7 { + width: 414px; + } + .span6 { + width: 352px; + } + .span5 { + width: 290px; + } + .span4 { + width: 228px; + } + .span3 { + width: 166px; + } + .span2 { + width: 104px; + } + .span1 { + width: 42px; + } + .offset12 { + margin-left: 764px; + } + .offset11 { + margin-left: 702px; + } + .offset10 { + margin-left: 640px; + } + .offset9 { + margin-left: 578px; + } + .offset8 { + margin-left: 516px; + } + .offset7 { + margin-left: 454px; + } + .offset6 { + margin-left: 392px; + } + .offset5 { + margin-left: 330px; + } + .offset4 { + margin-left: 268px; + } + .offset3 { + margin-left: 206px; + } + .offset2 { + margin-left: 144px; + } + .offset1 { + margin-left: 82px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} + +@media (max-width: 767px) { + body { + padding-right: 20px; + padding-left: 20px; + } + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + .container-fluid { + padding: 0; + } + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + .dl-horizontal dd { + margin-left: 0; + } + .container { + width: auto; + } + .row-fluid { + width: 100%; + } + .row, + .thumbnails { + margin-left: 0; + } + .thumbnails > li { + float: none; + margin-left: 0; + } + [class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + .modal.fade.in { + top: auto; + } +} + +@media (max-width: 480px) { + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + .page-header h1 small { + display: block; + line-height: 20px; + } + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + .form-horizontal .controls { + margin-left: 0; + } + .form-horizontal .control-list { + padding-top: 0; + } + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + .modal { + top: 10px; + right: 10px; + left: 10px; + } + .modal-header .close { + padding: 10px; + margin: -10px; + } + .carousel-caption { + position: static; + } +} + +@media (max-width: 979px) { + body { + padding-top: 0; + } + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + .navbar-fixed-top { + margin-bottom: 20px; + } + .navbar-fixed-bottom { + margin-top: 20px; + } + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + .navbar .container { + width: auto; + padding: 0; + } + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + .nav-collapse { + clear: both; + } + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + .nav-collapse .nav > li { + float: none; + } + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + .nav-collapse .nav > .divider-vertical { + display: none; + } + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + .nav-collapse .nav > li > a:hover, + .nav-collapse .dropdown-menu a:hover { + background-color: #f2f2f2; + } + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:hover { + background-color: #111111; + } + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: block; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + .nav-collapse .dropdown-menu .divider { + display: none; + } + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + .navbar .btn-navbar { + display: block; + } + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} + +@media (min-width: 980px) { + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} \ No newline at end of file diff --git a/css/bootstrap.css b/css/bootstrap.css new file mode 100755 index 000000000..53df68595 --- /dev/null +++ b/css/bootstrap.css @@ -0,0 +1,5774 @@ +/*! + * Bootstrap v2.1.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +audio:not([controls]) { + display: none; +} + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +a:hover, +a:active { + outline: 0; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + width: auto\9; + height: auto; + max-width: 100%; + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; +} + +#map_canvas img { + max-width: none; +} + +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} + +button, +input { + *overflow: visible; + line-height: normal; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +button, +input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} + +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} + +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 20px; + color: #333333; + background-color: #ffffff; +} + +a { + color: #0088cc; + text-decoration: none; +} + +a:hover { + color: #005580; + text-decoration: underline; +} + +.img-rounded { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.img-polaroid { + padding: 4px; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.img-circle { + -webkit-border-radius: 500px; + -moz-border-radius: 500px; + border-radius: 500px; +} + +.row { + margin-left: -20px; + *zoom: 1; +} + +.row:before, +.row:after { + display: table; + line-height: 0; + content: ""; +} + +.row:after { + clear: both; +} + +[class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; +} + +.container, +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.span12 { + width: 940px; +} + +.span11 { + width: 860px; +} + +.span10 { + width: 780px; +} + +.span9 { + width: 700px; +} + +.span8 { + width: 620px; +} + +.span7 { + width: 540px; +} + +.span6 { + width: 460px; +} + +.span5 { + width: 380px; +} + +.span4 { + width: 300px; +} + +.span3 { + width: 220px; +} + +.span2 { + width: 140px; +} + +.span1 { + width: 60px; +} + +.offset12 { + margin-left: 980px; +} + +.offset11 { + margin-left: 900px; +} + +.offset10 { + margin-left: 820px; +} + +.offset9 { + margin-left: 740px; +} + +.offset8 { + margin-left: 660px; +} + +.offset7 { + margin-left: 580px; +} + +.offset6 { + margin-left: 500px; +} + +.offset5 { + margin-left: 420px; +} + +.offset4 { + margin-left: 340px; +} + +.offset3 { + margin-left: 260px; +} + +.offset2 { + margin-left: 180px; +} + +.offset1 { + margin-left: 100px; +} + +.row-fluid { + width: 100%; + *zoom: 1; +} + +.row-fluid:before, +.row-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.row-fluid:after { + clear: both; +} + +.row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid [class*="span"]:first-child { + margin-left: 0; +} + +.row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; +} + +.row-fluid .span11 { + width: 91.48936170212765%; + *width: 91.43617021276594%; +} + +.row-fluid .span10 { + width: 82.97872340425532%; + *width: 82.92553191489361%; +} + +.row-fluid .span9 { + width: 74.46808510638297%; + *width: 74.41489361702126%; +} + +.row-fluid .span8 { + width: 65.95744680851064%; + *width: 65.90425531914893%; +} + +.row-fluid .span7 { + width: 57.44680851063829%; + *width: 57.39361702127659%; +} + +.row-fluid .span6 { + width: 48.93617021276595%; + *width: 48.88297872340425%; +} + +.row-fluid .span5 { + width: 40.42553191489362%; + *width: 40.37234042553192%; +} + +.row-fluid .span4 { + width: 31.914893617021278%; + *width: 31.861702127659576%; +} + +.row-fluid .span3 { + width: 23.404255319148934%; + *width: 23.351063829787233%; +} + +.row-fluid .span2 { + width: 14.893617021276595%; + *width: 14.840425531914894%; +} + +.row-fluid .span1 { + width: 6.382978723404255%; + *width: 6.329787234042553%; +} + +.row-fluid .offset12 { + margin-left: 104.25531914893617%; + *margin-left: 104.14893617021275%; +} + +.row-fluid .offset12:first-child { + margin-left: 102.12765957446808%; + *margin-left: 102.02127659574467%; +} + +.row-fluid .offset11 { + margin-left: 95.74468085106382%; + *margin-left: 95.6382978723404%; +} + +.row-fluid .offset11:first-child { + margin-left: 93.61702127659574%; + *margin-left: 93.51063829787232%; +} + +.row-fluid .offset10 { + margin-left: 87.23404255319149%; + *margin-left: 87.12765957446807%; +} + +.row-fluid .offset10:first-child { + margin-left: 85.1063829787234%; + *margin-left: 84.99999999999999%; +} + +.row-fluid .offset9 { + margin-left: 78.72340425531914%; + *margin-left: 78.61702127659572%; +} + +.row-fluid .offset9:first-child { + margin-left: 76.59574468085106%; + *margin-left: 76.48936170212764%; +} + +.row-fluid .offset8 { + margin-left: 70.2127659574468%; + *margin-left: 70.10638297872339%; +} + +.row-fluid .offset8:first-child { + margin-left: 68.08510638297872%; + *margin-left: 67.9787234042553%; +} + +.row-fluid .offset7 { + margin-left: 61.70212765957446%; + *margin-left: 61.59574468085106%; +} + +.row-fluid .offset7:first-child { + margin-left: 59.574468085106375%; + *margin-left: 59.46808510638297%; +} + +.row-fluid .offset6 { + margin-left: 53.191489361702125%; + *margin-left: 53.085106382978715%; +} + +.row-fluid .offset6:first-child { + margin-left: 51.063829787234035%; + *margin-left: 50.95744680851063%; +} + +.row-fluid .offset5 { + margin-left: 44.68085106382979%; + *margin-left: 44.57446808510638%; +} + +.row-fluid .offset5:first-child { + margin-left: 42.5531914893617%; + *margin-left: 42.4468085106383%; +} + +.row-fluid .offset4 { + margin-left: 36.170212765957444%; + *margin-left: 36.06382978723405%; +} + +.row-fluid .offset4:first-child { + margin-left: 34.04255319148936%; + *margin-left: 33.93617021276596%; +} + +.row-fluid .offset3 { + margin-left: 27.659574468085104%; + *margin-left: 27.5531914893617%; +} + +.row-fluid .offset3:first-child { + margin-left: 25.53191489361702%; + *margin-left: 25.425531914893618%; +} + +.row-fluid .offset2 { + margin-left: 19.148936170212764%; + *margin-left: 19.04255319148936%; +} + +.row-fluid .offset2:first-child { + margin-left: 17.02127659574468%; + *margin-left: 16.914893617021278%; +} + +.row-fluid .offset1 { + margin-left: 10.638297872340425%; + *margin-left: 10.53191489361702%; +} + +.row-fluid .offset1:first-child { + margin-left: 8.51063829787234%; + *margin-left: 8.404255319148938%; +} + +[class*="span"].hide, +.row-fluid [class*="span"].hide { + display: none; +} + +[class*="span"].pull-right, +.row-fluid [class*="span"].pull-right { + float: right; +} + +.container { + margin-right: auto; + margin-left: auto; + *zoom: 1; +} + +.container:before, +.container:after { + display: table; + line-height: 0; + content: ""; +} + +.container:after { + clear: both; +} + +.container-fluid { + padding-right: 20px; + padding-left: 20px; + *zoom: 1; +} + +.container-fluid:before, +.container-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.container-fluid:after { + clear: both; +} + +p { + margin: 0 0 10px; +} + +.lead { + margin-bottom: 20px; + font-size: 21px; + font-weight: 200; + line-height: 30px; +} + +small { + font-size: 85%; +} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +cite { + font-style: normal; +} + +.muted { + color: #999999; +} + +.text-warning { + color: #c09853; +} + +.text-error { + color: #b94a48; +} + +.text-info { + color: #3a87ad; +} + +.text-success { + color: #468847; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 10px 0; + font-family: inherit; + font-weight: bold; + line-height: 1; + color: inherit; + text-rendering: optimizelegibility; +} + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + line-height: 1; + color: #999999; +} + +h1 { + font-size: 36px; + line-height: 40px; +} + +h2 { + font-size: 30px; + line-height: 40px; +} + +h3 { + font-size: 24px; + line-height: 40px; +} + +h4 { + font-size: 18px; + line-height: 20px; +} + +h5 { + font-size: 14px; + line-height: 20px; +} + +h6 { + font-size: 12px; + line-height: 20px; +} + +h1 small { + font-size: 24px; +} + +h2 small { + font-size: 18px; +} + +h3 small { + font-size: 14px; +} + +h4 small { + font-size: 14px; +} + +.page-header { + padding-bottom: 9px; + margin: 20px 0 30px; + border-bottom: 1px solid #eeeeee; +} + +ul, +ol { + padding: 0; + margin: 0 0 10px 25px; +} + +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} + +li { + line-height: 20px; +} + +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} + +dl { + margin-bottom: 20px; +} + +dt, +dd { + line-height: 20px; +} + +dt { + font-weight: bold; +} + +dd { + margin-left: 10px; +} + +.dl-horizontal { + *zoom: 1; +} + +.dl-horizontal:before, +.dl-horizontal:after { + display: table; + line-height: 0; + content: ""; +} + +.dl-horizontal:after { + clear: both; +} + +.dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; +} + +.dl-horizontal dd { + margin-left: 180px; +} + +hr { + margin: 20px 0; + border: 0; + border-top: 1px solid #eeeeee; + border-bottom: 1px solid #ffffff; +} + +abbr[title] { + cursor: help; + border-bottom: 1px dotted #999999; +} + +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} + +blockquote { + padding: 0 0 0 15px; + margin: 0 0 20px; + border-left: 5px solid #eeeeee; +} + +blockquote p { + margin-bottom: 0; + font-size: 16px; + font-weight: 300; + line-height: 25px; +} + +blockquote small { + display: block; + line-height: 20px; + color: #999999; +} + +blockquote small:before { + content: '\2014 \00A0'; +} + +blockquote.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; +} + +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} + +blockquote.pull-right small:before { + content: ''; +} + +blockquote.pull-right small:after { + content: '\00A0 \2014'; +} + +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} + +address { + display: block; + margin-bottom: 20px; + font-style: normal; + line-height: 20px; +} + +code, +pre { + padding: 0 3px 2px; + font-family: Monaco, Menlo, Consolas, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +code { + padding: 2px 4px; + color: #d14; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 20px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +pre.prettyprint { + margin-bottom: 20px; +} + +pre code { + padding: 0; + color: inherit; + background-color: transparent; + border: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +form { + margin: 0 0 20px; +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: 40px; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +legend small { + font-size: 15px; + color: #999999; +} + +label, +input, +button, +select, +textarea { + font-size: 14px; + font-weight: normal; + line-height: 20px; +} + +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +label { + display: block; + margin-bottom: 5px; +} + +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: 20px; + padding: 4px 6px; + margin-bottom: 9px; + font-size: 14px; + line-height: 20px; + color: #555555; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +input, +textarea, +.uneditable-input { + width: 206px; +} + +textarea { + height: auto; +} + +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; +} + +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); +} + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + *margin-top: 0; + line-height: normal; + cursor: pointer; +} + +input[type="file"], +input[type="image"], +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; +} + +select, +input[type="file"] { + height: 30px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 30px; +} + +select { + width: 220px; + background-color: #ffffff; + border: 1px solid #cccccc; +} + +select[multiple], +select[size] { + height: auto; +} + +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.uneditable-input, +.uneditable-textarea { + color: #999999; + cursor: not-allowed; + background-color: #fcfcfc; + border-color: #cccccc; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); +} + +.uneditable-input { + overflow: hidden; + white-space: nowrap; +} + +.uneditable-textarea { + width: auto; + height: auto; +} + +input:-moz-placeholder, +textarea:-moz-placeholder { + color: #999999; +} + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #999999; +} + +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #999999; +} + +.radio, +.checkbox { + min-height: 18px; + padding-left: 18px; +} + +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -18px; +} + +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; +} + +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} + +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; +} + +.input-mini { + width: 60px; +} + +.input-small { + width: 90px; +} + +.input-medium { + width: 150px; +} + +.input-large { + width: 210px; +} + +.input-xlarge { + width: 270px; +} + +.input-xxlarge { + width: 530px; +} + +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} + +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} + +input, +textarea, +.uneditable-input { + margin-left: 0; +} + +.controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; +} + +input.span12, +textarea.span12, +.uneditable-input.span12 { + width: 926px; +} + +input.span11, +textarea.span11, +.uneditable-input.span11 { + width: 846px; +} + +input.span10, +textarea.span10, +.uneditable-input.span10 { + width: 766px; +} + +input.span9, +textarea.span9, +.uneditable-input.span9 { + width: 686px; +} + +input.span8, +textarea.span8, +.uneditable-input.span8 { + width: 606px; +} + +input.span7, +textarea.span7, +.uneditable-input.span7 { + width: 526px; +} + +input.span6, +textarea.span6, +.uneditable-input.span6 { + width: 446px; +} + +input.span5, +textarea.span5, +.uneditable-input.span5 { + width: 366px; +} + +input.span4, +textarea.span4, +.uneditable-input.span4 { + width: 286px; +} + +input.span3, +textarea.span3, +.uneditable-input.span3 { + width: 206px; +} + +input.span2, +textarea.span2, +.uneditable-input.span2 { + width: 126px; +} + +input.span1, +textarea.span1, +.uneditable-input.span1 { + width: 46px; +} + +.controls-row { + *zoom: 1; +} + +.controls-row:before, +.controls-row:after { + display: table; + line-height: 0; + content: ""; +} + +.controls-row:after { + clear: both; +} + +.controls-row [class*="span"] { + float: left; +} + +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #eeeeee; +} + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} + +.control-group.warning > label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #c09853; +} + +.control-group.warning .checkbox, +.control-group.warning .radio, +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + color: #c09853; +} + +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + border-color: #c09853; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; +} + +.control-group.warning .input-prepend .add-on, +.control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} + +.control-group.error > label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #b94a48; +} + +.control-group.error .checkbox, +.control-group.error .radio, +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + color: #b94a48; +} + +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + border-color: #b94a48; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; +} + +.control-group.error .input-prepend .add-on, +.control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} + +.control-group.success > label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #468847; +} + +.control-group.success .checkbox, +.control-group.success .radio, +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + color: #468847; +} + +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + border-color: #468847; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; +} + +.control-group.success .input-prepend .add-on, +.control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} + +.control-group.info > label, +.control-group.info .help-block, +.control-group.info .help-inline { + color: #3a87ad; +} + +.control-group.info .checkbox, +.control-group.info .radio, +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + color: #3a87ad; +} + +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + border-color: #3a87ad; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.info input:focus, +.control-group.info select:focus, +.control-group.info textarea:focus { + border-color: #2d6987; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; +} + +.control-group.info .input-prepend .add-on, +.control-group.info .input-append .add-on { + color: #3a87ad; + background-color: #d9edf7; + border-color: #3a87ad; +} + +input:focus:required:invalid, +textarea:focus:required:invalid, +select:focus:required:invalid { + color: #b94a48; + border-color: #ee5f5b; +} + +input:focus:required:invalid:focus, +textarea:focus:required:invalid:focus, +select:focus:required:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} + +.form-actions { + padding: 19px 20px 20px; + margin-top: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + *zoom: 1; +} + +.form-actions:before, +.form-actions:after { + display: table; + line-height: 0; + content: ""; +} + +.form-actions:after { + clear: both; +} + +.help-block, +.help-inline { + color: #595959; +} + +.help-block { + display: block; + margin-bottom: 10px; +} + +.help-inline { + display: inline-block; + *display: inline; + padding-left: 5px; + vertical-align: middle; + *zoom: 1; +} + +.input-append, +.input-prepend { + margin-bottom: 5px; + font-size: 0; + white-space: nowrap; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + font-size: 14px; + vertical-align: top; + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} + +.input-append input:focus, +.input-prepend input:focus, +.input-append select:focus, +.input-prepend select:focus, +.input-append .uneditable-input:focus, +.input-prepend .uneditable-input:focus { + z-index: 2; +} + +.input-append .add-on, +.input-prepend .add-on { + display: inline-block; + width: auto; + height: 20px; + min-width: 16px; + padding: 4px 5px; + font-size: 14px; + font-weight: normal; + line-height: 20px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + background-color: #eeeeee; + border: 1px solid #ccc; +} + +.input-append .add-on, +.input-prepend .add-on, +.input-append .btn, +.input-prepend .btn { + vertical-align: top; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-append .active, +.input-prepend .active { + background-color: #a9dba9; + border-color: #46a546; +} + +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px; +} + +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} + +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} + +.input-append .add-on, +.input-append .btn { + margin-left: -1px; +} + +.input-append .add-on:last-child, +.input-append .btn:last-child { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} + +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} + +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} + +input.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + /* IE7-8 doesn't have border-radius, so don't indent the padding */ + + margin-bottom: 0; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +/* Allow for input prepend/append in search forms */ + +.form-search .input-append .search-query, +.form-search .input-prepend .search-query { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.form-search .input-append .search-query { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search .input-append .btn { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .search-query { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .btn { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + margin-bottom: 0; + vertical-align: middle; + *zoom: 1; +} + +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none; +} + +.form-search label, +.form-inline label, +.form-search .btn-group, +.form-inline .btn-group { + display: inline-block; +} + +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} + +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} + +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} + +.control-group { + margin-bottom: 10px; +} + +legend + .control-group { + margin-top: 20px; + -webkit-margin-top-collapse: separate; +} + +.form-horizontal .control-group { + margin-bottom: 20px; + *zoom: 1; +} + +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + line-height: 0; + content: ""; +} + +.form-horizontal .control-group:after { + clear: both; +} + +.form-horizontal .control-label { + float: left; + width: 160px; + padding-top: 5px; + text-align: right; +} + +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 180px; + *margin-left: 0; +} + +.form-horizontal .controls:first-child { + *padding-left: 180px; +} + +.form-horizontal .help-block { + margin-bottom: 0; +} + +.form-horizontal input + .help-block, +.form-horizontal select + .help-block, +.form-horizontal textarea + .help-block { + margin-top: 10px; +} + +.form-horizontal .form-actions { + padding-left: 180px; +} + +table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; +} + +.table { + width: 100%; + margin-bottom: 20px; +} + +.table th, +.table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #dddddd; +} + +.table th { + font-weight: bold; +} + +.table thead th { + vertical-align: bottom; +} + +.table caption + thead tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child th, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child th, +.table thead:first-child tr:first-child td { + border-top: 0; +} + +.table tbody + tbody { + border-top: 2px solid #dddddd; +} + +.table-condensed th, +.table-condensed td { + padding: 4px 5px; +} + +.table-bordered { + border: 1px solid #dddddd; + border-collapse: separate; + *border-collapse: collapse; + border-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.table-bordered th, +.table-bordered td { + border-left: 1px solid #dddddd; +} + +.table-bordered caption + thead tr:first-child th, +.table-bordered caption + tbody tr:first-child th, +.table-bordered caption + tbody tr:first-child td, +.table-bordered colgroup + thead tr:first-child th, +.table-bordered colgroup + tbody tr:first-child th, +.table-bordered colgroup + tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} + +.table-bordered thead:first-child tr:first-child th:first-child, +.table-bordered tbody:first-child tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered thead:first-child tr:first-child th:last-child, +.table-bordered tbody:first-child tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-bordered thead:last-child tr:last-child th:first-child, +.table-bordered tbody:last-child tr:last-child td:first-child, +.table-bordered tfoot:last-child tr:last-child td:first-child { + -webkit-border-radius: 0 0 0 4px; + -moz-border-radius: 0 0 0 4px; + border-radius: 0 0 0 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.table-bordered thead:last-child tr:last-child th:last-child, +.table-bordered tbody:last-child tr:last-child td:last-child, +.table-bordered tfoot:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; +} + +.table-bordered caption + thead tr:first-child th:first-child, +.table-bordered caption + tbody tr:first-child td:first-child, +.table-bordered colgroup + thead tr:first-child th:first-child, +.table-bordered colgroup + tbody tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered caption + thead tr:first-child th:last-child, +.table-bordered caption + tbody tr:first-child td:last-child, +.table-bordered colgroup + thead tr:first-child th:last-child, +.table-bordered colgroup + tbody tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-striped tbody tr:nth-child(odd) td, +.table-striped tbody tr:nth-child(odd) th { + background-color: #f9f9f9; +} + +.table-hover tbody tr:hover td, +.table-hover tbody tr:hover th { + background-color: #f5f5f5; +} + +table [class*=span], +.row-fluid table [class*=span] { + display: table-cell; + float: none; + margin-left: 0; +} + +.table .span1 { + float: none; + width: 44px; + margin-left: 0; +} + +.table .span2 { + float: none; + width: 124px; + margin-left: 0; +} + +.table .span3 { + float: none; + width: 204px; + margin-left: 0; +} + +.table .span4 { + float: none; + width: 284px; + margin-left: 0; +} + +.table .span5 { + float: none; + width: 364px; + margin-left: 0; +} + +.table .span6 { + float: none; + width: 444px; + margin-left: 0; +} + +.table .span7 { + float: none; + width: 524px; + margin-left: 0; +} + +.table .span8 { + float: none; + width: 604px; + margin-left: 0; +} + +.table .span9 { + float: none; + width: 684px; + margin-left: 0; +} + +.table .span10 { + float: none; + width: 764px; + margin-left: 0; +} + +.table .span11 { + float: none; + width: 844px; + margin-left: 0; +} + +.table .span12 { + float: none; + width: 924px; + margin-left: 0; +} + +.table .span13 { + float: none; + width: 1004px; + margin-left: 0; +} + +.table .span14 { + float: none; + width: 1084px; + margin-left: 0; +} + +.table .span15 { + float: none; + width: 1164px; + margin-left: 0; +} + +.table .span16 { + float: none; + width: 1244px; + margin-left: 0; +} + +.table .span17 { + float: none; + width: 1324px; + margin-left: 0; +} + +.table .span18 { + float: none; + width: 1404px; + margin-left: 0; +} + +.table .span19 { + float: none; + width: 1484px; + margin-left: 0; +} + +.table .span20 { + float: none; + width: 1564px; + margin-left: 0; +} + +.table .span21 { + float: none; + width: 1644px; + margin-left: 0; +} + +.table .span22 { + float: none; + width: 1724px; + margin-left: 0; +} + +.table .span23 { + float: none; + width: 1804px; + margin-left: 0; +} + +.table .span24 { + float: none; + width: 1884px; + margin-left: 0; +} + +.table tbody tr.success td { + background-color: #dff0d8; +} + +.table tbody tr.error td { + background-color: #f2dede; +} + +.table tbody tr.warning td { + background-color: #fcf8e3; +} + +.table tbody tr.info td { + background-color: #d9edf7; +} + +.table-hover tbody tr.success:hover td { + background-color: #d0e9c6; +} + +.table-hover tbody tr.error:hover td { + background-color: #ebcccc; +} + +.table-hover tbody tr.warning:hover td { + background-color: #faf2cc; +} + +.table-hover tbody tr.info:hover td { + background-color: #c4e3f3; +} + +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + margin-top: 1px; + *margin-right: .3em; + line-height: 14px; + vertical-align: text-top; + background-image: url("../img/glyphicons-halflings.png"); + background-position: 14px 14px; + background-repeat: no-repeat; +} + +/* White icons with optional class, or on hover/active states of certain elements */ + +.icon-white, +.nav-tabs > .active > a > [class^="icon-"], +.nav-tabs > .active > a > [class*=" icon-"], +.nav-pills > .active > a > [class^="icon-"], +.nav-pills > .active > a > [class*=" icon-"], +.nav-list > .active > a > [class^="icon-"], +.nav-list > .active > a > [class*=" icon-"], +.navbar-inverse .nav > .active > a > [class^="icon-"], +.navbar-inverse .nav > .active > a > [class*=" icon-"], +.dropdown-menu > li > a:hover > [class^="icon-"], +.dropdown-menu > li > a:hover > [class*=" icon-"], +.dropdown-menu > .active > a > [class^="icon-"], +.dropdown-menu > .active > a > [class*=" icon-"] { + background-image: url("../img/glyphicons-halflings-white.png"); +} + +.icon-glass { + background-position: 0 0; +} + +.icon-music { + background-position: -24px 0; +} + +.icon-search { + background-position: -48px 0; +} + +.icon-envelope { + background-position: -72px 0; +} + +.icon-heart { + background-position: -96px 0; +} + +.icon-star { + background-position: -120px 0; +} + +.icon-star-empty { + background-position: -144px 0; +} + +.icon-user { + background-position: -168px 0; +} + +.icon-film { + background-position: -192px 0; +} + +.icon-th-large { + background-position: -216px 0; +} + +.icon-th { + background-position: -240px 0; +} + +.icon-th-list { + background-position: -264px 0; +} + +.icon-ok { + background-position: -288px 0; +} + +.icon-remove { + background-position: -312px 0; +} + +.icon-zoom-in { + background-position: -336px 0; +} + +.icon-zoom-out { + background-position: -360px 0; +} + +.icon-off { + background-position: -384px 0; +} + +.icon-signal { + background-position: -408px 0; +} + +.icon-cog { + background-position: -432px 0; +} + +.icon-trash { + background-position: -456px 0; +} + +.icon-home { + background-position: 0 -24px; +} + +.icon-file { + background-position: -24px -24px; +} + +.icon-time { + background-position: -48px -24px; +} + +.icon-road { + background-position: -72px -24px; +} + +.icon-download-alt { + background-position: -96px -24px; +} + +.icon-download { + background-position: -120px -24px; +} + +.icon-upload { + background-position: -144px -24px; +} + +.icon-inbox { + background-position: -168px -24px; +} + +.icon-play-circle { + background-position: -192px -24px; +} + +.icon-repeat { + background-position: -216px -24px; +} + +.icon-refresh { + background-position: -240px -24px; +} + +.icon-list-alt { + background-position: -264px -24px; +} + +.icon-lock { + background-position: -287px -24px; +} + +.icon-flag { + background-position: -312px -24px; +} + +.icon-headphones { + background-position: -336px -24px; +} + +.icon-volume-off { + background-position: -360px -24px; +} + +.icon-volume-down { + background-position: -384px -24px; +} + +.icon-volume-up { + background-position: -408px -24px; +} + +.icon-qrcode { + background-position: -432px -24px; +} + +.icon-barcode { + background-position: -456px -24px; +} + +.icon-tag { + background-position: 0 -48px; +} + +.icon-tags { + background-position: -25px -48px; +} + +.icon-book { + background-position: -48px -48px; +} + +.icon-bookmark { + background-position: -72px -48px; +} + +.icon-print { + background-position: -96px -48px; +} + +.icon-camera { + background-position: -120px -48px; +} + +.icon-font { + background-position: -144px -48px; +} + +.icon-bold { + background-position: -167px -48px; +} + +.icon-italic { + background-position: -192px -48px; +} + +.icon-text-height { + background-position: -216px -48px; +} + +.icon-text-width { + background-position: -240px -48px; +} + +.icon-align-left { + background-position: -264px -48px; +} + +.icon-align-center { + background-position: -288px -48px; +} + +.icon-align-right { + background-position: -312px -48px; +} + +.icon-align-justify { + background-position: -336px -48px; +} + +.icon-list { + background-position: -360px -48px; +} + +.icon-indent-left { + background-position: -384px -48px; +} + +.icon-indent-right { + background-position: -408px -48px; +} + +.icon-facetime-video { + background-position: -432px -48px; +} + +.icon-picture { + background-position: -456px -48px; +} + +.icon-pencil { + background-position: 0 -72px; +} + +.icon-map-marker { + background-position: -24px -72px; +} + +.icon-adjust { + background-position: -48px -72px; +} + +.icon-tint { + background-position: -72px -72px; +} + +.icon-edit { + background-position: -96px -72px; +} + +.icon-share { + background-position: -120px -72px; +} + +.icon-check { + background-position: -144px -72px; +} + +.icon-move { + background-position: -168px -72px; +} + +.icon-step-backward { + background-position: -192px -72px; +} + +.icon-fast-backward { + background-position: -216px -72px; +} + +.icon-backward { + background-position: -240px -72px; +} + +.icon-play { + background-position: -264px -72px; +} + +.icon-pause { + background-position: -288px -72px; +} + +.icon-stop { + background-position: -312px -72px; +} + +.icon-forward { + background-position: -336px -72px; +} + +.icon-fast-forward { + background-position: -360px -72px; +} + +.icon-step-forward { + background-position: -384px -72px; +} + +.icon-eject { + background-position: -408px -72px; +} + +.icon-chevron-left { + background-position: -432px -72px; +} + +.icon-chevron-right { + background-position: -456px -72px; +} + +.icon-plus-sign { + background-position: 0 -96px; +} + +.icon-minus-sign { + background-position: -24px -96px; +} + +.icon-remove-sign { + background-position: -48px -96px; +} + +.icon-ok-sign { + background-position: -72px -96px; +} + +.icon-question-sign { + background-position: -96px -96px; +} + +.icon-info-sign { + background-position: -120px -96px; +} + +.icon-screenshot { + background-position: -144px -96px; +} + +.icon-remove-circle { + background-position: -168px -96px; +} + +.icon-ok-circle { + background-position: -192px -96px; +} + +.icon-ban-circle { + background-position: -216px -96px; +} + +.icon-arrow-left { + background-position: -240px -96px; +} + +.icon-arrow-right { + background-position: -264px -96px; +} + +.icon-arrow-up { + background-position: -289px -96px; +} + +.icon-arrow-down { + background-position: -312px -96px; +} + +.icon-share-alt { + background-position: -336px -96px; +} + +.icon-resize-full { + background-position: -360px -96px; +} + +.icon-resize-small { + background-position: -384px -96px; +} + +.icon-plus { + background-position: -408px -96px; +} + +.icon-minus { + background-position: -433px -96px; +} + +.icon-asterisk { + background-position: -456px -96px; +} + +.icon-exclamation-sign { + background-position: 0 -120px; +} + +.icon-gift { + background-position: -24px -120px; +} + +.icon-leaf { + background-position: -48px -120px; +} + +.icon-fire { + background-position: -72px -120px; +} + +.icon-eye-open { + background-position: -96px -120px; +} + +.icon-eye-close { + background-position: -120px -120px; +} + +.icon-warning-sign { + background-position: -144px -120px; +} + +.icon-plane { + background-position: -168px -120px; +} + +.icon-calendar { + background-position: -192px -120px; +} + +.icon-random { + width: 16px; + background-position: -216px -120px; +} + +.icon-comment { + background-position: -240px -120px; +} + +.icon-magnet { + background-position: -264px -120px; +} + +.icon-chevron-up { + background-position: -288px -120px; +} + +.icon-chevron-down { + background-position: -313px -119px; +} + +.icon-retweet { + background-position: -336px -120px; +} + +.icon-shopping-cart { + background-position: -360px -120px; +} + +.icon-folder-close { + background-position: -384px -120px; +} + +.icon-folder-open { + width: 16px; + background-position: -408px -120px; +} + +.icon-resize-vertical { + background-position: -432px -119px; +} + +.icon-resize-horizontal { + background-position: -456px -118px; +} + +.icon-hdd { + background-position: 0 -144px; +} + +.icon-bullhorn { + background-position: -24px -144px; +} + +.icon-bell { + background-position: -48px -144px; +} + +.icon-certificate { + background-position: -72px -144px; +} + +.icon-thumbs-up { + background-position: -96px -144px; +} + +.icon-thumbs-down { + background-position: -120px -144px; +} + +.icon-hand-right { + background-position: -144px -144px; +} + +.icon-hand-left { + background-position: -168px -144px; +} + +.icon-hand-up { + background-position: -192px -144px; +} + +.icon-hand-down { + background-position: -216px -144px; +} + +.icon-circle-arrow-right { + background-position: -240px -144px; +} + +.icon-circle-arrow-left { + background-position: -264px -144px; +} + +.icon-circle-arrow-up { + background-position: -288px -144px; +} + +.icon-circle-arrow-down { + background-position: -312px -144px; +} + +.icon-globe { + background-position: -336px -144px; +} + +.icon-wrench { + background-position: -360px -144px; +} + +.icon-tasks { + background-position: -384px -144px; +} + +.icon-filter { + background-position: -408px -144px; +} + +.icon-briefcase { + background-position: -432px -144px; +} + +.icon-fullscreen { + background-position: -456px -144px; +} + +.dropup, +.dropdown { + position: relative; +} + +.dropdown-toggle { + *margin-bottom: -3px; +} + +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; +} + +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.dropdown-menu a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + color: #333333; + white-space: nowrap; +} + +.dropdown-menu li > a:hover, +.dropdown-menu li > a:focus, +.dropdown-submenu:hover > a { + color: #ffffff; + text-decoration: none; + background-color: #0088cc; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu .active > a, +.dropdown-menu .active > a:hover { + color: #ffffff; + text-decoration: none; + background-color: #0088cc; + background-color: #0081c2; + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-repeat: repeat-x; + outline: 0; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu .disabled > a, +.dropdown-menu .disabled > a:hover { + color: #999999; +} + +.dropdown-menu .disabled > a:hover { + text-decoration: none; + cursor: default; + background-color: transparent; +} + +.open { + *z-index: 1000; +} + +.open > .dropdown-menu { + display: block; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000000; + content: ""; +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} + +.dropdown-submenu { + position: relative; +} + +.dropdown-submenu > .dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + -webkit-border-radius: 0 6px 6px 6px; + -moz-border-radius: 0 6px 6px 6px; + border-radius: 0 6px 6px 6px; +} + +.dropdown-submenu:hover > .dropdown-menu { + display: block; +} + +.dropdown-submenu > a:after { + display: block; + float: right; + width: 0; + height: 0; + margin-top: 5px; + margin-right: -10px; + border-color: transparent; + border-left-color: #cccccc; + border-style: solid; + border-width: 5px 0 5px 5px; + content: " "; +} + +.dropdown-submenu:hover > a:after { + border-left-color: #ffffff; +} + +.dropdown .dropdown-menu .nav-header { + padding-right: 20px; + padding-left: 20px; +} + +.typeahead { + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} + +.well-large { + padding: 24px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.well-small { + padding: 9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} + +.fade.in { + opacity: 1; +} + +.collapse { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} + +.collapse.in { + height: auto; +} + +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 20px; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} + +.close:hover { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + filter: alpha(opacity=40); +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.btn { + display: inline-block; + *display: inline; + padding: 4px 14px; + margin-bottom: 0; + *margin-left: .3em; + font-size: 14px; + line-height: 20px; + *line-height: 20px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + vertical-align: middle; + cursor: pointer; + background-color: #f5f5f5; + *background-color: #e6e6e6; + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-repeat: repeat-x; + border: 1px solid #bbbbbb; + *border: 0; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-bottom-color: #a2a2a2; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn:hover, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + color: #333333; + background-color: #e6e6e6; + *background-color: #d9d9d9; +} + +.btn:active, +.btn.active { + background-color: #cccccc \9; +} + +.btn:first-child { + *margin-left: 0; +} + +.btn:hover { + color: #333333; + text-decoration: none; + background-color: #e6e6e6; + *background-color: #d9d9d9; + /* Buttons in IE7 don't get borders, so darken on hover */ + + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} + +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.btn.active, +.btn:active { + background-color: #e6e6e6; + background-color: #d9d9d9 \9; + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn.disabled, +.btn[disabled] { + cursor: default; + background-color: #e6e6e6; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-large { + padding: 9px 14px; + font-size: 16px; + line-height: normal; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.btn-large [class^="icon-"] { + margin-top: 2px; +} + +.btn-small { + padding: 3px 9px; + font-size: 12px; + line-height: 18px; +} + +.btn-small [class^="icon-"] { + margin-top: 0; +} + +.btn-mini { + padding: 2px 6px; + font-size: 11px; + line-height: 17px; +} + +.btn-block { + display: block; + width: 100%; + padding-right: 0; + padding-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.btn-block + .btn-block { + margin-top: 5px; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} + +.btn { + border-color: #c5c5c5; + border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25); +} + +.btn-primary { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #006dcc; + *background-color: #0044cc; + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(to bottom, #0088cc, #0044cc); + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-repeat: repeat-x; + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-primary:hover, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + color: #ffffff; + background-color: #0044cc; + *background-color: #003bb3; +} + +.btn-primary:active, +.btn-primary.active { + background-color: #003399 \9; +} + +.btn-warning { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #faa732; + *background-color: #f89406; + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-repeat: repeat-x; + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-warning:hover, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + color: #ffffff; + background-color: #f89406; + *background-color: #df8505; +} + +.btn-warning:active, +.btn-warning.active { + background-color: #c67605 \9; +} + +.btn-danger { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #da4f49; + *background-color: #bd362f; + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-repeat: repeat-x; + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-danger:hover, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + color: #ffffff; + background-color: #bd362f; + *background-color: #a9302a; +} + +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} + +.btn-success { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #5bb75b; + *background-color: #51a351; + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(to bottom, #62c462, #51a351); + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-repeat: repeat-x; + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + color: #ffffff; + background-color: #51a351; + *background-color: #499249; +} + +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} + +.btn-info { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #49afcd; + *background-color: #2f96b4; + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-repeat: repeat-x; + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-info:hover, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + color: #ffffff; + background-color: #2f96b4; + *background-color: #2a85a0; +} + +.btn-info:active, +.btn-info.active { + background-color: #24748c \9; +} + +.btn-inverse { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #363636; + *background-color: #222222; + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); + background-image: -webkit-linear-gradient(top, #444444, #222222); + background-image: -o-linear-gradient(top, #444444, #222222); + background-image: linear-gradient(to bottom, #444444, #222222); + background-image: -moz-linear-gradient(top, #444444, #222222); + background-repeat: repeat-x; + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-inverse:hover, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + color: #ffffff; + background-color: #222222; + *background-color: #151515; +} + +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} + +button.btn, +input[type="submit"].btn { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} + +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} + +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} + +.btn-link, +.btn-link:active, +.btn-link[disabled] { + background-color: transparent; + background-image: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-link { + color: #0088cc; + cursor: pointer; + border-color: transparent; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-link:hover { + color: #005580; + text-decoration: underline; + background-color: transparent; +} + +.btn-link[disabled]:hover { + color: #333333; + text-decoration: none; +} + +.btn-group { + position: relative; + *margin-left: .3em; + font-size: 0; + white-space: nowrap; + vertical-align: middle; +} + +.btn-group:first-child { + *margin-left: 0; +} + +.btn-group + .btn-group { + margin-left: 5px; +} + +.btn-toolbar { + margin-top: 10px; + margin-bottom: 10px; + font-size: 0; +} + +.btn-toolbar .btn-group { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} + +.btn-toolbar .btn + .btn, +.btn-toolbar .btn-group + .btn, +.btn-toolbar .btn + .btn-group { + margin-left: 5px; +} + +.btn-group > .btn { + position: relative; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group > .btn + .btn { + margin-left: -1px; +} + +.btn-group > .btn, +.btn-group > .dropdown-menu { + font-size: 14px; +} + +.btn-group > .btn-mini { + font-size: 11px; +} + +.btn-group > .btn-small { + font-size: 12px; +} + +.btn-group > .btn-large { + font-size: 16px; +} + +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .btn + .dropdown-toggle { + *padding-top: 5px; + padding-right: 8px; + *padding-bottom: 5px; + padding-left: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group > .btn-mini + .dropdown-toggle { + *padding-top: 2px; + padding-right: 5px; + *padding-bottom: 2px; + padding-left: 5px; +} + +.btn-group > .btn-small + .dropdown-toggle { + *padding-top: 5px; + *padding-bottom: 4px; +} + +.btn-group > .btn-large + .dropdown-toggle { + *padding-top: 7px; + padding-right: 12px; + *padding-bottom: 7px; + padding-left: 12px; +} + +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} + +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #0044cc; +} + +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #f89406; +} + +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} + +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} + +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4; +} + +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222222; +} + +.btn .caret { + margin-top: 8px; + margin-left: 0; +} + +.btn-mini .caret, +.btn-small .caret, +.btn-large .caret { + margin-top: 6px; +} + +.btn-large .caret { + border-top-width: 5px; + border-right-width: 5px; + border-left-width: 5px; +} + +.dropup .btn-large .caret { + border-top: 0; + border-bottom: 5px solid #000000; +} + +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.btn-group-vertical { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} + +.btn-group-vertical .btn { + display: block; + float: none; + width: 100%; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group-vertical .btn + .btn { + margin-top: -1px; + margin-left: 0; +} + +.btn-group-vertical .btn:first-child { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.btn-group-vertical .btn:last-child { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.btn-group-vertical .btn-large:first-child { + -webkit-border-radius: 6px 6px 0 0; + -moz-border-radius: 6px 6px 0 0; + border-radius: 6px 6px 0 0; +} + +.btn-group-vertical .btn-large:last-child { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 20px; + color: #c09853; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.alert h4 { + margin: 0; +} + +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 20px; +} + +.alert-success { + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.alert-danger, +.alert-error { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7; +} + +.alert-info { + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} + +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} + +.alert-block p + p { + margin-top: 5px; +} + +.nav { + margin-bottom: 20px; + margin-left: 0; + list-style: none; +} + +.nav > li > a { + display: block; +} + +.nav > li > a:hover { + text-decoration: none; + background-color: #eeeeee; +} + +.nav > .pull-right { + float: right; +} + +.nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 20px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} + +.nav li + .nav-header { + margin-top: 9px; +} + +.nav-list { + padding-right: 15px; + padding-left: 15px; + margin-bottom: 0; +} + +.nav-list > li > a, +.nav-list .nav-header { + margin-right: -15px; + margin-left: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} + +.nav-list > li > a { + padding: 3px 15px; +} + +.nav-list > .active > a, +.nav-list > .active > a:hover { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #0088cc; +} + +.nav-list [class^="icon-"] { + margin-right: 2px; +} + +.nav-list .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.nav-tabs, +.nav-pills { + *zoom: 1; +} + +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + line-height: 0; + content: ""; +} + +.nav-tabs:after, +.nav-pills:after { + clear: both; +} + +.nav-tabs > li, +.nav-pills > li { + float: left; +} + +.nav-tabs > li > a, +.nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} + +.nav-tabs { + border-bottom: 1px solid #ddd; +} + +.nav-tabs > li { + margin-bottom: -1px; +} + +.nav-tabs > li > a { + padding-top: 8px; + padding-bottom: 8px; + line-height: 20px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #dddddd; +} + +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover { + color: #555555; + cursor: default; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} + +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.nav-pills > .active > a, +.nav-pills > .active > a:hover { + color: #ffffff; + background-color: #0088cc; +} + +.nav-stacked > li { + float: none; +} + +.nav-stacked > li > a { + margin-right: 0; +} + +.nav-tabs.nav-stacked { + border-bottom: 0; +} + +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.nav-tabs.nav-stacked > li:first-child > a { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-topleft: 4px; +} + +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomright: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.nav-tabs.nav-stacked > li > a:hover { + z-index: 2; + border-color: #ddd; +} + +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} + +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} + +.nav-tabs .dropdown-menu { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.nav-pills .dropdown-menu { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.nav .dropdown-toggle .caret { + margin-top: 6px; + border-top-color: #0088cc; + border-bottom-color: #0088cc; +} + +.nav .dropdown-toggle:hover .caret { + border-top-color: #005580; + border-bottom-color: #005580; +} + +/* move down carets for tabs */ + +.nav-tabs .dropdown-toggle .caret { + margin-top: 8px; +} + +.nav .active .dropdown-toggle .caret { + border-top-color: #fff; + border-bottom-color: #fff; +} + +.nav-tabs .active .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.nav > .dropdown.active > a:hover { + cursor: pointer; +} + +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} + +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} + +.tabs-stacked .open > a:hover { + border-color: #999999; +} + +.tabbable { + *zoom: 1; +} + +.tabbable:before, +.tabbable:after { + display: table; + line-height: 0; + content: ""; +} + +.tabbable:after { + clear: both; +} + +.tab-content { + overflow: auto; +} + +.tabs-below > .nav-tabs, +.tabs-right > .nav-tabs, +.tabs-left > .nav-tabs { + border-bottom: 0; +} + +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} + +.tab-content > .active, +.pill-content > .active { + display: block; +} + +.tabs-below > .nav-tabs { + border-top: 1px solid #ddd; +} + +.tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} + +.tabs-below > .nav-tabs > li > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.tabs-below > .nav-tabs > li > a:hover { + border-top-color: #ddd; + border-bottom-color: transparent; +} + +.tabs-below > .nav-tabs > .active > a, +.tabs-below > .nav-tabs > .active > a:hover { + border-color: transparent #ddd #ddd #ddd; +} + +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} + +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} + +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} + +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.tabs-left > .nav-tabs > li > a:hover { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} + +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} + +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} + +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.tabs-right > .nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #eeeeee #dddddd; +} + +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} + +.nav > .disabled > a { + color: #999999; +} + +.nav > .disabled > a:hover { + text-decoration: none; + cursor: default; + background-color: transparent; +} + +.navbar { + *position: relative; + *z-index: 2; + margin-bottom: 20px; + overflow: visible; + color: #777777; +} + +.navbar-inner { + min-height: 40px; + padding-right: 20px; + padding-left: 20px; + background-color: #fafafa; + background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); + background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); + background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); + background-repeat: repeat-x; + border: 1px solid #d4d4d4; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); + *zoom: 1; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); +} + +.navbar-inner:before, +.navbar-inner:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-inner:after { + clear: both; +} + +.navbar .container { + width: auto; +} + +.nav-collapse.collapse { + height: auto; +} + +.navbar .brand { + display: block; + float: left; + padding: 10px 20px 10px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + color: #777777; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .brand:hover { + text-decoration: none; +} + +.navbar-text { + margin-bottom: 0; + line-height: 40px; +} + +.navbar-link { + color: #777777; +} + +.navbar-link:hover { + color: #333333; +} + +.navbar .divider-vertical { + height: 40px; + margin: 0 9px; + border-right: 1px solid #ffffff; + border-left: 1px solid #f2f2f2; +} + +.navbar .btn, +.navbar .btn-group { + margin-top: 5px; +} + +.navbar .btn-group .btn, +.navbar .input-prepend .btn, +.navbar .input-append .btn { + margin-top: 0; +} + +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} + +.navbar-form:before, +.navbar-form:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-form:after { + clear: both; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .radio, +.navbar-form .checkbox { + margin-top: 5px; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .btn { + display: inline-block; + margin-bottom: 0; +} + +.navbar-form input[type="image"], +.navbar-form input[type="checkbox"], +.navbar-form input[type="radio"] { + margin-top: 3px; +} + +.navbar-form .input-append, +.navbar-form .input-prepend { + margin-top: 6px; + white-space: nowrap; +} + +.navbar-form .input-append input, +.navbar-form .input-prepend input { + margin-top: 0; +} + +.navbar-search { + position: relative; + float: left; + margin-top: 5px; + margin-bottom: 0; +} + +.navbar-search .search-query { + padding: 4px 14px; + margin-bottom: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.navbar-static-top { + position: static; + width: 100%; + margin-bottom: 0; +} + +.navbar-static-top .navbar-inner { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + margin-bottom: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + border-width: 0 0 1px; +} + +.navbar-fixed-bottom .navbar-inner { + border-width: 1px 0 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-right: 0; + padding-left: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.navbar-fixed-top { + top: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar-fixed-bottom { + bottom: 0; +} + +.navbar-fixed-bottom .navbar-inner { + -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} + +.navbar .nav.pull-right { + float: right; + margin-right: 0; +} + +.navbar .nav > li { + float: left; +} + +.navbar .nav > li > a { + float: none; + padding: 10px 15px 10px; + color: #777777; + text-decoration: none; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .nav .dropdown-toggle .caret { + margin-top: 8px; +} + +.navbar .nav > li > a:focus, +.navbar .nav > li > a:hover { + color: #333333; + text-decoration: none; + background-color: transparent; +} + +.navbar .nav > .active > a, +.navbar .nav > .active > a:hover, +.navbar .nav > .active > a:focus { + color: #555555; + text-decoration: none; + background-color: #e5e5e5; + -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); +} + +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-right: 5px; + margin-left: 5px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #ededed; + *background-color: #e5e5e5; + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); + background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); + background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); + background-repeat: repeat-x; + border-color: #e5e5e5 #e5e5e5 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); +} + +.navbar .btn-navbar:hover, +.navbar .btn-navbar:active, +.navbar .btn-navbar.active, +.navbar .btn-navbar.disabled, +.navbar .btn-navbar[disabled] { + color: #ffffff; + background-color: #e5e5e5; + *background-color: #d9d9d9; +} + +.navbar .btn-navbar:active, +.navbar .btn-navbar.active { + background-color: #cccccc \9; +} + +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} + +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} + +.navbar .nav > li > .dropdown-menu:before { + position: absolute; + top: -7px; + left: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.navbar .nav > li > .dropdown-menu:after { + position: absolute; + top: -6px; + left: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + border-left: 6px solid transparent; + content: ''; +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:before { + top: auto; + bottom: -7px; + border-top: 7px solid #ccc; + border-bottom: 0; + border-top-color: rgba(0, 0, 0, 0.2); +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:after { + top: auto; + bottom: -6px; + border-top: 6px solid #ffffff; + border-bottom: 0; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + color: #555555; + background-color: #e5e5e5; +} + +.navbar .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #777777; + border-bottom-color: #777777; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.navbar .pull-right > li > .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:before, +.navbar .nav > li > .dropdown-menu.pull-right:before { + right: 12px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:after, +.navbar .nav > li > .dropdown-menu.pull-right:after { + right: 13px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { + right: 100%; + left: auto; + margin-right: -1px; + margin-left: 0; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.navbar-inverse { + color: #999999; +} + +.navbar-inverse .navbar-inner { + background-color: #1b1b1b; + background-image: -moz-linear-gradient(top, #222222, #111111); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); + background-image: -webkit-linear-gradient(top, #222222, #111111); + background-image: -o-linear-gradient(top, #222222, #111111); + background-image: linear-gradient(to bottom, #222222, #111111); + background-repeat: repeat-x; + border-color: #252525; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); +} + +.navbar-inverse .brand, +.navbar-inverse .nav > li > a { + color: #999999; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.navbar-inverse .brand:hover, +.navbar-inverse .nav > li > a:hover { + color: #ffffff; +} + +.navbar-inverse .nav > li > a:focus, +.navbar-inverse .nav > li > a:hover { + color: #ffffff; + background-color: transparent; +} + +.navbar-inverse .nav .active > a, +.navbar-inverse .nav .active > a:hover, +.navbar-inverse .nav .active > a:focus { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .navbar-link { + color: #999999; +} + +.navbar-inverse .navbar-link:hover { + color: #ffffff; +} + +.navbar-inverse .divider-vertical { + border-right-color: #222222; + border-left-color: #111111; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #999999; + border-bottom-color: #999999; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .navbar-search .search-query { + color: #ffffff; + background-color: #515151; + border-color: #111111; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + transition: none; +} + +.navbar-inverse .navbar-search .search-query:-moz-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:focus, +.navbar-inverse .navbar-search .search-query.focused { + padding: 5px 15px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + outline: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); +} + +.navbar-inverse .btn-navbar { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e0e0e; + *background-color: #040404; + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); + background-image: -webkit-linear-gradient(top, #151515, #040404); + background-image: -o-linear-gradient(top, #151515, #040404); + background-image: linear-gradient(to bottom, #151515, #040404); + background-image: -moz-linear-gradient(top, #151515, #040404); + background-repeat: repeat-x; + border-color: #040404 #040404 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.navbar-inverse .btn-navbar:hover, +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active, +.navbar-inverse .btn-navbar.disabled, +.navbar-inverse .btn-navbar[disabled] { + color: #ffffff; + background-color: #040404; + *background-color: #000000; +} + +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active { + background-color: #000000 \9; +} + +.breadcrumb { + padding: 8px 15px; + margin: 0 0 20px; + list-style: none; + background-color: #f5f5f5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.breadcrumb li { + display: inline-block; + *display: inline; + text-shadow: 0 1px 0 #ffffff; + *zoom: 1; +} + +.breadcrumb .divider { + padding: 0 5px; + color: #ccc; +} + +.breadcrumb .active { + color: #999999; +} + +.pagination { + height: 40px; + margin: 20px 0; +} + +.pagination ul { + display: inline-block; + *display: inline; + margin-bottom: 0; + margin-left: 0; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + *zoom: 1; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.pagination ul > li { + display: inline; +} + +.pagination ul > li > a, +.pagination ul > li > span { + float: left; + padding: 0 14px; + line-height: 38px; + text-decoration: none; + background-color: #ffffff; + border: 1px solid #dddddd; + border-left-width: 0; +} + +.pagination ul > li > a:hover, +.pagination ul > .active > a, +.pagination ul > .active > span { + background-color: #f5f5f5; +} + +.pagination ul > .active > a, +.pagination ul > .active > span { + color: #999999; + cursor: default; +} + +.pagination ul > .disabled > span, +.pagination ul > .disabled > a, +.pagination ul > .disabled > a:hover { + color: #999999; + cursor: default; + background-color: transparent; +} + +.pagination ul > li:first-child > a, +.pagination ul > li:first-child > span { + border-left-width: 1px; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} + +.pagination ul > li:last-child > a, +.pagination ul > li:last-child > span { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} + +.pagination-centered { + text-align: center; +} + +.pagination-right { + text-align: right; +} + +.pager { + margin: 20px 0; + text-align: center; + list-style: none; + *zoom: 1; +} + +.pager:before, +.pager:after { + display: table; + line-height: 0; + content: ""; +} + +.pager:after { + clear: both; +} + +.pager li { + display: inline; +} + +.pager a, +.pager span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.pager a:hover { + text-decoration: none; + background-color: #f5f5f5; +} + +.pager .next a, +.pager .next span { + float: right; +} + +.pager .previous a { + float: left; +} + +.pager .disabled a, +.pager .disabled a:hover, +.pager .disabled span { + color: #999999; + cursor: default; + background-color: #fff; +} + +.modal-open .modal .dropdown-menu { + z-index: 2050; +} + +.modal-open .modal .dropdown.open { + *z-index: 2050; +} + +.modal-open .modal .popover { + z-index: 2060; +} + +.modal-open .modal .tooltip { + z-index: 2080; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.modal { + position: fixed; + top: 50%; + left: 50%; + z-index: 1050; + width: 560px; + margin: -250px 0 0 -280px; + overflow: auto; + background-color: #ffffff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} + +.modal.fade { + top: -25%; + -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; + -moz-transition: opacity 0.3s linear, top 0.3s ease-out; + -o-transition: opacity 0.3s linear, top 0.3s ease-out; + transition: opacity 0.3s linear, top 0.3s ease-out; +} + +.modal.fade.in { + top: 50%; +} + +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} + +.modal-header .close { + margin-top: 2px; +} + +.modal-header h3 { + margin: 0; + line-height: 30px; +} + +.modal-body { + max-height: 400px; + padding: 15px; + overflow-y: auto; +} + +.modal-form { + margin-bottom: 0; +} + +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} + +.modal-footer:before, +.modal-footer:after { + display: table; + line-height: 0; + content: ""; +} + +.modal-footer:after { + clear: both; +} + +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} + +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} + +.tooltip { + position: absolute; + z-index: 1030; + display: block; + padding: 5px; + font-size: 11px; + opacity: 0; + filter: alpha(opacity=0); + visibility: visible; +} + +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.tooltip.top { + margin-top: -3px; +} + +.tooltip.right { + margin-left: 3px; +} + +.tooltip.bottom { + margin-top: 3px; +} + +.tooltip.left { + margin-left: -3px; +} + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top-color: #000000; + border-width: 5px 5px 0; +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-right-color: #000000; + border-width: 5px 5px 5px 0; +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-left-color: #000000; + border-width: 5px 0 5px 5px; +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-bottom-color: #000000; + border-width: 0 5px 5px; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + width: 236px; + padding: 1px; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.popover.top { + margin-bottom: 10px; +} + +.popover.right { + margin-left: 10px; +} + +.popover.bottom { + margin-top: 10px; +} + +.popover.left { + margin-right: 10px; +} + +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + -webkit-border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} + +.popover-content { + padding: 9px 14px; +} + +.popover-content p, +.popover-content ul, +.popover-content ol { + margin-bottom: 0; +} + +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: inline-block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.popover .arrow:after { + z-index: -1; + content: ""; +} + +.popover.top .arrow { + bottom: -10px; + left: 50%; + margin-left: -10px; + border-top-color: #ffffff; + border-width: 10px 10px 0; +} + +.popover.top .arrow:after { + bottom: -1px; + left: -11px; + border-top-color: rgba(0, 0, 0, 0.25); + border-width: 11px 11px 0; +} + +.popover.right .arrow { + top: 50%; + left: -10px; + margin-top: -10px; + border-right-color: #ffffff; + border-width: 10px 10px 10px 0; +} + +.popover.right .arrow:after { + bottom: -11px; + left: -1px; + border-right-color: rgba(0, 0, 0, 0.25); + border-width: 11px 11px 11px 0; +} + +.popover.bottom .arrow { + top: -10px; + left: 50%; + margin-left: -10px; + border-bottom-color: #ffffff; + border-width: 0 10px 10px; +} + +.popover.bottom .arrow:after { + top: -1px; + left: -11px; + border-bottom-color: rgba(0, 0, 0, 0.25); + border-width: 0 11px 11px; +} + +.popover.left .arrow { + top: 50%; + right: -10px; + margin-top: -10px; + border-left-color: #ffffff; + border-width: 10px 0 10px 10px; +} + +.popover.left .arrow:after { + right: -1px; + bottom: -11px; + border-left-color: rgba(0, 0, 0, 0.25); + border-width: 11px 0 11px 11px; +} + +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; +} + +.thumbnails:before, +.thumbnails:after { + display: table; + line-height: 0; + content: ""; +} + +.thumbnails:after { + clear: both; +} + +.row-fluid .thumbnails { + margin-left: 0; +} + +.thumbnails > li { + float: left; + margin-bottom: 20px; + margin-left: 20px; +} + +.thumbnail { + display: block; + padding: 4px; + line-height: 20px; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +a.thumbnail:hover { + border-color: #0088cc; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} + +.thumbnail > img { + display: block; + max-width: 100%; + margin-right: auto; + margin-left: auto; +} + +.thumbnail .caption { + padding: 9px; + color: #555555; +} + +.label, +.badge { + font-size: 11.844px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + white-space: nowrap; + vertical-align: baseline; + background-color: #999999; +} + +.label { + padding: 1px 4px 2px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.badge { + padding: 1px 9px 2px; + -webkit-border-radius: 9px; + -moz-border-radius: 9px; + border-radius: 9px; +} + +a.label:hover, +a.badge:hover { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.label-important, +.badge-important { + background-color: #b94a48; +} + +.label-important[href], +.badge-important[href] { + background-color: #953b39; +} + +.label-warning, +.badge-warning { + background-color: #f89406; +} + +.label-warning[href], +.badge-warning[href] { + background-color: #c67605; +} + +.label-success, +.badge-success { + background-color: #468847; +} + +.label-success[href], +.badge-success[href] { + background-color: #356635; +} + +.label-info, +.badge-info { + background-color: #3a87ad; +} + +.label-info[href], +.badge-info[href] { + background-color: #2d6987; +} + +.label-inverse, +.badge-inverse { + background-color: #333333; +} + +.label-inverse[href], +.badge-inverse[href] { + background-color: #1a1a1a; +} + +.btn .label, +.btn .badge { + position: relative; + top: -1px; +} + +.btn-mini .label, +.btn-mini .badge { + top: 0; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress .bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + color: #ffffff; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(to bottom, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress .bar + .bar { + -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); +} + +.progress-striped .bar { + background-color: #149bdf; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} + +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} + +.progress-danger .bar, +.progress .bar-danger { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); +} + +.progress-danger.progress-striped .bar, +.progress-striped .bar-danger { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-success .bar, +.progress .bar-success { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(to bottom, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); +} + +.progress-success.progress-striped .bar, +.progress-striped .bar-success { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-info .bar, +.progress .bar-info { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(to bottom, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); +} + +.progress-info.progress-striped .bar, +.progress-striped .bar-info { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-warning .bar, +.progress .bar-warning { + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); +} + +.progress-warning.progress-striped .bar, +.progress-striped .bar-warning { + background-color: #fbb450; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.accordion { + margin-bottom: 20px; +} + +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.accordion-heading { + border-bottom: 0; +} + +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} + +.accordion-toggle { + cursor: pointer; +} + +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} + +.carousel { + position: relative; + margin-bottom: 20px; + line-height: 1; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + -moz-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} + +.carousel .item > img { + display: block; + line-height: 1; +} + +.carousel .active, +.carousel .next, +.carousel .prev { + display: block; +} + +.carousel .active { + left: 0; +} + +.carousel .next, +.carousel .prev { + position: absolute; + top: 0; + width: 100%; +} + +.carousel .next { + left: 100%; +} + +.carousel .prev { + left: -100%; +} + +.carousel .next.left, +.carousel .prev.right { + left: 0; +} + +.carousel .active.left { + left: -100%; +} + +.carousel .active.right { + left: 100%; +} + +.carousel-control { + position: absolute; + top: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); +} + +.carousel-control.right { + right: 15px; + left: auto; +} + +.carousel-control:hover { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} + +.carousel-caption { + position: absolute; + right: 0; + bottom: 0; + left: 0; + padding: 15px; + background: #333333; + background: rgba(0, 0, 0, 0.75); +} + +.carousel-caption h4, +.carousel-caption p { + line-height: 20px; + color: #ffffff; +} + +.carousel-caption h4 { + margin: 0 0 5px; +} + +.carousel-caption p { + margin-bottom: 0; +} + +.hero-unit { + padding: 60px; + margin-bottom: 30px; + background-color: #eeeeee; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + letter-spacing: -1px; + color: inherit; +} + +.hero-unit p { + font-size: 18px; + font-weight: 200; + line-height: 30px; + color: inherit; +} + +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +.hide { + display: none; +} + +.show { + display: block; +} + +.invisible { + visibility: hidden; +} + +.affix { + position: fixed; +} \ No newline at end of file diff --git a/css/default.css b/css/default.css new file mode 100644 index 000000000..af6a9cc03 --- /dev/null +++ b/css/default.css @@ -0,0 +1,309 @@ +/* Set the body padding-top when above 980px to push the content down from + below the navbar, which is fixed at >980px screen widths. */ +pre { + font-size: 12px; +} + +.dropdown .dropdown-menu { + display: none; +} + +.dropdown.open .dropdown-menu { + display: block; +} + +@media (max-width: 480px) { + .repo-link { + display: none; + } +} + +/* Header link to GitHub */ +.repo-link { + float: right; + margin-right: 10px; + margin-top: 9px; +} + +body.index-page #main-content p.badges { + padding-bottom: 1px; +} + +/* GitHub 'Star' badge */ +body.index-page #main-content iframe.github-star-button { + float: right; + margin-top: -12px; + margin-right: -15px; +} + +/* Tweet button */ +body.index-page #main-content iframe.twitter-share-button { + float: right; + margin-top: -12px; + margin-right: 8px; +} + +/* Travis CI badge */ +body.index-page #main-content img.travis-build-image { + float: right; + margin-right: 8px; + margin-top: -11px; + margin-bottom: 0px; +} + +/* Github source file badges */ +a.github { + float: right; + margin-top: -12px; + margin-right: 12px; +} + +a.github:hover { + text-decoration: none; +} + +/* */ +body hr { + border-top: 1px dotted #A30000; +} + +/* Force TOC text to not overrun */ +#table-of-contents { + overflow: hidden; + margin: 0 0 20px 0; +} + +/* Code blocks should scroll horizontally */ +pre { + overflow: auto; + word-wrap: normal; + white-space: pre; +} + +/* Preserve the spacing of the navbar across different screen sizes. */ +.navbar-inner { + /*padding: 5px 0;*/ +} + +@media (max-width: 979px) { + .navbar .brand { + margin-left: 0; + padding-left: 0; + } + .navbar-inner .container-fluid { + padding-left: 15px; + } +} + +.nav-list li.main { + font-weight: bold; +} + +.nav-list a { + overflow: hidden; +} + +.nav-list > li > a { + padding: 2px 15px 3px; +} + +/* Set the table of contents to static so it flows back into the content when + viewed on tablets and smaller. */ +@media (max-width: 767px) { + #table-of-contents { + position: static; + } +} + +/* When the page is in two-column layout, give the main content some room + to breath on the left. */ +@media (min-width: 768px) { + #main-content { + padding-left: 1em; + } +} + +/* Cutesy quote styling */ +blockquote { + font-family: Georgia, serif; + font-size: 18px; + font-style: italic; + margin: 0.25em 0; + padding: 0.25em 40px; + line-height: 1.45; + position: relative; + color: #383838; + border-left: none; +} + +blockquote:before { + display: block; + content: "\201C"; + font-size: 80px; + position: absolute; + left: -10px; + top: -20px; + color: #7a7a7a; +} + +blockquote p:last-child { + color: #999999; + font-size: 14px; + display: block; + margin-top: 5px; +} + + +/*=== dabapps bootstrap styles ====*/ + +html{ + width:100%; + background: none; +} + +body, .navbar .navbar-inner .container-fluid{ + max-width: 1150px; + margin: 0 auto; +} + +body{ + background: url("../img/grid.png") repeat-x; + background-attachment: fixed; +} + +/* custom navigation styles */ + +.navbar .navbar-inner{ + background: #2C2C2C; + color: white; + border: none; + border-top: 5px solid #A30000; +} + +.navbar .navbar-inner .nav li, .navbar .navbar-inner .nav li a, .navbar .navbar-inner .brand{ + color: white; +} + +.nav-list > .active > a, .navbar .navbar-inner .nav li a:hover { + background:#212121; + color:white; +} + +.navbar .navbar-inner .dropdown-menu li a, .navbar .navbar-inner .dropdown-menu li{ + color: #A30000; +} +.navbar .navbar-inner .dropdown-menu li a:hover{ + background: #eeeeee; + color: #c20000; +} + +/* custom general page styles */ +.hero-unit h2, .hero-unit h1{ + color: #A30000; +} + +body a{ + color: #A30000; +} + +body a:hover{ + color: #c20000; +} + +/* subnavigation styles */ + +@media (min-width: 767px) { + .sidebar-nav-fixed { + position:fixed; + width:19%; + max-width: 240px; + } + + .navbar { + position: fixed; + } + .navbar .navbar-inner .container-fluid{ + max-width: 1110px; + } +} + +/* sticky footer and footer */ +html, body { + height: 100%; +} +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -60px; +} + +.body-content{ + padding-top: 70px; + padding-bottom: 70px; +} + +@media (max-width: 979px) { + .navbar-fixed-top .navbar-inner { + padding: 0px; + } +} + +@media (max-width: 767px) { + .body-content{ + padding-top: 0px; + } +} + +@media (min-width: 768px) { + footer.span12 { + width: 95%; + } +} + +footer, .push { + height: 60px; /* .push must be the same height as .footer */ +} + + +footer p { + text-align: center; + color: gray; + border-top: 1px solid #DDD; + padding-top: 10px; +} + +footer a { + color: gray; + font-weight: bold; +} + +footer a:hover { + color: gray; +} + +.btn-inverse { + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#606060), to(#404040)) !important; + background-image: -webkit-linear-gradient(top, #606060, #404040) !important; +} + +.modal-open .modal,.btn:focus{outline:none;} + +@media (max-width: 650px) { + .repo-link.btn-inverse {display: none;} +} + +td, th { + padding: 0.25em; + background-color: #f7f7f9; + border-color: #e1e1e8; +} + +table { + border-color: white; + margin-bottom: 0.6em; +} + +.side-nav { + overflow-y: scroll; +} diff --git a/css/prettify.css b/css/prettify.css new file mode 100644 index 000000000..d437aff62 --- /dev/null +++ b/css/prettify.css @@ -0,0 +1,30 @@ +.com { color: #93a1a1; } +.lit { color: #195f91; } +.pun, .opn, .clo { color: #93a1a1; } +.fun { color: #dc322f; } +.str, .atv { color: #D14; } +.kwd, .prettyprint .tag { color: #1e347b; } +.typ, .atn, .dec, .var { color: teal; } +.pln { color: #48484c; } + +.prettyprint { + padding: 8px; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} +.prettyprint.linenums { + -webkit-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; + -moz-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; + box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; +} + +/* Specify class=linenums on a pre to get line numbering */ +ol.linenums { + margin: 0 0 0 33px; /* IE indents via margin-left */ +} +ol.linenums li { + padding-left: 12px; + color: #bebec5; + line-height: 20px; + text-shadow: 0 1px 0 #fff; +} \ No newline at end of file diff --git a/img/apiary.png b/img/apiary.png new file mode 100644 index 0000000000000000000000000000000000000000..923d384ebb66d833b13b9971cda69eb718651c1d GIT binary patch literal 55554 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 literal 0 HcmV?d00001 diff --git a/img/autocomplete.png b/img/autocomplete.png new file mode 100644 index 0000000000000000000000000000000000000000..29075b257ccfc85c0939fd9ddcc000243c0ab4ba GIT binary patch literal 58140 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

`IFPYHfaS7A8ra9IoG7nM&FQf50 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

2uL8;M5V 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%0DKmcp}ZuW{RDV)J%|v!07N2x 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%0D(6%`>FHckpDt$oGc4=IC`V= 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 literal 0 HcmV?d00001 diff --git a/img/favicon.ico b/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..917892ad576c782eee7ea81d56ef571717046d63 GIT binary patch literal 2238 zcmeH|F%H5o3`HG4f{l%}8My@Oy2O>!u&%R~94h!*QK$bC>7ee?=r7@l#fcx+>i4k$A*se2uP_XRm*FWN62(-5wI0H*6@MgRZ+ literal 0 HcmV?d00001 diff --git a/img/glyphicons-halflings-white.png b/img/glyphicons-halflings-white.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf6484a29d8da269f9bc874b25493a45fae3bae GIT binary patch literal 8777 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 B7G?kd literal 0 HcmV?d00001 diff --git a/img/glyphicons-halflings.png b/img/glyphicons-halflings.png new file mode 100644 index 0000000000000000000000000000000000000000..a9969993201f9cee63cf9f49217646347297b643 GIT binary patch literal 12799 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 literal 0 HcmV?d00001 diff --git a/img/grid.png b/img/grid.png new file mode 100644 index 0000000000000000000000000000000000000000..878c3ed5c196539c4e2da35b7787ab08e98b9cca GIT binary patch literal 1458 zcmeAS@N?(olHy`uVBq!ia0vp^Q49=>MjUKFR#nCEMj*vm;1OBOz`!jG!i)^F=12fl zLsS+C#C9D4%n8IWc}2f)ZEm(l45;BJwtuC;Xu7MDalsFrAb+- z$t7TS!;J%bz$r0ZA4%9oA5*oBKFCE#E`)d=EDH3$9hZ$hJS^?Fp4#&|GB7Z|@^o^SSJTd6tq0S!DeK!2h*Tl*`P5Yzc8-3Bx*#7*P z_lIZyDoaaS`}OwX=Dx>2?#BS1xgR(Q!d=p|X>EOCN` zXA4VQu*xH8*v`wH|7Kg_&!-n1cjuav&3^o%1B-!38l2qsw5vX{)ww9+?vCFTf>ud~ zg*GO3KC`e=!r@T3xzf`*c)d-IUlfFk;PBjy4K6tmi!A&4@cAEP$Px9s?lqTci7~T+ z-}^{4afY_30{uixxSHt*N>9t^Tda&0H5mQ_1`yCs#p`NH*8Km)_~-KFoNo=!_8c#s zWAa>N-HQ`bo%5fbxey)esBZQ2{nIXNu`Os-bmok|{*PU&?;Wq;K7ViC-rR_~+KOL= zH4)jidxUns0>)Izao*FaI~PF{%uT~Dk@j=8|5Dta{K8wv>d|%Hcb{Lgz3+r2sU6kg zmTAw9&-`i8w14I8wx>P5N6NF;+MlVs*O$JfT6WJou)_P>@A@uXTleG5F;Ur%rwkr} z9Cy=jOL!Yh{`u60)j+55f37_IN$UUe9sghL7uuB@5hwlYz5Q2Eoi? z8|G~6tcc3~n|batFcfpX-rfHA^NYK3=QY>WxaPaUGs?d6cXxkJIsW|O^e4z^d}6ZQ z{XhH5lWzwfnEw0KbC6*c*P{6UH^(HL+Z_Lz)%(e&^e>X(pJ#64-W$DObB_40RoL^? hufEOi_HxMn8q`N^vy1O?BNXG`Gn}2Q3^Stl* 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 aw|wZ70#vl|AAy6>q{S7)%0%D1`#%6AGMOC! literal 0 HcmV?d00001 diff --git a/img/rest-framework-docs.png b/img/rest-framework-docs.png new file mode 100644 index 0000000000000000000000000000000000000000..736a0095500cce86611e6fa80ddabbdedb878f4e GIT binary patch literal 76612 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

yMZfoSE<{aD_|fOb~6MCO4H4^wZO- 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�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 z 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 Q8{nT1pEz&HHw~}<2TrG-+W-In literal 0 HcmV?d00001 diff --git a/img/slate.png b/img/slate.png new file mode 100644 index 0000000000000000000000000000000000000000..31644eafe827c7b550f6a5d0c01cf87924a4cf7f GIT binary patch literal 65706 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 + + + + Django REST framework - APIs made easy + + + + + + + + + + + + + + + + + + +

+ + + +
+
+ + + + +
+ +
+ +
+ + + + +
+
+ +
+

+ + + + + + +

+ +

Django REST framework

+

Awesome web-browsable Web APIs.

+

Django REST framework is a powerful and flexible toolkit that makes it easy to build Web APIs.

+

Some reasons you might want to use REST framework:

+ +

There is a live example API for testing purposes, available here.

+

Below: Screenshot from the browsable API

+

Screenshot

+

Requirements

+

REST framework requires the following:

+
    +
  • Python (2.6.5+, 2.7, 3.2, 3.3)
  • +
  • Django (1.3, 1.4, 1.5, 1.6)
  • +
+

The following packages are optional:

+ +

Note: The oauth2 Python package is badly misnamed, and actually provides OAuth 1.0a support. Also note that packages required for both OAuth 1.0a, and OAuth 2.0 are not yet Python 3 compatible.

+

Installation

+

Install using pip, including any optional packages you want...

+
pip install djangorestframework
+pip install markdown       # Markdown support for the browsable API.
+pip install django-filter  # Filtering support
+
+

...or clone the project from github.

+
git clone git@github.com:tomchristie/django-rest-framework.git
+
+

Add 'rest_framework' to your INSTALLED_APPS setting.

+
INSTALLED_APPS = (
+    ...
+    'rest_framework',        
+)
+
+

If you're intending to use the browsable API you'll probably also want to add REST framework's login and logout views. Add the following to your root urls.py file.

+
urlpatterns = patterns('',
+    ...
+    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
+)
+
+

Note that the URL path can be whatever you want, but you must include 'rest_framework.urls' with the 'rest_framework' namespace.

+

Example

+

Let's take a look at a quick example of using REST framework to build a simple model-backed API.

+

We'll create a read-write API for accessing users and groups.

+

Any global settings for a REST framework API are kept in a single configuration dictionary named REST_FRAMEWORK. Start off by adding the following to your settings.py module:

+
REST_FRAMEWORK = {
+    # Use hyperlinked styles by default.
+    # Only used if the `serializer_class` attribute is not set on a view.
+    'DEFAULT_MODEL_SERIALIZER_CLASS':
+        'rest_framework.serializers.HyperlinkedModelSerializer',
+
+    # Use Django's standard `django.contrib.auth` permissions,
+    # or allow read-only access for unauthenticated users.
+    'DEFAULT_PERMISSION_CLASSES': [
+        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
+    ]
+}
+
+

Don't forget to make sure you've also added rest_framework to your INSTALLED_APPS.

+

We're ready to create our API now. +Here's our project's root urls.py module:

+
from django.conf.urls.defaults import url, patterns, include
+from django.contrib.auth.models import User, Group
+from rest_framework import viewsets, routers
+
+# ViewSets define the view behavior.
+class UserViewSet(viewsets.ModelViewSet):
+    model = User
+
+class GroupViewSet(viewsets.ModelViewSet):
+    model = Group
+
+
+# Routers provide an easy way of automatically determining the URL conf
+router = routers.DefaultRouter()
+router.register(r'users', UserViewSet)
+router.register(r'groups', GroupViewSet)
+
+
+# Wire up our API using automatic URL routing.
+# Additionally, we include login URLs for the browseable API.
+urlpatterns = patterns('',
+    url(r'^', include(router.urls)),
+    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
+)
+
+

Quickstart

+

Can't wait to get started? The quickstart guide is the fastest way to get up and running, and building APIs with REST framework.

+

Tutorial

+

The tutorial will walk you through the building blocks that make up REST framework. It'll take a little while to get through, but it'll give you a comprehensive understanding of how everything fits together, and is highly recommended reading.

+ +

API Guide

+

The API guide is your complete reference manual to all the functionality provided by REST framework.

+ +

Topics

+

General guides to using REST framework.

+ +

Development

+

If you want to work on REST framework itself, clone the repository, then...

+

Build the docs:

+
./mkdocs.py
+
+

Run the tests:

+
./rest_framework/runtests/runtests.py
+
+

To run the tests against all supported configurations, first install the tox testing tool globally, using pip install tox, then simply run tox:

+
tox
+
+

Support

+

For support please see the REST framework discussion group, try the #restframework channel on irc.freenode.net, search the IRC archives, or raise a question on Stack Overflow, making sure to include the 'django-rest-framework' tag.

+

Paid support is available from DabApps, and can include work on REST framework core, or support with building your REST framework API. Please contact DabApps if you'd like to discuss commercial support options.

+

For updates on REST framework development, you may also want to follow the author on Twitter.

+

+

+

Security

+

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. The project maintainers will then work with you to resolve any issues where required, prior to any public disclosure.

+

License

+

Copyright (c) 2011-2013, Tom Christie +All rights reserved.

+

Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met:

+

Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution.

+

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

+
+
+
+
+ +
+
+ + + + + + + + + + diff --git a/js/bootstrap-2.1.1-min.js b/js/bootstrap-2.1.1-min.js new file mode 100755 index 000000000..e0b220f40 --- /dev/null +++ b/js/bootstrap-2.1.1-min.js @@ -0,0 +1,7 @@ +/** +* Bootstrap.js by @fat & @mdo +* plugins: bootstrap-transition.js, bootstrap-modal.js, bootstrap-dropdown.js, bootstrap-scrollspy.js, bootstrap-tab.js, bootstrap-tooltip.js, bootstrap-popover.js, bootstrap-affix.js, bootstrap-alert.js, bootstrap-button.js, bootstrap-collapse.js, bootstrap-carousel.js, bootstrap-typeahead.js +* Copyright 2012 Twitter, Inc. +* http://www.apache.org/licenses/LICENSE-2.0.txt +*/ +!function(a){a(function(){a.support.transition=function(){var a=function(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},c;for(c in b)if(a.style[c]!==undefined)return b[c]}();return a&&{end:a}}()})}(window.jQuery),!function(a){var b=function(b,c){this.options=c,this.$element=a(b).delegate('[data-dismiss="modal"]',"click.dismiss.modal",a.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};b.prototype={constructor:b,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var b=this,c=a.Event("show");this.$element.trigger(c);if(this.isShown||c.isDefaultPrevented())return;a("body").addClass("modal-open"),this.isShown=!0,this.escape(),this.backdrop(function(){var c=a.support.transition&&b.$element.hasClass("fade");b.$element.parent().length||b.$element.appendTo(document.body),b.$element.show(),c&&b.$element[0].offsetWidth,b.$element.addClass("in").attr("aria-hidden",!1).focus(),b.enforceFocus(),c?b.$element.one(a.support.transition.end,function(){b.$element.trigger("shown")}):b.$element.trigger("shown")})},hide:function(b){b&&b.preventDefault();var c=this;b=a.Event("hide"),this.$element.trigger(b);if(!this.isShown||b.isDefaultPrevented())return;this.isShown=!1,a("body").removeClass("modal-open"),this.escape(),a(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),a.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal()},enforceFocus:function(){var b=this;a(document).on("focusin.modal",function(a){b.$element[0]!==a.target&&!b.$element.has(a.target).length&&b.$element.focus()})},escape:function(){var a=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(b){b.which==27&&a.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var b=this,c=setTimeout(function(){b.$element.off(a.support.transition.end),b.hideModal()},500);this.$element.one(a.support.transition.end,function(){clearTimeout(c),b.hideModal()})},hideModal:function(a){this.$element.hide().trigger("hidden"),this.backdrop()},removeBackdrop:function(){this.$backdrop.remove(),this.$backdrop=null},backdrop:function(b){var c=this,d=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=a.support.transition&&d;this.$backdrop=a('