Skip to content

Commit 7307b53

Browse files
authored
Merge pull request #352 from mapswipe/dev
add script to delete remaining old groups
2 parents a6890c8 + 4569849 commit 7307b53

File tree

1 file changed

+94
-0
lines changed

1 file changed

+94
-0
lines changed
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
from mapswipe_workers import auth
2+
from mapswipe_workers.definitions import logger, CustomError
3+
from typing import Iterable
4+
import re
5+
from firebase_admin import exceptions
6+
7+
8+
def chunks(data: list, size: int = 250) -> Iterable[list]:
9+
"""Yield successive n-sized chunks from list."""
10+
for i in range(0, len(data), size):
11+
yield data[i : i + size] # noqa E203
12+
13+
14+
def get_old_groups():
15+
"""
16+
Get all projects from Firebase which have been created
17+
before we switched to v2.
18+
"""
19+
fb_db = auth.firebaseDB()
20+
ref = fb_db.reference("groups")
21+
projects = ref.get(shallow=True)
22+
logger.info("got old projects from firebase")
23+
return projects
24+
25+
26+
def move_project_data_to_v2(project_id):
27+
"""
28+
Copy project information from old path to v2/projects in Firebase.
29+
Add status=archived attribute.
30+
Use Firebase transaction function for this.
31+
"""
32+
33+
# Firebase transaction function
34+
def transfer(current_data):
35+
# we need to add these attributes
36+
# since they are expected for version 2
37+
current_data["status"] = "archived"
38+
current_data["projectType"] = 1
39+
current_data["projectId"] = str(project_id)
40+
current_data["progress"] = current_data.get("progress", 0)
41+
current_data["name"] = current_data.get("name", "unknown")
42+
fb_db.reference("v2/projects/{0}".format(project_id)).set(current_data)
43+
return dict()
44+
45+
fb_db = auth.firebaseDB()
46+
projects_ref = fb_db.reference(f"projects/{project_id}")
47+
try:
48+
projects_ref.transaction(transfer)
49+
logger.info(f"{project_id}: Transfered project to v2 and delete in old path")
50+
return True
51+
except fb_db.TransactionAbortedError:
52+
logger.exception(
53+
f"{project_id}: Firebase transaction"
54+
f"for transferring project failed to commit"
55+
)
56+
return False
57+
58+
59+
def delete_old_groups(project_id):
60+
"""
61+
Delete old groups for a project
62+
"""
63+
fb_db = auth.firebaseDB()
64+
ref = fb_db.reference(f"/groups/{project_id}")
65+
if not re.match(r"/\w+/[-a-zA-Z0-9]+", ref.path):
66+
raise CustomError(
67+
f"""Given argument resulted in invalid Firebase Realtime Database reference.
68+
{ref.path}"""
69+
)
70+
try:
71+
ref.delete()
72+
except exceptions.InvalidArgumentError:
73+
# Data to write exceeds the maximum size that can be modified
74+
# with a single request. Delete chunks of data instead.
75+
childs = ref.get(shallow=True)
76+
for chunk in chunks(list(childs.keys())):
77+
ref.update({key: None for key in chunk})
78+
ref.delete()
79+
80+
81+
def run_delete_old_groups():
82+
"""
83+
Run workflow to delete old groups.
84+
First get all old project ids from remaining groups.
85+
Then delete all groups for the given project_ids.
86+
"""
87+
88+
projects = get_old_groups()
89+
for project_id in projects:
90+
delete_old_groups(project_id)
91+
logger.info(f"{project_id}: deleted old groups")
92+
93+
94+
run_delete_old_groups()

0 commit comments

Comments
 (0)