Skip to content

Commit 1f6c6b6

Browse files
author
matthias_schaub
committed
Add feature to delete a project with all associated data.
1 parent 461f13e commit 1f6c6b6

File tree

3 files changed

+222
-1
lines changed

3 files changed

+222
-1
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
"""
2+
Delete projects.
3+
"""
4+
5+
from mapswipe_workers import auth
6+
from mapswipe_workers.definitions import logger
7+
8+
9+
def delete_project(project_ids: list) -> None:
10+
"""
11+
Deletes projects.
12+
13+
Deletes project, groups, tasks and results from Firebase and Postgres
14+
"""
15+
for project_id in project_ids:
16+
logger.info(
17+
f"Delete project, groups, tasks and results of project: {project_id}"
18+
)
19+
20+
fb_db = auth.firebaseDB()
21+
fb_db.reference(f"v2/results/{project_id}").delete()
22+
fb_db.reference(f"v2/tasks/{project_id}").delete()
23+
fb_db.reference(f"v2/groups/{project_id}").delete()
24+
fb_db.reference(f"v2/projects/{project_id}").delete()
25+
26+
pg_db = auth.postgresDB()
27+
sql_query = "DELETE FROM results WHERE project_id = {};".format(project_id)
28+
pg_db.query(sql_query, project_id)
29+
sql_query = "DELETE FROM tasks WHERE project_id = {};".format(project_id)
30+
pg_db.query(sql_query, project_id)
31+
sql_query = "DELETE FROM groups WHERE project_id = {};".format(project_id)
32+
pg_db.query(sql_query, project_id)
33+
sql_query = "DELETE FROM projects WHERE project_id = {};".format(project_id)
34+
pg_db.query(sql_query, project_id)

mapswipe_workers/mapswipe_workers/mapswipe_workers.py

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,13 +198,54 @@ def run_create_tutorial(input_file) -> None:
198198
)
199199
def run_archive_project(project_id, project_ids):
200200
"""Archive projects in Postgres. Delete groups, tasks and results from Firebase."""
201-
if not project_ids:
201+
if not project_ids and not project_id:
202+
click.echo("Missing argument")
203+
return None
204+
elif not project_ids:
202205
project_ids = [project_id]
203206
update_data.update_project_data(project_ids)
204207
transfer_results.transfer_results(project_ids)
205208
archive_project.archive_project(project_ids)
206209

207210

