Volunteer Janitor: Response recording.

This commit is contained in:
Ben Rog-Wilhelm 2022-11-20 04:11:43 -06:00 committed by Ben Rog-Wilhelm
parent 0a8bbae290
commit 0f91324603
7 changed files with 106 additions and 9 deletions

View file

@ -20,7 +20,7 @@ class VolunteerJanitorRecord(Base):
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
comment_id = Column(Integer, ForeignKey("comments.id"), nullable=False)
edited_utc = Column(DateTime, default=0, nullable=False)
recorded_utc = Column(DateTime, default=0, nullable=False)
result = Column(Enum(VolunteerJanitorResult), default=VolunteerJanitorResult.Pending, nullable=False)
Index('volunteer_comment_index', user_id, comment_id)

View file

@ -4,12 +4,16 @@ from files.__main__ import app
from files.classes.user import User
import files.helpers.jinja2
from files.helpers.wrappers import auth_required
from flask import render_template, g
import sqlalchemy
from typing import Optional
from files.routes.volunteer_common import VolunteerDuty
import files.routes.volunteer_janitor
from flask import render_template, g, request
from os import environ
import sqlalchemy
from typing import Optional
import pprint
@files.helpers.jinja2.template_function
def volunteer_available_for(u: Optional[User]) -> bool:
@ -45,3 +49,18 @@ def volunteer(v: User):
g.db.commit()
return render_template("volunteer.html", v=v, duty=duty)
@app.post("/volunteer_submit")
@auth_required
def volunteer_submit(v: User):
for k in request.values:
if not k.startswith("volunteer-"):
continue
k_processed = k.removeprefix("volunteer-")
if k_processed.startswith("janitor-"):
files.routes.volunteer_janitor.submitted(v, k_processed.removeprefix("janitor-"), request.values[k])
else:
raise ValueError("bad key, let's generate an error")
return render_template("volunteer_submit.html", v=v)

View file

@ -20,7 +20,7 @@ class VolunteerDutyJanitor(VolunteerDuty):
record = VolunteerJanitorRecord()
record.user_id = v.id
record.comment_id = item
record.edited_utc = sqlalchemy.func.now()
record.recorded_utc = sqlalchemy.func.now()
record.result = VolunteerJanitorResult.Pending
g.db.add(record)
@ -28,6 +28,9 @@ class VolunteerDutyJanitor(VolunteerDuty):
def embed_template(self) -> str:
return "volunteer_janitor.html"
def comments(self) -> list[Comment]:
return g.db.query(Comment).where(Comment.id.in_(self.choices))
def get_duty(u: User) -> VolunteerDutyJanitor:
@ -64,8 +67,9 @@ def get_duty(u: User) -> VolunteerDutyJanitor:
# also, let's make sure it hasn't already been looked at by this user
seen_records = g.db.query(VolunteerJanitorRecord) \
.where(VolunteerJanitorRecord.comment_id.in_(nonuser_reports)) \
.where(VolunteerJanitorRecord.user_id == u.id) \
.with_entities(CommentFlag.comment_id)
.with_entities(VolunteerJanitorRecord.comment_id)
final_reported = list({report.comment_id for report in nonuser_reports} - {record.comment_id for record in seen_records})
else:
@ -75,3 +79,12 @@ def get_duty(u: User) -> VolunteerDutyJanitor:
return None
return VolunteerDutyJanitor(random.sample(final_reported, k = min(3, len(final_reported))))
def submitted(v: User, key: str, val: str) -> None:
record = VolunteerJanitorRecord()
record.user_id = v.id
record.comment_id = key
record.recorded_utc = sqlalchemy.func.now()
record.result = VolunteerJanitorResult(int(val))
g.db.add(record)
g.db.commit()

View file

@ -13,9 +13,12 @@
there is no volunteering to do, but thanks
</div>
{% else %}
<form id="volunteer_submit" action="/volunteer_submit" method="post" enctype="multipart/form-data"></form>
<input form="volunteer_submit" type="hidden" name="formkey" value="{{v.formkey}}">
<div>
{% from duty.embed_template() import display %}
{% from duty.embed_template() import display with context %}
{{ display(duty) }}
<input form="volunteer_submit" autocomplete="off" class="btn btn-primary ml-auto" type="submit" value="Submit">
</div>
{% endif %}

View file

@ -1,3 +1,24 @@
{% macro display(duty) %}
janny
{% for c in duty.comments() %}
{% with comments=[c] %}
{% include "comments.html" %}
{% endwith %}
<input form="volunteer_submit" type="radio" id="vj1" name="volunteer-janitor-{{c.id}}" value="1" required="required" />
<label for="vj1">High-quality!</label>
<input form="volunteer_submit" type="radio" id="vj2" name="volunteer-janitor-{{c.id}}" value="2" required="required" />
<label for="vj2">Good</label>
<input form="volunteer_submit" type="radio" id="vj3" name="volunteer-janitor-{{c.id}}" value="3" required="required" />
<label for="vj3">Neutral</label>
<input form="volunteer_submit" type="radio" id="vj4" name="volunteer-janitor-{{c.id}}" value="4" required="required" />
<label for="vj4">Bad</label>
<input form="volunteer_submit" type="radio" id="vj5" name="volunteer-janitor-{{c.id}}" value="5" required="required" />
<label for="vj5">Deserves a warning</label>
<input form="volunteer_submit" type="radio" id="vj6" name="volunteer-janitor-{{c.id}}" value="6" required="required" />
<label for="vj6">Deserves a ban</label>
{% endfor %}
{% endmacro %}

View file

@ -0,0 +1,11 @@
{% extends "default.html" %}
{% block pagetitle %}Volunteer Submitted{% endblock %}
{% block content %}
<div>
tenks
</div>
{% endblock %}

View file

@ -0,0 +1,30 @@
"""changes to volunteer_janitor behavior
Revision ID: e2cd2818a196
Revises: 65ce80ffc30e
Create Date: 2022-11-20 10:10:48.464867+00:00
"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
# revision identifiers, used by Alembic.
revision = 'e2cd2818a196'
down_revision = '65ce80ffc30e'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('volunteer_janitor', sa.Column('recorded_utc', sa.DateTime(), nullable=False))
op.drop_column('volunteer_janitor', 'edited_utc')
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('volunteer_janitor', sa.Column('edited_utc', postgresql.TIMESTAMP(), autoincrement=False, nullable=False))
op.drop_column('volunteer_janitor', 'recorded_utc')
# ### end Alembic commands ###