From 09d61872476f16eed2d31d7ca7b605b0f957b04d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Thu, 5 Nov 2015 17:11:45 +0100 Subject: [PATCH] sql: add a "last_update_time" column to views (#8886) --- tests/test_sql.py | 47 +++++++++++++++++++++++++++++++++++++++++++++++ wcs/sql.py | 11 ++++++++++- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/tests/test_sql.py b/tests/test_sql.py index bceea37..0b1e020 100644 --- a/tests/test_sql.py +++ b/tests/test_sql.py @@ -1001,3 +1001,50 @@ def test_actions_roles(): formdatas = sql.AnyFormData.select(criterias) assert total_count == 1 assert formdatas[0].id == formdata_id + +@postgresql +def test_last_update_time(): + drop_formdef_tables() + conn, cur = sql.get_connection_and_cursor() + + wf = Workflow(name='test last update time') + st1 = wf.add_status('Status1', 'st1') + + commentable = CommentableWorkflowStatusItem() + commentable.id = '_commentable' + commentable.by = ['_submitter', '_receiver'] + st1.items.append(commentable) + commentable.parent = st1 + wf.store() + + formdef = FormDef() + formdef.name = 'test last update time' + formdef.fields = [] + formdef.workflow = wf + formdef.store() + + data_class = formdef.data_class(mode='sql') + formdata1 = data_class() + formdata1.status = 'wf-st1' + formdata1.just_created() + formdata1.jump_status('st1') # will add another evolution entry + formdata1.evolution[0].time = datetime.datetime(2015, 1, 1, 0, 0, 0).timetuple() + formdata1.evolution[1].time = datetime.datetime(2015, 1, 2, 0, 0, 0).timetuple() + formdata1.store() + + formdata2 = data_class() + formdata2.status = 'wf-st1' + formdata2.just_created() + formdata2.jump_status('st1') # will add another evolution entry + formdata2.evolution[0].time = datetime.datetime(2015, 1, 3, 0, 0, 0).timetuple() + formdata2.evolution[1].time = datetime.datetime(2015, 1, 4, 0, 0, 0).timetuple() + formdata2.store() + + cur.execute('''SELECT COUNT(*) FROM wcs_all_forms''') + assert bool(cur.fetchone()[0] == 2) + + cur.execute('''SELECT id FROM wcs_all_forms WHERE last_update_time = '2015-01-02 00:00' ''') + assert bool(cur.fetchone()[0] == formdata1.id) + + cur.execute('''SELECT id FROM wcs_all_forms WHERE last_update_time = '2015-01-04 00:00' ''') + assert bool(cur.fetchone()[0] == formdata2.id) diff --git a/wcs/sql.py b/wcs/sql.py index e5208cf..9556126 100644 --- a/wcs/sql.py +++ b/wcs/sql.py @@ -589,6 +589,11 @@ def do_views(formdef, conn, cur, rebuild_global_views=True): ', '.join(["'wf-%s'" % x.id for x in endpoint_status]), '''is_at_endpoint''')) + view_fields.append(('''(SELECT MAX(time) FROM %s_evolutions ''' + ''' WHERE %s.id = %s_evolutions.formdata_id)''' % ( + (table_name, )*3), + 'last_update_time')) + view_fields.append(('concerned_roles_array', 'concerned_roles_array')) view_fields.append(('actions_roles_array', 'actions_roles_array')) view_fields.append(('fts', 'fts')) @@ -638,6 +643,7 @@ def do_global_views(conn, cur): common_fields.append(('actions_roles_array', 'actions_roles_array')) common_fields.append(('fts', 'fts')) common_fields.append(('is_at_endpoint', 'is_at_endpoint')) + common_fields.append(('last_update_time', 'last_update_time')) union = ' UNION '.join(['''SELECT %s FROM %s''' % ( ', '.join([y[1] for y in common_fields]), x) for x in view_names]) @@ -1078,6 +1084,8 @@ class SqlFormData(SqlMixin, wcs.formdata.FormData): if hasattr(evo, '_sql_id'): sql_dict.update({'id': evo._sql_id}) sql_statement = '''UPDATE %s_evolutions SET + time = %%(time)s, + status = %%(status)s, comment = %%(comment)s, parts = %%(parts)s WHERE id = %%(id)s @@ -1720,9 +1728,10 @@ def migrate(): migrate_views(conn, cur) for formdef in FormDef.select(): formdef.data_class().rebuild_security() - if sql_level < 8: + if sql_level < 9: # 7: add backoffice_submission to tables and views # 8: add submission_context to tables + # 9: add last_update_time to views migrate_views(conn, cur) cur.execute('''UPDATE wcs_meta SET value = %s WHERE key = %s''', ( -- 2.6.2