|
2 | 2 | Delete projects. |
3 | 3 | """ |
4 | 4 |
|
| 5 | +from firebase_admin import exceptions |
| 6 | + |
5 | 7 | from mapswipe_workers import auth |
6 | 8 | from mapswipe_workers.definitions import logger |
7 | 9 |
|
8 | 10 |
|
| 11 | +def chunks(data, size=250): |
| 12 | + """Yield successive n-sized chunks from list.""" |
| 13 | + for i in range(0, len(data), size): |
| 14 | + yield data[i : i + size] |
| 15 | + |
| 16 | + |
9 | 17 | def delete_project(project_ids: list) -> None: |
10 | 18 | """ |
11 | | - Deletes projects. |
12 | | -
|
13 | | - Deletes project, groups, tasks and results from Firebase and Postgres |
| 19 | + Deletes project, groups, tasks and results from Firebase and Postgres. |
14 | 20 | """ |
15 | 21 | for project_id in project_ids: |
16 | 22 | logger.info( |
17 | 23 | f"Delete project, groups, tasks and results of project: {project_id}" |
18 | 24 | ) |
19 | 25 |
|
20 | 26 | fb_db = auth.firebaseDB() |
21 | | - fb_db.reference(f"v2/results/{project_id}").delete() |
22 | | - fb_db.reference(f"v2/tasks/{project_id}").delete() |
| 27 | + |
| 28 | + ref = fb_db.reference(f"v2/results/{project_id}") |
| 29 | + try: |
| 30 | + ref.delete() |
| 31 | + except exceptions.InvalidArgumentError: |
| 32 | + # Data to write exceeds the maximum size that can be modified |
| 33 | + # with a single request. Delete chunks of data instead. |
| 34 | + childs = ref.get(shallow=True) |
| 35 | + for chunk in chunks(list(childs.keys())): |
| 36 | + ref.update({key: None for key in chunk}) |
| 37 | + ref.delete() |
| 38 | + |
| 39 | + ref = fb_db.reference(f"v2/tasks/{project_id}") |
| 40 | + try: |
| 41 | + ref.delete() |
| 42 | + except exceptions.InvalidArgumentError: |
| 43 | + # Data to write exceeds the maximum size that can be modified |
| 44 | + # with a single request. Delete chunks of data instead. |
| 45 | + childs = ref.get(shallow=True) |
| 46 | + for chunk in chunks(list(childs.keys())): |
| 47 | + ref.update({key: None for key in chunk}) |
| 48 | + ref.delete() |
| 49 | + |
23 | 50 | fb_db.reference(f"v2/groups/{project_id}").delete() |
24 | 51 | fb_db.reference(f"v2/projects/{project_id}").delete() |
25 | 52 |
|
|
0 commit comments