使用url()来构建url

This commit is contained in:
masnn committed 2020-06-12 13:37:19 +08:00
1 parent 0efac48bde
commit 86f67a0ec3
61 files changed
+261 -274

No files matched your search

+1
View File
@@ -1,3 +1,4 @@
global.DEBUG = true;
require('./index.js')('development').catch((e) => {
console.error(e);
});
-6
View File
@@ -85,9 +85,3 @@ async function build(type) {
}
module.exports = build;
if (!module.parent) {
build('development').catch((e) => {
console.error(e);
});
}
+1 -1
View File
@@ -25,7 +25,7 @@ const build = (dirOrObject) => {
}
} else templates = dirOrObject;
for (const i in templates) {
if (i.endsWith('.html') && !templates[i].includes('No Compression')) {
if (i.endsWith('.html') && !global.DEBUG && !templates[i].includes('No Compression')) {
templates[i] = templates[i]
.trim()
.replace(/ *\n */gmi, ' ')
+8 -8
View File
@@ -304,14 +304,14 @@ class ContestCreateHandler extends ContestHandler {
}
async function apply() {
Route('/c', ContestListHandler);
Route('/c/:tid', ContestDetailHandler);
Route('/c/:tid/edit', ContestEditHandler);
Route('/c/:tid/scoreboard', ContestScoreboardHandler);
Route('/c/:tid/export/:ext', ContestScoreboardDownloadHandler);
Route('/c/:tid/p/:pid', ContestProblemHandler);
Route('/c/:tid/p/:pid/submit', ContestProblemSubmitHandler);
Route('/contest/create', ContestCreateHandler, PERM_CREATE_CONTEST);
Route('contest_main', '/contest', ContestListHandler);
Route('contest_detail', '/contest/:tid', ContestDetailHandler);
Route('contest_edit', '/contest/:tid/edit', ContestEditHandler);
Route('contest_scoreboard', '/contest/:tid/scoreboard', ContestScoreboardHandler);
Route('contest_scoreboard_download', '/contest/:tid/export/:ext', ContestScoreboardDownloadHandler);
Route('contest_detail_problem', '/contest/:tid/p/:pid', ContestProblemHandler);
Route('contest_detail_problem_submit', '/contest/:tid/p/:pid/submit', ContestProblemSubmitHandler);
Route('contest_create', '/contest/create', ContestCreateHandler, PERM_CREATE_CONTEST);
}
global.Hydro.handler.contest = module.exports = apply;
+8 -8
View File
@@ -283,14 +283,14 @@ class DiscussionEditHandler extends DiscussionHandler {
}
async function apply() {
Route('/discuss', DiscussionMainHandler);
Route('/discuss/:did', DiscussionDetailHandler);
Route('/discuss/:did/edit', DiscussionEditHandler);
Route('/discuss/:did/raw', DiscussionDetailRawHandler);
Route('/discuss/:did/:drid/raw', DiscussionReplyRawHandler);
Route('/discuss/:did/:drid/:drrid/raw', DiscussionTailReplyRawHandler);
Route('/discuss/:type/:name', DiscussionNodeHandler);
Route('/discuss/:type/:name/create', DiscussionCreateHandler);
Route('discussion_main', '/discuss', DiscussionMainHandler);
Route('discussion_detail', '/discuss/:did', DiscussionDetailHandler);
Route('discussion_edit', '/discuss/:did/edit', DiscussionEditHandler);
Route('discussion_detail', '/discuss/:did/raw', DiscussionDetailRawHandler);
Route('discission_reply_raw', '/discuss/:did/:drid/raw', DiscussionReplyRawHandler);
Route('discussion_tail_reply_raw', '/discuss/:did/:drid/:drrid/raw', DiscussionTailReplyRawHandler);
Route('discussion_node', '/discuss/:type/:name', DiscussionNodeHandler);
Route('discussion_create', '/discuss/:type/:name/create', DiscussionCreateHandler);
}
global.Hydro.handler.discussion = module.exports = apply;
+9 -10
View File
@@ -14,9 +14,8 @@ class DomainRankHandler extends Handler {
100,
);
let udocs = [];
// eslint-disable-next-line no-await-in-loop
for (const uid of dudocs.map((dudoc) => dudoc.uid)) {
udocs.push(user.getById(domainId, uid));
for (const dudoc of dudocs) {
udocs.push(user.getById(domainId, dudoc.uid));
}
udocs = await Promise.all(udocs);
const path = [
@@ -189,13 +188,13 @@ class DomainRoleHandler extends ManageHandler {
}
async function apply() {
Route('/ranking', DomainRankHandler);
Route('/domain/create', DomainCreateHandler);
Route('/domain/dashboard', DomainDashboardHandler);
Route('/domain/edit', DomainEditHandler);
Route('/domain/user', DomainUserHandler);
Route('/domain/permission', DomainPermissionHandler);
Route('/domain/role', DomainRoleHandler);
Route('ranking', '/ranking', DomainRankHandler);
Route('domain_create', '/domain/create', DomainCreateHandler);
Route('domain_dashboard', '/domain/dashboard', DomainDashboardHandler);
Route('domain_edit', '/domain/edit', DomainEditHandler);
Route('domain_user', '/domain/user', DomainUserHandler);
Route('domain_permission', '/domain/permission', DomainPermissionHandler);
Route('domain_role', '/domain/role', DomainRoleHandler);
}
global.Hydro.handler.domain = module.exports = apply;
+6 -6
View File
@@ -290,12 +290,12 @@ class HomeMessagesConnectionHandler extends ConnectionHandler {
}
async function apply() {
Route('/', HomeHandler);
Route('/home/security', HomeSecurityHandler);
Route('/home/changeMail/:code', UserChangemailWithCodeHandler);
Route('/home/settings/:category', HomeSettingsHandler);
Route('/home/messages', HomeMessagesHandler);
Connection('/home/messages-conn', HomeMessagesConnectionHandler);
Route('homepage', '/', HomeHandler);
Route('home_security', '/home/security', HomeSecurityHandler);
Route('user_changemail_with_code', '/home/changeMail/:code', UserChangemailWithCodeHandler);
Route('home_settings', '/home/settings/:category', HomeSettingsHandler);
Route('home_messages', '/home/messages', HomeMessagesHandler);
Connection('home_messages_conn', '/home/messages-conn', HomeMessagesConnectionHandler);
}
global.Hydro.handler.home = module.exports = apply;
+7 -7
View File
@@ -451,13 +451,13 @@ async function apply() {
},
rank: (tsdocs) => ranked(tsdocs, (a, b) => a.score === b.score),
};
Route('/homework', HomeworkMainHandler, PERM_VIEW_HOMEWORK);
Route('/homework/create', HomeworkCreateHandler, PERM_CREATE_HOMEWORK);
Route('/homework/:tid', HomeworkDetailHandler, PERM_VIEW_HOMEWORK);
Route('/homework/:tid/scoreboard', HomeworkScoreboardHandler, PERM_VIEW_HOMEWORK_SCOREBOARD);
Route('/homework/:tid/p/:pid', HomeworkDetailProblemHandler, PERM_VIEW_HOMEWORK);
Route('/homework/:tid/p/:pid/submit', HomeworkDetailProblemSubmitHandler, PERM_SUBMIT_PROBLEM);
Route('/homework/:tid/edit', HomeworkEditHandler);
Route('homework_main', '/homework', HomeworkMainHandler, PERM_VIEW_HOMEWORK);
Route('homework_create', '/homework/create', HomeworkCreateHandler, PERM_CREATE_HOMEWORK);
Route('homework_detail', '/homework/:tid', HomeworkDetailHandler, PERM_VIEW_HOMEWORK);
Route('homework_scoreboard', '/homework/:tid/scoreboard', HomeworkScoreboardHandler, PERM_VIEW_HOMEWORK_SCOREBOARD);
Route('homework_problem', '/homework/:tid/p/:pid', HomeworkDetailProblemHandler, PERM_VIEW_HOMEWORK);
Route('homework_problem_submit', '/homework/:tid/p/:pid/submit', HomeworkDetailProblemSubmitHandler, PERM_SUBMIT_PROBLEM);
Route('homework_edit', '/homework/:tid/edit', HomeworkEditHandler);
}
global.Hydro.handler.homework = module.exports = apply;
+1 -1
View File
@@ -36,7 +36,7 @@ class ProblemImportHandler extends Handler {
}
async function apply() {
Route('/problem/import', ProblemImportHandler);
Route('problem_import', '/problem/import', ProblemImportHandler);
}
global.Hydro.handler.import = module.exports = apply;
+2 -10
View File
@@ -83,10 +83,6 @@ async function end(body) {
}
class JudgeHandler extends Handler {
async prepare() {
this.checkPerm(PERM_JUDGE);
}
async get({ check = false }) {
if (check) return;
const tasks = [];
@@ -109,10 +105,6 @@ class JudgeHandler extends Handler {
}
class JudgeConnectionHandler extends ConnectionHandler {
async prepare() {
this.checkPerm(PERM_JUDGE);
}
async message(msg) {
if (msg.key === 'next') await next(msg);
else if (msg.key === 'end') {
@@ -133,8 +125,8 @@ class JudgeConnectionHandler extends ConnectionHandler {
}
async function apply() {
Route('/judge', JudgeHandler);
Connection('/judge/conn', JudgeConnectionHandler);
Route('judge', '/judge', JudgeHandler, PERM_JUDGE);
Connection('judge_conn', '/judge/conn', JudgeConnectionHandler, PERM_JUDGE);
}
apply.next = next;
+5 -5
View File
@@ -102,11 +102,11 @@ class SystemSettingHandler extends SystemHandler {
}
async function apply() {
Route('/manage', SystemMainHandler);
Route('/manage/dashboard', SystemDashboardHandler);
Route('/manage/script', SystemScriptHandler);
Route('/manage/module', SystemModuleHandler);
Route('/manage/setting', SystemSettingHandler);
Route('manage', '/manage', SystemMainHandler);
Route('manage_dashboard', '/manage/dashboard', SystemDashboardHandler);
Route('manage_script', '/manage/script', SystemScriptHandler);
Route('manage_module', '/manage/module', SystemModuleHandler);
Route('manage_setting', '/manage/setting', SystemSettingHandler);
}
global.Hydro.handler.manage = module.exports = apply;
+5 -5
View File
@@ -55,11 +55,11 @@ class SwitchLanguageHandler extends Handler {
}
async function apply() {
Route('/fs/:id/:secret', FileDownloadHandler);
Route('/fs/:id/:name/:secret', FileDownloadHandler);
Route('/status', StatusHandler);
Route('/status/update', StatusUpdateHandler);
Route('/language/:lang', SwitchLanguageHandler);
Route('file_download', '/fs/:id/:secret', FileDownloadHandler);
Route('file_download_with_name', '/fs/:id/:name/:secret', FileDownloadHandler);
Route('status', '/status', StatusHandler);
Route('status_update', '/status/update', StatusUpdateHandler);
Route('switch_language', '/language/:lang', SwitchLanguageHandler);
}
apply.updateStatus = function updateStatus(args) {
+1 -6
View File
@@ -8,12 +8,7 @@ class NotFoundHandler extends Handler {
}
async function apply() {
Route('/:param1', NotFoundHandler);
Route('/:param1/:param2', NotFoundHandler);
Route('/:param1/:param2/:param3', NotFoundHandler);
Route('/:param1/:param2/:param3/:param4', NotFoundHandler);
Route('/:param1/:param2/:param3/:param4/:param5', NotFoundHandler);
Route('/:param1/:param2/:param3/:param4/:param5/:param6', NotFoundHandler);
Route('notfound', '*', NotFoundHandler);
}
global.Hydro.handler.notfound = module.exports = apply;
+16 -16
View File
@@ -443,22 +443,22 @@ class ProblemCreateHandler extends Handler {
}
async function apply() {
Route('/p', ProblemHandler);
Route('/p/category/:category', ProblemCategoryHandler);
Route('/problem/random', ProblemRandomHandler);
Route('/p/:pid', ProblemDetailHandler);
Route('/p/:pid/submit', ProblemSubmitHandler);
Route('/p/:pid/pretest', ProblemPretestHandler);
Route('/p/:pid/settings', ProblemSettingsHandler);
Route('/p/:pid/statistics', ProblemStatisticsHandler);
Route('/p/:pid/edit', ProblemEditHandler);
Route('/p/:pid/upload', ProblemDataUploadHandler);
Route('/p/:pid/data', ProblemDataDownloadHandler);
Route('/p/:pid/solution', ProblemSolutionHandler);
Route('/p/:pid/solution/:psid/raw', ProblemSolutionRawHandler);
Route('/p/:pid/solution/:psid/:psrid/raw', ProblemSolutionReplyRawHandler);
Route('/problem/create', ProblemCreateHandler);
Connection('/p/:pid/pretest-conn', ProblemPretestConnectionHandler);
Route('problem_main', '/p', ProblemHandler);
Route('problem_category', '/p/category/:category', ProblemCategoryHandler);
Route('problem_random', '/problem/random', ProblemRandomHandler);
Route('problem_detail', '/p/:pid', ProblemDetailHandler);
Route('problem_submit', '/p/:pid/submit', ProblemSubmitHandler);
Route('problem_pretest', '/p/:pid/pretest', ProblemPretestHandler);
Route('problem_settings', '/p/:pid/settings', ProblemSettingsHandler);
Route('problem_statistics', '/p/:pid/statistics', ProblemStatisticsHandler);
Route('problem_edit', '/p/:pid/edit', ProblemEditHandler);
Route('problem_upload', '/p/:pid/upload', ProblemDataUploadHandler);
Route('problem_data', '/p/:pid/data', ProblemDataDownloadHandler);
Route('problem_solution', '/p/:pid/solution', ProblemSolutionHandler);
Route('problem_solution_raw', '/p/:pid/solution/:psid/raw', ProblemSolutionRawHandler);
Route('problem_solution_reply_raw', '/p/:pid/solution/:psid/:psrid/raw', ProblemSolutionReplyRawHandler);
Route('problem_create', '/problem/create', ProblemCreateHandler);
Connection('problem_pretest_conn', '/p/:pid/pretest-conn', ProblemPretestConnectionHandler);
}
global.Hydro.handler.problem = module.exports = apply;
+9 -12
View File
@@ -14,14 +14,14 @@ const RecordHandler = contest.ContestHandlerMixin(Handler);
class RecordListHandler extends RecordHandler {
async get({
domainId, page = 1, tid, uname_or_uid,
domainId, page = 1, tid, uidOrName,
}) {
this.response.template = 'record_main.html';
const q = { tid };
if (uname_or_uid) {
if (uidOrName) {
q.$or = [
{ unameLower: uname_or_uid.toLowerCase() },
{ _id: parseInt(uname_or_uid) },
{ unameLower: uidOrName.toLowerCase() },
{ _id: parseInt(uidOrName) },
];
}
const rdocs = await record.getMany(domainId, q, { _id: -1 }, page, await system.get('RECORD_PER_PAGE'));
@@ -150,14 +150,11 @@ class RecordDetailConnectionHandler extends contest.ContestHandlerMixin(Connecti
}
async function apply() {
Route('/r', RecordListHandler);
Route('/r/:rid', RecordDetailHandler);
Route('/r/:rid/rejudge', RecordRejudgeHandler);
Route('/record', RecordListHandler);
Route('/record/:rid', RecordDetailHandler);
Route('/record/:rid/rejudge', RecordRejudgeHandler);
Connection('/record-conn', RecordMainConnectionHandler);
Connection('/record-detail-conn', RecordDetailConnectionHandler);
Route('record_main', '/record', RecordListHandler);
Route('record_detail', '/record/:rid', RecordDetailHandler);
Route('record_rejudge', '/record/:rid/rejudge', RecordRejudgeHandler);
Connection('record_conn', '/record-conn', RecordMainConnectionHandler);
Connection('record_detail_conn', '/record-detail-conn', RecordDetailConnectionHandler);
}
global.Hydro.handler.record = module.exports = apply;
+3 -3
View File
@@ -78,9 +78,9 @@ class SystemSettingHandler extends SystemHandler {
}
async function apply() {
Route('/system', SystemDashboardHandler);
Route('/system/module', SystemModuleHandler);
Route('/system/setting', SystemSettingHandler);
Route('system_dashboard', '/system', SystemDashboardHandler);
Route('system_module', '/system/module', SystemModuleHandler);
Route('system_setting', '/system/setting', SystemSettingHandler);
}
global.Hydro.handler.manage = module.exports = apply;
+4 -9
View File
@@ -153,11 +153,6 @@ class TrainingDetailHandler extends TrainingHandler {
}
class TrainingCreateHandler extends TrainingHandler {
async prepare() {
this.checkPerm(PERM_LOGGEDIN);
this.checkPerm(PERM_CREATE_TRAINING);
}
async get() {
const path = [
['Hydro', '/'],
@@ -248,10 +243,10 @@ class TrainingEditHandler extends TrainingHandler {
}
async function apply() {
Route('/t', TrainingMainHandler);
Route('/t/:tid', TrainingDetailHandler);
Route('/t/:tid/edit', TrainingEditHandler);
Route('/training/create', TrainingCreateHandler);
Route('training_main', '/training', TrainingMainHandler);
Route('training_create', '/training/create', TrainingCreateHandler, PERM_CREATE_TRAINING);
Route('training_detail', '/training/:tid', TrainingDetailHandler);
Route('training_edit', '/training/:tid/edit', TrainingEditHandler);
}
global.Hydro.handler.training = module.exports = apply;
+8 -8
View File
@@ -161,14 +161,14 @@ class UserSearchHandler extends Handler {
}
async function apply() {
Route('/login', UserLoginHandler);
Route('/register', UserRegisterHandler);
Route('/register/:code', UserRegisterWithCodeHandler);
Route('/logout', UserLogoutHandler);
Route('/lostpass', UserLostPassHandler);
Route('/lostpass/:code', UserLostPassWithCodeHandler);
Route('/user/search', UserSearchHandler);
Route('/user/:uid', UserDetailHandler);
Route('user_login', '/login', UserLoginHandler);
Route('user_register', '/register', UserRegisterHandler);
Route('user_register_with_code', '/register/:code', UserRegisterWithCodeHandler);
Route('user_logout', '/logout', UserLogoutHandler);
Route('user_lostpass', '/lostpass', UserLostPassHandler);
Route('user_lostpass_with_code', '/lostpass/:code', UserLostPassWithCodeHandler);
Route('user_search', '/user/search', UserSearchHandler);
Route('user_detail', '/user/:uid', UserDetailHandler);
}
global.Hydro.handler.user = module.exports = apply;
+6 -6
View File
@@ -2,23 +2,23 @@ const { Route, Handler } = require('../service/server');
const { NotFoundError } = require('../error');
class WikiHandler extends Handler {
async get({ name }) {
if (!global.Hydro.wiki[name]) throw new NotFoundError(name);
const contents = global.Hydro.wiki[name];
async get({ name: page }) {
if (!global.Hydro.wiki[page]) throw new NotFoundError(page);
const contents = global.Hydro.wiki[page];
const path = [
['Hydro', '/'],
['wiki', '/wiki'],
[`wiki_${name}`, null],
[`wiki_${page}`, null],
];
this.response.body = {
path, contents, page_name: `wiki_${name}`,
path, contents, page_name: `wiki_${page}`,
};
this.response.template = 'wiki.html';
}
}
async function apply() {
Route('/wiki/:name', WikiHandler);
Route('wiki', '/wiki/:page', WikiHandler);
}
global.Hydro.handler.wiki = module.exports = apply;
+18 -3
View File
@@ -130,6 +130,7 @@ class Handler {
this.hasPerm = (perm) => this.user.hasPerm(perm);
const res = await template.render(name, Object.assign(context, {
handler: this,
url: (...args) => this.url(...args),
_: (str) => (str ? str.toString().translate(this.user.viewLang || this.session.viewLang) : ''),
user: this.user,
}));
@@ -183,6 +184,20 @@ class Handler {
this.response.disposition = `attachment; filename="${name}"`;
}
url(name, kwargs = {}) { // eslint-disable-line class-methods-use-this
delete kwargs.__keywords;
let res;
const { anchor } = kwargs;
if (kwargs.query) {
const { query } = kwargs;
delete kwargs.query;
res = router.url(name, kwargs, { query });
}
res = router.url(name, kwargs);
if (anchor) return `${res}#${anchor}`;
return res;
}
async ___prepare({ domainId }) {
this.response.body = {};
this.now = new Date();
@@ -296,8 +311,8 @@ class Handler {
}
}
function Route(route, RouteHandler, permission = null) {
router.all(route, async (ctx) => {
function Route(name, route, RouteHandler, permission = null) {
router.all(name, route, async (ctx) => {
const h = new RouteHandler(ctx);
try {
const method = ctx.method.toLowerCase();
@@ -399,7 +414,7 @@ class ConnectionHandler {
}
}
function Connection(prefix, RouteConnHandler) {
function Connection(name, prefix, RouteConnHandler) {
const sock = sockjs.createServer({ prefix });
sock.on('connection', async (conn) => {
const h = new RouteConnHandler(conn);
+3 -6
View File
@@ -1,7 +1,6 @@
const { Route, Handler } = global.Hydro.service.server;
const { PERM_MANAGE } = global.Hydro.permission;
const { message } = global.Hydro.model;
const migrate = global.Hydro.script.migrateVijos;
class MigrateVijosHandler extends Handler {
async prepare() {
@@ -20,7 +19,7 @@ class MigrateVijosHandler extends Handler {
async post({
host, port, name, username, password,
}) {
migrate({
global.Hydro.script.migrateVijos({
host, port, name, username, password,
}, (data) => message.send(1, 1, data));
this.response.redirect = '/manage/log';
@@ -28,9 +27,7 @@ class MigrateVijosHandler extends Handler {
}
async function apply() {
Route('/migrate/vijos', module.exports.MigrateVijosHandler);
Route('migrate_vijos', '/migrate/vijos', MigrateVijosHandler);
}
global.Hydro.handler.pastebin = module.exports = {
MigrateVijosHandler, apply,
};
global.Hydro.handler.migrateVijos = module.exports = apply;
+2 -2
View File
@@ -42,8 +42,8 @@ class PasteCreateHandler extends Handler {
}
async function apply() {
Route('/paste/create', PasteCreateHandler);
Route('/paste/:docId', PasteShowHandler);
Route('paste_create', '/paste/create', PasteCreateHandler);
Route('paste_show', '/paste/:docId', PasteShowHandler);
nav('/paste/create', 'pastebin', 'pastebin', PERM_LOGGEDIN);
}
+1 -1
View File
@@ -33,7 +33,7 @@
"webpack": "^4.42.1"
},
"scripts": {
"build": "node build/index.js",
"build": "node build/development.js",
"build:development": "node build/development.js",
"build:production": "node build/production.js",
"build:all": "cd ui && yarn && yarn build:production && cd .. && yarn && yarn build:production",
@@ -14,7 +14,7 @@
</div>
{{ reply_operations(doc, rdoc) }}
</div>
<div class="typo" data-emoji-enabled data-raw-url="/discuss/{{ doc.parentId }}/{{ doc._id }}/{{ rdoc._id }}/raw">
<div class="typo" data-emoji-enabled data-raw-url="{{ url('discussion_tail_reply_raw', did=doc.parentId, drid=doc._id, drrid=rdoc._id }}">
{{ rdoc['content']|markdown|safe }}
</div>
<div class="commentbox-edit-target"></div>
@@ -133,7 +133,7 @@
{% endif %}
</div>
</div>
<div class="typo" data-emoji-enabled data-raw-url="/discuss/{{ doc.parentId }}/{{ doc._id }}/raw">
<div class="typo" data-emoji-enabled data-raw-url="{{ url('discuss_reply_raw', did=doc.parentId, drid=doc._id) }}">
{{ doc['content']|markdown|safe }}
</div>
<div class="commentbox-edit-target"></div>
+2 -2
View File
@@ -130,7 +130,7 @@
{% endif %}
</div>
</div>
<div class="typo" data-emoji-enabled data-raw-url="/p/{{doc.pid}}/solution/{{doc._id}}/raw">
<div class="typo" data-emoji-enabled data-raw-url="{{ url('problem_solution_raw', pid=doc.pid, psid=doc._id) }}">
{{ doc['content']|markdown|safe }}
</div>
<div class="commentbox-edit-target"></div>
@@ -160,7 +160,7 @@
{% endif %}
</div>
</div>
<div class="typo" data-emoji-enabled data-raw-url="/p/{{doc.pid}}/solution/{{doc._id}}/{{rdoc._id}}/raw">
<div class="typo" data-emoji-enabled data-raw-url="{{ url('problem_solution_reply_raw', pid=doc.pid, psid=doc._id, psrid=rdoc._id) }}">
{{ rdoc['content']|markdown|safe }}
</div>
<div class="commentbox-edit-target"></div>
+2 -1
View File
@@ -2,9 +2,10 @@
{%- if not invalid %}
<a
{%- if tdoc %}
{# TODO(masnn) use url() #}
href="{{ prefix }}/{{ tdoc.docId }}/p/{{ pdoc.docId }}"
{%- else %}
href="/p/{{ pdoc.pid }}"
href="{{ url('problem_detail', pid=pdoc.pid) }}"
{%- endif %}
>
{%- endif %}
+1 -1
View File
@@ -2,7 +2,7 @@
<td class="col--status record-status--border {{ model.builtin.STATUS_CODES[rdoc['status']] }}">
<div class="col--status__text">
<span class="icon record-status--icon {{ model.builtin.STATUS_CODES[rdoc['status']] }}"></span>
<a href="/r/{{ rdoc._id }}" class="record-status--text {{ model.builtin.STATUS_CODES[rdoc['status']] }}">
<a href="{{ url('record_detail', rid=rdoc._id) }}" class="record-status--text {{ model.builtin.STATUS_CODES[rdoc['status']] }}">
{{ model.builtin.STATUS_TEXTS[rdoc['status']] }}
</a>
</div>
+2 -2
View File
@@ -8,11 +8,11 @@
{% if avatar %}
<img class="small user-profile-avatar v-center" src="{{ gravatar(udoc['gravatar']|default('')) }}" width="20" height="20">
{% endif %}
<a class="user-profile-name" href="/u/{{ udoc['_id']|default(0) }}">
<a class="user-profile-name" href="{{ url('user_detail', uid=udoc._id) }}">
{{ udoc['uname'] }}
</a>
{% if badge %}
<a class="user-profile-badge v-center badge--lv{{ udoc['level']|default(0) }}" href="/u/{{ udoc['_id']|default(0) }}" title="LV {{ udoc['level']|default(0) }}: Top {{ model.builtin.LEVELS[udoc['level']|default(0)]|default('N/A') }}%">LV {{ udoc['level']|default(0) }}</a>
<a class="user-profile-badge v-center badge--lv{{ udoc['level']|default(0) }}" href="{{ url('user_detail', uid=udoc._id) }}" title="LV {{ udoc['level']|default(0) }}: Top {{ model.builtin.LEVELS[udoc['level']|default(0)]|default('N/A') }}%">LV {{ udoc['level']|default(0) }}</a>
{% if modbadge and udoc.hasPerm(perm.PERM_MOD_BADGE) %}
<span class="user-profile-badge v-center badge--mod" title="Moderator">MOD</span>
{% endif %}
+1 -1
View File
@@ -48,7 +48,7 @@
{% if handler.canShowRecord(tdoc) %}
{{ record.render_status_td(rdoc) }}
{% else %}
<td class="col--status record-status--border"><a href="/r/{{ rdoc._id }}">{{ _('Submitted') }}</a></td>
<td class="col--status record-status--border"><a href="{{ url('record_detail', rid=rdoc._id) }}">{{ _('Submitted') }}</a></td>
{% endif %}
<td class="col--submit-at">{{ datetimeSpan(rdoc._id)|safe }}</td>
{% else %}
+3 -3
View File
@@ -31,7 +31,7 @@
</div>
<div class="media__right middle">
<div class="section__body">
<a href="/c/{{ tdoc.docId }}" class="detail-button">{{ _('View Details') }}</a>
<a href="{{ url('contest_detail', tid=tdoc.docId) }}" class="detail-button">{{ _('View Details') }}</a>
<div class="typo text-center">
{% if tsdict[tdoc.docId].attend %}
<p><span class="icon icon-check"></span> {{ _('Attended') }}</p>
@@ -87,7 +87,7 @@
</div>
</div>
<div class="media__body medium">
<h1 class="contest__title"><a href="/c/{{ tdoc.docId }}" data-emoji-enabled>{{ tdoc.title }}</a></h1>
<h1 class="contest__title"><a href="{{ url('contest_detail', tid=tdoc.docId) }}" data-emoji-enabled>{{ tdoc.title }}</a></h1>
<ul class="supplementary list">
<li>
<a href="?rule={{ tdoc['rule'] }}" class="contest-type-tag"><span class="icon icon-award"></span>{{ model.contest.RULES[tdoc.rule].TEXT }}</a>
@@ -123,7 +123,7 @@
</h1>
</div>
<div class="section__body">
<p><a href="/contest/create" class="expanded primary button">{{ _('Create a contest') }}</a></p>
<p><a href="{{ url('contest_create') }}" class="expanded primary button">{{ _('Create a contest') }}</a></p>
</div>
</div>
{% endif %}
+4 -4
View File
@@ -3,10 +3,10 @@
<div class="row"><div class="medium-12 columns">
<div class="section visible">
<div class="section__header">
<a class="button" target="_blank" href="/c/{{ tdoc.docId }}/export/html">
<a class="button" target="_blank" href="{{ url('contest_scoreboard_download', tid=tdoc.docId, ext='html') }}">
<span class="icon icon-download"></span> {{ _('Export as HTML') }}
</a>
<a class="button" href="/c/{{ tdoc.docId }}/export/csv">
<a class="button" href="{{ url('contest_scoreboard_download', tid=tdoc.docId, ext='csv') }}">
<span class="icon icon-download"></span> {{ _('Export as CSV') }}
</a>
</div>
@@ -22,7 +22,7 @@
{%- for column in rows[0] -%}
<th class="col--{{ column['type'] }}">
{% if column.type == 'problem_detail' %}
<a href="/c/{{ tdoc.docId }}/p/{{ column.raw._id }}" data-tooltip="{{ column['raw']['title'] }}">{{ column['value'] }}</a>
<a href="{{ url('contest_detail_problem', tid=tdoc.docId, pid=column.raw._id) }}" data-tooltip="{{ column['raw']['title'] }}">{{ column['value'] }}</a>
{% else %}
{{ column.value }}
{% endif %}
@@ -38,7 +38,7 @@
{% if column.type == 'user' %}
{{ user.render_inline(column.raw, badge=false) }}
{% elif column.type == 'record' and column.raw %}
<a href="/r/{{ column.raw }}">{{ column.value }}</a>
<a href="{{ url('record_detail', rid=column.raw) }}">{{ column.value }}</a>
{% else %}
{{ column.value }}
{% endif %}
+6 -6
View File
@@ -7,10 +7,10 @@
<div class="section__body">
<ul class="supplementary list">
<li>
<a class="discussion-node-tag" href="/discuss/{{ vnode.type }}/{{ vnode.id }}">
{% if ddoc.parentType == 'node' %}
<a class="discussion-node-tag" href="{{ url('discussion_node', type=model.discussion.typeDisplay[vnode.parentType], name=vnode.id) }}">
{% if ddoc.parentType == model.document.TYPE_DISCUSSION_NODE %}
<span class="v-center icon icon-tag"></span>
{% elif ddoc.parentType == 'contest' %}
{% elif ddoc.parentType == model.document.TYPE_CONTEST %}
<span class="v-center icon icon-award"></span>
{% else %}
<span class="v-center icon icon-flag"></span>
@@ -24,14 +24,14 @@
{{ datetimeSpan(ddoc._id)|safe }}
</li>
</ul>
<div class="typo topic__content" data-emoji-enabled data-raw-url="/discuss/{{ ddoc._id }}/raw">
<div class="typo topic__content" data-emoji-enabled data-raw-url="{{ url('discussion_raw', did=ddoc.docId) }}">
{{ ddoc['content']|markdown|safe }}
</div>
</div>
<ul class="section__footer supplementary dot list">
{% if ddoc.owner == handler.user._id or handler.hasPerm(perm.PERM_EDIT_DISCUSSION) %}
<li>
<a href="/discuss/{{ ddoc._id }}/edit"><span class="icon icon-edit"></span> {{ _('Edit') }}</a>
<a href="{{ url('discussion_edit', did=ddoc.docId) }}"><span class="icon icon-edit"></span> {{ _('Edit') }}</a>
</li>
{% endif %}
<li>
@@ -48,7 +48,7 @@
</form></li>
{% endif %}
<li>
<a href="/wiki/about#contact"><span class="icon icon-warning"></span> {{ _('Report') }}</a>
<a href="{{ url('wiki', page='about', anchor='contact') }}"><span class="icon icon-warning"></span> {{ _('Report') }}</a>
</li>
</ul>
</div>
+1 -1
View File
@@ -24,7 +24,7 @@
<div class="section__body">
{% if vnode %}
{% if handler.hasPerm(perm.PERM_CREATE_DISCUSSION) %}
<p><a href="/discuss/{{ model.discussion.typeDisplay[vnode.parentType] }}/{{ vnode.parentId }}/create" class="expanded primary button">{{ _('Create a Discussion') }}</a></p>
<p><a href="{{ url('discussion_create', type=model.discussion.typeDisplay[vnode.parentType], name=vnode.parentId) }}" class="expanded primary button">{{ _('Create a Discussion') }}</a></p>
{% else %}
{% if not handler.hasPerm(perm.PERM_LOGGEDIN) %}
<p><a href="javascript:showSignInDialog();" class="expanded primary button">{{ _('Login to Create a Discussion') }}</a></p>
+1 -1
View File
@@ -7,7 +7,7 @@
{% if handler.has_priv(vj4.model.builtin.PRIV_CREATE_FILE) %}
<a class="primary rounded button" href="{{ reverse_url('fs_upload') }}" target="_blank"><span class="icon icon-add"></span> {{ _('Upload File') }}</a>
{% endif %}
<a class="tool-button" href="/wiki/help#file"><span class="icon icon-help"></span> {{ _("What's file?") }}</a>
<a class="tool-button" href="{{ url('wiki', page='help', anchor='file') }}"><span class="icon icon-help"></span> {{ _("What's file?") }}</a>
</div>
</div>
<div class="section__body no-padding">
+1 -1
View File
@@ -47,7 +47,7 @@
{% if handler.canShowRecord(tdoc) %}
{{ record.render_status_td(rdoc) }}
{% else %}
<td class="col--status record-status--border"><a href="/record/{{ rdoc._id }}">{{ _('Submitted') }}</a></td>
<td class="col--status record-status--border"><a href="{{ url('record_detail', rid=rdoc._id) }}">{{ _('Submitted') }}</a></td>
{% endif %}
<td class="col--submit-at">{{ datetimeSpan(rdoc['_id'])|safe }}</td>
{% else %}
+2 -2
View File
@@ -19,7 +19,7 @@
</select>
</span>
{% if handler.hasPerm(perm.PERM_CREATE_HOMEWORK) %}
<a class="compact button" href="/homework/create">{{ _('Create Homework') }}</a>
<a class="compact button" href="{{ url('homework_create') }}">{{ _('Create Homework') }}</a>
{% endif %}
</div>
</div>
@@ -38,7 +38,7 @@
</div>
</div>
<div class="media__body medium">
<h1 class="homework__title"><a href="/homework/{{ tdoc.docId }}" data-emoji-enabled>{{ tdoc.title }}</a></h1>
<h1 class="homework__title"><a href="{{ url('homework_detail', tid=tdoc.docId) }}" data-emoji-enabled>{{ tdoc.title }}</a></h1>
<ul class="supplementary list">
<li>
{{ _('Status') }}: <span class="homework-status--text {{ model.contest.getStatus(tdoc) }}">{{ _(model.contest.statusText(tdoc)) }}</span>
+4 -4
View File
@@ -32,10 +32,10 @@
</div>
</div>
<div class="media__body medium">
<h1 class="contest__title"><a href="/c/{{ tdoc.docId }}" data-emoji-enabled>{{ tdoc.title }}</a></h1>
<h1 class="contest__title"><a href="{{ url('contest_detail', tid=tdoc.docId) }}" data-emoji-enabled>{{ tdoc.title }}</a></h1>
<ul class="supplementary list">
<li>
<a href="/c?rule={{ tdoc['rule'] }}" class="contest-type-tag"><span class="icon icon-award"></span>{{ model.contest.RULES[tdoc.rule].TEXT }}</a>
<a href="{{ url('contest_main', query={rule:tdoc.rule}) }}" class="contest-type-tag"><span class="icon icon-award"></span>{{ model.contest.RULES[tdoc.rule].TEXT }}</a>
</li>
<li>
<span class="icon icon-schedule--fill text-blue"></span> {{ contest.render_duration(tdoc) }} {{ _('hour(s)') }}
@@ -72,7 +72,7 @@
</div>
</div>
<div class="media__body medium">
<h1 class="homework__title"><a href="/homework/{{ tdoc.docId }}" data-emoji-enabled>{{ tdoc['title'] }}</a></h1>
<h1 class="homework__title"><a href="{{ url('homework_detail', tid=tdoc.docId) }}" data-emoji-enabled>{{ tdoc['title'] }}</a></h1>
<ul class="supplementary list">
<li>
{{ _('Status') }}: <span class="homework-status--text {{ model.contest.getStatus(tdoc) }}">{{ _(model.contest.statusText(tdoc)) }}</span>
@@ -118,7 +118,7 @@
</div>
</div>
<div class="media__body middle">
<h1 class="training__title"><a href="/t/{{ tdoc.docId }}" data-emoji-enabled>{{ tdoc.title }}</a></h1>
<h1 class="training__title"><a href="{{ url('training_detail', tid=tdoc.docId) }}" data-emoji-enabled>{{ tdoc.title }}</a></h1>
<div class="training__intro typo">
<p>{{ tdoc['content'] }}</p>
</div>
+1 -1
View File
@@ -20,7 +20,7 @@
<h1 class="section__title">{{ _('Installed Modules') }}</h1>
<div class="section__tools">
<button class="primary rounded button" name="add_module"><span class="icon icon-add"></span> {{ _('Add module') }}</button>
<a class="tool-button" href="/wiki/help#module"><span class="icon icon-help"></span> {{ _("What's module?") }}</a>
<a class="tool-button" href="{{ url('wiki', page='help', anchor='module') }}"><span class="icon icon-help"></span> {{ _("What's module?") }}</a>
</div>
</div>
<div class="section__body no-padding">
+1 -1
View File
@@ -19,7 +19,7 @@
<div class="section__header">
<h1 class="section__title">{{ _('Scripts') }}</h1>
<div class="section__tools">
<a class="tool-button" href="/wiki/help#script"><span class="icon icon-help"></span> {{ _("What's script?") }}</a>
<a class="tool-button" href="{{ url('wiki', page='help', anchor='script') }}"><span class="icon icon-help"></span> {{ _("What's script?") }}</a>
</div>
</div>
<div class="section__body no-padding">
+9 -9
View File
@@ -2,7 +2,7 @@
{% import "components/contest.html" as contest with context %}
<div class="section side">
{% if page_name != 'contest_detail' %}
<a class="contest-sidebar__bg" href="/c/{{ tdoc.docId }}">
<a class="contest-sidebar__bg" href="{{ url('contest_detail', tid=tdoc.docId) }}">
<div class="section__body">
<h1>{{ tdoc.title }}</h1>
<div class="contest-sidebar__status">
@@ -18,14 +18,14 @@
<div>
<ol class="menu">
{% if page_name != 'contest_detail' %}
<li class="menu__item"><a class="menu__link" href="/c/{{ tdoc.docId }}">
<li class="menu__item"><a class="menu__link" href="{{ url('contest_detail', tid=tdoc.docId) }}">
<span class="icon icon-award"></span> {{ _('View Contest') }}
</a></li>
{% endif %}
{% if not attended and not model.contest.isDone(tdoc) %}
<li class="menu__item">
{% if handler.hasPerm(perm.PERM_ATTEND_CONTEST) and handler.hasPerm(perm.PERM_LOGGEDIN) %}
<form action="/c/{{ tdoc.docId }}" method="POST">
<form action="{{ url('contest_detail', tid=tdoc.docId) }}" method="POST">
<input type="hidden" name="operation" value="attend">
<input type="hidden" name="csrfToken" value="{{ handler.csrfToken }}">
<button class="menu__link" type="submit">
@@ -44,28 +44,28 @@
</li>
{% endif %}
{% if handler.canShowScoreboard(tdoc, False) %}
<li class="menu__item"><a class="menu__link" href="/c/{{ tdoc.docId }}/scoreboard">
<li class="menu__item"><a class="menu__link" href="{{ url('contest_scoreboard', tid=tdoc.docId) }}">
<span class="icon icon-statistics"></span> {{ _('Scoreboard') }}
</a></li>
{% elif handler.canViewHiddenScoreboard(tdoc) %}
<li class="menu__item"><a class="menu__link" href="/c/{{ tdoc.docId }}/scoreboard">
<li class="menu__item"><a class="menu__link" href="{{ url('contest_scoreboard', tid=tdoc.docId) }}">
<span class="icon icon-statistics"></span> {{ _('Scoreboard (Hidden)') }}
</a></li>
{% endif %}
{% if user._id == tdoc.owner or handler.hasPerm(perm.PERM_EDIT_CONTEST) %}
<li class="menu__item"><a class="menu__link" href="/c/{{ tdoc.docId }}/edit">
<li class="menu__item"><a class="menu__link" href="{{ url('contest_edit', tid=tdoc.docId) }}">
<span class="icon icon-edit"></span> {{ _('Edit Contest') }}
</a></li>
{% endif %}
{% if handler.hasPerm(perm.PERM_READ_RECORD_CODE) %}
<li class="menu__item"><a class="menu__link" href="/c/{{ tdoc.docId }}/code">
<li class="menu__item"><a class="menu__link" href="{{ url('contest_code', tid=tdoc.docId) }}">
<span class="icon icon-download"></span> {{ _('Export All Code') }}
</a></li>
{% endif %}
<li class="menu__item"><a class="menu__link" href="/r?tid={{ tdoc.docId }}">
<li class="menu__item"><a class="menu__link" href="{{ url('record_main', query={tid:tdoc.docId}) }}">
<span class="icon icon-flag"></span> {{ _('All Submissions') }}
</a></li>
<li class="menu__item"><a class="menu__link" href="/wiki/help#contest">
<li class="menu__item"><a class="menu__link" href="{{ url('wiki', page='help', anchor='contest') }}">
<span class="icon icon-help"></span> {{ _('Help') }}
</a></li>
<li class="menu__seperator"></li>
+2 -2
View File
@@ -15,10 +15,10 @@
</div>
</div>
<div class="media__body top">
<h1 class="discussion__title"><a href="/discuss/{{ ddoc._id }}#{{ ddoc.updateAt }}" data-emoji-enabled>{{ ddoc['title'] }}</a></h1>
<h1 class="discussion__title"><a href="{{ url('discussion_detail', did=ddoc._id, anchor=ddoc.updateAt.getTime()) }}" data-emoji-enabled>{{ ddoc['title'] }}</a></h1>
<ul class="supplementary list">
<li>
<a class="discussion-node-tag" href="/discuss/{{ model.discussion.typeDisplay[ddoc.parentType] }}/{{ ddoc.parentId }}">
<a class="discussion-node-tag" href="{{ url('discussion_node', type=model.discussion.typeDisplay[ddoc.parentType], name=ddoc.parentId) }}">
{% if ddoc.parentType == model.document.TYPE_PROBLEM %}
<span class="v-center icon icon-tag"></span>
{% elif ddoc.parentType == model.document.TYPE_CONTEST %}
+11 -11
View File
@@ -11,8 +11,8 @@
</span>
</h1>
<div class="footer__category__expander"><ul class="footer__category__list">
<li class="footer__category__item"><a href="/record">{{ _('Judging Queue') }}</a></li>
<li class="footer__category__item"><a href="/status">{{ _('Service Status') }}</a></li>
<li class="footer__category__item"><a href="{{ url('record_main') }}">{{ _('Judging Queue') }}</a></li>
<li class="footer__category__item"><a href="{{ url('status') }}">{{ _('Service Status') }}</a></li>
</ul></div>
</div>
<div class="medium-3 large-2 columns footer__category expandable">
@@ -24,7 +24,7 @@
</h1>
<div class="footer__category__expander"><ul class="footer__category__list">
<li class="footer__category__item"><a href="https://github.com/hydro-dev/Hydro" target="_blank">{{ _('Open Source') }}</a></li>
<li class="footer__category__item"><a href="/wiki/api">{{ _('API') }}</a></li>
<li class="footer__category__item"><a href="{{ url('wiki', page='api') }}">{{ _('API') }}</a></li>
</ul></div>
</div>
<div class="medium-3 large-2 columns footer__category expandable end">
@@ -35,9 +35,9 @@
</span>
</h1>
<div class="footer__category__expander"><ul class="footer__category__list">
<li class="footer__category__item"><a href="/wiki/about">{{ _('Help') }}</a></li>
<li class="footer__category__item"><a href="{{ url('wiki', page='about') }}">{{ _('Help') }}</a></li>
<!--<li class="footer__category__item"><a href="#">{{ _('Blog') }}</a></li>-->
<li class="footer__category__item"><a href="/wiki/contact">{{ _('QQ Group') }}</a></li>
<li class="footer__category__item"><a href="{{ url('wiki', page='contact') }}">{{ _('QQ Group') }}</a></li>
</ul></div>
</div>
</div>
@@ -45,16 +45,16 @@
<div class="footer__extra-link clearfix">
<div class="footer__extra-left">
<ol class="clearfix">
<li class="footer__extra-link-item"><a href="/wiki/about">{{ _('About') }}</a></li>
<li class="footer__extra-link-item"><a href="/wiki/contact">{{ _('Contact Us') }}</a></li>
<li class="footer__extra-link-item"><a href="/wiki/about#privacy">{{ _('Privacy') }}</a></li>
<li class="footer__extra-link-item"><a href="/wiki/about#tos">{{ _('Terms of Service') }}</a></li>
<li class="footer__extra-link-item"><a href="/wiki/copyright-complaint/">{{ _('Copyright Complaint') }}</a></li>
<li class="footer__extra-link-item"><a href="{{ url('wiki', page='about') }}">{{ _('About') }}</a></li>
<li class="footer__extra-link-item"><a href="{{ url('wiki', page='contact') }}">{{ _('Contact Us') }}</a></li>
<li class="footer__extra-link-item"><a href="{{ url('wiki', page='about', anchor='privacy') }}">{{ _('Privacy') }}</a></li>
<li class="footer__extra-link-item"><a href="{{ url('wiki', page='about', anchor='tos') }}">{{ _('Terms of Service') }}</a></li>
<li class="footer__extra-link-item"><a href="{{ url('wiki', page='about', anchor='copyright-complaint') }}">{{ _('Copyright Complaint') }}</a></li>
<li class="footer__extra-link-item" data-dropdown-target="#menu-footer-lang">
<span><span class="icon icon-global"></span> Language <span class="icon icon-expand_less"></span></span>
<ol class="dropdown-target menu" id="menu-footer-lang">
{% for item in model.builtin.VIEW_LANGS %}
<li class="menu__item"><a class="menu__link" href="/language/{{ item.code }}">{{ item.name }}</a></li>
<li class="menu__item"><a class="menu__link" href="{{ url('switch_language', lang=item.code) }}">{{ item.name }}</a></li>
{% endfor %}
</ol>
</li>
+9 -9
View File
@@ -2,7 +2,7 @@
{% import "components/homework.html" as homework with context %}
<div class="section side">
{% if page_name != 'homework_detail' %}
<a class="contest-sidebar__bg" href="/homework/{{ tdoc.docId }}">
<a class="contest-sidebar__bg" href="{{ url('homework_detail', tid=tdoc.docId) }}">
<div class="section__body">
<h1>{{ tdoc['title'] }}</h1>
<div class="contest-sidebar__status">
@@ -18,14 +18,14 @@
<div>
<ol class="menu">
{% if page_name != 'homework_detail' %}
<li class="menu__item"><a class="menu__link" href="/homework/{{ tdoc.docId }}">
<li class="menu__item"><a class="menu__link" href="{{ url('homework_detail', tid=tdoc.docId) }}">
<span class="icon icon-homework"></span> {{ _('View Homework') }}
</a></li>
{% endif %}
{% if not attended and not model.contest.isDone(tdoc) %}
<li class="menu__item">
{% if handler.hasPerm(perm.PERM_ATTEND_HOMEWORK) and handler.hasPerm(perm.PERM_LOGGEDIN) %}
<form action="/homework/{{ tdoc.docId }}" method="POST">
<form action="{{ url('homework_detail', tid=tdoc.docId) }}" method="POST">
<input type="hidden" name="operation" value="attend">
<input type="hidden" name="csrfToken" value="{{ handler.csrfToken }}">
<button class="menu__link" type="submit">
@@ -44,30 +44,30 @@
</li>
{% endif %}
{% if handler.canShowScoreboard(tdoc, false) %}
<li class="menu__item"><a class="menu__link" href="/homework/{{ tdoc.docId }}/scoreboard">
<li class="menu__item"><a class="menu__link" href="{{ url('homework_scoreboard', tid=tdoc.docId) }}">
<span class="icon icon-statistics"></span> {{ _('Scoreboard') }}
</a></li>
{% elif handler.canViewHiddenScoreboard(tdoc) %}
<li class="menu__item"><a class="menu__link" href="/homework/{{ tdoc.docId }}/scoreboard">
<li class="menu__item"><a class="menu__link" href="{{ url('homework_scoreboard', tid=tdoc.docId) }}">
<span class="icon icon-statistics"></span> {{ _('Scoreboard (Hidden)') }}
</a></li>
{% endif %}
{% if tdoc.owner == handler.user._id or handler.hasPerm(perm.PERM_EDIT_HOMEWORK) %}
<li class="menu__item"><a class="menu__link" href="/homework/{{ tdoc.docId }}/edit">
<li class="menu__item"><a class="menu__link" href="{{ url('homework_edit', tid=tdoc.docId) }}">
<span class="icon icon-edit"></span> {{ _('Edit Homework') }}
</a></li>
{% endif %}
{% if handler.hasPerm(perm.PERM_READ_RECORD_CODE) %}
<li class="menu__item"><a class="menu__link" href="/homework/{{ tdoc.docId }}/code">
<li class="menu__item"><a class="menu__link" href="{{ url('homework_code', tid=tdoc.docId) }}">
<span class="icon icon-download"></span> {{ _('Export All Code') }}
</a></li>
{% endif %}
{% if attended %}
<li class="menu__item"><a class="menu__link" href="/r?uid_or_name={{ handler.user._id }}&tid={{ tdoc.docId }}">
<li class="menu__item"><a class="menu__link" href="{{ url('record_detail', query={uidOrName:handler.user._id, tid:tdoc.docId}) }}">
<span class="icon icon-flag"></span> {{ _('My Recent Submissions') }}
</a></li>
{% endif %}
<li class="menu__item"><a class="menu__link" href="/wiki/help#homework">
<li class="menu__item"><a class="menu__link" href="{{ url('wiki', page='help', anchor='homework') }}">
<span class="icon icon-help"></span> {{ _('Help') }}
</a></li>
<li class="menu__seperator"></li>
+3 -3
View File
@@ -5,11 +5,11 @@
<div class="dialog--signin__side">
<h1>{{ _("Don\'t have an account?") }}</h1>
<p>{{ _('By signing up a Hydro universal account, you can submit code and join discussions in all online judging services provided by us.') }}</p>
<div><a href="/register" class="inverse rounded button">{{ _('Sign Up Now') }}</a></div>
<div><a href="{{ url('user_register') }}" class="inverse rounded button">{{ _('Sign Up Now') }}</a></div>
</div>
</div>
<div class="dialog--signin__main">
<form action="/login" method="post">
<form action="{{ url('user_login') }}" method="post">
<div class="dialog--signin__close-container supplementary">
<a name="dialog--signin__close" href="javascript:;">{{ _('CLOSE') }}</a>
</div>
@@ -37,7 +37,7 @@
</div></div>
<div class="row"><div class="columns">
<div class="supplementary text-center">
<a href="/lostpass">{{ _('Forgot password or username?') }}</a>
<a href="{{ url('user_lostpass') }}">{{ _('Forgot password or username?') }}</a>
</div>
</div></div>
</form>
+9 -9
View File
@@ -18,41 +18,41 @@
</ol>
<ol class="nav__list nav__list--secondary clearfix">
{% if not handler.hasPerm(perm.PERM_LOGGEDIN) %}
<li class="nav__list-item"><a href="/login" class="nav__item" name="nav_login">{{ _('Login') }}</a></li>
<li class="nav__list-item"><a href="/register" class="nav__item--round">{{ _('Sign Up') }}</a></li>
<li class="nav__list-item"><a href="{{ url('user_login') }}" class="nav__item" name="nav_login">{{ _('Login') }}</a></li>
<li class="nav__list-item"><a href="{{ url('user_register') }}" class="nav__item--round">{{ _('Sign Up') }}</a></li>
{% else %}
<li class="nav__list-item" data-dropdown-pos="bottom right" data-dropdown-target="#menu-nav-user" data-dropdown-trigger-desktop-only>
<a href="/user/{{ handler.user._id }}" class="nav__item">{{ handler.user.uname }} <span class="icon icon-expand_more nojs--hide"></span></a>
<a href="{{ url('user_detail', uid=handler.user._id) }}" class="nav__item">{{ handler.user.uname }} <span class="icon icon-expand_more nojs--hide"></span></a>
<ol class="dropdown-target menu" id="menu-nav-user">
<li class="menu__item">
<a href="/user/{{ handler.user._id }}" class="menu__link">
<a href="{{ url('user_detail', uid=handler.user._id) }}" class="menu__link">
<span class="icon icon-account--circle"></span> {{ _('My Profile') }}
</a>
</li>
<li class="menu__item">
<a href="/home/messages" class="menu__link">
<a href="{{ url('home_messages') }}" class="menu__link">
<span class="icon icon-comment--multiple"></span> {{ _('home_messages') }}
</a>
</li>
<li class="menu__seperator"></li>
<li class="menu__item">
<a href="/home/settings/account" class="menu__link">
<a href="{{ url('home_settings', category='account') }}" class="menu__link">
<span class="icon icon-wrench"></span> {{ _('home_account') }}
</a>
</li>
<li class="menu__item">
<a href="/home/settings/preference" class="menu__link">
<a href="{{ url('home_settings', category='preference') }}" class="menu__link">
<span class="icon icon-sliders"></span> {{ _('home_preference') }}
</a>
</li>
<li class="menu__item">
<a href="/home/security" class="menu__link">
<a href="{{ url('home_security') }}" class="menu__link">
<span class="icon icon-security"></span> {{ _('home_security') }}
</a>
</li>
<li class="menu__seperator"></li>
<li class="menu__item">
<a href="/logout" class="menu__link" name="nav_logout">
<a href="{{ url('user_logout') }}" class="menu__link" name="nav_logout">
<span class="icon icon-logout"></span> {{ _('Logout') }}
</a>
</li>
+1 -1
View File
@@ -1,6 +1,6 @@
<div data-fragment-id="problem_lucky">
<p>
<a href="/problem/random{% if category %}?category={{ category }}{% endif %}" class="expanded button" target="_blank">
<a href="{{ url('problem_random', query={category:category}) if category else url('problem_random') }}" class="expanded button" target="_blank">
<span class="icon icon-feeling-lucky"></span> {{ _('Lucky') }}
</a>
</p>
@@ -16,24 +16,24 @@
<span class="icon icon-enlarge"></span> {{ _('Quit Scratchpad') }} (Alt+Q)
</a></li>
{% else %}
<li class="menu__item"><a class="menu__link" href="/c/{{ tdoc.docId }}/p/{{ pdoc.docId }}">
<li class="menu__item"><a class="menu__link" href="{{ url('contest_detail_problem', tid=tdoc.docId, pid=pdoc.docId) }}">
<span class="icon icon-flag"></span> {{ _('View Problem') }}
</a></li>
{% endif %}
<li class="menu__item scratchpad--hide"><a class="menu__link{% if page_name == 'contest_detail_problem_submit' %} active{% endif %}" href="/c/{{ tdoc.docId }}/p/{{ pdoc.docId }}/submit">
<li class="menu__item scratchpad--hide"><a class="menu__link{% if page_name == 'contest_detail_problem_submit' %} active{% endif %}" href="{{ url('contest_detail_problem_submit', tid=tdoc.docId, pid=pdoc.docId) }}">
<span class="icon icon-send"></span> {{ _('Submit') }}
</a></li>
{% elif model.contest.isDone(tdoc) %}
<li class="menu__item scratchpad--hide"><a class="menu__link" href="/p/{{ pdoc.pid }}">
<li class="menu__item scratchpad--hide"><a class="menu__link" href="{{ url('problem_detail', pid=pdoc.pid) }}">
<span class="icon icon-send"></span> {{ _('Open in Problem Set') }}
</a></li>
{% endif %}
{% if pdoc.owner == handler.user._id or handler.hasPerm(perm.PERM_EDIT_PROBLEM) %}
<li class="menu__seperator"></li>
<li class="menu__item"><a class="menu__link{% if page_name == 'problem_edit' %} active{% endif %}" href="/p/{{ pdoc.pid }}/edit">
<li class="menu__item"><a class="menu__link{% if page_name == 'problem_edit' %} active{% endif %}" href="{{ url('problem_edit', pid=pdoc.pid) }}">
<span class="icon icon-edit"></span> {{ _('Edit') }}
</a></li>
<li class="menu__item"><a class="menu__link{% if page_name == 'problem_settings' %} active{% endif %}" href="/p/{{ pdoc.pid }}/settings">
<li class="menu__item"><a class="menu__link{% if page_name == 'problem_settings' %} active{% endif %}" href="{{ url('problem_settings', pid=pdoc.pid) }}">
<span class="icon icon-wrench"></span> {{ _('Settings') }}
</a></li>
{% endif %}
@@ -16,24 +16,24 @@
<span class="icon icon-enlarge"></span> {{ _('Quit Scratchpad') }} (Alt+Q)
</a></li>
{% else %}
<li class="menu__item"><a class="menu__link" href="/homework/{{ tdoc.docId }}/p/{{ pdoc.docId }}">
<li class="menu__item"><a class="menu__link" href="{{ url('homework_detail_problem', tid=tdoc.docId, pid=pdoc.docId) }}">
<span class="icon icon-flag"></span> {{ _('View Problem') }}
</a></li>
{% endif %}
<li class="menu__item scratchpad--hide"><a class="menu__link{% if page_name == 'homework_detail_problem_submit' %} active{% endif %}" href="/homework/{{ tdoc.docId }}/p/{{ pdoc.docId }}/submit">
<li class="menu__item scratchpad--hide"><a class="menu__link{% if page_name == 'homework_detail_problem_submit' %} active{% endif %}" href="{{ url('homework_detail_problem_submit', tid=tdoc.docId, pid=pdoc.docId) }}">
<span class="icon icon-send"></span> {{ _('Submit') }}
</a></li>
{% elif model.contest.isDone(tdoc) %}
<li class="menu__item scratchpad--hide"><a class="menu__link" href="/p/{{ pdoc.pid }}">
<li class="menu__item scratchpad--hide"><a class="menu__link" href="{{ url('problem_detail', pid=pdoc.pid) }}">
<span class="icon icon-send"></span> {{ _('Open in Problem Set') }}
</a></li>
{% endif %}
{% if pdoc.owner == handler.user._id or handler.hasPerm(perm.PERM_EDIT_PROBLEM) %}
<li class="menu__seperator"></li>
<li class="menu__item"><a class="menu__link{% if page_name == 'problem_edit' %} active{% endif %}" href="/p/{{ pdoc.pid }}/edit">
<li class="menu__item"><a class="menu__link{% if page_name == 'problem_edit' %} active{% endif %}" href="{{ url('problem_edit', pid=pdoc.pid) }}">
<span class="icon icon-edit"></span> {{ _('Edit') }}
</a></li>
<li class="menu__item"><a class="menu__link{% if page_name == 'problem_settings' %} active{% endif %}" href="/p/{{ pdoc.pid }}/settings">
<li class="menu__item"><a class="menu__link{% if page_name == 'problem_settings' %} active{% endif %}" href="{{ url('problem_settings', pid=pdoc.pid) }}">
<span class="icon icon-wrench"></span> {{ _('Settings') }}
</a></li>
{% endif %}
+14 -14
View File
@@ -10,7 +10,7 @@
<ol class="menu">
{% if page_name == 'discussion_node' or page_name == 'discussion_detail' %}
{% if handler.hasPerm(perm.PERM_CREATE_DISCUSSION) %}
<li class="menu__item"><a class="menu__link highlight" href="/discuss/problem/{{ pdoc.docId }}/create">
<li class="menu__item"><a class="menu__link highlight" href="{{ url('discussion_create', type='problem', name=pdoc.docId) }}">
<span class="icon icon-add"></span> {{ _('Create a Discussion') }}
</a></li>
{% else %}
@@ -34,12 +34,12 @@
</a></li>
{% endif %}
{% else %}
<li class="menu__item"><a class="menu__link" href="/p/{{ pdoc.pid }}">
<li class="menu__item"><a class="menu__link" href="{{ url('problem_detail', pid=pdoc.pid) }}">
<span class="icon icon-flag"></span> {{ _('View Problem') }}
</a></li>
{% endif %}
{% if handler.hasPerm(perm.PERM_SUBMIT_PROBLEM) %}
<li class="menu__item scratchpad--hide"><a class="menu__link{% if page_name == 'problem_submit' %} active{% endif %}" href="/p/{{ pdoc.pid }}/submit">
<li class="menu__item scratchpad--hide"><a class="menu__link{% if page_name == 'problem_submit' %} active{% endif %}" href="{{ url('problem_submit', pid=pdoc.pid) }}">
<span class="icon icon-send"></span> {{ _('Submit') }}
</a></li>
{% elif not handler.hasPerm(perm.PERM_LOGGEDIN) %}
@@ -55,21 +55,21 @@
<li class="menu__seperator"></li>
{% endif %}
{% if handler.hasPerm(perm.PERM_VIEW_DISCUSSION) %}
<li class="menu__item"><a class="menu__link{% if page_name == 'discussion_node' or page_name == 'discussion_detail' %} active{% endif %}" href="/discuss/problem/{{ pdoc.docId }}">
<li class="menu__item"><a class="menu__link{% if page_name == 'discussion_node' or page_name == 'discussion_detail' %} active{% endif %}" href="{{ url('discussion_node', type='problem', name=pdoc.docId) }}">
<span class="icon icon-comment--text"></span> {{ _('Discussions') }}
</a></li>
{% endif %}
{% if handler.hasPerm(perm.PERM_VIEW_PROBLEM_SOLUTION) %}
<li class="menu__item"><a class="menu__link{% if page_name == 'problem_solution' %} active{% endif %}" href="/p/{{ pdoc.pid }}/solution">
<li class="menu__item"><a class="menu__link{% if page_name == 'problem_solution' %} active{% endif %}" href="{{ url('problem_solution', pid=pdoc.pid) }}">
<span class="icon icon-comment--text"></span> {{ _('Solutions') }}
</a></li>
{% endif %}
{% if user._id == pdoc.owner or handler.hasPerm(perm.PERM_EDIT_PROBLEM) %}
<li class="menu__seperator"></li>
<li class="menu__item"><a class="menu__link{% if page_name == 'problem_edit' %} active{% endif %}" href="/p/{{ pdoc.pid }}/edit">
<li class="menu__item"><a class="menu__link{% if page_name == 'problem_edit' %} active{% endif %}" href="{{ url('problem_edit', pid=pdoc.pid) }}">
<span class="icon icon-edit"></span> {{ _('Edit') }}
</a></li>
<li class="menu__item"><a class="menu__link{% if page_name == 'problem_settings' %} active{% endif %}" href="/p/{{ pdoc.pid }}/settings">
<li class="menu__item"><a class="menu__link{% if page_name == 'problem_settings' %} active{% endif %}" href="{{ url('problem_settings', pid=pdoc.pid) }}">
<span class="icon icon-wrench"></span> {{ _('Settings') }}
</a></li>
{% endif %}
@@ -89,9 +89,9 @@
{% if handler.hasPerm(perm.PERM_LOGGEDIN) %}
<dt>{{ _('Submission') }}</dt>
<dd>
{% if pdoc.psdoc['status'] %}
{% if pdoc.psdoc.status %}
<span class="icon record-status--icon {{ model.builtin.STATUS_CODES[pdoc['psdoc']['status']] }}"></span>
<a href="/r/{{ pdoc['psdoc']['rid'] }}" class="record-status--text {{ model.builtin.STATUS_CODES[pdoc['psdoc']['status']] }}">
<a href="{{ url('record_detail', rid=pdoc.psdoc.rid) }}" class="record-status--text {{ model.builtin.STATUS_CODES[pdoc['psdoc']['status']] }}">
{{ model.builtin.STATUS_TEXTS[pdoc['psdoc']['status']] }}
</a>
{% else %}
@@ -107,7 +107,7 @@
{% if pdoc['category'] %}
<span class="hasjs--hide" name="problem-sidebar__categories">
{% for category in pdoc['category'] %}
<a href="/p/category/{{ category }}">{{ category }}</a>
<a href="{{ url('problem_category', category=category) }}">{{ category }}</a>
{% if loop.index < pdoc['category']|length %}
{{ _('problem-subcategory-delim') }}
{% endif %}
@@ -125,11 +125,11 @@
{{ problem.render_problem_tags(pdoc, true) }}
</dd>
<dt>{{ _('# Submissions') }}</dt>
<dd><a href="/r?pid={{ pdoc.docId }}">{{ pdoc.nSubmit }}</a></dd>
<dd><a href="{{ url('record_main', query={pid:pdoc.docId}) }}">{{ pdoc.nSubmit }}</a></dd>
{% if page_name != 'discussion_node' and page_name != 'discussion_detail' %}
{% if handler.hasPerm(perm.PERM_LOGGEDIN) %}
<dt>{{ _('# My Submissions') }}</dt>
<dd><a href="/r?pid={{ pdoc.docId }}&uid_or_name={{ handler.user._id }}">{{ pdoc['psdoc'].nSubmit|default(0) }}</a></dd>
<dd><a href="{{ url('record_main', query={pid:pdoc.docId, uidOrName:handler.user._id}) }}">{{ pdoc['psdoc'].nSubmit|default(0) }}</a></dd>
{% endif %}
{% endif %}
<dt>{{ _('Accepted') }}</dt>
@@ -150,13 +150,13 @@
{% if tdocs %}
<p>{{ _('In following training plans') }}: </p>
{% for tdoc in tdocs %}
<p><a href="/t/{{ tdoc.docId }}">{{ tdoc.title }}</a></p>
<p><a href="{{ url('training_detail', tid=tdoc.docId) }}">{{ tdoc.title }}</a></p>
{% endfor %}
{% endif %}
{% if ctdocs %}
<p>{{ _('In following contests') }}: </p>
{% for tdoc in ctdocs %}
<p><a href="/c/{{ tdoc.docId }}">{{ tdoc.title }}</a></p>
<p><a href="{{ url('contest_detail', tid=tdoc.docId) }}">{{ tdoc.title }}</a></p>
{% endfor %}
{% endif %}
</div>
+3 -3
View File
@@ -3,9 +3,9 @@
<script>
var Context = {
'problemId': "{{ pdoc.pid }}",
'postSubmitUrl': "/p/{{ pdoc.pid }}/submit",
'getSubmissionsUrl': "/p/{{ pdoc.pid }}/submit",
'getRecordDetailUrl': "/r/{rid}",
'postSubmitUrl': "{{ url('problem_submit', pid=pdoc.pid) }}",
'getSubmissionsUrl': "{{ url('problem_submit', pid=pdoc.pid) }}",
'getRecordDetailUrl': "{{ url('record_detail', rid='{rid}') }}",
'code_lang': "{{ handler.user.codeLang }}",
'code_template': "{{ handler.user.codeTemplate }}",
};
+7 -7
View File
@@ -4,8 +4,8 @@
{% block content %}
<script>
var Context = {
getProblemUrlWithCategory: "/p/category/{category}",
getProblemUrlWithoutCategory: "/p",
getProblemUrlWithCategory: "{{ url('problem_category', category='{category}') }}",
getProblemUrlWithoutCategory: "{{ url('problem_main') }}",
currentCategory: "{{category}}"
};
</script>
@@ -27,13 +27,13 @@
{% for category, sub_categories in model.builtin.CATEGORIES %}
<li class="group-list__item">
<h2 class="section__title">
<a href="/p/category/{{ category|urlencode }}">{{ category }}</a>
<a href="{{ url('problem_category', category=category) }}">{{ category }}</a>
</h2>
{% if sub_categories | length > 0 %}
<ol class="chip-list">
{% for sub_category in sub_categories %}
<li class="chip-list__item">
<a class="typo-a" href="/p/category/{{ category|urlencode + ',' + sub_category|urlencode }}">{{ sub_category }}</a>
<a class="typo-a" href="{{ url('problem_category', category=(category + ',' + sub_category)) }}">{{ sub_category }}</a>
</li>
{% endfor %}
</ol>
@@ -50,7 +50,7 @@
<div class="section__header">
<h1 class="section__title">{{ _('Search') }}</h1>
</div>
<form method="get" action="/problem/search">
<form method="get" action="{{ url('problem_search') }}">
<div class="section__body">
<label>
<input name="q" type="text" class="textbox" value="" placeholder="1001">
@@ -66,12 +66,12 @@
</div>
<ol class="menu">
<li class="menu__item">
<a href="/problem/create" class="menu__link">
<a href="{{ url('problem_create') }}" class="menu__link">
<span class="icon icon-add"></span>
{{ _('Create Problem') }}</a>
</li>
<li class="menu__item">
<a href="/problem/import" class="menu__link">
<a href="{{ url('problem_import') }}" class="menu__link">
<span class="icon icon-copy"></span>
{{ _('Import Problem') }}</a>
</li>
+3 -3
View File
@@ -7,10 +7,10 @@
<h1 class="section__title">{{ _('Dataset') }}</h1>
</div>
<div class="section__body">
<iframe src="/p/{{ pdoc.pid }}/upload" frameborder="0" style="width: 100%; height: 100px;"></iframe>
<p class="help-text">{{ _('Hint') }}: <a href="/wiki/help#upload">{{ _('Dataset Format') }}</a>, {{ _('An example of dataset') }}: <a href="https://github.com/vijos/jd4/blob/master/jd4/testdata/aplusb-legacy.zip?raw=true">{{ _('Download') }}</a></p>
<iframe src="{{ url('problem_upload', pid=pdoc.pid) }}" frameborder="0" style="width: 100%; height: 100px;"></iframe>
<p class="help-text">{{ _('Hint') }}: <a href="{{ url('wiki', page='help', anchor='upload') }}">{{ _('Dataset Format') }}</a>, {{ _('An example of dataset') }}: <a href="https://github.com/vijos/jd4/blob/master/jd4/testdata/aplusb-legacy.zip?raw=true">{{ _('Download') }}</a></p>
{% if pdoc and (pdoc.owner == handler.user._id or handler.hasPerm(perm.PERM_READ_PROBLEM_DATA)) %}
<p><a href="/p/{{ pdoc.pid }}/data" class="expanded button">{{ _('Download Dataset') }}</a></p>
<p><a href="{{ url('problem_data', pid=pdoc.pid) }}" class="expanded button">{{ _('Download Dataset') }}</a></p>
{% endif %}
</div>
</div>
+5 -4
View File
@@ -31,7 +31,7 @@
<div class="section__body no-padding">
<ol class="menu">
<li class="menu__item">
<form method="post" action="/r/{{ rdoc._id }}/rejudge">
<form method="post" action="{{ url('record_rejudge', rid=rdoc._id) }}">
<input type="hidden" name="csrfToken" value="{{ handler.csrfToken }}">
<button type="submit" class="menu__link">
<span class="icon icon-refresh"></span> {{ _('Rejudge') }}
@@ -39,7 +39,8 @@
</form>
</li>
<li class="menu__item">
<form method="post" action="/judge/end">
<form method="post" action="{{ url('judge') }}">
<input type="hidden" name="action" value="end">
<input type="hidden" name="rid" value="{{ rdoc._id }}">
<input type="hidden" name="csrfToken" value="{{ handler.csrfToken }}">
<input type="hidden" name="score" value="0">
@@ -65,12 +66,12 @@
{% if tdoc %}
<dt>{{ _('Contest') }}</dt>
<dd>
<a href="/c/{{ tdoc.docId }}">{{ tdoc.title }}</a>
<a href="{{ url('contest_detail', tid=tdoc.docId) }}">{{ tdoc.title }}</a>
</dd>
{% endif %}
{% if pdoc and (handler.user._id == pdoc.owner or handler.hasPerm(perm.PERM_READ_PROBLEM_DATA)) %}
<dt>{{ _('Problem Data') }}</dt>
<dd><a href="/p/{{ pdoc.pid }}/data"><span class="icon icon-download"></span> {{ _('Download') }}</a></dd>
<dd><a href="{{ url('problem_data', pid=pdoc.pid) }}"><span class="icon icon-download"></span> {{ _('Download') }}</a></dd>
{% endif %}
<dt>{{ _('Language') }}</dt>
<dd>
+1 -1
View File
@@ -46,7 +46,7 @@
{{ model.builtin.STATUS_TEXTS[rcdoc['status']] }}
</span>
<span>{{ rcdoc['judgeText'] }}</span>
<a class="tool-button" href="/wiki/help#status"><span class="icon icon-help"></span></a>
<a class="tool-button" href="{{ url('wiki', page='help', anchor='status') }}"><span class="icon icon-help"></span></a>
</td>
<td class="col--time">{% if rcdoc['status'] == status.STATUS_TIME_LIMIT_EXCEEDED or rcdoc['status'] == status.STATUS_MEMORY_LIMIT_EXCEEDED or rcdoc['status'] == status.STATUS_OUTPUT_LIMIT_EXCEEDED %}&ge;{% endif %}{{ rcdoc.time }}ms</td>
<td class="col--memory">{% if rcdoc['status'] == status.STATUS_TIME_LIMIT_EXCEEDED or rcdoc['status'] == status.STATUS_MEMORY_LIMIT_EXCEEDED or rcdoc['status'] == status.STATUS_OUTPUT_LIMIT_EXCEEDED %}&ge;{% endif %}{{ size(rcdoc.memory, 1024) }}</td>
+3 -3
View File
@@ -16,7 +16,7 @@
<h1 class="section__title">{{ _('Filter') }}</h1>
<div class="section__tools">
<button type="submit" class="primary button"><span class="icon icon-filter"></span> {{ _('Filter') }}</button>
<a href="/r" class="button">{{ _('Reset') }}</a>
<a href="{{ url('record_main') }}" class="button">{{ _('Reset') }}</a>
</div>
</div>
<div class="section__body">
@@ -25,7 +25,7 @@
<div class="medium-4 columns">
<label class="filter-user">
{{ _('By Username / UID') }}
<input name="uid_or_name" type="text" class="textbox" value="{{ filter_uid_or_name }}" autocomplete="off" data-autofocus>
<input name="uidOrName" type="text" class="textbox" value="{{ filter_uidOrName }}" autocomplete="off" data-autofocus>
</label>
</div>
<div class="medium-4 columns">
@@ -47,7 +47,7 @@
<div class="section">
<div class="section__body no-padding">
{% if not rdocs %}
{% if not filter_uid_or_name and not filter_pid and not filter_tid %}
{% if not filter_uidOrName and not filter_pid and not filter_tid %}
{{ nothing.render('Oh, there is no task in the queue!') }}
{% else %}
{{ nothing.render('Oh, there is no task that matches the filter!') }}
+2 -2
View File
@@ -4,7 +4,7 @@
{{ record.render_status_td(rdoc) }}
<td class="col--problem col--problem-name">
{% if handler.hasPerm(perm.PERM_REJUDGE) %}
<form class="form--inline" method="post" action="/r/{{ rdoc._id }}/rejudge">
<form class="form--inline" method="post" action="{{ url('record_rejudge', rid=rdoc._id) }}">
<input type="hidden" name="csrfToken" value="{{ handler.csrfToken }}">
<button type="submit" class="link text-maroon lighter">
<span class="icon icon-refresh"></span>
@@ -19,7 +19,7 @@
{% endif %}
</td>
<td class="col--submit-by">
<a href="/u/{{ rdoc.uid }}">
<a href="{{ url('user_detail', uid=rdoc.uid) }}">
{{ udoc['uname'] }}
</a>
</td>
+3 -3
View File
@@ -113,7 +113,7 @@
{% endif %}
<td class="col--name col--problem-name">
{% if handler.hasPerm(perm.PERM_LOGGEDIN) %}
<form class="form--inline" action="/p" method="post">
<form class="form--inline" action="{{ url('problem_main') }}" method="post">
<input type="hidden" name="pid" value="{{ pdoc.docId }}">
<input type="hidden" name="operation" value="{% if not psdoc['star'] %}star{% else %}unstar{% endif %}">
<input type="hidden" name="csrfToken" value="{{ handler.csrfToken }}">
@@ -174,11 +174,11 @@
</li>
{% endif %}
{% if tdoc.owner == user._id or handler.hasPerm(perm.PERM_EDIT_TRAINING) %}
<li class="menu__item"><a class="menu__link" href="/t/{{ tdoc.docId }}/edit">
<li class="menu__item"><a class="menu__link" href="{{ url('training_edit', tid=tdoc.docId) }}">
<span class="icon icon-edit"></span> {{ _('Edit') }}
</a></li>
{% endif %}
<li class="menu__item"><a class="menu__link" href="/wiki/help#training">
<li class="menu__item"><a class="menu__link" href="{{ url('wiki', page='help', anchor='training') }}">
<span class="icon icon-help"></span> {{ _('Help') }}
</a></li>
<li class="menu__seperator"></li>
+3 -3
View File
@@ -20,7 +20,7 @@
</div>
</div>
<div class="media__body middle">
<h1 class="training__title"><a href="/t/{{ tdoc.docId }}" data-emoji-enabled>{{ tdoc.title }}</a></h1>
<h1 class="training__title"><a href="{{ url('training_detail', tid=tdoc.docId) }}" data-emoji-enabled>{{ tdoc.title }}</a></h1>
<div class="training__intro typo">
<p>{{ tdoc['content'] }}</p>
</div>
@@ -66,7 +66,7 @@
<span class="icon training-status--icon {% if tsdoc['done'] %}done{% else %}progress{% endif %}"></span>
</div>
<div class="media__body">
<h1 class="training__title"><a href="/t/{{ tsdoc.docId }}" data-emoji-enabled>{{ tdict[tsdoc['docId']]['title'] }}</a></h1>
<h1 class="training__title"><a href="{{ url('training_detail', tid=tsdoc.docId) }}" data-emoji-enabled>{{ tdict[tsdoc['docId']]['title'] }}</a></h1>
<div class="supplementary training__progress"><div class="training__progress-bar"><div class="training__progress-track" style="width:{{ (100 * tsdoc['donePids']|length / model.training.getPids(tdict[tsdoc['docId']])|length)|round|int }}%;"></div></div> {{ _('Complete') }} {{ (100 * tsdoc['donePids']|length / handler.getPids(tdict[tsdoc.docId])|length)|round|int }}%</div>
</div>
</div></li>
@@ -83,7 +83,7 @@
</div>
<ol class="menu">
<li class="menu__item">
<a href="/training/create" class="menu__link"><span class="icon icon-add"></span> {{ _('New Training Plan') }}</a>
<a href="{{ url('training_create') }}" class="menu__link"><span class="icon icon-add"></span> {{ _('New Training Plan') }}</a>
</li>
</ol>
<div class="section__body">
+3 -3
View File
@@ -32,11 +32,11 @@
<p>{{ _('Solved {0} problems, RP: {1} (No. {2})').format(udoc.nAccept|default(0), udoc['rp']|default(0.0)|round(2), udoc['rank']|default('?')) }}</p>
<div class="profile-header__contact-bar">
{% if is_self_profile %}
<a class="profile-header__contact-item" href="/home/account#setting_info" data-tooltip="{{ _('Edit Profile') }}">
<a class="profile-header__contact-item" href="{{ url('home_settings', category='account') }}" data-tooltip="{{ _('Edit Profile') }}">
<span class="icon icon-edit"></span>
</a>
{% endif %}
<a class="profile-header__contact-item" href="/home/messages?target_uid={{ udoc['_id'] }}" target="_blank" data-tooltip="{{ _('Send Message') }}">
<a class="profile-header__contact-item" href="{{ url('home_messages', query={target_uid:udoc._id}) }}" target="_blank" data-tooltip="{{ _('Send Message') }}">
<span class="icon icon-comment--multiple"></span>
</a>
{% if udoc['mail'] %}
@@ -99,7 +99,7 @@
</div>
<div class="section__body">
{% for pdoc in pdocs %}
<p><a href="/p/{{pdoc.pid}}">{{ pdoc['title'] }}</a></p>
<p><a href="{{ url('problem_detail', pid=pdoc.pid) }}">{{ pdoc['title'] }}</a></p>
{% endfor %}
</div>
{% endif %}
+1 -1
View File
@@ -28,7 +28,7 @@
</div></div>
<div class="row"><div class="columns">
<div class="text-center supplementary inverse">
<a href="/lostpass">{{ _('Forgot password or username?') }}</a>
<a href="{{ url('user_lostpass') }}">{{ _('Forgot password or username?') }}</a>
</div>
</div></div>
</form>
+1 -1
View File
@@ -24,7 +24,7 @@ const page = new NamedPage('record_main', async () => {
$newTr.trigger('vjContentNew');
}
};
UserSelectAutoComplete.getOrConstruct($('.filter-user [name="uid_or_name"]'), {
UserSelectAutoComplete.getOrConstruct($('.filter-user [name="uidOrName"]'), {
clearDefaultValue: false,
});
});