Projet

Général

Profil

0001-users-add-cronjob-to-delete-users-24430.patch

Benjamin Dauvergne, 06 octobre 2020 13:17

Télécharger (4,75 ko)

Voir les différences:

Subject: [PATCH] users: add cronjob to delete users (#24430)

 tests/test_users.py | 48 ++++++++++++++++++++++++++++++++++++++++++++-
 wcs/publisher.py    |  8 ++++++++
 wcs/sql.py          | 19 ++++++++++++++++++
 wcs/users.py        | 19 ++++++++++++++++++
 4 files changed, 93 insertions(+), 1 deletion(-)
tests/test_users.py
7 7

  
8 8
import pytest
9 9

  
10
from quixote import cleanup
10
from quixote import cleanup, get_publisher
11 11

  
12 12
from wcs import publisher
13 13
from wcs import fields
......
98 98

  
99 99
    with pytest.raises(AttributeError):
100 100
        user.xxx
101

  
102

  
103
def test_clean_deleted_users():
104
    from wcs.formdef import FormDef
105
    from wcs.qommon import storage as st
106

  
107
    User = pub.user_class
108

  
109
    User.wipe()
110
    FormDef.wipe()
111

  
112
    formdef = FormDef()
113
    formdef.name = 'foobar'
114
    formdef.url_name = 'foobar'
115
    formdef.fields = []
116
    formdef.store()
117
    data_class = formdef.data_class()
118

  
119
    user1 = User()
120
    user1.name = 'Pierre'
121
    user1.deleted_timestamp = datetime.datetime.now()
122
    user1.store()
123

  
124
    user2 = User()
125
    user2.name = 'Jean'
126
    user2.deleted_timestamp = datetime.datetime.now()
127
    user2.store()
128

  
129
    formdata1 = data_class()
130
    formdata1.user_id = user1.id
131
    formdata1.store()
132

  
133
    assert User.count() == 2
134

  
135
    get_publisher().clean_deleted_users()
136

  
137
    assert User.count() == 1
138

  
139
    assert len(User.select([st.Equal('name', 'Pierre')])) == 1
140
    assert len(User.select([st.Equal('name', 'Jean')])) == 0
141

  
142
    data_class.wipe()
143

  
144
    get_publisher().clean_deleted_users()
145

  
146
    assert User.count() == 0
wcs/publisher.py
127 127
        cls.register_cronjob(CronJob(
128 128
            cls.apply_global_action_timeouts,
129 129
            name='evaluate_global_action_timeouts', minutes=[0]))
130
        cls.register_cronjob(CronJob(
131
            cls.clean_deleted_users,
132
            name='clean_deleted_users', minutes=[0]))
130 133

  
131 134
    def is_using_postgresql(self):
132 135
        return bool(self.has_site_option('postgresql') and self.cfg.get('postgresql', {}))
......
374 377
            from . import sql
375 378
            sql.cleanup_connection()
376 379

  
380
    def clean_deleted_users(self):
381
        for user_id in self.user_class.get_to_delete_ids():
382
            self.user_class.remove_object(user_id)
383

  
384

  
377 385
set_publisher_class(WcsPublisher)
378 386
WcsPublisher.register_extra_dir(os.path.join(os.path.dirname(__file__), 'extra'))
379 387

  
wcs/sql.py
2125 2125

  
2126 2126
        return objects
2127 2127

  
2128
    @classmethod
2129
    def get_to_delete_ids(cls):
2130
        from .formdef import FormDef
2131

  
2132
        deleted_ids = set(
2133
            user.id
2134
            for user in cls.select([NotNull('deleted_timestamp')])
2135
        )
2136

  
2137
        active_ids = set()
2138
        if FormDef.count():
2139
            # without any FormDef global views are not created.
2140
            active_ids = set(
2141
                formdata.user_id
2142
                for formdata in AnyFormData.select([Contains('user_id', deleted_ids)], iterator=True)
2143
                if formdata.user_id
2144
            )
2145
        return (deleted_ids - active_ids)
2146

  
2128 2147

  
2129 2148
class Session(SqlMixin, wcs.sessions.BasicSession):
2130 2149
    _table_name = 'sessions'
wcs/users.py
263 263
        self.deleted_timestamp = datetime.datetime.now()
264 264
        self.store()
265 265

  
266
    @classmethod
267
    def get_to_delete_ids(cls):
268
        from .formdef import FormDef
269

  
270
        deleted_ids = set(
271
            user.id
272
            for user in cls.select([st.NotNull('deleted_timestamp')])
273
        )
274

  
275
        active_ids = set()
276
        for formdef in FormDef.select():
277
            data_class = formdef.data_class()
278
            active_ids.update(
279
                formdata.user_id
280
                for formdata in data_class.select(iterator=True)
281
                if formdata.user_id
282
            )
283

  
284
        return (deleted_ids - active_ids)
266 285

  
267 286
Substitutions.register('session_user_display_name', category=N_('User'), comment=N_('Session User Display Name'))
268 287
Substitutions.register('session_user_email', category=N_('User'), comment=N_('Session User Email'))
269
-