Revert last 3 commits
This commit is contained in:
parent
87e8f3d966
commit
dfc12f81f2
20 changed files with 486 additions and 272 deletions
|
@ -5,6 +5,7 @@
|
|||
<a target="_blank" href="">LQDOJ (Le Quy Don Online Judge)</a> là một trang web chấm bài tự động được phát triển dựa trên nền tảng mã nguồn mở <a target="_blank" href="https://dmoj.ca/">DMOJ</a>. Được xây dựng với mục đích ban đầu là tạo ra một môi trường học tập cho học sinh khối chuyên Tin <a target="_blank" href="http://thpt-lequydon-danang.edu.vn/">trường THPT chuyên Lê Quý Đôn (TP Đà Nẵng)</a>, hiện nay LQDOJ đã cho phép đăng ký tự do để trở thành một sân chơi rộng mở cho toàn bộ cộng đồng học sinh yêu Tin học. Trang web cung cấp lượng bài luyện tập đồ sộ từ các kỳ thi HSG Quốc Gia, ACM ICPC, Olympic Duyên Hải Bắc Bộ, etc. cho đến các contest định kỳ để xếp loại khả năng (rating) giúp các bạn có thêm động lực cạnh tranh và khí thế phấn đấu rèn luyện nâng cao trình độ lập trình. Các bạn có thể tham khảo mã nguồn của trang web tại <a target="_blank" href="https://github.com/LQDJudge/online-judge">Github repo chính thức</a>. Mọi ý kiến đóng góp và thắc mắc xin gửi về:
|
||||
<ul>
|
||||
<li>Thầy <a target="_blank" href="https://www.facebook.com/dovannho">Đỗ Văn Nhỏ</a> (handle: <span class="rating rate-none user"><a target="_blank" href="../user/Small">Small</a></span>), giáo viên Tin học trường THPT chuyên Lê Quý Đôn, email: <a href="mailto:admin@lqdoj.edu.vn">admin@lqdoj.edu.vn</a></li>
|
||||
<li><a target="_blank" href="https://www.facebook.com/floweronstone">Nguyễn Đức Thuận</a> (handle: <span class="rating rate-master user"><a target="_blank" href="../user/Flower_On_Stone">Flower_On_Stone</a></span>), email: <a href="mailto:thuanbn03@gmail.com">thuanbn03@gmail.com</a></li>
|
||||
<li><a target="_blank" href="https://www.facebook.com/profile.php?id=100011662657075">Lê Phước Định</a> (handle: <span class="rating rate-grandmaster user"><a target="_blank" href="../user/cuom1999">cuom1999</a></span>), email: <a href="mailto:dinh@lqdoj.edu.vn">dinh@lqdoj.edu.vn</a></li>
|
||||
<li><a target="_blank" href="https://www.facebook.com/doannguyenthanhluong">Đoàn Nguyễn Thành Lương</a> (handle: <span class="rating rate-master user"><a target="_blank" href="../user/CaiWinDao">CaiWinDao</a></span>), email: <a href="mailto:luong@lqdoj.edu.vn">luong@lqdoj.edu.vn</a></li>
|
||||
</ul>
|
||||
|
|
|
@ -282,6 +282,7 @@
|
|||
{% endif %}
|
||||
{% if request.user.is_superuser %}
|
||||
<li><a href="{{ url('internal_problem') }}">{{ _('Internal') }}</a></li>
|
||||
<li><a href="{{ url('site_stats') }}">{{ _('Stats') }}</a></li>
|
||||
{% endif %}
|
||||
<li><a href="{{ url('user_edit_profile') }}">{{ _('Edit profile') }}</a></li>
|
||||
{% if request.user.is_impersonate %}
|
||||
|
|
|
@ -6,28 +6,6 @@
|
|||
|
||||
{% block three_col_media %}
|
||||
{{ form.media.css }}
|
||||
<style>
|
||||
#org-field-wrapper-scoreboard_visibility,
|
||||
#org-field-wrapper-points_precision,
|
||||
#org-field-wrapper-start_time,
|
||||
#org-field-wrapper-end_time,
|
||||
#org-field-wrapper-time_limit,
|
||||
#org-field-wrapper-format_name {
|
||||
display: inline-flex;
|
||||
}
|
||||
.problems-problem {
|
||||
width: 40%;
|
||||
}
|
||||
input[type=number] {
|
||||
width: 5em;
|
||||
}
|
||||
.middle-content {
|
||||
z-index: 1;
|
||||
}
|
||||
#three-col-container {
|
||||
overflow: auto;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
{% block middle_content %}
|
||||
|
@ -55,36 +33,6 @@
|
|||
{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
{% if problems_form %}
|
||||
<hr><br>
|
||||
{{ problems_form.management_form }}
|
||||
<i>{{_('If you run out of rows, click Save')}}</i>
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
{% for field in problems_form[0] %}
|
||||
{% if not field.is_hidden %}
|
||||
<th>
|
||||
{{field.label}}
|
||||
</th>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for form in problems_form %}
|
||||
<tr>
|
||||
{% for field in form %}
|
||||
<td class="problems-{{field.name}}" title="
|
||||
{{ field.help_text|safe if field.help_text }}"
|
||||
style="{{ 'display:none' if field.is_hidden }}"
|
||||
>{{field}}<div style="color:red">{{field.errors}}</div></td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% endif %}
|
||||
<button type="submit">{{ _('Save') }}</button>
|
||||
</form>
|
||||
{% endblock %}
|
88
templates/organization/contest/edit.html
Normal file
88
templates/organization/contest/edit.html
Normal file
|
@ -0,0 +1,88 @@
|
|||
{% extends "organization/home-base.html" %}
|
||||
|
||||
{% block three_col_js %}
|
||||
{{ form.media.js }}
|
||||
{% endblock %}
|
||||
|
||||
{% block three_col_media %}
|
||||
{{ form.media.css }}
|
||||
<style>
|
||||
#org-field-wrapper-scoreboard_visibility,
|
||||
#org-field-wrapper-points_precision,
|
||||
#org-field-wrapper-start_time,
|
||||
#org-field-wrapper-end_time,
|
||||
#org-field-wrapper-time_limit,
|
||||
#org-field-wrapper-format_name {
|
||||
display: inline-flex;
|
||||
}
|
||||
.problems-problem {
|
||||
width: 40%;
|
||||
}
|
||||
input[type=number] {
|
||||
width: 5em;
|
||||
}
|
||||
.middle-content {
|
||||
z-index: 1;
|
||||
}
|
||||
#three-col-container {
|
||||
overflow: auto;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
{% block middle_content %}
|
||||
<form action="" method="post">
|
||||
{% csrf_token %}
|
||||
{% if form.errors %}
|
||||
<div class="alert alert-danger alert-dismissable">
|
||||
<a href="#" class="close">x</a>
|
||||
{{ form.non_field_errors() }}
|
||||
{{ form.errors }}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% for field in form %}
|
||||
{% if not field.is_hidden %}
|
||||
<div style="margin-bottom: 1em;">
|
||||
{{ field.errors }}
|
||||
<label for="{{field.id_for_label }}"><b>{{ field.label }}{% if field.field.required %}<span style="color:red"> * </span>{% endif %}:</b> </label>
|
||||
<div class="org-field-wrapper" id="org-field-wrapper-{{field.html_name }}">
|
||||
{{ field }}
|
||||
</div>
|
||||
{% if field.help_text %}
|
||||
<i style="display: block">{{ field.help_text|safe }}</i>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
<hr><br>
|
||||
{{ problems_form.management_form }}
|
||||
<i>{{_('If you run out of rows, click Save')}}</i>
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
{% for field in problems_form[0] %}
|
||||
{% if not field.is_hidden %}
|
||||
<th>
|
||||
{{field.label}}
|
||||
</th>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for form in problems_form %}
|
||||
<tr>
|
||||
{% for field in form %}
|
||||
<td class="problems-{{field.name}}" title="
|
||||
{{ field.help_text|safe if field.help_text }}"
|
||||
style="{{ 'display:none' if field.is_hidden }}"
|
||||
>{{field}}<div style="color:red">{{field.errors}}</div></td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
<button type="submit">{{ _('Save') }}</button>
|
||||
</form>
|
||||
{% endblock %}
|
|
@ -6,13 +6,10 @@
|
|||
{% endcompress %}
|
||||
{% endblock %}
|
||||
|
||||
{% block content_title %}{{ _('Statistics') }}{% endblock %}
|
||||
{% block content_title %}{% endblock %}
|
||||
{% block title_ruler %}{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
<div class="tabs">
|
||||
<li{% if tab == 'language' %} class="active"{% endif %}>
|
||||
<a href="{{ url('language_stats') }}">{{ _('Language') }}</a>
|
||||
</li>
|
||||
</div>
|
||||
{% include "stats/tab.html" %}
|
||||
{% block chart_body %}{% endblock %}
|
||||
{% endblock %}
|
||||
|
|
|
@ -36,20 +36,10 @@
|
|||
Chart.defaults.global.tooltipFontFamily =
|
||||
Chart.defaults.global.tooltipTitleFontFamily =
|
||||
$('body').css('font-family');
|
||||
|
||||
function pie_chart(url, $chart) {
|
||||
$.getJSON(url, function (data) {
|
||||
draw_pie_chart(data, $chart);
|
||||
});
|
||||
}
|
||||
|
||||
pie_chart('{{ url('language_stats_data_all') }}', $('#lang-all'));
|
||||
pie_chart('{{ url('language_stats_data_ac') }}', $('#lang-ac'));
|
||||
pie_chart('{{ url('stats_data_status') }}', $('#status-counts'));
|
||||
|
||||
$.getJSON('{{ url('language_stats_data_ac_rate') }}', function (data) {
|
||||
draw_bar_chart(data, $('#ac-rate'));
|
||||
});
|
||||
draw_pie_chart({{ data_all }}, $('#lang-all'));
|
||||
draw_pie_chart({{ lang_ac }}, $('#lang-ac'));
|
||||
draw_pie_chart({{ status_counts }}, $('#status-counts'));
|
||||
draw_bar_chart({{ ac_rate }}, $('#ac-rate'));
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
|
|
@ -87,4 +87,24 @@
|
|||
});
|
||||
return chart;
|
||||
}
|
||||
|
||||
function draw_timeline(data, $chart) {
|
||||
var ctx = $chart.find('canvas')[0].getContext('2d');
|
||||
var chart = new Chart(ctx, {
|
||||
type: 'line',
|
||||
data: data,
|
||||
options: {
|
||||
maintainAspectRatio: false,
|
||||
legend: {
|
||||
display: false,
|
||||
},
|
||||
scales: {
|
||||
xAxes: [{
|
||||
type: 'time',
|
||||
}]
|
||||
},
|
||||
},
|
||||
});
|
||||
return chart;
|
||||
}
|
||||
</script>
|
||||
|
|
65
templates/stats/site.html
Normal file
65
templates/stats/site.html
Normal file
|
@ -0,0 +1,65 @@
|
|||
{% extends "stats/base.html" %}
|
||||
{% block media %}
|
||||
<style>
|
||||
.graph {
|
||||
padding-bottom: 3em;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
{% block chart_body %}
|
||||
<div class="graph">
|
||||
<div id="submissions" class="chart">
|
||||
<canvas width="90%" height="300"></canvas>
|
||||
</div>
|
||||
<center><h3>{{ _('Submissions') }}</h3></center>
|
||||
</div>
|
||||
<div class="graph">
|
||||
<div id="contests" class="chart">
|
||||
<canvas width="90%" height="300"></canvas>
|
||||
</div>
|
||||
<center><h3>{{ _('Contests') }}</h3></center>
|
||||
</div>
|
||||
<div class="graph">
|
||||
<div id="new_users" class="chart">
|
||||
<canvas width="90%" height="300"></canvas>
|
||||
</div>
|
||||
<center><h3>{{ _('New users') }}</h3></center>
|
||||
</div>
|
||||
<div class="graph">
|
||||
<div id="groups" class="chart">
|
||||
<canvas width="90%" height="300"></canvas>
|
||||
</div>
|
||||
<center><h3>{{ _('Groups') }}</h3></center>
|
||||
</div>
|
||||
<div class="graph">
|
||||
<div id="comments" class="chart">
|
||||
<canvas width="90%" height="300"></canvas>
|
||||
</div>
|
||||
<center><h3>{{ _('Comments') }}</h3></center>
|
||||
</div>
|
||||
<div class="graph">
|
||||
<div id="chat_messages" class="chart">
|
||||
<canvas width="90%" height="300"></canvas>
|
||||
</div>
|
||||
<center><h3>{{ _('Chat messages') }}</h3></center>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block bodyend %}
|
||||
<script type="text/javascript">
|
||||
$(function () {
|
||||
Chart.defaults.global.scaleFontFamily =
|
||||
Chart.defaults.global.tooltipFontFamily =
|
||||
Chart.defaults.global.tooltipTitleFontFamily =
|
||||
$('body').css('font-family');
|
||||
|
||||
draw_timeline({{submissions}}, $('#submissions'));
|
||||
draw_timeline({{new_users}}, $('#new_users'));
|
||||
draw_timeline({{comments}}, $('#comments'));
|
||||
draw_timeline({{chat_messages}}, $('#chat_messages'));
|
||||
draw_timeline({{contests}}, $('#contests'));
|
||||
draw_timeline({{groups}}, $('#groups'));
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
6
templates/stats/tab.html
Normal file
6
templates/stats/tab.html
Normal file
|
@ -0,0 +1,6 @@
|
|||
{% extends "tabs-base.html" %}
|
||||
|
||||
{% block tabs %}
|
||||
{{ make_tab('language', 'fa-list', url('language_stats'), _('Language')) }}
|
||||
{{ make_tab('site', 'fa-list', url('site_stats'), _('Site')) }}
|
||||
{% endblock %}
|
|
@ -1,4 +1,5 @@
|
|||
<input
|
||||
autocomplete="off"
|
||||
type="{{ widget.type }}"
|
||||
name="{{ widget.name }}"
|
||||
{% if widget.value != None %}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue