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."]})
def determine_user_privileges(recid, ctx): # show_review_area = not show_upload_area ctx['show_review_widget'] = False ctx['show_upload_widget'] = False ctx['is_submission_coordinator_or_admin'] = False ctx['is_admin'] = False if current_user.is_authenticated: user_id = current_user.get_id() participant_records = SubmissionParticipant.query.filter_by( user_account=user_id, publication_recid=recid).all() for participant_record in participant_records: if participant_record is not None: if participant_record.role == 'reviewer' and participant_record.status == 'primary': ctx['show_review_widget'] = True if participant_record.role == 'uploader' and participant_record.status == 'primary': ctx['show_upload_widget'] = True user = User.query.get(current_user.get_id()) if has_role(user, 'admin'): ctx['is_submission_coordinator_or_admin'] = True ctx['is_admin'] = True else: matching_records = HEPSubmission.query.filter_by( publication_recid=recid, coordinator=current_user.get_id()).count() if matching_records > 0: ctx['is_submission_coordinator_or_admin'] = True ctx['show_upload_widget'] = (ctx['show_upload_widget'] or ctx['is_submission_coordinator_or_admin'])
def determine_user_privileges(recid, ctx): # show_review_area = not show_upload_area ctx['show_review_widget'] = False ctx['show_upload_widget'] = False ctx['is_submission_coordinator_or_admin'] = False if current_user.is_authenticated: user_id = current_user.get_id() participant_records = SubmissionParticipant.query.filter_by( user_account=user_id, publication_recid=recid).all() for participant_record in participant_records: if participant_record is not None: if participant_record.role == 'reviewer': ctx['show_review_widget'] = True if participant_record.role == 'uploader': ctx['show_upload_widget'] = True user = User.query.get(current_user.get_id()) if has_role(user, 'admin'): ctx['is_submission_coordinator_or_admin'] = True else: matching_records = HEPSubmission.query.filter_by( publication_recid=recid, coordinator=current_user.get_id()).count() if matching_records > 0: ctx['is_submission_coordinator_or_admin'] = True ctx['show_upload_widget'] = ( ctx['show_upload_widget'] or ctx[ 'is_submission_coordinator_or_admin'])
def submissions(): 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} return render_template('hepdata_dashboard/submissions.html', ctx=ctx)
def has_coordinator_permissions(recid, user, is_sandbox=False): if has_role(user, 'admin'): return True coordinator_record = HEPSubmission.query.filter_by( publication_recid=recid, coordinator=user.get_id()).first() return coordinator_record is not None
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 part. """ submissions = prepare_submissions(current_user) 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"]) user_profile = current_userprofile.query.filter_by( user_id=current_user.get_id()).first() ctx = { 'user_is_admin': has_role(current_user, 'admin'), 'submissions': submission_meta, 'user_profile': user_profile, 'user_has_coordinator_request': get_pending_request(), 'pending_coordinator_requests': get_pending_coordinator_requests(), 'submission_stats': json.dumps(submission_stats), 'pending_invites': get_pending_invitations_for_user(current_user) } return render_template('hepdata_dashboard/dashboard.html', ctx=ctx)
def reindex(): if has_role(current_user, 'admin'): reindex_all(recreate=True) push_data_keywords() return jsonify({"success": True}) else: return jsonify({"success": False, 'message': "You don't have sufficient privileges to " "perform this action."})
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)
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."})
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 part. """ submissions = prepare_submissions(current_user) 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"]) user_profile = current_userprofile.query.filter_by(user_id=current_user.get_id()).first() ctx = {'user_is_admin': has_role(current_user, 'admin'), 'submissions': submission_meta, 'user_profile': user_profile, 'user_has_coordinator_request': get_pending_request(), 'pending_coordinator_requests': get_pending_coordinator_requests(), 'submission_stats': json.dumps(submission_stats), 'pending_invites': get_pending_invitations_for_user(current_user)} return render_template('hepdata_dashboard/dashboard.html', ctx=ctx)
def has_upload_permissions(recid, user, is_sandbox=False): if has_role(user, 'admin'): return True if is_sandbox: hepsubmission_record = get_latest_hepsubmission(publication_recid=recid, overall_status='sandbox') return hepsubmission_record is not None and hepsubmission_record.coordinator == user.id participant = SubmissionParticipant.query.filter_by(user_account=user.id, role='uploader', publication_recid=recid, status='primary').first() if participant: return True
def delete_submission(recid): """ Submissions can only be removed if they are not finalised, meaning they should never be in the index. :param recid: :return: """ if has_role(current_user, 'admin') or has_role(current_user, 'coordinator') \ or check_is_sandbox_record(recid): unload_submission(recid) admin_idx = AdminIndexer() admin_idx.reindex(recreate=True) 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."]})
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)
def _prepare_submission_query(current_user): query = HEPSubmission.query.filter( HEPSubmission.overall_status.in_(['processing', 'todo']), ) # if the user is a superadmin, show everything here. # The final rendering in the dashboard should be different # though considering the user him/herself is probably not a # reviewer/uploader if not has_role(current_user, 'admin'): # Not an admin user # We just want to pick out people with access to particular records, # i.e. submissions for which they are primary reviewers or coordinators. inner_query = SubmissionParticipant.query.filter_by( user_account=int(current_user.get_id()), status='primary').with_entities( SubmissionParticipant.publication_recid) query = query.filter( or_(HEPSubmission.coordinator == int(current_user.get_id()), HEPSubmission.publication_recid.in_(inner_query))) return query
def prepare_submissions(current_user): """ Finds all the relevant submissions for a user, or all submissions if the logged in user is a 'super admin'. :param current_user: User obj :return: OrderedDict of submissions """ submissions = OrderedDict() hepdata_submission_records = [] if has_role(current_user, 'admin'): # if the user is a superadmin, show everything here. # The final rendering in the dashboard should be different # though considering the user him/herself is probably not a # reviewer/uploader hepdata_submission_records = HEPSubmission.query.filter( and_(HEPSubmission.overall_status != 'finished', HEPSubmission.overall_status != 'sandbox')).order_by( HEPSubmission.created.desc()).all() else: # we just want to pick out people with access to particular records, # i.e. submissions for which they are primary reviewers. participant_records = SubmissionParticipant.query.filter_by( user_account=int(current_user.get_id()), status='primary').order_by(SubmissionParticipant.id.desc()).all() for participant_record in participant_records: hepdata_submission_records += HEPSubmission.query.filter( HEPSubmission.publication_recid == participant_record.publication_recid, and_(HEPSubmission.overall_status != 'finished', HEPSubmission.overall_status != 'sandbox')).order_by( HEPSubmission.created.desc()).all() coordinator_submissions = HEPSubmission.query.filter( HEPSubmission.coordinator == int(current_user.get_id()), and_(HEPSubmission.overall_status != 'finished', HEPSubmission.overall_status != 'sandbox')).order_by( HEPSubmission.created.desc()).all() hepdata_submission_records += coordinator_submissions for hepdata_submission in hepdata_submission_records: if str(hepdata_submission.publication_recid) not in submissions: coordinator = User.query.get(hepdata_submission.coordinator) if hepdata_submission.participants: current_user_roles = [] for participant in hepdata_submission.participants: if int(current_user.get_id()) == participant.user_account: current_user_roles.append(participant.role) create_record_for_dashboard( str(hepdata_submission.publication_recid), submissions, current_user, coordinator=coordinator, user_role=current_user_roles, status=hepdata_submission.overall_status) else: create_record_for_dashboard( str(hepdata_submission.publication_recid), submissions, current_user, coordinator=coordinator, status=hepdata_submission.overall_status) # we update the counts for the number of data tables in various # states of review statuses = ["todo", "attention", "passed"] for status in statuses: status_count = DataReview.query.filter_by( publication_recid=hepdata_submission.publication_recid, status=status, version=hepdata_submission.version).count() if str(hepdata_submission.publication_recid) in submissions: submissions[str(hepdata_submission.publication_recid )]["stats"][status] += status_count return submissions
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)
def test_has_role(app): with app.app_context(): user = User.query.filter_by(email=TEST_EMAIL).first() assert (user is not None) assert (has_role(user, 'coordinator')) assert (not has_role(user, 'awesome'))
def prepare_submissions(current_user): """ Finds all the relevant submissions for a user, or all submissions if the logged in user is a 'super admin' :param current_user: User obj :return: OrderedDict of submissions """ submissions = OrderedDict() hepdata_submission_records = [] if has_role(current_user, 'admin'): # if the user is a superadmin, show everything here. # The final rendering in the dashboard should be different # though considering the user him/herself is probably not a # reviewer/uploader hepdata_submission_records = HEPSubmission.query.filter( and_(HEPSubmission.overall_status != 'finished', HEPSubmission.overall_status != 'sandbox')).order_by( HEPSubmission.created.desc()).all() else: # we just want to pick out people with access to particular records, # i.e. submissions for which they are primary reviewers. participant_records = SubmissionParticipant.query.filter_by( user_account=int(current_user.get_id()), status='primary').all() for participant_record in participant_records: hepdata_submission_records = HEPSubmission.query.filter( HEPSubmission.publication_recid == participant_record.publication_recid, and_(HEPSubmission.overall_status != 'finished', HEPSubmission.overall_status != 'sandbox')).all() coordinator_submissions = HEPSubmission.query.filter( HEPSubmission.coordinator == int(current_user.get_id()), and_(HEPSubmission.overall_status != 'finished', HEPSubmission.overall_status != 'sandbox')).all() hepdata_submission_records += coordinator_submissions for hepdata_submission in hepdata_submission_records: if str(hepdata_submission.publication_recid) not in submissions: primary_uploader = primary_reviewer = None coordinator = User.query.get(hepdata_submission.coordinator) if hepdata_submission.participants: current_user_roles = [] for participant in hepdata_submission.participants: if int(current_user.get_id()) == participant.user_account: current_user_roles.append(participant.role) if participant.status == 'primary' and participant.role == "uploader": primary_uploader = {'full_name': participant.full_name, 'email': participant.email} if participant.status == 'primary' and participant.role == "reviewer": primary_reviewer = {'full_name': participant.full_name, 'email': participant.email} create_record_for_dashboard( str(hepdata_submission.publication_recid), submissions, primary_uploader=primary_uploader, primary_reviewer=primary_reviewer, coordinator=coordinator, user_role=current_user_roles, status=hepdata_submission.overall_status) else: create_record_for_dashboard( str(hepdata_submission.publication_recid), submissions, coordinator=coordinator, status=hepdata_submission.overall_status) # we update the counts for the number of data tables in various # states of review statuses = ["todo", "attention", "passed"] for status in statuses: status_count = DataReview.query.filter_by( publication_recid=hepdata_submission.publication_recid, status=status, version=hepdata_submission.version).count() if str(hepdata_submission.publication_recid) in submissions: submissions[str(hepdata_submission.publication_recid)][ "stats"][status] += status_count return submissions