Exemplo n.º 1
0
def notify_submission_created(record, coordinator_id, uploader, reviewer):
    coordinator = get_user_from_id(coordinator_id)

    if not coordinator:
        return

    site_url = current_app.config.get('SITE_URL', 'https://www.hepdata.net')

    name = coordinator.email
    coordinator_profile = UserProfile.get_by_userid(coordinator_id)
    if coordinator_profile:
        name = coordinator_profile.full_name

    collaboration = _get_collaboration(coordinator_id)

    message_body = render_template('hepdata_theme/email/created.html',
                                   name=name,
                                   actor=coordinator.email,
                                   collaboration=collaboration,
                                   uploader=uploader,
                                   reviewer=reviewer,
                                   article=record['recid'],
                                   title=record['title'],
                                   site_url=site_url,
                                   link=site_url +
                                   "/record/{0}".format(record['recid']))

    create_send_email_task(
        coordinator.email,
        '[HEPData] Submission {0} has been created'.format(record['recid']),
        message_body)
Exemplo n.º 2
0
def get_pending_invitations_for_user(user):
    """
    Returns pending invites for upload or review of records.

    :param user: User object
    :return: array of pending invites
    """
    pending_invites = SubmissionParticipant.query.filter(
        func.lower(SubmissionParticipant.email) == func.lower(user.email),
        or_(SubmissionParticipant.role == 'reviewer',
            SubmissionParticipant.role == 'uploader'),
        SubmissionParticipant.status == 'primary',
        SubmissionParticipant.user_account == None).all()

    result = []

    for invite in pending_invites:
        publication_record = get_record_by_id(invite.publication_recid)
        hepsubmission = get_latest_hepsubmission(
            publication_recid=invite.publication_recid)

        coordinator = get_user_from_id(hepsubmission.coordinator)
        result.append({
            'title': decode_string(publication_record['title']),
            'invitation_cookie': invite.invitation_cookie,
            'role': invite.role,
            'coordinator': coordinator
        })

    return result
Exemplo n.º 3
0
def respond_coordinator_privileges(request_id, decision):
    """
    Handles a request for coordinator privileges.

    :return:
    """

    if user_is_admin(current_user):

        coordinator_request = CoordinatorRequest.query.filter_by(
            id=request_id).one()

        if coordinator_request:
            coordinator_request.in_queue = False
            if decision == 'approve':
                coordinator_request.approved = True

                coordinator_role = Role.query.filter_by(
                    name='coordinator').one()
                if coordinator_role:

                    user = get_user_from_id(coordinator_request.user)
                    if user:
                        user.roles.append(coordinator_role)
                        db.session.add(user)
                        send_coordinator_approved_email(coordinator_request)
                    else:
                        return render_template(
                            'hepdata_records/error_page.html',
                            recid=None,
                            message=
                            "Unable to find a user with id {0} in the system.".
                            format(coordinator_request.user),
                            errors={})

                else:
                    return render_template(
                        'hepdata_records/error_page.html',
                        recid=None,
                        message=
                        "Unable to find the role coordinator in the system.",
                        errors={})

            db.session.add(coordinator_request)
            db.session.commit()

            return redirect(url_for('hep_dashboard.dashboard'))

        return render_template('hepdata_records/error_page.html',
                               recid=None,
                               message="No request found with that ID.",
                               errors={})

    abort(403)
Exemplo n.º 4
0
def query_messages_for_data_review(data_review_record, messages):
    if data_review_record.messages:
        data_messages = data_review_record.messages
        for data_message in data_messages:
            current_user_obj = get_user_from_id(data_message.user)
            messages.append(
                {"message": data_message.message,
                 "user": current_user_obj.email,
                 "post_time": data_message.creation_date})

    return messages
Exemplo n.º 5
0
def process_coordinators(coordinators):
    values = []
    for coordinator in coordinators:
        user = get_user_from_id(coordinator.user)
        _coordinator_dict = {'message': coordinator.message, 'id': coordinator.id,
                             'approved': coordinator.approved,
                             'in_queue': coordinator.in_queue,
                             'collaboration': coordinator.collaboration,
                             'user': {'id': user.id, 'email': user.email}}
        values.append(_coordinator_dict)
    return values
