parts/django/docs/releases/1.2-alpha-1.txt
changeset 69 c6bca38c1cbf
equal deleted inserted replaced
68:5ff1fc726848 69:c6bca38c1cbf
       
     1 ================================
       
     2 Django 1.2 alpha 1 release notes
       
     3 ================================
       
     4 
       
     5 January 5, 2010
       
     6 
       
     7 Welcome to Django 1.2 alpha 1!
       
     8 
       
     9 This is the first in a series of preview/development releases leading up to the
       
    10 eventual release of Django 1.2, currently scheduled to take place in March 2010.
       
    11 This release is primarily targeted at developers who are interested in trying
       
    12 out new features and testing the Django codebase to help identify and resolve
       
    13 bugs prior to the final 1.2 release.
       
    14 
       
    15 As such, this release is *not* intended for production use, and any such use is
       
    16 discouraged.
       
    17 
       
    18 
       
    19 Backwards-incompatible changes in 1.2
       
    20 =====================================
       
    21 
       
    22 CSRF Protection
       
    23 ---------------
       
    24 
       
    25 There have been large changes to the way that CSRF protection works, detailed in
       
    26 :doc:`the CSRF documentaton </ref/contrib/csrf>`.  The following are the major
       
    27 changes that developers must be aware of:
       
    28 
       
    29  * ``CsrfResponseMiddleware`` and ``CsrfMiddleware`` have been deprecated, and
       
    30    **will be removed completely in Django 1.4**, in favor of a template tag that
       
    31    should be inserted into forms.
       
    32 
       
    33  * All contrib apps use a ``csrf_protect`` decorator to protect the view. This
       
    34    requires the use of the ``csrf_token`` template tag in the template, so if you
       
    35    have used custom templates for contrib views, you MUST READ THE :ref:`UPGRADE
       
    36    INSTRUCTIONS <ref-csrf-upgrading-notes>` to fix those templates.
       
    37 
       
    38  * ``CsrfViewMiddleware`` is included in :setting:`MIDDLEWARE_CLASSES` by
       
    39    default. This turns on CSRF protection by default, so that views that accept
       
    40    POST requests need to be written to work with the middleware. Instructions
       
    41    on how to do this are found in the CSRF docs.
       
    42 
       
    43  * CSRF-related code has moved from ``contrib`` to ``core`` (with
       
    44    backwards compatible imports in the old locations, which are
       
    45    deprecated).
       
    46 
       
    47 :ttag:`if` tag changes
       
    48 ----------------------
       
    49 
       
    50 Due to new features in the :ttag:`if` template tag, it no longer accepts 'and',
       
    51 'or' and 'not' as valid **variable** names.  Previously that worked in some
       
    52 cases even though these strings were normally treated as keywords.  Now, the
       
    53 keyword status is always enforced, and template code like ``{% if not %}`` or
       
    54 ``{% if and %}`` will throw a TemplateSyntaxError.
       
    55 
       
    56 ``LazyObject``
       
    57 --------------
       
    58 
       
    59 ``LazyObject`` is an undocumented utility class used for lazily wrapping other
       
    60 objects of unknown type.  In Django 1.1 and earlier, it handled introspection in
       
    61 a non-standard way, depending on wrapped objects implementing a public method
       
    62 ``get_all_members()``. Since this could easily lead to name clashes, it has been
       
    63 changed to use the standard method, involving ``__members__`` and ``__dir__()``.
       
    64 If you used ``LazyObject`` in your own code, and implemented the
       
    65 ``get_all_members()`` method for wrapped objects, you need to make the following
       
    66 changes:
       
    67 
       
    68  * If your class does not have special requirements for introspection (i.e. you
       
    69    have not implemented ``__getattr__()`` or other methods that allow for
       
    70    attributes not discoverable by normal mechanisms), you can simply remove the
       
    71    ``get_all_members()`` method.  The default implementation on ``LazyObject``
       
    72    will do the right thing.
       
    73 
       
    74  * If you have more complex requirements for introspection, first rename the
       
    75    ``get_all_members()`` method to ``__dir__()``.  This is the standard method,
       
    76    from Python 2.6 onwards, for supporting introspection.  If you are require
       
    77    support for Python < 2.6, add the following code to the class::
       
    78 
       
    79        __members__ = property(lambda self: self.__dir__())
       
    80 
       
    81 ``__dict__`` on Model instances
       
    82 -------------------------------
       
    83 
       
    84 Historically, the ``__dict__`` attribute of a model instance has only contained
       
    85 attributes corresponding to the fields on a model.
       
    86 
       
    87 In order to support multiple database configurations, Django 1.2 has
       
    88 added a ``_state`` attribute to object instances. This attribute will
       
    89 appear in ``__dict__`` for a model instance. If your code relies on
       
    90 iterating over __dict__ to obtain a list of fields, you must now
       
    91 filter the ``_state`` attribute of out ``__dict__``.
       
    92 
       
    93 ``get_db_prep_*()`` methods on Field
       
    94 ------------------------------------
       
    95 
       
    96 Prior to v1.2, a custom field had the option of defining several
       
    97 functions to support conversion of Python values into
       
    98 database-compatible values. A custom field might look something like::
       
    99 
       
   100     class CustomModelField(models.Field):
       
   101         # ...
       
   102 
       
   103         def get_db_prep_save(self, value):
       
   104             # ...
       
   105 
       
   106         def get_db_prep_value(self, value):
       
   107             # ...
       
   108 
       
   109         def get_db_prep_lookup(self, lookup_type, value):
       
   110             # ...
       
   111 
       
   112 In 1.2, these three methods have undergone a change in prototype, and
       
   113 two extra methods have been introduced::
       
   114 
       
   115     class CustomModelField(models.Field):
       
   116         # ...
       
   117 
       
   118         def get_prep_value(self, value):
       
   119             # ...
       
   120 
       
   121         def get_prep_lookup(self, lookup_type, value):
       
   122             # ...
       
   123 
       
   124         def get_db_prep_save(self, value, connection):
       
   125             # ...
       
   126 
       
   127         def get_db_prep_value(self, value, connection, prepared=False):
       
   128             # ...
       
   129 
       
   130         def get_db_prep_lookup(self, lookup_type, value, connection, prepared=False):
       
   131             # ...
       
   132 
       
   133 These changes are required to support multiple databases:
       
   134 ``get_db_prep_*`` can no longer make any assumptions regarding the
       
   135 database for which it is preparing. The ``connection`` argument now
       
   136 provides the preparation methods with the specific connection for
       
   137 which the value is being prepared.
       
   138 
       
   139 The two new methods exist to differentiate general data preparation
       
   140 requirements, and requirements that are database-specific. The
       
   141 ``prepared`` argument is used to indicate to the database preparation
       
   142 methods whether generic value preparation has been performed. If
       
   143 an unprepared (i.e., ``prepared=False``) value is provided to the
       
   144 ``get_db_prep_*()`` calls, they should invoke the corresponding
       
   145 ``get_prep_*()`` calls to perform generic data preparation.
       
   146 
       
   147 Conversion functions has been provided which will transparently
       
   148 convert functions adhering to the old prototype into functions
       
   149 compatible with the new prototype. However, this conversion function
       
   150 will be removed in Django 1.4, so you should upgrade your Field
       
   151 definitions to use the new prototype.
       
   152 
       
   153 If your ``get_db_prep_*()`` methods made no use of the database
       
   154 connection, you should be able to upgrade by renaming
       
   155 ``get_db_prep_value()`` to ``get_prep_value()`` and
       
   156 ``get_db_prep_lookup()`` to ``get_prep_lookup()`. If you require
       
   157 database specific conversions, then you will need to provide an
       
   158 implementation ``get_db_prep_*`` that uses the ``connection``
       
   159 argument to resolve database-specific values.
       
   160 
       
   161 Stateful template tags
       
   162 ----------------------
       
   163 
       
   164 Template tags that store rendering state on the node itself may experience
       
   165 problems if they are used with the new :ref:`cached
       
   166 template loader<template-loaders>`.
       
   167 
       
   168 All of the built-in Django template tags are safe to use with the cached
       
   169 loader, but if you're using custom template tags that come from third
       
   170 party packages, or that you wrote yourself, you should ensure that the
       
   171 ``Node`` implementation for each tag is thread-safe. For more
       
   172 information, see
       
   173 :ref:`template tag thread safety considerations<template_tag_thread_safety>`.
       
   174 
       
   175 Test runner exit status code
       
   176 ----------------------------
       
   177 
       
   178 The exit status code of the test runners (``tests/runtests.py`` and ``python
       
   179 manage.py test``) no longer represents the number of failed tests, since a
       
   180 failure of 256 or more tests resulted in a wrong exit status code.  The exit
       
   181 status code for the test runner is now 0 for success (no failing tests) and 1
       
   182 for any number of test failures.  If needed, the number of test failures can be
       
   183 found at the end of the test runner's output.
       
   184 
       
   185 Features deprecated in 1.2
       
   186 ==========================
       
   187 
       
   188 CSRF response rewriting middleware
       
   189 ----------------------------------
       
   190 
       
   191 ``CsrfResponseMiddleware``, the middleware that automatically inserted CSRF
       
   192 tokens into POST forms in outgoing pages, has been deprecated in favor of a
       
   193 template tag method (see above), and will be removed completely in Django
       
   194 1.4. ``CsrfMiddleware``, which includes the functionality of
       
   195 ``CsrfResponseMiddleware`` and ``CsrfViewMiddleware`` has likewise been
       
   196 deprecated.
       
   197 
       
   198 Also, the CSRF module has moved from contrib to core, and the old imports are
       
   199 deprecated, as described in the :ref:`upgrading notes <ref-csrf-upgrading-notes>`.
       
   200 
       
   201 ``SMTPConnection``
       
   202 ------------------
       
   203 
       
   204 The ``SMTPConnection`` class has been deprecated in favor of a generic
       
   205 E-mail backend API. Old code that explicitly instantiated an instance
       
   206 of an SMTPConnection::
       
   207 
       
   208     from django.core.mail import SMTPConnection
       
   209     connection = SMTPConnection()
       
   210     messages = get_notification_email()
       
   211     connection.send_messages(messages)
       
   212 
       
   213 should now call :meth:`~django.core.mail.get_connection()` to
       
   214 instantiate a generic e-mail connection::
       
   215 
       
   216     from django.core.mail import get_connection
       
   217     connection = get_connection()
       
   218     messages = get_notification_email()
       
   219     connection.send_messages(messages)
       
   220 
       
   221 Depending on the value of the :setting:`EMAIL_BACKEND` setting, this
       
   222 may not return an SMTP connection. If you explicitly require an SMTP
       
   223 connection with which to send e-mail, you can explicitly request an
       
   224 SMTP connection::
       
   225 
       
   226     from django.core.mail import get_connection
       
   227     connection = get_connection('django.core.mail.backends.smtp.EmailBackend')
       
   228     messages = get_notification_email()
       
   229     connection.send_messages(messages)
       
   230 
       
   231 If your call to construct an instance of ``SMTPConnection`` required
       
   232 additional arguments, those arguments can be passed to the
       
   233 :meth:`~django.core.mail.get_connection()` call::
       
   234 
       
   235     connection = get_connection('django.core.mail.backends.smtp.EmailBackend', hostname='localhost', port=1234)
       
   236 
       
   237 Specifying databases
       
   238 --------------------
       
   239 
       
   240 Prior to Django 1.1, Django used a number of settings to control access to a
       
   241 single database. Django 1.2 introduces support for multiple databases, and as
       
   242 a result, the way you define database settings has changed.
       
   243 
       
   244 **Any existing Django settings file will continue to work as expected
       
   245 until Django 1.4.** Old-style database settings will be automatically
       
   246 translated to the new-style format.
       
   247 
       
   248 In the old-style (pre 1.2) format, there were a number of
       
   249 ``DATABASE_`` settings at the top level of your settings file. For
       
   250 example::
       
   251 
       
   252     DATABASE_NAME = 'test_db'
       
   253     DATABASE_ENGINE = 'postgresql_psycopg2'
       
   254     DATABASE_USER = 'myusername'
       
   255     DATABASE_PASSWORD = 's3krit'
       
   256 
       
   257 These settings are now contained inside a dictionary named
       
   258 :setting:`DATABASES`. Each item in the dictionary corresponds to a
       
   259 single database connection, with the name ``'default'`` describing the
       
   260 default database connection. The setting names have also been
       
   261 shortened to reflect the fact that they are stored in a dictionary.
       
   262 The sample settings given previously would now be stored using::
       
   263 
       
   264     DATABASES = {
       
   265         'default': {
       
   266             'NAME': 'test_db',
       
   267             'ENGINE': 'django.db.backends.postgresql_psycopg2',
       
   268             'USER': 'myusername',
       
   269             'PASSWORD': 's3krit',
       
   270         }
       
   271     }
       
   272 
       
   273 This affects the following settings:
       
   274 
       
   275     =========================================  ==========================
       
   276      Old setting                                New Setting
       
   277     =========================================  ==========================
       
   278     :setting:`DATABASE_ENGINE`                 :setting:`ENGINE`
       
   279     :setting:`DATABASE_HOST`                   :setting:`HOST`
       
   280     :setting:`DATABASE_NAME`                   :setting:`NAME`
       
   281     :setting:`DATABASE_OPTIONS`                :setting:`OPTIONS`
       
   282     :setting:`DATABASE_PASSWORD`               :setting:`PASSWORD`
       
   283     :setting:`DATABASE_PORT`                   :setting:`PORT`
       
   284     :setting:`DATABASE_USER`                   :setting:`USER`
       
   285     :setting:`TEST_DATABASE_CHARSET`           :setting:`TEST_CHARSET`
       
   286     :setting:`TEST_DATABASE_COLLATION`         :setting:`TEST_COLLATION`
       
   287     :setting:`TEST_DATABASE_NAME`              :setting:`TEST_NAME`
       
   288     =========================================  ==========================
       
   289 
       
   290 These changes are also required if you have manually created a database
       
   291 connection using ``DatabaseWrapper()`` from your database backend of choice.
       
   292 
       
   293 In addition to the change in structure, Django 1.2 removes the special
       
   294 handling for the built-in database backends. All database backends
       
   295 must now be specified by a fully qualified module name (i.e.,
       
   296 ``django.db.backends.postgresql_psycopg2``, rather than just
       
   297 ``postgresql_psycopg2``).
       
   298 
       
   299 User Messages API
       
   300 -----------------
       
   301 
       
   302 The API for storing messages in the user ``Message`` model (via
       
   303 ``user.message_set.create``) is now deprecated and will be removed in Django
       
   304 1.4 according to the standard :doc:`release process </internals/release-process>`.
       
   305 
       
   306 To upgrade your code, you need to replace any instances of::
       
   307 
       
   308     user.message_set.create('a message')
       
   309 
       
   310 with the following::
       
   311 
       
   312     from django.contrib import messages
       
   313     messages.add_message(request, messages.INFO, 'a message')
       
   314 
       
   315 Additionally, if you make use of the method, you need to replace the
       
   316 following::
       
   317 
       
   318     for message in user.get_and_delete_messages():
       
   319         ...
       
   320 
       
   321 with::
       
   322 
       
   323     from django.contrib import messages
       
   324     for message in messages.get_messages(request):
       
   325         ...
       
   326 
       
   327 For more information, see the full
       
   328 :doc:`messages documentation </ref/contrib/messages>`. You should begin to
       
   329 update your code to use the new API immediately.
       
   330 
       
   331 Date format helper functions
       
   332 ----------------------------
       
   333 
       
   334 ``django.utils.translation.get_date_formats()`` and
       
   335 ``django.utils.translation.get_partial_date_formats()`` have been deprecated
       
   336 in favor of the appropriate calls to ``django.utils.formats.get_format()``
       
   337 which is locale aware when :setting:`USE_L10N` is set to ``True``, and falls
       
   338 back to default settings if set to ``False``.
       
   339 
       
   340 To get the different date formats, instead of writing::
       
   341 
       
   342     from django.utils.translation import get_date_formats
       
   343     date_format, datetime_format, time_format = get_date_formats()
       
   344 
       
   345 use::
       
   346 
       
   347     from django.utils import formats
       
   348 
       
   349     date_format = formats.get_format('DATE_FORMAT')
       
   350     datetime_format = formats.get_format('DATETIME_FORMAT')
       
   351     time_format = formats.get_format('TIME_FORMAT')
       
   352 
       
   353 or, when directly formatting a date value::
       
   354 
       
   355     from django.utils import formats
       
   356     value_formatted = formats.date_format(value, 'DATETIME_FORMAT')
       
   357 
       
   358 The same applies to the globals found in ``django.forms.fields``:
       
   359 
       
   360   * ``DEFAULT_DATE_INPUT_FORMATS``
       
   361   * ``DEFAULT_TIME_INPUT_FORMATS``
       
   362   * ``DEFAULT_DATETIME_INPUT_FORMATS``
       
   363 
       
   364 Use ``django.utils.formats.get_format()`` to get the appropriate formats.
       
   365 
       
   366 
       
   367 What's new in Django 1.2 alpha 1
       
   368 ================================
       
   369 
       
   370 The following new features are present as of this alpha release; this
       
   371 release also marks the end of major feature development for the 1.2
       
   372 release cycle. Some minor features will continue development until the
       
   373 1.2 beta release, however.
       
   374 
       
   375 
       
   376 CSRF support
       
   377 ------------
       
   378 
       
   379 Django now has much improved protection against :doc:`Cross-Site
       
   380 Request Forgery (CSRF) attacks</ref/contrib/csrf>`. This type of attack
       
   381 occurs when a malicious Web site contains a link, a form button or
       
   382 some javascript that is intended to perform some action on your Web
       
   383 site, using the credentials of a logged-in user who visits the
       
   384 malicious site in their browser. A related type of attack, 'login
       
   385 CSRF', where an attacking site tricks a user's browser into logging
       
   386 into a site with someone else's credentials, is also covered.
       
   387 
       
   388 E-mail Backends
       
   389 ---------------
       
   390 
       
   391 You can now :ref:`configure the way that Django sends e-mail
       
   392 <topic-email-backends>`. Instead of using SMTP to send all e-mail, you
       
   393 can now choose a configurable e-mail backend to send messages. If your
       
   394 hosting provider uses a sandbox or some other non-SMTP technique for
       
   395 sending mail, you can now construct an e-mail backend that will allow
       
   396 Django's standard :doc:`mail sending methods</topics/email>` to use
       
   397 those facilities.
       
   398 
       
   399 This also makes it easier to debug mail sending - Django ships with
       
   400 backend implementations that allow you to send e-mail to a
       
   401 :ref:`file<topic-email-file-backend>`, to the
       
   402 :ref:`console<topic-email-console-backend>`, or to
       
   403 :ref:`memory<topic-email-memory-backend>` - you can even configure all
       
   404 e-mail to be :ref:`thrown away<topic-email-dummy-backend>`.
       
   405 
       
   406 Messages Framework
       
   407 ------------------
       
   408 
       
   409 Django now includes a robust and configurable :doc:`messages framework
       
   410 </ref/contrib/messages>` with built-in support for cookie- and session-based
       
   411 messaging, for both anonymous and authenticated clients. The messages framework
       
   412 replaces the deprecated user message API and allows you to temporarily store
       
   413 messages in one request and retrieve them for display in a subsequent request
       
   414 (usually the next one).
       
   415 
       
   416 Support for multiple databases
       
   417 ------------------------------
       
   418 
       
   419 Django 1.2 adds the ability to use :doc:`more than one database
       
   420 </topics/db/multi-db>` in your Django project. Queries can be
       
   421 issued at a specific database with the `using()` method on
       
   422 querysets; individual objects can be saved to a specific database
       
   423 by providing a ``using`` argument when you save the instance.
       
   424 
       
   425 'Smart' if tag
       
   426 --------------
       
   427 
       
   428 The :ttag:`if` tag has been upgraded to be much more powerful.  First, support
       
   429 for comparison operators has been added. No longer will you have to type:
       
   430 
       
   431 .. code-block:: html+django
       
   432 
       
   433     {% ifnotequal a b %}
       
   434      ...
       
   435     {% endifnotequal %}
       
   436 
       
   437 ...as you can now do:
       
   438 
       
   439 .. code-block:: html+django
       
   440 
       
   441     {% if a != b %}
       
   442      ...
       
   443     {% endif %}
       
   444 
       
   445 The operators supported are ``==``, ``!=``, ``<``, ``>``, ``<=``, ``>=`` and
       
   446 ``in``, all of which work like the Python operators, in addition to ``and``,
       
   447 ``or`` and ``not`` which were already supported.
       
   448 
       
   449 Also, filters may now be used in the ``if`` expression. For example:
       
   450 
       
   451 .. code-block:: html+django
       
   452 
       
   453       <div
       
   454         {% if user.email|lower == message.recipient|lower %}
       
   455           class="highlight"
       
   456         {% endif %}
       
   457       >{{ message }}</div>
       
   458 
       
   459 Template caching
       
   460 ----------------
       
   461 
       
   462 In previous versions of Django, every time you rendered a template it
       
   463 would be reloaded from disk. In Django 1.2, you can use a :ref:`cached
       
   464 template loader <template-loaders>` to load templates once, then use
       
   465 the cached result for every subsequent render. This can lead to a
       
   466 significant performance improvement if your templates are broken into
       
   467 lots of smaller subtemplates (using the ``{% extends %}`` or ``{%
       
   468 include %}`` tags).
       
   469 
       
   470 As a side effect, it is now much easier to support non-Django template
       
   471 languages. For more details, see the :ref:`notes on supporting
       
   472 non-Django template languages<topic-template-alternate-language>`.
       
   473 
       
   474 Natural keys in fixtures
       
   475 ------------------------
       
   476 
       
   477 Fixtures can refer to remote objects using
       
   478 :ref:`topics-serialization-natural-keys`. This lookup scheme is an
       
   479 alternative to the normal primary-key based object references in a
       
   480 fixture, improving readability, and resolving problems referring to
       
   481 objects whose primary key value may not be predictable or known.
       
   482 
       
   483 ``BigIntegerField``
       
   484 -------------------
       
   485 
       
   486 Models can now use a 64 bit :class:`~django.db.models.BigIntegerField` type.
       
   487 
       
   488 Fast Failure for Tests
       
   489 ----------------------
       
   490 
       
   491 The :djadmin:`test` subcommand of ``django-admin.py``, and the ``runtests.py``
       
   492 script used to run Django's own test suite, support a new ``--failfast`` option.
       
   493 When specified, this option causes the test runner to exit after encountering
       
   494 a failure instead of continuing with the test run.  In addition, the handling
       
   495 of ``Ctrl-C`` during a test run has been improved to trigger a graceful exit
       
   496 from the test run that reports details of the tests run before the interruption.
       
   497 
       
   498 Improved localization
       
   499 ---------------------
       
   500 
       
   501 Django's :doc:`internationalization framework </topics/i18n/index>` has been
       
   502 expanded by locale aware formatting and form processing. That means, if
       
   503 enabled, dates and numbers on templates will be displayed using the format
       
   504 specified for the current locale. Django will also use localized formats
       
   505 when parsing data in forms.
       
   506 See :ref:`Format localization <format-localization>` for more details.
       
   507 
       
   508 Added ``readonly_fields`` to ``ModelAdmin``
       
   509 -------------------------------------------
       
   510 
       
   511 :attr:`django.contrib.admin.ModelAdmin.readonly_fields` has been added to
       
   512 enable non-editable fields in add/change pages for models and inlines. Field
       
   513 and calculated values can be displayed along side editable fields.
       
   514 
       
   515 Customizable syntax highlighting
       
   516 --------------------------------
       
   517 
       
   518 You can now use the ``DJANGO_COLORS`` environment variable to modify
       
   519 or disable the colors used by ``django-admin.py`` to provide
       
   520 :ref:`syntax highlighting <syntax-coloring>`.
       
   521 
       
   522 
       
   523 The Django 1.2 roadmap
       
   524 ======================
       
   525 
       
   526 Before the final Django 1.2 release, several other preview/development
       
   527 releases will be made available. The current schedule consists of at
       
   528 least the following:
       
   529 
       
   530 * Week of **January 26, 2010**: First Django 1.2 beta release. Final
       
   531   feature freeze for Django 1.2.
       
   532 
       
   533 * Week of **March 2, 2010**: First Django 1.2 release
       
   534   candidate. String freeze for translations.
       
   535 
       
   536 * Week of **March 9, 2010**: Django 1.2 final release.
       
   537 
       
   538 If necessary, additional alpha, beta or release-candidate packages
       
   539 will be issued prior to the final 1.2 release. Django 1.2 will be
       
   540 released approximately one week after the final release candidate.
       
   541 
       
   542 
       
   543 What you can do to help
       
   544 =======================
       
   545 
       
   546 In order to provide a high-quality 1.2 release, we need your help. Although this
       
   547 alpha release is, again, *not* intended for production use, you can help the
       
   548 Django team by trying out the alpha codebase in a safe test environment and
       
   549 reporting any bugs or issues you encounter. The Django ticket tracker is the
       
   550 central place to search for open issues:
       
   551 
       
   552     * http://code.djangoproject.com/timeline
       
   553 
       
   554 Please open new tickets if no existing ticket corresponds to a problem you're
       
   555 running into.
       
   556 
       
   557 Additionally, discussion of Django development, including progress toward the
       
   558 1.2 release, takes place daily on the django-developers mailing list:
       
   559 
       
   560     * http://groups.google.com/group/django-developers
       
   561 
       
   562 ... and in the ``#django-dev`` IRC channel on ``irc.freenode.net``. If you're
       
   563 interested in helping out with Django's development, feel free to join the
       
   564 discussions there.
       
   565 
       
   566 Django's online documentation also includes pointers on how to contribute to
       
   567 Django:
       
   568 
       
   569     * :doc:`How to contribute to Django </internals/contributing>`
       
   570 
       
   571 Contributions on any level -- developing code, writing documentation or simply
       
   572 triaging tickets and helping to test proposed bugfixes -- are always welcome and
       
   573 appreciated.
       
   574 
       
   575 Development sprints for Django 1.2 will also be taking place at PyCon
       
   576 US 2010, on the dedicated sprint days (February 22 through 25), and
       
   577 anyone who wants to help out is welcome to join in, either in person
       
   578 at PyCon or virtually in the IRC channel or on the mailing list.