211+
@cli.command("delete")
212+
@click.option(
213+
"--project-id", "-i", help=("Delete project with giving project id"), type=str,
214+
)
215+
@click.option(
216+
"--project-ids",
217+
cls=PythonLiteralOption,
218+
default="[]",
219+
help=(
220+
f"Delete multiple projects. "
221+
f"Provide project id strings as a list: "
222+
f"""["project_a", "project_b"]"""
223+
),
224+
)
225+
def run_delete_project(project_id, project_ids):
226+
"""Delete tasks, groups, project and results."""
227+
if not project_ids and not project_id:
228+
click.echo("Missing argument")
229+
return None
230+
elif not project_ids:
231+
project_ids = [project_id]
232+
233+
click.echo("Projects and all associated data including results with following project ids will be deleted permantly:")
234+
for project_id in project_ids:
235+
click.echo(project_id)
236+
click.echo()
237+
click.echo('Continue with deletion? [yn] ', nl=False)
238+
click.echo()
239+
c = click.getchar()
240+
241+
if c == 'y':
242+
delete_project.delete_project()
243+
elif c == 'n':
244+
click.echo('Abort!')
245+
else:
246+
click.echo('Invalid input')
247+
248+
208249
@cli.command("run")
209250
@click.option("--schedule", is_flag=True, help="Schedule jobs to run every 10 minutes.")
210251
@click.pass_context
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
import unittest
2+
3+
import set_up
4+
import tear_down
5+
from mapswipe_workers import auth
6+
from mapswipe_workers.firebase_to_postgres import delete_project
7+
8+
9+
class TestDeleteProject(unittest.TestCase):
10+
def setUp(self):
11+
self.project_id = set_up.create_test_project("build_area")
12+
13+
def tearDown(self):
14+
tear_down.delete_test_project(self.project_id)
15+
16+
def test_deletion(self):
17+
"""Test if tasks, groups, project and results are deleted."""
18+
delete_project.delete_project([self.project_id])
19+
20+
fb_db = auth.firebaseDB()
21+
ref = fb_db.reference("v2/results/{0}".format(self.project_id))
22+
self.assertIsNone(ref.get())
23+
ref = fb_db.reference("v2/tasks/{0}".format(self.project_id))
24+
self.assertIsNone(ref.get())
25+
ref = fb_db.reference("v2/groups/{0}".format(self.project_id))
26+
self.assertIsNone(ref.get())
27+
ref = fb_db.reference("v2/projects/{0}".format(self.project_id))
28+
self.assertIsNone(ref.get())
29+
30+
pg_db = auth.postgresDB()
31+
sql_query = "SELECT * FROM tasks WHERE project_id = {}".format(self.project_id)
32+
result = pg_db.retr_query(sql_query)
33+
self.assertIsNone(result)
34+
sql_query = "SELECT * FROM groups WHERE project_id = {}".format(self.project_id)
35+
result = pg_db.retr_query(sql_query)
36+
self.assertIsNone(result)
37+
sql_query = "SELECT * FROM projects WHERE project_id = {}".format(
38+
self.project_id
39+
)
40+
result = pg_db.retr_query(sql_query)
41+
self.assertIsNone(result)
42+
sql_query = "SELECT * FROM results WHERE project_id = {}".format(
43+
self.project_id
44+
)
45+
result = pg_db.retr_query(sql_query)
46+
self.assertIsNone(result)
47+
48+
def test_project_id_equals_none(self):
49+
"""Test for project id equals None."""
50+
delete_project.delete_project([None])
51+
52+
fb_db = auth.firebaseDB()
53+
ref = fb_db.reference("v2/results/{0}".format(self.project_id))
54+
self.assertIsNotNone(ref.get())
55+
ref = fb_db.reference("v2/tasks/{0}".format(self.project_id))
56+
self.assertIsNotNone(ref.get())
57+
ref = fb_db.reference("v2/groups/{0}".format(self.project_id))
58+
self.assertIsNotNone(ref.get())
59+
ref = fb_db.reference("v2/projects/{0}".format(self.project_id))
60+
self.assertIsNotNone(ref.get())
61+
62+
pg_db = auth.postgresDB()
63+
sql_query = "SELECT * FROM tasks WHERE project_id = {}".format(self.project_id)
64+
result = pg_db.retr_query(sql_query)
65+
self.assertIsNotNone(result)
66+
sql_query = "SELECT * FROM groups WHERE project_id = {}".format(self.project_id)
67+
result = pg_db.retr_query(sql_query)
68+
self.assertIsNotNone(result)
69+
sql_query = "SELECT * FROM projects WHERE project_id = {}".format(
70+
self.project_id
71+
)
72+
result = pg_db.retr_query(sql_query)
73+
self.assertIsNotNone(result)
74+
sql_query = "SELECT * FROM results WHERE project_id = {}".format(
75+
self.project_id
76+
)
77+
result = pg_db.retr_query(sql_query)
78+
self.assertIsNotNone(result)
79+
80+
def test_project_id_equals_empty_str(self):
81+
"""Test for poject id equals empty string."""
82+
delete_project.delete_project([""])
83+
84+
fb_db = auth.firebaseDB()
85+
ref = fb_db.reference("v2/results/{0}".format(self.project_id))
86+
self.assertIsNotNone(ref.get())
87+
ref = fb_db.reference("v2/tasks/{0}".format(self.project_id))
88+
self.assertIsNotNone(ref.get())
89+
ref = fb_db.reference("v2/groups/{0}".format(self.project_id))
90+
self.assertIsNotNone(ref.get())
91+
ref = fb_db.reference("v2/projects/{0}".format(self.project_id))
92+
self.assertIsNotNone(ref.get())
93+
94+
pg_db = auth.postgresDB()
95+
sql_query = "SELECT * FROM tasks WHERE project_id = {}".format(self.project_id)
96+
result = pg_db.retr_query(sql_query)
97+
self.assertIsNotNone(result)
98+
sql_query = "SELECT * FROM groups WHERE project_id = {}".format(self.project_id)
99+
result = pg_db.retr_query(sql_query)
100+
self.assertIsNotNone(result)
101+
sql_query = "SELECT * FROM projects WHERE project_id = {}".format(
102+
self.project_id
103+
)
104+
result = pg_db.retr_query(sql_query)
105+
self.assertIsNotNone(result)
106+
sql_query = "SELECT * FROM results WHERE project_id = {}".format(
107+
self.project_id
108+
)
109+
result = pg_db.retr_query(sql_query)
110+
self.assertIsNotNone(result)
111+
112+
def test_project_id_not_exists(self):
113+
"""Test for project id which does not exists."""
114+
delete_project.delete_project(["tuna"])
115+
116+
fb_db = auth.firebaseDB()
117+
ref = fb_db.reference("v2/results/{0}".format(self.project_id))
118+
self.assertIsNotNone(ref.get())
119+
ref = fb_db.reference("v2/tasks/{0}".format(self.project_id))
120+
self.assertIsNotNone(ref.get())
121+
ref = fb_db.reference("v2/groups/{0}".format(self.project_id))
122+
self.assertIsNotNone(ref.get())
123+
ref = fb_db.reference("v2/projects/{0}".format(self.project_id))
124+
self.assertIsNotNone(ref.get())
125+
126+
pg_db = auth.postgresDB()
127+
sql_query = "SELECT * FROM tasks WHERE project_id = {}".format(self.project_id)
128+
result = pg_db.retr_query(sql_query)
129+
self.assertIsNotNone(result)
130+
sql_query = "SELECT * FROM groups WHERE project_id = {}".format(self.project_id)
131+
result = pg_db.retr_query(sql_query)
132+
self.assertIsNotNone(result)
133+
sql_query = "SELECT * FROM projects WHERE project_id = {}".format(
134+
self.project_id
135+
)
136+
result = pg_db.retr_query(sql_query)
137+
self.assertIsNotNone(result)
138+
sql_query = "SELECT * FROM results WHERE project_id = {}".format(
139+
self.project_id
140+
)
141+
result = pg_db.retr_query(sql_query)
142+
self.assertIsNotNone(result)
143+
144+
145+
if __name__ == "__main__":
146+
unittest.main()

0 commit comments

Comments
 (0)