diff options
| -rw-r--r-- | python/fatcat_web/routes.py | 92 | ||||
| -rw-r--r-- | python/fatcat_web/search.py | 7 | ||||
| -rw-r--r-- | python/fatcat_web/templates/container_view_browse.html | 71 | ||||
| -rw-r--r-- | python/fatcat_web/templates/entity_macros.html | 4 | 
4 files changed, 146 insertions, 28 deletions
| diff --git a/python/fatcat_web/routes.py b/python/fatcat_web/routes.py index 0afc189f..6e3e9b57 100644 --- a/python/fatcat_web/routes.py +++ b/python/fatcat_web/routes.py @@ -287,8 +287,6 @@ def generic_entity_view(entity_type: str, ident: str, view_template: str) -> Any          entity._type_preservation = get_elastic_preservation_by_type(              ReleaseQuery(container_id=ident),          ) -    if view_template == "container_view_browse.html": -        entity._browse_volume_year = get_elastic_container_browse_year_volume(entity.ident)      return render_template(          view_template, entity_type=entity_type, entity=entity, editgroup_id=None @@ -350,9 +348,93 @@ def container_view_coverage(ident: str) -> AnyResponse:  @app.route("/container/<string(length=26):ident>/browse", methods=["GET"]) -def container_view_browser(ident: str) -> AnyResponse: -    # note: there is a special hack to add entity._type_preservation for this endpoint -    return generic_entity_view("container", ident, "container_view_browse.html") +def container_view_browse(ident: str) -> AnyResponse: +    entity = generic_get_entity("container", ident) + +    if entity.state == "redirect": +        return redirect(f"/container/{entity.redirect}") +    elif entity.state == "deleted": +        return render_template("deleted_entity.html", entity_type="container", entity=entity) + +    query_sort: Optional[List[str]] +    if request.args.get('year') and 'volume' in request.args and 'issue' in request.args: +        # year, volume, issue specified; browse-by-page +        year = int(request.args.get('year')) +        volume = request.args.get('volume', '') +        issue = request.args.get('issue', '') +        if volume: +            volume = f'volume:"{volume}"' +        else: +            volume = "!volume:*" +        if issue: +            issue = f'issue:"{issue}"' +        else: +            issue = "!issue:*" +        query_string = f'year:{year} {volume} {issue}' +        query_sort = ["first_page", "release_date"] +    elif request.args.get('year') and 'volume' in request.args: +        # year, volume specified (no issue); browse-by-page +        year = int(request.args.get('year')) +        volume = request.args.get('volume', '') +        if volume: +            volume = f'volume:"{volume}"' +        else: +            volume = "!volume:*" +        query_string = f'year:{year} {volume}' +        query_sort = ["issue", "first_page", "release_date"] +    elif request.args.get('year'): +        # year specified, not anything else; browse-by-date +        year = int(request.args.get('year')) +        query_string = f"year:{year}" +        query_sort = ["release_date"] +    else: +        entity._browse_volume_year = get_elastic_container_browse_year_volume(entity.ident) +        return render_template( +            "container_view_browse.html", entity_type="container", entity=entity, editgroup_id=None +        ) + +    print(query_string) +    query = ReleaseQuery( +        q=query_string, +        limit=200, +        offset=0, +        container_id=ident, +        fulltext_only=False, +        recent=False, +        exclude_stubs=True, +        sort=query_sort, +    ) + +    try: +        found = do_release_search(query) +    except FatcatSearchError as fse: +        return ( +            render_template( +                "container_view_search.html", +                query=query, +                es_error=fse, +                entity_type="container", +                entity=entity, +                editgroup_id=None, +            ), +            fse.status_code, +        ) + +    # HACK: re-sort by first page *numerically* +    if found.results and query_sort and 'first_page' in query_sort: +        for doc in found.results: +            if doc.get('first_page') and doc['first_page'].isdigit(): +                doc['first_page'] = int(doc['first_page']) +        found.results = sorted(found.results, key=lambda d: d.get('first_page') or 99999999) + +    return render_template( +        "container_view_browse.html", +        query=query, +        releases_found=found, +        entity_type="container", +        entity=entity, +        editgroup_id=None, +    )  @app.route("/container/<string(length=26):ident>/metadata", methods=["GET"]) diff --git a/python/fatcat_web/search.py b/python/fatcat_web/search.py index b19b57e6..3f4a216c 100644 --- a/python/fatcat_web/search.py +++ b/python/fatcat_web/search.py @@ -29,6 +29,7 @@ class ReleaseQuery:      container_id: Optional[str] = None      recent: bool = False      exclude_stubs: bool = False +    sort: Optional[List[str]] = None      @staticmethod      def from_args(args: Dict[str, Any]) -> "ReleaseQuery": @@ -45,6 +46,7 @@ class ReleaseQuery:              container_id=args.get("container_id"),              recent=bool(args.get("recent")),              exclude_stubs=bool(args.get("exclude_stubs")), +            sort=None,          ) @@ -182,6 +184,9 @@ def do_release_search(query: ReleaseQuery, deep_page_limit: int = 2000) -> Searc          negative_boost=0.5,      ) +    if query.sort: +        search = search.sort(*query.sort) +      # Sanity checks      limit = min((int(query.limit or 25), 100))      offset = max((int(query.offset or 0), 0)) @@ -299,7 +304,7 @@ def get_elastic_container_browse_year_volume(ident: str) -> Dict[int, Dict[str,          for year in year_nums:              year_dicts[year] = {}          for row in buckets: -            year_dicts[int(row["key"]["year"])][row["key"]["volume"] or "_unknown"] = int( +            year_dicts[int(row["key"]["year"])][row["key"]["volume"] or "000_unknown"] = int(                  row["doc_count"]              )      # return sorted(year_dicts.values(), key=lambda x: x["year"]) diff --git a/python/fatcat_web/templates/container_view_browse.html b/python/fatcat_web/templates/container_view_browse.html index b5691899..aa88b666 100644 --- a/python/fatcat_web/templates/container_view_browse.html +++ b/python/fatcat_web/templates/container_view_browse.html @@ -4,28 +4,59 @@  {% import "entity_macros.html" as entity_macros %}  {% extends "entity_base.html" %} -{% block entity_main %} - -{% if entity._browse_volume_year %} -<h2>Browse by Year and Volume</h2> -<ul> -{% for year in entity._browse_volume_year.keys()|sort|reverse %} -  {% for volume in entity._browse_volume_year[year].keys()|sort|reverse %} -    {% if volume == '_unknown' %} -      <li><a href="/container/{{ entity.ident }}/browse?year={{ year }}&volume=">{{ year }}</a> ({{ entity._browse_volume_year[year][volume] }} releases) -    {% else %} -      <li><a href="/container/{{ entity.ident }}/browse?year={{ year }}&volume={{ volume }}">{{ year }} | Vol. {{ volume }}</a> ({{ entity._browse_volume_year[year][volume] }} releases) -    {% endif %} +{% macro browse_year_volume_table(entity, data) %} +<table class="ui basic compact structured table"> +  <tbody> +  {% for year in data.keys()|sort|reverse %} +    {% for volume in data[year].keys()|sort|reverse %} +      <tr> +      {% if loop.first %} +        <td rowspan="{{ data[year]|length }}" class="top aligned"> +          <a href="/container/{{ entity.ident }}/browse?year={{ year }}">{{ year }}</a> +        </td> +      {% endif %} +      {% if volume == '000_unknown' %} +        <td>{% if data[year]|length > 1 %}<i>n/a</i>{% endif %}</td> +        <td><a href="/container/{{ entity.ident }}/browse?year={{ year }}&volume=">{{ data[year][volume] }} releases</a> +      {% else %} +        <td><a href="/container/{{ entity.ident }}/browse?volume={{ volume }}">Vol. {{ volume }}</a></td> +        <td><a href="/container/{{ entity.ident }}/browse?year={{ year }}&volume={{ volume }}">{{ data[year][volume] }} releases</a> +      {% endif %} +      </tr> +    {% endfor %}    {% endfor %} -{% endfor %} -</ul> -{% elif entity._browse_issues %} -{% for issue in entity._browse_issues.keys()|sort|reverse %} -  <h4>{{ issue }}</h4> -  {% for paper in entity._browse_issues[issue] %} -    {{ paper.title }}<br> +  </tbody> +</table> +{% endmacro %} + +{% macro browse_releases(found) %} +  {% for release_doc in found.results %} +    <div class="ui grid"> +      <div class="two wide center aligned column"> +        {% if release_doc.pages %} +          {{ release_doc.pages }} +        {# +        {% elif release_doc.release_date %} +          {{ release_doc.release_date }} +        #} +        {% endif %} +      </div> +      <div class="fourteen wide column"> +        {{ entity_macros.release_search_result_row(release_doc, margin_top=False) }} +      </div> +    </div>    {% endfor %} -{% endfor %} +{% endmacro %} + +{% block entity_main %} + +{% if releases_found %} +  {{ browse_releases(releases_found) }} +{% elif entity._browse_volume_year %} +  <div class="ui container text"> +    <h3>Contents by Year and Volume</h3> +    {{ browse_year_volume_table(entity, entity._browse_volume_year) }} +  </div>  {% endif %}  {% endblock %} diff --git a/python/fatcat_web/templates/entity_macros.html b/python/fatcat_web/templates/entity_macros.html index 6ad63a14..163af3e0 100644 --- a/python/fatcat_web/templates/entity_macros.html +++ b/python/fatcat_web/templates/entity_macros.html @@ -142,9 +142,9 @@  </form>  {%- endmacro %} -{% macro release_search_result_row(paper) -%} +{% macro release_search_result_row(paper, margin_top=True) -%}  <div> -  <h4 style="margin-top: 1em; margin-bottom: 0px; font-size: 1.1em;"> +  <h4 style="{% if margin_top %}margin-top: 1em; {% endif %}margin-bottom: 0px; font-size: 1.1em;">      <a href="/release/{{ paper.ident }}" style="color: #2224c7;">        {% if paper.title %}          {{ paper.title[:512] }} | 
