コード例 #1
0
def generic_get_entity(entity_type, ident):
    try:
        if entity_type == 'container':
            return enrich_container_entity(api.get_container(ident))
        elif entity_type == 'creator':
            return enrich_creator_entity(api.get_creator(ident))
        elif entity_type == 'file':
            return enrich_file_entity(api.get_file(ident, expand="releases"))
        elif entity_type == 'fileset':
            return enrich_fileset_entity(
                api.get_fileset(ident, expand="releases"))
        elif entity_type == 'webcapture':
            return enrich_webcapture_entity(
                api.get_webcapture(ident, expand="releases"))
        elif entity_type == 'release':
            return enrich_release_entity(
                api.get_release(ident,
                                expand="container,files,filesets,webcaptures"))
        elif entity_type == 'work':
            return enrich_work_entity(api.get_work(ident))
        else:
            raise NotImplementedError
    except ApiException as ae:
        abort(ae.status)
    except ApiValueError:
        abort(400)
コード例 #2
0
def reference_match_json() -> AnyResponse:
    form = ReferenceMatchForm(request.args)
    if form.validate():
        if form.submit_type.data == "match":
            matches = (close_fuzzy_biblio_matches(
                es_client=app.es_client, biblio=form.data, match_limit=10)
                       or [])
        else:
            raise NotImplementedError()
        resp = []
        for m in matches:
            # expand releases more completely
            m.release = api.get_release(
                m.release.ident,
                expand="container,files,filesets,webcaptures",
                hide="abstract,refs",
            )
            # hack in access options
            m.access_options = release_access_options(m.release)

            # and manually convert to dict (for jsonify)
            info = m.__dict__
            info["release"] = entity_to_dict(m.release)
            info["access_options"] = [o.dict() for o in m.access_options]
            resp.append(info)
        return jsonify(resp), 200
    else:
        return Response(json.dumps(dict(errors=form.errors)),
                        mimetype="application/json",
                        status=400)
コード例 #3
0
def release_view(ident):
    try:
        entity = api.get_release(ident,
                                 expand="container,files,filesets,webcaptures")
        container = entity.container
        filesets = entity.filesets
    except ApiException as ae:
        abort(ae.status)
    if entity.state == "redirect":
        return redirect('/release/{}'.format(entity.redirect))
    if entity.state == "deleted":
        return render_template('deleted_entity.html',
                               entity=entity,
                               entity_type="release")
    if entity.container and entity.container.state == "active":
        entity.container.es = container_to_elasticsearch(entity.container,
                                                         force_bool=False)
    if entity.state == "active":
        entity.es = release_to_elasticsearch(entity, force_bool=False)
    for fs in filesets:
        fs.total_size = sum([f.size for f in fs.manifest])
    entity.filesets = filesets
    authors = [c for c in entity.contribs if c.role in ('author', None)]
    authors = sorted(authors, key=lambda c: c.index or 99999999)
    return render_template('release_view.html',
                           release=entity,
                           authors=authors,
                           container=container)
コード例 #4
0
def release_bibtex(ident):
    try:
        entity = api.get_release(ident)
    except ApiException as ae:
        raise ae
    csl = release_to_csl(entity)
    bibtex = citeproc_csl(csl, 'bibtex')
    return Response(bibtex, mimetype="text/plain")
コード例 #5
0
def release_history(ident):
    try:
        entity = api.get_release(ident)
        history = api.get_release_history(ident)
    except ApiException as ae:
        abort(ae.status)
    return render_template('entity_history.html',
                           entity_type="release",
                           entity=entity,
                           history=history)
コード例 #6
0
ファイル: entity_helpers.py プロジェクト: cclauss/fatcat
def generic_get_entity(entity_type: str,
                       ident: str,
                       enrich: bool = True) -> Any:
    try:
        if entity_type == "container" and enrich:
            return enrich_container_entity(api.get_container(ident))
        elif entity_type == "container":
            return api.get_container(ident)
        elif entity_type == "creator" and enrich:
            return enrich_creator_entity(api.get_creator(ident))
        elif entity_type == "creator":
            return api.get_creator(ident)
        elif entity_type == "file" and enrich:
            return enrich_file_entity(api.get_file(ident, expand="releases"))
        elif entity_type == "file":
            return api.get_file(ident, expand="releases")
        elif entity_type == "fileset" and enrich:
            return enrich_fileset_entity(
                api.get_fileset(ident, expand="releases"))
        elif entity_type == "fileset":
            return api.get_fileset(ident)
        elif entity_type == "webcapture" and enrich:
            return enrich_webcapture_entity(
                api.get_webcapture(ident, expand="releases"))
        elif entity_type == "webcapture":
            return api.get_webcapture(ident)
        elif entity_type == "release" and enrich:
            return enrich_release_entity(
                api.get_release(
                    ident,
                    expand="container,creators,files,filesets,webcaptures"))
        elif entity_type == "release":
            return api.get_release(ident)
        elif entity_type == "work" and enrich:
            return enrich_work_entity(api.get_work(ident))
        elif entity_type == "work":
            return api.get_work(ident)
        else:
            raise NotImplementedError
    except ApiException as ae:
        abort(ae.status)
    except ApiValueError:
        abort(400)
