diff options
36 files changed, 578 insertions, 356 deletions
| @@ -1,4 +1,4 @@ - +<!--                __       _            _                  / _| __ _| |_ ___ __ _| |_               | |_ / _` | __/ __/ _` | __| @@ -6,16 +6,22 @@              |_|  \__,_|\__\___\__,_|\__|         perpetual access to the scholarly record +--> +<div align="center"> +  <img src="python/fatcat_web/static/fatcat.jpg" alt="photo of a cat and cup of coffee, by Quinn Kampschroer [CC-0]"> +</div> +`fatcat`: Perpetual Access to the Scholarly Record +==================================================  [](https://gitlab.com/bnewbold/fatcat/commits/master)  [](https://gitlab.com/bnewbold/fatcat/commits/master)  This repository contains source code for **fatcat**, an editable catalog of -published written works (mostly journal articles), with a focus on tracking the -location and status of full-text copies to ensure "perpetual access". The -primary public instance runs at [fatcat.wiki](https://fatcat.wiki). Both the -software project and primary instance are a project of the [Internet +published research (mostly journal articles), with a focus on tracking the +location and status of full-text copies on the public web, to ensure long term +access. The primary public instance runs at [fatcat.wiki](https://fatcat.wiki). +Both the software project and primary instance are a project of the [Internet  Archive](https://archive.org).  Some resources for learning more about the aims, goals, and structure of this @@ -25,7 +31,7 @@ overall project:  * **["How the Internet Archive is Ensuring Permanent Access to Open Access Journal Articles"](https://blog.archive.org/2020/09/15/how-the-internet-archive-is-ensuring-permanent-access-to-open-access-journal-articles/)**: archive.org blog post (September 2020)  * **[guide.fatcat.wiki](https://guide.fatcat.wiki)**: project documentation,    including schema overview, HOWTOs, policies, and more -* **[Fatcat RFC](./fatcat-rfc.md)**: original project design proposal +* **[Fatcat "Request for Comment" (RFC)](./fatcat-rfc.md)**: original project design proposal  ## Getting Started for Developers @@ -81,3 +87,9 @@ released, while the API server and web interface are strong copyleft (AGPLv3).  For software developers, the "help wanted" tag in Github Issues is a way to  discover bugs and tasks that external folks could contribute to. + +## Thanks! + +The "cat with coffee" photo at the top of this README is by <a +href="http://www.kampschroer.com/photography.html">Quinn Kampschroer</a>, +released under a CC-0 license (public domain). diff --git a/guide/src/bibliography.md b/guide/src/bibliography.md index d38c4b04..27ef5ab6 100644 --- a/guide/src/bibliography.md +++ b/guide/src/bibliography.md @@ -52,3 +52,9 @@    <div class="csl-entry" style="margin-bottom: 1em;">“Citation Style Language.” <i>Citation Style Language</i>. Accessed March 11, 2019. https://citationstyles.org/.</div>    <div class="csl-entry">“Open Archives Initiative Protocol for Metadata Harvesting.” Accessed March 11, 2019. https://www.openarchives.org/pmh/.</div>  </div> + +<!-- + +Embargo, Tasini, and “Opted Out”: How Many Journal Articles Are Missing from Full-Text Databases. Xiaotian Chen + +--> diff --git a/python/fatcat_web/auth.py b/python/fatcat_web/auth.py index ed9f2252..74b8e2d6 100644 --- a/python/fatcat_web/auth.py +++ b/python/fatcat_web/auth.py @@ -40,7 +40,11 @@ def handle_token_login(token):      session['api_token'] = token      session['editor'] = editor.to_dict()      login_user(load_user(editor.editor_id)) -    return redirect("/auth/account") +    rp = "/auth/account" +    if session.get('next'): +        rp = session['next'] +        session.pop('next') +    return redirect(rp)  # This will need to login/signup via fatcatd API, then set token in session  def handle_oauth(remote, token, user_info): @@ -71,13 +75,6 @@ def handle_oauth(remote, token, user_info):          editor = resp.editor          api_token = resp.token -        if http_status == 201: -            flash("Welcome to Fatcat! An account has been created for you with a temporary username; you may wish to change it under account settings") -            flash("You must use the same mechanism ({}) to login in the future".format(remote.name)) -            flash("Check out 'The Guide' (linked above) for an editing quickstart tutorial") -        else: -            flash("Welcome back {}!".format(editor.username)) -          # write token and username to session          session.permanent = True          session['api_token'] = api_token @@ -85,7 +82,11 @@ def handle_oauth(remote, token, user_info):          # call login_user(load_user(editor_id))          login_user(load_user(editor.editor_id)) -        return redirect("/auth/account") +        rp = "/auth/account" +        if session.get('next'): +            rp = session['next'] +            session.pop('next') +        return redirect(rp)      # XXX: what should this actually be?      raise Exception("didn't receive OAuth user_info") diff --git a/python/fatcat_web/editing_routes.py b/python/fatcat_web/editing_routes.py index 8e3b03b0..61aade72 100644 --- a/python/fatcat_web/editing_routes.py +++ b/python/fatcat_web/editing_routes.py @@ -137,11 +137,7 @@ def form_editgroup_get_or_create(api, edit_form):          except ApiException as ae:              app.log.warning(ae)              raise ae -        # set this session editgroup_id -        flash('Started new editgroup <a href="/editgroup/{}">{}</a>'.format( -            eg.editgroup_id, -            eg.editgroup_id, -        )) +        # set this session editgroup_id (TODO)      return eg  def generic_entity_edit(editgroup_id, entity_type, existing_ident, edit_template): diff --git a/python/fatcat_web/routes.py b/python/fatcat_web/routes.py index 02b5258a..7cf1f854 100644 --- a/python/fatcat_web/routes.py +++ b/python/fatcat_web/routes.py @@ -3,7 +3,7 @@ import os  import json  import citeproc_styles  from flask import render_template, make_response, send_from_directory, \ -    request, url_for, abort, redirect, jsonify, session, flash, Response +    request, url_for, abort, redirect, jsonify, session, Response  from flask_login import login_required  from flask_wtf.csrf import CSRFError @@ -685,7 +685,7 @@ def generic_search():      if len(query.split()) != 1:          # multi-term? must be a real search -        return redirect(url_for('release_search', q=query)) +        return redirect(url_for('release_search', q=query, generic=1))      if clean_doi(query):          return redirect(url_for('release_lookup', doi=clean_doi(query))) @@ -704,7 +704,7 @@ def generic_search():      if clean_orcid(query):          return redirect(url_for('creator_lookup', orcid=clean_orcid(query))) -    return redirect(url_for('release_search', q=query)) +    return redirect(url_for('release_search', q=query, generic=1))  @app.route('/release/search', methods=['GET', 'POST'])  def release_search(): @@ -712,12 +712,21 @@ def release_search():      if 'q' not in request.args.keys():          return render_template('release_search.html', query=ReleaseQuery(), found=None) +    container_found = None +    if request.args.get('generic'): +        container_query = GenericQuery.from_args(request.args) +        container_query.limit = 1 +        try: +            container_found = do_container_search(container_query) +        except Exception: +            pass +      query = ReleaseQuery.from_args(request.args)      try:          found = do_release_search(query)      except FatcatSearchError as fse:          return render_template('release_search.html', query=query, es_error=fse), fse.status_code -    return render_template('release_search.html', query=query, found=found) +    return render_template('release_search.html', query=query, found=found, container_found=container_found)  @app.route('/container/search', methods=['GET', 'POST'])  def container_search(): @@ -986,7 +995,7 @@ def health_json():  def login():      # show the user a list of login options      if not priv_api: -        flash("This web interface not configured with credentials to actually allow login (other than via token)") +        app.log.warn("This web interface not configured with credentials to actually allow login (other than via token)")      return render_template('auth_login.html')  @app.route('/auth/ia/login', methods=['GET', 'POST']) @@ -1026,7 +1035,6 @@ def change_username():      # update our session      session['editor'] = editor.to_dict()      load_user(editor.editor_id) -    flash("Username updated successfully")      return redirect('/auth/account')  @app.route('/auth/create_token', methods=['POST']) diff --git a/python/fatcat_web/search.py b/python/fatcat_web/search.py index 755b303a..6a419fa8 100644 --- a/python/fatcat_web/search.py +++ b/python/fatcat_web/search.py @@ -738,11 +738,12 @@ def get_elastic_container_preservation_by_volume(container_id: str) -> List[dict      buckets = resp.aggregations.volume_preservation.buckets      volume_nums = set([int(h['key']['volume']) for h in buckets if h['key']['volume'].isdigit()])      volume_dicts = dict() -    for num in range(min(volume_nums), max(volume_nums)+1): -        volume_dicts[num] = dict(volume=num, bright=0, dark=0, shadows_only=0, none=0) -    for row in buckets: -        if row['key']['volume'].isdigit(): -            volume_dicts[int(row['key']['volume'])][row['key']['preservation']] = int(row['doc_count']) +    if volume_nums: +        for num in range(min(volume_nums), max(volume_nums)+1): +            volume_dicts[num] = dict(volume=num, bright=0, dark=0, shadows_only=0, none=0) +        for row in buckets: +            if row['key']['volume'].isdigit(): +                volume_dicts[int(row['key']['volume'])][row['key']['preservation']] = int(row['doc_count'])      if app.config['FATCAT_MERGE_SHADOW_PRESERVATION']:          for k in volume_dicts.keys():              volume_dicts[k]['none'] += volume_dicts[k]['shadows_only'] diff --git a/python/fatcat_web/static/fatcat_oa_preservation_jan2021.svg b/python/fatcat_web/static/fatcat_oa_preservation_jan2021.svg new file mode 100644 index 00000000..730a5efa --- /dev/null +++ b/python/fatcat_web/static/fatcat_oa_preservation_jan2021.svg @@ -0,0 +1,4 @@ +<?xml version='1.0' encoding='utf-8'?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533" class="pygal-chart" viewBox="0 0 1000 500"><!--Generated with pygal 2.4.0 (lxml) ©Kozea 2012-2016 on 2021-02-26--><!--http://pygal.org--><!--http://github.com/Kozea/pygal--><defs><style type="text/css">#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533{-webkit-user-select:none;-webkit-font-smoothing:antialiased;font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .title{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:16px}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .legends .legend text{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:14px}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis text{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:10px}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis text.major{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:10px}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .text-overlay text.value{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:16px}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .text-overlay text.label{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:10px}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .tooltip{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:14px}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 text.no_data{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:64px} +#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533{background-color:transparent}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 path,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 line,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 rect,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 circle{-webkit-transition:150ms;-moz-transition:150ms;transition:150ms}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .graph > .background{fill:transparent}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .plot > .background{fill:rgba(240,240,240,0.7)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .graph{fill:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 text.no_data{fill:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .title{fill:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .legends .legend text{fill:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .legends .legend:hover text{fill:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis .line{stroke:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis .guide.line{stroke:rgba(0,0,0,0.5)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis .major.line{stroke:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis text.major{fill:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis.y .guides:hover .guide.line,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .line-graph .axis.x .guides:hover .guide.line,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .stackedline-graph .axis.x .guides:hover .guide.line,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .xy-graph .axis.x .guides:hover .guide.line{stroke:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis .guides:hover text{fill:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .reactive{fill-opacity:.7;stroke-opacity:.8}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .ci{stroke:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .reactive.active,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .active .reactive{fill-opacity:.8;stroke-opacity:.9;stroke-width:4}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .ci .reactive.active{stroke-width:1.5}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .series text{fill:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .tooltip rect{fill:rgba(240,240,240,0.7);stroke:rgba(0,0,0,0.9);-webkit-transition:opacity 150ms;-moz-transition:opacity 150ms;transition:opacity 150ms}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .tooltip .label{fill:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .tooltip .label{fill:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .tooltip .legend{font-size:.8em;fill:rgba(0,0,0,0.5)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .tooltip .x_label{font-size:.6em;fill:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .tooltip .xlink{font-size:.5em;text-decoration:underline}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .tooltip .value{font-size:1.5em}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .bound{font-size:.5em}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .max-value{font-size:.75em;fill:rgba(0,0,0,0.5)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .map-element{fill:rgba(240,240,240,0.7);stroke:rgba(0,0,0,0.5) !important}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .map-element .reactive{fill-opacity:inherit;stroke-opacity:inherit}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .color-0,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .color-0 a:visited{stroke:red;fill:red}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .color-1,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .color-1 a:visited{stroke:darkolivegreen;fill:darkolivegreen}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .color-2,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .color-2 a:visited{stroke:limegreen;fill:limegreen}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .text-overlay .color-0 text{fill:white}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .text-overlay .color-1 text{fill:white}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .text-overlay .color-2 text{fill:white} +#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 text.no_data{text-anchor:middle}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .guide.line{fill:none}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .centered{text-anchor:middle}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .title{text-anchor:middle}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .legends .legend text{fill-opacity:1}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis.x text{text-anchor:middle}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis.x:not(.web) text[transform]{text-anchor:start}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis.x:not(.web) text[transform].backwards{text-anchor:end}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis.y text{text-anchor:end}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis.y text[transform].backwards{text-anchor:start}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis.y2 text{text-anchor:start}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis.y2 text[transform].backwards{text-anchor:end}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis .guide.line{stroke-dasharray:4,4}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis .major.guide.line{stroke-dasharray:6,6}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .horizontal .axis.y .guide.line,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .horizontal .axis.y2 .guide.line,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .vertical .axis.x .guide.line{opacity:0}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .horizontal .axis.always_show .guide.line,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .vertical .axis.always_show .guide.line{opacity:1 !important}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis.y .guides:hover .guide.line,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis.y2 .guides:hover .guide.line,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis.x .guides:hover .guide.line{opacity:1}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis .guides:hover text{opacity:1}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .nofill{fill:none}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .subtle-fill{fill-opacity:.2}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .dot{stroke-width:1px;fill-opacity:1}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .dot.active{stroke-width:5px}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .dot.negative{fill:transparent}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 text,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 tspan{stroke:none !important}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .series text.active{opacity:1}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .tooltip rect{fill-opacity:.95;stroke-width:.5}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .tooltip text{fill-opacity:1}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .showable{visibility:hidden}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .showable.shown{visibility:visible}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .gauge-background{fill:rgba(229,229,229,1);stroke:none}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .bg-lines{stroke:transparent;stroke-width:2px}</style><script type="text/javascript">window.pygal = window.pygal || {};window.pygal.config = window.pygal.config || {};window.pygal.config['95b0cbdb-ae89-4e10-b430-cd66abb0b533'] = {"allow_interruptions": false, "box_mode": "extremes", "classes": ["pygal-chart"], "css": ["file://style.css", "file://graph.css"], "defs": [], "disable_xml_declaration": false, "dots_size": 2.5, "dynamic_print_values": true, "explicit_size": false, "fill": false, "force_uri_protocol": "https", "formatter": null, "half_pie": false, "height": 500, "include_x_axis": false, "inner_radius": 0, "interpolate": null, "interpolation_parameters": {}, "interpolation_precision": 250, "inverse_y_axis": false, "js": ["//kozea.github.io/pygal.js/2.0.x/pygal-tooltips.min.js"], "legend_at_bottom": false, "legend_at_bottom_columns": null, "legend_box_size": 12, "logarithmic": false, "margin": 20, "margin_bottom": null, "margin_left": null, "margin_right": null, "margin_top": null, "max_scale": 16, "min_scale": 4, "missing_value_fill_truncation": "x", "no_data_text": "No data", "no_prefix": false, "order_min": null, "pretty_print": false, "print_labels": false, "print_values": false, "print_values_position": "center", "print_zeroes": true, "range": null, "rounded_bars": null, "secondary_range": null, "show_dots": true, "show_legend": true, "show_minor_x_labels": false, "show_minor_y_labels": true, "show_only_major_dots": false, "show_x_guides": false, "show_x_labels": true, "show_y_guides": true, "show_y_labels": true, "spacing": 10, "stack_from_top": false, "strict": false, "stroke": true, "stroke_style": null, "style": {"background": "transparent", "ci_colors": [], "colors": ["red", "darkolivegreen", "limegreen"], "font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "foreground": "rgba(0, 0, 0, 0.9)", "foreground_strong": "rgba(0, 0, 0, 0.9)", "foreground_subtle": "rgba(0, 0, 0, 0.5)", "guide_stroke_dasharray": "4,4", "label_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "label_font_size": 10, "legend_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "legend_font_size": 14, "major_guide_stroke_dasharray": "6,6", "major_label_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "major_label_font_size": 10, "no_data_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "no_data_font_size": 64, "opacity": ".7", "opacity_hover": ".8", "plot_background": "rgba(240, 240, 240, 0.7)", "stroke_opacity": ".8", "stroke_opacity_hover": ".9", "title_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "title_font_size": 16, "tooltip_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "tooltip_font_size": 14, "transition": "150ms", "value_background": "rgba(229, 229, 229, 1)", "value_colors": [], "value_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "value_font_size": 16, "value_label_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "value_label_font_size": 10}, "title": null, "tooltip_border_radius": 0, "tooltip_fancy_mode": true, "truncate_label": null, "truncate_legend": null, "width": 1000, "x_label_rotation": 20, "x_labels": ["1996", "1997", "1998", "1999", "2000", "2001", "2002", "2003", "2004", "2005", "2006", "2007", "2008", "2009", "2010", "2011", "2012", "2013", "2014", "2015", "2016", "2017", "2018", "2019"], "x_labels_major": null, "x_labels_major_count": 24, "x_labels_major_every": null, "x_title": "Year", "xrange": null, "y_label_rotation": 0, "y_labels": null, "y_labels_major": null, "y_labels_major_count": null, "y_labels_major_every": null, "y_title": null, "zero": 0, "legends": ["None", "Dark", "Bright"]}</script><script type="text/javascript" xlink:href="https://kozea.github.io/pygal.js/2.0.x/pygal-tooltips.min.js"/></defs><title>Pygal</title><g class="graph stackedbar-graph vertical"><rect x="0" y="0" width="1000" height="500" class="background"/><g transform="translate(144, 20)" class="plot"><rect x="0" y="0" width="833.0473771011382" height="414" class="background"/><g class="axis y always_show"><g class="guides"><path d="M0.000000 406.038462 h833.047377" class="axis major line"/><text x="-5" y="409.53846153846155" class="major">0</text><title>0</title></g><g class="guides"><path d="M0.000000 362.135283 h833.047377" class="guide line"/><text x="-5" y="365.63528319013477" class="">200000</text><title>200000</title></g><g class="guides"><path d="M0.000000 318.232105 h833.047377" class="guide line"/><text x="-5" y="321.73210484180794" class="">400000</text><title>400000</title></g><g class="guides"><path d="M0.000000 274.328926 h833.047377" class="guide line"/><text x="-5" y="277.82892649348116" class="">600000</text><title>600000</title></g><g class="guides"><path d="M0.000000 230.425748 h833.047377" class="guide line"/><text x="-5" y="233.92574814515436" class="">800000</text><title>800000</title></g><g class="guides"><path d="M0.000000 186.522570 h833.047377" class="major guide line"/><text x="-5" y="190.02256979682755" class="major">1000000</text><title>1000000</title></g><g class="guides"><path d="M0.000000 142.619391 h833.047377" class="guide line"/><text x="-5" y="146.11939144850072" class="">1200000</text><title>1200000</title></g><g class="guides"><path d="M0.000000 98.716213 h833.047377" class="guide line"/><text x="-5" y="102.21621310017395" class="">1400000</text><title>1400000</title></g><g class="guides"><path d="M0.000000 54.813035 h833.047377" class="guide line"/><text x="-5" y="58.31303475184717" class="">1600000</text><title>1600000</title></g><g class="guides"><path d="M0.000000 10.909856 h833.047377" class="guide line"/><text x="-5" y="14.409856403520337" class="">1800000</text><title>1800000</title></g></g><g class="axis x"><path d="M0.000000 0.000000 v414.000000" class="line"/><g class="guides"><path d="M32.707790 0.000000 v414.000000" class="major guide line"/><text x="32.707789645797895" y="429.0" class="major" transform="rotate(20 32.707790 429.000000)">1996</text></g><g class="guides"><path d="M66.083085 0.000000 v414.000000" class="major guide line"/><text x="66.08308520273452" y="429.0" class="major" transform="rotate(20 66.083085 429.000000)">1997</text></g><g class="guides"><path d="M99.458381 0.000000 v414.000000" class="major guide line"/><text x="99.45838075967116" y="429.0" class="major" transform="rotate(20 99.458381 429.000000)">1998</text></g><g class="guides"><path d="M132.833676 0.000000 v414.000000" class="major guide line"/><text x="132.83367631660778" y="429.0" class="major" transform="rotate(20 132.833676 429.000000)">1999</text></g><g class="guides"><path d="M166.208972 0.000000 v414.000000" class="major guide line"/><text x="166.20897187354439" y="429.0" class="major" transform="rotate(20 166.208972 429.000000)">2000</text></g><g class="guides"><path d="M199.584267 0.000000 v414.000000" class="major guide line"/><text x="199.584267430481" y="429.0" class="major" transform="rotate(20 199.584267 429.000000)">2001</text></g><g class="guides"><path d="M232.959563 0.000000 v414.000000" class="major guide line"/><text x="232.95956298741766" y="429.0" class="major" transform="rotate(20 232.959563 429.000000)">2002</text></g><g class="guides"><path d="M266.334859 0.000000 v414.000000" class="major guide line"/><text x="266.3348585443543" y="429.0" class="major" transform="rotate(20 266.334859 429.000000)">2003</text></g><g class="guides"><path d="M299.710154 0.000000 v414.000000" class="major guide line"/><text x="299.7101541012909" y="429.0" class="major" transform="rotate(20 299.710154 429.000000)">2004</text></g><g class="guides"><path d="M333.085450 0.000000 v414.000000" class="major guide line"/><text x="333.0854496582275" y="429.0" class="major" transform="rotate(20 333.085450 429.000000)">2005</text></g><g class="guides"><path d="M366.460745 0.000000 v414.000000" class="major guide line"/><text x="366.46074521516414" y="429.0" class="major" transform="rotate(20 366.460745 429.000000)">2006</text></g><g class="guides"><path d="M399.836041 0.000000 v414.000000" class="major guide line"/><text x="399.83604077210083" y="429.0" class="major" transform="rotate(20 399.836041 429.000000)">2007</text></g><g class="guides"><path d="M433.211336 0.000000 v414.000000" class="major guide line"/><text x="433.21133632903747" y="429.0" class="major" transform="rotate(20 433.211336 429.000000)">2008</text></g><g class="guides"><path d="M466.586632 0.000000 v414.000000" class="major guide line"/><text x="466.58663188597404" y="429.0" class="major" transform="rotate(20 466.586632 429.000000)">2009</text></g><g class="guides"><path d="M499.961927 0.000000 v414.000000" class="major guide line"/><text x="499.9619274429107" y="429.0" class="major" transform="rotate(20 499.961927 429.000000)">2010</text></g><g class="guides"><path d="M533.337223 0.000000 v414.000000" class="major guide line"/><text x="533.3372229998473" y="429.0" class="major" transform="rotate(20 533.337223 429.000000)">2011</text></g><g class="guides"><path d="M566.712519 0.000000 v414.000000" class="major guide line"/><text x="566.712518556784" y="429.0" class="major" transform="rotate(20 566.712519 429.000000)">2012</text></g><g class="guides"><path d="M600.087814 0.000000 v414.000000" class="major guide line"/><text x="600.0878141137205" y="429.0" class="major" transform="rotate(20 600.087814 429.000000)">2013</text></g><g class="guides"><path d="M633.463110 0.000000 v414.000000" class="major guide line"/><text x="633.4631096706572" y="429.0" class="major" transform="rotate(20 633.463110 429.000000)">2014</text></g><g class="guides"><path d="M666.838405 0.000000 v414.000000" class="major guide line"/><text x="666.8384052275937" y="429.0" class="major" transform="rotate(20 666.838405 429.000000)">2015</text></g><g class="guides"><path d="M700.213701 0.000000 v414.000000" class="major guide line"/><text x="700.2137007845304" y="429.0" class="major" transform="rotate(20 700.213701 429.000000)">2016</text></g><g class="guides"><path d="M733.588996 0.000000 v414.000000" class="major guide line"/><text x="733.5889963414671" y="429.0" class="major" transform="rotate(20 733.588996 429.000000)">2017</text></g><g class="guides"><path d="M766.964292 0.000000 v414.000000" class="major guide line"/><text x="766.9642918984036" y="429.0" class="major" transform="rotate(20 766.964292 429.000000)">2018</text></g><g class="guides"><path d="M800.339587 0.000000 v414.000000" class="major guide line"/><text x="800.3395874553403" y="429.0" class="major" transform="rotate(20 800.339587 429.000000)">2019</text></g></g><g class="series serie-0 color-0"><g class="bars"><g class="bar"><rect x="18.02265960074578" y="401.74165747351077" rx="0" ry="0" width="29.37026009010423" height="4.296804064950777" class="rect reactive tooltip-trigger"/><desc class="value">19574</desc><desc class="x centered">32.707789645797895</desc><desc class="y centered">403.8900595059862</desc><desc class="x_label">1996</desc></g><g class="bar"><rect x="51.3979551576824" y="401.3256748586604" rx="0" ry="0" width="29.37026009010423" height="4.712786679801127" class="rect reactive tooltip-trigger"/><desc class="value">21469</desc><desc class="x centered">66.08308520273451</desc><desc class="y centered">403.68206819856096</desc><desc class="x_label">1997</desc></g><g class="bar"><rect x="84.77325071461902" y="401.24006366088116" rx="0" ry="0" width="29.37026009010423" height="4.798397877580385" class="rect reactive tooltip-trigger"/><desc class="value">21859</desc><desc class="x centered">99.45838075967114</desc><desc class="y centered">403.6392625996714</desc><desc class="x_label">1998</desc></g><g class="bar"><rect x="118.14854627155565" y="400.8232029824638" rx="0" ry="0" width="29.37026009010423" height="5.215258555997764" class="rect reactive tooltip-trigger"/><desc class="value">23758</desc><desc class="x centered">132.83367631660775</desc><desc class="y centered">403.4308322604627</desc><desc class="x_label">1999</desc></g><g class="bar"><rect x="151.52384182849227" y="400.15543563978576" rx="0" ry="0" width="29.37026009010423" height="5.883025898675783" class="rect reactive tooltip-trigger"/><desc class="value">26800</desc><desc class="x centered">166.20897187354439</desc><desc class="y centered">403.09694858912366</desc><desc class="x_label">2000</desc></g><g class="bar"><rect x="184.8991373854289" y="399.78050249669104" rx="0" ry="0" width="29.37026009010423" height="6.257959041770505" class="rect reactive tooltip-trigger"/><desc class="value">28508</desc><desc class="x centered">199.58426743048102</desc><desc class="y centered">402.9094820175763</desc><desc class="x_label">2001</desc></g><g class="bar"><rect x="218.27443294236554" y="399.4659362238253" rx="0" ry="0" width="29.37026009010423" height="6.572525314636266" class="rect reactive tooltip-trigger"/><desc class="value">29941</desc><desc class="x centered">232.95956298741766</desc><desc class="y centered">402.7521988811434</desc><desc class="x_label">2002</desc></g><g class="bar"><rect x="251.64972849930217" y="398.5874336250753" rx="0" ry="0" width="29.37026009010423" height="7.45102791338627" class="rect reactive tooltip-trigger"/><desc class="value">33943</desc><desc class="x centered">266.3348585443543</desc><desc class="y centered">402.3129475817684</desc><desc class="x_label">2003</desc></g><g class="bar"><rect x="285.0250240562388" y="398.2482815723344" rx="0" ry="0" width="29.37026009010423" height="7.790179966127141" class="rect reactive tooltip-trigger"/><desc class="value">35488</desc><desc class="x centered">299.7101541012909</desc><desc class="y centered">402.14337155539795</desc><desc class="x_label">2004</desc></g><g class="bar"><rect x="318.40031961317544" y="397.38887685616595" rx="0" ry="0" width="29.37026009010423" height="8.649584682295597" class="rect reactive tooltip-trigger"/><desc class="value">39403</desc><desc class="x centered">333.08544965822756</desc><desc class="y centered">401.7136691973137</desc><desc class="x_label">2005</desc></g><g class="bar"><rect x="351.7756151701121" y="396.5415455140432" rx="0" ry="0" width="29.37026009010423" height="9.49691602441834" class="rect reactive tooltip-trigger"/><desc class="value">43263</desc><desc class="x centered">366.4607452151642</desc><desc class="y centered">401.29000352625235</desc><desc class="x_label">2006</desc></g><g class="bar"><rect x="385.15091072704865" y="395.62682279315584" rx="0" ry="0" width="29.37026009010423" height="10.411638745305709" class="rect reactive tooltip-trigger"/><desc class="value">47430</desc><desc class="x centered">399.8360407721008</desc><desc class="y centered">400.8326421658087</desc><desc class="x_label">2007</desc></g><g class="bar"><rect x="418.5262062839853" y="394.43155876262267" rx="0" ry="0" width="29.37026009010423" height="11.606902775838876" class="rect reactive tooltip-trigger"/><desc class="value">52875</desc><desc class="x centered">433.2113363290374</desc><desc class="y centered">400.2350101505421</desc><desc class="x_label">2008</desc></g><g class="bar"><rect x="451.90150184092187" y="393.97518522369177" rx="0" ry="0" width="29.37026009010423" height="12.06327631476978" class="rect reactive tooltip-trigger"/><desc class="value">54954</desc><desc class="x centered">466.586631885974</desc><desc class="y centered">400.00682338107663</desc><desc class="x_label">2009</desc></g><g class="bar"><rect x="485.27679739785856" y="391.48214324118203" rx="0" ry="0" width="29.37026009010423" height="14.556318297279518" class="rect reactive tooltip-trigger"/><desc class="value">66311</desc><desc class="x centered">499.9619274429107</desc><desc class="y centered">398.7603023898218</desc><desc class="x_label">2010</desc></g><g class="bar"><rect x="518.6520929547952" y="391.5286806102313" rx="0" ry="0" width="29.37026009010423" height="14.50978092823027" class="rect reactive tooltip-trigger"/><desc class="value">66099</desc><desc class="x centered">533.3372229998473</desc><desc class="y centered">398.7835710743464</desc><desc class="x_label">2011</desc></g><g class="bar"><rect x="552.0273885117317" y="389.1462746371593" rx="0" ry="0" width="29.37026009010423" height="16.89218690130224" class="rect reactive tooltip-trigger"/><desc class="value">76952</desc><desc class="x centered">566.7125185567838</desc><desc class="y centered">397.5923680878104</desc><desc class="x_label">2012</desc></g><g class="bar"><rect x="585.4026840686685" y="389.791431842988" rx="0" ry="0" width="29.37026009010423" height="16.247029695473543" class="rect reactive tooltip-trigger"/><desc class="value">74013</desc><desc class="x centered">600.0878141137206</desc><desc class="y centered">397.9149466907248</desc><desc class="x_label">2013</desc></g><g class="bar"><rect x="618.7779796256051" y="355.0791643659917" rx="0" ry="0" width="29.37026009010423" height="50.95929717246986" class="rect reactive tooltip-trigger"/><desc class="value">232144</desc><desc class="x centered">633.4631096706572</desc><desc class="y centered">380.5588129522266</desc><desc class="x_label">2014</desc></g><g class="bar"><rect x="652.1532751825416" y="376.8478968023343" rx="0" ry="0" width="29.37026009010423" height="29.19056473612727" class="rect reactive tooltip-trigger"/><desc class="value">132977</desc><desc class="x centered">666.8384052275937</desc><desc class="y centered">391.4431791703979</desc><desc class="x_label">2015</desc></g><g class="bar"><rect x="685.5285707394784" y="376.42115790878853" rx="0" ry="0" width="29.37026009010423" height="29.617303629673017" class="rect reactive tooltip-trigger"/><desc class="value">134921</desc><desc class="x centered">700.2137007845305</desc><desc class="y centered">391.22980972362507</desc><desc class="x_label">2016</desc></g><g class="bar"><rect x="718.9038662964149" y="371.9074721427971" rx="0" ry="0" width="29.37026009010423" height="34.13098939566447" class="rect reactive tooltip-trigger"/><desc class="value">155483</desc><desc class="x centered">733.588996341467</desc><desc class="y centered">388.9729668406293</desc><desc class="x_label">2017</desc></g><g class="bar"><rect x="752.2791618533515" y="366.5734554893671" rx="0" ry="0" width="29.37026009010423" height="39.46500604909443" class="rect reactive tooltip-trigger"/><desc class="value">179782</desc><desc class="x centered">766.9642918984036</desc><desc class="y centered">386.30595851391433</desc><desc class="x_label">2018</desc></g><g class="bar"><rect x="785.6544574102882" y="360.5971353367011" rx="0" ry="0" width="29.37026009010423" height="45.44132620176043" class="rect reactive tooltip-trigger"/><desc class="value">207007</desc><desc class="x centered">800.3395874553403</desc><desc class="y centered">383.31779843758136</desc><desc class="x_label">2019</desc></g></g></g><g class="series serie-1 color-1"><g class="bars"><g class="bar"><rect x="18.02265960074578" y="391.5495346199467" rx="0" ry="0" width="29.37026009010423" height="10.192122853564058" class="rect reactive tooltip-trigger"/><desc class="value">46430</desc><desc class="x centered">32.707789645797895</desc><desc class="y centered">396.64559604672877</desc><desc class="x_label">1996</desc></g><g class="bar"><rect x="51.3979551576824" y="391.1381618388229" rx="0" ry="0" width="29.37026009010423" height="10.187513019837525" class="rect reactive tooltip-trigger"/><desc class="value">46409</desc><desc class="x centered">66.08308520273451</desc><desc class="y centered">396.23191834874166</desc><desc class="x_label">1997</desc></g><g class="bar"><rect x="84.77325071461902" y="390.4978339826126" rx="0" ry="0" width="29.37026009010423" height="10.742229678268586" class="rect reactive tooltip-trigger"/><desc class="value">48936</desc><desc class="x centered">99.45838075967114</desc><desc class="y centered">395.86894882174687</desc><desc class="x_label">1998</desc></g><g class="bar"><rect x="118.14854627155565" y="390.44119888254323" rx="0" ry="0" width="29.37026009010423" height="10.38200409992055" class="rect reactive tooltip-trigger"/><desc class="value">47295</desc><desc class="x centered">132.83367631660775</desc><desc class="y centered">395.6322009325035</desc><desc class="x_label">1999</desc></g><g class="bar"><rect x="151.52384182849227" y="389.1203717619338" rx="0" ry="0" width="29.37026009010423" height="11.03506387785194" class="rect reactive tooltip-trigger"/><desc class="value">50270</desc><desc class="x centered">166.20897187354439</desc><desc class="y centered">394.6379037008598</desc><desc class="x_label">2000</desc></g><g class="bar"><rect x="184.8991373854289" y="389.1162009599907" rx="0" ry="0" width="29.37026009010423" height="10.66430153670035" class="rect reactive tooltip-trigger"/><desc class="value">48581</desc><desc class="x centered">199.58426743048102</desc><desc class="y centered">394.44835172834087</desc><desc class="x_label">2001</desc></g><g class="bar"><rect x="218.27443294236554" y="388.5197762821287" rx="0" ry="0" width="29.37026009010423" height="10.946159941696578" class="rect reactive tooltip-trigger"/><desc class="value">49865</desc><desc class="x centered">232.95956298741766</desc><desc class="y centered">393.992856252977</desc><desc class="x_label">2002</desc></g><g class="bar"><rect x="251.64972849930217" y="387.4037574885142" rx="0" ry="0" width="29.37026009010423" height="11.183676136561076" class="rect reactive tooltip-trigger"/><desc class="value">50947</desc><desc class="x centered">266.3348585443543</desc><desc class="y centered">392.99559555679474</desc><desc class="x_label">2003</desc></g><g class="bar"><rect x="285.0250240562388" y="386.2793970910136" rx="0" ry="0" width="29.37026009010423" height="11.9688844813208" class="rect reactive tooltip-trigger"/><desc class="value">54524</desc><desc class="x centered">299.7101541012909</desc><desc class="y centered">392.26383933167403</desc><desc class="x_label">2004</desc></g><g class="bar"><rect x="318.40031961317544" y="385.0272784445193" rx="0" ry="0" width="29.37026009010423" height="12.36159841164664" class="rect reactive tooltip-trigger"/><desc class="value">56313</desc><desc class="x centered">333.08544965822756</desc><desc class="y centered">391.2080776503426</desc><desc class="x_label">2005</desc></g><g class="bar"><rect x="351.7756151701121" y="384.18697161093235" rx="0" ry="0" width="29.37026009010423" height="12.354573903110861" class="rect reactive tooltip-trigger"/><desc class="value">56281</desc><desc class="x centered">366.4607452151642</desc><desc class="y centered">390.36425856248775</desc><desc class="x_label">2006</desc></g><g class="bar"><rect x="385.15091072704865" y="380.47298223855563" rx="0" ry="0" width="29.37026009010423" height="15.153840554600208" class="rect reactive tooltip-trigger"/><desc class="value">69033</desc><desc class="x centered">399.8360407721008</desc><desc class="y centered">388.0499025158557</desc><desc class="x_label">2007</desc></g><g class="bar"><rect x="418.5262062839853" y="379.07686116707885" rx="0" ry="0" width="29.37026009010423" height="15.354697595543826" class="rect reactive tooltip-trigger"/><desc class="value">69948</desc><desc class="x centered">433.2113363290374</desc><desc class="y centered">386.75420996485076</desc><desc class="x_label">2008</desc></g><g class="bar"><rect x="451.90150184092187" y="376.42752386964906" rx="0" ry="0" width="29.37026009010423" height="17.547661354042702" class="rect reactive tooltip-trigger"/><desc class="value">79938</desc><desc class="x centered">466.586631885974</desc><desc class="y centered">385.2013545466704</desc><desc class="x_label">2009</desc></g><g class="bar"><rect x="485.27679739785856" y="371.6510775812428" rx="0" ry="0" width="29.37026009010423" height="19.831065659939213" class="rect reactive tooltip-trigger"/><desc class="value">90340</desc><desc class="x centered">499.9619274429107</desc><desc class="y centered">381.5666104112124</desc><desc class="x_label">2010</desc></g><g class="bar"><rect x="518.6520929547952" y="372.15464703689815" rx="0" ry="0" width="29.37026009010423" height="19.374033573333122" class="rect reactive tooltip-trigger"/><desc class="value">88258</desc><desc class="x centered">533.3372229998473</desc><desc class="y centered">381.8416638235647</desc><desc class="x_label">2011</desc></g><g class="bar"><rect x="552.0273885117317" y="367.9711131720861" rx="0" ry="0" width="29.37026009010423" height="21.175161465073188" class="rect reactive tooltip-trigger"/><desc class="value">96463</desc><desc class="x centered">566.7125185567838</desc><desc class="y centered">378.5586939046227</desc><desc class="x_label">2012</desc></g><g class="bar"><rect x="585.4026840686685" y="363.1160801944364" rx="0" ry="0" width="29.37026009010423" height="26.67535164855161" class="rect reactive tooltip-trigger"/><desc class="value">121519</desc><desc class="x centered">600.0878141137206</desc><desc class="y centered">376.45375601871217</desc><desc class="x_label">2013</desc></g><g class="bar"><rect x="618.7779796256051" y="325.63220506831016" rx="0" ry="0" width="29.37026009010423" height="29.44695929768153" class="rect reactive tooltip-trigger"/><desc class="value">134145</desc><desc class="x centered">633.4631096706572</desc><desc class="y centered">340.3556847171509</desc><desc class="x_label">2014</desc></g><g class="bar"><rect x="652.1532751825416" y="344.4866445258909" rx="0" ry="0" width="29.37026009010423" height="32.361252276443395" class="rect reactive tooltip-trigger"/><desc class="value">147421</desc><desc class="x centered">666.8384052275937</desc><desc class="y centered">360.6672706641126</desc><desc class="x_label">2015</desc></g><g class="bar"><rect x="685.5285707394784" y="340.7454351829382" rx="0" ry="0" width="29.37026009010423" height="35.675722725850335" class="rect reactive tooltip-trigger"/><desc class="value">162520</desc><desc class="x centered">700.2137007845305</desc><desc class="y centered">358.5832965458634</desc><desc class="x_label">2016</desc></g><g class="bar"><rect x="718.9038662964149" y="328.8966258944" rx="0" ry="0" width="29.37026009010423" height="43.01084624839706" class="rect reactive tooltip-trigger"/><desc class="value">195935</desc><desc class="x centered">733.588996341467</desc><desc class="y centered">350.4020490185985</desc><desc class="x_label">2017</desc></g><g class="bar"><rect x="752.2791618533515" y="315.41198418060316" rx="0" ry="0" width="29.37026009010423" height="51.161471308763964" class="rect reactive tooltip-trigger"/><desc class="value">233065</desc><desc class="x centered">766.9642918984036</desc><desc class="y centered">340.9927198349851</desc><desc class="x_label">2018</desc></g><g class="bar"><rect x="785.6544574102882" y="293.32670982836913" rx="0" ry="0" width="29.37026009010423" height="67.27042550833198" class="rect reactive tooltip-trigger"/><desc class="value">306449</desc><desc class="x centered">800.3395874553403</desc><desc class="y centered">326.9619225825351</desc><desc class="x_label">2019</desc></g></g></g><g class="series serie-2 color-2"><g class="bars"><g class="bar"><rect x="18.02265960074578" y="380.74891371447484" rx="0" ry="0" width="29.37026009010423" height="10.800620905471874" class="rect reactive tooltip-trigger"/><desc class="value">49202</desc><desc class="x centered">32.707789645797895</desc><desc class="y centered">386.1492241672108</desc><desc class="x_label">1996</desc></g><g class="bar"><rect x="51.3979551576824" y="379.34949990462195" rx="0" ry="0" width="29.37026009010423" height="11.788661934200945" class="rect reactive tooltip-trigger"/><desc class="value">53703</desc><desc class="x centered">66.08308520273451</desc><desc class="y centered">385.2438308717224</desc><desc class="x_label">1997</desc></g><g class="bar"><rect x="84.77325071461902" y="377.6721789758241" rx="0" ry="0" width="29.37026009010423" height="12.825655006788452" class="rect reactive tooltip-trigger"/><desc class="value">58427</desc><desc class="x centered">99.45838075967114</desc><desc class="y centered">384.08500647921835</desc><desc class="x_label">1998</desc></g><g class="bar"><rect x="118.14854627155565" y="376.17332446701226" rx="0" ry="0" width="29.37026009010423" height="14.267874415530969" class="rect reactive tooltip-trigger"/><desc class="value">64997</desc><desc class="x centered">132.83367631660775</desc><desc class="y centered">383.30726167477775</desc><desc class="x_label">1999</desc></g><g class="bar"><rect x="151.52384182849227" y="372.6408747371059" rx="0" ry="0" width="29.37026009010423" height="16.479497024827936" class="rect reactive tooltip-trigger"/><desc class="value">75072</desc><desc class="x centered">166.20897187354439</desc><desc class="y centered">380.8806232495199</desc><desc class="x_label">2000</desc></g><g class="bar"><rect x="184.8991373854289" y="369.9548782857552" rx="0" ry="0" width="29.37026009010423" height="19.161322674235464" class="rect reactive tooltip-trigger"/><desc class="value">87289</desc><desc class="x centered">199.58426743048102</desc><desc class="y centered">379.535539622873</desc><desc class="x_label">2001</desc></g><g class="bar"><rect x="218.27443294236554" y="367.13936745827704" rx="0" ry="0" width="29.37026009010423" height="21.380408823851667" class="rect reactive tooltip-trigger"/><desc class="value">97398</desc><desc class="x centered">232.95956298741766</desc><desc class="y centered">377.82957187020287</desc><desc class="x_label">2002</desc></g><g class="bar"><rect x="251.64972849930217" y="362.87241755460315" rx="0" ry="0" width="29.37026009010423" height="24.531339933911056" class="rect reactive tooltip-trigger"/><desc class="value">111752</desc><desc class="x centered">266.3348585443543</desc><desc class="y centered">375.13808752155865</desc><desc class="x_label">2003</desc></g><g class="bar"><rect x="285.0250240562388" y="357.68437896918135" rx="0" ry="0" width="29.37026009010423" height="28.595018121832254" class="rect reactive tooltip-trigger"/><desc class="value">130264</desc><desc class="x centered">299.7101541012909</desc><desc class="y centered">371.9818880300975</desc><desc class="x_label">2004</desc></g><g class="bar"><rect x="318.40031961317544" y="352.2985565653004" rx="0" ry="0" width="29.37026009010423" height="32.72872187921894" class="rect reactive tooltip-trigger"/><desc class="value">149095</desc><desc class="x centered">333.08544965822756</desc><desc class="y centered">368.66291750490984</desc><desc class="x_label">2005</desc></g><g class="bar"><rect x="351.7756151701121" y="345.51793018529304" rx="0" ry="0" width="29.37026009010423" height="38.66904142563931" class="rect reactive tooltip-trigger"/><desc class="value">176156</desc><desc class="x centered">366.4607452151642</desc><desc class="y centered">364.8524508981127</desc><desc class="x_label">2006</desc></g><g class="bar"><rect x="385.15091072704865" y="334.7851396903693" rx="0" ry="0" width="29.37026009010423" height="45.687842548186325" class="rect reactive tooltip-trigger"/><desc class="value">208130</desc><desc class="x centered">399.8360407721008</desc><desc class="y centered">357.6290609644625</desc><desc class="x_label">2007</desc></g><g class="bar"><rect x="418.5262062839853" y="310.766369363675" rx="0" ry="0" width="29.37026009010423" height="68.31049180340386" class="rect reactive tooltip-trigger"/><desc class="value">311187</desc><desc class="x centered">433.2113363290374</desc><desc class="y centered">344.9216152653769</desc><desc class="x_label">2008</desc></g><g class="bar"><rect x="451.90150184092187" y="293.19082949138107" rx="0" ry="0" width="29.37026009010423" height="83.236694378268" class="rect reactive tooltip-trigger"/><desc class="value">379183</desc><desc class="x centered">466.586631885974</desc><desc class="y centered">334.80917668051507</desc><desc class="x_label">2009</desc></g><g class="bar"><rect x="485.27679739785856" y="274.90361909806074" rx="0" ry="0" width="29.37026009010423" height="96.74745848318207" class="rect reactive tooltip-trigger"/><desc class="value">440731</desc><desc class="x centered">499.9619274429107</desc><desc class="y centered">323.2773483396518</desc><desc class="x_label">2010</desc></g><g class="bar"><rect x="518.6520929547952" y="257.1287587960654" rx="0" ry="0" width="29.37026009010423" height="115.02588824083273" class="rect reactive tooltip-trigger"/><desc class="value">523998</desc><desc class="x centered">533.3372229998473</desc><desc class="y centered">314.6417029164818</desc><desc class="x_label">2011</desc></g><g class="bar"><rect x="552.0273885117317" y="228.2062229637547" rx="0" ry="0" width="29.37026009010423" height="139.76489020833142" class="rect reactive tooltip-trigger"/><desc class="value">636696</desc><desc class="x centered">566.7125185567838</desc><desc class="y centered">298.0886680679204</desc><desc class="x_label">2012</desc></g><g class="bar"><rect x="585.4026840686685" y="198.62865171048693" rx="0" ry="0" width="29.37026009010423" height="164.48742848394946" class="rect reactive tooltip-trigger"/><desc class="value">749319</desc><desc class="x centered">600.0878141137206</desc><desc class="y centered">280.8723659524617</desc><desc class="x_label">2013</desc></g><g class="bar"><rect x="618.7779796256051" y="135.33321996981243" rx="0" ry="0" width="29.37026009010423" height="190.29898509849772" class="rect reactive tooltip-trigger"/><desc class="value">866903</desc><desc class="x centered">633.4631096706572</desc><desc class="y centered">230.4827125190613</desc><desc class="x_label">2014</desc></g><g class="bar"><rect x="652.1532751825416" y="126.96944497856441" rx="0" ry="0" width="29.37026009010423" height="217.51719954732647" class="rect reactive tooltip-trigger"/><desc class="value">990895</desc><desc class="x centered">666.8384052275937</desc><desc class="y centered">235.72804475222765</desc><desc class="x_label">2015</desc></g><g class="bar"><rect x="685.5285707394784" y="100.97964145992194" rx="0" ry="0" width="29.37026009010423" height="239.76579372301626" class="rect reactive tooltip-trigger"/><desc class="value">1092248</desc><desc class="x centered">700.2137007845305</desc><desc class="y centered">220.86253832143007</desc><desc class="x_label">2016</desc></g><g class="bar"><rect x="718.9038662964149" y="70.62256927507963" rx="0" ry="0" width="29.37026009010423" height="258.2740566193204" class="rect reactive tooltip-trigger"/><desc class="value">1176562</desc><desc class="x centered">733.588996341467</desc><desc class="y centered">199.75959758473982</desc><desc class="x_label">2017</desc></g><g class="bar"><rect x="752.2791618533515" y="48.72981035990301" rx="0" ry="0" width="29.37026009010423" height="266.68217382070014" class="rect reactive tooltip-trigger"/><desc class="value">1214865</desc><desc class="x centered">766.9642918984036</desc><desc class="y centered">182.07089727025308</desc><desc class="x_label">2018</desc></g><g class="bar"><rect x="785.6544574102882" y="7.961538461538453" rx="0" ry="0" width="29.37026009010423" height="285.3651713668307" class="rect reactive tooltip-trigger"/><desc class="value">1299975</desc><desc class="x centered">800.3395874553403</desc><desc class="y centered">150.6441241449538</desc><desc class="x_label">2019</desc></g></g></g></g><g class="titles"><text x="560.9236885505691" y="480" class="title">Year</text></g><g transform="translate(144, 20)" class="plot overlay"><g class="series serie-0 color-0"/><g class="series serie-1 color-1"/><g class="series serie-2 color-2"/></g><g transform="translate(144, 20)" class="plot text-overlay"><g class="series serie-0 color-0"><text text-anchor="middle" x="32.707789645797895" y="409.2233928393195" class="value showable">19574</text><text text-anchor="middle" x="66.08308520273451" y="409.01540153189427" class="value showable">21469</text><text text-anchor="middle" x="99.45838075967114" y="408.9725959330047" class="value showable">21859</text><text text-anchor="middle" x="132.83367631660775" y="408.764165593796" class="value showable">23758</text><text text-anchor="middle" x="166.20897187354439" y="408.43028192245697" class="value showable">26800</text><text text-anchor="middle" x="199.58426743048102" y="408.2428153509096" class="value showable">28508</text><text text-anchor="middle" x="232.95956298741766" y="408.0855322144767" class="value showable">29941</text><text text-anchor="middle" x="266.3348585443543" y="407.6462809151017" class="value showable">33943</text><text text-anchor="middle" x="299.7101541012909" y="407.47670488873126" class="value showable">35488</text><text text-anchor="middle" x="333.08544965822756" y="407.04700253064703" class="value showable">39403</text><text text-anchor="middle" x="366.4607452151642" y="406.62333685958566" class="value showable">43263</text><text text-anchor="middle" x="399.8360407721008" y="406.165975499142" class="value showable">47430</text><text text-anchor="middle" x="433.2113363290374" y="405.5683434838754" class="value showable">52875</text><text text-anchor="middle" x="466.586631885974" y="405.34015671440994" class="value showable">54954</text><text text-anchor="middle" x="499.9619274429107" y="404.0936357231551" class="value showable">66311</text><text text-anchor="middle" x="533.3372229998473" y="404.1169044076797" class="value showable">66099</text><text text-anchor="middle" x="566.7125185567838" y="402.92570142114374" class="value showable">76952</text><text text-anchor="middle" x="600.0878141137206" y="403.2482800240581" class="value showable">74013</text><text text-anchor="middle" x="633.4631096706572" y="385.89214628555993" class="value showable">232144</text><text text-anchor="middle" x="666.8384052275937" y="396.7765125037312" class="value showable">132977</text><text text-anchor="middle" x="700.2137007845305" y="396.5631430569584" class="value showable">134921</text><text text-anchor="middle" x="733.588996341467" y="394.3063001739626" class="value showable">155483</text><text text-anchor="middle" x="766.9642918984036" y="391.63929184724765" class="value showable">179782</text><text text-anchor="middle" x="800.3395874553403" y="388.6511317709147" class="value showable">207007</text></g><g class="series serie-1 color-1"><text text-anchor="middle" x="32.707789645797895" y="401.9789293800621" class="value showable">46430</text><text text-anchor="middle" x="66.08308520273451" y="401.565251682075" class="value showable">46409</text><text text-anchor="middle" x="99.45838075967114" y="401.2022821550802" class="value showable">48936</text><text text-anchor="middle" x="132.83367631660775" y="400.9655342658368" class="value showable">47295</text><text text-anchor="middle" x="166.20897187354439" y="399.9712370341931" class="value showable">50270</text><text text-anchor="middle" x="199.58426743048102" y="399.7816850616742" class="value showable">48581</text><text text-anchor="middle" x="232.95956298741766" y="399.3261895863103" class="value showable">49865</text><text text-anchor="middle" x="266.3348585443543" y="398.32892889012805" class="value showable">50947</text><text text-anchor="middle" x="299.7101541012909" y="397.59717266500735" class="value showable">54524</text><text text-anchor="middle" x="333.08544965822756" y="396.5414109836759" class="value showable">56313</text><text text-anchor="middle" x="366.4607452151642" y="395.69759189582106" class="value showable">56281</text><text text-anchor="middle" x="399.8360407721008" y="393.383235849189" class="value showable">69033</text><text text-anchor="middle" x="433.2113363290374" y="392.0875432981841" class="value showable">69948</text><text text-anchor="middle" x="466.586631885974" y="390.53468788000373" class="value showable">79938</text><text text-anchor="middle" x="499.9619274429107" y="386.89994374454574" class="value showable">90340</text><text text-anchor="middle" x="533.3372229998473" y="387.17499715689803" class="value showable">88258</text><text text-anchor="middle" x="566.7125185567838" y="383.89202723795603" class="value showable">96463</text><text text-anchor="middle" x="600.0878141137206" y="381.7870893520455" class="value showable">121519</text><text text-anchor="middle" x="633.4631096706572" y="345.6890180504842" class="value showable">134145</text><text text-anchor="middle" x="666.8384052275937" y="366.0006039974459" class="value showable">147421</text><text text-anchor="middle" x="700.2137007845305" y="363.9166298791967" class="value showable">162520</text><text text-anchor="middle" x="733.588996341467" y="355.73538235193183" class="value showable">195935</text><text text-anchor="middle" x="766.9642918984036" y="346.3260531683184" class="value showable">233065</text><text text-anchor="middle" x="800.3395874553403" y="332.29525591586844" class="value showable">306449</text></g><g class="series serie-2 color-2"><text text-anchor="middle" x="32.707789645797895" y="391.4825575005441" class="value showable">49202</text><text text-anchor="middle" x="66.08308520273451" y="390.57716420505574" class="value showable">53703</text><text text-anchor="middle" x="99.45838075967114" y="389.41833981255166" class="value showable">58427</text><text text-anchor="middle" x="132.83367631660775" y="388.64059500811106" class="value showable">64997</text><text text-anchor="middle" x="166.20897187354439" y="386.2139565828532" class="value showable">75072</text><text text-anchor="middle" x="199.58426743048102" y="384.8688729562063" class="value showable">87289</text><text text-anchor="middle" x="232.95956298741766" y="383.1629052035362" class="value showable">97398</text><text text-anchor="middle" x="266.3348585443543" y="380.47142085489196" class="value showable">111752</text><text text-anchor="middle" x="299.7101541012909" y="377.3152213634308" class="value showable">130264</text><text text-anchor="middle" x="333.08544965822756" y="373.99625083824316" class="value showable">149095</text><text text-anchor="middle" x="366.4607452151642" y="370.185784231446" class="value showable">176156</text><text text-anchor="middle" x="399.8360407721008" y="362.9623942977958" class="value showable">208130</text><text text-anchor="middle" x="433.2113363290374" y="350.2549485987102" class="value showable">311187</text><text text-anchor="middle" x="466.586631885974" y="340.1425100138484" class="value showable">379183</text><text text-anchor="middle" x="499.9619274429107" y="328.6106816729851" class="value showable">440731</text><text text-anchor="middle" x="533.3372229998473" y="319.9750362498151" class="value showable">523998</text><text text-anchor="middle" x="566.7125185567838" y="303.42200140125374" class="value showable">636696</text><text text-anchor="middle" x="600.0878141137206" y="286.205699285795" class="value showable">749319</text><text text-anchor="middle" x="633.4631096706572" y="235.81604585239464" class="value showable">866903</text><text text-anchor="middle" x="666.8384052275937" y="241.061378085561" class="value showable">990895</text><text text-anchor="middle" x="700.2137007845305" y="226.1958716547634" class="value showable">1092248</text><text text-anchor="middle" x="733.588996341467" y="205.09293091807317" class="value showable">1176562</text><text text-anchor="middle" x="766.9642918984036" y="187.40423060358643" class="value showable">1214865</text><text text-anchor="middle" x="800.3395874553403" y="155.97745747828714" class="value showable">1299975</text></g></g><g transform="translate(144, 20)" class="plot tooltip-overlay"><g transform="translate(0 0)" style="opacity: 0" class="tooltip"><rect rx="0" ry="0" width="0" height="0" class="tooltip-box"/><g class="text"/></g></g><g transform="translate(10, 30)" class="legends"><g id="activate-serie-0" class="legend reactive activate-serie"><rect x="0.0" y="1.0" width="12" height="12" class="color-0 reactive"/><text x="17.0" y="11.2">None</text></g><g id="activate-serie-1" class="legend reactive activate-serie"><rect x="0.0" y="22.0" width="12" height="12" class="color-1 reactive"/><text x="17.0" y="32.2">Dark</text></g><g id="activate-serie-2" class="legend reactive activate-serie"><rect x="0.0" y="43.0" width="12" height="12" class="color-2 reactive"/><text x="17.0" y="53.2">Bright</text></g></g><g transform="translate(987, 30)" class="legends"/></g></svg>
\ No newline at end of file diff --git a/python/fatcat_web/static/scholar-vaporwave-logo-small.png b/python/fatcat_web/static/scholar-vaporwave-logo-small.pngBinary files differ new file mode 100644 index 00000000..c40f7ec5 --- /dev/null +++ b/python/fatcat_web/static/scholar-vaporwave-logo-small.png diff --git a/python/fatcat_web/templates/auth_account.html b/python/fatcat_web/templates/auth_account.html index 4a51241a..86b60b25 100644 --- a/python/fatcat_web/templates/auth_account.html +++ b/python/fatcat_web/templates/auth_account.html @@ -8,17 +8,23 @@    <i class="settings icon"></i>    Account Settings  </h1> +<h1 class="ui header"> +  <span class="sub header"><code>editor_{{ current_user.editor_id }}</code></span></h1> +</h1> -<p><b>Username:</b> <code>{{ current_user.username }}</code> -<p><b>Editor Id:</b> <code><a href="/editor/{{ current_user.editor_id }}">{{ current_user.editor_id }}</a></code> +<a href="/editor/{{ current_user.editor_id }}/editgroups">Edit History</a> - +<a href="/editor/{{ current_user.editor_id }}/annotations">Comments and Annotation History</a>  <br> + +<div class="ui raised segments" style="max-width: 30em; margin-top: 2em; margin-bottom: 2em;"> +  <div class="ui segment"> -<h3 class="ui header">Change Username</h3> +<h4 class="ui header">Change Username</h4>  <form class="" role="change_username" action="/auth/change_username" method="post">    <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>    <div class="ui form"> -    <div class="ui action input medium"> +    <div class="ui action input">        <input type="text" name="username" value="{{ current_user.username }}" aria-label="account username">        <button class="ui red button">Update</button>      </div> @@ -27,7 +33,7 @@  </div>  <div class="ui segment"> -<h3 class="ui header">Create API Token</h3> +<h4 class="ui header">Create API Token</h4>  <form class="" role="change_username" action="/auth/create_token" method="post">    <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>    <div class="ui form"> @@ -40,10 +46,14 @@  </form>  </div> -<br> -<p>In the future, you will be able to... -<ul> -  <li>Create and manage bot accounts -</ul> +</div> +<div class="ui info small message"> +  <div class="header"> +    In the future, you will be able to... +  </div> +  <ul> +    <li>Create and manage bot accounts +  </ul> +</div>  {% endblock %} diff --git a/python/fatcat_web/templates/base.html b/python/fatcat_web/templates/base.html index 8cdc3fbf..73f33d0d 100644 --- a/python/fatcat_web/templates/base.html +++ b/python/fatcat_web/templates/base.html @@ -101,14 +101,17 @@  <main class="ui main container" style="margin-top: 6em; margin-bottom: 2em;" {% block main_extra_attr %}{% endblock %}>  {% with messages = get_flashed_messages() %}    {% if messages %} -    <div class="ui message"> +    <div class="ui info message" style="margin: 1em auto; max-width: 45em;">      {# Needs more javascript: <i class="close icon"></i> #} -    <div class="header">Flash Message!</div> -    <ul class="list"> -    {% for message in messages %} -      <li>{{ message|safe }} -    {% endfor %} -    </ul> +    {% if messages|length == 1 %} +      <div class="header">{{ messages[0]|safe }}</div> +    {% else %} +      <ul class="list"> +      {% for message in messages %} +        <li>{{ message|safe }} +      {% endfor %} +      </ul> +    {% endif %}      </div>    {% endif %}  {% endwith %} diff --git a/python/fatcat_web/templates/changelog.html b/python/fatcat_web/templates/changelog.html index 8b899d38..322f3e3b 100644 --- a/python/fatcat_web/templates/changelog.html +++ b/python/fatcat_web/templates/changelog.html @@ -7,9 +7,11 @@  <h1 class="ui header">Recent Changes  <div class="sub header"><code>changelog</code></div></h1> -Limited to the most recent entries. +<p>This is a feed of all the changes to the catalog, in the order that they are +accepted. Only the most recent entries are shown, but the API can be used to +inspect every change all the way back to the start. -<table class="ui table"> +<table class="ui small table">    <thead><tr><th>Changelog<br>Index               <th>Editgroup               <th>Description @@ -19,7 +21,7 @@ Limited to the most recent entries.            <br>{{ entry.timestamp.strftime("%Y-%m-%d %H:%M:%S") }}        <td>          {% if entry.editgroup.editor.is_bot %} -          <i class="icon bug"></i> +          <i class="icon server"></i>          {% else %}            <i class="icon user"></i>          {% endif %} @@ -28,10 +30,14 @@ Limited to the most recent entries.          </a></code>          <br>          <small><code><a href="/editgroup/{{ entry.editgroup.editgroup_id }}"> -          {{ entry.editgroup.editgroup_id }} +          editgroup_{{ entry.editgroup.editgroup_id }}          </a></code></small>        <td>{% if entry.editgroup.description != None %}{{ entry.editgroup.description }}{% endif %}    {% endfor %}  </table> +<div style="float: right; font-size: smaller;"> +  <a href="{{ config.FATCAT_API_HOST }}/changelog">As JSON via API</a> +</div> +  {% endblock %} diff --git a/python/fatcat_web/templates/container_edit.html b/python/fatcat_web/templates/container_edit.html index 99f77d53..1885197c 100644 --- a/python/fatcat_web/templates/container_edit.html +++ b/python/fatcat_web/templates/container_edit.html @@ -2,19 +2,14 @@  {% extends "base.html" %}  {% block body %} +  {% block edit_form_prefix %} +{{ edit_macros.edit_link_bar('container', existing_ident, 'form') }}  <div class="ui segment">  <h1 class="ui header">Edit Container Entity</h1>  <form class="ui form" id="edit_container_form" method="POST" action="{% if editgroup %}/editgroup/{{ editgroup.editgroup_id }}{% endif %}/container/{{ existing_ident }}/edit"> -  <p>Experienced users can also use the <a href="{% if editgroup -  %}/editgroup/{{ editgroup.editgroup_id }}{% endif %}/container/{{ -  existing_ident }}/edit/toml">TOML editing form</a> to access all metadata -  fields in a raw format. -  {% if not editgroup %} -    You can also <a href="/container/{{ existing_ident }}/delete">delete this entity</a>. -  {% endif %}  {% endblock %}    <p>See <a href="https://guide.fatcat.wiki/entity_container.html">the catalog diff --git a/python/fatcat_web/templates/container_search.html b/python/fatcat_web/templates/container_search.html index bd92dc2b..ec25fa8d 100644 --- a/python/fatcat_web/templates/container_search.html +++ b/python/fatcat_web/templates/container_search.html @@ -1,3 +1,4 @@ +{% import "entity_macros.html" as entity_macros %}  {% import "search_macros.html" as search_macros %}  {% extends "base.html" %} @@ -18,7 +19,7 @@      <form class="" role="search" action="/container/search" method="get">        <div class="ui form">          <div class="ui action input huge fluid"> -          <input type="text" placeholder="Query..." name="q" value="{% if query.q %}{{ query.q }}{% endif %}" aria-label="search container metadata"> <button class="ui button">Search</button> +          <input type="text" placeholder="Query..." name="q" value="{% if query.q %}{{ query.q }}{% endif %}" aria-label="search container metadata"> <button class="ui primary button">Search</button>          </div>          <br>Can also lookup by <b><a href="/container/lookup">identifier</a></b> or search <b><a href="/release/search?q={{ query.q or "" }}">releases</a></b>.        </div> @@ -35,6 +36,7 @@      {{ search_macros.top_results(query, found) }}      {% for entity in found.results %} +      {{ entity_macros.container_search_result_row(entity) }}        <div>          <h4 style="margin-top: 1em; margin-bottom: 4px; font-size: 1.1em;">            <a href="/container/{{ entity.ident }}" style="color: #2224c7;">{{ entity['name'] }}</a> diff --git a/python/fatcat_web/templates/container_view.html b/python/fatcat_web/templates/container_view.html index bdde6715..128741e5 100644 --- a/python/fatcat_web/templates/container_view.html +++ b/python/fatcat_web/templates/container_view.html @@ -46,14 +46,8 @@  </div>  <div class="column" style="flex: 0 0 24em;"> -{% if container._es and container._es.is_oa == True %} -<div class="ui segment top attached"> -  <i class="icon unlock huge orange"></i><b>Open Access Publication</b> -</div> -{% endif %} -  {% if container._stats %} -<div class="ui segment attached"> +<div class="ui segment top attached">    <div style="text-align: center;">      <div class="ui small statistic">        <div class="value">{{ "{:,}".format(container._stats.total) }}</div> @@ -61,6 +55,13 @@      </div>    </div>  </div> + +{% if container._es and container._es.is_oa == True %} +<div class="ui segment center aligned attached"> +  <i class="icon unlock large orange"></i><b>Open Access Publication</b> +</div> + +{% endif %}  {% if container._stats.total >= 1 %}    <div class="ui segment attached">      <b>Preservation Status</b><br> @@ -122,7 +123,8 @@    {% endif %}    {% if container._es.any_kbart == True %} -    <i class="icon check green"></i> In <a href="https://keepers.issn.org/?q=api/search&search[]=MUST=allissn={{ container.issnl }}&search[]=MUST_EXIST=keepers">Keepers Registery</a><br> +    <i class="icon check green"></i> In <a href="https://keepers.issn.org/?q=api/search&search[]=MUST=allissn={{ container.issnl }}&search[]=MUST_EXIST=keepers">Keepers Registery</a> +    <br>    {% elif container._es.any_kbart == False %}      <i class="icon times grey"></i> Not in <a href="https://keepers.issn.org/?q=api/search&search[]=MUST=allissn={{ container.issnl }}&search[]=MUST_EXIST=keepers">Keepers Registry</a><br>    {% endif %} @@ -133,6 +135,23 @@  </div>  {% endif %} +<div class="ui segment attached"> +<b>Preservation Holdings</b><br> +{%- if container.extra and container.extra.kbart %} +  {% for k, v in container.extra.kbart.items() %} +    <p><span style="text-transform: uppercase;">{{ k }}:</span> +    {% for span in v.year_spans %} +      {% if span|length >= 2 %} +        {{ span[0] }}-{{ span[1] }} +      {% elif span|length == 1 %} +        {{ span[0] }} +      {% endif %} +      {{ ", " if not loop.last }} +    {% endfor %} +  {% endfor %} +{% endif %} +</div> +  <div class="ui segment attached accordion">    <div class="title" style="padding: 0px;"><i class="dropdown icon"></i><b>Lookup Links</b></div>    <div class="content"> diff --git a/python/fatcat_web/templates/edit_macros.html b/python/fatcat_web/templates/edit_macros.html index d4839373..a7cf725b 100644 --- a/python/fatcat_web/templates/edit_macros.html +++ b/python/fatcat_web/templates/edit_macros.html @@ -1,4 +1,17 @@ +{% macro edit_link_bar(entity_type, existing_ident, view) -%} +  {% set has_form = entity_type in ['release', 'file', 'container'] %} +  <div class="ui {% if has_form %}four{% else %}three{% endif %} item menu"> +    <a class="item" href="/{{ entity_type }}/{{ existing_ident }}">View</a> +    {% if has_form %} +      <a class="item {% if view == 'form' %}active{% endif %}" href="/{{ entity_type }}/{{ existing_ident }}/edit">Edit Form</a> +    {% endif %} +    <a class="item {% if view == 'toml' %}active{% endif %}" href="/{{ entity_type }}/{{ existing_ident }}/edit/toml">Edit TOML</a> +    <a class="red item {% if view == 'delete' %}active{% endif %}" href="/{{ entity_type }}/{{ existing_ident }}/delete">Delete</a> +  </div> +{% endmacro %} + +  {% macro form_field_errors(field) -%}    {% if field.errors %}      <div class="ui pointing red label"> @@ -71,7 +84,7 @@            <div class="menu">              {% for peg in potential_editgroups %}                <div class="item" data-value="{{ peg.editgroup_id }}"> -                  <div class="right floated">{{ peg.created }}</div> +                  <div class="right floated">{{ peg.created.strftime('%Y-%m-%d %X') }}</div>                    <code><b>editgroup_{{ peg.editgroup_id }}</b></code>                    {% if peg.description %}                      <br>{{ peg.description[:200] }} diff --git a/python/fatcat_web/templates/editgroup_reviewable.html b/python/fatcat_web/templates/editgroup_reviewable.html index 4cfea697..ec1fc1f5 100644 --- a/python/fatcat_web/templates/editgroup_reviewable.html +++ b/python/fatcat_web/templates/editgroup_reviewable.html @@ -16,7 +16,7 @@ Limited to the most recent entries.    {% for editgroup in entries %}    <tr><td>          {% if editgroup.editor.is_bot %} -          <i class="icon bug"></i> +          <i class="icon server"></i>          {% else %}            <i class="icon user"></i>          {% endif %} diff --git a/python/fatcat_web/templates/editgroup_view.html b/python/fatcat_web/templates/editgroup_view.html index a36dc3e5..6a9793f7 100644 --- a/python/fatcat_web/templates/editgroup_view.html +++ b/python/fatcat_web/templates/editgroup_view.html @@ -12,9 +12,20 @@    <div class="ui divided list">      {% for edit in edits %}      <div class="item"> -      <div class="content"> +      <div class="content" style="padding-bottom: 0.5em;"> +        <div style="float: right; font-weight: bold;"> +          <a href="/editgroup/{{ editgroup.editgroup_id }}/{{ entity_type }}/{{ edit.ident }}">[view]</a> +          {% if auth_to.edit and not editgroup.changelog_index and not editgroup.submitted %} +            <br><a href="/editgroup/{{ editgroup.editgroup_id }}/{{ entity_type }}/{{ edit.ident }}/edit" style="color: green;">[re-edit]</a> +            <br> +            <form id="submit_edit_delete" method="POST" action="/editgroup/{{ editgroup.editgroup_id }}/{{ entity_type }}/edit/{{ edit.edit_id }}/delete" style="display:inline;"> +                <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> +                <input type="submit" value="[delete]" style="background:none; color: red; border: none; font-weight:bold; cursor:pointer; padding: 0;"></input> +            </form> +          {% endif %} +        </div>          <div class="header"> -          <a href="/{{ entity_type }}/{{ edit.ident }}">{{ entity_type }}/{{ edit.ident }}</a> +          <a href="/{{ entity_type }}/{{ edit.ident }}">{{ entity_type }}_{{ edit.ident }}</a>            {% if edit.redirect_ident %}              => redirect to <a href="/{{ entity_type }}/{{ edit.redirect_ident }}">{{ entity_type }}/{{ edit.redirect_ident }}</a>            {% elif not edit.revision %} @@ -24,14 +35,6 @@            {% else %}              updated            {% endif %} -          <a href="/editgroup/{{ editgroup.editgroup_id }}/{{ entity_type }}/{{ edit.ident }}">[view edit]</a> -          {% if auth_to.edit and not editgroup.changelog_index and not editgroup.submitted %} -            <a href="/editgroup/{{ editgroup.editgroup_id }}/{{ entity_type }}/{{ edit.ident }}/edit" style="color: green;">[re-edit]</a> -            <form id="submit_edit_delete" method="POST" action="/editgroup/{{ editgroup.editgroup_id }}/{{ entity_type }}/edit/{{ edit.edit_id }}/delete" style="display:inline;"> -                <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> -                <input type="submit" value="[delete-edit]" style="background:none; color: red; border: none; padding:9;font-weight:bold;cursor:pointer;"></input> -            </form> -          {% endif %}          </div>          {% if edit.revision %}            Revision: <small><code><a href="/{{ entity_type }}/rev/{{ edit.revision }}">{{ edit.revision }}</a></code></small> @@ -48,65 +51,126 @@  {# extended by changelog_entry #}  {% block editgroupheader %} -{% if not editgroup.changelog_index %} -  <div class="ui right floated center aligned segment"> -    {% if auth_to.accept %} -      <form id="submit_editgroup_form" method="POST" action="/editgroup/{{ editgroup.editgroup_id }}/accept"> -        <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> -        <button class="ui orange button">Accept Edits</button> -      </form><br> -    {% endif %} -    {% if auth_to.submit %} -      {% if editgroup.submitted %} -        <form id="submit_editgroup_form" method="POST" action="/editgroup/{{ editgroup.editgroup_id }}/unsubmit"> -          <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> -          <button class="ui button">Un-Submit</button> -        </form><br> -        <form id="submit_editgroup_form" method="POST" action="/editgroup/{{ editgroup.editgroup_id }}/submit"> -          <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> -          <button class="ui button">Re-Submit</button> -        </form> -      {% else %} -        <form id="submit_editgroup_form" method="POST" action="/editgroup/{{ editgroup.editgroup_id }}/submit"> -          <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> -          <button class="ui primary button">Submit</button> -        </form> -      {% endif %} -    {% endif %} + +<h1 class="ui header">Editgroup +<span class="sub header"><code>editgroup_{{ editgroup.editgroup_id }}</code></span></h1> + +{% if not auth_to.submit %} +<br clear="all"> +<div class="ui info small message"> +  <div class="header"> +    What is an editgroup?    </div> +  <p>An editgroup is a set of entity edits, bundled together into a coherent, reviewable bundle. +</div>  {% endif %} -<h1 class="ui header">Editgroup -<span class="sub header"><code>editgroup {{ editgroup.editgroup_id }}</code></span></h1> -{% endblock %} +<div class="ui three top attached ordered steps"> -<p><b>What is an editgroup?</b> -An editgroup is a set of entity edits, bundled together into a coherent, -reviewable bundle. -<br> +  {% if editgroup.changelog_index %} +    {% set editing_status = "completed" %} +    {% set submit_status = "completed" %} +    {% set accept_status = "completed" %} +  {% elif editgroup.submitted %} +    {% set editing_status = "completed" %} +    {% set submit_status = "completed" %} +    {% set accept_status = "active" %} +  {% else %} +    {% set editing_status = "completed" %} +    {% set submit_status = "active" %} +    {% set accept_status = "" %} +  {% endif %} -<br><b>Status:</b> -{% if editgroup.changelog_index %} -  Merged (<a href="/changelog/{{ editgroup.changelog_index }}">Changelog #{{ editgroup.changelog_index }}</a>) -{% elif editgroup.submitted %} -  Submitted ({{ editgroup.submitted.strftime("%Y-%m-%d %H:%M:%S") }}) -{% else %} -  Not Submitted -{% endif %} +  <div class="{{ editing_status }} step"> +    <div class="content"> +      <div class="title"> +        {% if not editgroup.changelog_index and auth_to.submit and editgroup.submitted %} +          <form id="submit_editgroup_form" method="POST" action="/editgroup/{{ editgroup.editgroup_id }}/unsubmit"> +            <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> +            <button class="ui primary compact small button" type="submit">Edit</button> +          </form> +        {% else %} +          Edit +        {% endif %} +      </div> +      <div class="description">Make changes to entities</div> +    </div> +  </div> + +  <div class="{{ submit_status }} step"> +    <div class="content"> +      <div class="title"> +        {% if not editgroup.changelog_index and auth_to.submit and not editgroup.submitted %} +          <form id="submit_editgroup_form" method="POST" action="/editgroup/{{ editgroup.editgroup_id }}/submit"> +            <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> +            <button class="ui primary compact small button" type="submit">Submit</button> +          </form> +        {% else %} +          Submitted +        {% endif %} +      </div> +      <div class="description">For review and feedback from others</div> +    </div> +  </div> + +  <div class="{{ accept_status }} step"> +    <div class="content"> +      <div class="title"> +        {% if not editgroup.changelog_index and auth_to.accept %} +          <form id="submit_editgroup_form" method="POST" action="/editgroup/{{ editgroup.editgroup_id }}/accept"> +            <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> +            <button class="ui primary compact small button" type="submit">Accept</button> +          </form> +        {% else %} +          Accepted +        {% endif %} +      </div> +      <div class="description">Changes added to catalog</div> +    </div> +  </div> + +</div> + +{% endblock %} + +<table class="ui fixed compact small definition table"> +  <tbody> +    <tr> +      <td class="three wide right aligned">Status</td> +      <td class="seven wide"> +        {% if editgroup.changelog_index %} +          Merged (<a href="/changelog/{{ editgroup.changelog_index }}">Changelog #{{ editgroup.changelog_index }}</a>) +        {% elif editgroup.submitted %} +          Submitted ({{ editgroup.submitted.strftime("%Y-%m-%d %H:%M:%S") }}) +        {% else %} +          Not Submitted +        {% endif %} +      </td> +    </tr> +    <tr> +      <td class="right aligned">Editor</td> +      <td> +        <a href="/editor/{{editgroup.editor_id}}">{{ editgroup.editor.username }}</a> +      </td> +    </tr> +    <tr> +      <td class="right aligned">Description</td> +      <td> +        {% if editgroup.description %} +          {{ editgroup.description }} +        {% else %} +          <i>none</i> +        {% endif %} +      </td> +    </tr> +</tbody></table> -<br><b>Editor:</b> <a href="/editor/{{editgroup.editor_id}}">{{ editgroup.editor.username }}</a> -<br><b>Description:</b> -{% if editgroup.description %} -  {{ editgroup.description }} -{% else %} -  <i>none</i> -{% endif %}  {% if editgroup.extra %}    <h4>Extra Metadata (raw JSON)</h4>    {{ entity_macros.extra_metadata(editgroup.extra) }}  {% endif %} -<br><br style="clear: both;"> +<h3 class="ui header">All Entity Changes</h3>  <div class="ui styled fluid accordion">    {{ edit_list(auth_to, editgroup, editgroup.edits.releases, "release", "Release") }}    {{ edit_list(auth_to, editgroup, editgroup.edits.works, "work", "Work") }} @@ -116,14 +180,17 @@ reviewable bundle.    {{ edit_list(auth_to, editgroup, editgroup.edits.filesets, "fileset", "File Set") }}    {{ edit_list(auth_to, editgroup, editgroup.edits.webcaptures, "webcapture", "Web Capture") }}  </div> +<div style="float: right; font-size: smaller;"> +  <a href="{{ config.FATCAT_API_HOST }}/editgroup/{{ editgroup.editgroup_id }}">As JSON via API</a> +</div>  <br> -<h2 class="ui header">Comments and Annotations</h2> +<h3 class="ui header">Comments and Annotations</h3>  {% for annotation in editgroup.annotations|reverse %}    <div class="ui segments">      <div class="ui top attached secondary segment">        {% if annotation.editor.is_bot %} -        <i class="icon bug"></i> +        <i class="icon server"></i>        {% else %}          <i class="icon user"></i>        {% endif %} @@ -168,7 +235,7 @@ reviewable bundle.        </div>        <i>Markdown is allowed</i>        <button class="ui right floated primary button"> -        <i class="icon edit"></i> Submit +        <i class="icon edit"></i> Post        </button>        <br>      </form><br> diff --git a/python/fatcat_web/templates/editor_annotations.html b/python/fatcat_web/templates/editor_annotations.html index c46039f5..7a8b53cf 100644 --- a/python/fatcat_web/templates/editor_annotations.html +++ b/python/fatcat_web/templates/editor_annotations.html @@ -1,16 +1,16 @@  {% extends "base.html" %}  {% block body %} -<h1 class="ui header">Comments and Annotations +<h1 class="ui header">{{ editor.username }}: Comments and Annotations  <div class="sub header"> -    <code>editor -      <a href="/editor/{{editor.editor_id}}">{{ editor.username }}</a> -    </code> -  </a> +  <code>editor_{{ editor.editor_id }}</code>  </div>  </h1> +<a href="/editor/{{ editor.editor_id }}/editgroups">Edit History</a> -  +<a href="/editor/{{ editor.editor_id }}/annotations">Comments and Annotation History</a>  <br> +<br>  {% for annotation in annotations %}    <div class="ui segments">      <div class="ui top attached secondary segment"> @@ -29,7 +29,7 @@      </div>    </div>  {% else %} -  <i>None!</i> +  <i>No comments or annotations for this editor!</i>  {% endfor %}  {% endblock %} diff --git a/python/fatcat_web/templates/editor_editgroups.html b/python/fatcat_web/templates/editor_editgroups.html index 3c3dd20d..756b3a02 100644 --- a/python/fatcat_web/templates/editor_editgroups.html +++ b/python/fatcat_web/templates/editor_editgroups.html @@ -1,15 +1,15 @@  {% extends "base.html" %}  {% block body %} -<h1 class="ui header">Edit History +<h1 class="ui header">{{ editor.username }}: Edit History  <div class="sub header"> -    <code>editor -      <a href="/editor/{{editor.editor_id}}">{{ editor.username }}</a> -    </code> -  </a> +  <code>editor_{{editor.editor_id}}</code>  </div>  </h1> +<a href="/editor/{{ editor.editor_id }}/editgroups">Edit History</a> -  +<a href="/editor/{{ editor.editor_id }}/annotations">Comments and Annotation History</a> +<br>  <table class="ui table">    <thead><tr>{# <th>Created (UTC) #}               <th>Status @@ -28,7 +28,7 @@              Work in Progress            {% endif %}        <td><small><code><a href="/editgroup/{{ editgroup.editgroup_id }}"> -            {{ editgroup.editgroup_id }} +            editgroup_{{ editgroup.editgroup_id }}            </a></code></small>        <td>{% if editgroup.description != None %}{{ editgroup.description }}{% endif %}    {% endfor %} diff --git a/python/fatcat_web/templates/editor_view.html b/python/fatcat_web/templates/editor_view.html index 6ac58e3d..5906af75 100644 --- a/python/fatcat_web/templates/editor_view.html +++ b/python/fatcat_web/templates/editor_view.html @@ -6,11 +6,20 @@  <h1 class="ui header">{{ editor.username }}  <div class="sub header"> -  <code>editor {{ editor.editor_id }}</code> +  <code>editor_{{ editor.editor_id }}</code>  </div>  </h1> -<p><b><a href="/editor/{{ editor.editor_id }}/editgroups">Edit History</a></b> -<p><b><a href="/editor/{{ editor.editor_id }}/annotations">Comments and Annotation History</a></b> +<a href="/editor/{{ editor.editor_id }}/editgroups">Edit History</a> -  +<a href="/editor/{{ editor.editor_id }}/annotations">Comments and Annotation History</a> + +<br> +<br> +<div class="ui small info message"> +  <div class="header"> +    This page is intentionally bare +  </div> +  <p>We don't have much to share about individual editors. +</div>  {% endblock %} diff --git a/python/fatcat_web/templates/entity_delete.html b/python/fatcat_web/templates/entity_delete.html index b2e13af4..5f677992 100644 --- a/python/fatcat_web/templates/entity_delete.html +++ b/python/fatcat_web/templates/entity_delete.html @@ -2,6 +2,9 @@  {% extends "base.html" %}  {% block body %} + +{{ edit_macros.edit_link_bar(entity_type, existing_ident, 'delete') }} +  {% block edit_form_prefix %}    <div class="ui segment">    <h1 class="ui header">Delete Entity</h1> diff --git a/python/fatcat_web/templates/entity_edit_toml.html b/python/fatcat_web/templates/entity_edit_toml.html index 64768d6e..1ff9010d 100644 --- a/python/fatcat_web/templates/entity_edit_toml.html +++ b/python/fatcat_web/templates/entity_edit_toml.html @@ -2,15 +2,14 @@  {% extends "base.html" %}  {% block body %} +  {% block edit_form_prefix %} +  {{ edit_macros.edit_link_bar(entity_type, existing_ident, 'toml') }}    <div class="ui segment"> -  <h1 class="ui header">Edit Entity (TOML mode)</h1> +  <h1 class="ui header">Edit Entity</h1>    <form class="ui form" id="edit_toml_form" method="POST" action="{% if editgroup and editgroup.editgroup_id %}/editgroup/{{ editgroup.editgroup_id }}{% endif %}/{{ entity_type }}/{{ existing_ident }}/edit/toml"> -  {% if not editgroup %} -    <p>You can also <a href="/{{ entity_type }}/{{ existing_ident }}/delete">delete this entity</a>. -  {% endif %}  {% endblock %}    <p>See <a href="https://guide.fatcat.wiki/entity_release.html">the catalog diff --git a/python/fatcat_web/templates/entity_history.html b/python/fatcat_web/templates/entity_history.html index c9f45d84..0115b845 100644 --- a/python/fatcat_web/templates/entity_history.html +++ b/python/fatcat_web/templates/entity_history.html @@ -3,9 +3,9 @@  {% block entity_main %} -<h3 class="ui header">Edit History</h3> +<h3 class="ui header">Entity Edit History</h3> -This table only shows <i>merged</i> edits, not work-in-progress. +This table only shows <i>accepted</i> edits included in the catalog, not any work-in-progress.  <table class="ui table">    <thead><tr><th>Changelog @@ -17,7 +17,7 @@ This table only shows <i>merged</i> edits, not work-in-progress.            <br>{{ entry.changelog_entry.timestamp.strftime("%Y-%m-%d %H:%M") }}        <td>          {% if entry.editgroup.editor.is_bot %} -          <i class="icon bug"></i> +          <i class="icon server"></i>          {% else %}            <i class="icon user"></i>          {% endif %} @@ -34,5 +34,9 @@ This table only shows <i>merged</i> edits, not work-in-progress.        <td>{% if entry.editgroup.description != None %}{{ entry.editgroup.description }}{% endif %}    {% endfor %}  </table> +<div style="float: right; font-size: smaller;"> +  <a href="{{ config.FATCAT_API_HOST }}/{{ entity_type }}/{{ entity.ident }}/history">As JSON via API</a> +</div> +  {% endblock %} diff --git a/python/fatcat_web/templates/entity_macros.html b/python/fatcat_web/templates/entity_macros.html index e8a763d2..45f00362 100644 --- a/python/fatcat_web/templates/entity_macros.html +++ b/python/fatcat_web/templates/entity_macros.html @@ -5,15 +5,15 @@    <div class="ui segment pink inverted attached">    {% if editgroup.changelog_index %}      <b>Accepted Edit Version</b> -    <p>This is the version of the entity as of a specific merged editgroup: +    <p>This is the version of the entity as of a specific point in time:    {% elif editgroup.submitted %}      <b>Submitted Edit Version</b> -    <p>This is a version of the entity that has been submitted for approval as part of an editgroup: +    <p>This is a version of the entity that has been submitted for approval as part of:    {% else %}      <b>Edit In Progress</b> -    <p>This is a version of the entity that has not yet been submitted for approval, part of an editgroup: +    <p>This is a version of the entity that has not yet been submitted for approval. Part of:    {% endif %} -  <b><a href="/editgroup/{{ editgroup.editgroup_id }}" style="color: white; font-weight: bold;">{{ editgroup.editgroup_id }}</a></b> +  <a href="/editgroup/{{ editgroup.editgroup_id }}" style="color: white; font-weight: bold; font-size: smaller;"><code>editgroup_{{ editgroup.editgroup_id }}</code></a>    </div>  {% elif entity.state == None and entity.ident == None %}  <div class="ui segment pink inverted attached"> @@ -27,17 +27,15 @@  </div>  {% endif %} -<div class="ui segment attached"> -  <b>Fatcat Bits</b> -  <p> -  {% if entity.state %} -    State is "{{ entity.state }}". +<div class="ui segment attached" style="white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"> +  <b>Catalog Record</b> +  {% if entity.state and entity.state != "active" %} +    <br>State: <code>{{ entity.state }}</code>    {% endif %}    {% if entity.revision %} -    Revision: -    <br><small><code><a href="/{{ entity_type }}/rev/{{ entity.revision }}">{{ entity.revision }}</a></code></small> +    <br>Revision: <small><code><a href="/{{ entity_type }}/rev/{{ entity.revision }}">{{ entity.revision }}</a></code></small>    {% endif %} -  <br><a href=" +  <br>API URL: <a href="    {%- if config.FATCAT_DOMAIN == 'dev.fatcat.wiki' -%}      http://localhost:9411    {%- else -%} @@ -52,7 +50,7 @@      /{{ entity_type }}/rev/{{ entity.revision }}    {% endif %}    {% if expand %}?expand={{ expand}}{% endif %}"> -  As JSON object via API +  JSON    </a>  </div> @@ -180,11 +178,20 @@    </h4> -  {% if paper.best_pdf_url %}    <div style="float: right; padding: 4px;"> -    <a href="{{ paper.best_pdf_url }}" class="ui violet tag label"><i class="file icon"></i>fulltext</a> +       +    {% if paper.preservation == "bright" %} +      {% if paper.best_pdf_url %} +        <a href="{{ paper.best_pdf_url }}" class="ui green label" style="background-color: #2ca048;"><i class="file icon"></i>bright archive</a> +      {% else %} +        <span class="ui green label" style="background-color: #2ca048;">bright archive</span> +      {% endif %} +    {% elif paper.preservation == "dark" %} +      <span class="ui green label" style="background-color: #6e7b71;">dark archive</span> +    {% else %} +      <span class="ui grey label" style="background-color: #b71818;">no archive</span> +    {% endif %}    </div> -  {% endif %}    {# ### AUTHOR ROW #}    {% if paper.contrib_names %} @@ -232,15 +239,23 @@    {% if paper.doi %}      <a href="https://doi.org/{{paper.doi }}" style="color: green;">doi:{{ paper.doi }}</a>      {% endif %} -  {% if paper.pmid %} -    <a href="https://www.ncbi.nlm.nih.gov/pubmed/{{paper.pmid }}" style="color: green;">pmid:{{ paper.pmid }}</a>   -  {% endif %}    {% if paper.pmcid %}      <a href="https://pubmed.ncbi.nlm.nih.gov/{{paper.pmcid }}/" style="color: green;">pmcid:{{ paper.pmcid }}</a>   +  {% elif paper.pmid %} +    <a href="https://www.ncbi.nlm.nih.gov/pubmed/{{paper.pmid }}" style="color: green;">pmid:{{ paper.pmid }}</a>      {% endif %}    {% if paper.arxiv_id %}      <a href="https://arxiv.org/abs/{{paper.arxiv_id }}" style="color: green;">arXiv:{{ paper.arxiv_id }}</a>      {% endif %} +  {% if paper.jstor_id %} +    <a href="https://jstor.org/stable/{{paper.jstor_id }}/" style="color: green;">jstor:{{ paper.jstor_id }}</a>   +  {% endif %} +  {% if paper.doaj_id %} +    <a href="https://doaj.org/article/{{paper.doaj_id }}/" style="color: green;">doaj:{{ paper.doaj_id }}</a>   +  {% endif %} +  {% if paper.doaj_id %} +    <a href="https://dblp.org/rec/{{ paper.dblp_id }}.html" style="color: green;">dblp:{{ paper.dblp_id }}</a>   +  {% endif %}  {# WIP: elastic release work grouping searches    <br> @@ -250,6 +265,26 @@  </div>  {% endmacro %} + +{% macro container_search_result_row(entity) -%} +  <div> +    <h4 style="margin-top: 1em; margin-bottom: 4px; font-size: 1.1em;"> +      <a href="/container/{{ entity.ident }}" style="color: #2224c7;">{{ entity['name'] }}</a> +      {% if entity.is_oa %}<i class="icon unlock orange small"></i>{% endif %} +    </h4> +    {% if entity.publisher %} +      <h5 style="margin-top: 4px; margin-bottom: 0px; font-size: 1em;">{{ entity.publisher }}</h5> +    {% endif %} +    {% if entity.issnl %} +      <a href="https://portal.issn.org/resource/ISSN/{{entity.issnl }}" style="color: green;">issn:{{ entity.issnl }}</a> +    {% endif %} +    {% if entity.container_type %} +       {{ entity.container_type }} +    {% endif %} +  </div> +{% endmacro %} + +  {% macro progress_color(frac) -%}  {% if frac >= 1 %}  green diff --git a/python/fatcat_web/templates/entity_view_metadata.html b/python/fatcat_web/templates/entity_view_metadata.html index 5ce97d10..90ce25d9 100644 --- a/python/fatcat_web/templates/entity_view_metadata.html +++ b/python/fatcat_web/templates/entity_view_metadata.html @@ -4,13 +4,16 @@  {% block entity_main %} +<h3>Entity Metadata (schema)</h3> +{{ entity_macros.extra_metadata(entity._metadata) }} +<div style="float: right;"> +  <a href="{{ config.FATCAT_API_HOST }}/{{ entity_type }}/{{ entity.ident }}">As JSON via API</a> +</div> +  {% if entity.extra %}    <h3>Extra Metadata (raw JSON)</h3>    {{ entity_macros.extra_metadata(entity.extra) }}  {% endif %} -<h3>Entity Metadata (schema)</h3> -{{ entity_macros.extra_metadata(entity._metadata) }} -  {% endblock %} diff --git a/python/fatcat_web/templates/file_edit.html b/python/fatcat_web/templates/file_edit.html index 745b0c41..b7ff1d72 100644 --- a/python/fatcat_web/templates/file_edit.html +++ b/python/fatcat_web/templates/file_edit.html @@ -2,19 +2,14 @@  {% extends "base.html" %}  {% block body %} +  {% block edit_form_prefix %} +{{ edit_macros.edit_link_bar(entity_type, existing_ident) }}  <div class="ui segment">  <h1 class="ui header">Edit File Entity</h1>  <form class="ui form" id="edit_file_form" method="POST" action="{% if editgroup %}/editgroup/{{ editgroup.editgroup_id }}{% endif %}/file/{{ existing_ident }}/edit"> -  <p>Experienced users can also use the <a href="{% if editgroup -  %}/editgroup/{{ editgroup.editgroup_id }}{% endif %}/file/{{ -  existing_ident }}/edit/toml">TOML editing form</a> to access all metadata -  fields in a raw format. -  {% if not editgroup %} -    You can also <a href="/file/{{ existing_ident }}/delete">delete this entity</a>. -  {% endif %}  {% endblock %}    <p>See <a href="https://guide.fatcat.wiki/entity_file.html">the catalog diff --git a/python/fatcat_web/templates/file_view.html b/python/fatcat_web/templates/file_view.html index 02f47a91..608a2a0a 100644 --- a/python/fatcat_web/templates/file_view.html +++ b/python/fatcat_web/templates/file_view.html @@ -8,23 +8,23 @@  <div class="ui stackable mobile reversed grid centered">  <div class="column" style="font-size: 16px; flex: 1;"> -<h3>Releases</h3> +<h3>Associated Releases</h3>  {% if entity.releases != [] %}    {{ entity_macros.release_list(entity.releases) }}  {% else %}    <p> -  This file is not associated with any fatcat release. +  This file is not associated with any release entity! This makes a is a stub entry in the catalog.  {% endif %} -<h3>URLs</h3> +<h3>Public Access URLs</h3>  {% if file.urls != None %}    {{ entity_macros.url_list(file.urls) }}  {% else %} -No known public URL, mirror, or archive for this file. +No known archives or mirrors of this file.  {% endif %} -<h3>Checksums</h3> +<h3>Data Integrity Checksums</h3>  <table class="ui definition single line fixed compact small unstackable table">    <tbody>      {% if file.sha1 != None %} @@ -45,22 +45,23 @@ No known public URL, mirror, or archive for this file.  <div class="column" style="flex: 0 0 24em;">  {% if file._es and file._es.best_url %} -<a href="{{ file._es.best_url }}" class="ui top attached fluid huge green button"><i class="file icon"></i>Download File</a> +  {# TODO: this currently shows *any* file, though prefers archive.org #} +  <a href="{{ file._es.best_url }}" class="ui fluid huge black button" style="text-decoration: underline;"> +    <i class="file icon"></i>View Archived File +  </a>  {% else %} -<span class="ui top attached fluid huge grey button"><i class="file cross icon"></i>No Download Available</span> +  <span class="ui fluid huge grey segment"><i class="file cross icon"></i>No Public URL</span>  {% endif %} +<br> -{% if file.size != None %} -<div class="ui segment attached"> -  <p><b>Size</b>  {{ file.size|filesizeformat }} +<div class="ui top segment attached"> +  {% if file.size != None %} +    <b>Size</b>  {{ file.size|filesizeformat }}<br> +  {% endif %} +  {% if file.mimetype != None %} +    <b>MIME Type</b>  <code>{{ file.mimetype }}</code><br> +  {% endif %}  </div> -{% endif %} - -{% if file.mimetype != None %} -<div class="ui segment attached"> -  <p><b>File Type</b>  <code>{{ file.mimetype }}</code> -</div> -{% endif %}  {{ entity_macros.fatcat_bits(entity, "file", "", editgroup) }} diff --git a/python/fatcat_web/templates/fileset_view.html b/python/fatcat_web/templates/fileset_view.html index 27d5b6da..4e8bfbad 100644 --- a/python/fatcat_web/templates/fileset_view.html +++ b/python/fatcat_web/templates/fileset_view.html @@ -8,14 +8,20 @@  <div class="ui stackable mobile reversed grid centered">  <div class="column" style="font-size: 16px; flex: 1;"> -<h3>Releases</h3> +<h3>Associated Releases</h3>  {% if entity.releases != [] %}    {{ entity_macros.release_list(entity.releases) }}  {% else %}    <p>    This File Set is not associated with any fatcat release.  {% endif %} -  + +<h3>Public Access URLs</h3> +{% if entity.urls %} +  {{ entity_macros.url_list(entity.urls) }} +{% else %} +No known public URL, mirror, or archive for this File Set. +{% endif %}  <h3>File Manifest ({{ fileset.manifest|count }})</h3>  {% if fileset.manifest %} @@ -40,14 +46,6 @@ This File Set is empty (contains no files).  {% endif %} -<br> -<h3>Base URLs</h3> -{% if entity.urls %} -  {{ entity_macros.url_list(entity.urls) }} -{% else %} -No known public URL, mirror, or archive for this File Set. -{% endif %} -  </div>  <div class="column" style="flex: 0 0 24em;"> diff --git a/python/fatcat_web/templates/home.html b/python/fatcat_web/templates/home.html index 4288017e..a90b0fb7 100644 --- a/python/fatcat_web/templates/home.html +++ b/python/fatcat_web/templates/home.html @@ -32,17 +32,17 @@      <div class="row">        <div class="four wide mobile three wide center aligned column">          <a href="/stats" style="color: black;"> -          <h4>110,814,532<br>Papers</h4> +          <h4>116,741,069<br>Papers</h4>          </a>        </div>        <div class="four wide mobile three wide center aligned column">          <a href="/stats" style="color: black;"> -          <h4>26,173,743<br>Fulltext</h4> +          <h4>28,751,063<br>Accessible</h4>          </a>        </div>        <div class="four wide mobile three wide center aligned column">          <a href="/stats" style="color: black;"> -          <h4>151,707<br>Journals</h4> +          <h4>177,158<br>Journals</h4>          </a>        </div>      </div> @@ -53,20 +53,19 @@  <div class="ui vertical stripe segment" style="padding-top: 2em; padding-bottom: 2em;">    <div class="ui text container" style="max-width: 800px!important;">    <div class="ui centered grid"> -    <div class="row"> +    <div class="stackable row">        <div class="four wide column">          <!-- TODO: don't let it scale down -->          <img src="/static/paper_man_confused.gif" width="130" alt="confused paper man">        </div>        <div class="twelve wide column" style="font-size: 1.2rem;"> -        <p><b>Fatcat is a versioned, user-editable catalog of research +        <p>Fatcat is a versioned, user-editable catalog of research          publications including journal articles, conference proceedings, and -        datasets</b> +        datasets.          <p>Features include archival file-level metadata (verified digests and -        long-term copies), an -        <b><a href="https://api.{{ config.FATCAT_DOMAIN }}">open, documented API</a></b>, -        and work/release indexing (eg, distinguishing between and linking -        pre-prints, manuscripts, and version-of-record). +        long-term copies), a <b><a href="/coverage/search">preservation coverage visualizer</a></b>, work/edition grouping, an +        <b><a href="https://api.{{ config.FATCAT_DOMAIN }}">open API</a></b>, +        and public metadata dumps.           <a href="/about">Read more...</a>        </div>      </div> @@ -74,18 +73,37 @@    </div>  </div> +<div class="ui vertical stripe segment" style="padding-top: 2em; padding-bottom: 2em;"> +  <div class="ui text container" style="max-width: 1200px!important;"> +  <div class="ui middle aligned divided centered grid"> +    <div class="stackable row"> +      <div class="eight wide column" style="font-size: 1.6rem; text-align: center;"> +        <p>Our goal is to ensure long-term access to research content on the +        "scholarly web" by tracking holes in preservation coverage across +        digital preservation efforts +      </div> +      <div class="seven wide column"> +        <a href="/coverage/search?q=is_oa%3Atrue+year%3A%3E1995+year%3A%3C%3D2019+%28type%3Aarticle-journal+OR+type%3Aarticle+OR+type%3Apaper-conference%29+%21doi_prefix%3A10.5281+%21doi_prefix%3A10.6084"> +          <img alt="coverage visualization tool" src="/static/fatcat_oa_preservation_jan2021.svg" style="width: 100%;"> +        </a> +      </div> +    </div> +  </div> +  </div> +</div> +  <div class="ui vertical stripe segment" style="padding-top: 2em; padding-bottom: 2em; background-color: #F5F5F5;">    <div class="ui text container" style="max-width: 800px!important;">    <div class="ui centered grid"> -    <div class="row"> +    <div class="stackable row">        <div class="twelve wide column" style="font-size: 1.2rem;">          <p>This service is hosted at the <b><a          href="https://archive.org">Internet Archive</a></b>, a US          non-profit digital library dedicated to providing Universal Access to All Knowledge.          <a href="https://archive.org/donate/">Donations welcome!</a> -        <p>Development funding comes from -        <b><a href="https://blog.archive.org/2018/03/05/andrew-w-mellon-foundation-awards-grant-to-the-internet-archive-for-long-tail-journal-preservation/">The Andrew Mellon Foundation</a></b> -        to improve preservation and access to "long-tail" open access works on +        <p>Development for this project funding comes from +        <b><a href="https://blog.archive.org/2018/03/05/andrew-w-mellon-foundation-awards-grant-to-the-internet-archive-for-long-tail-journal-preservation/">The Andrew Mellon Foundation</a></b>, +        specifically to capture "long-tail" open access works on          the public web which might otherwise be lost.        </div>        <div class="four wide column"> @@ -96,6 +114,26 @@    </div>  </div> +<div class="ui vertical stripe segment" style="padding-top: 2em; padding-bottom: 2em;"> +  <div class="ui text container" style="max-width: 800px!important;"> +  <div class="ui centered grid"> +    <div class="stackable row"> +      <div class="four wide column"> +        <a href="https://scholar-qa.archive.org"> +          <img src="/static/scholar-vaporwave-logo-small.png" width="170" alt="IA scholar logo"> +        </a> +      </div> +      <div class="twelve wide column" style="font-size: 1.2rem;"> +        <p><b><a href="https://scholar-qa.archive.org">Internet Archive Scholar</a></b> +        is a sibling service, built on the Fatcat catalog, providing end-user +        access to and full-text search over research content across the +        Internet Archive's various holdings. +      </div> +    </div> +  </div> +  </div> +</div> +  <div class="ui vertical stripe segment" style="background-color: #fffaf3; color: #573a08;">    <div class="ui text container">    <div class="ui centered grid"> @@ -110,6 +148,8 @@    </div>  </div> +</div> +  <div class="ui center aligned container">  <br> @@ -118,7 +158,6 @@  </h2>  <br> -  {# this div makes the table scrollable on mobile #}  <div style="max-width: 100%; overflow-x: auto;">  <table class="ui single line unstackable table centered" style="max-width: 800px; font-size: 1.1rem; margin-right: auto; margin-left: auto;"> diff --git a/python/fatcat_web/templates/release_edit.html b/python/fatcat_web/templates/release_edit.html index c26c9850..0ac94be9 100644 --- a/python/fatcat_web/templates/release_edit.html +++ b/python/fatcat_web/templates/release_edit.html @@ -2,7 +2,9 @@  {% extends "base.html" %}  {% block body %} +  {% block edit_form_prefix %} +{{ edit_macros.edit_link_bar('release', existing_ident, 'form') }}  <div class="ui segment">  <h1 class="ui header">Edit Release Entity</h1> diff --git a/python/fatcat_web/templates/release_save.html b/python/fatcat_web/templates/release_save.html index 29875d3d..7dd01fc0 100644 --- a/python/fatcat_web/templates/release_save.html +++ b/python/fatcat_web/templates/release_save.html @@ -13,14 +13,14 @@  {% if spn_status == "not-configured" %} -<div class="ui error message" style="margin: 2em;"> -  <div class="header">Error</div> +<div class="ui error message" style="margin-top: 2em;"> +  <div class="header">Not Available</div>    <p>Save Paper Now feature isn't configured, sorry about that.  </div>  {% elif spn_status == "kafka-error" %} -<div class="ui error message" style="margin: 2em;"> +<div class="ui error message" style="margin-top: 2em;">    <div class="header">Error</div>    <p>Whoops, something went wrong and we couldn't enqueue your request. This    didn't have anything to do with the URL you supplied; please try again later. @@ -28,7 +28,7 @@  {% elif spn_status == "success" %} -<div class="ui positive message" style="margin: 2em;"> +<div class="ui positive message" style="margin-top: 2em;">    <div class="header">Success</div>    <p>URL has been submitted to the bot queue for crawling. If fulltext content    is found, it will be imported into the catalog for review. Keep an eye on the @@ -40,15 +40,24 @@  <form class="ui form" id="save_release_form" method="POST" action="/release/{{ release.ident }}/save">    <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> -  <br> -  <p>Know of a legit fulltext copy of this publication on the public web? -  Tell us the URL and we will crawl it and provide free perpetual access. +  <p>If you know of a legitimate public web access option for this work, you +  can help us preserve it by filling out the form below. Using the Wayback +  Machine's <a href="https://web.archive.org/save">"Save Page Now"</a> feature, +  we will attempt to crawl, process, and verify the content and add it to the +  catalog. -  {{ edit_macros.form_field_basic(form.base_url) }} +  <p style="margin-top: 1em; margin-bottom: 1em;">If you are the author of this +  work, and the published version is not publicly available, another option is +  to upload an version to an institutional or discipline repository. The +  <a href="https://shareyourpaper.org/">Share Your Paper</a> tool can help with +  this process. -  <p style="margin-top: 2em; margin-bottom: 2em;"><b>Important:</b> check the publication stage of the file you are -  submitting. We distinguish between pre-prints, manuscripts, and the -  published version of record (if applicable). +  <p style="margin-top: 1em; margin-bottom: 1em;"><b>Important:</b> +  double-check the publication stage of the file you are submitting. We +  distinguish between pre-prints, manuscripts, and the published version of +  record (if applicable). + +  {{ edit_macros.form_field_basic(form.base_url) }}    <div class="ui equal width fields">      {{ edit_macros.form_field_basic(form.release_stage) }} diff --git a/python/fatcat_web/templates/release_search.html b/python/fatcat_web/templates/release_search.html index b1021322..59a234c0 100644 --- a/python/fatcat_web/templates/release_search.html +++ b/python/fatcat_web/templates/release_search.html @@ -24,7 +24,7 @@          </div>          <div class="ui checkbox" style="float: right; margin: 1em;">            <input type="checkbox" name="fulltext_only" id="fulltext_only" value="true" {% if query.fulltext_only %}checked{% endif %}> -          <label for="fulltext_only">Fulltext Available Only</label> +          <label for="fulltext_only">Only public full-text</label>          </div>          <br>Can also lookup by <b><a href="/release/lookup">identifier</a></b> or search for <b><a href="/container/search?q={{ query.q or "" }}">containers</a></b> (eg, journals).        </div> @@ -35,6 +35,16 @@  <div class="ui container text">  <br> +{% if container_found and container_found.results %} +  <div class="ui tiny info floating message" style="margin: 0em auto; max-width: 40em;"> +    <div class="header">Were you looking for this journal, instead of publications?</div> +    <div style="padding-left: 0.5em;"> +      {{ entity_macros.container_search_result_row(container_found.results[0]) }} +    </div> +  </div> +  <br clear="all"> +{% endif %} +  {% if found %}    {% if found.results %} diff --git a/python/fatcat_web/templates/release_view.html b/python/fatcat_web/templates/release_view.html index cc9cf5fe..9464fda2 100644 --- a/python/fatcat_web/templates/release_view.html +++ b/python/fatcat_web/templates/release_view.html @@ -79,23 +79,16 @@  <div class="ui stackable mobile reversed grid centered">  <div class="column" style="font-size: 16px; flex: 1;"> -{% if release.abstracts != [] %} -<h3>Abstract</h3> -<p><span itemprop="description">{{ release.abstracts[0].content }}</span> -<br><small><i>In <code>{{ release.abstracts[0].mimetype }}</code> format</i></small> -{% endif %} - -<div class="ui accordion">  <div class="title" itemprop="isPartOf" itemscope itemtype="http://schema.org/Periodical" itemid="#container">    {% if release.release_stage == 'published' %} -    <i class="dropdown icon"></i>Published +    Published      {% if release.container.ident %}        in <a href="/container/{{ release.container.ident }}"><span itemprop="name">{{ release.container.name }}</span></a>      {% elif release.extra and release.extra.container_name %}        in <span itemprop="name">{{ release.extra.container_name }}</span>      {% endif %}    {% else %} -    <i class="dropdown icon"></i>Released +    Released      {% if release.release_type %}        as a <i>{{ release.release_type }}</i>      {% endif %} @@ -105,84 +98,41 @@    {% endif %}    {% if release.publisher %}      by <span itemprop="publisher">{{ release.publisher }}</span> -  {% endif %} -</div><div class="content" itemscope itemtype="http://schema.org/Periodical" itemid="#container"> -  <table class="ui definition single line fixed compact small collapsing unstackable table" style="width: 100%;"> -  <tbody> -    {% if release.number != None %} -      <tr><td class="three wide right aligned">Number</td> -          <td class="seven wide">{{ release.number }} -    {% endif %} -    {% if release.version != None %} -      <tr><td class="three wide right aligned">Version</td> -          <td class="seven wide">{{ release.version }} -    {% endif %} -    {% if release.container != None and release.container.issnl != None %} -      <tr><td class="three wide right aligned">ISSN-L</td> -          <td class="seven wide" itemprop="issn">{{ release.container.issnl }} -    {% endif %} -    {% if release.volume != None %} -      <tr itemprop="isPartOf" itemscope itemtype="http://schema.org/PublicationVolume"> -          <td class="right aligned">Volume</td> -          <td class="" itemprop="volumeNumber">{{ release.volume }} -    {% endif %} -    {% if release.issue != None %} -      <tr itemprop="isPartOf" itemscope itemtype="http://schema.org/PublicationIssue"> -          <td class="right aligned">Issue</td> -          <td class="" itemprop="issueNumber">{{ release.issue }} -    {% endif %} -    {% if release.pages != None %} -      <tr itemprop="isPartOf" itemscope itemtype="http://schema.org/PublicationIssue"> -          <td class="right aligned">Page(s)</td> -          <td class="" itemprop="pagination">{{ release.pages }} -    {% endif %} -    {% if release.release_date != None %} -      <tr><td class="right aligned">Release Date</td> -          <td class="">{{ release.release_date }} -    {% elif release.release_year != None %} -      <tr><td class="three wide right aligned">Release Year</td> -          <td class="seven wide">{{ release.release_year }} -    {% endif %} -    {% if release.container != None and release.container.container_type != None %} -      <tr><td class="right aligned">Container Type</td> -          <td class="">{{ release.container.container_type }} -    {% endif %} -    {% if release.publisher != None %} -      <tr><td class="three wide right aligned">Publisher</td> -          <td class="seven wide">{{ release.publisher }} -    {% endif %} -    {% if release.language != None %} -      <tr><td class="right aligned">Primary Language</td> -          <td class=""><code>{{ release.language }}</code> -          (<a href="https://www.loc.gov/standards/iso639-2/php/langcodes_name.php?iso_639_1={{ release.language }}">lookup</a>) -    {% endif %} +  {% endif %}. -  </tbody> -  </table> -</div> +  <p> +  {% if release.volume != None %} +    Volume {{ release.volume }} +    {%- if release.issue != None %}, {% endif %} +  {% endif %} +  {% if release.issue != None %} +    Issue {{ release.issue}} +  {% endif %} +  {% if release.pages != None %} +    {% if release.pages[0].isdigit() %}p{% endif -%} +    {{ release.pages }} +  {% endif %} +  {% if release.release_year != None %} +    ({{ release.release_year }}) +  {% endif %}  </div> +{% if release.abstracts != [] %} +  <h3>Abstract</h3> +  <p><span itemprop="description">{{ release.abstracts[0].content }}</span> +  <br><small><i>In <code>{{ release.abstracts[0].mimetype }}</code> format</i></small> +{% endif %} +  {% if entity.state == 'active' %} -<h3>Known Files and URLs</h3> +<h3>Archived Files and Locations</h3>  {% if entity.files != [] %}  <table class="ui compact fixed table"> -<!-- -  <thead> -    <tr><th>SHA-1 -        <th>Size (bytes) -        <th>File Type -        <th>Links -  </thead> --->    <tbody>    {% for file in entity.files %}    <tr><td>{% if file.mimetype != None %}{{ file.mimetype }}  {% endif %}            {% if file.size != None %}{{ file.size|filesizeformat }}{% endif %}        <br><small><code><a href="/file/{{ file.ident }}"> -            {% if file.sha1 != None %}sha1:{{ file.sha1[:20] + "..." }} -            {% elif file.sha256!= None %}sha256:{{ file.md5[:20] + "..." }} -            {% elif file.md5 != None %}md5:{{ file.md5[:20] + "..." }} -            {% endif %} +            file_{{ file.ident }}          </a></code></small>        <td class="single line">          {% for url in file.urls[:5] %} @@ -208,7 +158,7 @@ accessible version.    <tbody>    {% for fileset in entity.filesets %}    <tr><td>{{ fileset.manifest|count }} files  {{ fileset._total_size|filesizeformat }} -      <br><small><code><a href="/fileset/{{ fileset.ident }}">fileset:{{ fileset.ident }}</a></code></small> +      <br><small><code><a href="/fileset/{{ fileset.ident }}">fileset_{{ fileset.ident }}</a></code></small>        <td class="single line">          {% for url in fileset.urls[:5] %}            {% if url.rel == "dweb" %} @@ -234,7 +184,7 @@ accessible version.    {% for webcapture in entity.webcaptures %}    <tr><td><b><a href="{{ webcapture.original_url }}" style="color: black;">{{ webcapture.original_url }}</a></b>        <br>{{ webcapture.timestamp.strftime("%Y-%m-%d %H:%M:%S") }} | {{ webcapture.cdx|count }} resources -      <br><small><code><a href="/webcapture/{{ webcapture.ident }}">webcapture:{{ webcapture.ident }}</a></code></small> +      <br><small><code><a href="/webcapture/{{ webcapture.ident }}">webcapture_{{ webcapture.ident }}</a></code></small>        <td class="single line">          {% for url in webcapture.archive_urls[:5] %}            <a href="{{ url.url }}{% if url.rel == "wayback" %}{{ webcapture._wayback_suffix }}{% endif %}">{{ url.url.split('/')[2] }}</a> ({{ url.rel }})<br> @@ -247,41 +197,42 @@ accessible version.  </table>  {% endif %}  {% endif %} +</div> -</div>  <div class="column" style="flex: 0 0 24em;"> -{% if entity.state == 'active' and entity._es and entity._es.best_pdf_url %} -<a href="{{ entity._es.best_pdf_url }}" class="ui top attached fluid huge green button"><i class="file pdf outline icon"></i>Read Full Text</a> +{% if entity.state == 'active' and entity._es and entity._es.ia_pdf_url %} +  <a href="{{ entity._es.ia_pdf_url }}" class="ui top attached fluid huge black button" style="text-decoration: underline;"> +    <i class="file pdf outline icon"></i>Read Archived PDF +  </a>  {% elif entity.state == 'active' and entity.webcaptures != [] and entity.webcaptures[0].archive_urls != [] and entity.webcaptures[0].archive_urls[0].rel == "wayback" %} -<a href="{{ entity.webcaptures[0].archive_urls[0].url }}{{ entity.webcaptures[0]._wayback_suffix }}" class="ui top attached fluid huge green button"><i class="file archive outline icon"></i>View Web Archive</a> -{% elif entity.state == 'active' %} -<span class="ui top attached fluid huge grey button"><i class="ban icon"></i>No Full Text Available</span> - -<a href="/release/{{ release.ident }}/save" class="ui attached fluid huge blue button"> -  <i class="cloud download icon"></i>"Save Paper Now" -  <div style="margin-top: 0.8em; font-size: smaller; text-align: left;"> -    Know of a fulltext copy of on the public web? Submit a URL and we will archive it -  </div> -</a> - -{# alternative SPN -<div class="ui segment attached"> -  <center> -    <a class="ui blue huge button" href="/release/{{ release.ident }}/save" title="save paper now">Save Paper Now</a> -  </center> -  <p style="margin-top: 0.5em;">Know of a fulltext copy on the public web? Submit a URL and we'll archive it -</div> -#} +  <a href="{{ entity.webcaptures[0].archive_urls[0].url }}{{ entity.webcaptures[0]._wayback_suffix }}" class="ui fluid huge black button" style="text-decoration: underline;"> +    <i class="university icon"></i>Visit Web Archive +  </a> +{% endif %} -{# alternative SPN -<div class="ui segment attached yellow inverted accordion"> -  <b><a href="/release/{{ release.ident }}/save" title="save paper now" style="color: black;">Save Paper Now</a></b> -  <br>know of a fulltext copy on the public web? submit a URL and we'll archive it -</div> -#} +{% if entity.state == 'active' and entity._es %} +  {% if entity._es.preservation == 'bright' %} +    <div class="ui top attached fluid compact green inverted center aligned segment" style="padding: 0.5em; border-color: #5550; background-color: #2ca048;"> +      <b>Archived</b> +    </div> +  {% elif entity._es.preservation == 'dark' %} +    <div class="ui top attached fluid large green inverted center aligned segment" style="padding: 0.5em; border-color: #5550; background-color: ##6e7b71;"> +      <b>"Dark" Archived</b> +    </div> +  {% else %} +    <div class="ui top attached fluid large red inverted center aligned segment" style="padding: 0.5em; border-color: #5550; background-color: #b71818;"> +      <b>Not Preserved</b> +    </div> +    <div class="ui segment attached"> +      <a href="/release/{{ release.ident }}/save"> +        <b><i class="cloud download icon"></i>Save Paper Now!</b> +      </a> +      <p>Know of a fulltext copy of on the public web? Submit a URL and we will archive it +    </div> +  {% endif %}  {% endif %}  {% if release.release_type or release.release_stage or release.release_year %} @@ -305,6 +256,10 @@ accessible version.    {% if release.version %}      <b>Version</b>   <code>{{ release.version }}</code><br>    {% endif %} +  {% if release.language != None %} +    <b>Language</b>   <code>{{ release.language}}</code> +      <sup><a href="https://www.loc.gov/standards/iso639-2/php/langcodes_name.php?iso_639_1={{ release.language }}">?</a></sup> +  {% endif %}    </div>  {% endif %} @@ -357,7 +312,19 @@ accessible version.  {% if release.container != None and release.container._es %}  <div class="ui segment attached"> -<b>Container Metadata</b><br> +<b><a href="/container/{{ release.container.ident }}"> +{% if release.container.container_type == "journal" %} +  Journal Metadata +{% elif release.container.container_type == "proceedings" %} +  Proceedings Metadata +{% elif release.container.container_type == "book-series" %} +  Book Series Metadata +{% elif release.container.container_type == "blog" %} +  Blog Metadata +{% else %} +  Container Metadata +{% endif %} +</a></b><br>  {% if release.container._es.is_oa == True %}  <i class="icon unlock orange"></i>Open Access Publication<br>  {% endif %} @@ -370,7 +337,9 @@ accessible version.    {% if release.container._es.in_road == True %}      <i class="icon check green"></i> In <a href="http://road.issn.org/issn/{{ release.container.issnl }}">ISSN ROAD</a><br>    {% elif release.container._es.in_road == False %} +    {# skip 'not in ROAD' display, to reduce UI clutter      <i class="icon times grey"></i> Not in <a href="https://road.issn.org">ISSN ROAD</a><br> +    #}    {% endif %}    {% if release.container._es.any_kbart == True %}      <i class="icon check green"></i> In <a href="https://keepers.issn.org/?q=api/search&search[]=MUST=allissn={{ release.container.issnl }}&search[]=MUST_EXIST=keepers">Keepers Registery</a><br> @@ -380,19 +349,18 @@ accessible version.  {% if release.container.issnl != None %}    <i class="icon linkify"></i>ISSN-L:  <code>{{ release.container.issnl }}</code><br>  {% endif %} -  <a href="/container/{{ release.container.ident }}" title="container {{ release.container.ident }}"><i class="icon share"></i>Fatcat Entry</a>  </div>  {% endif %} -<div class="ui segment attached accordion"> +<div class="ui segment attached">    <b><a href="/work/{{ release.work_id }}" title="work {{ release.work_id }}">Work Entity</a></b> -  <br>grouping other versions (eg, pre-print) and variants of this release +  <br>access all versions, variants, and formats of this works (eg, pre-prints)  </div>  {% if release.state == "active" and release._can_citeproc %}  <div class="ui segment attached accordion">    <div class="title" style="padding: 0px;"> -    <i class="dropdown icon"></i><b>Cite This Release</b> +    <i class="dropdown icon"></i><b>Cite This</b>    </div>    <div class="content">      <a href="/release/{{ release.ident }}.bib">BibTeX</a> diff --git a/python/fatcat_web/templates/search_macros.html b/python/fatcat_web/templates/search_macros.html index a207bfbc..cb917c5f 100644 --- a/python/fatcat_web/templates/search_macros.html +++ b/python/fatcat_web/templates/search_macros.html @@ -9,7 +9,7 @@    {% endif %}    {{ found.offset + found.count_returned }} -  out of {{ found.count_found }} results +  out of {{ '{0:,}'.format(found.count_found) }} results  </i>  {%- endmacro %} @@ -28,7 +28,7 @@  {% endif %}    <i>Showing results {{ found.offset }} — {{ found.offset + -found.count_returned }} out of {{ found.count_found }} results</i>   +found.count_returned }} out of {{ '{0:,}'.format(found.count_found) }} results</i>    {% if found.offset + found.limit < found.count_found and found.offset + found.limit < found.deep_page_limit %}    <a href="{{ url_for(endpoint, q=query.q, offset=found.offset + found.limit) }}">Next »</a> diff --git a/python/fatcat_web/templates/webcapture_view.html b/python/fatcat_web/templates/webcapture_view.html index f2f689f3..b35ee0e2 100644 --- a/python/fatcat_web/templates/webcapture_view.html +++ b/python/fatcat_web/templates/webcapture_view.html @@ -8,7 +8,7 @@  <div class="ui stackable mobile reversed grid centered">  <div class="column" style="font-size: 16px; flex: 1;"> -<h3>Releases</h3> +<h3>Associated Releases</h3>  {% if entity.releases != [] %}    {{ entity_macros.release_list(entity.releases) }}  {% else %} @@ -16,8 +16,7 @@    This Web Capture is not associated with any fatcat release.  {% endif %} -<br> -<h3>Archive URLs</h3> +<h3>Public Archive URLs</h3>  {% if webcapture.archive_urls != None %}    <table class="ui very basic compact single line fixed table">    <tbody> @@ -42,7 +41,7 @@ No known public archive for this webcapture.  {% endif %} -<h3>CDX Rows ({{ webcapture.cdx|count }})</h3> +<h3>Captured Resources ({{ webcapture.cdx|count }})</h3>  {% if webcapture.cdx %}    <div class="ui celled list">      {% for row in webcapture.cdx %} @@ -53,7 +52,7 @@ No known public archive for this webcapture.          </div>          <div style="margin-left: 1em;">            {{ row.timestamp.strftime("%Y-%m-%d %H:%M:%S") }} -          {% if row.mimetype %}| {{ row.mimetype }} {% endif %} +          {% if row.mimetype %}| <code style="font-size: smaller;">{{ row.mimetype }}</code> {% endif %}            {% if row.size %}| {{ row.size|filesizeformat }} {% endif %}            <br>            <code><small style="color: #666;"> @@ -73,11 +72,13 @@ This web capture is empty (contains no resources).  <div class="column" style="flex: 0 0 24em;">  {% if webcapture.state == 'active' and webcapture.archive_urls != [] and webcapture.archive_urls[0].rel == "wayback" %} -<a href="{{ webcapture.archive_urls[0].url }}{{ webcapture._wayback_suffix }}" class="ui top attached fluid huge green button"><i class="file archive outline icon"></i>View Web Archive</a> +  <a href="{{ webcapture.archive_urls[0].url }}{{ webcapture._wayback_suffix }}" class="ui fluid huge black button" style="text-decoration: underline;"> +    <i class="university icon"></i>View Web Archive +  </a>  {% endif %}  {% if webcapture.timestamp != None %} -<div class="ui segment attached"> +<div class="ui segment top attached">    <p><b>Capture Time</b>  {{ webcapture.timestamp.strftime("%Y-%m-%d %H:%M:%S") }}  </div>  {% endif %} diff --git a/python/fatcat_web/web_config.py b/python/fatcat_web/web_config.py index 22a704d9..5d2da830 100644 --- a/python/fatcat_web/web_config.py +++ b/python/fatcat_web/web_config.py @@ -60,6 +60,9 @@ class Config(object):      WTF_CSRF_CHECK_DEFAULT = False      WTF_CSRF_TIME_LIMIT = None +    # for login redirects +    USE_SESSION_FOR_NEXT = True +      if FATCAT_DOMAIN == "dev.fatcat.wiki":          # "Even more verbose" debug options          #SQLALCHEMY_ECHO = True | 
