0001-users-add-cronjob-to-delete-users-24430.patch
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 |
- |