feat(web/group/assignment): only show submissions before end_time

This commit is contained in:
Baoshuo Ren 2022-10-21 22:04:17 +08:00
parent 639d09b8c3
commit 0f0556b9ef
Signed by: baoshuo
GPG Key ID: 00CB9680AB29F51A
6 changed files with 49 additions and 29 deletions

View File

@ -52,6 +52,7 @@
$usernames = [];
$n_users = count($users);
$n_problems = count($problems);
$submission_end_time = min(new DateTime(), DateTime::createFromFormat('Y-m-d H:i:s', $assignment['end_time']))->format('Y-m-d H:i:s');
foreach ($problems as $problem) {
$problem_ids[] = $problem['problem_id'];
@ -76,7 +77,7 @@
];
foreach ($problem_ids as $problem_id) {
$cond = "submitter = '{$user['username']}' AND problem_id = $problem_id";
$cond = "submitter = '{$user['username']}' AND problem_id = $problem_id AND submit_time <= '$submission_end_time'";
$submission = DB::selectFirst("SELECT id, score FROM submissions INNER JOIN (SELECT MAX(score) AS score FROM submissions WHERE $cond) AS max USING (score) WHERE $cond ORDER BY submit_time DESC");
if ($submission) {
@ -156,14 +157,23 @@ $('#standings').long_table(
},
{
div_classes: ['card', 'my-3', 'table-responsive', 'text-center'],
table_classes: ['table', 'uoj-table', 'mb-0'],
table_classes: ['table', 'uoj-table', 'table-bordered', 'mb-0'],
page_len: 20,
print_before_table: function() {
var html = '';
html += '<div class="card-header bg-transparent text-muted text-start small">' +
'成绩统计截止时间:<?= $submission_end_time ?>' +
'</div>';
return html;
}
}
);
</script>
<!-- end left col -->
</div>
<!-- end left col -->
<aside class="col-lg-3 mt-3 mt-lg-0">
<!-- right col -->

View File

@ -332,6 +332,8 @@ EOD);
<div class="tab-pane active" id="assignments">
<?php
$now = new DateTime();
$hidden_time = new DateTime();
$hidden_time->sub(new DateInterval('P7D'));
echoLongTable(
['*'],
'groups_assignments',
@ -346,21 +348,23 @@ EOD);
<th style="width:8em">操作</th>
</tr>
EOD,
function($row) use ($group, $now) {
function($row) use ($group, $now, $hidden_time) {
$list = queryProblemList($row['list_id']);
$end_time = DateTime::createFromFormat('Y-m-d H:i:s', $row['end_time']);
echo '<tr>';
echo '<td class="text-center">', $list['id'], '</td>';
echo '<td>', '<a class="text-decoration-none" href="/group/', $group['id'], '/assignment/', $list['id'],'">', HTML::escape($list['title']), '</a>', '</td>';
if ($end_time < $now) {
if ($end_time < $hidden_time) {
echo '<td class="text-secondary">已隐藏</td>';
} elseif ($end_time < $now) {
echo '<td class="text-danger">已结束</td>';
} else {
echo '<td class="text-success">进行中</td>';
}
echo '<td>', $end_time->format('Y-m-d H:i:s'), '</td>';
echo '<td>';
echo '<a class="text-decoration-none d-inline-block align-middle" href="/problem_list/', $list['id'], '/edit">编辑</a> ';
echo '<a class="text-decoration-none d-inline-block align-middle" href="/problem_list/', $list['id'], '/manage">编辑</a> ';
echo ' <form class="d-inline-block" method="POST" onsubmit=\'return confirm("你真的要移除这份作业吗?移除作业不会删除题单。")\'>'
. '<input type="hidden" name="_token" value="' . crsf_token() . '">'
. '<input type="hidden" name="list_id" value="' . $list['id'] . '">'
@ -390,6 +394,7 @@ EOD,
<li>请为学生预留合理的完成作业的时间。</li>
<li>排行榜将在结束后停止更新。</li>
<li>如需延长结束时间请删除后再次添加,排行数据不会丢失。</li>
<li>作业结束七天后将会自动在小组主页中隐藏,但仍可直接通过 URL 访问。</li>
</ul>
</div>
</div>

View File

@ -149,7 +149,7 @@ function queryGroupAssignments($group_id) {
return DB::selectAll("select a.id as id, a.list_id as list_id, a.end_time as end_time, b.title from groups_assignments a left join lists b on a.list_id = b.id where a.group_id = $group_id order by a.end_time asc", MYSQLI_ASSOC);
}
function queryGroupActiveAssignments($group_id) {
return DB::selectAll("select a.id as id, a.group_id as group_id, a.list_id as list_id, a.end_time as end_time, b.title from groups_assignments a left join lists b on a.list_id = b.id where a.group_id = $group_id and a.end_time > addtime(now(), '-168:00:00') order by a.end_time asc", MYSQLI_ASSOC);
return DB::selectAll("select a.id as id, a.group_id as group_id, a.list_id as list_id, a.end_time as end_time, b.title from groups_assignments a left join lists b on a.list_id = b.id where a.group_id = $group_id and a.end_time >= addtime(now(), '-168:00:00') order by a.end_time asc", MYSQLI_ASSOC);
}
function queryAssignmentByGroupListID($group_id, $list_id) {
return DB::selectFirst("select * from groups_assignments where list_id='$list_id' and group_id='$group_id'", MYSQLI_ASSOC);

View File

@ -21,8 +21,16 @@
</div>
<?php endif ?>
<?php if ($standings_data): ?>
<div class="tab-pane card-body" id="tab-standings">
<?php uojIncludeView('contest-standings', array_merge($standings_data, ['no_bs5_card' => ''])) ?>
<div class="tab-pane" id="tab-standings">
<?php
uojIncludeView('contest-standings', array_merge(
$standings_data,
[
'standings_config' => [
'div_classes' => ['table-responsive', 'mb-3']
]
]
)); ?>
</div>
<?php endif ?>
</div>

View File

@ -1,14 +1,13 @@
<div id="standings" class="
<?php if (!isset($no_bs5_card)): ?>
card card-default
<?php endif ?>"></div>
<div id="standings"></div>
<script type="text/javascript">
standings_version=<?=$contest['extra_config']['standings_version']?>;
show_self_reviews=<?=isset($show_self_reviews) && $show_self_reviews ? 'true' : 'false' ?>;
contest_id=<?=$contest['id']?>;
standings=<?=json_encode($standings)?>;
score=<?=json_encode($score)?>;
problems=<?=json_encode($contest_data['problems'])?>;
$(document).ready(showStandings());
var standings_version=<?=$contest['extra_config']['standings_version']?>;
var show_self_reviews=<?=isset($show_self_reviews) && $show_self_reviews ? 'true' : 'false' ?>;
var contest_id=<?=$contest['id']?>;
var standings=<?=json_encode($standings)?>;
var score=<?=json_encode($score)?>;
var problems=<?=json_encode($contest_data['problems'])?>;
var standings_config = <?=json_encode(isset($standings_config) ? $standings_config : ['_config' => true])?>;
$(document).ready(showStandings(standings_config));
</script>

View File

@ -541,18 +541,16 @@ $.fn.long_table = function(data, cur_page, header_row, get_row_str, config) {
$(table_div).append(
$('<div class="' + div_classes.join(' ') + '" />').append(
(typeof config.print_before_table === 'function' ? config.print_before_table() : ''),
$('<table class="' + table_classes.join(' ') + '" />').append(
$('<thead>' + header_row + '</thead>')
).append(
tbody
)
),
(typeof config.print_after_table === 'function' ? config.print_after_table() : '')
)
);
if (config.print_after_table != undefined) {
$(table_div).append(config.print_after_table());
}
var get_page_li = function(p, h) {
if (p == -1) {
return $('<li class="page-item"></li>').addClass('disabled').append($('<a class="page-link"></a>').append(h));
@ -1129,7 +1127,7 @@ function showCommentReplies(id, replies) {
}
// standings
function showStandings() {
function showStandings(config) {
$("#standings").long_table(
standings,
1,
@ -1178,9 +1176,9 @@ function showStandings() {
col_tr += '</tr>';
return col_tr;
}, {
div_classes: ['table-responsive'],
table_classes: ['table', 'table-bordered', 'text-center', 'align-middle', 'uoj-table', 'uoj-standings-table', 'mb-0'],
page_len: 100,
div_classes: config.div_classes ? config.div_classes : ['table-responsive', 'card', 'my-3'],
table_classes: config.table_classes ? config.table_classes : ['table', 'table-bordered', 'text-center', 'align-middle', 'uoj-table', 'uoj-standings-table', 'mb-0'],
page_len: config.page_len ? config.page_len : 50,
print_after_table: function() {
return '<div class="card-footer bg-transparent text-end text-muted">' + uojLocale("contests::n participants", standings.length) + '</div><script>if (window.MathJax) window.MathJax.typeset();</scr' + 'ipt>';
}