예제 #1
0
파일: views.py 프로젝트: drjova/hepdata
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."]})
예제 #2
0
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'])
예제 #3
0
파일: api.py 프로젝트: HEPData/hepdata3
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'])
예제 #4
0
파일: views.py 프로젝트: drjova/hepdata
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)
예제 #5
0
파일: views.py 프로젝트: HEPData/hepdata3
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)
예제 #6
0
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
예제 #7
0
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)
예제 #8
0
파일: views.py 프로젝트: HEPData/hepdata3
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."})
예제 #9
0
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)
예제 #10
0
파일: views.py 프로젝트: drjova/hepdata
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."})
예제 #11
0
파일: views.py 프로젝트: HEPData/hepdata3
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)
예제 #12
0
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
예제 #13
0
파일: views.py 프로젝트: HEPData/hepdata3
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."]})
예제 #14
0
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)
예제 #15
0
파일: api.py 프로젝트: islahudinees/hepdata
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
예제 #16
0
파일: api.py 프로젝트: drjova/hepdata
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
예제 #17
0
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)
예제 #18
0
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'))
예제 #19
0
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'))
예제 #20
0
파일: api.py 프로젝트: HEPData/hepdata3
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