From c9f1f9a44f88ffe7b382475f4f7cf372ad586330 Mon Sep 17 00:00:00 2001 From: Tim Van Baak Date: Fri, 10 Apr 2020 15:10:09 -0700 Subject: [PATCH] Add review workflow --- amanuensis/config/context.py | 5 +++ amanuensis/resources/editor.js | 2 +- amanuensis/server/forms.py | 8 +++- amanuensis/server/lexicon.py | 48 ++++++++++++++++++++++- amanuensis/templates/lexicon/editor.html | 4 +- amanuensis/templates/lexicon/review.html | 20 ++++++++++ amanuensis/templates/lexicon/session.html | 7 ++++ 7 files changed, 88 insertions(+), 6 deletions(-) create mode 100644 amanuensis/templates/lexicon/review.html diff --git a/amanuensis/config/context.py b/amanuensis/config/context.py index 16ed2c3..9bbe460 100644 --- a/amanuensis/config/context.py +++ b/amanuensis/config/context.py @@ -61,6 +61,11 @@ class ConfigDirectoryContext(): raise MissingConfigError(fpath) os.delete(fpath) + def ls(self): + """Lists all files in this directory.""" + filenames = os.listdir(self.path) + return filenames + class ConfigFileMixin(): def config(self, edit=False): diff --git a/amanuensis/resources/editor.js b/amanuensis/resources/editor.js index 3b47718..aed7f26 100644 --- a/amanuensis/resources/editor.js +++ b/amanuensis/resources/editor.js @@ -59,7 +59,7 @@ function update(article) { } function updateEditorStatus() { - var ready = !!params.article.status.ready + var ready = !!params.article.status.ready || !!params.article.status.approved; document.getElementById("editor-title").disabled = ready; document.getElementById("editor-content").disabled = ready; var submitButton = document.getElementById("button-submit"); diff --git a/amanuensis/server/forms.py b/amanuensis/server/forms.py index 5718a3b..2717ed9 100644 --- a/amanuensis/server/forms.py +++ b/amanuensis/server/forms.py @@ -1,7 +1,7 @@ from flask_wtf import FlaskForm from wtforms import ( StringField, PasswordField, BooleanField, SubmitField, TextAreaField, - IntegerField, SelectField) + IntegerField, SelectField, RadioField) from wtforms.validators import DataRequired, ValidationError, Optional from wtforms.widgets.html5 import NumberInput @@ -239,3 +239,9 @@ class LexiconCharacterForm(FlaskForm): char = l.character.get(cid) char.name = self.characterName.data char.signature = self.defaultSignature.data + + +class LexiconReviewForm(FlaskForm): + """/lexicon//session/review/""" + approved = RadioField("Buttons", choices=(("Y", "Approved"), ("N", "Rejected"))) + submit = SubmitField("Submit") \ No newline at end of file diff --git a/amanuensis/server/lexicon.py b/amanuensis/server/lexicon.py index 0499174..fac9885 100644 --- a/amanuensis/server/lexicon.py +++ b/amanuensis/server/lexicon.py @@ -11,7 +11,7 @@ from amanuensis.errors import MissingConfigError from amanuensis.lexicon.manage import valid_add, add_player, add_character from amanuensis.parser import parse_raw_markdown, PreviewHtmlRenderer, FeatureCounter from amanuensis.server.forms import ( - LexiconConfigForm, LexiconJoinForm,LexiconCharacterForm) + LexiconConfigForm, LexiconJoinForm,LexiconCharacterForm, LexiconReviewForm) from amanuensis.server.helpers import ( lexicon_param, player_required, editor_required, player_required_if_not_public) @@ -66,7 +66,14 @@ def get_bp(): @lexicon_param @player_required def session(name): - return render_template('lexicon/session.html') + drafts = [] + draft_ctx = g.lexicon.ctx.draft + draft_filenames = draft_ctx.ls() + for draft_filename in draft_filenames: + with draft_ctx.read(draft_filename) as draft: + if draft.status.ready and not draft.status.approved: + drafts.append(draft) + return render_template('lexicon/session.html', ready_articles=drafts) def edit_character(name, form, cid): if form.validate_on_submit(): @@ -135,6 +142,41 @@ def get_bp(): flash("Validation error") return render_template("lexicon/settings.html", form=form) + @bp.route('/session/review/', methods=['GET', 'POST']) + @lexicon_param + @editor_required + def review(name): + aid = request.args.get('aid') + if not aid: + flash("Unknown article id") + return redirect(url_for('lexicon.session', name=name)) + + draft_ctx = g.lexicon.ctx.draft + # TODO do this not terribly + draft_filename = [fn for fn in draft_ctx.ls() if aid in fn][0] + with draft_ctx.read(draft_filename) as draft: + parsed_draft = parse_raw_markdown(draft.contents) + rendered_html = parsed_draft.render(PreviewHtmlRenderer( + {'Article':'default','Phantom':None})) + + form = LexiconReviewForm() + + if form.validate_on_submit(): + with draft_ctx.edit(draft_filename) as draft: + if not draft.status.ready: + flash("Article was rescinded") + return redirect(url_for('lexicon.session', name=name)) + result = (form.approved.data == "Y") + draft.status.ready = result + draft.status.approved = result + return redirect(url_for('lexicon.session', name=name)) + + return render_template( + "lexicon/review.html", + form=form, + article_html=Markup(rendered_html)) + + @bp.route('/statistics/', methods=['GET']) @lexicon_param @player_required_if_not_public @@ -239,6 +281,8 @@ def get_bp(): def editor_update(name): article = request.json['article'] # TODO verification + # check if article was previously approved + # check extrinsic constraints for blocking errors parsed_draft = parse_raw_markdown(article['contents']) rendered_html = parsed_draft.render(PreviewHtmlRenderer( {'Article':'default','Phantom':None})) diff --git a/amanuensis/templates/lexicon/editor.html b/amanuensis/templates/lexicon/editor.html index fe9b6ac..8e6983c 100644 --- a/amanuensis/templates/lexicon/editor.html +++ b/amanuensis/templates/lexicon/editor.html @@ -68,8 +68,8 @@ {% endfor %} {% if article %} - - + + {% endif %} diff --git a/amanuensis/templates/lexicon/review.html b/amanuensis/templates/lexicon/review.html new file mode 100644 index 0000000..395b1c3 --- /dev/null +++ b/amanuensis/templates/lexicon/review.html @@ -0,0 +1,20 @@ +{% extends "lexicon/lexicon.html" %} +{% block title %}Review | {{ lexicon_title }}{% endblock %} + +{% block article %} +{{ article_html }} +{% endblock %} + +{% block evaluation %} +{% for message in get_flashed_messages() %} +{{ message }}
+{% endfor %} +
+ {{ form.hidden_tag() }} + + {{ form.approved }} +

{{ form.submit() }}

+
+{% endblock %} + +{% set template_content_blocks = [self.article(), self.evaluation()] %} \ No newline at end of file diff --git a/amanuensis/templates/lexicon/session.html b/amanuensis/templates/lexicon/session.html index 981eaa2..9b2aa4c 100644 --- a/amanuensis/templates/lexicon/session.html +++ b/amanuensis/templates/lexicon/session.html @@ -18,6 +18,13 @@ Edit default character + {% for article in ready_articles %} +
  • + + Review article by {{ g.lexicon.character[article.character].name }} + +
  • + {% endfor %} {% endblock %} {% set template_content_blocks = template_content_blocks + [self.bl_editor()] %}