From e1fb10d9c21918891fac9c898200684952b07051 Mon Sep 17 00:00:00 2001 From: Lukas Winkler Date: Fri, 13 Apr 2018 22:53:28 +0200 Subject: [PATCH] way faster random quiz by preshuffling questions --- .gitignore | 1 + models.py | 2 +- server.py | 21 ++++++++++++++++----- shuffle.py | 15 +++++++++++++++ todb.py | 3 +-- utils.py | 11 ++++++++++- web/static/sass/style.scss | 5 +++++ 7 files changed, 49 insertions(+), 9 deletions(-) create mode 100644 shuffle.py diff --git a/.gitignore b/.gitignore index aa8219b..a8103a5 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ config.py web/static/css/ !web/static/css/.gitkeep +count.txt diff --git a/models.py b/models.py index 88e4387..34abf78 100644 --- a/models.py +++ b/models.py @@ -42,7 +42,7 @@ class Question(BaseModel): user = ForeignKeyField(User) site = ForeignKeyField(Site) datetime = DateTimeField() - random = IntegerField() + random = IntegerField(null=True) class Answer(BaseModel): diff --git a/server.py b/server.py index e32f96e..6d70ba9 100644 --- a/server.py +++ b/server.py @@ -1,6 +1,6 @@ import subprocess import time -from random import shuffle +from random import shuffle, randint import sass from flask import render_template, send_from_directory, abort, session, jsonify, make_response, redirect, url_for @@ -33,6 +33,9 @@ limiter = Limiter( headers_enabled=True ) +question_count = utils.load_question_count() + + @app.context_processor def git_hash(): return dict(git_hash=subprocess.check_output(['git', 'rev-parse', '--short', 'HEAD']).decode().strip()) @@ -93,10 +96,18 @@ def quiz(difficulty): if difficulty not in ["easy", "hard"]: return abort(404) time1 = time.time() - question = Question.select(Question, Title, User, Site) \ - .join(Title).switch(Question) \ - .join(User).switch(Question) \ - .join(Site).where((Question.upvotes - Question.downvotes >= 0)).order_by(SQL("RAND()")).limit(1).get() + while True: + random = randint(0, question_count - 1) + print(random) + try: + question = Question.select(Question, Title, User, Site) \ + .join(Title).switch(Question) \ + .join(User).switch(Question) \ + .join(Site).where((Question.upvotes - Question.downvotes >= 0) & (Question.random == random)).get() + except DoesNotExist: + continue + break + if difficulty == "easy": sites = [question.site] query = Site.select().where((Site.last_download.is_null(False)) & (Site.id != question.site.id)) \ diff --git a/shuffle.py b/shuffle.py new file mode 100644 index 0000000..bd4635c --- /dev/null +++ b/shuffle.py @@ -0,0 +1,15 @@ +import utils +from models import * +from extra_data import site_colors + +query = Question.select().order_by(SQL("RAND()")) + +count = query.count() +utils.save_question_count(count) +i = 0 +for question in query: + question.random = i + i += 1 + if i % 50 == 0: + print("{}/{}".format(i, count)) + question.save() diff --git a/todb.py b/todb.py index 183daa7..4f352de 100644 --- a/todb.py +++ b/todb.py @@ -57,8 +57,7 @@ def add_question(site, count=100): title = titles[i] user = users[i] time = datetime.now() - question = Question.create(text=text, title_id=title, user_id=user, site_id=site, datetime=time, - random=utils.rand()) + question = Question.create(text=text, title_id=title, user_id=user, site_id=site, datetime=time) num_answers = random.randint(1, 4) answers = Answer.select().where((Answer.site == site) & (Answer.question.is_null())).limit(num_answers) for answer in answers: diff --git a/utils.py b/utils.py index ec82d6e..ddcea03 100644 --- a/utils.py +++ b/utils.py @@ -130,5 +130,14 @@ def is_light_color(hex): """ https://stackoverflow.com/a/596241 """ r, g, b = hex_to_rgb(hex[1:]) brightness = 0.2126 * r + 0.7152 * g + 0.0722 * b - print(brightness) return brightness > 245 + + +def save_question_count(count): + with open('count.txt', 'w') as f: + f.write(str(count)) + + +def load_question_count(): + with open('count.txt', 'r') as f: + return int(f.readline()) diff --git a/web/static/sass/style.scss b/web/static/sass/style.scss index fa9766a..2085942 100644 --- a/web/static/sass/style.scss +++ b/web/static/sass/style.scss @@ -20,6 +20,11 @@ body { font-size: 15px; color: #111; } +@media (max-width: 40rem){ + .container { + margin: 0 10px; + } +} pre > code { white-space: pre-wrap;