Volunteer Janitor: Response recording.
This commit is contained in:
parent
0a8bbae290
commit
0f91324603
7 changed files with 106 additions and 9 deletions
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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 %}
|
||||
|
||||
|
|
|
@ -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 %}
|
||||
|
|
11
files/templates/volunteer_submit.html
Normal file
11
files/templates/volunteer_submit.html
Normal file
|
@ -0,0 +1,11 @@
|
|||
{% extends "default.html" %}
|
||||
|
||||
{% block pagetitle %}Volunteer Submitted{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div>
|
||||
tenks
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
|
@ -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 ###
|
Loading…
Add table
Add a link
Reference in a new issue