Création des vues au syncdb
authorEric Mc Sween <eric.mcsween@auf.org>
Fri, 24 Feb 2012 19:00:19 +0000 (14:00 -0500)
committerEric Mc Sween <eric.mcsween@auf.org>
Fri, 24 Feb 2012 19:00:19 +0000 (14:00 -0500)
auf/django/coda/management/__init__.py [new file with mode: 0644]

diff --git a/auf/django/coda/management/__init__.py b/auf/django/coda/management/__init__.py
new file mode 100644 (file)
index 0000000..a43b0aa
--- /dev/null
@@ -0,0 +1,43 @@
+# encoding: utf-8
+
+from django import db
+from django.db.models import get_models, signals
+from django.conf import settings
+
+import auf.django.coda.models
+
+def post_syncdb(sender, **kwargs):
+    """Création des vues vers coda."""
+
+    # 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 \
+       'mysql' not in db.backend.__name__:
+        return
+
+    cursor = db.connection.cursor()
+
+    # Vérifions qu'on a une BD qui s'appelle 'coda'
+    if not cursor.execute("SHOW DATABASES LIKE 'coda'"):
+        return
+
+    # Déterminons la liste de tables de référence dans coda
+    cursor.execute("SHOW TABLES IN coda LIKE 'coda\\_%%'")
+    coda_tables = set(row[0] for row in cursor)
+
+    # Déterminons la liste de tables que nous avons déjà et
+    # enlevons-les des tables de coda
+    cursor.execute("SHOW FULL TABLES WHERE Table_type != 'VIEW'")
+    my_tables = set(row[0] for row in cursor)
+    coda_tables.difference_update(my_tables)
+
+    # On peut maintenant créer les vues
+    cursor = db.connection.cursor()
+    for table in coda_tables:
+        print u"Création d'une vue vers coda.%s" % table
+        cursor.execute(
+            'CREATE OR REPLACE VIEW `%s` AS SELECT * FROM coda.`%s`' % (table, table)
+        )
+
+signals.post_syncdb.connect(post_syncdb, sender=auf.django.coda.models)