Skip to content

Commit 93fbd89

Browse files
committed
Merge pull request #1175 from antgonza/delete-analysis
Delete analysis
2 parents 2d71d7d + 7e22a62 commit 93fbd89

File tree

4 files changed

+158
-5
lines changed

4 files changed

+158
-5
lines changed

qiita_db/analysis.py

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
from .base import QiitaStatusObject
3333
from .data import ProcessedData
3434
from .study import Study
35-
from .exceptions import QiitaDBStatusError, QiitaDBError
35+
from .exceptions import QiitaDBStatusError, QiitaDBError, QiitaDBUnknownIDError
3636
from .util import (convert_to_id, get_work_base_dir,
3737
get_mountpoint, insert_filepaths)
3838

@@ -66,9 +66,13 @@ class Analysis(QiitaStatusObject):
6666
unshare
6767
build_files
6868
summary_data
69+
exists
70+
create
71+
delete
6972
"""
7073

7174
_table = "analysis"
75+
_analysis_id_column = 'analysis_id'
7276

7377
def _lock_check(self, conn_handler):
7478
"""Raises QiitaDBStatusError if analysis is not in_progress"""
@@ -165,6 +169,73 @@ def create(cls, owner, name, description, parent=None, from_default=False):
165169
a_id = conn_handler.execute_queue(queue)[0]
166170
return cls(a_id)
167171

172+
@classmethod
173+
def delete(cls, _id):
174+
"""Deletes an analysis
175+
176+
Parameters
177+
----------
178+
_id : int
179+
The analysis id
180+
181+
Raises
182+
------
183+
QiitaDBUnknownIDError
184+
If the analysis id doesn't exist
185+
"""
186+
# check if the analysis exist
187+
if not cls.exists(_id):
188+
raise QiitaDBUnknownIDError(_id, "analysis")
189+
190+
queue = "delete_analysis_%d" % _id
191+
conn_handler = SQLConnectionHandler()
192+
conn_handler.create_queue(queue)
193+
194+
sql = ("DELETE FROM qiita.analysis_filepath WHERE "
195+
"{0} = {1}".format(cls._analysis_id_column, _id))
196+
conn_handler.add_to_queue(queue, sql)
197+
198+
sql = ("DELETE FROM qiita.analysis_workflow WHERE "
199+
"{0} = {1}".format(cls._analysis_id_column, _id))
200+
conn_handler.add_to_queue(queue, sql)
201+
202+
sql = ("DELETE FROM qiita.analysis_sample WHERE "
203+
"{0} = {1}".format(cls._analysis_id_column, _id))
204+
conn_handler.add_to_queue(queue, sql)
205+
206+
sql = ("DELETE FROM qiita.collection_analysis WHERE "
207+
"{0} = {1}".format(cls._analysis_id_column, _id))
208+
conn_handler.add_to_queue(queue, sql)
209+
210+
# TODO: issue #1176
211+
212+
sql = ("DELETE FROM qiita.{0} WHERE "
213+
"{1} = {2}".format(cls._table, cls._analysis_id_column, _id))
214+
conn_handler.add_to_queue(queue, sql)
215+
216+
conn_handler.execute_queue(queue)
217+
218+
@classmethod
219+
def exists(cls, analysis_id):
220+
r"""Checks if the given analysis _id exists
221+
222+
Parameters
223+
----------
224+
analysis_id : int
225+
The id of the analysis we are searching for
226+
227+
Returns
228+
-------
229+
bool
230+
True if exists, false otherwise.
231+
"""
232+
conn_handler = SQLConnectionHandler()
233+
234+
return conn_handler.execute_fetchone(
235+
"SELECT EXISTS(SELECT * FROM qiita.{0} WHERE "
236+
"{1}=%s)".format(cls._table, cls._analysis_id_column),
237+
(analysis_id, ))[0]
238+
168239
# ---- Properties ----
169240
@property
170241
def owner(self):

qiita_db/test/test_analysis.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
from qiita_db.analysis import Analysis, Collection
1313
from qiita_db.job import Job
1414
from qiita_db.user import User
15-
from qiita_db.exceptions import QiitaDBStatusError, QiitaDBError
15+
from qiita_db.exceptions import (QiitaDBStatusError, QiitaDBError,
16+
QiitaDBUnknownIDError)
1617
from qiita_db.util import get_mountpoint, get_count
1718
from qiita_db.study import Study, StudyPerson
1819
from qiita_db.data import ProcessedData
@@ -145,6 +146,21 @@ def test_create_from_default(self):
145146
[new_id, 1, '1.SKM4.640180']]
146147
self.assertEqual(obs, exp)
147148

149+
def test_exists(self):
150+
self.assertTrue(Analysis.exists(1))
151+
new_id = get_count("qiita.analysis") + 1
152+
self.assertFalse(Analysis.exists(new_id))
153+
154+
def test_delete(self):
155+
# successful delete
156+
total_analyses = get_count("qiita.analysis")
157+
Analysis.delete(1)
158+
self.assertEqual(total_analyses - 1, get_count("qiita.analysis"))
159+
160+
# no possible to delete
161+
with self.assertRaises(QiitaDBUnknownIDError):
162+
Analysis.delete(total_analyses + 1)
163+
148164
def test_retrieve_owner(self):
149165
self.assertEqual(self.analysis.owner, "test@foo.bar")
150166

qiita_pet/handlers/analysis_handlers.py

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
filepath_ids_to_rel_paths)
3232
from qiita_db.exceptions import QiitaDBUnknownIDError
3333
from qiita_db.study import Study
34+
from qiita_db.logger import LogEntry
3435

3536
SELECT_SAMPLES = 2
3637
SELECT_COMMANDS = 3
@@ -153,21 +154,54 @@ def get(self, analysis_id):
153154
dropped[data_type].append((Study(study).title, len(samples),
154155
', '.join(samples)))
155156

156-
self.render("analysis_results.html",
157+
self.render("analysis_results.html", analysis_id=analysis_id,
157158
jobres=jobres, aname=analysis.name, dropped=dropped,
158159
basefolder=get_db_files_base_dir())
159160

161+
@authenticated
162+
def post(self, analysis_id):
163+
analysis_id = int(analysis_id.split("/")[0])
164+
analysis_id_sent = int(self.get_argument('analysis_id'))
165+
action = self.get_argument('action')
166+
167+
if analysis_id != analysis_id_sent or action != 'delete_analysis':
168+
raise QiitaPetAuthorizationError(
169+
self.current_user.id,
170+
'analysis/results/%d-delete' % analysis_id)
171+
172+
analysis = Analysis(analysis_id)
173+
analysis_name = analysis.name
174+
check_analysis_access(self.current_user, analysis)
175+
176+
try:
177+
Analysis.delete(analysis_id)
178+
msg = ("Analysis <b><i>%s</i></b> has been deleted." % (
179+
analysis_name))
180+
level = "success"
181+
except Exception as e:
182+
e = str(e)
183+
msg = ("Couldn't remove <b><i>%s</i></b> analysis: %s" % (
184+
analysis_name, e))
185+
level = "danger"
186+
LogEntry.create('Runtime', "Couldn't remove analysis ID %d: %s" %
187+
(analysis_id, e))
188+
189+
self.redirect(u"/analysis/show/?level=%s&message=%s" % (level, msg))
190+
160191

161192
class ShowAnalysesHandler(BaseHandler):
162193
"""Shows the user's analyses"""
163194
@authenticated
164195
def get(self):
196+
message = self.get_argument('message', '')
197+
level = self.get_argument('level', '')
165198
user = self.current_user
166199

