Pagination

This commit is contained in:
AB
2018-12-06 22:17:58 +03:00
parent cc3f2967d6
commit 5ce0e44117
6 changed files with 205 additions and 25 deletions

View File

@ -28,12 +28,6 @@ class DataBase:
sql = "SELECT id FROM word WHERE word = '%s'" % word
return self.execute(sql)[0][0]
'''
def get_memes(self, offset=0):
sql = "SELECT * FROM `meme` ORDER BY rowid DESC "
return self.execute(sql)
'''
def get_user_count(self):
sql = "SELECT count(*) FROM `user`"
return self.execute(sql)[0]
@ -116,6 +110,35 @@ class DataBase:
"""
return self.execute(sql)
def get_words(self, page_number=0, limit=20, search=None):
offset = page_number * limit
if search == None:
sql = """
SELECT max(date(r.date, 'unixepoch')) as 'last seen',
min(date(r.date, 'unixepoch')) as 'first seen',
w.word, count(r.word_id) as count, u.username, w.id
FROM `relations` r
LEFT JOIN `word` w ON w.id = r.word_id
LEFT JOIN `user` u ON u.id = r.user_id
GROUP BY r.word_id
ORDER BY count desc
LIMIT %s OFFSET %s
""" % (limit, offset)
else:
sql = """
SELECT max(date(r.date, 'unixepoch')) as 'last seen',
min(date(r.date, 'unixepoch')) as 'first seen',
w.word, count(r.word_id) as count, u.username, w.id
FROM `relations` r
LEFT JOIN `word` w ON w.id = r.word_id
LEFT JOIN `user` u ON u.id = r.user_id
WHERE w.word like '%%%s%%'
GROUP BY r.word_id
ORDER BY count desc
LIMIT %s OFFSET %s
""" % (search, limit, offset)
return self.execute(sql)
def get_conf_info(self, conf_id):
if not conf_id[1:].isdigit():
return False

View File

@ -69,19 +69,22 @@ def conf():
totals=totals)
@app.route('/words')
@app.route('/words', methods=['GET'])
def words():
totals = {
'users': db.get_user_count(),
'words': db.get_word_count(),
'relations': db.get_relations_count(),
'confs': db.get_confs_count()
}
limit = request.args.get('limit', default=20, type=int)
page_number = request.args.get('page_number', default=1, type=int)
search = request.args.get('search', default="", type=str)
if search != "":
#page_number = 1
words=db.get_words(int(page_number)-1, limit=limit, search=search)
else:
words=db.get_words(int(page_number)-1, limit=limit)
return render_template(
'conf.html',
confs=db.get_confs(),
totals=totals)
'words.html',
words=words,
page_number=int(page_number),
limit=limit,
search=search)
@app.route('/overview/conf/<conf_id>')
@ -210,6 +213,14 @@ def main():
def datetimeformat(value, format='%H:%M / %d-%m-%Y'):
return datetime.datetime.fromtimestamp(value).strftime(format)
@app.template_filter('shortener')
def shortener(word, limit=20):
if len(word) > limit:
word = word[0:limit]+'...'
else:
pass
return word
@app.template_filter('readable_delta')
def readable_delta(from_seconds, until_seconds=None):

View File

@ -12,11 +12,15 @@
<a class="nav-link active" href="/conf">Conferences</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/stat">2ch.hk Stats</a>
<a class="nav-link" href="/words">Words</a>
</li>
<li class="nav-item">
<a class="nav-link disabled" href="#">Disabled</a>
<a class="nav-link" href="/stat">2ch.hk Stats</a>
</li>
<!--
<li class="nav-item">
<a class="nav-link disabled" href="#">Disabled</a>
</li>-->
</ul>
<br>
<div class="row">
@ -56,4 +60,4 @@
{% endblock %}
{% block scripts %}
{{ super() }}
{% endblock %}
{% endblock %}

View File

@ -12,10 +12,10 @@
<a class="nav-link" href="/conf">Conferences</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/stat">2ch.hk Stats</a>
<a class="nav-link" href="/words">Words</a>
</li>
<li class="nav-item">
<a class="nav-link disabled" href="#">Disabled</a>
<a class="nav-link" href="/stat">2ch.hk Stats</a>
</li>
</ul>
<br>

View File

@ -12,10 +12,10 @@
<a class="nav-link" href="/conf">Conferences</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/stat">2ch.hk Stats</a>
<a class="nav-link" href="/words">Words</a>
</li>
<li class="nav-item">
<a class="nav-link disabled" href="#">Disabled</a>
<a class="nav-link" href="/stat">2ch.hk Stats</a>
</li>
</ul>
<br>
@ -46,7 +46,7 @@
<b>First message: </b>{{ user_info.first_date }}<br>
<b>Last message: </b>{{ user_info.last_message }}<br>
<b>Days known: </b>{{ user_info.day_known }}<br>
<b>Word said: </b>{{ user_info.word_count }}<br>
<b>Words said: </b>{{ user_info.word_count }}<br>
<b>Messages sent: </b>{{ user_info.messages }}<br>
<b>Words per day: </b>{{ '%0.2f'| format((user_info.word_count / user_info.day_known)|float) }}<br>
<b>Words per message: </b>~{{ '%0.2f'| format(user_info.avg|float) }}<br>

142
templates/words.html Normal file
View File

@ -0,0 +1,142 @@
{% extends "base.html" %}
{% block head %}
{{ super() }}
{% endblock %}
{% block content %}
{{ super() }}
<ul class="nav nav-pills">
<li class="nav-item">
<a class="nav-link" href="/">Users</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/conf">Conferences</a>
</li>
<li class="nav-item">
<a class="nav-link active" href="/words">Words</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/stat">2ch.hk Stats</a>
</li>
<!--
<li class="nav-item">
<a class="nav-link disabled" href="#">Disabled</a>
</li>-->
</ul>
<br>
<div class="row">
<div class="col-sm">
<form action="/words" method="GET">
<div class="form-row">
<div class="col-sm-5 my-1">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text">Limit</div>
</div>
<input type="number" min="1" max="1000" class="form-control" id='limit' name="limit" value="{{ limit }}">
</div>
</div>
<div class="col-auto my-1">
<button type="submit" class="btn btn-primary"></button>
</div>
</div>
</div>
<div class="col-sm">
<div class="form-row">
<div class="col-auto my-1">
<button type="button" class="btn btn-primary" onclick='scroll_page(parseInt(document.getElementById ( "page_counter" ).value, 10)-1)'>🡄</button>
</div>
<div class="col-sm-3 my-1">
<input type="number" min="1" class="form-control" name="page_number" id="page_counter" value="{{ page_number }}">
</div>
<div class="col-auto my-1">
<button type="button" class="btn btn-primary" onclick='scroll_page(parseInt(document.getElementById ( "page_counter" ).value, 10)+1)'>🡆</button>
</div>
</div>
</div>
<div class="col-sm">
<div class="form-row">
<div class="col-sm-9 my-1">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text">Search</div>
</div>
<input type="text" class="form-control" name="search" value="{{ search }}">
</div>
</div>
<div class="col-auto my-1">
<button type="submit" class="btn btn-primary">🡆</button>
</div>
</div>
</form>
</div>
</div>
<table class="table table-hover table-sm">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Word</th>
<th scope="col">id</th>
<th scope="col">Added</th>
<th scope="col">Last seen</th>
<th scope="col">Said</th>
<th scope="col">Added by</th>
</tr>
</thead>
<tbody>
{% for word in words %}
<tr>
<th scope="row">{{ loop.index + limit * (page_number-1) }}</th>
<td><div class="col-2"><a href="/overview/word/{{word.4}}">{{ word.2|shortener() }}</a></div></td>
<td><a class="badge badge-dark " href="/overview/word/{{word.4}}">{{ word.5 }}</a></td>
<td>{{ word.1 }}</td>
<td>{{ word.0 }}</td>
<td>{{ word.3 }}</td>
<td>{{ word.4 }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<script>
function scroll_page(page) {
location.href = URL_add_parameter(location.href, 'page_number', page);
}
function change_limit(limit) {
location.href = URL_add_parameter(location.href, 'limit', limit);
}
function start_search(word) {
location.href = URL_add_parameter(location.href, 'search', word);
}
function URL_add_parameter(url, param, value) {
var hash = {};
var parser = document.createElement('a');
parser.href = url;
var parameters = parser.search.split(/\?|&/);
for (var i = 0; i < parameters.length; i++) {
if (!parameters[i])
continue;
var ary = parameters[i].split('=');
hash[ary[0]] = ary[1];
}
hash[param] = value;
var list = [];
Object.keys(hash).forEach(function (key) {
list.push(key + '=' + hash[key]);
});
parser.search = '?' + list.join('&');
return parser.href;
}
</script>
{% endblock %}
{% block scripts %}
{{ super() }}
{% endblock %}