| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 | ============
Contributing
============
Some ground rules:
* To avoid disappointment, new features should be discussed on the mailing list
  (django-oscar@googlegroups.com) before serious work starts.
* Pull requests will be rejected if sufficient tests aren't provided.
* Please update the documentation when altering behaviour or introducing new features.
* Follow the conventions (see below).
Installation
============
From zero to tests passing in 2 minutes (most of which is PIL installing)::
    git clone git@github.com:<username>/django-oscar.git
    cd django-oscar
    mkvirtualenv oscar
    ./setup.py develop
    pip install -r requirements.txt
    ./run_tests.py
Writing docs
============
There's a helper script for building the docs locally::
    cd docs
    ./test_docs.sh
Conventions
===========
General
-------
* PEP8 everywhere while remaining sensible
URLs
----
* List pages should use plurals, eg ``/products/``, ``/notifications/``
* Detail pages should simply be a PK/slug on top of the list page, eg
  ``/products/the-bible/``, ``/notifications/1/``
  
* Create pages should have 'create' as the final path segment, eg
  ``/dashboard/notifications/create/``
* Update pages are sometimes the same as detail pages (ie when in the
  dashboard).  In those cases, just use the detail convention, eg
  ``/dashboard/notifications/3/``.  If there is a distinction between the detail
  page and the update page, use ``/dashboard/notifications/3/update/``.
* Delete pages, eg /dashboard/notifications/3/delete/
View class names
----------------
Classes should be named according to::
    '%s%sView' % (class_name, verb)
For example, ``ProductUpdateView``, ``OfferCreateView`` and
``PromotionDeleteView``.  This doesn't fit all situations but it's a good basis.
 |