From 9e5b6007bab5784efd335aabb98e32b4f63e0eab Mon Sep 17 00:00:00 2001 From: rafsaf Date: Mon, 3 Feb 2025 19:32:14 +0100 Subject: [PATCH 1/6] bump, fix lint and small update of default throtle rates Signed-off-by: rafsaf --- .pre-commit-config.yaml | 6 +- base/forms.py | 38 ++-- base/management/commands/fetchnewworlds.py | 6 +- base/models/outline.py | 22 +- base/models/payment.py | 2 +- base/models/period_model.py | 4 +- base/models/profile.py | 2 +- base/models/target_vertex.py | 8 +- base/tests/test_forms/test_outline_form.py | 6 +- base/views/outline_create.py | 20 +- poetry.lock | 232 ++++++++++++++++----- rest_api/serializers.py | 2 +- tribal_wars_planer/settings.py | 5 +- utils/avaiable_troops.py | 3 +- utils/buildings.py | 2 +- 15 files changed, 240 insertions(+), 118 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4b90edbb..95216720 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,12 +5,12 @@ repos: - id: check-yaml - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.9.3 + rev: v0.9.4 hooks: - id: ruff-format - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.9.3 + rev: v0.9.4 hooks: - id: ruff args: [--fix] @@ -24,6 +24,6 @@ repos: - https://github.com/rafsaf/Tribal-Wars-Planer - repo: https://github.com/rtts/djhtml - rev: "3.0.6" + rev: "3.0.7" hooks: - id: djhtml diff --git a/base/forms.py b/base/forms.py index 8aa677fe..9592fa94 100644 --- a/base/forms.py +++ b/base/forms.py @@ -114,14 +114,12 @@ def clean_off_troops(self): ).first() if not village: self.second_error_message = gettext_lazy( - gettext_lazy( - "[coord: %(coord)s] - [world: %(world)s]: no such village" - ) - % { - "coord": error.coord, - "world": self.outline.world.game_name(), - } - ) + "[coord: %(coord)s] - [world: %(world)s]: no such village" + ) % { + "coord": error.coord, + "world": self.outline.world.game_name(), + } + else: self.second_error_message = gettext_lazy( "[coord: %(coord)s] - " @@ -142,8 +140,9 @@ def clean_off_troops(self): if army.coord in already_used_villages: if not self.first_error_message: self.first_error_message = gettext_lazy( - "Village in this line is duplicated: %s" % army.coord # noqa: UP031 - ) + "Village in this line is duplicated: %(coord)s" + ) % {army.coord} + self.add_error("off_troops", str(i)) continue else: @@ -205,14 +204,12 @@ def clean_deff_troops(self): ).first() if not village: self.second_error_message = gettext_lazy( - gettext_lazy( - "[coord: %(coord)s] - [world: %(world)s]: no such village" - ) - % { - "coord": error.coord, - "world": self.outline.world.game_name(), - } - ) + "[coord: %(coord)s] - [world: %(world)s]: no such village" + ) % { + "coord": error.coord, + "world": self.outline.world.game_name(), + } + else: self.second_error_message = gettext_lazy( "[coord: %(coord)s] - " @@ -237,8 +234,9 @@ def clean_deff_troops(self): if already_used_villages[army.coord] > 2: if not self.first_error_message: self.first_error_message = gettext_lazy( - "Village in this line is duplicated: %s" % army.coord # noqa: UP031 - ) + "Village in this line is duplicated: %(coord)s" + ) % {"coord": army.coord} + self.add_error("deff_troops", i) # type: ignore else: already_used_villages[army.coord] = 1 diff --git a/base/management/commands/fetchnewworlds.py b/base/management/commands/fetchnewworlds.py index 83699875..5b2f0a3b 100644 --- a/base/management/commands/fetchnewworlds.py +++ b/base/management/commands/fetchnewworlds.py @@ -48,14 +48,14 @@ def get_lst_of_available_worlds(tw_server: Server) -> dict[str, str]: ) soup = BeautifulSoup(res.text, features="html.parser") worlds_div = soup.find_all("div", attrs={"class": "content-selector"})[1] - for world_li in worlds_div.ul.find_all("li"): - world_url: str = world_li.a["href"] + for world_li in worlds_div.ul.find_all("li"): # type: ignore + world_url: str = world_li.a["href"] # type: ignore world_postfix = ( world_url.removeprefix("https://") .split(".")[0] .removeprefix(tw_server.prefix) ) - worlds[world_postfix] = world_li.a.text.strip() + worlds[world_postfix] = world_li.a.text.strip() # type: ignore return worlds diff --git a/base/models/outline.py b/base/models/outline.py index fa291ddc..8c8fff51 100644 --- a/base/models/outline.py +++ b/base/models/outline.py @@ -68,38 +68,38 @@ class Outline(models.Model): ("inactive", "Inactive"), ] - MODE_OFF: list[tuple[str, str]] = [ + MODE_OFF = [ ("closest", gettext_lazy("Closest Front")), ("close", gettext_lazy("Close Back")), ("random", gettext_lazy("Random Back")), ("far", gettext_lazy("Far Back")), ] - MODE_NOBLE: list[tuple[str, str]] = [ + MODE_NOBLE = [ ("closest", gettext_lazy("Closest Front")), ("close", gettext_lazy("Close Back")), ("random", gettext_lazy("Random Back")), ("far", gettext_lazy("Far Back")), ] - MODE_DIVISION: list[tuple[str, str]] = [ + MODE_DIVISION = [ ("divide", gettext_lazy("Divide off with nobles")), ("not_divide", gettext_lazy("Dont't divide off")), ("separatly", gettext_lazy("Off and nobles separatly")), ] - MODE_SPLIT: list[tuple[str, str]] = [ + MODE_SPLIT = [ ("together", gettext_lazy("Nobles from one village as one command")), ("split", gettext_lazy("Nobles from one village as many commands")), ] - NOBLE_GUIDELINES: list[tuple[str, str]] = [ + NOBLE_GUIDELINES = [ ("one", gettext_lazy("Try send all nobles to one target")), ("many", gettext_lazy("Nobles to one or many targets")), ("single", gettext_lazy("Try single nobles from many villages")), ] - HIDE_CHOICES: list[tuple[str, str]] = [ + HIDE_CHOICES = [ ("all", gettext_lazy("All")), ("front", gettext_lazy("Front")), ("back", gettext_lazy("Back (Rear)")), @@ -109,7 +109,7 @@ class Outline(models.Model): BUILDINGS = BUILDINGS_TRANSLATION.items() - RUINED_VILLAGES_POINTS: list[tuple[str, str]] = [ + RUINED_VILLAGES_POINTS = [ ("big", gettext_lazy("Average greater than 8k")), ("medium", gettext_lazy("Average 5-8k")), ] @@ -123,12 +123,12 @@ class Outline(models.Model): (200, "200"), ] - FAKE_MIN_OFF_CHOICES: list[tuple[str, str]] = [ + FAKE_MIN_OFF_CHOICES = [ ("off", gettext_lazy("Fakes only from off villages")), ("all", gettext_lazy("Fakes from all villages")), ] - SENDING_OPTIONS: list[tuple[str, str]] = [ + SENDING_OPTIONS = [ ( "default", gettext_lazy("(Default) Auto generated, fully equipped safe links"), @@ -141,7 +141,7 @@ class Outline(models.Model): ARMY_COLLECTION = "Army collection" DEFF_COLLECTION = "Deff collection" - INPUT_DATA_TYPES: list[tuple[str, str]] = [ + INPUT_DATA_TYPES = [ (ARMY_COLLECTION, gettext_lazy("Army collection")), (DEFF_COLLECTION, gettext_lazy("Deff collection ")), ] @@ -441,7 +441,7 @@ def remove_user_outline(self): ) def expires_in(self) -> str: - base: str = gettext_lazy("Expires ") + base = gettext_lazy("Expires ") postfix: str = "" minus_35_days = timezone.now() - datetime.timedelta(days=35) diff --git a/base/models/payment.py b/base/models/payment.py index e26010ac..a4d4bfb4 100644 --- a/base/models/payment.py +++ b/base/models/payment.py @@ -29,7 +29,7 @@ def promotion_event_id() -> str: class Payment(models.Model): """Represents real payment, only superuser access""" - STATUS: list[tuple[str, str]] = [ + STATUS = [ ("finished", gettext_lazy("Finished")), ("returned", gettext_lazy("Returned")), ] diff --git a/base/models/period_model.py b/base/models/period_model.py index 1f3c48c1..552dc35b 100644 --- a/base/models/period_model.py +++ b/base/models/period_model.py @@ -25,12 +25,12 @@ class PeriodModel(models.Model): """Handle one period of time in outline specification""" - STATUS: list[tuple[str, str]] = [ + STATUS = [ ("all", gettext_lazy("All (left)")), ("random", gettext_lazy("Random")), ("exact", gettext_lazy("Exact")), ] - UNITS: list[tuple[str, str]] = [ + UNITS = [ ("noble", gettext_lazy("Noble")), ("ram", gettext_lazy("Ram")), ] diff --git a/base/models/profile.py b/base/models/profile.py index d23bd1f9..c9790a23 100644 --- a/base/models/profile.py +++ b/base/models/profile.py @@ -31,7 +31,7 @@ class Profile(models.Model): - INPUT_DATA_TYPES: list[tuple[str, str]] = [ + INPUT_DATA_TYPES = [ ("Army collection", gettext_lazy("Army collection")), ("Deff collection", gettext_lazy("Deff collection ")), ] diff --git a/base/models/target_vertex.py b/base/models/target_vertex.py index c8660de8..97d3fb5e 100644 --- a/base/models/target_vertex.py +++ b/base/models/target_vertex.py @@ -29,27 +29,27 @@ class TargetVertex(models.Model): """Target Village""" - MODE_OFF: list[tuple[str, str]] = [ + MODE_OFF = [ ("closest", gettext_lazy("Closest Front")), ("close", gettext_lazy("Close Back")), ("random", gettext_lazy("Random Back")), ("far", gettext_lazy("Far Back")), ] - MODE_NOBLE: list[tuple[str, str]] = [ + MODE_NOBLE = [ ("closest", gettext_lazy("Closest Front")), ("close", gettext_lazy("Close Back")), ("random", gettext_lazy("Random Back")), ("far", gettext_lazy("Far Back")), ] - MODE_DIVISION: list[tuple[str, str]] = [ + MODE_DIVISION = [ ("divide", gettext_lazy("Divide off with nobles")), ("not_divide", gettext_lazy("Dont't divide off")), ("separatly", gettext_lazy("Off and nobles separatly")), ] - NOBLE_GUIDELINES: list[tuple[str, str]] = [ + NOBLE_GUIDELINES = [ ("one", gettext_lazy("Try send all nobles to one target")), ("many", gettext_lazy("Nobles to one or many targets")), ("single", gettext_lazy("Try single nobles from many villages")), diff --git a/base/tests/test_forms/test_outline_form.py b/base/tests/test_forms/test_outline_form.py index 69f05183..7431af77 100644 --- a/base/tests/test_forms/test_outline_form.py +++ b/base/tests/test_forms/test_outline_form.py @@ -30,7 +30,7 @@ def test_form_pass_when_correct_data(self): "world": f"{world.pk}", }, ) - form.fields["world"].choices = [(f"{world.pk}", world.game_name())] + form.fields["world"].choices = [(f"{world.pk}", world.game_name())] # type: ignore assert form.is_valid() def test_form_not_pass_when_incorrect_date(self): @@ -44,7 +44,7 @@ def test_form_not_pass_when_incorrect_date(self): "world": f"{world.pk}", }, ) - form.fields["world"].choices = [(f"{world.pk}", world.game_name())] + form.fields["world"].choices = [(f"{world.pk}", world.game_name())] # type: ignore assert not form.is_valid() form2: OutlineForm = OutlineForm( @@ -54,5 +54,5 @@ def test_form_not_pass_when_incorrect_date(self): "world": f"{world.pk}", }, ) - form2.fields["world"].choices = [(f"{world.pk}", world.game_name())] + form2.fields["world"].choices = [(f"{world.pk}", world.game_name())] # type: ignore assert not form2.is_valid() diff --git a/base/views/outline_create.py b/base/views/outline_create.py index 7cf563bc..ef80cdd9 100644 --- a/base/views/outline_create.py +++ b/base/views/outline_create.py @@ -30,7 +30,7 @@ def new_outline_create(request: HttpRequest) -> HttpResponse: form1 = forms.OutlineForm(None) form2 = forms.ChangeServerForm(None) - form1.fields["world"].choices = [ + form1.fields["world"].choices = [ # type: ignore (f"{world.pk}", f"{world.game_name()}") for world in models.World.objects.filter( server=profile.server, pending_delete=False @@ -39,7 +39,7 @@ def new_outline_create(request: HttpRequest) -> HttpResponse: if request.method == "POST": if "form1" in request.POST: form1 = forms.OutlineForm(request.POST) - form1.fields["world"].choices = [ + form1.fields["world"].choices = [ # type: ignore (f"{world.pk}", world.game_name()) for world in models.World.objects.filter( server=profile.server, pending_delete=False @@ -139,9 +139,9 @@ def new_outline_create_select( # noqa: PLR0912 if request.method == "POST": if "tribe1" in request.POST: form1 = forms.MyTribeTagForm(request.POST) - form1.fields["tribe1"].choices = choices + form1.fields["tribe1"].choices = choices # type: ignore form2 = forms.EnemyTribeTagForm() - form2.fields["tribe2"].choices = choices + form2.fields["tribe2"].choices = choices # type: ignore if form1.is_valid(): tribe = request.POST["tribe1"] @@ -150,9 +150,9 @@ def new_outline_create_select( # noqa: PLR0912 return redirect("base:planer_create_select", _id) elif "tribe2" in request.POST: form1 = forms.MyTribeTagForm() - form1.fields["tribe1"].choices = choices + form1.fields["tribe1"].choices = choices # type: ignore form2 = forms.EnemyTribeTagForm(request.POST) - form2.fields["tribe2"].choices = choices + form2.fields["tribe2"].choices = choices # type: ignore if form2.is_valid(): tribe = request.POST["tribe2"] @@ -161,15 +161,15 @@ def new_outline_create_select( # noqa: PLR0912 return redirect("base:planer_create_select", _id) else: form1 = forms.MyTribeTagForm() - form1.fields["tribe1"].choices = choices + form1.fields["tribe1"].choices = choices # type: ignore form2 = forms.EnemyTribeTagForm() - form2.fields["tribe2"].choices = choices + form2.fields["tribe2"].choices = choices # type: ignore else: form1 = forms.MyTribeTagForm() - form1.fields["tribe1"].choices = choices + form1.fields["tribe1"].choices = choices # type: ignore form2 = forms.EnemyTribeTagForm() - form2.fields["tribe2"].choices = choices + form2.fields["tribe2"].choices = choices # type: ignore context = { "instance": instance, diff --git a/poetry.lock b/poetry.lock index 958da74c..a5f3cd65 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.0.1 and should not be changed by hand. [[package]] name = "asgiref" @@ -6,6 +6,7 @@ version = "3.8.1" description = "ASGI specs, helper code, and adapters" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47"}, {file = "asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590"}, @@ -20,6 +21,7 @@ version = "25.1.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a"}, {file = "attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e"}, @@ -35,31 +37,34 @@ tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] [[package]] name = "babel" -version = "2.16.0" +version = "2.17.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" +groups = ["docs"] files = [ - {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, - {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, + {file = "babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2"}, + {file = "babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d"}, ] [package.extras] -dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] +dev = ["backports.zoneinfo", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata"] [[package]] name = "beautifulsoup4" -version = "4.12.3" +version = "4.13.1" description = "Screen-scraping library" optional = false -python-versions = ">=3.6.0" +python-versions = ">=3.7.0" +groups = ["main"] files = [ - {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, - {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, + {file = "beautifulsoup4-4.13.1-py3-none-any.whl", hash = "sha256:72465267014897bb10ca749bb632bde6c2d20f3254afd5458544bd74e6c2e6d8"}, + {file = "beautifulsoup4-4.13.1.tar.gz", hash = "sha256:741c8b6903a1e4ae8ba32b9c9ae7510dab7a197fdbadcf9fcdeb0891ef5ec66a"}, ] [package.dependencies] soupsieve = ">1.2" +typing-extensions = ">=4.0.0" [package.extras] cchardet = ["cchardet"] @@ -70,17 +75,18 @@ lxml = ["lxml"] [[package]] name = "boto3" -version = "1.36.7" +version = "1.36.11" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "boto3-1.36.7-py3-none-any.whl", hash = "sha256:ab501f75557863e2d2c9fa731e4fe25c45f35e0d92ea0ee11a4eaa63929d3ede"}, - {file = "boto3-1.36.7.tar.gz", hash = "sha256:ae98634efa7b47ced1b0d7342e2940b32639eee913f33ab406590b8ed55ee94b"}, + {file = "boto3-1.36.11-py3-none-any.whl", hash = "sha256:641dd772eac111d9443258f0f5491c57c2af47bddae94a8d32de19edb5bf7b1c"}, + {file = "boto3-1.36.11.tar.gz", hash = "sha256:b40fbf2c0f22e55b67df95475a68bb72be5169097180a875726b6b884339ac8b"}, ] [package.dependencies] -botocore = ">=1.36.7,<1.37.0" +botocore = ">=1.36.11,<1.37.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.11.0,<0.12.0" @@ -89,13 +95,14 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.36.7" +version = "1.36.11" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "botocore-1.36.7-py3-none-any.whl", hash = "sha256:a6c6772d777af2957ac9975207fac1ccc4ce101408b85e9b5e3c5ba0bb949102"}, - {file = "botocore-1.36.7.tar.gz", hash = "sha256:9abc64bde5e7d8f814ea91d6fc0a8142511fc96427c19fe9209677c20a0c9e6e"}, + {file = "botocore-1.36.11-py3-none-any.whl", hash = "sha256:82c5660027f696608d0e55feb08c146c11c7ebeba7615961c7765dcf6009a00d"}, + {file = "botocore-1.36.11.tar.gz", hash = "sha256:c919be883f95b9e0c3021429a365d40cd7944b8345a07af30dc8d891ceefe07a"}, ] [package.dependencies] @@ -104,7 +111,7 @@ python-dateutil = ">=2.1,<3.0.0" urllib3 = {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""} [package.extras] -crt = ["awscrt (==0.23.4)"] +crt = ["awscrt (==0.23.8)"] [[package]] name = "cairocffi" @@ -112,6 +119,7 @@ version = "1.7.1" description = "cffi-based cairo bindings for Python" optional = false python-versions = ">=3.8" +groups = ["docs"] files = [ {file = "cairocffi-1.7.1-py3-none-any.whl", hash = "sha256:9803a0e11f6c962f3b0ae2ec8ba6ae45e957a146a004697a1ac1bbf16b073b3f"}, {file = "cairocffi-1.7.1.tar.gz", hash = "sha256:2e48ee864884ec4a3a34bfa8c9ab9999f688286eb714a15a43ec9d068c36557b"}, @@ -131,6 +139,7 @@ version = "2.7.1" description = "A Simple SVG Converter based on Cairo" optional = false python-versions = ">=3.5" +groups = ["docs"] files = [ {file = "CairoSVG-2.7.1-py3-none-any.whl", hash = "sha256:8a5222d4e6c3f86f1f7046b63246877a63b49923a1cd202184c3a634ef546b3b"}, {file = "CairoSVG-2.7.1.tar.gz", hash = "sha256:432531d72347291b9a9ebfb6777026b607563fd8719c46ee742db0aef7271ba0"}, @@ -149,13 +158,14 @@ test = ["flake8", "isort", "pytest"] [[package]] name = "certifi" -version = "2024.12.14" +version = "2025.1.31" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" +groups = ["main", "dev", "docs"] files = [ - {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, - {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, + {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, + {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, ] [[package]] @@ -164,6 +174,7 @@ version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" +groups = ["docs"] 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"}, @@ -243,6 +254,7 @@ version = "3.4.0" description = "Validate configuration and produce human readable error messages." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, @@ -254,6 +266,7 @@ version = "3.4.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" +groups = ["main", "dev", "docs"] files = [ {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, @@ -355,6 +368,7 @@ version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" +groups = ["docs"] files = [ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, @@ -369,10 +383,12 @@ 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" +groups = ["main", "dev", "docs"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +markers = {main = "platform_system == \"Windows\"", dev = "sys_platform == \"win32\""} [[package]] name = "confusable-homoglyphs" @@ -380,6 +396,7 @@ version = "3.3.1" description = "Detect confusable usage of unicode homoglyphs, prevent homograph attacks." optional = false python-versions = "*" +groups = ["main"] files = [ {file = "confusable_homoglyphs-3.3.1-py2.py3-none-any.whl", hash = "sha256:84c92cb79dc7f55aa290d0762b2349abd8dee4c16fbe6f99eac978d394e2e6a1"}, {file = "confusable_homoglyphs-3.3.1.tar.gz", hash = "sha256:b995001c9b2e1b4cea0cf5f3840a7c79188a8cbbad053d693572bd8c1c1ec460"}, @@ -394,6 +411,7 @@ version = "7.6.10" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "coverage-7.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78"}, {file = "coverage-7.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c"}, @@ -468,6 +486,7 @@ version = "2024.10" description = "Bootstrap4 template pack for django-crispy-forms" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "crispy-bootstrap4-2024.10.tar.gz", hash = "sha256:503e8922b0f3b5262a6fdf303a3a94eb2a07514812f1ca130b88f7c02dd25e2b"}, {file = "crispy_bootstrap4-2024.10-py3-none-any.whl", hash = "sha256:138a97884044ae4c4799c80595b36c42066e4e933431e2e971611e251c84f96c"}, @@ -483,6 +502,7 @@ version = "0.7.0" description = "CSS selectors for Python ElementTree" optional = false python-versions = ">=3.7" +groups = ["docs"] files = [ {file = "cssselect2-0.7.0-py3-none-any.whl", hash = "sha256:fd23a65bfd444595913f02fc71f6b286c29261e354c41d722ca7a261a49b5969"}, {file = "cssselect2-0.7.0.tar.gz", hash = "sha256:1ccd984dab89fc68955043aca4e1b03e0cf29cad9880f6e28e3ba7a74b14aa5a"}, @@ -502,6 +522,7 @@ version = "3.0.11" description = "The Cython compiler for writing C extensions in the Python language." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +groups = ["main"] files = [ {file = "Cython-3.0.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:44292aae17524abb4b70a25111fe7dec1a0ad718711d47e3786a211d5408fdaa"}, {file = "Cython-3.0.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a75d45fbc20651c1b72e4111149fed3b33d270b0a4fb78328c54d965f28d55e1"}, @@ -577,6 +598,7 @@ version = "0.7.1" description = "XML bomb protection for Python stdlib modules" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["docs"] files = [ {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, @@ -588,6 +610,7 @@ version = "5.6.3" description = "Disk Cache -- Disk and file backed persistent cache." optional = false python-versions = ">=3" +groups = ["main"] files = [ {file = "diskcache-5.6.3-py3-none-any.whl", hash = "sha256:5e31b2d5fbad117cc363ebaf6b689474db18a1f6438bc82358b024abd4c2ca19"}, {file = "diskcache-5.6.3.tar.gz", hash = "sha256:2c3a3fa2743d8535d832ec61c2054a1641f41775aa7c556758a109941e33e4fc"}, @@ -599,6 +622,7 @@ version = "0.3.9" description = "Distribution utilities" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, @@ -610,6 +634,7 @@ version = "5.1.5" description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." optional = false python-versions = ">=3.10" +groups = ["main", "dev"] files = [ {file = "Django-5.1.5-py3-none-any.whl", hash = "sha256:c46eb936111fffe6ec4bc9930035524a8be98ec2f74d8a0ff351226a3e52f459"}, {file = "Django-5.1.5.tar.gz", hash = "sha256:19bbca786df50b9eca23cee79d495facf55c8f5c54c529d9bf1fe7b5ea086af3"}, @@ -630,6 +655,7 @@ version = "2.3" description = "Best way to have Django DRY forms" optional = false python-versions = ">=3.8" +groups = ["main"] 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"}, @@ -644,6 +670,7 @@ version = "5.0.1" description = "A configurable set of panels that display various debug information about the current request/response." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "django_debug_toolbar-5.0.1-py3-none-any.whl", hash = "sha256:7456cc2e951db37dab335686db7803c4a0ecb6736d120705f6668db9548bf49f"}, {file = "django_debug_toolbar-5.0.1.tar.gz", hash = "sha256:296f6f18a80710e84fbb8361538ae5ec522a75ebe9ab67db34bcf1026cbeb420"}, @@ -659,6 +686,7 @@ version = "2.5.1" description = "A set of high-level abstractions for Django forms" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "django-formtools-2.5.1.tar.gz", hash = "sha256:47cb34552c6efca088863d693284d04fc36eaaf350eb21e1a1d935e0df523c93"}, {file = "django_formtools-2.5.1-py3-none-any.whl", hash = "sha256:bce9b64eda52cc1eef6961cc649cf75aacd1a707c2fff08d6c3efcbc8e7e761a"}, @@ -673,6 +701,7 @@ version = "1.5.4" description = "A pluggable framework for adding two-factor authentication to Django using one-time passwords." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "django_otp-1.5.4-py3-none-any.whl", hash = "sha256:783dea669ac0eaf5cd336f73839443584ee665af427a84175cca5a9d620366db"}, {file = "django_otp-1.5.4.tar.gz", hash = "sha256:0d9497ea4fb13fc04d50b49aa53dd1c740fe4bc5dde0ca27fb394f84e5da7bac"}, @@ -691,6 +720,7 @@ version = "1.1.0" description = "A django-otp plugin that verifies YubiKey OTP tokens." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "django_otp_yubikey-1.1.0-py3-none-any.whl", hash = "sha256:b010051446186273a52f8d25d3866ea1d2df8bc841e50d60e79919da08c539d7"}, {file = "django_otp_yubikey-1.1.0.tar.gz", hash = "sha256:34dfe46baf120b8d2fd9510b4097b150907f761eea51c6604e4c8a694f954830"}, @@ -706,6 +736,7 @@ version = "8.0.0" description = "An international phone number field for django models." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "django_phonenumber_field-8.0.0-py3-none-any.whl", hash = "sha256:196c917b70c01a98e327f482eb8a4a4a55a29891db551f99078585397370b3ba"}, {file = "django_phonenumber_field-8.0.0.tar.gz", hash = "sha256:8a560fe1b01b94c9de8cde22bc373b695f023cc6df4baba00264cb079da9f631"}, @@ -724,6 +755,7 @@ version = "5.1.0" description = "An extensible user-registration application for Django." optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "django_registration-5.1.0-py3-none-any.whl", hash = "sha256:5e3677e64f39a5d659768b93938870286b90ff500b983fd69153012fabea73fd"}, {file = "django_registration-5.1.0.tar.gz", hash = "sha256:e64b0b1d24886fc740122862630ec00b8c2ffd4ab6d0e0a9bced870374d1436b"}, @@ -735,13 +767,14 @@ Django = ">=4.2" [[package]] name = "django-ses" -version = "4.3.2" +version = "4.4.0" description = "A Django email backend for Amazon's Simple Email Service (SES)" optional = false python-versions = "<4.0,>=3.8" +groups = ["main"] files = [ - {file = "django_ses-4.3.2-py3-none-any.whl", hash = "sha256:eed713751a95f0204954a3d9532651fcde835fa48179556ddbac75a671fd8de4"}, - {file = "django_ses-4.3.2.tar.gz", hash = "sha256:4440847259b3a5a1d33c02467dacbe23d12b8105e04a4c17dba38110f4bfae77"}, + {file = "django_ses-4.4.0-py3-none-any.whl", hash = "sha256:1d310c34b307a380f3c9a2091e6e7fc2cf19650f229d1df044b19e140fb77b63"}, + {file = "django_ses-4.4.0.tar.gz", hash = "sha256:8cf9213f84de0315dd03b0ddc0e126d39c79847af5ba27000adcac3314f4bfae"}, ] [package.dependencies] @@ -758,6 +791,7 @@ version = "5.1.2" description = "Mypy stubs for Django" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "django_stubs-5.1.2-py3-none-any.whl", hash = "sha256:04ddc778faded6fb48468a8da9e98b8d12b9ba983faa648d37a73ebde0f024da"}, {file = "django_stubs-5.1.2.tar.gz", hash = "sha256:a0fcb3659bab46a6d835cc2d9bff3fc29c36ccea41a10e8b1930427bc0f9f0df"}, @@ -781,6 +815,7 @@ version = "5.1.2" description = "Monkey-patching and extensions for django-stubs" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "django_stubs_ext-5.1.2-py3-none-any.whl", hash = "sha256:6c559214538d6a26f631ca638ddc3251a0a891d607de8ce01d23d3201ad8ad6c"}, {file = "django_stubs_ext-5.1.2.tar.gz", hash = "sha256:421c0c3025a68e3ab8e16f065fad9ba93335ecefe2dd92a0cff97a665680266c"}, @@ -796,6 +831,7 @@ version = "7.1" description = "A Django app providing DB, form, and REST framework fields for zoneinfo and pytz timezone objects." optional = false python-versions = "<4.0,>=3.8" +groups = ["main"] files = [ {file = "django_timezone_field-7.1-py3-none-any.whl", hash = "sha256:93914713ed882f5bccda080eda388f7006349f25930b6122e9b07bf8db49c4b4"}, {file = "django_timezone_field-7.1.tar.gz", hash = "sha256:b3ef409d88a2718b566fabe10ea996f2838bc72b22d3a2900c0aa905c761380c"}, @@ -810,6 +846,7 @@ version = "1.17.0" description = "Complete Two-Factor Authentication for Django" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "django_two_factor_auth-1.17.0-py3-none-any.whl", hash = "sha256:622e78b0d6cf12eeafa239665d99c1221c399228f2f902fe478aea7759995e0e"}, {file = "django_two_factor_auth-1.17.0.tar.gz", hash = "sha256:a2dcc3efedd0ce4b4c14d389766c9fd8e13cabdff5e4e1b645adeb650c550cf7"}, @@ -839,6 +876,7 @@ version = "3.15.2" description = "Web APIs for Django, made easy." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "djangorestframework-3.15.2-py3-none-any.whl", hash = "sha256:2b8871b062ba1aefc2de01f773875441a961fefbf79f5eed1e32b2f096944b20"}, {file = "djangorestframework-3.15.2.tar.gz", hash = "sha256:36fe88cd2d6c6bec23dca9804bab2ba5517a8bb9d8f47ebc68981b56840107ad"}, @@ -853,6 +891,7 @@ version = "3.15.2" description = "PEP-484 stubs for django-rest-framework" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "djangorestframework_stubs-3.15.2-py3-none-any.whl", hash = "sha256:0e72f1e8507bdb2acd99b304520494ea5d45bccba51a4877140cb65fd461adf0"}, {file = "djangorestframework_stubs-3.15.2.tar.gz", hash = "sha256:3df129845acac6c1b097bc7e5b360d53e32a02029d60b4f972dfbd3e2508f236"}, @@ -876,6 +915,7 @@ version = "3.0.7" description = "Django/Jinja template indenter" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "djhtml-3.0.7.tar.gz", hash = "sha256:558c905b092a0c8afcbed27dea2f50aa6eb853a658b309e4e0f2bb378bdf6178"}, ] @@ -889,6 +929,7 @@ version = "0.28.0" description = "Sane and flexible OpenAPI 3 schema generation for Django REST framework" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "drf_spectacular-0.28.0-py3-none-any.whl", hash = "sha256:856e7edf1056e49a4245e87a61e8da4baff46c83dbc25be1da2df77f354c7cb4"}, {file = "drf_spectacular-0.28.0.tar.gz", hash = "sha256:2c778a47a40ab2f5078a7c42e82baba07397bb35b074ae4680721b2805943061"}, @@ -912,6 +953,7 @@ version = "2.1.1" description = "execnet: rapid multi-Python deployment" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, @@ -926,6 +968,7 @@ version = "3.17.0" description = "A platform independent file lock." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338"}, {file = "filelock-3.17.0.tar.gz", hash = "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e"}, @@ -942,6 +985,7 @@ version = "1.7.2" description = "Simple PDF generation for Python" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "fpdf-1.7.2.tar.gz", hash = "sha256:125840783289e7d12552b1e86ab692c37322e7a65b96a99e0ea86cca041b6779"}, ] @@ -952,6 +996,7 @@ version = "1.5.1" description = "Let your Python tests travel through time" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "freezegun-1.5.1-py3-none-any.whl", hash = "sha256:bf111d7138a8abe55ab48a71755673dbaa4ab87f4cff5634a4442dfec34c15f1"}, {file = "freezegun-1.5.1.tar.gz", hash = "sha256:b29dedfcda6d5e8e083ce71b2b542753ad48cfec44037b3fc79702e2980a89e9"}, @@ -966,6 +1011,7 @@ version = "2.1.0" description = "Copy your docs directly to the gh-pages branch." optional = false python-versions = "*" +groups = ["docs"] files = [ {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, @@ -983,6 +1029,7 @@ version = "2.6.6" description = "File identification library for Python" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "identify-2.6.6-py2.py3-none-any.whl", hash = "sha256:cbd1810bce79f8b671ecb20f53ee0ae8e86ae84b557de31d89709dc2a48ba881"}, {file = "identify-2.6.6.tar.gz", hash = "sha256:7bec12768ed44ea4761efb47806f0a41f86e7c0a5fdf5950d4648c90eca7e251"}, @@ -997,6 +1044,7 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" +groups = ["main", "dev", "docs"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -1011,6 +1059,7 @@ version = "0.5.1" description = "A port of Ruby on Rails inflector to Python" optional = false python-versions = ">=3.5" +groups = ["main"] files = [ {file = "inflection-0.5.1-py2.py3-none-any.whl", hash = "sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2"}, {file = "inflection-0.5.1.tar.gz", hash = "sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417"}, @@ -1022,6 +1071,7 @@ version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -1033,6 +1083,7 @@ version = "3.1.5" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" +groups = ["docs"] files = [ {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, @@ -1050,6 +1101,7 @@ version = "1.0.1" description = "JSON Matching Expressions" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, @@ -1061,6 +1113,7 @@ version = "4.23.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, @@ -1082,6 +1135,7 @@ version = "2024.10.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, @@ -1096,6 +1150,7 @@ version = "3.7" description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.8" +groups = ["docs"] files = [ {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"}, {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"}, @@ -1111,6 +1166,7 @@ version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.9" +groups = ["docs"] files = [ {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, @@ -1181,6 +1237,7 @@ version = "1.3.4" description = "A deep merge function for 馃悕." optional = false python-versions = ">=3.6" +groups = ["docs"] files = [ {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, @@ -1192,6 +1249,7 @@ version = "1.6.1" description = "Project documentation with Markdown." optional = false python-versions = ">=3.8" +groups = ["docs"] files = [ {file = "mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e"}, {file = "mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2"}, @@ -1223,6 +1281,7 @@ version = "0.2.0" description = "MkDocs extension that lists all dependencies according to a mkdocs.yml file" optional = false python-versions = ">=3.8" +groups = ["docs"] files = [ {file = "mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134"}, {file = "mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c"}, @@ -1239,6 +1298,7 @@ version = "0.4.0" description = "MkDocs plugin supports image lightbox with GLightbox." optional = false python-versions = "*" +groups = ["docs"] files = [ {file = "mkdocs-glightbox-0.4.0.tar.gz", hash = "sha256:392b34207bf95991071a16d5f8916d1d2f2cd5d5bb59ae2997485ccd778c70d9"}, {file = "mkdocs_glightbox-0.4.0-py3-none-any.whl", hash = "sha256:e0107beee75d3eb7380ac06ea2d6eac94c999eaa49f8c3cbab0e7be2ac006ccf"}, @@ -1246,13 +1306,14 @@ files = [ [[package]] name = "mkdocs-material" -version = "9.5.50" +version = "9.6.2" description = "Documentation that simply works" optional = false python-versions = ">=3.8" +groups = ["docs"] files = [ - {file = "mkdocs_material-9.5.50-py3-none-any.whl", hash = "sha256:f24100f234741f4d423a9d672a909d859668a4f404796be3cf035f10d6050385"}, - {file = "mkdocs_material-9.5.50.tar.gz", hash = "sha256:ae5fe16f3d7c9ccd05bb6916a7da7420cf99a9ce5e33debd9d40403a090d5825"}, + {file = "mkdocs_material-9.6.2-py3-none-any.whl", hash = "sha256:71d90dbd63b393ad11a4d90151dfe3dcbfcd802c0f29ce80bebd9bbac6abc753"}, + {file = "mkdocs_material-9.6.2.tar.gz", hash = "sha256:a3de1c5d4c745f10afa78b1a02f917b9dce0808fb206adc0f5bb48b58c1ca21f"}, ] [package.dependencies] @@ -1281,6 +1342,7 @@ version = "1.3.1" description = "Extension pack for Python Markdown and MkDocs Material." optional = false python-versions = ">=3.8" +groups = ["docs"] files = [ {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, @@ -1292,6 +1354,7 @@ version = "1.14.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb"}, {file = "mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0"}, @@ -1350,6 +1413,7 @@ version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.5" +groups = ["dev"] 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"}, @@ -1361,6 +1425,7 @@ version = "1.9.1" description = "Node.js virtual environment builder" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["dev"] files = [ {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, @@ -1372,6 +1437,7 @@ version = "2.2.2" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "numpy-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7079129b64cb78bdc8d611d1fd7e8002c0a2565da6a47c4df8062349fee90e3e"}, {file = "numpy-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ec6c689c61df613b783aeb21f945c4cbe6c51c28cb70aae8430577ab39f163e"}, @@ -1436,6 +1502,7 @@ version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" +groups = ["dev", "docs"] files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, @@ -1447,6 +1514,7 @@ version = "0.5.7" description = "Divides large result sets into pages for easier browsing" optional = false python-versions = "*" +groups = ["docs"] files = [ {file = "paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591"}, {file = "paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945"}, @@ -1462,6 +1530,7 @@ version = "0.9.0" description = "Parameterized testing with any Python test framework" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "parameterized-0.9.0-py2.py3-none-any.whl", hash = "sha256:4e0758e3d41bea3bbd05ec14fc2c24736723f243b28d702081aef438c9372b1b"}, {file = "parameterized-0.9.0.tar.gz", hash = "sha256:7fc905272cefa4f364c1a3429cbbe9c0f98b793988efb5bf90aac80f08db09b1"}, @@ -1476,6 +1545,7 @@ version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" +groups = ["docs"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -1483,13 +1553,14 @@ files = [ [[package]] name = "phonenumberslite" -version = "8.13.53" +version = "8.13.54" description = "Python version of Google's common library for parsing, formatting, storing and validating international phone numbers." optional = false python-versions = "*" +groups = ["main"] files = [ - {file = "phonenumberslite-8.13.53-py2.py3-none-any.whl", hash = "sha256:7737938460debbada506edc55f4cebcf62db5c10cddf094528ea15ef5507ba45"}, - {file = "phonenumberslite-8.13.53.tar.gz", hash = "sha256:07b3a38ce79b9ba1e303a51f6b762a0db6c192ae15cf0b1909d3cf3fd78c44c4"}, + {file = "phonenumberslite-8.13.54-py2.py3-none-any.whl", hash = "sha256:2dbfc80d38aa3a6c3da222cb7a9bca5ccb1f1eb405d5cede27e29ba83d9714e8"}, + {file = "phonenumberslite-8.13.54.tar.gz", hash = "sha256:6810bf3e256c0e5e43b834ed36e80f9b36b06155e5e04a3e866edebad7d88b57"}, ] [[package]] @@ -1498,6 +1569,7 @@ version = "10.4.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" +groups = ["docs"] files = [ {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, @@ -1595,6 +1667,7 @@ 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" +groups = ["dev", "docs"] files = [ {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, @@ -1611,6 +1684,7 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -1626,6 +1700,7 @@ version = "4.1.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "pre_commit-4.1.0-py2.py3-none-any.whl", hash = "sha256:d29e7cb346295bcc1cc75fc3e92e343495e3ea0196c9ec6ba53f49f10ab6ae7b"}, {file = "pre_commit-4.1.0.tar.gz", hash = "sha256:ae3f018575a588e30dfddfab9a05448bfbd6b73d78709617b5a2b853549716d4"}, @@ -1644,6 +1719,7 @@ version = "0.21.1" description = "Python client for the Prometheus monitoring system." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "prometheus_client-0.21.1-py3-none-any.whl", hash = "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301"}, {file = "prometheus_client-0.21.1.tar.gz", hash = "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb"}, @@ -1658,6 +1734,7 @@ version = "6.1.1" description = "Cross-platform lib for process and system monitoring in Python." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +groups = ["main"] files = [ {file = "psutil-6.1.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:9ccc4316f24409159897799b83004cb1e24f9819b0dcf9c0b68bdcb6cefee6a8"}, {file = "psutil-6.1.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ca9609c77ea3b8481ab005da74ed894035936223422dc591d6772b147421f777"}, @@ -1688,6 +1765,7 @@ version = "3.2.4" description = "PostgreSQL database adapter for Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "psycopg-3.2.4-py3-none-any.whl", hash = "sha256:43665368ccd48180744cab26b74332f46b63b7e06e8ce0775547a3533883d381"}, {file = "psycopg-3.2.4.tar.gz", hash = "sha256:f26f1346d6bf1ef5f5ef1714dd405c67fb365cfd1c6cea07de1792747b167b92"}, @@ -1711,6 +1789,8 @@ version = "3.2.4" description = "PostgreSQL database adapter for Python -- C optimisation distribution" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "implementation_name != \"pypy\"" files = [ {file = "psycopg_c-3.2.4.tar.gz", hash = "sha256:22097a04263efb2efd2cc8b00a51fa90e23f9cd4a2e09903fe4d9c6923dac17a"}, ] @@ -1721,6 +1801,7 @@ version = "2.22" description = "C parser in Python" optional = false python-versions = ">=3.8" +groups = ["docs"] files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, @@ -1732,6 +1813,7 @@ version = "3.21.0" description = "Cryptographic library for Python" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +groups = ["main"] files = [ {file = "pycryptodome-3.21.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:dad9bf36eda068e89059d1f07408e397856be9511d7113ea4b586642a429a4fd"}, {file = "pycryptodome-3.21.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:a1752eca64c60852f38bb29e2c86fca30d7672c024128ef5d70cc15868fa10f4"}, @@ -1773,6 +1855,7 @@ version = "2.19.1" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" +groups = ["docs"] files = [ {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, @@ -1783,13 +1866,14 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pymdown-extensions" -version = "10.14.1" +version = "10.14.3" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" +groups = ["docs"] files = [ - {file = "pymdown_extensions-10.14.1-py3-none-any.whl", hash = "sha256:637951cbfbe9874ba28134fb3ce4b8bcadd6aca89ac4998ec29dcbafd554ae08"}, - {file = "pymdown_extensions-10.14.1.tar.gz", hash = "sha256:b65801996a0cd4f42a3110810c306c45b7313c09b0610a6f773730f2a9e3c96b"}, + {file = "pymdown_extensions-10.14.3-py3-none-any.whl", hash = "sha256:05e0bee73d64b9c71a4ae17c72abc2f700e8bc8403755a00580b49a4e9f189e9"}, + {file = "pymdown_extensions-10.14.3.tar.gz", hash = "sha256:41e576ce3f5d650be59e900e4ceff231e0aed2a88cf30acaee41e02f063a061b"}, ] [package.dependencies] @@ -1805,6 +1889,7 @@ version = "0.20220715.0" description = "Pure Python library for saving and loading PNG images" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "pypng-0.20220715.0-py3-none-any.whl", hash = "sha256:4a43e969b8f5aaafb2a415536c1a8ec7e341cd6a3f957fd5b5f32a4cfeed902c"}, {file = "pypng-0.20220715.0.tar.gz", hash = "sha256:739c433ba96f078315de54c0db975aee537cbc3e1d0ae4ed9aab0ca1e427e2c1"}, @@ -1816,6 +1901,7 @@ version = "8.3.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, @@ -1836,6 +1922,7 @@ version = "6.0.0" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0"}, {file = "pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35"}, @@ -1854,6 +1941,7 @@ version = "4.9.0" description = "A Django plugin for pytest." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pytest_django-4.9.0-py3-none-any.whl", hash = "sha256:1d83692cb39188682dbb419ff0393867e9904094a549a7d38a3154d5731b2b99"}, {file = "pytest_django-4.9.0.tar.gz", hash = "sha256:8bf7bc358c9ae6f6fc51b6cebb190fe20212196e6807121f11bd6a3b03428314"}, @@ -1872,6 +1960,7 @@ version = "3.6.1" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, @@ -1892,6 +1981,7 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main", "dev", "docs"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -1906,6 +1996,7 @@ 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" +groups = ["main"] 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"}, @@ -1920,6 +2011,7 @@ version = "6.0.2" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" +groups = ["main", "dev", "docs"] 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"}, @@ -1982,6 +2074,7 @@ version = "0.1" description = "A custom YAML tag for referencing environment variables in YAML files. " optional = false python-versions = ">=3.6" +groups = ["docs"] files = [ {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, @@ -1996,6 +2089,7 @@ version = "7.4.2" description = "QR Code image generator" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "qrcode-7.4.2-py3-none-any.whl", hash = "sha256:581dca7a029bcb2deef5d01068e39093e80ef00b4a61098a2182eac59d01643a"}, {file = "qrcode-7.4.2.tar.gz", hash = "sha256:9dd969454827e127dbd93696b20747239e6d540e082937c90f14ac95b30f5845"}, @@ -2019,6 +2113,7 @@ version = "0.36.2" description = "JSON Referencing + Python" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, @@ -2034,6 +2129,7 @@ version = "2024.11.6" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" +groups = ["docs"] 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"}, @@ -2137,6 +2233,7 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" +groups = ["main", "dev", "docs"] files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -2158,6 +2255,7 @@ version = "1.12.1" description = "Mock out responses from the requests package" optional = false python-versions = ">=3.5" +groups = ["dev"] 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"}, @@ -2175,6 +2273,7 @@ version = "0.22.3" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "rpds_py-0.22.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967"}, {file = "rpds_py-0.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37"}, @@ -2283,29 +2382,30 @@ files = [ [[package]] name = "ruff" -version = "0.9.3" +version = "0.9.4" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" -files = [ - {file = "ruff-0.9.3-py3-none-linux_armv6l.whl", hash = "sha256:7f39b879064c7d9670197d91124a75d118d00b0990586549949aae80cdc16624"}, - {file = "ruff-0.9.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:a187171e7c09efa4b4cc30ee5d0d55a8d6c5311b3e1b74ac5cb96cc89bafc43c"}, - {file = "ruff-0.9.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c59ab92f8e92d6725b7ded9d4a31be3ef42688a115c6d3da9457a5bda140e2b4"}, - {file = "ruff-0.9.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dc153c25e715be41bb228bc651c1e9b1a88d5c6e5ed0194fa0dfea02b026439"}, - {file = "ruff-0.9.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:646909a1e25e0dc28fbc529eab8eb7bb583079628e8cbe738192853dbbe43af5"}, - {file = "ruff-0.9.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a5a46e09355695fbdbb30ed9889d6cf1c61b77b700a9fafc21b41f097bfbba4"}, - {file = "ruff-0.9.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:c4bb09d2bbb394e3730d0918c00276e79b2de70ec2a5231cd4ebb51a57df9ba1"}, - {file = "ruff-0.9.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96a87ec31dc1044d8c2da2ebbed1c456d9b561e7d087734336518181b26b3aa5"}, - {file = "ruff-0.9.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bb7554aca6f842645022fe2d301c264e6925baa708b392867b7a62645304df4"}, - {file = "ruff-0.9.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cabc332b7075a914ecea912cd1f3d4370489c8018f2c945a30bcc934e3bc06a6"}, - {file = "ruff-0.9.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:33866c3cc2a575cbd546f2cd02bdd466fed65118e4365ee538a3deffd6fcb730"}, - {file = "ruff-0.9.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:006e5de2621304c8810bcd2ee101587712fa93b4f955ed0985907a36c427e0c2"}, - {file = "ruff-0.9.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ba6eea4459dbd6b1be4e6bfc766079fb9b8dd2e5a35aff6baee4d9b1514ea519"}, - {file = "ruff-0.9.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:90230a6b8055ad47d3325e9ee8f8a9ae7e273078a66401ac66df68943ced029b"}, - {file = "ruff-0.9.3-py3-none-win32.whl", hash = "sha256:eabe5eb2c19a42f4808c03b82bd313fc84d4e395133fb3fc1b1516170a31213c"}, - {file = "ruff-0.9.3-py3-none-win_amd64.whl", hash = "sha256:040ceb7f20791dfa0e78b4230ee9dce23da3b64dd5848e40e3bf3ab76468dcf4"}, - {file = "ruff-0.9.3-py3-none-win_arm64.whl", hash = "sha256:800d773f6d4d33b0a3c60e2c6ae8f4c202ea2de056365acfa519aa48acf28e0b"}, - {file = "ruff-0.9.3.tar.gz", hash = "sha256:8293f89985a090ebc3ed1064df31f3b4b56320cdfcec8b60d3295bddb955c22a"}, +groups = ["dev"] +files = [ + {file = "ruff-0.9.4-py3-none-linux_armv6l.whl", hash = "sha256:64e73d25b954f71ff100bb70f39f1ee09e880728efb4250c632ceed4e4cdf706"}, + {file = "ruff-0.9.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6ce6743ed64d9afab4fafeaea70d3631b4d4b28b592db21a5c2d1f0ef52934bf"}, + {file = "ruff-0.9.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:54499fb08408e32b57360f6f9de7157a5fec24ad79cb3f42ef2c3f3f728dfe2b"}, + {file = "ruff-0.9.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37c892540108314a6f01f105040b5106aeb829fa5fb0561d2dcaf71485021137"}, + {file = "ruff-0.9.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:de9edf2ce4b9ddf43fd93e20ef635a900e25f622f87ed6e3047a664d0e8f810e"}, + {file = "ruff-0.9.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87c90c32357c74f11deb7fbb065126d91771b207bf9bfaaee01277ca59b574ec"}, + {file = "ruff-0.9.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:56acd6c694da3695a7461cc55775f3a409c3815ac467279dfa126061d84b314b"}, + {file = "ruff-0.9.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0c93e7d47ed951b9394cf352d6695b31498e68fd5782d6cbc282425655f687a"}, + {file = "ruff-0.9.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d4c8772670aecf037d1bf7a07c39106574d143b26cfe5ed1787d2f31e800214"}, + {file = "ruff-0.9.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfc5f1d7afeda8d5d37660eeca6d389b142d7f2b5a1ab659d9214ebd0e025231"}, + {file = "ruff-0.9.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:faa935fc00ae854d8b638c16a5f1ce881bc3f67446957dd6f2af440a5fc8526b"}, + {file = "ruff-0.9.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a6c634fc6f5a0ceae1ab3e13c58183978185d131a29c425e4eaa9f40afe1e6d6"}, + {file = "ruff-0.9.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:433dedf6ddfdec7f1ac7575ec1eb9844fa60c4c8c2f8887a070672b8d353d34c"}, + {file = "ruff-0.9.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d612dbd0f3a919a8cc1d12037168bfa536862066808960e0cc901404b77968f0"}, + {file = "ruff-0.9.4-py3-none-win32.whl", hash = "sha256:db1192ddda2200671f9ef61d9597fcef89d934f5d1705e571a93a67fb13a4402"}, + {file = "ruff-0.9.4-py3-none-win_amd64.whl", hash = "sha256:05bebf4cdbe3ef75430d26c375773978950bbf4ee3c95ccb5448940dc092408e"}, + {file = "ruff-0.9.4-py3-none-win_arm64.whl", hash = "sha256:585792f1e81509e38ac5123492f8875fbc36f3ede8185af0a26df348e5154f41"}, + {file = "ruff-0.9.4.tar.gz", hash = "sha256:6907ee3529244bb0ed066683e075f09285b38dd5b4039370df6ff06041ca19e7"}, ] [[package]] @@ -2314,6 +2414,7 @@ version = "0.11.2" description = "An Amazon S3 Transfer Manager" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "s3transfer-0.11.2-py3-none-any.whl", hash = "sha256:be6ecb39fadd986ef1701097771f87e4d2f821f27f6071c872143884d2950fbc"}, {file = "s3transfer-0.11.2.tar.gz", hash = "sha256:3b39185cb72f5acc77db1a58b6e25b977f28d20496b6e58d6813d75f464d632f"}, @@ -2331,9 +2432,9 @@ version = "1.2.2" description = "Job scheduling for humans." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "schedule-1.2.2-py3-none-any.whl", hash = "sha256:5bef4a2a0183abf44046ae0d164cadcac21b1db011bdd8102e4a0c1e91e06a7d"}, - {file = "schedule-1.2.2.tar.gz", hash = "sha256:15fe9c75fe5fd9b9627f3f19cc0ef1420508f9f9a46f45cd0769ef75ede5f0b7"}, ] [package.extras] @@ -2345,6 +2446,7 @@ version = "1.15.1" description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "scipy-1.15.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:c64ded12dcab08afff9e805a67ff4480f5e69993310e093434b10e85dc9d43e1"}, {file = "scipy-1.15.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:5b190b935e7db569960b48840e5bef71dc513314cc4e79a1b7d14664f57fd4ff"}, @@ -2402,6 +2504,7 @@ version = "2.20.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "sentry_sdk-2.20.0-py2.py3-none-any.whl", hash = "sha256:c359a1edf950eb5e80cffd7d9111f3dbeef57994cb4415df37d39fda2cf22364"}, {file = "sentry_sdk-2.20.0.tar.gz", hash = "sha256:afa82713a92facf847df3c6f63cec71eb488d826a50965def3d7722aa6f0fdab"}, @@ -2458,6 +2561,7 @@ version = "75.8.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3"}, {file = "setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6"}, @@ -2478,6 +2582,7 @@ version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main", "dev", "docs"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -2489,6 +2594,7 @@ version = "2.6" description = "A modern CSS selector implementation for Beautiful Soup." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, @@ -2500,6 +2606,7 @@ version = "0.5.3" description = "A non-validating SQL parser." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "sqlparse-0.5.3-py3-none-any.whl", hash = "sha256:cf2196ed3418f3ba5de6af7e82c694a9fbdbfecccdfc72e281548517081f16ca"}, {file = "sqlparse-0.5.3.tar.gz", hash = "sha256:09f67787f56a0b16ecdbde1bfc7f5d9c3371ca683cfeaa8e6ff60b4807ec9272"}, @@ -2515,6 +2622,7 @@ version = "11.5.0" description = "Python bindings for the Stripe API" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "stripe-11.5.0-py2.py3-none-any.whl", hash = "sha256:3b2cd47ed3002328249bff5cacaee38d5e756c3899ab425d3bd07acdaf32534a"}, {file = "stripe-11.5.0.tar.gz", hash = "sha256:bc3e0358ffc23d5ecfa8aafec1fa4f048ee8107c3237bcb00003e68c8c96fa02"}, @@ -2530,6 +2638,7 @@ version = "1.4.0" description = "A tiny CSS parser" optional = false python-versions = ">=3.8" +groups = ["docs"] files = [ {file = "tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289"}, {file = "tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7"}, @@ -2548,6 +2657,7 @@ version = "3.7.0.20241204" description = "Typing stubs for Markdown" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types_Markdown-3.7.0.20241204-py3-none-any.whl", hash = "sha256:f96146c367ea9c82bfe9903559d72706555cc2a1a3474c58ebba03b418ab18da"}, {file = "types_markdown-3.7.0.20241204.tar.gz", hash = "sha256:ecca2b25cd23163fd28ed5ba34d183d731da03e8a5ed3a20b60daded304c5410"}, @@ -2559,6 +2669,7 @@ version = "2.9.0.20241206" description = "Typing stubs for python-dateutil" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53"}, {file = "types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb"}, @@ -2570,6 +2681,7 @@ version = "2024.2.0.20241221" description = "Typing stubs for pytz" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types_pytz-2024.2.0.20241221-py3-none-any.whl", hash = "sha256:8fc03195329c43637ed4f593663df721fef919b60a969066e22606edf0b53ad5"}, {file = "types_pytz-2024.2.0.20241221.tar.gz", hash = "sha256:06d7cde9613e9f7504766a0554a270c369434b50e00975b3a4a0f6eed0f2c1a9"}, @@ -2581,6 +2693,7 @@ version = "6.0.12.20241230" description = "Typing stubs for PyYAML" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types_PyYAML-6.0.12.20241230-py3-none-any.whl", hash = "sha256:fa4d32565219b68e6dee5f67534c722e53c00d1cfc09c435ef04d7353e1e96e6"}, {file = "types_pyyaml-6.0.12.20241230.tar.gz", hash = "sha256:7f07622dbd34bb9c8b264fe860a17e0efcad00d50b5f27e93984909d9363498c"}, @@ -2592,6 +2705,7 @@ version = "2.32.0.20241016" description = "Typing stubs for requests" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types-requests-2.32.0.20241016.tar.gz", hash = "sha256:0d9cad2f27515d0e3e3da7134a1b6f28fb97129d86b867f24d9c726452634d95"}, {file = "types_requests-2.32.0.20241016-py3-none-any.whl", hash = "sha256:4195d62d6d3e043a4eaaf08ff8a62184584d2e8684e9d2aa178c7915a7da3747"}, @@ -2606,6 +2720,7 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] 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"}, @@ -2617,6 +2732,8 @@ version = "2025.1" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" +groups = ["main", "dev"] +markers = "sys_platform == \"win32\"" files = [ {file = "tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"}, {file = "tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694"}, @@ -2628,6 +2745,7 @@ version = "4.1.1" description = "Implementation of RFC 6570 URI Templates" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e"}, {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"}, @@ -2639,6 +2757,7 @@ version = "2.3.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" +groups = ["main", "dev", "docs"] files = [ {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, @@ -2656,6 +2775,7 @@ version = "2.0.28" description = "The uWSGI server" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "uwsgi-2.0.28.tar.gz", hash = "sha256:79ca1891ef2df14508ab0471ee8c0eb94bd2d51d03f32f90c4bbe557ab1e99d0"}, ] @@ -2666,6 +2786,7 @@ version = "20.29.1" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "virtualenv-20.29.1-py3-none-any.whl", hash = "sha256:4e4cb403c0b0da39e13b46b1b2476e505cb0046b25f242bee80f62bf990b2779"}, {file = "virtualenv-20.29.1.tar.gz", hash = "sha256:b8b8970138d32fb606192cb97f6cd4bb644fa486be9308fb9b63f81091b5dc35"}, @@ -2686,6 +2807,7 @@ version = "6.0.0" description = "Filesystem events monitoring" optional = false python-versions = ">=3.9" +groups = ["docs"] files = [ {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26"}, {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112"}, @@ -2728,6 +2850,7 @@ version = "0.5.1" description = "Character encoding aliases for legacy web content" optional = false python-versions = "*" +groups = ["docs"] files = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, @@ -2739,6 +2862,7 @@ version = "1.0.0" description = "A library for verifying YubiKey OTP tokens, both locally and through a Yubico web service." optional = false python-versions = "*" +groups = ["main"] files = [ {file = "YubiOTP-1.0.0-py2.py3-none-any.whl", hash = "sha256:cb1cc0e2eeadc86ced363c9da4de552cc2bfb5d6465180035795b417e4f71aad"}, {file = "YubiOTP-1.0.0.tar.gz", hash = "sha256:3a1b3fa3ade196fb62a8c6716dfe0ee679ac7a06616625b489cf6039daa17f08"}, @@ -2748,6 +2872,6 @@ files = [ pycryptodome = "*" [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = ">=3.13,<3.14" content-hash = "98d9547fe7ffe7421c680e2874ec3b0ac1c4a78957aeed0f6449f627cc93251a" diff --git a/rest_api/serializers.py b/rest_api/serializers.py index aaf023a1..4f1ae914 100644 --- a/rest_api/serializers.py +++ b/rest_api/serializers.py @@ -113,7 +113,7 @@ class WeightSerializer(serializers.Serializer): player_id = serializers.IntegerField() send_url = serializers.CharField() - def get_building_name(self, obj: Any) -> str | None: + def get_building_name(self, obj: Any): return BUILDINGS_TRANSLATION.get(obj.get("building")) diff --git a/tribal_wars_planer/settings.py b/tribal_wars_planer/settings.py index 29dc885a..ef16d7dd 100644 --- a/tribal_wars_planer/settings.py +++ b/tribal_wars_planer/settings.py @@ -18,7 +18,6 @@ from pathlib import Path from typing import Any -import sentry_sdk from diskcache.fanout import FanoutCache from django.contrib.auth.hashers import PBKDF2PasswordHasher from dotenv import load_dotenv @@ -82,6 +81,8 @@ SENTRY_SDK_ACTIVE = False if SENTRY_SDK_ACTIVE: + import sentry_sdk + sentry_sdk.init( dsn=os.environ["SENTRY_DSN"], server_name=MAIN_DOMAIN, @@ -125,7 +126,7 @@ ], "DEFAULT_RENDERER_CLASSES": ("rest_framework.renderers.JSONRenderer",), "DEFAULT_SCHEMA_CLASS": "drf_spectacular.openapi.AutoSchema", - "DEFAULT_THROTTLE_RATES": {"anon": "25/min", "user": "25/min"}, + "DEFAULT_THROTTLE_RATES": {"anon": "50/min", "user": "50/min"}, "NUM_PROXIES": 2, } diff --git a/utils/avaiable_troops.py b/utils/avaiable_troops.py index c52df0f8..12b64df1 100644 --- a/utils/avaiable_troops.py +++ b/utils/avaiable_troops.py @@ -15,8 +15,7 @@ import numpy as np -from django.db.models import F, Sum -from django.db.models.query import Q, QuerySet +from django.db.models import F, Q, QuerySet, Sum from base import models from utils.basic.cdist_brute import CDistBrute diff --git a/utils/buildings.py b/utils/buildings.py index 47d5d066..8f11d974 100644 --- a/utils/buildings.py +++ b/utils/buildings.py @@ -22,7 +22,7 @@ class BUILDING(enum.StrEnum): WATCHTOWER = "watchtower" -BUILDINGS_TRANSLATION: dict[str, str] = { +BUILDINGS_TRANSLATION = { BUILDING.HEADQUARTERS.value: gettext_lazy("Headquarters"), BUILDING.BARRACKS.value: gettext_lazy("Barracks"), BUILDING.STABLE.value: gettext_lazy("Stable"), From a0089a9f6fec087317e32bd0399c40bd1e54c293 Mon Sep 17 00:00:00 2001 From: rafsaf Date: Mon, 3 Feb 2025 20:20:33 +0100 Subject: [PATCH 2/6] adjust docs Signed-off-by: rafsaf --- docs/docs/en/developers/index.md | 2 +- docs/docs/pl/developers/index.md | 14 ++++----- rest_api/serializers.py | 4 +++ rest_api/views.py | 49 ++++++++++++++++++++++++++++++-- 4 files changed, 59 insertions(+), 10 deletions(-) diff --git a/docs/docs/en/developers/index.md b/docs/docs/en/developers/index.md index ce180bd1..c7684432 100644 --- a/docs/docs/en/developers/index.md +++ b/docs/docs/en/developers/index.md @@ -1,6 +1,6 @@ # Public API -There is an option to use the public API. I would be very grateful for reasonable rate limiting and not DDOSing the Tribes Planer servers. +There is an option to use the public API. I would be very grateful for reasonable rate limiting and not DOSing the Tribes Planer servers. Links: diff --git a/docs/docs/pl/developers/index.md b/docs/docs/pl/developers/index.md index ce180bd1..cacd60b5 100644 --- a/docs/docs/pl/developers/index.md +++ b/docs/docs/pl/developers/index.md @@ -1,13 +1,13 @@ -# Public API +# Publiczne API -There is an option to use the public API. I would be very grateful for reasonable rate limiting and not DDOSing the Tribes Planer servers. +Istnieje mo偶liwo艣膰 korzystania z publicznego API. B臋d臋 bardzo wdzi臋czny za rozs膮dne ograniczenie liczby zapyta艅 i unikanie DOS贸w na serwery Plemiona Planer. -Links: +Linki: -- [OpenAPI schema - Swagger UI](https://plemiona-planer.pl/api/public/schema/swagger-ui/) -- [OpenAPI schema - Redoc UI](https://plemiona-planer.pl/api/public/schema/redoc/) -- [OpenAPI schema spec yaml file](https://plemiona-planer.pl/api/public/schema) +- [Schemat OpenAPI - Swagger UI](https://plemiona-planer.pl/api/public/schema/swagger-ui/) +- [Schemat OpenAPI - Redoc UI](https://plemiona-planer.pl/api/public/schema/redoc/) +- [Plik specyfikacji schematu OpenAPI (yaml)](https://plemiona-planer.pl/api/public/schema) -At the time of writing this article, an endpoint has been added for retrieving full data from the public outline links. +W momencie pisania tego artyku艂u dodano endpoint umo偶liwiaj膮cy pobieranie pe艂nych danych z publicznych link贸w.
diff --git a/rest_api/serializers.py b/rest_api/serializers.py index 4f1ae914..99372df6 100644 --- a/rest_api/serializers.py +++ b/rest_api/serializers.py @@ -127,3 +127,7 @@ class OverviewSerializer(serializers.Serializer): outline = OutlineSerializer() world = WorldSerializer() targets = TargetOrdersSerializer(many=True) + + +class ErrorDetailSerializer(serializers.Serializer): + detail = serializers.CharField() diff --git a/rest_api/views.py b/rest_api/views.py index b10174c2..af56d0e2 100644 --- a/rest_api/views.py +++ b/rest_api/views.py @@ -28,7 +28,9 @@ from django.utils.translation import activate from drf_spectacular.types import OpenApiTypes from drf_spectacular.utils import ( + OpenApiExample, OpenApiParameter, + OpenApiResponse, extend_schema, ) from prometheus_client import multiprocess @@ -407,11 +409,50 @@ def trigger_error(_: Request) -> HttpResponse: @extend_schema( tags=["overview"], + description="Endpoint (anonymous) to get overview data by it's unique token, the same overview can be seen in graphical version using path: `https://plemiona-planer.pl/en/overview/{token}`", parameters=[ OpenApiParameter(name="token", type=OpenApiTypes.STR), OpenApiParameter(name="language", type=OpenApiTypes.STR, enum=list(LANGUAGES)), ], - responses={200: serializers.OverviewSerializer, 400: {}}, + responses={ + 200: OpenApiResponse( + response=serializers.OverviewSerializer, description="success" + ), + 404: OpenApiResponse( + response=serializers.ErrorDetailSerializer, + description="there is no overview in database for provided token", + examples=[ + OpenApiExample( + name="overview not found", + value={"detail": "No Overview matches the given query."}, + ) + ], + ), + 429: OpenApiResponse( + response=serializers.ErrorDetailSerializer, + description=f"too many requests, limit is {settings.REST_FRAMEWORK['DEFAULT_THROTTLE_RATES']['anon']} per IP", + examples=[ + OpenApiExample( + name="too many requests", + value={ + "detail": "Request was throttled. Expected available in 16 seconds." + }, + ) + ], + ), + 500: OpenApiResponse( + response=serializers.ErrorDetailSerializer, + description="server error - report it", + examples=[ + OpenApiExample( + name="inconsistent data", + value={ + "detail": "Inconsistent data in database: {'outline': {'date': [ErrorDetail(string='This field is required.', code='required')]}}" + }, + ) + ], + ), + }, ) @api_view(["GET"]) @permission_classes([AllowAny]) @@ -486,7 +527,11 @@ def public_overview(request: Request) -> HttpResponse: } ) if not output.is_valid(): - return Response(data=output.errors, status=status.HTTP_400_BAD_REQUEST) + return Response( + data={"detail": f"Inconsistent data in database: {output.errors}"}, + status=status.HTTP_500_INTERNAL_SERVER_ERROR, + ) + return Response( data=output.data, status=status.HTTP_200_OK, From 57e2c5e4c41849102e54fc406d49822993abbe0b Mon Sep 17 00:00:00 2001 From: rafsaf Date: Mon, 3 Feb 2025 20:28:21 +0100 Subject: [PATCH 3/6] fix openapi warnings Signed-off-by: rafsaf --- rest_api/serializers.py | 4 ++-- rest_api/views.py | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/rest_api/serializers.py b/rest_api/serializers.py index 99372df6..018a3bf8 100644 --- a/rest_api/serializers.py +++ b/rest_api/serializers.py @@ -113,8 +113,8 @@ class WeightSerializer(serializers.Serializer): player_id = serializers.IntegerField() send_url = serializers.CharField() - def get_building_name(self, obj: Any): - return BUILDINGS_TRANSLATION.get(obj.get("building")) + def get_building_name(self, obj: Any) -> str: + return BUILDINGS_TRANSLATION.get(obj.get("building")) # type: ignore class TargetOrdersSerializer(serializers.Serializer): diff --git a/rest_api/views.py b/rest_api/views.py index af56d0e2..81f702ea 100644 --- a/rest_api/views.py +++ b/rest_api/views.py @@ -72,7 +72,10 @@ log = logging.getLogger(__name__) -@extend_schema(tags=["internal"]) +@extend_schema( + tags=["internal"], + responses={200: OpenApiResponse(response=None, description="alive")}, +) @api_view(["GET"]) @permission_classes([AllowAny]) def healthcheck(request: Request): From 2a24add9402bc27086155718daa620eb94342cca Mon Sep 17 00:00:00 2001 From: rafsaf Date: Mon, 3 Feb 2025 20:36:13 +0100 Subject: [PATCH 4/6] fix error in forms and run trans Signed-off-by: rafsaf --- base/forms.py | 2 +- locale/pl/LC_MESSAGES/django.mo | Bin 67443 -> 67322 bytes locale/pl/LC_MESSAGES/django.po | 228 ++++++++++++++++---------------- 3 files changed, 114 insertions(+), 116 deletions(-) diff --git a/base/forms.py b/base/forms.py index 9592fa94..f700b699 100644 --- a/base/forms.py +++ b/base/forms.py @@ -141,7 +141,7 @@ def clean_off_troops(self): if not self.first_error_message: self.first_error_message = gettext_lazy( "Village in this line is duplicated: %(coord)s" - ) % {army.coord} + ) % {"coord": army.coord} self.add_error("off_troops", str(i)) continue diff --git a/locale/pl/LC_MESSAGES/django.mo b/locale/pl/LC_MESSAGES/django.mo index 2c9157d1893f11b2797e3c0c9d1d62411c681e32..ca7b3b7ad601c1363373bf122111d2c1569fbf1a 100644 GIT binary patch delta 10727 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 delta 10825 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 E0S8^2aR2}S diff --git a/locale/pl/LC_MESSAGES/django.po b/locale/pl/LC_MESSAGES/django.po index 95e2a714..ad436b72 100644 --- a/locale/pl/LC_MESSAGES/django.po +++ b/locale/pl/LC_MESSAGES/django.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-12-15 22:38+0100\n" +"POT-Creation-Date: 2025-02-03 20:35+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -47,20 +47,16 @@ msgstr "" msgid "Army collection" msgstr "Zbi贸rka Wojska" -#: base/forms.py:91 base/forms.py:179 +#: base/forms.py:91 base/forms.py:178 msgid "Text cannot be empty!" msgstr "Tekst nie mo偶e by膰 pusty!" -#: base/forms.py:118 base/forms.py:209 +#: base/forms.py:117 base/forms.py:207 #, python-format msgid "[coord: %(coord)s] - [world: %(world)s]: no such village" msgstr "[wioska: %(coord)s] - [艣wiat: %(world)s]: taka wioska nie istnieje!" -#: base/forms.py:121 base/forms.py:212 -msgid "coord" -msgstr "koord" - -#: base/forms.py:127 base/forms.py:218 +#: base/forms.py:125 base/forms.py:215 #, python-format msgid "" "[coord: %(coord)s] - [world: %(world)s] - [player: %(player)s] - [tribe: " @@ -69,51 +65,50 @@ msgstr "" "[wioska: %(coord)s] - [艣wiat: %(world)s] - [gracz: %(player)s] - [plemi臋: " "%(tribe)s]" -#: base/forms.py:145 base/forms.py:240 -#, python-format -msgid "Village in this line is duplicated: %s" -msgstr "Wioska w tej linii jest podwojona: %s" +#: base/forms.py:143 base/forms.py:237 +msgid "Village in this line is duplicated: %(coord)s" +msgstr "Wioska w tej linii jest podwojona: %(coord)s" -#: base/forms.py:161 base/models/outline.py:146 base/models/outline.py:320 +#: base/forms.py:160 base/models/outline.py:146 base/models/outline.py:320 #: base/models/profile.py:36 msgid "Deff collection " msgstr "Zbi贸rka Obrona" -#: base/forms.py:253 +#: base/forms.py:251 msgid "Ally tribe" msgstr "W艂asne plemiona" -#: base/forms.py:260 base/forms.py:276 +#: base/forms.py:258 base/forms.py:274 msgid "Select tribe from list" msgstr "Wybierz plemi臋 z listy" -#: base/forms.py:269 +#: base/forms.py:267 msgid "Enemy tribe" msgstr "Przeciwne plemiona" -#: base/forms.py:287 +#: base/forms.py:285 msgid "Radius" msgstr "Promie艅" -#: base/forms.py:290 +#: base/forms.py:288 msgid "Greater than or equal to 0 and less than or equal to 1000." msgstr "Wi臋ksza lub r贸wna 0 i mniejsza lub r贸wna 1000." -#: base/forms.py:298 +#: base/forms.py:296 msgid "Excluded enemy villages" msgstr "Wykluczone wysuni臋te wioski wroga" -#: base/forms.py:300 +#: base/forms.py:298 msgid "Exact coords separated by a space or an entry." msgstr "Dok艂adne kordy oddzielone spacj膮 lub enterem " -#: base/forms.py:324 base/templates/base/base.html:237 +#: base/forms.py:322 base/templates/base/base.html:237 #: base/templates/base/new_outline/new_outline_initial_period2.html:32 #: base/templates/base/new_outline/new_outline_initial_period2_1.html:17 msgid "Targets" msgstr "Cele" -#: base/forms.py:372 +#: base/forms.py:370 #, python-format msgid "" "You are trying to mantain more than %s targets in total - that is global " @@ -123,27 +118,27 @@ msgstr "" "mo偶liw膮 ilo艣膰 cel贸w aby chroni膰 stron臋 przed nadu偶yciami.
    Prosimy o " "zmniejszenie ilo艣ci cel贸w poni偶ej limitu lub kontakt z administracj膮." -#: base/forms.py:395 +#: base/forms.py:393 msgid "Min. off units number" msgstr "Minimalna liczba jednostek w offie" -#: base/forms.py:396 +#: base/forms.py:394 msgid "Max. off units number" msgstr "Maksymalna liczba jednostek w offie" -#: base/forms.py:398 +#: base/forms.py:396 msgid "Minimum distance from front line" msgstr "Minimalna odleg艂o艣膰 od linii frontu" -#: base/forms.py:400 +#: base/forms.py:398 msgid "Max Distance for nobles" msgstr "Maksymalna odleg艂o艣膰 dla szlachcic贸w" -#: base/forms.py:402 +#: base/forms.py:400 msgid "Max Distance for offs and ruins" msgstr "Maksymalna odleg艂o艣膰 dla off贸w (i burzak贸w)" -#: base/forms.py:407 +#: base/forms.py:405 msgid "" "Greater than or equal to 1 and less than or equal to 28000. Only offs above " "this value will be considered full offs and will be written out." @@ -151,7 +146,7 @@ msgstr "" "Wi臋ksza lub r贸wna 1 i mniejsza lub r贸wna 28000. Tylko offy powy偶ej tej " "wielko艣ci b臋d膮 uznane za pe艂ne offy i rozpisane" -#: base/forms.py:410 +#: base/forms.py:408 msgid "" "Defaults to 28000. Similar to minimum off units number, must be greater than " "it." @@ -159,7 +154,7 @@ msgstr "" "Domy艣lnie rozs膮dnie du偶e 28000. Podobna do minimalnej liczby jednostek w " "offie, ale musi by膰 wi臋ksza ni偶 ona." -#: base/forms.py:413 +#: base/forms.py:411 msgid "" "Greater than or equal to 0 and less than or equal to 500. Villages closer to " "the enemy than this value will be considered front-line and not written out " @@ -169,7 +164,7 @@ msgstr "" "najbli偶szego wroga od tej warto艣ci b臋d膮 uznane za frontowe i nie b臋d膮 " "domy艣lnie rozpisane" -#: base/forms.py:416 +#: base/forms.py:414 msgid "" "Greater than or equal to 0 and less than or equal to 1000. This is STRICT " "limit of distance for any OFF regardless of distance from the front line." @@ -178,16 +173,16 @@ msgstr "" "limit odleg艂o艣ci dla ka偶dego OFFA bez wzgl臋du na ustawienia dotycz膮ce frontu " "i odleg艂o艣ci od niego." -#: base/forms.py:421 +#: base/forms.py:419 msgid "Excluded enemy villages coords (secluded villages)" msgstr "" "Nieuwzgl臋dniane przy liczeniu frontowych off贸w wioski wroga (diody itp.)" -#: base/forms.py:425 +#: base/forms.py:423 msgid "Exact coords separated by a space or an entry" msgstr "Dok艂adne kordy oddzielone spacj膮 lub enterem " -#: base/forms.py:433 +#: base/forms.py:431 #, python-format msgid "" "Greater than or equal to 0 and less than or equal to your world maximum: " @@ -199,32 +194,32 @@ msgstr "" "ka偶dego SZLACHCICA bez wzgl臋du na ustawienia dotycz膮ce frontu i odleg艂o艣ci " "od niego." -#: base/forms.py:441 +#: base/forms.py:439 #, python-format msgid "Ensure this value is less than or equal to %(value)s." msgstr "Upewnij si臋, 偶e warto艣膰 jest mniejsza b膮d藕 r贸wna %(value)s." -#: base/forms.py:483 +#: base/forms.py:481 msgid "Show all hidden" msgstr "Poka偶 wszystkie ukryte" -#: base/forms.py:484 +#: base/forms.py:482 msgid "Title of message:" msgstr "Tytu艂 wiadomo艣ci" -#: base/forms.py:485 +#: base/forms.py:483 msgid "Content of message:" msgstr "Zawarto艣膰 wiadomo艣ci" -#: base/forms.py:486 base/forms.py:1046 +#: base/forms.py:484 base/forms.py:1044 msgid "Sending Options:" msgstr "Opcje wysy艂ki" -#: base/forms.py:487 base/forms.py:1047 +#: base/forms.py:485 base/forms.py:1045 msgid "Add links to direct messages:" msgstr "Linki do cel贸w w bezpo艣rednich wiadomo艣ciach:" -#: base/forms.py:491 +#: base/forms.py:489 #: base/templates/base/new_outline/new_outline_results.html:132 msgid "" "By checking this option, players will see the commands of all other players " @@ -235,11 +230,11 @@ msgstr "" "swoich celach. Domy艣lnie jest wy艂膮czona, czyli gracze widz膮 tylko swoje " "komendy." -#: base/forms.py:493 +#: base/forms.py:491 msgid "Title, maximum length 200." msgstr "Tytu艂, maksymalna d艂ugo艣膰 200." -#: base/forms.py:495 +#: base/forms.py:493 msgid "" "BBCode message, maximum length 2000. Hint: Format text in game and paste " "here." @@ -247,7 +242,7 @@ msgstr "" "BBCode tekst wiadomo艣ci, maksymalna d艂ugo艣膰 2000. Wskaz贸wka: Sformatuj " "wiadomo艣膰 w grze i nast臋pnie wklej j膮 tutaj." -#: base/forms.py:498 +#: base/forms.py:496 msgid "" "Directly messages will bahave poorly with many (more than 80-100) commands" msgstr "" @@ -255,22 +250,22 @@ msgstr "" "ilo艣ci rozkaz贸w (wi臋cej ni偶 80-100) z racji ogranicze艅 znak贸w w wiadomo艣ci w " "grze." -#: base/forms.py:501 +#: base/forms.py:499 msgid "" "If checked, direct messages from options above will have safe link to planer" msgstr "" "Je艣li opcja jest zaznaczona, bezpo艣rednie wiadomo艣ci b臋d膮 zawiera膰 " "indywidualny link do cel贸w graczy" -#: base/forms.py:511 +#: base/forms.py:509 msgid "Set sending option as default choice for next outlines" msgstr "Ustaw opcj臋 wysy艂ki wiadomo艣ci jako domy艣lna dla nast臋pnych rozpisek" -#: base/forms.py:523 +#: base/forms.py:521 msgid "Input type for planer" msgstr "Wykorzystywane dane dla zak艂adki Planer" -#: base/forms.py:527 base/templates/base/new_outline/new_outline.html:33 +#: base/forms.py:525 base/templates/base/new_outline/new_outline.html:33 msgid "" "Data for planer tab may be from Army or Defence tabs. Army - all troops " "(also that are outside of villages), Defence - only troops from villages." @@ -279,51 +274,51 @@ msgstr "" "Pierwsza bierze wszystkie jednostki (tak偶e spoza wiosek!) za艣 Zbi贸rka Obrona " "tylko te z wiosek." -#: base/forms.py:537 +#: base/forms.py:535 msgid "Set as default choice for next outlines" msgstr "Domy艣lny wyb贸r dla nast臋pnych rozpisek" -#: base/forms.py:548 +#: base/forms.py:546 msgid "Set new date" msgstr "Wybierz now膮 dat臋" -#: base/forms.py:606 +#: base/forms.py:604 msgid "Choose the default distance of the written offs:" msgstr "Wybierz domy艣lny dystans dla rozpisywanych off贸w:" -#: base/forms.py:609 +#: base/forms.py:607 msgid "Choose the default distance of the written nobles:" msgstr "Wybierz domy艣lny dystans dla rozpisywanych szlachcic贸w:" -#: base/forms.py:611 +#: base/forms.py:609 msgid "Choose how to split offs with nobles:" msgstr "Wybierz jak powinny by膰 dzielone offy z szlachciami:" -#: base/forms.py:613 +#: base/forms.py:611 msgid "Choose prefered way of writing required nobles:" msgstr "Wybierz preferowany spos贸b rozpisywania wymaganych szlachic贸w:" -#: base/forms.py:616 +#: base/forms.py:614 msgid "Choose how noble commands should be written out:" msgstr "Wybierz jak komendy z wiosek z szlacht膮 powinny by膰聽rozpisane:" -#: base/forms.py:619 +#: base/forms.py:617 msgid "Maximum number of fakes from one off village:" msgstr "Maksymalna ilo艣膰 fejk taran贸w z jednej wioski:" -#: base/forms.py:622 +#: base/forms.py:620 msgid "Determine which villages to write fake attacks from:" msgstr "Wybierz z jakich wiosek rozpisywa膰 fejki:" -#: base/forms.py:625 +#: base/forms.py:623 msgid "Max. number of nobles send per village:" msgstr "Maksymalna ilo艣膰 szlachcic贸w z jednej wioski:" -#: base/forms.py:628 +#: base/forms.py:626 msgid "Min. off units for every noble" msgstr "Min. liczba jednostek w obstawie ka偶dego szlachcica" -#: base/forms.py:633 +#: base/forms.py:631 msgid "" "For 4 nobles in village, first option would try to send them all 4x " "on target X, second would randomly send from 1 to 4 nobles to single target " @@ -335,7 +330,7 @@ msgstr "" "lub wiele cel贸w (w ramach potrzeb), ostatnia za艣 wy艣le po 1 na cele X1,X2,X3," "X4 (offoszlachty)." -#: base/forms.py:636 +#: base/forms.py:634 msgid "" "For 20000 troops and 4 nobles in village, first option would try to use 4 x " "5000, second 1 x 19700 + 3 x 100, and last 4 x 100, where 100 can be changed " @@ -345,7 +340,7 @@ msgstr "" "druga 1 x 19700 + 3 x 100, ostatnia za艣 4 x 100, gdzie \"100\" mo偶e by膰 " "zmienione w opcji \"Min. liczba jednostek w obstawie ka偶dego szlachcica\"." -#: base/forms.py:639 +#: base/forms.py:637 msgid "" "Defaults to 16. Between 1 and 250. For example you may want only 4 nobles " "from single village or even 1 (with full off). Best works with \"Min. off " @@ -355,7 +350,7 @@ msgstr "" "szlachic贸w z jednej wioski (nawet je艣li jest ich tam wi臋cej), lub nawet " "tylko 1-2 co wymusi pe艂n膮 lub po艂ow臋 obstawy (przy dzieleniu offa). " -#: base/forms.py:645 +#: base/forms.py:643 msgid "" "Defaults to just 100. Must be between 0 and 28000. This is strict minimum so " "if village have nobles, but not enough off units, Planer won't use it. Use " @@ -366,64 +361,64 @@ msgstr "" "planer nie u偶yje jej! Nale偶y u偶ywa膰 ostro偶nie poniewa偶 mo偶e drastycznie " "zmieni膰 rozpisk臋 i dzia艂anie innych opcji." -#: base/forms.py:668 +#: base/forms.py:666 msgid "MIN number of catapults in one ruin attack:" msgstr "MIN liczba katapult w ka偶dym burzaku:" -#: base/forms.py:671 +#: base/forms.py:669 msgid "MAX number of catapults in one ruin attack:" msgstr "MAX liczba katapult w ka偶dym burzaku:" -#: base/forms.py:674 +#: base/forms.py:672 msgid "Number of catapults that will always be left in full offs:" msgstr "Liczba katapult, kt贸ra zawsze pozostanie w pe艂nych offach:" -#: base/forms.py:677 +#: base/forms.py:675 msgid "How many points on average do demolished targets have:" msgstr "Jak du偶o punkt贸w maj膮 艣rednio burzone cele:" -#: base/forms.py:691 +#: base/forms.py:689 msgid "Only attackers ABOVE this morale value can be used:" msgstr "Tylko atakuj膮cy POWY呕EJ tej warto艣ci morale mog膮 zosta膰 rozpisani" -#: base/forms.py:693 +#: base/forms.py:691 msgid "Is morale calculation active in this outline:" msgstr "Bierz pod uwag臋 morale w tej rozpisce" -#: base/forms.py:731 +#: base/forms.py:729 msgid "Choose whether to avoid the night bonus" msgstr "Wybierz czy wysy艂ki powinny omija膰 bonus nocny" -#: base/forms.py:737 +#: base/forms.py:735 msgid "Approximate hours of entry" msgstr "Przybli偶one czasy wej艣cia akcji" -#: base/forms.py:744 +#: base/forms.py:742 msgid "Approximate hours of the last entry" msgstr "Przybli偶one ostatnie czasy wej艣cia akcji" -#: base/forms.py:757 +#: base/forms.py:755 msgid "First value must be less or equal to second!" msgstr "Pierwsza godzina musi by膰 mniejsza lub r贸wna drugiej!" -#: base/forms.py:768 +#: base/forms.py:766 msgid "Sum of off" msgstr "Suma ca艂ego offa" -#: base/forms.py:774 +#: base/forms.py:772 msgid "Off without catapults" msgstr "Off bez katapult" -#: base/forms.py:780 +#: base/forms.py:778 #: base/templates/base/new_outline/new_outline_initial_period1.html:190 msgid "Catapults" msgstr "Katapulty" -#: base/forms.py:786 base/models/period_model.py:34 +#: base/forms.py:784 base/models/period_model.py:34 msgid "Noble" msgstr "Szlachcic" -#: base/forms.py:796 base/forms.py:807 +#: base/forms.py:794 base/forms.py:805 #: base/templates/base/new_outline/new_outline_initial_period2_1.html:101 #: base/templates/base/new_outline/new_outline_initial_period2_1.html:168 #: base/templates/base/new_outline/new_outline_initial_period2_1.html:210 @@ -431,7 +426,7 @@ msgstr "Szlachcic" msgid "From" msgstr "Od" -#: base/forms.py:799 base/forms.py:808 +#: base/forms.py:797 base/forms.py:806 #: base/templates/base/new_outline/new_outline_initial_period2_1.html:102 #: base/templates/base/new_outline/new_outline_initial_period2_1.html:169 #: base/templates/base/new_outline/new_outline_initial_period2_1.html:211 @@ -439,7 +434,7 @@ msgstr "Od" msgid "To" msgstr "Do" -#: base/forms.py:806 +#: base/forms.py:804 #: base/templates/base/new_outline/new_outline_initial_period2_1.html:97 #: base/templates/base/new_outline/new_outline_initial_period2_1.html:163 #: base/templates/base/new_outline/new_outline_initial_period2_1.html:205 @@ -447,7 +442,7 @@ msgstr "Do" msgid "Mode" msgstr "Tryb" -#: base/forms.py:809 +#: base/forms.py:807 #: base/templates/base/new_outline/new_outline_initial_period2_1.html:98 #: base/templates/base/new_outline/new_outline_initial_period2_1.html:165 #: base/templates/base/new_outline/new_outline_initial_period2_1.html:207 @@ -455,7 +450,7 @@ msgstr "Tryb" msgid "Unit" msgstr "Jednostka" -#: base/forms.py:810 +#: base/forms.py:808 #: base/templates/base/new_outline/new_outline_initial_period2_1.html:99 #: base/templates/base/new_outline/new_outline_initial_period2_1.html:170 #: base/templates/base/new_outline/new_outline_initial_period2_1.html:212 @@ -463,7 +458,7 @@ msgstr "Jednostka" msgid "Min. time" msgstr "Min. czas" -#: base/forms.py:811 +#: base/forms.py:809 #: base/templates/base/new_outline/new_outline_initial_period2_1.html:100 #: base/templates/base/new_outline/new_outline_initial_period2_1.html:171 #: base/templates/base/new_outline/new_outline_initial_period2_1.html:213 @@ -471,23 +466,23 @@ msgstr "Min. czas" msgid "Max. time" msgstr "Max. czas" -#: base/forms.py:887 base/forms.py:897 +#: base/forms.py:885 base/forms.py:895 msgid "Mode All can be used only once per unit" msgstr "Tryb Wszystkie mo偶e by膰 u偶yty tylko raz dla obu jednostek" -#: base/forms.py:905 +#: base/forms.py:903 msgid "Mode All must be used at least once for noble and for off." msgstr "Tryb Wszystkie musi by膰 u偶yty dok艂adnie raz dla szlachty oraz taran贸w." -#: base/forms.py:945 +#: base/forms.py:943 msgid "You need a premium account to add more targets here." msgstr "Potrzebujesz konta premium by dodawa膰 cele w tym miejscu." -#: base/forms.py:955 +#: base/forms.py:953 msgid "Village with that coords did not found." msgstr "Wioska o podanych kordach nie istnieje." -#: base/forms.py:962 +#: base/forms.py:960 msgid "" "Found more than one village in database, this is the bug. Write me: " @@ -495,48 +490,48 @@ msgstr "" "Znaleziono wi臋cej ni偶 1 wiosk臋 w bazie, jest to b艂膮d. Napisz do mnie: " -#: base/forms.py:974 +#: base/forms.py:972 msgid "Choose server" msgstr "Wybierz serwer" -#: base/forms.py:975 +#: base/forms.py:973 msgid "World prefix" msgstr "Przedrostek 艣wiata" -#: base/forms.py:986 +#: base/forms.py:984 msgid "Unallowed symbols in postfix field! Are you sure it is valid?" msgstr "Niedozwolone znaki w podanym przedrostku, sprwad藕 jego poprawno艣膰" -#: base/forms.py:1008 +#: base/forms.py:1006 msgid "Connection error, world does not exists or is archived!" msgstr "B艂膮d po艂膮czenia, 艣wiat nie istnieje lub jest archiwalny!" -#: base/forms.py:1012 +#: base/forms.py:1010 msgid "World is already added!" msgstr "Ten 艣wiat ju偶 zosta艂 dodany!" -#: base/forms.py:1024 base/forms.py:1040 +#: base/forms.py:1022 base/forms.py:1038 msgid "Please select your server:" msgstr "Ustaw sw贸j serwer:" -#: base/forms.py:1042 +#: base/forms.py:1040 msgid "Turn on morale calculations in every outline by default:" msgstr "" "W艂膮cz domy艣ln膮 obs艂ug臋 morali dla ka偶dej nowej rozpiski (domy艣lnie wy艂膮czone)" -#: base/forms.py:1044 +#: base/forms.py:1042 msgid "Default input type for planer" msgstr "Wybierz typ danych dla planera" -#: base/forms.py:1045 +#: base/forms.py:1043 msgid "Please select your currency:" msgstr "Ustaw swoj膮 walut臋 p艂atno艣ci:" -#: base/forms.py:1050 +#: base/forms.py:1048 msgid "Prefered sending option in Results tab" msgstr "Preferowana opcja wysy艂ki wiadomo艣ci w zak艂adce Wyniki" -#: base/forms.py:1052 +#: base/forms.py:1050 msgid "" "If checked, direct messages in Results tab will have safe link to planer" msgstr "" @@ -2224,11 +2219,11 @@ msgstr "Plemiona Planer jest najlepszy" msgid "Old Text extended" msgstr "Stary tekst rozszerzony" -#: base/templates/base/overview.html:105 utils/basic/table_text.py:257 +#: base/templates/base/overview.html:105 utils/basic/table_text.py:255 msgid "from village" msgstr "z wioski" -#: base/templates/base/overview.html:105 utils/basic/table_text.py:258 +#: base/templates/base/overview.html:105 utils/basic/table_text.py:256 msgid "to " msgstr "na " @@ -3079,19 +3074,19 @@ msgstr "Wy艣lij burzak" msgid "Send NOBLE" msgstr "Wy艣lij SZLACHCIC" -#: utils/basic/table_text.py:129 +#: utils/basic/table_text.py:127 msgid "fake noble" msgstr "fake gruby" -#: utils/basic/table_text.py:131 +#: utils/basic/table_text.py:129 msgid "fake" msgstr "fake" -#: utils/basic/table_text.py:133 +#: utils/basic/table_text.py:131 msgid "Catapults-" msgstr "Katapulty-" -#: utils/basic/table_text.py:186 +#: utils/basic/table_text.py:184 #, python-format msgid "" "[b][color=#00a500]Send FAKE NOBLE[%(noble_number)s noble][/color] " @@ -3110,7 +3105,7 @@ msgstr "" "village=%(ally_id)s&screen=place&target=%(enemy_id)s%(deputy_link_part)s]Wy艣lij " "FEJK SZLACHCIC[/url]" -#: utils/basic/table_text.py:198 +#: utils/basic/table_text.py:196 #, python-format msgid "" "[b][color=#00a500]Send FAKE[%(off_number)s off][/color] (%(weight_count)s of " @@ -3129,7 +3124,7 @@ msgstr "" "village=%(ally_id)s&screen=place&target=%(enemy_id)s%(deputy_link_part)s]Wy艣lij " "FEJK[/url]" -#: utils/basic/table_text.py:210 +#: utils/basic/table_text.py:208 #, python-format msgid "" "[b][color=#0e0eff]Send RUIN[%(catapults_number)sc on %(building)s][/color] " @@ -3148,7 +3143,7 @@ msgstr "" "village=%(ally_id)s&screen=place&target=%(enemy_id)s%(deputy_link_part)s]Wy艣lij " "BURZAK[/url]" -#: utils/basic/table_text.py:223 +#: utils/basic/table_text.py:221 #, python-format msgid "" "[b][color=#a500a5]Send NOBLE[%(off_number)s off + %(noble_number)s noble][/" @@ -3167,7 +3162,7 @@ msgstr "" "village=%(ally_id)s&screen=place&target=%(enemy_id)s%(deputy_link_part)s]Wy艣lij " "SZLACHCIC[/url]" -#: utils/basic/table_text.py:236 +#: utils/basic/table_text.py:234 #, python-format msgid "" "[b][color=#a50000]Send OFF[%(off_number)s off][/color] (%(weight_count)s of " @@ -3186,27 +3181,27 @@ msgstr "" "village=%(ally_id)s&screen=place&target=%(enemy_id)s%(deputy_link_part)s]Wy艣lij " "OFF[/url]" -#: utils/basic/table_text.py:256 +#: utils/basic/table_text.py:254 msgid "Nobles-" msgstr "Szlachcice-" -#: utils/basic/table_text.py:260 +#: utils/basic/table_text.py:258 msgid "[color=#00a500][b]Send fake noble[/b][/color] (1 noble)" msgstr "[color=#00a500][b]Wy艣lij fejk szlachcic[/b][/color] (1 szlachcic)" -#: utils/basic/table_text.py:263 +#: utils/basic/table_text.py:261 msgid "[color=#00a500][b]Send fake[/b][/color]" msgstr "[color=#00a500][b]Wy艣lij fejk[/b][/color]" -#: utils/basic/table_text.py:266 +#: utils/basic/table_text.py:264 msgid "[color=#0e0eff][b]Ruin[/b][/color] (Catapults-" msgstr "[color=#0e0eff][b]Burzak[/b][/color] (Katapulty-" -#: utils/basic/table_text.py:273 +#: utils/basic/table_text.py:271 msgid "[size=12][b]OFF[/b][/size] (Off-" msgstr "[size=12][b]OFF[/b][/size] (Off-" -#: utils/basic/table_text.py:276 +#: utils/basic/table_text.py:274 msgid "[color=#a500a5][size=12][b]NOBLE[/b][/size][/color]" msgstr "[color=#a500a5][size=12][b]SZLACHCIC[/b][/size][/color]" @@ -3247,6 +3242,9 @@ msgstr "Wioska" msgid "does not exists" msgstr "nie istnieje" +#~ msgid "coord" +#~ msgstr "koord" + #~ msgid "never" #~ msgstr "nigdy" From 1b3c31eef110382c0e1ab82aa404b58c34e364f3 Mon Sep 17 00:00:00 2001 From: rafsaf Date: Mon, 3 Feb 2025 20:41:55 +0100 Subject: [PATCH 5/6] update test Signed-off-by: rafsaf --- rest_api/tests/test_public_outline_overview.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rest_api/tests/test_public_outline_overview.py b/rest_api/tests/test_public_outline_overview.py index ed3908ea..df92d926 100644 --- a/rest_api/tests/test_public_outline_overview.py +++ b/rest_api/tests/test_public_outline_overview.py @@ -33,11 +33,11 @@ def test_public_outline_overview___404_invalid_token(self): response = self.client.get(f"{PATH}?token=wrong") assert response.status_code == 404 - def test_public_outline_overview___400_invalid_data_in_db(self): + def test_public_outline_overview___500_invalid_data_in_db(self): PATH = reverse("rest_api:public_outline_overview") overview = self.create_overview(self.get_outline()) overview.outline_overview.targets_json = "{}" overview.outline_overview.weights_json = "{}" overview.outline_overview.save() response = self.client.get(f"{PATH}?token={overview.token}") - assert response.status_code == 400 + assert response.status_code == 500 From 567e2623c88fc80f62923dad00f23b89fc1549a9 Mon Sep 17 00:00:00 2001 From: rafsaf Date: Mon, 3 Feb 2025 20:45:04 +0100 Subject: [PATCH 6/6] run make trans Signed-off-by: rafsaf --- locale/pl/LC_MESSAGES/django.mo | Bin 67322 -> 67429 bytes locale/pl/LC_MESSAGES/django.po | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/locale/pl/LC_MESSAGES/django.mo b/locale/pl/LC_MESSAGES/django.mo index ca7b3b7ad601c1363373bf122111d2c1569fbf1a..16798a1faafa4b2158f978de70679f7a2086a9ee 100644 GIT binary patch delta 10808 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 delta 10716 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 S)UKfWtG!1ST)aEE?Ee7s%yJC? diff --git a/locale/pl/LC_MESSAGES/django.po b/locale/pl/LC_MESSAGES/django.po index ad436b72..78dd11eb 100644 --- a/locale/pl/LC_MESSAGES/django.po +++ b/locale/pl/LC_MESSAGES/django.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-02-03 20:35+0100\n" +"POT-Creation-Date: 2025-02-03 20:44+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -66,6 +66,7 @@ msgstr "" "%(tribe)s]" #: base/forms.py:143 base/forms.py:237 +#, python-format msgid "Village in this line is duplicated: %(coord)s" msgstr "Wioska w tej linii jest podwojona: %(coord)s"