New home UI
This commit is contained in:
parent
e8ee2ac4aa
commit
3d3ab23d27
15 changed files with 676 additions and 378 deletions
|
@ -110,13 +110,17 @@ urlpatterns = [
|
|||
url(r'^accounts/', include(register_patterns)),
|
||||
url(r'^', include('social_django.urls')),
|
||||
|
||||
url(r'^feed/', include([
|
||||
url(r'^problems/$', problem.ProblemFeed.as_view(), name='problem_feed'),
|
||||
url(r'^tickets/$', blog.TicketFeed.as_view(), name='ticket_feed'),
|
||||
url(r'^comments/$', blog.CommentFeed.as_view(), name='comment_feed'),
|
||||
])),
|
||||
url(r'^problems/$', problem.ProblemList.as_view(), name='problem_list'),
|
||||
url(r'^problems/random/$', problem.RandomProblem.as_view(), name='problem_random'),
|
||||
|
||||
url(r'^problem/(?P<problem>[^/]+)', include([
|
||||
url(r'^$', problem.ProblemDetail.as_view(), name='problem_detail'),
|
||||
url(r'^/editorial$', problem.ProblemSolution.as_view(), name='problem_editorial'),
|
||||
url(r'^/comments$', problem.ProblemComments.as_view(), name='problem_comments'),
|
||||
url(r'^/raw$', problem.ProblemRaw.as_view(), name='problem_raw'),
|
||||
url(r'^/pdf$', problem.ProblemPdfView.as_view(), name='problem_pdf'),
|
||||
url(r'^/pdf/(?P<language>[a-z-]+)$', problem.ProblemPdfView.as_view(), name='problem_pdf'),
|
||||
|
|
|
@ -66,6 +66,8 @@ class Comment(MPTTModel):
|
|||
contest_access = CacheDict(lambda key: Contest.objects.get(key=key).is_accessible_by(user))
|
||||
blog_access = CacheDict(lambda id: BlogPost.objects.get(id=id).can_see(user))
|
||||
|
||||
if n == -1:
|
||||
n = len(queryset)
|
||||
if user.is_superuser:
|
||||
return queryset[:n]
|
||||
if batch is None:
|
||||
|
@ -105,7 +107,7 @@ class Comment(MPTTModel):
|
|||
try:
|
||||
link = None
|
||||
if self.page.startswith('p:'):
|
||||
link = reverse('problem_comments', args=(self.page[2:],))
|
||||
link = reverse('problem_detail', args=(self.page[2:],))
|
||||
elif self.page.startswith('c:'):
|
||||
link = reverse('contest_view', args=(self.page[2:],))
|
||||
elif self.page.startswith('b:'):
|
||||
|
|
|
@ -17,10 +17,8 @@ from judge.utils.tickets import filter_visible_tickets
|
|||
from judge.utils.views import TitleMixin
|
||||
|
||||
|
||||
class PostList(ListView):
|
||||
model = BlogPost
|
||||
paginate_by = 10
|
||||
context_object_name = 'posts'
|
||||
# General view for all content list on home feed
|
||||
class FeedView(ListView):
|
||||
template_name = 'blog/list.html'
|
||||
title = None
|
||||
|
||||
|
@ -29,6 +27,56 @@ class PostList(ListView):
|
|||
return DiggPaginator(queryset, per_page, body=6, padding=2,
|
||||
orphans=orphans, allow_empty_first_page=allow_empty_first_page, **kwargs)
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(FeedView, self).get_context_data(**kwargs)
|
||||
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
|
||||
|
||||
context['page_titles'] = CacheDict(lambda page: Comment.get_page_title(page))
|
||||
|
||||
context['user_count'] = lazy(Profile.objects.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['language_count'] = lazy(Language.objects.count, int, int)
|
||||
|
||||
now = timezone.now()
|
||||
|
||||
# Dashboard stuff
|
||||
# if self.request.user.is_authenticated:
|
||||
# user = self.request.profile
|
||||
# context['recently_attempted_problems'] = (Submission.objects.filter(user=user)
|
||||
# .exclude(problem__in=user_completed_ids(user))
|
||||
# .values_list('problem__code', 'problem__name', 'problem__points')
|
||||
# .annotate(points=Max('points'), latest=Max('date'))
|
||||
# .order_by('-latest')
|
||||
# [:settings.DMOJ_BLOG_RECENTLY_ATTEMPTED_PROBLEMS_COUNT])
|
||||
|
||||
visible_contests = Contest.get_visible_contests(self.request.user).filter(is_visible=True) \
|
||||
.order_by('start_time')
|
||||
|
||||
context['current_contests'] = visible_contests.filter(start_time__lte=now, end_time__gt=now)
|
||||
context['future_contests'] = visible_contests.filter(start_time__gt=now)
|
||||
|
||||
visible_contests = Contest.get_visible_contests(self.request.user).filter(is_visible=True)
|
||||
|
||||
context['top_rated'] = Profile.objects.order_by('-rating')[:10]
|
||||
context['top_scorer'] = Profile.objects.order_by('-performance_points')[:10]
|
||||
|
||||
return context
|
||||
|
||||
|
||||
class PostList(FeedView):
|
||||
model = BlogPost
|
||||
paginate_by = 10
|
||||
context_object_name = 'posts'
|
||||
|
||||
def get_queryset(self):
|
||||
queryset = BlogPost.objects.filter(visible=True, publish_on__lte=timezone.now()) \
|
||||
.order_by('-sticky', '-publish_on') \
|
||||
|
@ -45,25 +93,7 @@ class PostList(ListView):
|
|||
context['title'] = self.title or _('Page %d of Posts') % context['page_obj'].number
|
||||
context['first_page_href'] = reverse('home')
|
||||
context['page_prefix'] = reverse('blog_post_list')
|
||||
context['comments'] = Comment.most_recent(self.request.user, 25)
|
||||
context['new_problems'] = Problem.objects.filter(is_public=True, is_organization_private=False) \
|
||||
.order_by('-date', '-id')[:settings.DMOJ_BLOG_NEW_PROBLEM_COUNT]
|
||||
context['page_titles'] = CacheDict(lambda page: Comment.get_page_title(page))
|
||||
|
||||
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
|
||||
context['user_count'] = lazy(Profile.objects.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['language_count'] = lazy(Language.objects.count, int, int)
|
||||
|
||||
context['feed_type'] = 'blog'
|
||||
context['post_comment_counts'] = {
|
||||
int(page[2:]): count for page, count in
|
||||
Comment.objects
|
||||
|
@ -71,40 +101,55 @@ class PostList(ListView):
|
|||
.values_list('page').annotate(count=Count('page')).order_by()
|
||||
}
|
||||
|
||||
now = timezone.now()
|
||||
return context
|
||||
|
||||
# Dashboard stuff
|
||||
if self.request.user.is_authenticated:
|
||||
user = self.request.profile
|
||||
context['recently_attempted_problems'] = (Submission.objects.filter(user=user)
|
||||
.exclude(problem__in=user_completed_ids(user))
|
||||
.values_list('problem__code', 'problem__name', 'problem__points')
|
||||
.annotate(points=Max('points'), latest=Max('date'))
|
||||
.order_by('-latest')
|
||||
[:settings.DMOJ_BLOG_RECENTLY_ATTEMPTED_PROBLEMS_COUNT])
|
||||
|
||||
visible_contests = Contest.get_visible_contests(self.request.user).filter(is_visible=True) \
|
||||
.order_by('start_time')
|
||||
class TicketFeed(FeedView):
|
||||
model = Ticket
|
||||
context_object_name = 'tickets'
|
||||
paginate_by = 30
|
||||
|
||||
context['current_contests'] = visible_contests.filter(start_time__lte=now, end_time__gt=now)
|
||||
context['future_contests'] = visible_contests.filter(start_time__gt=now)
|
||||
|
||||
visible_contests = Contest.get_visible_contests(self.request.user).filter(is_visible=True)
|
||||
if self.request.user.is_authenticated:
|
||||
def get_queryset(self, is_own=True):
|
||||
profile = self.request.profile
|
||||
context['own_open_tickets'] = (Ticket.objects.filter(Q(user=profile) | Q(assignees__in=[profile]), is_open=True).order_by('-id')
|
||||
if is_own:
|
||||
if self.request.user.is_authenticated:
|
||||
return (Ticket.objects.filter(Q(user=profile) | Q(assignees__in=[profile]), is_open=True).order_by('-id')
|
||||
.prefetch_related('linked_item').select_related('user__user'))
|
||||
else:
|
||||
profile = None
|
||||
context['own_open_tickets'] = []
|
||||
|
||||
return []
|
||||
else:
|
||||
# Superusers better be staffs, not the spell-casting kind either.
|
||||
if self.request.user.is_staff:
|
||||
tickets = (Ticket.objects.order_by('-id').filter(is_open=True).prefetch_related('linked_item')
|
||||
.select_related('user__user'))
|
||||
context['open_tickets'] = filter_visible_tickets(tickets, self.request.user, profile)[:10]
|
||||
return filter_visible_tickets(tickets, self.request.user, profile)
|
||||
else:
|
||||
context['open_tickets'] = []
|
||||
return []
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(TicketFeed, self).get_context_data(**kwargs)
|
||||
context['feed_type'] = 'ticket'
|
||||
context['first_page_href'] = self.request.path
|
||||
context['page_prefix'] = '?page='
|
||||
context['title'] = _('Ticket feed')
|
||||
|
||||
return context
|
||||
|
||||
|
||||
class CommentFeed(FeedView):
|
||||
model = Comment
|
||||
context_object_name = 'comments'
|
||||
paginate_by = 50
|
||||
|
||||
def get_queryset(self):
|
||||
return Comment.most_recent(self.request.user, 1000)
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(CommentFeed, self).get_context_data(**kwargs)
|
||||
context['feed_type'] = 'comment'
|
||||
context['first_page_href'] = self.request.path
|
||||
context['page_prefix'] = '?page='
|
||||
context['title'] = _('Comment feed')
|
||||
|
||||
return context
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@ from django.utils.functional import cached_property
|
|||
from django.utils.html import escape, format_html
|
||||
from django.utils.safestring import mark_safe
|
||||
from django.utils.translation import gettext as _, gettext_lazy
|
||||
from django.views.generic import DetailView, ListView, View
|
||||
from django.views.generic import ListView, View
|
||||
from django.views.generic.base import TemplateResponseMixin
|
||||
from django.views.generic.detail import SingleObjectMixin
|
||||
|
||||
|
@ -38,6 +38,7 @@ from judge.utils.problems import contest_attempted_ids, contest_completed_ids, h
|
|||
from judge.utils.strings import safe_float_or_none, safe_int_or_none
|
||||
from judge.utils.tickets import own_ticket_filter
|
||||
from judge.utils.views import QueryStringSortMixin, SingleObjectFormView, TitleMixin, generic_message
|
||||
from judge.views.blog import FeedView
|
||||
|
||||
|
||||
def get_contest_problem(problem, profile):
|
||||
|
@ -155,10 +156,13 @@ class ProblemRaw(ProblemMixin, TitleMixin, TemplateResponseMixin, SingleObjectMi
|
|||
))
|
||||
|
||||
|
||||
class ProblemDetail(ProblemMixin, SolvedProblemMixin, DetailView):
|
||||
class ProblemDetail(ProblemMixin, SolvedProblemMixin, CommentedDetailView):
|
||||
context_object_name = 'problem'
|
||||
template_name = 'problem/problem.html'
|
||||
|
||||
def get_comment_page(self):
|
||||
return 'p:%s' % self.object.code
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(ProblemDetail, self).get_context_data(**kwargs)
|
||||
user = self.request.user
|
||||
|
@ -235,6 +239,7 @@ class ProblemDetail(ProblemMixin, SolvedProblemMixin, DetailView):
|
|||
context['min_possible_vote'] = 100
|
||||
return context
|
||||
|
||||
|
||||
class DeleteVote(ProblemMixin, SingleObjectMixin, View):
|
||||
def get(self, request, *args, **kwargs):
|
||||
return HttpResponseForbidden(status=405, content_type='text/plain')
|
||||
|
@ -273,21 +278,6 @@ class Vote(ProblemMixin, SingleObjectMixin, View):
|
|||
return JsonResponse(form.errors, status=400)
|
||||
|
||||
|
||||
class ProblemComments(ProblemMixin, TitleMixin, CommentedDetailView):
|
||||
context_object_name = 'problem'
|
||||
template_name = 'problem/comments.html'
|
||||
|
||||
def get_title(self):
|
||||
return _('Disscuss {0}').format(self.object.name)
|
||||
|
||||
def get_content_title(self):
|
||||
return format_html(_(u'Discuss <a href="{1}">{0}</a>'), self.object.name,
|
||||
reverse('problem_detail', args=[self.object.code]))
|
||||
|
||||
def get_comment_page(self):
|
||||
return 'p:%s' % self.object.code
|
||||
|
||||
|
||||
class LatexError(Exception):
|
||||
pass
|
||||
|
||||
|
@ -592,6 +582,49 @@ class ProblemList(QueryStringSortMixin, TitleMixin, SolvedProblemMixin, ListView
|
|||
return HttpResponseRedirect(request.get_full_path())
|
||||
|
||||
|
||||
class ProblemFeed(FeedView):
|
||||
model = Problem
|
||||
context_object_name = 'problems'
|
||||
paginate_by = 50
|
||||
title = _('Problem feed')
|
||||
|
||||
@cached_property
|
||||
def profile(self):
|
||||
if not self.request.user.is_authenticated:
|
||||
return None
|
||||
return self.request.profile
|
||||
|
||||
def get_unsolved_queryset(self):
|
||||
filter = Q(is_public=True)
|
||||
if self.profile is not None:
|
||||
filter |= Q(authors=self.profile)
|
||||
filter |= Q(curators=self.profile)
|
||||
filter |= Q(testers=self.profile)
|
||||
queryset = Problem.objects.filter(filter).select_related('group').defer('description')
|
||||
if not self.request.user.has_perm('see_organization_problem'):
|
||||
filter = Q(is_organization_private=False)
|
||||
if self.profile is not None:
|
||||
filter |= Q(organizations__in=self.profile.organizations.all())
|
||||
queryset = queryset.filter(filter)
|
||||
if self.profile is not None:
|
||||
queryset = queryset.exclude(id__in=Submission.objects.filter(user=self.profile, points=F('problem__points'))
|
||||
.values_list('problem__id', flat=True))
|
||||
return queryset.distinct()
|
||||
|
||||
def get_queryset(self):
|
||||
queryset = self.get_unsolved_queryset()
|
||||
return queryset.order_by('?')
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(ProblemFeed, self).get_context_data(**kwargs)
|
||||
context['first_page_href'] = self.request.path
|
||||
context['page_prefix'] = '?page='
|
||||
context['feed_type'] = 'problem'
|
||||
context['title'] = self.title
|
||||
|
||||
return context
|
||||
|
||||
|
||||
class LanguageTemplateAjax(View):
|
||||
def get(self, request, *args, **kwargs):
|
||||
try:
|
||||
|
|
|
@ -2,7 +2,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: lqdoj2\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-03-10 12:30+0700\n"
|
||||
"POT-Creation-Date: 2022-03-22 04:37+0700\n"
|
||||
"PO-Revision-Date: 2021-07-20 03:44\n"
|
||||
"Last-Translator: Icyene\n"
|
||||
"Language-Team: Vietnamese\n"
|
||||
|
@ -24,7 +24,7 @@ msgstr ""
|
|||
msgid "user"
|
||||
msgstr "người dùng"
|
||||
|
||||
#: chat_box/models.py:24 judge/models/comment.py:43 judge/models/comment.py:191
|
||||
#: chat_box/models.py:24 judge/models/comment.py:43 judge/models/comment.py:193
|
||||
msgid "posted time"
|
||||
msgstr "thời gian đăng"
|
||||
|
||||
|
@ -225,7 +225,7 @@ msgstr "ảo"
|
|||
msgid "link path"
|
||||
msgstr "đường dẫn"
|
||||
|
||||
#: judge/admin/interface.py:65
|
||||
#: judge/admin/interface.py:65 templates/blog/list.html:114
|
||||
msgid "Content"
|
||||
msgstr "Nội dung"
|
||||
|
||||
|
@ -254,11 +254,11 @@ msgstr "Mạng Xã Hội"
|
|||
msgid "Taxonomy"
|
||||
msgstr ""
|
||||
|
||||
#: judge/admin/problem.py:128 templates/contest/contest.html:84
|
||||
#: templates/problem/data.html:469 templates/problem/list.html:222
|
||||
#: templates/problem/list.html:248 templates/user/base-users-table.html:10
|
||||
#: templates/user/user-about.html:36 templates/user/user-about.html:52
|
||||
#: templates/user/user-problems.html:58
|
||||
#: judge/admin/problem.py:128 judge/admin/problem.py:258
|
||||
#: templates/contest/contest.html:84 templates/problem/data.html:469
|
||||
#: templates/problem/list.html:222 templates/problem/list.html:248
|
||||
#: templates/user/base-users-table.html:10 templates/user/user-about.html:36
|
||||
#: templates/user/user-about.html:52 templates/user/user-problems.html:58
|
||||
msgid "Points"
|
||||
msgstr "Điểm"
|
||||
|
||||
|
@ -299,6 +299,19 @@ msgstr[0] "%d bài tập đã được đánh dấu riêng tư."
|
|||
msgid "Mark problems as private"
|
||||
msgstr "Đánh dấu các bài tập là riêng tư"
|
||||
|
||||
#: judge/admin/problem.py:253 judge/admin/submission.py:200
|
||||
#: templates/problem/list.html:216 templates/problem/list.html:236
|
||||
msgid "Problem code"
|
||||
msgstr "Mã bài"
|
||||
|
||||
#: judge/admin/problem.py:263 judge/admin/submission.py:205
|
||||
msgid "Problem name"
|
||||
msgstr "Tên bài"
|
||||
|
||||
#: judge/admin/problem.py:268
|
||||
msgid "Vote"
|
||||
msgstr ""
|
||||
|
||||
#: judge/admin/profile.py:34
|
||||
msgid "timezone"
|
||||
msgstr "múi giờ"
|
||||
|
@ -401,15 +414,6 @@ msgstr[0] "%d bài nộp đã được tính điểm lại."
|
|||
msgid "Rescore the selected submissions"
|
||||
msgstr "Tính điểm lại cái bài nộp"
|
||||
|
||||
#: judge/admin/submission.py:200 templates/problem/list.html:216
|
||||
#: templates/problem/list.html:236
|
||||
msgid "Problem code"
|
||||
msgstr "Mã bài"
|
||||
|
||||
#: judge/admin/submission.py:205
|
||||
msgid "Problem name"
|
||||
msgstr "Tên bài"
|
||||
|
||||
#: judge/admin/submission.py:215 templates/notification/list.html:15
|
||||
#: templates/organization/requests/log.html:10
|
||||
#: templates/organization/requests/pending.html:13
|
||||
|
@ -550,7 +554,7 @@ msgstr "g:i a j b, Y"
|
|||
msgid "{time}"
|
||||
msgstr "{time}"
|
||||
|
||||
#: judge/jinja2/datetime.py:26 templates/blog/content.html:13
|
||||
#: judge/jinja2/datetime.py:26 templates/blog/content.html:10
|
||||
#, python-brace-format
|
||||
msgid "on {time}"
|
||||
msgstr "vào {time}"
|
||||
|
@ -583,11 +587,11 @@ msgstr "Mã trang phải có dạng ^[pcs]:[a-z0-9]+$|^b:\\d+$"
|
|||
msgid "commenter"
|
||||
msgstr "người bình luận"
|
||||
|
||||
#: judge/models/comment.py:44 judge/models/comment.py:177
|
||||
#: judge/models/comment.py:44 judge/models/comment.py:179
|
||||
msgid "associated page"
|
||||
msgstr "trang tương ứng"
|
||||
|
||||
#: judge/models/comment.py:46 judge/models/problem.py:492
|
||||
#: judge/models/comment.py:46 judge/models/problem.py:493
|
||||
msgid "votes"
|
||||
msgstr "bình chọn"
|
||||
|
||||
|
@ -599,7 +603,7 @@ msgstr "ẩn bình luận"
|
|||
msgid "parent"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/comment.py:54 judge/models/comment.py:192
|
||||
#: judge/models/comment.py:54 judge/models/comment.py:194
|
||||
msgid "comment"
|
||||
msgstr "bình luận"
|
||||
|
||||
|
@ -607,24 +611,24 @@ msgstr "bình luận"
|
|||
msgid "comments"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/comment.py:137 judge/models/problem.py:462
|
||||
#: judge/models/comment.py:139 judge/models/problem.py:463
|
||||
#, python-format
|
||||
msgid "Editorial for %s"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/comment.py:172
|
||||
#: judge/models/comment.py:174
|
||||
msgid "comment vote"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/comment.py:173
|
||||
#: judge/models/comment.py:175
|
||||
msgid "comment votes"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/comment.py:182
|
||||
#: judge/models/comment.py:184
|
||||
msgid "Override comment lock"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/comment.py:190
|
||||
#: judge/models/comment.py:192
|
||||
#: src/dmoj-wpadmin/test_project/apps/books/admin.py:24
|
||||
#: src/dmoj-wpadmin/test_project/apps/books/models.py:30
|
||||
#: src/dmoj-wpadmin/test_project/apps/cds/models.py:30
|
||||
|
@ -632,22 +636,22 @@ msgstr ""
|
|||
msgid "owner"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/comment.py:193 judge/models/message.py:16
|
||||
#: judge/models/comment.py:195 judge/models/message.py:16
|
||||
msgid "read"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/comment.py:194
|
||||
#: judge/models/comment.py:196
|
||||
#: src/dmoj-wpadmin/test_project/apps/books/models.py:28
|
||||
#: src/dmoj-wpadmin/test_project/apps/cds/models.py:28
|
||||
#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:28
|
||||
msgid "category"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/comment.py:195
|
||||
#: judge/models/comment.py:197
|
||||
msgid "html link to comments, used for non-comments"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/comment.py:196
|
||||
#: judge/models/comment.py:198
|
||||
msgid "who trigger, used for non-comment"
|
||||
msgstr ""
|
||||
|
||||
|
@ -725,7 +729,7 @@ msgstr ""
|
|||
msgid "description"
|
||||
msgstr "mô tả"
|
||||
|
||||
#: judge/models/contest.py:72 judge/models/problem.py:409
|
||||
#: judge/models/contest.py:72 judge/models/problem.py:410
|
||||
#: judge/models/runtime.py:138
|
||||
msgid "problems"
|
||||
msgstr "bài tập"
|
||||
|
@ -739,7 +743,7 @@ msgid "end time"
|
|||
msgstr "thời gian kết thúc"
|
||||
|
||||
#: judge/models/contest.py:75 judge/models/problem.py:118
|
||||
#: judge/models/problem.py:433
|
||||
#: judge/models/problem.py:434
|
||||
msgid "time limit"
|
||||
msgstr "giới hạn thời gian"
|
||||
|
||||
|
@ -1037,8 +1041,8 @@ msgid "contest participations"
|
|||
msgstr "lần tham gia kỳ thi"
|
||||
|
||||
#: judge/models/contest.py:491 judge/models/contest.py:513
|
||||
#: judge/models/contest.py:554 judge/models/problem.py:408
|
||||
#: judge/models/problem.py:413 judge/models/problem.py:431
|
||||
#: judge/models/contest.py:554 judge/models/problem.py:409
|
||||
#: judge/models/problem.py:414 judge/models/problem.py:432
|
||||
#: judge/models/problem_data.py:40
|
||||
msgid "problem"
|
||||
msgstr "bài tập"
|
||||
|
@ -1176,7 +1180,7 @@ msgstr "mục cha"
|
|||
msgid "post title"
|
||||
msgstr "tiêu đề bài đăng"
|
||||
|
||||
#: judge/models/interface.py:67 judge/models/problem.py:451
|
||||
#: judge/models/interface.py:67 judge/models/problem.py:452
|
||||
msgid "authors"
|
||||
msgstr "tác giả"
|
||||
|
||||
|
@ -1184,7 +1188,7 @@ msgstr "tác giả"
|
|||
msgid "slug"
|
||||
msgstr "slug"
|
||||
|
||||
#: judge/models/interface.py:69 judge/models/problem.py:449
|
||||
#: judge/models/interface.py:69 judge/models/problem.py:450
|
||||
msgid "public visibility"
|
||||
msgstr "khả năng hiển thị công khai"
|
||||
|
||||
|
@ -1380,7 +1384,7 @@ msgid ""
|
|||
"are supported."
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/problem.py:123 judge/models/problem.py:436
|
||||
#: judge/models/problem.py:123 judge/models/problem.py:437
|
||||
msgid "memory limit"
|
||||
msgstr ""
|
||||
|
||||
|
@ -1453,82 +1457,82 @@ msgstr ""
|
|||
msgid "If private, only these organizations may see the problem."
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/problem.py:414 judge/models/problem.py:432
|
||||
#: judge/models/problem.py:415 judge/models/problem.py:433
|
||||
#: judge/models/runtime.py:111
|
||||
msgid "language"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/problem.py:415
|
||||
#: judge/models/problem.py:416
|
||||
msgid "translated name"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/problem.py:416
|
||||
#: judge/models/problem.py:417
|
||||
msgid "translated description"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/problem.py:420
|
||||
#: judge/models/problem.py:421
|
||||
msgid "problem translation"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/problem.py:421
|
||||
#: judge/models/problem.py:422
|
||||
msgid "problem translations"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/problem.py:425
|
||||
#: judge/models/problem.py:426
|
||||
msgid "clarified problem"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/problem.py:426
|
||||
#: judge/models/problem.py:427
|
||||
msgid "clarification body"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/problem.py:427
|
||||
#: judge/models/problem.py:428
|
||||
msgid "clarification timestamp"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/problem.py:442
|
||||
#: judge/models/problem.py:443
|
||||
msgid "language-specific resource limit"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/problem.py:443
|
||||
#: judge/models/problem.py:444
|
||||
msgid "language-specific resource limits"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/problem.py:447
|
||||
#: judge/models/problem.py:448
|
||||
msgid "associated problem"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/problem.py:450
|
||||
#: judge/models/problem.py:451
|
||||
msgid "publish date"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/problem.py:452
|
||||
#: judge/models/problem.py:453
|
||||
msgid "editorial content"
|
||||
msgstr "nội dung lời giải"
|
||||
|
||||
#: judge/models/problem.py:468
|
||||
#: judge/models/problem.py:469
|
||||
msgid "solution"
|
||||
msgstr "lời giải"
|
||||
|
||||
#: judge/models/problem.py:469
|
||||
#: judge/models/problem.py:470
|
||||
msgid "solutions"
|
||||
msgstr "lời giải"
|
||||
|
||||
#: judge/models/problem.py:474
|
||||
#: judge/models/problem.py:475
|
||||
#, fuzzy
|
||||
#| msgid "point value"
|
||||
msgid "proposed point value"
|
||||
msgstr "điểm"
|
||||
|
||||
#: judge/models/problem.py:475
|
||||
#: judge/models/problem.py:476
|
||||
msgid "The amount of points you think this problem deserves."
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/problem.py:485
|
||||
#: judge/models/problem.py:486
|
||||
msgid "The time this vote was cast"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/problem.py:491
|
||||
#: judge/models/problem.py:492
|
||||
msgid "vote"
|
||||
msgstr ""
|
||||
|
||||
|
@ -2376,11 +2380,23 @@ msgstr "Giới thiệu"
|
|||
msgid "Custom Checker Sample"
|
||||
msgstr "Hướng dẫn viết trình chấm"
|
||||
|
||||
#: judge/views/blog.py:45
|
||||
#: judge/views/blog.py:93
|
||||
#, python-format
|
||||
msgid "Page %d of Posts"
|
||||
msgstr "Trang %d"
|
||||
|
||||
#: judge/views/blog.py:134
|
||||
#, fuzzy
|
||||
#| msgid "Ticket title"
|
||||
msgid "Ticket feed"
|
||||
msgstr "Tiêu đề báo cáo"
|
||||
|
||||
#: judge/views/blog.py:152
|
||||
#, fuzzy
|
||||
#| msgid "Comment body"
|
||||
msgid "Comment feed"
|
||||
msgstr "Nội dung bình luận"
|
||||
|
||||
#: judge/views/comment.py:28
|
||||
msgid "Messing around, are we?"
|
||||
msgstr "Messing around, are we?"
|
||||
|
@ -2675,65 +2691,61 @@ msgstr ""
|
|||
msgid "The user you are trying to kick is not in organization: %s."
|
||||
msgstr ""
|
||||
|
||||
#: judge/views/problem.py:68
|
||||
#: judge/views/problem.py:69
|
||||
msgid "No such problem"
|
||||
msgstr "Không có bài nào như vậy"
|
||||
|
||||
#: judge/views/problem.py:69
|
||||
#: judge/views/problem.py:70
|
||||
#, python-format
|
||||
msgid "Could not find a problem with the code \"%s\"."
|
||||
msgstr "Không tìm thấy bài tập với mã bài \"%s\"."
|
||||
|
||||
#: judge/views/problem.py:113
|
||||
#: judge/views/problem.py:114
|
||||
#, python-brace-format
|
||||
msgid "Editorial for {0}"
|
||||
msgstr "Hướng dẫn cho {0}"
|
||||
|
||||
#: judge/views/problem.py:116
|
||||
#: judge/views/problem.py:117
|
||||
#, python-brace-format
|
||||
msgid "Editorial for <a href=\"{1}\">{0}</a>"
|
||||
msgstr "Hướng dẫn cho <a href=\"{1}\">{0}</a>"
|
||||
|
||||
#: judge/views/problem.py:284
|
||||
#, python-brace-format
|
||||
msgid "Disscuss {0}"
|
||||
msgstr ""
|
||||
|
||||
#: judge/views/problem.py:287
|
||||
#, python-brace-format
|
||||
msgid "Discuss <a href=\"{1}\">{0}</a>"
|
||||
msgstr "Thảo luận <a href=\"{1}\">{0}</a>"
|
||||
|
||||
#: judge/views/problem.py:355 templates/contest/contest.html:79
|
||||
#: templates/user/user-about.html:28 templates/user/user-tabs.html:5
|
||||
#: templates/user/users-table.html:29
|
||||
#: judge/views/problem.py:342 templates/blog/list.html:121
|
||||
#: templates/contest/contest.html:79 templates/user/user-about.html:28
|
||||
#: templates/user/user-tabs.html:5 templates/user/users-table.html:29
|
||||
msgid "Problems"
|
||||
msgstr "Bài tập"
|
||||
|
||||
#: judge/views/problem.py:655
|
||||
#: judge/views/problem.py:589
|
||||
#, fuzzy
|
||||
#| msgid "Problem code"
|
||||
msgid "Problem feed"
|
||||
msgstr "Mã bài"
|
||||
|
||||
#: judge/views/problem.py:685
|
||||
msgid "Banned from submitting"
|
||||
msgstr "Bị cấm nộp bài"
|
||||
|
||||
#: judge/views/problem.py:656
|
||||
#: judge/views/problem.py:686
|
||||
msgid ""
|
||||
"You have been declared persona non grata for this problem. You are "
|
||||
"permanently barred from submitting this problem."
|
||||
msgstr "Bạn đã bị cấm nộp bài này."
|
||||
|
||||
#: judge/views/problem.py:670
|
||||
#: judge/views/problem.py:700
|
||||
msgid "Too many submissions"
|
||||
msgstr "Quá nhiều lần nộp"
|
||||
|
||||
#: judge/views/problem.py:671
|
||||
#: judge/views/problem.py:701
|
||||
msgid "You have exceeded the submission limit for this problem."
|
||||
msgstr "Bạn đã vượt quá số lần nộp cho bài này."
|
||||
|
||||
#: judge/views/problem.py:731 judge/views/problem.py:734
|
||||
#: judge/views/problem.py:761 judge/views/problem.py:764
|
||||
#, python-format
|
||||
msgid "Submit to %(problem)s"
|
||||
msgstr "Nộp bài cho %(problem)s"
|
||||
|
||||
#: judge/views/problem.py:749
|
||||
#: judge/views/problem.py:779
|
||||
msgid "Clone Problem"
|
||||
msgstr "Nhân bản bài tập"
|
||||
|
||||
|
@ -2881,7 +2893,7 @@ msgid "Submission of %(problem)s by %(user)s"
|
|||
msgstr "Bài nộp của %(user)s cho bài %(problem)s"
|
||||
|
||||
#: judge/views/submission.py:244 judge/views/submission.py:245
|
||||
#: templates/problem/problem.html:165
|
||||
#: templates/problem/problem.html:194
|
||||
msgid "All submissions"
|
||||
msgstr "Tất cả bài nộp"
|
||||
|
||||
|
@ -3299,10 +3311,6 @@ msgstr "Chỉnh sửa"
|
|||
msgid " posted on %(time)s"
|
||||
msgstr "đã đăng vào %(time)s"
|
||||
|
||||
#: templates/blog/content.html:13
|
||||
msgid "posted"
|
||||
msgstr "đã đăng"
|
||||
|
||||
#: templates/blog/dashboard.html:21
|
||||
#, python-format
|
||||
msgid ""
|
||||
|
@ -3314,59 +3322,63 @@ msgstr ""
|
|||
" vào %(time)s\n"
|
||||
" "
|
||||
|
||||
#: templates/blog/list.html:93
|
||||
msgid "Blog"
|
||||
#: templates/blog/list.html:107
|
||||
msgid "Feed"
|
||||
msgstr ""
|
||||
|
||||
#: templates/blog/list.html:95
|
||||
#: templates/blog/list.html:109
|
||||
msgid "Events"
|
||||
msgstr "Sự kiện"
|
||||
|
||||
#: templates/blog/list.html:100
|
||||
#: templates/blog/list.html:117
|
||||
msgid "News"
|
||||
msgstr "Tin tức"
|
||||
|
||||
#: templates/blog/list.html:115 templates/problem/list.html:347
|
||||
#: templates/problem/problem.html:370
|
||||
#: templates/blog/list.html:125 templates/comments/list.html:2
|
||||
msgid "Comments"
|
||||
msgstr "Bình luận"
|
||||
|
||||
#: templates/blog/list.html:129
|
||||
msgid "Tickets"
|
||||
msgstr "Báo cáo"
|
||||
|
||||
#: templates/blog/list.html:148
|
||||
msgid "You have no ticket"
|
||||
msgstr "Bạn không có báo cáo"
|
||||
|
||||
#: templates/blog/list.html:163 templates/problem/list.html:347
|
||||
#: templates/problem/problem.html:407
|
||||
msgid "Clarifications"
|
||||
msgstr "Thông báo"
|
||||
|
||||
#: templates/blog/list.html:121
|
||||
#: templates/blog/list.html:169
|
||||
msgid "Add"
|
||||
msgstr "Thêm mới"
|
||||
|
||||
#: templates/blog/list.html:140 templates/problem/list.html:369
|
||||
#: templates/problem/problem.html:381
|
||||
#: templates/blog/list.html:188 templates/problem/list.html:369
|
||||
#: templates/problem/problem.html:418
|
||||
msgid "No clarifications have been made at this time."
|
||||
msgstr "Không có thông báo nào."
|
||||
|
||||
#: templates/blog/list.html:148
|
||||
#: templates/blog/list.html:196
|
||||
msgid "Ongoing contests"
|
||||
msgstr "Kỳ thi đang diễn ra"
|
||||
|
||||
#: templates/blog/list.html:156
|
||||
#: templates/blog/list.html:204
|
||||
msgid "Ends in"
|
||||
msgstr "Còn"
|
||||
|
||||
#: templates/blog/list.html:166
|
||||
#: templates/blog/list.html:214
|
||||
msgid "Upcoming contests"
|
||||
msgstr "Kỳ thi sắp diễn ra"
|
||||
|
||||
#: templates/blog/list.html:184
|
||||
msgid "My open tickets"
|
||||
msgstr "Báo cáo dành cho tôi"
|
||||
#: templates/blog/list.html:230
|
||||
msgid "Top Rating"
|
||||
msgstr "Top Rating"
|
||||
|
||||
#: templates/blog/list.html:206
|
||||
msgid "New tickets"
|
||||
msgstr "Báo cáo mới"
|
||||
|
||||
#: templates/blog/list.html:227
|
||||
msgid "New problems"
|
||||
msgstr "Bài tập mới"
|
||||
|
||||
#: templates/blog/list.html:244
|
||||
msgid "Comment stream"
|
||||
msgstr "Dòng bình luận"
|
||||
#: templates/blog/list.html:246
|
||||
msgid "Top Score"
|
||||
msgstr "Top Score"
|
||||
|
||||
#: templates/chat/chat.html:18
|
||||
msgid "Recent"
|
||||
|
@ -3435,10 +3447,6 @@ msgstr "Tắt thông báo"
|
|||
msgid "users are online"
|
||||
msgstr "người đang trực tuyến"
|
||||
|
||||
#: templates/comments/list.html:2
|
||||
msgid "Comments"
|
||||
msgstr "Bình luận"
|
||||
|
||||
#: templates/comments/list.html:18 templates/comments/list.html:27
|
||||
msgid "Please login to vote"
|
||||
msgstr "Đăng nhập để vote"
|
||||
|
@ -4347,122 +4355,126 @@ msgstr "Bạn có chắc muốn tính điểm lại %(count)d bài nộp?"
|
|||
msgid "Rescore all submissions"
|
||||
msgstr "Tính điểm lại các bài nộp"
|
||||
|
||||
#: templates/problem/problem.html:130
|
||||
#: templates/problem/problem.html:159
|
||||
msgid "View as PDF"
|
||||
msgstr "Xem PDF"
|
||||
|
||||
#: templates/problem/problem.html:139 templates/problem/problem.html:149
|
||||
#: templates/problem/problem.html:154
|
||||
#: templates/problem/problem.html:168 templates/problem/problem.html:178
|
||||
#: templates/problem/problem.html:183
|
||||
msgid "Submit solution"
|
||||
msgstr "Nộp bài"
|
||||
|
||||
#: templates/problem/problem.html:142
|
||||
#: templates/problem/problem.html:171
|
||||
#, python-format
|
||||
msgid "%(counter)s submission left"
|
||||
msgid_plural "%(counter)s submissions left"
|
||||
msgstr[0] "Còn %(counter)s lần nộp"
|
||||
|
||||
#: templates/problem/problem.html:150
|
||||
#: templates/problem/problem.html:179
|
||||
msgid "0 submissions left"
|
||||
msgstr "Còn 0 lần nộp"
|
||||
|
||||
#: templates/problem/problem.html:162
|
||||
#: templates/problem/problem.html:191
|
||||
msgid "My submissions"
|
||||
msgstr "Bài nộp của tôi"
|
||||
|
||||
#: templates/problem/problem.html:166
|
||||
#: templates/problem/problem.html:195
|
||||
msgid "Best submissions"
|
||||
msgstr "Các bài nộp tốt nhất"
|
||||
|
||||
#: templates/problem/problem.html:170
|
||||
msgid "Discuss"
|
||||
msgstr "Thảo luận"
|
||||
|
||||
#: templates/problem/problem.html:174
|
||||
#: templates/problem/problem.html:199
|
||||
msgid "Read editorial"
|
||||
msgstr "Xem hướng dẫn"
|
||||
|
||||
#: templates/problem/problem.html:179
|
||||
#: templates/problem/problem.html:204
|
||||
msgid "Manage tickets"
|
||||
msgstr "Xử lý báo cáo"
|
||||
|
||||
#: templates/problem/problem.html:183
|
||||
#: templates/problem/problem.html:208
|
||||
msgid "Edit problem"
|
||||
msgstr "Chỉnh sửa bài"
|
||||
|
||||
#: templates/problem/problem.html:185
|
||||
#: templates/problem/problem.html:210
|
||||
msgid "Edit test data"
|
||||
msgstr "Chỉnh sửa test"
|
||||
|
||||
#: templates/problem/problem.html:190
|
||||
#: templates/problem/problem.html:215
|
||||
msgid "My tickets"
|
||||
msgstr "Báo cáo của tôi"
|
||||
|
||||
#: templates/problem/problem.html:198
|
||||
#: templates/problem/problem.html:223
|
||||
msgid "Manage submissions"
|
||||
msgstr "Quản lý bài nộp"
|
||||
|
||||
#: templates/problem/problem.html:204
|
||||
#: templates/problem/problem.html:229
|
||||
msgid "Clone problem"
|
||||
msgstr "Nhân bản bài"
|
||||
|
||||
#: templates/problem/problem.html:211
|
||||
#: templates/problem/problem.html:236
|
||||
msgid "Points:"
|
||||
msgstr "Điểm:"
|
||||
|
||||
#: templates/problem/problem.html:214 templates/problem/problem.html:216
|
||||
#: templates/problem/problem.html:239 templates/problem/problem.html:241
|
||||
msgid "(partial)"
|
||||
msgstr "(thành phần)"
|
||||
|
||||
#: templates/problem/problem.html:221
|
||||
#: templates/problem/problem.html:246
|
||||
msgid "Time limit:"
|
||||
msgstr "Thời gian:"
|
||||
|
||||
#: templates/problem/problem.html:233
|
||||
#: templates/problem/problem.html:258
|
||||
msgid "Memory limit:"
|
||||
msgstr "Bộ nhớ:"
|
||||
|
||||
#: templates/problem/problem.html:252
|
||||
#: templates/problem/problem.html:277
|
||||
msgid "Author:"
|
||||
msgid_plural "Authors:"
|
||||
msgstr[0] "Tác giả:"
|
||||
|
||||
#: templates/problem/problem.html:267
|
||||
#: templates/problem/problem.html:292
|
||||
msgid "Problem type"
|
||||
msgid_plural "Problem types"
|
||||
msgstr[0] "Dạng bài"
|
||||
|
||||
#: templates/problem/problem.html:280
|
||||
#: templates/problem/problem.html:305
|
||||
msgid "Allowed languages"
|
||||
msgstr "Ngôn ngữ cho phép"
|
||||
|
||||
#: templates/problem/problem.html:288
|
||||
#: templates/problem/problem.html:313
|
||||
#, python-format
|
||||
msgid "No %(lang)s judge online"
|
||||
msgstr "Không có máy chấm cho %(lang)s"
|
||||
|
||||
#: templates/problem/problem.html:299
|
||||
#: templates/problem/problem.html:324
|
||||
msgid "Judge:"
|
||||
msgid_plural "Judges:"
|
||||
msgstr[0] "Máy chấm:"
|
||||
|
||||
#: templates/problem/problem.html:316
|
||||
#: templates/problem/problem.html:341
|
||||
msgid "none available"
|
||||
msgstr "không có sẵn"
|
||||
|
||||
#: templates/problem/problem.html:331
|
||||
#: templates/problem/problem.html:356
|
||||
#, python-format
|
||||
msgid "This problem has %(length)s clarification(s)"
|
||||
msgstr "Bài này có %(length)s thông báo"
|
||||
|
||||
#: templates/problem/problem.html:359
|
||||
#: templates/problem/problem.html:384
|
||||
msgid "Request clarification"
|
||||
msgstr "Yêu cầu làm rõ đề"
|
||||
|
||||
#: templates/problem/problem.html:361
|
||||
#: templates/problem/problem.html:386
|
||||
msgid "Report an issue"
|
||||
msgstr "Báo cáo một vấn đề"
|
||||
|
||||
#: templates/problem/problem.html:395
|
||||
msgid "View comments"
|
||||
msgstr "Xem bình luận"
|
||||
|
||||
#: templates/problem/problem.html:397
|
||||
msgid "Be the first to comment"
|
||||
msgstr "Bình luận đầu tiên"
|
||||
|
||||
#: templates/problem/raw.html:64
|
||||
msgid "Time Limit:"
|
||||
msgstr "Giới hạn thời gian:"
|
||||
|
@ -4557,11 +4569,11 @@ msgstr "Không có máy chấm có thể chấm bài này."
|
|||
msgid "Submit!"
|
||||
msgstr "Nộp bài!"
|
||||
|
||||
#: templates/problem/voting-controls.html:53
|
||||
#: templates/problem/voting-controls.html:55
|
||||
msgid "Edit difficulty"
|
||||
msgstr "Thay đổi độ khó"
|
||||
|
||||
#: templates/problem/voting-controls.html:61
|
||||
#: templates/problem/voting-controls.html:63
|
||||
msgid "Vote difficulty"
|
||||
msgstr "Bình chọn độ khó"
|
||||
|
||||
|
@ -4573,14 +4585,6 @@ msgstr "Bạn thấy độ khó bài này thế nào?"
|
|||
msgid "This helps us improve the site"
|
||||
msgstr "Bình chọn giúp admin cải thiện bài tập."
|
||||
|
||||
#: templates/problem/voting-form.html:38
|
||||
msgid "Easy"
|
||||
msgstr "Dễ"
|
||||
|
||||
#: templates/problem/voting-form.html:39
|
||||
msgid "Hard"
|
||||
msgstr "Khó"
|
||||
|
||||
#: templates/problem/voting-stats.html:29
|
||||
msgid "Voting Statistics"
|
||||
msgstr "Thống kê"
|
||||
|
@ -4992,6 +4996,10 @@ msgstr "Tốt nhất"
|
|||
msgid "%(user)s's"
|
||||
msgstr ""
|
||||
|
||||
#: templates/ticket/feed.html:20
|
||||
msgid " replied"
|
||||
msgstr ""
|
||||
|
||||
#: templates/ticket/list.html:135 templates/ticket/ticket.html:273
|
||||
msgid "Reopened: "
|
||||
msgstr "Mở lại: "
|
||||
|
@ -5331,3 +5339,30 @@ msgstr "Thông tin"
|
|||
#: templates/widgets/select_all.html:8
|
||||
msgid "Check all"
|
||||
msgstr "Chọn tất cả"
|
||||
|
||||
#~ msgid "Discuss <a href=\"{1}\">{0}</a>"
|
||||
#~ msgstr "Thảo luận <a href=\"{1}\">{0}</a>"
|
||||
|
||||
#~ msgid "posted"
|
||||
#~ msgstr "đã đăng"
|
||||
|
||||
#~ msgid "My open tickets"
|
||||
#~ msgstr "Báo cáo dành cho tôi"
|
||||
|
||||
#~ msgid "New tickets"
|
||||
#~ msgstr "Báo cáo mới"
|
||||
|
||||
#~ msgid "New problems"
|
||||
#~ msgstr "Bài tập mới"
|
||||
|
||||
#~ msgid "Comment stream"
|
||||
#~ msgstr "Dòng bình luận"
|
||||
|
||||
#~ msgid "Discuss"
|
||||
#~ msgstr "Thảo luận"
|
||||
|
||||
#~ msgid "Easy"
|
||||
#~ msgstr "Dễ"
|
||||
|
||||
#~ msgid "Hard"
|
||||
#~ msgstr "Khó"
|
||||
|
|
|
@ -232,7 +232,7 @@ header {
|
|||
}
|
||||
|
||||
#navigation {
|
||||
position: relative;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
|
@ -382,7 +382,7 @@ hr {
|
|||
}
|
||||
|
||||
#content {
|
||||
margin: 1em auto auto;
|
||||
margin: 4.5em auto 1em auto;
|
||||
|
||||
// Header
|
||||
width: 90%;
|
||||
|
|
|
@ -2,9 +2,9 @@
|
|||
|
||||
.blog-content {
|
||||
padding-right: 0em;
|
||||
flex: 73.5%;
|
||||
vertical-align: top;
|
||||
margin-right: 0;
|
||||
width: 100%;
|
||||
|
||||
.post {
|
||||
border: 1px dotted grey;
|
||||
|
@ -33,7 +33,8 @@
|
|||
}
|
||||
|
||||
.blog-sidebar {
|
||||
flex: 26.5%;
|
||||
width: 100%;
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.blog-sidebox {
|
||||
|
@ -88,6 +89,19 @@
|
|||
color: #555;
|
||||
}
|
||||
|
||||
@media (max-width: 799px) {
|
||||
.left-sidebar-header {
|
||||
display: none;
|
||||
}
|
||||
.left-sidebar-item {
|
||||
display: inline-block;
|
||||
}
|
||||
.blog-left-sidebar {
|
||||
text-align: right;
|
||||
padding-right: 1em;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
}
|
||||
@media (min-width: 800px) {
|
||||
.blog-content, .blog-sidebar {
|
||||
display: block !important;
|
||||
|
@ -104,6 +118,28 @@
|
|||
#blog-container {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.blog-content {
|
||||
max-width: 71.5%;
|
||||
margin-left: 10%;
|
||||
}
|
||||
|
||||
.blog-sidebar {
|
||||
width: 18%;
|
||||
}
|
||||
|
||||
.blog-left-sidebar {
|
||||
width: 8%;
|
||||
margin-right: 1em;
|
||||
position: fixed;
|
||||
height: 100%;
|
||||
margin-top: -4em;
|
||||
padding-top: 4em;
|
||||
}
|
||||
|
||||
.feed-table {
|
||||
font-size: small;
|
||||
}
|
||||
}
|
||||
|
||||
#mobile.tabs {
|
||||
|
@ -135,3 +171,63 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.blog-box {
|
||||
border-bottom: 1px solid black;
|
||||
width: 90%;
|
||||
margin-bottom: 2.5em;
|
||||
padding: 0.5em 1.25em;
|
||||
background-color: white;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.blog-description {
|
||||
max-height: 20em;
|
||||
overflow: hidden;
|
||||
overflow-wrap: anywhere;
|
||||
padding-bottom: 1em;
|
||||
}
|
||||
.problem-feed-name {
|
||||
display: inline;
|
||||
font-weight: bold;
|
||||
}
|
||||
.problem-feed-name a {
|
||||
color: #0645ad;
|
||||
}
|
||||
.problem-feed-info-entry {
|
||||
display: inline;
|
||||
float: right;
|
||||
}
|
||||
.problem-feed-types {
|
||||
color: gray;
|
||||
}
|
||||
|
||||
.blog-left-sidebar {
|
||||
background-color: #f0f1f3;
|
||||
color: #616161;
|
||||
}
|
||||
|
||||
.left-sidebar-item {
|
||||
padding: 1em 0.5em;
|
||||
text-align: center;
|
||||
}
|
||||
.left-sidebar-item:hover {
|
||||
background-color: lightgray;
|
||||
cursor: pointer;
|
||||
}
|
||||
.sidebar-icon {
|
||||
font-size: x-large;
|
||||
margin-bottom: 0.1em;
|
||||
color: black;
|
||||
}
|
||||
.left-sidebar-header {
|
||||
text-align: center;
|
||||
padding-bottom: 1em;
|
||||
border-bottom: 1px solid black;
|
||||
color: black;
|
||||
border-radius: 0;
|
||||
}
|
||||
.feed-table {
|
||||
margin: 0;
|
||||
}
|
|
@ -1,18 +1,16 @@
|
|||
<section class="{% if post.sticky %}sticky {% endif %}post">
|
||||
<h2 class="title">
|
||||
<a href="{{ url('blog_post', post.id, post.slug) }}">{{ post.title }}</a>
|
||||
</h2>
|
||||
<span style="float: right">
|
||||
<section class="{% if post.sticky %}sticky {% endif %}blog-box">
|
||||
<div style="margin-bottom: 0.5em">
|
||||
<span class="time">
|
||||
{%- if post.sticky %}<i title="Sticky" class="fa fa-star fa-fw"></i>{% endif -%}
|
||||
{% with authors=post.authors.all() %}
|
||||
{%- if authors -%}
|
||||
<img src="{{gravatar(authors[0])}}" style="width: 1.5em; border-radius: 50%; margin-bottom: -0.3em">
|
||||
<span class="post-authors">{{ link_users(authors) }}</span>
|
||||
{%- endif -%}
|
||||
{% endwith %}
|
||||
{{_('posted')}} {{ relative_time(post.publish_on, abs=_('on {time}'), rel=_('{time}')) -}}
|
||||
• {{ relative_time(post.publish_on, abs=_('on {time}'), rel=_('{time}')) -}}
|
||||
{%- if post.sticky %} • <i title="Sticky" class="fa fa-star fa-fw"></i>{% endif -%}
|
||||
</span>
|
||||
<span>
|
||||
<span style="float: right">
|
||||
<a href="{{ url('blog_post', post.id, post.slug) }}#comments" class="blog-comment-count-link">
|
||||
<i class="fa fa-comments blog-comment-icon"></i>
|
||||
<span class="blog-comment-count">
|
||||
|
@ -20,8 +18,10 @@
|
|||
</span>
|
||||
</a>
|
||||
</span>
|
||||
</span>
|
||||
<div style="clear:both"></div>
|
||||
</div>
|
||||
<h2 class="title">
|
||||
<a href="{{ url('blog_post', post.id, post.slug) }}">{{ post.title }}</a>
|
||||
</h2>
|
||||
{% if post.is_organization_private and show_organization_private_icon %}
|
||||
<div class="organization-tags">
|
||||
{% for org in post.organizations.all() %}
|
||||
|
@ -33,7 +33,7 @@
|
|||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="summary content-description">
|
||||
<div class="summary content-description blog-description">
|
||||
{% cache 86400 'post_summary' post.id %}
|
||||
{{ post.summary|default(post.content, true)|markdown('blog', 'svg', lazy_load=True)|reference|str|safe }}
|
||||
{% endcache %}
|
||||
|
|
|
@ -16,30 +16,10 @@
|
|||
clear: both;
|
||||
}
|
||||
}
|
||||
.post {
|
||||
margin: 0 2%;
|
||||
}
|
||||
.time {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.post:first-child {
|
||||
margin-top: 0.6em;
|
||||
}
|
||||
|
||||
.own-open-tickets .title a, .open-tickets .title a {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.own-open-tickets .object, .open-tickets .object {
|
||||
margin-left: 1em;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.open-tickets .user {
|
||||
margin-left: 1em;
|
||||
}
|
||||
|
||||
.no-clarifications-message {
|
||||
font-style: italic;
|
||||
text-align: center;
|
||||
|
@ -56,6 +36,11 @@
|
|||
#add-clarification:hover {
|
||||
color: cyan;
|
||||
}
|
||||
|
||||
#content {
|
||||
width: 99%;
|
||||
margin-left: 0;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
|
@ -81,6 +66,35 @@
|
|||
$('.blog-content').hide();
|
||||
$('.blog-sidebar').show();
|
||||
});
|
||||
$('.blog-description').on('click', function() {
|
||||
var max_height = $(this).css('max-height');
|
||||
if (max_height !== 'fit-content') {
|
||||
$(this).css('max-height', 'fit-content');
|
||||
$(this).parent().css('background-image', 'inherit')
|
||||
.css('padding-bottom', '0.5em');
|
||||
$(this).css('cursor', 'auto');
|
||||
}
|
||||
})
|
||||
$('.blog-description').each(function() {
|
||||
if ($(this).prop('scrollHeight') > $(this).height() ) {
|
||||
$(this).parent().css('background-image', '-webkit-linear-gradient(bottom, lightgray, lightgray 3%, transparent 8%, transparent 100%)');
|
||||
$(this).parent().css('padding-bottom', '0');
|
||||
$(this).css('cursor', 'pointer');
|
||||
}
|
||||
});
|
||||
$('.left-sidebar-item').on('click', function() {
|
||||
var url = $(this).attr('data-href');
|
||||
window.location.replace(url);
|
||||
});
|
||||
{% if feed_type == 'blog' %}
|
||||
$('#news-icon').css('color', 'green');
|
||||
{% elif feed_type == 'problem' %}
|
||||
$('#problems-icon').css('color', 'green');
|
||||
{% elif feed_type == 'ticket' %}
|
||||
$('#tickets-icon').css('color', 'green');
|
||||
{% elif feed_type == 'comment' %}
|
||||
$('#comments-icon').css('color', 'green');
|
||||
{% endif %}
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
@ -90,20 +104,54 @@
|
|||
<div id="mobile" class="tabs">
|
||||
<ul>
|
||||
<li id="blog-tab" class="tab active"><a href="#">
|
||||
<i class="tab-icon fa fa-info-circle"></i> {{ _('Blog') }}
|
||||
<i class="tab-icon fa fa-info-circle"></i> {{ _('Feed') }}
|
||||
</a></li>
|
||||
<li id="event-tab" class="tab"><a href="#"><i class="tab-icon fa fa-rss"></i> {{ _('Events') }}</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div id="blog-container">
|
||||
<div class="blog-content sidebox">
|
||||
<h3>{{ _('News') }} <i class="fa fa-terminal"></i></h3>
|
||||
<div class="sidebox-content">
|
||||
<div class="blog-left-sidebar">
|
||||
<h3 class="left-sidebar-header">{{_('Content')}}</h3>
|
||||
<div class="left-sidebar-item" data-href="{{url('home')}}">
|
||||
<div class="sidebar-icon" id="news-icon"><i class="fa fa-rss"></i></div>
|
||||
{{_('News')}}
|
||||
</div>
|
||||
<div class="left-sidebar-item" data-href="{{url('problem_feed')}}">
|
||||
<div class="sidebar-icon" id="problems-icon"><i class="fa fa-tasks"></i></div>
|
||||
{{_('Problems')}}
|
||||
</div>
|
||||
<div class="left-sidebar-item" data-href="{{url('comment_feed')}}">
|
||||
<div class="sidebar-icon" id="comments-icon"><i class="fa fa-comments"></i></div>
|
||||
{{_('Comments')}}
|
||||
</div>
|
||||
<div class="left-sidebar-item" data-href="{{url('ticket_feed')}}">
|
||||
<div class="sidebar-icon" id="tickets-icon"><i class="fa fa-question-circle"></i></div>
|
||||
{{_('Tickets')}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="blog-content">
|
||||
{% set show_organization_private_icon=True %}
|
||||
{% if feed_type == 'blog' %}
|
||||
{% for post in posts %}
|
||||
{% include "blog/content.html" %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% elif feed_type == 'problem' %}
|
||||
{% for problem in problems %}
|
||||
{% include "problem/feed.html" %}
|
||||
{% endfor %}
|
||||
{% elif feed_type == 'ticket' %}
|
||||
{% if tickets %}
|
||||
{% for ticket in tickets %}
|
||||
{% include "ticket/feed.html" %}
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
<h3 style="text-align: center">{{_('You have no ticket')}}</h3>
|
||||
{% endif %}
|
||||
{% elif feed_type == 'comment' %}
|
||||
{% for comment in comments %}
|
||||
{% include "comments/feed.html" %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% if page_obj.num_pages > 1 %}
|
||||
<div style="margin-bottom:10px;margin-top:10px">{% include "list-pages.html" %}</div>
|
||||
{% endif %}
|
||||
|
@ -178,85 +226,36 @@
|
|||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if own_open_tickets %}
|
||||
<div class="blog-sidebox sidebox">
|
||||
<h3>{{ _('My open tickets') }} <i class="fa fa-question-circle"></i></h3>
|
||||
<div class="sidebox-content">
|
||||
<ul class="own-open-tickets">
|
||||
{% for ticket in own_open_tickets %}
|
||||
<li>
|
||||
<div class="title">
|
||||
<a href="{{ url('ticket', ticket.id) }}">{{ ticket.title }}</a>
|
||||
</div>
|
||||
<div class="object">
|
||||
<a href="{{ ticket.linked_item.get_absolute_url() }}">
|
||||
{{ ticket.linked_item|item_title }}</a>
|
||||
</div>
|
||||
<div>{{ link_user(ticket.user) }}</div>
|
||||
</li>
|
||||
<h3>{{ _('Top Rating') }} <i class="fa fa-trophy"></i></h3>
|
||||
<div class="sidebox-content" style="padding: 0; border: 0">
|
||||
<table class="table feed-table">
|
||||
<tbody>
|
||||
{% for user in top_rated %}
|
||||
<tr>
|
||||
<td style="padding: 7px 2px"><b>{{loop.index}}</b></td>
|
||||
<td>{{link_user(user)}}</td>
|
||||
<td>{{user.rating}}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if open_tickets %}
|
||||
<div class="blog-sidebox sidebox">
|
||||
<h3>{{ _('New tickets') }} <i class="fa fa-exclamation-circle"></i></h3>
|
||||
<div class="sidebox-content">
|
||||
<ul class="open-tickets">
|
||||
{% for ticket in open_tickets %}
|
||||
<li>
|
||||
<div class="title">
|
||||
<a href="{{ url('ticket', ticket.id) }}">{{ ticket.title }}</a>
|
||||
</div>
|
||||
<div class="object">
|
||||
<a href="{{ ticket.linked_item.get_absolute_url() }}">
|
||||
{{ ticket.linked_item|item_title }}</a>
|
||||
</div>
|
||||
<div>{{ link_user(ticket.user) }}</div>
|
||||
</li>
|
||||
<h3>{{ _('Top Score') }} <i class="fa fa-trophy"></i></h3>
|
||||
<div class="sidebox-content" style="padding: 0; border: 0">
|
||||
<table class="table feed-table">
|
||||
<tbody>
|
||||
{% for user in top_scorer %}
|
||||
<tr>
|
||||
<td style="padding: 7px 2px"><b>{{loop.index}}</b></td>
|
||||
<td>{{link_user(user)}}</td>
|
||||
<td>{{ user.performance_points|floatformat(0) }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="blog-sidebox sidebox">
|
||||
<h3>{{ _('New problems') }} <i class="fa fa-puzzle-piece"></i>
|
||||
</h3>
|
||||
<div class="sidebox-content">
|
||||
<ul class="problem-list">
|
||||
{% for problem in new_problems %}
|
||||
<li><a href="{{ url('problem_detail', problem.code) }}">{{ problem.name }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<span class="rssatom">
|
||||
<a href="{{ url('problem_rss') }}"><span><i class="fa fa-rss"></i></span> RSS</a>
|
||||
/
|
||||
<a href="{{ url('problem_atom') }}">Atom</a>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="blog-sidebox sidebox">
|
||||
<h3>{{ _('Comment stream') }} <i class="fa fa-comments"></i></h3>
|
||||
<div class="sidebox-content">
|
||||
<ul>
|
||||
{% for comment in comments %}
|
||||
<li>
|
||||
<span style="padding-left:0.25em" class="poster">
|
||||
{{ link_user(comment.author) }}
|
||||
</span> →
|
||||
<a href="{{ comment.link }}#comment-{{ comment.id }}">{{ page_titles[comment.page] }}</a>
|
||||
</li>{% endfor %}
|
||||
</ul>
|
||||
<span class="rssatom">
|
||||
<a href="{{ url('comment_rss') }}"><span><i class="fa fa-rss"></i></span> RSS</a>
|
||||
/
|
||||
<a href="{{ url('comment_atom') }}">Atom</a>
|
||||
</span>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<style>
|
||||
#content {
|
||||
margin: -1em 1em 0 0;
|
||||
margin: 2.5em 1em 0 0;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar {
|
||||
|
|
18
templates/comments/feed.html
Normal file
18
templates/comments/feed.html
Normal file
|
@ -0,0 +1,18 @@
|
|||
<div class="blog-box">
|
||||
<h3 class="problem-feed-name">
|
||||
<a href="{{ comment.link }}#comment-{{ comment.id }}">
|
||||
{{ page_titles[comment.page] }}
|
||||
</a>
|
||||
</h3>
|
||||
{% with author=comment.author %}
|
||||
{% if author %}
|
||||
<div class="problem-feed-info-entry">
|
||||
<i class="fa fa-pencil-square-o fa-fw"></i>
|
||||
<span class="pi-value">{{ link_user(author) }}</span>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
<div class='blog-description content-description'>
|
||||
{{ comment.body |markdown("comment", MATH_ENGINE)|reference|str|safe }}
|
||||
</div>
|
||||
</div>
|
|
@ -1,28 +0,0 @@
|
|||
{% extends "common-content.html" %}
|
||||
|
||||
{% block content_js_media %}
|
||||
{% include "comments/media-js.html" %}
|
||||
{% endblock %}
|
||||
|
||||
{% block content_media %}
|
||||
{% include "comments/media-css.html" %}
|
||||
<style>
|
||||
#comment-header {
|
||||
display: none;
|
||||
}
|
||||
.no-comments-message {
|
||||
margin-top: 0;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
{% include "comments/list.html" %}
|
||||
{% endblock %}
|
||||
|
||||
{% block bodyend %}
|
||||
{% if REQUIRE_JAX %}
|
||||
{% include "mathjax-load.html" %}
|
||||
{% endif %}
|
||||
{% include "comments/math.html" %}
|
||||
{% endblock %}
|
28
templates/problem/feed.html
Normal file
28
templates/problem/feed.html
Normal file
|
@ -0,0 +1,28 @@
|
|||
<div class="blog-box">
|
||||
<h3 class="problem-feed-name">
|
||||
<a href="{{ url('problem_detail', problem.code) }}">
|
||||
{{ problem.name }}
|
||||
</a>
|
||||
</h3>
|
||||
{% with authors=problem.authors.all() %}
|
||||
{% if authors %}
|
||||
<div class="problem-feed-info-entry">
|
||||
<i class="fa fa-pencil-square-o fa-fw"></i>
|
||||
<span class="pi-value">{{ link_users(authors) }}</span>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
{% if true %}
|
||||
<div class="problem-feed-types">
|
||||
<i class="fa fa-tag"></i>
|
||||
{% for type in problem.types_list %}
|
||||
<span class="type-tag">{{ type }}</span>{% if not loop.last %}, {% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class='blog-description content-description'>
|
||||
{% cache 86400 'problem_html' problem.id MATH_ENGINE LANGUAGE_CODE %}
|
||||
{{ problem.description|markdown("problem", MATH_ENGINE)|reference|str|safe }}
|
||||
{% endcache %}
|
||||
</div>
|
||||
</div>
|
|
@ -1,5 +1,6 @@
|
|||
{% extends "common-content.html" %}
|
||||
{% block content_media %}
|
||||
{% include "comments/media-css.html" %}
|
||||
<style>
|
||||
.title-state {
|
||||
font-size: 2em;
|
||||
|
@ -54,10 +55,30 @@
|
|||
#clarification_header:hover {
|
||||
color: orange;
|
||||
}
|
||||
|
||||
#comment-announcement {
|
||||
margin-top: 1em;
|
||||
background-color: lightgray;
|
||||
border-radius: 30px;
|
||||
padding: 0.5em;
|
||||
text-align: center;
|
||||
cursor: pointer;
|
||||
color: dimgrey;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#comment-announcement:hover {
|
||||
background-color: gray;
|
||||
}
|
||||
|
||||
#comment-section {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
{% block content_js_media %}
|
||||
{% include "comments/media-js.html" %}
|
||||
{% if request.in_contest_mode %}
|
||||
<script type="text/javascript">
|
||||
window.register_contest_notification("{{url('contest_clarification_ajax', request.participation.contest.key)}}");
|
||||
|
@ -79,6 +100,14 @@
|
|||
$('#clarification_header_container').hide();
|
||||
window.scrollTo(0, document.body.scrollHeight);
|
||||
})
|
||||
$('#comment-announcement').on('click', function() {
|
||||
$('#comment-section').show();
|
||||
$('#comment-announcement').hide();
|
||||
})
|
||||
|
||||
if (window.location.href.includes('#comment')) {
|
||||
$('#comment-announcement').click();
|
||||
}
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
@ -164,13 +193,9 @@
|
|||
{% endif %}
|
||||
<div><a href="{{ url('chronological_submissions', problem.code) }}">{{ _('All submissions') }}</a></div>
|
||||
<div><a href="{{ url('ranked_submissions', problem.code) }}">{{ _('Best submissions') }}</a></div>
|
||||
|
||||
{% if not contest_problem or not contest_problem.contest.use_clarifications %}
|
||||
<hr>
|
||||
<div><a href="{{ url('problem_comments', problem.code) }}">{{ _('Discuss') }}</a></div>
|
||||
{% endif %}
|
||||
{% if editorial and editorial.is_public and
|
||||
not (request.user.is_authenticated and request.profile.current_contest) %}
|
||||
<hr>
|
||||
<div><a href="{{ url('problem_editorial', problem.code) }}">{{ _('Read editorial') }}</a></div>
|
||||
{% endif %}
|
||||
{% if can_edit_problem %}
|
||||
|
@ -361,6 +386,18 @@
|
|||
{{ _('Report an issue') }}
|
||||
{%- endif -%}
|
||||
</a>
|
||||
<div style="clear: both"></div>
|
||||
{% endif %}
|
||||
{% if not (contest_problem and contest_problem.contest.use_clarifications) %}
|
||||
<div id="comment-announcement-container">
|
||||
<div id="comment-announcement">
|
||||
{% if has_comments %}
|
||||
{{_('View comments')}} ({{comment_list.count()}})
|
||||
{% else %}
|
||||
{{_('Be the first to comment')}}
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
|
@ -381,6 +418,10 @@
|
|||
<p class="no-comments-message">{{ _('No clarifications have been made at this time.') }}</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% else %}
|
||||
<div id="comment-section">
|
||||
{% include "comments/list.html" %}
|
||||
</div>
|
||||
{% endif %}
|
||||
<iframe name="raw_problem" id="raw_problem"></iframe>
|
||||
{% endblock %}
|
||||
|
|
25
templates/ticket/feed.html
Normal file
25
templates/ticket/feed.html
Normal file
|
@ -0,0 +1,25 @@
|
|||
<div class="blog-box">
|
||||
<h3 class="problem-feed-name">
|
||||
<a href="{{ url('ticket', ticket.id) }}">
|
||||
{{ ticket.title }}
|
||||
</a>
|
||||
-
|
||||
<a href="{{ ticket.linked_item.get_absolute_url() }}">
|
||||
{{ ticket.linked_item|item_title }}</a>
|
||||
</h3>
|
||||
{% with author=ticket.user %}
|
||||
{% if author %}
|
||||
<div class="problem-feed-info-entry">
|
||||
<i class="fa fa-pencil-square-o fa-fw"></i>
|
||||
<span class="pi-value">{{ link_user(author) }}</span>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
<div class="problem-feed-types">
|
||||
<i class="fa fa-tag"></i>
|
||||
{{link_user(ticket.messages.last().user)}} {{_(' replied')}}
|
||||
</div>
|
||||
<div class='blog-description content-description'>
|
||||
{{ ticket.messages.last().body |markdown("ticket", MATH_ENGINE)|reference|str|safe }}
|
||||
</div>
|
||||
</div>
|
Loading…
Reference in a new issue