Exemplo n.º 6
0
def process_coordinators(coordinators):
    values = []
    for coordinator in coordinators:
        user = get_user_from_id(coordinator.user)
        _coordinator_dict = {'message': coordinator.message, 'id': coordinator.id,
                             'approved': coordinator.approved,
                             'in_queue': coordinator.in_queue,
                             'collaboration': coordinator.collaboration,
                             'user': {'id': user.id, 'email': user.email}}
        values.append(_coordinator_dict)
    return values
Exemplo n.º 7
0
def query_messages_for_data_review(data_review_record, messages):
    if data_review_record.messages:
        data_messages = data_review_record.messages
        data_messages.sort(key=lambda data_message: data_message.id, reverse=True)
        for data_message in data_messages:
            current_user_obj = get_user_from_id(data_message.user)
            messages.append(
                {"message": data_message.message,
                 "user": current_user_obj.email,
                 "post_time": data_message.creation_date})

    return messages
Exemplo n.º 8
0
def test_get_user_from_id(app):
    with app.app_context():
        user = get_user_from_id(1)

        assert (user)
        assert (user.email == TEST_EMAIL)

        assert (user_is_admin(user))
        assert (user_is_admin(None) is False)

        assert (user_is_admin_or_coordinator(user))

        assert (user_is_admin_or_coordinator(None) is False)
Exemplo n.º 9
0
def send_coordinator_approved_email(coordinator_request):
    message_body = render_template(
        'hepdata_theme/email/coordinator_approved.html',
        collaboration=coordinator_request.collaboration,
        message=coordinator_request.message,
        user_email=current_user.email,
        site_url=current_app.config.get('SITE_URL', 'https://www.hepdata.net'))

    user = get_user_from_id(coordinator_request.user)
    if user:
        create_send_email_task(
            user.email,
            subject="[HEPData] Coordinator Request Approved",
            message=message_body)
Exemplo n.º 10
0
def send_coordinator_approved_email(coordinator_request):
    message_body = render_template(
        'hepdata_theme/email/coordinator_approved.html',
        collaboration=coordinator_request.collaboration,
        message=coordinator_request.message,
        user_email=current_user.email,
        site_url=current_app.config.get('SITE_URL', 'https://www.hepdata.net')
    )

    user = get_user_from_id(coordinator_request.user)
    if user:
        create_send_email_task(user.email,
                               subject="[HEPData] Coordinator Request Approved",
                               message=message_body)
Exemplo n.º 11
0
def respond_coordinator_privileges(request_id, decision):
    """
    Handles a request for coordinator privileges.
    :return:
    """

    if user_is_admin(current_user):

        coordinator_request = CoordinatorRequest.query.filter_by(
            id=request_id).one()

        if coordinator_request:
            coordinator_request.in_queue = False
            if decision == 'approve':
                coordinator_request.approved = True

                coordinator_role = Role.query.filter_by(name='coordinator').one()
                if coordinator_role:

                    user = get_user_from_id(coordinator_request.user)
                    if user:
                        user.roles.append(coordinator_role)
                        db.session.add(user)
                    else:
                        return render_template('hepdata_records/error_page.html',
                                               recid=None,
                                               message="Unable to find a user with id {0} in the system.".format(
                                                   coordinator_request.user),
                                               errors={})

                else:
                    return render_template('hepdata_records/error_page.html', recid=None,
                                           message="Unable to find the role coordinator in the system.",
                                           errors={})

            db.session.add(coordinator_request)
            db.session.commit()
            send_coordinator_approved_email(coordinator_request)

            return redirect(url_for('hep_dashboard.dashboard'))

        return render_template('hepdata_records/error_page.html', recid=None,
                               message="No request found with that ID.",
                               errors={})

    abort(403)
