|
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. |