示例#1
0
def map_fulfillment_data(data_hash, bounty_id, fulfillment_id):
    ipfs_hash = data_hash
    if len(ipfs_hash) != 46 or not ipfs_hash.startswith('Qm'):
        logger.error(
            'Data Hash Incorrect for fulfillment on bounty: {:d} fulfillment: {:d}'.format(
                bounty_id, fulfillment_id))
        data_JSON = "{}"
    else:
        data_JSON = ipfs.cat(ipfs_hash)
    if len(ipfs_hash) == 0:
        ipfs_hash = 'invalid'

    data = json.loads(data_JSON)
    metadata = data.pop('meta', {})
    if 'payload' in data:
        data = data.get('payload')
    data_fulfiller = data.get('fulfiller', {})
    plucked_data = pluck(data, fulfillment_data_keys)

    return {
        'data_json': str(data_JSON),
        'data': ipfs_hash,
        'data_fulfiller': data_fulfiller,
        'fulfiller_name': data_fulfiller.get('name', ''),
        'fulfiller_email': data_fulfiller.get('email', '') or data.get('contact', ''),
        'fulfiller_githubUsername': data_fulfiller.get('githubUsername', ''),
        'fulfiller_address': data_fulfiller.get('address', ''),
        **plucked_data,
        **metadata,
    }
示例#2
0
def map_fulfillment_data(data_hash, bounty_id, fulfillment_id,
                         contract_version):
    ipfs_hash = data_hash
    if len(ipfs_hash) != 46 or not ipfs_hash.startswith('Qm'):
        logger.error(
            'Data Hash Incorrect for fulfillment on bounty: {:d} fulfillment: {:d}'
            .format(bounty_id, fulfillment_id))
        data_JSON = "{}"
    else:
        try:
            data_JSON = ipfs.cat(ipfs_hash)
        except StatusError as e:
            if e.original.response.status_code == 504:
                logger.warning(
                    'Timeout for bounty id {}, trying old IPFS Node'.format(
                        bounty_id))
                old_ipfs = ipfsapi.connect(
                    host='https://ipfs.bounties.network', port='443')
                data_JSON = old_ipfs.cat(ipfs_hash)
            else:
                raise e

    if len(ipfs_hash) == 0:
        ipfs_hash = 'invalid'

    data = json.loads(data_JSON)
    metadata = data.pop('meta', {})
    if 'payload' in data:
        data = data.get('payload')
    data_fulfiller = data.get('fulfiller', {})
    plucked_data = pluck(data, fulfillment_data_keys)

    return {
        'data_json':
        str(data_JSON),
        'data':
        ipfs_hash,
        'data_fulfiller':
        data_fulfiller,
        'fulfiller_name':
        data_fulfiller.get('name', ''),
        'fulfiller_email':
        data_fulfiller.get('email', '') or data.get('contact', ''),
        'fulfiller_githubUsername':
        data_fulfiller.get('githubUsername', ''),
        'fulfiller_address':
        data_fulfiller.get('address', ''),
        **plucked_data,
        **metadata,
    }
示例#3
0
def map_bounty_data(data_hash, bounty_id):
    ipfs_hash = data_hash
    if len(ipfs_hash) != 46 or not ipfs_hash.startswith('Qm'):
        logger.error('Data Hash Incorrect for bounty: {:d}'.format(bounty_id))
        data_JSON = "{}"
    else:
        data_JSON = ipfs.cat(ipfs_hash)
    if len(ipfs_hash) == 0:
        ipfs_hash = 'invalid'

    data = json.loads(data_JSON)
    metadata = data.get('meta', {})
    if 'payload' in data:
        data = data.get('payload')

    data_issuer = data.get('issuer', {})
    if isinstance(data_issuer, str):
        logger.error('Issuer schema incorrect for: {:d}'.format(bounty_id))
        data_issuer = {}

    categories = data.get('categories', [])
    plucked_data = pluck(data, bounty_data_keys)

    return {
        **plucked_data,
        **metadata,
        'issuer_name': data_issuer.get('name', ''),
        'issuer_email': data_issuer.get('email', '')
        or data.get('contact', ''),
        'issuer_githubUsername': data_issuer.get('githubUsername', ''),
        'issuer_address': data_issuer.get('address', ''),
        'data_issuer': data_issuer,
        'data': ipfs_hash,
        'data_json': str(data_JSON),
        'data_categories': categories,
    }
