Skip to content

Commit 9e096fd

Browse files
Add latest interacting admin to user question schema, and show it in AWS
1 parent f1ef02d commit 9e096fd

5 files changed

Lines changed: 34 additions & 5 deletions

File tree

cms/db/__init__.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
# Contest Management System - http://cms-dev.github.io/
55
# Copyright © 2010-2012 Giovanni Mascellani <mascellani@poisson.phc.unipi.it>
6-
# Copyright © 2010-2017 Stefano Maggiolo <s.maggiolo@gmail.com>
6+
# Copyright © 2010-2018 Stefano Maggiolo <s.maggiolo@gmail.com>
77
# Copyright © 2010-2012 Matteo Boscariol <boscarim@hotmail.com>
88
# Copyright © 2013 Bernard Blackham <bernard@largestprime.net>
99
# Copyright © 2013-2018 Luca Wehrstedt <luca.wehrstedt@gmail.com>
@@ -103,8 +103,8 @@
103103
from .base import Base
104104
from .fsobject import FSObject, LargeObject
105105
from .contest import Contest, Announcement
106-
from .user import User, Team, Participation, Message, Question
107106
from .admin import Admin
107+
from .user import User, Team, Participation, Message, Question
108108
from .task import Task, Statement, Attachment, Dataset, Manager, Testcase
109109
from .submission import Submission, File, Token, SubmissionResult, \
110110
Executable, Evaluation
@@ -148,4 +148,5 @@ def get_submission_results_for_dataset(self, dataset):
148148
.options(subqueryload(SubmissionResult.evaluations))\
149149
.all()
150150

151+
151152
Dataset.get_submission_results = get_submission_results_for_dataset

cms/db/user.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
# Contest Management System - http://cms-dev.github.io/
55
# Copyright © 2010-2012 Giovanni Mascellani <mascellani@poisson.phc.unipi.it>
6-
# Copyright © 2010-2015 Stefano Maggiolo <s.maggiolo@gmail.com>
6+
# Copyright © 2010-2018 Stefano Maggiolo <s.maggiolo@gmail.com>
77
# Copyright © 2010-2012 Matteo Boscariol <boscarim@hotmail.com>
88
# Copyright © 2012-2018 Luca Wehrstedt <luca.wehrstedt@gmail.com>
99
# Copyright © 2015 William Di Luigi <williamdiluigi@gmail.com>
@@ -44,7 +44,7 @@
4444

4545
from cmscommon.crypto import generate_random_password, build_password
4646

47-
from . import CastingArray, Codename, Base, Contest
47+
from . import CastingArray, Codename, Base, Admin, Contest
4848

4949

5050
class User(Base):
@@ -379,3 +379,15 @@ class Question(Base):
379379
participation = relationship(
380380
Participation,
381381
back_populates="questions")
382+
383+
# Latest admin to interact with the question (null if no interactions
384+
# yet, or if the admin has been later deleted). Admins only loosely "own" a
385+
# question, so we do not back populate any field in Admin, nor delete the
386+
# question if the admin gets deleted.
387+
admin_id = Column(
388+
Integer,
389+
ForeignKey(Admin.id,
390+
onupdate="CASCADE", ondelete="SET NULL"),
391+
nullable=True,
392+
index=True)
393+
admin = relationship(Admin)

cms/server/admin/handlers/contestquestion.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
# Contest Management System - http://cms-dev.github.io/
55
# Copyright © 2010-2013 Giovanni Mascellani <mascellani@poisson.phc.unipi.it>
6-
# Copyright © 2010-2015 Stefano Maggiolo <s.maggiolo@gmail.com>
6+
# Copyright © 2010-2018 Stefano Maggiolo <s.maggiolo@gmail.com>
77
# Copyright © 2010-2012 Matteo Boscariol <boscarim@hotmail.com>
88
# Copyright © 2012-2014 Luca Wehrstedt <luca.wehrstedt@gmail.com>
99
# Copyright © 2014 Artem Iglikov <artem.iglikov@gmail.com>
@@ -99,6 +99,7 @@ def post(self, contest_id, question_id):
9999
question.reply_text = ""
100100

101101
question.reply_timestamp = make_datetime()
102+
question.admin = self.current_user
102103

103104
if self.try_commit():
104105
logger.info("Reply sent to user %s in contest %s for "
@@ -129,6 +130,7 @@ def post(self, contest_id, question_id):
129130

130131
# Commit the change.
131132
question.ignored = should_ignore
133+
question.admin = self.current_user
132134
if self.try_commit():
133135
logger.info("Question '%s' by user %s in contest %s has "
134136
"been %s",

cms/server/admin/static/aws_style.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,10 @@ body.admin .notifications .ignore_reply {
625625
padding-right: 0.5em;
626626
}
627627

628+
body.admin .notifications .notification_admin_owner {
629+
font-style: italic;
630+
}
631+
628632
body.admin .notifications .notification_close {
629633
background-color: #E475FF;
630634
border-left: 0.143em solid #E475FF;

cms/server/admin/templates/questions.html

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,20 @@ <h1>Questions</h1>
5151
<div class="notification_subject">{{ msg.subject }}</div>
5252
<div class="notification_text preserve_line_breaks">{{ msg.text }}</div>
5353
{% if msg.reply_timestamp is not none %}
54+
<hr>
5455
<div class="notification_subject">Reply: {{ msg.reply_subject }}</div>
5556
<div class="notification_text preserve_line_breaks">{{ msg.reply_text }}</div>
57+
<hr>
58+
<div class="notification_admin_owner">
59+
Reply from: {{ msg.admin.name if msg.admin is not none else "<unknown>" }}</div>
5660
{% else %}
61+
<hr>
5762
<div class="notification_subject">Not yet replied.</div>
63+
<hr>
64+
{% if not msg.admin is none and msg.ignored %}
65+
<div class="notification_admin_owner">
66+
Ignored by: {{ msg.admin is none and "<deleted>" or msg.admin.name }}</div>
67+
{% endif %}
5868
{% endif %}
5969
{% if admin.permission_all or admin.permission_messaging %}
6070
{% if msg.reply_timestamp is none %}

0 commit comments

Comments
 (0)