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)
|
id = Column(Integer, primary_key=True)
|
||||||
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
|
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
|
||||||
comment_id = Column(Integer, ForeignKey("comments.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)
|
result = Column(Enum(VolunteerJanitorResult), default=VolunteerJanitorResult.Pending, nullable=False)
|
||||||
|
|
||||||
Index('volunteer_comment_index', user_id, comment_id)
|
Index('volunteer_comment_index', user_id, comment_id)
|
||||||
|
|
|
@ -4,12 +4,16 @@ from files.__main__ import app
|
||||||
from files.classes.user import User
|
from files.classes.user import User
|
||||||
import files.helpers.jinja2
|
import files.helpers.jinja2
|
||||||
from files.helpers.wrappers import auth_required
|
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
|
from files.routes.volunteer_common import VolunteerDuty
|
||||||
import files.routes.volunteer_janitor
|
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
|
@files.helpers.jinja2.template_function
|
||||||
def volunteer_available_for(u: Optional[User]) -> bool:
|
def volunteer_available_for(u: Optional[User]) -> bool:
|
||||||
|
@ -45,3 +49,18 @@ def volunteer(v: User):
|
||||||
g.db.commit()
|
g.db.commit()
|
||||||
|
|
||||||
return render_template("volunteer.html", v=v, duty=duty)
|
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 = VolunteerJanitorRecord()
|
||||||
record.user_id = v.id
|
record.user_id = v.id
|
||||||
record.comment_id = item
|
record.comment_id = item
|
||||||
record.edited_utc = sqlalchemy.func.now()
|
record.recorded_utc = sqlalchemy.func.now()
|
||||||
record.result = VolunteerJanitorResult.Pending
|
record.result = VolunteerJanitorResult.Pending
|
||||||
g.db.add(record)
|
g.db.add(record)
|
||||||
|
|
||||||
|
@ -29,6 +29,9 @@ class VolunteerDutyJanitor(VolunteerDuty):
|
||||||
def embed_template(self) -> str:
|
def embed_template(self) -> str:
|
||||||
return "volunteer_janitor.html"
|
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:
|
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
|
# also, let's make sure it hasn't already been looked at by this user
|
||||||
seen_records = g.db.query(VolunteerJanitorRecord) \
|
seen_records = g.db.query(VolunteerJanitorRecord) \
|
||||||
|
.where(VolunteerJanitorRecord.comment_id.in_(nonuser_reports)) \
|
||||||
.where(VolunteerJanitorRecord.user_id == u.id) \
|
.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})
|
final_reported = list({report.comment_id for report in nonuser_reports} - {record.comment_id for record in seen_records})
|
||||||
else:
|
else:
|
||||||
|
@ -75,3 +79,12 @@ def get_duty(u: User) -> VolunteerDutyJanitor:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
return VolunteerDutyJanitor(random.sample(final_reported, k = min(3, len(final_reported))))
|
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
|
there is no volunteering to do, but thanks
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
{% 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>
|
<div>
|
||||||
{% from duty.embed_template() import display %}
|
{% from duty.embed_template() import display with context %}
|
||||||
{{ display(duty) }}
|
{{ display(duty) }}
|
||||||
|
<input form="volunteer_submit" autocomplete="off" class="btn btn-primary ml-auto" type="submit" value="Submit">
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,24 @@
|
||||||
{% macro display(duty) %}
|
{% 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 %}
|
{% 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