diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..4947943af --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +*.pyc +*.db +assetplatform.egg-info/* +*~ +coverage.xml +env +docs/build +html +htmlcov +examples/media/pygments/[A-Za-z0-9]* +examples/media/objectstore/[A-Za-z0-9]* +build/* +dist/* +xmlrunner/* +djangorestframework.egg-info/* +MANIFEST +.project +.pydevproject +.settings +.cache +.coverage +.tox +.DS_Store diff --git a/AUTHORS b/AUTHORS index 0da0bca82..d2f3611ee 100644 --- a/AUTHORS +++ b/AUTHORS @@ -9,6 +9,7 @@ Carles Barrobés - HEAD support. Michael Fötsch - File format support. David Larlet - OAuth support. Andrew Straw - Bugfixes. + - Bugfixes. THANKS TO: diff --git a/README b/README deleted file mode 100644 index 3c7404866..000000000 --- a/README +++ /dev/null @@ -1,99 +0,0 @@ -General Notes -------------- - -To install django-rest-framework in a virtualenv environment - - hg clone https://tomchristie@bitbucket.org/tomchristie/django-rest-framework - cd django-rest-framework/ - virtualenv --no-site-packages --distribute --python=python2.6 env - source ./env/bin/activate - pip install -r requirements.txt # django, coverage - - -To run the tests - - export PYTHONPATH=. # Ensure djangorestframework is on the PYTHONPATH - python djangorestframework/runtests/runtests.py - - -To run the test coverage report - - export PYTHONPATH=. # Ensure djangorestframework is on the PYTHONPATH - python djangorestframework/runtests/runcoverage.py - - -To run the examples - - pip install -r examples/requirements.txt # pygments, httplib2, markdown - cd examples - export PYTHONPATH=.. - python manage.py syncdb - python manage.py runserver - - -To build the documentation - - pip install -r docs/requirements.txt # sphinx - sphinx-build -c docs -b html -d docs/build docs html - - -To run the tests against the full set of supported configurations - - deactivate # Ensure we are not currently running in a virtualenv - tox - - -To create the sdist packages - - python setup.py sdist --formats=gztar,zip - - - -Release Notes -============= - -0.2.3 - - * Fix some throttling bugs - * X-Throttle header on throttling - * Support for nesting resources on related models - -0.2.2 - - * Throttling support complete - -0.2.1 - - * Couple of simple bugfixes over 0.2.0 - -0.2.0 - - * Big refactoring changes since 0.1.0, ask on the discussion group if anything isn't clear. - The public API has been massively cleaned up. Expect it to be fairly stable from here on in. - - * `Resource` becomes decoupled into `View` and `Resource`, your views should now inherit from `View`, not `Resource`. - - * The handler functions on views .get() .put() .post() etc, no longer have the `content` and `auth` args. - Use `self.CONTENT` inside a view to access the deserialized, validated content. - Use `self.user` inside a view to access the authenticated user. - - * `allowed_methods` and `anon_allowed_methods` are now defunct. if a method is defined, it's available. - The `permissions` attribute on a `View` is now used to provide generic permissions checking. - Use permission classes such as `FullAnonAccess`, `IsAuthenticated` or `IsUserOrIsAnonReadOnly` to set the permissions. - - * The `authenticators` class becomes `authentication`. Class names change to Authentication. - - * The `emitters` class becomes `renderers`. Class names change to Renderers. - - * `ResponseException` becomes `ErrorResponse`. - - * The mixin classes have been nicely refactored, the basic mixins are now `RequestMixin`, `ResponseMixin`, `AuthMixin`, and `ResourceMixin` - You can reuse these mixin classes individually without using the `View` class. - -0.1.1 - - * Final build before pulling in all the refactoring changes for 0.2, in case anyone needs to hang on to 0.1. - -0.1.0 - - * Initial release. \ No newline at end of file diff --git a/README.rst b/README.rst new file mode 100644 index 000000000..244090d83 --- /dev/null +++ b/README.rst @@ -0,0 +1,120 @@ +Django REST framework +===================== + +Django REST framework makes it easy to build well-connected, self-describing RESTful Web APIs. + +Full documentation for the project is available at http://django-rest-framework.org + +Issue tracking is on `GitHub `_. +General questions should be taken to the `discussion group `_. + + + +Installation Notes +================== + +To clone the project from GitHub using git:: + + git clone git@github.com:tomchristie/django-rest-framework.git + + +To clone the project from Bitbucket using mercurial:: + + hg clone https://tomchristie@bitbucket.org/tomchristie/django-rest-framework + + +To install django-rest-framework in a virtualenv environment:: + + cd django-rest-framework + virtualenv --no-site-packages --distribute --python=python2.6 env + source env/bin/activate + pip install -r requirements.txt # django, coverage + + +To run the tests:: + + export PYTHONPATH=. # Ensure djangorestframework is on the PYTHONPATH + python djangorestframework/runtests/runtests.py + + +To run the test coverage report:: + + export PYTHONPATH=. # Ensure djangorestframework is on the PYTHONPATH + python djangorestframework/runtests/runcoverage.py + + +To run the examples:: + + pip install -r examples/requirements.txt # pygments, httplib2, markdown + cd examples + export PYTHONPATH=.. + python manage.py syncdb + python manage.py runserver + + +To build the documentation:: + + pip install -r docs/requirements.txt # sphinx + sphinx-build -c docs -b html -d docs/build docs html + + +To run the tests against the full set of supported configurations:: + + deactivate # Ensure we are not currently running in a virtualenv + tox + + +To create the sdist packages:: + + python setup.py sdist --formats=gztar,zip + + + +Release Notes +============= + +0.2.3 + +* Fix some throttling bugs. +* X-Throttle header on throttling. +* Support for nesting resources on related models. + +0.2.2 + +* Throttling support complete. + +0.2.1 + +* Couple of simple bugfixes over 0.2.0 + +0.2.0 + +* Big refactoring changes since 0.1.0, ask on the discussion group if anything isn't clear. + The public API has been massively cleaned up. Expect it to be fairly stable from here on in. + +* `Resource` becomes decoupled into `View` and `Resource`, your views should now inherit from `View`, not `Resource`. + +* The handler functions on views .get() .put() .post() etc, no longer have the `content` and `auth` args. + Use `self.CONTENT` inside a view to access the deserialized, validated content. + Use `self.user` inside a view to access the authenticated user. + +* `allowed_methods` and `anon_allowed_methods` are now defunct. if a method is defined, it's available. + The `permissions` attribute on a `View` is now used to provide generic permissions checking. + Use permission classes such as `FullAnonAccess`, `IsAuthenticated` or `IsUserOrIsAnonReadOnly` to set the permissions. + +* The `authenticators` class becomes `authentication`. Class names change to Authentication. + +* The `emitters` class becomes `renderers`. Class names change to Renderers. + +* `ResponseException` becomes `ErrorResponse`. + +* The mixin classes have been nicely refactored, the basic mixins are now `RequestMixin`, `ResponseMixin`, `AuthMixin`, and `ResourceMixin` + You can reuse these mixin classes individually without using the `View` class. + +0.1.1 + +* Final build before pulling in all the refactoring changes for 0.2, in case anyone needs to hang on to 0.1. + +0.1.0 + +* Initial release. \ No newline at end of file diff --git a/djangorestframework/serializer.py b/djangorestframework/serializer.py index da8036e94..82aeb53f2 100644 --- a/djangorestframework/serializer.py +++ b/djangorestframework/serializer.py @@ -4,7 +4,7 @@ Customizable serialization. from django.db import models from django.db.models.query import QuerySet from django.db.models.fields.related import RelatedField -from django.utils.encoding import smart_unicode, is_protected_type +from django.utils.encoding import smart_unicode, is_protected_type, smart_str import decimal import inspect @@ -177,7 +177,7 @@ class Serializer(object): Keys serialize to their string value, unless they exist in the `rename` dict. """ - return getattr(self.rename, key, key) + return getattr(self.rename, smart_str(key), smart_str(key)) def serialize_val(self, key, obj): @@ -228,12 +228,12 @@ class Serializer(object): # serialize each required field for fname in fields: - if hasattr(self, fname): + if hasattr(self, smart_str(fname)): # check for a method 'fname' on self first meth = getattr(self, fname) if inspect.ismethod(meth) and len(inspect.getargspec(meth)[0]) == 2: obj = meth(instance) - elif hasattr(instance, fname): + elif hasattr(instance, smart_str(fname)): # now check for an attribute 'fname' on the instance obj = getattr(instance, fname) elif fname in instance: