From dae5381b582e9513b29f80505b1dee70f06550f8 Mon Sep 17 00:00:00 2001 From: moanos Date: Mon, 21 Oct 2024 20:32:47 +0200 Subject: [PATCH] Initial commit --- .gitignore | 159 +++++ README.md | 26 + idescriptor/__init__.py | 0 idescriptor/admin.py | 5 + idescriptor/apps.py | 6 + idescriptor/forms.py | 23 + idescriptor/migrations/0001_initial.py | 28 + .../migrations/0002_alter_image_alt_text.py | 18 + idescriptor/migrations/__init__.py | 0 idescriptor/models.py | 63 ++ idescriptor/static/idescriptor/css/styles.css | 593 ++++++++++++++++++ .../favicon/android-chrome-192x192.png | Bin 0 -> 15717 bytes .../favicon/android-chrome-512x512.png | Bin 0 -> 62306 bytes .../idescriptor/favicon/apple-touch-icon.png | Bin 0 -> 13920 bytes .../idescriptor/favicon/favicon-16x16.png | Bin 0 -> 432 bytes .../idescriptor/favicon/favicon-32x32.png | Bin 0 -> 1073 bytes .../static/idescriptor/favicon/favicon.ico | Bin 0 -> 15406 bytes .../idescriptor/favicon/site.webmanifest | 1 + .../templates/idescriptor/base_generic.html | 32 + idescriptor/templates/idescriptor/header.html | 12 + .../templates/idescriptor/image-form.html | 16 + idescriptor/templates/idescriptor/index.html | 28 + idescriptor/tests.py | 3 + idescriptor/urls.py | 8 + idescriptor/views.py | 51 ++ imagebot.cfg | 23 + imagebot/__init__.py | 0 imagebot/asgi.py | 16 + imagebot/manage.py | 22 + imagebot/settings.py | 178 ++++++ imagebot/urls.py | 27 + imagebot/wsgi.py | 16 + poetry.lock | 565 +++++++++++++++++ pyproject.toml | 34 + 34 files changed, 1953 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 idescriptor/__init__.py create mode 100644 idescriptor/admin.py create mode 100644 idescriptor/apps.py create mode 100644 idescriptor/forms.py create mode 100644 idescriptor/migrations/0001_initial.py create mode 100644 idescriptor/migrations/0002_alter_image_alt_text.py create mode 100644 idescriptor/migrations/__init__.py create mode 100644 idescriptor/models.py create mode 100644 idescriptor/static/idescriptor/css/styles.css create mode 100644 idescriptor/static/idescriptor/favicon/android-chrome-192x192.png create mode 100644 idescriptor/static/idescriptor/favicon/android-chrome-512x512.png create mode 100644 idescriptor/static/idescriptor/favicon/apple-touch-icon.png create mode 100644 idescriptor/static/idescriptor/favicon/favicon-16x16.png create mode 100644 idescriptor/static/idescriptor/favicon/favicon-32x32.png create mode 100644 idescriptor/static/idescriptor/favicon/favicon.ico create mode 100644 idescriptor/static/idescriptor/favicon/site.webmanifest create mode 100644 idescriptor/templates/idescriptor/base_generic.html create mode 100644 idescriptor/templates/idescriptor/header.html create mode 100644 idescriptor/templates/idescriptor/image-form.html create mode 100644 idescriptor/templates/idescriptor/index.html create mode 100644 idescriptor/tests.py create mode 100644 idescriptor/urls.py create mode 100644 idescriptor/views.py create mode 100644 imagebot.cfg create mode 100644 imagebot/__init__.py create mode 100644 imagebot/asgi.py create mode 100755 imagebot/manage.py create mode 100644 imagebot/settings.py create mode 100644 imagebot/urls.py create mode 100644 imagebot/wsgi.py create mode 100644 poetry.lock create mode 100644 pyproject.toml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8fa916a --- /dev/null +++ b/.gitignore @@ -0,0 +1,159 @@ +media/ +.secrets +*.db + + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# 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 + +# 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 + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# 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/#use-with-ide +.pdm.toml + +# 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/ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..fc5861f --- /dev/null +++ b/README.md @@ -0,0 +1,26 @@ +# RatBot + +``` +alembic init alembic +``` + +In alembic.ini, configure the database URL: +```ini +sqlalchemy.url = sqlite:///./test.db +``` + +`albemic/env.py` +```python +from models import Base +target_metadata = Base.metadata +``` + +**Make migrations** +```zsh +alembic revision --autogenerate -m "Create model XYZ" +``` + +**Migrate** +```zsh +alembic upgrade head +``` diff --git a/idescriptor/__init__.py b/idescriptor/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/idescriptor/admin.py b/idescriptor/admin.py new file mode 100644 index 0000000..b320961 --- /dev/null +++ b/idescriptor/admin.py @@ -0,0 +1,5 @@ +from django.contrib import admin + +from idescriptor.models import Image + +admin.site.register(Image) diff --git a/idescriptor/apps.py b/idescriptor/apps.py new file mode 100644 index 0000000..3adfbed --- /dev/null +++ b/idescriptor/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class IdescriptorConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'idescriptor' diff --git a/idescriptor/forms.py b/idescriptor/forms.py new file mode 100644 index 0000000..15b1215 --- /dev/null +++ b/idescriptor/forms.py @@ -0,0 +1,23 @@ +from crispy_forms.helper import FormHelper +from crispy_forms.layout import Submit, Hidden, HTML +from django import forms +from django.urls import reverse_lazy + +from django.utils.translation import gettext_lazy as _ + +from idescriptor.models import Image + + +class ImageForm(forms.ModelForm): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.helper = FormHelper() + self.helper.form_id = 'form-describe-image' + self.helper.form_class = '' + self.helper.form_method = 'post' + self.helper.add_input(Hidden("action", "add_image_details")) + self.helper.add_input(Submit('submit', _('Submit'))) + + class Meta: + model = Image + fields = ('title', 'alt_text') diff --git a/idescriptor/migrations/0001_initial.py b/idescriptor/migrations/0001_initial.py new file mode 100644 index 0000000..c2ca6de --- /dev/null +++ b/idescriptor/migrations/0001_initial.py @@ -0,0 +1,28 @@ +# Generated by Django 5.1.2 on 2024-10-21 11:41 + +import uuid +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Image', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(blank=True, help_text='Image title that will be posted', max_length=200, null=True)), + ('alt_text', models.CharField(blank=True, help_text='Describe the image', max_length=2000, null=True)), + ('file_path', models.CharField(max_length=1500)), + ('image', models.ImageField(upload_to='')), + ('file_hash', models.CharField(blank=True, max_length=64, null=True, unique=True, verbose_name='File hash')), + ('last_posted', models.DateTimeField(blank=True, null=True)), + ('number_times_posted', models.IntegerField(default=0)), + ], + ), + ] diff --git a/idescriptor/migrations/0002_alter_image_alt_text.py b/idescriptor/migrations/0002_alter_image_alt_text.py new file mode 100644 index 0000000..09d9d7d --- /dev/null +++ b/idescriptor/migrations/0002_alter_image_alt_text.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.2 on 2024-10-21 18:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('idescriptor', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='image', + name='alt_text', + field=models.TextField(blank=True, help_text='Describe the image', null=True), + ), + ] diff --git a/idescriptor/migrations/__init__.py b/idescriptor/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/idescriptor/models.py b/idescriptor/models.py new file mode 100644 index 0000000..b7cf577 --- /dev/null +++ b/idescriptor/models.py @@ -0,0 +1,63 @@ +import hashlib +import os +import uuid +from os.path import isfile, join + +from django.db import models +from django.urls import reverse +from django.core.files import File +from django.utils.translation import gettext_lazy as _ +from datetime import datetime + +from imagebot import settings + + +def get_hash(filepath): + with open(filepath, 'rb') as file: + # read contents of the file + data = file.read() + sha256 = hashlib.sha256(data).hexdigest() + return sha256 + + +class Image(models.Model): + id = models.UUIDField(primary_key=True, default=uuid.uuid4, verbose_name=_('ID')) + title = models.CharField(max_length=200, + help_text=_("Image title that will be posted"), + blank=True, null=True) + alt_text = models.TextField(help_text=_("Describe the image"), + blank=True, null=True) + file_path = models.CharField(max_length=1500) + image = models.ImageField() + file_hash = models.CharField(verbose_name=_('File hash'), max_length=64, blank=True, null=True, unique=True) + last_posted = models.DateTimeField(blank=True, null=True) + number_times_posted = models.IntegerField(default=0) + + def __str__(self): + if self.title: + return self.title + else: + return f"{self.file_hash}" + + def get_absolute_url(self): + reverse("image-update", pk=self.id) + + def set_image_posted(self): + self.number_times_posted += 1 + self.last_posted = datetime.now() + + @staticmethod + def consume(): + files = [f for f in settings.MEDIA_CONSUME_DIR.iterdir() if f.is_file()] + + for path in files: + file_hash = get_hash(path) + with open(path, 'rb') as f: + django_file = File(f, name=settings.MEDIA_PROCESSED_DIR_RELATIVE / path.name) + + img = Image.objects.create( + file_path=str(path), + image=django_file, + file_hash=file_hash + ) + os.remove(path) diff --git a/idescriptor/static/idescriptor/css/styles.css b/idescriptor/static/idescriptor/css/styles.css new file mode 100644 index 0000000..8ee9182 --- /dev/null +++ b/idescriptor/static/idescriptor/css/styles.css @@ -0,0 +1,593 @@ +/***************/ +/* MAIN COLORS */ +/***************/ + +:root { + --primary-light-one: #5daa68; + --primary-light-two: #4a9455; + --primary-semidark-one: #356c3c; + --primary-dark-one: #17311b; + --secondary-light-one: #faf1cf; + --secondary-light-two: #e1d7b5; + --background-one: var(--primary-light-one); + --background-two: var(--primary-light-two); + --background-three: var(--secondary-light-one); + --background-four: var(--primary-dark-one); + --highlight-one: var(--primary-dark-one); + --highlight-one-text: var(--secondary-light-one); + --highlight-two: var(--primary-semidark-one); + --text-one: var(--secondary-light-one); + --shadow-one: var(--primary-dark-one); + --text-two: var(--primary-dark-one); + --text-three: var(--primary-light-one); + --shadow-three: var(--primary-dark-one); +} +/**************************/ +/* TAG SETTINGS (GENERAL) */ +/**************************/ +html, body { + margin: 0; + height: 100%; +} + +body { + background: var(--background-one); + color: var(--text-two); +} + + +table { + width: 100%; +} + +a { + text-decoration: none; + color: inherit; +} + +table { + border: none; + border-collapse: collapse; + background-color: var(--secondary-light-one); + word-break: break-word; +} + +@media screen and (max-width: 500px) { + table { + font-size: small; + } +} + +td { + border: 2px solid black; + border-collapse: collapse; + padding: 5px; +} + +th { + border: 3px solid black; + border-collapse: collapse; + padding: 8px; + background-color: var(--secondary-light-two); +} + +h1, h2 { + word-wrap: break-word; + color: var(--text-one); + text-shadow: 2px 2px var(--shadow-one); +} + +* { + box-sizing: border-box; +} + +textarea { + border-radius: 10px; + width: 100%; + margin: 5px; +} + + +/**************/ +/* CONTAINERS */ +/**************/ + +.container { + display: flex; + flex-wrap: wrap; +} + +.container-cards { + display: flex; + flex-wrap: wrap; +} + +.card { + flex: 1 25%; + margin: 10px; + border-radius: 8px; + padding: 5px; + background: var(--background-three); + color: var(--text-two); +} + +.container-edit-buttons { + display: flex; + flex-wrap: wrap; + + .btn { + margin: 5px; + } +} + +/*******************************/ +/* PARTIAL SPECIFIC CONTAINERS */ +/*******************************/ + + +/***********/ +/* BUTTONS */ +/***********/ + +.btn { + background-color: var(--primary-light-one); + color: var(--secondary-light-one); + padding: 16px; + border-radius: 8px; + border: none; + font-weight: bold; +} + +.btn2 { + background-color: var(--secondary-light-one); + color: var(--primary-dark-one); + padding: 8px; + border-radius: 4px; + border: none; + margin: 5px; +} + +/*********************/ +/* UNIQUE COMPONENTS */ +/*********************/ + +.content-box { + margin: 20px; +} + +.header { + overflow: hidden; + background-color: var(--background-two); + border-bottom-left-radius: 15px; + border-bottom-right-radius: 15px; +} + + +.nav-link { + color: var(--text-one); + text-align: center; + text-decoration: none; + border-radius: 4px; +} + +.header a, .header form { + float: left; + padding: 5px 12px 5px 12px; + line-height: 25px; +} + +.header a:hover { + background-color: var(--highlight-one); + color: var(--highlight-one-text); +} + +.header a.active { + background-color: dodgerblue; + color: white; +} + + + +.header-right select.option { + color: #000; + background-color: var(--highlight-one); + border: 1px; +} + +.header-right { + float: right; + display: flex; + border-radius: 0px 0px 15px 15px; + background-color: var(--highlight-two); + color: var(--highlight-one-text); + padding: 5px 5px 0px 5px; + height: 67px; +} + + +@media screen and (max-width: 500px) { + .header a { + float: none; + display: block; + text-align: left; + } + + .header-right { + float: none; + } +} + +.logo img { + height: 40px; +} + +.form-button, .link-button a:link, .link-button a:visited { + background-color: #4ba3cd; + color: white; + padding: 14px 25px; + text-align: center; + text-decoration: none; + display: block; + margin: 10px; + border-radius: 4px; + border: none; +} + + +.form-button:hover, .link-button a:hover, .link-button a:active { + background-color: #4090b6; +} + +.delete-button, .delete-button a:link, .delete-button a:visited { + border: none; + margin: 10px; + background-color: #a3380a; + border-radius: 4px; +} + +.delete-button:hover, .delete-button a:hover, .delete-button a:active { + background-color: #8f2f06; +} + +.delete-button { + display: block; +} + +.search_result { + margin-top: 10px; + margin-bottom: 10px; +} + +.action-menu a { + text-decoration: none; + color: inherit; +} + +.action-menu ul { + display: flex; + width: 100%; + height: 80vh; + margin: auto; + max-width: 1000px; + justify-content: space-between; + text-align: center; +} + +.action-menu li { + padding: 1rem 2rem 1.15rem; + text-transform: uppercase; + cursor: pointer; + color: #ebebeb; + min-width: 80px; + margin: 10px; + font-weight: bold; + list-style-type: none; + background-color: #4ba3cd; + border-radius: 5px; +} + +.action-menu li:hover { + background-color: #4090b6; + animation: spring 300ms ease-out; +} + +.action-menu li:active { + transform: translateY(4px); +} + +.action-button ul { + display: flex; + width: 100%; + height: 80vh; + margin: auto; + max-width: 1000px; + justify-content: space-between; + text-align: center; +} + +.action-button li { + text-decoration: none; + padding: 1rem 2rem 1.15rem; + text-transform: uppercase; + cursor: pointer; + color: #ebebeb; + min-width: 80px; + margin: 10px; + font-weight: bold; + list-style-type: none; + background-color: #4ba3cd; + border-radius: 5px; +} + +.action-button li:hover { + background-color: #4090b6; + animation: spring 300ms ease-out; +} + +.action-button li:active { + transform: translateY(4px); +} + + +@keyframes spring { + 15% { + -webkit-transform-origin: center center; + -webkit-transform: scale(1.1, 1.05); + } + 40% { + -webkit-transform-origin: center center; + -webkit-transform: scale(0.95, 0.95); + } + 75% { + -webkit-transform-origin: center center; + -webkit-transform: scale(1.025, 1); + } + 100% { + -webkit-transform-origin: center center; + -webkit-transform: scale(1, 1); + } +} + + +.tag { + border: black 1px solid; + border-radius: 0.3rem; + padding: 2px; + margin: 4px; +} + +.sex { + background: #F0DEDE; +} + +.species { + background: #F8ECD7; +} + + + + + +.photos { + display: flex; + flex-wrap: wrap; +} + +.card-photo { + flex: 1 16%; + margin: 10px; +} + +.card-photo img { + max-width: 100%; + border-radius: 10%; +} + + +.card h1 { + color: var(--text-three); + text-shadow: 1px 1px var(--shadow-three); +} + +.card h2 { + color: var(--text-three); + text-shadow: 1px 1px var(--shadow-three); +} + +.card img { + max-width: 100%; + border-radius: 10%; +} + + +.header-card-adoption-notice { + display: flex; + justify-content: space-evenly; + align-items: center; + flex-wrap: wrap; + +} + +.table-adoption-notice-info { + margin-top: 10px; +} + + +@media (max-width: 920px) { + .card { + flex: 1 100%; + } +} + +.adoption-notice-img img, img { + max-width: 100%; + border-radius: 10%; + margin: 5px; + max-height: 250px; +} + +.img-small img { + height: 100px; +} + +.btn-notification { + display: inline-block; + position: relative; + padding: 0; +} + +/* Make the badge float in the top right corner of the button */ +.button__badge { + background-color: #fa3e3e; + border-radius: 2px; + color: white; + + padding: 1px 3px; + font-size: 10px; + + position: absolute; /* Position the badge within the relatively positioned button */ + top: 0; + right: 0; +} + +.adoption-card-report-link, .notification-card-mark-read { + margin-left: auto; + font-size: 2rem; + padding: 10px; +} + +.notification-card-mark-read { + display: inline; +} + +.heading-card-adoption-notice { + word-wrap: anywhere; +} + +.tags { + margin-right: auto; + padding: 5px; +} + +#form-adoption-notice, #form-registration { + .form-group { + margin: 30px; + } +} + +.detail-adoption-notice-header h1 { + width: 50%; + display: inline-block; +} + +.detail-adoption-notice-header a { + display: inline-block; + float: right; +} + +@media (max-width: 920px) { + .detail-adoption-notice-header h1 { + width: 100%; + } + + .detail-adoption-notice-header a { + display: inline-block; + float: none; + } +} + +.container-comment-headers, .container-cards { + display: flex; + flex-wrap: wrap; + background: var(--background-two); + border-radius: 8px; + padding: 5px; +} + +.comment, .notification { + flex: 1 100%; + margin: 10px; + border-radius: 8px; + padding: 5px; + background: var(--background-three); + color: var(--text-two); +} + + + +.form-comments { + .btn { + margin: 5px; + } +} + +.announcement { + flex: 1 100%; + margin: 10px; + border-radius: 8px; + padding: 5px; + background: var(--background-three); + color: var(--text-two); + + h1 { + font-size: 1.2rem; + margin: 0px; + padding: 0px; + color: var(--text-two); + text-shadow: none; + } +} + + +.form-search { + select, input { + background-color: var(--primary-light-one); + color: var(--text-one); + border-radius: 3px; + border: none; + } + +} + +/************************/ +/* GENERAL HIGHLIGHTING */ +/************************/ + +.important { + border: #e01137 4px solid; +} + +.warning { + border: #e09e11 4px solid; +} + +.info { + border: rgba(17, 58, 224, 0.51) 4px solid; +} + + +/*******/ +/* MAP */ +/*******/ + +.marker { + background-image: url('../img/logo_transparent.png'); + background-size: cover; + width: 50px; + height: 50px; + cursor: pointer; +} + +.maplibregl-popup { + max-width: 600px !important; +} + +.maplibregl-popup-content { + background-color: var(--background-three) !important; + border-radius: 8px !important; +} + +.map-in-content #map { + height: 500px; + width: 90%; +} diff --git a/idescriptor/static/idescriptor/favicon/android-chrome-192x192.png b/idescriptor/static/idescriptor/favicon/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..05e978c6a95fcb399a369e60378a40e9cd7c5925 GIT binary patch literal 15717 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

