Skip to content
This repository has been archived by the owner on Jul 3, 2020. It is now read-only.

Commit

Permalink
Implement task exporting
Browse files Browse the repository at this point in the history
Renamed .mb4 to .bottom-space
Fix question list design
  • Loading branch information
evgfilim1 committed Aug 24, 2018
1 parent 27e8ba8 commit 6d844d5
Show file tree
Hide file tree
Showing 6 changed files with 44 additions and 21 deletions.
27 changes: 24 additions & 3 deletions main.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from flask import render_template, redirect, url_for, session, g, request, flash, abort
from flask import render_template, redirect, url_for, session, g, request, flash, abort, Response
from flask_restful import Api
from markdown import markdown
from datetime import datetime, timedelta
Expand Down Expand Up @@ -265,15 +265,18 @@ def upload_questions():
with form.file.data.stream as ff:
x = json.load(ff)
for question in x:
q = Question(id=question['num'], title=question['statement'], text=question['extra'],
points=question['points'], number=question['num'] * 10)
q = Question(id=question['num'], title=question['statement'], points=question['points'],
text=question['extra'] or None, number=question['num'] * 10)
for i, answer in enumerate(question['choices']):
a = Answer(text=answer, is_correct=(i == question['correct']),
question_id=question['num'])
db.session.add(a)
db.session.add(q)
db.session.commit()
flash('Успешно импортировано!', 'success')
else:
for err in form.file.errors:
flash(err)
return redirect(url_for('manage_questions'))


Expand All @@ -290,5 +293,23 @@ def delete_question(question_id):
return redirect(back('manage_questions'))


@app.route('/admin/questions/export')
@admin_required
def export_questions():
questions = Question.query.all()
data = []
for q in questions:
d = {'num': q.id, 'statement': q.title, 'extra': q.text or '', 'choices': [],
'points': q.points}
for i, a in enumerate(q.answers):
d['choices'].append(a.text)
if a.is_correct:
d['correct'] = i
data.append(d)
json_data = json.dumps(data, indent=4)
return Response(response=json_data, mimetype='application/json',
headers={'Content-Disposition': 'attachment; filename="tasks.json"'})


if __name__ == '__main__':
app.run()
2 changes: 1 addition & 1 deletion static/css/style.css
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
@import url('https://fonts.googleapis.com/css?family=Roboto');

.question-card, .mb4 {
.question-card, .bottom-space {
margin-bottom: 4rem;
}

Expand Down
15 changes: 9 additions & 6 deletions static/js/script.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,13 @@ function uploadAllAnswers() {
}
}

function destructive_confirm(ev) {
if (!confirm('Это — деструктивная операция. Продолжить?')) {
ev.preventDefault();
ev.stopPropagation();
}
}

$('textarea').on('input', function (){
$(this).height(0).height(this.scrollHeight);
});
Expand All @@ -41,11 +48,7 @@ $(document).ready(function () {
$('textarea').trigger('input');
});

$('.destructive-confirm').click(function (ev) {
if (!confirm('Это — деструктивная операция. Продолжить?')) {
ev.preventDefault();
ev.stopPropagation();
}
});
$('a.destructive-confirm').click(destructive_confirm);
$('form.destructive-confirm').submit(destructive_confirm);

$('#noscript').hide();
2 changes: 1 addition & 1 deletion templates/question_form.html
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<form method="post">
<form method="post" class="bottom-space">
{{ form.hidden_tag() }}
{# question, caption, points, +answers, +number #}
<div class="form-group">
Expand Down
13 changes: 6 additions & 7 deletions templates/questions.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,21 @@ <h1>Вопросы</h1>
{% for q in questions %}
{% include 'card.html' %}
{% endfor %}
<h2>Экспортировать вопросы</h2>
<p class="bottom-space">
<a href="{{ url_for('export_questions') }}" class="btn btn-primary">Скачать файл с вопросами в формате JSON</a>
</p>
<h2>Добавить вопрос</h2>
{% include 'question_form.html' %}
<h2>Импортировать вопросы</h2>
<p class="text-danger"><b>После импорта все вопросы, ответы и решения будут сброшены!</b></p>
<form action="{{ url_for('upload_questions') }}" enctype="multipart/form-data" method="post">
<form action="{{ url_for('upload_questions') }}" enctype="multipart/form-data" method="post" class="destructive-confirm">
{{ import_form.hidden_tag() }}
<div class="custom-file">
{{ import_form.file(class='custom-file-input' + (' is-invalid' if import_form.file.errors else ''), accept='application/json') }}
{{ import_form.file.label(class='custom-file-label') }}
{% for error in import_form.file.errors %}
<div class="invalid-feedback">
{{ error }}
</div>
{% endfor %}
</div>
{{ import_form.submit(class='btn btn-primary destructive-confirm') }}
{{ import_form.submit(class='btn btn-primary') }}
</form>
{% endblock %}
{% block scripts %}
Expand Down
6 changes: 3 additions & 3 deletions templates/result.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ <h1>Результаты пользователя {{ user.name }}</h1>
{% else %}
<h1>Поздравляю!</h1>
{% endif %}
<p class="mb4">
<p class="bottom-space">
{% if admin %}
Набрано баллов:
{% else %}
Expand All @@ -27,15 +27,15 @@ <h2 class="pre-question-card">
{% for q in failed %}
{% include 'card.html' %}
{% else %}
<p class="mb4"><i>Отсутствуют</i></p>
<p class="bottom-space"><i>Отсутствуют</i></p>
{% endfor %}
</div>
<h2 class="pre-question-card">Пропущенные вопросы</h2>
<div>
{% for q in skipped %}
{% include 'card.html' %}
{% else %}
<p class="mb4"><i>Отсутствуют</i></p>
<p class="bottom-space"><i>Отсутствуют</i></p>
{% endfor %}
</div>
{% endblock %}
Expand Down

0 comments on commit 6d844d5

Please sign in to comment.