From fd0e3a314c141b60f2ecc778674136ed5b620800 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Thu, 4 Oct 2018 22:53:35 +0200 Subject: [PATCH 1/5] user: add a deleted flag (#24430) --- tests/test_sql.py | 23 +++++++++++++++++++++++ wcs/sql.py | 17 ++++++++++++----- wcs/users.py | 1 + 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/tests/test_sql.py b/tests/test_sql.py index 892b9bad..f60f22e7 100644 --- a/tests/test_sql.py +++ b/tests/test_sql.py @@ -1179,6 +1179,29 @@ def test_migration_24_evolution_index(): conn.commit() cur.close() +@postgresql +def test_migration_29_user_deleted(): + conn, cur = sql.get_connection_and_cursor() + cur.execute('UPDATE wcs_meta SET value = 28 WHERE key = %s', ('sql_level',)) + conn.commit() + cur.close() + + sql.SqlUser.wipe() + user = sql.SqlUser() + user.name = 'Jean Sénisme' + user.store() + assert sql.SqlUser.count() == 1 + + conn, cur = sql.get_connection_and_cursor() + cur.execute('ALTER TABLE users DROP COLUMN deleted') + assert not column_exists_in_table(cur, 'users', 'deleted') + sql.migrate() + assert column_exists_in_table(cur, 'users', 'ascii_name') + assert migration_level(cur) >= 28 + + assert sql.SqlUser.count() == 1 + assert not sql.SqlUser.get(id=user.id).deleted + def drop_formdef_tables(): conn, cur = sql.get_connection_and_cursor() cur.execute('''SELECT table_name FROM information_schema.tables''') diff --git a/wcs/sql.py b/wcs/sql.py index c45e448c..315d508a 100644 --- a/wcs/sql.py +++ b/wcs/sql.py @@ -540,7 +540,8 @@ def do_user_table(): verified_fields text[], name_identifiers text[], lasso_dump text, - last_seen timestamp)''' % table_name) + last_seen timestamp, + deleted boolean DEFAULT(FALSE))''' % table_name) cur.execute('''SELECT column_name FROM information_schema.columns WHERE table_schema = 'public' AND table_name = %s''', (table_name,)) @@ -548,7 +549,7 @@ def do_user_table(): needed_fields = set(['id', 'name', 'email', 'roles', 'is_admin', 'anonymous', 'name_identifiers', 'verified_fields', - 'lasso_dump', 'last_seen', 'fts', 'ascii_name']) + 'lasso_dump', 'last_seen', 'fts', 'ascii_name', 'deleted']) from admin.settings import UserFieldsFormDef formdef = UserFieldsFormDef() @@ -587,6 +588,9 @@ def do_user_table(): if not 'ascii_name' in existing_fields: cur.execute('ALTER TABLE %s ADD COLUMN ascii_name varchar' % table_name) + if not 'deleted' in existing_fields: + cur.execute('ALTER TABLE %s ADD COLUMN deleted DEFAULT(FALSE)' % table_name) + # delete obsolete fields for field in (existing_fields - needed_fields): cur.execute('''ALTER TABLE %s DROP COLUMN %s''' % (table_name, field)) @@ -1605,6 +1609,7 @@ class SqlUser(SqlMixin, wcs.users.User): ('lasso_dump', 'text'), ('last_seen', 'timestamp'), ('ascii_name', 'varchar'), + ('deleted', 'boolean'), ] id = None @@ -1629,6 +1634,7 @@ class SqlUser(SqlMixin, wcs.users.User): 'verified_fields': self.verified_fields, 'lasso_dump': self.lasso_dump, 'last_seen': None, + 'deleted': self.deleted, } if self.last_seen: sql_dict['last_seen'] = datetime.datetime.fromtimestamp(self.last_seen), @@ -1696,7 +1702,7 @@ class SqlUser(SqlMixin, wcs.users.User): o = cls() (o.id, o.name, o.email, o.roles, o.is_admin, o.anonymous, o.name_identifiers, o.verified_fields, o.lasso_dump, - o.last_seen, ascii_name) = [str_encode(x) for x in tuple(row[:11])] + o.last_seen, ascii_name, o.deleted) = [str_encode(x) for x in tuple(row[:12])] if o.last_seen: o.last_seen = time.mktime(o.last_seen.timetuple()) if o.roles: @@ -2151,7 +2157,7 @@ def get_yearly_totals(period_start=None, period_end=None, criterias=None): return result -SQL_LEVEL = 28 +SQL_LEVEL = 29 def migrate_global_views(conn, cur): cur.execute('''SELECT COUNT(*) FROM information_schema.tables @@ -2235,12 +2241,13 @@ def migrate(): # 26: add digest to formdata # 27: add last_jump_datetime in evolutions tables migrate_views(conn, cur) - if sql_level < 21: + if sql_level < 29: # 3: introduction of _structured for user fields # 4: removal of identification_token # 12: (first part) add fts to users # 16: add verified_fields to users # 21: (first part) add ascii_name to users + # 29: add deleted do_user_table() if sql_level < 6: # 6: add actions_roles_array to tables and views diff --git a/wcs/users.py b/wcs/users.py index df334313..c769ff60 100644 --- a/wcs/users.py +++ b/wcs/users.py @@ -35,6 +35,7 @@ class User(StorableObject): verified_fields = None name_identifiers = None lasso_dump = None + deleted = False last_seen = None -- 2.18.0