Skip to content

Commit b5917ac

Browse files
Add ability for admin to claim a question
1 parent 9e096fd commit b5917ac

4 files changed

Lines changed: 63 additions & 5 deletions

File tree

cms/server/admin/handlers/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# -*- coding: utf-8 -*-
33

44
# Contest Management System - http://cms-dev.github.io/
5-
# Copyright © 2015-2016 Stefano Maggiolo <s.maggiolo@gmail.com>
5+
# Copyright © 2015-2018 Stefano Maggiolo <s.maggiolo@gmail.com>
66
# Copyright © 2016 Myungwoo Chun <mc.tamaki@gmail.com>
77
# Copyright © 2016 Peyman Jabbarzade Ganje <peyman.jabarzade@gmail.com>
88
# Copyright © 2016 Amir Keivan Mohtashami <akmohtashami97@gmail.com>
@@ -61,7 +61,8 @@
6161
from .contestquestion import \
6262
QuestionsHandler, \
6363
QuestionReplyHandler, \
64-
QuestionIgnoreHandler
64+
QuestionIgnoreHandler, \
65+
QuestionClaimHandler
6566
from .contestranking import \
6667
RankingHandler
6768
from .task import \
@@ -160,6 +161,7 @@
160161
(r"/contest/([0-9]+)/questions", QuestionsHandler),
161162
(r"/contest/([0-9]+)/question/([0-9]+)/reply", QuestionReplyHandler),
162163
(r"/contest/([0-9]+)/question/([0-9]+)/ignore", QuestionIgnoreHandler),
164+
(r"/contest/([0-9]+)/question/([0-9]+)/claim", QuestionClaimHandler),
163165

164166
# Contest's ranking
165167

cms/server/admin/handlers/contestquestion.py

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,42 @@ def post(self, contest_id, question_id):
137137
question.subject,
138138
question.participation.user.username,
139139
question.participation.contest.name,
140-
["unignored", "ignored"][should_ignore])
140+
"ignored" if should_ignore else "unignored")
141+
142+
self.redirect(ref)
143+
144+
145+
class QuestionClaimHandler(BaseHandler):
146+
"""Called when the manager chooses to claim or unclaim a question."""
147+
148+
@require_permission(BaseHandler.PERMISSION_MESSAGING)
149+
def post(self, contest_id, question_id):
150+
ref = self.url("contest", contest_id, "questions")
151+
question = self.safe_get_item(Question, question_id)
152+
self.contest = self.safe_get_item(Contest, contest_id)
153+
154+
# Protect against URLs providing incompatible parameters.
155+
if self.contest is not question.participation.contest:
156+
raise tornado.web.HTTPError(404)
157+
158+
# Can claim/unclaim only a question not ignored or answered.
159+
if question.ignored or question.reply_timestamp is not None:
160+
raise tornado.web.HTTPError(405)
161+
162+
should_claim = self.get_argument("claim", "no") == "yes"
163+
164+
# Commit the change.
165+
if should_claim:
166+
question.admin = self.current_user
167+
else:
168+
question.admin = None
169+
if self.try_commit():
170+
logger.info("Question '%s' by user %s in contest %s has "
171+
"been %s by %s",
172+
question.subject,
173+
question.participation.user.username,
174+
question.participation.contest.name,
175+
"claimed" if should_claim else "unclaimed",
176+
self.current_user.name)
141177

142178
self.redirect(ref)

cms/server/admin/static/aws_style.css

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,11 @@ body.admin .notifications .answered {
620620
border: 0.143em solid #555555;
621621
}
622622

623+
body.admin .notifications .claim_reply {
624+
float: right;
625+
padding-right: 0.5em;
626+
}
627+
623628
body.admin .notifications .ignore_reply {
624629
float: right;
625630
padding-right: 0.5em;

cms/server/admin/templates/questions.html

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,28 @@ <h1>Questions</h1>
6161
<hr>
6262
<div class="notification_subject">Not yet replied.</div>
6363
<hr>
64-
{% if not msg.admin is none and msg.ignored %}
64+
{% if msg.admin is not none %}
6565
<div class="notification_admin_owner">
66-
Ignored by: {{ msg.admin is none and "<deleted>" or msg.admin.name }}</div>
66+
{{ "Ignored" if msg.ignored else "Claimed" }} by: {{ msg.admin.name }}
67+
</div>
6768
{% endif %}
6869
{% endif %}
6970
{% if admin.permission_all or admin.permission_messaging %}
7071
{% if msg.reply_timestamp is none %}
72+
{% if not msg.ignored %}
73+
<div class="claim_reply">
74+
<form class="claim_question_form" action="{{ url("contest", contest.id, "question", msg.id, "claim") }}" name="claim{{ msg.id }}" method="POST">
75+
{{ xsrf_form_html|safe }}
76+
{% if msg.admin is none %}
77+
<input type="hidden" name="claim" value="yes"/>
78+
<a href="javascript:void(0);" onclick="document.claim{{ msg.id }}.submit();">Claim</a>
79+
{% else %}
80+
<input type="hidden" name="claim" value="no"/>
81+
<a href="javascript:void(0);" onclick="document.claim{{ msg.id }}.submit();">Unclaim</a>
82+
{% endif %}
83+
</form>
84+
</div>
85+
{% endif %}
7186
<div class="ignore_reply">
7287
<form class="ignore_question_form" action="{{ url("contest", contest.id, "question", msg.id, "ignore") }}" name="ignore{{ msg.id }}" method="POST">
7388
{{ xsrf_form_html|safe }}

0 commit comments

Comments
 (0)