コード例 #7
0
def release_save(ident):

    form = SavePaperNowForm()

    # lookup release ident, ensure it exists
    try:
        release = api.get_release(ident)
    except ApiException as ae:
        abort(ae.status)

    if not Config.KAFKA_PIXY_ENDPOINT:
        return render_template('release_save.html',
                               entity=release,
                               form=form,
                               spn_status='not-configured'), 501

    if form.is_submitted():
        if form.validate_on_submit():
            # got a valid spn request! try to send to kafka-pixy
            msg = form.to_ingest_request(
                release, ingest_request_source="savepapernow-web")
            try:
                kafka_pixy_produce(
                    Config.KAFKA_SAVEPAPERNOW_TOPIC,
                    json.dumps(msg, sort_keys=True),
                )
            except:
                return render_template('release_save.html',
                                       entity=release,
                                       form=form,
                                       spn_status='kafka-error'), 500
            return render_template('release_save.html',
                                   entity=release,
                                   form=form,
                                   spn_status='success'), 200
        elif form.errors:
            return render_template('release_save.html',
                                   entity=release,
                                   form=form), 400

    # form was not submitted; populate defaults
    if release.release_stage:
        form.release_stage.data = release.release_stage
    if release.ext_ids.doi:
        form.base_url.data = "https://doi.org/{}".format(release.ext_ids.doi)
    elif release.ext_ids.arxiv:
        form.base_url.data = "https://arxiv.org/pdf/{}.pdf".format(
            release.ext_ids.arxiv)
    elif release.ext_ids.pmcid:
        form.base_url.data = "http://europepmc.org/backend/ptpmcrender.fcgi?accid={}&blobtype=pdf".format(
            release.ext_ids.pmcid)
    return render_template('release_save.html', entity=release, form=form), 200
コード例 #8
0
def webcapture_view(ident):
    try:
        entity = api.get_webcapture(ident)
    except ApiException as ae:
        abort(ae.status)
    if entity.state == "redirect":
        return redirect('/webcapture/{}'.format(entity.redirect))
    elif entity.state == "deleted":
        return render_template('deleted_entity.html',
                               entity=entity,
                               entity_type="webcapture")
    else:
        try:
            entity.releases = []
            for r in entity.release_ids:
                entity.releases.append(api.get_release(r))
        except ApiException as ae:
            abort(ae.status)
    return render_template('webcapture_view.html', webcapture=entity)
コード例 #9
0
def release_citeproc(ident):
    style = request.args.get('style', 'harvard1')
    is_html = request.args.get('html', False)
    if is_html and is_html.lower() in ('yes', '1', 'true', 'y', 't'):
        is_html = True
    else:
        is_html = False

    try:
        entity = api.get_release(ident)
    except ApiException as ae:
        raise ae
    csl = release_to_csl(entity)
    cite = citeproc_csl(csl, style, is_html)
    if is_html:
        return Response(cite)
    elif style == "csl-json":
        return jsonify(json.loads(cite))
    else:
        return Response(cite, mimetype="text/plain")
コード例 #10
0
def fileset_view(ident):
    try:
        entity = api.get_fileset(ident)
    except ApiException as ae:
        abort(ae.status)
    if entity.state == "redirect":
        return redirect('/fileset/{}'.format(entity.redirect))
    elif entity.state == "deleted":
        return render_template('deleted_entity.html',
                               entity=entity,
                               entity_type="fileset")
    else:
        try:
            entity.releases = []
            for r in entity.release_ids:
                entity.releases.append(api.get_release(r))
        except ApiException as ae:
            abort(ae.status)
        entity.total_size = sum([f.size for f in entity.manifest])
    return render_template('fileset_view.html', fileset=entity)
コード例 #11
0
def reference_match() -> AnyResponse:

    grobid_status = None
    grobid_dict = None

    form = ReferenceMatchForm()
    if not form.is_submitted() and request.args.get("submit_type"):
        form = ReferenceMatchForm(request.args)

    if form.is_submitted() or request.args.get("title"):
        if form.validate():
            if form.submit_type.data == "parse":
                resp_xml = grobid_api_process_citation(form.raw_citation.data)
                if not resp_xml:
                    grobid_status = "failed"
                    return (
                        render_template("reference_match.html",
                                        form=form,
                                        grobid_status=grobid_status),
                        400,
                    )
                grobid_dict = transform_grobid_ref_xml(resp_xml)
                if not grobid_dict:
                    grobid_status = "empty"
                    return (
                        render_template("reference_match.html",
                                        form=form,
                                        grobid_status=grobid_status),
                        200,
                    )
                # print(grobid_dict)
                release_stub = grobid_ref_to_release(grobid_dict)
                # remove empty values from GROBID parsed dict
                grobid_dict = {
                    k: v
                    for k, v in grobid_dict.items() if v is not None
                }
                form = ReferenceMatchForm.from_grobid_parse(
                    grobid_dict, form.raw_citation.data)
                grobid_status = "success"
                matches = (close_fuzzy_release_matches(es_client=app.es_client,
                                                       release=release_stub,
                                                       match_limit=10) or [])
            elif form.submit_type.data == "match":
                matches = (close_fuzzy_biblio_matches(
                    es_client=app.es_client, biblio=form.data, match_limit=10)
                           or [])
            else:
                raise NotImplementedError()

            for m in matches:
                # expand releases more completely
                m.release = api.get_release(
                    m.release.ident,
                    expand="container,files,filesets,webcaptures",
                    hide="abstract,refs",
                )
                # hack in access options
                m.access_options = release_access_options(m.release)

            return (
                render_template(
                    "reference_match.html",
                    form=form,
                    grobid_dict=grobid_dict,
                    grobid_status=grobid_status,
                    matches=matches,
                ),
                200,
            )

        elif form.errors:
            return render_template("reference_match.html", form=form), 400

    return render_template("reference_match.html", form=form), 200
コード例 #12
0
def release_edit_view(ident):
    try:
        entity = api.get_release(ident)
    except ApiException as ae:
        abort(ae.status)
    return render_template('entity_edit.html')