Exemplo n.º 12
0
def send_coordinator_notification_email(recid, version, user, message=None):
    """
    :param recid:
    :param user: user object
    :param message: message to send
    :return:
    """

    hepsubmission = get_latest_hepsubmission(publication_recid=recid)
    coordinator = get_user_from_id(hepsubmission.coordinator)

    if not coordinator:
        raise NoParticipantsException()

    site_url = current_app.config.get('SITE_URL', 'https://www.hepdata.net')

    record = get_record_by_id(recid)

    name = coordinator.email
    coordinator_profile = UserProfile.get_by_userid(hepsubmission.coordinator)
    if coordinator_profile:
        name = coordinator_profile.full_name

    collaboration = _get_collaboration(hepsubmission.coordinator)

    message_body = render_template('hepdata_theme/email/passed_review.html',
                                   name=name,
                                   actor=user.email,
                                   collaboration=collaboration,
                                   article=recid,
                                   version=version,
                                   message=message,
                                   title=record['title'],
                                   site_url=site_url,
                                   link=site_url + "/record/{0}".format(recid),
                                   dashboard_link=site_url + "/dashboard")

    create_send_email_task(
        coordinator.email,
        '[HEPData] Submission {0} is ready to be finalised'.format(recid),
        message_body)
Exemplo n.º 13
0
def get_pending_invitations_for_user(user):
    pending_invites = SubmissionParticipant.query.filter(
        SubmissionParticipant.email == user.email,
        or_(SubmissionParticipant.role == 'reviewer',
            SubmissionParticipant.role == 'uploader'),
        SubmissionParticipant.user_account == None
    ).all()

    result = []

    for invite in pending_invites:
        publication_record = get_record_by_id(invite.publication_recid)
        hepsubmission = get_latest_hepsubmission(publication_recid=invite.publication_recid)

        coordinator = get_user_from_id(hepsubmission.coordinator)
        result.append(
            {'title': encode_string(publication_record['title'], 'utf-8'),
             'invitation_cookie': invite.invitation_cookie,
             'role': invite.role, 'coordinator': coordinator})

    return result
Exemplo n.º 14
0
def test_get_nonexistant_user(app):
    with app.app_context():
        user = get_user_from_id(5)
        assert (user is None)
Exemplo n.º 15
0
def send_notification_email(recid,
                            version,
                            user,
                            reviewers_notified,
                            message=None,
                            show_detail=True):
    """
    :param recid:
    :param user: user object
    :param reviewers_notified: whether reviewers have already been notified about this upload
    :param show_detail: whether to show the status and messages for each data table
    :param message:
    :return:
    """

    submission_participants = get_submission_participants_for_record(
        recid, roles=['uploader', 'reviewer'], status='primary')

    if len(submission_participants) == 0:
        raise NoParticipantsException()

    site_url = current_app.config.get('SITE_URL', 'https://www.hepdata.net')

    record = get_record_by_id(recid)

    tables = []
    if show_detail:
        data_submissions = DataSubmission.query.filter_by(
            publication_recid=recid, version=version)

        for data_submission in data_submissions:
            table_data = {'name': data_submission.name, 'status': 'todo'}
            review = DataReview.query.filter_by(publication_recid=recid,
                                                data_recid=data_submission.id,
                                                version=version).first()
            if review:
                table_data['status'] = review.status
                table_data['messages'] = []
                for m in review.messages:
                    table_data['messages'].append({
                        'user':
                        get_user_from_id(m.user).email,
                        'date':
                        m.creation_date.strftime("%Y-%m-%d at %H:%M UTC"),
                        'message':
                        m.message
                    })

            tables.append(table_data)

    for participant in submission_participants:
        invite_token = None
        if not participant.user_account:
            invite_token = participant.invitation_cookie

        message_body = render_template(
            'hepdata_theme/email/submission_status.html',
            name=participant.full_name,
            actor=user.email,
            article=recid,
            message=message,
            invite_token=invite_token,
            role=participant.role,
            show_detail=show_detail,
            data_tables=tables,
            reviewers_notified=reviewers_notified,
            title=record['title'],
            site_url=site_url,
            link=site_url + "/record/{0}".format(recid))

        if participant.role == 'reviewer' and not reviewers_notified:
            message_subject = '[HEPData] Submission {0} has a new upload available for you to review'.format(
                recid)
        else:
            message_subject = '[HEPData] Notification about submission {0}'.format(
                recid)

        create_send_email_task(participant.email, message_subject,
                               message_body)