Source code for hepdata.modules.dashboard.views

# This file is part of HEPData.
# Copyright (C) 2016 CERN.
#
# HEPData is free software; you can redistribute it
# and/or modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
#
# HEPData is distributed in the hope that it will be
# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with HEPData; if not, write to the
# Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
# MA 02111-1307, USA.
#
# In applying this license, CERN does not
# waive the privileges and immunities granted to it by virtue of its status
# as an Intergovernmental Organization or submit itself to any jurisdiction.

"""HEPData Dashboard Views."""

from flask import Blueprint, jsonify, request, render_template
from flask_login import login_required, current_user

from hepdata.ext.elasticsearch.admin_view.api import AdminIndexer
from hepdata.ext.elasticsearch.api import reindex_all
from hepdata.ext.elasticsearch.api import push_data_keywords
from hepdata.modules.dashboard.api import prepare_submissions, get_pending_invitations_for_user, get_submission_count, list_submission_titles
from hepdata.modules.permissions.api import get_pending_request, get_pending_coordinator_requests
from hepdata.modules.permissions.views import check_is_sandbox_record
from hepdata.modules.records.utils.submission import unload_submission, do_finalise
from hepdata.modules.submission.api import get_latest_hepsubmission
from hepdata.modules.records.utils.users import has_role
from hepdata.modules.records.utils.common import get_record_by_id
from hepdata.modules.records.utils.workflow import update_record
from hepdata.modules.inspire_api.views import get_inspire_record_information
from hepdata.utils.url import modify_query
import json
import math

from invenio_userprofiles import current_userprofile

blueprint = Blueprint('hep_dashboard', __name__, url_prefix="/dashboard",
                      template_folder='templates',
                      static_folder='static')


[docs]@blueprint.route('/') @login_required def dashboard(): """ Depending on the user that is logged in, they will get a dashboard that reflects the current status of all submissions of which they are a participant. """ user_profile = current_userprofile.query.filter_by(user_id=current_user.get_id()).first() ctx = {'user_is_admin': has_role(current_user, 'admin'), 'user_profile': user_profile, 'user_has_coordinator_request': get_pending_request(), 'pending_coordinator_requests': get_pending_coordinator_requests(), 'pending_invites': get_pending_invitations_for_user(current_user)} return render_template('hepdata_dashboard/dashboard.html', ctx=ctx)
[docs]@blueprint.route('/dashboard-submissions') @login_required def dashboard_submissions(): filter_record_id = request.args.get('record_id') current_page = request.args.get('page', default=1, type=int) size = request.args.get('size', 25) submissions = prepare_submissions( current_user, items_per_page=size, current_page=current_page, record_id=filter_record_id ) submission_meta = [] submission_stats = [] for record_id in submissions: stats = [] for key in submissions[record_id]["stats"].keys(): stats.append( {"name": key, "count": submissions[record_id]["stats"][key]}) submission_stats.append({"recid": record_id, "stats": stats}) review_flag = "todo" if submissions[record_id]["stats"]["attention"] == 0 and \ submissions[record_id]["stats"]["todo"] == 0 and \ submissions[record_id]["stats"]["passed"] == 0: review_flag = "todo" elif submissions[record_id]["stats"]["attention"] > 0 or \ submissions[record_id]["stats"]["todo"] > 0: review_flag = "attention" elif submissions[record_id]["stats"]["attention"] == 0 and \ submissions[record_id]["stats"]["todo"] == 0: review_flag = "passed" if submissions[record_id]["status"] == 'finished': review_flag = "finished" submissions[record_id]["metadata"]["submission_status"] = \ submissions[record_id]["status"] submissions[record_id]["metadata"]["review_flag"] = review_flag submission_meta.append(submissions[record_id]["metadata"]) total_records = get_submission_count(current_user) total_pages = int(math.ceil(total_records / size)) ctx = { 'user_is_admin': has_role(current_user, 'admin'), 'modify_query': modify_query, 'submissions': submission_meta, 'submission_stats': submission_stats } if filter_record_id is None: ctx['pages'] = { 'total': total_pages, 'current': current_page, 'endpoint': '.dashboard' } return render_template('hepdata_dashboard/dashboard-submissions.html', ctx=ctx)
[docs]@blueprint.route('/dashboard-submission-titles') @login_required def dashboard_submission_titles(): return jsonify(list_submission_titles(current_user))
[docs]@blueprint.route('/delete/<int:recid>') @login_required def delete_submission(recid): """ Submissions can only be removed if they are not finalised, meaning they should never be in the index. Only delete the latest version of a submission. Delete indexed information only if version = 1. :param recid: :return: """ if has_role(current_user, 'admin') or has_role(current_user, 'coordinator') \ or check_is_sandbox_record(recid): submission = get_latest_hepsubmission(publication_recid=recid) unload_submission(recid, submission.version) if submission.version == 1: admin_idx = AdminIndexer() admin_idx.find_and_delete('recid', recid) return json.dumps({"success": True, "recid": recid, "errors": [ "Record successfully removed!"]}) else: return json.dumps( {"success": False, "recid": recid, "errors": [ "You do not have permission to delete this submission. " "Only coordinators can do that."]})
[docs]@blueprint.route('/manage/reindex/', methods=['POST']) @login_required def reindex(): if has_role(current_user, 'admin'): reindex_all(recreate=True) push_data_keywords() admin_idx = AdminIndexer() admin_idx.reindex(recreate=True) return jsonify({"success": True}) else: return jsonify({"success": False, 'message': "You don't have sufficient privileges to " "perform this action."})
[docs]@blueprint.route('/finalise/<int:recid>', methods=['POST']) @login_required def finalise(recid, publication_record=None, force_finalise=False): commit_message = request.form.get('message') # Update publication information from INSPIRE record before finalising. if not publication_record: record = get_record_by_id(recid) content, status = get_inspire_record_information(record['inspire_id']) if status == 'success': publication_record = update_record(recid, content) return do_finalise(recid, publication_record=publication_record, force_finalise=force_finalise, commit_message=commit_message, send_tweet=True)
[docs]@blueprint.route('/submissions/', methods=['GET']) @login_required def submissions(): from flask import abort if has_role(current_user, 'admin'): user_profile = current_userprofile.query.filter_by(user_id=current_user.get_id()).first() ctx = {'user_is_admin': True, 'user_profile': user_profile} return render_template('hepdata_dashboard/submissions.html', ctx=ctx) else: abort(403)
[docs]@blueprint.route('/submissions/list', methods=['GET']) @login_required def submissions_list(): admin_idx = AdminIndexer() summary = admin_idx.get_summary() return jsonify(summary)