aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBryan Newbold <bnewbold@robocracy.org>2018-04-23 16:07:21 -0700
committerBryan Newbold <bnewbold@robocracy.org>2018-04-23 16:07:21 -0700
commit5bdd3f6e871599acb339aadc9b78cc12860f9759 (patch)
treee753e48b2becc4806bfbc8d91acb58bd75783534
parentf87a203cd19f777ef328af1576e00dd59025649a (diff)
downloadfatcat-5bdd3f6e871599acb339aadc9b78cc12860f9759.tar.gz
fatcat-5bdd3f6e871599acb339aadc9b78cc12860f9759.zip
skeleton route/views
-rw-r--r--fatcat/routes.py54
-rw-r--r--fatcat/templates/container_view.html10
-rw-r--r--fatcat/templates/creator_view.html10
-rw-r--r--fatcat/templates/file_view.html10
-rw-r--r--fatcat/templates/release_view.html31
-rw-r--r--tests/fixtures.py124
-rw-r--r--tests/routes.py11
7 files changed, 238 insertions, 12 deletions
diff --git a/fatcat/routes.py b/fatcat/routes.py
index d0d77ee7..c4cde22a 100644
--- a/fatcat/routes.py
+++ b/fatcat/routes.py
@@ -1,8 +1,9 @@
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, db
+from fatcat import app, db, api
### Views ###################################################################
@@ -13,12 +14,53 @@ def work_create():
@app.route('/work/random', methods=['GET'])
def work_random():
- work = {} # XXX
- return render_template('work_view.html', work=work, primary=work['primary'])
+ rv = app.get('/v0/work/random')
+ return redirect(rv.location)
-@app.route('/work/random', methods=['GET'])
-def work_view(work_id):
- return render_template('work_view.html')
+@app.route('/work/<int:ident>', methods=['GET'])
+def work_view(ident):
+ rv = api.api_work_get(ident)
+ if rv.status_code != 200:
+ # TODO: better wrapping for all entities
+ return abort(rv.status_code)
+ entity = json.loads(rv.data.decode('utf-8'))
+ return render_template('work_view.html', work=entity)
+
+@app.route('/release/<int:ident>', methods=['GET'])
+def release_view(ident):
+ rv = api.api_release_get(ident)
+ if rv.status_code != 200:
+ # TODO: better wrapping for all entities
+ return abort(rv.status_code)
+ entity = json.loads(rv.data.decode('utf-8'))
+ return render_template('release_view.html', release=entity)
+
+@app.route('/creator/<int:ident>', methods=['GET'])
+def creator_view(ident):
+ rv = api.api_creator_get(ident)
+ if rv.status_code != 200:
+ # TODO: better wrapping for all entities
+ return abort(rv.status_code)
+ entity = json.loads(rv.data.decode('utf-8'))
+ return render_template('creator_view.html', creator=entity)
+
+@app.route('/container/<int:ident>', methods=['GET'])
+def container_view(ident):
+ rv = api.api_container_get(ident)
+ if rv.status_code != 200:
+ # TODO: better wrapping for all entities
+ return abort(rv.status_code)
+ entity = json.loads(rv.data.decode('utf-8'))
+ return render_template('container_view.html', container=entity)
+
+@app.route('/file/<int:ident>', methods=['GET'])
+def file_view(ident):
+ rv = api.api_file_get(ident)
+ if rv.status_code != 200:
+ # TODO: better wrapping for all entities
+ return abort(rv.status_code)
+ entity = json.loads(rv.data.decode('utf-8'))
+ return render_template('file_view.html', file=entity)
### Static Routes ###########################################################
diff --git a/fatcat/templates/container_view.html b/fatcat/templates/container_view.html
new file mode 100644
index 00000000..d842f7e1
--- /dev/null
+++ b/fatcat/templates/container_view.html
@@ -0,0 +1,10 @@
+{% extends "base.html" %}
+{% block body %}
+
+<h1>Container: {{ container.id }}</h1>
+
+TODO:
+
+<pre>{{ container }}</pre>
+
+{% endblock %}
diff --git a/fatcat/templates/creator_view.html b/fatcat/templates/creator_view.html
new file mode 100644
index 00000000..f7be9f2c
--- /dev/null
+++ b/fatcat/templates/creator_view.html
@@ -0,0 +1,10 @@
+{% extends "base.html" %}
+{% block body %}
+
+<h1>Creator: {{ creator.id }}</h1>
+
+TODO:
+
+<pre>{{ creator }}</pre>
+
+{% endblock %}
diff --git a/fatcat/templates/file_view.html b/fatcat/templates/file_view.html
new file mode 100644
index 00000000..ff55e21c
--- /dev/null
+++ b/fatcat/templates/file_view.html
@@ -0,0 +1,10 @@
+{% extends "base.html" %}
+{% block body %}
+
+<h1>File: {{ file.id }}</h1>
+
+TODO:
+
+<pre>{{ file }}</pre>
+
+{% endblock %}
diff --git a/fatcat/templates/release_view.html b/fatcat/templates/release_view.html
new file mode 100644
index 00000000..ee68161c
--- /dev/null
+++ b/fatcat/templates/release_view.html
@@ -0,0 +1,31 @@
+{% extends "base.html" %}
+{% block body %}
+
+<h1>{{ release.title }}</h1>
+
+<p>Release type: {{ release.type }}
+<p><a href="/release/{{ release.id }}/history">History</a>
+<p>Contributors:
+{% for c in release.contributors %} {{ c.name }}; {% endfor %}
+
+<p>Title: {{ release.title }}
+<p>Date: {{ release.date }}
+
+{% if release.container %}
+<p>Container: <a href="/container/{{ release.container.id }}">{{ release.container.title }}</a>
+{% endif %}
+
+{% if release.doi %}
+<p>DOI: <a href="https://dx.doi.org/{{ release.doi }}">{{ release.doi }}</a>
+{% endif %}
+
+{% if releases %}
+<ul>
+{% for r in releases %}
+ <ul><a href="/release/{{ r.id }}">{{ r.title }}</a> ({{ y.date }} - {{ y.release_type }})
+{% endfor %}
+</ul>
+{% else %}
+{% endif %}
+
+{% endblock %}
diff --git a/tests/fixtures.py b/tests/fixtures.py
index 9176b8c5..04b4314a 100644
--- a/tests/fixtures.py
+++ b/tests/fixtures.py
@@ -18,15 +18,127 @@ def app():
@pytest.fixture
def rich_app(app):
- assert app.post('/v0/work',
+
+ rv = app.post('/v0/editgroup',
+ data=json.dumps(dict(
+ extra=dict(q=1, u="zing"))),
+ headers={"content-type": "application/json"})
+ assert rv.status_code == 200
+ obj = json.loads(rv.data.decode('utf-8'))
+ editgroup_id = obj['id']
+
+ rv = app.post('/v0/container',
+ data=json.dumps(dict(
+ name="schmournal",
+ publisher="society of authors",
+ issn="2222-3333",
+ editgroup=editgroup_id,
+ extra=dict(a=2, i="zing"))),
+ headers={"content-type": "application/json"})
+ assert rv.status_code == 200
+ obj = json.loads(rv.data.decode('utf-8'))
+ container_id = obj['id']
+
+ rv = app.post('/v0/creator',
+ data=json.dumps(dict(
+ name="anon y. mouse",
+ orcid="0000-0002-1825-0097",
+ editgroup=editgroup_id,
+ extra=dict(w=1, q="zing"))),
+ headers={"content-type": "application/json"})
+ assert rv.status_code == 200
+ obj = json.loads(rv.data.decode('utf-8'))
+ creator_id = obj['id']
+
+ rv = app.post('/v0/work',
+ data=json.dumps(dict(
+ title="dummy work",
+ work_type="book",
+ editgroup=editgroup_id,
+ extra=dict(a=3, b="zing"))),
+ headers={"content-type": "application/json"})
+ assert rv.status_code == 200
+ obj = json.loads(rv.data.decode('utf-8'))
+ work_id = obj['id']
+
+ # this stub work will be referenced
+ rv = app.post('/v0/release',
+ data=json.dumps(dict(
+ title="derivative work",
+ work_type="journal-article",
+ work=work_id,
+ creators=[creator_id],
+ doi="10.1234/58",
+ editgroup=editgroup_id,
+ refs=[
+ dict(stub="some other journal article"),
+ ],
+ extra=dict(f=7, b="zing"))),
+ headers={"content-type": "application/json"})
+ assert rv.status_code == 200
+ obj = json.loads(rv.data.decode('utf-8'))
+ stub_release_id = obj['id']
+
+ rv = app.post('/v0/release',
+ data=json.dumps(dict(
+ title="dummy work",
+ work_type="book",
+ work=work_id,
+ container=container_id,
+ creators=[creator_id],
+ doi="10.1234/5678",
+ editgroup=editgroup_id,
+ refs=[
+ dict(stub="some book", target=stub_release_id),
+ ],
+ extra=dict(f=7, b="loopy"))),
+ headers={"content-type": "application/json"})
+ assert rv.status_code == 200
+ obj = json.loads(rv.data.decode('utf-8'))
+ release_id = obj['id']
+
+ rv = app.post('/v0/file',
data=json.dumps(dict(
- title="dummy",
- work_type="thing",
- extra=dict(a=1, b="zing"))),
- headers={"content-type": "application/json"}
- ).status_code == 200
+ sha1="deadbeefdeadbeef",
+ size=1234,
+ releases=[release_id],
+ editgroup=editgroup_id,
+ extra=dict(f=4, b="zing"))),
+ headers={"content-type": "application/json"})
+ assert rv.status_code == 200
+ obj = json.loads(rv.data.decode('utf-8'))
+ file_id = obj['id']
+
+ rv = app.post('/v0/editgroup/{}/accept'.format(editgroup_id),
+ headers={"content-type": "application/json"})
+ assert rv.status_code == 200
+
return app
+def test_rich_app_fixture(rich_app):
+ app = rich_app
+
+ assert ChangelogEntry.query.count() == 1
+
+ for cls in (WorkIdent, WorkRev, WorkEdit,
+ ContainerIdent, ContainerRev, ContainerEdit,
+ CreatorIdent, CreatorRev, CreatorEdit,
+ FileIdent, FileRev, FileEdit):
+ assert cls.query.count() == 1
+ for cls in (ReleaseIdent, ReleaseRev, ReleaseEdit):
+ assert cls.query.count() == 2
+
+ for cls in (WorkIdent,
+ ContainerIdent,
+ CreatorIdent,
+ FileIdent):
+ assert cls.query.filter(cls.is_live==True).count() == 1
+ assert ReleaseIdent.query.filter(ReleaseIdent.is_live==True).count() == 2
+
+ # test that editor's active edit group is now invalid
+ editor = Editor.query.first()
+ assert editor.active_edit_group == None
+
## Helpers ##################################################################
diff --git a/tests/routes.py b/tests/routes.py
index 47b99e30..194dc865 100644
--- a/tests/routes.py
+++ b/tests/routes.py
@@ -18,3 +18,14 @@ def test_static_routes(rich_app):
assert app.get("/static/bogus/route").status_code == 404
+def test_all_views(rich_app):
+ app = rich_app
+
+ for route in ('work', 'release', 'creator', 'container', 'file'):
+ print(route)
+ rv = app.get('/{}/1'.format(route))
+ assert rv.status_code == 200
+
+ rv = app.get('/v0/work/random')
+ rv = app.get(rv.location)
+ assert rv.status_code == 200