|
7 | 7 | # -----------------------------------------------------------------------------
|
8 | 8 |
|
9 | 9 | import re
|
| 10 | +from json import dumps |
| 11 | +import warnings |
10 | 12 |
|
11 | 13 | from tornado.web import authenticated, HTTPError
|
12 | 14 | from wtforms import Form, StringField, BooleanField, validators
|
13 | 15 | from wtforms.validators import ValidationError
|
14 | 16 |
|
15 | 17 | from qiita_pet.handlers.base_handlers import BaseHandler
|
16 | 18 | from qiita_pet.handlers.api_proxy import user_jobs_get_req
|
| 19 | +from qiita_pet.handlers.portal import PortalEditBase |
| 20 | +import qiita_db as qdb |
17 | 21 | from qiita_db.util import send_email
|
18 | 22 | from qiita_db.user import User
|
19 | 23 | from qiita_db.logger import LogEntry
|
@@ -375,3 +379,72 @@ class UserJobs(BaseHandler):
|
375 | 379 | def get(self):
|
376 | 380 | response = user_jobs_get_req(self.current_user)
|
377 | 381 | self.write(response)
|
| 382 | + |
| 383 | + |
| 384 | +class PurgeUsersAJAXHandler(PortalEditBase): |
| 385 | + # define columns besides email that will be displayed on website |
| 386 | + FIELDS = ['name', 'affiliation', 'address', 'phone', |
| 387 | + 'creation_timestamp'] |
| 388 | + @authenticated |
| 389 | + @execute_as_transaction |
| 390 | + def get(self): |
| 391 | + # retrieving users not yet verified |
| 392 | + self.check_admin() |
| 393 | + with qdb.sql_connection.TRN: |
| 394 | + sql = """SELECT email,{0} |
| 395 | + FROM qiita.qiita_user |
| 396 | + WHERE (user_level_id=5) AND |
| 397 | + (creation_timestamp < (NOW() - INTERVAL '30 DAY')) |
| 398 | + """.format(','.join(self.FIELDS)) |
| 399 | + qdb.sql_connection.TRN.add(sql) |
| 400 | + users = qdb.sql_connection.TRN.execute()[1:] |
| 401 | + |
| 402 | + # fetching information for each user |
| 403 | + result = [] |
| 404 | + for list in users: |
| 405 | + for user in list: |
| 406 | + usermail = user[0] |
| 407 | + user_unit = {'email': usermail} |
| 408 | + user_infos = User(usermail).info |
| 409 | + for col in self.FIELDS: |
| 410 | + user_unit[col] = str(user_infos[col]) |
| 411 | + result.append(user_unit) |
| 412 | + # returning information as JSON |
| 413 | + self.write(dumps(result, separators=(',', ':'))) |
| 414 | + |
| 415 | + |
| 416 | +class PurgeUsersHandler(PortalEditBase): |
| 417 | + @authenticated |
| 418 | + @execute_as_transaction |
| 419 | + def get(self): |
| 420 | + # render page and transfer headers to be included for the table |
| 421 | + self.check_admin() |
| 422 | + self.render('admin_purge_users.html', |
| 423 | + headers=['email'] + PurgeUsersAJAXHandler.FIELDS, |
| 424 | + submit_url="/admin/purge_users/") |
| 425 | + |
| 426 | + def post(self): |
| 427 | + # check if logged in user is admin and fetch all checked boxes as well |
| 428 | + # as the action |
| 429 | + self.check_admin() |
| 430 | + users = map(str, self.get_arguments('selected')) |
| 431 | + action = self.get_argument('action') |
| 432 | + |
| 433 | + # depending on the action delete user from db (remove) |
| 434 | + num_deleted_user = 0 |
| 435 | + for user in users: |
| 436 | + try: |
| 437 | + with warnings.catch_warnings(record=True) as warns: |
| 438 | + if action == "Remove": |
| 439 | + user_to_delete = User(user) |
| 440 | + user_to_delete.delete(user) |
| 441 | + num_deleted_user += 1 |
| 442 | + else: |
| 443 | + raise HTTPError( |
| 444 | + 400, reason="Unknown action: %s" % action) |
| 445 | + except QiitaDBError as e: |
| 446 | + self.write(action.upper() + " ERROR:<br/>" + str(e)) |
| 447 | + return |
| 448 | + msg = '; '.join([str(w.message) for w in warns]) |
| 449 | + self.write(("%i non-validated user(s) successfully removed from " |
| 450 | + "database<br/>%s") % (num_deleted_user, msg)) |
0 commit comments