summaryrefslogtreecommitdiffstats
path: root/python/fatcat_web/entity_helpers.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/fatcat_web/entity_helpers.py')
-rw-r--r--python/fatcat_web/entity_helpers.py135
1 files changed, 121 insertions, 14 deletions
diff --git a/python/fatcat_web/entity_helpers.py b/python/fatcat_web/entity_helpers.py
index 8a28deb3..b3cda67f 100644
--- a/python/fatcat_web/entity_helpers.py
+++ b/python/fatcat_web/entity_helpers.py
@@ -2,16 +2,105 @@
from flask import abort
from fatcat_client.rest import ApiException
from fatcat_tools.transforms import *
-from fatcat_web import api
+from fatcat_web import app, api
+from fatcat_web.search import get_elastic_container_stats
+from fatcat_web.hacks import strip_extlink_xml, wayback_suffix
+def enrich_container_entity(entity):
+ if entity.state in ('redirect', 'deleted'):
+ return entity
+ if entity.state == "active":
+ entity._es = container_to_elasticsearch(entity, force_bool=False)
+ entity._stats = None
+ if entity.issnl:
+ try:
+ entity._stats = get_elastic_container_stats(entity.issnl)
+ except Exception as e:
+ app.log.error(e)
+ pass
+ return entity
+
+def enrich_creator_entity(entity):
+ if entity.state in ('redirect', 'deleted'):
+ return entity
+ entity._releases = None
+ if entity.state in ('active', 'wip'):
+ entity._releases = api.get_creator_releases(entity.ident)
+ return entity
+
+def enrich_file_entity(entity):
+ return entity
+
+def enrich_fileset_entity(entity):
+ if entity.state in ('redirect', 'deleted'):
+ return entity
+ entity._total_size = None
+ if entity.manifest != None:
+ entity._total_size = sum([f.size for f in entity.manifest]) or 0
+ return entity
+
+def enrich_webcapture_entity(entity):
+ if entity.state in ('redirect', 'deleted'):
+ return entity
+ entity.wayback_suffix = wayback_suffix(entity)
+ return entity
+
+def enrich_release_entity(entity):
+ if entity.state in ('redirect', 'deleted'):
+ return entity
+ if entity.state == "active":
+ entity._es = release_to_elasticsearch(entity, force_bool=False)
+ if entity.container and entity.container.state == "active":
+ entity.container._es = container_to_elasticsearch(entity.container, force_bool=False)
+ if entity.filesets:
+ for fs in entity.filesets:
+ fs._total_size = sum([f.size for f in fs.manifest])
+ if entity.webcaptures:
+ for wc in entity.webcaptures:
+ wc._wayback_suffix = wayback_suffix(wc)
+ for ref in entity.refs:
+ # this is a UI hack to get rid of XML crud in unstructured refs like:
+ # LOCKSS (2014) Available: <ext-link
+ # xmlns:xlink="http://www.w3.org/1999/xlink" ext-link-type="uri"
+ # xlink:href="http://lockss.org/"
+ # xlink:type="simple">http://lockss.org/</ext-link>. Accessed: 2014
+ # November 1.
+ if ref.extra and ref.extra.get('unstructured'):
+ ref.extra['unstructured'] = strip_extlink_xml(ref.extra['unstructured'])
+ # author list to display; ensure it's sorted by index (any othors with
+ # index=None go to end of list)
+ authors = [c for c in entity.contribs if c.role in ('author', None)]
+ entity._authors = sorted(authors, key=lambda c: (c.index == None and 99999999) or c.index)
+ # hack to show plain text instead of latex abstracts
+ if entity.abstracts:
+ if 'latex' in entity.abstracts[0].mimetype:
+ entity.abstracts.reverse()
+ return entity
+
+def enrich_work_entity(entity):
+ if entity.state in ('redirect', 'deleted'):
+ return entity
+ entity._releases = None
+ if entity.state in ('active', 'wip'):
+ entity._releases = api.get_work_releases(entity.ident)
+ return entity
def generic_get_entity(entity_type, ident):
try:
if entity_type == 'container':
- entity = api.get_container(ident)
- if entity.state == "active":
- entity.es = container_to_elasticsearch(entity, force_bool=False)
- return entity
+ 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 api.get_work(ident)
else:
raise NotImplementedError
except ApiException as ae:
@@ -20,8 +109,19 @@ def generic_get_entity(entity_type, ident):
def generic_get_entity_revision(entity_type, revision_id):
try:
if entity_type == 'container':
- entity = api.get_container_revision(revision_id)
- return entity
+ return enrich_container_entity(api.get_container_revision(revision_id))
+ elif entity_type == 'creator':
+ return enrich_creator_entity(api.get_creator_revision(revision_id))
+ elif entity_type == 'file':
+ return enrich_file_entity(api.get_file_revision(revision_id, expand="releases"))
+ elif entity_type == 'fileset':
+ return enrich_fileset_entity(api.get_fileset_revision(revision_id, expand="releases"))
+ elif entity_type == 'webcapture':
+ return enrich_webcapture_entity(api.get_webcapture_revision(revision_id, expand="releases"))
+ elif entity_type == 'release':
+ return enrich_release_entity(api.get_release_revision(revision_id, expand="container"))
+ elif entity_type == 'work':
+ return enrich_work_entity(api.get_work_revision(revision_id))
else:
raise NotImplementedError
except ApiException as ae:
@@ -30,6 +130,18 @@ def generic_get_entity_revision(entity_type, revision_id):
def generic_get_editgroup_entity(editgroup, entity_type, ident):
if entity_type == 'container':
edits = editgroup.edits.containers
+ elif entity_type == 'creator':
+ edits = editgroup.edits.creators
+ elif entity_type == 'file':
+ edits = editgroup.edits.files
+ elif entity_type == 'fileset':
+ edits = editgroup.edits.filesets
+ elif entity_type == 'webcapture':
+ edits = editgroup.edits.webcaptures
+ elif entity_type == 'release':
+ edits = editgroup.edits.releases
+ elif entity_type == 'work':
+ edits = editgroup.edits.works
else:
raise NotImplementedError
revision_id = None
@@ -41,12 +153,7 @@ def generic_get_editgroup_entity(editgroup, entity_type, ident):
if not revision_id:
# couldn't find relevent edit in this editgroup
abort(404)
- try:
- if entity_type == 'container':
- entity = api.get_container_revision(revision_id)
- else:
- raise NotImplementedError
- except ApiException as ae:
- abort(ae.status)
+
+ entity = generic_get_entity_revision(entity_type, revision_id)
entity.ident = ident
return entity, edit