Added and setup frontend for filtering by srs state.
This commit is contained in:
parent
a907736895
commit
c5fb8db98c
@ -37,14 +37,16 @@ updateQuizItemStats = () ->
|
|||||||
$('#vocab-num').text(sessionStorage.getItem('vocabulary_count'));
|
$('#vocab-num').text(sessionStorage.getItem('vocabulary_count'));
|
||||||
$('#total-num').text(parseInt(sessionStorage.getItem('radical_count')) + parseInt(sessionStorage.getItem('kanji_count'))+ parseInt(sessionStorage.getItem('vocabulary_count')))
|
$('#total-num').text(parseInt(sessionStorage.getItem('radical_count')) + parseInt(sessionStorage.getItem('kanji_count'))+ parseInt(sessionStorage.getItem('vocabulary_count')))
|
||||||
|
|
||||||
|
getSrsTypeFilters = () ->
|
||||||
|
srs_levels = ['burnedcheck','enlightencheck','mastercheck','gurucheck','apprenticecheck']
|
||||||
|
return (document.getElementById(s).value for s in srs_levels when document.getElementById(s).checked).toString()
|
||||||
|
|
||||||
filterQuestions = () ->
|
filterQuestions = () ->
|
||||||
input_data = $('#filter-input').val()
|
|
||||||
if(input_data)
|
|
||||||
sessionStorage.removeItem('user_items')
|
sessionStorage.removeItem('user_items')
|
||||||
sessionStorage.removeItem('radical_count')
|
sessionStorage.removeItem('radical_count')
|
||||||
sessionStorage.removeItem('kanji_count')
|
sessionStorage.removeItem('kanji_count')
|
||||||
sessionStorage.removeItem('vocabulary_count')
|
sessionStorage.removeItem('vocabulary_count')
|
||||||
target_url = "/user_items?level_range=" + input_data
|
target_url = "/user_items?level_range=" + $('#filter-input').val() + "&item_state=" + getSrsTypeFilters()
|
||||||
$.ajax
|
$.ajax
|
||||||
url: target_url,
|
url: target_url,
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
@ -61,26 +63,10 @@ filterQuestions = () ->
|
|||||||
sessionStorage.setItem('vocabulary_count', e['vocabulary_count'])
|
sessionStorage.setItem('vocabulary_count', e['vocabulary_count'])
|
||||||
updateQuizItemStats()
|
updateQuizItemStats()
|
||||||
refreshQuestion()
|
refreshQuestion()
|
||||||
else
|
|
||||||
sessionStorage.removeItem('user_items')
|
|
||||||
sessionStorage.removeItem('radical_count')
|
|
||||||
sessionStorage.removeItem('kanji_count')
|
|
||||||
sessionStorage.removeItem('vocabulary_count')
|
|
||||||
$.ajax
|
|
||||||
url: "/user_items",
|
|
||||||
dataType: 'json',
|
|
||||||
success: (e) ->
|
|
||||||
sessionStorage.setItem('user_items', JSON.stringify(e['item_list']))
|
|
||||||
sessionStorage.setItem('radical_count', e['radical_count'])
|
|
||||||
sessionStorage.setItem('kanji_count', e['kanji_count'])
|
|
||||||
sessionStorage.setItem('vocabulary_count', e['vocabulary_count'])
|
|
||||||
updateQuizItemStats()
|
|
||||||
refreshQuestion()
|
|
||||||
|
|
||||||
$('#filter-form').submit( (e) ->
|
$('#filter-form').submit( (e) ->
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
filterQuestions()
|
filterQuestions()
|
||||||
refreshQuestion()
|
|
||||||
$('#modal-filter').modal('hide')
|
$('#modal-filter').modal('hide')
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// Generated by CoffeeScript 1.10.0
|
// Generated by CoffeeScript 1.10.0
|
||||||
(function() {
|
(function() {
|
||||||
var filterQuestions, refreshQuestion, updateQuizItemStats;
|
var filterQuestions, getSrsTypeFilters, refreshQuestion, updateQuizItemStats;
|
||||||
|
|
||||||
refreshQuestion = function() {
|
refreshQuestion = function() {
|
||||||
var input_element, items, selection;
|
var input_element, items, selection;
|
||||||
@ -49,15 +49,29 @@
|
|||||||
return $('#total-num').text(parseInt(sessionStorage.getItem('radical_count')) + parseInt(sessionStorage.getItem('kanji_count')) + parseInt(sessionStorage.getItem('vocabulary_count')));
|
return $('#total-num').text(parseInt(sessionStorage.getItem('radical_count')) + parseInt(sessionStorage.getItem('kanji_count')) + parseInt(sessionStorage.getItem('vocabulary_count')));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
getSrsTypeFilters = function() {
|
||||||
|
var s, srs_levels;
|
||||||
|
srs_levels = ['burnedcheck', 'enlightencheck', 'mastercheck', 'gurucheck', 'apprenticecheck'];
|
||||||
|
return ((function() {
|
||||||
|
var i, len, results;
|
||||||
|
results = [];
|
||||||
|
for (i = 0, len = srs_levels.length; i < len; i++) {
|
||||||
|
s = srs_levels[i];
|
||||||
|
if (document.getElementById(s).checked) {
|
||||||
|
results.push(document.getElementById(s).value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
})()).toString();
|
||||||
|
};
|
||||||
|
|
||||||
filterQuestions = function() {
|
filterQuestions = function() {
|
||||||
var input_data, target_url;
|
var target_url;
|
||||||
input_data = $('#filter-input').val();
|
|
||||||
if (input_data) {
|
|
||||||
sessionStorage.removeItem('user_items');
|
sessionStorage.removeItem('user_items');
|
||||||
sessionStorage.removeItem('radical_count');
|
sessionStorage.removeItem('radical_count');
|
||||||
sessionStorage.removeItem('kanji_count');
|
sessionStorage.removeItem('kanji_count');
|
||||||
sessionStorage.removeItem('vocabulary_count');
|
sessionStorage.removeItem('vocabulary_count');
|
||||||
target_url = "/user_items?level_range=" + input_data;
|
target_url = "/user_items?level_range=" + $('#filter-input').val() + "&item_state=" + getSrsTypeFilters();
|
||||||
return $.ajax({
|
return $.ajax({
|
||||||
url: target_url,
|
url: target_url,
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
@ -77,30 +91,11 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
|
||||||
sessionStorage.removeItem('user_items');
|
|
||||||
sessionStorage.removeItem('radical_count');
|
|
||||||
sessionStorage.removeItem('kanji_count');
|
|
||||||
sessionStorage.removeItem('vocabulary_count');
|
|
||||||
return $.ajax({
|
|
||||||
url: "/user_items",
|
|
||||||
dataType: 'json',
|
|
||||||
success: function(e) {
|
|
||||||
sessionStorage.setItem('user_items', JSON.stringify(e['item_list']));
|
|
||||||
sessionStorage.setItem('radical_count', e['radical_count']);
|
|
||||||
sessionStorage.setItem('kanji_count', e['kanji_count']);
|
|
||||||
sessionStorage.setItem('vocabulary_count', e['vocabulary_count']);
|
|
||||||
updateQuizItemStats();
|
|
||||||
return refreshQuestion();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
$('#filter-form').submit(function(e) {
|
$('#filter-form').submit(function(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
filterQuestions();
|
filterQuestions();
|
||||||
refreshQuestion();
|
|
||||||
return $('#modal-filter').modal('hide');
|
return $('#modal-filter').modal('hide');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
{% extends "layout.html" %}
|
{% extends "layout.html" %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
{% set srs_levels = [ ('burned', 'Burned'), ('enlighten', 'Enlightened'), ('master', 'Master'),
|
||||||
|
('guru', 'Guru'), ('apprentice', 'Apprentice') ] -%}
|
||||||
<div class="modal fade" id="modal-filter" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel">
|
<div class="modal fade" id="modal-filter" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel">
|
||||||
<div class="modal-dialog modal-sm">
|
<div class="modal-dialog modal-sm">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
@ -10,6 +12,11 @@
|
|||||||
<form id="filter-form">
|
<form id="filter-form">
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<input type="text" pattern="\d[\d-,]*\d*" class="form-control" id="filter-input" placeholder="e.g. 1-3,5,8">
|
<input type="text" pattern="\d[\d-,]*\d*" class="form-control" id="filter-input" placeholder="e.g. 1-3,5,8">
|
||||||
|
<br />
|
||||||
|
{% for srs_tag, srs_text in srs_levels %}
|
||||||
|
<input type="checkbox" id="{{ srs_tag }}check" name="{{ srs_tag }}" value="{{ srs_tag }}" {% if srs_tag == "burned" %}checked{% endif %}><label for="{{ srs_tag }}check">{{ srs_text }}</label>
|
||||||
|
<br />
|
||||||
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
|
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import json, re
|
import json, re
|
||||||
from flask import Flask, render_template, redirect, url_for, jsonify, flash, request
|
import flask
|
||||||
from flask.ext.login import LoginManager, login_user, login_required, current_user, logout_user, login_fresh
|
from flask.ext.login import LoginManager, login_user, login_required, current_user, logout_user, login_fresh
|
||||||
from flask.ext.sqlalchemy import SQLAlchemy
|
from flask.ext.sqlalchemy import SQLAlchemy
|
||||||
from flask.ext.wtf import Form
|
from flask.ext.wtf import Form
|
||||||
@ -8,7 +8,7 @@ from wtforms import StringField
|
|||||||
from wtforms.validators import DataRequired
|
from wtforms.validators import DataRequired
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = flask.Flask(__name__)
|
||||||
app.config.from_pyfile('config.py')
|
app.config.from_pyfile('config.py')
|
||||||
login_manager = LoginManager()
|
login_manager = LoginManager()
|
||||||
login_manager.init_app(app)
|
login_manager.init_app(app)
|
||||||
@ -100,7 +100,7 @@ def parse_range(input_range):
|
|||||||
result.append(int(item))
|
result.append(int(item))
|
||||||
else:
|
else:
|
||||||
range_ends = item.split('-')
|
range_ends = item.split('-')
|
||||||
result.extend(list(range(range_ends[0], range_ends[1])))
|
result.extend(list(range(int(range_ends[0]), int(range_ends[1]) + 1)))
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
@ -134,9 +134,9 @@ def get_items_with_level_restriction(level_range, item_state):
|
|||||||
items.append({'item_type': 'vocabulary', 'question': item['character'], 'answer': item['kana'],
|
items.append({'item_type': 'vocabulary', 'question': item['character'], 'answer': item['kana'],
|
||||||
'answer_meaning': item['meaning']})
|
'answer_meaning': item['meaning']})
|
||||||
if not items:
|
if not items:
|
||||||
return jsonify(error="No items within these filter parameters")
|
return flask.jsonify(error="No items within these filter parameters")
|
||||||
else:
|
else:
|
||||||
return jsonify(radical_count=radical_count, kanji_count=kanji_count, vocabulary_count=vocabulary_count,
|
return flask.jsonify(radical_count=radical_count, kanji_count=kanji_count, vocabulary_count=vocabulary_count,
|
||||||
item_list=items)
|
item_list=items)
|
||||||
|
|
||||||
|
|
||||||
@ -148,22 +148,22 @@ def load_user(api_key):
|
|||||||
@app.route('/', methods=('GET', 'POST'))
|
@app.route('/', methods=('GET', 'POST'))
|
||||||
def show_home():
|
def show_home():
|
||||||
if current_user.is_authenticated:
|
if current_user.is_authenticated:
|
||||||
return redirect(url_for('show_quiz'))
|
return flask.redirect(flask.url_for('show_quiz'))
|
||||||
form = LoginForm()
|
form = LoginForm()
|
||||||
if form.validate_on_submit():
|
if form.validate_on_submit():
|
||||||
user = User.query.get(str(form.api_key.data))
|
user = User.query.get(str(form.api_key.data))
|
||||||
if user:
|
if user:
|
||||||
login_user(user)
|
login_user(user)
|
||||||
return redirect(url_for('show_quiz'))
|
return flask.redirect(flask.url_for('show_quiz'))
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
new_user = User(str(form.api_key.data))
|
new_user = User(str(form.api_key.data))
|
||||||
login_user(new_user)
|
login_user(new_user)
|
||||||
return redirect(url_for('show_quiz'))
|
return flask.redirect(flask.url_for('show_quiz'))
|
||||||
except ValueError as err:
|
except ValueError as err:
|
||||||
flash(err)
|
flask.flash(err)
|
||||||
return render_template("welcome.html", form=form)
|
return flask.render_template("welcome.html", form=form)
|
||||||
return render_template("welcome.html", form=form)
|
return flask.render_template("welcome.html", form=form)
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@ -171,22 +171,22 @@ def show_home():
|
|||||||
def show_quiz():
|
def show_quiz():
|
||||||
if not login_fresh():
|
if not login_fresh():
|
||||||
if User.query.get(current_user.api_key):
|
if User.query.get(current_user.api_key):
|
||||||
return render_template("quiz.html")
|
return flask.render_template("quiz.html")
|
||||||
else:
|
else:
|
||||||
logout_user()
|
logout_user()
|
||||||
return redirect(url_for('show_home'))
|
return flask.redirect(flask.url_for('show_home'))
|
||||||
return render_template("quiz.html")
|
return flask.render_template("quiz.html")
|
||||||
|
|
||||||
|
|
||||||
@app.route('/user_items')
|
@app.route('/user_items')
|
||||||
@login_required
|
@login_required
|
||||||
def get_items():
|
def get_items():
|
||||||
level_range = list(range(0, 61))
|
level_range = list(range(0, 61))
|
||||||
if request.args.get('level_range'):
|
if flask.request.args.get('level_range') is not '':
|
||||||
level_range = parse_range(request.args.get('level_range'))
|
level_range = parse_range(flask.request.args.get('level_range'))
|
||||||
item_state = ['burned']
|
item_state = ['burned']
|
||||||
if request.args.get('item_state'):
|
if flask.request.args.get('item_state') is not '':
|
||||||
item_state = request.args.get('item_state').split(',')
|
item_state = flask.request.args.get('item_state').split(',')
|
||||||
return get_items_with_level_restriction(level_range, item_state)
|
return get_items_with_level_restriction(level_range, item_state)
|
||||||
|
|
||||||
|
|
||||||
@ -202,16 +202,16 @@ def refresh_api():
|
|||||||
@app.route('/logout')
|
@app.route('/logout')
|
||||||
def logout():
|
def logout():
|
||||||
logout_user()
|
logout_user()
|
||||||
return redirect(url_for('show_home'))
|
return flask.redirect(flask.url_for('show_home'))
|
||||||
|
|
||||||
|
|
||||||
@login_manager.unauthorized_handler
|
@login_manager.unauthorized_handler
|
||||||
def unauthorized():
|
def unauthorized():
|
||||||
return redirect(url_for('show_home'))
|
return flask.redirect(flask.url_for('show_home'))
|
||||||
|
|
||||||
|
|
||||||
def datetime_format(input):
|
def datetime_format(input_data):
|
||||||
return input.strftime("%d %B %Y %I:%M%p")
|
return input_data.strftime("%d %B %Y %I:%M%p")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
Loading…
Reference in New Issue
Block a user