Projet

Général

Profil

0001-users-add-a-deleted-flag-24430.patch

Benjamin Dauvergne, 04 février 2020 16:54

Télécharger (5,55 ko)

Voir les différences:

Subject: [PATCH 1/4] users: add a deleted flag (#24430)

 tests/test_sql.py | 23 +++++++++++++++++++++++
 wcs/sql.py        | 17 ++++++++++++-----
 wcs/users.py      |  7 +++++++
 3 files changed, 42 insertions(+), 5 deletions(-)
tests/test_sql.py
1261 1261
    conn.commit()
1262 1262
    cur.close()
1263 1263

  
1264
@postgresql
1265
def test_migration_37_user_deleted():
1266
    conn, cur = sql.get_connection_and_cursor()
1267
    cur.execute('UPDATE wcs_meta SET value = 28 WHERE key = %s', ('sql_level',))
1268
    conn.commit()
1269
    cur.close()
1270

  
1271
    sql.SqlUser.wipe()
1272
    user = sql.SqlUser()
1273
    user.name = 'Jean Sénisme'
1274
    user.store()
1275
    assert sql.SqlUser.count() == 1
1276

  
1277
    conn, cur = sql.get_connection_and_cursor()
1278
    cur.execute('ALTER TABLE users DROP COLUMN deleted')
1279
    assert not column_exists_in_table(cur, 'users', 'deleted')
1280
    sql.migrate()
1281
    assert column_exists_in_table(cur, 'users', 'ascii_name')
1282
    assert migration_level(cur) >= 28
1283

  
1284
    assert sql.SqlUser.count() == 1
1285
    assert not sql.SqlUser.get(id=user.id).deleted
1286

  
1264 1287

  
1265 1288
def drop_formdef_tables():
1266 1289
    conn, cur = sql.get_connection_and_cursor()
wcs/sql.py
636 636
                                    verified_fields text[],
637 637
                                    name_identifiers text[],
638 638
                                    lasso_dump text,
639
                                    last_seen timestamp)''' % table_name)
639
                                    last_seen timestamp,
640
                                    deleted boolean DEFAULT(FALSE))''' % table_name)
640 641
    cur.execute('''SELECT column_name FROM information_schema.columns
641 642
                    WHERE table_schema = 'public'
642 643
                      AND table_name = %s''', (table_name,))
......
644 645

  
645 646
    needed_fields = set(['id', 'name', 'email', 'roles', 'is_admin',
646 647
        'anonymous', 'name_identifiers', 'verified_fields',
647
        'lasso_dump', 'last_seen', 'fts', 'ascii_name'])
648
        'lasso_dump', 'last_seen', 'fts', 'ascii_name', 'deleted'])
648 649

  
649 650
    from wcs.admin.settings import UserFieldsFormDef
650 651
    formdef = UserFieldsFormDef()
......
683 684
    if not 'ascii_name' in existing_fields:
684 685
        cur.execute('ALTER TABLE %s ADD COLUMN ascii_name varchar' % table_name)
685 686

  
687
    if not 'deleted' in existing_fields:
688
        cur.execute('ALTER TABLE %s ADD COLUMN deleted boolean DEFAULT(FALSE)' % table_name)
689

  
686 690
    # delete obsolete fields
687 691
    for field in (existing_fields - needed_fields):
688 692
        cur.execute('''ALTER TABLE %s DROP COLUMN %s''' % (table_name, field))
......
1771 1775
        ('lasso_dump', 'text'),
1772 1776
        ('last_seen', 'timestamp'),
1773 1777
        ('ascii_name', 'varchar'),
1778
        ('deleted', 'boolean'),
1774 1779
    ]
1775 1780

  
1776 1781
    id = None
......
1795 1800
                'verified_fields': self.verified_fields,
1796 1801
                'lasso_dump': self.lasso_dump,
1797 1802
                'last_seen': None,
1803
                'deleted': self.deleted,
1798 1804
        }
1799 1805
        if self.last_seen:
1800 1806
            sql_dict['last_seen'] = datetime.datetime.fromtimestamp(self.last_seen),
......
1862 1868
        o = cls()
1863 1869
        (o.id, o.name, o.email, o.roles, o.is_admin, o.anonymous,
1864 1870
         o.name_identifiers, o.verified_fields, o.lasso_dump,
1865
         o.last_seen, ascii_name) = [str_encode(x) for x in tuple(row[:11])]
1871
         o.last_seen, ascii_name, o.deleted) = [str_encode(x) for x in tuple(row[:12])]
1866 1872
        if o.last_seen:
1867 1873
            o.last_seen = time.mktime(o.last_seen.timetuple())
1868 1874
        if o.roles:
......
2341 2347
    return result
2342 2348

  
2343 2349

  
2344
SQL_LEVEL = 36
2350
SQL_LEVEL = 37
2345 2351

  
2346 2352

  
2347 2353
def migrate_global_views(conn, cur):
......
2434 2440
        # 31: add user_label to formdata
2435 2441
        # 33: add anonymised field to global view
2436 2442
        migrate_views(conn, cur)
2437
    if sql_level < 21:
2443
    if sql_level < 37:
2438 2444
        # 3: introduction of _structured for user fields
2439 2445
        # 4: removal of identification_token
2440 2446
        # 12: (first part) add fts to users
2441 2447
        # 16: add verified_fields to users
2442 2448
        # 21: (first part) add ascii_name to users
2449
        # 37: add deleted
2443 2450
        do_user_table()
2444 2451
    if sql_level < 6:
2445 2452
        # 6: add actions_roles_array to tables and views
wcs/users.py
36 36
    verified_fields = None
37 37
    name_identifiers = None
38 38
    lasso_dump = None
39
    deleted = False
39 40

  
40 41
    last_seen = None
41 42

  
......
241 242
    def get_full_name(self):
242 243
        return self.display_name
243 244

  
245
    def set_deleted(self):
246
        self.deleted = True
247
        # partial anonymization
248
        self.form_data = {}
249
        self.store()
250

  
244 251

  
245 252
Substitutions.register('session_user_display_name', category=N_('User'), comment=N_('Session User Display Name'))
246 253
Substitutions.register('session_user_email', category=N_('User'), comment=N_('Session User Email'))
247
-