167200
analyses = [Analysis(a) for a in
168201
user.shared_analyses | user.private_analyses]
169202

170-
self.render("show_analyses.html", analyses=analyses)
203+
self.render("show_analyses.html", analyses=analyses, message=message,
204+
level=level)
171205

172206

173207
class ResultsHandler(StaticFileHandler, BaseHandler):

qiita_pet/templates/analysis_results.html

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,16 @@
1111

1212

1313
<div class="row">
14-
<h1>&nbsp;Analysis: <u>{{aname}}</u></h1>
14+
<table border="0">
15+
<tr>
16+
<td><h1>&nbsp;Analysis: <u>{{aname}}</u></h1></td>
17+
<td width="20px"></td>
18+
<td>
19+
<h1><a class="btn btn-danger glyphicon glyphicon-trash" onclick="delete_analysis();"></a></h1>
20+
</td>
21+
</tr>
22+
</table>
23+
</h1>
1524
</div>
1625

1726

@@ -74,4 +83,27 @@ <h3 style="color:red">ERROR</h3>
7483
<iframe id="resframe" name="resframe" width="100%" height="900" frameBorder=0></iframe>
7584
</div>
7685
</div>
86+
87+
88+
<script>
89+
90+
function delete_analysis() {
91+
if (confirm('Are you sure you want to delete analysis: {{aname}}?')) {
92+
var form = $("<form>")
93+
.attr("action", window.location.href)
94+
.attr("method", "post")
95+
.append($("<input>")
96+
.attr("type", "hidden")
97+
.attr("name", "analysis_id")
98+
.attr("value", {{analysis_id}}))
99+
.append($("<input>")
100+
.attr("type", "hidden")
101+
.attr("name", "action")
102+
.attr("value", "delete_analysis"));
103+
$("body").append(form);
104+
form.submit();
105+
}
106+
}
107+
108+
</script>
77109
{%end%}

0 commit comments

Comments
 (0)