1233 lines
43 KiB
Python
1233 lines
43 KiB
Python
import chat_box.views as chat
|
|
|
|
from django.conf import settings
|
|
from django.conf.urls import include, url
|
|
from django.contrib import admin
|
|
from django.contrib.auth import views as auth_views
|
|
from django.contrib.sitemaps.views import sitemap
|
|
from django.http import Http404, HttpResponsePermanentRedirect, HttpResponseRedirect
|
|
from django.templatetags.static import static
|
|
from django.urls import reverse
|
|
from django.utils.functional import lazystr
|
|
from django.utils.translation import ugettext_lazy as _
|
|
from django.views.generic import RedirectView
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.conf.urls.static import static as url_static
|
|
|
|
|
|
from judge.forms import CustomAuthenticationForm
|
|
from judge.sitemap import (
|
|
BlogPostSitemap,
|
|
ContestSitemap,
|
|
HomePageSitemap,
|
|
OrganizationSitemap,
|
|
ProblemSitemap,
|
|
SolutionSitemap,
|
|
UrlSitemap,
|
|
UserSitemap,
|
|
)
|
|
from judge.views import (
|
|
TitledTemplateView,
|
|
about,
|
|
api,
|
|
blog,
|
|
comment,
|
|
contests,
|
|
language,
|
|
license,
|
|
mailgun,
|
|
markdown_editor,
|
|
test_formatter,
|
|
notification,
|
|
organization,
|
|
preview,
|
|
problem,
|
|
problem_manage,
|
|
ranked_submission,
|
|
register,
|
|
stats,
|
|
status,
|
|
submission,
|
|
tasks,
|
|
ticket,
|
|
totp,
|
|
user,
|
|
volunteer,
|
|
pagevote,
|
|
bookmark,
|
|
widgets,
|
|
internal,
|
|
resolver,
|
|
course,
|
|
email,
|
|
)
|
|
|
|
from judge.views.test_formatter import test_formatter
|
|
|
|
from judge.views.problem_data import (
|
|
ProblemDataView,
|
|
ProblemSubmissionDiff,
|
|
problem_data_file,
|
|
problem_init_view,
|
|
ProblemZipUploadView,
|
|
)
|
|
from judge.views.register import ActivationView, RegistrationView
|
|
from judge.views.select2 import (
|
|
AssigneeSelect2View,
|
|
ChatUserSearchSelect2View,
|
|
CommentSelect2View,
|
|
ContestSelect2View,
|
|
ContestUserSearchSelect2View,
|
|
OrganizationSelect2View,
|
|
ProblemSelect2View,
|
|
TicketUserSelect2View,
|
|
UserSearchSelect2View,
|
|
UserSelect2View,
|
|
)
|
|
|
|
admin.autodiscover()
|
|
|
|
register_patterns = [
|
|
url(
|
|
r"^activate/complete/$",
|
|
TitledTemplateView.as_view(
|
|
template_name="registration/activation_complete.html",
|
|
title="Activation Successful!",
|
|
),
|
|
name="registration_activation_complete",
|
|
),
|
|
# Activation keys get matched by \w+ instead of the more specific
|
|
# [a-fA-F0-9]{40} because a bad activation key should still get to the view;
|
|
# that way it can return a sensible "invalid key" message instead of a
|
|
# confusing 404.
|
|
url(
|
|
r"^activate/(?P<activation_key>\w+)/$",
|
|
ActivationView.as_view(title=_("Activation key invalid")),
|
|
name="registration_activate",
|
|
),
|
|
url(
|
|
r"^register/$",
|
|
RegistrationView.as_view(title=_("Register")),
|
|
name="registration_register",
|
|
),
|
|
url(
|
|
r"^register/complete/$",
|
|
TitledTemplateView.as_view(
|
|
template_name="registration/registration_complete.html",
|
|
title=_("Registration Completed"),
|
|
),
|
|
name="registration_complete",
|
|
),
|
|
url(
|
|
r"^register/closed/$",
|
|
TitledTemplateView.as_view(
|
|
template_name="registration/registration_closed.html",
|
|
title=_("Registration not allowed"),
|
|
),
|
|
name="registration_disallowed",
|
|
),
|
|
url(
|
|
r"^login/$",
|
|
auth_views.LoginView.as_view(
|
|
template_name="registration/login.html",
|
|
extra_context={"title": _("Login")},
|
|
authentication_form=CustomAuthenticationForm,
|
|
redirect_authenticated_user=True,
|
|
),
|
|
name="auth_login",
|
|
),
|
|
url(r"^logout/$", user.UserLogoutView.as_view(), name="auth_logout"),
|
|
url(
|
|
r"^password/change/$",
|
|
auth_views.PasswordChangeView.as_view(
|
|
template_name="registration/password_change_form.html",
|
|
),
|
|
name="password_change",
|
|
),
|
|
url(
|
|
r"^password/change/done/$",
|
|
auth_views.PasswordChangeDoneView.as_view(
|
|
template_name="registration/password_change_done.html",
|
|
),
|
|
name="password_change_done",
|
|
),
|
|
url(
|
|
r"^password/reset/$",
|
|
auth_views.PasswordResetView.as_view(
|
|
template_name="registration/password_reset.html",
|
|
html_email_template_name="registration/password_reset_email.html",
|
|
email_template_name="registration/password_reset_email.txt",
|
|
),
|
|
name="password_reset",
|
|
),
|
|
url(
|
|
r"^password/reset/confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$",
|
|
auth_views.PasswordResetConfirmView.as_view(
|
|
template_name="registration/password_reset_confirm.html",
|
|
),
|
|
name="password_reset_confirm",
|
|
),
|
|
url(
|
|
r"^password/reset/complete/$",
|
|
auth_views.PasswordResetCompleteView.as_view(
|
|
template_name="registration/password_reset_complete.html",
|
|
),
|
|
name="password_reset_complete",
|
|
),
|
|
url(
|
|
r"^password/reset/done/$",
|
|
auth_views.PasswordResetDoneView.as_view(
|
|
template_name="registration/password_reset_done.html",
|
|
),
|
|
name="password_reset_done",
|
|
),
|
|
url(r"^email/change/$", email.email_change_view, name="email_change"),
|
|
url(
|
|
r"^email/change/verify/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$",
|
|
email.verify_email_view,
|
|
name="email_change_verify",
|
|
),
|
|
url(
|
|
r"^email/change/pending$",
|
|
email.email_change_pending_view,
|
|
name="email_change_pending",
|
|
),
|
|
url(r"^social/error/$", register.social_auth_error, name="social_auth_error"),
|
|
url(r"^2fa/$", totp.TOTPLoginView.as_view(), name="login_2fa"),
|
|
url(r"^2fa/enable/$", totp.TOTPEnableView.as_view(), name="enable_2fa"),
|
|
url(r"^2fa/disable/$", totp.TOTPDisableView.as_view(), name="disable_2fa"),
|
|
]
|
|
|
|
|
|
def exception(request):
|
|
if not request.user.is_superuser:
|
|
raise Http404()
|
|
raise RuntimeError("@Xyene asked me to cause this")
|
|
|
|
|
|
def paged_list_view(view, name, **kwargs):
|
|
return include(
|
|
[
|
|
url(r"^$", view.as_view(**kwargs), name=name),
|
|
url(r"^(?P<page>\d+)$", view.as_view(**kwargs), name=name),
|
|
]
|
|
)
|
|
|
|
|
|
urlpatterns = [
|
|
url("", include("pagedown.urls")),
|
|
url(
|
|
r"^$",
|
|
blog.PostList.as_view(template_name="home.html", title=_("Home")),
|
|
kwargs={"page": 1},
|
|
name="home",
|
|
),
|
|
url(r"^500/$", exception),
|
|
url(r"^toggle_darkmode/$", user.toggle_darkmode, name="toggle_darkmode"),
|
|
url(r"^admin/", admin.site.urls),
|
|
url(r"^i18n/", include("django.conf.urls.i18n")),
|
|
url(r"^accounts/", include(register_patterns)),
|
|
url(r"^", include("social_django.urls")),
|
|
url(
|
|
r"^feed/",
|
|
include(
|
|
[
|
|
url(r"^tickets/$", blog.TicketFeed.as_view(), name="ticket_feed"),
|
|
url(r"^comments/$", blog.CommentFeed.as_view(), name="comment_feed"),
|
|
]
|
|
),
|
|
),
|
|
url(r"^problems/", paged_list_view(problem.ProblemList, "problem_list")),
|
|
url(r"^problems/random/$", problem.RandomProblem.as_view(), name="problem_random"),
|
|
url(
|
|
r"^problems/feed/$",
|
|
problem.ProblemFeed.as_view(feed_type="for_you"),
|
|
name="problem_feed",
|
|
),
|
|
url(
|
|
r"^problems/feed/new/$",
|
|
problem.ProblemFeed.as_view(feed_type="new"),
|
|
name="problem_feed_new",
|
|
),
|
|
url(
|
|
r"^problems/feed/volunteer/$",
|
|
problem.ProblemFeed.as_view(feed_type="volunteer"),
|
|
name="problem_feed_volunteer",
|
|
),
|
|
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"^/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",
|
|
),
|
|
url(
|
|
r"^/pdf_description$",
|
|
problem.ProblemPdfDescriptionView.as_view(),
|
|
name="problem_pdf_description",
|
|
),
|
|
url(r"^/clone", problem.ProblemClone.as_view(), name="problem_clone"),
|
|
url(r"^/submit$", problem.problem_submit, name="problem_submit"),
|
|
url(
|
|
r"^/resubmit/(?P<submission>\d+)$",
|
|
problem.problem_submit,
|
|
name="problem_submit",
|
|
),
|
|
url(
|
|
r"^/rank/",
|
|
paged_list_view(
|
|
ranked_submission.RankedSubmissions, "ranked_submissions"
|
|
),
|
|
),
|
|
url(
|
|
r"^/submissions/",
|
|
paged_list_view(
|
|
submission.ProblemSubmissions, "chronological_submissions"
|
|
),
|
|
),
|
|
url(
|
|
r"^/submissions/(?P<user>\w+)/",
|
|
paged_list_view(
|
|
submission.UserProblemSubmissions, "user_submissions"
|
|
),
|
|
),
|
|
url(
|
|
r"^/$",
|
|
lambda _, problem: HttpResponsePermanentRedirect(
|
|
reverse("problem_detail", args=[problem])
|
|
),
|
|
),
|
|
url(r"^/test_data$", ProblemDataView.as_view(), name="problem_data"),
|
|
url(r"^/test_data/init$", problem_init_view, name="problem_data_init"),
|
|
url(
|
|
r"^/test_data/diff$",
|
|
ProblemSubmissionDiff.as_view(),
|
|
name="problem_submission_diff",
|
|
),
|
|
url(
|
|
r"^/test_data/upload$",
|
|
ProblemZipUploadView.as_view(),
|
|
name="problem_zip_upload",
|
|
),
|
|
url(
|
|
r"^/data/(?P<path>.+)$", problem_data_file, name="problem_data_file"
|
|
),
|
|
url(
|
|
r"^/tickets$",
|
|
ticket.ProblemTicketListView.as_view(),
|
|
name="problem_ticket_list",
|
|
),
|
|
url(
|
|
r"^/tickets/new$",
|
|
ticket.NewProblemTicketView.as_view(),
|
|
name="new_problem_ticket",
|
|
),
|
|
url(
|
|
r"^/manage/submission",
|
|
include(
|
|
[
|
|
url(
|
|
"^$",
|
|
problem_manage.ManageProblemSubmissionView.as_view(),
|
|
name="problem_manage_submissions",
|
|
),
|
|
url(
|
|
"^/action$",
|
|
problem_manage.ActionSubmissionsView.as_view(),
|
|
name="problem_submissions_action",
|
|
),
|
|
url(
|
|
"^/action/preview$",
|
|
problem_manage.PreviewActionSubmissionsView.as_view(),
|
|
name="problem_submissions_rejudge_preview",
|
|
),
|
|
url(
|
|
"^/rejudge/success/(?P<task_id>[A-Za-z0-9-]*)$",
|
|
problem_manage.rejudge_success,
|
|
name="problem_submissions_rejudge_success",
|
|
),
|
|
url(
|
|
"^/rescore/all$",
|
|
problem_manage.RescoreAllSubmissionsView.as_view(),
|
|
name="problem_submissions_rescore_all",
|
|
),
|
|
url(
|
|
"^/rescore/success/(?P<task_id>[A-Za-z0-9-]*)$",
|
|
problem_manage.rescore_success,
|
|
name="problem_submissions_rescore_success",
|
|
),
|
|
]
|
|
),
|
|
),
|
|
]
|
|
),
|
|
),
|
|
url(
|
|
r"^submissions/", paged_list_view(submission.AllSubmissions, "all_submissions")
|
|
),
|
|
url(
|
|
r"^submissions/user/(?P<user>\w+)/",
|
|
paged_list_view(submission.AllUserSubmissions, "all_user_submissions"),
|
|
),
|
|
url(
|
|
r"^submissions/friends/",
|
|
paged_list_view(submission.AllFriendSubmissions, "all_friend_submissions"),
|
|
),
|
|
url(
|
|
r"^src/(?P<submission>\d+)/raw$",
|
|
submission.SubmissionSourceRaw.as_view(),
|
|
name="submission_source_raw",
|
|
),
|
|
url(
|
|
r"^submission/(?P<submission>\d+)",
|
|
include(
|
|
[
|
|
url(
|
|
r"^$",
|
|
submission.SubmissionStatus.as_view(),
|
|
name="submission_status",
|
|
),
|
|
url(r"^/abort$", submission.abort_submission, name="submission_abort"),
|
|
url(r"^/html$", submission.single_submission),
|
|
]
|
|
),
|
|
),
|
|
url(
|
|
r"^test_formatter/",
|
|
include(
|
|
[
|
|
url(
|
|
r"^$", test_formatter.TestFormatter.as_view(), name="test_formatter"
|
|
),
|
|
url(
|
|
r"^edit_page$",
|
|
test_formatter.EditTestFormatter.as_view(),
|
|
name="test_formatter_edit",
|
|
),
|
|
url(
|
|
r"^download_page$",
|
|
test_formatter.DownloadTestFormatter.as_view(),
|
|
name="test_formatter_download",
|
|
),
|
|
]
|
|
),
|
|
),
|
|
url(
|
|
r"^markdown_editor/",
|
|
markdown_editor.MarkdownEditor.as_view(),
|
|
name="markdown_editor",
|
|
),
|
|
url(
|
|
r"^test_formatter/",
|
|
include(
|
|
[
|
|
url(
|
|
r"^$", test_formatter.TestFormatter.as_view(), name="test_formatter"
|
|
),
|
|
url(
|
|
r"^edit_page$",
|
|
test_formatter.EditTestFormatter.as_view(),
|
|
name="edit_page",
|
|
),
|
|
url(
|
|
r"^download_page$",
|
|
test_formatter.DownloadTestFormatter.as_view(),
|
|
name="download_page",
|
|
),
|
|
]
|
|
),
|
|
),
|
|
url(
|
|
r"^submission_source_file/(?P<filename>(\w|\.)+)",
|
|
submission.SubmissionSourceFileView.as_view(),
|
|
name="submission_source_file",
|
|
),
|
|
url(
|
|
r"^users/",
|
|
include(
|
|
[
|
|
url(r"^$", user.users, name="user_list"),
|
|
url(
|
|
r"^(?P<page>\d+)$",
|
|
lambda request, page: HttpResponsePermanentRedirect(
|
|
"%s?page=%s" % (reverse("user_list"), page)
|
|
),
|
|
),
|
|
url(
|
|
r"^find$", user.user_ranking_redirect, name="user_ranking_redirect"
|
|
),
|
|
]
|
|
),
|
|
),
|
|
url(r"^user$", user.UserAboutPage.as_view(), name="user_page"),
|
|
url(r"^edit/profile/$", user.edit_profile, name="user_edit_profile"),
|
|
url(r"^user/bookmarks", user.UserBookMarkPage.as_view(), name="user_bookmark"),
|
|
url(
|
|
r"^user/(?P<user>\w+)",
|
|
include(
|
|
[
|
|
url(r"^$", user.UserAboutPage.as_view(), name="user_page"),
|
|
url(
|
|
r"^/solved",
|
|
include(
|
|
[
|
|
url(
|
|
r"^$",
|
|
user.UserProblemsPage.as_view(),
|
|
name="user_problems",
|
|
),
|
|
url(
|
|
r"/ajax$",
|
|
user.UserPerformancePointsAjax.as_view(),
|
|
name="user_pp_ajax",
|
|
),
|
|
]
|
|
),
|
|
),
|
|
url(
|
|
r"^/submissions/",
|
|
paged_list_view(
|
|
submission.AllUserSubmissions, "all_user_submissions_old"
|
|
),
|
|
),
|
|
url(
|
|
r"^/submissions/",
|
|
lambda _, user: HttpResponsePermanentRedirect(
|
|
reverse("all_user_submissions", args=[user])
|
|
),
|
|
),
|
|
url(
|
|
r"^/$",
|
|
lambda _, user: HttpResponsePermanentRedirect(
|
|
reverse("user_page", args=[user])
|
|
),
|
|
),
|
|
]
|
|
),
|
|
),
|
|
url(r"^pagevotes/upvote/$", pagevote.upvote_page, name="pagevote_upvote"),
|
|
url(r"^pagevotes/downvote/$", pagevote.downvote_page, name="pagevote_downvote"),
|
|
url(r"^bookmarks/dobookmark/$", bookmark.dobookmark_page, name="dobookmark"),
|
|
url(r"^bookmarks/undobookmark/$", bookmark.undobookmark_page, name="undobookmark"),
|
|
url(r"^comments/upvote/$", comment.upvote_comment, name="comment_upvote"),
|
|
url(r"^comments/downvote/$", comment.downvote_comment, name="comment_downvote"),
|
|
url(r"^comments/hide/$", comment.comment_hide, name="comment_hide"),
|
|
url(r"^comments/get_replies/$", comment.get_replies, name="comment_get_replies"),
|
|
url(r"^comments/show_more/$", comment.get_show_more, name="comment_show_more"),
|
|
url(
|
|
r"^comments/(?P<id>\d+)/",
|
|
include(
|
|
[
|
|
url(r"^edit$", comment.CommentEdit.as_view(), name="comment_edit"),
|
|
url(
|
|
r"^history/ajax$",
|
|
comment.CommentRevisionAjax.as_view(),
|
|
name="comment_revision_ajax",
|
|
),
|
|
url(
|
|
r"^edit/ajax$",
|
|
comment.CommentEditAjax.as_view(),
|
|
name="comment_edit_ajax",
|
|
),
|
|
url(
|
|
r"^votes/ajax$",
|
|
comment.CommentVotesAjax.as_view(),
|
|
name="comment_votes_ajax",
|
|
),
|
|
url(
|
|
r"^render$",
|
|
comment.CommentContent.as_view(),
|
|
name="comment_content",
|
|
),
|
|
]
|
|
),
|
|
),
|
|
url(r"^contests/", paged_list_view(contests.ContestList, "contest_list")),
|
|
url(
|
|
r"^contests/summary/(?P<key>\w+)/",
|
|
paged_list_view(contests.ContestsSummaryView, "contests_summary"),
|
|
),
|
|
url(r"^course/", paged_list_view(course.CourseList, "course_list")),
|
|
url(
|
|
r"^contests/(?P<year>\d+)/(?P<month>\d+)/$",
|
|
contests.ContestCalendar.as_view(),
|
|
name="contest_calendar",
|
|
),
|
|
url(
|
|
r"^contests/tag/(?P<name>[a-z-]+)",
|
|
include(
|
|
[
|
|
url(r"^$", contests.ContestTagDetail.as_view(), name="contest_tag"),
|
|
url(
|
|
r"^/ajax$",
|
|
contests.ContestTagDetailAjax.as_view(),
|
|
name="contest_tag_ajax",
|
|
),
|
|
]
|
|
),
|
|
),
|
|
url(
|
|
r"^contest/(?P<contest>\w+)",
|
|
include(
|
|
[
|
|
url(r"^$", contests.ContestDetail.as_view(), name="contest_view"),
|
|
url(
|
|
r"^/moss$", contests.ContestMossView.as_view(), name="contest_moss"
|
|
),
|
|
url(
|
|
r"^/moss/delete$",
|
|
contests.ContestMossDelete.as_view(),
|
|
name="contest_moss_delete",
|
|
),
|
|
url(r"^/clone$", contests.ContestClone.as_view(), name="contest_clone"),
|
|
url(
|
|
r"^/ranking/$",
|
|
contests.ContestRanking.as_view(),
|
|
name="contest_ranking",
|
|
),
|
|
url(
|
|
r"^/final_ranking/$",
|
|
contests.ContestFinalRanking.as_view(),
|
|
name="contest_final_ranking",
|
|
),
|
|
url(
|
|
r"^/ranking/ajax$",
|
|
contests.contest_ranking_ajax,
|
|
name="contest_ranking_ajax",
|
|
),
|
|
url(r"^/join$", contests.ContestJoin.as_view(), name="contest_join"),
|
|
url(r"^/leave$", contests.ContestLeave.as_view(), name="contest_leave"),
|
|
url(r"^/stats$", contests.ContestStats.as_view(), name="contest_stats"),
|
|
url(
|
|
r"^/submissions/(?P<user>\w+)/(?P<problem>\w+)",
|
|
paged_list_view(
|
|
submission.UserContestSubmissions, "contest_user_submissions"
|
|
),
|
|
),
|
|
url(
|
|
r"^/submissions/(?P<participation>\d+)/(?P<problem>\w+)/ajax",
|
|
paged_list_view(
|
|
submission.UserContestSubmissionsAjax,
|
|
"contest_user_submissions_ajax",
|
|
),
|
|
),
|
|
url(
|
|
r"^/participations$",
|
|
contests.ContestParticipationList.as_view(),
|
|
name="contest_participation_own",
|
|
),
|
|
url(
|
|
r"^/participations/(?P<user>\w+)$",
|
|
contests.ContestParticipationList.as_view(),
|
|
name="contest_participation",
|
|
),
|
|
url(
|
|
r"^/participation/disqualify$",
|
|
contests.ContestParticipationDisqualify.as_view(),
|
|
name="contest_participation_disqualify",
|
|
),
|
|
url(
|
|
r"^/clarification$",
|
|
contests.NewContestClarificationView.as_view(),
|
|
name="new_contest_clarification",
|
|
),
|
|
url(
|
|
r"^/clarification/ajax$",
|
|
contests.ContestClarificationAjax.as_view(),
|
|
name="contest_clarification_ajax",
|
|
),
|
|
url(
|
|
r"^/$",
|
|
lambda _, contest: HttpResponsePermanentRedirect(
|
|
reverse("contest_view", args=[contest])
|
|
),
|
|
),
|
|
]
|
|
),
|
|
),
|
|
url(
|
|
r"^organizations/$",
|
|
organization.OrganizationList.as_view(),
|
|
name="organization_list",
|
|
),
|
|
url(
|
|
r"^organizations/add/$",
|
|
organization.AddOrganization.as_view(),
|
|
name="organization_add",
|
|
),
|
|
url(
|
|
r"^organization/(?P<pk>\d+)-(?P<slug>[\w-]*)",
|
|
include(
|
|
[
|
|
url(
|
|
r"^$",
|
|
organization.OrganizationHome.as_view(),
|
|
name="organization_home",
|
|
),
|
|
url(
|
|
r"^/users/",
|
|
paged_list_view(
|
|
organization.OrganizationUsers,
|
|
"organization_users",
|
|
),
|
|
),
|
|
url(
|
|
r"^/problems/",
|
|
paged_list_view(
|
|
organization.OrganizationProblems, "organization_problems"
|
|
),
|
|
),
|
|
url(
|
|
r"^/contests/",
|
|
paged_list_view(
|
|
organization.OrganizationContests, "organization_contests"
|
|
),
|
|
),
|
|
url(
|
|
r"^/contest/add",
|
|
organization.AddOrganizationContest.as_view(),
|
|
name="organization_contest_add",
|
|
),
|
|
url(
|
|
r"^/contest/edit/(?P<contest>\w+)",
|
|
organization.EditOrganizationContest.as_view(),
|
|
name="organization_contest_edit",
|
|
),
|
|
url(
|
|
r"^/submissions/",
|
|
paged_list_view(
|
|
organization.OrganizationSubmissions, "organization_submissions"
|
|
),
|
|
),
|
|
url(
|
|
r"^/join$",
|
|
organization.JoinOrganization.as_view(),
|
|
name="join_organization",
|
|
),
|
|
url(
|
|
r"^/leave$",
|
|
organization.LeaveOrganization.as_view(),
|
|
name="leave_organization",
|
|
),
|
|
url(
|
|
r"^/edit$",
|
|
organization.EditOrganization.as_view(),
|
|
name="edit_organization",
|
|
),
|
|
url(
|
|
r"^/kick$",
|
|
organization.KickUserWidgetView.as_view(),
|
|
name="organization_user_kick",
|
|
),
|
|
url(
|
|
r"^/add_member$",
|
|
organization.AddOrganizationMember.as_view(),
|
|
name="add_organization_member",
|
|
),
|
|
url(
|
|
r"^/blog/add$",
|
|
organization.AddOrganizationBlog.as_view(),
|
|
name="add_organization_blog",
|
|
),
|
|
url(
|
|
r"^/blog/edit/(?P<blog_pk>\d+)$",
|
|
organization.EditOrganizationBlog.as_view(),
|
|
name="edit_organization_blog",
|
|
),
|
|
url(
|
|
r"^/blog/pending$",
|
|
organization.PendingBlogs.as_view(),
|
|
name="organization_pending_blogs",
|
|
),
|
|
url(
|
|
r"^/request$",
|
|
organization.RequestJoinOrganization.as_view(),
|
|
name="request_organization",
|
|
),
|
|
url(
|
|
r"^/request/(?P<rpk>\d+)$",
|
|
organization.OrganizationRequestDetail.as_view(),
|
|
name="request_organization_detail",
|
|
),
|
|
url(
|
|
r"^/requests/",
|
|
include(
|
|
[
|
|
url(
|
|
r"^pending$",
|
|
organization.OrganizationRequestView.as_view(),
|
|
name="organization_requests_pending",
|
|
),
|
|
url(
|
|
r"^log$",
|
|
organization.OrganizationRequestLog.as_view(),
|
|
name="organization_requests_log",
|
|
),
|
|
url(
|
|
r"^approved$",
|
|
organization.OrganizationRequestLog.as_view(
|
|
states=("A",), tab="approved"
|
|
),
|
|
name="organization_requests_approved",
|
|
),
|
|
url(
|
|
r"^rejected$",
|
|
organization.OrganizationRequestLog.as_view(
|
|
states=("R",), tab="rejected"
|
|
),
|
|
name="organization_requests_rejected",
|
|
),
|
|
]
|
|
),
|
|
),
|
|
url(
|
|
r"^/$",
|
|
lambda _, pk, slug: HttpResponsePermanentRedirect(
|
|
reverse("organization_home", args=[pk, slug])
|
|
),
|
|
),
|
|
]
|
|
),
|
|
),
|
|
url(r"^runtimes/$", language.LanguageList.as_view(), name="runtime_list"),
|
|
url(r"^runtimes/matrix/$", status.version_matrix, name="version_matrix"),
|
|
url(r"^status/$", status.status_all, name="status_all"),
|
|
url(
|
|
r"^api/",
|
|
include(
|
|
[
|
|
url(r"^contest/list$", api.api_v1_contest_list),
|
|
url(r"^contest/info/(\w+)$", api.api_v1_contest_detail),
|
|
url(r"^problem/list$", api.api_v1_problem_list),
|
|
url(r"^problem/info/(\w+)$", api.api_v1_problem_info),
|
|
url(r"^user/list$", api.api_v1_user_list),
|
|
url(r"^user/info/(\w+)$", api.api_v1_user_info),
|
|
url(r"^user/submissions/(\w+)$", api.api_v1_user_submissions),
|
|
]
|
|
),
|
|
),
|
|
url(r"^blog/", blog.PostList.as_view(), name="blog_post_list"),
|
|
url(r"^post/(?P<id>\d+)-(?P<slug>.*)$", blog.PostView.as_view(), name="blog_post"),
|
|
url(r"^license/(?P<key>[-\w.]+)$", license.LicenseDetail.as_view(), name="license"),
|
|
url(
|
|
r"^mailgun/mail_activate/$",
|
|
mailgun.MailgunActivationView.as_view(),
|
|
name="mailgun_activate",
|
|
),
|
|
url(
|
|
r"^widgets/",
|
|
include(
|
|
[
|
|
url(
|
|
r"^contest_mode$",
|
|
contests.update_contest_mode,
|
|
name="contest_mode_ajax",
|
|
),
|
|
url(
|
|
r"^rejudge$", widgets.rejudge_submission, name="submission_rejudge"
|
|
),
|
|
url(
|
|
r"^single_submission$",
|
|
submission.single_submission_query,
|
|
name="submission_single_query",
|
|
),
|
|
url(
|
|
r"^submission_testcases$",
|
|
submission.SubmissionTestCaseQuery.as_view(),
|
|
name="submission_testcases_query",
|
|
),
|
|
url(
|
|
r"^detect_timezone$",
|
|
widgets.DetectTimezone.as_view(),
|
|
name="detect_timezone",
|
|
),
|
|
url(r"^status-table$", status.status_table, name="status_table"),
|
|
url(
|
|
r"^template$",
|
|
problem.LanguageTemplateAjax.as_view(),
|
|
name="language_template_ajax",
|
|
),
|
|
url(
|
|
r"^select2/",
|
|
include(
|
|
[
|
|
url(
|
|
r"^user_search$",
|
|
UserSearchSelect2View.as_view(),
|
|
name="user_search_select2_ajax",
|
|
),
|
|
url(
|
|
r"^user_search_chat$",
|
|
ChatUserSearchSelect2View.as_view(),
|
|
name="chat_user_search_select2_ajax",
|
|
),
|
|
url(
|
|
r"^contest_users/(?P<contest>\w+)$",
|
|
ContestUserSearchSelect2View.as_view(),
|
|
name="contest_user_search_select2_ajax",
|
|
),
|
|
url(
|
|
r"^ticket_user$",
|
|
TicketUserSelect2View.as_view(),
|
|
name="ticket_user_select2_ajax",
|
|
),
|
|
url(
|
|
r"^ticket_assignee$",
|
|
AssigneeSelect2View.as_view(),
|
|
name="ticket_assignee_select2_ajax",
|
|
),
|
|
]
|
|
),
|
|
),
|
|
url(
|
|
r"^preview/",
|
|
include(
|
|
[
|
|
url(
|
|
r"^problem$",
|
|
preview.ProblemMarkdownPreviewView.as_view(),
|
|
name="problem_preview",
|
|
),
|
|
url(
|
|
r"^blog$",
|
|
preview.BlogMarkdownPreviewView.as_view(),
|
|
name="blog_preview",
|
|
),
|
|
url(
|
|
r"^contest$",
|
|
preview.ContestMarkdownPreviewView.as_view(),
|
|
name="contest_preview",
|
|
),
|
|
url(
|
|
r"^comment$",
|
|
preview.CommentMarkdownPreviewView.as_view(),
|
|
name="comment_preview",
|
|
),
|
|
url(
|
|
r"^profile$",
|
|
preview.ProfileMarkdownPreviewView.as_view(),
|
|
name="profile_preview",
|
|
),
|
|
url(
|
|
r"^organization$",
|
|
preview.OrganizationMarkdownPreviewView.as_view(),
|
|
name="organization_preview",
|
|
),
|
|
url(
|
|
r"^solution$",
|
|
preview.SolutionMarkdownPreviewView.as_view(),
|
|
name="solution_preview",
|
|
),
|
|
url(
|
|
r"^license$",
|
|
preview.LicenseMarkdownPreviewView.as_view(),
|
|
name="license_preview",
|
|
),
|
|
url(
|
|
r"^ticket$",
|
|
preview.TicketMarkdownPreviewView.as_view(),
|
|
name="ticket_preview",
|
|
),
|
|
]
|
|
),
|
|
),
|
|
]
|
|
),
|
|
),
|
|
url(
|
|
r"^stats/",
|
|
include(
|
|
[
|
|
url(
|
|
"^language/",
|
|
include(
|
|
[
|
|
url(
|
|
"^$",
|
|
stats.StatLanguage.as_view(),
|
|
name="language_stats",
|
|
),
|
|
]
|
|
),
|
|
),
|
|
url(
|
|
"^site/",
|
|
include(
|
|
[
|
|
url("^$", stats.StatSite.as_view(), name="site_stats"),
|
|
]
|
|
),
|
|
),
|
|
]
|
|
),
|
|
),
|
|
url(
|
|
r"^tickets/",
|
|
include(
|
|
[
|
|
url(r"^$", ticket.TicketList.as_view(), name="ticket_list"),
|
|
url(r"^ajax$", ticket.TicketListDataAjax.as_view(), name="ticket_ajax"),
|
|
]
|
|
),
|
|
),
|
|
url(
|
|
r"^ticket/(?P<pk>\d+)",
|
|
include(
|
|
[
|
|
url(r"^$", ticket.TicketView.as_view(), name="ticket"),
|
|
url(
|
|
r"^/ajax$",
|
|
ticket.TicketMessageDataAjax.as_view(),
|
|
name="ticket_message_ajax",
|
|
),
|
|
url(
|
|
r"^/open$",
|
|
ticket.TicketStatusChangeView.as_view(open=True),
|
|
name="ticket_open",
|
|
),
|
|
url(
|
|
r"^/close$",
|
|
ticket.TicketStatusChangeView.as_view(open=False),
|
|
name="ticket_close",
|
|
),
|
|
url(
|
|
r"^/notes$",
|
|
ticket.TicketNotesEditView.as_view(),
|
|
name="ticket_notes",
|
|
),
|
|
]
|
|
),
|
|
),
|
|
url(
|
|
r"^sitemap\.xml$",
|
|
sitemap,
|
|
{
|
|
"sitemaps": {
|
|
"problem": ProblemSitemap,
|
|
"user": UserSitemap,
|
|
"home": HomePageSitemap,
|
|
"contest": ContestSitemap,
|
|
"organization": OrganizationSitemap,
|
|
"blog": BlogPostSitemap,
|
|
"solutions": SolutionSitemap,
|
|
"pages": UrlSitemap(
|
|
[
|
|
{"location": "/about/", "priority": 0.9},
|
|
]
|
|
),
|
|
}
|
|
},
|
|
),
|
|
url(
|
|
r"^judge-select2/",
|
|
include(
|
|
[
|
|
url(r"^profile/$", UserSelect2View.as_view(), name="profile_select2"),
|
|
url(
|
|
r"^organization/$",
|
|
OrganizationSelect2View.as_view(),
|
|
name="organization_select2",
|
|
),
|
|
url(
|
|
r"^problem/$", ProblemSelect2View.as_view(), name="problem_select2"
|
|
),
|
|
url(
|
|
r"^contest/$", ContestSelect2View.as_view(), name="contest_select2"
|
|
),
|
|
url(
|
|
r"^comment/$", CommentSelect2View.as_view(), name="comment_select2"
|
|
),
|
|
]
|
|
),
|
|
),
|
|
url(
|
|
r"^tasks/",
|
|
include(
|
|
[
|
|
url(
|
|
r"^status/(?P<task_id>[A-Za-z0-9-]*)$",
|
|
tasks.task_status,
|
|
name="task_status",
|
|
),
|
|
url(r"^ajax_status$", tasks.task_status_ajax, name="task_status_ajax"),
|
|
url(r"^success$", tasks.demo_success),
|
|
url(r"^failure$", tasks.demo_failure),
|
|
url(r"^progress$", tasks.demo_progress),
|
|
]
|
|
),
|
|
),
|
|
url(r"^about/", about.about, name="about"),
|
|
url(
|
|
r"^custom_checker_sample/",
|
|
about.custom_checker_sample,
|
|
name="custom_checker_sample",
|
|
),
|
|
url(
|
|
r"^chat/",
|
|
include(
|
|
[
|
|
url(
|
|
r"^(?P<room_id>\d*)$",
|
|
login_required(chat.ChatView.as_view()),
|
|
name="chat",
|
|
),
|
|
url(r"^delete/$", chat.delete_message, name="delete_chat_message"),
|
|
url(r"^mute/$", chat.mute_message, name="mute_chat_message"),
|
|
url(r"^post/$", chat.post_message, name="post_chat_message"),
|
|
url(r"^ajax$", chat.chat_message_ajax, name="chat_message_ajax"),
|
|
url(
|
|
r"^online_status/ajax$",
|
|
chat.online_status_ajax,
|
|
name="online_status_ajax",
|
|
),
|
|
url(
|
|
r"^get_or_create_room$",
|
|
chat.get_or_create_room,
|
|
name="get_or_create_room",
|
|
),
|
|
url(
|
|
r"^update_last_seen$",
|
|
chat.update_last_seen,
|
|
name="update_last_seen",
|
|
),
|
|
url(
|
|
r"^online_status/user/ajax$",
|
|
chat.user_online_status_ajax,
|
|
name="user_online_status_ajax",
|
|
),
|
|
url(
|
|
r"^toggle_ignore/(?P<user_id>\d+)$",
|
|
chat.toggle_ignore,
|
|
name="toggle_ignore",
|
|
),
|
|
]
|
|
),
|
|
),
|
|
url(
|
|
r"^internal/",
|
|
include(
|
|
[
|
|
url(
|
|
r"^problem$",
|
|
internal.InternalProblem.as_view(),
|
|
name="internal_problem",
|
|
),
|
|
url(
|
|
r"^problem_votes$",
|
|
internal.get_problem_votes,
|
|
name="internal_problem_votes",
|
|
),
|
|
url(
|
|
r"^request_time$",
|
|
internal.InternalRequestTime.as_view(),
|
|
name="internal_request_time",
|
|
),
|
|
url(
|
|
r"^request_time_detail$",
|
|
internal.InternalRequestTimeDetail.as_view(),
|
|
name="internal_request_time_detail",
|
|
),
|
|
url(
|
|
r"^internal_slow_request$",
|
|
internal.InternalSlowRequest.as_view(),
|
|
name="internal_slow_request",
|
|
),
|
|
url(
|
|
r"^internal_slow_request_detail$",
|
|
internal.InternalSlowRequestDetail.as_view(),
|
|
name="internal_slow_request_detail",
|
|
),
|
|
]
|
|
),
|
|
),
|
|
url(
|
|
r"^notifications/",
|
|
login_required(notification.NotificationList.as_view()),
|
|
name="notification",
|
|
),
|
|
url(
|
|
r"^import_users/",
|
|
include(
|
|
[
|
|
url(r"^$", user.ImportUsersView.as_view(), name="import_users"),
|
|
url(
|
|
r"post_file/$",
|
|
user.import_users_post_file,
|
|
name="import_users_post_file",
|
|
),
|
|
url(r"submit/$", user.import_users_submit, name="import_users_submit"),
|
|
url(r"sample/$", user.sample_import_users, name="import_users_sample"),
|
|
]
|
|
),
|
|
),
|
|
url(
|
|
r"^volunteer/",
|
|
include(
|
|
[
|
|
url(
|
|
r"^problem/vote$",
|
|
volunteer.vote_problem,
|
|
name="volunteer_problem_vote",
|
|
),
|
|
]
|
|
),
|
|
),
|
|
url(r"^resolver/(?P<contest>\w+)", resolver.Resolver.as_view(), name="resolver"),
|
|
] + url_static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
|
|
|
# if hasattr(settings, "INTERNAL_IPS"):
|
|
# urlpatterns.append(url("__debug__/", include("debug_toolbar.urls")))
|
|
|
|
favicon_paths = [
|
|
"apple-touch-icon-180x180.png",
|
|
"apple-touch-icon-114x114.png",
|
|
"android-chrome-72x72.png",
|
|
"apple-touch-icon-57x57.png",
|
|
"apple-touch-icon-72x72.png",
|
|
"apple-touch-icon.png",
|
|
"mstile-70x70.png",
|
|
"android-chrome-36x36.png",
|
|
"apple-touch-icon-precomposed.png",
|
|
"apple-touch-icon-76x76.png",
|
|
"apple-touch-icon-60x60.png",
|
|
"android-chrome-96x96.png",
|
|
"mstile-144x144.png",
|
|
"mstile-150x150.png",
|
|
"safari-pinned-tab.svg",
|
|
"android-chrome-144x144.png",
|
|
"apple-touch-icon-152x152.png",
|
|
"favicon-96x96.png",
|
|
"favicon-32x32.png",
|
|
"favicon-16x16.png",
|
|
"android-chrome-192x192.png",
|
|
"android-chrome-48x48.png",
|
|
"mstile-310x150.png",
|
|
"apple-touch-icon-144x144.png",
|
|
"browserconfig.xml",
|
|
"manifest.json",
|
|
"apple-touch-icon-120x120.png",
|
|
"mstile-310x310.png",
|
|
"reload.png",
|
|
]
|
|
|
|
for favicon in favicon_paths:
|
|
urlpatterns.append(
|
|
url(r"^%s$" % favicon, RedirectView.as_view(url=static("icons/" + favicon)))
|
|
)
|
|
|
|
handler404 = "judge.views.error.error404"
|
|
handler403 = "judge.views.error.error403"
|
|
handler500 = "judge.views.error.error500"
|
|
|
|
if "impersonate" in settings.INSTALLED_APPS:
|
|
urlpatterns.append(url(r"^impersonate/", include("impersonate.urls")))
|