diff options
Diffstat (limited to 'python/fatcat_web/routes.py')
-rw-r--r-- | python/fatcat_web/routes.py | 364 |
1 files changed, 364 insertions, 0 deletions
diff --git a/python/fatcat_web/routes.py b/python/fatcat_web/routes.py new file mode 100644 index 00000000..ddb56abd --- /dev/null +++ b/python/fatcat_web/routes.py @@ -0,0 +1,364 @@ + +import os +import json +from flask import Flask, render_template, send_from_directory, request, \ + url_for, abort, g, redirect, jsonify, session +from fatcat import app, api +from fatcat_client.rest import ApiException +from fatcat.search import do_search + + +### Views ################################################################### + +@app.route('/container/<ident>/history', methods=['GET']) +def container_history(ident): + try: + entity = api.get_container(ident) + history = api.get_container_history(ident) + except ApiException as ae: + abort(ae.status) + #print(history) + return render_template('entity_history.html', + page_title=entity.name, + entity_type="container", + entity=entity, + history=history) + +@app.route('/container/<ident>/edit', methods=['GET']) +def container_edit_view(ident): + try: + entity = api.get_container(ident) + except ApiException as ae: + abort(ae.status) + return render_template('entity_edit.html') + +#@app.route('/container/<ident>/edit', methods=['POST']) +#def container_edit(ident): +# raise NotImplemented() +# params = dict() +# for k in request.form: +# if k.startswith('container_'): +# params[k[10:]] = request.form[k] +# edit = api.update_container(params=params) +# return redirect("/container/{}".format(edit.ident)) +# # else: +# #return render_template('container_edit.html') + +@app.route('/container/create', methods=['GET']) +def container_create_view(): + return render_template('container_create.html') + +@app.route('/container/create', methods=['POST']) +def container_create(): + params = dict() + for k in request.form: + if k.startswith('container_'): + params[k[10:]] = request.form[k] + edit = api.create_container(params=params) + return redirect("/container/{}".format(edit.ident)) + +@app.route('/container/lookup', methods=['GET']) +def container_lookup(): + issnl = request.args.get('issnl') + if issnl is None: + abort(400) + try: + resp = api.lookup_container(issnl) + except ApiException as ae: + abort(ae.status) + return redirect('/container/{}'.format(resp.ident)) + +@app.route('/container/<ident>', methods=['GET']) +def container_view(ident): + try: + entity = api.get_container(ident) + except ApiException as ae: + abort(ae.status) + return render_template('container_view.html', container=entity) + +@app.route('/creator/<ident>/history', methods=['GET']) +def creator_history(ident): + try: + entity = api.get_creator(ident) + history = api.get_creator_history(ident) + except ApiException as ae: + abort(ae.status) + return render_template('entity_history.html', + page_title=entity.display_name, + entity_type="creator", + entity=entity, + history=history) + +@app.route('/creator/<ident>/edit', methods=['GET']) +def creator_edit_view(ident): + try: + entity = api.get_creator(ident) + except ApiException as ae: + abort(ae.status) + return render_template('entity_edit.html') + +@app.route('/creator/lookup', methods=['GET']) +def creator_lookup(): + orcid = request.args.get('orcid') + if orcid is None: + abort(400) + try: + resp = api.lookup_creator(orcid) + except ApiException as ae: + abort(ae.status) + return redirect('/creator/{}'.format(resp.ident)) + +@app.route('/creator/<ident>', methods=['GET']) +def creator_view(ident): + try: + entity = api.get_creator(ident) + releases = api.get_creator_releases(ident) + except ApiException as ae: + abort(ae.status) + return render_template('creator_view.html', creator=entity, releases=releases) + +@app.route('/file/<ident>/history', methods=['GET']) +def file_history(ident): + try: + entity = api.get_file(ident) + history = api.get_file_history(ident) + except ApiException as ae: + abort(ae.status) + return render_template('entity_history.html', + page_title=None, + entity_type="file", + entity=entity, + history=history) + +@app.route('/file/<ident>/edit', methods=['GET']) +def file_edit_view(ident): + try: + entity = api.get_file(ident) + except ApiException as ae: + abort(ae.status) + return render_template('entity_edit.html') + +@app.route('/file/lookup', methods=['GET']) +def file_lookup(): + sha1 = request.args.get('sha1') + if sha1 is None: + abort(400) + try: + resp = api.lookup_file(sha1) + except ApiException as ae: + abort(ae.status) + return redirect('/file/{}'.format(resp.ident)) + +@app.route('/file/<ident>', methods=['GET']) +def file_view(ident): + try: + entity = api.get_file(ident) + except ApiException as ae: + abort(ae.status) + return render_template('file_view.html', file=entity) + +@app.route('/release/lookup', methods=['GET']) +def release_lookup(): + doi = request.args.get('doi') + if doi is None: + abort(400) + try: + resp = api.lookup_release(doi) + except ApiException as ae: + abort(ae.status) + return redirect('/release/{}'.format(resp.ident)) + +@app.route('/release/create', methods=['GET']) +def release_create_view(): + return render_template('release_create.html') + +@app.route('/release/create', methods=['POST']) +def release_create(): + params = dict() + for k in request.form: + if k.startswith('release_'): + params[k[10:]] = request.form[k] + edit = api.create_release(params=params) + return redirect("/release/{}".format(edit.ident)) + +@app.route('/release/<ident>/history', methods=['GET']) +def release_history(ident): + try: + entity = api.get_release(ident) + history = api.get_release_history(ident) + except ApiException as ae: + abort(ae.status) + return render_template('entity_history.html', + page_title=entity.title, + entity_type="release", + entity=entity, + history=history) + +@app.route('/release/<ident>/edit', methods=['GET']) +def release_edit_view(ident): + try: + entity = api.get_release(ident) + except ApiException as ae: + abort(ae.status) + return render_template('entity_edit.html') + +@app.route('/release/<ident>', methods=['GET']) +def release_view(ident): + try: + entity = api.get_release(ident) + files = api.get_release_files(ident) + container = None + if entity.container_id is not None: + container = api.get_container(entity.container_id) + except ApiException as ae: + abort(ae.status) + authors = [c for c in entity.contribs if c.role in ('author', None)] + authors = sorted(authors, key=lambda c: c.index) + for fe in files: + # crudely filter out exact duplicates + kept = [] + for u in fe.urls: + if not u in kept: + kept.append(u) + fe.urls = [u for u in kept if not '/web/None/' in u.url] + return render_template('release_view.html', release=entity, + authors=authors, files=files, container=container) + +@app.route('/work/create', methods=['GET']) +def work_create_view(): + return abort(404) + +@app.route('/work/<ident>/history', methods=['GET']) +def work_history(ident): + try: + entity = api.get_work(ident) + history = api.get_work_history(ident) + except ApiException as ae: + abort(ae.status) + return render_template('entity_history.html', + page_title=None, + entity_type="work", + entity=entity, + history=history) + +@app.route('/work/<ident>/edit', methods=['GET']) +def work_edit_view(ident): + try: + entity = api.get_work(ident) + except ApiException as ae: + abort(ae.status) + return render_template('entity_edit.html') + +@app.route('/work/<ident>', methods=['GET']) +def work_view(ident): + try: + entity = api.get_work(ident) + releases = api.get_work_releases(ident) + except ApiException as ae: + abort(ae.status) + return render_template('work_view.html', work=entity, releases=releases) + +@app.route('/editgroup/current', methods=['GET']) +def editgroup_current(): + raise NotImplemented() + #eg = api.get_or_create_editgroup() + #return redirect('/editgroup/{}'.format(eg.id)) + +@app.route('/editgroup/<ident>', methods=['GET']) +def editgroup_view(ident): + try: + entity = api.get_editgroup(str(ident)) + except ApiException as ae: + abort(ae.status) + return render_template('editgroup_view.html', editgroup=entity) + +@app.route('/editor/<ident>', methods=['GET']) +def editor_view(ident): + entity = api.get_editor(ident) + return render_template('editor_view.html', editor=entity) + +@app.route('/editor/<ident>/changelog', methods=['GET']) +def editor_changelog(ident): + editor = api.get_editor(ident) + changelog_entries = api.get_editor_changelog(ident) + return render_template('editor_changelog.html', editor=editor, + changelog_entries=changelog_entries) + +@app.route('/changelog', methods=['GET']) +def changelog_view(): + try: + entries = api.get_changelog(limit=request.args.get('limit')) + except ApiException as ae: + abort(ae.status) + return render_template('changelog.html', entries=entries) + +@app.route('/changelog/<int:index>', methods=['GET']) +def changelog_entry_view(index): + try: + entry = api.get_changelog_entry(int(index)) + except ApiException as ae: + abort(ae.status) + return render_template('changelog_view.html', entry=entry, editgroup=entry.editgroup) + +@app.route('/stats', methods=['GET']) +def stats_view(): + stats = api.get_stats() + return render_template('stats.html', stats=stats.extra) + +### Search ################################################################## + +@app.route('/release/search', methods=['GET', 'POST']) +def search(): + + limit = 20 + query = request.args.get('q') + fulltext_only = bool(request.args.get('fulltext_only')) + + # Convert raw DOIs to DOI queries + if query is not None: + oldquery = query.split() + for word in oldquery: + if word.startswith("10.") and word.count("/") >= 1: + query = query.replace(word, 'doi:"{}"'.format(word)) + + if 'q' in request.args.keys(): + # always do files for HTML + found = do_search(query, limit=limit, fulltext_only=fulltext_only) + return render_template('release_search.html', found=found, query=query, fulltext_only=fulltext_only) + else: + return render_template('release_search.html', query=query, fulltext_only=fulltext_only) + + +### Static Routes ########################################################### + +@app.errorhandler(404) +def page_not_found(e): + return render_template('404.html'), 404 + +@app.route('/', methods=['GET']) +def homepage(): + return render_template('home.html') + +@app.route('/about', methods=['GET']) +def aboutpage(): + return render_template('about.html') + +@app.route('/search', methods=['GET']) +def search_redirect(): + return redirect("/release/search") + +@app.route('/robots.txt', methods=['GET']) +def robots(): + return send_from_directory(os.path.join(app.root_path, 'static'), + 'robots.txt', + mimetype='text/plain') + +@app.route('/static/fatcat.jpg', methods=['GET']) +def fatcat_photo(): + return send_from_directory(os.path.join(app.root_path, 'static'), + 'fatcat.jpg', + mimetype='image/jpeg') + +@app.route('/health', methods=['GET']) +def health(): + return jsonify({'ok': True}) |