From 628bfa22f0eb11730c2843f2a316f5b26e8ace1c Mon Sep 17 00:00:00 2001
From: Marijn Doeve
Date: Sun, 29 Dec 2024 14:55:07 +0100
Subject: [PATCH] Start of Symfony
---
.containerignore | 4 -
.dockerignore | 34 +
.editorconfig | 57 +
.env | 20 +
.env.dev | 4 +
.gitattributes | 17 +
.github/workflows/ci.yml | 76 +
.gitignore | 210 +-
.idea/.gitignore | 8 -
Dockerfile | 94 +
Makefile | 59 -
bin/console | 21 +
compose.override.yaml | 24 +
compose.prod.yaml | 11 +-
compose.yaml | 56 +-
composer.json | 71 +
composer.lock | 2487 +++++++++++++++++
config/bundles.php | 5 +
config/packages/cache.yaml | 19 +
config/packages/framework.yaml | 15 +
config/packages/routing.yaml | 10 +
config/preload.php | 5 +
config/routes.yaml | 5 +
config/routes/framework.yaml | 4 +
config/services.yaml | 24 +
containers/python/Containerfile.dev | 16 -
containers/python/Containerfile.prod | 36 -
frankenphp/Caddyfile | 57 +
frankenphp/conf.d/10-app.ini | 13 +
frankenphp/conf.d/20-app.dev.ini | 5 +
frankenphp/conf.d/20-app.prod.ini | 2 +
frankenphp/docker-entrypoint.sh | 62 +
frankenphp/worker.Caddyfile | 4 +
public/index.php | 9 +
.../__init__.py => src/Controller/.gitignore | 0
src/Kernel.php | 11 +
symfony.lock | 59 +
tvdt/backoffice/apps.py | 6 -
tvdt/backoffice/converters.py | 14 -
tvdt/backoffice/migrations/__init__.py | 0
.../backoffice/templates/backoffice/base.html | 36 -
.../templates/backoffice/index.html | 45 -
tvdt/backoffice/templates/backoffice/nav.html | 51 -
.../backoffice/templates/backoffice/quiz.html | 92 -
.../templates/backoffice/season.html | 25 -
tvdt/backoffice/tests.py | 3 -
tvdt/backoffice/urls.py | 21 -
tvdt/backoffice/views/__init__.py | 3 -
tvdt/backoffice/views/home.py | 10 -
tvdt/backoffice/views/quiz.py | 13 -
tvdt/backoffice/views/season.py | 12 -
tvdt/locale/nl/LC_MESSAGES/django.po | 122 -
tvdt/manage.py | 22 -
tvdt/poetry.lock | 1163 --------
tvdt/pyproject.toml | 34 -
tvdt/quiz/__init__.py | 0
tvdt/quiz/admin.py | 50 -
tvdt/quiz/apps.py | 8 -
tvdt/quiz/context_processors.py | 2 -
tvdt/quiz/converters.py | 28 -
tvdt/quiz/fixtures/krtek.json | 2198 ---------------
tvdt/quiz/helpers.py | 8 -
tvdt/quiz/locale/nl/LC_MESSAGES/django.po | 162 --
tvdt/quiz/migrations/0001_initial.py | 286 --
tvdt/quiz/migrations/0002_season_owner.py | 24 -
...unt_alter_correction_candidate_and_more.py | 39 -
tvdt/quiz/migrations/0004_quiz_dropouts.py | 18 -
tvdt/quiz/migrations/__init__.py | 0
tvdt/quiz/models/__init__.py | 7 -
tvdt/quiz/models/answer.py | 26 -
tvdt/quiz/models/candidate.py | 50 -
tvdt/quiz/models/correction.py | 24 -
tvdt/quiz/models/given_answer.py | 37 -
tvdt/quiz/models/question.py | 61 -
tvdt/quiz/models/quiz.py | 61 -
tvdt/quiz/models/season.py | 44 -
tvdt/quiz/static/quiz/de_mol/background.png | Bin 330116 -> 0 bytes
tvdt/quiz/static/quiz/de_mol/green.png | Bin 406098 -> 0 bytes
tvdt/quiz/static/quiz/de_mol/red.png | Bin 411538 -> 0 bytes
.../static/quiz/wie_is_de_mol/background.png | Bin 167449 -> 0 bytes
tvdt/quiz/static/quiz/wie_is_de_mol/green.png | Bin 507638 -> 0 bytes
tvdt/quiz/static/quiz/wie_is_de_mol/red.png | Bin 455932 -> 0 bytes
tvdt/quiz/templates/quiz/base.html | 51 -
tvdt/quiz/templates/quiz/enter_name.html | 5 -
tvdt/quiz/templates/quiz/question.html | 18 -
tvdt/quiz/templates/quiz/screeen.html | 0
tvdt/quiz/templates/quiz/select_season.html | 6 -
tvdt/quiz/tests.py | 3 -
tvdt/quiz/urls.py | 17 -
tvdt/quiz/views/__init__.py | 1 -
tvdt/quiz/views/enternameview.py | 51 -
tvdt/quiz/views/questionview.py | 59 -
tvdt/quiz/views/selectseasonview.py | 39 -
tvdt/templates/messages.html | 13 -
tvdt/tvdt/__init__.py | 0
tvdt/tvdt/asgi.py | 16 -
tvdt/tvdt/converters.py | 14 -
tvdt/tvdt/settings.py | 198 --
tvdt/tvdt/urls.py | 29 -
tvdt/tvdt/wsgi.py | 16 -
100 files changed, 3312 insertions(+), 5643 deletions(-)
delete mode 100644 .containerignore
create mode 100644 .dockerignore
create mode 100644 .editorconfig
create mode 100644 .env
create mode 100644 .env.dev
create mode 100644 .gitattributes
create mode 100644 .github/workflows/ci.yml
delete mode 100644 .idea/.gitignore
create mode 100644 Dockerfile
delete mode 100644 Makefile
create mode 100755 bin/console
create mode 100644 compose.override.yaml
create mode 100644 composer.json
create mode 100644 composer.lock
create mode 100644 config/bundles.php
create mode 100644 config/packages/cache.yaml
create mode 100644 config/packages/framework.yaml
create mode 100644 config/packages/routing.yaml
create mode 100644 config/preload.php
create mode 100644 config/routes.yaml
create mode 100644 config/routes/framework.yaml
create mode 100644 config/services.yaml
delete mode 100644 containers/python/Containerfile.dev
delete mode 100644 containers/python/Containerfile.prod
create mode 100644 frankenphp/Caddyfile
create mode 100644 frankenphp/conf.d/10-app.ini
create mode 100644 frankenphp/conf.d/20-app.dev.ini
create mode 100644 frankenphp/conf.d/20-app.prod.ini
create mode 100755 frankenphp/docker-entrypoint.sh
create mode 100644 frankenphp/worker.Caddyfile
create mode 100644 public/index.php
rename tvdt/backoffice/__init__.py => src/Controller/.gitignore (100%)
create mode 100644 src/Kernel.php
create mode 100644 symfony.lock
delete mode 100644 tvdt/backoffice/apps.py
delete mode 100644 tvdt/backoffice/converters.py
delete mode 100644 tvdt/backoffice/migrations/__init__.py
delete mode 100644 tvdt/backoffice/templates/backoffice/base.html
delete mode 100644 tvdt/backoffice/templates/backoffice/index.html
delete mode 100644 tvdt/backoffice/templates/backoffice/nav.html
delete mode 100644 tvdt/backoffice/templates/backoffice/quiz.html
delete mode 100644 tvdt/backoffice/templates/backoffice/season.html
delete mode 100644 tvdt/backoffice/tests.py
delete mode 100644 tvdt/backoffice/urls.py
delete mode 100644 tvdt/backoffice/views/__init__.py
delete mode 100644 tvdt/backoffice/views/home.py
delete mode 100644 tvdt/backoffice/views/quiz.py
delete mode 100644 tvdt/backoffice/views/season.py
delete mode 100644 tvdt/locale/nl/LC_MESSAGES/django.po
delete mode 100755 tvdt/manage.py
delete mode 100644 tvdt/poetry.lock
delete mode 100644 tvdt/pyproject.toml
delete mode 100644 tvdt/quiz/__init__.py
delete mode 100644 tvdt/quiz/admin.py
delete mode 100644 tvdt/quiz/apps.py
delete mode 100644 tvdt/quiz/context_processors.py
delete mode 100644 tvdt/quiz/converters.py
delete mode 100644 tvdt/quiz/fixtures/krtek.json
delete mode 100644 tvdt/quiz/helpers.py
delete mode 100644 tvdt/quiz/locale/nl/LC_MESSAGES/django.po
delete mode 100644 tvdt/quiz/migrations/0001_initial.py
delete mode 100644 tvdt/quiz/migrations/0002_season_owner.py
delete mode 100644 tvdt/quiz/migrations/0003_correction_amount_alter_correction_candidate_and_more.py
delete mode 100644 tvdt/quiz/migrations/0004_quiz_dropouts.py
delete mode 100644 tvdt/quiz/migrations/__init__.py
delete mode 100644 tvdt/quiz/models/__init__.py
delete mode 100644 tvdt/quiz/models/answer.py
delete mode 100644 tvdt/quiz/models/candidate.py
delete mode 100644 tvdt/quiz/models/correction.py
delete mode 100644 tvdt/quiz/models/given_answer.py
delete mode 100644 tvdt/quiz/models/question.py
delete mode 100644 tvdt/quiz/models/quiz.py
delete mode 100644 tvdt/quiz/models/season.py
delete mode 100644 tvdt/quiz/static/quiz/de_mol/background.png
delete mode 100644 tvdt/quiz/static/quiz/de_mol/green.png
delete mode 100644 tvdt/quiz/static/quiz/de_mol/red.png
delete mode 100644 tvdt/quiz/static/quiz/wie_is_de_mol/background.png
delete mode 100644 tvdt/quiz/static/quiz/wie_is_de_mol/green.png
delete mode 100644 tvdt/quiz/static/quiz/wie_is_de_mol/red.png
delete mode 100644 tvdt/quiz/templates/quiz/base.html
delete mode 100644 tvdt/quiz/templates/quiz/enter_name.html
delete mode 100644 tvdt/quiz/templates/quiz/question.html
delete mode 100644 tvdt/quiz/templates/quiz/screeen.html
delete mode 100644 tvdt/quiz/templates/quiz/select_season.html
delete mode 100644 tvdt/quiz/tests.py
delete mode 100644 tvdt/quiz/urls.py
delete mode 100644 tvdt/quiz/views/__init__.py
delete mode 100644 tvdt/quiz/views/enternameview.py
delete mode 100644 tvdt/quiz/views/questionview.py
delete mode 100644 tvdt/quiz/views/selectseasonview.py
delete mode 100644 tvdt/templates/messages.html
delete mode 100644 tvdt/tvdt/__init__.py
delete mode 100644 tvdt/tvdt/asgi.py
delete mode 100644 tvdt/tvdt/converters.py
delete mode 100644 tvdt/tvdt/settings.py
delete mode 100644 tvdt/tvdt/urls.py
delete mode 100644 tvdt/tvdt/wsgi.py
diff --git a/.containerignore b/.containerignore
deleted file mode 100644
index 4f748cf..0000000
--- a/.containerignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/.idea/
-/containers/
-.gitignore
-compose.*
\ No newline at end of file
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..dc5a875
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,34 @@
+**/*.log
+**/*.md
+**/*.php~
+**/*.dist.php
+**/*.dist
+**/*.cache
+**/._*
+**/.dockerignore
+**/.DS_Store
+**/.git/
+**/.gitattributes
+**/.gitignore
+**/.gitmodules
+**/compose.*.yaml
+**/compose.*.yml
+**/compose.yaml
+**/compose.yml
+**/docker-compose.*.yaml
+**/docker-compose.*.yml
+**/docker-compose.yaml
+**/docker-compose.yml
+**/Dockerfile
+**/Thumbs.db
+.github/
+docs/
+public/bundles/
+tests/
+var/
+vendor/
+.editorconfig
+.env.*.local
+.env.local
+.env.local.php
+.env.test
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..0315479
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,57 @@
+# EditorConfig helps developers define and maintain consistent
+# coding styles between different editors and IDEs
+# editorconfig.org
+
+root = true
+
+[*]
+# Change these settings to your own preference
+indent_style = space
+indent_size = 4
+
+# We recommend you to keep these unchanged
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.{js,html,ts,tsx}]
+indent_size = 2
+
+[*.json]
+indent_size = 2
+
+[*.md]
+trim_trailing_whitespace = false
+
+[*.sh]
+indent_style = tab
+
+[*.xml.dist]
+indent_style = space
+indent_size = 4
+
+[*.{yaml,yml}]
+trim_trailing_whitespace = false
+
+[.github/workflows/*.yml]
+indent_size = 2
+
+[.gitmodules]
+indent_style = tab
+
+[.php_cs.dist]
+indent_style = space
+indent_size = 4
+
+[composer.json]
+indent_size = 4
+
+[{compose,docker-compose}.*.{yaml,yml}]
+indent_size = 2
+
+[*.*Dockerfile]
+indent_style = tab
+
+[*.*Caddyfile]
+indent_style = tab
diff --git a/.env b/.env
new file mode 100644
index 0000000..e6cabe4
--- /dev/null
+++ b/.env
@@ -0,0 +1,20 @@
+# In all environments, the following files are loaded if they exist,
+# the latter taking precedence over the former:
+#
+# * .env contains default values for the environment variables needed by the app
+# * .env.local uncommitted file with local overrides
+# * .env.$APP_ENV committed environment-specific defaults
+# * .env.$APP_ENV.local uncommitted environment-specific overrides
+#
+# Real environment variables win over .env files.
+#
+# DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES.
+# https://symfony.com/doc/current/configuration/secrets.html
+#
+# Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2).
+# https://symfony.com/doc/current/best_practices.html#use-environment-variables-for-infrastructure-configuration
+
+###> symfony/framework-bundle ###
+APP_ENV=dev
+APP_SECRET=
+###< symfony/framework-bundle ###
diff --git a/.env.dev b/.env.dev
new file mode 100644
index 0000000..f359c83
--- /dev/null
+++ b/.env.dev
@@ -0,0 +1,4 @@
+
+###> symfony/framework-bundle ###
+APP_SECRET=e26b9552d9e7f969b160373effaa7690
+###< symfony/framework-bundle ###
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..642c91f
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,17 @@
+* text=auto eol=lf
+
+*.conf text eol=lf
+*.html text eol=lf
+*.ini text eol=lf
+*.js text eol=lf
+*.json text eol=lf
+*.md text eol=lf
+*.php text eol=lf
+*.sh text eol=lf
+*.yaml text eol=lf
+*.yml text eol=lf
+bin/console text eol=lf
+composer.lock text eol=lf merge=ours
+
+*.ico binary
+*.png binary
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..8b0f691
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,76 @@
+name: CI
+
+on:
+ push:
+ branches:
+ - main
+ pull_request: ~
+ workflow_dispatch: ~
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
+ cancel-in-progress: true
+
+jobs:
+ tests:
+ name: Tests
+ runs-on: ubuntu-latest
+ steps:
+ -
+ name: Checkout
+ uses: actions/checkout@v4
+ -
+ name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+ -
+ name: Build Docker images
+ uses: docker/bake-action@v4
+ with:
+ pull: true
+ load: true
+ files: |
+ compose.yaml
+ compose.override.yaml
+ set: |
+ *.cache-from=type=gha,scope=${{github.ref}}
+ *.cache-from=type=gha,scope=refs/heads/main
+ *.cache-to=type=gha,scope=${{github.ref}},mode=max
+ -
+ name: Start services
+ run: docker compose up --wait --no-build
+ -
+ name: Check HTTP reachability
+ run: curl -v --fail-with-body http://localhost
+ -
+ name: Check HTTPS reachability
+ if: false # Remove this line when the homepage will be configured, or change the path to check
+ run: curl -vk --fail-with-body https://localhost
+ -
+ name: Check Mercure reachability
+ run: curl -vkI --fail-with-body https://localhost/.well-known/mercure?topic=test
+ -
+ name: Create test database
+ if: false # Remove this line if Doctrine ORM is installed
+ run: docker compose exec -T php bin/console -e test doctrine:database:create
+ -
+ name: Run migrations
+ if: false # Remove this line if Doctrine Migrations is installed
+ run: docker compose exec -T php bin/console -e test doctrine:migrations:migrate --no-interaction
+ -
+ name: Run PHPUnit
+ if: false # Remove this line if PHPUnit is installed
+ run: docker compose exec -T php bin/phpunit
+ -
+ name: Doctrine Schema Validator
+ if: false # Remove this line if Doctrine ORM is installed
+ run: docker compose exec -T php bin/console -e test doctrine:schema:validate
+ lint:
+ name: Docker Lint
+ runs-on: ubuntu-latest
+ steps:
+ -
+ name: Checkout
+ uses: actions/checkout@v4
+ -
+ name: Lint Dockerfile
+ uses: hadolint/hadolint-action@v3.1.0
diff --git a/.gitignore b/.gitignore
index 8df0ad4..efc07b5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,174 +1,60 @@
-compose.override.yaml
-/tvdt/staticfiles/
-
-.idea/
### Generated by gibo (https://github.com/simonwhitaker/gibo)
-### https://raw.github.com/github/gitignore/76739a38b56907118c5a880d63250c99d5690a5a/Python.gitignore
+### https://raw.github.com/github/gitignore/6eeebe6f49678aacd8311ce079842c971b3ebe96/Symfony.gitignore
-# Byte-compiled / optimized / DLL files
-__pycache__/
-*.py[cod]
-*$py.class
+# Cache and logs (Symfony2)
+/app/cache/*
+/app/logs/*
+!app/cache/.gitkeep
+!app/logs/.gitkeep
-# C extensions
-*.so
+# Email spool folder
+/app/spool/*
-# Distribution / packaging
-.Python
-build/
-develop-eggs/
-dist/
-downloads/
-eggs/
-.eggs/
-lib/
-lib64/
-parts/
-sdist/
-var/
-wheels/
-share/python-wheels/
-*.egg-info/
-.installed.cfg
-*.egg
-MANIFEST
+# Cache, session files and logs (Symfony3)
+/var/cache/*
+/var/logs/*
+/var/sessions/*
+!var/cache/.gitkeep
+!var/logs/.gitkeep
+!var/sessions/.gitkeep
-# PyInstaller
-# Usually these files are written by a python script from a template
-# before PyInstaller builds the exe, so as to inject date/other infos into it.
-*.manifest
-*.spec
+# Logs (Symfony4)
+/var/log/*
+!var/log/.gitkeep
-# Installer logs
-pip-log.txt
-pip-delete-this-directory.txt
+# Parameters
+/app/config/parameters.yml
+/app/config/parameters.ini
-# Unit test / coverage reports
-htmlcov/
-.tox/
-.nox/
-.coverage
-.coverage.*
-.cache
-nosetests.xml
-coverage.xml
-*.cover
-*.py,cover
-.hypothesis/
-.pytest_cache/
-cover/
+# Managed by Composer
+/app/bootstrap.php.cache
+/var/bootstrap.php.cache
+/bin/*
+!bin/console
+!bin/symfony_requirements
+/vendor/
-# Translations
-*.mo
-*.pot
+# Assets and user uploads
+/web/bundles/
+/web/uploads/
-# Django stuff:
-*.log
-local_settings.py
-db.sqlite3
-db.sqlite3-journal
+# PHPUnit
+/app/phpunit.xml
+/phpunit.xml
-# Flask stuff:
-instance/
-.webassets-cache
+# Build data
+/build/
-# Scrapy stuff:
-.scrapy
+# Composer PHAR
+/composer.phar
-# Sphinx documentation
-docs/_build/
+# Backup entities generated with doctrine:generate:entities command
+**/Entity/*~
-# PyBuilder
-.pybuilder/
-target/
-
-# Jupyter Notebook
-.ipynb_checkpoints
-
-# IPython
-profile_default/
-ipython_config.py
-
-# pyenv
-# For a library or package, you might want to ignore these files since the code is
-# intended to run in multiple environments; otherwise, check them in:
-# .python-version
-
-# pipenv
-# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
-# However, in case of collaboration, if having platform-specific dependencies or dependencies
-# having no cross-platform support, pipenv may install dependencies that don't work, or not
-# install all needed dependencies.
-#Pipfile.lock
-
-# poetry
-# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
-# This is especially recommended for binary packages to ensure reproducibility, and is more
-# commonly ignored for libraries.
-# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
-#poetry.lock
-
-# pdm
-# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
-#pdm.lock
-# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
-# in version control.
-# https://pdm.fming.dev/latest/usage/project/#working-with-version-control
-.pdm.toml
-.pdm-python
-.pdm-build/
-
-# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
-__pypackages__/
-
-# Celery stuff
-celerybeat-schedule
-celerybeat.pid
-
-# SageMath parsed files
-*.sage.py
-
-# Environments
-.env
-.venv
-env/
-venv/
-ENV/
-env.bak/
-venv.bak/
-
-# Spyder project settings
-.spyderproject
-.spyproject
-
-# Rope project settings
-.ropeproject
-
-# mkdocs documentation
-/site
-
-# mypy
-.mypy_cache/
-.dmypy.json
-dmypy.json
-
-# Pyre type checker
-.pyre/
-
-# pytype static type analyzer
-.pytype/
-
-# Cython debug symbols
-cython_debug/
-
-# PyCharm
-# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
-# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
-# and can be added to the global gitignore or merged into this file. For a more nuclear
-# option (not recommended) you can uncomment the following to ignore the entire idea folder.
-#.idea/
+# Embedded web-server pid file
+/.web-server-pid
### Generated by gibo (https://github.com/simonwhitaker/gibo)
-### https://raw.github.com/github/gitignore/76739a38b56907118c5a880d63250c99d5690a5a/Global/macOS.gitignore
+### https://raw.github.com/github/gitignore/6eeebe6f49678aacd8311ce079842c971b3ebe96/Global/macOS.gitignore
# General
.DS_Store
@@ -197,3 +83,13 @@ Icon
Network Trash Folder
Temporary Items
.apdisk
+
+###> symfony/framework-bundle ###
+/.env.local
+/.env.local.php
+/.env.*.local
+/config/secrets/prod/prod.decrypt.private.php
+/public/bundles/
+/var/
+/vendor/
+###< symfony/framework-bundle ###
diff --git a/.idea/.gitignore b/.idea/.gitignore
deleted file mode 100644
index 13566b8..0000000
--- a/.idea/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
-# Editor-based HTTP Client requests
-/httpRequests/
-# Datasource local storage ignored files
-/dataSources/
-/dataSources.local.xml
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..8332832
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,94 @@
+#syntax=docker/dockerfile:1
+
+# Versions
+FROM dunglas/frankenphp:1-php8.3 AS frankenphp_upstream
+
+# The different stages of this Dockerfile are meant to be built into separate images
+# https://docs.docker.com/develop/develop-images/multistage-build/#stop-at-a-specific-build-stage
+# https://docs.docker.com/compose/compose-file/#target
+
+
+# Base FrankenPHP image
+FROM frankenphp_upstream AS frankenphp_base
+
+WORKDIR /app
+
+VOLUME /app/var/
+
+# persistent / runtime deps
+# hadolint ignore=DL3008
+RUN apt-get update && apt-get install -y --no-install-recommends \
+ acl \
+ file \
+ gettext \
+ git \
+ && rm -rf /var/lib/apt/lists/*
+
+RUN set -eux; \
+ install-php-extensions \
+ @composer \
+ apcu \
+ intl \
+ opcache \
+ zip \
+ ;
+
+# https://getcomposer.org/doc/03-cli.md#composer-allow-superuser
+ENV COMPOSER_ALLOW_SUPERUSER=1
+
+ENV PHP_INI_SCAN_DIR=":$PHP_INI_DIR/app.conf.d"
+
+###> recipes ###
+###< recipes ###
+
+COPY --link frankenphp/conf.d/10-app.ini $PHP_INI_DIR/app.conf.d/
+COPY --link --chmod=755 frankenphp/docker-entrypoint.sh /usr/local/bin/docker-entrypoint
+COPY --link frankenphp/Caddyfile /etc/caddy/Caddyfile
+
+ENTRYPOINT ["docker-entrypoint"]
+
+HEALTHCHECK --start-period=60s CMD curl -f http://localhost:2019/metrics || exit 1
+CMD [ "frankenphp", "run", "--config", "/etc/caddy/Caddyfile" ]
+
+# Dev FrankenPHP image
+FROM frankenphp_base AS frankenphp_dev
+
+ENV APP_ENV=dev XDEBUG_MODE=off
+
+RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"
+
+RUN set -eux; \
+ install-php-extensions \
+ xdebug \
+ ;
+
+COPY --link frankenphp/conf.d/20-app.dev.ini $PHP_INI_DIR/app.conf.d/
+
+CMD [ "frankenphp", "run", "--config", "/etc/caddy/Caddyfile", "--watch" ]
+
+# Prod FrankenPHP image
+FROM frankenphp_base AS frankenphp_prod
+
+ENV APP_ENV=prod
+ENV FRANKENPHP_CONFIG="import worker.Caddyfile"
+
+RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
+
+COPY --link frankenphp/conf.d/20-app.prod.ini $PHP_INI_DIR/app.conf.d/
+COPY --link frankenphp/worker.Caddyfile /etc/caddy/worker.Caddyfile
+
+# prevent the reinstallation of vendors at every changes in the source code
+COPY --link composer.* symfony.* ./
+RUN set -eux; \
+ composer install --no-cache --prefer-dist --no-dev --no-autoloader --no-scripts --no-progress
+
+# copy sources
+COPY --link . ./
+RUN rm -Rf frankenphp/
+
+RUN set -eux; \
+ mkdir -p var/cache var/log; \
+ composer dump-autoload --classmap-authoritative --no-dev; \
+ composer dump-env prod; \
+ composer run-script --no-dev post-install-cmd; \
+ chmod +x bin/console; sync;
diff --git a/Makefile b/Makefile
deleted file mode 100644
index 178e130..0000000
--- a/Makefile
+++ /dev/null
@@ -1,59 +0,0 @@
-DOCKER_EXEC=docker compose exec app
-.DEFAULT_GOAL := help
-
-.PHONY: help
-help:
- @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf "\033[36m%-10s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST)
-
-.PHONY: init
-init: install up migrate fixtures ## setup the application from scratch
-
-.PHONY: up
-up: ## Starts the app
- @docker compose up -d --force-recreate
-
-.PHONY: down
-down: ## Stops the app
- @docker compose down --remove-orphans
-
-.PHONY: build
-build: ## (Re)build the containers
- @echo ✨ Building container
- @docker compose build
-
-.PHONY: shell
-shell: ## Opens a shell in the app container
- @${DOCKER_EXEC} bash
-
-.PHONY: migrate
-migrate: ## Migrate the database to the latest version
- @echo ✨ Appling migrations
- @${DOCKER_EXEC} python manage.py migrate
-
-.PHONY: compilemessages
-messages: ## Compile translations
- @echo ✨ Finding translations
- @${DOCKER_EXEC} python manage.py makemessages -l nl
- @echo ✨ Compiling translations
- @${DOCKER_EXEC} python manage.py compilemessages --ignore .venv
-
-.PHONY: install
-install: ## Install dependencies in container
- @echo ✨ Installing dependencies
- @docker compose run --rm --entrypoint="" app poetry install --without prod --sync
-
-.PHONY: fixtures
-fixtures:
- @echo ✨ Loading fixtures
- @${DOCKER_EXEC} python manage.py loaddata krtek
-
-.PHONY: _clean
-_clean:
- @echo ✨ Stopping containers
- @docker compose down -v
- @echo ✨ Removing compiled files
- @rm -f tvdt/*/locale/*/LC_MESSAGES/django.mo tvdt/locale/*/LC_MESSAGES/django.mo
-
-.PHONY: clean
-clean: _clean init
-
diff --git a/bin/console b/bin/console
new file mode 100755
index 0000000..d8d530e
--- /dev/null
+++ b/bin/console
@@ -0,0 +1,21 @@
+#!/usr/bin/env php
+ symfony/mercure-bundle ###
+###< symfony/mercure-bundle ###
diff --git a/compose.prod.yaml b/compose.prod.yaml
index 20fdfb7..f0db05d 100644
--- a/compose.prod.yaml
+++ b/compose.prod.yaml
@@ -1,5 +1,10 @@
+# Production environment override
services:
- app:
- image: tvdt/app:prod
+ php:
build:
- dockerfile: containers/python/Containerfile.prod
\ No newline at end of file
+ context: .
+ target: frankenphp_prod
+ environment:
+ APP_SECRET: ${APP_SECRET}
+ MERCURE_PUBLISHER_JWT_KEY: ${CADDY_MERCURE_JWT_SECRET}
+ MERCURE_SUBSCRIBER_JWT_KEY: ${CADDY_MERCURE_JWT_SECRET}
diff --git a/compose.yaml b/compose.yaml
index 346726a..96db15e 100644
--- a/compose.yaml
+++ b/compose.yaml
@@ -1,25 +1,43 @@
services:
- app:
- build:
- dockerfile: containers/python/Containerfile.dev
- ports:
- - "8000:8000"
-
+ php:
+ image: ${IMAGES_PREFIX:-}app-php
+ restart: unless-stopped
environment:
- DATABASE_URL: postgres://tvdt:tvdt@db:5432/tvdt
- DEBUG: true
- depends_on:
- - db
- db:
- image: postgres:17.2
- environment:
- POSTGRES_PASSWORD: tvdt
- POSTGRES_USER: tvdt
- POSTGRES_DB: tvdt
+ SERVER_NAME: ${SERVER_NAME:-localhost}, php:80
+ MERCURE_PUBLISHER_JWT_KEY: ${CADDY_MERCURE_JWT_SECRET:-!ChangeThisMercureHubJWTSecretKey!}
+ MERCURE_SUBSCRIBER_JWT_KEY: ${CADDY_MERCURE_JWT_SECRET:-!ChangeThisMercureHubJWTSecretKey!}
+ # Run "composer require symfony/orm-pack" to install and configure Doctrine ORM
+ DATABASE_URL: postgresql://${POSTGRES_USER:-app}:${POSTGRES_PASSWORD:-!ChangeMe!}@database:5432/${POSTGRES_DB:-app}?serverVersion=${POSTGRES_VERSION:-15}&charset=${POSTGRES_CHARSET:-utf8}
+ # Run "composer require symfony/mercure-bundle" to install and configure the Mercure integration
+ MERCURE_URL: ${CADDY_MERCURE_URL:-http://php/.well-known/mercure}
+ MERCURE_PUBLIC_URL: ${CADDY_MERCURE_PUBLIC_URL:-https://${SERVER_NAME:-localhost}/.well-known/mercure}
+ MERCURE_JWT_SECRET: ${CADDY_MERCURE_JWT_SECRET:-!ChangeThisMercureHubJWTSecretKey!}
+ # The two next lines can be removed after initial installation
+ SYMFONY_VERSION: ${SYMFONY_VERSION:-}
+ STABILITY: ${STABILITY:-stable}
volumes:
- - data:/var/lib/postgresql/data
+ - caddy_data:/data
+ - caddy_config:/config
ports:
- - "5432:5432"
+ # HTTP
+ - target: 80
+ published: ${HTTP_PORT:-80}
+ protocol: tcp
+ # HTTPS
+ - target: 443
+ published: ${HTTPS_PORT:-443}
+ protocol: tcp
+ # HTTP/3
+ - target: 443
+ published: ${HTTP3_PORT:-443}
+ protocol: udp
+
+# Mercure is installed as a Caddy module, prevent the Flex recipe from installing another service
+###> symfony/mercure-bundle ###
+###< symfony/mercure-bundle ###
volumes:
- data:
\ No newline at end of file
+ caddy_data:
+ caddy_config:
+###> symfony/mercure-bundle ###
+###< symfony/mercure-bundle ###
diff --git a/composer.json b/composer.json
new file mode 100644
index 0000000..e4248c1
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,71 @@
+{
+ "name": "symfony/skeleton",
+ "type": "project",
+ "license": "MIT",
+ "description": "A minimal Symfony project recommended to create bare bones applications",
+ "minimum-stability": "stable",
+ "prefer-stable": true,
+ "require": {
+ "php": ">=8.3.15",
+ "ext-ctype": "*",
+ "ext-iconv": "*",
+ "runtime/frankenphp-symfony": "^0.2.0",
+ "symfony/console": "7.2.*",
+ "symfony/dotenv": "7.2.*",
+ "symfony/flex": "^2",
+ "symfony/framework-bundle": "7.2.*",
+ "symfony/runtime": "7.2.*",
+ "symfony/yaml": "7.2.*"
+ },
+ "config": {
+ "allow-plugins": {
+ "php-http/discovery": true,
+ "symfony/flex": true,
+ "symfony/runtime": true
+ },
+ "bump-after-update": true,
+ "sort-packages": true
+ },
+ "autoload": {
+ "psr-4": {
+ "App\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "App\\Tests\\": "tests/"
+ }
+ },
+ "replace": {
+ "symfony/polyfill-ctype": "*",
+ "symfony/polyfill-iconv": "*",
+ "symfony/polyfill-php72": "*",
+ "symfony/polyfill-php73": "*",
+ "symfony/polyfill-php74": "*",
+ "symfony/polyfill-php80": "*",
+ "symfony/polyfill-php81": "*",
+ "symfony/polyfill-php82": "*"
+ },
+ "scripts": {
+ "auto-scripts": {
+ "cache:clear": "symfony-cmd",
+ "assets:install %PUBLIC_DIR%": "symfony-cmd"
+ },
+ "post-install-cmd": [
+ "@auto-scripts"
+ ],
+ "post-update-cmd": [
+ "@auto-scripts"
+ ]
+ },
+ "conflict": {
+ "symfony/symfony": "*"
+ },
+ "extra": {
+ "symfony": {
+ "allow-contrib": false,
+ "require": "7.2.*",
+ "docker": true
+ }
+ }
+}
diff --git a/composer.lock b/composer.lock
new file mode 100644
index 0000000..86e1015
--- /dev/null
+++ b/composer.lock
@@ -0,0 +1,2487 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "656bea625358cec88fac936ce826f160",
+ "packages": [
+ {
+ "name": "psr/cache",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/cache.git",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Cache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for caching libraries",
+ "keywords": [
+ "cache",
+ "psr",
+ "psr-6"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/cache/tree/3.0.0"
+ },
+ "time": "2021-02-03T23:26:27+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/2.0.2"
+ },
+ "time": "2021-11-05T16:47:00+00:00"
+ },
+ {
+ "name": "psr/event-dispatcher",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/event-dispatcher.git",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\EventDispatcher\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Standard interfaces for event handling.",
+ "keywords": [
+ "events",
+ "psr",
+ "psr-14"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/event-dispatcher/issues",
+ "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
+ },
+ "time": "2019-01-08T18:20:26+00:00"
+ },
+ {
+ "name": "psr/log",
+ "version": "3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
+ "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/log/tree/3.0.2"
+ },
+ "time": "2024-09-11T13:17:53+00:00"
+ },
+ {
+ "name": "runtime/frankenphp-symfony",
+ "version": "0.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-runtime/frankenphp-symfony.git",
+ "reference": "56822c3631d9522a3136a4c33082d006bdfe4bad"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-runtime/frankenphp-symfony/zipball/56822c3631d9522a3136a4c33082d006bdfe4bad",
+ "reference": "56822c3631d9522a3136a4c33082d006bdfe4bad",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0",
+ "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0",
+ "symfony/runtime": "^5.4 || ^6.0 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Runtime\\FrankenPhpSymfony\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Kévin Dunglas",
+ "email": "kevin@dunglas.dev"
+ }
+ ],
+ "description": "FrankenPHP runtime for Symfony",
+ "support": {
+ "issues": "https://github.com/php-runtime/frankenphp-symfony/issues",
+ "source": "https://github.com/php-runtime/frankenphp-symfony/tree/0.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/nyholm",
+ "type": "github"
+ }
+ ],
+ "time": "2023-12-12T12:06:11+00:00"
+ },
+ {
+ "name": "symfony/cache",
+ "version": "v7.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/cache.git",
+ "reference": "e7e983596b744c4539f31e79b0350a6cf5878a20"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/cache/zipball/e7e983596b744c4539f31e79b0350a6cf5878a20",
+ "reference": "e7e983596b744c4539f31e79b0350a6cf5878a20",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "psr/cache": "^2.0|^3.0",
+ "psr/log": "^1.1|^2|^3",
+ "symfony/cache-contracts": "^2.5|^3",
+ "symfony/deprecation-contracts": "^2.5|^3.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/var-exporter": "^6.4|^7.0"
+ },
+ "conflict": {
+ "doctrine/dbal": "<3.6",
+ "symfony/dependency-injection": "<6.4",
+ "symfony/http-kernel": "<6.4",
+ "symfony/var-dumper": "<6.4"
+ },
+ "provide": {
+ "psr/cache-implementation": "2.0|3.0",
+ "psr/simple-cache-implementation": "1.0|2.0|3.0",
+ "symfony/cache-implementation": "1.1|2.0|3.0"
+ },
+ "require-dev": {
+ "cache/integration-tests": "dev-master",
+ "doctrine/dbal": "^3.6|^4",
+ "predis/predis": "^1.1|^2.0",
+ "psr/simple-cache": "^1.0|^2.0|^3.0",
+ "symfony/clock": "^6.4|^7.0",
+ "symfony/config": "^6.4|^7.0",
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/filesystem": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/messenger": "^6.4|^7.0",
+ "symfony/var-dumper": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Cache\\": ""
+ },
+ "classmap": [
+ "Traits/ValueWrapper.php"
+ ],
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides extended PSR-6, PSR-16 (and tags) implementations",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "caching",
+ "psr6"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/cache/tree/v7.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-07T08:08:50+00:00"
+ },
+ {
+ "name": "symfony/cache-contracts",
+ "version": "v3.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/cache-contracts.git",
+ "reference": "15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b",
+ "reference": "15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/cache": "^3.0"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Cache\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to caching",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/cache-contracts/tree/v3.5.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-25T14:20:29+00:00"
+ },
+ {
+ "name": "symfony/config",
+ "version": "v7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/config.git",
+ "reference": "bcd3c4adf0144dee5011bb35454728c38adec055"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/config/zipball/bcd3c4adf0144dee5011bb35454728c38adec055",
+ "reference": "bcd3c4adf0144dee5011bb35454728c38adec055",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/filesystem": "^7.1",
+ "symfony/polyfill-ctype": "~1.8"
+ },
+ "conflict": {
+ "symfony/finder": "<6.4",
+ "symfony/service-contracts": "<2.5"
+ },
+ "require-dev": {
+ "symfony/event-dispatcher": "^6.4|^7.0",
+ "symfony/finder": "^6.4|^7.0",
+ "symfony/messenger": "^6.4|^7.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/yaml": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Config\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/config/tree/v7.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-11-04T11:36:24+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v7.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "fefcc18c0f5d0efe3ab3152f15857298868dc2c3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/fefcc18c0f5d0efe3ab3152f15857298868dc2c3",
+ "reference": "fefcc18c0f5d0efe3ab3152f15857298868dc2c3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/string": "^6.4|^7.0"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<6.4",
+ "symfony/dotenv": "<6.4",
+ "symfony/event-dispatcher": "<6.4",
+ "symfony/lock": "<6.4",
+ "symfony/process": "<6.4"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0|2.0|3.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^6.4|^7.0",
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/event-dispatcher": "^6.4|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/lock": "^6.4|^7.0",
+ "symfony/messenger": "^6.4|^7.0",
+ "symfony/process": "^6.4|^7.0",
+ "symfony/stopwatch": "^6.4|^7.0",
+ "symfony/var-dumper": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Eases the creation of beautiful and testable command line interfaces",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "cli",
+ "command-line",
+ "console",
+ "terminal"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/console/tree/v7.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-11T03:49:26+00:00"
+ },
+ {
+ "name": "symfony/dependency-injection",
+ "version": "v7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/dependency-injection.git",
+ "reference": "a475747af1a1c98272a5471abc35f3da81197c5d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/a475747af1a1c98272a5471abc35f3da81197c5d",
+ "reference": "a475747af1a1c98272a5471abc35f3da81197c5d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "psr/container": "^1.1|^2.0",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/service-contracts": "^3.5",
+ "symfony/var-exporter": "^6.4|^7.0"
+ },
+ "conflict": {
+ "ext-psr": "<1.1|>=2",
+ "symfony/config": "<6.4",
+ "symfony/finder": "<6.4",
+ "symfony/yaml": "<6.4"
+ },
+ "provide": {
+ "psr/container-implementation": "1.1|2.0",
+ "symfony/service-implementation": "1.1|2.0|3.0"
+ },
+ "require-dev": {
+ "symfony/config": "^6.4|^7.0",
+ "symfony/expression-language": "^6.4|^7.0",
+ "symfony/yaml": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\DependencyInjection\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Allows you to standardize and centralize the way objects are constructed in your application",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/dependency-injection/tree/v7.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-11-25T15:45:00+00:00"
+ },
+ {
+ "name": "symfony/deprecation-contracts",
+ "version": "v3.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6",
+ "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.5-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "function.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "A generic function and convention to trigger deprecation notices",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-25T14:20:29+00:00"
+ },
+ {
+ "name": "symfony/dotenv",
+ "version": "v7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/dotenv.git",
+ "reference": "28347a897771d0c28e99b75166dd2689099f3045"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/dotenv/zipball/28347a897771d0c28e99b75166dd2689099f3045",
+ "reference": "28347a897771d0c28e99b75166dd2689099f3045",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "conflict": {
+ "symfony/console": "<6.4",
+ "symfony/process": "<6.4"
+ },
+ "require-dev": {
+ "symfony/console": "^6.4|^7.0",
+ "symfony/process": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Dotenv\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Registers environment variables from a .env file",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "dotenv",
+ "env",
+ "environment"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/dotenv/tree/v7.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-11-27T11:18:42+00:00"
+ },
+ {
+ "name": "symfony/error-handler",
+ "version": "v7.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/error-handler.git",
+ "reference": "6150b89186573046167796fa5f3f76601d5145f8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/error-handler/zipball/6150b89186573046167796fa5f3f76601d5145f8",
+ "reference": "6150b89186573046167796fa5f3f76601d5145f8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "psr/log": "^1|^2|^3",
+ "symfony/var-dumper": "^6.4|^7.0"
+ },
+ "conflict": {
+ "symfony/deprecation-contracts": "<2.5",
+ "symfony/http-kernel": "<6.4"
+ },
+ "require-dev": {
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/serializer": "^6.4|^7.0"
+ },
+ "bin": [
+ "Resources/bin/patch-type-declarations"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\ErrorHandler\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides tools to manage errors and ease debugging PHP code",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/error-handler/tree/v7.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-07T08:50:44+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher",
+ "version": "v7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher.git",
+ "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/910c5db85a5356d0fea57680defec4e99eb9c8c1",
+ "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/event-dispatcher-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<6.4",
+ "symfony/service-contracts": "<2.5"
+ },
+ "provide": {
+ "psr/event-dispatcher-implementation": "1.0",
+ "symfony/event-dispatcher-implementation": "2.0|3.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^6.4|^7.0",
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/error-handler": "^6.4|^7.0",
+ "symfony/expression-language": "^6.4|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/stopwatch": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\EventDispatcher\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/event-dispatcher/tree/v7.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-25T14:21:43+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher-contracts",
+ "version": "v3.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher-contracts.git",
+ "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f",
+ "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/event-dispatcher": "^1"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\EventDispatcher\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to dispatching event",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-25T14:20:29+00:00"
+ },
+ {
+ "name": "symfony/filesystem",
+ "version": "v7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb",
+ "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-mbstring": "~1.8"
+ },
+ "require-dev": {
+ "symfony/process": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Filesystem\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides basic utilities for the filesystem",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/filesystem/tree/v7.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-10-25T15:15:23+00:00"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "6de263e5868b9a137602dd1e33e4d48bfae99c49"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/6de263e5868b9a137602dd1e33e4d48bfae99c49",
+ "reference": "6de263e5868b9a137602dd1e33e4d48bfae99c49",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "symfony/filesystem": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Finder\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Finds files and directories via an intuitive fluent interface",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/finder/tree/v7.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-10-23T06:56:12+00:00"
+ },
+ {
+ "name": "symfony/flex",
+ "version": "v2.4.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/flex.git",
+ "reference": "92f4fba342161ff36072bd3b8e0b3c6c23160402"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/flex/zipball/92f4fba342161ff36072bd3b8e0b3c6c23160402",
+ "reference": "92f4fba342161ff36072bd3b8e0b3c6c23160402",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^2.1",
+ "php": ">=8.0"
+ },
+ "conflict": {
+ "composer/semver": "<1.7.2"
+ },
+ "require-dev": {
+ "composer/composer": "^2.1",
+ "symfony/dotenv": "^5.4|^6.0",
+ "symfony/filesystem": "^5.4|^6.0",
+ "symfony/phpunit-bridge": "^5.4|^6.0",
+ "symfony/process": "^5.4|^6.0"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "Symfony\\Flex\\Flex"
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Flex\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien.potencier@gmail.com"
+ }
+ ],
+ "description": "Composer plugin for Symfony",
+ "support": {
+ "issues": "https://github.com/symfony/flex/issues",
+ "source": "https://github.com/symfony/flex/tree/v2.4.7"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-10-07T08:51:54+00:00"
+ },
+ {
+ "name": "symfony/framework-bundle",
+ "version": "v7.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/framework-bundle.git",
+ "reference": "1c630f4697c9bd87b342e8090cc9022071af4d77"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/1c630f4697c9bd87b342e8090cc9022071af4d77",
+ "reference": "1c630f4697c9bd87b342e8090cc9022071af4d77",
+ "shasum": ""
+ },
+ "require": {
+ "composer-runtime-api": ">=2.1",
+ "ext-xml": "*",
+ "php": ">=8.2",
+ "symfony/cache": "^6.4|^7.0",
+ "symfony/config": "^6.4|^7.0",
+ "symfony/dependency-injection": "^7.2",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/error-handler": "^6.4|^7.0",
+ "symfony/event-dispatcher": "^6.4|^7.0",
+ "symfony/filesystem": "^7.1",
+ "symfony/finder": "^6.4|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/http-kernel": "^7.2",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/routing": "^6.4|^7.0"
+ },
+ "conflict": {
+ "doctrine/persistence": "<1.3",
+ "phpdocumentor/reflection-docblock": "<3.2.2",
+ "phpdocumentor/type-resolver": "<1.4.0",
+ "symfony/asset": "<6.4",
+ "symfony/asset-mapper": "<6.4",
+ "symfony/clock": "<6.4",
+ "symfony/console": "<6.4",
+ "symfony/dom-crawler": "<6.4",
+ "symfony/dotenv": "<6.4",
+ "symfony/form": "<6.4",
+ "symfony/http-client": "<6.4",
+ "symfony/lock": "<6.4",
+ "symfony/mailer": "<6.4",
+ "symfony/messenger": "<6.4",
+ "symfony/mime": "<6.4",
+ "symfony/property-access": "<6.4",
+ "symfony/property-info": "<6.4",
+ "symfony/runtime": "<6.4.13|>=7.0,<7.1.6",
+ "symfony/scheduler": "<6.4.4|>=7.0.0,<7.0.4",
+ "symfony/security-core": "<6.4",
+ "symfony/security-csrf": "<7.2",
+ "symfony/serializer": "<7.1",
+ "symfony/stopwatch": "<6.4",
+ "symfony/translation": "<6.4",
+ "symfony/twig-bridge": "<6.4",
+ "symfony/twig-bundle": "<6.4",
+ "symfony/validator": "<6.4",
+ "symfony/web-profiler-bundle": "<6.4",
+ "symfony/webhook": "<7.2",
+ "symfony/workflow": "<6.4"
+ },
+ "require-dev": {
+ "doctrine/persistence": "^1.3|^2|^3",
+ "dragonmantank/cron-expression": "^3.1",
+ "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
+ "seld/jsonlint": "^1.10",
+ "symfony/asset": "^6.4|^7.0",
+ "symfony/asset-mapper": "^6.4|^7.0",
+ "symfony/browser-kit": "^6.4|^7.0",
+ "symfony/clock": "^6.4|^7.0",
+ "symfony/console": "^6.4|^7.0",
+ "symfony/css-selector": "^6.4|^7.0",
+ "symfony/dom-crawler": "^6.4|^7.0",
+ "symfony/dotenv": "^6.4|^7.0",
+ "symfony/expression-language": "^6.4|^7.0",
+ "symfony/form": "^6.4|^7.0",
+ "symfony/html-sanitizer": "^6.4|^7.0",
+ "symfony/http-client": "^6.4|^7.0",
+ "symfony/lock": "^6.4|^7.0",
+ "symfony/mailer": "^6.4|^7.0",
+ "symfony/messenger": "^6.4|^7.0",
+ "symfony/mime": "^6.4|^7.0",
+ "symfony/notifier": "^6.4|^7.0",
+ "symfony/polyfill-intl-icu": "~1.0",
+ "symfony/process": "^6.4|^7.0",
+ "symfony/property-info": "^6.4|^7.0",
+ "symfony/rate-limiter": "^6.4|^7.0",
+ "symfony/scheduler": "^6.4.4|^7.0.4",
+ "symfony/security-bundle": "^6.4|^7.0",
+ "symfony/semaphore": "^6.4|^7.0",
+ "symfony/serializer": "^7.1",
+ "symfony/stopwatch": "^6.4|^7.0",
+ "symfony/string": "^6.4|^7.0",
+ "symfony/translation": "^6.4|^7.0",
+ "symfony/twig-bundle": "^6.4|^7.0",
+ "symfony/type-info": "^7.1",
+ "symfony/uid": "^6.4|^7.0",
+ "symfony/validator": "^6.4|^7.0",
+ "symfony/web-link": "^6.4|^7.0",
+ "symfony/webhook": "^7.2",
+ "symfony/workflow": "^6.4|^7.0",
+ "symfony/yaml": "^6.4|^7.0",
+ "twig/twig": "^3.12"
+ },
+ "type": "symfony-bundle",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bundle\\FrameworkBundle\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/framework-bundle/tree/v7.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-07T13:24:01+00:00"
+ },
+ {
+ "name": "symfony/http-foundation",
+ "version": "v7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-foundation.git",
+ "reference": "e88a66c3997859532bc2ddd6dd8f35aba2711744"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e88a66c3997859532bc2ddd6dd8f35aba2711744",
+ "reference": "e88a66c3997859532bc2ddd6dd8f35aba2711744",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3.0",
+ "symfony/polyfill-mbstring": "~1.1",
+ "symfony/polyfill-php83": "^1.27"
+ },
+ "conflict": {
+ "doctrine/dbal": "<3.6",
+ "symfony/cache": "<6.4.12|>=7.0,<7.1.5"
+ },
+ "require-dev": {
+ "doctrine/dbal": "^3.6|^4",
+ "predis/predis": "^1.1|^2.0",
+ "symfony/cache": "^6.4.12|^7.1.5",
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/expression-language": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/mime": "^6.4|^7.0",
+ "symfony/rate-limiter": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\HttpFoundation\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Defines an object-oriented layer for the HTTP specification",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/http-foundation/tree/v7.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-11-13T18:58:46+00:00"
+ },
+ {
+ "name": "symfony/http-kernel",
+ "version": "v7.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-kernel.git",
+ "reference": "d8ae58eecae44c8e66833e76cc50a4ad3c002d97"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/d8ae58eecae44c8e66833e76cc50a4ad3c002d97",
+ "reference": "d8ae58eecae44c8e66833e76cc50a4ad3c002d97",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "psr/log": "^1|^2|^3",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/error-handler": "^6.4|^7.0",
+ "symfony/event-dispatcher": "^6.4|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "conflict": {
+ "symfony/browser-kit": "<6.4",
+ "symfony/cache": "<6.4",
+ "symfony/config": "<6.4",
+ "symfony/console": "<6.4",
+ "symfony/dependency-injection": "<6.4",
+ "symfony/doctrine-bridge": "<6.4",
+ "symfony/form": "<6.4",
+ "symfony/http-client": "<6.4",
+ "symfony/http-client-contracts": "<2.5",
+ "symfony/mailer": "<6.4",
+ "symfony/messenger": "<6.4",
+ "symfony/translation": "<6.4",
+ "symfony/translation-contracts": "<2.5",
+ "symfony/twig-bridge": "<6.4",
+ "symfony/validator": "<6.4",
+ "symfony/var-dumper": "<6.4",
+ "twig/twig": "<3.12"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0|2.0|3.0"
+ },
+ "require-dev": {
+ "psr/cache": "^1.0|^2.0|^3.0",
+ "symfony/browser-kit": "^6.4|^7.0",
+ "symfony/clock": "^6.4|^7.0",
+ "symfony/config": "^6.4|^7.0",
+ "symfony/console": "^6.4|^7.0",
+ "symfony/css-selector": "^6.4|^7.0",
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/dom-crawler": "^6.4|^7.0",
+ "symfony/expression-language": "^6.4|^7.0",
+ "symfony/finder": "^6.4|^7.0",
+ "symfony/http-client-contracts": "^2.5|^3",
+ "symfony/process": "^6.4|^7.0",
+ "symfony/property-access": "^7.1",
+ "symfony/routing": "^6.4|^7.0",
+ "symfony/serializer": "^7.1",
+ "symfony/stopwatch": "^6.4|^7.0",
+ "symfony/translation": "^6.4|^7.0",
+ "symfony/translation-contracts": "^2.5|^3",
+ "symfony/uid": "^6.4|^7.0",
+ "symfony/validator": "^6.4|^7.0",
+ "symfony/var-dumper": "^6.4|^7.0",
+ "symfony/var-exporter": "^6.4|^7.0",
+ "twig/twig": "^3.12"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\HttpKernel\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides a structured process for converting a Request into a Response",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/http-kernel/tree/v7.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-11T12:09:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
+ "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's grapheme_* functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "grapheme",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "intl",
+ "normalizer",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341",
+ "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-mbstring": "*"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php83",
+ "version": "v1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php83.git",
+ "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491",
+ "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php83\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/routing",
+ "version": "v7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/routing.git",
+ "reference": "e10a2450fa957af6c448b9b93c9010a4e4c0725e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/e10a2450fa957af6c448b9b93c9010a4e4c0725e",
+ "reference": "e10a2450fa957af6c448b9b93c9010a4e4c0725e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "symfony/config": "<6.4",
+ "symfony/dependency-injection": "<6.4",
+ "symfony/yaml": "<6.4"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^6.4|^7.0",
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/expression-language": "^6.4|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/yaml": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Routing\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Maps an HTTP request to a set of configuration variables",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "router",
+ "routing",
+ "uri",
+ "url"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/routing/tree/v7.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-11-25T11:08:51+00:00"
+ },
+ {
+ "name": "symfony/runtime",
+ "version": "v7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/runtime.git",
+ "reference": "2c350568f3eaccb25fbbbf962bd67cde273121a7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/runtime/zipball/2c350568f3eaccb25fbbbf962bd67cde273121a7",
+ "reference": "2c350568f3eaccb25fbbbf962bd67cde273121a7",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.0|^2.0",
+ "php": ">=8.2"
+ },
+ "conflict": {
+ "symfony/dotenv": "<6.4"
+ },
+ "require-dev": {
+ "composer/composer": "^2.6",
+ "symfony/console": "^6.4|^7.0",
+ "symfony/dotenv": "^6.4|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "Symfony\\Component\\Runtime\\Internal\\ComposerPlugin"
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Runtime\\": "",
+ "Symfony\\Runtime\\Symfony\\Component\\": "Internal/"
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Enables decoupling PHP applications from global state",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "runtime"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/runtime/tree/v7.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-11-06T11:43:25+00:00"
+ },
+ {
+ "name": "symfony/service-contracts",
+ "version": "v3.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0",
+ "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/container": "^1.1|^2.0",
+ "symfony/deprecation-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "ext-psr": "<1.1|>=2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Service\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to writing services",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/service-contracts/tree/v3.5.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-25T14:20:29+00:00"
+ },
+ {
+ "name": "symfony/string",
+ "version": "v7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/string.git",
+ "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82",
+ "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-normalizer": "~1.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/translation-contracts": "<2.5"
+ },
+ "require-dev": {
+ "symfony/emoji": "^7.1",
+ "symfony/error-handler": "^6.4|^7.0",
+ "symfony/http-client": "^6.4|^7.0",
+ "symfony/intl": "^6.4|^7.0",
+ "symfony/translation-contracts": "^2.5|^3.0",
+ "symfony/var-exporter": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\String\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "grapheme",
+ "i18n",
+ "string",
+ "unicode",
+ "utf-8",
+ "utf8"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/string/tree/v7.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-11-13T13:31:26+00:00"
+ },
+ {
+ "name": "symfony/var-dumper",
+ "version": "v7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/var-dumper.git",
+ "reference": "c6a22929407dec8765d6e2b6ff85b800b245879c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c6a22929407dec8765d6e2b6ff85b800b245879c",
+ "reference": "c6a22929407dec8765d6e2b6ff85b800b245879c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/console": "<6.4"
+ },
+ "require-dev": {
+ "ext-iconv": "*",
+ "symfony/console": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/process": "^6.4|^7.0",
+ "symfony/uid": "^6.4|^7.0",
+ "twig/twig": "^3.12"
+ },
+ "bin": [
+ "Resources/bin/var-dump-server"
+ ],
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions/dump.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\VarDumper\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides mechanisms for walking through any arbitrary PHP variable",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "debug",
+ "dump"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/var-dumper/tree/v7.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-11-08T15:48:14+00:00"
+ },
+ {
+ "name": "symfony/var-exporter",
+ "version": "v7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/var-exporter.git",
+ "reference": "1a6a89f95a46af0f142874c9d650a6358d13070d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/var-exporter/zipball/1a6a89f95a46af0f142874c9d650a6358d13070d",
+ "reference": "1a6a89f95a46af0f142874c9d650a6358d13070d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "symfony/property-access": "^6.4|^7.0",
+ "symfony/serializer": "^6.4|^7.0",
+ "symfony/var-dumper": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\VarExporter\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Allows exporting any serializable PHP data structure to plain PHP code",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "clone",
+ "construct",
+ "export",
+ "hydrate",
+ "instantiate",
+ "lazy-loading",
+ "proxy",
+ "serialize"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/var-exporter/tree/v7.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-10-18T07:58:17+00:00"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "099581e99f557e9f16b43c5916c26380b54abb22"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/099581e99f557e9f16b43c5916c26380b54abb22",
+ "reference": "099581e99f557e9f16b43c5916c26380b54abb22",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3.0",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "conflict": {
+ "symfony/console": "<6.4"
+ },
+ "require-dev": {
+ "symfony/console": "^6.4|^7.0"
+ },
+ "bin": [
+ "Resources/bin/yaml-lint"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Loads and dumps YAML files",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/yaml/tree/v7.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-10-23T06:56:12+00:00"
+ }
+ ],
+ "packages-dev": [],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": {},
+ "prefer-stable": true,
+ "prefer-lowest": false,
+ "platform": {
+ "php": ">=8.3.15",
+ "ext-ctype": "*",
+ "ext-iconv": "*"
+ },
+ "platform-dev": {},
+ "plugin-api-version": "2.6.0"
+}
diff --git a/config/bundles.php b/config/bundles.php
new file mode 100644
index 0000000..49d3fb6
--- /dev/null
+++ b/config/bundles.php
@@ -0,0 +1,5 @@
+ ['all' => true],
+];
diff --git a/config/packages/cache.yaml b/config/packages/cache.yaml
new file mode 100644
index 0000000..6899b72
--- /dev/null
+++ b/config/packages/cache.yaml
@@ -0,0 +1,19 @@
+framework:
+ cache:
+ # Unique name of your app: used to compute stable namespaces for cache keys.
+ #prefix_seed: your_vendor_name/app_name
+
+ # The "app" cache stores to the filesystem by default.
+ # The data in this cache should persist between deploys.
+ # Other options include:
+
+ # Redis
+ #app: cache.adapter.redis
+ #default_redis_provider: redis://localhost
+
+ # APCu (not recommended with heavy random-write workloads as memory fragmentation can cause perf issues)
+ #app: cache.adapter.apcu
+
+ # Namespaced pools use the above "app" backend by default
+ #pools:
+ #my.dedicated.cache: null
diff --git a/config/packages/framework.yaml b/config/packages/framework.yaml
new file mode 100644
index 0000000..7e1ee1f
--- /dev/null
+++ b/config/packages/framework.yaml
@@ -0,0 +1,15 @@
+# see https://symfony.com/doc/current/reference/configuration/framework.html
+framework:
+ secret: '%env(APP_SECRET)%'
+
+ # Note that the session will be started ONLY if you read or write from it.
+ session: true
+
+ #esi: true
+ #fragments: true
+
+when@test:
+ framework:
+ test: true
+ session:
+ storage_factory_id: session.storage.factory.mock_file
diff --git a/config/packages/routing.yaml b/config/packages/routing.yaml
new file mode 100644
index 0000000..8166181
--- /dev/null
+++ b/config/packages/routing.yaml
@@ -0,0 +1,10 @@
+framework:
+ router:
+ # Configure how to generate URLs in non-HTTP contexts, such as CLI commands.
+ # See https://symfony.com/doc/current/routing.html#generating-urls-in-commands
+ #default_uri: http://localhost
+
+when@prod:
+ framework:
+ router:
+ strict_requirements: null
diff --git a/config/preload.php b/config/preload.php
new file mode 100644
index 0000000..5ebcdb2
--- /dev/null
+++ b/config/preload.php
@@ -0,0 +1,5 @@
+uri query {
+ replace authorization REDACTED
+ }
+ }
+ }
+
+ root /app/public
+ encode zstd br gzip
+
+ mercure {
+ # Transport to use (default to Bolt)
+ transport_url {$MERCURE_TRANSPORT_URL:bolt:///data/mercure.db}
+ # Publisher JWT key
+ publisher_jwt {env.MERCURE_PUBLISHER_JWT_KEY} {env.MERCURE_PUBLISHER_JWT_ALG}
+ # Subscriber JWT key
+ subscriber_jwt {env.MERCURE_SUBSCRIBER_JWT_KEY} {env.MERCURE_SUBSCRIBER_JWT_ALG}
+ # Allow anonymous subscribers (double-check that it's what you want)
+ anonymous
+ # Enable the subscription API (double-check that it's what you want)
+ subscriptions
+ # Extra directives
+ {$MERCURE_EXTRA_DIRECTIVES}
+ }
+
+ vulcain
+
+ {$CADDY_SERVER_EXTRA_DIRECTIVES}
+
+ # Disable Topics tracking if not enabled explicitly: https://github.com/jkarlin/topics
+ header ?Permissions-Policy "browsing-topics=()"
+
+ @phpRoute {
+ not path /.well-known/mercure*
+ not file {path}
+ }
+ rewrite @phpRoute index.php
+
+ @frontController path index.php
+ php @frontController
+
+ file_server
+}
diff --git a/frankenphp/conf.d/10-app.ini b/frankenphp/conf.d/10-app.ini
new file mode 100644
index 0000000..79a17dd
--- /dev/null
+++ b/frankenphp/conf.d/10-app.ini
@@ -0,0 +1,13 @@
+expose_php = 0
+date.timezone = UTC
+apc.enable_cli = 1
+session.use_strict_mode = 1
+zend.detect_unicode = 0
+
+; https://symfony.com/doc/current/performance.html
+realpath_cache_size = 4096K
+realpath_cache_ttl = 600
+opcache.interned_strings_buffer = 16
+opcache.max_accelerated_files = 20000
+opcache.memory_consumption = 256
+opcache.enable_file_override = 1
diff --git a/frankenphp/conf.d/20-app.dev.ini b/frankenphp/conf.d/20-app.dev.ini
new file mode 100644
index 0000000..e50f43d
--- /dev/null
+++ b/frankenphp/conf.d/20-app.dev.ini
@@ -0,0 +1,5 @@
+; See https://docs.docker.com/desktop/networking/#i-want-to-connect-from-a-container-to-a-service-on-the-host
+; See https://github.com/docker/for-linux/issues/264
+; The `client_host` below may optionally be replaced with `discover_client_host=yes`
+; Add `start_with_request=yes` to start debug session on each request
+xdebug.client_host = host.docker.internal
diff --git a/frankenphp/conf.d/20-app.prod.ini b/frankenphp/conf.d/20-app.prod.ini
new file mode 100644
index 0000000..3bcaa71
--- /dev/null
+++ b/frankenphp/conf.d/20-app.prod.ini
@@ -0,0 +1,2 @@
+opcache.preload_user = root
+opcache.preload = /app/config/preload.php
diff --git a/frankenphp/docker-entrypoint.sh b/frankenphp/docker-entrypoint.sh
new file mode 100755
index 0000000..c62faad
--- /dev/null
+++ b/frankenphp/docker-entrypoint.sh
@@ -0,0 +1,62 @@
+#!/bin/sh
+set -e
+
+if [ "$1" = 'frankenphp' ] || [ "$1" = 'php' ] || [ "$1" = 'bin/console' ]; then
+ # Install the project the first time PHP is started
+ # After the installation, the following block can be deleted
+ if [ ! -f composer.json ]; then
+ rm -Rf tmp/
+ composer create-project "symfony/skeleton $SYMFONY_VERSION" tmp --stability="$STABILITY" --prefer-dist --no-progress --no-interaction --no-install
+
+ cd tmp
+ cp -Rp . ..
+ cd -
+ rm -Rf tmp/
+
+ composer require "php:>=$PHP_VERSION" runtime/frankenphp-symfony
+ composer config --json extra.symfony.docker 'true'
+
+ if grep -q ^DATABASE_URL= .env; then
+ echo 'To finish the installation please press Ctrl+C to stop Docker Compose and run: docker compose up --build -d --wait'
+ sleep infinity
+ fi
+ fi
+
+ if [ -z "$(ls -A 'vendor/' 2>/dev/null)" ]; then
+ composer install --prefer-dist --no-progress --no-interaction
+ fi
+
+ if grep -q ^DATABASE_URL= .env; then
+ echo 'Waiting for database to be ready...'
+ ATTEMPTS_LEFT_TO_REACH_DATABASE=60
+ until [ $ATTEMPTS_LEFT_TO_REACH_DATABASE -eq 0 ] || DATABASE_ERROR=$(php bin/console dbal:run-sql -q "SELECT 1" 2>&1); do
+ if [ $? -eq 255 ]; then
+ # If the Doctrine command exits with 255, an unrecoverable error occurred
+ ATTEMPTS_LEFT_TO_REACH_DATABASE=0
+ break
+ fi
+ sleep 1
+ ATTEMPTS_LEFT_TO_REACH_DATABASE=$((ATTEMPTS_LEFT_TO_REACH_DATABASE - 1))
+ echo "Still waiting for database to be ready... Or maybe the database is not reachable. $ATTEMPTS_LEFT_TO_REACH_DATABASE attempts left."
+ done
+
+ if [ $ATTEMPTS_LEFT_TO_REACH_DATABASE -eq 0 ]; then
+ echo 'The database is not up or not reachable:'
+ echo "$DATABASE_ERROR"
+ exit 1
+ else
+ echo 'The database is now ready and reachable'
+ fi
+
+ if [ "$( find ./migrations -iname '*.php' -print -quit )" ]; then
+ php bin/console doctrine:migrations:migrate --no-interaction --all-or-nothing
+ fi
+ fi
+
+ setfacl -R -m u:www-data:rwX -m u:"$(whoami)":rwX var
+ setfacl -dR -m u:www-data:rwX -m u:"$(whoami)":rwX var
+
+ echo 'PHP app ready!'
+fi
+
+exec docker-php-entrypoint "$@"
diff --git a/frankenphp/worker.Caddyfile b/frankenphp/worker.Caddyfile
new file mode 100644
index 0000000..d384ae4
--- /dev/null
+++ b/frankenphp/worker.Caddyfile
@@ -0,0 +1,4 @@
+worker {
+ file ./public/index.php
+ env APP_RUNTIME Runtime\FrankenPhpSymfony\Runtime
+}
diff --git a/public/index.php b/public/index.php
new file mode 100644
index 0000000..9982c21
--- /dev/null
+++ b/public/index.php
@@ -0,0 +1,9 @@
+ Quiz:
- try:
- return Quiz.objects.get(id=value)
- except Quiz.DoesNotExist:
- raise ValueError
-
- def to_url(self, value: Quiz | int) -> str:
- return str(value.id) if isinstance(value, Quiz) else value
diff --git a/tvdt/backoffice/migrations/__init__.py b/tvdt/backoffice/migrations/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/tvdt/backoffice/templates/backoffice/base.html b/tvdt/backoffice/templates/backoffice/base.html
deleted file mode 100644
index 7765e22..0000000
--- a/tvdt/backoffice/templates/backoffice/base.html
+++ /dev/null
@@ -1,36 +0,0 @@
-{% load i18n %}
-{% load static %}
-
-
-
-
-
-
-
-
- {% block title %}
- {% translate "Tijd voor de test" %}
- {% endblock title %}
-
-
-
- {% block nav %}
- {% include "backoffice/nav.html" %}
- {% endblock nav %}
-
-
- {% include "messages.html" %}
- {% block body %}
- {% endblock body %}
-
-
-
- {% block script %}
- {% endblock script %}
-
diff --git a/tvdt/backoffice/templates/backoffice/index.html b/tvdt/backoffice/templates/backoffice/index.html
deleted file mode 100644
index d61e80b..0000000
--- a/tvdt/backoffice/templates/backoffice/index.html
+++ /dev/null
@@ -1,45 +0,0 @@
-{% extends "backoffice/base.html" %}
-{% load i18n %}
-{% block body %}
- {% translate "Your Seasons" %}
-
-{% endblock body %}
diff --git a/tvdt/backoffice/templates/backoffice/nav.html b/tvdt/backoffice/templates/backoffice/nav.html
deleted file mode 100644
index 6f03737..0000000
--- a/tvdt/backoffice/templates/backoffice/nav.html
+++ /dev/null
@@ -1,51 +0,0 @@
-{% load i18n %}
-
diff --git a/tvdt/backoffice/templates/backoffice/quiz.html b/tvdt/backoffice/templates/backoffice/quiz.html
deleted file mode 100644
index e880f0e..0000000
--- a/tvdt/backoffice/templates/backoffice/quiz.html
+++ /dev/null
@@ -1,92 +0,0 @@
-{% extends "backoffice/base.html" %}
-{% load i18n %}
-{% block body %}
-
-
{% translate "Quiz" %}: {{ quiz.season.name }} - {{ quiz.name }}
-
-
-
-
{% translate "Questions" %}
-
-
- {% for question in quiz.questions.all %}
-
-
-
-
- {% for answer in question.answers.all %}
-
{{ answer.text }}
- {% empty %}
- {% translate "There are no answers for this question" %}
- {% endfor %}
-
-
-
- {% empty %}
- EMPTY
- {% endfor %}
-
-
-
-
-
{% translate "Score" %}
-
-
-
{% translate "Number of dropouts:" %} {{ quiz.dropouts }}
-
-
-
- | {% translate "Candidate" %} |
- {% translate "Correct Answers" %} |
- {% translate "Corrections" %} |
- {% translate "Score" %} |
- {% translate "Time" %} |
-
-
-
- {% with result=quiz.get_score %}
- {% for candidate in result %}
-
- | {{ candidate.name }} |
- {{ candidate.correct }} |
- {{ candidate.corrections }} |
- {{ candidate.score }} |
- {{ candidate.time }} |
-
- {% empty %}
- {% endfor %}
-
-
- {% endwith %}
-
-{% endblock body %}
-{% block script %}
-
-{% endblock script %}
diff --git a/tvdt/backoffice/templates/backoffice/season.html b/tvdt/backoffice/templates/backoffice/season.html
deleted file mode 100644
index 9b824a9..0000000
--- a/tvdt/backoffice/templates/backoffice/season.html
+++ /dev/null
@@ -1,25 +0,0 @@
-{% extends "backoffice/base.html" %}
-{% load i18n %}
-{% block body %}
-
-
{% translate "Season" %}: {{ season.name }}
-
-
-
-
{% translate "Quizzes" %}
-
- {% for quiz in season.quizzes.all %}
-
{{ quiz.name }}
- {% empty %}
- {% endfor %}
-
-
-
-
{% translate "Candidates" %}
-
- {% for candidate in season.candidates.all %}- {{ candidate.name }}
{% endfor %}
-
-
-
-{% endblock body %}
diff --git a/tvdt/backoffice/tests.py b/tvdt/backoffice/tests.py
deleted file mode 100644
index 7ce503c..0000000
--- a/tvdt/backoffice/tests.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from django.test import TestCase
-
-# Create your tests here.
diff --git a/tvdt/backoffice/urls.py b/tvdt/backoffice/urls.py
deleted file mode 100644
index 1190c97..0000000
--- a/tvdt/backoffice/urls.py
+++ /dev/null
@@ -1,21 +0,0 @@
-from django.contrib.auth.decorators import login_required
-from django.urls import path, register_converter
-
-from tvdt.converters import SeasonCodeConverter
-
-from .converters import QuizConverter
-from .views import BackofficeIndexView, QuizView, SeasonView
-
-register_converter(SeasonCodeConverter, "season")
-register_converter(QuizConverter, "quiz")
-
-app_name = "backoffice"
-urlpatterns = [
- path("", login_required(BackofficeIndexView.as_view()), name="index"),
- path(
- "/",
- login_required(SeasonView.as_view()),
- name="season",
- ),
- path("/", login_required(QuizView.as_view()), name="quiz"),
-]
diff --git a/tvdt/backoffice/views/__init__.py b/tvdt/backoffice/views/__init__.py
deleted file mode 100644
index 6bcb9a9..0000000
--- a/tvdt/backoffice/views/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from .home import BackofficeIndexView
-from .quiz import QuizView
-from .season import SeasonView
diff --git a/tvdt/backoffice/views/home.py b/tvdt/backoffice/views/home.py
deleted file mode 100644
index 23f8f51..0000000
--- a/tvdt/backoffice/views/home.py
+++ /dev/null
@@ -1,10 +0,0 @@
-from django.http import HttpRequest
-from django.views.generic import TemplateView
-
-
-class BackofficeIndexView(TemplateView):
- template_name = "backoffice/index.html"
-
- def get(self, request: HttpRequest, *args, **kwargs):
- seasons = request.user.seasons.all()
- return self.render_to_response({"seasons": seasons})
diff --git a/tvdt/backoffice/views/quiz.py b/tvdt/backoffice/views/quiz.py
deleted file mode 100644
index 7144121..0000000
--- a/tvdt/backoffice/views/quiz.py
+++ /dev/null
@@ -1,13 +0,0 @@
-from django.http import HttpRequest
-from django.views import View
-from django.views.generic.base import TemplateResponseMixin
-
-from quiz.models import Quiz
-
-
-class QuizView(View, TemplateResponseMixin):
- template_name = "backoffice/quiz.html"
-
- def get(self, request: HttpRequest, quiz: Quiz, *args, **kwargs):
-
- return self.render_to_response({"quiz": quiz})
diff --git a/tvdt/backoffice/views/season.py b/tvdt/backoffice/views/season.py
deleted file mode 100644
index de3c0e9..0000000
--- a/tvdt/backoffice/views/season.py
+++ /dev/null
@@ -1,12 +0,0 @@
-from django.http import HttpRequest
-from django.views import View
-from django.views.generic.base import TemplateResponseMixin
-
-from quiz.models import Season
-
-
-class SeasonView(View, TemplateResponseMixin):
- template_name = "backoffice/season.html"
-
- def get(self, request: HttpRequest, season: Season, *args, **kwargs):
- return self.render_to_response({"season": season})
diff --git a/tvdt/locale/nl/LC_MESSAGES/django.po b/tvdt/locale/nl/LC_MESSAGES/django.po
deleted file mode 100644
index b06f02e..0000000
--- a/tvdt/locale/nl/LC_MESSAGES/django.po
+++ /dev/null
@@ -1,122 +0,0 @@
-# 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-12-11 23:22+0100\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"
-
-#: backoffice/templates/backoffice/base.html:18
-msgid "Tijd voor de test"
-msgstr "Tijd voor de test"
-
-#: backoffice/templates/backoffice/index.html:4
-msgid "Your Seasons"
-msgstr "Jouw seizoenen"
-
-#: backoffice/templates/backoffice/index.html:8
-msgid "Name"
-msgstr "Naam"
-
-#: backoffice/templates/backoffice/index.html:9
-msgid "Active Quiz"
-msgstr "Actieve test"
-
-#: backoffice/templates/backoffice/index.html:10
-msgid "Season Code"
-msgstr "Seizoenscode"
-
-#: backoffice/templates/backoffice/index.html:11
-msgid "Preregister?"
-msgstr "Voorregistreren?"
-
-#: backoffice/templates/backoffice/index.html:12
-#: backoffice/templates/backoffice/index.html:37
-msgid "Manage"
-msgstr "Beheer"
-
-#: backoffice/templates/backoffice/index.html:23
-msgid "No active quiz"
-msgstr "Geen actieve test"
-
-#: backoffice/templates/backoffice/quiz.html:5
-msgid "Quiz"
-msgstr "Test"
-
-#: backoffice/templates/backoffice/quiz.html:9
-msgid "Questions"
-msgstr "Vragen"
-
-#: backoffice/templates/backoffice/quiz.html:36
-msgid "There are no answers for this question"
-msgstr "Er zijn geen antwoorden voor deze vraag"
-
-#: backoffice/templates/backoffice/quiz.html:48
-#: backoffice/templates/backoffice/quiz.html:66
-msgid "Score"
-msgstr "Score"
-
-#: backoffice/templates/backoffice/quiz.html:52
-msgid "Start Elimination"
-msgstr "Start eliminatie"
-
-#: backoffice/templates/backoffice/quiz.html:55
-msgid "Prepare Custom Elimination"
-msgstr "Aangepaste eliminatie voorbereiden"
-
-#: backoffice/templates/backoffice/quiz.html:56
-msgid "Load Prepared Elimination"
-msgstr "Aangepaste eliminatie inladen"
-
-#: backoffice/templates/backoffice/quiz.html:59
-msgid "Number of dropouts:"
-msgstr "Aantal afvallers:"
-
-#: backoffice/templates/backoffice/quiz.html:63
-msgid "Candidate"
-msgstr "Kandidaat"
-
-#: backoffice/templates/backoffice/quiz.html:64
-msgid "Correct Answers"
-msgstr "Goede antwoorden"
-
-#: backoffice/templates/backoffice/quiz.html:65
-msgid "Corrections"
-msgstr "Jokers"
-
-#: backoffice/templates/backoffice/quiz.html:67
-msgid "Time"
-msgstr "Tijd"
-
-#: backoffice/templates/backoffice/season.html:5
-msgid "Season"
-msgstr "Seizoen"
-
-#: backoffice/templates/backoffice/season.html:9
-
-msgid "Quizzes"
-msgstr "Tests"
-
-#: backoffice/templates/backoffice/season.html:21
-msgid "Candidates"
-msgstr "Kandidaten"
-
-#: tvdt/settings.py:173
-msgid "Dutch"
-msgstr "Nederlands"
-
-#: tvdt/settings.py:173
-msgid "English"
-msgstr "Engels"
diff --git a/tvdt/manage.py b/tvdt/manage.py
deleted file mode 100755
index 1991df3..0000000
--- a/tvdt/manage.py
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/usr/bin/env python
-"""Django's command-line utility for administrative tasks."""
-import os
-import sys
-
-
-def main() -> None:
- """Run administrative tasks."""
- os.environ.setdefault("DJANGO_SETTINGS_MODULE", "tvdt.settings")
- try:
- from django.core.management import execute_from_command_line
- except ImportError as exc:
- raise ImportError(
- "Couldn't import Django. Are you sure it's installed and "
- "available on your PYTHONPATH environment variable? Did you "
- "forget to activate a virtual environment?"
- ) from exc
- execute_from_command_line(sys.argv)
-
-
-if __name__ == "__main__":
- main()
diff --git a/tvdt/poetry.lock b/tvdt/poetry.lock
deleted file mode 100644
index dbce903..0000000
--- a/tvdt/poetry.lock
+++ /dev/null
@@ -1,1163 +0,0 @@
-# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand.
-
-[[package]]
-name = "asgiref"
-version = "3.8.1"
-description = "ASGI specs, helper code, and adapters"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47"},
- {file = "asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590"},
-]
-
-[package.extras]
-tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"]
-
-[[package]]
-name = "black"
-version = "24.10.0"
-description = "The uncompromising code formatter."
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"},
- {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"},
- {file = "black-24.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:649fff99a20bd06c6f727d2a27f401331dc0cc861fb69cde910fe95b01b5928f"},
- {file = "black-24.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:fe4d6476887de70546212c99ac9bd803d90b42fc4767f058a0baa895013fbb3e"},
- {file = "black-24.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad"},
- {file = "black-24.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9da3333530dbcecc1be13e69c250ed8dfa67f43c4005fb537bb426e19200d50"},
- {file = "black-24.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392"},
- {file = "black-24.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:394d4ddc64782e51153eadcaaca95144ac4c35e27ef9b0a42e121ae7e57a9175"},
- {file = "black-24.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e39e0fae001df40f95bd8cc36b9165c5e2ea88900167bddf258bacef9bbdc3"},
- {file = "black-24.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d37d422772111794b26757c5b55a3eade028aa3fde43121ab7b673d050949d65"},
- {file = "black-24.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14b3502784f09ce2443830e3133dacf2c0110d45191ed470ecb04d0f5f6fcb0f"},
- {file = "black-24.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:30d2c30dc5139211dda799758559d1b049f7f14c580c409d6ad925b74a4208a8"},
- {file = "black-24.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cbacacb19e922a1d75ef2b6ccaefcd6e93a2c05ede32f06a21386a04cedb981"},
- {file = "black-24.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f93102e0c5bb3907451063e08b9876dbeac810e7da5a8bfb7aeb5a9ef89066b"},
- {file = "black-24.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddacb691cdcdf77b96f549cf9591701d8db36b2f19519373d60d31746068dbf2"},
- {file = "black-24.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:680359d932801c76d2e9c9068d05c6b107f2584b2a5b88831c83962eb9984c1b"},
- {file = "black-24.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:17374989640fbca88b6a448129cd1745c5eb8d9547b464f281b251dd00155ccd"},
- {file = "black-24.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:63f626344343083322233f175aaf372d326de8436f5928c042639a4afbbf1d3f"},
- {file = "black-24.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfa1d0cb6200857f1923b602f978386a3a2758a65b52e0950299ea014be6800"},
- {file = "black-24.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cd9c95431d94adc56600710f8813ee27eea544dd118d45896bb734e9d7a0dc7"},
- {file = "black-24.10.0-py3-none-any.whl", hash = "sha256:3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d"},
- {file = "black-24.10.0.tar.gz", hash = "sha256:846ea64c97afe3bc677b761787993be4991810ecc7a4a937816dd6bddedc4875"},
-]
-
-[package.dependencies]
-click = ">=8.0.0"
-mypy-extensions = ">=0.4.3"
-packaging = ">=22.0"
-pathspec = ">=0.9.0"
-platformdirs = ">=2"
-
-[package.extras]
-colorama = ["colorama (>=0.4.3)"]
-d = ["aiohttp (>=3.10)"]
-jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
-uvloop = ["uvloop (>=0.15.2)"]
-
-[[package]]
-name = "certifi"
-version = "2024.8.30"
-description = "Python package for providing Mozilla's CA Bundle."
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"},
- {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"},
-]
-
-[[package]]
-name = "cffi"
-version = "1.17.1"
-description = "Foreign Function Interface for Python calling C code."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"},
- {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"},
- {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"},
- {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"},
- {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"},
- {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"},
- {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"},
- {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"},
- {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"},
- {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"},
- {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"},
- {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"},
- {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"},
- {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"},
- {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"},
- {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"},
- {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"},
- {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"},
- {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"},
- {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"},
- {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"},
- {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"},
- {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"},
- {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"},
- {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"},
- {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"},
- {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"},
- {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"},
- {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"},
- {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"},
- {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"},
- {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"},
- {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"},
- {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"},
- {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"},
- {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"},
- {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"},
- {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"},
- {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"},
- {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"},
- {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"},
- {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"},
- {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"},
- {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"},
- {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"},
- {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"},
- {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"},
- {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"},
- {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"},
- {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"},
- {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"},
- {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"},
- {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"},
- {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"},
- {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"},
- {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"},
- {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"},
- {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"},
- {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"},
- {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"},
- {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"},
- {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"},
- {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"},
- {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"},
- {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"},
- {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"},
- {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"},
-]
-
-[package.dependencies]
-pycparser = "*"
-
-[[package]]
-name = "charset-normalizer"
-version = "3.4.0"
-description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
-optional = false
-python-versions = ">=3.7.0"
-files = [
- {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"},
- {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"},
- {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"},
-]
-
-[[package]]
-name = "click"
-version = "8.1.7"
-description = "Composable command line interface toolkit"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"},
- {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"},
-]
-
-[package.dependencies]
-colorama = {version = "*", markers = "platform_system == \"Windows\""}
-
-[[package]]
-name = "colorama"
-version = "0.4.6"
-description = "Cross-platform colored terminal text."
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
-files = [
- {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
- {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 = "cryptography"
-version = "44.0.0"
-description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
-optional = false
-python-versions = "!=3.9.0,!=3.9.1,>=3.7"
-files = [
- {file = "cryptography-44.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:84111ad4ff3f6253820e6d3e58be2cc2a00adb29335d4cacb5ab4d4d34f2a123"},
- {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15492a11f9e1b62ba9d73c210e2416724633167de94607ec6069ef724fad092"},
- {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831c3c4d0774e488fdc83a1923b49b9957d33287de923d58ebd3cec47a0ae43f"},
- {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb"},
- {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b"},
- {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543"},
- {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:60eb32934076fa07e4316b7b2742fa52cbb190b42c2df2863dbc4230a0a9b385"},
- {file = "cryptography-44.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e"},
- {file = "cryptography-44.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e"},
- {file = "cryptography-44.0.0-cp37-abi3-win32.whl", hash = "sha256:eb33480f1bad5b78233b0ad3e1b0be21e8ef1da745d8d2aecbb20671658b9053"},
- {file = "cryptography-44.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:abc998e0c0eee3c8a1904221d3f67dcfa76422b23620173e28c11d3e626c21bd"},
- {file = "cryptography-44.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:660cb7312a08bc38be15b696462fa7cc7cd85c3ed9c576e81f4dc4d8b2b31591"},
- {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1923cb251c04be85eec9fda837661c67c1049063305d6be5721643c22dd4e2b7"},
- {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:404fdc66ee5f83a1388be54300ae978b2efd538018de18556dde92575e05defc"},
- {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289"},
- {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7"},
- {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c"},
- {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9abcc2e083cbe8dde89124a47e5e53ec38751f0d7dfd36801008f316a127d7ba"},
- {file = "cryptography-44.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64"},
- {file = "cryptography-44.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285"},
- {file = "cryptography-44.0.0-cp39-abi3-win32.whl", hash = "sha256:eca27345e1214d1b9f9490d200f9db5a874479be914199194e746c893788d417"},
- {file = "cryptography-44.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede"},
- {file = "cryptography-44.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:37d76e6863da3774cd9db5b409a9ecfd2c71c981c38788d3fcfaf177f447b731"},
- {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:f677e1268c4e23420c3acade68fac427fffcb8d19d7df95ed7ad17cdef8404f4"},
- {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f5e7cb1e5e56ca0933b4873c0220a78b773b24d40d186b6738080b73d3d0a756"},
- {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:8b3e6eae66cf54701ee7d9c83c30ac0a1e3fa17be486033000f2a73a12ab507c"},
- {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:be4ce505894d15d5c5037167ffb7f0ae90b7be6f2a98f9a5c3442395501c32fa"},
- {file = "cryptography-44.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:62901fb618f74d7d81bf408c8719e9ec14d863086efe4185afd07c352aee1d2c"},
- {file = "cryptography-44.0.0.tar.gz", hash = "sha256:cd4e834f340b4293430701e772ec543b0fbe6c2dea510a5286fe0acabe153a02"},
-]
-
-[package.dependencies]
-cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""}
-
-[package.extras]
-docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0)"]
-docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"]
-nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2)"]
-pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"]
-sdist = ["build (>=1.0.0)"]
-ssh = ["bcrypt (>=3.1.5)"]
-test = ["certifi (>=2024)", "cryptography-vectors (==44.0.0)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"]
-test-randomorder = ["pytest-randomly"]
-
-[[package]]
-name = "cssbeautifier"
-version = "1.15.1"
-description = "CSS unobfuscator and beautifier."
-optional = false
-python-versions = "*"
-files = [
- {file = "cssbeautifier-1.15.1.tar.gz", hash = "sha256:9f7064362aedd559c55eeecf6b6bed65e05f33488dcbe39044f0403c26e1c006"},
-]
-
-[package.dependencies]
-editorconfig = ">=0.12.2"
-jsbeautifier = "*"
-six = ">=1.13.0"
-
-[[package]]
-name = "dj-database-url"
-version = "2.3.0"
-description = "Use Database URLs in your Django Application."
-optional = false
-python-versions = "*"
-files = [
- {file = "dj_database_url-2.3.0-py3-none-any.whl", hash = "sha256:bb0d414ba0ac5cd62773ec7f86f8cc378a9dbb00a80884c2fc08cc570452521e"},
- {file = "dj_database_url-2.3.0.tar.gz", hash = "sha256:ae52e8e634186b57e5a45e445da5dc407a819c2ceed8a53d1fac004cc5288787"},
-]
-
-[package.dependencies]
-Django = ">=4.2"
-typing_extensions = ">=3.10.0.0"
-
-[[package]]
-name = "dj-email-url"
-version = "1.0.6"
-description = "Use an URL to configure email backend settings in your Django Application."
-optional = false
-python-versions = "*"
-files = [
- {file = "dj-email-url-1.0.6.tar.gz", hash = "sha256:55ffe3329e48f54f8a75aa36ece08f365e09d61f8a209773ef09a1d4760e699a"},
- {file = "dj_email_url-1.0.6-py2.py3-none-any.whl", hash = "sha256:cbd08327fbb08b104eac160fb4703f375532e4c0243eb230f5b960daee7a96db"},
-]
-
-[[package]]
-name = "django"
-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.3-py3-none-any.whl", hash = "sha256:8b38a9a12da3ae00cb0ba72da985ec4b14de6345046b1e174b1fd7254398f818"},
- {file = "Django-5.1.3.tar.gz", hash = "sha256:c0fa0e619c39325a169208caef234f90baa925227032ad3f44842ba14d75234a"},
-]
-
-[package.dependencies]
-asgiref = ">=3.8.1,<4"
-sqlparse = ">=0.3.1"
-tzdata = {version = "*", markers = "sys_platform == \"win32\""}
-
-[package.extras]
-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"
-pyjwt = {version = ">=1.7", extras = ["crypto"], optional = true, markers = "extra == \"socialaccount\""}
-requests = {version = ">=2.0.0", optional = true, markers = "extra == \"socialaccount\""}
-requests-oauthlib = {version = ">=0.3.0", optional = true, markers = "extra == \"socialaccount\""}
-
-[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-cache-url"
-version = "3.4.5"
-description = "Use Cache URLs in your Django application."
-optional = false
-python-versions = "*"
-files = [
- {file = "django-cache-url-3.4.5.tar.gz", hash = "sha256:eb9fb194717524348c95cad9905b70b647452741c1d9e481fac6d2125f0ad917"},
- {file = "django_cache_url-3.4.5-py2.py3-none-any.whl", hash = "sha256:5f350759978483ab85dc0e3e17b3d53eed3394a28148f6bf0f53d11d0feb5b3c"},
-]
-
-[[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.1"
-description = "Mypy stubs for Django"
-optional = false
-python-versions = ">=3.8"
-files = [
- {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.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.12,<1.14)"]
-oracle = ["oracledb"]
-redis = ["redis"]
-
-[[package]]
-name = "django-stubs-ext"
-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.1-py3-none-any.whl", hash = "sha256:3907f99e178c93323e2ce908aef8352adb8c047605161f8d9e5e7b4efb5a6a9c"},
- {file = "django_stubs_ext-5.1.1.tar.gz", hash = "sha256:db7364e4f50ae7e5360993dbd58a3a57ea4b2e7e5bab0fbd525ccdb3e7975d1c"},
-]
-
-[package.dependencies]
-django = "*"
-typing-extensions = "*"
-
-[[package]]
-name = "djlint"
-version = "1.36.3"
-description = "HTML Template Linter and Formatter"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "djlint-1.36.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2ae7c620b58e16d6bf003bd7de3f71376a7a3daa79dc02e77f3726d5a75243f2"},
- {file = "djlint-1.36.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e155ce0970d4a28d0a2e9f2e106733a2ad05910eee90e056b056d48049e4a97b"},
- {file = "djlint-1.36.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e8bb0406e60cc696806aa6226df137618f3889c72f2dbdfa76c908c99151579"},
- {file = "djlint-1.36.3-cp310-cp310-win_amd64.whl", hash = "sha256:76d32faf988ad58ef2e7a11d04046fc984b98391761bf1b61f9a6044da53d414"},
- {file = "djlint-1.36.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:32f7a5834000fff22e94d1d35f95aaf2e06f2af2cae18af0ed2a4e215d60e730"},
- {file = "djlint-1.36.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3eb1b9c0be499e63e8822a051e7e55f188ff1ab8172a85d338a8ae21c872060e"},
- {file = "djlint-1.36.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c2e0dd1f26eb472b8c84eb70d6482877b6497a1fd031d7534864088f016d5ea"},
- {file = "djlint-1.36.3-cp311-cp311-win_amd64.whl", hash = "sha256:a06b531ab9d049c46ad4d2365d1857004a1a9dd0c23c8eae94aa0d233c6ec00d"},
- {file = "djlint-1.36.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e66361a865e5e5a4bbcb40f56af7f256fd02cbf9d48b763a40172749cc294084"},
- {file = "djlint-1.36.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:36e102b80d83e9ac2e6be9a9ded32fb925945f6dbc7a7156e4415de1b0aa0dba"},
- {file = "djlint-1.36.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ac4b7370d80bd82281e57a470de8923ac494ffb571b89d8787cef57c738c69a"},
- {file = "djlint-1.36.3-cp312-cp312-win_amd64.whl", hash = "sha256:107cc56bbef13d60cc0ae774a4d52881bf98e37c02412e573827a3e549217e3a"},
- {file = "djlint-1.36.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2a9f51971d6e63c41ea9b3831c928e1f21ae6fe57e87a3452cfe672d10232433"},
- {file = "djlint-1.36.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:080c98714b55d8f0fef5c42beaee8247ebb2e3d46b0936473bd6c47808bb6302"},
- {file = "djlint-1.36.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f65a80e0b5cb13d357ea51ca6570b34c2d9d18974c1e57142de760ea27d49ed0"},
- {file = "djlint-1.36.3-cp313-cp313-win_amd64.whl", hash = "sha256:95ef6b67ef7f2b90d9434bba37d572031079001dc8524add85c00ef0386bda1e"},
- {file = "djlint-1.36.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8e2317a32094d525bc41cd11c8dc064bf38d1b442c99cc3f7c4a2616b5e6ce6e"},
- {file = "djlint-1.36.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e82266c28793cd15f97b93535d72bfbc77306eaaf6b210dd90910383a814ee6c"},
- {file = "djlint-1.36.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01b2101c2d1b079e8d545e6d9d03487fcca14d2371e44cbfdedee15b0bf4567c"},
- {file = "djlint-1.36.3-cp39-cp39-win_amd64.whl", hash = "sha256:15cde63ef28beb5194ff4137883025f125676ece1b574b64a3e1c6daed734639"},
- {file = "djlint-1.36.3-py3-none-any.whl", hash = "sha256:0c05cd5b76785de2c41a2420c06ffd112800bfc0f9c0f399cc7cea7c42557f4c"},
- {file = "djlint-1.36.3.tar.gz", hash = "sha256:d85735da34bc7ac93ad8ef9b4822cc2a23d5f0ce33f25438737b8dca1d404f78"},
-]
-
-[package.dependencies]
-click = ">=8.0.1"
-colorama = ">=0.4.4"
-cssbeautifier = ">=1.14.4"
-jsbeautifier = ">=1.14.4"
-json5 = ">=0.9.11"
-pathspec = ">=0.12"
-pyyaml = ">=6"
-regex = ">=2023"
-tqdm = ">=4.62.2"
-
-[[package]]
-name = "editorconfig"
-version = "0.12.4"
-description = "EditorConfig File Locator and Interpreter for Python"
-optional = false
-python-versions = "*"
-files = [
- {file = "EditorConfig-0.12.4.tar.gz", hash = "sha256:24857fa1793917dd9ccf0c7810a07e05404ce9b823521c7dce22a4fb5d125f80"},
-]
-
-[[package]]
-name = "environs"
-version = "11.2.1"
-description = "simplified environment variable parsing"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "environs-11.2.1-py3-none-any.whl", hash = "sha256:9d2080cf25807a26fc0d4301e2d7b62c64fbf547540f21e3a30cc02bc5fbe948"},
- {file = "environs-11.2.1.tar.gz", hash = "sha256:e068ae3174cef52ba4b95ead22e639056a02465f616e62323e04ae08e86a75a4"},
-]
-
-[package.dependencies]
-dj-database-url = {version = "*", optional = true, markers = "extra == \"django\""}
-dj-email-url = {version = "*", optional = true, markers = "extra == \"django\""}
-django-cache-url = {version = "*", optional = true, markers = "extra == \"django\""}
-marshmallow = ">=3.13.0"
-python-dotenv = "*"
-
-[package.extras]
-dev = ["environs[tests]", "pre-commit (>=3.5,<5.0)", "tox"]
-django = ["dj-database-url", "dj-email-url", "django-cache-url"]
-tests = ["environs[django]", "pytest"]
-
-[[package]]
-name = "gunicorn"
-version = "23.0.0"
-description = "WSGI HTTP Server for UNIX"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "gunicorn-23.0.0-py3-none-any.whl", hash = "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d"},
- {file = "gunicorn-23.0.0.tar.gz", hash = "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec"},
-]
-
-[package.dependencies]
-packaging = "*"
-
-[package.extras]
-eventlet = ["eventlet (>=0.24.1,!=0.36.0)"]
-gevent = ["gevent (>=1.4.0)"]
-setproctitle = ["setproctitle"]
-testing = ["coverage", "eventlet", "gevent", "pytest", "pytest-cov"]
-tornado = ["tornado (>=0.2)"]
-
-[[package]]
-name = "idna"
-version = "3.10"
-description = "Internationalized Domain Names in Applications (IDNA)"
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"},
- {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"},
-]
-
-[package.extras]
-all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"]
-
-[[package]]
-name = "isort"
-version = "5.13.2"
-description = "A Python utility / library to sort Python imports."
-optional = false
-python-versions = ">=3.8.0"
-files = [
- {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"},
- {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"},
-]
-
-[package.extras]
-colors = ["colorama (>=0.4.6)"]
-
-[[package]]
-name = "jsbeautifier"
-version = "1.15.1"
-description = "JavaScript unobfuscator and beautifier."
-optional = false
-python-versions = "*"
-files = [
- {file = "jsbeautifier-1.15.1.tar.gz", hash = "sha256:ebd733b560704c602d744eafc839db60a1ee9326e30a2a80c4adb8718adc1b24"},
-]
-
-[package.dependencies]
-editorconfig = ">=0.12.2"
-six = ">=1.13.0"
-
-[[package]]
-name = "json5"
-version = "0.10.0"
-description = "A Python implementation of the JSON5 data format."
-optional = false
-python-versions = ">=3.8.0"
-files = [
- {file = "json5-0.10.0-py3-none-any.whl", hash = "sha256:19b23410220a7271e8377f81ba8aacba2fdd56947fbb137ee5977cbe1f5e8dfa"},
- {file = "json5-0.10.0.tar.gz", hash = "sha256:e66941c8f0a02026943c52c2eb34ebeb2a6f819a0be05920a6f5243cd30fd559"},
-]
-
-[package.extras]
-dev = ["build (==1.2.2.post1)", "coverage (==7.5.3)", "mypy (==1.13.0)", "pip (==24.3.1)", "pylint (==3.2.3)", "ruff (==0.7.3)", "twine (==5.1.1)", "uv (==0.5.1)"]
-
-[[package]]
-name = "marshmallow"
-version = "3.23.1"
-description = "A lightweight library for converting complex datatypes to and from native Python datatypes."
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "marshmallow-3.23.1-py3-none-any.whl", hash = "sha256:fece2eb2c941180ea1b7fcbd4a83c51bfdd50093fdd3ad2585ee5e1df2508491"},
- {file = "marshmallow-3.23.1.tar.gz", hash = "sha256:3a8dfda6edd8dcdbf216c0ede1d1e78d230a6dc9c5a088f58c4083b974a0d468"},
-]
-
-[package.dependencies]
-packaging = ">=17.0"
-
-[package.extras]
-dev = ["marshmallow[tests]", "pre-commit (>=3.5,<5.0)", "tox"]
-docs = ["alabaster (==1.0.0)", "autodocsumm (==0.2.14)", "sphinx (==8.1.3)", "sphinx-issues (==5.0.0)", "sphinx-version-warning (==1.1.2)"]
-tests = ["pytest", "simplejson"]
-
-[[package]]
-name = "mypy"
-version = "1.13.0"
-description = "Optional static typing for Python"
-optional = false
-python-versions = ">=3.8"
-files = [
- {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]
-mypy-extensions = ">=1.0.0"
-typing-extensions = ">=4.6.0"
-
-[package.extras]
-dmypy = ["psutil (>=4.0)"]
-faster-cache = ["orjson"]
-install-types = ["pip"]
-mypyc = ["setuptools (>=50)"]
-reports = ["lxml"]
-
-[[package]]
-name = "mypy-extensions"
-version = "1.0.0"
-description = "Type system extensions for programs checked with the mypy type checker."
-optional = false
-python-versions = ">=3.5"
-files = [
- {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"},
- {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
-]
-
-[[package]]
-name = "oauthlib"
-version = "3.2.2"
-description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic"
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"},
- {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"},
-]
-
-[package.extras]
-rsa = ["cryptography (>=3.0.0)"]
-signals = ["blinker (>=1.4.0)"]
-signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"]
-
-[[package]]
-name = "packaging"
-version = "24.2"
-description = "Core utilities for Python packages"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"},
- {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"},
-]
-
-[[package]]
-name = "pathspec"
-version = "0.12.1"
-description = "Utility library for gitignore style pattern matching of file paths."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"},
- {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"},
-]
-
-[[package]]
-name = "platformdirs"
-version = "4.3.6"
-description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"},
- {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"},
-]
-
-[package.extras]
-docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"]
-test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"]
-type = ["mypy (>=1.11.2)"]
-
-[[package]]
-name = "psycopg2"
-version = "2.9.10"
-description = "psycopg2 - Python-PostgreSQL Database Adapter"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "psycopg2-2.9.10-cp310-cp310-win32.whl", hash = "sha256:5df2b672140f95adb453af93a7d669d7a7bf0a56bcd26f1502329166f4a61716"},
- {file = "psycopg2-2.9.10-cp310-cp310-win_amd64.whl", hash = "sha256:c6f7b8561225f9e711a9c47087388a97fdc948211c10a4bccbf0ba68ab7b3b5a"},
- {file = "psycopg2-2.9.10-cp311-cp311-win32.whl", hash = "sha256:47c4f9875125344f4c2b870e41b6aad585901318068acd01de93f3677a6522c2"},
- {file = "psycopg2-2.9.10-cp311-cp311-win_amd64.whl", hash = "sha256:0435034157049f6846e95103bd8f5a668788dd913a7c30162ca9503fdf542cb4"},
- {file = "psycopg2-2.9.10-cp312-cp312-win32.whl", hash = "sha256:65a63d7ab0e067e2cdb3cf266de39663203d38d6a8ed97f5ca0cb315c73fe067"},
- {file = "psycopg2-2.9.10-cp312-cp312-win_amd64.whl", hash = "sha256:4a579d6243da40a7b3182e0430493dbd55950c493d8c68f4eec0b302f6bbf20e"},
- {file = "psycopg2-2.9.10-cp39-cp39-win32.whl", hash = "sha256:9d5b3b94b79a844a986d029eee38998232451119ad653aea42bb9220a8c5066b"},
- {file = "psycopg2-2.9.10-cp39-cp39-win_amd64.whl", hash = "sha256:88138c8dedcbfa96408023ea2b0c369eda40fe5d75002c0964c78f46f11fa442"},
- {file = "psycopg2-2.9.10.tar.gz", hash = "sha256:12ec0b40b0273f95296233e8750441339298e6a572f7039da5b260e3c8b60e11"},
-]
-
-[[package]]
-name = "pycparser"
-version = "2.22"
-description = "C parser in Python"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"},
- {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"},
-]
-
-[[package]]
-name = "pyjwt"
-version = "2.10.1"
-description = "JSON Web Token implementation in Python"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"},
- {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"},
-]
-
-[package.dependencies]
-cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""}
-
-[package.extras]
-crypto = ["cryptography (>=3.4.0)"]
-dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"]
-docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"]
-tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"]
-
-[[package]]
-name = "python-dotenv"
-version = "1.0.1"
-description = "Read key-value pairs from a .env file and set them as environment variables"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"},
- {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"},
-]
-
-[package.extras]
-cli = ["click (>=5.0)"]
-
-[[package]]
-name = "pyyaml"
-version = "6.0.2"
-description = "YAML parser and emitter for Python"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"},
- {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"},
- {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"},
- {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"},
- {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"},
- {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"},
- {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"},
- {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"},
- {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"},
- {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"},
- {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"},
- {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"},
- {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"},
- {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"},
- {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"},
- {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"},
- {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"},
- {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"},
- {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"},
- {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"},
- {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"},
- {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"},
- {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"},
- {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"},
- {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"},
- {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"},
- {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"},
- {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"},
- {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"},
- {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"},
- {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"},
- {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"},
- {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"},
- {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"},
- {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"},
- {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"},
- {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"},
- {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"},
- {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"},
- {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"},
- {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"},
- {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"},
- {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"},
- {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"},
- {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"},
- {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"},
- {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"},
- {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"},
- {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"},
- {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"},
- {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"},
- {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"},
- {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"},
-]
-
-[[package]]
-name = "regex"
-version = "2024.11.6"
-description = "Alternative regular expression module, to replace re."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"},
- {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"},
- {file = "regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e"},
- {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde"},
- {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e"},
- {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2"},
- {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf"},
- {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c"},
- {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86"},
- {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67"},
- {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d"},
- {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2"},
- {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008"},
- {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62"},
- {file = "regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e"},
- {file = "regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519"},
- {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638"},
- {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7"},
- {file = "regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20"},
- {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114"},
- {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3"},
- {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f"},
- {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0"},
- {file = "regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55"},
- {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89"},
- {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d"},
- {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34"},
- {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d"},
- {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45"},
- {file = "regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9"},
- {file = "regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60"},
- {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a"},
- {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9"},
- {file = "regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2"},
- {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4"},
- {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577"},
- {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3"},
- {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e"},
- {file = "regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe"},
- {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e"},
- {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29"},
- {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39"},
- {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51"},
- {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad"},
- {file = "regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54"},
- {file = "regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b"},
- {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84"},
- {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4"},
- {file = "regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0"},
- {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0"},
- {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7"},
- {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7"},
- {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c"},
- {file = "regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3"},
- {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07"},
- {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e"},
- {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6"},
- {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4"},
- {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d"},
- {file = "regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff"},
- {file = "regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a"},
- {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3a51ccc315653ba012774efca4f23d1d2a8a8f278a6072e29c7147eee7da446b"},
- {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ad182d02e40de7459b73155deb8996bbd8e96852267879396fb274e8700190e3"},
- {file = "regex-2024.11.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba9b72e5643641b7d41fa1f6d5abda2c9a263ae835b917348fc3c928182ad467"},
- {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40291b1b89ca6ad8d3f2b82782cc33807f1406cf68c8d440861da6304d8ffbbd"},
- {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdf58d0e516ee426a48f7b2c03a332a4114420716d55769ff7108c37a09951bf"},
- {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a36fdf2af13c2b14738f6e973aba563623cb77d753bbbd8d414d18bfaa3105dd"},
- {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cee317bfc014c2419a76bcc87f071405e3966da434e03e13beb45f8aced1a6"},
- {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50153825ee016b91549962f970d6a4442fa106832e14c918acd1c8e479916c4f"},
- {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea1bfda2f7162605f6e8178223576856b3d791109f15ea99a9f95c16a7636fb5"},
- {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:df951c5f4a1b1910f1a99ff42c473ff60f8225baa1cdd3539fe2819d9543e9df"},
- {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:072623554418a9911446278f16ecb398fb3b540147a7828c06e2011fa531e773"},
- {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f654882311409afb1d780b940234208a252322c24a93b442ca714d119e68086c"},
- {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:89d75e7293d2b3e674db7d4d9b1bee7f8f3d1609428e293771d1a962617150cc"},
- {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f65557897fc977a44ab205ea871b690adaef6b9da6afda4790a2484b04293a5f"},
- {file = "regex-2024.11.6-cp38-cp38-win32.whl", hash = "sha256:6f44ec28b1f858c98d3036ad5d7d0bfc568bdd7a74f9c24e25f41ef1ebfd81a4"},
- {file = "regex-2024.11.6-cp38-cp38-win_amd64.whl", hash = "sha256:bb8f74f2f10dbf13a0be8de623ba4f9491faf58c24064f32b65679b021ed0001"},
- {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5704e174f8ccab2026bd2f1ab6c510345ae8eac818b613d7d73e785f1310f839"},
- {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:220902c3c5cc6af55d4fe19ead504de80eb91f786dc102fbd74894b1551f095e"},
- {file = "regex-2024.11.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7e351589da0850c125f1600a4c4ba3c722efefe16b297de54300f08d734fbf"},
- {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5056b185ca113c88e18223183aa1a50e66507769c9640a6ff75859619d73957b"},
- {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e34b51b650b23ed3354b5a07aab37034d9f923db2a40519139af34f485f77d0"},
- {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5670bce7b200273eee1840ef307bfa07cda90b38ae56e9a6ebcc9f50da9c469b"},
- {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08986dce1339bc932923e7d1232ce9881499a0e02925f7402fb7c982515419ef"},
- {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93c0b12d3d3bc25af4ebbf38f9ee780a487e8bf6954c115b9f015822d3bb8e48"},
- {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:764e71f22ab3b305e7f4c21f1a97e1526a25ebdd22513e251cf376760213da13"},
- {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f056bf21105c2515c32372bbc057f43eb02aae2fda61052e2f7622c801f0b4e2"},
- {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69ab78f848845569401469da20df3e081e6b5a11cb086de3eed1d48f5ed57c95"},
- {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:86fddba590aad9208e2fa8b43b4c098bb0ec74f15718bb6a704e3c63e2cef3e9"},
- {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:684d7a212682996d21ca12ef3c17353c021fe9de6049e19ac8481ec35574a70f"},
- {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a03e02f48cd1abbd9f3b7e3586d97c8f7a9721c436f51a5245b3b9483044480b"},
- {file = "regex-2024.11.6-cp39-cp39-win32.whl", hash = "sha256:41758407fc32d5c3c5de163888068cfee69cb4c2be844e7ac517a52770f9af57"},
- {file = "regex-2024.11.6-cp39-cp39-win_amd64.whl", hash = "sha256:b2837718570f95dd41675328e111345f9b7095d821bac435aac173ac80b19983"},
- {file = "regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519"},
-]
-
-[[package]]
-name = "requests"
-version = "2.32.3"
-description = "Python HTTP for Humans."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"},
- {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"},
-]
-
-[package.dependencies]
-certifi = ">=2017.4.17"
-charset-normalizer = ">=2,<4"
-idna = ">=2.5,<4"
-urllib3 = ">=1.21.1,<3"
-
-[package.extras]
-socks = ["PySocks (>=1.5.6,!=1.5.7)"]
-use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
-
-[[package]]
-name = "requests-oauthlib"
-version = "2.0.0"
-description = "OAuthlib authentication support for Requests."
-optional = false
-python-versions = ">=3.4"
-files = [
- {file = "requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9"},
- {file = "requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36"},
-]
-
-[package.dependencies]
-oauthlib = ">=3.0.0"
-requests = ">=2.0.0"
-
-[package.extras]
-rsa = ["oauthlib[signedtoken] (>=3.0.0)"]
-
-[[package]]
-name = "six"
-version = "1.16.0"
-description = "Python 2 and 3 compatibility utilities"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
-files = [
- {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
- {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
-]
-
-[[package]]
-name = "sqlparse"
-version = "0.5.2"
-description = "A non-validating SQL parser."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "sqlparse-0.5.2-py3-none-any.whl", hash = "sha256:e99bc85c78160918c3e1d9230834ab8d80fc06c59d03f8db2618f65f65dda55e"},
- {file = "sqlparse-0.5.2.tar.gz", hash = "sha256:9e37b35e16d1cc652a2545f0997c1deb23ea28fa1f3eefe609eee3063c3b105f"},
-]
-
-[package.extras]
-dev = ["build", "hatch"]
-doc = ["sphinx"]
-
-[[package]]
-name = "tqdm"
-version = "4.67.1"
-description = "Fast, Extensible Progress Meter"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"},
- {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"},
-]
-
-[package.dependencies]
-colorama = {version = "*", markers = "platform_system == \"Windows\""}
-
-[package.extras]
-dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"]
-discord = ["requests"]
-notebook = ["ipywidgets (>=6)"]
-slack = ["slack-sdk"]
-telegram = ["requests"]
-
-[[package]]
-name = "types-pyyaml"
-version = "6.0.12.20240917"
-description = "Typing stubs for PyYAML"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "types-PyYAML-6.0.12.20240917.tar.gz", hash = "sha256:d1405a86f9576682234ef83bcb4e6fff7c9305c8b1fbad5e0bcd4f7dbdc9c587"},
- {file = "types_PyYAML-6.0.12.20240917-py3-none-any.whl", hash = "sha256:392b267f1c0fe6022952462bf5d6523f31e37f6cea49b14cee7ad634b6301570"},
-]
-
-[[package]]
-name = "typing-extensions"
-version = "4.12.2"
-description = "Backported and Experimental Type Hints for Python 3.8+"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"},
- {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"},
-]
-
-[[package]]
-name = "tzdata"
-version = "2024.2"
-description = "Provider of IANA time zone data"
-optional = false
-python-versions = ">=2"
-files = [
- {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"},
- {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"},
-]
-
-[[package]]
-name = "urllib3"
-version = "2.2.3"
-description = "HTTP library with thread-safe connection pooling, file post, and more."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"},
- {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"},
-]
-
-[package.extras]
-brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"]
-h2 = ["h2 (>=4,<5)"]
-socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
-zstd = ["zstandard (>=0.18.0)"]
-
-[metadata]
-lock-version = "2.0"
-python-versions = "^3.12"
-content-hash = "b6a1e4f297c97ec3cfa8b4e89d67034e06f3f1a67a72006f1b438770781d43d2"
diff --git a/tvdt/pyproject.toml b/tvdt/pyproject.toml
deleted file mode 100644
index 5e7c24d..0000000
--- a/tvdt/pyproject.toml
+++ /dev/null
@@ -1,34 +0,0 @@
-[tool.poetry]
-name = "tvdt"
-package-mode = false
-
-[tool.poetry.dependencies]
-python = "^3.12"
-Django = "^5.1.2"
-django-crispy-forms = "^2.3"
-crispy-bootstrap5 = "^2024.10"
-django-allauth = {extras = ["socialaccount"], version = "^65.2.0"}
-django-stubs = {extras = ["compatible-mypy"], version = "^5.1.0"}
-environs = {extras = ["django"], version = "^11.2.1"}
-psycopg2 = "^2.9.10"
-
-[tool.poetry.group.dev.dependencies]
-mypy = "^1.11.0"
-black = "^24.10.0"
-isort = "^5.13.2"
-djlint = "^1.36.3"
-
-[tool.poetry.group.prod.dependencies]
-gunicorn = "^23.0.0"
-
-[tool.isort]
-profile = "black"
-
-[tool.mypy]
-plugins = ["mypy_django_plugin.main"]
-
-[tool.django-stubs]
-django_settings_module = "tvdt.settings"
-
-[tool.djlint]
-profile="django"
diff --git a/tvdt/quiz/__init__.py b/tvdt/quiz/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/tvdt/quiz/admin.py b/tvdt/quiz/admin.py
deleted file mode 100644
index 2057a5d..0000000
--- a/tvdt/quiz/admin.py
+++ /dev/null
@@ -1,50 +0,0 @@
-from django.contrib import admin
-
-from .models import Answer, Candidate, Correction, GivenAnswer, Question, Quiz, Season
-
-
-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):
- list_display = ["question", "quiz__season__name", "quiz__name", "_order"]
- ordering = ["quiz__season", "quiz", "_order"]
- inlines = [AnswerInline]
-
-
-@admin.register(Candidate)
-class CandidateAdmin(admin.ModelAdmin):
- pass
-
-
-@admin.register(GivenAnswer)
-class GivenAnswerAdmin(admin.ModelAdmin):
- pass
-
-
-@admin.register(Correction)
-class CorrextionAdmin(admin.ModelAdmin):
- pass
diff --git a/tvdt/quiz/apps.py b/tvdt/quiz/apps.py
deleted file mode 100644
index 59730f9..0000000
--- a/tvdt/quiz/apps.py
+++ /dev/null
@@ -1,8 +0,0 @@
-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/context_processors.py b/tvdt/quiz/context_processors.py
deleted file mode 100644
index 6c84987..0000000
--- a/tvdt/quiz/context_processors.py
+++ /dev/null
@@ -1,2 +0,0 @@
-def get_theme(request) -> dict:
- return {"theme": "wie_is_de_mol"}
diff --git a/tvdt/quiz/converters.py b/tvdt/quiz/converters.py
deleted file mode 100644
index ef47a91..0000000
--- a/tvdt/quiz/converters.py
+++ /dev/null
@@ -1,28 +0,0 @@
-import base64
-import binascii
-
-from .models import Candidate, Season
-
-
-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
deleted file mode 100644
index 4360c3b..0000000
--- a/tvdt/quiz/fixtures/krtek.json
+++ /dev/null
@@ -1,2198 +0,0 @@
-[
-{
- "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.answer",
- "pk": 83,
- "fields": {
- "text": "Man",
- "question": 16,
- "is_right_answer": false,
- "_order": 1,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 84,
- "fields": {
- "text": "Vrouw",
- "question": 16,
- "is_right_answer": true,
- "_order": 2,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 85,
- "fields": {
- "text": "Nee",
- "question": 17,
- "is_right_answer": false,
- "_order": 0,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 86,
- "fields": {
- "text": "De Krtek is vegetariër",
- "question": 17,
- "is_right_answer": true,
- "_order": 1,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 87,
- "fields": {
- "text": "De Krtek is flexitariër",
- "question": 17,
- "is_right_answer": false,
- "_order": 2,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 88,
- "fields": {
- "text": "De Krtek heeft een allergie",
- "question": 17,
- "is_right_answer": false,
- "_order": 3,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 89,
- "fields": {
- "text": "De Krtek heeft een intolerantie",
- "question": 17,
- "is_right_answer": false,
- "_order": 4,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 90,
- "fields": {
- "text": "De Krtek eet geen rundvlees",
- "question": 17,
- "is_right_answer": false,
- "_order": 5,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 91,
- "fields": {
- "text": "De Krtek eet geen waterdieren",
- "question": 17,
- "is_right_answer": false,
- "_order": 6,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 92,
- "fields": {
- "text": "Amy, Karel en Floyd",
- "question": 18,
- "is_right_answer": false,
- "_order": 0,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 93,
- "fields": {
- "text": "Flip en Majoor",
- "question": 18,
- "is_right_answer": false,
- "_order": 1,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 94,
- "fields": {
- "text": "Benji",
- "question": 18,
- "is_right_answer": false,
- "_order": 2,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 95,
- "fields": {
- "text": "Sini",
- "question": 18,
- "is_right_answer": false,
- "_order": 3,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 96,
- "fields": {
- "text": "De huisdieren van de Krtek hebben geen naam",
- "question": 18,
- "is_right_answer": false,
- "_order": 4,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 97,
- "fields": {
- "text": "De Krtek heeft geen huisdieren",
- "question": 18,
- "is_right_answer": true,
- "_order": 5,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 98,
- "fields": {
- "text": "Koffie",
- "question": 19,
- "is_right_answer": false,
- "_order": 0,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 99,
- "fields": {
- "text": "Thee",
- "question": 19,
- "is_right_answer": false,
- "_order": 1,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 100,
- "fields": {
- "text": "Water",
- "question": 19,
- "is_right_answer": true,
- "_order": 2,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 101,
- "fields": {
- "text": "Melk",
- "question": 19,
- "is_right_answer": false,
- "_order": 3,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 102,
- "fields": {
- "text": "Sap",
- "question": 19,
- "is_right_answer": false,
- "_order": 4,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 103,
- "fields": {
- "text": "Niks",
- "question": 19,
- "is_right_answer": false,
- "_order": 5,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 104,
- "fields": {
- "text": "Denemarken",
- "question": 20,
- "is_right_answer": false,
- "_order": 0,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 105,
- "fields": {
- "text": "Drenthe",
- "question": 20,
- "is_right_answer": false,
- "_order": 1,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 106,
- "fields": {
- "text": "Mallorca",
- "question": 20,
- "is_right_answer": false,
- "_order": 2,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 107,
- "fields": {
- "text": "Marokko",
- "question": 20,
- "is_right_answer": false,
- "_order": 3,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 108,
- "fields": {
- "text": "Oostenrijk",
- "question": 20,
- "is_right_answer": false,
- "_order": 4,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 109,
- "fields": {
- "text": "Turkije",
- "question": 20,
- "is_right_answer": false,
- "_order": 5,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 110,
- "fields": {
- "text": "Zweden",
- "question": 20,
- "is_right_answer": true,
- "_order": 6,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 111,
- "fields": {
- "text": "Het eerste groepje",
- "question": 21,
- "is_right_answer": true,
- "_order": 0,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 112,
- "fields": {
- "text": "Het tweede groepje",
- "question": 21,
- "is_right_answer": false,
- "_order": 1,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 113,
- "fields": {
- "text": "Het derde groepje",
- "question": 21,
- "is_right_answer": false,
- "_order": 2,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 114,
- "fields": {
- "text": "Het vierde groepje",
- "question": 21,
- "is_right_answer": false,
- "_order": 3,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 115,
- "fields": {
- "text": "Het vijfde groepje",
- "question": 21,
- "is_right_answer": false,
- "_order": 4,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 116,
- "fields": {
- "text": "Nee",
- "question": 22,
- "is_right_answer": false,
- "_order": 0,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 117,
- "fields": {
- "text": "Het universum",
- "question": 22,
- "is_right_answer": true,
- "_order": 1,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 118,
- "fields": {
- "text": "Toeval",
- "question": 22,
- "is_right_answer": false,
- "_order": 2,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 119,
- "fields": {
- "text": "De Krtek is hindoeïstisch",
- "question": 22,
- "is_right_answer": false,
- "_order": 3,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 120,
- "fields": {
- "text": "Ja",
- "question": 23,
- "is_right_answer": true,
- "_order": 0,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 121,
- "fields": {
- "text": "Nee",
- "question": 23,
- "is_right_answer": false,
- "_order": 1,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 122,
- "fields": {
- "text": "Tussen 0:00 en 0:59 uur",
- "question": 24,
- "is_right_answer": false,
- "_order": 0,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 123,
- "fields": {
- "text": "Tussen 1:00 en 1:59 uur",
- "question": 24,
- "is_right_answer": true,
- "_order": 1,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 124,
- "fields": {
- "text": "Tussen 2:00 en 2:59 uur",
- "question": 24,
- "is_right_answer": false,
- "_order": 2,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 125,
- "fields": {
- "text": "Na 3:00",
- "question": 24,
- "is_right_answer": false,
- "_order": 3,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 126,
- "fields": {
- "text": "1",
- "question": 25,
- "is_right_answer": false,
- "_order": 0,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 127,
- "fields": {
- "text": "2",
- "question": 25,
- "is_right_answer": false,
- "_order": 1,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 128,
- "fields": {
- "text": "3",
- "question": 25,
- "is_right_answer": false,
- "_order": 2,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 129,
- "fields": {
- "text": "Geen",
- "question": 25,
- "is_right_answer": true,
- "_order": 3,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 130,
- "fields": {
- "text": "Digimon",
- "question": 26,
- "is_right_answer": true,
- "_order": 0,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 131,
- "fields": {
- "text": "Floris",
- "question": 26,
- "is_right_answer": false,
- "_order": 1,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 132,
- "fields": {
- "text": "Het huis Anubis",
- "question": 26,
- "is_right_answer": false,
- "_order": 2,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 133,
- "fields": {
- "text": "Sesamstraat",
- "question": 26,
- "is_right_answer": false,
- "_order": 3,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 134,
- "fields": {
- "text": "Spongebob Squarepants",
- "question": 26,
- "is_right_answer": false,
- "_order": 4,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 135,
- "fields": {
- "text": "Teletubbies",
- "question": 26,
- "is_right_answer": false,
- "_order": 5,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 136,
- "fields": {
- "text": "In koffer(s)",
- "question": 27,
- "is_right_answer": true,
- "_order": 0,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 137,
- "fields": {
- "text": "In losse tas(sen)",
- "question": 27,
- "is_right_answer": false,
- "_order": 1,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 138,
- "fields": {
- "text": "In een rugzak",
- "question": 27,
- "is_right_answer": false,
- "_order": 2,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 139,
- "fields": {
- "text": "Een vork die door een metalen pan krast",
- "question": 28,
- "is_right_answer": false,
- "_order": 0,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 140,
- "fields": {
- "text": "Smakkende mensen",
- "question": 28,
- "is_right_answer": false,
- "_order": 1,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 141,
- "fields": {
- "text": "Een vork die over een bord schraapt",
- "question": 28,
- "is_right_answer": false,
- "_order": 2,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 142,
- "fields": {
- "text": "Schuren met schuurpapier",
- "question": 28,
- "is_right_answer": false,
- "_order": 3,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 143,
- "fields": {
- "text": "Nagels op een krijtbord",
- "question": 28,
- "is_right_answer": false,
- "_order": 4,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 144,
- "fields": {
- "text": "Servies dat tegen elkaar klettert",
- "question": 28,
- "is_right_answer": false,
- "_order": 5,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 145,
- "fields": {
- "text": "Het geroekoe van een duif",
- "question": 28,
- "is_right_answer": true,
- "_order": 6,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 146,
- "fields": {
- "text": "Piepschuim",
- "question": 28,
- "is_right_answer": false,
- "_order": 7,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 147,
- "fields": {
- "text": "Ja",
- "question": 29,
- "is_right_answer": false,
- "_order": 0,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 148,
- "fields": {
- "text": "Nee",
- "question": 29,
- "is_right_answer": true,
- "_order": 1,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 149,
- "fields": {
- "text": "Claudia",
- "question": 30,
- "is_right_answer": true,
- "_order": 0,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 150,
- "fields": {
- "text": "Eelco",
- "question": 30,
- "is_right_answer": false,
- "_order": 1,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 151,
- "fields": {
- "text": "Elise",
- "question": 30,
- "is_right_answer": false,
- "_order": 2,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 152,
- "fields": {
- "text": "Gert-Jan",
- "question": 30,
- "is_right_answer": false,
- "_order": 3,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 153,
- "fields": {
- "text": "Iris",
- "question": 30,
- "is_right_answer": false,
- "_order": 4,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 154,
- "fields": {
- "text": "Jari",
- "question": 30,
- "is_right_answer": false,
- "_order": 5,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 155,
- "fields": {
- "text": "Lara",
- "question": 30,
- "is_right_answer": false,
- "_order": 6,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 156,
- "fields": {
- "text": "Lotte",
- "question": 30,
- "is_right_answer": false,
- "_order": 7,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 157,
- "fields": {
- "text": "Myrthe",
- "question": 30,
- "is_right_answer": false,
- "_order": 8,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 158,
- "fields": {
- "text": "Remy",
- "question": 30,
- "is_right_answer": false,
- "_order": 9,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 159,
- "fields": {
- "text": "Robbert",
- "question": 30,
- "is_right_answer": false,
- "_order": 10,
- "candidates": []
- }
-},
-{
- "model": "quiz.answer",
- "pk": 160,
- "fields": {
- "text": "Tom",
- "question": 30,
- "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.question",
- "pk": 16,
- "fields": {
- "question": "Is de Krtek een man of een vrouw?",
- "quiz": 2,
- "enabled": true,
- "_order": 0
- }
-},
-{
- "model": "quiz.question",
- "pk": 17,
- "fields": {
- "question": "Heeft de Krtek dieetwensen of allergieën?",
- "quiz": 2,
- "enabled": true,
- "_order": 1
- }
-},
-{
- "model": "quiz.question",
- "pk": 18,
- "fields": {
- "question": "Hoe heet het huisdier/de huisdieren van de Krtek?",
- "quiz": 2,
- "enabled": true,
- "_order": 2
- }
-},
-{
- "model": "quiz.question",
- "pk": 19,
- "fields": {
- "question": "Wat dronk de Krtek deze ochtend bij het ontbijt?",
- "quiz": 2,
- "enabled": true,
- "_order": 3
- }
-},
-{
- "model": "quiz.question",
- "pk": 20,
- "fields": {
- "question": "Waar ging de eerste vakantie die de Krtek zich nog herinnert heen?",
- "quiz": 2,
- "enabled": true,
- "_order": 4
- }
-},
-{
- "model": "quiz.question",
- "pk": 21,
- "fields": {
- "question": "Met welk groepje ging de Krtek als eerste het Douanespel in?",
- "quiz": 2,
- "enabled": true,
- "_order": 5
- }
-},
-{
- "model": "quiz.question",
- "pk": 22,
- "fields": {
- "question": "Gelooft de Krtek ergens in?",
- "quiz": 2,
- "enabled": true,
- "_order": 6
- }
-},
-{
- "model": "quiz.question",
- "pk": 23,
- "fields": {
- "question": "At de Krtek op vrijdagavond heksenkaas tijdens het diner?",
- "quiz": 2,
- "enabled": true,
- "_order": 7
- }
-},
-{
- "model": "quiz.question",
- "pk": 24,
- "fields": {
- "question": "Hoe laat ging de Krtek gisteravond naar bed?",
- "quiz": 2,
- "enabled": true,
- "_order": 8
- }
-},
-{
- "model": "quiz.question",
- "pk": 25,
- "fields": {
- "question": "Hoeveel batterijen heeft de krtek naar het bord gebracht bij het douanespel?",
- "quiz": 2,
- "enabled": true,
- "_order": 9
- }
-},
-{
- "model": "quiz.question",
- "pk": 26,
- "fields": {
- "question": "Wat keek de Krtek als kind graag op TV?",
- "quiz": 2,
- "enabled": true,
- "_order": 10
- }
-},
-{
- "model": "quiz.question",
- "pk": 27,
- "fields": {
- "question": "Waarin zat op de heenreis de bagage van de Krtek (voornamelijk)?",
- "quiz": 2,
- "enabled": true,
- "_order": 11
- }
-},
-{
- "model": "quiz.question",
- "pk": 28,
- "fields": {
- "question": "Van welk geluid gaan de haren van de Krtek overeind staan?",
- "quiz": 2,
- "enabled": true,
- "_order": 12
- }
-},
-{
- "model": "quiz.question",
- "pk": 29,
- "fields": {
- "question": "Wilde de Krtek penningmeester worden?",
- "quiz": 2,
- "enabled": true,
- "_order": 13
- }
-},
-{
- "model": "quiz.question",
- "pk": 30,
- "fields": {
- "question": "Wie is de Krtek?",
- "quiz": 2,
- "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.candidate",
- "pk": 14,
- "fields": {
- "season": 1,
- "name": "Marijn"
- }
-},
-{
- "model": "quiz.candidate",
- "pk": 15,
- "fields": {
- "season": 1,
- "name": "Renske"
- }
-},
-{
- "model": "quiz.candidate",
- "pk": 16,
- "fields": {
- "season": 1,
- "name": "Philine"
- }
-},
-{
- "model": "quiz.quiz",
- "pk": 1,
- "fields": {
- "name": "Test 1",
- "season": 1
- }
-},
-{
- "model": "quiz.quiz",
- "pk": 2,
- "fields": {
- "name": "Test 2",
- "season": 1
- }
-},
-{
- "model": "quiz.season",
- "pk": 1,
- "fields": {
- "name": "Krtek",
- "active_quiz": 1,
- "season_code": "12345",
- "preregister_candidates": true,
- "owner": []
- }
-}
-]
diff --git a/tvdt/quiz/helpers.py b/tvdt/quiz/helpers.py
deleted file mode 100644
index 10d517e..0000000
--- a/tvdt/quiz/helpers.py
+++ /dev/null
@@ -1,8 +0,0 @@
-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
deleted file mode 100644
index 5f1c4f1..0000000
--- a/tvdt/quiz/locale/nl/LC_MESSAGES/django.po
+++ /dev/null
@@ -1,162 +0,0 @@
-# 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-12-11 23:22+0100\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/apps.py:8 quiz/models/correction.py:17 quiz/models/given_answer.py:19
-#: quiz/models/question.py:23 quiz/models/quiz.py:60
-msgid "quiz"
-msgstr "test"
-
-#: quiz/models/answer.py:10
-msgid "text"
-msgstr "tekst"
-
-#: quiz/models/answer.py:15 quiz/models/question.py:18
-#: quiz/models/question.py:58
-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:50
-msgid "candidates"
-msgstr "kandidaten"
-
-#: quiz/models/answer.py:23 quiz/models/given_answer.py:25
-msgid "answer"
-msgstr "antwoord"
-
-#: quiz/models/answer.py:24
-msgid "answers"
-msgstr "antwoorden"
-
-#: quiz/models/candidate.py:18 quiz/models/quiz.py:12 quiz/models/season.py:12
-msgid "name"
-msgstr "naam"
-
-#: quiz/models/candidate.py:49 quiz/models/correction.py:11
-#: quiz/models/given_answer.py:11
-msgid "candidate"
-msgstr "kandidaat"
-
-#: quiz/models/correction.py:19
-msgid "amount"
-msgstr "aantal"
-
-#: quiz/models/correction.py:23
-msgid "correction"
-msgstr "joker"
-
-#: quiz/models/correction.py:24
-msgid "corrections"
-msgstr "jokers"
-
-#: quiz/models/given_answer.py:36
-msgid "given answer"
-msgstr "gegeven antwoord"
-
-#: quiz/models/given_answer.py:37
-msgid "given answers"
-msgstr "gegeven antwoorden"
-
-#: quiz/models/question.py:25
-msgid "enabled"
-msgstr "actief"
-
-#: quiz/models/question.py:42
-msgid "Error: Question has no answers"
-msgstr "Fout: Raar genoeg heeft deze vraag geen antwoorden..."
-
-#: quiz/models/question.py:47
-msgid "Error: This question has no right answer!"
-msgstr "Fout: Raar genoeg heeft deze vraag geen antwoorden..."
-
-#: quiz/models/question.py:50
-msgid "Warning: This question has multiple correct answers"
-msgstr "Waarschuwing: Raar genoeg heeft deze vraag geen antwoorden..."
-
-#: quiz/models/question.py:59
-msgid "questions"
-msgstr "vraag"
-
-#: quiz/models/quiz.py:17 quiz/models/season.py:43
-msgid "season"
-msgstr "seizoen"
-
-#: quiz/models/quiz.py:21
-msgid "dropouts"
-msgstr "afvallers"
-
-#: quiz/models/quiz.py:61
-msgid "quizzes"
-msgstr "tests"
-
-#: 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:30
-msgid "owners"
-msgstr "eigenaren"
-
-#: quiz/models/season.py:44
-msgid "seasons"
-msgstr "seizoenen"
-
-#: quiz/templates/quiz/base.html:16
-msgid "Tijd voor de test"
-msgstr "Tijd voor de test"
-
-#: quiz/templates/quiz/question.html:15
-msgid "Weirdly enough this question has no answers..."
-msgstr "Raar genoeg heeft deze vraag geen antwoorden..."
-
-#: quiz/views/enternameview.py:15
-msgid "Name"
-msgstr "Naam"
-
-#: quiz/views/enternameview.py:28
-msgid "This season has no active quiz."
-msgstr "Dit seizoen heeft geen actieve test."
-
-#: quiz/views/enternameview.py:40
-msgid "Candidate does not exist"
-msgstr "Kandidaat bestaat niet"
-
-#: quiz/views/questionview.py:23
-msgid "No active quiz for season"
-msgstr "Geen active test voor seizoen"
-
-#: quiz/views/questionview.py:27
-msgid "Quiz done"
-msgstr "Test klaar"
-
-#: quiz/views/selectseasonview.py:30
-msgid "Invalid season code"
-msgstr "Ongeldige seizoencode"
diff --git a/tvdt/quiz/migrations/0001_initial.py b/tvdt/quiz/migrations/0001_initial.py
deleted file mode 100644
index 070f3af..0000000
--- a/tvdt/quiz/migrations/0001_initial.py
+++ /dev/null
@@ -1,286 +0,0 @@
-# Generated by Django 5.1.3 on 2024-11-25 18:17
-
-import django.db.models.deletion
-from django.db import migrations, models
-
-import quiz.helpers
-
-
-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="name")),
- ],
- 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")),
- ("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="name")),
- ],
- 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(
- blank=True, 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",
- "order_with_respect_to": "question",
- },
- ),
- 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="GivenAnswer",
- fields=[
- (
- "id",
- models.BigAutoField(
- auto_created=True,
- primary_key=True,
- serialize=False,
- verbose_name="ID",
- ),
- ),
- ("created", models.DateTimeField(auto_now_add=True)),
- (
- "answer",
- models.ForeignKey(
- null=True,
- 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",
- ),
- ),
- (
- "quiz",
- models.ForeignKey(
- on_delete=django.db.models.deletion.CASCADE,
- related_name="+",
- to="quiz.quiz",
- verbose_name="quiz",
- ),
- ),
- ],
- options={
- "verbose_name": "given answer",
- "verbose_name_plural": "given answers",
- "ordering": ("quiz", "candidate"),
- },
- ),
- 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="name")),
- (
- "season_code",
- models.CharField(
- default=quiz.helpers.generate_season_code,
- max_length=5,
- verbose_name="season code",
- ),
- ),
- (
- "preregister_candidates",
- models.BooleanField(
- default=True, verbose_name="preregister candidates"
- ),
- ),
- (
- "active_quiz",
- 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",
- ),
- ),
- ],
- 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.AlterOrderWithRespectTo(
- name="question",
- order_with_respect_to="quiz",
- ),
- 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_owner.py b/tvdt/quiz/migrations/0002_season_owner.py
deleted file mode 100644
index 46f11c8..0000000
--- a/tvdt/quiz/migrations/0002_season_owner.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# Generated by Django 5.1.3 on 2024-11-30 18:21
-
-from django.conf import settings
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
- dependencies = [
- ("quiz", "0001_initial"),
- migrations.swappable_dependency(settings.AUTH_USER_MODEL),
- ]
-
- operations = [
- migrations.AddField(
- model_name="season",
- name="owner",
- field=models.ManyToManyField(
- related_name="seasons",
- to=settings.AUTH_USER_MODEL,
- verbose_name="owners",
- ),
- ),
- ]
diff --git a/tvdt/quiz/migrations/0003_correction_amount_alter_correction_candidate_and_more.py b/tvdt/quiz/migrations/0003_correction_amount_alter_correction_candidate_and_more.py
deleted file mode 100644
index 56240a2..0000000
--- a/tvdt/quiz/migrations/0003_correction_amount_alter_correction_candidate_and_more.py
+++ /dev/null
@@ -1,39 +0,0 @@
-# Generated by Django 5.1.3 on 2024-12-01 14:23
-
-import django.db.models.deletion
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
- dependencies = [
- ("quiz", "0002_season_owner"),
- ]
-
- operations = [
- migrations.AddField(
- model_name="correction",
- name="amount",
- field=models.FloatField(default=1, verbose_name="amount"),
- ),
- migrations.AlterField(
- model_name="correction",
- name="candidate",
- field=models.ForeignKey(
- on_delete=django.db.models.deletion.CASCADE,
- related_name="corrections",
- to="quiz.candidate",
- verbose_name="candidate",
- ),
- ),
- migrations.AlterField(
- model_name="correction",
- name="quiz",
- field=models.ForeignKey(
- on_delete=django.db.models.deletion.CASCADE,
- related_name="corrections",
- to="quiz.quiz",
- verbose_name="quiz",
- ),
- ),
- ]
diff --git a/tvdt/quiz/migrations/0004_quiz_dropouts.py b/tvdt/quiz/migrations/0004_quiz_dropouts.py
deleted file mode 100644
index 1503e30..0000000
--- a/tvdt/quiz/migrations/0004_quiz_dropouts.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# Generated by Django 5.1.3 on 2024-12-01 16:57
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
- dependencies = [
- ("quiz", "0003_correction_amount_alter_correction_candidate_and_more"),
- ]
-
- operations = [
- migrations.AddField(
- model_name="quiz",
- name="dropouts",
- field=models.PositiveSmallIntegerField(default=1, verbose_name="dropouts"),
- ),
- ]
diff --git a/tvdt/quiz/migrations/__init__.py b/tvdt/quiz/migrations/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/tvdt/quiz/models/__init__.py b/tvdt/quiz/models/__init__.py
deleted file mode 100644
index 6b1752d..0000000
--- a/tvdt/quiz/models/__init__.py
+++ /dev/null
@@ -1,7 +0,0 @@
-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 .season import Season
diff --git a/tvdt/quiz/models/answer.py b/tvdt/quiz/models/answer.py
deleted file mode 100644
index 5cb12a0..0000000
--- a/tvdt/quiz/models/answer.py
+++ /dev/null
@@ -1,26 +0,0 @@
-from typing import final
-
-from django.db import models
-from django.utils.translation import gettext_lazy as _
-from django_stubs_ext.db.models import TypedModelMeta
-
-
-@final
-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
deleted file mode 100644
index 863e7d6..0000000
--- a/tvdt/quiz/models/candidate.py
+++ /dev/null
@@ -1,50 +0,0 @@
-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, Question, QuizAlreadyFinished
-
-
-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, enabled=True)
- .exclude(
- id__in=GivenAnswer.objects.filter(
- candidate=candidate,
- quiz=quiz,
- answer__isnull=False,
- ).values_list("answer__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
deleted file mode 100644
index eed4a57..0000000
--- a/tvdt/quiz/models/correction.py
+++ /dev/null
@@ -1,24 +0,0 @@
-from django.db import models
-from django.utils.translation import gettext_lazy as _
-from django_stubs_ext.db.models import TypedModelMeta
-
-
-class Correction(models.Model):
- candidate = models.ForeignKey(
- "Candidate",
- on_delete=models.CASCADE,
- related_name="corrections",
- verbose_name=_("candidate"),
- )
- quiz = models.ForeignKey(
- "Quiz",
- on_delete=models.CASCADE,
- related_name="corrections",
- verbose_name=_("quiz"),
- )
- amount = models.FloatField(verbose_name=_("amount"), default=1)
-
- 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
deleted file mode 100644
index b6863e7..0000000
--- a/tvdt/quiz/models/given_answer.py
+++ /dev/null
@@ -1,37 +0,0 @@
-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"),
- )
-
- quiz = models.ForeignKey(
- "Quiz",
- on_delete=models.CASCADE,
- null=False,
- related_name="+",
- verbose_name=_("quiz"),
- )
-
- answer = models.ForeignKey(
- "Answer",
- on_delete=models.CASCADE,
- verbose_name=_("answer"),
- null=True,
- )
- created = models.DateTimeField(auto_now_add=True)
-
- def __str__(self):
- return f"{self.quiz} - {self.candidate.name} {self.answer}"
-
- class Meta(TypedModelMeta):
- ordering = ("quiz", "candidate")
-
- verbose_name = _("given answer")
- verbose_name_plural = _("given answers")
diff --git a/tvdt/quiz/models/question.py b/tvdt/quiz/models/question.py
deleted file mode 100644
index 8b961d3..0000000
--- a/tvdt/quiz/models/question.py
+++ /dev/null
@@ -1,61 +0,0 @@
-from django.db import models
-from django.db.models import QuerySet
-from django.utils.translation import gettext_lazy as _
-from django_stubs_ext.db.models import TypedModelMeta
-
-from quiz.models import Answer
-
-
-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"))
-
- @property
- def order(self):
- return self._order
-
- @property
- def right_answer(self) -> QuerySet[Answer]:
- return self.answers.filter(is_right_answer=True)
-
- @property
- def has_right_answer(self) -> bool:
- return self.answers.filter(is_right_answer=True).count() > 0
-
- @property
- def errors(self) -> str | None:
- if self.answers.count() == 0:
- return _("Error: Question has no answers")
-
- n_correct_answers = self.answers.filter(is_right_answer=True).count()
-
- if n_correct_answers == 0:
- return _("Error: This question has no right answer!")
-
- if n_correct_answers > 1:
- return _("Warning: This question has multiple correct answers")
-
- return None
-
- 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
deleted file mode 100644
index ded9c1e..0000000
--- a/tvdt/quiz/models/quiz.py
+++ /dev/null
@@ -1,61 +0,0 @@
-from django.db import models
-from django.db.models import F, OuterRef, Subquery
-from django.db.models.aggregates import Count, Max, Min
-from django.db.models.functions import Coalesce
-from django.utils.translation import gettext_lazy as _
-from django_stubs_ext.db.models import TypedModelMeta
-
-from quiz.models import Candidate, Correction
-
-
-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"),
- )
-
- dropouts = models.PositiveSmallIntegerField(
- verbose_name=_("dropouts"),
- default=1,
- )
-
- def is_valid_quiz(self) -> bool:
- return True
- # Check > 0 active questions
- # Check every question 1 right answer
-
- def get_score(self):
- time_query = (
- Candidate.objects.filter(id=OuterRef("id"), answers__quiz=self)
- .annotate(time=Max("answers__created") - Min("answers__created"))
- .values("time")
- )
- corrections = Correction.objects.filter(
- quiz=self, candidate=OuterRef("id")
- ).values("amount")
-
- scores = (
- Candidate.objects.filter(
- answers__answer__is_right_answer=True,
- answers__quiz=self,
- )
- .values("id", "name")
- .annotate(
- correct=Count("answers"),
- corrections=Coalesce(Subquery(corrections), 0.0),
- score=F("correct") + F("corrections"),
- time=Subquery(time_query),
- )
- .order_by("-score", "time")
- )
- return scores
-
- 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/season.py b/tvdt/quiz/models/season.py
deleted file mode 100644
index 1141d86..0000000
--- a/tvdt/quiz/models/season.py
+++ /dev/null
@@ -1,44 +0,0 @@
-from django.contrib.auth import get_user_model
-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
-
-User = get_user_model()
-
-
-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")
- )
- owner = models.ManyToManyField(
- User,
- verbose_name=_("owners"),
- related_name="seasons",
- )
-
- 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/de_mol/background.png b/tvdt/quiz/static/quiz/de_mol/background.png
deleted file mode 100644
index 3042bd8c9cca1e292ec18f897e73596aea2cdae0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 330116
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