Add clarification to problem list page

This commit is contained in:
cuom1999 2021-10-19 17:41:53 -05:00
parent 425354a2de
commit c973250814
5 changed files with 56 additions and 27 deletions

View file

@ -57,7 +57,8 @@ class PostList(ListView):
clarifications = ProblemClarification.objects.filter(problem__in=participation.contest.problems.all()) clarifications = ProblemClarification.objects.filter(problem__in=participation.contest.problems.all())
context['has_clarifications'] = clarifications.count() > 0 context['has_clarifications'] = clarifications.count() > 0
context['clarifications'] = clarifications.order_by('-date') context['clarifications'] = clarifications.order_by('-date')
if participation.contest.is_editable_by(self.request.user):
context['can_edit_contest'] = True
context['user_count'] = lazy(Profile.objects.count, int, int) context['user_count'] = lazy(Profile.objects.count, int, int)
context['problem_count'] = lazy(Problem.objects.filter(is_public=True).count, int, int) context['problem_count'] = lazy(Problem.objects.filter(is_public=True).count, int, int)
context['submission_count'] = lazy(Submission.objects.count, int, int) context['submission_count'] = lazy(Submission.objects.count, int, int)
@ -105,11 +106,6 @@ class PostList(ListView):
else: else:
context['open_tickets'] = [] context['open_tickets'] = []
if self.request.in_contest:
if self.request.user.is_superuser or \
self.request.profile in self.request.participation.contest.authors.all() or \
self.request.profile in self.request.participation.contest.curators.all():
context['can_edit_contest'] = True
return context return context

View file

@ -919,22 +919,9 @@ class NewContestClarificationView(ContestMixin, TitleMixin, SingleObjectFormView
class ContestClarificationAjax(ContestMixin, DetailView): class ContestClarificationAjax(ContestMixin, DetailView):
template_name = 'contest/clarification-ajax.html'\
def is_accessible(self):
if not self.request.user.is_authenticated:
return False
if not self.request.in_contest:
return False
if not self.request.participation.contest == self.object:
return False
return self.request.user.is_superuser or \
self.request.profile in self.request.participation.contest.authors.all() or \
self.request.profile in self.request.participation.contest.curators.all()
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
self.object = self.get_object() self.object = self.get_object()
if not self.is_accessible(): if not self.object.is_accessible_by(request.user):
raise Http404() raise Http404()
polling_time = 1 # minute polling_time = 1 # minute

View file

@ -27,8 +27,8 @@ from django.views.generic.detail import SingleObjectMixin
from judge.comments import CommentedDetailView from judge.comments import CommentedDetailView
from judge.forms import ProblemCloneForm, ProblemSubmitForm from judge.forms import ProblemCloneForm, ProblemSubmitForm
from judge.models import ContestProblem, ContestSubmission, Judge, Language, Problem, ProblemGroup, \ from judge.models import ContestProblem, ContestSubmission, Judge, Language, Problem, ProblemClarification, \
ProblemTranslation, ProblemType, RuntimeVersion, Solution, Submission, SubmissionSource, \ ProblemGroup, ProblemTranslation, ProblemType, RuntimeVersion, Solution, Submission, SubmissionSource, \
TranslatedProblemForeignKeyQuerySet, Organization TranslatedProblemForeignKeyQuerySet, Organization
from judge.pdf_problems import DefaultPdfMaker, HAS_PDF from judge.pdf_problems import DefaultPdfMaker, HAS_PDF
from judge.utils.diggpaginator import DiggPaginator from judge.utils.diggpaginator import DiggPaginator
@ -439,6 +439,15 @@ class ProblemList(QueryStringSortMixin, TitleMixin, SolvedProblemMixin, ListView
context['point_start'], context['point_end'], context['point_values'] = 0, 0, {} context['point_start'], context['point_end'], context['point_values'] = 0, 0, {}
context['hide_contest_scoreboard'] = self.contest.scoreboard_visibility in \ context['hide_contest_scoreboard'] = self.contest.scoreboard_visibility in \
(self.contest.SCOREBOARD_AFTER_CONTEST, self.contest.SCOREBOARD_AFTER_PARTICIPATION) (self.contest.SCOREBOARD_AFTER_CONTEST, self.contest.SCOREBOARD_AFTER_PARTICIPATION)
context['has_clarifications'] = False
if self.request.user.is_authenticated:
participation = self.request.profile.current_contest
if participation:
clarifications = ProblemClarification.objects.filter(problem__in=participation.contest.problems.all())
context['has_clarifications'] = clarifications.count() > 0
context['clarifications'] = clarifications.order_by('-date')
if participation.contest.is_editable_by(self.request.user):
context['can_edit_contest'] = True
return context return context
def get_noui_slider_points(self): def get_noui_slider_points(self):

View file

@ -335,17 +335,19 @@ window.register_contest_notification = function(url) {
console.log("Fail to update clarification"); console.log("Fail to update clarification");
}) })
.done(function(data) { .done(function(data) {
try {
JSON.parse(data);
}
catch (e) {
return;
}
for (i of data) { for (i of data) {
window.notify_clarification(i); window.notify_clarification(i);
} }
if (data.status == 403) { if (data.status == 403) {
console.log("Fail to retrieve data"); console.log("Fail to retrieve data");
} }
else {
$('#chat-online-content').html(data).find('.toggle').each(function () {
register_toggle($(this));
});;
}
}) })
} }
get_clarifications(); get_clarifications();

View file

@ -335,6 +335,41 @@
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
{% if request.in_contest and request.participation.contest.use_clarifications %}
<br><br>
{% if can_edit_contest %}
<div style="float: right; font-size: 1.2em">
<a href="{{url('new_contest_clarification', request.participation.contest.key)}}"><i class="fa fa-plus-circle" style="color:green"></i> <u>{{_('Add clarifications')}}</u></a>
</div>
{% endif %}
{% if has_clarifications %}
<div style="font-size: 1.2em; font-style: bold">
<i class="fa fa-question-circle"></i> {{_('Clarifications')}}</div>
<table class="table">
<tr>
<th>{{_('Problem')}}</th>
<th>{{_('Time')}}</th>
<th>{{_('Description')}}</th>
</tr>
{% for clarification in clarifications %}
<tr>
<td>
<a href="{{ url('problem_detail', clarification.problem.code) }}"
class="problem">
{{ clarification.problem.name }}
</a>
</td>
<td class="time">{{ relative_time(clarification.date) }}</td>
<td><p style="overflow-wrap: break-word; word-break: break-word">{{clarification.description}}</p></td>
</tr>
{% endfor %}
</table>
{% else %}
<p style="font-style: italic; text-align: center">
{{ _('No clarifications have been made at this time.') }}</center>
</p>
{% endif %}
{% endif %}
{% if page_obj.num_pages > 1 %} {% if page_obj.num_pages > 1 %}
<div style="margin-top:10px;">{% include "list-pages.html" %}</div> <div style="margin-top:10px;">{% include "list-pages.html" %}</div>
{% endif %} {% endif %}