Version 0.22: Ajouté des champs à ref_etablissement:
[auf_django_references.git] / auf / django / references / management / __init__.py
CommitLineData
652c5d02
EMS
1# encoding: utf-8
2
a10aee41 3from django import db
13328043 4from django.db.models import signals
652c5d02
EMS
5
6import auf.django.references.models
7
13328043 8
652c5d02 9def post_syncdb(sender, **kwargs):
a10aee41
EMS
10 """Création des vues vers datamaster."""
11
8775e162
EMS
12 verbosity = kwargs.get('verbosity', 1)
13
a10aee41
EMS
14 # On ne crée des vues que si on est sur une BD MySQL.
15 # L'attribut db.connection.vendor n'est présent qu'à partir de Django
16 # 1.3
13328043
EMS
17 if (hasattr(db.connection, 'vendor')
18 and db.connection.vendor != 'mysql') or \
a10aee41
EMS
19 'mysql' not in db.backend.__name__:
20 return
21
22 cursor = db.connection.cursor()
23
24 # Vérifions qu'on a une BD qui s'appelle 'datamaster'
25 if not cursor.execute("SHOW DATABASES LIKE 'datamaster'"):
26 return
27
28 # Déterminons la liste de tables de référence dans datamaster
29 cursor.execute("SHOW TABLES IN datamaster LIKE 'ref\\_%%'")
30 datamaster_tables = set(row[0] for row in cursor)
31
32 # Déterminons la liste de tables que nous avons déjà et
33 # enlevons-les des tables de datamaster
34 cursor.execute("SHOW FULL TABLES WHERE Table_type != 'VIEW'")
35 my_tables = set(row[0] for row in cursor)
36 datamaster_tables.difference_update(my_tables)
37
38 # On peut maintenant créer les vues
8775e162
EMS
39 if verbosity > 0:
40 print u"Création des vues vers datamaster"
a10aee41 41 cursor = db.connection.cursor()
13328043 42 schema = db.connection.settings_dict['NAME']
a10aee41 43 for table in datamaster_tables:
8775e162
EMS
44 if verbosity > 1:
45 print u"Création d'une vue vers datamaster.%s" % table
a10aee41 46 cursor.execute(
13328043
EMS
47 'CREATE OR REPLACE VIEW `%s` AS SELECT * FROM datamaster.`%s`' %
48 (table, table)
a10aee41 49 )
652c5d02 50
13328043
EMS
51 # Vérifions s'il y a des foreign keys vers cette vue.
52 cursor.execute(
53 '''
54 SELECT TABLE_NAME, CONSTRAINT_NAME
55 FROM information_schema.REFERENTIAL_CONSTRAINTS
56 WHERE CONSTRAINT_SCHEMA = %s AND REFERENCED_TABLE_NAME = %s
57 ''',
58 (schema, table)
59 )
60 for row in cursor:
61 db.connection.cursor().execute(
62 'ALTER TABLE %s DROP FOREIGN KEY %s' % row
63 )
64
65
652c5d02 66signals.post_syncdb.connect(post_syncdb, sender=auf.django.references.models)