Implement turn publish policy settings

This commit is contained in:
Tim Van Baak 2020-04-29 21:56:32 -07:00
parent 1f1465de6b
commit 4e13cdeff6
5 changed files with 67 additions and 22 deletions

View File

@ -318,4 +318,7 @@ def command_publish_turn(args):
from amanuensis.lexicon import attempt_publish from amanuensis.lexicon import attempt_publish
# Internal call # Internal call
attempt_publish(args.lexicon) result = attempt_publish(args.lexicon)
if not result:
logger.error('Publish failed, check lexicon log')

View File

@ -152,20 +152,46 @@ def content_constraint_analysis(
return infos, warnings, errors return infos, warnings, errors
def attempt_publish(lexicon: LexiconModel) -> None: def attempt_publish(lexicon: LexiconModel) -> bool:
""" """
If the lexicon's publsh policy allows the current set of approved If the lexicon's publsh policy allows the current set of approved
articles to be published, publish them and rebuild all pages. articles to be published, publish them and rebuild all pages.
""" """
# TODO Check against lexicon publish policy # Load all drafts
draft_ctx = lexicon.ctx.draft
drafts = {}
for draft_fn in draft_ctx.ls():
with draft_ctx.read(draft_fn) as draft_obj:
drafts[draft_fn] = draft_obj
# Check for whether the current turn can be published according to current
# publish policy
characters = [
cid for cid, char in lexicon.cfg.character.items() if char.player]
print(characters)
has_approved = {cid: 0 for cid in characters}
has_ready = {cid: 0 for cid in characters}
for draft in drafts.values():
if draft.status.approved:
has_approved[draft.character] = 1
elif draft.status.ready:
has_ready[draft.character] = 1
# If quorum isn't defined, require all characters to have an article
quorum = lexicon.cfg.publish.quorum or len(characters)
if sum(has_approved.values()) < quorum:
print(sum(has_approved.values()))
print(quorum)
lexicon.log(f'Publish failed: no quorum')
return False
# If articles are up for review, check if this blocks publish
if lexicon.cfg.publish.block_on_ready and any(has_ready.values()):
lexicon.log(f'Publish failed: articles in review')
return False
# Get the approved drafts to publish # Get the approved drafts to publish
draft_ctx = lexicon.ctx.draft to_publish = [
to_publish = [] draft_fn for draft_fn, draft in drafts.items()
for draft_fn in draft_ctx.ls(): if draft.status.approved]
with draft_ctx.read(draft_fn) as draft:
if draft.status.approved:
to_publish.append(draft_fn)
# Publish new articles # Publish new articles
publish_drafts(lexicon, to_publish) publish_drafts(lexicon, to_publish)
@ -173,6 +199,8 @@ def attempt_publish(lexicon: LexiconModel) -> None:
# Rebuild all pages # Rebuild all pages
rebuild_pages(lexicon) rebuild_pages(lexicon)
return True
def publish_drafts(lexicon: LexiconModel, filenames: Iterable[str]) -> None: def publish_drafts(lexicon: LexiconModel, filenames: Iterable[str]) -> None:
""" """
@ -185,7 +213,12 @@ def publish_drafts(lexicon: LexiconModel, filenames: Iterable[str]) -> None:
with draft_ctx.read(filename) as source: with draft_ctx.read(filename) as source:
with src_ctx.edit(filename, create=True) as dest: with src_ctx.edit(filename, create=True) as dest:
dest.update(source) dest.update(source)
dest.turn = lexicon.cfg.turn.current
draft_ctx.delete(filename) draft_ctx.delete(filename)
# Increment the turn
lexicon.log(f'Published turn {lexicon.cfg.turn.current}')
with lexicon.ctx.edit_config() as cfg:
cfg.turn.current += 1
def rebuild_pages(lexicon: LexiconModel) -> None: def rebuild_pages(lexicon: LexiconModel) -> None:

View File

@ -57,8 +57,11 @@ def session(name):
characters.append(char) characters.append(char)
form = LexiconPublishTurnForm() form = LexiconPublishTurnForm()
if form.validate_on_submit(): if form.validate_on_submit():
attempt_publish(g.lexicon) if attempt_publish(g.lexicon):
return redirect(url_for('lexicon.contents', name=name)) return redirect(url_for('lexicon.contents', name=name))
else:
flash('Publish failed')
return redirect(url_for('session.session', name=name))
return render_template( return render_template(
'session.root.jinja', 'session.root.jinja',
ready_articles=drafts, ready_articles=drafts,
@ -157,7 +160,7 @@ def settings(name):
# POST with valid data # POST with valid data
form.save(g.lexicon) form.save(g.lexicon)
flash('Settings updated') flash('Settings updated')
return redirect(url_for('session.settings', name=name)) return redirect(url_for('session.session', name=name))
@bp_session.route('/review/', methods=['GET', 'POST']) @bp_session.route('/review/', methods=['GET', 'POST'])
@ -200,17 +203,21 @@ def review(name):
citations=citations) citations=citations)
# POST with valid data # POST with valid data
if form.approved.data == LexiconReviewForm.APPROVED: if form.approved.data == LexiconReviewForm.REJECTED:
draft.status.ready = True
draft.status.approved = True
g.lexicon.log(f"Article '{draft.title}' approved ({draft.aid})")
if g.lexicon.cfg.publish.asap:
attempt_publish(g.lexicon)
else:
draft.status.ready = False draft.status.ready = False
draft.status.approved = False draft.status.approved = False
g.lexicon.log(f"Article '{draft.title}' rejected ({draft.aid})") g.lexicon.log(f"Article '{draft.title}' rejected ({draft.aid})")
return redirect(url_for('session.session', name=name)) return redirect(url_for('session.session', name=name))
else:
draft.status.ready = True
draft.status.approved = True
g.lexicon.log(f"Article '{draft.title}' approved ({draft.aid})")
# Draft was approved, check for asap publishing
if g.lexicon.cfg.publish.asap:
if attempt_publish(g.lexicon):
redirect(url_for('lexicon.contents', name=name))
return redirect(url_for('session.session', name=name))
@bp_session.route('/editor/', methods=['GET']) @bp_session.route('/editor/', methods=['GET'])

View File

@ -66,8 +66,7 @@
{% if article.character == char.cid %} {% if article.character == char.cid %}
<li> <li>
<a href="{{ url_for('session.editor', name=g.lexicon.cfg.name, aid=article.aid) }}"> <a href="{{ url_for('session.editor', name=g.lexicon.cfg.name, aid=article.aid) }}">
{{ article.title if article.title.strip() else "Untitled" }} {{ article.title if article.title.strip() else "Untitled" }}</a>
</a>
<span> <span>
{% if not article.status.ready %} {% if not article.status.ready %}
[Draft] [Draft]

View File

@ -52,6 +52,9 @@
{% for message in get_flashed_messages() %} {% for message in get_flashed_messages() %}
<span style="color: #ff0000">{{ message }}</span><br> <span style="color: #ff0000">{{ message }}</span><br>
{% endfor %} {% endfor %}
{% if g.lexicon.status == ONGOING %}
<p>Turn {{ g.lexicon.cfg.turn.current }}</p>
{% endif %}
<p>Player actions</p> <p>Player actions</p>
<ul> <ul>
{% for char in characters %} {% for char in characters %}