示例#4
0
def map_bounty_data(ipfs_hash, bounty_id):
    if len(ipfs_hash) != 46 or not ipfs_hash.startswith('Qm'):
        logger.error('Data Hash Incorrect for bounty: {:d}'.format(bounty_id))
        return {}

    raw_ipfs_data = ipfs.cat(ipfs_hash)

    data = json.loads(raw_ipfs_data)
    meta = data.get('meta', {})

    schema_version = meta.get('schemaVersion', '0.1')

    if schema_version == '0.1' or schema_version != '1.0':
        if 'payload' in data:
            data = data.get('payload')

        metadata = data.get('metadata', {})

        experienceLevel = metadata.get('experienceLevel') or data.get(
            'difficulty') or ''
        experienceLevel = 'Advanced' if experienceLevel == 'Expert' else experienceLevel

        formattedExperienceLevel = str(
            experienceLevel).lower().strip().capitalize()

        metadata.update({
            'experience_level':
            rev_mapped_difficulties.get(formattedExperienceLevel, BEGINNER)
        })

        data_issuer = data.get('issuer', {})
        if isinstance(data_issuer, str):
            logger.error('Issuer schema incorrect for: {:d}'.format(bounty_id))
            data_issuer = {}

        categories = data.get('categories', [])
        plucked_data = pluck(data, bounty_v0_data_keys)
        bounty = {
            **plucked_data,
            **meta,
            **metadata,
            'private_fulfillments':
            data.get('privateFulfillments', True),
            'fulfillers_need_approval':
            data.get('fulfillersNeedApproval', False),
            'issuer_name':
            data_issuer.get('name', ''),
            'issuer_email':
            data_issuer.get('email', '') or data.get('contact', ''),
            'issuer_githubUsername':
            data_issuer.get('githubUsername', ''),
            'issuer_address':
            data_issuer.get('address', ''),
            'revisions':
            data.get('revisions', None),
            'attached_filename':
            data.get('sourceFileName', None),
            'attached_data_hash':
            data.get('sourceDirectoryHash', None),
            'attached_url':
            data.get('webReferenceURL', None),
            'data_issuer':
            data_issuer,
            'data':
            ipfs_hash,
            'raw_ipfs_data':
            str(raw_ipfs_data),
            'data_categories':
            categories,
            'schema_version':
            schema_version,
            'schema_name':
            meta.get('schemaName'),
        }

        # if 'platform' is gitcoin, also return deadline
        if meta.get('platform', '') == 'gitcoin' and 'expire_date' in data:
            bounty.update({
                'deadline':
                datetime.utcfromtimestamp(int(data.get('expire_date')))
            })
        if meta.get('platform', '') == 'gitcoin':
            bounty.update({'private_fulfillments': False})
    elif schema_version == '1.0':
        payload = data.get('payload')
        meta = data.get('meta')

        try:
            difficulty = int(payload.get('difficulty'))
        except ValueError:
            difficulty = 1

        if difficulty == 2:
            difficulty = ADVANCED
        elif difficulty == 1:
            difficulty = INTERMEDIATE
        else:
            difficulty = BEGINNER

        print('data')
        print(data.get('sourceFileName', None))
        bounty = {
            # required
            'title': payload.get('title'),
            'description': payload.get('description'),
            'fulfillment_amount': int(payload.get('fulfillmentAmount')),
            'revisions': payload.get('revisions'),
            'experience_level': difficulty,
            'private_fulfillments': payload.get('privateFulfillments'),
            'fulfillers_need_approval': payload.get('fulfillersNeedApproval'),

            # optional
            'raw_ipfs_data': str(raw_ipfs_data),
            'data_categories': payload.get('categories', []),
            'attached_filename': payload.get('sourceFileName', None),
            'attached_data_hash': payload.get('sourceDirectoryHash', None),
            'attached_url': payload.get('webReferenceURL', None),

            # meta
            'schema_version': schema_version,
            'schema_name': meta.get('schemaname'),
            'platform': meta.get('platform'),

            # db
            'data': ipfs_hash,
        }

    return bounty
示例#5
0
def map_bounty_data(data_hash, bounty_id):
    ipfs_hash = data_hash
    if len(ipfs_hash) != 46 or not ipfs_hash.startswith('Qm'):
        logger.error('Data Hash Incorrect for bounty: {:d}'.format(bounty_id))
        data_JSON = '{}'
    else:
        data_JSON = ipfs.cat(ipfs_hash)

    if len(ipfs_hash) == 0:
        ipfs_hash = 'invalid'

    data = json.loads(data_JSON)
    meta = data.get('meta', {})

    if 'payload' in data:
        data = data.get('payload')

    metadata = data.get('metadata', {})

    experienceLevel = metadata.get('experienceLevel') or data.get(
        'difficulty') or ''
    experienceLevel = 'Advanced' if experienceLevel == 'Expert' else experienceLevel

    formattedExperienceLevel = str(
        experienceLevel).lower().strip().capitalize()

    metadata.update({
        'experienceLevel':
        rev_mapped_difficulties.get(formattedExperienceLevel, BEGINNER)
    })

    data_issuer = data.get('issuer', {})
    if isinstance(data_issuer, str):
        logger.error('Issuer schema incorrect for: {:d}'.format(bounty_id))
        data_issuer = {}

    categories = data.get('categories', [])
    plucked_data = pluck(data, bounty_data_keys)

    bounty = {
        **plucked_data,
        **meta,
        **metadata,
        'private_fulfillments': data.get('privateFulfillments', True),
        'issuer_name': data_issuer.get('name', ''),
        'issuer_email': data_issuer.get('email', '')
        or data.get('contact', ''),
        'issuer_githubUsername': data_issuer.get('githubUsername', ''),
        'issuer_address': data_issuer.get('address', ''),
        'revisions': data.get('revisions', None),
        'data_issuer': data_issuer,
        'data': ipfs_hash,
        'data_json': str(data_JSON),
        'data_categories': categories,
    }

    # if 'platform' is gitcoin, also return deadline
    if metadata.get('platform', '') is 'gitcoin':
        bounty.update({'deadline': data.get('expire_date', '')})

    return bounty