aboutsummaryrefslogtreecommitdiffstats
path: root/python/fatcat_web
diff options
context:
space:
mode:
Diffstat (limited to 'python/fatcat_web')
-rw-r--r--python/fatcat_web/__init__.py2
-rw-r--r--python/fatcat_web/editing_routes.py170
-rw-r--r--python/fatcat_web/routes.py165
3 files changed, 171 insertions, 166 deletions
diff --git a/python/fatcat_web/__init__.py b/python/fatcat_web/__init__.py
index 3f3824e1..7d62bb5f 100644
--- a/python/fatcat_web/__init__.py
+++ b/python/fatcat_web/__init__.py
@@ -49,7 +49,7 @@ else:
print("No privileged token found")
priv_api = None
-from fatcat_web import routes, auth, cors, forms
+from fatcat_web import routes, editing_routes, auth, cors, forms
gitlab_bp = create_flask_blueprint(Gitlab, oauth, auth.handle_oauth)
app.register_blueprint(gitlab_bp, url_prefix='/auth/gitlab')
diff --git a/python/fatcat_web/editing_routes.py b/python/fatcat_web/editing_routes.py
new file mode 100644
index 00000000..dda0bc6f
--- /dev/null
+++ b/python/fatcat_web/editing_routes.py
@@ -0,0 +1,170 @@
+
+import os
+import json
+from flask import Flask, render_template, send_from_directory, request, \
+ url_for, abort, g, redirect, jsonify, session, flash, Response
+from flask_login import login_required
+
+from fatcat_client import Editgroup
+from fatcat_client.rest import ApiException
+from fatcat_tools.transforms import *
+from fatcat_web import app, api, auth_api, priv_api
+from fatcat_web.auth import handle_token_login, handle_logout, load_user, handle_ia_xauth
+from fatcat_web.cors import crossdomain
+from fatcat_web.search import *
+from fatcat_web.forms import *
+
+
+### Views ###################################################################
+
+@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/create', methods=['GET'])
+@login_required
+def container_create_view():
+ return render_template('container_create.html')
+
+@app.route('/container/create', methods=['POST'])
+@login_required
+def container_create():
+ raise NotImplementedError
+ params = dict()
+ for k in request.form:
+ if k.startswith('container_'):
+ params[k[10:]] = request.form[k]
+ container = None
+ #edit = api.create_container(container, params=params)
+ #return redirect("/container/{}".format(edit.ident))
+
+@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('/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('/fileset/<ident>/edit', methods=['GET'])
+def fileset_edit_view(ident):
+ try:
+ entity = api.get_fileset(ident)
+ except ApiException as ae:
+ abort(ae.status)
+ return render_template('entity_edit.html')
+
+@app.route('/webcapture/<ident>/edit', methods=['GET'])
+def webcapture_edit_view(ident):
+ try:
+ entity = api.get_webcapture(ident)
+ except ApiException as ae:
+ abort(ae.status)
+ return render_template('entity_edit.html')
+
+# XXX: figure out CSRF stuff for local dev
+@app.route('/release/create', methods=['GET', 'POST'])
+@login_required
+@app.csrf.exempt
+def release_create():
+ form = ReleaseEntityForm(csrf_enabled=False) # XXX:
+ if form.is_submitted():
+ if form.validate_on_submit():
+ # API on behalf of user
+ user_api = auth_api(session['api_token'])
+ if form.editgroup_id.data:
+ # TODO: error handling
+ eg = user_api.get_editgroup(form.editgroup_id.data)
+ else:
+ # if no editgroup, create one from description
+ eg = user_api.create_editgroup(
+ Editgroup(description=form.editgroup_description.data or None))
+ # set this session editgroup_id
+ session['active_editgroup_id'] = eg.editgroup_id
+ print(eg.editgroup_id) # XXX: debug
+ flash('Started new editgroup <a href="/editgroup/{}">{}</a>' \
+ .format(eg.editgroup_id, eg.editgroup_id))
+ # no merge or anything hard to do; just create the entity
+ entity = form.to_entity()
+ edit = user_api.create_release(entity, editgroup_id=eg.editgroup_id)
+ # redirect to new release
+ return redirect('/release/{}'.format(edit.ident))
+ elif form.errors:
+ print("user form errors: {}".format(form.errors))
+ print("didn't validate...")
+ elif len(form.contribs) == 0:
+ form.contribs.append_entry()
+ if not form.is_submitted():
+ editgroup_id = session.get('active_editgroup_id', None)
+ form.editgroup_id.data = editgroup_id
+ return render_template('release_create.html',
+ form=form, editgroup_id=editgroup_id)
+
+# XXX: figure out CSRF stuff for local dev
+@login_required
+@app.csrf.exempt
+@app.route('/release/<ident>/edit', methods=['GET', 'POST'])
+def release_edit(ident):
+ # TODO: prev_rev interlock
+ # TODO: factor out editgroup active/creation stuff
+ try:
+ entity = api.get_release(ident)
+ except ApiException as ae:
+ abort(ae.status)
+ form = ReleaseEntityForm(csrf_enabled=False) # XXX:
+ if form.is_submitted():
+ if form.validate_on_submit():
+ # API on behalf of user
+ user_api = auth_api(session['api_token'])
+ if form.editgroup_id.data:
+ # TODO: error handling
+ eg = user_api.get_editgroup(form.editgroup_id.data)
+ else:
+ # if no editgroup, create one from description
+ eg = user_api.create_editgroup(
+ Editgroup(description=form.editgroup_description.data or None))
+ # set this session editgroup_id
+ session['active_editgroup_id'] = eg.editgroup_id
+ print(eg.editgroup_id) # XXX: debug
+ flash('Started new editgroup <a href="/editgroup/{}">{}</a>' \
+ .format(eg.editgroup_id, eg.editgroup_id))
+ # all the tricky logic is in the update method
+ form.update_entity(entity)
+ edit = user_api.update_release(entity.ident, entity,
+ editgroup_id=eg.editgroup_id)
+ # redirect to release revision
+ # TODO: release_rev_view
+ return redirect('/release/{}'.format(edit.ident))
+ elif form.errors:
+ print("user form errors (didn't validate): {}".format(form.errors))
+ else:
+ form = ReleaseEntityForm.from_entity(entity)
+ if not form.is_submitted():
+ editgroup_id = session.get('active_editgroup_id', None)
+ form.editgroup_id.data = editgroup_id
+ return render_template('release_edit.html',
+ form=form, editgroup_id=editgroup_id, entity=entity)
+
+@app.route('/work/create', methods=['GET'])
+def work_create_view():
+ return abort(404)
+
+@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')
diff --git a/python/fatcat_web/routes.py b/python/fatcat_web/routes.py
index 2bfb9025..ed9abf0b 100644
--- a/python/fatcat_web/routes.py
+++ b/python/fatcat_web/routes.py
@@ -12,7 +12,6 @@ from fatcat_web import app, api, auth_api, priv_api
from fatcat_web.auth import handle_token_login, handle_logout, load_user, handle_ia_xauth
from fatcat_web.cors import crossdomain
from fatcat_web.search import *
-from fatcat_web.forms import *
### Views ###################################################################
@@ -31,43 +30,6 @@ def container_history(ident):
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'])
-@login_required
-def container_create_view():
- return render_template('container_create.html')
-
-@app.route('/container/create', methods=['POST'])
-@login_required
-def container_create():
- raise NotImplementedError
- params = dict()
- for k in request.form:
- if k.startswith('container_'):
- params[k[10:]] = request.form[k]
- container = None
- #edit = api.create_container(container, params=params)
- #return redirect("/container/{}".format(edit.ident))
-
@app.route('/container/lookup', methods=['GET'])
def container_lookup():
extid = None
@@ -121,14 +83,6 @@ def creator_history(ident):
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():
for key in ('orcid', 'wikidata_qid'):
@@ -169,14 +123,6 @@ def file_history(ident):
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():
for key in ('md5', 'sha1', 'sha256'):
@@ -223,14 +169,6 @@ def fileset_history(ident):
entity=entity,
history=history)
-@app.route('/fileset/<ident>/edit', methods=['GET'])
-def fileset_edit_view(ident):
- try:
- entity = api.get_fileset(ident)
- except ApiException as ae:
- abort(ae.status)
- return render_template('entity_edit.html')
-
@app.route('/fileset/lookup', methods=['GET'])
def fileset_lookup():
raise NotImplementedError
@@ -268,14 +206,6 @@ def webcapture_history(ident):
entity=entity,
history=history)
-@app.route('/webcapture/<ident>/edit', methods=['GET'])
-def webcapture_edit_view(ident):
- try:
- entity = api.get_webcapture(ident)
- except ApiException as ae:
- abort(ae.status)
- return render_template('entity_edit.html')
-
@app.route('/webcapture/lookup', methods=['GET'])
def webcapture_lookup():
raise NotImplementedError
@@ -313,44 +243,6 @@ def release_lookup():
abort(ae.status)
return redirect('/release/{}'.format(resp.ident))
-# XXX: figure out CSRF stuff for local dev
-@app.route('/release/create', methods=['GET', 'POST'])
-@login_required
-@app.csrf.exempt
-def release_create():
- form = ReleaseEntityForm(csrf_enabled=False) # XXX:
- if form.is_submitted():
- if form.validate_on_submit():
- # API on behalf of user
- user_api = auth_api(session['api_token'])
- if form.editgroup_id.data:
- # TODO: error handling
- eg = user_api.get_editgroup(form.editgroup_id.data)
- else:
- # if no editgroup, create one from description
- eg = user_api.create_editgroup(
- Editgroup(description=form.editgroup_description.data or None))
- # set this session editgroup_id
- session['active_editgroup_id'] = eg.editgroup_id
- print(eg.editgroup_id) # XXX: debug
- flash('Started new editgroup <a href="/editgroup/{}">{}</a>' \
- .format(eg.editgroup_id, eg.editgroup_id))
- # no merge or anything hard to do; just create the entity
- entity = form.to_entity()
- edit = user_api.create_release(entity, editgroup_id=eg.editgroup_id)
- # redirect to new release
- return redirect('/release/{}'.format(edit.ident))
- elif form.errors:
- print("user form errors: {}".format(form.errors))
- print("didn't validate...")
- elif len(form.contribs) == 0:
- form.contribs.append_entry()
- if not form.is_submitted():
- editgroup_id = session.get('active_editgroup_id', None)
- form.editgroup_id.data = editgroup_id
- return render_template('release_create.html',
- form=form, editgroup_id=editgroup_id)
-
@app.route('/release/<ident>/history', methods=['GET'])
def release_history(ident):
try:
@@ -364,51 +256,6 @@ def release_history(ident):
entity=entity,
history=history)
-# XXX: figure out CSRF stuff for local dev
-@login_required
-@app.csrf.exempt
-@app.route('/release/<ident>/edit', methods=['GET', 'POST'])
-def release_edit(ident):
- # TODO: prev_rev interlock
- # TODO: factor out editgroup active/creation stuff
- try:
- entity = api.get_release(ident)
- except ApiException as ae:
- abort(ae.status)
- form = ReleaseEntityForm(csrf_enabled=False) # XXX:
- if form.is_submitted():
- if form.validate_on_submit():
- # API on behalf of user
- user_api = auth_api(session['api_token'])
- if form.editgroup_id.data:
- # TODO: error handling
- eg = user_api.get_editgroup(form.editgroup_id.data)
- else:
- # if no editgroup, create one from description
- eg = user_api.create_editgroup(
- Editgroup(description=form.editgroup_description.data or None))
- # set this session editgroup_id
- session['active_editgroup_id'] = eg.editgroup_id
- print(eg.editgroup_id) # XXX: debug
- flash('Started new editgroup <a href="/editgroup/{}">{}</a>' \
- .format(eg.editgroup_id, eg.editgroup_id))
- # all the tricky logic is in the update method
- form.update_entity(entity)
- edit = user_api.update_release(entity.ident, entity,
- editgroup_id=eg.editgroup_id)
- # redirect to release revision
- # TODO: release_rev_view
- return redirect('/release/{}'.format(edit.ident))
- elif form.errors:
- print("user form errors (didn't validate): {}".format(form.errors))
- else:
- form = ReleaseEntityForm.from_entity(entity)
- if not form.is_submitted():
- editgroup_id = session.get('active_editgroup_id', None)
- form.editgroup_id.data = editgroup_id
- return render_template('release_edit.html',
- form=form, editgroup_id=editgroup_id, entity=entity)
-
@app.route('/release/<ident>', methods=['GET'])
def release_view(ident):
try:
@@ -433,10 +280,6 @@ def release_view(ident):
return render_template('release_view.html', release=entity,
authors=authors, 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:
@@ -450,14 +293,6 @@ def work_history(ident):
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: