|
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