mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-20 01:38:19 +08:00
core: 计量尝试人数而非提交量
suggested by @Menci
This commit is contained in:
1 parent
e5d715d02b
commit
e49ffa9f7b
17 files changed
+33
-69
No files matched your search
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "hydrooj",
|
"name": "hydrooj",
|
||||||
"version": "2.28.59",
|
"version": "2.29.0",
|
||||||
"bin": "bin/hydrooj.js",
|
"bin": "bin/hydrooj.js",
|
||||||
"main": "dist/loader.js",
|
"main": "dist/loader.js",
|
||||||
"typings": "dist/loader.d.ts",
|
"typings": "dist/loader.d.ts",
|
||||||
|
|||||||
@@ -353,10 +353,12 @@ export class ContestDetailProblemSubmitHandler extends ContestProblemHandler {
|
|||||||
type: document.TYPE_CONTEST,
|
type: document.TYPE_CONTEST,
|
||||||
tid,
|
tid,
|
||||||
});
|
});
|
||||||
|
const pdomainId = typeof pid === 'string' ? pid.split(':')[0] : domainId;
|
||||||
|
const ppid = typeof pid === 'number' ? pid : +pid.split(':')[1];
|
||||||
const rdoc = await record.get(domainId, rid);
|
const rdoc = await record.get(domainId, rid);
|
||||||
if (!pretest) {
|
if (!pretest) {
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
problem.inc(domainId, pid, 'nSubmit', 1),
|
(this.tsdoc.journal || []).filter((i) => i.pid === pid).length ? Promise.resolve() : problem.inc(pdomainId, ppid, 'nSubmit', 1),
|
||||||
domain.incUserInDomain(domainId, this.user._id, 'nSubmit'),
|
domain.incUserInDomain(domainId, this.user._id, 'nSubmit'),
|
||||||
contest.updateStatus(domainId, tid, this.user._id, rid, pid),
|
contest.updateStatus(domainId, tid, this.user._id, rid, pid),
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -233,7 +233,7 @@ class HomeworkDetailProblemSubmitHandler extends HomeworkDetailProblemHandler {
|
|||||||
const rdoc = await record.get(domainId, rid);
|
const rdoc = await record.get(domainId, rid);
|
||||||
if (pretest) {
|
if (pretest) {
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
problem.inc(pdomainId, ppid, 'nSubmit', 1),
|
(this.tsdoc.journal || []).filter((i) => i.pid === pid).length ? Promise.resolve() : problem.inc(pdomainId, ppid, 'nSubmit', 1),
|
||||||
domain.incUserInDomain(domainId, this.user._id, 'nSubmit'),
|
domain.incUserInDomain(domainId, this.user._id, 'nSubmit'),
|
||||||
contest.updateStatus(domainId, tid, this.user._id,
|
contest.updateStatus(domainId, tid, this.user._id,
|
||||||
rid, pid, false, 0, document.TYPE_HOMEWORK),
|
rid, pid, false, 0, document.TYPE_HOMEWORK),
|
||||||
|
|||||||
@@ -35,9 +35,7 @@ export async function postJudge(rdoc: RecordDoc) {
|
|||||||
? await problem.inc(rdoc.pdomain, rdoc.pid, 'nAccept', 1)
|
? await problem.inc(rdoc.pdomain, rdoc.pid, 'nAccept', 1)
|
||||||
: await problem.get(rdoc.pdomain, rdoc.pid);
|
: await problem.get(rdoc.pdomain, rdoc.pid);
|
||||||
const difficulty = difficultyAlgorithm(pdoc.nSubmit, pdoc.nAccept);
|
const difficulty = difficultyAlgorithm(pdoc.nSubmit, pdoc.nAccept);
|
||||||
if (!updated) await record.updateMulti(rdoc.domainId, { uid: rdoc.uid, status: builtin.STATUS.STATUS_ACCEPTED }, { effective: false });
|
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
record.update(rdoc.domainId, rdoc._id, { effective: true }),
|
|
||||||
problem.edit(pdoc.domainId, pdoc.docId, { difficulty }),
|
problem.edit(pdoc.domainId, pdoc.docId, { difficulty }),
|
||||||
problem.inc(pdoc.domainId, pdoc.docId, `stats.${builtin.STATUS_SHORT_TEXTS[rdoc.status]}`, 1),
|
problem.inc(pdoc.domainId, pdoc.docId, `stats.${builtin.STATUS_SHORT_TEXTS[rdoc.status]}`, 1),
|
||||||
problem.inc(pdoc.domainId, pdoc.docId, `stats.s${rdoc.score}`, 1),
|
problem.inc(pdoc.domainId, pdoc.docId, `stats.s${rdoc.score}`, 1),
|
||||||
|
|||||||
@@ -257,7 +257,7 @@ export class ProblemSubmitHandler extends ProblemDetailHandler {
|
|||||||
const rdoc = await record.get(domainId, rid);
|
const rdoc = await record.get(domainId, rid);
|
||||||
if (!pretest) {
|
if (!pretest) {
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
problem.inc(domainId, this.pdoc.docId, 'nSubmit', 1),
|
this.psdoc?.rid ? Promise.resolve() : problem.inc(domainId, this.pdoc.docId, 'nSubmit', 1),
|
||||||
problem.incStatus(domainId, this.pdoc.docId, this.user._id, 'nSubmit', 1),
|
problem.incStatus(domainId, this.pdoc.docId, this.user._id, 'nSubmit', 1),
|
||||||
domain.incUserInDomain(domainId, this.user._id, 'nSubmit'),
|
domain.incUserInDomain(domainId, this.user._id, 'nSubmit'),
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -287,7 +287,6 @@ export interface RecordDoc {
|
|||||||
/** pretest */
|
/** pretest */
|
||||||
input?: string;
|
input?: string;
|
||||||
contest?: ContestInfo;
|
contest?: ContestInfo;
|
||||||
effective?: boolean;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ScoreboardNode {
|
export interface ScoreboardNode {
|
||||||
|
|||||||
@@ -21,8 +21,7 @@ class RecordModel {
|
|||||||
static PROJECTION_LIST: (keyof RecordDoc)[] = [
|
static PROJECTION_LIST: (keyof RecordDoc)[] = [
|
||||||
'_id', 'score', 'time', 'memory', 'lang',
|
'_id', 'score', 'time', 'memory', 'lang',
|
||||||
'uid', 'pid', 'rejudged', 'hidden', 'progress',
|
'uid', 'pid', 'rejudged', 'hidden', 'progress',
|
||||||
'contest', 'effective', 'judger', 'judgeAt', 'status',
|
'contest', 'judger', 'judgeAt', 'status', 'pdomain',
|
||||||
'pdomain',
|
|
||||||
];
|
];
|
||||||
|
|
||||||
static async submissionPriority(uid: number, base: number = 0) {
|
static async submissionPriority(uid: number, base: number = 0) {
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ export async function udoc(report) {
|
|||||||
{
|
{
|
||||||
$group: {
|
$group: {
|
||||||
_id: { domainId: '$_id.domainId', uid: '$_id.uid' },
|
_id: { domainId: '$_id.domainId', uid: '$_id.uid' },
|
||||||
nSubmit: { $sum: '$nSubmit' },
|
nSubmit: { $sum: { $min: ['$nSubmit', 1] } },
|
||||||
nAccept: { $sum: { $min: ['$nAccept', 1] } },
|
nAccept: { $sum: { $min: ['$nAccept', 1] } },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -68,7 +68,7 @@ export async function psdoc(report) {
|
|||||||
export async function pdoc(report) {
|
export async function pdoc(report) {
|
||||||
report({ message: 'Pdoc' });
|
report({ message: 'Pdoc' });
|
||||||
const pipeline = [
|
const pipeline = [
|
||||||
{ $match: { hidden: false, type: { $ne: 'run' }, effective: true } },
|
{ $match: { hidden: false, type: { $ne: 'run' } } },
|
||||||
{
|
{
|
||||||
$group: {
|
$group: {
|
||||||
_id: { domainId: '$domainId', pid: '$pid', uid: '$uid' },
|
_id: { domainId: '$domainId', pid: '$pid', uid: '$uid' },
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||||
/* eslint-disable no-await-in-loop */
|
/* eslint-disable no-await-in-loop */
|
||||||
import { FilterQuery, ObjectID } from 'mongodb';
|
import { ObjectID } from 'mongodb';
|
||||||
import AdmZip from 'adm-zip';
|
import AdmZip from 'adm-zip';
|
||||||
import Queue from 'p-queue';
|
import Queue from 'p-queue';
|
||||||
import yaml from 'js-yaml';
|
import yaml from 'js-yaml';
|
||||||
@@ -8,7 +8,6 @@ import { pick } from 'lodash';
|
|||||||
import { convertIniConfig } from '@hydrooj/utils/lib/cases';
|
import { convertIniConfig } from '@hydrooj/utils/lib/cases';
|
||||||
import { BucketItem } from 'minio';
|
import { BucketItem } from 'minio';
|
||||||
import { Progress } from './ui';
|
import { Progress } from './ui';
|
||||||
import { RecordDoc } from './interface';
|
|
||||||
import { Logger } from './logger';
|
import { Logger } from './logger';
|
||||||
import { streamToBuffer } from './utils';
|
import { streamToBuffer } from './utils';
|
||||||
import {
|
import {
|
||||||
@@ -24,7 +23,7 @@ import * as discussion from './model/discussion';
|
|||||||
import domain from './model/domain';
|
import domain from './model/domain';
|
||||||
import * as document from './model/document';
|
import * as document from './model/document';
|
||||||
import * as system from './model/system';
|
import * as system from './model/system';
|
||||||
import { PRIV, STATUS } from './model/builtin';
|
import { PRIV } from './model/builtin';
|
||||||
import RecordModel from './model/record';
|
import RecordModel from './model/record';
|
||||||
import StorageModel from './model/storage';
|
import StorageModel from './model/storage';
|
||||||
import { size } from './lib/misc';
|
import { size } from './lib/misc';
|
||||||
@@ -242,37 +241,7 @@ const scripts: UpgradeScript[] = [
|
|||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
async function _19_20() {
|
null,
|
||||||
const _FRESH_INSTALL_IGNORE = 1;
|
|
||||||
const data = db.collection('record').aggregate([
|
|
||||||
{ $match: { hidden: false, type: { $ne: 'run' } } },
|
|
||||||
{
|
|
||||||
$group: {
|
|
||||||
_id: { domainId: '$domainId', pid: '$pid', uid: '$uid' },
|
|
||||||
nAccept: {
|
|
||||||
$sum: {
|
|
||||||
$cond: [{ $eq: ['$status', STATUS.STATUS_ACCEPTED] }, 1, 0],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
while (await data.hasNext()) {
|
|
||||||
const d: any = await data.next();
|
|
||||||
logger.info('%o', d);
|
|
||||||
const filter: FilterQuery<RecordDoc> = { domainId: d._id.domainId, pid: d._id.pid, uid: d._id.uid };
|
|
||||||
if (d.nAccept) {
|
|
||||||
const [first] = await db.collection('record')
|
|
||||||
.find({ ...filter, status: STATUS.STATUS_ACCEPTED })
|
|
||||||
.sort({ _id: 1 }).limit(1)
|
|
||||||
.project({ _id: 1 })
|
|
||||||
.toArray();
|
|
||||||
filter._id = { $lte: first._id };
|
|
||||||
}
|
|
||||||
await db.collection('record').updateMany(filter, { $set: { effective: true } });
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
async function _20_21() {
|
async function _20_21() {
|
||||||
const _FRESH_INSTALL_IGNORE = 1;
|
const _FRESH_INSTALL_IGNORE = 1;
|
||||||
await iterateAllProblem([], async (pdoc) => {
|
await iterateAllProblem([], async (pdoc) => {
|
||||||
@@ -428,6 +397,11 @@ const scripts: UpgradeScript[] = [
|
|||||||
await iterateAllDomain((ddoc) => domain.edit(ddoc._id, { lower: ddoc._id.toLowerCase() }));
|
await iterateAllDomain((ddoc) => domain.edit(ddoc._id, { lower: ddoc._id.toLowerCase() }));
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
async function _35_36() {
|
||||||
|
const _FRESH_INSTALL_IGNORE = 1;
|
||||||
|
await RecordModel.coll.updateMany({}, { $unset: { effective: '' } });
|
||||||
|
return true;
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
export default scripts;
|
export default scripts;
|
||||||
@@ -754,6 +754,7 @@ training_create: 创建训练
|
|||||||
training_edit: 编辑训练
|
training_edit: 编辑训练
|
||||||
training_main: 训练
|
training_main: 训练
|
||||||
Training: 训练
|
Training: 训练
|
||||||
|
Tried: 尝试
|
||||||
Type: 类型
|
Type: 类型
|
||||||
UI Language: 用户界面语言
|
UI Language: 用户界面语言
|
||||||
Uncompleted: 未完成
|
Uncompleted: 未完成
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@hydrooj/ui-default",
|
"name": "@hydrooj/ui-default",
|
||||||
"version": "4.11.45",
|
"version": "4.11.46",
|
||||||
"author": "undefined <i@undefined.moe>",
|
"author": "undefined <i@undefined.moe>",
|
||||||
"license": "AGPL-3.0",
|
"license": "AGPL-3.0",
|
||||||
"main": "hydro.js",
|
"main": "hydro.js",
|
||||||
|
|||||||
@@ -10,23 +10,23 @@
|
|||||||
width: rem(140px)
|
width: rem(140px)
|
||||||
position: relative
|
position: relative
|
||||||
|
|
||||||
.col--submit_n, .col--ac_rate, .col--difficulty
|
.col--tried, .col--ac, .col--difficulty
|
||||||
width: rem(70px)
|
width: rem(70px)
|
||||||
text-align: center
|
text-align: center
|
||||||
|
|
||||||
.col--status
|
.col--status
|
||||||
border-right: 1px solid $table-border-color
|
border-right: 1px solid $table-border-color
|
||||||
|
|
||||||
.col--submit_n, .col--difficulty
|
.col--tried, .col--difficulty
|
||||||
border-left: 1px solid $table-border-color
|
border-left: 1px solid $table-border-color
|
||||||
|
|
||||||
+mobile()
|
+mobile()
|
||||||
.col--status,
|
.col--status,
|
||||||
.col--submit_n,
|
.col--tried,
|
||||||
.col--difficulty
|
.col--difficulty
|
||||||
display: none
|
display: none
|
||||||
|
|
||||||
.col--ac_rate
|
.col--ac
|
||||||
border-left: 1px solid $table-border-color
|
border-left: 1px solid $table-border-color
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -3,23 +3,23 @@
|
|||||||
width: rem(150px)
|
width: rem(150px)
|
||||||
position: relative
|
position: relative
|
||||||
|
|
||||||
.col--submit_n, .col--ac_rate, .col--difficulty
|
.col--tried, .col--ac, .col--difficulty
|
||||||
width: rem(70px)
|
width: rem(70px)
|
||||||
text-align: center
|
text-align: center
|
||||||
|
|
||||||
.col--status
|
.col--status
|
||||||
border-right: 1px solid $table-border-color
|
border-right: 1px solid $table-border-color
|
||||||
|
|
||||||
.col--submit_n, .col--difficulty
|
.col--tried, .col--difficulty
|
||||||
border-left: 1px solid $table-border-color
|
border-left: 1px solid $table-border-color
|
||||||
|
|
||||||
+mobile()
|
+mobile()
|
||||||
.col--status,
|
.col--status,
|
||||||
.col--submit_n,
|
.col--tried,
|
||||||
.col--difficulty
|
.col--difficulty
|
||||||
display: none
|
display: none
|
||||||
|
|
||||||
.col--ac_rate
|
.col--ac
|
||||||
border-left: 1px solid $table-border-color
|
border-left: 1px solid $table-border-color
|
||||||
|
|
||||||
.training__section
|
.training__section
|
||||||
|
|||||||
@@ -35,16 +35,8 @@
|
|||||||
</dd>
|
</dd>
|
||||||
<dt>{{ _('# Submissions') }}</dt>
|
<dt>{{ _('# Submissions') }}</dt>
|
||||||
<dd><a href="{{ url('record_main', query={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.user.hasPriv(PRIV.PRIV_USER_PROFILE) %}
|
|
||||||
<dt>{{ _('# My Submissions') }}</dt>
|
|
||||||
<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>
|
<dt>{{ _('Accepted') }}</dt>
|
||||||
<dd>{{ pdoc.nAccept }}</dd>
|
<dd>{{ pdoc.nAccept }}</dd>
|
||||||
<dt>{{ _('Accepted Ratio') }}</dt>
|
|
||||||
<dd>{% if pdoc.nSubmit > 0 %}{{ (100 * pdoc.nAccept / pdoc.nSubmit)|round|int }}%{% else %}{{ _('?') }}{% endif %}</dd>
|
|
||||||
<dt>{{ _('Uploaded By') }}</dt>
|
<dt>{{ _('Uploaded By') }}</dt>
|
||||||
<dd>{{ user.render_inline(owner_udoc, badge=false) }}</dd>
|
<dd>{{ user.render_inline(owner_udoc, badge=false) }}</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|||||||
@@ -61,8 +61,8 @@
|
|||||||
<td class="col--name col--problem-name">
|
<td class="col--name col--problem-name">
|
||||||
{{ problem.render_problem_title(pdoc) }}
|
{{ problem.render_problem_title(pdoc) }}
|
||||||
</td>
|
</td>
|
||||||
<td class="col--submit_n">{{ pdoc['nSubmit'] }}</td>
|
<td class="col--tried">{{ pdoc.nSubmit }}</td>
|
||||||
<td class="col--ac_rate">{{ (100 * pdoc['nAccept'] / pdoc['nSubmit'])|round|int if pdoc['nSubmit'] > 0 else _('?') }}</td>
|
<td class="col--ac">{{ pdoc.nAccept }}</td>
|
||||||
<td class="col--difficulty">{{ pdoc['difficulty'] or _('(None)') }}</td>
|
<td class="col--difficulty">{{ pdoc['difficulty'] or _('(None)') }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{%- endfor -%}
|
{%- endfor -%}
|
||||||
|
|||||||
@@ -44,9 +44,8 @@
|
|||||||
<span class="bp3-tag bp3-large bp3-minimal problem__tag-item">{{ _('Time') }}: {{ pdoc.config.timeMax if pdoc.config.timeMax == pdoc.config.timeMin else pdoc.config.timeMin+'~'+pdoc.config.timeMax }}ms</span>
|
<span class="bp3-tag bp3-large bp3-minimal problem__tag-item">{{ _('Time') }}: {{ pdoc.config.timeMax if pdoc.config.timeMax == pdoc.config.timeMin else pdoc.config.timeMin+'~'+pdoc.config.timeMax }}ms</span>
|
||||||
<span class="bp3-tag bp3-large bp3-minimal problem__tag-item">{{ _('Memory') }}: {{ pdoc.config.memoryMax if pdoc.config.memoryMax == pdoc.config.memoryMin else pdoc.config.memoryMin+'~'+pdoc.config.memoryMax }}MiB</span>
|
<span class="bp3-tag bp3-large bp3-minimal problem__tag-item">{{ _('Memory') }}: {{ pdoc.config.memoryMax if pdoc.config.memoryMax == pdoc.config.memoryMin else pdoc.config.memoryMin+'~'+pdoc.config.memoryMax }}MiB</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<a class="bp3-tag bp3-large bp3-minimal bp3-interactive problem__tag-item" href="{{ url('record_main', query={pid:pdoc.docId}) }}">{{ _('Submitted') }}: {{ pdoc.nSubmit }}</a>
|
<a class="bp3-tag bp3-large bp3-minimal bp3-interactive problem__tag-item" href="{{ url('record_main', query={pid:pdoc.docId}) }}">{{ _('Tried') }}: {{ pdoc.nSubmit }}</a>
|
||||||
<a class="bp3-tag bp3-large bp3-minimal bp3-interactive problem__tag-item" href="{{ url('record_main', query={pid:pdoc.docId, status:1}) }}">{{ _('Accepted') }}: {{ pdoc.nAccept }}</a>
|
<a class="bp3-tag bp3-large bp3-minimal bp3-interactive problem__tag-item" href="{{ url('record_main', query={pid:pdoc.docId, status:1}) }}">{{ _('Accepted') }}: {{ pdoc.nAccept }}</a>
|
||||||
<span class="bp3-tag bp3-large bp3-minimal problem__tag-item">{{ _('Accepted Ratio') }}: {% if pdoc.nSubmit > 0 %}{{ (100 * pdoc.nAccept / pdoc.nSubmit)|round|int }}%{% else %}{{ _('?') }}{% endif %}</span>
|
|
||||||
<span class="bp3-tag bp3-large bp3-minimal problem__tag-item">{{ _('Difficulty') }}: {{ pdoc['difficulty'] or _('(None)') }}</span>
|
<span class="bp3-tag bp3-large bp3-minimal problem__tag-item">{{ _('Difficulty') }}: {{ pdoc['difficulty'] or _('(None)') }}</span>
|
||||||
<span class="bp3-tag bp3-large bp3-minimal bp3-interactive problem__tag-item">{{ _('Uploaded By') }}: {{ user.render_inline(udoc, badge=false) }}</span>
|
<span class="bp3-tag bp3-large bp3-minimal bp3-interactive problem__tag-item">{{ _('Uploaded By') }}: {{ user.render_inline(udoc, badge=false) }}</span>
|
||||||
{% if pdoc.tag.length %}
|
{% if pdoc.tag.length %}
|
||||||
|
|||||||
@@ -93,7 +93,7 @@
|
|||||||
<th class="col--status record-status--border">{{ _('Status') }}</th>
|
<th class="col--status record-status--border">{{ _('Status') }}</th>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<th class="col--name">{{ _('Problem') }}</th>
|
<th class="col--name">{{ _('Problem') }}</th>
|
||||||
<th class="col--submit_n">{{ _('Submit') }}</th>
|
<th class="col--submit_n">{{ _('Tried') }}</th>
|
||||||
<th class="col--ac_rate">% {{ _('AC') }}</th>
|
<th class="col--ac_rate">% {{ _('AC') }}</th>
|
||||||
<th class="col--difficulty">{{ _('Difficulty') }}</th>
|
<th class="col--difficulty">{{ _('Difficulty') }}</th>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -129,8 +129,8 @@
|
|||||||
show_tags=false
|
show_tags=false
|
||||||
) }}
|
) }}
|
||||||
</td>
|
</td>
|
||||||
<td class="col--submit_n">{{ pdoc.nSubmit }}</td>
|
<td class="col--tried">{{ pdoc.nSubmit }}</td>
|
||||||
<td class="col--ac_rate">{{ (100 * pdoc.nAccept / pdoc.nSubmit)|round|int if pdoc.nSubmit > 0 else _('?') }}</td>
|
<td class="col--ac">{{ pdoc.nAccept }}</td>
|
||||||
<td class="col--difficulty">{{ pdoc['difficulty'] or _('(None)') }}</td>
|
<td class="col--difficulty">{{ pdoc['difficulty'] or _('(None)') }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|||||||
Reference in new issue
Block a user