irsv0)sR?MwkKfX8 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 literal 0 HcmV?d00001 diff --git a/idescriptor/static/idescriptor/favicon/apple-touch-icon.png b/idescriptor/static/idescriptor/favicon/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2ea06e616e80345f04149c742bd8e3d5acc47eab GIT binary patch literal 13920 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 z zi+2Q_@A)u!3ANeOd5yL|`e3@$@p26^X+`SXgTO1=mN3|P%@L(Oq>b^p2xvklozsju z13WF$-~=2EZAYjp6tDmm=VCQQAFpf*@UHkP7$;0lhhPAB3OYb#CIMc>Za}u1Pg0A~ z(A+;9ycK)Y%D`y)G?*LqfnnJ>JsEp75(!w#^Oa!LJu~`wYz#PNM+1l0U(SNw>;?5D z@L1_Xez8f*Yn(@~Ik>`xaj$CCipEShs{1~)nh!Lx4fcRH-l!<*O_&IVW`(-HUxWLu zy)Q$X5z?bJ5cCD@Wfb6bYczPD_xe-}u87WJX%F4uaZucTFuu=*Q{Y~|7M|Bod)5`> zGJEztZmTm*?z<=udEromM?;4(`#Fhza0$%kW_6nc1 z#6$5EdYb1w5l)sYI@B;Y7Wkdo{|X)_JzPO)9Jk7T+W&^G(&nIS2(=lm9Q1w#q%LU$ rm_*zn9m}FWL|1qJLFJMas|oxMnW52|(Ch@a00000NkvXXu0mjf#6J4u literal 0 HcmV?d00001 diff --git a/idescriptor/static/idescriptor/favicon/favicon.ico b/idescriptor/static/idescriptor/favicon/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..54b166dafd62ba3b37a8aa3bef84c57bf08032e0 GIT binary patch literal 15406 zcmeI0d8}2%9mg*qiy(_E1zF^>3L?n9RprT(vWskmiogR(fg+W)C{RH_pap~?#Ug@{ z#x`lir4&rSF4)vqwWL)WO-mC~o3wv7-J-Sj^LgAuhT~n%eJdt@lg~SIX6BqT^PAuA zH*;SqRVP(1)uKg;YdW>`s#I!dDwRs7FW&dMHkCR?UH|@>_MWNKD{WG#Ui9G+p14@g zr5N#+a&_Qut4ul9r6CO~pa1?rKz`}U#6lv*U%sQp3!Ff54xSCOM zSG+Q~_xsxMe$dxK`5o6w+vSsES0mw0&^PqSIpF-0`Wju!<=QzG*TixOR77Nn)I7Mk zA`j<##ypdT5->kif%HRjK%~Y|fvYyG3Axsh^oexlW_(mxiR)sXHGYkyZ0bX$IYNJI zndvZ@tNBNNs+*~+$VI!ZghgPyI8XD4S7Rm`lX1BLw!#Qd)4+Yf`UvOJ7m~<$cnX|{ zx#J-C%}CuSOa=4EGSFAeZ{LIUum)a+Lof)Oi_d=zj)G&!r_D5$1|9UPBjC8)Dnl7B zzVDZC2Hu0yU<^5qwQw~k$6}1m0@o>*%*EFQjXq%;@=ON zDqPfe^_c~rE%Z;B6-$`Wr{ukba`UxJ`LZ3O{ z+0XdTrS&wVV~xgclvAUoT@*fs|A6z#r@Ayg2#(V+V82jZxG4!M zVrAzOKTo?ZVXVX+`NVBYYV?nPL$^>@+-D(>x$^75eW7AoI{X7(%G0rR zj<$u=-z6M#kTvj!JySbOuB)iG=orjV=eyNv!>t0^0?&ksHAe3jJe7+X;wd~%i z?TzJ_2q?I;RqanHLwW$-$y)8euKK|l>TM@9}MQ}oe)X;X{(x) zv2#`CgPwb%ykApe_yQjq2aZ9%tphbJ_nYI8Er-_hSg!c*^%en>=UUf9`I}}L*hfG6DpaQ*HRAodU^lD;eZpMhxmth7wf@~`^LOww zpv|X36c4>AFNSt71$>Wkj@qXx=cD~b!!{TLj$;(Kr<=dsGxx)C(6-_FnAf|)K3EOf zp*1M&un;^ezW`_8ZFmcQ4L^V-;BSYDNW0F4qtFDLgXe7Dt6wyONZQM>FNGbj3QFMy z@OP$uvKGFRVI`*K;JBNDw%Q6w zq$+29e_~<`sQkO4bFn`V7Wfr4xJ&N+ymV2%JOw8(B`^-1pkA-L6oN{CRTrXJ_@}+ ze=f!!uBZQLi1I7N%cMO#gJj$98c_cRd<>5N@8F(Otmg2*d@vWf{|Yib^d z%jaH(X#D@8+%euM%e`x9j?rHF%x-XO8-s~M!B)Do{b8rd#3_K?~KGhQrmzO^I zreR+ZY=J-E=evnUHY1|Bja+2+vAeYZg zqU|}zWh`msS zh2R;YGV=Wgz;9d+`#?XcD%Ish%U}Z-SK7wCZz-IIMNk=gt>XFh5d98ZOL-JjrSxrc z+aKUvxB$j%DLfDQzwuiKiqQxwKXe-RvqXOG{U;ubdim#16;u^*^fr{nv${M^kPql^7;9hhN z{sg~+7vTh)0)21{#8pPc^mt`0-?!lVgTS-WOqdMDsf2Qk%o78{$}68=LX9 z1=4V(OIv$ZGq*+Zx7Ri(bf%2@*Y + + + {% block title %}{% endblock %} + + + + + + + + + + + + + + +{% block header %} +{% include "idescriptor/header.html" %} +{% endblock %} +

+
+
+ {% block content %}{% endblock %} +
+
+
+ + diff --git a/idescriptor/templates/idescriptor/header.html b/idescriptor/templates/idescriptor/header.html new file mode 100644 index 0000000..25cf15c --- /dev/null +++ b/idescriptor/templates/idescriptor/header.html @@ -0,0 +1,12 @@ +{% load static %} +{% load i18n %} + +
\ No newline at end of file diff --git a/idescriptor/templates/idescriptor/image-form.html b/idescriptor/templates/idescriptor/image-form.html new file mode 100644 index 0000000..a9a5c0e --- /dev/null +++ b/idescriptor/templates/idescriptor/image-form.html @@ -0,0 +1,16 @@ +{% extends "idescriptor/base_generic.html" %} +{% load i18n %} +{% load crispy_forms_tags %} + +{% block title %}{% translate "Organize images for a bot" %}{% endblock %} + +{% block content %} +
+

{{ image.title }}

+ {{ image.alt_text }} +
+ {% crispy form %} + {% trans 'Continue' %} +
+
+{% endblock %} \ No newline at end of file diff --git a/idescriptor/templates/idescriptor/index.html b/idescriptor/templates/idescriptor/index.html new file mode 100644 index 0000000..8df819e --- /dev/null +++ b/idescriptor/templates/idescriptor/index.html @@ -0,0 +1,28 @@ +{% extends "idescriptor/base_generic.html" %} +{% load i18n %} +{% load crispy_forms_tags %} + +{% block title %}{% translate "Organize images for a bot" %}{% endblock %} + +{% block content %} +
+ {% if image_to_describe %} + {{ image_to_describe.alt_text }} +
+ {% crispy form %} +
+ {% else %} +

All done

+ {% endif %} +
+
+

{% trans "Controls" %}

+
+ {% csrf_token %} + + +
+
+{% endblock %} \ No newline at end of file diff --git a/idescriptor/tests.py b/idescriptor/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/idescriptor/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/idescriptor/urls.py b/idescriptor/urls.py new file mode 100644 index 0000000..be040bf --- /dev/null +++ b/idescriptor/urls.py @@ -0,0 +1,8 @@ +from django.urls import path + +from . import views + +urlpatterns = [ + path("", views.index, name="index"), + path("image//", views.ImageFormView.as_view(), name="image-update"), +] \ No newline at end of file diff --git a/idescriptor/views.py b/idescriptor/views.py new file mode 100644 index 0000000..7c82b6c --- /dev/null +++ b/idescriptor/views.py @@ -0,0 +1,51 @@ +from django.http import HttpResponseRedirect +from django.shortcuts import render +from django.views.generic import FormView, UpdateView +from django.urls import reverse + +from idescriptor.forms import ImageForm +from idescriptor.models import Image +from django.db.models import Q + + +def get_image_for_descriptor(): + image = Image.objects.filter(Q(alt_text=None) | Q(title=None)).first() + return image + + +class ImageFormView(UpdateView): + model = Image + form_class = ImageForm + template_name = "idescriptor/image-form.html" + success_url = "." + + def form_valid(self, form): + return super().form_valid(form) + + +def index(request): + """View function for home page of site.""" + image_to_describe = get_image_for_descriptor() + + if request.method == "POST": + action = request.POST.get("action") + if action == "consume": + Image.consume() + + if action == "add_image_details": + form = ImageForm(request.POST, instance=image_to_describe) + + if form.is_valid(): + instance = form.save() + print("Didi") + return HttpResponseRedirect(reverse("image-update", args=(instance.id,))) + else: + print("Dodo") + else: + form = ImageForm(instance=image_to_describe) + else: + form = ImageForm(instance=image_to_describe) + + context = {"image_to_describe": image_to_describe, "form": form} + + return render(request, 'idescriptor/index.html', context=context) diff --git a/imagebot.cfg b/imagebot.cfg new file mode 100644 index 0000000..c818298 --- /dev/null +++ b/imagebot.cfg @@ -0,0 +1,23 @@ +# DEBUG CONFIGURATION +# DO NOT USE IN PRODUCTION + +[imagebot] +instance_name=ImageBot +host=localhost + +[django] +secret=CHANGE-ME +debug=True + +[database] +backend=sqlite3 +name=imagebot.sqlite3 + +[locations] +media_root=./media/ + +[logging] +app_log_level=INFO +django_log_level=INFO + + diff --git a/imagebot/__init__.py b/imagebot/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/imagebot/asgi.py b/imagebot/asgi.py new file mode 100644 index 0000000..a6c044c --- /dev/null +++ b/imagebot/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for imagebot project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/5.1/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'imagebot.settings') + +application = get_asgi_application() diff --git a/imagebot/manage.py b/imagebot/manage.py new file mode 100755 index 0000000..1b41156 --- /dev/null +++ b/imagebot/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'imagebot.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/imagebot/settings.py b/imagebot/settings.py new file mode 100644 index 0000000..43aedb2 --- /dev/null +++ b/imagebot/settings.py @@ -0,0 +1,178 @@ +""" +Django settings for imagebot project. + +Generated by 'django-admin startproject' using Django 5.1.2. + +For more information on this file, see +https://docs.djangoproject.com/en/5.1/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/5.1/ref/settings/ +""" +import configparser +import os +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + +"""CONFIG PARSER """ +config = configparser.RawConfigParser() +if 'NF_CONFIG_FILE' in os.environ: + config.read_file(open(os.environ.get('NF_CONFIG_FILE'), encoding='utf-8')) +if 'DOCKER_BUILD' in os.environ and os.environ.get('DOCKER_BUILD'): + config.read("docker/build.cfg", encoding='utf-8') +else: + config.read(['/etc/imagebot/imagebot.cfg', os.path.expanduser('~/.imagebot.cfg'), 'imagebot.cfg'], + encoding='utf-8') + +CONFIG_FILE = config + +DJANGO_LOG_LEVEL = config.get('logging', 'django_log_level', fallback="WARNING") +APP_LOG_LEVEL = config.get('logging', 'app_log_level', fallback="WARNING") + +"""LOGGING""" +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'formatters': { + 'verbose': { + 'format': '{levelname} {asctime} {module} {message}', + 'style': '{', + }, + }, + 'handlers': { + 'console': { + 'class': 'logging.StreamHandler', + 'formatter': 'verbose', + }, + }, + 'loggers': { + 'django': { + 'handlers': ['console'], + 'level': DJANGO_LOG_LEVEL, + }, + 'fellchensammlung': { + 'handlers': ['console'], + 'level': APP_LOG_LEVEL, + }, + 'imagebot': { + 'handlers': ['console'], + 'level': APP_LOG_LEVEL, + }, + }, +} + +""" DJANGO """ +try: + SECRET_KEY = config.get('django', 'secret') +except configparser.NoSectionError: + raise BaseException("No config found or no Django Secret is configured!") +DEBUG = config.getboolean('django', 'debug', fallback=False) + +host = config.get("imagebot", "host", fallback='*') +# see https://docs.djangoproject.com/en/3.2/ref/settings/#std-setting-ALLOWED_HOSTS +ALLOWED_HOSTS = [host] +CSRF_TRUSTED_ORIGINS = [f"https://{host}"] + +MEDIA_URL = '/media/' +MEDIA_ROOT = Path(config.get('locations', 'media_root')) +MEDIA_CONSUME_DIR_RELATIVE = Path("consume") # Relative to MEDIA_ROOT +MEDIA_CONSUME_DIR = MEDIA_ROOT / MEDIA_CONSUME_DIR_RELATIVE +MEDIA_PROCESSED_DIR_RELATIVE = Path("processed") # Relative to MEDIA_ROOT + +CRISPY_TEMPLATE_PACK = 'bootstrap4' + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'idescriptor', + 'fontawesomefree', + 'crispy_forms', + "crispy_bootstrap4", +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'imagebot.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'imagebot.wsgi.application' + +# Database +# https://docs.djangoproject.com/en/5.1/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } +} + +# Password validation +# https://docs.djangoproject.com/en/5.1/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + +# Internationalization +# https://docs.djangoproject.com/en/5.1/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_TZ = True + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/5.1/howto/static-files/ + +STATIC_URL = 'static/' + +# Default primary key field type +# https://docs.djangoproject.com/en/5.1/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/imagebot/urls.py b/imagebot/urls.py new file mode 100644 index 0000000..9644bf8 --- /dev/null +++ b/imagebot/urls.py @@ -0,0 +1,27 @@ +""" +URL configuration for imagebot project. + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/5.1/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import include, path +from django.conf.urls.static import static + +from imagebot import settings + +urlpatterns = [ + + path("", include("idescriptor.urls")), + path('admin/', admin.site.urls), +] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \ No newline at end of file diff --git a/imagebot/wsgi.py b/imagebot/wsgi.py new file mode 100644 index 0000000..b4fb1af --- /dev/null +++ b/imagebot/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for imagebot project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/5.1/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'imagebot.settings') + +application = get_wsgi_application() diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..022a49b --- /dev/null +++ b/poetry.lock @@ -0,0 +1,565 @@ +# This file is automatically @generated by Poetry 1.8.3 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 = "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 = "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 = "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 = "coverage" +version = "7.6.4" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "coverage-7.6.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f8ae553cba74085db385d489c7a792ad66f7f9ba2ee85bfa508aeb84cf0ba07"}, + {file = "coverage-7.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8165b796df0bd42e10527a3f493c592ba494f16ef3c8b531288e3d0d72c1f6f0"}, + {file = "coverage-7.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c8b95bf47db6d19096a5e052ffca0a05f335bc63cef281a6e8fe864d450a72"}, + {file = "coverage-7.6.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ed9281d1b52628e81393f5eaee24a45cbd64965f41857559c2b7ff19385df51"}, + {file = "coverage-7.6.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0809082ee480bb8f7416507538243c8863ac74fd8a5d2485c46f0f7499f2b491"}, + {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d541423cdd416b78626b55f123412fcf979d22a2c39fce251b350de38c15c15b"}, + {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:58809e238a8a12a625c70450b48e8767cff9eb67c62e6154a642b21ddf79baea"}, + {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c9b8e184898ed014884ca84c70562b4a82cbc63b044d366fedc68bc2b2f3394a"}, + {file = "coverage-7.6.4-cp310-cp310-win32.whl", hash = "sha256:6bd818b7ea14bc6e1f06e241e8234508b21edf1b242d49831831a9450e2f35fa"}, + {file = "coverage-7.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:06babbb8f4e74b063dbaeb74ad68dfce9186c595a15f11f5d5683f748fa1d172"}, + {file = "coverage-7.6.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:73d2b73584446e66ee633eaad1a56aad577c077f46c35ca3283cd687b7715b0b"}, + {file = "coverage-7.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51b44306032045b383a7a8a2c13878de375117946d68dcb54308111f39775a25"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3fb02fe73bed561fa12d279a417b432e5b50fe03e8d663d61b3d5990f29546"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed8fe9189d2beb6edc14d3ad19800626e1d9f2d975e436f84e19efb7fa19469b"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b369ead6527d025a0fe7bd3864e46dbee3aa8f652d48df6174f8d0bac9e26e0e"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ade3ca1e5f0ff46b678b66201f7ff477e8fa11fb537f3b55c3f0568fbfe6e718"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:27fb4a050aaf18772db513091c9c13f6cb94ed40eacdef8dad8411d92d9992db"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f704f0998911abf728a7783799444fcbbe8261c4a6c166f667937ae6a8aa522"}, + {file = "coverage-7.6.4-cp311-cp311-win32.whl", hash = "sha256:29155cd511ee058e260db648b6182c419422a0d2e9a4fa44501898cf918866cf"}, + {file = "coverage-7.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:8902dd6a30173d4ef09954bfcb24b5d7b5190cf14a43170e386979651e09ba19"}, + {file = "coverage-7.6.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2"}, + {file = "coverage-7.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5"}, + {file = "coverage-7.6.4-cp312-cp312-win32.whl", hash = "sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17"}, + {file = "coverage-7.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08"}, + {file = "coverage-7.6.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9"}, + {file = "coverage-7.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a"}, + {file = "coverage-7.6.4-cp313-cp313-win32.whl", hash = "sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e"}, + {file = "coverage-7.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963"}, + {file = "coverage-7.6.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f"}, + {file = "coverage-7.6.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef"}, + {file = "coverage-7.6.4-cp313-cp313t-win32.whl", hash = "sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e"}, + {file = "coverage-7.6.4-cp313-cp313t-win_amd64.whl", hash = "sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1"}, + {file = "coverage-7.6.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9cb7fa111d21a6b55cbf633039f7bc2749e74932e3aa7cb7333f675a58a58bf3"}, + {file = "coverage-7.6.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:11a223a14e91a4693d2d0755c7a043db43d96a7450b4f356d506c2562c48642c"}, + {file = "coverage-7.6.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a413a096c4cbac202433c850ee43fa326d2e871b24554da8327b01632673a076"}, + {file = "coverage-7.6.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00a1d69c112ff5149cabe60d2e2ee948752c975d95f1e1096742e6077affd376"}, + {file = "coverage-7.6.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f76846299ba5c54d12c91d776d9605ae33f8ae2b9d1d3c3703cf2db1a67f2c0"}, + {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fe439416eb6380de434886b00c859304338f8b19f6f54811984f3420a2e03858"}, + {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0294ca37f1ba500667b1aef631e48d875ced93ad5e06fa665a3295bdd1d95111"}, + {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6f01ba56b1c0e9d149f9ac85a2f999724895229eb36bd997b61e62999e9b0901"}, + {file = "coverage-7.6.4-cp39-cp39-win32.whl", hash = "sha256:bc66f0bf1d7730a17430a50163bb264ba9ded56739112368ba985ddaa9c3bd09"}, + {file = "coverage-7.6.4-cp39-cp39-win_amd64.whl", hash = "sha256:c481b47f6b5845064c65a7bc78bc0860e635a9b055af0df46fdf1c58cebf8e8f"}, + {file = "coverage-7.6.4-pp39.pp310-none-any.whl", hash = "sha256:3c65d37f3a9ebb703e710befdc489a38683a5b152242664b973a7b7b22348a4e"}, + {file = "coverage-7.6.4.tar.gz", hash = "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73"}, +] + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "crispy-bootstrap4" +version = "2024.10" +description = "Bootstrap4 template pack for django-crispy-forms" +optional = false +python-versions = ">=3.8" +files = [ + {file = "crispy-bootstrap4-2024.10.tar.gz", hash = "sha256:503e8922b0f3b5262a6fdf303a3a94eb2a07514812f1ca130b88f7c02dd25e2b"}, + {file = "crispy_bootstrap4-2024.10-py3-none-any.whl", hash = "sha256:138a97884044ae4c4799c80595b36c42066e4e933431e2e971611e251c84f96c"}, +] + +[package.dependencies] +django = ">=4.2" +django-crispy-forms = ">=2.3" + +[[package]] +name = "django" +version = "5.1.2" +description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." +optional = false +python-versions = ">=3.10" +files = [ + {file = "Django-5.1.2-py3-none-any.whl", hash = "sha256:f11aa87ad8d5617171e3f77e1d5d16f004b79a2cf5d2e1d2b97a6a1f8e9ba5ed"}, + {file = "Django-5.1.2.tar.gz", hash = "sha256:bd7376f90c99f96b643722eee676498706c9fd7dc759f55ebfaf2c08ebcdf4f0"}, +] + +[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-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 = "fontawesomefree" +version = "6.6.0" +description = "Font Awesome Free" +optional = false +python-versions = "*" +files = [ + {file = "fontawesomefree-6.6.0-py3-none-any.whl", hash = "sha256:599b574431c9bd92ed5fc054d1045a07c42335da36c17884f2b934755eef9089"}, +] + +[[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 = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "packaging" +version = "24.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, +] + +[[package]] +name = "pillow" +version = "11.0.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pillow-11.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:6619654954dc4936fcff82db8eb6401d3159ec6be81e33c6000dfd76ae189947"}, + {file = "pillow-11.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b3c5ac4bed7519088103d9450a1107f76308ecf91d6dabc8a33a2fcfb18d0fba"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a65149d8ada1055029fcb665452b2814fe7d7082fcb0c5bed6db851cb69b2086"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88a58d8ac0cc0e7f3a014509f0455248a76629ca9b604eca7dc5927cc593c5e9"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:c26845094b1af3c91852745ae78e3ea47abf3dbcd1cf962f16b9a5fbe3ee8488"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:1a61b54f87ab5786b8479f81c4b11f4d61702830354520837f8cc791ebba0f5f"}, + {file = "pillow-11.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:674629ff60030d144b7bca2b8330225a9b11c482ed408813924619c6f302fdbb"}, + {file = "pillow-11.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:598b4e238f13276e0008299bd2482003f48158e2b11826862b1eb2ad7c768b97"}, + {file = "pillow-11.0.0-cp310-cp310-win32.whl", hash = "sha256:9a0f748eaa434a41fccf8e1ee7a3eed68af1b690e75328fd7a60af123c193b50"}, + {file = "pillow-11.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:a5629742881bcbc1f42e840af185fd4d83a5edeb96475a575f4da50d6ede337c"}, + {file = "pillow-11.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:ee217c198f2e41f184f3869f3e485557296d505b5195c513b2bfe0062dc537f1"}, + {file = "pillow-11.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1c1d72714f429a521d8d2d018badc42414c3077eb187a59579f28e4270b4b0fc"}, + {file = "pillow-11.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:499c3a1b0d6fc8213519e193796eb1a86a1be4b1877d678b30f83fd979811d1a"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8b2351c85d855293a299038e1f89db92a2f35e8d2f783489c6f0b2b5f3fe8a3"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f4dba50cfa56f910241eb7f883c20f1e7b1d8f7d91c750cd0b318bad443f4d5"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:5ddbfd761ee00c12ee1be86c9c0683ecf5bb14c9772ddbd782085779a63dd55b"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:45c566eb10b8967d71bf1ab8e4a525e5a93519e29ea071459ce517f6b903d7fa"}, + {file = "pillow-11.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b4fd7bd29610a83a8c9b564d457cf5bd92b4e11e79a4ee4716a63c959699b306"}, + {file = "pillow-11.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cb929ca942d0ec4fac404cbf520ee6cac37bf35be479b970c4ffadf2b6a1cad9"}, + {file = "pillow-11.0.0-cp311-cp311-win32.whl", hash = "sha256:006bcdd307cc47ba43e924099a038cbf9591062e6c50e570819743f5607404f5"}, + {file = "pillow-11.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:52a2d8323a465f84faaba5236567d212c3668f2ab53e1c74c15583cf507a0291"}, + {file = "pillow-11.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:16095692a253047fe3ec028e951fa4221a1f3ed3d80c397e83541a3037ff67c9"}, + {file = "pillow-11.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2c0a187a92a1cb5ef2c8ed5412dd8d4334272617f532d4ad4de31e0495bd923"}, + {file = "pillow-11.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:084a07ef0821cfe4858fe86652fffac8e187b6ae677e9906e192aafcc1b69903"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8069c5179902dcdce0be9bfc8235347fdbac249d23bd90514b7a47a72d9fecf4"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f02541ef64077f22bf4924f225c0fd1248c168f86e4b7abdedd87d6ebaceab0f"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:fcb4621042ac4b7865c179bb972ed0da0218a076dc1820ffc48b1d74c1e37fe9"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:00177a63030d612148e659b55ba99527803288cea7c75fb05766ab7981a8c1b7"}, + {file = "pillow-11.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8853a3bf12afddfdf15f57c4b02d7ded92c7a75a5d7331d19f4f9572a89c17e6"}, + {file = "pillow-11.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3107c66e43bda25359d5ef446f59c497de2b5ed4c7fdba0894f8d6cf3822dafc"}, + {file = "pillow-11.0.0-cp312-cp312-win32.whl", hash = "sha256:86510e3f5eca0ab87429dd77fafc04693195eec7fd6a137c389c3eeb4cfb77c6"}, + {file = "pillow-11.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:8ec4a89295cd6cd4d1058a5e6aec6bf51e0eaaf9714774e1bfac7cfc9051db47"}, + {file = "pillow-11.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:27a7860107500d813fcd203b4ea19b04babe79448268403172782754870dac25"}, + {file = "pillow-11.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcd1fb5bb7b07f64c15618c89efcc2cfa3e95f0e3bcdbaf4642509de1942a699"}, + {file = "pillow-11.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e038b0745997c7dcaae350d35859c9715c71e92ffb7e0f4a8e8a16732150f38"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ae08bd8ffc41aebf578c2af2f9d8749d91f448b3bfd41d7d9ff573d74f2a6b2"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d69bfd8ec3219ae71bcde1f942b728903cad25fafe3100ba2258b973bd2bc1b2"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:61b887f9ddba63ddf62fd02a3ba7add935d053b6dd7d58998c630e6dbade8527"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:c6a660307ca9d4867caa8d9ca2c2658ab685de83792d1876274991adec7b93fa"}, + {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:73e3a0200cdda995c7e43dd47436c1548f87a30bb27fb871f352a22ab8dcf45f"}, + {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fba162b8872d30fea8c52b258a542c5dfd7b235fb5cb352240c8d63b414013eb"}, + {file = "pillow-11.0.0-cp313-cp313-win32.whl", hash = "sha256:f1b82c27e89fffc6da125d5eb0ca6e68017faf5efc078128cfaa42cf5cb38798"}, + {file = "pillow-11.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ba470552b48e5835f1d23ecb936bb7f71d206f9dfeee64245f30c3270b994de"}, + {file = "pillow-11.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:846e193e103b41e984ac921b335df59195356ce3f71dcfd155aa79c603873b84"}, + {file = "pillow-11.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4ad70c4214f67d7466bea6a08061eba35c01b1b89eaa098040a35272a8efb22b"}, + {file = "pillow-11.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6ec0d5af64f2e3d64a165f490d96368bb5dea8b8f9ad04487f9ab60dc4bb6003"}, + {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c809a70e43c7977c4a42aefd62f0131823ebf7dd73556fa5d5950f5b354087e2"}, + {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:4b60c9520f7207aaf2e1d94de026682fc227806c6e1f55bba7606d1c94dd623a"}, + {file = "pillow-11.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1e2688958a840c822279fda0086fec1fdab2f95bf2b717b66871c4ad9859d7e8"}, + {file = "pillow-11.0.0-cp313-cp313t-win32.whl", hash = "sha256:607bbe123c74e272e381a8d1957083a9463401f7bd01287f50521ecb05a313f8"}, + {file = "pillow-11.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5c39ed17edea3bc69c743a8dd3e9853b7509625c2462532e62baa0732163a904"}, + {file = "pillow-11.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:75acbbeb05b86bc53cbe7b7e6fe00fbcf82ad7c684b3ad82e3d711da9ba287d3"}, + {file = "pillow-11.0.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2e46773dc9f35a1dd28bd6981332fd7f27bec001a918a72a79b4133cf5291dba"}, + {file = "pillow-11.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2679d2258b7f1192b378e2893a8a0a0ca472234d4c2c0e6bdd3380e8dfa21b6a"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eda2616eb2313cbb3eebbe51f19362eb434b18e3bb599466a1ffa76a033fb916"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ec184af98a121fb2da42642dea8a29ec80fc3efbaefb86d8fdd2606619045d"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:8594f42df584e5b4bb9281799698403f7af489fba84c34d53d1c4bfb71b7c4e7"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:c12b5ae868897c7338519c03049a806af85b9b8c237b7d675b8c5e089e4a618e"}, + {file = "pillow-11.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:70fbbdacd1d271b77b7721fe3cdd2d537bbbd75d29e6300c672ec6bb38d9672f"}, + {file = "pillow-11.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5178952973e588b3f1360868847334e9e3bf49d19e169bbbdfaf8398002419ae"}, + {file = "pillow-11.0.0-cp39-cp39-win32.whl", hash = "sha256:8c676b587da5673d3c75bd67dd2a8cdfeb282ca38a30f37950511766b26858c4"}, + {file = "pillow-11.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:94f3e1780abb45062287b4614a5bc0874519c86a777d4a7ad34978e86428b8dd"}, + {file = "pillow-11.0.0-cp39-cp39-win_arm64.whl", hash = "sha256:290f2cc809f9da7d6d622550bbf4c1e57518212da51b6a30fe8e0a270a5b78bd"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1187739620f2b365de756ce086fdb3604573337cc28a0d3ac4a01ab6b2d2a6d2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fbbcb7b57dc9c794843e3d1258c0fbf0f48656d46ffe9e09b63bbd6e8cd5d0a2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d203af30149ae339ad1b4f710d9844ed8796e97fda23ffbc4cc472968a47d0b"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21a0d3b115009ebb8ac3d2ebec5c2982cc693da935f4ab7bb5c8ebe2f47d36f2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:73853108f56df97baf2bb8b522f3578221e56f646ba345a372c78326710d3830"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e58876c91f97b0952eb766123bfef372792ab3f4e3e1f1a2267834c2ab131734"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:224aaa38177597bb179f3ec87eeefcce8e4f85e608025e9cfac60de237ba6316"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5bd2d3bdb846d757055910f0a59792d33b555800813c3b39ada1829c372ccb06"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:375b8dd15a1f5d2feafff536d47e22f69625c1aa92f12b339ec0b2ca40263273"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:daffdf51ee5db69a82dd127eabecce20729e21f7a3680cf7cbb23f0829189790"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7326a1787e3c7b0429659e0a944725e1b03eeaa10edd945a86dead1913383944"}, + {file = "pillow-11.0.0.tar.gz", hash = "sha256:72bacbaf24ac003fea9bff9837d1eedb6088758d41e100c1552930151f677739"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=8.1)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] + +[[package]] +name = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pytest" +version = "7.4.4" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, + {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-cov" +version = "4.1.0" +description = "Pytest plugin for measuring coverage." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, + {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, +] + +[package.dependencies] +coverage = {version = ">=5.2.1", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] + +[[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-mock" +version = "1.12.1" +description = "Mock out responses from the requests package" +optional = false +python-versions = ">=3.5" +files = [ + {file = "requests-mock-1.12.1.tar.gz", hash = "sha256:e9e12e333b525156e82a3c852f22016b9158220d2f47454de9cae8a77d371401"}, + {file = "requests_mock-1.12.1-py2.py3-none-any.whl", hash = "sha256:b1e37054004cdd5e56c84454cc7df12b25f90f382159087f4b6915aaeef39563"}, +] + +[package.dependencies] +requests = ">=2.22,<3" + +[package.extras] +fixture = ["fixtures"] + +[[package]] +name = "sqlparse" +version = "0.5.1" +description = "A non-validating SQL parser." +optional = false +python-versions = ">=3.8" +files = [ + {file = "sqlparse-0.5.1-py3-none-any.whl", hash = "sha256:773dcbf9a5ab44a090f3441e2180efe2560220203dc2f8c0b0fa141e18b505e4"}, + {file = "sqlparse-0.5.1.tar.gz", hash = "sha256:bb6b4df465655ef332548e24f08e205afc81b9ab86cb1c45657a7ff173a3a00e"}, +] + +[package.extras] +dev = ["build", "hatch"] +doc = ["sphinx"] + +[[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)"] + +[[package]] +name = "validators" +version = "0.34.0" +description = "Python Data Validation for Humans™" +optional = false +python-versions = ">=3.8" +files = [ + {file = "validators-0.34.0-py3-none-any.whl", hash = "sha256:c804b476e3e6d3786fa07a30073a4ef694e617805eb1946ceee3fe5a9b8b1321"}, + {file = "validators-0.34.0.tar.gz", hash = "sha256:647fe407b45af9a74d245b943b18e6a816acf4926974278f6dd617778e1e781f"}, +] + +[package.extras] +crypto-eth-addresses = ["eth-hash[pycryptodome] (>=0.7.0)"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.12" +content-hash = "91c6ee8bc3f0bbb4947730e3310b4ae20c31c013470aeeaf0e49d74e81f26fc6" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..b7085f6 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,34 @@ +[tool.poetry] +name = "image-bot-django" +version = "0.1.0" +description = "A small bot to post a picture in the fediverse" +authors = ["Julian-Samuel Gebühr "] +maintainers = ["Julian-Samuel Gebühr "] +readme = "README.md" +packages = [{include = "imagebot"}] +license = "MIT" +keywords = ["fediverse", "mastodon", "gotosocial", "bot"] + + +[tool.poetry.dependencies] +python = "^3.12" +requests = "*" +validators = "*" +Django = "*" +fontawesomefree = "*" +Pillow = "*" +django-crispy-forms = "*" +crispy-bootstrap4 = "*" + +[tool.poetry.scripts] +ibot = 'imagebot.manage:main' + + +[tool.poetry.group.test.dependencies] +pytest = "^7.4.0" +pytest-cov = "^4.1.0" +requests-mock = "^1.11.0" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api"