Skip to content

Commit 0979712

Browse files
Merge pull request #3173 from antgonza/delete-user
add method to delete user
2 parents 3bdfb81 + dd333c5 commit 0979712

File tree

2 files changed

+99
-0
lines changed

2 files changed

+99
-0
lines changed

qiita_db/test/test_user.py

+17
Original file line numberDiff line numberDiff line change
@@ -510,5 +510,22 @@ def test_update_email(self):
510510
user.update_email('bla@ble.bli')
511511

512512

513+
@qiita_test_checker()
514+
class DeleteUser(TestCase):
515+
def test_delete_users(self):
516+
# let's start with the errors
517+
error = 'This email does not exist: x@y.z'
518+
with self.assertRaisesRegex(IncorrectEmailError, error):
519+
qdb.user.User.delete('x@y.z')
520+
521+
with self.assertRaises(ValueError):
522+
qdb.user.User.delete('shared@foo.bar')
523+
524+
qdb.user.User.delete('shared@foo.bar', True)
525+
# verify that the user doesn't exist any more
526+
with self.assertRaises(qdb.exceptions.QiitaDBUnknownIDError):
527+
qdb.user.User('shared@foo.bar')
528+
529+
513530
if __name__ == "__main__":
514531
main()

qiita_db/user.py

+82
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,88 @@ def verify_code(cls, email, code, code_type):
330330

331331
return correct_code
332332

333+
@classmethod
334+
def delete(cls, email, force=False):
335+
if not cls.exists(email):
336+
raise IncorrectEmailError(f'This email does not exist: {email}')
337+
338+
tables = ['qiita.study_users', 'qiita.study_tags',
339+
'qiita.processing_job_workflow', 'qiita.processing_job',
340+
'qiita.message_user', 'qiita.analysis_users',
341+
'qiita.analysis']
342+
343+
not_empty = []
344+
for t in tables:
345+
with qdb.sql_connection.TRN:
346+
sql = f"SELECT COUNT(email) FROM {t} WHERE email = %s"
347+
qdb.sql_connection.TRN.add(sql, [email])
348+
count = qdb.sql_connection.TRN.execute_fetchflatten()[0]
349+
if count != 0:
350+
not_empty.append(t)
351+
352+
if not_empty and not force:
353+
raise ValueError(f'These tables are not empty: "{not_empty}", '
354+
'delete them first or use `force=True`')
355+
356+
sql = """
357+
DELETE FROM qiita.study_users WHERE email = %(email)s;
358+
DELETE FROM qiita.study_tags WHERE email = %(email)s;
359+
DELETE FROM qiita.processing_job_workflow_root
360+
WHERE processing_job_workflow_id IN (
361+
SELECT processing_job_workflow_id
362+
FROM qiita.processing_job_workflow
363+
WHERE email = %(email)s);
364+
DELETE FROM qiita.processing_job_workflow WHERE email = %(email)s;
365+
DELETE FROM qiita.processing_job_validator
366+
WHERE processing_job_id IN (
367+
SELECT processing_job_id
368+
FROM qiita.processing_job
369+
WHERE email = %(email)s);
370+
DELETE FROM qiita.analysis_processing_job
371+
WHERE processing_job_id IN (
372+
SELECT processing_job_id
373+
FROM qiita.processing_job
374+
WHERE email = %(email)s);
375+
DELETE FROM qiita.artifact_output_processing_job
376+
WHERE processing_job_id IN (
377+
SELECT processing_job_id
378+
FROM qiita.processing_job
379+
WHERE email = %(email)s);
380+
DELETE FROM qiita.artifact_processing_job
381+
WHERE processing_job_id IN (
382+
SELECT processing_job_id
383+
FROM qiita.processing_job
384+
WHERE email = %(email)s);
385+
DELETE FROM qiita.parent_processing_job WHERE parent_id IN (
386+
SELECT processing_job_id
387+
FROM qiita.processing_job
388+
WHERE email = %(email)s);
389+
DELETE FROM qiita.processing_job WHERE email = %(email)s;
390+
DELETE FROM qiita.message_user WHERE email = %(email)s;
391+
DELETE FROM qiita.analysis_users WHERE email = %(email)s;
392+
DELETE FROM qiita.analysis_portal WHERE analysis_id IN (
393+
SELECT analysis_id
394+
FROM qiita.analysis
395+
WHERE email = %(email)s);
396+
DELETE FROM qiita.analysis_artifact WHERE analysis_id IN (
397+
SELECT analysis_id
398+
FROM qiita.analysis
399+
WHERE email = %(email)s);
400+
DELETE FROM qiita.analysis_filepath WHERE analysis_id IN (
401+
SELECT analysis_id
402+
FROM qiita.analysis
403+
WHERE email = %(email)s);
404+
DELETE FROM qiita.analysis_sample WHERE analysis_id IN (
405+
SELECT analysis_id
406+
FROM qiita.analysis
407+
WHERE email = %(email)s);
408+
DELETE FROM qiita.analysis WHERE email = %(email)s;
409+
DELETE FROM qiita.qiita_user WHERE email = %(email)s;"""
410+
411+
with qdb.sql_connection.TRN:
412+
qdb.sql_connection.TRN.add(sql, {'email': email})
413+
qdb.sql_connection.TRN.execute()
414+
333415
# ---properties---
334416
@property
335417
def email(self):

0 commit comments

Comments
 (0)