Add clarification to problem list page
This commit is contained in:
parent
425354a2de
commit
c973250814
5 changed files with 56 additions and 27 deletions
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
Loading…
Add table
Reference in a new issue