summaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/fatcat_web/routes.py44
-rw-r--r--python/fatcat_web/templates/editgroup_view.html58
2 files changed, 90 insertions, 12 deletions
diff --git a/python/fatcat_web/routes.py b/python/fatcat_web/routes.py
index 7a148e94..e20cd3c5 100644
--- a/python/fatcat_web/routes.py
+++ b/python/fatcat_web/routes.py
@@ -6,7 +6,7 @@ from flask import Flask, render_template, send_from_directory, request, \
from flask_login import login_required
from flask_wtf.csrf import CSRFError
-from fatcat_client import Editgroup
+from fatcat_client import Editgroup, EditgroupAnnotation
from fatcat_client.rest import ApiException
from fatcat_tools.transforms import *
from fatcat_web import app, api, auth_api, priv_api
@@ -313,19 +313,51 @@ def editgroup_view(ident):
try:
eg = api.get_editgroup(str(ident))
eg.editor = api.get_editor(eg.editor_id)
+ eg.annotations = api.get_editgroup_annotations(eg.editgroup_id, expand="editors")
except ApiException as ae:
abort(ae.status)
# TODO: idomatic check for login?
- auth_to_submit = False
- auth_to_accept = False
+ auth_to = dict(
+ submit=False,
+ accept=False,
+ annotate=False,
+ )
if session.get('editor'):
user = load_user(session['editor']['editor_id'])
+ auth_to['annotate'] = True
if user.is_admin or user.editor_id == eg.editor_id:
- auth_to_submit = True
+ auth_to['submit'] = True
if user.is_admin:
- auth_to_accept = True
+ auth_to['accept'] = True
return render_template('editgroup_view.html', editgroup=eg,
- auth_to_submit=auth_to_submit, auth_to_accept=auth_to_accept)
+ auth_to=auth_to)
+
+@app.route('/editgroup/<ident>/annotation', methods=['POST'])
+@login_required
+def editgroup_create_annotation(ident):
+ app.csrf.protect()
+ comment_markdown = request.form.get('comment_markdown')
+ if not comment_markdown:
+ app.logger.info("empty comment field")
+ abort(400)
+ # on behalf of user...
+ user_api = auth_api(session['api_token'])
+ try:
+ eg = user_api.get_editgroup(str(ident))
+ if eg.changelog_index:
+ flash("Editgroup already accepted")
+ abort(400)
+ ega = EditgroupAnnotation(
+ comment_markdown=comment_markdown,
+ extra=None,
+ )
+ user_api.create_editgroup_annotation(eg.editgroup_id, ega)
+ except ApiException as ae:
+ app.logger.info(ae)
+ abort(ae.status)
+ return redirect('/editgroup/{}'.format(ident))
+
+# XXX: editor's annotations
@app.route('/editgroup/<ident>/accept', methods=['POST'])
@login_required
diff --git a/python/fatcat_web/templates/editgroup_view.html b/python/fatcat_web/templates/editgroup_view.html
index 37771273..2f61671d 100644
--- a/python/fatcat_web/templates/editgroup_view.html
+++ b/python/fatcat_web/templates/editgroup_view.html
@@ -1,4 +1,6 @@
{% extends "base.html" %}
+{% import "entity_macros.html" as entity_macros %}
+
{% block body %}
{% macro edit_list(edits, entity_type, entity_name) -%}
@@ -37,13 +39,13 @@
{% block editgroupheader %}
{% if not editgroup.changelog_index %}
<div class="ui right floated center aligned segment">
- {% if auth_to_accept %}
+ {% 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 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() }}"/>
@@ -67,6 +69,11 @@
<div class="sub header"><code>editgroup {{ editgroup.editgroup_id }}</code></div></h1>
{% endblock %}
+<p><b>What is an editgroup?</b>
+An editgroup is a set of entity edits, bundled together into a coherent,
+reviewable bundle.
+<br>
+
<br><b>Status:</b>
{% if editgroup.changelog_index %}
Merged (<a href="/changelog/{{ editgroup.changelog_index }}">Changelog #{{ editgroup.changelog_index }}</a>)
@@ -95,11 +102,50 @@
{{ edit_list(editgroup.edits.webcaptures, "webcapture", "Web Capture") }}
</div>
-
<br>
-<p><b>What is an editgroup?</b>
-An editgroup is a set of entity edits, bundled together into a coherent,
-reviewable bundle.
+<h2 class="ui header">Comments and Annotations</h2>
+{% 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>
+ {% else %}
+ <i class="icon user"></i>
+ {% endif %}
+ <b><a href="/editor/{{ annotation.editor_id }}">{{ annotation.editor.username}}</a></b>
+ {% if annotation.editor.is_admin %}
+ <span class="ui tiny olive label">Admin</span>
+ {% endif %}
+ at {{ annotation.created.strftime("%Y-%m-%d %H:%M:%S") }}
+ </div>
+ {% if annotation.extra %}
+ <div class="ui attached segment">
+ {{ entity_macros.extra_metadata(annotation.extra) }}
+ </div>
+ {% endif %}
+ <div class="ui bottom attached segment">
+ {{ annotation.comment_markdown }}
+ </div>
+ </div>
+{% else %}
+ <i>None!</i>
+{% endfor %}
+
+{% if auth_to.annotate and not editgroup.changelog_index %}
+ <div class="ui segment">
+ <h3 class="ui header">Add Comment</h3>
+ <form class="ui form" id="submit_editgroup_annotation_form" method="POST" action="/editgroup/{{ editgroup.editgroup_id }}/annotation">
+ <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
+ <div class="field">
+ <textarea rows="2" name="comment_markdown" required type="text" value=""></textarea>
+ </div>
+ <button class="ui right floated primary button">
+ <i class="icon edit"></i> Submit
+ </button>
+ <br>
+ </form><br>
+ </div>
+{% endif %}
{% endblock %}