From 27b8c40c1cf91320cffdc4b90e40a7ff1cfc80bd Mon Sep 17 00:00:00 2001 From: Marijn Doeve Date: Sat, 23 Nov 2024 22:25:24 +0100 Subject: [PATCH] Add basic quiz functionality --- .idea/.gitignore | 8 + README.md | 5 + tvdt/locale/nl/LC_MESSAGES/django.po | 27 + tvdt/manage.py | 2 +- tvdt/poetry.lock | 171 ++- tvdt/pyproject.toml | 7 + tvdt/quiz/__init__.py | 0 tvdt/quiz/admin.py | 43 + tvdt/quiz/apps.py | 8 + tvdt/quiz/converters.py | 41 + tvdt/quiz/fixtures/krtek.json | 1157 +++++++++++++++++ tvdt/quiz/helpers.py | 8 + tvdt/quiz/locale/nl/LC_MESSAGES/django.po | 122 ++ tvdt/quiz/migrations/0001_initial.py | 311 +++++ ..._season_preregister_candidates_and_more.py | 56 + ...swer_created_alter_givenanswer_question.py | 31 + ...alter_question_unique_together_and_more.py | 29 + tvdt/quiz/migrations/__init__.py | 0 tvdt/quiz/models/__init__.py | 8 + tvdt/quiz/models/answer.py | 23 + tvdt/quiz/models/candidate.py | 48 + tvdt/quiz/models/correction.py | 26 + tvdt/quiz/models/given_answer.py | 29 + tvdt/quiz/models/question.py | 31 + tvdt/quiz/models/quiz.py | 25 + tvdt/quiz/models/quiz_time.py | 15 + tvdt/quiz/models/season.py | 39 + tvdt/quiz/static/quiz/background.png | Bin 0 -> 167449 bytes tvdt/quiz/templates/quiz/base.html | 33 + tvdt/quiz/templates/quiz/enter_name.html | 9 + tvdt/quiz/templates/quiz/question.html | 14 + tvdt/quiz/templates/quiz/select_season.html | 7 + tvdt/quiz/tests.py | 3 + tvdt/quiz/urls.py | 14 + tvdt/quiz/views/__init__.py | 1 + tvdt/quiz/views/enternameview.py | 51 + tvdt/quiz/views/questionview.py | 44 + tvdt/quiz/views/selectseasonview.py | 29 + tvdt/tvdt/settings.py | 40 +- tvdt/tvdt/urls.py | 9 +- 40 files changed, 2471 insertions(+), 53 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 tvdt/locale/nl/LC_MESSAGES/django.po create mode 100644 tvdt/quiz/__init__.py create mode 100644 tvdt/quiz/admin.py create mode 100644 tvdt/quiz/apps.py create mode 100644 tvdt/quiz/converters.py create mode 100644 tvdt/quiz/fixtures/krtek.json create mode 100644 tvdt/quiz/helpers.py create mode 100644 tvdt/quiz/locale/nl/LC_MESSAGES/django.po create mode 100644 tvdt/quiz/migrations/0001_initial.py create mode 100644 tvdt/quiz/migrations/0002_season_preregister_candidates_and_more.py create mode 100644 tvdt/quiz/migrations/0003_givenanswer_created_alter_givenanswer_question.py create mode 100644 tvdt/quiz/migrations/0004_alter_question_unique_together_and_more.py create mode 100644 tvdt/quiz/migrations/__init__.py create mode 100644 tvdt/quiz/models/__init__.py create mode 100644 tvdt/quiz/models/answer.py create mode 100644 tvdt/quiz/models/candidate.py create mode 100644 tvdt/quiz/models/correction.py create mode 100644 tvdt/quiz/models/given_answer.py create mode 100644 tvdt/quiz/models/question.py create mode 100644 tvdt/quiz/models/quiz.py create mode 100644 tvdt/quiz/models/quiz_time.py create mode 100644 tvdt/quiz/models/season.py create mode 100644 tvdt/quiz/static/quiz/background.png create mode 100644 tvdt/quiz/templates/quiz/base.html create mode 100644 tvdt/quiz/templates/quiz/enter_name.html create mode 100644 tvdt/quiz/templates/quiz/question.html create mode 100644 tvdt/quiz/templates/quiz/select_season.html create mode 100644 tvdt/quiz/tests.py create mode 100644 tvdt/quiz/urls.py create mode 100644 tvdt/quiz/views/__init__.py create mode 100644 tvdt/quiz/views/enternameview.py create mode 100644 tvdt/quiz/views/questionview.py create mode 100644 tvdt/quiz/views/selectseasonview.py diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/README.md b/README.md index 4fa4996..2fed854 100644 --- a/README.md +++ b/README.md @@ -37,3 +37,8 @@ meegenomen in de berekening van de slechtste speler. TBD + +## Nice to haves + +- Optie voor antwoord geven in twee klikken (selecteren en volgende). + diff --git a/tvdt/locale/nl/LC_MESSAGES/django.po b/tvdt/locale/nl/LC_MESSAGES/django.po new file mode 100644 index 0000000..310f18b --- /dev/null +++ b/tvdt/locale/nl/LC_MESSAGES/django.po @@ -0,0 +1,27 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-10-20 00:06+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: tvdt/settings.py:109 +msgid "Dutch" +msgstr "Nederlands" + +#: tvdt/settings.py:109 +msgid "English" +msgstr "Engels" diff --git a/tvdt/manage.py b/tvdt/manage.py index 7b2facb..1991df3 100755 --- a/tvdt/manage.py +++ b/tvdt/manage.py @@ -4,7 +4,7 @@ import os import sys -def main(): +def main() -> None: """Run administrative tasks.""" os.environ.setdefault("DJANGO_SETTINGS_MODULE", "tvdt.settings") try: diff --git a/tvdt/poetry.lock b/tvdt/poetry.lock index e8d3812..f3abf74 100644 --- a/tvdt/poetry.lock +++ b/tvdt/poetry.lock @@ -83,15 +83,51 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "crispy-bootstrap5" +version = "2024.10" +description = "Bootstrap5 template pack for django-crispy-forms" +optional = false +python-versions = ">=3.8" +files = [ + {file = "crispy_bootstrap5-2024.10-py3-none-any.whl", hash = "sha256:59e91dac5e45a8c954af3fbcaa6804cd5aef4402f027af2f99a352b096c4016f"}, + {file = "crispy_bootstrap5-2024.10.tar.gz", hash = "sha256:55b442fe675dd95ad280123c7fe464f454186e90b8e5642e751f436c87627c44"}, +] + +[package.dependencies] +django = ">=4.2" +django-crispy-forms = ">=2.3" + +[package.extras] +test = ["pytest", "pytest-django"] + +[[package]] +name = "crispy-tailwind" +version = "1.0.3" +description = "Tailwind CSS for Django Crispy Forms" +optional = false +python-versions = ">=3.8" +files = [ + {file = "crispy-tailwind-1.0.3.tar.gz", hash = "sha256:2bc9f616d406e4b003f25d46fcb0079f1c2522719d97adb107667271d849459a"}, + {file = "crispy_tailwind-1.0.3-py3-none-any.whl", hash = "sha256:31427f66b1c4fd0d6fb040f4197cfb97d104cdbe7641ea2dea940c0057c4db4b"}, +] + +[package.dependencies] +django = ">=4.2" +django-crispy-forms = ">=2.0" + +[package.extras] +test = ["pytest", "pytest-django"] + [[package]] name = "django" -version = "5.1.2" +version = "5.1.3" description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." optional = false python-versions = ">=3.10" files = [ - {file = "Django-5.1.2-py3-none-any.whl", hash = "sha256:f11aa87ad8d5617171e3f77e1d5d16f004b79a2cf5d2e1d2b97a6a1f8e9ba5ed"}, - {file = "Django-5.1.2.tar.gz", hash = "sha256:bd7376f90c99f96b643722eee676498706c9fd7dc759f55ebfaf2c08ebcdf4f0"}, + {file = "Django-5.1.3-py3-none-any.whl", hash = "sha256:8b38a9a12da3ae00cb0ba72da985ec4b14de6345046b1e174b1fd7254398f818"}, + {file = "Django-5.1.3.tar.gz", hash = "sha256:c0fa0e619c39325a169208caef234f90baa925227032ad3f44842ba14d75234a"}, ] [package.dependencies] @@ -103,39 +139,74 @@ tzdata = {version = "*", markers = "sys_platform == \"win32\""} argon2 = ["argon2-cffi (>=19.1.0)"] bcrypt = ["bcrypt"] +[[package]] +name = "django-allauth" +version = "65.2.0" +description = "Integrated set of Django applications addressing authentication, registration, account management as well as 3rd party (social) account authentication." +optional = false +python-versions = ">=3.8" +files = [ + {file = "django_allauth-65.2.0.tar.gz", hash = "sha256:0a3d7baf7beefd6fe8027316302c26ece7433cf4331a3b245d15fc9a7be68b6f"}, +] + +[package.dependencies] +asgiref = ">=3.8.1" +Django = ">=4.2.16" + +[package.extras] +mfa = ["fido2 (>=1.1.2)", "qrcode (>=7.0.0)"] +openid = ["python3-openid (>=3.0.8)"] +saml = ["python3-saml (>=1.15.0,<2.0.0)"] +socialaccount = ["pyjwt[crypto] (>=1.7)", "requests (>=2.0.0)", "requests-oauthlib (>=0.3.0)"] +steam = ["python3-openid (>=3.0.8)"] + +[[package]] +name = "django-crispy-forms" +version = "2.3" +description = "Best way to have Django DRY forms" +optional = false +python-versions = ">=3.8" +files = [ + {file = "django_crispy_forms-2.3-py3-none-any.whl", hash = "sha256:efc4c31e5202bbec6af70d383a35e12fc80ea769d464fb0e7fe21768bb138a20"}, + {file = "django_crispy_forms-2.3.tar.gz", hash = "sha256:2db17ae08527201be1273f0df789e5f92819e23dd28fec69cffba7f3762e1a38"}, +] + +[package.dependencies] +django = ">=4.2" + [[package]] name = "django-stubs" -version = "5.1.0" +version = "5.1.1" description = "Mypy stubs for Django" optional = false python-versions = ">=3.8" files = [ - {file = "django_stubs-5.1.0-py3-none-any.whl", hash = "sha256:b98d49a80aa4adf1433a97407102d068de26c739c405431d93faad96dd282c40"}, - {file = "django_stubs-5.1.0.tar.gz", hash = "sha256:86128c228b65e6c9a85e5dc56eb1c6f41125917dae0e21e6cfecdf1b27e630c5"}, + {file = "django_stubs-5.1.1-py3-none-any.whl", hash = "sha256:c4dc64260bd72e6d32b9e536e8dd0d9247922f0271f82d1d5132a18f24b388ac"}, + {file = "django_stubs-5.1.1.tar.gz", hash = "sha256:126d354bbdff4906c4e93e6361197f6fbfb6231c3df6def85a291dae6f9f577b"}, ] [package.dependencies] asgiref = "*" django = "*" -django-stubs-ext = ">=5.1.0" -mypy = {version = ">=1.11.0,<1.12.0", optional = true, markers = "extra == \"compatible-mypy\""} +django-stubs-ext = ">=5.1.1" +mypy = {version = ">=1.12,<1.14", optional = true, markers = "extra == \"compatible-mypy\""} types-PyYAML = "*" typing-extensions = ">=4.11.0" [package.extras] -compatible-mypy = ["mypy (>=1.11.0,<1.12.0)"] +compatible-mypy = ["mypy (>=1.12,<1.14)"] oracle = ["oracledb"] redis = ["redis"] [[package]] name = "django-stubs-ext" -version = "5.1.0" +version = "5.1.1" description = "Monkey-patching and extensions for django-stubs" optional = false python-versions = ">=3.8" files = [ - {file = "django_stubs_ext-5.1.0-py3-none-any.whl", hash = "sha256:a455fc222c90b30b29ad8c53319559f5b54a99b4197205ddbb385aede03b395d"}, - {file = "django_stubs_ext-5.1.0.tar.gz", hash = "sha256:ed7d51c0b731651879fc75f331fb0806d98b67bfab464e96e2724db6b46ef926"}, + {file = "django_stubs_ext-5.1.1-py3-none-any.whl", hash = "sha256:3907f99e178c93323e2ce908aef8352adb8c047605161f8d9e5e7b4efb5a6a9c"}, + {file = "django_stubs_ext-5.1.1.tar.gz", hash = "sha256:db7364e4f50ae7e5360993dbd58a3a57ea4b2e7e5bab0fbd525ccdb3e7975d1c"}, ] [package.dependencies] @@ -158,38 +229,43 @@ colors = ["colorama (>=0.4.6)"] [[package]] name = "mypy" -version = "1.11.2" +version = "1.13.0" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.11.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d42a6dd818ffce7be66cce644f1dff482f1d97c53ca70908dff0b9ddc120b77a"}, - {file = "mypy-1.11.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:801780c56d1cdb896eacd5619a83e427ce436d86a3bdf9112527f24a66618fef"}, - {file = "mypy-1.11.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41ea707d036a5307ac674ea172875f40c9d55c5394f888b168033177fce47383"}, - {file = "mypy-1.11.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6e658bd2d20565ea86da7d91331b0eed6d2eee22dc031579e6297f3e12c758c8"}, - {file = "mypy-1.11.2-cp310-cp310-win_amd64.whl", hash = "sha256:478db5f5036817fe45adb7332d927daa62417159d49783041338921dcf646fc7"}, - {file = "mypy-1.11.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75746e06d5fa1e91bfd5432448d00d34593b52e7e91a187d981d08d1f33d4385"}, - {file = "mypy-1.11.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a976775ab2256aadc6add633d44f100a2517d2388906ec4f13231fafbb0eccca"}, - {file = "mypy-1.11.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd953f221ac1379050a8a646585a29574488974f79d8082cedef62744f0a0104"}, - {file = "mypy-1.11.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:57555a7715c0a34421013144a33d280e73c08df70f3a18a552938587ce9274f4"}, - {file = "mypy-1.11.2-cp311-cp311-win_amd64.whl", hash = "sha256:36383a4fcbad95f2657642a07ba22ff797de26277158f1cc7bd234821468b1b6"}, - {file = "mypy-1.11.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e8960dbbbf36906c5c0b7f4fbf2f0c7ffb20f4898e6a879fcf56a41a08b0d318"}, - {file = "mypy-1.11.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:06d26c277962f3fb50e13044674aa10553981ae514288cb7d0a738f495550b36"}, - {file = "mypy-1.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e7184632d89d677973a14d00ae4d03214c8bc301ceefcdaf5c474866814c987"}, - {file = "mypy-1.11.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3a66169b92452f72117e2da3a576087025449018afc2d8e9bfe5ffab865709ca"}, - {file = "mypy-1.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:969ea3ef09617aff826885a22ece0ddef69d95852cdad2f60c8bb06bf1f71f70"}, - {file = "mypy-1.11.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:37c7fa6121c1cdfcaac97ce3d3b5588e847aa79b580c1e922bb5d5d2902df19b"}, - {file = "mypy-1.11.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4a8a53bc3ffbd161b5b2a4fff2f0f1e23a33b0168f1c0778ec70e1a3d66deb86"}, - {file = "mypy-1.11.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ff93107f01968ed834f4256bc1fc4475e2fecf6c661260066a985b52741ddce"}, - {file = "mypy-1.11.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:edb91dded4df17eae4537668b23f0ff6baf3707683734b6a818d5b9d0c0c31a1"}, - {file = "mypy-1.11.2-cp38-cp38-win_amd64.whl", hash = "sha256:ee23de8530d99b6db0573c4ef4bd8f39a2a6f9b60655bf7a1357e585a3486f2b"}, - {file = "mypy-1.11.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:801ca29f43d5acce85f8e999b1e431fb479cb02d0e11deb7d2abb56bdaf24fd6"}, - {file = "mypy-1.11.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af8d155170fcf87a2afb55b35dc1a0ac21df4431e7d96717621962e4b9192e70"}, - {file = "mypy-1.11.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7821776e5c4286b6a13138cc935e2e9b6fde05e081bdebf5cdb2bb97c9df81d"}, - {file = "mypy-1.11.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:539c570477a96a4e6fb718b8d5c3e0c0eba1f485df13f86d2970c91f0673148d"}, - {file = "mypy-1.11.2-cp39-cp39-win_amd64.whl", hash = "sha256:3f14cd3d386ac4d05c5a39a51b84387403dadbd936e17cb35882134d4f8f0d24"}, - {file = "mypy-1.11.2-py3-none-any.whl", hash = "sha256:b499bc07dbdcd3de92b0a8b29fdf592c111276f6a12fe29c30f6c417dd546d12"}, - {file = "mypy-1.11.2.tar.gz", hash = "sha256:7f9993ad3e0ffdc95c2a14b66dee63729f021968bff8ad911867579c65d13a79"}, + {file = "mypy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6607e0f1dd1fb7f0aca14d936d13fd19eba5e17e1cd2a14f808fa5f8f6d8f60a"}, + {file = "mypy-1.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a21be69bd26fa81b1f80a61ee7ab05b076c674d9b18fb56239d72e21d9f4c80"}, + {file = "mypy-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b2353a44d2179846a096e25691d54d59904559f4232519d420d64da6828a3a7"}, + {file = "mypy-1.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0730d1c6a2739d4511dc4253f8274cdd140c55c32dfb0a4cf8b7a43f40abfa6f"}, + {file = "mypy-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:c5fc54dbb712ff5e5a0fca797e6e0aa25726c7e72c6a5850cfd2adbc1eb0a372"}, + {file = "mypy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d"}, + {file = "mypy-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d"}, + {file = "mypy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b"}, + {file = "mypy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73"}, + {file = "mypy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca"}, + {file = "mypy-1.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5"}, + {file = "mypy-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e"}, + {file = "mypy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2"}, + {file = "mypy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0"}, + {file = "mypy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2"}, + {file = "mypy-1.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7"}, + {file = "mypy-1.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62"}, + {file = "mypy-1.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8"}, + {file = "mypy-1.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7"}, + {file = "mypy-1.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc"}, + {file = "mypy-1.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:100fac22ce82925f676a734af0db922ecfea991e1d7ec0ceb1e115ebe501301a"}, + {file = "mypy-1.13.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bcb0bb7f42a978bb323a7c88f1081d1b5dee77ca86f4100735a6f541299d8fb"}, + {file = "mypy-1.13.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bde31fc887c213e223bbfc34328070996061b0833b0a4cfec53745ed61f3519b"}, + {file = "mypy-1.13.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07de989f89786f62b937851295ed62e51774722e5444a27cecca993fc3f9cd74"}, + {file = "mypy-1.13.0-cp38-cp38-win_amd64.whl", hash = "sha256:4bde84334fbe19bad704b3f5b78c4abd35ff1026f8ba72b29de70dda0916beb6"}, + {file = "mypy-1.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0246bcb1b5de7f08f2826451abd947bf656945209b140d16ed317f65a17dc7dc"}, + {file = "mypy-1.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f5b7deae912cf8b77e990b9280f170381fdfbddf61b4ef80927edd813163732"}, + {file = "mypy-1.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7029881ec6ffb8bc233a4fa364736789582c738217b133f1b55967115288a2bc"}, + {file = "mypy-1.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3e38b980e5681f28f033f3be86b099a247b13c491f14bb8b1e1e134d23bb599d"}, + {file = "mypy-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:a6789be98a2017c912ae6ccb77ea553bbaf13d27605d2ca20a76dfbced631b24"}, + {file = "mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a"}, + {file = "mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e"}, ] [package.dependencies] @@ -198,6 +274,7 @@ typing-extensions = ">=4.6.0" [package.extras] dmypy = ["psutil (>=4.0)"] +faster-cache = ["orjson"] install-types = ["pip"] mypyc = ["setuptools (>=50)"] reports = ["lxml"] @@ -215,13 +292,13 @@ files = [ [[package]] name = "packaging" -version = "24.1" +version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, - {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] [[package]] @@ -253,13 +330,13 @@ type = ["mypy (>=1.11.2)"] [[package]] name = "sqlparse" -version = "0.5.1" +version = "0.5.2" description = "A non-validating SQL parser." optional = false python-versions = ">=3.8" files = [ - {file = "sqlparse-0.5.1-py3-none-any.whl", hash = "sha256:773dcbf9a5ab44a090f3441e2180efe2560220203dc2f8c0b0fa141e18b505e4"}, - {file = "sqlparse-0.5.1.tar.gz", hash = "sha256:bb6b4df465655ef332548e24f08e205afc81b9ab86cb1c45657a7ff173a3a00e"}, + {file = "sqlparse-0.5.2-py3-none-any.whl", hash = "sha256:e99bc85c78160918c3e1d9230834ab8d80fc06c59d03f8db2618f65f65dda55e"}, + {file = "sqlparse-0.5.2.tar.gz", hash = "sha256:9e37b35e16d1cc652a2545f0997c1deb23ea28fa1f3eefe609eee3063c3b105f"}, ] [package.extras] @@ -302,4 +379,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.12" -content-hash = "45eb74e8d8826f72371f13c7696dafb1aaebe2a63097f393341d32bec0e7db4e" +content-hash = "95199cfe52c42cc9e58c63f0f09684bff9a129c583fbbeb74e9c2ffa9c531813" diff --git a/tvdt/pyproject.toml b/tvdt/pyproject.toml index e748a01..c1539fc 100644 --- a/tvdt/pyproject.toml +++ b/tvdt/pyproject.toml @@ -5,6 +5,10 @@ package-mode = false [tool.poetry.dependencies] python = "^3.12" Django = "^5.1.2" +django-crispy-forms = "^2.3" +crispy-tailwind = "^1.0.3" +crispy-bootstrap5 = "^2024.10" +django-allauth = "^65.1.0" [tool.poetry.group.dev.dependencies] mypy = "^1.11.0" @@ -12,6 +16,9 @@ black = "^24.10.0" isort = "^5.13.2" django-stubs = {extras = ["compatible-mypy"], version = "^5.1.0"} +[tool.isort] +profile = "black" + [tool.mypy] plugins = ["mypy_django_plugin.main"] diff --git a/tvdt/quiz/__init__.py b/tvdt/quiz/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tvdt/quiz/admin.py b/tvdt/quiz/admin.py new file mode 100644 index 0000000..2fc25b1 --- /dev/null +++ b/tvdt/quiz/admin.py @@ -0,0 +1,43 @@ +from django.contrib import admin + +from .models import Question, Answer, Candidate, Quiz, Season, GivenAnswer + + +class CandidatesAdmin(admin.StackedInline): + model = Candidate + extra = 1 + + +@admin.register(Season) +class SeasonAdmin(admin.ModelAdmin): + inlines = [CandidatesAdmin] + + +class QuestionInline(admin.TabularInline): + model = Question + extra = 0 + + +@admin.register(Quiz) +class QuizAdmin(admin.ModelAdmin): + inlines = [QuestionInline] + + +class AnswerInline(admin.TabularInline): + model = Answer + extra = 0 + + +@admin.register(Question) +class QuestionAdmin(admin.ModelAdmin): + inlines = [AnswerInline] + + +@admin.register(Candidate) +class CandidateAdmin(admin.ModelAdmin): + pass + + +@admin.register(GivenAnswer) +class GivenAnswerAdmin(admin.ModelAdmin): + pass diff --git a/tvdt/quiz/apps.py b/tvdt/quiz/apps.py new file mode 100644 index 0000000..59730f9 --- /dev/null +++ b/tvdt/quiz/apps.py @@ -0,0 +1,8 @@ +from django.apps import AppConfig +from django.utils.translation import gettext_lazy as _ + + +class QuizConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "quiz" + verbose_name = _("quiz") diff --git a/tvdt/quiz/converters.py b/tvdt/quiz/converters.py new file mode 100644 index 0000000..531e9bc --- /dev/null +++ b/tvdt/quiz/converters.py @@ -0,0 +1,41 @@ +import base64 +import binascii + +from .models import Season, Candidate + + +class SeasonCodeConverter: + regex = r"[A-Za-z\d]{5}" + + def to_python(self, value: str) -> Season: + try: + return Season.objects.get(season_code=value.upper()) + except Season.DoesNotExist: + raise ValueError + + def to_url(self, value: Season) -> str: + return value.season_code + + +class CandidateConverter: + regex = r"[A-Za-z\d]{5}\/[\w\-=]+" + + def to_python(self, value: str) -> Candidate: + season_code, base64_name = value.split("/") + + try: + name = base64.urlsafe_b64decode(base64_name).decode() + except binascii.Error: + raise ValueError + + try: + season = Season.objects.get(season_code=season_code) + + candidate = Candidate.objects.get(name=name, season=season) + return candidate + except [Season.DoesNotExist, Candidate.DoesNotExist]: + raise ValueError + + def to_url(self, candidate: Candidate) -> str: + base64_candidate = base64.urlsafe_b64encode(candidate.name.encode()).decode() + return f"{candidate.season.season_code}/{base64_candidate}" diff --git a/tvdt/quiz/fixtures/krtek.json b/tvdt/quiz/fixtures/krtek.json new file mode 100644 index 0000000..c705540 --- /dev/null +++ b/tvdt/quiz/fixtures/krtek.json @@ -0,0 +1,1157 @@ +[ +{ + "model": "quiz.answer", + "pk": 1, + "fields": { + "text": "Man", + "question": 1, + "is_right_answer": false, + "_order": 0, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 2, + "fields": { + "text": "Vrouw", + "question": 1, + "is_right_answer": true, + "_order": 1, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 3, + "fields": { + "text": "Geen", + "question": 2, + "is_right_answer": true, + "_order": 0, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 4, + "fields": { + "text": "1", + "question": 2, + "is_right_answer": false, + "_order": 1, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 5, + "fields": { + "text": "2", + "question": 2, + "is_right_answer": false, + "_order": 2, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 6, + "fields": { + "text": "Geen", + "question": 3, + "is_right_answer": false, + "_order": 0, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 7, + "fields": { + "text": "Diens eigen verjaardag", + "question": 3, + "is_right_answer": false, + "_order": 1, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 8, + "fields": { + "text": "Koningsdag", + "question": 3, + "is_right_answer": false, + "_order": 2, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 9, + "fields": { + "text": "Kerst", + "question": 3, + "is_right_answer": true, + "_order": 3, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 10, + "fields": { + "text": "Oud en nieuw", + "question": 3, + "is_right_answer": false, + "_order": 4, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 11, + "fields": { + "text": "Met de auto", + "question": 4, + "is_right_answer": false, + "_order": 0, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 12, + "fields": { + "text": "Met het OV", + "question": 4, + "is_right_answer": true, + "_order": 1, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 13, + "fields": { + "text": "Claudia", + "question": 5, + "is_right_answer": false, + "_order": 0, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 14, + "fields": { + "text": "Eelco", + "question": 5, + "is_right_answer": false, + "_order": 1, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 15, + "fields": { + "text": "Elise", + "question": 5, + "is_right_answer": false, + "_order": 2, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 16, + "fields": { + "text": "Gert-Jan", + "question": 5, + "is_right_answer": false, + "_order": 3, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 17, + "fields": { + "text": "Iris", + "question": 5, + "is_right_answer": false, + "_order": 4, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 18, + "fields": { + "text": "Jari", + "question": 5, + "is_right_answer": false, + "_order": 5, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 19, + "fields": { + "text": "Laura", + "question": 5, + "is_right_answer": false, + "_order": 6, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 20, + "fields": { + "text": "Lotte", + "question": 5, + "is_right_answer": false, + "_order": 7, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 21, + "fields": { + "text": "Myrthe", + "question": 5, + "is_right_answer": false, + "_order": 8, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 22, + "fields": { + "text": "Remy", + "question": 5, + "is_right_answer": false, + "_order": 9, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 23, + "fields": { + "text": "Robbert", + "question": 5, + "is_right_answer": false, + "_order": 10, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 24, + "fields": { + "text": "Tom", + "question": 5, + "is_right_answer": true, + "_order": 11, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 25, + "fields": { + "text": "Geef je vader een knuffel.", + "question": 6, + "is_right_answer": false, + "_order": 0, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 26, + "fields": { + "text": "Trek je wat minder aan van anderen.", + "question": 6, + "is_right_answer": false, + "_order": 1, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 27, + "fields": { + "text": "Luister meer naar je eigen gevoel in plaats van naar wat anderen", + "question": 6, + "is_right_answer": false, + "_order": 2, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 28, + "fields": { + "text": "Stel niet alles tot het laatste moment uit.", + "question": 6, + "is_right_answer": false, + "_order": 3, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 29, + "fields": { + "text": "Altijd doorgaan.", + "question": 6, + "is_right_answer": false, + "_order": 4, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 30, + "fields": { + "text": "Probeer ook eens buiten de lijntjes te kleuren", + "question": 6, + "is_right_answer": true, + "_order": 5, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 31, + "fields": { + "text": "Ga als je groot bent op groepsreis!", + "question": 6, + "is_right_answer": false, + "_order": 6, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 32, + "fields": { + "text": "Trek minder aan van de mening van anderen, het is oké om anders", + "question": 6, + "is_right_answer": false, + "_order": 7, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 33, + "fields": { + "text": "Sneakers", + "question": 7, + "is_right_answer": false, + "_order": 0, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 34, + "fields": { + "text": "Wandel-/bergschoenen", + "question": 7, + "is_right_answer": true, + "_order": 1, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 35, + "fields": { + "text": "Lederen schoenen", + "question": 7, + "is_right_answer": false, + "_order": 2, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 36, + "fields": { + "text": "Pantoffels", + "question": 7, + "is_right_answer": false, + "_order": 3, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 37, + "fields": { + "text": "Hakken", + "question": 7, + "is_right_answer": false, + "_order": 4, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 38, + "fields": { + "text": "Geen schoenen, alleen sokken", + "question": 7, + "is_right_answer": false, + "_order": 5, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 39, + "fields": { + "text": "Fiets", + "question": 8, + "is_right_answer": true, + "_order": 0, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 40, + "fields": { + "text": "Auto", + "question": 8, + "is_right_answer": false, + "_order": 1, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 41, + "fields": { + "text": "Trein", + "question": 8, + "is_right_answer": false, + "_order": 2, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 42, + "fields": { + "text": "Ja", + "question": 9, + "is_right_answer": false, + "_order": 0, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 43, + "fields": { + "text": "Nee", + "question": 9, + "is_right_answer": true, + "_order": 1, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 44, + "fields": { + "text": "Karen", + "question": 10, + "is_right_answer": false, + "_order": 0, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 45, + "fields": { + "text": "Gilles de Coster", + "question": 10, + "is_right_answer": false, + "_order": 1, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 46, + "fields": { + "text": "Kees Tol", + "question": 10, + "is_right_answer": false, + "_order": 2, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 47, + "fields": { + "text": "Harry en John", + "question": 10, + "is_right_answer": false, + "_order": 3, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 48, + "fields": { + "text": "Georgina Verbaan", + "question": 10, + "is_right_answer": false, + "_order": 4, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 49, + "fields": { + "text": "Marc-Marie Huijbregts", + "question": 10, + "is_right_answer": false, + "_order": 5, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 50, + "fields": { + "text": "Fresia Cousiño Arias, Rik van de Westelaken", + "question": 10, + "is_right_answer": false, + "_order": 6, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 51, + "fields": { + "text": "Ellie Lust", + "question": 10, + "is_right_answer": false, + "_order": 7, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 52, + "fields": { + "text": "Bouba", + "question": 10, + "is_right_answer": false, + "_order": 8, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 53, + "fields": { + "text": "Jan Versteegh", + "question": 10, + "is_right_answer": false, + "_order": 9, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 54, + "fields": { + "text": "Dick Jol", + "question": 10, + "is_right_answer": false, + "_order": 10, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 55, + "fields": { + "text": "Karin de Groot", + "question": 10, + "is_right_answer": false, + "_order": 11, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 56, + "fields": { + "text": "Pieter", + "question": 10, + "is_right_answer": false, + "_order": 12, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 57, + "fields": { + "text": "Renée Fokker", + "question": 10, + "is_right_answer": false, + "_order": 13, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 58, + "fields": { + "text": "Sam, Davy", + "question": 10, + "is_right_answer": true, + "_order": 14, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 59, + "fields": { + "text": "Ja", + "question": 11, + "is_right_answer": false, + "_order": 0, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 60, + "fields": { + "text": "Nee", + "question": 11, + "is_right_answer": true, + "_order": 1, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 61, + "fields": { + "text": "Éénpersoons, losstaand bed", + "question": 12, + "is_right_answer": false, + "_order": 0, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 62, + "fields": { + "text": "Éénpersoonsbed, tegen een ander bed aan", + "question": 12, + "is_right_answer": true, + "_order": 1, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 63, + "fields": { + "text": "Tweepersoons bed", + "question": 12, + "is_right_answer": false, + "_order": 2, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 64, + "fields": { + "text": "5", + "question": 13, + "is_right_answer": false, + "_order": 0, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 65, + "fields": { + "text": "6", + "question": 13, + "is_right_answer": true, + "_order": 1, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 66, + "fields": { + "text": "7", + "question": 13, + "is_right_answer": false, + "_order": 2, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 67, + "fields": { + "text": "8", + "question": 13, + "is_right_answer": false, + "_order": 3, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 68, + "fields": { + "text": "Met de rug naar de accommodatie", + "question": 14, + "is_right_answer": false, + "_order": 0, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 69, + "fields": { + "text": "Met de rug naar de buitenmuur", + "question": 14, + "is_right_answer": true, + "_order": 1, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 70, + "fields": { + "text": "Claudia", + "question": 15, + "is_right_answer": true, + "_order": 0, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 71, + "fields": { + "text": "Eelco", + "question": 15, + "is_right_answer": false, + "_order": 1, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 72, + "fields": { + "text": "Elise", + "question": 15, + "is_right_answer": false, + "_order": 2, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 73, + "fields": { + "text": "Gert-Jan", + "question": 15, + "is_right_answer": false, + "_order": 3, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 74, + "fields": { + "text": "Iris", + "question": 15, + "is_right_answer": false, + "_order": 4, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 75, + "fields": { + "text": "Jari", + "question": 15, + "is_right_answer": false, + "_order": 5, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 76, + "fields": { + "text": "Lara", + "question": 15, + "is_right_answer": false, + "_order": 6, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 77, + "fields": { + "text": "Lotte", + "question": 15, + "is_right_answer": false, + "_order": 7, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 78, + "fields": { + "text": "Myrthe", + "question": 15, + "is_right_answer": false, + "_order": 8, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 79, + "fields": { + "text": "Remy", + "question": 15, + "is_right_answer": false, + "_order": 9, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 80, + "fields": { + "text": "Robbert", + "question": 15, + "is_right_answer": false, + "_order": 10, + "candidates": [] + } +}, +{ + "model": "quiz.answer", + "pk": 81, + "fields": { + "text": "Tom", + "question": 15, + "is_right_answer": false, + "_order": 11, + "candidates": [] + } +}, +{ + "model": "quiz.question", + "pk": 1, + "fields": { + "question": "Is de Krtek een man of een vrouw", + "quiz": 1, + "enabled": true, + "_order": 0 + } +}, +{ + "model": "quiz.question", + "pk": 2, + "fields": { + "question": "Hoeveel broers heeft de Krtek?", + "quiz": 1, + "enabled": true, + "_order": 1 + } +}, +{ + "model": "quiz.question", + "pk": 3, + "fields": { + "question": "Wat is de lievelingsfeestdag van de Krtek?", + "quiz": 1, + "enabled": true, + "_order": 2 + } +}, +{ + "model": "quiz.question", + "pk": 4, + "fields": { + "question": "Hoe kwam de Krtek naar Kesteren vandaag?", + "quiz": 1, + "enabled": true, + "_order": 3 + } +}, +{ + "model": "quiz.question", + "pk": 5, + "fields": { + "question": "Met wie keek de Krtek de video bij binnenkomst?", + "quiz": 1, + "enabled": true, + "_order": 4 + } +}, +{ + "model": "quiz.question", + "pk": 6, + "fields": { + "question": "Welk advies zou de Krtek zichzelf als kind geven?", + "quiz": 1, + "enabled": true, + "_order": 5 + } +}, +{ + "model": "quiz.question", + "pk": 7, + "fields": { + "question": "Wat voor soort schoenen droeg de Krtek bij het diner?", + "quiz": 1, + "enabled": true, + "_order": 6 + } +}, +{ + "model": "quiz.question", + "pk": 8, + "fields": { + "question": "Met welk vervoersmiddel reist de Krtek het liefste?", + "quiz": 1, + "enabled": true, + "_order": 7 + } +}, +{ + "model": "quiz.question", + "pk": 9, + "fields": { + "question": "Heeft de Krtek een eigen auto?", + "quiz": 1, + "enabled": true, + "_order": 8 + } +}, +{ + "model": "quiz.question", + "pk": 10, + "fields": { + "question": "Van wie is de quote die de Krtek gepakt heeft", + "quiz": 1, + "enabled": true, + "_order": 9 + } +}, +{ + "model": "quiz.question", + "pk": 11, + "fields": { + "question": "Zou de Krtek molboekjes, jokers, vrijstellingen of topito’s uit iemands rugzak stelen om te kunnen winnen?", + "quiz": 1, + "enabled": true, + "_order": 10 + } +}, +{ + "model": "quiz.question", + "pk": 12, + "fields": { + "question": "In wat voor bed slaapt de Krtek dit weekend?", + "quiz": 1, + "enabled": true, + "_order": 11 + } +}, +{ + "model": "quiz.question", + "pk": 13, + "fields": { + "question": "Hoeveel jaar heeft de Krtek gedaan over de middelbare school?", + "quiz": 1, + "enabled": true, + "_order": 12 + } +}, +{ + "model": "quiz.question", + "pk": 14, + "fields": { + "question": "Waar zat de Krtek aan tafel bij het diner?", + "quiz": 1, + "enabled": true, + "_order": 13 + } +}, +{ + "model": "quiz.question", + "pk": 15, + "fields": { + "question": "Wie is de Krtek", + "quiz": 1, + "enabled": true, + "_order": 14 + } +}, +{ + "model": "quiz.candidate", + "pk": 1, + "fields": { + "season": 1, + "name": "Claudia" + } +}, +{ + "model": "quiz.candidate", + "pk": 2, + "fields": { + "season": 1, + "name": "Eelco" + } +}, +{ + "model": "quiz.candidate", + "pk": 3, + "fields": { + "season": 1, + "name": "Elise" + } +}, +{ + "model": "quiz.candidate", + "pk": 4, + "fields": { + "season": 1, + "name": "Gert-Jan" + } +}, +{ + "model": "quiz.candidate", + "pk": 5, + "fields": { + "season": 1, + "name": "Iris" + } +}, +{ + "model": "quiz.candidate", + "pk": 6, + "fields": { + "season": 1, + "name": "Jari" + } +}, +{ + "model": "quiz.candidate", + "pk": 7, + "fields": { + "season": 1, + "name": "Lara" + } +}, +{ + "model": "quiz.candidate", + "pk": 8, + "fields": { + "season": 1, + "name": "Lotte" + } +}, +{ + "model": "quiz.candidate", + "pk": 9, + "fields": { + "season": 1, + "name": "Myrthe" + } +}, +{ + "model": "quiz.candidate", + "pk": 10, + "fields": { + "season": 1, + "name": "Remy" + } +}, +{ + "model": "quiz.candidate", + "pk": 11, + "fields": { + "season": 1, + "name": "Robbert" + } +}, +{ + "model": "quiz.candidate", + "pk": 12, + "fields": { + "season": 1, + "name": "Tom" + } +}, +{ + "model": "quiz.quiz", + "pk": 1, + "fields": { + "name": "Test 1", + "season": 1 + } +}, +{ + "model": "quiz.season", + "pk": 1, + "fields": { + "name": "Krtek", + "active_quiz": 1, + "season_code": "12345", + "preregister_candidates": true + } +} +] diff --git a/tvdt/quiz/helpers.py b/tvdt/quiz/helpers.py new file mode 100644 index 0000000..10d517e --- /dev/null +++ b/tvdt/quiz/helpers.py @@ -0,0 +1,8 @@ +import random +import string + + +def generate_season_code(length: int = 5) -> str: + return "".join( + random.choice(string.ascii_uppercase + string.digits) for _ in range(length) + ) diff --git a/tvdt/quiz/locale/nl/LC_MESSAGES/django.po b/tvdt/quiz/locale/nl/LC_MESSAGES/django.po new file mode 100644 index 0000000..c0177c4 --- /dev/null +++ b/tvdt/quiz/locale/nl/LC_MESSAGES/django.po @@ -0,0 +1,122 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-10-20 00:23+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: quiz/models/answer.py:10 +msgid "text" +msgstr "tekst" + +#: quiz/models/answer.py:15 quiz/models/given_answer.py:21 +#: quiz/models/question.py:9 quiz/models/question.py:21 +msgid "question" +msgstr "vraag" + +#: quiz/models/answer.py:17 +msgid "is right answer" +msgstr "is goede antwoord" + +#: quiz/models/answer.py:19 quiz/models/candidate.py:25 +msgid "candidates" +msgstr "kandidaten" + +#: quiz/models/answer.py:23 quiz/models/given_answer.py:24 +msgid "answer" +msgstr "antwoord" + +#: quiz/models/answer.py:24 +msgid "answers" +msgstr "antwoorden" + +#: quiz/models/candidate.py:15 quiz/models/quiz.py:9 quiz/models/season.py:12 +msgid "name" +msgstr "naam" + +#: quiz/models/candidate.py:24 quiz/models/correction.py:14 +#: quiz/models/given_answer.py:15 quiz/models/quiz_time.py:11 +msgid "candidate" +msgstr "kandidaat" + +#: quiz/models/correction.py:20 quiz/models/question.py:11 +#: quiz/models/quiz.py:26 quiz/models/quiz_time.py:13 +msgid "quiz" +msgstr "test" + +#: quiz/models/correction.py:25 +msgid "correction" +msgstr "joker" + +#: quiz/models/correction.py:26 +msgid "corrections" +msgstr "jokers" + +#: quiz/models/given_answer.py:30 +msgid "given answer" +msgstr "gegeven antwoord" + +#: quiz/models/given_answer.py:31 +msgid "given answers" +msgstr "gegeven antwoorden" + +#: quiz/models/question.py:13 +msgid "number" +msgstr "nummer" + +#: quiz/models/question.py:14 +msgid "enabled" +msgstr "ingeschakeld" + +#: quiz/models/question.py:22 +msgid "questions" +msgstr "vraag" + +#: quiz/models/quiz.py:14 quiz/models/season.py:38 +msgid "season" +msgstr "seizoen" + +#: quiz/models/quiz.py:27 +msgid "quizzes" +msgstr "tests" + +#: quiz/models/quiz_time.py:14 +msgid "seconds" +msgstr "seconden" + +#: quiz/models/quiz_time.py:17 +msgid "quiz time" +msgstr "testtijd" + +#: quiz/models/quiz_time.py:18 +msgid "quiz times" +msgstr "testtijden" + +#: quiz/models/season.py:19 +msgid "active quiz" +msgstr "actieve test" + +#: quiz/models/season.py:23 +msgid "season code" +msgstr "seizoencode" + +#: quiz/models/season.py:26 +msgid "preregister candidates" +msgstr "kandidaten voorregistreren" + +#: quiz/models/season.py:39 +msgid "seasons" +msgstr "seizoenen" diff --git a/tvdt/quiz/migrations/0001_initial.py b/tvdt/quiz/migrations/0001_initial.py new file mode 100644 index 0000000..98915f7 --- /dev/null +++ b/tvdt/quiz/migrations/0001_initial.py @@ -0,0 +1,311 @@ +# Generated by Django 5.1.2 on 2024-10-19 21:54 + +import django.db.models.deletion +import quiz.helpers +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [] + + operations = [ + migrations.CreateModel( + name="Candidate", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=16, verbose_name="naam")), + ], + options={ + "verbose_name": "candidate", + "verbose_name_plural": "candidates", + }, + ), + migrations.CreateModel( + name="Question", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("question", models.CharField(max_length=256, verbose_name="question")), + ("number", models.PositiveSmallIntegerField(verbose_name="number")), + ("enabled", models.BooleanField(default=True, verbose_name="enabled")), + ], + options={ + "verbose_name": "question", + "verbose_name_plural": "questions", + }, + ), + migrations.CreateModel( + name="Quiz", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=64, verbose_name="naam")), + ], + options={ + "verbose_name": "quiz", + "verbose_name_plural": "quizzes", + }, + ), + migrations.CreateModel( + name="Answer", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("text", models.CharField(max_length=64, verbose_name="text")), + ( + "is_right_answer", + models.BooleanField(verbose_name="is right answer"), + ), + ( + "candidates", + models.ManyToManyField( + to="quiz.candidate", verbose_name="candidates" + ), + ), + ( + "question", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="answers", + to="quiz.question", + verbose_name="question", + ), + ), + ], + options={ + "verbose_name": "answer", + "verbose_name_plural": "answers", + }, + ), + migrations.AddField( + model_name="question", + name="quiz", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="questions", + to="quiz.quiz", + verbose_name="quiz", + ), + ), + migrations.CreateModel( + name="QuizTime", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("seconds", models.PositiveIntegerField(verbose_name="seconds")), + ( + "candidate", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="quiz.candidate", + verbose_name="candidate", + ), + ), + ( + "quiz", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="quiz.quiz", + verbose_name="quiz", + ), + ), + ], + options={ + "verbose_name": "quiz time", + "verbose_name_plural": "quiz times", + }, + ), + migrations.CreateModel( + name="Season", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=64, verbose_name="naam")), + ( + "season_code", + models.CharField( + default=quiz.helpers.generate_season_code, + max_length=5, + verbose_name="season code", + ), + ), + ( + "active_quiz", + models.ForeignKey( + default=None, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to="quiz.quiz", + verbose_name="active quiz", + ), + ), + ], + options={ + "verbose_name": "season", + "verbose_name_plural": "seasons", + }, + ), + migrations.AddField( + model_name="quiz", + name="season", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="quizzes", + to="quiz.season", + verbose_name="season", + ), + ), + migrations.AddField( + model_name="candidate", + name="season", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="candidates", + to="quiz.season", + verbose_name="season", + ), + ), + migrations.CreateModel( + name="GivenAnswer", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "answer", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="quiz.answer", + verbose_name="answer", + ), + ), + ( + "candidate", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="answers", + to="quiz.candidate", + verbose_name="candidate", + ), + ), + ( + "question", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="given_answers", + to="quiz.question", + verbose_name="question", + ), + ), + ], + options={ + "verbose_name": "given answer", + "verbose_name_plural": "given answers", + "unique_together": {("candidate", "question")}, + }, + ), + migrations.AlterUniqueTogether( + name="question", + unique_together={("quiz", "number")}, + ), + migrations.CreateModel( + name="Correction", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "candidate", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="corrections_used", + to="quiz.candidate", + verbose_name="candidate", + ), + ), + ( + "quiz", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="corrections_used", + to="quiz.quiz", + verbose_name="quiz", + ), + ), + ], + options={ + "verbose_name": "correction", + "verbose_name_plural": "corrections", + "unique_together": {("candidate", "quiz")}, + }, + ), + migrations.AddIndex( + model_name="candidate", + index=models.Index( + fields=["season", "name"], name="quiz_candid_season__d83118_idx" + ), + ), + migrations.AlterUniqueTogether( + name="candidate", + unique_together={("season", "name")}, + ), + ] diff --git a/tvdt/quiz/migrations/0002_season_preregister_candidates_and_more.py b/tvdt/quiz/migrations/0002_season_preregister_candidates_and_more.py new file mode 100644 index 0000000..5f6e76b --- /dev/null +++ b/tvdt/quiz/migrations/0002_season_preregister_candidates_and_more.py @@ -0,0 +1,56 @@ +# Generated by Django 5.1.2 on 2024-10-19 22:17 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("quiz", "0001_initial"), + ] + + operations = [ + migrations.AddField( + model_name="season", + name="preregister_candidates", + field=models.BooleanField( + default=True, verbose_name="preregister candidates" + ), + ), + migrations.AlterField( + model_name="answer", + name="candidates", + field=models.ManyToManyField( + blank=True, to="quiz.candidate", verbose_name="candidates" + ), + ), + migrations.AlterField( + model_name="candidate", + name="name", + field=models.CharField(max_length=16, verbose_name="name"), + ), + migrations.AlterField( + model_name="quiz", + name="name", + field=models.CharField(max_length=64, verbose_name="name"), + ), + migrations.AlterField( + model_name="season", + name="active_quiz", + field=models.ForeignKey( + blank=True, + default=None, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to="quiz.quiz", + verbose_name="active quiz", + ), + ), + migrations.AlterField( + model_name="season", + name="name", + field=models.CharField(max_length=64, verbose_name="name"), + ), + ] diff --git a/tvdt/quiz/migrations/0003_givenanswer_created_alter_givenanswer_question.py b/tvdt/quiz/migrations/0003_givenanswer_created_alter_givenanswer_question.py new file mode 100644 index 0000000..1473ea5 --- /dev/null +++ b/tvdt/quiz/migrations/0003_givenanswer_created_alter_givenanswer_question.py @@ -0,0 +1,31 @@ +# Generated by Django 5.1.2 on 2024-11-03 19:21 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("quiz", "0002_season_preregister_candidates_and_more"), + ] + + operations = [ + migrations.AddField( + model_name="givenanswer", + name="created", + field=models.DateTimeField(auto_now_add=True, default=None), + preserve_default=False, + ), + migrations.AlterField( + model_name="givenanswer", + name="question", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="given_answers", + to="quiz.question", + verbose_name="question", + ), + ), + ] diff --git a/tvdt/quiz/migrations/0004_alter_question_unique_together_and_more.py b/tvdt/quiz/migrations/0004_alter_question_unique_together_and_more.py new file mode 100644 index 0000000..969f4f4 --- /dev/null +++ b/tvdt/quiz/migrations/0004_alter_question_unique_together_and_more.py @@ -0,0 +1,29 @@ +# Generated by Django 5.1.3 on 2024-11-23 16:15 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("quiz", "0003_givenanswer_created_alter_givenanswer_question"), + ] + + operations = [ + migrations.AlterUniqueTogether( + name="question", + unique_together=set(), + ), + migrations.AlterOrderWithRespectTo( + name="question", + order_with_respect_to="quiz", + ), + migrations.AlterOrderWithRespectTo( + name="answer", + order_with_respect_to="question", + ), + migrations.RemoveField( + model_name="question", + name="number", + ), + ] diff --git a/tvdt/quiz/migrations/__init__.py b/tvdt/quiz/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tvdt/quiz/models/__init__.py b/tvdt/quiz/models/__init__.py new file mode 100644 index 0000000..d35b3c4 --- /dev/null +++ b/tvdt/quiz/models/__init__.py @@ -0,0 +1,8 @@ +from .answer import Answer +from .candidate import Candidate +from .correction import Correction +from .given_answer import GivenAnswer +from .question import Question +from .quiz import Quiz +from .quiz_time import QuizTime +from .season import Season diff --git a/tvdt/quiz/models/answer.py b/tvdt/quiz/models/answer.py new file mode 100644 index 0000000..f92af4f --- /dev/null +++ b/tvdt/quiz/models/answer.py @@ -0,0 +1,23 @@ +from django.db import models +from django.utils.translation import gettext_lazy as _ +from django_stubs_ext.db.models import TypedModelMeta + + +class Answer(models.Model): + text = models.CharField(max_length=64, verbose_name=_("text")) + question = models.ForeignKey( + "Question", + on_delete=models.CASCADE, + related_name="answers", + verbose_name=_("question"), + ) + is_right_answer = models.BooleanField(verbose_name=_("is right answer")) + candidates = models.ManyToManyField( + "Candidate", verbose_name=_("candidates"), blank=True + ) + + class Meta(TypedModelMeta): + verbose_name = _("answer") + verbose_name_plural = _("answers") + + order_with_respect_to = "question" diff --git a/tvdt/quiz/models/candidate.py b/tvdt/quiz/models/candidate.py new file mode 100644 index 0000000..faee14c --- /dev/null +++ b/tvdt/quiz/models/candidate.py @@ -0,0 +1,48 @@ +from typing import Self + +from django.db import models +from django.utils.translation import gettext_lazy as _ +from django_stubs_ext.db.models import TypedModelMeta + +from .given_answer import GivenAnswer +from .question import NoActiveTestForSeason, QuizAlreadyFinished, Question + + +class Candidate(models.Model): + season = models.ForeignKey( + "Season", + on_delete=models.CASCADE, + related_name="candidates", + verbose_name="season", + ) + name = models.CharField(max_length=16, verbose_name=_("name")) + + def get_next_question(self, candidate: Self) -> "Question": + quiz = candidate.season.active_quiz + if quiz is None: + raise NoActiveTestForSeason() + + question = ( + Question.objects.filter(quiz=quiz) + .exclude( + id__in=GivenAnswer.objects.filter( + candidate=candidate, question__quiz=quiz + ).values_list("question_id", flat=True) + ) + .first() + ) + + if question is None: + raise QuizAlreadyFinished() + + return question + + def __str__(self) -> str: + return f"{self.name} ({self.season})" + + class Meta(TypedModelMeta): + unique_together = ["season", "name"] + indexes = [models.Index(fields=["season", "name"])] + + verbose_name = _("candidate") + verbose_name_plural = _("candidates") diff --git a/tvdt/quiz/models/correction.py b/tvdt/quiz/models/correction.py new file mode 100644 index 0000000..07cb610 --- /dev/null +++ b/tvdt/quiz/models/correction.py @@ -0,0 +1,26 @@ +from django.db import models +from django.utils.translation import gettext_lazy as _ +from django_stubs_ext.db.models import TypedModelMeta + +from .candidate import Candidate +from .quiz import Quiz + + +class Correction(models.Model): + candidate = models.ForeignKey( + "Candidate", + on_delete=models.CASCADE, + related_name="corrections_used", + verbose_name=_("candidate"), + ) + quiz = models.ForeignKey( + "Quiz", + on_delete=models.CASCADE, + related_name="corrections_used", + verbose_name=_("quiz"), + ) + + class Meta(TypedModelMeta): + unique_together = ("candidate", "quiz") + verbose_name = _("correction") + verbose_name_plural = _("corrections") diff --git a/tvdt/quiz/models/given_answer.py b/tvdt/quiz/models/given_answer.py new file mode 100644 index 0000000..dbe98a0 --- /dev/null +++ b/tvdt/quiz/models/given_answer.py @@ -0,0 +1,29 @@ +from django.db import models +from django.utils.translation import gettext_lazy as _ +from django_stubs_ext.db.models import TypedModelMeta + + +class GivenAnswer(models.Model): + candidate = models.ForeignKey( + "Candidate", + on_delete=models.CASCADE, + related_name="answers", + verbose_name=_("candidate"), + ) + question = models.ForeignKey( + "Question", + on_delete=models.CASCADE, + null=True, + related_name="given_answers", + verbose_name=_("question"), + ) + answer = models.ForeignKey( + "Answer", on_delete=models.CASCADE, verbose_name=_("answer") + ) + created = models.DateTimeField(auto_now_add=True) + + class Meta(TypedModelMeta): + unique_together = ["candidate", "question"] + + verbose_name = _("given answer") + verbose_name_plural = _("given answers") diff --git a/tvdt/quiz/models/question.py b/tvdt/quiz/models/question.py new file mode 100644 index 0000000..87e55e0 --- /dev/null +++ b/tvdt/quiz/models/question.py @@ -0,0 +1,31 @@ +from django.db import models +from django.utils.translation import gettext_lazy as _ +from django_stubs_ext.db.models import TypedModelMeta + + +class NoActiveTestForSeason(Exception): + pass + + +class QuizAlreadyFinished(Exception): + pass + + +class Question(models.Model): + question = models.CharField(max_length=256, verbose_name=_("question")) + quiz = models.ForeignKey( + "Quiz", + on_delete=models.CASCADE, + related_name="questions", + verbose_name=_("quiz"), + ) + enabled = models.BooleanField(default=True, verbose_name=_("enabled")) + + def __str__(self) -> str: + return f"{self._order + 1}. {self.question} ({self.quiz}) ({self.answers.count()} answers, {self.answers.filter(is_right_answer=True).count()} correct)" + + class Meta(TypedModelMeta): + verbose_name = _("question") + verbose_name_plural = _("questions") + + order_with_respect_to = "quiz" diff --git a/tvdt/quiz/models/quiz.py b/tvdt/quiz/models/quiz.py new file mode 100644 index 0000000..2dde36b --- /dev/null +++ b/tvdt/quiz/models/quiz.py @@ -0,0 +1,25 @@ +from django.db import models +from django.utils.translation import gettext_lazy as _ +from django_stubs_ext.db.models import TypedModelMeta + + +class Quiz(models.Model): + name = models.CharField(max_length=64, verbose_name=_("name")) + season = models.ForeignKey( + "Season", + on_delete=models.CASCADE, + related_name="quizzes", + verbose_name=_("season"), + ) + + def is_valid_quiz(self) -> bool: + pass + # Check > 0 active questions + # Check every question 1 right answer + + def __str__(self) -> str: + return f"{self.season.name} - {self.name}" + + class Meta(TypedModelMeta): + verbose_name = _("quiz") + verbose_name_plural = _("quizzes") diff --git a/tvdt/quiz/models/quiz_time.py b/tvdt/quiz/models/quiz_time.py new file mode 100644 index 0000000..7db0247 --- /dev/null +++ b/tvdt/quiz/models/quiz_time.py @@ -0,0 +1,15 @@ +from django.db import models +from django.utils.translation import gettext_lazy as _ +from django_stubs_ext.db.models import TypedModelMeta + + +class QuizTime(models.Model): + candidate = models.ForeignKey( + "Candidate", on_delete=models.CASCADE, verbose_name=_("candidate") + ) + quiz = models.ForeignKey("Quiz", on_delete=models.CASCADE, verbose_name=_("quiz")) + seconds = models.PositiveIntegerField(verbose_name=_("seconds")) + + class Meta(TypedModelMeta): + verbose_name = _("quiz time") + verbose_name_plural = _("quiz times") diff --git a/tvdt/quiz/models/season.py b/tvdt/quiz/models/season.py new file mode 100644 index 0000000..96710cb --- /dev/null +++ b/tvdt/quiz/models/season.py @@ -0,0 +1,39 @@ +import random +import string + +from django.db import models +from django.utils.translation import gettext_lazy as _ +from django_stubs_ext.db.models import TypedModelMeta + +from ..helpers import generate_season_code + + +class Season(models.Model): + name = models.CharField(max_length=64, verbose_name=_("name")) + active_quiz = models.ForeignKey( + "Quiz", + on_delete=models.SET_NULL, + null=True, + blank=True, + default=None, + verbose_name=_("active quiz"), + related_name="+", + ) + season_code = models.CharField( + max_length=5, default=generate_season_code, verbose_name=_("season code") + ) + preregister_candidates = models.BooleanField( + default=True, verbose_name=_("preregister candidates") + ) + + def renew_season_code(self) -> str: + self.season_code = generate_season_code() + self.save() + return self.season_code + + def __str__(self) -> str: + return self.name + + class Meta(TypedModelMeta): + verbose_name = _("season") + verbose_name_plural = _("seasons") diff --git a/tvdt/quiz/static/quiz/background.png b/tvdt/quiz/static/quiz/background.png new file mode 100644 index 0000000000000000000000000000000000000000..fabe57e1d2e0b108cd27de647385a5fae5f966a6 GIT binary patch literal 167449 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 literal 0 HcmV?d00001 diff --git a/tvdt/quiz/templates/quiz/base.html b/tvdt/quiz/templates/quiz/base.html new file mode 100644 index 0000000..7f93b6f --- /dev/null +++ b/tvdt/quiz/templates/quiz/base.html @@ -0,0 +1,33 @@ +{% load static %} + + + + + {# #} + + + {% block title %}{% endblock %} + + + +
+{% block body %}{% endblock %} +
+{% block script %}{% endblock %} + + diff --git a/tvdt/quiz/templates/quiz/enter_name.html b/tvdt/quiz/templates/quiz/enter_name.html new file mode 100644 index 0000000..1af6abf --- /dev/null +++ b/tvdt/quiz/templates/quiz/enter_name.html @@ -0,0 +1,9 @@ +{% extends "quiz/base.html" %} +{% load crispy_forms_tags %} + +{% block body %} + +

