summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAymeric Augustin <aymeric.augustin@m4x.org>2012-01-07 08:53:36 +0000
committerAymeric Augustin <aymeric.augustin@m4x.org>2012-01-07 08:53:36 +0000
commit4629668ffacddb0b8ddb5d8cc7fb8d01f039a4e3 (patch)
tree0b9476ac1c915361ad744151e04dd03ad8b44118
parent33f839b252b26922841a11836785a6826bb459a6 (diff)
Fixed #17415 -- Reset database sequence for Site's pk after creating the default site with an explicit pk. Thanks niko AT neagee net for the report, Russell and Karen for describing the fix, and Anssi for drafting the patch.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@17343 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--django/contrib/sites/management.py20
-rw-r--r--django/contrib/sites/tests.py6
2 files changed, 22 insertions, 4 deletions
diff --git a/django/contrib/sites/management.py b/django/contrib/sites/management.py
index daec3d9eec..1b76bf5411 100644
--- a/django/contrib/sites/management.py
+++ b/django/contrib/sites/management.py
@@ -3,22 +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):
# Only create the default sites in databases where Django created the table
if Site in created_models and router.allow_syncdb(db, Site) :
- if verbosity >= 2:
- print "Creating example.com Site object"
# 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.
- s = Site(pk=1, domain="example.com", name="example.com")
- s.save(using=db)
+ if verbosity >= 2:
+ print "Creating example.com Site object"
+ 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. See #17415.
+ 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 17ab1f2a7c..828badb386 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()