commit
0349af26c7
21 changed files with 1201 additions and 1139 deletions
|
@ -64,7 +64,7 @@ mariadb> exit
|
|||
```
|
||||
|
||||
- Bước 4: Cài đặt môi trường ảo (virtual env) và pull code
|
||||
- Nếu `pip3 install mysqlclient` bị lỗi thì thử chạy `sudo pip3 install mysqlclient==2.1.1`
|
||||
- Nếu `pip3 install mysqlclient` bị lỗi thì thử chạy `pip3 install mysqlclient==2.1.1`
|
||||
|
||||
```jsx
|
||||
$ python3 -m venv dmojsite
|
||||
|
|
|
@ -158,6 +158,7 @@ class ContestAdmin(CompareVersionAdmin):
|
|||
"is_visible",
|
||||
"use_clarifications",
|
||||
"hide_problem_tags",
|
||||
"public_scoreboard",
|
||||
"scoreboard_visibility",
|
||||
"run_pretests_only",
|
||||
"points_precision",
|
||||
|
|
|
@ -308,6 +308,7 @@ class EditOrganizationContestForm(ModelForm):
|
|||
"freeze_after",
|
||||
"use_clarifications",
|
||||
"hide_problem_tags",
|
||||
"public_scoreboard",
|
||||
"scoreboard_visibility",
|
||||
"run_pretests_only",
|
||||
"points_precision",
|
||||
|
|
22
judge/migrations/0169_public_scoreboard.py
Normal file
22
judge/migrations/0169_public_scoreboard.py
Normal file
|
@ -0,0 +1,22 @@
|
|||
# Generated by Django 3.2.18 on 2023-09-17 01:55
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("judge", "0168_css_background"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name="contest",
|
||||
name="public_scoreboard",
|
||||
field=models.BooleanField(
|
||||
default=False,
|
||||
help_text="Ranking page is public even for private contests.",
|
||||
verbose_name="public scoreboard",
|
||||
),
|
||||
),
|
||||
]
|
|
@ -167,6 +167,11 @@ class Contest(models.Model, PageVotable, Bookmarkable):
|
|||
related_name="view_contest_scoreboard",
|
||||
help_text=_("These users will be able to view the scoreboard."),
|
||||
)
|
||||
public_scoreboard = models.BooleanField(
|
||||
verbose_name=_("public scoreboard"),
|
||||
help_text=_("Ranking page is public even for private contests."),
|
||||
default=False,
|
||||
)
|
||||
use_clarifications = models.BooleanField(
|
||||
verbose_name=_("no comments"),
|
||||
help_text=_("Use clarification system instead of comments."),
|
||||
|
|
|
@ -403,17 +403,17 @@ class Problem(models.Model, PageVotable, Bookmarkable):
|
|||
)
|
||||
|
||||
# Authors, curators, and testers should always have access, so OR at the very end.
|
||||
filter = Exists(
|
||||
q |= Exists(
|
||||
Problem.authors.through.objects.filter(
|
||||
problem=OuterRef("pk"), profile=profile
|
||||
)
|
||||
)
|
||||
filter |= Exists(
|
||||
q |= Exists(
|
||||
Problem.curators.through.objects.filter(
|
||||
problem=OuterRef("pk"), profile=profile
|
||||
)
|
||||
)
|
||||
filter |= Exists(
|
||||
q |= Exists(
|
||||
Problem.testers.through.objects.filter(
|
||||
problem=OuterRef("pk"), profile=profile
|
||||
)
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import csv
|
||||
from tempfile import mktemp
|
||||
import re
|
||||
|
||||
from django.conf import settings
|
||||
from django.contrib.auth.models import User
|
||||
|
@ -41,6 +42,11 @@ def csv_to_dict(csv_file):
|
|||
return res
|
||||
|
||||
|
||||
def is_valid_username(username):
|
||||
match = re.match(r"\w+", username)
|
||||
return match is not None and match.group() == username
|
||||
|
||||
|
||||
# return result log
|
||||
def import_users(users):
|
||||
log = ""
|
||||
|
@ -48,17 +54,18 @@ def import_users(users):
|
|||
cur_log = str(i + 1) + ". "
|
||||
|
||||
username = row["username"]
|
||||
if not is_valid_username(username):
|
||||
log += username + ": Invalid username\n"
|
||||
continue
|
||||
|
||||
cur_log += username + ": "
|
||||
|
||||
pwd = row["password"]
|
||||
|
||||
user, created = User.objects.get_or_create(
|
||||
username=username,
|
||||
defaults={
|
||||
"is_active": True,
|
||||
},
|
||||
)
|
||||
|
||||
profile, _ = Profile.objects.get_or_create(
|
||||
user=user,
|
||||
defaults={
|
||||
|
|
|
@ -107,9 +107,10 @@ __all__ = [
|
|||
]
|
||||
|
||||
|
||||
def _find_contest(request, key, private_check=True):
|
||||
def _find_contest(request, key):
|
||||
try:
|
||||
contest = Contest.objects.get(key=key)
|
||||
private_check = not contest.public_scoreboard
|
||||
if private_check and not contest.is_accessible_by(request.user):
|
||||
raise ObjectDoesNotExist()
|
||||
except ObjectDoesNotExist:
|
||||
|
@ -277,6 +278,13 @@ class ContestMixin(object):
|
|||
def can_edit(self):
|
||||
return self.object.is_editable_by(self.request.user)
|
||||
|
||||
@cached_property
|
||||
def can_access(self):
|
||||
return self.object.is_accessible_by(self.request.user)
|
||||
|
||||
def should_bypass_access_check(self, contest):
|
||||
return False
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(ContestMixin, self).get_context_data(**kwargs)
|
||||
if self.request.user.is_authenticated:
|
||||
|
@ -300,6 +308,7 @@ class ContestMixin(object):
|
|||
context["is_editor"] = self.is_editor
|
||||
context["is_tester"] = self.is_tester
|
||||
context["can_edit"] = self.can_edit
|
||||
context["can_access"] = self.can_access
|
||||
|
||||
if not self.object.og_image or not self.object.summary:
|
||||
metadata = generate_opengraph(
|
||||
|
@ -338,6 +347,9 @@ class ContestMixin(object):
|
|||
):
|
||||
return contest
|
||||
|
||||
if self.should_bypass_access_check(contest):
|
||||
return contest
|
||||
|
||||
try:
|
||||
contest.access_check(self.request.user)
|
||||
except Contest.PrivateContest:
|
||||
|
@ -352,30 +364,6 @@ class ContestMixin(object):
|
|||
else:
|
||||
return contest
|
||||
|
||||
if contest.is_private or contest.is_organization_private:
|
||||
private_contest_error = PrivateContestError(
|
||||
contest.name,
|
||||
contest.is_private,
|
||||
contest.is_organization_private,
|
||||
contest.organizations.all(),
|
||||
)
|
||||
if profile is None:
|
||||
raise private_contest_error
|
||||
if user.has_perm("judge.edit_all_contest"):
|
||||
return contest
|
||||
if not (
|
||||
contest.is_organization_private
|
||||
and contest.organizations.filter(
|
||||
id__in=profile.organizations.all()
|
||||
).exists()
|
||||
) and not (
|
||||
contest.is_private
|
||||
and contest.private_contestants.filter(id=profile.id).exists()
|
||||
):
|
||||
raise private_contest_error
|
||||
|
||||
return contest
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
try:
|
||||
return super(ContestMixin, self).dispatch(request, *args, **kwargs)
|
||||
|
@ -1095,6 +1083,9 @@ class ContestRankingBase(ContestMixin, TitleMixin, DetailView):
|
|||
class ContestRanking(ContestRankingBase):
|
||||
page_type = "ranking"
|
||||
|
||||
def should_bypass_access_check(self, contest):
|
||||
return contest.public_scoreboard
|
||||
|
||||
def get_title(self):
|
||||
return _("%s Rankings") % self.object.name
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: lqdoj2\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-09-08 22:40+0700\n"
|
||||
"POT-Creation-Date: 2023-09-17 12:21+0700\n"
|
||||
"PO-Revision-Date: 2021-07-20 03:44\n"
|
||||
"Last-Translator: Icyene\n"
|
||||
"Language-Team: Vietnamese\n"
|
||||
|
@ -19,8 +19,8 @@ msgstr ""
|
|||
"X-Crowdin-File-ID: 5\n"
|
||||
|
||||
#: chat_box/models.py:39 chat_box/models.py:64 chat_box/models.py:79
|
||||
#: judge/admin/interface.py:150 judge/models/contest.py:636
|
||||
#: judge/models/contest.py:842 judge/models/course.py:115
|
||||
#: judge/admin/interface.py:150 judge/models/contest.py:641
|
||||
#: judge/models/contest.py:847 judge/models/course.py:115
|
||||
#: judge/models/profile.py:390 judge/models/profile.py:468
|
||||
msgid "user"
|
||||
msgstr "người dùng"
|
||||
|
@ -111,72 +111,74 @@ msgstr "Bài tập"
|
|||
msgid "Settings"
|
||||
msgstr "Cài đặt"
|
||||
|
||||
#: judge/admin/contest.py:168
|
||||
#: judge/admin/contest.py:169
|
||||
msgid "Scheduling"
|
||||
msgstr ""
|
||||
|
||||
#: judge/admin/contest.py:172
|
||||
#: judge/admin/contest.py:173
|
||||
msgid "Details"
|
||||
msgstr "Chi tiết"
|
||||
|
||||
#: judge/admin/contest.py:184
|
||||
#: judge/admin/contest.py:185 templates/contest/list.html:265
|
||||
#: templates/contest/list.html:306 templates/contest/list.html:351
|
||||
#: templates/contest/list.html:388
|
||||
msgid "Format"
|
||||
msgstr "Thể thức"
|
||||
|
||||
#: judge/admin/contest.py:188 templates/contest/ranking-table.html:5
|
||||
#: judge/admin/contest.py:189 templates/contest/ranking-table.html:5
|
||||
#: templates/user/user-about.html:15 templates/user/user-about.html:45
|
||||
msgid "Rating"
|
||||
msgstr ""
|
||||
|
||||
#: judge/admin/contest.py:200
|
||||
#: judge/admin/contest.py:201
|
||||
msgid "Access"
|
||||
msgstr "Truy cập"
|
||||
|
||||
#: judge/admin/contest.py:210 judge/admin/problem.py:218
|
||||
#: judge/admin/contest.py:211 judge/admin/problem.py:218
|
||||
msgid "Justice"
|
||||
msgstr "Xử phạt"
|
||||
|
||||
#: judge/admin/contest.py:330
|
||||
#: judge/admin/contest.py:331
|
||||
#, python-format
|
||||
msgid "%d contest successfully marked as visible."
|
||||
msgid_plural "%d contests successfully marked as visible."
|
||||
msgstr[0] "%d kỳ thi đã được đánh dấu hiển thị."
|
||||
|
||||
#: judge/admin/contest.py:337
|
||||
#: judge/admin/contest.py:338
|
||||
msgid "Mark contests as visible"
|
||||
msgstr "Đánh dấu hiển thị các kỳ thi"
|
||||
|
||||
#: judge/admin/contest.py:348
|
||||
#: judge/admin/contest.py:349
|
||||
#, python-format
|
||||
msgid "%d contest successfully marked as hidden."
|
||||
msgid_plural "%d contests successfully marked as hidden."
|
||||
msgstr[0] "%d kỳ thi đã được đánh dấu ẩn."
|
||||
|
||||
#: judge/admin/contest.py:355
|
||||
#: judge/admin/contest.py:356
|
||||
msgid "Mark contests as hidden"
|
||||
msgstr "Ẩn các kỳ thi"
|
||||
|
||||
#: judge/admin/contest.py:376 judge/admin/submission.py:241
|
||||
#: judge/admin/contest.py:377 judge/admin/submission.py:241
|
||||
#, python-format
|
||||
msgid "%d submission was successfully scheduled for rejudging."
|
||||
msgid_plural "%d submissions were successfully scheduled for rejudging."
|
||||
msgstr[0] "%d bài nộp đã được lên lịch thành công để chấm lại."
|
||||
|
||||
#: judge/admin/contest.py:484
|
||||
#: judge/admin/contest.py:485
|
||||
#, python-format
|
||||
msgid "%d participation recalculated."
|
||||
msgid_plural "%d participations recalculated."
|
||||
msgstr[0] "%d thí sinh đã được tính điểm lại."
|
||||
|
||||
#: judge/admin/contest.py:491
|
||||
#: judge/admin/contest.py:492
|
||||
msgid "Recalculate results"
|
||||
msgstr "Tính toán lại kết quả"
|
||||
|
||||
#: judge/admin/contest.py:496 judge/admin/organization.py:99
|
||||
#: judge/admin/contest.py:497 judge/admin/organization.py:99
|
||||
msgid "username"
|
||||
msgstr "tên đăng nhập"
|
||||
|
||||
#: judge/admin/contest.py:502 templates/base.html:341
|
||||
#: judge/admin/contest.py:503 templates/base.html:341
|
||||
msgid "virtual"
|
||||
msgstr "ảo"
|
||||
|
||||
|
@ -398,7 +400,9 @@ 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:332 templates/notification/list.html:15
|
||||
#: judge/admin/submission.py:332 templates/contest/list.html:250
|
||||
#: templates/contest/list.html:295 templates/contest/list.html:340
|
||||
#: templates/contest/list.html:382 templates/notification/list.html:15
|
||||
#: templates/organization/requests/log.html:10
|
||||
#: templates/organization/requests/pending.html:20
|
||||
#: templates/problem/list.html:154
|
||||
|
@ -495,72 +499,72 @@ msgstr "File tải lên không được quá 5MB."
|
|||
msgid "Any judge"
|
||||
msgstr ""
|
||||
|
||||
#: judge/forms.py:352
|
||||
#: judge/forms.py:353
|
||||
msgid "Enter usernames separating by space"
|
||||
msgstr "Nhập các tên đăng nhập, cách nhau bởi dấu cách"
|
||||
|
||||
#: judge/forms.py:353 judge/views/stats.py:166 templates/stats/site.html:27
|
||||
#: judge/forms.py:354 judge/views/stats.py:166 templates/stats/site.html:27
|
||||
msgid "New users"
|
||||
msgstr "Thành viên mới"
|
||||
|
||||
#: judge/forms.py:370
|
||||
#: judge/forms.py:371
|
||||
#, python-brace-format
|
||||
msgid "These usernames don't exist: {usernames}"
|
||||
msgstr "Các tên đăng nhập này không tồn tại: {usernames}"
|
||||
|
||||
#: judge/forms.py:429 judge/views/register.py:30
|
||||
#: judge/forms.py:430 judge/views/register.py:30
|
||||
#: templates/registration/registration_form.html:34
|
||||
#: templates/user/base-users-table.html:5
|
||||
#: templates/user/import/table_csv.html:4
|
||||
msgid "Username"
|
||||
msgstr "Tên đăng nhập"
|
||||
|
||||
#: judge/forms.py:430 judge/views/email.py:22
|
||||
#: judge/forms.py:431 judge/views/email.py:22
|
||||
#: templates/registration/registration_form.html:46
|
||||
#: templates/registration/registration_form.html:60
|
||||
#: templates/user/edit-profile.html:108 templates/user/import/table_csv.html:5
|
||||
msgid "Password"
|
||||
msgstr "Mật khẩu"
|
||||
|
||||
#: judge/forms.py:456
|
||||
#: judge/forms.py:457
|
||||
msgid "Two Factor Authentication tokens must be 6 decimal digits."
|
||||
msgstr "Two Factor Authentication phải chứa 6 chữ số."
|
||||
|
||||
#: judge/forms.py:469 templates/registration/totp_auth.html:32
|
||||
#: judge/forms.py:470 templates/registration/totp_auth.html:32
|
||||
msgid "Invalid Two Factor Authentication token."
|
||||
msgstr "Token Two Factor Authentication không hợp lệ."
|
||||
|
||||
#: judge/forms.py:476 judge/models/problem.py:133
|
||||
#: judge/forms.py:477 judge/models/problem.py:133
|
||||
msgid "Problem code must be ^[a-z0-9]+$"
|
||||
msgstr "Mã bài phải có dạng ^[a-z0-9]+$"
|
||||
|
||||
#: judge/forms.py:483
|
||||
#: judge/forms.py:484
|
||||
msgid "Problem with code already exists."
|
||||
msgstr "Mã bài đã tồn tại."
|
||||
|
||||
#: judge/forms.py:490 judge/models/contest.py:93
|
||||
#: judge/forms.py:491 judge/models/contest.py:93
|
||||
msgid "Contest id must be ^[a-z0-9]+$"
|
||||
msgstr "Mã kỳ thi phải có dạng ^[a-z0-9]+$"
|
||||
|
||||
#: judge/forms.py:497 templates/problem/search-form.html:46
|
||||
#: judge/forms.py:498 templates/problem/search-form.html:46
|
||||
msgid "Group"
|
||||
msgstr ""
|
||||
|
||||
#: judge/forms.py:505
|
||||
#: judge/forms.py:506
|
||||
msgid "Contest with key already exists."
|
||||
msgstr "Mã kỳ thi đã tồn tại."
|
||||
|
||||
#: judge/forms.py:513
|
||||
#: judge/forms.py:514
|
||||
msgid "Group doesn't exist."
|
||||
msgstr ""
|
||||
|
||||
#: judge/forms.py:515
|
||||
#: judge/forms.py:516
|
||||
#, fuzzy
|
||||
#| msgid "You do not have the permission to rejudge submissions."
|
||||
msgid "You don't have permission in this group."
|
||||
msgstr "Bạn không có quyền chấm lại bài."
|
||||
|
||||
#: judge/forms.py:565
|
||||
#: judge/forms.py:566
|
||||
msgid "This problem is duplicated."
|
||||
msgstr "Bài này bị lặp"
|
||||
|
||||
|
@ -728,7 +732,7 @@ msgstr ""
|
|||
msgid "contest tag"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/contest.py:77 judge/models/contest.py:245
|
||||
#: judge/models/contest.py:77 judge/models/contest.py:250
|
||||
msgid "contest tags"
|
||||
msgstr "nhãn kỳ thi"
|
||||
|
||||
|
@ -777,7 +781,7 @@ msgstr "mô tả"
|
|||
msgid "problems"
|
||||
msgstr "bài tập"
|
||||
|
||||
#: judge/models/contest.py:124 judge/models/contest.py:641
|
||||
#: judge/models/contest.py:124 judge/models/contest.py:646
|
||||
msgid "start time"
|
||||
msgstr "thời gian bắt đầu"
|
||||
|
||||
|
@ -847,59 +851,67 @@ msgid "These users will be able to view the scoreboard."
|
|||
msgstr "Những người dùng này được phép xem bảng điểm."
|
||||
|
||||
#: judge/models/contest.py:171
|
||||
msgid "public scoreboard"
|
||||
msgstr "công khai bảng điểm"
|
||||
|
||||
#: judge/models/contest.py:172
|
||||
msgid "Ranking page is public even for private contests."
|
||||
msgstr "Trang xếp hạng được công khai, kể cả cho kỳ thi riêng tư."
|
||||
|
||||
#: judge/models/contest.py:176
|
||||
msgid "no comments"
|
||||
msgstr "không bình luận"
|
||||
|
||||
#: judge/models/contest.py:172
|
||||
#: judge/models/contest.py:177
|
||||
msgid "Use clarification system instead of comments."
|
||||
msgstr "Dùng hệ thống thông báo thay vì bình luận."
|
||||
|
||||
#: judge/models/contest.py:177
|
||||
#: judge/models/contest.py:182
|
||||
msgid "Rating floor for contest"
|
||||
msgstr "Cận dưới rating được xếp hạng trong kỳ thi"
|
||||
|
||||
#: judge/models/contest.py:183
|
||||
#: judge/models/contest.py:188
|
||||
msgid "Rating ceiling for contest"
|
||||
msgstr "Cận trên rating được xếp hạng trong kỳ thi"
|
||||
|
||||
#: judge/models/contest.py:188
|
||||
#: judge/models/contest.py:193
|
||||
msgid "rate all"
|
||||
msgstr "xếp hạng tất cả"
|
||||
|
||||
#: judge/models/contest.py:189
|
||||
#: judge/models/contest.py:194
|
||||
msgid "Rate all users who joined."
|
||||
msgstr "Xếp hạng tất cả người dùng đã tham gia (kể cả không nộp)."
|
||||
|
||||
#: judge/models/contest.py:194
|
||||
#: judge/models/contest.py:199
|
||||
msgid "exclude from ratings"
|
||||
msgstr "không xếp hạng"
|
||||
|
||||
#: judge/models/contest.py:199
|
||||
#: judge/models/contest.py:204
|
||||
msgid "private to specific users"
|
||||
msgstr "riêng tư với các người dùng này"
|
||||
|
||||
#: judge/models/contest.py:204
|
||||
#: judge/models/contest.py:209
|
||||
msgid "private contestants"
|
||||
msgstr "thí sinh riêng tư"
|
||||
|
||||
#: judge/models/contest.py:205
|
||||
#: judge/models/contest.py:210
|
||||
msgid "If private, only these users may see the contest"
|
||||
msgstr "Nếu riêng tư, chỉ những người dùng này mới thấy kỳ thi"
|
||||
|
||||
#: judge/models/contest.py:209
|
||||
#: judge/models/contest.py:214
|
||||
msgid "hide problem tags"
|
||||
msgstr "ẩn nhãn kỳ thi"
|
||||
|
||||
#: judge/models/contest.py:210
|
||||
#: judge/models/contest.py:215
|
||||
msgid "Whether problem tags should be hidden by default."
|
||||
msgstr ""
|
||||
"Quyết định việc nhãn bài tập (DP, Tham lam, ...) được ẩn trong kỳ thi không."
|
||||
|
||||
#: judge/models/contest.py:214
|
||||
#: judge/models/contest.py:219
|
||||
msgid "run pretests only"
|
||||
msgstr "chỉ chạy pretests"
|
||||
|
||||
#: judge/models/contest.py:216
|
||||
#: judge/models/contest.py:221
|
||||
msgid ""
|
||||
"Whether judges should grade pretests only, versus all testcases. Commonly "
|
||||
"set during a contest, then unset prior to rejudging user submissions when "
|
||||
|
@ -908,51 +920,51 @@ msgstr ""
|
|||
"Quyết định việc các máy chấm chỉ chấm pretests thay vì tất cả các test. Sau "
|
||||
"kỳ thi, hãy bỏ đánh dấu ô này và chấm lại tất cả các bài."
|
||||
|
||||
#: judge/models/contest.py:223 judge/models/interface.py:96
|
||||
#: judge/models/contest.py:228 judge/models/interface.py:96
|
||||
#: judge/models/problem.py:285
|
||||
msgid "private to organizations"
|
||||
msgstr "riêng tư với các tổ chức"
|
||||
|
||||
#: judge/models/contest.py:228 judge/models/course.py:34
|
||||
#: judge/models/contest.py:233 judge/models/course.py:34
|
||||
#: judge/models/interface.py:92 judge/models/problem.py:281
|
||||
#: judge/models/profile.py:144
|
||||
msgid "organizations"
|
||||
msgstr "tổ chức"
|
||||
|
||||
#: judge/models/contest.py:229
|
||||
#: judge/models/contest.py:234
|
||||
msgid "If private, only these organizations may see the contest"
|
||||
msgstr "Nếu riêng tư, chỉ những tổ chức này thấy được kỳ thi"
|
||||
|
||||
#: judge/models/contest.py:232 judge/models/problem.py:256
|
||||
#: judge/models/contest.py:237 judge/models/problem.py:256
|
||||
msgid "OpenGraph image"
|
||||
msgstr "Hình ảnh OpenGraph"
|
||||
|
||||
#: judge/models/contest.py:235 judge/models/profile.py:92
|
||||
#: judge/models/contest.py:240 judge/models/profile.py:92
|
||||
msgid "Logo override image"
|
||||
msgstr "Hình ảnh ghi đè logo"
|
||||
|
||||
#: judge/models/contest.py:240
|
||||
#: judge/models/contest.py:245
|
||||
msgid ""
|
||||
"This image will replace the default site logo for users inside the contest."
|
||||
msgstr "Ảnh này sẽ thay thế cho logo mặc định trong kỳ thi."
|
||||
|
||||
#: judge/models/contest.py:248
|
||||
#: judge/models/contest.py:253
|
||||
msgid "the amount of live participants"
|
||||
msgstr "số lượng thí sinh thi trực tiếp"
|
||||
|
||||
#: judge/models/contest.py:252
|
||||
#: judge/models/contest.py:257
|
||||
msgid "contest summary"
|
||||
msgstr "tổng kết kỳ thi"
|
||||
|
||||
#: judge/models/contest.py:254 judge/models/problem.py:262
|
||||
#: judge/models/contest.py:259 judge/models/problem.py:262
|
||||
msgid "Plain-text, shown in meta description tag, e.g. for social media."
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/contest.py:258 judge/models/profile.py:87
|
||||
#: judge/models/contest.py:263 judge/models/profile.py:87
|
||||
msgid "access code"
|
||||
msgstr "mật khẩu truy cập"
|
||||
|
||||
#: judge/models/contest.py:263
|
||||
#: judge/models/contest.py:268
|
||||
msgid ""
|
||||
"An optional code to prompt contestants before they are allowed to join the "
|
||||
"contest. Leave it blank to disable."
|
||||
|
@ -960,292 +972,292 @@ msgstr ""
|
|||
"Mật khẩu truy cập cho các thí sinh muốn tham gia kỳ thi. Để trống nếu không "
|
||||
"dùng."
|
||||
|
||||
#: judge/models/contest.py:269 judge/models/problem.py:244
|
||||
#: judge/models/contest.py:274 judge/models/problem.py:244
|
||||
msgid "personae non gratae"
|
||||
msgstr "Chặn tham gia"
|
||||
|
||||
#: judge/models/contest.py:271
|
||||
#: judge/models/contest.py:276
|
||||
msgid "Bans the selected users from joining this contest."
|
||||
msgstr "Cấm những người dùng được chọn tham gia kỳ thi."
|
||||
|
||||
#: judge/models/contest.py:274
|
||||
#: judge/models/contest.py:279
|
||||
msgid "contest format"
|
||||
msgstr "format kỳ thi"
|
||||
|
||||
#: judge/models/contest.py:278
|
||||
#: judge/models/contest.py:283
|
||||
msgid "The contest format module to use."
|
||||
msgstr "Format kỳ thi sử dụng."
|
||||
|
||||
#: judge/models/contest.py:281
|
||||
#: judge/models/contest.py:286
|
||||
msgid "contest format configuration"
|
||||
msgstr "Tùy chỉnh format kỳ thi"
|
||||
|
||||
#: judge/models/contest.py:285
|
||||
#: judge/models/contest.py:290
|
||||
msgid ""
|
||||
"A JSON object to serve as the configuration for the chosen contest format "
|
||||
"module. Leave empty to use None. Exact format depends on the contest format "
|
||||
"selected."
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/contest.py:298
|
||||
#: judge/models/contest.py:303
|
||||
msgid "precision points"
|
||||
msgstr "Hiển thị điểm"
|
||||
|
||||
#: judge/models/contest.py:301
|
||||
#: judge/models/contest.py:306
|
||||
msgid "Number of digits to round points to."
|
||||
msgstr "Số chữ số thập phân trên bảng điểm."
|
||||
|
||||
#: judge/models/contest.py:609
|
||||
#: judge/models/contest.py:614
|
||||
msgid "See private contests"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/contest.py:610
|
||||
#: judge/models/contest.py:615
|
||||
msgid "Edit own contests"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/contest.py:611
|
||||
#: judge/models/contest.py:616
|
||||
msgid "Edit all contests"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/contest.py:612
|
||||
#: judge/models/contest.py:617
|
||||
msgid "Clone contest"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/contest.py:613 templates/contest/moss.html:72
|
||||
#: judge/models/contest.py:618 templates/contest/moss.html:72
|
||||
msgid "MOSS contest"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/contest.py:614
|
||||
#: judge/models/contest.py:619
|
||||
msgid "Rate contests"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/contest.py:615
|
||||
#: judge/models/contest.py:620
|
||||
msgid "Contest access codes"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/contest.py:616
|
||||
#: judge/models/contest.py:621
|
||||
msgid "Create private contests"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/contest.py:617
|
||||
#: judge/models/contest.py:622
|
||||
msgid "Change contest visibility"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/contest.py:618
|
||||
#: judge/models/contest.py:623
|
||||
msgid "Edit contest problem label script"
|
||||
msgstr "Cách hiển thị thứ tự bài tập"
|
||||
|
||||
#: judge/models/contest.py:620 judge/models/contest.py:767
|
||||
#: judge/models/contest.py:845 judge/models/contest.py:875
|
||||
#: judge/models/contest.py:625 judge/models/contest.py:772
|
||||
#: judge/models/contest.py:850 judge/models/contest.py:880
|
||||
#: judge/models/course.py:178 judge/models/submission.py:116
|
||||
msgid "contest"
|
||||
msgstr "kỳ thi"
|
||||
|
||||
#: judge/models/contest.py:621
|
||||
#: judge/models/contest.py:626
|
||||
msgid "contests"
|
||||
msgstr "kỳ thi"
|
||||
|
||||
#: judge/models/contest.py:630
|
||||
#: judge/models/contest.py:635
|
||||
msgid "associated contest"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/contest.py:643
|
||||
#: judge/models/contest.py:648
|
||||
msgid "score"
|
||||
msgstr "điểm"
|
||||
|
||||
#: judge/models/contest.py:644
|
||||
#: judge/models/contest.py:649
|
||||
msgid "cumulative time"
|
||||
msgstr "tổng thời gian"
|
||||
|
||||
#: judge/models/contest.py:646
|
||||
#: judge/models/contest.py:651
|
||||
msgid "is disqualified"
|
||||
msgstr "đã bị loại"
|
||||
|
||||
#: judge/models/contest.py:648
|
||||
#: judge/models/contest.py:653
|
||||
msgid "Whether this participation is disqualified."
|
||||
msgstr "Quyết định thí sinh có bị loại không."
|
||||
|
||||
#: judge/models/contest.py:650
|
||||
#: judge/models/contest.py:655
|
||||
msgid "tie-breaking field"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/contest.py:652
|
||||
#: judge/models/contest.py:657
|
||||
msgid "virtual participation id"
|
||||
msgstr "id lần tham gia ảo"
|
||||
|
||||
#: judge/models/contest.py:654
|
||||
#: judge/models/contest.py:659
|
||||
msgid "0 means non-virtual, otherwise the n-th virtual participation."
|
||||
msgstr "0 nghĩa là tham gia chính thức, ngược lại là lần tham gia ảo thứ n."
|
||||
|
||||
#: judge/models/contest.py:657
|
||||
#: judge/models/contest.py:662
|
||||
msgid "contest format specific data"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/contest.py:660
|
||||
#: judge/models/contest.py:665
|
||||
msgid "same as format_data, but including frozen results"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/contest.py:664
|
||||
#: judge/models/contest.py:669
|
||||
#, fuzzy
|
||||
#| msgid "score"
|
||||
msgid "final score"
|
||||
msgstr "điểm"
|
||||
|
||||
#: judge/models/contest.py:666
|
||||
#: judge/models/contest.py:671
|
||||
#, fuzzy
|
||||
#| msgid "cumulative time"
|
||||
msgid "final cumulative time"
|
||||
msgstr "tổng thời gian"
|
||||
|
||||
#: judge/models/contest.py:742
|
||||
#: judge/models/contest.py:747
|
||||
#, python-format
|
||||
msgid "%s spectating in %s"
|
||||
msgstr "%s đang theo dõi trong %s"
|
||||
|
||||
#: judge/models/contest.py:747
|
||||
#: judge/models/contest.py:752
|
||||
#, python-format
|
||||
msgid "%s in %s, v%d"
|
||||
msgstr "%s trong %s, v%d"
|
||||
|
||||
#: judge/models/contest.py:752
|
||||
#: judge/models/contest.py:757
|
||||
#, python-format
|
||||
msgid "%s in %s"
|
||||
msgstr "%s trong %s"
|
||||
|
||||
#: judge/models/contest.py:755
|
||||
#: judge/models/contest.py:760
|
||||
msgid "contest participation"
|
||||
msgstr "lần tham gia kỳ thi"
|
||||
|
||||
#: judge/models/contest.py:756
|
||||
#: judge/models/contest.py:761
|
||||
msgid "contest participations"
|
||||
msgstr "lần tham gia kỳ thi"
|
||||
|
||||
#: judge/models/contest.py:763 judge/models/contest.py:816
|
||||
#: judge/models/contest.py:878 judge/models/problem.py:582
|
||||
#: judge/models/contest.py:768 judge/models/contest.py:821
|
||||
#: judge/models/contest.py:883 judge/models/problem.py:582
|
||||
#: judge/models/problem.py:589 judge/models/problem.py:610
|
||||
#: judge/models/problem.py:641 judge/models/problem_data.py:50
|
||||
msgid "problem"
|
||||
msgstr "bài tập"
|
||||
|
||||
#: judge/models/contest.py:771 judge/models/contest.py:828
|
||||
#: judge/models/contest.py:776 judge/models/contest.py:833
|
||||
#: judge/models/course.py:182 judge/models/problem.py:209
|
||||
msgid "points"
|
||||
msgstr "điểm"
|
||||
|
||||
#: judge/models/contest.py:772
|
||||
#: judge/models/contest.py:777
|
||||
msgid "partial"
|
||||
msgstr "thành phần"
|
||||
|
||||
#: judge/models/contest.py:773 judge/models/contest.py:830
|
||||
#: judge/models/contest.py:778 judge/models/contest.py:835
|
||||
msgid "is pretested"
|
||||
msgstr "dùng pretest"
|
||||
|
||||
#: judge/models/contest.py:774 judge/models/interface.py:47
|
||||
#: judge/models/contest.py:779 judge/models/interface.py:47
|
||||
msgid "order"
|
||||
msgstr "thứ tự"
|
||||
|
||||
#: judge/models/contest.py:776
|
||||
#: judge/models/contest.py:781
|
||||
msgid "visible testcases"
|
||||
msgstr "hiển thị test"
|
||||
|
||||
#: judge/models/contest.py:781
|
||||
#: judge/models/contest.py:786
|
||||
msgid "Maximum number of submissions for this problem, or 0 for no limit."
|
||||
msgstr "Số lần nộp tối đa, đặt là 0 nếu không có giới hạn."
|
||||
|
||||
#: judge/models/contest.py:783
|
||||
#: judge/models/contest.py:788
|
||||
msgid "max submissions"
|
||||
msgstr "số lần nộp tối đa"
|
||||
|
||||
#: judge/models/contest.py:786
|
||||
#: judge/models/contest.py:791
|
||||
msgid "Why include a problem you can't submit to?"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/contest.py:790
|
||||
#: judge/models/contest.py:795
|
||||
#, fuzzy
|
||||
#| msgid "Only for format new IOI. Separated by commas, e.g: 2, 3"
|
||||
msgid "Separated by commas, e.g: 2, 3"
|
||||
msgstr ""
|
||||
"Chỉ dùng với format IOI mới. Các sub cách nhau bởi dấu phẩy. Ví dụ: 2, 3"
|
||||
|
||||
#: judge/models/contest.py:791
|
||||
#: judge/models/contest.py:796
|
||||
#, fuzzy
|
||||
#| msgid "frozen subtasks"
|
||||
msgid "hidden subtasks"
|
||||
msgstr "Đóng băng subtasks"
|
||||
|
||||
#: judge/models/contest.py:803
|
||||
#: judge/models/contest.py:808
|
||||
msgid "contest problem"
|
||||
msgstr "bài trong kỳ thi"
|
||||
|
||||
#: judge/models/contest.py:804
|
||||
#: judge/models/contest.py:809
|
||||
msgid "contest problems"
|
||||
msgstr "bài trong kỳ thi"
|
||||
|
||||
#: judge/models/contest.py:810 judge/models/submission.py:233
|
||||
#: judge/models/contest.py:815 judge/models/submission.py:233
|
||||
msgid "submission"
|
||||
msgstr "bài nộp"
|
||||
|
||||
#: judge/models/contest.py:823 judge/models/contest.py:849
|
||||
#: judge/models/contest.py:828 judge/models/contest.py:854
|
||||
msgid "participation"
|
||||
msgstr "lần tham gia"
|
||||
|
||||
#: judge/models/contest.py:831
|
||||
#: judge/models/contest.py:836
|
||||
msgid "Whether this submission was ran only on pretests."
|
||||
msgstr "Quyết định bài nộp chỉ được chạy trên pretest không."
|
||||
|
||||
#: judge/models/contest.py:836
|
||||
#: judge/models/contest.py:841
|
||||
msgid "contest submission"
|
||||
msgstr "bài nộp kỳ thi"
|
||||
|
||||
#: judge/models/contest.py:837
|
||||
#: judge/models/contest.py:842
|
||||
msgid "contest submissions"
|
||||
msgstr "bài nộp kỳ thi"
|
||||
|
||||
#: judge/models/contest.py:853
|
||||
#: judge/models/contest.py:858
|
||||
msgid "rank"
|
||||
msgstr "rank"
|
||||
|
||||
#: judge/models/contest.py:854
|
||||
#: judge/models/contest.py:859
|
||||
msgid "rating"
|
||||
msgstr "rating"
|
||||
|
||||
#: judge/models/contest.py:855
|
||||
#: judge/models/contest.py:860
|
||||
msgid "raw rating"
|
||||
msgstr "rating thật"
|
||||
|
||||
#: judge/models/contest.py:856
|
||||
#: judge/models/contest.py:861
|
||||
msgid "contest performance"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/contest.py:857
|
||||
#: judge/models/contest.py:862
|
||||
msgid "last rated"
|
||||
msgstr "lần cuối được xếp hạng"
|
||||
|
||||
#: judge/models/contest.py:861
|
||||
#: judge/models/contest.py:866
|
||||
msgid "contest rating"
|
||||
msgstr "rating kỳ thi"
|
||||
|
||||
#: judge/models/contest.py:862
|
||||
#: judge/models/contest.py:867
|
||||
msgid "contest ratings"
|
||||
msgstr "rating kỳ thi"
|
||||
|
||||
#: judge/models/contest.py:886
|
||||
#: judge/models/contest.py:891
|
||||
msgid "contest moss result"
|
||||
msgstr "kết quả MOSS kỳ thi"
|
||||
|
||||
#: judge/models/contest.py:887
|
||||
#: judge/models/contest.py:892
|
||||
msgid "contest moss results"
|
||||
msgstr "kết quả MOSS kỳ thi"
|
||||
|
||||
#: judge/models/contest.py:892
|
||||
#: judge/models/contest.py:897
|
||||
msgid "clarified problem"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/contest.py:894
|
||||
#: judge/models/contest.py:899
|
||||
msgid "clarification body"
|
||||
msgstr ""
|
||||
|
||||
#: judge/models/contest.py:896
|
||||
#: judge/models/contest.py:901
|
||||
msgid "clarification timestamp"
|
||||
msgstr ""
|
||||
|
||||
|
@ -2688,7 +2700,7 @@ msgid "%h:%m"
|
|||
msgstr "%h:%m"
|
||||
|
||||
#: judge/views/about.py:10 templates/organization/home.html:47
|
||||
#: templates/organization/org-right-sidebar.html:70
|
||||
#: templates/organization/org-right-sidebar.html:72
|
||||
#: templates/user/user-about.html:72 templates/user/user-tabs.html:4
|
||||
#: templates/user/users-table.html:22
|
||||
msgid "About"
|
||||
|
@ -2732,138 +2744,140 @@ msgstr "Chỉnh sửa từ web"
|
|||
msgid "Editing comment"
|
||||
msgstr "Chỉnh sửa bình luận"
|
||||
|
||||
#: judge/views/contests.py:119 judge/views/contests.py:387
|
||||
#: judge/views/contests.py:392 judge/views/contests.py:663
|
||||
#: judge/views/contests.py:120 judge/views/contests.py:370
|
||||
#: judge/views/contests.py:375 judge/views/contests.py:646
|
||||
msgid "No such contest"
|
||||
msgstr "Không có contest nào như vậy"
|
||||
|
||||
#: judge/views/contests.py:120 judge/views/contests.py:388
|
||||
#: judge/views/contests.py:121 judge/views/contests.py:371
|
||||
#, python-format
|
||||
msgid "Could not find a contest with the key \"%s\"."
|
||||
msgstr "Không tìm thấy kỳ thi với mã \"%s\"."
|
||||
|
||||
#: judge/views/contests.py:139 judge/views/stats.py:178
|
||||
#: judge/views/contests.py:140 judge/views/stats.py:178
|
||||
#: templates/contest/list.html:246 templates/contest/list.html:291
|
||||
#: templates/contest/list.html:336 templates/contest/list.html:378
|
||||
#: templates/organization/org-left-sidebar.html:5 templates/stats/site.html:21
|
||||
#: templates/user/user-bookmarks.html:56
|
||||
msgid "Contests"
|
||||
msgstr "Kỳ thi"
|
||||
|
||||
#: judge/views/contests.py:392
|
||||
#: judge/views/contests.py:375
|
||||
msgid "Could not find such contest."
|
||||
msgstr "Không tìm thấy kỳ thi nào như vậy."
|
||||
|
||||
#: judge/views/contests.py:400
|
||||
#: judge/views/contests.py:383
|
||||
#, python-format
|
||||
msgid "Access to contest \"%s\" denied"
|
||||
msgstr "Truy cập tới kỳ thi \"%s\" bị từ chối"
|
||||
|
||||
#: judge/views/contests.py:451
|
||||
#: judge/views/contests.py:434
|
||||
msgid "Clone Contest"
|
||||
msgstr "Nhân bản kỳ thi"
|
||||
|
||||
#: judge/views/contests.py:537
|
||||
#: judge/views/contests.py:520
|
||||
msgid "Contest not ongoing"
|
||||
msgstr "Kỳ thi đang không diễn ra"
|
||||
|
||||
#: judge/views/contests.py:538
|
||||
#: judge/views/contests.py:521
|
||||
#, python-format
|
||||
msgid "\"%s\" is not currently ongoing."
|
||||
msgstr "\"%s\" kỳ thi đang không diễn ra."
|
||||
|
||||
#: judge/views/contests.py:545
|
||||
#: judge/views/contests.py:528
|
||||
msgid "Already in contest"
|
||||
msgstr "Đã ở trong kỳ thi"
|
||||
|
||||
#: judge/views/contests.py:546
|
||||
#: judge/views/contests.py:529
|
||||
#, python-format
|
||||
msgid "You are already in a contest: \"%s\"."
|
||||
msgstr "Bạn đã ở trong kỳ thi: \"%s\"."
|
||||
|
||||
#: judge/views/contests.py:556
|
||||
#: judge/views/contests.py:539
|
||||
msgid "Banned from joining"
|
||||
msgstr "Bị cấm tham gia"
|
||||
|
||||
#: judge/views/contests.py:558
|
||||
#: judge/views/contests.py:541
|
||||
msgid ""
|
||||
"You have been declared persona non grata for this contest. You are "
|
||||
"permanently barred from joining this contest."
|
||||
msgstr "Bạn không được phép tham gia kỳ thi này."
|
||||
|
||||
#: judge/views/contests.py:647
|
||||
#: judge/views/contests.py:630
|
||||
#, python-format
|
||||
msgid "Enter access code for \"%s\""
|
||||
msgstr "Nhập mật khẩu truy cập cho \"%s\""
|
||||
|
||||
#: judge/views/contests.py:664
|
||||
#: judge/views/contests.py:647
|
||||
#, python-format
|
||||
msgid "You are not in contest \"%s\"."
|
||||
msgstr "Bạn không ở trong kỳ thi \"%s\"."
|
||||
|
||||
#: judge/views/contests.py:687
|
||||
#: judge/views/contests.py:670
|
||||
msgid "ContestCalendar requires integer year and month"
|
||||
msgstr "Lịch thi yêu cầu giá trị cho năm và tháng là số nguyên"
|
||||
|
||||
#: judge/views/contests.py:745
|
||||
#: judge/views/contests.py:728
|
||||
#, python-format
|
||||
msgid "Contests in %(month)s"
|
||||
msgstr "Các kỳ thi trong %(month)s"
|
||||
|
||||
#: judge/views/contests.py:746
|
||||
#: judge/views/contests.py:729
|
||||
msgid "F Y"
|
||||
msgstr "F Y"
|
||||
|
||||
#: judge/views/contests.py:806
|
||||
#: judge/views/contests.py:789
|
||||
#, python-format
|
||||
msgid "%s Statistics"
|
||||
msgstr "%s Thống kê"
|
||||
|
||||
#: judge/views/contests.py:1099
|
||||
#: judge/views/contests.py:1085
|
||||
#, python-format
|
||||
msgid "%s Rankings"
|
||||
msgstr "%s Bảng điểm"
|
||||
|
||||
#: judge/views/contests.py:1110
|
||||
#: judge/views/contests.py:1096
|
||||
msgid "???"
|
||||
msgstr "???"
|
||||
|
||||
#: judge/views/contests.py:1137
|
||||
#: judge/views/contests.py:1123
|
||||
#, python-format
|
||||
msgid "Your participation in %s"
|
||||
msgstr "Lần tham gia trong %s"
|
||||
|
||||
#: judge/views/contests.py:1138
|
||||
#: judge/views/contests.py:1124
|
||||
#, python-format
|
||||
msgid "%s's participation in %s"
|
||||
msgstr "Lần tham gia của %s trong %s"
|
||||
|
||||
#: judge/views/contests.py:1152
|
||||
#: judge/views/contests.py:1138
|
||||
msgid "Live"
|
||||
msgstr "Trực tiếp"
|
||||
|
||||
#: judge/views/contests.py:1171 templates/contest/contest-tabs.html:19
|
||||
#: judge/views/contests.py:1157 templates/contest/contest-tabs.html:19
|
||||
msgid "Participation"
|
||||
msgstr "Lần tham gia"
|
||||
|
||||
#: judge/views/contests.py:1220
|
||||
#: judge/views/contests.py:1206
|
||||
#, python-format
|
||||
msgid "%s MOSS Results"
|
||||
msgstr "%s Kết quả MOSS"
|
||||
|
||||
#: judge/views/contests.py:1256
|
||||
#: judge/views/contests.py:1242
|
||||
#, python-format
|
||||
msgid "Running MOSS for %s..."
|
||||
msgstr "Đang chạy MOSS cho %s..."
|
||||
|
||||
#: judge/views/contests.py:1279
|
||||
#: judge/views/contests.py:1265
|
||||
#, python-format
|
||||
msgid "Contest tag: %s"
|
||||
msgstr "Nhãn kỳ thi: %s"
|
||||
|
||||
#: judge/views/contests.py:1294 judge/views/ticket.py:72
|
||||
#: judge/views/contests.py:1280 judge/views/ticket.py:72
|
||||
msgid "Issue description"
|
||||
msgstr "Mô tả vấn đề"
|
||||
|
||||
#: judge/views/contests.py:1337
|
||||
#: judge/views/contests.py:1323
|
||||
#, python-format
|
||||
msgid "New clarification for %s"
|
||||
msgstr "Thông báo mới cho %s"
|
||||
|
@ -3114,7 +3128,7 @@ msgid "Added from site"
|
|||
msgstr "Thêm từ web"
|
||||
|
||||
#: judge/views/organization.py:855
|
||||
#: templates/organization/org-right-sidebar.html:55
|
||||
#: templates/organization/org-right-sidebar.html:52
|
||||
msgid "Add contest"
|
||||
msgstr "Thêm kỳ thi"
|
||||
|
||||
|
@ -3400,8 +3414,8 @@ msgstr "Phải qua một kỳ thi"
|
|||
#: judge/views/submission.py:914
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"<a href=\"{1}\">{0}</a>'s submissions for <a href=\"{3}\">{2}</a> in <a "
|
||||
"href=\"{5}\">{4}</a>"
|
||||
"<a href=\"{1}\">{0}</a>'s submissions for <a href=\"{3}\">{2}</a> in <a href="
|
||||
"\"{5}\">{4}</a>"
|
||||
msgstr ""
|
||||
"Các bài nộp của <a href=\"{1}\">{0}</a> cho <a href=\"{3}\">{2}</a> trong <a "
|
||||
"href=\"{5}\">{4}</a>"
|
||||
|
@ -4014,8 +4028,8 @@ msgstr "G:i T, j F, Y"
|
|||
#: templates/contest/contest-datetime.html:39
|
||||
#, python-format
|
||||
msgid ""
|
||||
"<b>%(time_limit)s</b> window between <b>%(start_time)s</b> and "
|
||||
"<b>%(end_time)s</b>"
|
||||
"<b>%(time_limit)s</b> window between <b>%(start_time)s</b> and <b>"
|
||||
"%(end_time)s</b>"
|
||||
msgstr ""
|
||||
"Kéo dài <b>%(time_limit)s</b> từ <b>%(start_time)s</b> đến <b>%(end_time)s</"
|
||||
"b>"
|
||||
|
@ -4099,7 +4113,9 @@ msgstr "Đăng nhập để tham gia"
|
|||
msgid "AC Rate"
|
||||
msgstr "Tỷ lệ AC"
|
||||
|
||||
#: templates/contest/contest.html:103 templates/problem/list.html:24
|
||||
#: templates/contest/contest.html:103 templates/contest/list.html:269
|
||||
#: templates/contest/list.html:310 templates/contest/list.html:392
|
||||
#: templates/problem/list.html:24
|
||||
msgid "Users"
|
||||
msgstr "Người nộp"
|
||||
|
||||
|
@ -4507,31 +4523,31 @@ msgstr "Nhóm kín"
|
|||
msgid "Members"
|
||||
msgstr "Thành viên"
|
||||
|
||||
#: templates/organization/org-right-sidebar.html:7
|
||||
#: templates/organization/org-right-sidebar.html:4
|
||||
msgid "Controls"
|
||||
msgstr "Quản lý"
|
||||
|
||||
#: templates/organization/org-right-sidebar.html:12
|
||||
#: templates/organization/org-right-sidebar.html:9
|
||||
msgid "Edit group"
|
||||
msgstr "Chỉnh sửa nhóm"
|
||||
|
||||
#: templates/organization/org-right-sidebar.html:19
|
||||
#: templates/organization/org-right-sidebar.html:16
|
||||
msgid "View requests"
|
||||
msgstr "Đơn đăng ký"
|
||||
|
||||
#: templates/organization/org-right-sidebar.html:31
|
||||
#: templates/organization/org-right-sidebar.html:28
|
||||
msgid "Add members"
|
||||
msgstr "Thêm thành viên"
|
||||
|
||||
#: templates/organization/org-right-sidebar.html:38
|
||||
#: templates/organization/org-right-sidebar.html:35
|
||||
msgid "Add blog"
|
||||
msgstr "Thêm bài đăng"
|
||||
|
||||
#: templates/organization/org-right-sidebar.html:44
|
||||
#: templates/organization/org-right-sidebar.html:41
|
||||
msgid "Pending blogs"
|
||||
msgstr "Bài đăng đang chờ"
|
||||
|
||||
#: templates/organization/org-right-sidebar.html:63
|
||||
#: templates/organization/org-right-sidebar.html:60
|
||||
msgid "Leave group"
|
||||
msgstr "Rời nhóm"
|
||||
|
||||
|
@ -5962,8 +5978,8 @@ msgstr "Chọn tất cả"
|
|||
#~ msgstr "bình luận nữa"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "This comment is hidden due to too much negative feedback. Click <a "
|
||||
#~ "href=\"javascript:comment_show_content(%(id)s)\">here</a> to view it."
|
||||
#~ "This comment is hidden due to too much negative feedback. Click <a href="
|
||||
#~ "\"javascript:comment_show_content(%(id)s)\">here</a> to view it."
|
||||
#~ msgstr ""
|
||||
#~ "Bình luận bị ẩn vì nhiều phản hồi tiêu cực. Nhấp vào <a href=\"javascript:"
|
||||
#~ "comment_show_content(%(id)s)\">đây</a> để mở."
|
||||
|
|
|
@ -15,15 +15,12 @@ msgstr "Thành viên"
|
|||
msgid "Contests"
|
||||
msgstr "Kỳ thi"
|
||||
|
||||
msgid "Chat"
|
||||
msgstr ""
|
||||
msgid "Groups"
|
||||
msgstr "Nhóm"
|
||||
|
||||
msgid "About"
|
||||
msgstr "Giới thiệu"
|
||||
|
||||
msgid "Groups"
|
||||
msgstr "Nhóm"
|
||||
|
||||
msgid "Status"
|
||||
msgstr "Máy chấm"
|
||||
|
||||
|
|
|
@ -182,6 +182,7 @@
|
|||
display: flex;
|
||||
align-items: center;
|
||||
border-radius: .5em;
|
||||
color: black;
|
||||
|
||||
.sidebar-icon {
|
||||
font-size: large;
|
||||
|
@ -196,10 +197,12 @@
|
|||
.left-sidebar-item:hover {
|
||||
background-color: #e3e3e3;
|
||||
cursor: pointer;
|
||||
color: black;
|
||||
}
|
||||
|
||||
.left-sidebar-item.active:hover {
|
||||
background-color: $theme_color;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.sidebar-icon {
|
||||
|
|
|
@ -387,9 +387,8 @@ function onWindowReady() {
|
|||
});
|
||||
$('a').click(function() {
|
||||
$("#loading-bar").show();
|
||||
$("#loading-bar").animate({ width: "100%" }, 1500, function() {
|
||||
$(this).hide();
|
||||
$("#loading-bar").css({ width: 0});
|
||||
$("#loading-bar").animate({ width: "100%" }, 2000, function() {
|
||||
$(this).hide().css({ width: 0});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -47,4 +47,9 @@
|
|||
border: 1px #ccc solid;
|
||||
margin-bottom: 3em;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.org-help-text {
|
||||
display: block;
|
||||
color: gray;
|
||||
}
|
|
@ -7,15 +7,17 @@
|
|||
}
|
||||
</style>
|
||||
<div class="left-sidebar">
|
||||
{{ make_tab_item('detail', 'fa fa-info-circle', url('contest_view', contest.key), _('Info')) }}
|
||||
{% if contest.ended or can_edit %}
|
||||
{{ make_tab_item('stats', 'fa fa-pie-chart', url('contest_stats', contest.key), _('Statistics')) }}
|
||||
{% if can_access %}
|
||||
{{ make_tab_item('detail', 'fa fa-info-circle', url('contest_view', contest.key), _('Info')) }}
|
||||
{% if contest.ended or can_edit %}
|
||||
{{ make_tab_item('stats', 'fa fa-pie-chart', url('contest_stats', contest.key), _('Statistics')) }}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
{% if contest.start_time <= now or perms.judge.see_private_contest %}
|
||||
{% if contest.can_see_own_scoreboard(request.user) %}
|
||||
{{ make_tab_item('ranking', 'fa fa-bar-chart', url('contest_ranking', contest.key), _('Rankings')) }}
|
||||
{% if request.user.is_authenticated %}
|
||||
{% if request.user.is_authenticated and can_access %}
|
||||
{{ make_tab_item('participation', 'fa fa-users', url('contest_participation_own', contest.key), _('Participation')) }}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
{{ field }}
|
||||
</div>
|
||||
{% if field.help_text %}
|
||||
<i style="display: block">{{ field.help_text|safe }}</i>
|
||||
<small class="org-help-text"><i class="fa fa-exclamation-circle"></i> {{ field.help_text|safe }}</small>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
{{ field }}
|
||||
</div>
|
||||
{% if field.help_text %}
|
||||
<i style="display: block">{{ field.help_text|safe }}</i>
|
||||
<small class="org-help-text"><i class="fa fa-exclamation-circle"></i> {{ field.help_text|safe }}</small>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
|
|
@ -49,7 +49,7 @@
|
|||
{{ field }}
|
||||
</div>
|
||||
{% if field.help_text %}
|
||||
<i style="display: block">{{ field.help_text|safe }}</i>
|
||||
<small class="org-help-text"><i class="fa fa-exclamation-circle"></i> {{ field.help_text|safe }}</small>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
{{ field }}
|
||||
</div>
|
||||
{% if field.help_text %}
|
||||
<i style="display: block">{{ field.help_text|safe }}</i>
|
||||
<small class="org-help-text"><i class="fa fa-exclamation-circle"></i> {{ field.help_text|safe }}</small>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
|
|
@ -1,7 +1,4 @@
|
|||
<div class="right-sidebar">
|
||||
{% if (is_member or can_edit) %}
|
||||
{% include 'contests-countdown.html' %}
|
||||
{% endif %}
|
||||
{% if can_edit or is_member %}
|
||||
<div id="control-panel" class="blog-sidebox sidebox no-dot-blog-sidebox">
|
||||
<h3><i class="fa fa-cog"></i>{{ _('Controls') }}</h3>
|
||||
|
@ -66,6 +63,11 @@
|
|||
{% endif %}
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if (is_member or can_edit) %}
|
||||
{% include 'contests-countdown.html' %}
|
||||
{% endif %}
|
||||
{% if can_edit or is_member %}
|
||||
<div class="blog-sidebox sidebox">
|
||||
<h3><i class="fa fa-info-circle"></i>{{ _('About') }}</h3>
|
||||
<div class="sidebox-content">
|
||||
|
|
|
@ -56,7 +56,7 @@
|
|||
}
|
||||
|
||||
function navigateTo($elem, update_sidebar = false) {
|
||||
var url = $elem.attr('data-href') || $elem.attr('href');
|
||||
var url = $elem.attr('href');
|
||||
|
||||
if (url === '#') return;
|
||||
if (update_sidebar) {
|
||||
|
@ -83,7 +83,7 @@
|
|||
activateBlogBoxOnClick();
|
||||
$('.xdsoft_datetimepicker').hide();
|
||||
registerNavigation();
|
||||
|
||||
$("#loading-bar").hide().css({ width: 0});
|
||||
}
|
||||
else {
|
||||
window.location.href = url;
|
||||
|
@ -107,7 +107,8 @@
|
|||
});
|
||||
activateBlogBoxOnClick();
|
||||
|
||||
$('.left-sidebar-item').on('click', function () {
|
||||
$('.left-sidebar-item').on('click', function (e) {
|
||||
e.preventDefault();
|
||||
navigateTo($(this), true);
|
||||
});
|
||||
registerNavigation();
|
||||
|
@ -116,10 +117,10 @@
|
|||
{% endblock %}
|
||||
|
||||
{% macro make_tab_item(name, fa, url, text) %}
|
||||
<div class="left-sidebar-item {% if page_type == name %}active{% endif %}" data-href="{{ url }}" id="{{ name }}-tab">
|
||||
<a class="left-sidebar-item {% if page_type == name %}active{% endif %}" href="{{ url }}" id="{{ name }}-tab">
|
||||
<span class="sidebar-icon"><i class="{{ fa }}"></i></span>
|
||||
<span class="sidebar-text">{{ text }}</span>
|
||||
</div>
|
||||
</a>
|
||||
{% endmacro %}
|
||||
|
||||
{% block body %}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue