diff options
-rw-r--r-- | python/fatcat_web/routes.py | 19 | ||||
-rw-r--r-- | python/fatcat_web/search.py | 68 | ||||
-rw-r--r-- | python/fatcat_web/templates/container_view_coverage.html | 15 | ||||
-rw-r--r-- | python/fatcat_web/templates/entity_base.html | 4 |
4 files changed, 104 insertions, 2 deletions
diff --git a/python/fatcat_web/routes.py b/python/fatcat_web/routes.py index f313fce0..3f5af621 100644 --- a/python/fatcat_web/routes.py +++ b/python/fatcat_web/routes.py @@ -230,6 +230,10 @@ def generic_editgroup_entity_view(editgroup_id, entity_type, ident, view_templat def container_view(ident): return generic_entity_view('container', ident, 'container_view.html') +@app.route('/container/<ident>/coverage', methods=['GET']) +def container_view_coverage(ident): + return generic_entity_view('container', ident, 'container_view_coverage.html') + @app.route('/container/<ident>/metadata', methods=['GET']) def container_view_metadata(ident): return generic_entity_view('container', ident, 'entity_view_metadata.html') @@ -718,6 +722,21 @@ def container_ident_stats(ident): abort(503) return jsonify(stats) +@app.route('/container/<ident>/ia_coverage_years.json', methods=['GET', 'OPTIONS']) +@crossdomain(origin='*',headers=['access-control-allow-origin','Content-Type']) +def container_ident_ia_coverage_years_json(ident): + try: + container = api.get_container(ident) + except ApiException as ae: + abort(ae.status) + try: + histogram = get_elastic_container_histogram(container.ident) + except Exception as ae: + app.log.error(ae) + abort(503) + histogram = [dict(year=h[0], in_ia=h[1], count=h[2]) for h in histogram] + return jsonify({'container_id': ident, "histogram": histogram}) + @app.route('/release/<ident>.bib', methods=['GET']) def release_bibtex(ident): try: diff --git a/python/fatcat_web/search.py b/python/fatcat_web/search.py index 94246329..523269ce 100644 --- a/python/fatcat_web/search.py +++ b/python/fatcat_web/search.py @@ -274,7 +274,7 @@ def get_elastic_container_random_releases(ident, limit=5): #print(resp.json()) resp.raise_for_status() resp = resp.json() - print(resp) + #print(resp) hits = [h['_source'] for h in resp['hits']['hits']] for h in hits: # Handle surrogate strings that elasticsearch returns sometimes, @@ -285,3 +285,69 @@ def get_elastic_container_random_releases(ident, limit=5): h[key] = h[key].encode('utf8', 'ignore').decode('utf8') return hits + +def get_elastic_container_histogram(ident): + """ + Fetches a stacked histogram of + + Filters to the past 500 years (at most), or about 1000 vaules. + + Returns a list of tuples: + (year, in_ia, count) + """ + + query = { + "aggs": { + "year_in_ia": { + "composite": { + "size": 1000, + "sources": [ + {"year": { + "histogram": { + "field": "release_year", + "interval": 1, + }}}, + {"in_ia": { + "terms": { + "field": "in_ia", + }}}, + ], + }, + }, + }, + "size": 0, + "query": { + "bool": { + "must": [{ + "range": { + "release_year": { + "gte": datetime.datetime.today().year - 499, + "lte": datetime.datetime.today().year, + } + } + }], + "filter": [{ + "bool": { + "should": [{ + "match": { + "container_id": ident + } + }], + "minimum_should_match": 1, + }, + }], + } + } + } + resp = requests.get( + "{}/fatcat_release/_search".format(app.config['ELASTICSEARCH_BACKEND']), + json=query, + params=dict(request_cache="true")) + resp.raise_for_status() + # TODO: abort() + resp = resp.json() + print(resp) + vals = [(h['key']['year'], h['key']['in_ia'], h['doc_count']) + for h in resp['aggregations']['year_in_ia']['buckets']] + vals = sorted(vals) + return vals diff --git a/python/fatcat_web/templates/container_view_coverage.html b/python/fatcat_web/templates/container_view_coverage.html new file mode 100644 index 00000000..eb9dba8a --- /dev/null +++ b/python/fatcat_web/templates/container_view_coverage.html @@ -0,0 +1,15 @@ +{% set container = entity %} +{% set entity_view = "coverage" %} +{% set entity_type = "container" %} +{% import "entity_macros.html" as entity_macros %} +{% extends "entity_base.html" %} + +{% block entity_main %} + +<h3>Preservation Coverage By Year</h3> + +<img src="/container/{{ container.ident }}/ia_coverage_years.svg"> +<br><a href="/container/{{ container.ident }}/ia_coverage_years.json">Download as JSON</a> + +{% endblock %} + diff --git a/python/fatcat_web/templates/entity_base.html b/python/fatcat_web/templates/entity_base.html index bba95d9d..48f51ec6 100644 --- a/python/fatcat_web/templates/entity_base.html +++ b/python/fatcat_web/templates/entity_base.html @@ -78,7 +78,9 @@ <div style="min-width: 40em;"> <div class="ui small tabular compact menu"> {{ entity_tab("overview", "Overview", "") }} - {% if entity_type == "release" %} + {% if entity_type == "container" and entity.state == 'active' and not editgroup %} + {{ entity_tab("coverage", "Coverage", "/coverage") }} + {% elif entity_type == "release" %} {{ entity_tab("contribs", "Authors", "/contribs", entity._authors|count ) }} {{ entity_tab("references", "References", "/references", entity.refs|count) }} {% endif %} |