{{ season.name }} ({{ season.season_code }})

+ {% crispy form %} + +{% endblock %} \ No newline at end of file diff --git a/tvdt/quiz/templates/quiz/question.html b/tvdt/quiz/templates/quiz/question.html new file mode 100644 index 0000000..657833f --- /dev/null +++ b/tvdt/quiz/templates/quiz/question.html @@ -0,0 +1,14 @@ +{% extends 'quiz/base.html' %} +{% load i18n %} + +{% block body %} +

{{ question.question }}

+
+ {% csrf_token %} + {% for answer in question.answers.all %} +
+ {% empty %} + {% translate "Weirdly enough this question has no answers..." %} + {% endfor %} +
+{% endblock %} \ No newline at end of file diff --git a/tvdt/quiz/templates/quiz/select_season.html b/tvdt/quiz/templates/quiz/select_season.html new file mode 100644 index 0000000..3921f5b --- /dev/null +++ b/tvdt/quiz/templates/quiz/select_season.html @@ -0,0 +1,7 @@ +{% extends 'quiz/base.html' %} +{% load crispy_forms_tags %} +{% load i18n %} +{% block title %}{% translate "Tijd voor de test" %}{% endblock %} +{% block body %} + {% crispy form %} +{% endblock %} diff --git a/tvdt/quiz/tests.py b/tvdt/quiz/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/tvdt/quiz/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/tvdt/quiz/urls.py b/tvdt/quiz/urls.py new file mode 100644 index 0000000..fbd8a67 --- /dev/null +++ b/tvdt/quiz/urls.py @@ -0,0 +1,14 @@ +from django.urls import path, register_converter + +from .converters import CandidateConverter, SeasonCodeConverter +from .views import SelectSeasonView +from .views.questionview import QuestionView +from .views.enternameview import EnterNameView + +register_converter(SeasonCodeConverter, "season") +register_converter(CandidateConverter, "candidate") +urlpatterns = [ + path("", SelectSeasonView.as_view(), name="home"), + path("/", EnterNameView.as_view(), name="quiz"), + path("/", QuestionView.as_view(), name="question"), +] diff --git a/tvdt/quiz/views/__init__.py b/tvdt/quiz/views/__init__.py new file mode 100644 index 0000000..dccd439 --- /dev/null +++ b/tvdt/quiz/views/__init__.py @@ -0,0 +1 @@ +from .selectseasonview import SelectSeasonView diff --git a/tvdt/quiz/views/enternameview.py b/tvdt/quiz/views/enternameview.py new file mode 100644 index 0000000..3ea4b3f --- /dev/null +++ b/tvdt/quiz/views/enternameview.py @@ -0,0 +1,51 @@ +from crispy_forms.helper import FormHelper +from django import forms +from django.http import Http404 +from django.shortcuts import render, redirect +from django.urls import reverse +from django.views import View + +from ..models import Season, Candidate + + +class EnterNameForm(forms.Form): + name = forms.CharField() + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.helper = FormHelper() + + +class EnterNameView(View): + template_name = "quiz/enter_name.html" + forms_class = EnterNameForm + + def get(self, request, season: Season, *args, **kwargs): + if season.active_quiz == None: + raise Http404("No quiz active") + + return render( + request, + self.template_name, + {"form": self.forms_class(), "season": season}, + ) + + def post(self, request, season: Season, *args, **kwargs): + name = request.POST.get("name") + + if season.preregister_candidates: + try: + candidate = Candidate.objects.get(season=season, name=name) + except Candidate.DoesNotExist: + raise Http404("Candidate not found") + else: + candidate, created = Candidate.objects.get_or_create( + season=season, name=name + ) + + return redirect( + reverse( + "question", + kwargs={"candidate": candidate}, + ) + ) diff --git a/tvdt/quiz/views/questionview.py b/tvdt/quiz/views/questionview.py new file mode 100644 index 0000000..a24ecd2 --- /dev/null +++ b/tvdt/quiz/views/questionview.py @@ -0,0 +1,44 @@ +from django.contrib import messages +from django.core.exceptions import BadRequest +from django.http import Http404, HttpRequest, HttpResponse +from django.shortcuts import render +from django.utils.translation import gettext as _ +from django.views import View + +from ..models import Candidate, Answer, GivenAnswer +from ..models.question import NoActiveTestForSeason + + +class QuestionView(View): + template_name = "quiz/question.html" + + def get( + self, request: HttpRequest, candidate: Candidate, *args, **kwargs + ) -> HttpResponse: + try: + question = candidate.get_next_question(candidate) + except NoActiveTestForSeason: + messages.error(request, _("No active Quiz for season")) + raise Http404("No active Quiz for seaon") + + return render( + request, + "quiz/question.html", + {"candidate": candidate, "question": question}, + ) + + def post(self, request: HttpRequest, candidate: Candidate, *args, **kwargs): + answer_id = request.POST.get("answer") + if answer_id == None: + raise BadRequest + + try: + answer = Answer.objects.get(id=answer_id) + except Answer.DoesNotExist: + raise BadRequest + + GivenAnswer.objects.create( + candidate=candidate, question=answer.question, answer=answer + ) + + return self.get(request, candidate, args, kwargs) diff --git a/tvdt/quiz/views/selectseasonview.py b/tvdt/quiz/views/selectseasonview.py new file mode 100644 index 0000000..cce0f53 --- /dev/null +++ b/tvdt/quiz/views/selectseasonview.py @@ -0,0 +1,29 @@ +from crispy_forms.helper import FormHelper +from django.http import Http404 +from django.shortcuts import redirect +from django.urls import reverse +from django.views.generic.edit import FormView +from django import forms + +from ..models import Season + + +class SelectSeasonForm(forms.Form): + code = forms.CharField(max_length=5) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.helper = FormHelper() + + +class SelectSeasonView(FormView): + form_class = SelectSeasonForm + template_name = "quiz/select_season.html" + + def form_valid(self, form): + try: + season = Season.objects.get(season_code=form.cleaned_data["code"].upper()) + except Season.DoesNotExist: + raise Http404("Season does not exist") + + return redirect(reverse("quiz", kwargs={"season": season})) diff --git a/tvdt/tvdt/settings.py b/tvdt/tvdt/settings.py index d2fe4d7..33581d1 100644 --- a/tvdt/tvdt/settings.py +++ b/tvdt/tvdt/settings.py @@ -11,6 +11,7 @@ https://docs.djangoproject.com/en/5.1/ref/settings/ """ from pathlib import Path +from django.utils.translation import gettext_lazy as _ # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent @@ -25,12 +26,13 @@ SECRET_KEY = "django-insecure-v*=mgb7c=)hn=(1eg-uljg6^l5)7(+i-^mt)hppiki6f$nzziu # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -ALLOWED_HOSTS = [] +ALLOWED_HOSTS: list[str] = [] # Application definition INSTALLED_APPS = [ + "quiz.apps.QuizConfig", "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", @@ -39,6 +41,22 @@ INSTALLED_APPS = [ "django.contrib.staticfiles", ] +# crispy +INSTALLED_APPS += [ + "crispy_forms", + "crispy_bootstrap5", +] + +# allauth +INSTALLED_APPS += [ + "allauth", + "allauth.account", +] + +CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap5" + +CRISPY_TEMPLATE_PACK = "bootstrap5" + MIDDLEWARE = [ "django.middleware.security.SecurityMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", @@ -47,6 +65,7 @@ MIDDLEWARE = [ "django.contrib.auth.middleware.AuthenticationMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", + "allauth.account.middleware.AccountMiddleware", ] ROOT_URLCONF = "tvdt.urls" @@ -67,6 +86,13 @@ TEMPLATES = [ }, ] +AUTHENTICATION_BACKENDS = [ + # Needed to login by username in Django admin, regardless of `allauth` + "django.contrib.auth.backends.ModelBackend", + # `allauth` specific authentication methods, such as login by email + "allauth.account.auth_backends.AuthenticationBackend", +] + WSGI_APPLICATION = "tvdt.wsgi.application" @@ -103,9 +129,10 @@ AUTH_PASSWORD_VALIDATORS = [ # Internationalization # https://docs.djangoproject.com/en/5.1/topics/i18n/ -LANGUAGE_CODE = "en-us" +LANGUAGE_CODE = "nl" +LANGUAGES = [("nl", _("Dutch")), ("en", _("English"))] -TIME_ZONE = "UTC" +TIME_ZONE = "Europe/Amsterdam" USE_I18N = True @@ -116,8 +143,15 @@ USE_TZ = True # https://docs.djangoproject.com/en/5.1/howto/static-files/ STATIC_URL = "static/" +STATIC_ROOT = BASE_DIR / "staticfiles" # Default primary key field type # https://docs.djangoproject.com/en/5.1/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" + +# email is the new username +ACCOUNT_USER_MODEL_USERNAME_FIELD = None +ACCOUNT_EMAIL_REQUIRED = True +ACCOUNT_USERNAME_REQUIRED = False +ACCOUNT_AUTHENTICATION_METHOD = "email" diff --git a/tvdt/tvdt/urls.py b/tvdt/tvdt/urls.py index c848563..e01c529 100644 --- a/tvdt/tvdt/urls.py +++ b/tvdt/tvdt/urls.py @@ -15,9 +15,14 @@ Including another URLconf 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ +from django.conf import settings +from django.conf.urls.static import static from django.contrib import admin -from django.urls import path +from django.urls import path, include urlpatterns = [ + path("", include("quiz.urls")), path("admin/", admin.site.urls), -] + path("accounts/", include("allauth.urls")), + path("i18n/", include("django.conf.urls.i18n")), +] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)