|
1 | 1 | from distutils.util import strtobool |
2 | 2 | from typing import Optional |
| 3 | +from collections.abc import Generator |
3 | 4 |
|
4 | 5 | from flask import stream_with_context, Response |
5 | 6 | from flask_restful import Resource, current_app, request |
@@ -144,20 +145,35 @@ def get(self): |
144 | 145 | @token_auth.login_required |
145 | 146 | def delete(self): |
146 | 147 | if UserService.is_user_an_admin(token_auth.current_user()): |
147 | | - |
148 | | - def delete_users(): |
149 | | - for user in User.get_all_users_not_paginated(): |
150 | | - # We specifically want to remove users that have deleted their OSM accounts. |
151 | | - if OSMService.is_osm_user_gone(user.id): |
152 | | - data = UserService.delete_user_by_id( |
153 | | - user.id, token_auth.current_user() |
154 | | - ).to_primitive() |
155 | | - yield f"\u001e{data}\n" |
156 | | - |
157 | 148 | return Response( |
158 | | - stream_with_context(delete_users()), |
| 149 | + stream_with_context(UsersAllAPI._delete_users()), |
159 | 150 | headers={"Content-Type": "application/json-seq"}, |
160 | 151 | ) |
| 152 | + return "Unauthorized", 401 |
| 153 | + |
| 154 | + @staticmethod |
| 155 | + def _delete_users() -> Generator[str, None, None]: |
| 156 | + # Updated daily |
| 157 | + deleted_users = OSMService.get_deleted_users() |
| 158 | + if deleted_users: |
| 159 | + last_deleted_user = 0 |
| 160 | + for user in User.get_all_users_not_paginated(User.id): |
| 161 | + while last_deleted_user < user.id: |
| 162 | + last_deleted_user = next(deleted_users) |
| 163 | + if last_deleted_user == user.id: |
| 164 | + data = UserService.delete_user_by_id( |
| 165 | + user.id, token_auth.current_user() |
| 166 | + ).to_primitive() |
| 167 | + yield f"\u001e{data}\n" |
| 168 | + return |
| 169 | + # Fall back to hitting the API (if the OSM API is not the default) |
| 170 | + for user in User.get_all_users_not_paginated(): |
| 171 | + # We specifically want to remove users that have deleted their OSM accounts. |
| 172 | + if OSMService.is_osm_user_gone(user.id): |
| 173 | + data = UserService.delete_user_by_id( |
| 174 | + user.id, token_auth.current_user() |
| 175 | + ).to_primitive() |
| 176 | + yield f"\u001e{data}\n" |
161 | 177 |
|
162 | 178 |
|
163 | 179 | class UsersQueriesUsernameAPI(Resource): |
|
0 commit comments