summaryrefslogtreecommitdiff
path: root/libre
diff options
context:
space:
mode:
authorLuke Shumaker <LukeShu@sbcglobal.net>2013-06-26 00:00:44 -0600
committerLuke Shumaker <LukeShu@sbcglobal.net>2013-06-26 00:00:44 -0600
commit23d897b9d2350accefe8784c08cde55b648a0a75 (patch)
treeb7de5f2642d89f67503913bb735273edbcc528c2 /libre
parent06ad6a3f12629877f355f114dc5576107c03d14f (diff)
downloadabslibre-23d897b9d2350accefe8784c08cde55b648a0a75.tar.gz
abslibre-23d897b9d2350accefe8784c08cde55b648a0a75.tar.bz2
abslibre-23d897b9d2350accefe8784c08cde55b648a0a75.zip
clean up dependencies of parabolaweb-utils (past and future versions)
- remove libre/django13: it has since upgraded to django=1.4 - fix libre/python2-cssmin-fredj: had metadata from python2-django-countries - add libre/python2-bencode: I don't know why it wasn't added. - add libre/python2-jsmin: re-licensed from JSON to MIT.
Diffstat (limited to 'libre')
-rw-r--r--libre/django13/PKGBUILD47
-rw-r--r--libre/django13/PKGBUILD.orig40
-rw-r--r--libre/django13/diff-django_branches_releases_1.3.X-from-16768-to-17460.diff1573
-rw-r--r--libre/django13/diff-django_branches_releases_1.3.X-from-16771-to-17460.diff1575
-rw-r--r--libre/python2-bencode/PKGBUILD24
-rw-r--r--libre/python2-bencode/bittorrent-osl.txt510
-rw-r--r--libre/python2-cssmin-fredj/PKGBUILD9
-rw-r--r--libre/python2-jsmin/PKGBUILD27
8 files changed, 565 insertions, 3240 deletions
diff --git a/libre/django13/PKGBUILD b/libre/django13/PKGBUILD
deleted file mode 100644
index 554acccc7..000000000
--- a/libre/django13/PKGBUILD
+++ /dev/null
@@ -1,47 +0,0 @@
-# $Id$
-# Maintainer: Dan McGee <dan@archlinux.org>
-# Contributor: Shahar Weiss <sweiss4@gmx.net>
-
-pkgname=django
-pkgver=1.3.1
-pkgrel=2
-pkgdesc="A high-level Python Web framework."
-arch=('any')
-license=('BSD')
-url="http://www.djangoproject.com/"
-depends=('python2')
-makedepends=('python2-distribute')
-optdepends=('mysql-python: for MySQL backend'
- 'python2-psycopg2: for PostgreSQL backend')
-source=("https://www.djangoproject.com/m/releases/1.3/Django-$pkgver.tar.gz"
- diff-django_branches_releases_1.3.X-from-16768-to-17460.diff)
-md5sums=('62d8642fd06b9a0bf8544178f8500767'
- 'd09d8f9e156b9aa1b580a1b43209b99f')
-sha256sums=('af9118c4e8a063deb0b8cda901fcff2b805e7cf496c93fd43507163f3cde156b'
- '8e08b5b5bbe7c042a1df4d5615a9d068ec6718fd00bef627c0a9a9e48ee58c15')
-
-build() {
- cd "$srcdir/Django-$pkgver"
- patch -Np1 -i ../diff-django_branches_releases_1.3.X-from-16768-to-17460.diff
- python2 setup.py build
-}
-
-package() {
- cd "$srcdir/Django-$pkgver"
- python2 setup.py install --root="$pkgdir" --optimize=1
-
- install -Dm644 extras/django_bash_completion \
- "$pkgdir"/etc/bash_completion.d/django
-
- find "$pkgdir"/usr/lib/python2.7/site-packages/django/ -name '*.py' | \
- xargs sed -i "s|#!/usr/bin/env python$|#!/usr/bin/env python2|"
-
- install -Dm644 LICENSE "$pkgdir"/usr/share/licenses/$pkgname/LICENSE
-}
-
-_pkgname=$pkgname
-pkgname=django13
-pkgdesc+=" (legacy version for ParabolaWeb)"
-pkgrel+=.1
-provides=("$_pkgname=$pkgver")
-conflicts=("$_pkgname")
diff --git a/libre/django13/PKGBUILD.orig b/libre/django13/PKGBUILD.orig
deleted file mode 100644
index c593c5626..000000000
--- a/libre/django13/PKGBUILD.orig
+++ /dev/null
@@ -1,40 +0,0 @@
-# $Id$
-# Maintainer: Dan McGee <dan@archlinux.org>
-# Contributor: Shahar Weiss <sweiss4@gmx.net>
-
-pkgname=django
-pkgver=1.3.1
-pkgrel=2
-pkgdesc="A high-level Python Web framework."
-arch=('any')
-license=('BSD')
-url="http://www.djangoproject.com/"
-depends=('python2')
-makedepends=('python2-distribute')
-optdepends=('mysql-python: for MySQL backend'
- 'python2-psycopg2: for PostgreSQL backend')
-source=("http://media.djangoproject.com/releases/1.3/Django-$pkgver.tar.gz"
- diff-django_branches_releases_1.3.X-from-16771-to-17460.diff)
-md5sums=('62d8642fd06b9a0bf8544178f8500767'
- 'ea3d6cbde2fc2332ffe7f901cb60a974')
-sha256sums=('af9118c4e8a063deb0b8cda901fcff2b805e7cf496c93fd43507163f3cde156b'
- '84e2652a8249e58fdbbd43bce7cd8d6bb2159058be6a675ebe15661ca3ee9ffc')
-
-build() {
- cd "$srcdir/Django-$pkgver"
- patch -Np0 < ../diff-django_branches_releases_1.3.X-from-16771-to-17460.diff
- python2 setup.py build
-}
-
-package() {
- cd "$srcdir/Django-$pkgver"
- python2 setup.py install --root="$pkgdir" --optimize=1
-
- install -Dm644 extras/django_bash_completion \
- "$pkgdir"/etc/bash_completion.d/django
-
- find "$pkgdir"/usr/lib/python2.7/site-packages/django/ -name '*.py' | \
- xargs sed -i "s|#!/usr/bin/env python$|#!/usr/bin/env python2|"
-
- install -Dm644 LICENSE "$pkgdir"/usr/share/licenses/$pkgname/LICENSE
-}
diff --git a/libre/django13/diff-django_branches_releases_1.3.X-from-16768-to-17460.diff b/libre/django13/diff-django_branches_releases_1.3.X-from-16768-to-17460.diff
deleted file mode 100644
index c6819c1ab..000000000
--- a/libre/django13/diff-django_branches_releases_1.3.X-from-16768-to-17460.diff
+++ /dev/null
@@ -1,1573 +0,0 @@
-diff --git a/README b/README
-index c7d225c..47bfd33 100644
---- a/README
-+++ b/README
-@@ -28,7 +28,7 @@ http://code.djangoproject.com/newticket
- To get more help:
-
- * Join the #django channel on irc.freenode.net. Lots of helpful people
-- hang out there. Read the archives at http://botland.oebfare.com/logger/django/.
-+ hang out there. Read the archives at http://django-irc-logs.com/.
-
- * Join the django-users mailing list, or read the archives, at
- http://groups.google.com/group/django-users.
-diff --git a/django/contrib/admin/media/css/forms.css b/django/contrib/admin/media/css/forms.css
-index 1cedf24..35d0ed7 100644
---- a/django/contrib/admin/media/css/forms.css
-+++ b/django/contrib/admin/media/css/forms.css
-@@ -352,9 +352,3 @@ fieldset.monospace textarea {
- .empty-form {
- display: none;
- }
--
--/* IE7 specific bug fixes */
--
--.submit-row input {
-- float: right;
--}
-\ No newline at end of file
-diff --git a/django/contrib/gis/db/backends/spatialite/compiler.py b/django/contrib/gis/db/backends/spatialite/compiler.py
-deleted file mode 100644
-index 3f81ae6..0000000
---- a/django/contrib/gis/db/backends/spatialite/compiler.py
-+++ /dev/null
-@@ -1,32 +0,0 @@
--from django.db.backends.util import typecast_timestamp
--from django.db.models.sql import compiler
--from django.db.models.sql.constants import MULTI
--from django.contrib.gis.db.models.sql.compiler import GeoSQLCompiler as BaseGeoSQLCompiler
--
--SQLCompiler = compiler.SQLCompiler
--
--class GeoSQLCompiler(BaseGeoSQLCompiler, SQLCompiler):
-- pass
--
--class SQLInsertCompiler(compiler.SQLInsertCompiler, GeoSQLCompiler):
-- pass
--
--class SQLDeleteCompiler(compiler.SQLDeleteCompiler, GeoSQLCompiler):
-- pass
--
--class SQLUpdateCompiler(compiler.SQLUpdateCompiler, GeoSQLCompiler):
-- pass
--
--class SQLAggregateCompiler(compiler.SQLAggregateCompiler, GeoSQLCompiler):
-- pass
--
--class SQLDateCompiler(compiler.SQLDateCompiler, GeoSQLCompiler):
-- """
-- This is overridden for GeoDjango to properly cast date columns, see #16757.
-- """
-- def results_iter(self):
-- offset = len(self.query.extra_select)
-- for rows in self.execute_sql(MULTI):
-- for row in rows:
-- date = typecast_timestamp(str(row[offset]))
-- yield date
-diff --git a/django/contrib/gis/db/backends/spatialite/creation.py b/django/contrib/gis/db/backends/spatialite/creation.py
-index c107d96..ee5f9db 100644
---- a/django/contrib/gis/db/backends/spatialite/creation.py
-+++ b/django/contrib/gis/db/backends/spatialite/creation.py
-@@ -56,14 +56,6 @@ class SpatiaLiteCreation(DatabaseCreation):
- interactive=False,
- database=self.connection.alias)
-
-- # One effect of calling syncdb followed by flush is that the id of the
-- # default site may or may not be 1, depending on how the sequence was
-- # reset. If the sites app is loaded, then we coerce it.
-- from django.db.models import get_model
-- Site = get_model('sites', 'Site')
-- if Site is not None and Site.objects.using(self.connection.alias).count() == 1:
-- Site.objects.using(self.connection.alias).update(id=settings.SITE_ID)
--
- from django.core.cache import get_cache
- from django.core.cache.backends.db import BaseDatabaseCache
- for cache_alias in settings.CACHES:
-diff --git a/django/contrib/gis/db/backends/spatialite/operations.py b/django/contrib/gis/db/backends/spatialite/operations.py
-index 1dc612c..e6f8409 100644
---- a/django/contrib/gis/db/backends/spatialite/operations.py
-+++ b/django/contrib/gis/db/backends/spatialite/operations.py
-@@ -48,7 +48,7 @@ def get_dist_ops(operator):
- return (SpatiaLiteDistance(operator),)
-
- class SpatiaLiteOperations(DatabaseOperations, BaseSpatialOperations):
-- compiler_module = 'django.contrib.gis.db.backends.spatialite.compiler'
-+ compiler_module = 'django.contrib.gis.db.models.sql.compiler'
- name = 'spatialite'
- spatialite = True
- version_regex = re.compile(r'^(?P<major>\d)\.(?P<minor1>\d)\.(?P<minor2>\d+)')
-diff --git a/django/contrib/gis/db/models/sql/compiler.py b/django/contrib/gis/db/models/sql/compiler.py
-index 782ce78..405a000 100644
---- a/django/contrib/gis/db/models/sql/compiler.py
-+++ b/django/contrib/gis/db/models/sql/compiler.py
-@@ -1,7 +1,7 @@
- from itertools import izip
--from django.db.backends.util import truncate_name
-+from django.db.backends.util import truncate_name, typecast_timestamp
- from django.db.models.sql import compiler
--from django.db.models.sql.constants import TABLE_NAME
-+from django.db.models.sql.constants import TABLE_NAME, MULTI
- from django.db.models.sql.query import get_proxied_model
-
- SQLCompiler = compiler.SQLCompiler
-@@ -194,7 +194,7 @@ class GeoSQLCompiler(compiler.SQLCompiler):
- # We resolve the rest of the columns if we're on Oracle or if
- # the `geo_values` attribute is defined.
- for value, field in map(None, row[index_start:], fields):
-- values.append(self.query.convert_values(value, field, connection=self.connection))
-+ values.append(self.query.convert_values(value, field, self.connection))
- else:
- values.extend(row[index_start:])
- return tuple(values)
-@@ -275,4 +275,24 @@ class SQLAggregateCompiler(compiler.SQLAggregateCompiler, GeoSQLCompiler):
- pass
-
- class SQLDateCompiler(compiler.SQLDateCompiler, GeoSQLCompiler):
-- pass
-+ """
-+ This is overridden for GeoDjango to properly cast date columns, since
-+ `GeoQuery.resolve_columns` is used for spatial values.
-+ See #14648, #16757.
-+ """
-+ def results_iter(self):
-+ if self.connection.ops.oracle:
-+ from django.db.models.fields import DateTimeField
-+ fields = [DateTimeField()]
-+ else:
-+ needs_string_cast = self.connection.features.needs_datetime_string_cast
-+
-+ offset = len(self.query.extra_select)
-+ for rows in self.execute_sql(MULTI):
-+ for row in rows:
-+ date = row[offset]
-+ if self.connection.ops.oracle:
-+ date = self.resolve_columns(row, fields)[offset]
-+ elif needs_string_cast:
-+ date = typecast_timestamp(str(date))
-+ yield date
-diff --git a/django/contrib/gis/tests/relatedapp/fixtures/initial_data.json.gz b/django/contrib/gis/tests/relatedapp/fixtures/initial_data.json.gz
-index 68bf54c..8937637 100644
-Binary files a/django/contrib/gis/tests/relatedapp/fixtures/initial_data.json.gz and b/django/contrib/gis/tests/relatedapp/fixtures/initial_data.json.gz differ
-diff --git a/django/contrib/gis/tests/relatedapp/models.py b/django/contrib/gis/tests/relatedapp/models.py
-index 2e9a62b..aec4e15 100644
---- a/django/contrib/gis/tests/relatedapp/models.py
-+++ b/django/contrib/gis/tests/relatedapp/models.py
-@@ -36,6 +36,7 @@ class Parcel(models.Model):
- # These use the GeoManager but do not have any geographic fields.
- class Author(models.Model):
- name = models.CharField(max_length=100)
-+ dob = models.DateField()
- objects = models.GeoManager()
-
- class Article(models.Model):
-diff --git a/django/contrib/gis/tests/relatedapp/tests.py b/django/contrib/gis/tests/relatedapp/tests.py
-index 250783b..1a6197c 100644
---- a/django/contrib/gis/tests/relatedapp/tests.py
-+++ b/django/contrib/gis/tests/relatedapp/tests.py
-@@ -1,3 +1,4 @@
-+from datetime import date
- from django.test import TestCase
-
- from django.contrib.gis.geos import GEOSGeometry, Point, MultiPoint
-@@ -281,4 +282,11 @@ class RelatedGeoModelTest(TestCase):
- # evaluated as list generation swallows TypeError in CPython.
- sql = str(qs.query)
-
-+ def test16_annotated_date_queryset(self):
-+ "Ensure annotated date querysets work if spatial backend is used. See #14648."
-+ birth_years = [dt.year for dt in
-+ list(Author.objects.annotate(num_books=Count('books')).dates('dob', 'year'))]
-+ birth_years.sort()
-+ self.assertEqual([1950, 1974], birth_years)
-+
- # TODO: Related tests for KML, GML, and distance lookups.
-diff --git a/django/contrib/sites/management.py b/django/contrib/sites/management.py
-index 1987274..9bf5a14 100644
---- a/django/contrib/sites/management.py
-+++ b/django/contrib/sites/management.py
-@@ -3,15 +3,34 @@ Creates the default Site object.
- """
-
- from django.db.models import signals
-+from django.db import connections
-+from django.db import router
- from django.contrib.sites.models import Site
- from django.contrib.sites import models as site_app
-+from django.core.management.color import no_style
-
- def create_default_site(app, created_models, verbosity, db, **kwargs):
-- if Site in created_models:
-+ # Only create the default sites in databases where Django created the table
-+ if Site in created_models and router.allow_syncdb(db, Site) :
-+ # The default settings set SITE_ID = 1, and some tests in Django's test
-+ # suite rely on this value. However, if database sequences are reused
-+ # (e.g. in the test suite after flush/syncdb), it isn't guaranteed that
-+ # the next id will be 1, so we coerce it. See #15573 and #16353. This
-+ # can also crop up outside of tests - see #15346.
- if verbosity >= 2:
- print "Creating example.com Site object"
-- s = Site(domain="example.com", name="example.com")
-- s.save(using=db)
-+ Site(pk=1, domain="example.com", name="example.com").save(using=db)
-+
-+ # We set an explicit pk instead of relying on auto-incrementation,
-+ # so we need to reset the database sequence.
-+ sequence_sql = connections[db].ops.sequence_reset_sql(no_style(), [Site])
-+ if sequence_sql:
-+ if verbosity >= 2:
-+ print "Resetting sequence"
-+ cursor = connections[db].cursor()
-+ for command in sequence_sql:
-+ cursor.execute(command)
-+
- Site.objects.clear_cache()
-
- signals.post_syncdb.connect(create_default_site, sender=site_app)
-diff --git a/django/contrib/sites/tests.py b/django/contrib/sites/tests.py
-index 17ab1f2..828badb 100644
---- a/django/contrib/sites/tests.py
-+++ b/django/contrib/sites/tests.py
-@@ -15,6 +15,12 @@ class SitesFrameworkTests(TestCase):
- def tearDown(self):
- Site._meta.installed = self.old_Site_meta_installed
-
-+ def test_save_another(self):
-+ # Regression for #17415
-+ # On some backends the sequence needs reset after save with explicit ID.
-+ # Test that there is no sequence collisions by saving another site.
-+ Site(domain="example2.com", name="example2.com").save()
-+
- def test_site_manager(self):
- # Make sure that get_current() does not return a deleted Site object.
- s = Site.objects.get_current()
-diff --git a/django/core/management/commands/shell.py b/django/core/management/commands/shell.py
-index e4ce462..039ebb8 100644
---- a/django/core/management/commands/shell.py
-+++ b/django/core/management/commands/shell.py
-@@ -13,9 +13,8 @@ class Command(NoArgsCommand):
-
- def ipython(self):
- try:
-- from IPython.frontend.terminal.embed import TerminalInteractiveShell
-- shell = TerminalInteractiveShell()
-- shell.mainloop()
-+ from IPython import embed
-+ embed()
- except ImportError:
- # IPython < 0.11
- # Explicitly pass an empty list as arguments, because otherwise
-diff --git a/django/core/validators.py b/django/core/validators.py
-index a93c6ac..9dcc2bc 100644
---- a/django/core/validators.py
-+++ b/django/core/validators.py
-@@ -147,7 +147,8 @@ class EmailValidator(RegexValidator):
-
- email_re = re.compile(
- r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*" # dot-atom
-- r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-011\013\014\016-\177])*"' # quoted-string
-+ # quoted-string, see also http://tools.ietf.org/html/rfc2822#section-3.2.5
-+ r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-\011\013\014\016-\177])*"'
- r')@(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,6}\.?$', re.IGNORECASE) # domain
- validate_email = EmailValidator(email_re, _(u'Enter a valid e-mail address.'), 'invalid')
-
-diff --git a/django/db/backends/creation.py b/django/db/backends/creation.py
-index 57e3f77..ef594b7 100644
---- a/django/db/backends/creation.py
-+++ b/django/db/backends/creation.py
-@@ -374,15 +374,6 @@ class BaseDatabaseCreation(object):
- verbosity=max(verbosity - 1, 0),
- interactive=False,
- database=self.connection.alias)
--
-- # One effect of calling syncdb followed by flush is that the id of the
-- # default site may or may not be 1, depending on how the sequence was
-- # reset. If the sites app is loaded, then we coerce it.
-- from django.db.models import get_model
-- if 'django.contrib.sites' in settings.INSTALLED_APPS:
-- Site = get_model('sites', 'Site')
-- if Site is not None and Site.objects.using(self.connection.alias).count() == 1:
-- Site.objects.using(self.connection.alias).update(id=settings.SITE_ID)
-
- from django.core.cache import get_cache
- from django.core.cache.backends.db import BaseDatabaseCache
-diff --git a/django/http/__init__.py b/django/http/__init__.py
-index 68ac45d..07e5a46 100644
---- a/django/http/__init__.py
-+++ b/django/http/__init__.py
-@@ -92,7 +92,7 @@ else:
- if not _cookie_allows_colon_in_names:
- def load(self, rawdata, ignore_parse_errors=False):
- if ignore_parse_errors:
-- self.bad_cookies = []
-+ self.bad_cookies = set()
- self._BaseCookie__set = self._loose_set
- super(SimpleCookie, self).load(rawdata)
- if ignore_parse_errors:
-@@ -106,8 +106,8 @@ else:
- try:
- self._strict_set(key, real_value, coded_value)
- except Cookie.CookieError:
-- self.bad_cookies.append(key)
-- dict.__setitem__(self, key, None)
-+ self.bad_cookies.add(key)
-+ dict.__setitem__(self, key, Cookie.Morsel())
-
-
- class CompatCookie(SimpleCookie):
-diff --git a/django/http/utils.py b/django/http/utils.py
-index 5eea239..0180864 100644
---- a/django/http/utils.py
-+++ b/django/http/utils.py
-@@ -76,7 +76,8 @@ def fix_IE_for_vary(request, response):
-
- # The first part of the Content-Type field will be the MIME type,
- # everything after ';', such as character-set, can be ignored.
-- if response['Content-Type'].split(';')[0] not in safe_mime_types:
-+ mime_type = response.get('Content-Type', '').partition(';')[0]
-+ if mime_type not in safe_mime_types:
- try:
- del response['Vary']
- except KeyError:
-diff --git a/docs/howto/deployment/modpython.txt b/docs/howto/deployment/modpython.txt
-index f5030e9..693f942 100644
---- a/docs/howto/deployment/modpython.txt
-+++ b/docs/howto/deployment/modpython.txt
-@@ -293,11 +293,14 @@ of the admin app, but this is not the case when you use any other server
- arrangement. You're responsible for setting up Apache, or whichever media
- server you're using, to serve the admin files.
-
--The admin files live in (:file:`django/contrib/admin/static/admin`) of the
-+The admin files live in (:file:`django/contrib/admin/media/admin`) of the
- Django distribution.
-
--We **strongly** recommend using :mod:`django.contrib.staticfiles` to handle
--the admin files, but here are two other approaches:
-+We **strongly** recommend using :mod:`django.contrib.staticfiles` to handle the
-+admin files (this means using the :djadmin:`collectstatic` management command
-+to collect the static files in :setting:`STATIC_ROOT`, and then configuring
-+your webserver to serve :setting:`STATIC_ROOT` at :setting:`STATIC_URL`), but
-+here are two other approaches:
-
- 1. Create a symbolic link to the admin static files from within your
- document root.
-diff --git a/docs/howto/deployment/modwsgi.txt b/docs/howto/deployment/modwsgi.txt
-index de3a5b6..fdf9d27 100644
---- a/docs/howto/deployment/modwsgi.txt
-+++ b/docs/howto/deployment/modwsgi.txt
-@@ -127,11 +127,14 @@ of the admin app, but this is not the case when you use any other server
- arrangement. You're responsible for setting up Apache, or whichever media
- server you're using, to serve the admin files.
-
--The admin files live in (:file:`django/contrib/admin/static/admin`) of the
-+The admin files live in (:file:`django/contrib/admin/media/admin`) of the
- Django distribution.
-
--We **strongly** recommend using :mod:`django.contrib.staticfiles` to handle
--the admin files, but here are two other approaches:
-+We **strongly** recommend using :mod:`django.contrib.staticfiles` to handle the
-+admin files (this means using the :djadmin:`collectstatic` management command
-+to collect the static files in :setting:`STATIC_ROOT`, and then configuring
-+your webserver to serve :setting:`STATIC_ROOT` at :setting:`STATIC_URL`), but
-+here are two other approaches:
-
- 1. Create a symbolic link to the admin static files from within your
- document root.
-diff --git a/docs/index.txt b/docs/index.txt
-index 0cf066e..20a7cec 100644
---- a/docs/index.txt
-+++ b/docs/index.txt
-@@ -28,7 +28,7 @@ Having trouble? We'd like to help!
- .. _archives of the django-users mailing list: http://groups.google.com/group/django-users/
- .. _post a question: http://groups.google.com/group/django-users/
- .. _#django IRC channel: irc://irc.freenode.net/django
--.. _IRC logs: http://botland.oebfare.com/logger/django/
-+.. _IRC logs: http://django-irc-logs.com/
- .. _ticket tracker: http://code.djangoproject.com/
-
- First steps
-diff --git a/docs/internals/deprecation.txt b/docs/internals/deprecation.txt
-index 3f0f998..ca29d15 100644
---- a/docs/internals/deprecation.txt
-+++ b/docs/internals/deprecation.txt
-@@ -177,6 +177,12 @@ their deprecation, as per the :ref:`Django deprecation policy
- required to end with a trailing slash to ensure there is a consistent
- way to combine paths in templates.
-
-+ * Translations located under the so-called *project path* will be
-+ ignored during the translation building process performed at runtime.
-+ The :setting:`LOCALE_PATHS` setting can be used for the same task by
-+ including the filesystem path to a ``locale`` directory containing
-+ non-app-specific translations in its value.
-+
- * 2.0
- * ``django.views.defaults.shortcut()``. This function has been moved
- to ``django.contrib.contenttypes.views.shortcut()`` as part of the
-diff --git a/docs/internals/release-process.txt b/docs/internals/release-process.txt
-index 2a56f0b..799a59e 100644
---- a/docs/internals/release-process.txt
-+++ b/docs/internals/release-process.txt
-@@ -99,6 +99,13 @@ varying levels:
- * Security fixes will be applied to the current trunk and the previous two
- minor releases.
-
-+* Documentation fixes will generally be more freely backported to the last
-+ release branch (at the discretion of the committer), and don't need to meet
-+ the "critical fixes only" bar as it's highly advantageous to have the docs
-+ for the last release be up-to-date and correct, and the downside of
-+ backporting (risk of introducing regressions) is much less of a concern
-+ with doc fixes.
-+
- As a concrete example, consider a moment in time halfway between the release of
- Django 1.3 and 1.4. At this point in time:
-
-@@ -111,6 +118,9 @@ Django 1.3 and 1.4. At this point in time:
- ``1.2.X`` branch. Security fixes will trigger the release of ``1.3.1``,
- ``1.2.1``, etc.
-
-+* Documentation fixes will be applied to trunk, and if easily backported, to
-+ the ``1.3.X`` branch.
-+
- .. _release-process:
-
- Release process
-diff --git a/docs/intro/index.txt b/docs/intro/index.txt
-index bc61be7..19290a5 100644
---- a/docs/intro/index.txt
-+++ b/docs/intro/index.txt
-@@ -31,6 +31,6 @@ place: read this material to quickly get up and running.
-
- .. _python: http://python.org/
- .. _list of Python resources for non-programmers: http://wiki.python.org/moin/BeginnersGuide/NonProgrammers
-- .. _dive into python: http://diveintopython.org/
-+ .. _dive into python: http://diveintopython.net/
- .. _dead-tree version: http://www.amazon.com/exec/obidos/ASIN/1590593561/ref=nosim/jacobian20
- .. _books about Python: http://wiki.python.org/moin/PythonBooks
-\ No newline at end of file
-diff --git a/docs/intro/tutorial01.txt b/docs/intro/tutorial01.txt
-index 2f2e049..4dc1e5c 100644
---- a/docs/intro/tutorial01.txt
-+++ b/docs/intro/tutorial01.txt
-@@ -59,7 +59,7 @@ This will create a ``mysite`` directory in your current directory.
- can be run as a program. To do this, open Terminal.app and navigate (using
- the ``cd`` command) to the directory where :doc:`django-admin.py
- </ref/django-admin>` is installed, then run the command
-- ``chmod +x django-admin.py``.
-+ ``sudo chmod +x django-admin.py``.
-
- .. note::
-
-@@ -692,10 +692,9 @@ Save these changes and start a new Python interactive shell by running
-
- For more information on model relations, see :doc:`Accessing related objects
- </ref/models/relations>`. For more on how to use double underscores to perform
--field lookups via the API, see `Field lookups`__. For full details on the
--database API, see our :doc:`Database API reference </topics/db/queries>`.
--
--__ http://docs.djangoproject.com/en/1.2/topics/db/queries/#field-lookups
-+field lookups via the API, see :ref:`Field lookups <field-lookups-intro>`. For
-+full details on the database API, see our :doc:`Database API reference
-+</topics/db/queries>`.
-
- When you're comfortable with the API, read :doc:`part 2 of this tutorial
- </intro/tutorial02>` to get Django's automatic admin working.
-diff --git a/docs/intro/tutorial02.txt b/docs/intro/tutorial02.txt
-index 4bd31fb..1e837e6 100644
---- a/docs/intro/tutorial02.txt
-+++ b/docs/intro/tutorial02.txt
-@@ -40,22 +40,22 @@ activate the admin site for your installation, do these three things:
-
- .. parsed-literal::
-
-- from django.conf.urls.defaults import *
-+ from django.conf.urls.defaults import patterns, include, url
-
- # Uncomment the next two lines to enable the admin:
- **from django.contrib import admin**
- **admin.autodiscover()**
-
- urlpatterns = patterns('',
-- # Example:
-- # (r'^mysite/', include('mysite.foo.urls')),
-+ # Examples:
-+ # url(r'^$', 'mysite.views.home', name='home'),
-+ # url(r'^mysite/', include('mysite.foo.urls')),
-
-- # Uncomment the admin/doc line below and add 'django.contrib.admindocs'
-- # to INSTALLED_APPS to enable admin documentation:
-- # (r'^admin/doc/', include('django.contrib.admindocs.urls')),
-+ # Uncomment the admin/doc line below to enable admin documentation:
-+ # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
-
- # Uncomment the next line to enable the admin:
-- **(r'^admin/', include(admin.site.urls)),**
-+ **url(r'^admin/', include(admin.site.urls)),**
- )
-
- (The bold lines are the ones that needed to be uncommented.)
-diff --git a/docs/intro/tutorial03.txt b/docs/intro/tutorial03.txt
-index 41a62a7..566ba55 100644
---- a/docs/intro/tutorial03.txt
-+++ b/docs/intro/tutorial03.txt
-@@ -78,17 +78,17 @@ point at that file::
-
- Time for an example. Edit ``mysite/urls.py`` so it looks like this::
-
-- from django.conf.urls.defaults import *
-+ from django.conf.urls.defaults import patterns, include, url
-
- from django.contrib import admin
- admin.autodiscover()
-
- urlpatterns = patterns('',
-- (r'^polls/$', 'polls.views.index'),
-- (r'^polls/(?P<poll_id>\d+)/$', 'polls.views.detail'),
-- (r'^polls/(?P<poll_id>\d+)/results/$', 'polls.views.results'),
-- (r'^polls/(?P<poll_id>\d+)/vote/$', 'polls.views.vote'),
-- (r'^admin/', include(admin.site.urls)),
-+ url(r'^polls/$', 'polls.views.index'),
-+ url(r'^polls/(?P<poll_id>\d+)/$', 'polls.views.detail'),
-+ url(r'^polls/(?P<poll_id>\d+)/results/$', 'polls.views.results'),
-+ url(r'^polls/(?P<poll_id>\d+)/vote/$', 'polls.views.vote'),
-+ url(r'^admin/', include(admin.site.urls)),
- )
-
- This is worth a review. When somebody requests a page from your Web site -- say,
-@@ -112,7 +112,7 @@ what you can do with them. And there's no need to add URL cruft such as ``.php``
- -- unless you have a sick sense of humor, in which case you can do something
- like this::
-
-- (r'^polls/latest\.php$', 'polls.views.index'),
-+ url(r'^polls/latest\.php$', 'polls.views.index'),
-
- But, don't do that. It's silly.
-
-@@ -357,22 +357,23 @@ the list is empty.
- Write a 404 (page not found) view
- =================================
-
--When you raise :exc:`~django.http.Http404` from within a view, Django will load
--a special view devoted to handling 404 errors. It finds it by looking for the
--variable ``handler404``, which is a string in Python dotted syntax -- the same
--format the normal URLconf callbacks use. A 404 view itself has nothing special:
--It's just a normal view.
--
--You normally won't have to bother with writing 404 views. By default, URLconfs
--have the following line up top::
--
-- from django.conf.urls.defaults import *
-+When you raise :exc:`~django.http.Http404` from within a view, Django
-+will load a special view devoted to handling 404 errors. It finds it
-+by looking for the variable ``handler404`` in your root URLconf (and
-+only in your root URLconf; setting ``handler404`` anywhere else will
-+have no effect), which is a string in Python dotted syntax -- the same
-+format the normal URLconf callbacks use. A 404 view itself has nothing
-+special: It's just a normal view.
-
--That takes care of setting ``handler404`` in the current module. As you can see
--in ``django/conf/urls/defaults.py``, ``handler404`` is set to
--:func:`django.views.defaults.page_not_found` by default.
-+You normally won't have to bother with writing 404 views. If you don't set
-+``handler404``, the built-in view :func:`django.views.defaults.page_not_found`
-+is used by default. In this case, you still have one obligation: To create a
-+``404.html`` template in the root of your template directory. The default 404
-+view will use that template for all 404 errors. If :setting:`DEBUG` is set to
-+``False`` (in your settings module) and if you didn't create a ``404.html``
-+file, an ``Http500`` is raised instead. So remember to create a ``404.html``.
-
--Four more things to note about 404 views:
-+A couple more things to note about 404 views:
-
- * If :setting:`DEBUG` is set to ``True`` (in your settings module) then your
- 404 view will never be used (and thus the ``404.html`` template will never
-@@ -381,21 +382,12 @@ Four more things to note about 404 views:
- * The 404 view is also called if Django doesn't find a match after checking
- every regular expression in the URLconf.
-
-- * If you don't define your own 404 view -- and simply use the default, which
-- is recommended -- you still have one obligation: To create a ``404.html``
-- template in the root of your template directory. The default 404 view will
-- use that template for all 404 errors.
--
-- * If :setting:`DEBUG` is set to ``False`` (in your settings module) and if
-- you didn't create a ``404.html`` file, an ``Http500`` is raised instead.
-- So remember to create a ``404.html``.
--
- Write a 500 (server error) view
- ===============================
-
--Similarly, URLconfs may define a ``handler500``, which points to a view to call
--in case of server errors. Server errors happen when you have runtime errors in
--view code.
-+Similarly, your root URLconf may define a ``handler500``, which points
-+to a view to call in case of server errors. Server errors happen when
-+you have runtime errors in view code.
-
- Use the template system
- =======================
-@@ -432,10 +424,10 @@ Take some time to play around with the views and template system. As you edit
- the URLconf, you may notice there's a fair bit of redundancy in it::
-
- urlpatterns = patterns('',
-- (r'^polls/$', 'polls.views.index'),
-- (r'^polls/(?P<poll_id>\d+)/$', 'polls.views.detail'),
-- (r'^polls/(?P<poll_id>\d+)/results/$', 'polls.views.results'),
-- (r'^polls/(?P<poll_id>\d+)/vote/$', 'polls.views.vote'),
-+ url(r'^polls/$', 'polls.views.index'),
-+ url(r'^polls/(?P<poll_id>\d+)/$', 'polls.views.detail'),
-+ url(r'^polls/(?P<poll_id>\d+)/results/$', 'polls.views.results'),
-+ url(r'^polls/(?P<poll_id>\d+)/vote/$', 'polls.views.vote'),
- )
-
- Namely, ``polls.views`` is in every callback.
-@@ -445,10 +437,10 @@ common prefixes. You can factor out the common prefixes and add them as the
- first argument to :func:`~django.conf.urls.defaults.patterns`, like so::
-
- urlpatterns = patterns('polls.views',
-- (r'^polls/$', 'index'),
-- (r'^polls/(?P<poll_id>\d+)/$', 'detail'),
-- (r'^polls/(?P<poll_id>\d+)/results/$', 'results'),
-- (r'^polls/(?P<poll_id>\d+)/vote/$', 'vote'),
-+ url(r'^polls/$', 'index'),
-+ url(r'^polls/(?P<poll_id>\d+)/$', 'detail'),
-+ url(r'^polls/(?P<poll_id>\d+)/results/$', 'results'),
-+ url(r'^polls/(?P<poll_id>\d+)/vote/$', 'vote'),
- )
-
- This is functionally identical to the previous formatting. It's just a bit
-@@ -459,20 +451,20 @@ callback in your URLconf, you can concatenate multiple
- :func:`~django.conf.urls.defaults.patterns`. Your full ``mysite/urls.py`` might
- now look like this::
-
-- from django.conf.urls.defaults import *
-+ from django.conf.urls.defaults import patterns, include, url
-
- from django.contrib import admin
- admin.autodiscover()
-
- urlpatterns = patterns('polls.views',
-- (r'^polls/$', 'index'),
-- (r'^polls/(?P<poll_id>\d+)/$', 'detail'),
-- (r'^polls/(?P<poll_id>\d+)/results/$', 'results'),
-- (r'^polls/(?P<poll_id>\d+)/vote/$', 'vote'),
-+ url(r'^polls/$', 'index'),
-+ url(r'^polls/(?P<poll_id>\d+)/$', 'detail'),
-+ url(r'^polls/(?P<poll_id>\d+)/results/$', 'results'),
-+ url(r'^polls/(?P<poll_id>\d+)/vote/$', 'vote'),
- )
-
- urlpatterns += patterns('',
-- (r'^admin/', include(admin.site.urls)),
-+ url(r'^admin/', include(admin.site.urls)),
- )
-
- Decoupling the URLconfs
-@@ -502,8 +494,8 @@ Copy the file ``mysite/urls.py`` to ``polls/urls.py``. Then, change
- admin.autodiscover()
-
- urlpatterns = patterns('',
-- (r'^polls/', include('polls.urls')),
-- (r'^admin/', include(admin.site.urls)),
-+ url(r'^polls/', include('polls.urls')),
-+ url(r'^admin/', include(admin.site.urls)),
- )
-
- :func:`~django.conf.urls.defaults.include` simply references another URLconf.
-@@ -526,13 +518,13 @@ URLconf by removing the leading "polls/" from each line, and removing the
- lines registering the admin site. Your ``polls/urls.py`` file should now look like
- this::
-
-- from django.conf.urls.defaults import *
-+ from django.conf.urls.defaults import patterns, include, url
-
- urlpatterns = patterns('polls.views',
-- (r'^$', 'index'),
-- (r'^(?P<poll_id>\d+)/$', 'detail'),
-- (r'^(?P<poll_id>\d+)/results/$', 'results'),
-- (r'^(?P<poll_id>\d+)/vote/$', 'vote'),
-+ url(r'^$', 'index'),
-+ url(r'^(?P<poll_id>\d+)/$', 'detail'),
-+ url(r'^(?P<poll_id>\d+)/results/$', 'results'),
-+ url(r'^(?P<poll_id>\d+)/vote/$', 'vote'),
- )
-
- The idea behind :func:`~django.conf.urls.defaults.include` and URLconf
-diff --git a/docs/intro/tutorial04.txt b/docs/intro/tutorial04.txt
-index ded5cb2..4c2f2d4 100644
---- a/docs/intro/tutorial04.txt
-+++ b/docs/intro/tutorial04.txt
-@@ -218,13 +218,13 @@ Read on for details.
- First, open the ``polls/urls.py`` URLconf. It looks like this, according to the
- tutorial so far::
-
-- from django.conf.urls.defaults import *
-+ from django.conf.urls.defaults import patterns, include, url
-
- urlpatterns = patterns('polls.views',
-- (r'^$', 'index'),
-- (r'^(?P<poll_id>\d+)/$', 'detail'),
-- (r'^(?P<poll_id>\d+)/results/$', 'results'),
-- (r'^(?P<poll_id>\d+)/vote/$', 'vote'),
-+ url(r'^$', 'index'),
-+ url(r'^(?P<poll_id>\d+)/$', 'detail'),
-+ url(r'^(?P<poll_id>\d+)/results/$', 'results'),
-+ url(r'^(?P<poll_id>\d+)/vote/$', 'vote'),
- )
-
- Change it like so::
-@@ -234,12 +234,12 @@ Change it like so::
- from polls.models import Poll
-
- urlpatterns = patterns('',
-- (r'^$',
-+ url(r'^$',
- ListView.as_view(
- queryset=Poll.objects.order_by('-pub_date')[:5],
- context_object_name='latest_poll_list',
- template_name='polls/index.html')),
-- (r'^(?P<pk>\d+)/$',
-+ url(r'^(?P<pk>\d+)/$',
- DetailView.as_view(
- model=Poll,
- template_name='polls/detail.html')),
-@@ -248,7 +248,7 @@ Change it like so::
- model=Poll,
- template_name='polls/results.html'),
- name='poll_results'),
-- (r'^(?P<poll_id>\d+)/vote/$', 'polls.views.vote'),
-+ url(r'^(?P<poll_id>\d+)/vote/$', 'polls.views.vote'),
- )
-
- We're using two generic views here:
-diff --git a/docs/ref/contrib/admin/index.txt b/docs/ref/contrib/admin/index.txt
-index beff94e..7394c3a 100644
---- a/docs/ref/contrib/admin/index.txt
-+++ b/docs/ref/contrib/admin/index.txt
-@@ -19,8 +19,10 @@ There are six steps in activating the Django admin site:
- 1. Add ``'django.contrib.admin'`` to your :setting:`INSTALLED_APPS`
- setting.
-
-- 2. Admin has two dependencies - :mod:`django.contrib.auth` and
-- :mod:`django.contrib.contenttypes`. If these applications are not
-+ 2. The admin has four dependencies - :mod:`django.contrib.auth`,
-+ :mod:`django.contrib.contenttypes`,
-+ :mod:`django.contrib.messages` and
-+ :mod:`django.contrib.sessions`. If these applications are not
- in your :setting:`INSTALLED_APPS` list, add them.
-
- 3. Determine which of your application's models should be editable in the
-@@ -542,7 +544,7 @@ subclass::
- Fields in ``list_filter`` can also span relations using the ``__`` lookup::
-
- class UserAdminWithLookup(UserAdmin):
-- list_filter = ('groups__name')
-+ list_filter = ('groups__name',)
-
- .. attribute:: ModelAdmin.list_per_page
-
-diff --git a/docs/ref/contrib/gis/geoip.txt b/docs/ref/contrib/gis/geoip.txt
-index 6503be7..f5c45e1 100644
---- a/docs/ref/contrib/gis/geoip.txt
-+++ b/docs/ref/contrib/gis/geoip.txt
-@@ -144,7 +144,7 @@ parameters.
- Returns a dictionary of city information for the given query. Some
- of the values in the dictionary may be undefined (``None``).
-
--.. method:: GeoIPcountry(query)
-+.. method:: GeoIP.country(query)
-
- Returns a dictionary with the country code and country for the given
- query.
-diff --git a/docs/ref/contrib/messages.txt b/docs/ref/contrib/messages.txt
-index ca3212d..ee7e01c 100644
---- a/docs/ref/contrib/messages.txt
-+++ b/docs/ref/contrib/messages.txt
-@@ -210,6 +210,10 @@ If you're using the context processor, your template should be rendered with a
- ``RequestContext``. Otherwise, ensure ``messages`` is available to
- the template context.
-
-+Even if you know there is only just one message, you should still iterate over
-+the ``messages`` sequence, because otherwise the message storage will not be cleared
-+for the next request.
-+
- Creating custom message levels
- ------------------------------
-
-diff --git a/docs/ref/django-admin.txt b/docs/ref/django-admin.txt
-index 89bc43f..58b86ea 100644
---- a/docs/ref/django-admin.txt
-+++ b/docs/ref/django-admin.txt
-@@ -1156,7 +1156,7 @@ variable.
- Note that this option is unnecessary in ``manage.py``, because it takes care of
- setting the Python path for you.
-
--.. _import search path: http://diveintopython.org/getting_to_know_python/everything_is_an_object.html
-+.. _import search path: http://diveintopython.net/getting_to_know_python/everything_is_an_object.html
-
- .. django-admin-option:: --settings
-
-diff --git a/docs/ref/models/instances.txt b/docs/ref/models/instances.txt
-index 3728a09..52c0869 100644
---- a/docs/ref/models/instances.txt
-+++ b/docs/ref/models/instances.txt
-@@ -470,7 +470,7 @@ the URL. For example, if your URLconf contained a line such as::
-
- Similarly, if you had a URLconf entry that looked like::
-
-- (r'/archive/(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})/$', archive_view)
-+ (r'/archive/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/$', archive_view)
-
- ...you could reference this using ``permalink()`` as follows::
-
-@@ -478,8 +478,8 @@ Similarly, if you had a URLconf entry that looked like::
- def get_absolute_url(self):
- return ('archive_view', (), {
- 'year': self.created.year,
-- 'month': self.created.month,
-- 'day': self.created.day})
-+ 'month': self.created.strftime('%m'),
-+ 'day': self.created.strftime('%d')})
-
- Notice that we specify an empty sequence for the second parameter in this case,
- because we only want to pass keyword parameters, not positional ones.
-diff --git a/docs/ref/models/options.txt b/docs/ref/models/options.txt
-index 4530439..c1beab0 100644
---- a/docs/ref/models/options.txt
-+++ b/docs/ref/models/options.txt
-@@ -166,6 +166,13 @@ Django quotes column and table names behind the scenes.
- >>> answer.get_previous_in_order()
- <Answer: 1>
-
-+.. admonition:: Changing order_with_respect_to
-+
-+ ``order_with_respect_to`` adds an additional field/database column
-+ named ``_order``, so be sure to handle that as you would any other
-+ change to your models if you add or change ``order_with_respect_to``
-+ after your initial :djadmin:`syncdb`.
-+
- ``ordering``
- ------------
-
-@@ -238,6 +245,12 @@ Django quotes column and table names behind the scenes.
-
- unique_together = ("driver", "restaurant")
-
-+ A :class:`~django.db.models.ManyToManyField` cannot be included in
-+ unique_together (it's not even clear what that would mean). If you
-+ need to validate uniqueness related to a
-+ :class:`~django.db.models.ManyToManyField`, look at signals or
-+ using an explicit :attr:`through <ManyToManyField.through>` model.
-+
- ``verbose_name``
- ----------------
-
-diff --git a/docs/ref/signals.txt b/docs/ref/signals.txt
-index e83142e..ad25dce 100644
---- a/docs/ref/signals.txt
-+++ b/docs/ref/signals.txt
-@@ -352,12 +352,16 @@ post_syncdb
- .. data:: django.db.models.signals.post_syncdb
- :module:
-
--Sent by :djadmin:`syncdb` after it installs an application.
-+Sent by :djadmin:`syncdb` command after it installs an application, and
-+:djadmin:`flush` command.
-
- Any handlers that listen to this signal need to be written in a particular
- place: a ``management`` module in one of your :setting:`INSTALLED_APPS`. If
- handlers are registered anywhere else they may not be loaded by
--:djadmin:`syncdb`.
-+:djadmin:`syncdb`. It is important that handlers of this signal perform
-+idempotent changes (e.g. no database alterations) as this may cause the
-+:djadmin:`flush` management command to fail if it also ran during the
-+:djadmin:`syncdb` command.
-
- Arguments sent with this signal:
-
-diff --git a/docs/ref/templates/builtins.txt b/docs/ref/templates/builtins.txt
-index 7d24c1d..6c7057a 100644
---- a/docs/ref/templates/builtins.txt
-+++ b/docs/ref/templates/builtins.txt
-@@ -1868,7 +1868,7 @@ slice
- Returns a slice of the list.
-
- Uses the same syntax as Python's list slicing. See
--http://diveintopython.org/native_data_types/lists.html#odbchelper.list.slice
-+http://diveintopython.net/native_data_types/lists.html#odbchelper.list.slice
- for an introduction.
-
- Example::
-diff --git a/docs/releases/0.95.txt b/docs/releases/0.95.txt
-index 7409bff..3632c31 100644
---- a/docs/releases/0.95.txt
-+++ b/docs/releases/0.95.txt
-@@ -92,15 +92,15 @@ changes is described in the `Removing The Magic`_ wiki page. There is also an
- easy checklist_ for reference when undertaking the porting operation.
-
- .. _Removing The Magic: http://code.djangoproject.com/wiki/RemovingTheMagic
--.. _checklist: http://code.djangoproject.com/wiki/MagicRemovalCheatSheet1
-+.. _checklist: http://code.djangoproject.com/wiki/MagicRemovalCheatSheet
-
- Problem reports and getting help
- ================================
-
--Need help resolving a problem with Django? The documentation in the distribution
--is also available online_ at the `Django Web site`_. The :doc:`FAQ </faq/index>`
--document is especially recommended, as it contains a number of issues that come
--up time and again.
-+Need help resolving a problem with Django? The documentation in the
-+distribution is also available :doc:`online </index>` at the `Django Web
-+site`_. The :doc:`FAQ </faq/index>` document is especially recommended, as it
-+contains a number of issues that come up time and again.
-
- For more personalized help, the `django-users`_ mailing list is a very active
- list, with more than 2,000 subscribers who can help you solve any sort of
-@@ -113,7 +113,6 @@ there's a #django channel on irc.freenode.net that is regularly populated by
- Django users and developers from around the world. Friendly people are usually
- available at any hour of the day -- to help, or just to chat.
-
--.. _online: http://www.djangoproject.com/documentation/0.95/
- .. _Django Web site: http://www.djangoproject.com/
- .. _django-users: http://groups.google.com/group/django-users
-
-diff --git a/docs/releases/0.96.txt b/docs/releases/0.96.txt
-index 1224360..8874ccb 100644
---- a/docs/releases/0.96.txt
-+++ b/docs/releases/0.96.txt
-@@ -50,12 +50,10 @@ aside from any necessary security fixes, it will not be actively
- maintained, and it will be removed in a future release of Django.
-
- Also, note that some features, like the new :setting:`DATABASE_OPTIONS`
--setting (see the `databases documentation`_ for details), are only
--available on the "mysql" backend, and will not be made available for
-+setting (see the :doc:`databases documentation </ref/databases>` for details),
-+are only available on the "mysql" backend, and will not be made available for
- "mysql_old".
-
--.. _databases documentation: http://www.djangoproject.com/documentation/0.96/databases/
--
- Database constraint names changed
- ---------------------------------
-
-@@ -164,10 +162,8 @@ Although the ``newforms`` library will continue to evolve, it's ready for use
- for most common cases. We recommend that anyone new to form handling skip the
- old forms system and start with the new.
-
--For more information about ``django.newforms``, read the `newforms
--documentation`_.
--
--.. _newforms documentation: http://www.djangoproject.com/documentation/0.96/newforms/
-+For more information about ``django.newforms``, read the :doc:`newforms
-+documentation </topics/forms/index>`.
-
- URLconf improvements
- --------------------
-@@ -216,19 +212,15 @@ The test framework
- ------------------
-
- Django now includes a test framework so you can start transmuting fear into
--boredom (with apologies to Kent Beck). You can write tests based on doctest_
--or unittest_ and test your views with a simple test client.
-+boredom (with apologies to Kent Beck). You can write tests based on
-+:mod:`doctest` or :mod:`unittest` and test your views with a simple test client.
-
- There is also new support for "fixtures" -- initial data, stored in any of the
--supported `serialization formats`_, that will be loaded into your database at the
--start of your tests. This makes testing with real data much easier.
--
--See `the testing documentation`_ for the full details.
-+supported :doc:`serialization formats </topics/serialization>`, that will be
-+loaded into your database at the start of your tests. This makes testing with
-+real data much easier.
-
--.. _doctest: http://docs.python.org/library/doctest.html
--.. _unittest: http://docs.python.org/library/unittest.html
--.. _the testing documentation: http://www.djangoproject.com/documentation/0.96/testing/
--.. _serialization formats: http://www.djangoproject.com/documentation/0.96/serialization/
-+See :doc:`the testing documentation </topics/testing>` for the full details.
-
- Improvements to the admin interface
- -----------------------------------
-diff --git a/docs/releases/1.0.1.txt b/docs/releases/1.0.1.txt
-index 780dc53..3550e7c 100644
---- a/docs/releases/1.0.1.txt
-+++ b/docs/releases/1.0.1.txt
-@@ -6,10 +6,10 @@ Welcome to Django 1.0.1!
-
- This is the first "bugfix" release in the Django 1.0 series, improving
- the stability and performance of the Django 1.0 codebase. As such,
--Django 1.0.1 contains no new features (and, pursuant to `our
--compatibility policy`_, maintains backwards compatibility with Django
--1.0), but does contain a number of fixes and other
--improvements. Django 1.0.1 is a recommended upgrade for any
-+Django 1.0.1 contains no new features (and, pursuant to :doc:`our
-+compatibility policy </misc/api-stability/>`, maintains backwards
-+compatibility with Django 1.0), but does contain a number of fixes
-+and other improvements. Django 1.0.1 is a recommended upgrade for any
- development or deployment currently using or targeting Django 1.0.
-
-
-@@ -46,8 +46,9 @@ highlights:
-
- * A fix to the application of autoescaping for literal strings passed
- to the ``join`` template filter. Previously, literal strings passed
-- to ``join`` were automatically escaped, contrary to `the documented
-- behavior for autoescaping and literal strings`_. Literal strings
-+ to ``join`` were automatically escaped, contrary to :ref:`the
-+ documented behavior for autoescaping and literal strings
-+ <string-literals-and-automatic-escaping>`. Literal strings
- passed to ``join`` are no longer automatically escaped, meaning you
- must now manually escape them; this is an incompatibility if you
- were relying on this bug, but not if you were relying on escaping
-@@ -60,6 +61,4 @@ highlights:
- documentation, including both corrections to existing documents and
- expanded and new documentation.
-
--.. _our compatibility policy: http://docs.djangoproject.com/en/dev/misc/api-stability/
- .. _the Subversion log of the 1.0.X branch: http://code.djangoproject.com/log/django/branches/releases/1.0.X
--.. _the documented behavior for autoescaping and literal strings: http://docs.djangoproject.com/en/dev/topics/templates/#string-literals-and-automatic-escaping
-diff --git a/docs/releases/1.2.6.txt b/docs/releases/1.2.6.txt
-new file mode 100644
-index 0000000..cfd1d9c
---- /dev/null
-+++ b/docs/releases/1.2.6.txt
-@@ -0,0 +1,16 @@
-+==========================
-+Django 1.2.6 release notes
-+==========================
-+
-+*September 9, 2011*
-+
-+Welcome to Django 1.2.6!
-+
-+This is the sixth bugfix/security release in the Django 1.2 series, fixing
-+several security issues present in Django 1.2.5. Django 1.2.6 is a
-+recommended upgrade for all users of any Django release in the 1.2.X series.
-+
-+For a full list of issues addressed in this release, see the `security
-+advisory`_.
-+
-+.. _security advisory: https://www.djangoproject.com/weblog/2011/sep/09/security-releases-issued/
-diff --git a/docs/releases/1.2.7.txt b/docs/releases/1.2.7.txt
-new file mode 100644
-index 0000000..c0cf698
---- /dev/null
-+++ b/docs/releases/1.2.7.txt
-@@ -0,0 +1,16 @@
-+==========================
-+Django 1.2.7 release notes
-+==========================
-+
-+*September 10, 2011*
-+
-+Welcome to Django 1.2.7!
-+
-+This is the seventh bugfix/security release in the Django 1.2 series. It
-+replaces Django 1.2.6 due to problems with the 1.2.6 release tarball.
-+Django 1.2.7 is a recommended upgrade for all users of any Django release in
-+the 1.2.X series.
-+
-+For more information, see the `release advisory`_.
-+
-+.. _release advisory: https://www.djangoproject.com/weblog/2011/sep/10/127/
-diff --git a/docs/releases/1.3.1.txt b/docs/releases/1.3.1.txt
-new file mode 100644
-index 0000000..4c28916
---- /dev/null
-+++ b/docs/releases/1.3.1.txt
-@@ -0,0 +1,16 @@
-+==========================
-+Django 1.3.1 release notes
-+==========================
-+
-+*September 9, 2011*
-+
-+Welcome to Django 1.3.1!
-+
-+This is the first security release in the Django 1.3 series, fixing several
-+security issues in Django 1.3. Django 1.3.1 is a recommended upgrade for
-+all users of Django 1.3.
-+
-+For a full list of issues addressed in this release, see the `security
-+advisory`_.
-+
-+.. _security advisory: https://www.djangoproject.com/weblog/2011/sep/09/security-releases-issued/
-diff --git a/docs/releases/index.txt b/docs/releases/index.txt
-index 8d23c28..40fe5b0 100644
---- a/docs/releases/index.txt
-+++ b/docs/releases/index.txt
-@@ -19,6 +19,7 @@ Final releases
- .. toctree::
- :maxdepth: 1
-
-+ 1.3.1
- 1.3
-
- 1.2 release
-@@ -26,6 +27,8 @@ Final releases
- .. toctree::
- :maxdepth: 1
-
-+ 1.2.7
-+ 1.2.6
- 1.2.5
- 1.2.4
- 1.2.2
-diff --git a/docs/topics/auth.txt b/docs/topics/auth.txt
-index 635f18f..5a2608a 100644
---- a/docs/topics/auth.txt
-+++ b/docs/topics/auth.txt
-@@ -1251,16 +1251,19 @@ can or cannot do with Task instances, specific to your application::
- ...
- class Meta:
- permissions = (
-- ("can_view", "Can see available tasks"),
-- ("can_change_status", "Can change the status of tasks"),
-- ("can_close", "Can remove a task by setting its status as closed"),
-+ ("view_task", "Can see available tasks"),
-+ ("change_task_status", "Can change the status of tasks"),
-+ ("close_task", "Can remove a task by setting its status as closed"),
- )
-
- The only thing this does is create those extra permissions when you run
- :djadmin:`manage.py syncdb <syncdb>`. Your code is in charge of checking the
- value of these permissions when an user is trying to access the functionality
- provided by the application (viewing tasks, changing the status of tasks,
--closing tasks.)
-+closing tasks.) Continuing the above example, the following checks if a user may
-+view tasks::
-+
-+ user.has_perm('app.view_task')
-
- API reference
- -------------
-diff --git a/docs/topics/cache.txt b/docs/topics/cache.txt
-index 8ef4ea2..9b68353 100644
---- a/docs/topics/cache.txt
-+++ b/docs/topics/cache.txt
-@@ -99,8 +99,9 @@ To use Memcached with Django:
- on your chosen memcached binding)
-
- * Set :setting:`LOCATION <CACHES-LOCATION>` to ``ip:port`` values,
-- where ``ip`` is the IP address of the Memcached daemon and
-- ``port`` is the port on which Memcached is running.
-+ where ``ip`` is the IP address of the Memcached daemon and ``port`` is the
-+ port on which Memcached is running, or to a ``unix:path`` value, where
-+ ``path`` is the path to a Memcached Unix socket file.
-
- In this example, Memcached is running on localhost (127.0.0.1) port 11211, using
- the ``python-memcached`` binding::
-@@ -112,6 +113,16 @@ the ``python-memcached`` binding::
- }
- }
-
-+In this example, Memcached is available through a local Unix socket file
-+:file:`/tmp/memcached.sock` using the ``python-memcached`` binding::
-+
-+ CACHES = {
-+ 'default': {
-+ 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
-+ 'LOCATION': 'unix:/tmp/memcached.sock',
-+ }
-+ }
-+
- One excellent feature of Memcached is its ability to share cache over multiple
- servers. This means you can run Memcached daemons on multiple machines, and the
- program will treat the group of machines as a *single* cache, without the need
-@@ -526,9 +537,10 @@ you may expect. But once a particular URL (e.g., ``/foo/23/``) has been
- requested, subsequent requests to that URL will use the cache.
-
- ``cache_page`` can also take an optional keyword argument, ``cache``,
--which directs the decorator to use a specific cache alias when caching view
--results. By default, the ``default`` alias will be used, but you can specify
--any cache alias you want::
-+which directs the decorator to use a specific cache (from your
-+:setting:`CACHES` setting) when caching view results. By default, the
-+``default`` cache will be used, but you can specify any cache you
-+want::
-
- @cache_page(60 * 15, cache="special_cache")
- def my_view(request):
-diff --git a/docs/topics/class-based-views.txt b/docs/topics/class-based-views.txt
-index 3831046..4da48ec 100644
---- a/docs/topics/class-based-views.txt
-+++ b/docs/topics/class-based-views.txt
-@@ -380,7 +380,7 @@ Next, we'll write the ``PublisherBookListView`` view itself::
- class PublisherBookListView(ListView):
-
- context_object_name = "book_list"
-- template_name = "books/books_by_publisher.html",
-+ template_name = "books/books_by_publisher.html"
-
- def get_queryset(self):
- publisher = get_object_or_404(Publisher, name__iexact=self.args[0])
-@@ -396,7 +396,7 @@ use it in the template::
- class PublisherBookListView(ListView):
-
- context_object_name = "book_list"
-- template_name = "books/books_by_publisher.html",
-+ template_name = "books/books_by_publisher.html"
-
- def get_queryset(self):
- self.publisher = get_object_or_404(Publisher, name__iexact=self.args[0])
-diff --git a/docs/topics/db/models.txt b/docs/topics/db/models.txt
-index 0e18205..af76344 100644
---- a/docs/topics/db/models.txt
-+++ b/docs/topics/db/models.txt
-@@ -324,11 +324,10 @@ whatever you want. For example::
- should work; all are optional.
-
- For details on accessing backwards-related objects, see the
-- `Following relationships backward example`_.
--
-+ :ref:`Following relationships backward example <backwards-related-objects>`.
-+
- For sample code, see the `Many-to-one relationship model tests`_.
-
-- .. _Following relationships backward example: http://docs.djangoproject.com/en/dev/topics/db/queries/#backwards-related-objects
- .. _Many-to-one relationship model tests: http://code.djangoproject.com/browser/django/trunk/tests/modeltests/many_to_one
-
- Many-to-many relationships
-diff --git a/docs/topics/db/sql.txt b/docs/topics/db/sql.txt
-index fe71736..d9b8b1a 100644
---- a/docs/topics/db/sql.txt
-+++ b/docs/topics/db/sql.txt
-@@ -236,6 +236,30 @@ alias::
- # Your code here...
- transaction.commit_unless_managed(using='my_db_alias')
-
-+By default, the Python DB API will return results without their field
-+names, which means you end up with a ``list`` of values, rather than a
-+``dict``. At a small performance cost, you can return results as a
-+``dict`` by using something like this::
-+
-+ def dictfetchall(cursor):
-+ "Returns all rows from a cursor as a dict"
-+ desc = cursor.description
-+ return [
-+ dict(zip([col[0] for col in desc], row))
-+ for row in cursor.fetchall()
-+ ]
-+
-+Here is an example of the difference between the two::
-+
-+ >>> cursor.execute("SELECT id, parent_id from test LIMIT 2");
-+ >>> cursor.fetchall()
-+ ((54360982L, None), (54360880L, None))
-+
-+ >>> cursor.execute("SELECT id, parent_id from test LIMIT 2");
-+ >>> dictfetchall(cursor)
-+ [{'parent_id': None, 'id': 54360982L}, {'parent_id': None, 'id': 54360880L}]
-+
-+
- .. _transactions-and-raw-sql:
-
- Transactions and raw SQL
-diff --git a/docs/topics/forms/modelforms.txt b/docs/topics/forms/modelforms.txt
-index 07bc5e3..24e000e 100644
---- a/docs/topics/forms/modelforms.txt
-+++ b/docs/topics/forms/modelforms.txt
-@@ -332,13 +332,17 @@ Since the Author model has only 3 fields, 'name', 'title', and
- .. note::
-
- If you specify ``fields`` or ``exclude`` when creating a form with
-- ``ModelForm``, then the fields that are not in the resulting form will not
-- be set by the form's ``save()`` method. Django will prevent any attempt to
-- save an incomplete model, so if the model does not allow the missing fields
-- to be empty, and does not provide a default value for the missing fields,
-- any attempt to ``save()`` a ``ModelForm`` with missing fields will fail.
-- To avoid this failure, you must instantiate your model with initial values
-- for the missing, but required fields::
-+ ``ModelForm``, then the fields that are not in the resulting form
-+ will not be set by the form's ``save()`` method. Also, if you
-+ manually add the excluded fields back to the form, they will not
-+ be initialized from the model instance.
-+
-+ Django will prevent any attempt to save an incomplete model, so if
-+ the model does not allow the missing fields to be empty, and does
-+ not provide a default value for the missing fields, any attempt to
-+ ``save()`` a ``ModelForm`` with missing fields will fail. To
-+ avoid this failure, you must instantiate your model with initial
-+ values for the missing, but required fields::
-
- author = Author(title='Mr')
- form = PartialAuthorForm(request.POST, instance=author)
-@@ -633,6 +637,12 @@ database. If a given instance's data didn't change in the bound data, the
- instance won't be saved to the database and won't be included in the return
- value (``instances``, in the above example).
-
-+When fields are missing from the form (for example because they have
-+been excluded), these fields will not be set by the ``save()``
-+method. You can find more information about this restriction, which
-+also holds for regular ``ModelForms``, in `Using a subset of fields on
-+the form`_.
-+
- Pass ``commit=False`` to return the unsaved model instances::
-
- # don't save to the database
-diff --git a/docs/topics/http/urls.txt b/docs/topics/http/urls.txt
-index 1caa801..7a0e724 100644
---- a/docs/topics/http/urls.txt
-+++ b/docs/topics/http/urls.txt
-@@ -54,6 +54,10 @@ algorithm the system follows to determine which Python code to execute:
- :class:`~django.http.HttpRequest` as its first argument and any values
- captured in the regex as remaining arguments.
-
-+ 5. If no regex matches, or if an exception is raised during any
-+ point in this process, Django invokes an appropriate
-+ error-handling view. See `Error handling`_ below.
-+
- Example
- =======
-
-@@ -99,10 +103,10 @@ Example requests:
- * ``/articles/2003`` would not match any of these patterns, because each
- pattern requires that the URL end with a slash.
-
-- * ``/articles/2003/03/3/`` would match the final pattern. Django would call
-- the function ``news.views.article_detail(request, '2003', '03', '3')``.
-+ * ``/articles/2003/03/03/`` would match the final pattern. Django would call
-+ the function ``news.views.article_detail(request, '2003', '03', '03')``.
-
--.. _Dive Into Python's explanation: http://diveintopython.org/regular_expressions/street_addresses.html#re.matching.2.3
-+.. _Dive Into Python's explanation: http://diveintopython.net/regular_expressions/street_addresses.html#re.matching.2.3
-
- Named groups
- ============
-@@ -123,7 +127,7 @@ Here's the above example URLconf, rewritten to use named groups::
- (r'^articles/2003/$', 'news.views.special_case_2003'),
- (r'^articles/(?P<year>\d{4})/$', 'news.views.year_archive'),
- (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$', 'news.views.month_archive'),
-- (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d+)/$', 'news.views.article_detail'),
-+ (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/$', 'news.views.article_detail'),
- )
-
- This accomplishes exactly the same thing as the previous example, with one
-@@ -134,8 +138,8 @@ arguments rather than positional arguments. For example:
- ``news.views.month_archive(request, year='2005', month='03')``, instead
- of ``news.views.month_archive(request, '2005', '03')``.
-
-- * A request to ``/articles/2003/03/3/`` would call the function
-- ``news.views.article_detail(request, year='2003', month='03', day='3')``.
-+ * A request to ``/articles/2003/03/03/`` would call the function
-+ ``news.views.article_detail(request, year='2003', month='03', day='03')``.
-
- In practice, this means your URLconfs are slightly more explicit and less prone
- to argument-order bugs -- and you can reorder the arguments in your views'
-@@ -246,6 +250,31 @@ The ``prefix`` parameter has the same meaning as the first argument to
- ``patterns()`` and is only relevant when you're passing a string as the
- ``view`` parameter.
-
-+include
-+-------
-+
-+.. function:: include(<module or pattern_list>)
-+
-+A function that takes a full Python import path to another URLconf module that
-+should be "included" in this place.
-+
-+:func:`include` also accepts as an argument an iterable that returns URL
-+patterns.
-+
-+See `Including other URLconfs`_ below.
-+
-+Error handling
-+==============
-+
-+When Django can't find a regex matching the requested URL, or when an
-+exception is raised, Django will invoke an error-handling view. The
-+views to use for these cases are specified by two variables which can
-+be set in your root URLconf. Setting these variables in any other
-+URLconf will have no effect.
-+
-+See the documentation on :ref:`customizing error views
-+<customizing-error-views>` for more details.
-+
- handler404
- ----------
-
-@@ -275,19 +304,6 @@ value should suffice.
- .. versionchanged:: 1.2
- Previous versions of Django only accepted strings representing import paths.
-
--include
---------
--
--.. function:: include(<module or pattern_list>)
--
--A function that takes a full Python import path to another URLconf module that
--should be "included" in this place.
--
--:func:`include` also accepts as an argument an iterable that returns URL
--patterns.
--
--See `Including other URLconfs`_ below.
--
- Notes on capturing text in URLs
- ===============================
-
-@@ -420,8 +436,8 @@ directly the pattern list as returned by `patterns`_ instead. For example::
- from django.conf.urls.defaults import *
-
- extra_patterns = patterns('',
-- url(r'reports/(?P<id>\d+)/$', 'credit.views.report', name='credit-reports'),
-- url(r'charge/$', 'credit.views.charge', name='credit-charge'),
-+ url(r'^reports/(?P<id>\d+)/$', 'credit.views.report', name='credit-reports'),
-+ url(r'^charge/$', 'credit.views.charge', name='credit-charge'),
- )
-
- urlpatterns = patterns('',
-diff --git a/docs/topics/http/views.txt b/docs/topics/http/views.txt
-index 99359ab..83a52cb 100644
---- a/docs/topics/http/views.txt
-+++ b/docs/topics/http/views.txt
-@@ -122,6 +122,8 @@ In order to use the ``Http404`` exception to its fullest, you should create a
- template that is displayed when a 404 error is raised. This template should be
- called ``404.html`` and located in the top level of your template tree.
-
-+.. _customizing-error-views:
-+
- Customizing error views
- =======================
-
-diff --git a/docs/topics/i18n/internationalization.txt b/docs/topics/i18n/internationalization.txt
-index 5d50fa7..a83299c 100644
---- a/docs/topics/i18n/internationalization.txt
-+++ b/docs/topics/i18n/internationalization.txt
-@@ -477,7 +477,7 @@ for use within the translation block. Examples::
-
- You can use multiple expressions inside a single ``blocktrans`` tag::
-
-- {% blocktrans with book_t=book|title and author_t=author|title %}
-+ {% blocktrans with book_t=book|title author_t=author|title %}
- This is {{ book_t }} by {{ author_t }}
- {% endblocktrans %}
-
-diff --git a/docs/topics/settings.txt b/docs/topics/settings.txt
-index 61ddf8c..bda51f2 100644
---- a/docs/topics/settings.txt
-+++ b/docs/topics/settings.txt
-@@ -39,7 +39,7 @@ The value of ``DJANGO_SETTINGS_MODULE`` should be in Python path syntax, e.g.
- ``mysite.settings``. Note that the settings module should be on the
- Python `import search path`_.
-
--.. _import search path: http://diveintopython.org/getting_to_know_python/everything_is_an_object.html
-+.. _import search path: http://diveintopython.net/getting_to_know_python/everything_is_an_object.html
-
- The django-admin.py utility
- ---------------------------
-diff --git a/docs/topics/templates.txt b/docs/topics/templates.txt
-index 83269ae..fc2cd3f 100644
---- a/docs/topics/templates.txt
-+++ b/docs/topics/templates.txt
-@@ -555,6 +555,8 @@ variable that needs escaping. When auto-escaping is on, there's no danger of
- the ``escape`` filter *double-escaping* data -- the ``escape`` filter does not
- affect auto-escaped variables.
-
-+.. _string-literals-and-automatic-escaping:
-+
- String literals and automatic escaping
- --------------------------------------
-
-diff --git a/docs/topics/testing.txt b/docs/topics/testing.txt
-index 0a86f0d..8262b57 100644
---- a/docs/topics/testing.txt
-+++ b/docs/topics/testing.txt
-@@ -1586,7 +1586,7 @@ skipUnlessDBFeature
- Skip the decorated test if the named database feature is *not*
- supported.
-
--For example, the following test will not be executed if the database
-+For example, the following test will only be executed if the database
- supports transactions (e.g., it would run under PostgreSQL, but *not*
- under MySQL with MyISAM tables)::
-
-diff --git a/tests/modeltests/validators/tests.py b/tests/modeltests/validators/tests.py
-index e585262..4bd5827 100644
---- a/tests/modeltests/validators/tests.py
-+++ b/tests/modeltests/validators/tests.py
-@@ -28,6 +28,9 @@ TEST_DATA = (
- (validate_email, 'abc', ValidationError),
- (validate_email, 'a @x.cz', ValidationError),
- (validate_email, 'something@@somewhere.com', ValidationError),
-+ # Quoted-string format (CR not allowed)
-+ (validate_email, '"\\\011"@here.com', None),
-+ (validate_email, '"\\\012"@here.com', ValidationError),
-
- (validate_slug, 'slug-ok', None),
- (validate_slug, 'longer-slug-still-ok', None),
-diff --git a/tests/regressiontests/httpwrappers/tests.py b/tests/regressiontests/httpwrappers/tests.py
-index 2e2932f..6aabfe6 100644
---- a/tests/regressiontests/httpwrappers/tests.py
-+++ b/tests/regressiontests/httpwrappers/tests.py
-@@ -281,3 +281,9 @@ class CookieTests(unittest.TestCase):
- Test that a single non-standard cookie name doesn't affect all cookies. Ticket #13007.
- """
- self.assertTrue('good_cookie' in parse_cookie('good_cookie=yes;bad:cookie=yes').keys())
-+
-+ def test_repeated_nonstandard_keys(self):
-+ """
-+ Test that a repeated non-standard name doesn't affect all cookies. Ticket #15852
-+ """
-+ self.assertTrue('good_cookie' in parse_cookie('a,=b; a,=c; good_cookie=yes').keys())
-diff --git a/tests/regressiontests/utils/http.py b/tests/regressiontests/utils/http.py
-index 83a4a7f..666d04f 100644
---- a/tests/regressiontests/utils/http.py
-+++ b/tests/regressiontests/utils/http.py
-@@ -1,5 +1,7 @@
- from django.utils import http
- from django.utils import unittest
-+from django.http import HttpResponse, utils
-+from django.test import RequestFactory
-
- class TestUtilsHttp(unittest.TestCase):
-
-@@ -21,3 +23,49 @@ class TestUtilsHttp(unittest.TestCase):
- self.assertFalse(http.same_origin('http://foo.com', 'http://foo.com.evil.com'))
- # Different port
- self.assertFalse(http.same_origin('http://foo.com:8000', 'http://foo.com:8001'))
-+
-+ def test_fix_IE_for_vary(self):
-+ """
-+ Regression for #16632.
-+
-+ `fix_IE_for_vary` shouldn't crash when there's no Content-Type header.
-+ """
-+
-+ # functions to generate responses
-+ def response_with_unsafe_content_type():
-+ r = HttpResponse(content_type="text/unsafe")
-+ r['Vary'] = 'Cookie'
-+ return r
-+
-+ def no_content_response_with_unsafe_content_type():
-+ # 'Content-Type' always defaulted, so delete it
-+ r = response_with_unsafe_content_type()
-+ del r['Content-Type']
-+ return r
-+
-+ # request with & without IE user agent
-+ rf = RequestFactory()
-+ request = rf.get('/')
-+ ie_request = rf.get('/', HTTP_USER_AGENT='MSIE')
-+
-+ # not IE, unsafe_content_type
-+ response = response_with_unsafe_content_type()
-+ utils.fix_IE_for_vary(request, response)
-+ self.assertTrue('Vary' in response)
-+
-+ # IE, unsafe_content_type
-+ response = response_with_unsafe_content_type()
-+ utils.fix_IE_for_vary(ie_request, response)
-+ self.assertFalse('Vary' in response)
-+
-+ # not IE, no_content
-+ response = no_content_response_with_unsafe_content_type()
-+ utils.fix_IE_for_vary(request, response)
-+ self.assertTrue('Vary' in response)
-+
-+ # IE, no_content
-+ response = no_content_response_with_unsafe_content_type()
-+ utils.fix_IE_for_vary(ie_request, response)
-+ self.assertFalse('Vary' in response)
-+
-+
diff --git a/libre/django13/diff-django_branches_releases_1.3.X-from-16771-to-17460.diff b/libre/django13/diff-django_branches_releases_1.3.X-from-16771-to-17460.diff
deleted file mode 100644
index ebbf80993..000000000
--- a/libre/django13/diff-django_branches_releases_1.3.X-from-16771-to-17460.diff
+++ /dev/null
@@ -1,1575 +0,0 @@
-Index: django/http/__init__.py
-===================================================================
---- django/http/__init__.py (revision 16771)
-+++ django/http/__init__.py (revision 17460)
-@@ -92,7 +92,7 @@
- if not _cookie_allows_colon_in_names:
- def load(self, rawdata, ignore_parse_errors=False):
- if ignore_parse_errors:
-- self.bad_cookies = []
-+ self.bad_cookies = set()
- self._BaseCookie__set = self._loose_set
- super(SimpleCookie, self).load(rawdata)
- if ignore_parse_errors:
-@@ -106,8 +106,8 @@
- try:
- self._strict_set(key, real_value, coded_value)
- except Cookie.CookieError:
-- self.bad_cookies.append(key)
-- dict.__setitem__(self, key, None)
-+ self.bad_cookies.add(key)
-+ dict.__setitem__(self, key, Cookie.Morsel())
-
-
- class CompatCookie(SimpleCookie):
-Index: django/http/utils.py
-===================================================================
---- django/http/utils.py (revision 16771)
-+++ django/http/utils.py (revision 17460)
-@@ -76,7 +76,8 @@
-
- # The first part of the Content-Type field will be the MIME type,
- # everything after ';', such as character-set, can be ignored.
-- if response['Content-Type'].split(';')[0] not in safe_mime_types:
-+ mime_type = response.get('Content-Type', '').partition(';')[0]
-+ if mime_type not in safe_mime_types:
- try:
- del response['Vary']
- except KeyError:
-Index: django/db/backends/creation.py
-===================================================================
---- django/db/backends/creation.py (revision 16771)
-+++ django/db/backends/creation.py (revision 17460)
-@@ -374,15 +374,6 @@
- verbosity=max(verbosity - 1, 0),
- interactive=False,
- database=self.connection.alias)
--
-- # One effect of calling syncdb followed by flush is that the id of the
-- # default site may or may not be 1, depending on how the sequence was
-- # reset. If the sites app is loaded, then we coerce it.
-- from django.db.models import get_model
-- if 'django.contrib.sites' in settings.INSTALLED_APPS:
-- Site = get_model('sites', 'Site')
-- if Site is not None and Site.objects.using(self.connection.alias).count() == 1:
-- Site.objects.using(self.connection.alias).update(id=settings.SITE_ID)
-
- from django.core.cache import get_cache
- from django.core.cache.backends.db import BaseDatabaseCache
-Index: django/core/validators.py
-===================================================================
---- django/core/validators.py (revision 16771)
-+++ django/core/validators.py (revision 17460)
-@@ -147,7 +147,8 @@
-
- email_re = re.compile(
- r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*" # dot-atom
-- r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-011\013\014\016-\177])*"' # quoted-string
-+ # quoted-string, see also http://tools.ietf.org/html/rfc2822#section-3.2.5
-+ r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-\011\013\014\016-\177])*"'
- r')@(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,6}\.?$', re.IGNORECASE) # domain
- validate_email = EmailValidator(email_re, _(u'Enter a valid e-mail address.'), 'invalid')
-
-Index: django/core/management/commands/shell.py
-===================================================================
---- django/core/management/commands/shell.py (revision 16771)
-+++ django/core/management/commands/shell.py (revision 17460)
-@@ -13,9 +13,8 @@
-
- def ipython(self):
- try:
-- from IPython.frontend.terminal.embed import TerminalInteractiveShell
-- shell = TerminalInteractiveShell()
-- shell.mainloop()
-+ from IPython import embed
-+ embed()
- except ImportError:
- # IPython < 0.11
- # Explicitly pass an empty list as arguments, because otherwise
-Index: django/contrib/gis/db/models/sql/compiler.py
-===================================================================
---- django/contrib/gis/db/models/sql/compiler.py (revision 16771)
-+++ django/contrib/gis/db/models/sql/compiler.py (revision 17460)
-@@ -1,7 +1,7 @@
- from itertools import izip
--from django.db.backends.util import truncate_name
-+from django.db.backends.util import truncate_name, typecast_timestamp
- from django.db.models.sql import compiler
--from django.db.models.sql.constants import TABLE_NAME
-+from django.db.models.sql.constants import TABLE_NAME, MULTI
- from django.db.models.sql.query import get_proxied_model
-
- SQLCompiler = compiler.SQLCompiler
-@@ -194,7 +194,7 @@
- # We resolve the rest of the columns if we're on Oracle or if
- # the `geo_values` attribute is defined.
- for value, field in map(None, row[index_start:], fields):
-- values.append(self.query.convert_values(value, field, connection=self.connection))
-+ values.append(self.query.convert_values(value, field, self.connection))
- else:
- values.extend(row[index_start:])
- return tuple(values)
-@@ -275,4 +275,24 @@
- pass
-
- class SQLDateCompiler(compiler.SQLDateCompiler, GeoSQLCompiler):
-- pass
-+ """
-+ This is overridden for GeoDjango to properly cast date columns, since
-+ `GeoQuery.resolve_columns` is used for spatial values.
-+ See #14648, #16757.
-+ """
-+ def results_iter(self):
-+ if self.connection.ops.oracle:
-+ from django.db.models.fields import DateTimeField
-+ fields = [DateTimeField()]
-+ else:
-+ needs_string_cast = self.connection.features.needs_datetime_string_cast
-+
-+ offset = len(self.query.extra_select)
-+ for rows in self.execute_sql(MULTI):
-+ for row in rows:
-+ date = row[offset]
-+ if self.connection.ops.oracle:
-+ date = self.resolve_columns(row, fields)[offset]
-+ elif needs_string_cast:
-+ date = typecast_timestamp(str(date))
-+ yield date
-Index: django/contrib/gis/db/backends/spatialite/compiler.py
-===================================================================
---- django/contrib/gis/db/backends/spatialite/compiler.py (revision 16771)
-+++ django/contrib/gis/db/backends/spatialite/compiler.py (revision 17460)
-@@ -1,32 +0,0 @@
--from django.db.backends.util import typecast_timestamp
--from django.db.models.sql import compiler
--from django.db.models.sql.constants import MULTI
--from django.contrib.gis.db.models.sql.compiler import GeoSQLCompiler as BaseGeoSQLCompiler
--
--SQLCompiler = compiler.SQLCompiler
--
--class GeoSQLCompiler(BaseGeoSQLCompiler, SQLCompiler):
-- pass
--
--class SQLInsertCompiler(compiler.SQLInsertCompiler, GeoSQLCompiler):
-- pass
--
--class SQLDeleteCompiler(compiler.SQLDeleteCompiler, GeoSQLCompiler):
-- pass
--
--class SQLUpdateCompiler(compiler.SQLUpdateCompiler, GeoSQLCompiler):
-- pass
--
--class SQLAggregateCompiler(compiler.SQLAggregateCompiler, GeoSQLCompiler):
-- pass
--
--class SQLDateCompiler(compiler.SQLDateCompiler, GeoSQLCompiler):
-- """
-- This is overridden for GeoDjango to properly cast date columns, see #16757.
-- """
-- def results_iter(self):
-- offset = len(self.query.extra_select)
-- for rows in self.execute_sql(MULTI):
-- for row in rows:
-- date = typecast_timestamp(str(row[offset]))
-- yield date
-Index: django/contrib/gis/db/backends/spatialite/operations.py
-===================================================================
---- django/contrib/gis/db/backends/spatialite/operations.py (revision 16771)
-+++ django/contrib/gis/db/backends/spatialite/operations.py (revision 17460)
-@@ -48,7 +48,7 @@
- return (SpatiaLiteDistance(operator),)
-
- class SpatiaLiteOperations(DatabaseOperations, BaseSpatialOperations):
-- compiler_module = 'django.contrib.gis.db.backends.spatialite.compiler'
-+ compiler_module = 'django.contrib.gis.db.models.sql.compiler'
- name = 'spatialite'
- spatialite = True
- version_regex = re.compile(r'^(?P<major>\d)\.(?P<minor1>\d)\.(?P<minor2>\d+)')
-Index: django/contrib/gis/db/backends/spatialite/creation.py
-===================================================================
---- django/contrib/gis/db/backends/spatialite/creation.py (revision 16771)
-+++ django/contrib/gis/db/backends/spatialite/creation.py (revision 17460)
-@@ -56,14 +56,6 @@
- interactive=False,
- database=self.connection.alias)
-
-- # One effect of calling syncdb followed by flush is that the id of the
-- # default site may or may not be 1, depending on how the sequence was
-- # reset. If the sites app is loaded, then we coerce it.
-- from django.db.models import get_model
-- Site = get_model('sites', 'Site')
-- if Site is not None and Site.objects.using(self.connection.alias).count() == 1:
-- Site.objects.using(self.connection.alias).update(id=settings.SITE_ID)
--
- from django.core.cache import get_cache
- from django.core.cache.backends.db import BaseDatabaseCache
- for cache_alias in settings.CACHES:
-Index: django/contrib/gis/tests/relatedapp/fixtures/initial_data.json.gz
-===================================================================
-Cannot display: file marked as a binary type.
-svn:mime-type = application/octet-stream
-Index: django/contrib/gis/tests/relatedapp/tests.py
-===================================================================
---- django/contrib/gis/tests/relatedapp/tests.py (revision 16771)
-+++ django/contrib/gis/tests/relatedapp/tests.py (revision 17460)
-@@ -1,3 +1,4 @@
-+from datetime import date
- from django.test import TestCase
-
- from django.contrib.gis.geos import GEOSGeometry, Point, MultiPoint
-@@ -281,4 +282,11 @@
- # evaluated as list generation swallows TypeError in CPython.
- sql = str(qs.query)
-
-+ def test16_annotated_date_queryset(self):
-+ "Ensure annotated date querysets work if spatial backend is used. See #14648."
-+ birth_years = [dt.year for dt in
-+ list(Author.objects.annotate(num_books=Count('books')).dates('dob', 'year'))]
-+ birth_years.sort()
-+ self.assertEqual([1950, 1974], birth_years)
-+
- # TODO: Related tests for KML, GML, and distance lookups.
-Index: django/contrib/gis/tests/relatedapp/models.py
-===================================================================
---- django/contrib/gis/tests/relatedapp/models.py (revision 16771)
-+++ django/contrib/gis/tests/relatedapp/models.py (revision 17460)
-@@ -36,6 +36,7 @@
- # These use the GeoManager but do not have any geographic fields.
- class Author(models.Model):
- name = models.CharField(max_length=100)
-+ dob = models.DateField()
- objects = models.GeoManager()
-
- class Article(models.Model):
-Index: django/contrib/sites/management.py
-===================================================================
---- django/contrib/sites/management.py (revision 16771)
-+++ django/contrib/sites/management.py (revision 17460)
-@@ -3,15 +3,34 @@
- """
-
- from django.db.models import signals
-+from django.db import connections
-+from django.db import router
- from django.contrib.sites.models import Site
- from django.contrib.sites import models as site_app
-+from django.core.management.color import no_style
-
- def create_default_site(app, created_models, verbosity, db, **kwargs):
-- if Site in created_models:
-+ # Only create the default sites in databases where Django created the table
-+ if Site in created_models and router.allow_syncdb(db, Site) :
-+ # The default settings set SITE_ID = 1, and some tests in Django's test
-+ # suite rely on this value. However, if database sequences are reused
-+ # (e.g. in the test suite after flush/syncdb), it isn't guaranteed that
-+ # the next id will be 1, so we coerce it. See #15573 and #16353. This
-+ # can also crop up outside of tests - see #15346.
- if verbosity >= 2:
- print "Creating example.com Site object"
-- s = Site(domain="example.com", name="example.com")
-- s.save(using=db)
-+ Site(pk=1, domain="example.com", name="example.com").save(using=db)
-+
-+ # We set an explicit pk instead of relying on auto-incrementation,
-+ # so we need to reset the database sequence.
-+ sequence_sql = connections[db].ops.sequence_reset_sql(no_style(), [Site])
-+ if sequence_sql:
-+ if verbosity >= 2:
-+ print "Resetting sequence"
-+ cursor = connections[db].cursor()
-+ for command in sequence_sql:
-+ cursor.execute(command)
-+
- Site.objects.clear_cache()
-
- signals.post_syncdb.connect(create_default_site, sender=site_app)
-Index: django/contrib/sites/tests.py
-===================================================================
---- django/contrib/sites/tests.py (revision 16771)
-+++ django/contrib/sites/tests.py (revision 17460)
-@@ -15,6 +15,12 @@
- def tearDown(self):
- Site._meta.installed = self.old_Site_meta_installed
-
-+ def test_save_another(self):
-+ # Regression for #17415
-+ # On some backends the sequence needs reset after save with explicit ID.
-+ # Test that there is no sequence collisions by saving another site.
-+ Site(domain="example2.com", name="example2.com").save()
-+
- def test_site_manager(self):
- # Make sure that get_current() does not return a deleted Site object.
- s = Site.objects.get_current()
-Index: django/contrib/admin/media/css/forms.css
-===================================================================
---- django/contrib/admin/media/css/forms.css (revision 16771)
-+++ django/contrib/admin/media/css/forms.css (revision 17460)
-@@ -352,9 +352,3 @@
- .empty-form {
- display: none;
- }
--
--/* IE7 specific bug fixes */
--
--.submit-row input {
-- float: right;
--}
-\ No newline at end of file
-Index: tests/modeltests/validators/tests.py
-===================================================================
---- tests/modeltests/validators/tests.py (revision 16771)
-+++ tests/modeltests/validators/tests.py (revision 17460)
-@@ -28,6 +28,9 @@
- (validate_email, 'abc', ValidationError),
- (validate_email, 'a @x.cz', ValidationError),
- (validate_email, 'something@@somewhere.com', ValidationError),
-+ # Quoted-string format (CR not allowed)
-+ (validate_email, '"\\\011"@here.com', None),
-+ (validate_email, '"\\\012"@here.com', ValidationError),
-
- (validate_slug, 'slug-ok', None),
- (validate_slug, 'longer-slug-still-ok', None),
-Index: tests/regressiontests/utils/http.py
-===================================================================
---- tests/regressiontests/utils/http.py (revision 16771)
-+++ tests/regressiontests/utils/http.py (revision 17460)
-@@ -1,5 +1,7 @@
- from django.utils import http
- from django.utils import unittest
-+from django.http import HttpResponse, utils
-+from django.test import RequestFactory
-
- class TestUtilsHttp(unittest.TestCase):
-
-@@ -21,3 +23,49 @@
- self.assertFalse(http.same_origin('http://foo.com', 'http://foo.com.evil.com'))
- # Different port
- self.assertFalse(http.same_origin('http://foo.com:8000', 'http://foo.com:8001'))
-+
-+ def test_fix_IE_for_vary(self):
-+ """
-+ Regression for #16632.
-+
-+ `fix_IE_for_vary` shouldn't crash when there's no Content-Type header.
-+ """
-+
-+ # functions to generate responses
-+ def response_with_unsafe_content_type():
-+ r = HttpResponse(content_type="text/unsafe")
-+ r['Vary'] = 'Cookie'
-+ return r
-+
-+ def no_content_response_with_unsafe_content_type():
-+ # 'Content-Type' always defaulted, so delete it
-+ r = response_with_unsafe_content_type()
-+ del r['Content-Type']
-+ return r
-+
-+ # request with & without IE user agent
-+ rf = RequestFactory()
-+ request = rf.get('/')
-+ ie_request = rf.get('/', HTTP_USER_AGENT='MSIE')
-+
-+ # not IE, unsafe_content_type
-+ response = response_with_unsafe_content_type()
-+ utils.fix_IE_for_vary(request, response)
-+ self.assertTrue('Vary' in response)
-+
-+ # IE, unsafe_content_type
-+ response = response_with_unsafe_content_type()
-+ utils.fix_IE_for_vary(ie_request, response)
-+ self.assertFalse('Vary' in response)
-+
-+ # not IE, no_content
-+ response = no_content_response_with_unsafe_content_type()
-+ utils.fix_IE_for_vary(request, response)
-+ self.assertTrue('Vary' in response)
-+
-+ # IE, no_content
-+ response = no_content_response_with_unsafe_content_type()
-+ utils.fix_IE_for_vary(ie_request, response)
-+ self.assertFalse('Vary' in response)
-+
-+
-Index: tests/regressiontests/httpwrappers/tests.py
-===================================================================
---- tests/regressiontests/httpwrappers/tests.py (revision 16771)
-+++ tests/regressiontests/httpwrappers/tests.py (revision 17460)
-@@ -281,3 +281,9 @@
- Test that a single non-standard cookie name doesn't affect all cookies. Ticket #13007.
- """
- self.assertTrue('good_cookie' in parse_cookie('good_cookie=yes;bad:cookie=yes').keys())
-+
-+ def test_repeated_nonstandard_keys(self):
-+ """
-+ Test that a repeated non-standard name doesn't affect all cookies. Ticket #15852
-+ """
-+ self.assertTrue('good_cookie' in parse_cookie('a,=b; a,=c; good_cookie=yes').keys())
-Index: docs/index.txt
-===================================================================
---- docs/index.txt (revision 16771)
-+++ docs/index.txt (revision 17460)
-@@ -28,7 +28,7 @@
- .. _archives of the django-users mailing list: http://groups.google.com/group/django-users/
- .. _post a question: http://groups.google.com/group/django-users/
- .. _#django IRC channel: irc://irc.freenode.net/django
--.. _IRC logs: http://botland.oebfare.com/logger/django/
-+.. _IRC logs: http://django-irc-logs.com/
- .. _ticket tracker: http://code.djangoproject.com/
-
- First steps
-Index: docs/intro/tutorial01.txt
-===================================================================
---- docs/intro/tutorial01.txt (revision 16771)
-+++ docs/intro/tutorial01.txt (revision 17460)
-@@ -59,7 +59,7 @@
- can be run as a program. To do this, open Terminal.app and navigate (using
- the ``cd`` command) to the directory where :doc:`django-admin.py
- </ref/django-admin>` is installed, then run the command
-- ``chmod +x django-admin.py``.
-+ ``sudo chmod +x django-admin.py``.
-
- .. note::
-
-@@ -692,10 +692,9 @@
-
- For more information on model relations, see :doc:`Accessing related objects
- </ref/models/relations>`. For more on how to use double underscores to perform
--field lookups via the API, see `Field lookups`__. For full details on the
--database API, see our :doc:`Database API reference </topics/db/queries>`.
-+field lookups via the API, see :ref:`Field lookups <field-lookups-intro>`. For
-+full details on the database API, see our :doc:`Database API reference
-+</topics/db/queries>`.
-
--__ http://docs.djangoproject.com/en/1.2/topics/db/queries/#field-lookups
--
- When you're comfortable with the API, read :doc:`part 2 of this tutorial
- </intro/tutorial02>` to get Django's automatic admin working.
-Index: docs/intro/tutorial02.txt
-===================================================================
---- docs/intro/tutorial02.txt (revision 16771)
-+++ docs/intro/tutorial02.txt (revision 17460)
-@@ -40,22 +40,22 @@
-
- .. parsed-literal::
-
-- from django.conf.urls.defaults import *
-+ from django.conf.urls.defaults import patterns, include, url
-
- # Uncomment the next two lines to enable the admin:
- **from django.contrib import admin**
- **admin.autodiscover()**
-
- urlpatterns = patterns('',
-- # Example:
-- # (r'^mysite/', include('mysite.foo.urls')),
-+ # Examples:
-+ # url(r'^$', 'mysite.views.home', name='home'),
-+ # url(r'^mysite/', include('mysite.foo.urls')),
-
-- # Uncomment the admin/doc line below and add 'django.contrib.admindocs'
-- # to INSTALLED_APPS to enable admin documentation:
-- # (r'^admin/doc/', include('django.contrib.admindocs.urls')),
-+ # Uncomment the admin/doc line below to enable admin documentation:
-+ # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
-
- # Uncomment the next line to enable the admin:
-- **(r'^admin/', include(admin.site.urls)),**
-+ **url(r'^admin/', include(admin.site.urls)),**
- )
-
- (The bold lines are the ones that needed to be uncommented.)
-Index: docs/intro/tutorial03.txt
-===================================================================
---- docs/intro/tutorial03.txt (revision 16771)
-+++ docs/intro/tutorial03.txt (revision 17460)
-@@ -78,17 +78,17 @@
-
- Time for an example. Edit ``mysite/urls.py`` so it looks like this::
-
-- from django.conf.urls.defaults import *
-+ from django.conf.urls.defaults import patterns, include, url
-
- from django.contrib import admin
- admin.autodiscover()
-
- urlpatterns = patterns('',
-- (r'^polls/$', 'polls.views.index'),
-- (r'^polls/(?P<poll_id>\d+)/$', 'polls.views.detail'),
-- (r'^polls/(?P<poll_id>\d+)/results/$', 'polls.views.results'),
-- (r'^polls/(?P<poll_id>\d+)/vote/$', 'polls.views.vote'),
-- (r'^admin/', include(admin.site.urls)),
-+ url(r'^polls/$', 'polls.views.index'),
-+ url(r'^polls/(?P<poll_id>\d+)/$', 'polls.views.detail'),
-+ url(r'^polls/(?P<poll_id>\d+)/results/$', 'polls.views.results'),
-+ url(r'^polls/(?P<poll_id>\d+)/vote/$', 'polls.views.vote'),
-+ url(r'^admin/', include(admin.site.urls)),
- )
-
- This is worth a review. When somebody requests a page from your Web site -- say,
-@@ -112,7 +112,7 @@
- -- unless you have a sick sense of humor, in which case you can do something
- like this::
-
-- (r'^polls/latest\.php$', 'polls.views.index'),
-+ url(r'^polls/latest\.php$', 'polls.views.index'),
-
- But, don't do that. It's silly.
-
-@@ -357,23 +357,24 @@
- Write a 404 (page not found) view
- =================================
-
--When you raise :exc:`~django.http.Http404` from within a view, Django will load
--a special view devoted to handling 404 errors. It finds it by looking for the
--variable ``handler404``, which is a string in Python dotted syntax -- the same
--format the normal URLconf callbacks use. A 404 view itself has nothing special:
--It's just a normal view.
-+When you raise :exc:`~django.http.Http404` from within a view, Django
-+will load a special view devoted to handling 404 errors. It finds it
-+by looking for the variable ``handler404`` in your root URLconf (and
-+only in your root URLconf; setting ``handler404`` anywhere else will
-+have no effect), which is a string in Python dotted syntax -- the same
-+format the normal URLconf callbacks use. A 404 view itself has nothing
-+special: It's just a normal view.
-
--You normally won't have to bother with writing 404 views. By default, URLconfs
--have the following line up top::
-+You normally won't have to bother with writing 404 views. If you don't set
-+``handler404``, the built-in view :func:`django.views.defaults.page_not_found`
-+is used by default. In this case, you still have one obligation: To create a
-+``404.html`` template in the root of your template directory. The default 404
-+view will use that template for all 404 errors. If :setting:`DEBUG` is set to
-+``False`` (in your settings module) and if you didn't create a ``404.html``
-+file, an ``Http500`` is raised instead. So remember to create a ``404.html``.
-
-- from django.conf.urls.defaults import *
-+A couple more things to note about 404 views:
-
--That takes care of setting ``handler404`` in the current module. As you can see
--in ``django/conf/urls/defaults.py``, ``handler404`` is set to
--:func:`django.views.defaults.page_not_found` by default.
--
--Four more things to note about 404 views:
--
- * If :setting:`DEBUG` is set to ``True`` (in your settings module) then your
- 404 view will never be used (and thus the ``404.html`` template will never
- be rendered) because the traceback will be displayed instead.
-@@ -381,21 +382,12 @@
- * The 404 view is also called if Django doesn't find a match after checking
- every regular expression in the URLconf.
-
-- * If you don't define your own 404 view -- and simply use the default, which
-- is recommended -- you still have one obligation: To create a ``404.html``
-- template in the root of your template directory. The default 404 view will
-- use that template for all 404 errors.
--
-- * If :setting:`DEBUG` is set to ``False`` (in your settings module) and if
-- you didn't create a ``404.html`` file, an ``Http500`` is raised instead.
-- So remember to create a ``404.html``.
--
- Write a 500 (server error) view
- ===============================
-
--Similarly, URLconfs may define a ``handler500``, which points to a view to call
--in case of server errors. Server errors happen when you have runtime errors in
--view code.
-+Similarly, your root URLconf may define a ``handler500``, which points
-+to a view to call in case of server errors. Server errors happen when
-+you have runtime errors in view code.
-
- Use the template system
- =======================
-@@ -432,10 +424,10 @@
- the URLconf, you may notice there's a fair bit of redundancy in it::
-
- urlpatterns = patterns('',
-- (r'^polls/$', 'polls.views.index'),
-- (r'^polls/(?P<poll_id>\d+)/$', 'polls.views.detail'),
-- (r'^polls/(?P<poll_id>\d+)/results/$', 'polls.views.results'),
-- (r'^polls/(?P<poll_id>\d+)/vote/$', 'polls.views.vote'),
-+ url(r'^polls/$', 'polls.views.index'),
-+ url(r'^polls/(?P<poll_id>\d+)/$', 'polls.views.detail'),
-+ url(r'^polls/(?P<poll_id>\d+)/results/$', 'polls.views.results'),
-+ url(r'^polls/(?P<poll_id>\d+)/vote/$', 'polls.views.vote'),
- )
-
- Namely, ``polls.views`` is in every callback.
-@@ -445,10 +437,10 @@
- first argument to :func:`~django.conf.urls.defaults.patterns`, like so::
-
- urlpatterns = patterns('polls.views',
-- (r'^polls/$', 'index'),
-- (r'^polls/(?P<poll_id>\d+)/$', 'detail'),
-- (r'^polls/(?P<poll_id>\d+)/results/$', 'results'),
-- (r'^polls/(?P<poll_id>\d+)/vote/$', 'vote'),
-+ url(r'^polls/$', 'index'),
-+ url(r'^polls/(?P<poll_id>\d+)/$', 'detail'),
-+ url(r'^polls/(?P<poll_id>\d+)/results/$', 'results'),
-+ url(r'^polls/(?P<poll_id>\d+)/vote/$', 'vote'),
- )
-
- This is functionally identical to the previous formatting. It's just a bit
-@@ -459,20 +451,20 @@
- :func:`~django.conf.urls.defaults.patterns`. Your full ``mysite/urls.py`` might
- now look like this::
-
-- from django.conf.urls.defaults import *
-+ from django.conf.urls.defaults import patterns, include, url
-
- from django.contrib import admin
- admin.autodiscover()
-
- urlpatterns = patterns('polls.views',
-- (r'^polls/$', 'index'),
-- (r'^polls/(?P<poll_id>\d+)/$', 'detail'),
-- (r'^polls/(?P<poll_id>\d+)/results/$', 'results'),
-- (r'^polls/(?P<poll_id>\d+)/vote/$', 'vote'),
-+ url(r'^polls/$', 'index'),
-+ url(r'^polls/(?P<poll_id>\d+)/$', 'detail'),
-+ url(r'^polls/(?P<poll_id>\d+)/results/$', 'results'),
-+ url(r'^polls/(?P<poll_id>\d+)/vote/$', 'vote'),
- )
-
- urlpatterns += patterns('',
-- (r'^admin/', include(admin.site.urls)),
-+ url(r'^admin/', include(admin.site.urls)),
- )
-
- Decoupling the URLconfs
-@@ -502,8 +494,8 @@
- admin.autodiscover()
-
- urlpatterns = patterns('',
-- (r'^polls/', include('polls.urls')),
-- (r'^admin/', include(admin.site.urls)),
-+ url(r'^polls/', include('polls.urls')),
-+ url(r'^admin/', include(admin.site.urls)),
- )
-
- :func:`~django.conf.urls.defaults.include` simply references another URLconf.
-@@ -526,13 +518,13 @@
- lines registering the admin site. Your ``polls/urls.py`` file should now look like
- this::
-
-- from django.conf.urls.defaults import *
-+ from django.conf.urls.defaults import patterns, include, url
-
- urlpatterns = patterns('polls.views',
-- (r'^$', 'index'),
-- (r'^(?P<poll_id>\d+)/$', 'detail'),
-- (r'^(?P<poll_id>\d+)/results/$', 'results'),
-- (r'^(?P<poll_id>\d+)/vote/$', 'vote'),
-+ url(r'^$', 'index'),
-+ url(r'^(?P<poll_id>\d+)/$', 'detail'),
-+ url(r'^(?P<poll_id>\d+)/results/$', 'results'),
-+ url(r'^(?P<poll_id>\d+)/vote/$', 'vote'),
- )
-
- The idea behind :func:`~django.conf.urls.defaults.include` and URLconf
-Index: docs/intro/index.txt
-===================================================================
---- docs/intro/index.txt (revision 16771)
-+++ docs/intro/index.txt (revision 17460)
-@@ -31,6 +31,6 @@
-
- .. _python: http://python.org/
- .. _list of Python resources for non-programmers: http://wiki.python.org/moin/BeginnersGuide/NonProgrammers
-- .. _dive into python: http://diveintopython.org/
-+ .. _dive into python: http://diveintopython.net/
- .. _dead-tree version: http://www.amazon.com/exec/obidos/ASIN/1590593561/ref=nosim/jacobian20
- .. _books about Python: http://wiki.python.org/moin/PythonBooks
-\ No newline at end of file
-Index: docs/intro/tutorial04.txt
-===================================================================
---- docs/intro/tutorial04.txt (revision 16771)
-+++ docs/intro/tutorial04.txt (revision 17460)
-@@ -218,13 +218,13 @@
- First, open the ``polls/urls.py`` URLconf. It looks like this, according to the
- tutorial so far::
-
-- from django.conf.urls.defaults import *
-+ from django.conf.urls.defaults import patterns, include, url
-
- urlpatterns = patterns('polls.views',
-- (r'^$', 'index'),
-- (r'^(?P<poll_id>\d+)/$', 'detail'),
-- (r'^(?P<poll_id>\d+)/results/$', 'results'),
-- (r'^(?P<poll_id>\d+)/vote/$', 'vote'),
-+ url(r'^$', 'index'),
-+ url(r'^(?P<poll_id>\d+)/$', 'detail'),
-+ url(r'^(?P<poll_id>\d+)/results/$', 'results'),
-+ url(r'^(?P<poll_id>\d+)/vote/$', 'vote'),
- )
-
- Change it like so::
-@@ -234,12 +234,12 @@
- from polls.models import Poll
-
- urlpatterns = patterns('',
-- (r'^$',
-+ url(r'^$',
- ListView.as_view(
- queryset=Poll.objects.order_by('-pub_date')[:5],
- context_object_name='latest_poll_list',
- template_name='polls/index.html')),
-- (r'^(?P<pk>\d+)/$',
-+ url(r'^(?P<pk>\d+)/$',
- DetailView.as_view(
- model=Poll,
- template_name='polls/detail.html')),
-@@ -248,7 +248,7 @@
- model=Poll,
- template_name='polls/results.html'),
- name='poll_results'),
-- (r'^(?P<poll_id>\d+)/vote/$', 'polls.views.vote'),
-+ url(r'^(?P<poll_id>\d+)/vote/$', 'polls.views.vote'),
- )
-
- We're using two generic views here:
-Index: docs/internals/release-process.txt
-===================================================================
---- docs/internals/release-process.txt (revision 16771)
-+++ docs/internals/release-process.txt (revision 17460)
-@@ -99,6 +99,13 @@
- * Security fixes will be applied to the current trunk and the previous two
- minor releases.
-
-+* Documentation fixes will generally be more freely backported to the last
-+ release branch (at the discretion of the committer), and don't need to meet
-+ the "critical fixes only" bar as it's highly advantageous to have the docs
-+ for the last release be up-to-date and correct, and the downside of
-+ backporting (risk of introducing regressions) is much less of a concern
-+ with doc fixes.
-+
- As a concrete example, consider a moment in time halfway between the release of
- Django 1.3 and 1.4. At this point in time:
-
-@@ -111,6 +118,9 @@
- ``1.2.X`` branch. Security fixes will trigger the release of ``1.3.1``,
- ``1.2.1``, etc.
-
-+* Documentation fixes will be applied to trunk, and if easily backported, to
-+ the ``1.3.X`` branch.
-+
- .. _release-process:
-
- Release process
-Index: docs/internals/deprecation.txt
-===================================================================
---- docs/internals/deprecation.txt (revision 16771)
-+++ docs/internals/deprecation.txt (revision 17460)
-@@ -177,6 +177,12 @@
- required to end with a trailing slash to ensure there is a consistent
- way to combine paths in templates.
-
-+ * Translations located under the so-called *project path* will be
-+ ignored during the translation building process performed at runtime.
-+ The :setting:`LOCALE_PATHS` setting can be used for the same task by
-+ including the filesystem path to a ``locale`` directory containing
-+ non-app-specific translations in its value.
-+
- * 2.0
- * ``django.views.defaults.shortcut()``. This function has been moved
- to ``django.contrib.contenttypes.views.shortcut()`` as part of the
-Index: docs/howto/deployment/modpython.txt
-===================================================================
---- docs/howto/deployment/modpython.txt (revision 16771)
-+++ docs/howto/deployment/modpython.txt (revision 17460)
-@@ -293,11 +293,14 @@
- arrangement. You're responsible for setting up Apache, or whichever media
- server you're using, to serve the admin files.
-
--The admin files live in (:file:`django/contrib/admin/static/admin`) of the
-+The admin files live in (:file:`django/contrib/admin/media/admin`) of the
- Django distribution.
-
--We **strongly** recommend using :mod:`django.contrib.staticfiles` to handle
--the admin files, but here are two other approaches:
-+We **strongly** recommend using :mod:`django.contrib.staticfiles` to handle the
-+admin files (this means using the :djadmin:`collectstatic` management command
-+to collect the static files in :setting:`STATIC_ROOT`, and then configuring
-+your webserver to serve :setting:`STATIC_ROOT` at :setting:`STATIC_URL`), but
-+here are two other approaches:
-
- 1. Create a symbolic link to the admin static files from within your
- document root.
-Index: docs/howto/deployment/modwsgi.txt
-===================================================================
---- docs/howto/deployment/modwsgi.txt (revision 16771)
-+++ docs/howto/deployment/modwsgi.txt (revision 17460)
-@@ -127,11 +127,14 @@
- arrangement. You're responsible for setting up Apache, or whichever media
- server you're using, to serve the admin files.
-
--The admin files live in (:file:`django/contrib/admin/static/admin`) of the
-+The admin files live in (:file:`django/contrib/admin/media/admin`) of the
- Django distribution.
-
--We **strongly** recommend using :mod:`django.contrib.staticfiles` to handle
--the admin files, but here are two other approaches:
-+We **strongly** recommend using :mod:`django.contrib.staticfiles` to handle the
-+admin files (this means using the :djadmin:`collectstatic` management command
-+to collect the static files in :setting:`STATIC_ROOT`, and then configuring
-+your webserver to serve :setting:`STATIC_ROOT` at :setting:`STATIC_URL`), but
-+here are two other approaches:
-
- 1. Create a symbolic link to the admin static files from within your
- document root.
-Index: docs/topics/auth.txt
-===================================================================
---- docs/topics/auth.txt (revision 16771)
-+++ docs/topics/auth.txt (revision 17460)
-@@ -1251,17 +1251,20 @@
- ...
- class Meta:
- permissions = (
-- ("can_view", "Can see available tasks"),
-- ("can_change_status", "Can change the status of tasks"),
-- ("can_close", "Can remove a task by setting its status as closed"),
-+ ("view_task", "Can see available tasks"),
-+ ("change_task_status", "Can change the status of tasks"),
-+ ("close_task", "Can remove a task by setting its status as closed"),
- )
-
- The only thing this does is create those extra permissions when you run
- :djadmin:`manage.py syncdb <syncdb>`. Your code is in charge of checking the
- value of these permissions when an user is trying to access the functionality
- provided by the application (viewing tasks, changing the status of tasks,
--closing tasks.)
-+closing tasks.) Continuing the above example, the following checks if a user may
-+view tasks::
-
-+ user.has_perm('app.view_task')
-+
- API reference
- -------------
-
-Index: docs/topics/http/urls.txt
-===================================================================
---- docs/topics/http/urls.txt (revision 16771)
-+++ docs/topics/http/urls.txt (revision 17460)
-@@ -54,6 +54,10 @@
- :class:`~django.http.HttpRequest` as its first argument and any values
- captured in the regex as remaining arguments.
-
-+ 5. If no regex matches, or if an exception is raised during any
-+ point in this process, Django invokes an appropriate
-+ error-handling view. See `Error handling`_ below.
-+
- Example
- =======
-
-@@ -99,10 +103,10 @@
- * ``/articles/2003`` would not match any of these patterns, because each
- pattern requires that the URL end with a slash.
-
-- * ``/articles/2003/03/3/`` would match the final pattern. Django would call
-- the function ``news.views.article_detail(request, '2003', '03', '3')``.
-+ * ``/articles/2003/03/03/`` would match the final pattern. Django would call
-+ the function ``news.views.article_detail(request, '2003', '03', '03')``.
-
--.. _Dive Into Python's explanation: http://diveintopython.org/regular_expressions/street_addresses.html#re.matching.2.3
-+.. _Dive Into Python's explanation: http://diveintopython.net/regular_expressions/street_addresses.html#re.matching.2.3
-
- Named groups
- ============
-@@ -123,7 +127,7 @@
- (r'^articles/2003/$', 'news.views.special_case_2003'),
- (r'^articles/(?P<year>\d{4})/$', 'news.views.year_archive'),
- (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$', 'news.views.month_archive'),
-- (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d+)/$', 'news.views.article_detail'),
-+ (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/$', 'news.views.article_detail'),
- )
-
- This accomplishes exactly the same thing as the previous example, with one
-@@ -134,8 +138,8 @@
- ``news.views.month_archive(request, year='2005', month='03')``, instead
- of ``news.views.month_archive(request, '2005', '03')``.
-
-- * A request to ``/articles/2003/03/3/`` would call the function
-- ``news.views.article_detail(request, year='2003', month='03', day='3')``.
-+ * A request to ``/articles/2003/03/03/`` would call the function
-+ ``news.views.article_detail(request, year='2003', month='03', day='03')``.
-
- In practice, this means your URLconfs are slightly more explicit and less prone
- to argument-order bugs -- and you can reorder the arguments in your views'
-@@ -246,6 +250,31 @@
- ``patterns()`` and is only relevant when you're passing a string as the
- ``view`` parameter.
-
-+include
-+-------
-+
-+.. function:: include(<module or pattern_list>)
-+
-+A function that takes a full Python import path to another URLconf module that
-+should be "included" in this place.
-+
-+:func:`include` also accepts as an argument an iterable that returns URL
-+patterns.
-+
-+See `Including other URLconfs`_ below.
-+
-+Error handling
-+==============
-+
-+When Django can't find a regex matching the requested URL, or when an
-+exception is raised, Django will invoke an error-handling view. The
-+views to use for these cases are specified by two variables which can
-+be set in your root URLconf. Setting these variables in any other
-+URLconf will have no effect.
-+
-+See the documentation on :ref:`customizing error views
-+<customizing-error-views>` for more details.
-+
- handler404
- ----------
-
-@@ -275,19 +304,6 @@
- .. versionchanged:: 1.2
- Previous versions of Django only accepted strings representing import paths.
-
--include
---------
--
--.. function:: include(<module or pattern_list>)
--
--A function that takes a full Python import path to another URLconf module that
--should be "included" in this place.
--
--:func:`include` also accepts as an argument an iterable that returns URL
--patterns.
--
--See `Including other URLconfs`_ below.
--
- Notes on capturing text in URLs
- ===============================
-
-@@ -420,8 +436,8 @@
- from django.conf.urls.defaults import *
-
- extra_patterns = patterns('',
-- url(r'reports/(?P<id>\d+)/$', 'credit.views.report', name='credit-reports'),
-- url(r'charge/$', 'credit.views.charge', name='credit-charge'),
-+ url(r'^reports/(?P<id>\d+)/$', 'credit.views.report', name='credit-reports'),
-+ url(r'^charge/$', 'credit.views.charge', name='credit-charge'),
- )
-
- urlpatterns = patterns('',
-Index: docs/topics/http/views.txt
-===================================================================
---- docs/topics/http/views.txt (revision 16771)
-+++ docs/topics/http/views.txt (revision 17460)
-@@ -122,6 +122,8 @@
- template that is displayed when a 404 error is raised. This template should be
- called ``404.html`` and located in the top level of your template tree.
-
-+.. _customizing-error-views:
-+
- Customizing error views
- =======================
-
-Index: docs/topics/i18n/internationalization.txt
-===================================================================
---- docs/topics/i18n/internationalization.txt (revision 16771)
-+++ docs/topics/i18n/internationalization.txt (revision 17460)
-@@ -477,7 +477,7 @@
-
- You can use multiple expressions inside a single ``blocktrans`` tag::
-
-- {% blocktrans with book_t=book|title and author_t=author|title %}
-+ {% blocktrans with book_t=book|title author_t=author|title %}
- This is {{ book_t }} by {{ author_t }}
- {% endblocktrans %}
-
-Index: docs/topics/cache.txt
-===================================================================
---- docs/topics/cache.txt (revision 16771)
-+++ docs/topics/cache.txt (revision 17460)
-@@ -99,8 +99,9 @@
- on your chosen memcached binding)
-
- * Set :setting:`LOCATION <CACHES-LOCATION>` to ``ip:port`` values,
-- where ``ip`` is the IP address of the Memcached daemon and
-- ``port`` is the port on which Memcached is running.
-+ where ``ip`` is the IP address of the Memcached daemon and ``port`` is the
-+ port on which Memcached is running, or to a ``unix:path`` value, where
-+ ``path`` is the path to a Memcached Unix socket file.
-
- In this example, Memcached is running on localhost (127.0.0.1) port 11211, using
- the ``python-memcached`` binding::
-@@ -112,6 +113,16 @@
- }
- }
-
-+In this example, Memcached is available through a local Unix socket file
-+:file:`/tmp/memcached.sock` using the ``python-memcached`` binding::
-+
-+ CACHES = {
-+ 'default': {
-+ 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
-+ 'LOCATION': 'unix:/tmp/memcached.sock',
-+ }
-+ }
-+
- One excellent feature of Memcached is its ability to share cache over multiple
- servers. This means you can run Memcached daemons on multiple machines, and the
- program will treat the group of machines as a *single* cache, without the need
-@@ -526,9 +537,10 @@
- requested, subsequent requests to that URL will use the cache.
-
- ``cache_page`` can also take an optional keyword argument, ``cache``,
--which directs the decorator to use a specific cache alias when caching view
--results. By default, the ``default`` alias will be used, but you can specify
--any cache alias you want::
-+which directs the decorator to use a specific cache (from your
-+:setting:`CACHES` setting) when caching view results. By default, the
-+``default`` cache will be used, but you can specify any cache you
-+want::
-
- @cache_page(60 * 15, cache="special_cache")
- def my_view(request):
-Index: docs/topics/db/models.txt
-===================================================================
---- docs/topics/db/models.txt (revision 16771)
-+++ docs/topics/db/models.txt (revision 17460)
-@@ -324,11 +324,10 @@
- should work; all are optional.
-
- For details on accessing backwards-related objects, see the
-- `Following relationships backward example`_.
--
-+ :ref:`Following relationships backward example <backwards-related-objects>`.
-+
- For sample code, see the `Many-to-one relationship model tests`_.
-
-- .. _Following relationships backward example: http://docs.djangoproject.com/en/dev/topics/db/queries/#backwards-related-objects
- .. _Many-to-one relationship model tests: http://code.djangoproject.com/browser/django/trunk/tests/modeltests/many_to_one
-
- Many-to-many relationships
-Index: docs/topics/db/sql.txt
-===================================================================
---- docs/topics/db/sql.txt (revision 16771)
-+++ docs/topics/db/sql.txt (revision 17460)
-@@ -236,6 +236,30 @@
- # Your code here...
- transaction.commit_unless_managed(using='my_db_alias')
-
-+By default, the Python DB API will return results without their field
-+names, which means you end up with a ``list`` of values, rather than a
-+``dict``. At a small performance cost, you can return results as a
-+``dict`` by using something like this::
-+
-+ def dictfetchall(cursor):
-+ "Returns all rows from a cursor as a dict"
-+ desc = cursor.description
-+ return [
-+ dict(zip([col[0] for col in desc], row))
-+ for row in cursor.fetchall()
-+ ]
-+
-+Here is an example of the difference between the two::
-+
-+ >>> cursor.execute("SELECT id, parent_id from test LIMIT 2");
-+ >>> cursor.fetchall()
-+ ((54360982L, None), (54360880L, None))
-+
-+ >>> cursor.execute("SELECT id, parent_id from test LIMIT 2");
-+ >>> dictfetchall(cursor)
-+ [{'parent_id': None, 'id': 54360982L}, {'parent_id': None, 'id': 54360880L}]
-+
-+
- .. _transactions-and-raw-sql:
-
- Transactions and raw SQL
-Index: docs/topics/forms/modelforms.txt
-===================================================================
---- docs/topics/forms/modelforms.txt (revision 16771)
-+++ docs/topics/forms/modelforms.txt (revision 17460)
-@@ -332,14 +332,18 @@
- .. note::
-
- If you specify ``fields`` or ``exclude`` when creating a form with
-- ``ModelForm``, then the fields that are not in the resulting form will not
-- be set by the form's ``save()`` method. Django will prevent any attempt to
-- save an incomplete model, so if the model does not allow the missing fields
-- to be empty, and does not provide a default value for the missing fields,
-- any attempt to ``save()`` a ``ModelForm`` with missing fields will fail.
-- To avoid this failure, you must instantiate your model with initial values
-- for the missing, but required fields::
-+ ``ModelForm``, then the fields that are not in the resulting form
-+ will not be set by the form's ``save()`` method. Also, if you
-+ manually add the excluded fields back to the form, they will not
-+ be initialized from the model instance.
-
-+ Django will prevent any attempt to save an incomplete model, so if
-+ the model does not allow the missing fields to be empty, and does
-+ not provide a default value for the missing fields, any attempt to
-+ ``save()`` a ``ModelForm`` with missing fields will fail. To
-+ avoid this failure, you must instantiate your model with initial
-+ values for the missing, but required fields::
-+
- author = Author(title='Mr')
- form = PartialAuthorForm(request.POST, instance=author)
- form.save()
-@@ -633,6 +637,12 @@
- instance won't be saved to the database and won't be included in the return
- value (``instances``, in the above example).
-
-+When fields are missing from the form (for example because they have
-+been excluded), these fields will not be set by the ``save()``
-+method. You can find more information about this restriction, which
-+also holds for regular ``ModelForms``, in `Using a subset of fields on
-+the form`_.
-+
- Pass ``commit=False`` to return the unsaved model instances::
-
- # don't save to the database
-Index: docs/topics/class-based-views.txt
-===================================================================
---- docs/topics/class-based-views.txt (revision 16771)
-+++ docs/topics/class-based-views.txt (revision 17460)
-@@ -380,7 +380,7 @@
- class PublisherBookListView(ListView):
-
- context_object_name = "book_list"
-- template_name = "books/books_by_publisher.html",
-+ template_name = "books/books_by_publisher.html"
-
- def get_queryset(self):
- publisher = get_object_or_404(Publisher, name__iexact=self.args[0])
-@@ -396,7 +396,7 @@
- class PublisherBookListView(ListView):
-
- context_object_name = "book_list"
-- template_name = "books/books_by_publisher.html",
-+ template_name = "books/books_by_publisher.html"
-
- def get_queryset(self):
- self.publisher = get_object_or_404(Publisher, name__iexact=self.args[0])
-Index: docs/topics/testing.txt
-===================================================================
---- docs/topics/testing.txt (revision 16771)
-+++ docs/topics/testing.txt (revision 17460)
-@@ -1586,7 +1586,7 @@
- Skip the decorated test if the named database feature is *not*
- supported.
-
--For example, the following test will not be executed if the database
-+For example, the following test will only be executed if the database
- supports transactions (e.g., it would run under PostgreSQL, but *not*
- under MySQL with MyISAM tables)::
-
-Index: docs/topics/templates.txt
-===================================================================
---- docs/topics/templates.txt (revision 16771)
-+++ docs/topics/templates.txt (revision 17460)
-@@ -555,6 +555,8 @@
- the ``escape`` filter *double-escaping* data -- the ``escape`` filter does not
- affect auto-escaped variables.
-
-+.. _string-literals-and-automatic-escaping:
-+
- String literals and automatic escaping
- --------------------------------------
-
-Index: docs/topics/settings.txt
-===================================================================
---- docs/topics/settings.txt (revision 16771)
-+++ docs/topics/settings.txt (revision 17460)
-@@ -39,7 +39,7 @@
- ``mysite.settings``. Note that the settings module should be on the
- Python `import search path`_.
-
--.. _import search path: http://diveintopython.org/getting_to_know_python/everything_is_an_object.html
-+.. _import search path: http://diveintopython.net/getting_to_know_python/everything_is_an_object.html
-
- The django-admin.py utility
- ---------------------------
-Index: docs/releases/1.2.6.txt
-===================================================================
---- docs/releases/1.2.6.txt (revision 0)
-+++ docs/releases/1.2.6.txt (revision 17460)
-@@ -0,0 +1,16 @@
-+==========================
-+Django 1.2.6 release notes
-+==========================
-+
-+*September 9, 2011*
-+
-+Welcome to Django 1.2.6!
-+
-+This is the sixth bugfix/security release in the Django 1.2 series, fixing
-+several security issues present in Django 1.2.5. Django 1.2.6 is a
-+recommended upgrade for all users of any Django release in the 1.2.X series.
-+
-+For a full list of issues addressed in this release, see the `security
-+advisory`_.
-+
-+.. _security advisory: https://www.djangoproject.com/weblog/2011/sep/09/security-releases-issued/
-Index: docs/releases/1.2.7.txt
-===================================================================
---- docs/releases/1.2.7.txt (revision 0)
-+++ docs/releases/1.2.7.txt (revision 17460)
-@@ -0,0 +1,16 @@
-+==========================
-+Django 1.2.7 release notes
-+==========================
-+
-+*September 10, 2011*
-+
-+Welcome to Django 1.2.7!
-+
-+This is the seventh bugfix/security release in the Django 1.2 series. It
-+replaces Django 1.2.6 due to problems with the 1.2.6 release tarball.
-+Django 1.2.7 is a recommended upgrade for all users of any Django release in
-+the 1.2.X series.
-+
-+For more information, see the `release advisory`_.
-+
-+.. _release advisory: https://www.djangoproject.com/weblog/2011/sep/10/127/
-Index: docs/releases/index.txt
-===================================================================
---- docs/releases/index.txt (revision 16771)
-+++ docs/releases/index.txt (revision 17460)
-@@ -19,6 +19,7 @@
- .. toctree::
- :maxdepth: 1
-
-+ 1.3.1
- 1.3
-
- 1.2 release
-@@ -26,6 +27,8 @@
- .. toctree::
- :maxdepth: 1
-
-+ 1.2.7
-+ 1.2.6
- 1.2.5
- 1.2.4
- 1.2.2
-Index: docs/releases/0.95.txt
-===================================================================
---- docs/releases/0.95.txt (revision 16771)
-+++ docs/releases/0.95.txt (revision 17460)
-@@ -92,15 +92,15 @@
- easy checklist_ for reference when undertaking the porting operation.
-
- .. _Removing The Magic: http://code.djangoproject.com/wiki/RemovingTheMagic
--.. _checklist: http://code.djangoproject.com/wiki/MagicRemovalCheatSheet1
-+.. _checklist: http://code.djangoproject.com/wiki/MagicRemovalCheatSheet
-
- Problem reports and getting help
- ================================
-
--Need help resolving a problem with Django? The documentation in the distribution
--is also available online_ at the `Django Web site`_. The :doc:`FAQ </faq/index>`
--document is especially recommended, as it contains a number of issues that come
--up time and again.
-+Need help resolving a problem with Django? The documentation in the
-+distribution is also available :doc:`online </index>` at the `Django Web
-+site`_. The :doc:`FAQ </faq/index>` document is especially recommended, as it
-+contains a number of issues that come up time and again.
-
- For more personalized help, the `django-users`_ mailing list is a very active
- list, with more than 2,000 subscribers who can help you solve any sort of
-@@ -113,7 +113,6 @@
- Django users and developers from around the world. Friendly people are usually
- available at any hour of the day -- to help, or just to chat.
-
--.. _online: http://www.djangoproject.com/documentation/0.95/
- .. _Django Web site: http://www.djangoproject.com/
- .. _django-users: http://groups.google.com/group/django-users
-
-Index: docs/releases/0.96.txt
-===================================================================
---- docs/releases/0.96.txt (revision 16771)
-+++ docs/releases/0.96.txt (revision 17460)
-@@ -50,12 +50,10 @@
- maintained, and it will be removed in a future release of Django.
-
- Also, note that some features, like the new :setting:`DATABASE_OPTIONS`
--setting (see the `databases documentation`_ for details), are only
--available on the "mysql" backend, and will not be made available for
-+setting (see the :doc:`databases documentation </ref/databases>` for details),
-+are only available on the "mysql" backend, and will not be made available for
- "mysql_old".
-
--.. _databases documentation: http://www.djangoproject.com/documentation/0.96/databases/
--
- Database constraint names changed
- ---------------------------------
-
-@@ -164,11 +162,9 @@
- for most common cases. We recommend that anyone new to form handling skip the
- old forms system and start with the new.
-
--For more information about ``django.newforms``, read the `newforms
--documentation`_.
-+For more information about ``django.newforms``, read the :doc:`newforms
-+documentation </topics/forms/index>`.
-
--.. _newforms documentation: http://www.djangoproject.com/documentation/0.96/newforms/
--
- URLconf improvements
- --------------------
-
-@@ -216,20 +212,16 @@
- ------------------
-
- Django now includes a test framework so you can start transmuting fear into
--boredom (with apologies to Kent Beck). You can write tests based on doctest_
--or unittest_ and test your views with a simple test client.
-+boredom (with apologies to Kent Beck). You can write tests based on
-+:mod:`doctest` or :mod:`unittest` and test your views with a simple test client.
-
- There is also new support for "fixtures" -- initial data, stored in any of the
--supported `serialization formats`_, that will be loaded into your database at the
--start of your tests. This makes testing with real data much easier.
-+supported :doc:`serialization formats </topics/serialization>`, that will be
-+loaded into your database at the start of your tests. This makes testing with
-+real data much easier.
-
--See `the testing documentation`_ for the full details.
-+See :doc:`the testing documentation </topics/testing>` for the full details.
-
--.. _doctest: http://docs.python.org/library/doctest.html
--.. _unittest: http://docs.python.org/library/unittest.html
--.. _the testing documentation: http://www.djangoproject.com/documentation/0.96/testing/
--.. _serialization formats: http://www.djangoproject.com/documentation/0.96/serialization/
--
- Improvements to the admin interface
- -----------------------------------
-
-Index: docs/releases/1.0.1.txt
-===================================================================
---- docs/releases/1.0.1.txt (revision 16771)
-+++ docs/releases/1.0.1.txt (revision 17460)
-@@ -6,10 +6,10 @@
-
- This is the first "bugfix" release in the Django 1.0 series, improving
- the stability and performance of the Django 1.0 codebase. As such,
--Django 1.0.1 contains no new features (and, pursuant to `our
--compatibility policy`_, maintains backwards compatibility with Django
--1.0), but does contain a number of fixes and other
--improvements. Django 1.0.1 is a recommended upgrade for any
-+Django 1.0.1 contains no new features (and, pursuant to :doc:`our
-+compatibility policy </misc/api-stability/>`, maintains backwards
-+compatibility with Django 1.0), but does contain a number of fixes
-+and other improvements. Django 1.0.1 is a recommended upgrade for any
- development or deployment currently using or targeting Django 1.0.
-
-
-@@ -46,8 +46,9 @@
-
- * A fix to the application of autoescaping for literal strings passed
- to the ``join`` template filter. Previously, literal strings passed
-- to ``join`` were automatically escaped, contrary to `the documented
-- behavior for autoescaping and literal strings`_. Literal strings
-+ to ``join`` were automatically escaped, contrary to :ref:`the
-+ documented behavior for autoescaping and literal strings
-+ <string-literals-and-automatic-escaping>`. Literal strings
- passed to ``join`` are no longer automatically escaped, meaning you
- must now manually escape them; this is an incompatibility if you
- were relying on this bug, but not if you were relying on escaping
-@@ -60,6 +61,4 @@
- documentation, including both corrections to existing documents and
- expanded and new documentation.
-
--.. _our compatibility policy: http://docs.djangoproject.com/en/dev/misc/api-stability/
- .. _the Subversion log of the 1.0.X branch: http://code.djangoproject.com/log/django/branches/releases/1.0.X
--.. _the documented behavior for autoescaping and literal strings: http://docs.djangoproject.com/en/dev/topics/templates/#string-literals-and-automatic-escaping
-Index: docs/releases/1.3.1.txt
-===================================================================
---- docs/releases/1.3.1.txt (revision 0)
-+++ docs/releases/1.3.1.txt (revision 17460)
-@@ -0,0 +1,16 @@
-+==========================
-+Django 1.3.1 release notes
-+==========================
-+
-+*September 9, 2011*
-+
-+Welcome to Django 1.3.1!
-+
-+This is the first security release in the Django 1.3 series, fixing several
-+security issues in Django 1.3. Django 1.3.1 is a recommended upgrade for
-+all users of Django 1.3.
-+
-+For a full list of issues addressed in this release, see the `security
-+advisory`_.
-+
-+.. _security advisory: https://www.djangoproject.com/weblog/2011/sep/09/security-releases-issued/
-Index: docs/ref/models/instances.txt
-===================================================================
---- docs/ref/models/instances.txt (revision 16771)
-+++ docs/ref/models/instances.txt (revision 17460)
-@@ -470,7 +470,7 @@
-
- Similarly, if you had a URLconf entry that looked like::
-
-- (r'/archive/(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})/$', archive_view)
-+ (r'/archive/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/$', archive_view)
-
- ...you could reference this using ``permalink()`` as follows::
-
-@@ -478,8 +478,8 @@
- def get_absolute_url(self):
- return ('archive_view', (), {
- 'year': self.created.year,
-- 'month': self.created.month,
-- 'day': self.created.day})
-+ 'month': self.created.strftime('%m'),
-+ 'day': self.created.strftime('%d')})
-
- Notice that we specify an empty sequence for the second parameter in this case,
- because we only want to pass keyword parameters, not positional ones.
-Index: docs/ref/models/options.txt
-===================================================================
---- docs/ref/models/options.txt (revision 16771)
-+++ docs/ref/models/options.txt (revision 17460)
-@@ -166,6 +166,13 @@
- >>> answer.get_previous_in_order()
- <Answer: 1>
-
-+.. admonition:: Changing order_with_respect_to
-+
-+ ``order_with_respect_to`` adds an additional field/database column
-+ named ``_order``, so be sure to handle that as you would any other
-+ change to your models if you add or change ``order_with_respect_to``
-+ after your initial :djadmin:`syncdb`.
-+
- ``ordering``
- ------------
-
-@@ -238,6 +245,12 @@
-
- unique_together = ("driver", "restaurant")
-
-+ A :class:`~django.db.models.ManyToManyField` cannot be included in
-+ unique_together (it's not even clear what that would mean). If you
-+ need to validate uniqueness related to a
-+ :class:`~django.db.models.ManyToManyField`, look at signals or
-+ using an explicit :attr:`through <ManyToManyField.through>` model.
-+
- ``verbose_name``
- ----------------
-
-Index: docs/ref/templates/builtins.txt
-===================================================================
---- docs/ref/templates/builtins.txt (revision 16771)
-+++ docs/ref/templates/builtins.txt (revision 17460)
-@@ -1868,7 +1868,7 @@
- Returns a slice of the list.
-
- Uses the same syntax as Python's list slicing. See
--http://diveintopython.org/native_data_types/lists.html#odbchelper.list.slice
-+http://diveintopython.net/native_data_types/lists.html#odbchelper.list.slice
- for an introduction.
-
- Example::
-Index: docs/ref/contrib/gis/geoip.txt
-===================================================================
---- docs/ref/contrib/gis/geoip.txt (revision 16771)
-+++ docs/ref/contrib/gis/geoip.txt (revision 17460)
-@@ -144,7 +144,7 @@
- Returns a dictionary of city information for the given query. Some
- of the values in the dictionary may be undefined (``None``).
-
--.. method:: GeoIPcountry(query)
-+.. method:: GeoIP.country(query)
-
- Returns a dictionary with the country code and country for the given
- query.
-Index: docs/ref/contrib/messages.txt
-===================================================================
---- docs/ref/contrib/messages.txt (revision 16771)
-+++ docs/ref/contrib/messages.txt (revision 17460)
-@@ -210,6 +210,10 @@
- ``RequestContext``. Otherwise, ensure ``messages`` is available to
- the template context.
-
-+Even if you know there is only just one message, you should still iterate over
-+the ``messages`` sequence, because otherwise the message storage will not be cleared
-+for the next request.
-+
- Creating custom message levels
- ------------------------------
-
-Index: docs/ref/contrib/admin/index.txt
-===================================================================
---- docs/ref/contrib/admin/index.txt (revision 16771)
-+++ docs/ref/contrib/admin/index.txt (revision 17460)
-@@ -19,8 +19,10 @@
- 1. Add ``'django.contrib.admin'`` to your :setting:`INSTALLED_APPS`
- setting.
-
-- 2. Admin has two dependencies - :mod:`django.contrib.auth` and
-- :mod:`django.contrib.contenttypes`. If these applications are not
-+ 2. The admin has four dependencies - :mod:`django.contrib.auth`,
-+ :mod:`django.contrib.contenttypes`,
-+ :mod:`django.contrib.messages` and
-+ :mod:`django.contrib.sessions`. If these applications are not
- in your :setting:`INSTALLED_APPS` list, add them.
-
- 3. Determine which of your application's models should be editable in the
-@@ -542,7 +544,7 @@
- Fields in ``list_filter`` can also span relations using the ``__`` lookup::
-
- class UserAdminWithLookup(UserAdmin):
-- list_filter = ('groups__name')
-+ list_filter = ('groups__name',)
-
- .. attribute:: ModelAdmin.list_per_page
-
-Index: docs/ref/django-admin.txt
-===================================================================
---- docs/ref/django-admin.txt (revision 16771)
-+++ docs/ref/django-admin.txt (revision 17460)
-@@ -1156,7 +1156,7 @@
- Note that this option is unnecessary in ``manage.py``, because it takes care of
- setting the Python path for you.
-
--.. _import search path: http://diveintopython.org/getting_to_know_python/everything_is_an_object.html
-+.. _import search path: http://diveintopython.net/getting_to_know_python/everything_is_an_object.html
-
- .. django-admin-option:: --settings
-
-Index: docs/ref/signals.txt
-===================================================================
---- docs/ref/signals.txt (revision 16771)
-+++ docs/ref/signals.txt (revision 17460)
-@@ -352,12 +352,16 @@
- .. data:: django.db.models.signals.post_syncdb
- :module:
-
--Sent by :djadmin:`syncdb` after it installs an application.
-+Sent by :djadmin:`syncdb` command after it installs an application, and
-+:djadmin:`flush` command.
-
- Any handlers that listen to this signal need to be written in a particular
- place: a ``management`` module in one of your :setting:`INSTALLED_APPS`. If
- handlers are registered anywhere else they may not be loaded by
--:djadmin:`syncdb`.
-+:djadmin:`syncdb`. It is important that handlers of this signal perform
-+idempotent changes (e.g. no database alterations) as this may cause the
-+:djadmin:`flush` management command to fail if it also ran during the
-+:djadmin:`syncdb` command.
-
- Arguments sent with this signal:
-
-Index: README
-===================================================================
---- README (revision 16771)
-+++ README (revision 17460)
-@@ -28,7 +28,7 @@
- To get more help:
-
- * Join the #django channel on irc.freenode.net. Lots of helpful people
-- hang out there. Read the archives at http://botland.oebfare.com/logger/django/.
-+ hang out there. Read the archives at http://django-irc-logs.com/.
-
- * Join the django-users mailing list, or read the archives, at
- http://groups.google.com/group/django-users.
diff --git a/libre/python2-bencode/PKGBUILD b/libre/python2-bencode/PKGBUILD
new file mode 100644
index 000000000..762d55cad
--- /dev/null
+++ b/libre/python2-bencode/PKGBUILD
@@ -0,0 +1,24 @@
+# Maintainer: Luke Shumaker <lukeshu@sbcglobal.net>
+
+_pkgname=bencode
+pkgname=python2-bencode
+pkgver=1.0
+pkgdesc="BitTorrent bencode module as leight-weight, standalone package"
+url="http://pypi.python.org/pypi/BitTorrent-bencode"
+license=('custom:BitTorrent Open Source License')
+
+pkgrel=1
+arch=('any')
+depends=('python2')
+makedepends=('python2-distribute')
+source=(http://pypi.python.org/packages/source/${_pkgname:0:1}/${_pkgname}/${_pkgname}-${pkgver}.tar.gz
+ bittorrent-osl.txt)
+
+package(){
+ cd "$srcdir/$_pkgname-$pkgver"
+ python2 setup.py install --root="$pkgdir" --optimize=1
+ install -Dm644 "$srcdir"/bittorrent-osl.txt "$pkgdir"/usr/share/licenses/$pkgname/LICENSE
+}
+
+md5sums=('400dd42ff346eb7db91245403f8f2b7b'
+ '016d959cb9f7a319e48d9699c4ef2f42')
diff --git a/libre/python2-bencode/bittorrent-osl.txt b/libre/python2-bencode/bittorrent-osl.txt
new file mode 100644
index 000000000..f0625f45c
--- /dev/null
+++ b/libre/python2-bencode/bittorrent-osl.txt
@@ -0,0 +1,510 @@
+BitTorrent Open Source License
+
+Version 1.1
+
+This BitTorrent Open Source License (the "License") applies to the
+BitTorrent client and related software products as well as any updates
+or maintenance releases of that software ("BitTorrent Products") that
+are distributed by BitTorrent, Inc. ("Licensor"). Any BitTorrent
+Product licensed pursuant to this License is a Licensed
+Product. Licensed Product, in its entirety, is protected by
+U.S. copyright law. This License identifies the terms under which you
+may use, copy, distribute or modify Licensed Product.
+
+Preamble
+
+This Preamble is intended to describe, in plain English, the nature
+and scope of this License. However, this Preamble is not a part of
+this license. The legal effect of this License is dependent only upon
+the terms of the License and not this Preamble.
+
+This License complies with the Open Source Definition and is derived
+from the Jabber Open Source License 1.0 (the "JOSL"), which has been
+approved by Open Source Initiative. Sections 4(c) and 4(f)(iii) from
+the JOSL have been deleted.
+
+This License provides that:
+
+1. You may use or give away the Licensed Product, alone or as a
+component of an aggregate software distribution containing programs
+from several different sources. No royalty or other fee is required.
+
+2. Both Source Code and executable versions of the Licensed Product,
+including Modifications made by previous Contributors, are available
+for your use. (The terms "Licensed Product," "Modifications,"
+"Contributors" and "Source Code" are defined in the License.)
+
+3. You are allowed to make Modifications to the Licensed Product, and
+you can create Derivative Works from it. (The term "Derivative Works"
+is defined in the License.)
+
+4. By accepting the Licensed Product under the provisions of this
+License, you agree that any Modifications you make to the Licensed
+Product and then distribute are governed by the provisions of this
+License. In particular, you must make the Source Code of your
+Modifications available to others free of charge and without a
+royalty.
+
+5. You may sell, accept donations or otherwise receive compensation
+for executable versions of a Licensed Product, without paying a
+royalty or other fee to the Licensor or any Contributor, provided that
+such executable versions contain your or another Contributor?s
+material Modifications. For the avoidance of doubt, to the extent your
+executable version of a Licensed Product does not contain your or
+another Contributor?s material Modifications, you may not sell, accept
+donations or otherwise receive compensation for such executable.
+
+You may use the Licensed Product for any purpose, but the Licensor is
+not providing you any warranty whatsoever, nor is the Licensor
+accepting any liability in the event that the Licensed Product doesn't
+work properly or causes you any injury or damages.
+
+6. If you sublicense the Licensed Product or Derivative Works, you may
+charge fees for warranty or support, or for accepting indemnity or
+liability obligations to your customers. You cannot charge for, sell,
+accept donations or otherwise receive compensation for the Source
+Code.
+
+7. If you assert any patent claims against the Licensor relating to
+the Licensed Product, or if you breach any terms of the License, your
+rights to the Licensed Product under this License automatically
+terminate.
+
+You may use this License to distribute your own Derivative Works, in
+which case the provisions of this License will apply to your
+Derivative Works just as they do to the original Licensed Product.
+
+Alternatively, you may distribute your Derivative Works under any
+other OSI-approved Open Source license, or under a proprietary license
+of your choice. If you use any license other than this License,
+however, you must continue to fulfill the requirements of this License
+(including the provisions relating to publishing the Source Code) for
+those portions of your Derivative Works that consist of the Licensed
+Product, including the files containing Modifications.
+
+New versions of this License may be published from time to time in
+connection with new versions of a Licensed Product or otherwise. You
+may choose to continue to use the license terms in this version of the
+License for the Licensed Product that was originally licensed
+hereunder, however, the new versions of this License will at all times
+apply to new versions of the Licensed Product released by Licensor
+after the release of the new version of this License. Only the
+Licensor has the right to change the License terms as they apply to
+the Licensed Product.
+
+This License relies on precise definitions for certain terms. Those
+terms are defined when they are first used, and the definitions are
+repeated for your convenience in a Glossary at the end of the License.
+
+License Terms
+
+1. Grant of License From Licensor. Subject to the terms and conditions
+of this License, Licensor hereby grants you a world-wide,
+royalty-free, non-exclusive license, subject to third party
+intellectual property claims, to do the following:
+
+a. Use, reproduce, modify, display, perform, sublicense and distribute
+any Modifications created by a Contributor or portions thereof, in
+both Source Code or as an executable program, either on an unmodified
+basis or as part of Derivative Works.
+
+b. Under claims of patents now or hereafter owned or controlled by
+Contributor, to make, use, sell, offer for sale, have made, and/or
+otherwise dispose of Modifications or portions thereof, but solely to
+the extent that any such claim is necessary to enable you to make,
+use, sell, offer for sale, have made, and/or otherwise dispose of
+Modifications or portions thereof or Derivative Works thereof.
+
+2. Grant of License to Modifications From Contributor. "Modifications"
+means any additions to or deletions from the substance or structure of
+(i) a file containing a Licensed Product, or (ii) any new file that
+contains any part of a Licensed Product. Hereinafter in this License,
+the term "Licensed Product" shall include all previous Modifications
+that you receive from any Contributor. Subject to the terms and
+conditions of this License, By application of the provisions in
+Section 4(a) below, each person or entity who created or contributed
+to the creation of, and distributed, a Modification (a "Contributor")
+hereby grants you a world-wide, royalty-free, non-exclusive license,
+subject to third party intellectual property claims, to do the
+following:
+
+a. Use, reproduce, modify, display, perform, sublicense and distribute
+any Modifications created by such Contributor or portions thereof, in
+both Source Code or as an executable program, either on an unmodified
+basis or as part of Derivative Works.
+
+b. Under claims of patents now or hereafter owned or controlled by
+Contributor, to make, use, sell, offer for sale, have made, and/or
+otherwise dispose of Modifications or portions thereof, but solely to
+the extent that any such claim is necessary to enable you to make,
+use, sell, offer for sale, have made, and/or otherwise dispose of
+Modifications or portions thereof or Derivative Works thereof.
+
+3. Exclusions From License Grant. Nothing in this License shall be
+deemed to grant any rights to trademarks, copyrights, patents, trade
+secrets or any other intellectual property of Licensor or any
+Contributor except as expressly stated herein. No patent license is
+granted separate from the Licensed Product, for code that you delete
+from the Licensed Product, or for combinations of the Licensed Product
+with other software or hardware. No right is granted to the trademarks
+of Licensor or any Contributor even if such marks are included in the
+Licensed Product. Nothing in this License shall be interpreted to
+prohibit Licensor from licensing under different terms from this
+License any code that Licensor otherwise would have a right to
+license. As an express condition for your use of the Licensed Product,
+you hereby agree that you will not, without the prior written consent
+of Licensor, use any trademarks, copyrights, patents, trade secrets or
+any other intellectual property of Licensor or any Contributor except
+as expressly stated herein. For the avoidance of doubt and without
+limiting the foregoing, you hereby agree that you will not use or
+display any trademark of Licensor or any Contributor in any domain
+name, directory filepath, advertisement, link or other reference to
+you in any manner or in any media.
+
+4. Your Obligations Regarding Distribution.
+
+a. Application of This License to Your Modifications. As an express
+condition for your use of the Licensed Product, you hereby agree that
+any Modifications that you create or to which you contribute, and
+which you distribute, are governed by the terms of this License
+including, without limitation, Section 2. Any Modifications that you
+create or to which you contribute may be distributed only under the
+terms of this License or a future version of this License released
+under Section 7. You must include a copy of this License with every
+copy of the Modifications you distribute. You agree not to offer or
+impose any terms on any Source Code or executable version of the
+Licensed Product or Modifications that alter or restrict the
+applicable version of this License or the recipients' rights
+hereunder. However, you may include an additional document offering
+the additional rights described in Section 4(d).
+
+b. Availability of Source Code. You must make available, without
+charge, under the terms of this License, the Source Code of the
+Licensed Product and any Modifications that you distribute, either on
+the same media as you distribute any executable or other form of the
+Licensed Product, or via a mechanism generally accepted in the
+software development community for the electronic transfer of data (an
+"Electronic Distribution Mechanism"). The Source Code for any version
+of Licensed Product or Modifications that you distribute must remain
+available for as long as any executable or other form of the Licensed
+Product is distributed by you. You are responsible for ensuring that
+the Source Code version remains available even if the Electronic
+Distribution Mechanism is maintained by a third party.
+
+c. Intellectual Property Matters.
+
+i. Third Party Claims. If you have knowledge that a license to a third
+party's intellectual property right is required to exercise the rights
+granted by this License, you must include a text file with the Source
+Code distribution titled "LEGAL" that describes the claim and the
+party making the claim in sufficient detail that a recipient will know
+whom to contact. If you obtain such knowledge after you make any
+Modifications available as described in Section 4(b), you shall
+promptly modify the LEGAL file in all copies you make available
+thereafter and shall take other steps (such as notifying appropriate
+mailing lists or newsgroups) reasonably calculated to inform those who
+received the Licensed Product from you that new knowledge has been
+obtained.
+
+ii. Contributor APIs. If your Modifications include an application
+programming interface ("API") and you have knowledge of patent
+licenses that are reasonably necessary to implement that API, you must
+also include this information in the LEGAL file.
+
+iii. Representations. You represent that, except as disclosed pursuant
+to 4(c)(i) above, you believe that any Modifications you distribute
+are your original creations and that you have sufficient rights to
+grant the rights conveyed by this License.
+
+d. Required Notices. You must duplicate this License in any
+documentation you provide along with the Source Code of any
+Modifications you create or to which you contribute, and which you
+distribute, wherever you describe recipients' rights relating to
+Licensed Product. You must duplicate the notice contained in Exhibit A
+(the "Notice") in each file of the Source Code of any copy you
+distribute of the Licensed Product. If you created a Modification, you
+may add your name as a Contributor to the Notice. If it is not
+possible to put the Notice in a particular Source Code file due to its
+structure, then you must include such Notice in a location (such as a
+relevant directory file) where a user would be likely to look for such
+a notice. You may choose to offer, and charge a fee for, warranty,
+support, indemnity or liability obligations to one or more recipients
+of Licensed Product. However, you may do so only on your own behalf,
+and not on behalf of the Licensor or any Contributor. You must make it
+clear that any such warranty, support, indemnity or liability
+obligation is offered by you alone, and you hereby agree to indemnify
+the Licensor and every Contributor for any liability incurred by the
+Licensor or such Contributor as a result of warranty, support,
+indemnity or liability terms you offer.
+
+e. Distribution of Executable Versions. You may distribute Licensed
+Product as an executable program under a license of your choice that
+may contain terms different from this License provided (i) you have
+satisfied the requirements of Sections 4(a) through 4(d) for that
+distribution, (ii) you include a conspicuous notice in the executable
+version, related documentation and collateral materials stating that
+the Source Code version of the Licensed Product is available under the
+terms of this License, including a description of how and where you
+have fulfilled the obligations of Section 4(b), and (iii) you make it
+clear that any terms that differ from this License are offered by you
+alone, not by Licensor or any Contributor. You hereby agree to
+indemnify the Licensor and every Contributor for any liability
+incurred by Licensor or such Contributor as a result of any terms you
+offer.
+
+f. Distribution of Derivative Works. You may create Derivative Works
+(e.g., combinations of some or all of the Licensed Product with other
+code) and distribute the Derivative Works as products under any other
+license you select, with the proviso that the requirements of this
+License are fulfilled for those portions of the Derivative Works that
+consist of the Licensed Product or any Modifications thereto.
+
+g. Compensation for Distribution of Executable Versions of Licensed
+Products, Modifications or Derivative Works. Notwithstanding any
+provision of this License to the contrary, by distributing, selling,
+licensing, sublicensing or otherwise making available any Licensed
+Product, or Modification or Derivative Work thereof, you and Licensor
+hereby acknowledge and agree that you may sell, license or sublicense
+for a fee, accept donations or otherwise receive compensation for
+executable versions of a Licensed Product, without paying a royalty or
+other fee to the Licensor or any other Contributor, provided that such
+executable versions (i) contain your or another Contributor?s material
+Modifications, or (ii) are otherwise material Derivative Works. For
+purposes of this License, an executable version of the Licensed
+Product will be deemed to contain a material Modification, or will
+otherwise be deemed a material Derivative Work, if (a) the Licensed
+Product is modified with your own or a third party?s software programs
+or other code, and/or the Licensed Product is combined with a number
+of your own or a third party?s software programs or code,
+respectively, and (b) such software programs or code add or contribute
+material value, functionality or features to the License Product. For
+the avoidance of doubt, to the extent your executable version of a
+Licensed Product does not contain your or another Contributor?s
+material Modifications or is otherwise not a material Derivative Work,
+in each case as contemplated herein, you may not sell, license or
+sublicense for a fee, accept donations or otherwise receive
+compensation for such executable. Additionally, without limitation of
+the foregoing and notwithstanding any provision of this License to the
+contrary, you cannot charge for, sell, license or sublicense for a
+fee, accept donations or otherwise receive compensation for the Source
+Code.
+
+5. Inability to Comply Due to Statute or Regulation. If it is
+impossible for you to comply with any of the terms of this License
+with respect to some or all of the Licensed Product due to statute,
+judicial order, or regulation, then you must (i) comply with the terms
+of this License to the maximum extent possible, (ii) cite the statute
+or regulation that prohibits you from adhering to the License, and
+(iii) describe the limitations and the code they affect. Such
+description must be included in the LEGAL file described in Section
+4(d), and must be included with all distributions of the Source
+Code. Except to the extent prohibited by statute or regulation, such
+description must be sufficiently detailed for a recipient of ordinary
+skill at computer programming to be able to understand it.
+
+6. Application of This License. This License applies to code to which
+Licensor or Contributor has attached the Notice in Exhibit A, which is
+incorporated herein by this reference.
+
+7. Versions of This License.
+
+a. New Versions. Licensor may publish from time to time revised and/or
+new versions of the License.
+
+b. Effect of New Versions. Once Licensed Product has been published
+under a particular version of the License, you may always continue to
+use it under the terms of that version, provided that any such license
+be in full force and effect at the time, and has not been revoked or
+otherwise terminated. You may also choose to use such Licensed Product
+under the terms of any subsequent version (but not any prior version)
+of the License published by Licensor. No one other than Licensor has
+the right to modify the terms applicable to Licensed Product created
+under this License.
+
+c. Derivative Works of this License. If you create or use a modified
+version of this License, which you may do only in order to apply it to
+software that is not already a Licensed Product under this License,
+you must rename your license so that it is not confusingly similar to
+this License, and must make it clear that your license contains terms
+that differ from this License. In so naming your license, you may not
+use any trademark of Licensor or any Contributor.
+
+8. Disclaimer of Warranty. LICENSED PRODUCT IS PROVIDED UNDER THIS
+LICENSE ON AN AS IS BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER
+EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE
+LICENSED PRODUCT IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A
+PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE
+QUALITY AND PERFORMANCE OF THE LICENSED PRODUCT IS WITH YOU. SHOULD
+LICENSED PRODUCT PROVE DEFECTIVE IN ANY RESPECT, YOU (AND NOT THE
+LICENSOR OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
+SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY
+CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF LICENSED
+PRODUCT IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+9. Termination.
+
+a. Automatic Termination Upon Breach. This license and the rights
+granted hereunder will terminate automatically if you fail to comply
+with the terms herein and fail to cure such breach within ten (10)
+days of being notified of the breach by the Licensor. For purposes of
+this provision, proof of delivery via email to the address listed in
+the ?WHOIS? database of the registrar for any website through which
+you distribute or market any Licensed Product, or to any alternate
+email address which you designate in writing to the Licensor, shall
+constitute sufficient notification. All sublicenses to the Licensed
+Product that are properly granted shall survive any termination of
+this license so long as they continue to complye with the terms of
+this License. Provisions that, by their nature, must remain in effect
+beyond the termination of this License, shall survive.
+
+b. Termination Upon Assertion of Patent Infringement. If you initiate
+litigation by asserting a patent infringement claim (excluding
+declaratory judgment actions) against Licensor or a Contributor
+(Licensor or Contributor against whom you file such an action is
+referred to herein as Respondent) alleging that Licensed Product
+directly or indirectly infringes any patent, then any and all rights
+granted by such Respondent to you under Sections 1 or 2 of this
+License shall terminate prospectively upon sixty (60) days notice from
+Respondent (the "Notice Period") unless within that Notice Period you
+either agree in writing (i) to pay Respondent a mutually agreeable
+reasonably royalty for your past or future use of Licensed Product
+made by such Respondent, or (ii) withdraw your litigation claim with
+respect to Licensed Product against such Respondent. If within said
+Notice Period a reasonable royalty and payment arrangement are not
+mutually agreed upon in writing by the parties or the litigation claim
+is not withdrawn, the rights granted by Licensor to you under Sections
+1 and 2 automatically terminate at the expiration of said Notice
+Period.
+
+c. Reasonable Value of This License. If you assert a patent
+infringement claim against Respondent alleging that Licensed Product
+directly or indirectly infringes any patent where such claim is
+resolved (such as by license or settlement) prior to the initiation of
+patent infringement litigation, then the reasonable value of the
+licenses granted by said Respondent under Sections 1 and 2 shall be
+taken into account in determining the amount or value of any payment
+or license.
+
+d. No Retroactive Effect of Termination. In the event of termination
+under Sections 9(a) or 9(b) above, all end user license agreements
+(excluding licenses to distributors and resellers) that have been
+validly granted by you or any distributor hereunder prior to
+termination shall survive termination.
+
+10. Limitation of Liability. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL
+THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE,
+SHALL THE LICENSOR, ANY CONTRIBUTOR, OR ANY DISTRIBUTOR OF LICENSED
+PRODUCT, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY
+PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF
+GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND
+ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE
+BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
+LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
+RESULTING FROM SUCH PARTYS NEGLIGENCE TO THE EXTENT APPLICABLE LAW
+PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
+EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
+THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+
+11. Responsibility for Claims. As between Licensor and Contributors,
+each party is responsible for claims and damages arising, directly or
+indirectly, out of its utilization of rights under this License. You
+agree to work with Licensor and Contributors to distribute such
+responsibility on an equitable basis. Nothing herein is intended or
+shall be deemed to constitute any admission of liability.
+
+12. U.S. Government End Users. The Licensed Product is a commercial
+item, as that term is defined in 48 C.F.R. 2.101 (Oct. 1995),
+consisting of commercial computer software and commercial computer
+software documentation, as such terms are used in 48 C.F.R. 12.212
+(Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48
+C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government
+End Users acquire Licensed Product with only those rights set forth
+herein.
+
+13. Miscellaneous. This License represents the complete agreement
+concerning the subject matter hereof. If any provision of this License
+is held to be unenforceable, such provision shall be reformed only to
+the extent necessary to make it enforceable. This License shall be
+governed by California law provisions (except to the extent applicable
+law, if any, provides otherwise), excluding its conflict-of-law
+provisions. You expressly agree that in any litigation relating to
+this license the losing party shall be responsible for costs
+including, without limitation, court costs and reasonable attorneys
+fees and expenses. The application of the United Nations Convention on
+Contracts for the International Sale of Goods is expressly
+excluded. Any law or regulation that provides that the language of a
+contract shall be construed against the drafter shall not apply to
+this License.
+
+14. Definition of You in This License. You throughout this License,
+whether in upper or lower case, means an individual or a legal entity
+exercising rights under, and complying with all of the terms of, this
+License or a future version of this License issued under Section
+7. For legal entities, you includes any entity that controls, is
+controlled by, is under common control with, or affiliated with,
+you. For purposes of this definition, control means (i) the power,
+direct or indirect, to cause the direction or management of such
+entity, whether by contract or otherwise, or (ii) ownership of fifty
+percent (50%) or more of the outstanding shares, or (iii) beneficial
+ownership of such entity. You are responsible for advising any
+affiliated entity of the terms of this License, and that any rights or
+privileges derived from or obtained by way of this License are subject
+to the restrictions outlined herein.
+
+15. Glossary. All defined terms in this License that are used in more
+than one Section of this License are repeated here, in alphabetical
+order, for the convenience of the reader. The Section of this License
+in which each defined term is first used is shown in parentheses.
+
+Contributor: Each person or entity who created or contributed to the
+creation of, and distributed, a Modification. (See Section 2)
+
+Derivative Works: That term as used in this License is defined under
+U.S. copyright law. (See Section 1(b))
+
+License: This BitTorrent Open Source License. (See first paragraph of License)
+
+Licensed Product: Any BitTorrent Product licensed pursuant to this
+License. The term "Licensed Product" includes all previous
+Modifications from any Contributor that you receive. (See first
+paragraph of License and Section 2)
+
+Licensor: BitTorrent, Inc. (See first paragraph of License)
+
+Modifications: Any additions to or deletions from the substance or
+structure of (i) a file containing Licensed Product, or (ii) any new
+file that contains any part of Licensed Product. (See Section 2)
+
+Notice: The notice contained in Exhibit A. (See Section 4(e))
+
+Source Code: The preferred form for making modifications to the
+Licensed Product, including all modules contained therein, plus any
+associated interface definition files, scripts used to control
+compilation and installation of an executable program, or a list of
+differential comparisons against the Source Code of the Licensed
+Product. (See Section 1(a))
+
+You: This term is defined in Section 14 of this License.
+
+EXHIBIT A
+
+The Notice below must appear in each file of the Source Code of any
+copy you distribute of the Licensed Product or any
+hereto. Contributors to any Modifications may add their own copyright
+notices to identify their own contributions.
+
+License:
+
+The contents of this file are subject to the BitTorrent Open Source
+License Version 1.0 (the License). You may not copy or use this file,
+in either source code or executable form, except in compliance with
+the License. You may obtain a copy of the License at
+http://www.bittorrent.com/license/.
+
+Software distributed under the License is distributed on an AS IS
+basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+the License for the specific language governing rights and limitations
+under the License.
+
+BitTorrent, Inc.
diff --git a/libre/python2-cssmin-fredj/PKGBUILD b/libre/python2-cssmin-fredj/PKGBUILD
index 0f155de89..ba21b8fc4 100644
--- a/libre/python2-cssmin-fredj/PKGBUILD
+++ b/libre/python2-cssmin-fredj/PKGBUILD
@@ -4,14 +4,13 @@ _pkgname=python2-cssmin
pkgname=python2-cssmin-fredj
pkgver=0.1.4.git4 # 0.1.4.git<number of commits after 0.1.4>
_gitver='commit=3422b9962c5a6c2adb9597f418131d73e991c9b6'
-pkgdesc="Provides a country field for Django models"
-license=('custom:MIT')
-url="http://bitbucket.org/smileychris/django-countries/"
-
+pkgdesc="A Python port of the YUI CSS compression algorithm"
+license=('custom:MIT' 'custom:BSD3')
+url="https://github.com/fredj/cssmin"
provides=("$_pkgname=$pkgver")
conflicts=("$_pkgname")
-pkgrel=1
+pkgrel=2
arch=(any)
makedepends=('python2-distribute')
diff --git a/libre/python2-jsmin/PKGBUILD b/libre/python2-jsmin/PKGBUILD
new file mode 100644
index 000000000..5c7646ec2
--- /dev/null
+++ b/libre/python2-jsmin/PKGBUILD
@@ -0,0 +1,27 @@
+# Maintainer: Luke Shumaker <lukeshu@sbcglobal.net>
+
+_pkgname=jsmin
+pkgname=python2-jsmin
+pkgver=2.0.3
+pkgdesc="JavaScript minifier"
+url="https://bitbucket.org/dcs/jsmin"
+license=('MIT')
+
+pkgrel=1
+arch=('any')
+depends=('python2')
+makedepends=('python2-distribute')
+source=(http://pypi.python.org/packages/source/${_pkgname:0:1}/${_pkgname}/${_pkgname}-${pkgver}.tar.gz)
+
+build() {
+ cd "$srcdir/$_pkgname-$pkgver"
+ sed -rn 's/^#\s?//p' jsmin/__init__.py > license.txt
+}
+
+package() {
+ cd "$srcdir/$_pkgname-$pkgver"
+ python2 setup.py install --root="$pkgdir" --optimize=1
+ install -Dm644 license.txt "$pkgdir"/usr/share/licenses/$pkgname/LICENSE
+}
+
+md5sums=('6bdce452c7508d9bd11b133e965fb64e')