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)
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)
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)
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")
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)
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)
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
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)
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")
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)
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
def release_edit_view(ident): try: entity = api.get_release(ident) except ApiException as ae: abort(ae.status) return render_template('entity_edit.html')