sql: make sure all formdef have up-to-date tables (#7034)

This commit is contained in:
Frédéric Péters 2015-04-23 12:46:22 +02:00
parent cbab6a94ed
commit a634a69265
2 changed files with 22 additions and 5 deletions

View File

@ -737,6 +737,16 @@ def test_migration_2_formdef_id_in_views():
cur.execute('UPDATE wcs_meta SET value = 1 WHERE key = %s', ('sql_level',))
cur.execute('DROP VIEW wcs_all_forms')
# hack a formdef table the wrong way, to check it is reconstructed
# properly before the views are created
formdef.fields[4] = fields.StringField(id='4', label='item')
cur.execute('DROP VIEW wcs_view_1_tests')
cur.execute('ALTER TABLE formdata_1_tests DROP COLUMN f4_display')
sql.redo_views(conn, cur, formdef, rebuild_global_views=False)
formdef.fields[4] = fields.ItemField(id='4', label='item', items=('apple', 'pear', 'peach', 'apricot')),
assert table_exists(cur, 'wcs_view_1_tests')
assert not column_exists_in_table(cur, 'wcs_view_1_tests', 'f4_display')
view_names = []
cur.execute('''SELECT table_name FROM information_schema.views
WHERE table_name LIKE %s''', ('wcs\_view\_%',))

View File

@ -267,10 +267,15 @@ def guard_postgres(func):
return f
@guard_postgres
def do_formdef_tables(formdef, rebuild_views=False, rebuild_global_views=False):
def do_formdef_tables(formdef, conn=None, cur=None, rebuild_views=False, rebuild_global_views=False):
if formdef.id is None:
return []
conn, cur = get_connection_and_cursor()
own_conn = False
if not conn:
own_conn = True
conn, cur = get_connection_and_cursor()
table_name = get_formdef_table_name(formdef)
cur.execute('''SELECT COUNT(*) FROM information_schema.tables
@ -352,8 +357,9 @@ def do_formdef_tables(formdef, rebuild_views=False, rebuild_global_views=False):
# them even if not asked to.
redo_views(conn, cur, formdef, rebuild_global_views=rebuild_global_views)
conn.commit()
cur.close()
if own_conn:
conn.commit()
cur.close()
actions = []
if not 'concerned_roles_array' in existing_fields:
@ -1587,7 +1593,8 @@ def migrate():
drop_views(None, conn, cur)
from wcs.formdef import FormDef
for formdef in FormDef.select():
redo_views(conn, cur, formdef, rebuild_global_views=False)
# make sure all formdefs have up-to-date views
do_formdef_tables(formdef, conn=conn, cur=cur, rebuild_views=True)
migrate_global_views(conn, cur)
cur.execute('''UPDATE wcs_meta SET value = %s WHERE key = %s''', (