Add public scoreboard option
This commit is contained in:
parent
f3bcc25eb0
commit
8bb3812f97
11 changed files with 312 additions and 35 deletions
|
@ -158,6 +158,7 @@ class ContestAdmin(CompareVersionAdmin):
|
||||||
"is_visible",
|
"is_visible",
|
||||||
"use_clarifications",
|
"use_clarifications",
|
||||||
"hide_problem_tags",
|
"hide_problem_tags",
|
||||||
|
"public_scoreboard",
|
||||||
"scoreboard_visibility",
|
"scoreboard_visibility",
|
||||||
"run_pretests_only",
|
"run_pretests_only",
|
||||||
"points_precision",
|
"points_precision",
|
||||||
|
|
|
@ -308,6 +308,7 @@ class EditOrganizationContestForm(ModelForm):
|
||||||
"freeze_after",
|
"freeze_after",
|
||||||
"use_clarifications",
|
"use_clarifications",
|
||||||
"hide_problem_tags",
|
"hide_problem_tags",
|
||||||
|
"public_scoreboard",
|
||||||
"scoreboard_visibility",
|
"scoreboard_visibility",
|
||||||
"run_pretests_only",
|
"run_pretests_only",
|
||||||
"points_precision",
|
"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",
|
related_name="view_contest_scoreboard",
|
||||||
help_text=_("These users will be able to view the 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(
|
use_clarifications = models.BooleanField(
|
||||||
verbose_name=_("no comments"),
|
verbose_name=_("no comments"),
|
||||||
help_text=_("Use clarification system instead of comments."),
|
help_text=_("Use clarification system instead of comments."),
|
||||||
|
|
|
@ -107,9 +107,10 @@ __all__ = [
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
def _find_contest(request, key, private_check=True):
|
def _find_contest(request, key):
|
||||||
try:
|
try:
|
||||||
contest = Contest.objects.get(key=key)
|
contest = Contest.objects.get(key=key)
|
||||||
|
private_check = not contest.public_scoreboard
|
||||||
if private_check and not contest.is_accessible_by(request.user):
|
if private_check and not contest.is_accessible_by(request.user):
|
||||||
raise ObjectDoesNotExist()
|
raise ObjectDoesNotExist()
|
||||||
except ObjectDoesNotExist:
|
except ObjectDoesNotExist:
|
||||||
|
@ -277,6 +278,9 @@ class ContestMixin(object):
|
||||||
def can_edit(self):
|
def can_edit(self):
|
||||||
return self.object.is_editable_by(self.request.user)
|
return self.object.is_editable_by(self.request.user)
|
||||||
|
|
||||||
|
def should_bypass_access_check(self, contest):
|
||||||
|
return False
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super(ContestMixin, self).get_context_data(**kwargs)
|
context = super(ContestMixin, self).get_context_data(**kwargs)
|
||||||
if self.request.user.is_authenticated:
|
if self.request.user.is_authenticated:
|
||||||
|
@ -338,6 +342,9 @@ class ContestMixin(object):
|
||||||
):
|
):
|
||||||
return contest
|
return contest
|
||||||
|
|
||||||
|
if self.should_bypass_access_check(contest):
|
||||||
|
return contest
|
||||||
|
|
||||||
try:
|
try:
|
||||||
contest.access_check(self.request.user)
|
contest.access_check(self.request.user)
|
||||||
except Contest.PrivateContest:
|
except Contest.PrivateContest:
|
||||||
|
@ -352,30 +359,6 @@ class ContestMixin(object):
|
||||||
else:
|
else:
|
||||||
return contest
|
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):
|
def dispatch(self, request, *args, **kwargs):
|
||||||
try:
|
try:
|
||||||
return super(ContestMixin, self).dispatch(request, *args, **kwargs)
|
return super(ContestMixin, self).dispatch(request, *args, **kwargs)
|
||||||
|
@ -1095,6 +1078,9 @@ class ContestRankingBase(ContestMixin, TitleMixin, DetailView):
|
||||||
class ContestRanking(ContestRankingBase):
|
class ContestRanking(ContestRankingBase):
|
||||||
page_type = "ranking"
|
page_type = "ranking"
|
||||||
|
|
||||||
|
def should_bypass_access_check(self, contest):
|
||||||
|
return contest.public_scoreboard
|
||||||
|
|
||||||
def get_title(self):
|
def get_title(self):
|
||||||
return _("%s Rankings") % self.object.name
|
return _("%s Rankings") % self.object.name
|
||||||
|
|
||||||
|
|
|
@ -3149,6 +3149,9 @@ a.voted {
|
||||||
.organization-container {
|
.organization-container {
|
||||||
border-color: rgb(62, 68, 70);
|
border-color: rgb(62, 68, 70);
|
||||||
}
|
}
|
||||||
|
.org-help-text {
|
||||||
|
color: rgb(152, 143, 129);
|
||||||
|
}
|
||||||
.ticket-container #content > h2:first-child small {
|
.ticket-container #content > h2:first-child small {
|
||||||
color: rgb(168, 160, 149);
|
color: rgb(168, 160, 149);
|
||||||
}
|
}
|
||||||
|
@ -3865,14 +3868,268 @@ mjx-merror {
|
||||||
mjx-assistive-mml {
|
mjx-assistive-mml {
|
||||||
border-color: initial !important;
|
border-color: initial !important;
|
||||||
}
|
}
|
||||||
mjx-stretchy-v > mjx-ext {
|
.xdsoft_datetimepicker {
|
||||||
border-color: transparent;
|
box-shadow: rgba(0, 0, 0, 0.51) 0px 5px 15px -5px;
|
||||||
|
background-image: initial;
|
||||||
|
background-color: rgb(24, 26, 27);
|
||||||
|
border-color: rgb(62, 68, 70) rgb(62, 68, 70) rgb(67, 73, 76);
|
||||||
|
color: rgb(200, 195, 188);
|
||||||
}
|
}
|
||||||
.recently-attempted ul {
|
.xdsoft_datetimepicker iframe {
|
||||||
list-style-image: initial;
|
background-image: initial;
|
||||||
|
background-color: transparent;
|
||||||
|
border-color: initial;
|
||||||
}
|
}
|
||||||
.organization-row:last-child {
|
.xdsoft_datetimepicker button {
|
||||||
border-bottom-color: initial;
|
border-color: initial !important;
|
||||||
|
}
|
||||||
|
.xdsoft_noselect::selection {
|
||||||
|
background-image: initial;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_inline {
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .xdsoft_label i,
|
||||||
|
.xdsoft_datetimepicker .xdsoft_prev,
|
||||||
|
.xdsoft_datetimepicker .xdsoft_next,
|
||||||
|
.xdsoft_datetimepicker .xdsoft_today_button {
|
||||||
|
background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjMwIj48ZGVmcz48ZmlsdGVyIGlkPSJkYXJrcmVhZGVyLWltYWdlLWZpbHRlciI+PGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAuMjQ5IC0wLjYxNCAtMC42NzIgMC4wMDAgMS4wMzUgLTAuNjQ2IDAuMjg4IC0wLjY2NCAwLjAwMCAxLjAyMCAtMC42MzYgLTAuNjA5IDAuMjUwIDAuMDAwIDAuOTk0IDAuMDAwIDAuMDAwIDAuMDAwIDEuMDAwIDAuMDAwIiAvPjwvZmlsdGVyPjwvZGVmcz48aW1hZ2Ugd2lkdGg9IjEwMCIgaGVpZ2h0PSIzMCIgZmlsdGVyPSJ1cmwoI2RhcmtyZWFkZXItaW1hZ2UtZmlsdGVyKSIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFHUUFBQUFlQ0FZQUFBRGFXN3Z6QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5SnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU15MWpNREV4SURZMkxqRTBOVFkyTVN3Z01qQXhNaTh3TWk4d05pMHhORG8xTmpveU55QWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTlROaUFvVjJsdVpHOTNjeWtpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBOQlJqSTFOak0wTTBVd01URkZORGs0TmtGR016SkZRa1F6UWpFd1JVSWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRME5CUmpJMU5qUTBNMFV3TVRGRk5EazROa0ZHTXpKRlFrUXpRakV3UlVJaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERRMEZHTWpVMk1UUXpSVEF4TVVVME9UZzJRVVl6TWtWQ1JETkNNVEJGUWlJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFEwRkdNalUyTWpRelJUQXhNVVUwT1RnMlFVWXpNa1ZDUkROQ01UQkZRaUl2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG9ORVA1NEFBQUlPU1VSQlZIamE3SnE5VHNNd0VNY3hyWkQ0V3BCWWVLVUNlK2tUTUNBQ0haaDRCRmZITy9BQUlIWkdGaFlrQkJzU0VxeHNMQ0FnWEtoYlhZT1R4aDlwZkpWUCtxdXRuWjVzLzVMejJZNUkwM1FoV2ppMkdJY2dBb2tXZ2ZDeE52Y09DQ0dLcWlTcWhVcDBsYUhPbmUwNXZkRXlHTWZrZHhKRFZqZ3dEbEVRZ1lRQmd4K1VMSmFXU1hYUzZyL0VSNUZCVlI4VmZHZnRUS2NJVE5zK2ExWHBjRm9FeFJFSURGMTRBVklGeGdRVVMraDUyMGNkdWQ2d05rQzBVQnc2QkNPL0hvQ1l3QmhEOFFDa1EveDFtd0R5RDRwbGg0RDZERFYwVEFHeW80SGNhd0xJQkJTTERrSGVIME1nMnlWUDNsNFRRTVpRRERzRU9sL01nSFFxaE1OdUUwRCtvQmgwQ0lyOE1BS3lhekJIOVd5QnVLeERXZ2JYZmpOZjMyVFoxS1dtL0FwMW9Tay9SNTNVdFE1eFRoM0xVbE1tVDhndDZnNTFROXArU29ieGdKUS9xbXNmWmhXeXdHRlNsMHlCakNMSkNNZ1hhaWwzYjcrcnVtZFZKMllSc3M0Y04rcjZxQUhEa1BXalBqZEpDRjRuOVJtQUQvVjlBL1dwNE5RYXNzRGp3bEI2WEJpQ3hjSlFXbVpaYjhUSEZpbGZ5L2xmclR2TGdocTJUcVRIclJNVEtOSjBzSWhkbzE1UlQrUnB5V3dGZFk5NlVaL0xkUUtCR2pjWHBjYzFBbFNGRWZMbW91RCsxa251eEJEVVZydk9CbW9PQy9yRWNON09ReEtWZUpUQ2lBZFV6VUpoQTJPZXo5UVRrcDcyT1RWY3hEY1hZOGlLTmt4R0FKWG1KQ09Rd09hNmRoeVhzT2E2WHdFR0FLZGViNUVUM3JRZEFBQUFBRWxGVGtTdVFtQ0MiIC8+PC9zdmc+");
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .xdsoft_next,
|
||||||
|
.xdsoft_datetimepicker .xdsoft_prev,
|
||||||
|
.xdsoft_datetimepicker .xdsoft_today_button {
|
||||||
|
background-color: transparent;
|
||||||
|
border-color: initial;
|
||||||
|
outline-color: initial;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box {
|
||||||
|
border-bottom-color: rgb(58, 62, 65);
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box > div > div {
|
||||||
|
background-image: initial;
|
||||||
|
background-color: rgb(30, 32, 33);
|
||||||
|
border-top-color: rgb(58, 62, 65);
|
||||||
|
color: rgb(168, 160, 149);
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .xdsoft_label {
|
||||||
|
background-color: rgb(24, 26, 27);
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .xdsoft_label:hover > span {
|
||||||
|
text-decoration-color: initial;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select {
|
||||||
|
border-color: rgb(62, 68, 70);
|
||||||
|
background-image: initial;
|
||||||
|
background-color: rgb(24, 26, 27);
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option:hover {
|
||||||
|
color: rgb(232, 230, 227);
|
||||||
|
background-image: initial;
|
||||||
|
background-color: rgb(204, 102, 0);
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option {
|
||||||
|
text-decoration-color: initial !important;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option.xdsoft_current {
|
||||||
|
background-image: initial;
|
||||||
|
background-color: rgb(0, 101, 173);
|
||||||
|
box-shadow: rgb(18, 114, 183) 0px 1px 3px 0px inset;
|
||||||
|
color: rgb(232, 230, 227);
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar td,
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar th {
|
||||||
|
background-image: initial;
|
||||||
|
background-color: rgb(30, 32, 33);
|
||||||
|
border-color: rgb(58, 62, 65);
|
||||||
|
color: rgb(168, 160, 149);
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar th {
|
||||||
|
background-image: initial;
|
||||||
|
background-color: rgb(32, 35, 36);
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_today {
|
||||||
|
color: rgb(61, 174, 255);
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_highlighted_default {
|
||||||
|
background-image: initial;
|
||||||
|
background-color: rgb(78, 40, 0);
|
||||||
|
box-shadow: rgb(136, 68, 0) 0px 1px 4px 0px inset;
|
||||||
|
color: rgb(232, 230, 227);
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_highlighted_mint {
|
||||||
|
background-image: initial;
|
||||||
|
background-color: rgb(0, 88, 31);
|
||||||
|
box-shadow: rgb(0, 177, 22) 0px 1px 4px 0px inset;
|
||||||
|
color: rgb(232, 230, 227);
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_default,
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_current,
|
||||||
|
.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box > div > div.xdsoft_current {
|
||||||
|
background-image: initial;
|
||||||
|
background-color: rgb(0, 101, 173);
|
||||||
|
box-shadow: rgb(18, 114, 183) 0px 1px 3px 0px inset;
|
||||||
|
color: rgb(232, 230, 227);
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar td:hover,
|
||||||
|
.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box > div > div:hover {
|
||||||
|
color: rgb(232, 230, 227) !important;
|
||||||
|
background-image: initial !important;
|
||||||
|
background-color: rgb(204, 102, 0) !important;
|
||||||
|
box-shadow: none !important;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_current.xdsoft_disabled:hover,
|
||||||
|
.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box > div > div.xdsoft_current.xdsoft_disabled:hover {
|
||||||
|
background-image: initial !important;
|
||||||
|
background-color: rgb(0, 101, 173) !important;
|
||||||
|
box-shadow: rgb(18, 114, 183) 0px 1px 3px 0px inset !important;
|
||||||
|
color: rgb(232, 230, 227) !important;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_disabled:hover,
|
||||||
|
.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box > div > div.xdsoft_disabled:hover {
|
||||||
|
color: inherit !important;
|
||||||
|
background-image: inherit !important;
|
||||||
|
background-color: inherit !important;
|
||||||
|
box-shadow: inherit !important;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar th {
|
||||||
|
color: rgb(168, 160, 149);
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .xdsoft_copyright {
|
||||||
|
color: rgb(200, 195, 188) !important;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .xdsoft_copyright a {
|
||||||
|
color: rgb(221, 218, 214) !important;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .xdsoft_copyright a:hover {
|
||||||
|
color: rgb(178, 172, 162) !important;
|
||||||
|
}
|
||||||
|
.xdsoft_time_box {
|
||||||
|
border-color: rgb(62, 68, 70);
|
||||||
|
}
|
||||||
|
.xdsoft_scrollbar > .xdsoft_scroller {
|
||||||
|
background-image: initial !important;
|
||||||
|
background-color: rgb(53, 57, 59) !important;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark {
|
||||||
|
box-shadow: rgba(24, 26, 27, 0.51) 0px 5px 15px -5px;
|
||||||
|
background-image: initial;
|
||||||
|
background-color: rgb(0, 0, 0);
|
||||||
|
border-color: rgb(123, 114, 101) rgb(123, 114, 101) rgb(118, 109, 97);
|
||||||
|
color: rgb(200, 195, 188);
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_timepicker .xdsoft_time_box {
|
||||||
|
border-bottom-color: rgb(129, 120, 106);
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_timepicker .xdsoft_time_box > div > div {
|
||||||
|
background-image: initial;
|
||||||
|
background-color: rgb(8, 8, 8);
|
||||||
|
border-top-color: rgb(129, 120, 106);
|
||||||
|
color: rgb(168, 160, 149);
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_label {
|
||||||
|
background-color: rgb(0, 0, 0);
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_label > .xdsoft_select {
|
||||||
|
border-color: rgb(123, 114, 101);
|
||||||
|
background-image: initial;
|
||||||
|
background-color: rgb(0, 0, 0);
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_label > .xdsoft_select > div > .xdsoft_option:hover {
|
||||||
|
color: rgb(232, 230, 227);
|
||||||
|
background-image: initial;
|
||||||
|
background-color: rgb(0, 102, 204);
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_label > .xdsoft_select > div > .xdsoft_option.xdsoft_current {
|
||||||
|
background-image: initial;
|
||||||
|
background-color: rgb(163, 68, 0);
|
||||||
|
box-shadow: rgb(141, 50, 0) 0px 1px 3px 0px inset;
|
||||||
|
color: rgb(232, 230, 227);
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_label i,
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_prev,
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_next,
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_today_button {
|
||||||
|
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAeCAYAAADaW7vzAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUExQUUzOTA0M0UyMTFFNDlBM0FFQTJENTExRDVBODYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUExQUUzOTE0M0UyMTFFNDlBM0FFQTJENTExRDVBODYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQTFBRTM4RTQzRTIxMUU0OUEzQUVBMkQ1MTFENUE4NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQTFBRTM4RjQzRTIxMUU0OUEzQUVBMkQ1MTFENUE4NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pp0VxGEAAAIASURBVHja7JrNSgMxEMebtgh+3MSLr1T1Xn2CHoSKB08+QmR8Bx9A8e7RixdB9CKCoNdexIugxFlJa7rNZneTbLIpM/CnNLsdMvNjM8l0mRCiQ9Ye61IKCAgZAUnH+mU3MMZaHYChBnJUDzWOFZdVfc5+ZFLbrWDeXPwbxIqrLLfaeS0hEBVGIRQCEiZoHQwtlGSByCCdYBl8g8egTTAWoKQMRBRBcZxYlhzhKegqMOageErsCHVkk3hXIFooDgHB1KkHIHVgzKB4ADJQ/A1jAFmAYhkQqA5TOBtocrKrgXwQA8gcFIuAIO8sQSA7hidvPwaQGZSaAYHOUWJABhWWw2EMIH9QagQERU4SArJXo0ZZL18uvaxejXt/Em8xjVBXmvFr1KVm/AJ10tRe2XnraNqaJvKE3KHuUbfK1E+VHB0q40/y3sdQSxY4FHWeKJCunP8UyDdqJZenT3ntVV5jIYCAh20vT7ioP8tpf6E2lfEMwERe+whV1MHjwZB7PBiCxcGQWwKZKD62lfGNnP/1poFAA60T7rF1UgcKd2id3KDeUS+oLWV8DfWAepOfq00CgQabi9zjcgJVYVD7PVzQUAUGAQkbNJTBICDhgwYTjDYD6XeW08ZKh+A4pYkzenOxXUbvZcWz7E8ykRMnIHGX1XPl+1m2vPYpL+2qdb8CDAARlKFEz/ZVkAAAAABJRU5ErkJggg==");
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td,
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar th {
|
||||||
|
background-image: initial;
|
||||||
|
background-color: rgb(8, 8, 8);
|
||||||
|
border-color: rgb(129, 120, 106);
|
||||||
|
color: rgb(168, 160, 149);
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar th {
|
||||||
|
background-image: initial;
|
||||||
|
background-color: rgb(11, 11, 12);
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_today {
|
||||||
|
color: rgb(255, 142, 61);
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_highlighted_default {
|
||||||
|
background-image: initial;
|
||||||
|
background-color: rgb(78, 40, 0);
|
||||||
|
box-shadow: rgb(136, 68, 0) 0px 1px 4px 0px inset;
|
||||||
|
color: rgb(232, 230, 227);
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_highlighted_mint {
|
||||||
|
background-image: initial;
|
||||||
|
background-color: rgb(0, 88, 31);
|
||||||
|
box-shadow: rgb(0, 177, 22) 0px 1px 4px 0px inset;
|
||||||
|
color: rgb(232, 230, 227);
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_default,
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_current,
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_timepicker .xdsoft_time_box > div > div.xdsoft_current {
|
||||||
|
background-image: initial;
|
||||||
|
background-color: rgb(163, 68, 0);
|
||||||
|
box-shadow: rgb(141, 50, 0) 0px 1px 3px 0px inset;
|
||||||
|
color: rgb(232, 230, 227);
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td:hover,
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_timepicker .xdsoft_time_box > div > div:hover {
|
||||||
|
color: rgb(232, 230, 227) !important;
|
||||||
|
background-image: initial !important;
|
||||||
|
background-color: rgb(0, 102, 204) !important;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar th {
|
||||||
|
color: rgb(168, 160, 149);
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_copyright {
|
||||||
|
color: rgb(200, 195, 188) !important;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_copyright a {
|
||||||
|
color: rgb(221, 218, 214) !important;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_copyright a:hover {
|
||||||
|
color: rgb(178, 172, 162) !important;
|
||||||
|
}
|
||||||
|
.xdsoft_dark .xdsoft_time_box {
|
||||||
|
border-color: rgb(123, 114, 101);
|
||||||
|
}
|
||||||
|
.xdsoft_dark .xdsoft_scrollbar > .xdsoft_scroller {
|
||||||
|
background-image: initial !important;
|
||||||
|
background-color: rgb(38, 42, 43) !important;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .xdsoft_save_selected {
|
||||||
|
color: rgb(185, 179, 169);
|
||||||
|
border-color: rgb(58, 62, 65) !important;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .blue-gradient-button {
|
||||||
|
color: rgb(156, 148, 135);
|
||||||
|
border-color: rgb(59, 64, 66);
|
||||||
|
background-image: linear-gradient(rgb(24, 26, 27) 0px,
|
||||||
|
rgb(19, 34, 42) 73%);
|
||||||
|
background-color: initial;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .blue-gradient-button:hover,
|
||||||
|
.xdsoft_datetimepicker .blue-gradient-button:focus,
|
||||||
|
.xdsoft_datetimepicker .blue-gradient-button:hover span,
|
||||||
|
.xdsoft_datetimepicker .blue-gradient-button:focus span {
|
||||||
|
color: rgb(185, 179, 169);
|
||||||
|
background-image: linear-gradient(rgb(19, 34, 42) 0px,
|
||||||
|
rgb(24, 26, 27) 73%);
|
||||||
|
background-color: initial;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Override Style */
|
/* Override Style */
|
||||||
|
|
|
@ -48,3 +48,8 @@
|
||||||
margin-bottom: 3em;
|
margin-bottom: 3em;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.org-help-text {
|
||||||
|
display: block;
|
||||||
|
color: gray;
|
||||||
|
}
|
|
@ -28,7 +28,7 @@
|
||||||
{{ field }}
|
{{ field }}
|
||||||
</div>
|
</div>
|
||||||
{% if field.help_text %}
|
{% 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 %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
{{ field }}
|
{{ field }}
|
||||||
</div>
|
</div>
|
||||||
{% if field.help_text %}
|
{% 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 %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
|
@ -49,7 +49,7 @@
|
||||||
{{ field }}
|
{{ field }}
|
||||||
</div>
|
</div>
|
||||||
{% if field.help_text %}
|
{% 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 %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
{{ field }}
|
{{ field }}
|
||||||
</div>
|
</div>
|
||||||
{% if field.help_text %}
|
{% 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 %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
Loading…
Reference in a new issue