예제 #1
0
    def test_handle_payload(self):
        from zenodo.modules.github.tasks import handle_github_payload
        from invenio.modules.webhooks.models import Event

        httpretty.enable()
        extra_data = self.remote_token.remote_account.extra_data
        assert 'auser/repo-1' in extra_data['repos']
        assert 'auser/repo-2' in extra_data['repos']

        assert len(extra_data['repos']['auser/repo-1']['depositions']) == 0
        assert len(extra_data['repos']['auser/repo-2']['depositions']) == 0

        e = Event(user_id=self.user.id,
                  payload=fixtures.PAYLOAD('auser', 'repo-1'))

        handle_github_payload(e.__getstate__())

        db.session.expire(self.remote_token.remote_account)
        extra_data = self.remote_token.remote_account.extra_data
        assert len(extra_data['repos']['auser/repo-1']['depositions']) == 1
        assert len(extra_data['repos']['auser/repo-2']['depositions']) == 0

        dep = extra_data['repos']['auser/repo-1']['depositions'][0]

        assert dep['doi'].endswith(six.text_type(dep['record_id']))
        assert dep['errors'] is None
        assert dep['github_ref'] == "v1.0"
예제 #2
0
    def test_handle_payload(self):
        from zenodo.modules.github.tasks import handle_github_payload
        from invenio.modules.webhooks.models import Event

        httpretty.enable()
        extra_data = self.remote_token.remote_account.extra_data
        assert 'auser/repo-1' in extra_data['repos']
        assert 'auser/repo-2' in extra_data['repos']

        assert len(extra_data['repos']['auser/repo-1']['depositions']) == 0
        assert len(extra_data['repos']['auser/repo-2']['depositions']) == 0

        e = Event(
            user_id=self.user.id,
            payload=fixtures.PAYLOAD('auser', 'repo-1')
        )

        handle_github_payload(e.__getstate__())

        db.session.expire(self.remote_token.remote_account)
        extra_data = self.remote_token.remote_account.extra_data
        assert len(extra_data['repos']['auser/repo-1']['depositions']) == 1
        assert len(extra_data['repos']['auser/repo-2']['depositions']) == 0

        dep = extra_data['repos']['auser/repo-1']['depositions'][0]

        assert dep['doi'].endswith(six.text_type(dep['record_id']))
        assert dep['errors'] is None
        assert dep['github_ref'] == "v1.0"
예제 #3
0
def payload_debug(event_state):
    """"Debug a GitHub payload."""
    res = dict()
    try:
        e = Event()
        e.__setstate__(event_state)
        res['event'] = e

        current_app.try_trigger_before_first_request_functions()

        account = get_account(user_id=e.user_id)
        res['account'] = account

        gh = get_api(user_id=e.user_id)
        res['gh'] = gh

        access_token = ProviderToken.query.filter_by(
            id=account.extra_data["tokens"]["internal"]
        ).first().access_token
        res['access_token'] = access_token

        res['is_valid_sender'] = is_valid_sender(account.extra_data, e.payload)

        res['metadata'] = extract_metadata(gh, e.payload)

        res['files'] = extract_files(e.payload)
    finally:
        pass
    return res
예제 #4
0
def handle_inspire_payload(event_state):
    """
    Handle incoming notification from INSPIRE on an imported record.
    """
    e = Event()
    e.__setstate__(event_state)

    #e.user_id
    #e.payload

    pass
예제 #5
0
파일: tasks.py 프로젝트: drschoener/zenodo
def handle_inspire_payload(event_state):
    """
    Handle incoming notification from INSPIRE on an imported record.
    """
    e = Event()
    e.__setstate__(event_state)

    #e.user_id
    #e.payload

    pass
예제 #6
0
파일: tasks.py 프로젝트: egabancho/zenodo
def handle_github_payload(event_state):
    """
    Handle incoming notification from GitHub on a new release
    """
    e = Event()
    e.__setstate__(event_state)

    # Ping event
    if 'hook_id' in e.payload and 'zen' in e.payload:
        # TODO: record we sucessfully received ping event
        return

    # Get account and internal access token
    account = get_account(user_id=e.user_id)
    gh = get_api(user_id=e.user_id)
    access_token = ProviderToken.query.filter_by(
        id=account.extra_data["tokens"]["internal"]
    ).first().access_token

    # Validate payload sender
    if not is_valid_sender(account.extra_data, e.payload['sender']['login']):
        raise Exception("Invalid sender for payload %s for user %s" % (
            e.payload, e.user_id
        ))

    try:
        # Extra metadata from .zenodo.json and github repository
        metadata = extract_metadata(gh, e.payload, account.extra_data['name'])

        # Extract zip snapshot from github
        files = extract_files(e.payload)

        # Upload into Zenodo
        logger.info(metadata)
        deposition = upload(access_token, metadata, files, publish=True)
        logger.info(deposition)

        # TODO: Add step to update metadata of all previous records
        submitted_deposition(
            account.extra_data, e.payload['repository']['full_name'],
            deposition, e.payload['release']['tag_name']
        )
        account.extra_data.changed()
    except Exception as e:
        # Handle errors and possibly send user an email
        # Send email to user
        import traceback
        logger.info(traceback.format_exc(e))

    db.session.commit()
예제 #7
0
파일: tasks.py 프로젝트: drschoener/zenodo
def handle_github_payload(event_state, verify_sender=True):
    """ Handle incoming notification from GitHub on a new release. """
    e = Event()
    e.__setstate__(event_state)

    # Ping event
    if 'hook_id' in e.payload and 'zen' in e.payload:
        # TODO: record we sucessfully received ping event
        return

    # Get account and internal access token
    account = get_account(user_id=e.user_id)
    gh = get_api(user_id=e.user_id)
    access_token = ProviderToken.query.filter_by(
        id=account.extra_data["tokens"]["internal"]
    ).first().access_token

    # Validate payload sender
    if verify_sender and \
       not is_valid_sender(account.extra_data, e.payload):
        raise Exception("Invalid sender for payload %s for user %s" % (
            e.payload, e.user_id
        ))

    try:
        # Extra metadata from .zenodo.json and github repository
        metadata = extract_metadata(gh, e.payload)

        # Extract zip snapshot from github
        files = extract_files(e.payload)

        # Upload into Zenodo
        deposition = upload(access_token, metadata, files, publish=True)

        # TODO: Add step to update metadata of all previous records
        submitted_deposition(
            account.extra_data, e.payload['repository']['full_name'],
            deposition, e.payload['release']['tag_name']
        )
        account.extra_data.changed()
        db.session.commit()
        # Send email to user that release was included.
    except Exception as e:
        # Handle errors and possibly send user an email
        # Send email to user
        current_app.logger.exception("Failed handling GitHub payload")
        db.session.commit()
        six.reraise(*sys.exc_info())