Effacer toute contrainte de clé étrangère vers une vue de datamaster au syncdb
authorEric Mc Sween <eric.mcsween@auf.org>
Mon, 12 Mar 2012 20:44:34 +0000 (16:44 -0400)
committerEric Mc Sween <eric.mcsween@auf.org>
Mon, 12 Mar 2012 20:44:34 +0000 (16:44 -0400)
CHANGES
auf/django/references/management/__init__.py
doc/conf.py
setup.py

diff --git a/CHANGES b/CHANGES
index c22aa78..1bad6b2 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,12 @@
+0.9
+---
+
+* Django crée des contraintes de clé étrangère sur toutes les tables qui ont une
+  clé étrangère sur les données de référence. Mais ceci pose des problèmes
+  puisqu'on ne peut pas avoir de contraintes sur des vues. Nous effaçons donc
+  maintenant les contraintes de clé étrangère sur les vues de datamaster lors du
+  syncdb.
+
 0.8 (2012-02-24)
 ----------------
 
index bb99869..96bb4eb 100644 (file)
@@ -1,18 +1,19 @@
 # encoding: utf-8
 
 from django import db
-from django.db.models import get_models, signals
-from django.conf import settings
+from django.db.models import signals
 
 import auf.django.references.models
 
+
 def post_syncdb(sender, **kwargs):
     """Création des vues vers datamaster."""
 
     # On ne crée des vues que si on est sur une BD MySQL.
     # L'attribut db.connection.vendor n'est présent qu'à partir de Django
     # 1.3
-    if (hasattr(db.connection, 'vendor') and db.connection.vendor != 'mysql') or \
+    if (hasattr(db.connection, 'vendor')
+        and db.connection.vendor != 'mysql') or \
        'mysql' not in db.backend.__name__:
         return
 
@@ -34,10 +35,27 @@ def post_syncdb(sender, **kwargs):
 
     # On peut maintenant créer les vues
     cursor = db.connection.cursor()
+    schema = db.connection.settings_dict['NAME']
     for table in datamaster_tables:
         print u"Création d'une vue vers datamaster.%s" % table
         cursor.execute(
-            'CREATE OR REPLACE VIEW `%s` AS SELECT * FROM datamaster.`%s`' % (table, table)
+            'CREATE OR REPLACE VIEW `%s` AS SELECT * FROM datamaster.`%s`' %
+            (table, table)
         )
 
+        # Vérifions s'il y a des foreign keys vers cette vue.
+        cursor.execute(
+            '''
+            SELECT TABLE_NAME, CONSTRAINT_NAME
+            FROM information_schema.REFERENTIAL_CONSTRAINTS
+            WHERE CONSTRAINT_SCHEMA = %s AND REFERENCED_TABLE_NAME = %s
+            ''',
+            (schema, table)
+        )
+        for row in cursor:
+            db.connection.cursor().execute(
+                'ALTER TABLE %s DROP FOREIGN KEY %s' % row
+            )
+
+
 signals.post_syncdb.connect(post_syncdb, sender=auf.django.references.models)
index e218430..8fcdb22 100644 (file)
@@ -48,9 +48,9 @@ copyright = u'2012, AUF'
 # built documents.
 #
 # The short X.Y version.
-version = '0.8'
+version = '0.9'
 # The full version, including alpha/beta/rc tags.
-release = '0.8'
+release = '0.9'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
index 2b67503..87d7ecc 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -3,7 +3,7 @@
 from setuptools import setup, find_packages
 
 name = 'auf.django.references'
-version = '0.8'
+version = '0.9'
 
 setup(
     name=name,