Compare commits

..
44 Commits
Author SHA1 Message Date
Herculino Trotta 53ed0d791a Merge pull request #589 from eitchtee/weblate
Translations update from Weblate
2026-08-16 19:03:53 -03:00
Herculino Trotta 5147d939ef locale(Portuguese (Brazil)): update translation
Currently translated at 100.0% (785 of 785 strings)

Translation: WYGIWYH/App
Translate-URL: https://translations.herculino.com/projects/wygiwyh/app/pt_BR/
2026-08-16 22:03:32 +00:00
eitchtee 716bd6f57f chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-08-16 04:46:49 +00:00
Herculino Trotta ded4cb37d5 Merge pull request #588 from eitchtee/feat/filter-presets
feat(transactions): add filter presets
2026-08-16 01:46:18 -03:00
Herculino Trotta cd48edddab feat(transactions): add htmx filter presets 2026-08-16 01:40:11 -03:00
Herculino Trotta 9e135560fe feat(transactions): add filter preset model 2026-08-16 01:40:03 -03:00
eitchtee bdbccdec16 chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-08-15 18:12:40 +00:00
Herculino Trotta 907c511b59 Merge pull request #587
feat(dca): add chart zoom navigation
2026-08-15 15:12:14 -03:00
Herculino Trotta 33f0904a0f feat(dca): add chart zoom navigation 2026-08-15 15:10:10 -03:00
eitchtee 1c4f23a69e chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-08-15 17:43:26 +00:00
Herculino Trotta 8373732964 Merge pull request #586
Add consolidated currency chart lines
2026-08-15 14:42:54 -03:00
Herculino Trotta 8e09f3e8d8 feat(net-worth): add consolidated chart lines 2026-08-15 14:36:13 -03:00
Herculino Trotta 1516fe0281 Merge pull request #585
fix(tools:calculator): prevent close button from drifiting to the right
2026-08-15 11:41:44 -03:00
Herculino Trotta 3bd16602a0 fix(tools:calculator): prevent close button from drifiting to the right 2026-08-15 11:41:15 -03:00
Herculino Trotta 83c2b599d7 Merge pull request #584
fix(docker:dev): handle CRLF endings on vite entrypoint
2026-08-15 01:32:50 -03:00
Herculino Trotta f9eab3ce17 fix(docker:dev): handle CRLF endings on vite entrypoint 2026-08-15 01:32:02 -03:00
Herculino Trotta 62a33ddd2c Merge pull request #583
feat(monthly): show asset accounts/currencies on specific sumaries
2026-08-15 01:31:30 -03:00
Herculino Trotta ea3e9fd68f feat(monthly): show asset accounts/currencies on specific sumaries 2026-08-15 01:30:57 -03:00
Herculino Trotta d71bf3ccb3 Merge pull request #570 from eitchtee/dependabot/npm_and_yarn/frontend/immutable-5.1.9
build(deps): bump immutable from 5.1.6 to 5.1.9 in /frontend
2026-08-13 00:05:53 -03:00
Herculino Trotta 350d78356c Merge pull request #576 from eitchtee/dependabot/npm_and_yarn/frontend/postcss-8.5.26
build(deps): bump postcss from 8.5.15 to 8.5.26 in /frontend
2026-08-13 00:04:37 -03:00
Herculino Trotta 91dfba519c Merge branch 'main' into dependabot/npm_and_yarn/frontend/postcss-8.5.26 2026-08-13 00:04:24 -03:00
Herculino Trotta 0c9b41182b Merge pull request #575 from eitchtee/dependabot/uv/cryptography-50.0.0
build(deps): bump cryptography from 48.0.1 to 50.0.0
2026-08-13 00:03:51 -03:00
Herculino Trotta 7a900908dd Merge pull request #578 from eitchtee/dependabot/uv/django-5.2.16
build(deps): bump django from 5.2.15 to 5.2.16
2026-08-13 00:03:28 -03:00
Herculino Trotta dcd52ec189 Merge pull request #580 from eitchtee/dependabot/npm_and_yarn/frontend/nanoid-3.3.18
build(deps): bump nanoid from 3.3.12 to 3.3.18 in /frontend
2026-08-13 00:03:18 -03:00
Herculino Trotta 93e73b9aa6 Merge pull request #582 from eitchtee/dependabot/uv/tablib-3.10.0
build(deps): bump tablib from 3.9.0 to 3.10.0
2026-08-13 00:03:02 -03:00
eitchtee 7947d5f874 chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-08-13 03:01:16 +00:00
Herculino Trotta 2ab6621205 Merge pull request #581 from obervinov/fix/recurring-tags-scheduler
fix: recurring tags and entities dropped when generated for another user
2026-08-13 00:00:48 -03:00
Herculino Trotta 39c15eedec Merge pull request #579 from eitchtee/weblate
Translations update from Weblate
2026-08-12 23:59:05 -03:00
dependabot[bot] 6dcf5a63f8 build(deps): bump tablib from 3.9.0 to 3.10.0
Bumps [tablib](https://github.com/jazzband/tablib) from 3.9.0 to 3.10.0.
- [Release notes](https://github.com/jazzband/tablib/releases)
- [Changelog](https://github.com/jazzband/tablib/blob/master/HISTORY.md)
- [Commits](https://github.com/jazzband/tablib/compare/v3.9.0...v3.10.0)

---
updated-dependencies:
- dependency-name: tablib
  dependency-version: 3.10.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-12 19:48:53 +00:00
obervinov 11a6b3faa6 fix(transactions): recurring tags and entities dropped when generated for another user 2026-08-12 22:33:01 +04:00
dependabot[bot] 9b1312b744 build(deps): bump nanoid from 3.3.12 to 3.3.18 in /frontend
Bumps [nanoid](https://github.com/ai/nanoid) from 3.3.12 to 3.3.18.
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/3.3.18/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/3.3.12...3.3.18)

---
updated-dependencies:
- dependency-name: nanoid
  dependency-version: 3.3.18
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-11 23:14:09 +00:00
GitEbu 72707f46e6 locale(German): update translation
Currently translated at 86.2% (670 of 777 strings)

Translation: WYGIWYH/App
Translate-URL: https://translations.herculino.com/projects/wygiwyh/app/de/
2026-08-10 12:57:27 +00:00
dependabot[bot] cf908ae87e build(deps): bump django from 5.2.15 to 5.2.16
Bumps [django](https://github.com/django/django) from 5.2.15 to 5.2.16.
- [Commits](https://github.com/django/django/compare/5.2.15...5.2.16)

---
updated-dependencies:
- dependency-name: django
  dependency-version: 5.2.16
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-10 03:07:57 +00:00
dependabot[bot] b145d10fbd build(deps): bump postcss from 8.5.15 to 8.5.26 in /frontend
Bumps [postcss](https://github.com/postcss/postcss) from 8.5.15 to 8.5.26.
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/8.5.15...8.5.26)

---
updated-dependencies:
- dependency-name: postcss
  dependency-version: 8.5.26
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-07 07:51:02 +00:00
dependabot[bot] ee39dcf9ef build(deps): bump cryptography from 48.0.1 to 50.0.0
Bumps [cryptography](https://github.com/pyca/cryptography) from 48.0.1 to 50.0.0.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/48.0.1...50.0.0)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-version: 50.0.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-05 03:39:39 +00:00
dependabot[bot] 5d330ddfbf build(deps): bump immutable from 5.1.6 to 5.1.9 in /frontend
Bumps [immutable](https://github.com/immutable-js/immutable-js) from 5.1.6 to 5.1.9.
- [Release notes](https://github.com/immutable-js/immutable-js/releases)
- [Changelog](https://github.com/immutable-js/immutable-js/blob/main/CHANGELOG.md)
- [Commits](https://github.com/immutable-js/immutable-js/compare/v5.1.6...v5.1.9)

---
updated-dependencies:
- dependency-name: immutable
  dependency-version: 5.1.9
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-24 06:23:28 +00:00
eitchtee 14011c2f60 chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-07-18 18:43:53 +00:00
Herculino Trotta a25adafe3b Merge pull request #568
feat(automatic-exchange-rates): Add Yahoo Finance as a provider via yfinance
2026-07-18 15:43:28 -03:00
Herculino Trotta 743951a862 feat(automatic-exchange-rates): Add Yahoo Finance as a provider via yfinance 2026-07-18 15:42:51 -03:00
Herculino Trotta 74d3d5fcf9 Merge pull request #567
feat(docker:dev): npm dependencies are installed when container starts
2026-07-17 21:30:29 -03:00
Herculino Trotta 75f23168ab feat(docker:dev): npm dependencies are installed when container starts 2026-07-17 21:29:45 -03:00
eitchtee 0ec1c5c063 chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-07-18 00:29:20 +00:00
Herculino Trotta e69d5fbd7a Merge pull request #566 from eitchtee/feat/cuelume
feat: replace mp3 sounds with cuelume; deprecate volume setting
2026-07-17 21:28:54 -03:00
Herculino Trotta 5a80a3b1d3 feat: replace mp3 sounds with cuelume; deprecate volume setting 2026-07-17 21:28:13 -03:00
53 changed files with 4817 additions and 2789 deletions
@@ -17,6 +17,7 @@ PROVIDER_MAPPING = {
"frankfurter": providers.FrankfurterProvider,
"twelvedata": providers.TwelveDataProvider,
"twelvedatamarkets": providers.TwelveDataMarketsProvider,
"yfinance": providers.YFinanceMarketsProvider,
}
@@ -503,3 +503,82 @@ class TwelveDataMarketsProvider(ExchangeRateProvider):
)
return results
class YFinanceMarketsProvider(ExchangeRateProvider):
"""Fetch market prices for Yahoo Finance symbols using yfinance.
Currency codes are passed to Yahoo Finance verbatim. For example, use
``PETR4.SA`` for Petrobras on B3 or ``AAPL`` for Apple. The configured
exchange currency is treated as the currency of the Yahoo quote.
"""
rates_inverted = True
def __init__(self, api_key: str = None, ticker_factory=None):
super().__init__(api_key)
self._ticker_factory = ticker_factory
@classmethod
def requires_api_key(cls) -> bool:
return False
def _get_ticker_factory(self):
if self._ticker_factory is None:
try:
import yfinance as yf
except ImportError as exc:
raise RuntimeError(
"The yfinance package is required for the Yahoo Finance provider."
) from exc
self._ticker_factory = yf.Ticker
return self._ticker_factory
def get_rates(
self, target_currencies: QuerySet, exchange_currencies: set
) -> List[Tuple[Currency, Currency, Decimal]]:
results = []
ticker_factory = self._get_ticker_factory()
for asset in target_currencies:
exchange_currency = asset.exchange_currency
if exchange_currency not in exchange_currencies:
continue
try:
history = ticker_factory(asset.code).history(
period="5d", interval="1h", auto_adjust=False
)
if history is None or history.empty:
logger.warning(
"YFinanceMarkets: no history returned for %s", asset.code
)
continue
try:
latest_close = history["Close"].dropna().iloc[-1]
except (IndexError, KeyError, TypeError):
logger.warning(
"YFinanceMarkets: no close price returned for %s", asset.code
)
continue
rate = Decimal(str(latest_close))
if not rate.is_finite() or rate <= 0:
logger.warning(
"YFinanceMarkets: invalid close price %r for %s",
latest_close,
asset.code,
)
continue
results.append((exchange_currency, asset, rate))
except Exception as exc:
logger.error(
"YFinanceMarkets: error fetching %s: %s", asset.code, exc
)
return results
@@ -0,0 +1,30 @@
# Generated by Django 5.2.15 on 2026-07-18 17:26
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("currencies", "0023_add_failure_count"),
]
operations = [
migrations.AlterField(
model_name="exchangerateservice",
name="service_type",
field=models.CharField(
choices=[
("coingecko_free", "CoinGecko (Demo/Free)"),
("coingecko_pro", "CoinGecko (Pro)"),
("transitive", "Transitive (Calculated from Existing Rates)"),
("frankfurter", "Frankfurter"),
("twelvedata", "TwelveData"),
("twelvedatamarkets", "TwelveData Markets"),
("yfinance", "Yahoo Finance"),
],
max_length=255,
verbose_name="Service Type",
),
),
]
+1
View File
@@ -105,6 +105,7 @@ class ExchangeRateService(models.Model):
FRANKFURTER = "frankfurter", "Frankfurter"
TWELVEDATA = "twelvedata", "TwelveData"
TWELVEDATA_MARKETS = "twelvedatamarkets", "TwelveData Markets"
YFINANCE = "yfinance", "Yahoo Finance"
class IntervalType(models.TextChoices):
ON = "on", _("On")
@@ -0,0 +1,93 @@
from decimal import Decimal
from unittest import TestCase
from apps.currencies.exchange_rates.fetcher import PROVIDER_MAPPING
from apps.currencies.exchange_rates.providers import YFinanceMarketsProvider
from apps.currencies.models import ExchangeRateService
class _FakeSeries:
def __init__(self, values):
self._values = values
def dropna(self):
return _FakeSeries([value for value in self._values if value is not None])
@property
def iloc(self):
return self
def __getitem__(self, index):
return self._values[index]
class _FakeHistory:
def __init__(self, close_values):
self._close_values = close_values
self.empty = not close_values
def __getitem__(self, field):
if field != "Close":
raise KeyError(field)
return _FakeSeries(self._close_values)
class _FakeCurrency:
def __init__(self, code, exchange_currency=None):
self.code = code
self.exchange_currency = exchange_currency
class _FakeTicker:
def __init__(self, history):
self.history_result = history
self.history_kwargs = None
def history(self, **kwargs):
self.history_kwargs = kwargs
return self.history_result
class YFinanceMarketsProviderTests(TestCase):
def setUp(self):
self.brl = _FakeCurrency("BRL")
self.asset = _FakeCurrency("AAPL", exchange_currency=self.brl)
def test_returns_latest_hourly_close_using_symbol_verbatim(self):
ticker = _FakeTicker(_FakeHistory([36.90, None, 37.42]))
requested_symbols = []
def ticker_factory(symbol):
requested_symbols.append(symbol)
return ticker
provider = YFinanceMarketsProvider(ticker_factory=ticker_factory)
rates = provider.get_rates([self.asset], {self.brl})
self.assertEqual(rates, [(self.brl, self.asset, Decimal("37.42"))])
self.assertEqual(requested_symbols, ["AAPL"])
self.assertEqual(
ticker.history_kwargs,
{"period": "5d", "interval": "1h", "auto_adjust": False},
)
def test_passes_brazilian_symbol_verbatim_and_skips_empty_history(self):
self.asset.code = "PETR4.SA"
ticker = _FakeTicker(_FakeHistory([]))
requested_symbols = []
provider = YFinanceMarketsProvider(
ticker_factory=lambda symbol: requested_symbols.append(symbol)
or ticker
)
rates = provider.get_rates([self.asset], {self.brl})
self.assertEqual(rates, [])
self.assertEqual(requested_symbols, ["PETR4.SA"])
def test_is_registered_without_an_api_key(self):
self.assertFalse(YFinanceMarketsProvider.requires_api_key())
self.assertIs(PROVIDER_MAPPING["yfinance"], YFinanceMarketsProvider)
self.assertEqual(ExchangeRateService.ServiceType.YFINANCE, "yfinance")
@@ -107,6 +107,25 @@ class MonthlySummaryFilterBehaviorTests(TestCase):
return data
return None
def _create_asset_income(self):
asset_account = Account.objects.create(
name="Asset Account",
group=self.account_group,
currency=self.currency,
is_asset=True,
)
Transaction.objects.create(
account=asset_account,
type=Transaction.Type.INCOME,
is_paid=True,
date=date(2025, 12, 25),
reference_date=date(2025, 12, 1),
amount=Decimal("50.00"),
description="Asset Income",
owner=self.user,
)
return asset_account
# --- monthly_summary view tests ---
def test_monthly_summary_no_filter_returns_200(self):
@@ -304,6 +323,15 @@ class MonthlySummaryFilterBehaviorTests(TestCase):
)
self.assertEqual(response.status_code, 200)
def test_monthly_account_summary_includes_asset_accounts(self):
asset_account = self._create_asset_income()
response = self.client.get(
"/monthly/12/2025/summary/accounts/",
HTTP_HX_REQUEST="true",
)
self.assertIn(asset_account.id, response.context["account_data"])
def test_monthly_account_summary_with_filter_returns_200(self):
"""Test that monthly_account_summary returns 200 with filter"""
response = self.client.get(
@@ -322,6 +350,16 @@ class MonthlySummaryFilterBehaviorTests(TestCase):
)
self.assertEqual(response.status_code, 200)
def test_monthly_currency_summary_includes_asset_account_transactions(self):
self._create_asset_income()
response = self.client.get(
"/monthly/12/2025/summary/currencies/",
HTTP_HX_REQUEST="true",
)
usd_data = self._get_currency_data(response.context["currency_data"])
self.assertEqual(usd_data["income_current"], Decimal("1050.00"))
def test_monthly_currency_summary_with_filter_returns_200(self):
"""Test that monthly_currency_summary returns 200 with filter"""
response = self.client.get(
+3 -3
View File
@@ -14,7 +14,7 @@ from apps.monthly_overview.utils.daily_spending_allowance import (
calculate_daily_allowance_currency,
)
from apps.transactions.filters import TransactionsFilter
from apps.transactions.models import Transaction
from apps.transactions.models import FilterPreset, Transaction
from apps.transactions.utils.calculations import (
calculate_currency_totals,
calculate_percentage_distribution,
@@ -58,6 +58,8 @@ def monthly_overview(request, month: int, year: int):
"previous_month": previous_month,
"previous_year": previous_year,
"filter": f,
"filter_is_active": f.has_active_filters,
"filter_presets": FilterPreset.objects.filter(owner=request.user),
"order": order,
"summary_tab": summary_tab,
},
@@ -226,7 +228,6 @@ def monthly_account_summary(request, month: int, year: int):
Q(Q(category__mute=True) & ~Q(category=None)) | Q(mute=True)
)
.exclude(account__in=request.user.untracked_accounts.all())
.exclude(account__is_asset=True)
)
account_data = calculate_account_totals(transactions_queryset=queryset.all())
@@ -280,7 +281,6 @@ def monthly_currency_summary(request, month: int, year: int):
Q(Q(category__mute=True) & ~Q(category=None)) | Q(mute=True)
)
.exclude(account__in=request.user.untracked_accounts.all())
.exclude(account__is_asset=True)
)
currency_data = calculate_currency_totals(queryset.all(), ignore_empty=True)
+81 -2
View File
@@ -1,3 +1,82 @@
from django.test import TestCase
import json
import tempfile
from datetime import date
from decimal import Decimal
# Create your tests here.
from django.contrib.auth import get_user_model
from django.test import TestCase, override_settings
from django.urls import reverse
from django.utils import timezone
from apps.accounts.models import Account
from apps.currencies.models import Currency, ExchangeRate
from apps.transactions.models import Transaction
@override_settings(
STATIC_ROOT=tempfile.gettempdir(),
STORAGES={
"default": {"BACKEND": "django.core.files.storage.FileSystemStorage"},
"staticfiles": {
"BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage"
},
},
)
class NetWorthCurrencyChartTests(TestCase):
def test_consolidated_currency_is_a_selectable_dashed_matching_color_line(self):
user = get_user_model().objects.create_user(
email="chart@example.com", password="password"
)
usd = Currency.objects.create(code="USD", name="US Dollar", prefix="$ ")
eur = Currency.objects.create(
code="EUR", name="Euro", prefix="", exchange_currency=usd
)
usd_account = Account.all_objects.create(
name="USD account", currency=usd, owner=user
)
eur_account = Account.all_objects.create(
name="EUR account", currency=eur, owner=user
)
ExchangeRate.objects.create(
from_currency=eur,
to_currency=usd,
rate=Decimal("1.234567"),
date=timezone.now(),
)
for account, amount in ((usd_account, "100"), (eur_account, "50")):
Transaction.userless_all_objects.create(
account=account,
owner=user,
type=Transaction.Type.INCOME,
amount=Decimal(amount),
date=date(2026, 1, 15),
reference_date=date(2026, 1, 1),
is_paid=True,
)
self.client.force_login(user)
response = self.client.get(reverse("net_worth"))
self.assertEqual(response.status_code, 200)
chart_data = json.loads(response.context["chart_data_currency_json"])
datasets = {dataset["label"]: dataset for dataset in chart_data["datasets"]}
self.assertIn("US Dollar Consolidated", datasets)
regular = datasets["US Dollar"]
consolidated = datasets["US Dollar Consolidated"]
self.assertEqual(consolidated["data"], [161.73])
self.assertNotIn("borderColor", regular)
self.assertNotIn("borderColor", consolidated)
self.assertEqual(consolidated["colorSource"], "US Dollar")
self.assertEqual(consolidated["borderDash"], [12, 6])
self.assertEqual(consolidated["pointRadius"], 0)
self.assertEqual(consolidated["pointHitRadius"], 8)
self.assertContains(
response,
"showOnlyCurrencyDataset('US Dollar Consolidated', 'US Dollar')",
html=False,
)
self.assertContains(
response,
'<span class="text-start shrink">Consolidated</span>',
html=False,
)
+53
View File
@@ -3,8 +3,11 @@ import json
from django.contrib.auth.decorators import login_required
from django.core.serializers.json import DjangoJSONEncoder
from django.shortcuts import render, redirect
from django.utils.translation import gettext
from django.views.decorators.http import require_http_methods
from apps.currencies.models import Currency
from apps.currencies.utils.convert import convert
from apps.net_worth.utils.calculate_net_worth import (
calculate_historical_currency_net_worth,
calculate_historical_account_balance,
@@ -78,6 +81,17 @@ def net_worth(request):
)
datasets = []
currency_models = {
currency.name: currency
for currency in Currency.objects.filter(name__in=currencies).select_related(
"exchange_currency"
)
}
consolidated_currencies = {
data["currency"]["name"]
for data in currency_net_worth.values()
if data["consolidated"]["total_final"] != data["total_final"]
}
for i, currency in enumerate(currencies):
data = [
float(month_data[currency])
@@ -93,6 +107,45 @@ def net_worth(request):
}
)
if currency in consolidated_currencies:
target = currency_models[currency]
sources = [
source
for source in currency_models.values()
if source.exchange_currency_id == target.id
]
rates = {}
for source in sources:
converted, _, _, _ = convert(1, source, target)
if converted is not None:
rates[source.name] = converted
consolidated_data = [
float(
round(
month_data[currency]
+ sum(
month_data[source] * rate for source, rate in rates.items()
),
target.decimal_places,
)
)
for month_data in historical_currency_net_worth.values()
]
datasets.append(
{
"label": f"{currency} {gettext('Consolidated')}",
"data": consolidated_data,
"yAxisID": f"y{i}",
"fill": False,
"tension": 0.1,
"colorSource": currency,
"borderDash": [12, 6],
"pointRadius": 0,
"pointHitRadius": 8,
}
)
chart_data_currency = {"labels": labels, "datasets": datasets}
chart_data_currency_json = json.dumps(chart_data_currency, cls=DjangoJSONEncoder)
+23
View File
@@ -41,6 +41,12 @@ class MonthYearFilter(Filter):
class TransactionsFilter(django_filters.FilterSet):
default_filter_values = {
"type": {"IN", "EX"},
"is_paid": {"1", "0"},
"mute_status": {"active", "muted"},
}
description = django_filters.CharFilter(
label=_("Content"),
method=content_filter,
@@ -217,6 +223,23 @@ class TransactionsFilter(django_filters.FilterSet):
]
self.form.fields["entities"].choices = custom_entity_choices + entity_choices
@property
def has_active_filters(self):
for name in self.base_filters:
if hasattr(self.form.data, "getlist"):
values = self.form.data.getlist(name)
else:
value = self.form.data.get(name)
values = value if isinstance(value, (list, tuple)) else [value]
values = [str(value) for value in values if value not in (None, "")]
if not values:
continue
if set(values) == self.default_filter_values.get(name):
continue
return True
return False
@staticmethod
def filter_category(queryset, name, value):
if not value:
@@ -0,0 +1,38 @@
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("transactions", "0049_transactionattachment"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name="FilterPreset",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name", models.CharField(max_length=100)),
("parameters", models.JSONField(default=dict)),
(
"owner",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="filter_presets",
to=settings.AUTH_USER_MODEL,
),
),
],
options={"ordering": ["name", "id"]},
),
]
+27 -6
View File
@@ -30,12 +30,27 @@ from django.utils.translation import gettext_lazy as _
logger = logging.getLogger()
transaction_created = Signal()
transaction_updated = Signal()
transaction_deleted = Signal()
class FilterPreset(models.Model):
owner = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name="filter_presets",
)
name = models.CharField(max_length=100)
parameters = models.JSONField(default=dict)
class Meta:
ordering = ["name", "id"]
def __str__(self):
return self.name
def transaction_attachment_path(instance, filename):
extension = Path(filename).suffix
return f"transaction_attachments/{instance.transaction_id}/{instance.id}{extension}"
@@ -535,6 +550,7 @@ class Transaction(OwnedObject):
return new_obj
class TransactionAttachment(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
transaction = models.ForeignKey(
@@ -590,6 +606,7 @@ def delete_transaction_attachment_file(sender, instance, **kwargs):
if storage.exists(instance.file.name):
storage.delete(instance.file.name)
class InstallmentPlan(models.Model):
class Recurrence(models.TextChoices):
YEARLY = "yearly", _("Yearly")
@@ -937,8 +954,10 @@ class RecurringTransaction(models.Model):
notes=self.notes if self.add_notes_to_transaction else "",
owner=self.account.owner,
)
created_transaction.tags.set(self.tags.all())
created_transaction.entities.set(self.entities.all())
# Unfiltered managers: generation also runs without a current user, or with a
# different one, and the scoped default manager would hide private rows.
created_transaction.tags.set(self.tags(manager="all_objects").all())
created_transaction.entities.set(self.entities(manager="all_objects").all())
def get_recurrence_delta(self):
if self.recurrence_type == self.RecurrenceType.DAY:
@@ -1030,9 +1049,11 @@ class RecurringTransaction(models.Model):
self.notes if self.add_notes_to_transaction else ""
)
# Update many-to-many relationships
existing_transaction.tags.set(self.tags.all())
existing_transaction.entities.set(self.entities.all())
# Update many-to-many relationships (see create_transaction)
existing_transaction.tags.set(self.tags(manager="all_objects").all())
existing_transaction.entities.set(
self.entities(manager="all_objects").all()
)
# Save updated transaction
existing_transaction.save()
@@ -0,0 +1,183 @@
from django.contrib.auth import get_user_model
from django.test import TestCase, override_settings
from django.urls import reverse
from apps.transactions.models import FilterPreset
@override_settings(
STORAGES={
"default": {"BACKEND": "django.core.files.storage.FileSystemStorage"},
"staticfiles": {
"BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage"
},
},
WHITENOISE_AUTOREFRESH=True,
)
class FilterPresetViewTests(TestCase):
def setUp(self):
user_model = get_user_model()
self.user = user_model.objects.create_user(
email="preset-owner@example.com", password="testpass123"
)
self.other_user = user_model.objects.create_user(
email="other-user@example.com", password="testpass123"
)
self.client.force_login(self.user)
self.preset = FilterPreset.objects.create(
owner=self.user,
name="Unpaid",
parameters={"is_paid": ["0"], "type": ["IN", "EX"]},
)
def test_create_stores_only_transaction_filter_fields(self):
response = self.client.post(
reverse("filter_preset_create"),
{
"name": "Account X Unpaid",
"account": ["Account X"],
"is_paid": ["0"],
"order": "newer",
},
HTTP_HX_REQUEST="true",
)
preset = FilterPreset.objects.get(
owner=self.user, name="Account X Unpaid"
)
self.assertEqual(
preset.parameters,
{"account": ["Account X"], "is_paid": ["0"]},
)
self.assertContains(response, "Account X Unpaid")
def test_create_rejects_a_blank_name(self):
response = self.client.post(
reverse("filter_preset_create"),
{"name": " ", "is_paid": ["0"]},
HTTP_HX_REQUEST="true",
)
self.assertEqual(response.status_code, 400)
self.assertEqual(FilterPreset.objects.filter(owner=self.user).count(), 1)
def test_apply_returns_the_saved_filter_form_without_changing_the_url(self):
response = self.client.get(
reverse("filter_preset_apply", args=[self.preset.pk]),
HTTP_HX_REQUEST="true",
)
self.assertEqual(response.status_code, 200)
self.assertContains(response, 'id="filter"')
self.assertEqual(response.context["filter"].data.getlist("is_paid"), ["0"])
self.assertEqual(
response.context["filter"].data.getlist("type"), ["IN", "EX"]
)
self.assertNotIn("HX-Push-Url", response.headers)
self.assertNotIn("HX-Replace-Url", response.headers)
self.assertIs(response.context.get("filter_is_active"), True)
self.assertContains(response, 'hx-swap-oob="outerHTML"')
self.assertEqual(
response.headers["HX-Trigger-After-Settle"],
"updated",
)
def test_clear_returns_the_default_filter_form_without_changing_the_url(self):
response = self.client.get(
"/transactions/filter/clear/",
HTTP_HX_REQUEST="true",
)
self.assertEqual(response.status_code, 200)
self.assertContains(response, 'id="filter"')
self.assertEqual(
response.context["filter"].data.getlist("type"), ["IN", "EX"]
)
self.assertEqual(
response.context["filter"].data.getlist("is_paid"), ["1", "0"]
)
self.assertNotIn("HX-Push-Url", response.headers)
self.assertNotIn("HX-Replace-Url", response.headers)
self.assertIs(response.context.get("filter_is_active"), False)
self.assertContains(response, 'hx-swap-oob="outerHTML"')
self.assertEqual(
response.headers["HX-Trigger-After-Settle"],
"updated",
)
def test_other_users_cannot_apply_or_delete_a_preset(self):
self.client.force_login(self.other_user)
apply_response = self.client.get(
reverse("filter_preset_apply", args=[self.preset.pk]),
HTTP_HX_REQUEST="true",
)
delete_response = self.client.post(
reverse("filter_preset_delete", args=[self.preset.pk]),
HTTP_HX_REQUEST="true",
)
self.assertEqual(apply_response.status_code, 404)
self.assertEqual(delete_response.status_code, 404)
self.assertTrue(FilterPreset.objects.filter(pk=self.preset.pk).exists())
def test_delete_removes_the_current_users_preset(self):
response = self.client.post(
reverse("filter_preset_delete", args=[self.preset.pk]),
HTTP_HX_REQUEST="true",
)
self.assertEqual(response.status_code, 200)
self.assertFalse(FilterPreset.objects.filter(pk=self.preset.pk).exists())
self.assertNotContains(response, self.preset.name)
def test_all_transactions_page_only_offers_the_current_users_presets(self):
FilterPreset.objects.create(
owner=self.other_user,
name="Other User Preset",
parameters={"type": ["IN"]},
)
response = self.client.get(reverse("transactions_all_index"))
self.assertContains(response, self.preset.name)
self.assertNotContains(response, "Other User Preset")
self.assertContains(response, 'id="filter-presets"')
self.assertNotContains(response, 'href="./?')
self.assertContains(
response,
reverse("filter_preset_apply", args=[self.preset.pk]),
)
def test_all_transactions_page_marks_a_filtered_query_active(self):
response = self.client.get(
reverse("transactions_all_index"),
{"type": ["IN", "EX"], "is_paid": ["0"]},
)
self.assertIs(response.context["filter_is_active"], True)
def test_all_transactions_page_does_not_mark_default_query_active(self):
response = self.client.get(
reverse("transactions_all_index"),
{
"type": ["IN", "EX"],
"is_paid": ["1", "0"],
"mute_status": ["active", "muted"],
},
)
self.assertIs(response.context["filter_is_active"], False)
def test_monthly_page_renders_preset_controls(self):
other_preset = FilterPreset.objects.create(
owner=self.other_user,
name="Other Monthly Preset",
parameters={"type": ["IN"]},
)
response = self.client.get(reverse("monthly_overview", args=[8, 2026]))
self.assertContains(response, 'id="filter-presets"')
self.assertNotContains(response, 'href="./?')
self.assertContains(response, reverse("filter_preset_create"))
self.assertNotContains(response, other_preset.name)
@@ -7,6 +7,7 @@ from django.utils import timezone
from apps.transactions.models import (
TransactionCategory,
TransactionTag,
TransactionEntity,
Transaction,
InstallmentPlan,
RecurringTransaction,
@@ -240,3 +241,27 @@ class RecurringTransactionTests(TestCase):
self.assertFalse(recurring.is_paused)
self.assertEqual(recurring.recurrence_interval, 1)
self.assertEqual(recurring.account.currency.code, "USD")
def test_generate_upcoming_transactions_keeps_tags_and_entities(self):
"""Generation must copy tags/entities even with no current user"""
tag = TransactionTag.objects.create(name="Essential")
entity = TransactionEntity.objects.create(name="Landlord")
recurring = RecurringTransaction.objects.create(
account=self.account,
type=Transaction.Type.EXPENSE,
amount=Decimal("100.00"),
description="Monthly Payment",
start_date=timezone.now().date(),
recurrence_type=RecurringTransaction.RecurrenceType.MONTH,
recurrence_interval=1,
)
recurring.tags.set([tag])
recurring.entities.set([entity])
RecurringTransaction.generate_upcoming_transactions()
generated = Transaction.all_objects.filter(recurring_transaction=recurring)
self.assertTrue(generated.exists())
for transaction in generated:
self.assertIn(tag, transaction.tags(manager="all_objects").all())
self.assertIn(entity, transaction.entities(manager="all_objects").all())
+20
View File
@@ -6,6 +6,26 @@ urlpatterns = [
path(
"transactions/list/", views.transaction_all_list, name="transactions_all_list"
),
path(
"transactions/filter-presets/create/",
views.filter_preset_create,
name="filter_preset_create",
),
path(
"transactions/filter-presets/<int:preset_id>/apply/",
views.filter_preset_apply,
name="filter_preset_apply",
),
path(
"transactions/filter-presets/<int:preset_id>/delete/",
views.filter_preset_delete,
name="filter_preset_delete",
),
path(
"transactions/filter/clear/",
views.transaction_filter_clear,
name="transaction_filter_clear",
),
path(
"transactions/trash/",
views.transactions_trash_can_index,
+88 -3
View File
@@ -11,7 +11,7 @@ from apps.transactions.forms import (
TransactionForm,
TransferForm,
)
from apps.transactions.models import Transaction, TransactionAttachment
from apps.transactions.models import FilterPreset, Transaction, TransactionAttachment
from apps.transactions.utils.calculations import (
calculate_account_totals,
calculate_currency_totals,
@@ -23,7 +23,7 @@ from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.core.paginator import Paginator
from django.db.models import Case, IntegerField, Q, Value, When
from django.http import FileResponse, Http404, HttpResponse, JsonResponse
from django.http import FileResponse, Http404, HttpResponse, JsonResponse, QueryDict
from django.shortcuts import get_object_or_404, render
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
@@ -635,7 +635,92 @@ def transaction_all_index(request):
return render(
request,
"transactions/pages/transactions.html",
{"filter": f, "order": order, "summary_tab": summary_tab},
{
"filter": f,
"filter_is_active": f.has_active_filters,
"filter_presets": FilterPreset.objects.filter(owner=request.user),
"order": order,
"summary_tab": summary_tab,
},
)
@only_htmx
@login_required
@require_http_methods(["POST"])
def filter_preset_create(request):
name = request.POST.get("name", "").strip()
if not name or len(name) > 100:
return HttpResponse(status=400)
parameters = {
key: request.POST.getlist(key)
for key in TransactionsFilter.base_filters
if key in request.POST
}
FilterPreset.objects.create(
owner=request.user,
name=name,
parameters=parameters,
)
return render(
request,
"transactions/fragments/filter_presets.html",
{"filter_presets": FilterPreset.objects.filter(owner=request.user)},
)
@only_htmx
@login_required
@require_http_methods(["GET"])
def filter_preset_apply(request, preset_id):
preset = get_object_or_404(FilterPreset, pk=preset_id, owner=request.user)
data = QueryDict(mutable=True)
for key, values in preset.parameters.items():
if key in TransactionsFilter.base_filters:
data.setlist(key, values)
transaction_filter = TransactionsFilter(data)
response = render(
request,
"transactions/fragments/filter_form.html",
{
"filter": transaction_filter,
"filter_is_active": transaction_filter.has_active_filters,
"swap_filter_indicator": True,
},
)
response.headers["HX-Trigger-After-Settle"] = "updated"
return response
@only_htmx
@login_required
@require_http_methods(["GET"])
def transaction_filter_clear(request):
transaction_filter = TransactionsFilter(QueryDict())
response = render(
request,
"transactions/fragments/filter_form.html",
{
"filter": transaction_filter,
"filter_is_active": False,
"swap_filter_indicator": True,
},
)
response.headers["HX-Trigger-After-Settle"] = "updated"
return response
@only_htmx
@login_required
@require_http_methods(["POST"])
def filter_preset_delete(request, preset_id):
get_object_or_404(FilterPreset, pk=preset_id, owner=request.user).delete()
return render(
request,
"transactions/fragments/filter_presets.html",
{"filter_presets": FilterPreset.objects.filter(owner=request.user)},
)
-1
View File
@@ -140,7 +140,6 @@ class UserSettingsForm(forms.ModelForm):
"date_format",
"datetime_format",
"number_format",
"volume",
"default_account",
]
widgets = {
File diff suppressed because it is too large Load Diff
+212 -176
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-04 15:39+0000\n"
"POT-Creation-Date: 2026-08-16 04:46+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -30,8 +30,8 @@ msgstr ""
#: apps/transactions/forms.py:417 apps/transactions/forms.py:536
#: apps/transactions/forms.py:880 apps/transactions/forms.py:919
#: apps/transactions/forms.py:947 apps/transactions/forms.py:978
#: apps/transactions/forms.py:1128 apps/users/forms.py:246
#: apps/users/forms.py:404
#: apps/transactions/forms.py:1128 apps/users/forms.py:245
#: apps/users/forms.py:403
#: templates/rules/fragments/transaction_rule/dry_run/updated.html:5
#: templates/rules/fragments/transaction_rule/view.html:128
msgid "Update"
@@ -46,7 +46,7 @@ msgstr ""
#: apps/transactions/forms.py:424 apps/transactions/forms.py:886
#: apps/transactions/forms.py:925 apps/transactions/forms.py:953
#: apps/transactions/forms.py:984 apps/transactions/forms.py:1134
#: apps/users/forms.py:252 apps/users/forms.py:410
#: apps/users/forms.py:251 apps/users/forms.py:409
#: templates/mini_tools/unit_price_calculator.html:168
msgid "Add"
msgstr ""
@@ -65,9 +65,9 @@ msgstr ""
#: apps/transactions/forms.py:61 apps/transactions/forms.py:307
#: apps/transactions/forms.py:475 apps/transactions/forms.py:572
#: apps/transactions/forms.py:579 apps/transactions/forms.py:763
#: apps/transactions/forms.py:1007 apps/transactions/models.py:331
#: apps/transactions/models.py:641 apps/transactions/models.py:841
#: apps/transactions/models.py:1089
#: apps/transactions/forms.py:1007 apps/transactions/models.py:346
#: apps/transactions/models.py:658 apps/transactions/models.py:858
#: apps/transactions/models.py:1110
#: templates/insights/fragments/category_overview/index.html:86
#: templates/insights/fragments/category_overview/index.html:542
#: templates/insights/fragments/month_by_month.html:84
@@ -78,13 +78,13 @@ msgstr ""
#: apps/accounts/forms.py:132 apps/dca/forms.py:95 apps/dca/forms.py:103
#: apps/export_app/forms.py:43 apps/export_app/forms.py:132
#: apps/rules/forms.py:184 apps/rules/forms.py:194 apps/rules/models.py:45
#: apps/rules/models.py:315 apps/transactions/filters.py:73
#: apps/rules/models.py:315 apps/transactions/filters.py:79
#: apps/transactions/forms.py:69 apps/transactions/forms.py:315
#: apps/transactions/forms.py:483 apps/transactions/forms.py:588
#: apps/transactions/forms.py:596 apps/transactions/forms.py:756
#: apps/transactions/forms.py:1000 apps/transactions/models.py:337
#: apps/transactions/models.py:643 apps/transactions/models.py:845
#: apps/transactions/models.py:1095 templates/includes/sidebar.html:150
#: apps/transactions/forms.py:1000 apps/transactions/models.py:352
#: apps/transactions/models.py:660 apps/transactions/models.py:862
#: apps/transactions/models.py:1116 templates/includes/sidebar.html:150
#: templates/insights/fragments/category_overview/index.html:40
#: templates/insights/fragments/month_by_month.html:29
#: templates/insights/fragments/month_by_month.html:32
@@ -96,8 +96,8 @@ msgstr ""
#: apps/accounts/models.py:12 apps/accounts/models.py:29 apps/dca/models.py:13
#: apps/import_app/models.py:14 apps/rules/models.py:13
#: apps/transactions/models.py:223 apps/transactions/models.py:248
#: apps/transactions/models.py:272 apps/transactions/models.py:1057
#: apps/transactions/models.py:238 apps/transactions/models.py:263
#: apps/transactions/models.py:287 apps/transactions/models.py:1078
#: apps/users/models.py:572 templates/account_groups/fragments/list.html:22
#: templates/accounts/fragments/list.html:22
#: templates/categories/fragments/table.html:17
@@ -165,9 +165,9 @@ msgstr ""
#: apps/rules/models.py:35 apps/rules/models.py:267
#: apps/transactions/forms.py:81 apps/transactions/forms.py:327
#: apps/transactions/forms.py:442 apps/transactions/forms.py:748
#: apps/transactions/forms.py:992 apps/transactions/models.py:303
#: apps/transactions/models.py:601 apps/transactions/models.py:823
#: apps/transactions/models.py:1063
#: apps/transactions/forms.py:992 apps/transactions/models.py:318
#: apps/transactions/models.py:618 apps/transactions/models.py:840
#: apps/transactions/models.py:1084
#: templates/installment_plans/fragments/table.html:17
#: templates/quick_transactions/fragments/list.html:14
#: templates/recurring_transactions/fragments/table.html:19
@@ -176,7 +176,7 @@ msgid "Account"
msgstr ""
#: apps/accounts/models.py:76 apps/export_app/forms.py:19
#: apps/export_app/forms.py:129 apps/transactions/filters.py:57
#: apps/export_app/forms.py:129 apps/transactions/filters.py:63
#: templates/accounts/fragments/list.html:9
#: templates/accounts/pages/index.html:4 templates/includes/sidebar.html:162
#: templates/includes/sidebar.html:164
@@ -344,7 +344,8 @@ msgid ""
"owner.<br/>Public: Shown for all users. Only editable by the owner."
msgstr ""
#: apps/common/forms.py:76 apps/users/forms.py:173
#: apps/common/forms.py:76 apps/users/forms.py:172
#: templates/transactions/fragments/filter_actions.html:5
msgid "Save"
msgstr ""
@@ -459,10 +460,9 @@ msgstr ""
#: apps/common/widgets/tom_select.py:15
#: templates/mini_tools/unit_price_calculator.html:180
#: templates/monthly_overview/pages/overview.html:275
#: templates/monthly_overview/pages/overview.html:287
#: templates/transactions/pages/transactions.html:225
#: templates/transactions/pages/transactions.html:237
#: templates/monthly_overview/pages/overview.html:284
#: templates/transactions/fragments/filter_actions.html:48
#: templates/transactions/pages/transactions.html:233
msgid "Clear"
msgstr ""
@@ -481,7 +481,7 @@ msgstr ""
#: apps/currencies/forms.py:66 apps/dca/models.py:158 apps/rules/forms.py:176
#: apps/rules/forms.py:190 apps/rules/models.py:38 apps/rules/models.py:279
#: apps/transactions/forms.py:85 apps/transactions/forms.py:447
#: apps/transactions/forms.py:600 apps/transactions/models.py:313
#: apps/transactions/forms.py:600 apps/transactions/models.py:328
#: templates/dca/fragments/strategy/details.html:49
#: templates/exchange_rates/fragments/table.html:10
#: templates/exchange_rates_services/fragments/table.html:11
@@ -501,7 +501,7 @@ msgid "Decimal Places"
msgstr ""
#: apps/currencies/models.py:45 apps/export_app/forms.py:25
#: apps/export_app/forms.py:130 apps/transactions/filters.py:64
#: apps/export_app/forms.py:130 apps/transactions/filters.py:70
#: templates/currencies/fragments/list.html:9
#: templates/currencies/pages/index.html:4 templates/includes/sidebar.html:176
#: templates/includes/sidebar.html:178
@@ -546,29 +546,29 @@ msgstr ""
msgid "From and To currencies cannot be the same."
msgstr ""
#: apps/currencies/models.py:110
#: apps/currencies/models.py:111
msgid "On"
msgstr ""
#: apps/currencies/models.py:111
#: apps/currencies/models.py:112
msgid "Every X hours"
msgstr ""
#: apps/currencies/models.py:112
#: apps/currencies/models.py:113
msgid "Not on"
msgstr ""
#: apps/currencies/models.py:114
#: apps/currencies/models.py:115
msgid "Service Name"
msgstr ""
#: apps/currencies/models.py:116
#: apps/currencies/models.py:117
msgid "Service Type"
msgstr ""
#: apps/currencies/models.py:118 apps/transactions/filters.py:27
#: apps/transactions/models.py:227 apps/transactions/models.py:251
#: apps/transactions/models.py:275 templates/categories/fragments/list.html:16
#: apps/currencies/models.py:119 apps/transactions/filters.py:27
#: apps/transactions/models.py:242 apps/transactions/models.py:266
#: apps/transactions/models.py:290 templates/categories/fragments/list.html:16
#: templates/entities/fragments/list.html:16
#: templates/installment_plans/fragments/list.html:16
#: templates/recurring_transactions/fragments/list.html:16
@@ -578,77 +578,77 @@ msgstr ""
msgid "Active"
msgstr ""
#: apps/currencies/models.py:123
#: apps/currencies/models.py:124
msgid "API Key"
msgstr ""
#: apps/currencies/models.py:124
#: apps/currencies/models.py:125
msgid "API key for the service (if required)"
msgstr ""
#: apps/currencies/models.py:129
#: apps/currencies/models.py:130
msgid "Interval Type"
msgstr ""
#: apps/currencies/models.py:133
#: apps/currencies/models.py:134
msgid "Interval"
msgstr ""
#: apps/currencies/models.py:136
#: apps/currencies/models.py:137
msgid "Last Successful Fetch"
msgstr ""
#: apps/currencies/models.py:143
#: apps/currencies/models.py:144
msgid "Target Currencies"
msgstr ""
#: apps/currencies/models.py:145
#: apps/currencies/models.py:146
msgid ""
"Select currencies to fetch exchange rates for. Rates will be fetched for "
"each currency against their set exchange currency."
msgstr ""
#: apps/currencies/models.py:153
#: apps/currencies/models.py:154
msgid "Target Accounts"
msgstr ""
#: apps/currencies/models.py:155
#: apps/currencies/models.py:156
msgid ""
"Select accounts to fetch exchange rates for. Rates will be fetched for each "
"account's currency against their set exchange currency."
msgstr ""
#: apps/currencies/models.py:162
#: apps/currencies/models.py:163
msgid "Single exchange rate"
msgstr ""
#: apps/currencies/models.py:165
#: apps/currencies/models.py:166
msgid "Create one exchange rate and keep updating it. Avoids database clutter."
msgstr ""
#: apps/currencies/models.py:170
#: apps/currencies/models.py:171
msgid "Exchange Rate Service"
msgstr ""
#: apps/currencies/models.py:171
#: apps/currencies/models.py:172
msgid "Exchange Rate Services"
msgstr ""
#: apps/currencies/models.py:223
#: apps/currencies/models.py:224
msgid "'Every X hours' interval type requires a positive integer."
msgstr ""
#: apps/currencies/models.py:232
#: apps/currencies/models.py:233
msgid "'Every X hours' interval must be between 1 and 24."
msgstr ""
#: apps/currencies/models.py:246
#: apps/currencies/models.py:247
msgid ""
"Invalid hour format. Use comma-separated hours (0-23) and/or ranges (e.g., "
"'1-5,8,10-12')."
msgstr ""
#: apps/currencies/models.py:257
#: apps/currencies/models.py:258
msgid ""
"Invalid format. Please check the requirements for your selected interval "
"type."
@@ -747,8 +747,8 @@ msgstr ""
#: apps/dca/models.py:26 apps/dca/models.py:181 apps/rules/forms.py:180
#: apps/rules/forms.py:196 apps/rules/models.py:43 apps/rules/models.py:295
#: apps/transactions/forms.py:469 apps/transactions/forms.py:616
#: apps/transactions/models.py:327 apps/transactions/models.py:650
#: apps/transactions/models.py:851 apps/transactions/models.py:1085
#: apps/transactions/models.py:342 apps/transactions/models.py:667
#: apps/transactions/models.py:868 apps/transactions/models.py:1106
msgid "Notes"
msgstr ""
@@ -811,7 +811,7 @@ msgid "Users"
msgstr ""
#: apps/export_app/forms.py:31 apps/export_app/forms.py:134
#: apps/transactions/models.py:388 templates/includes/sidebar.html:81
#: apps/transactions/models.py:403 templates/includes/sidebar.html:81
#: templates/includes/sidebar.html:142
#: templates/recurring_transactions/fragments/list_transactions.html:5
#: templates/recurring_transactions/fragments/table.html:37
@@ -820,7 +820,7 @@ msgid "Transactions"
msgstr ""
#: apps/export_app/forms.py:37 apps/export_app/forms.py:131
#: apps/transactions/filters.py:68 templates/categories/fragments/list.html:9
#: apps/transactions/filters.py:74 templates/categories/fragments/list.html:9
#: templates/categories/pages/index.html:4 templates/includes/sidebar.html:144
#: templates/insights/fragments/month_by_month.html:18
#: templates/insights/fragments/month_by_month.html:21
@@ -831,12 +831,12 @@ msgstr ""
#: apps/export_app/forms.py:49 apps/export_app/forms.py:133
#: apps/rules/forms.py:185 apps/rules/forms.py:195 apps/rules/models.py:46
#: apps/rules/models.py:307 apps/transactions/filters.py:78
#: apps/rules/models.py:307 apps/transactions/filters.py:84
#: apps/transactions/forms.py:77 apps/transactions/forms.py:323
#: apps/transactions/forms.py:491 apps/transactions/forms.py:771
#: apps/transactions/forms.py:1015 apps/transactions/models.py:286
#: apps/transactions/models.py:342 apps/transactions/models.py:646
#: apps/transactions/models.py:848 apps/transactions/models.py:1100
#: apps/transactions/forms.py:1015 apps/transactions/models.py:301
#: apps/transactions/models.py:357 apps/transactions/models.py:663
#: apps/transactions/models.py:865 apps/transactions/models.py:1121
#: templates/entities/fragments/list.html:9
#: templates/entities/pages/index.html:4 templates/includes/sidebar.html:156
#: templates/insights/fragments/category_overview/index.html:54
@@ -848,14 +848,14 @@ msgid "Entities"
msgstr ""
#: apps/export_app/forms.py:55 apps/export_app/forms.py:137
#: apps/transactions/models.py:888 templates/includes/sidebar.html:110
#: apps/transactions/models.py:905 templates/includes/sidebar.html:110
#: templates/recurring_transactions/fragments/list.html:9
#: templates/recurring_transactions/pages/index.html:4
msgid "Recurring Transactions"
msgstr ""
#: apps/export_app/forms.py:61 apps/export_app/forms.py:135
#: apps/transactions/models.py:664 templates/includes/sidebar.html:104
#: apps/transactions/models.py:681 templates/includes/sidebar.html:104
#: templates/installment_plans/fragments/list.html:9
#: templates/installment_plans/pages/index.html:4
msgid "Installment Plans"
@@ -1007,7 +1007,7 @@ msgid "Run deleted successfully"
msgstr ""
#: apps/insights/forms.py:118 apps/insights/utils/sankey.py:36
#: apps/insights/utils/sankey.py:167 apps/transactions/filters.py:203
#: apps/insights/utils/sankey.py:167 apps/transactions/filters.py:209
#: templates/insights/fragments/category_overview/index.html:96
#: templates/insights/fragments/category_overview/index.html:407
#: templates/insights/fragments/category_overview/index.html:436
@@ -1105,15 +1105,15 @@ msgstr ""
#: apps/rules/forms.py:174 apps/rules/forms.py:188 apps/rules/models.py:36
#: apps/rules/models.py:271 apps/transactions/forms.py:433
#: apps/transactions/models.py:310 apps/transactions/models.py:606
#: apps/transactions/models.py:829 apps/transactions/models.py:1070
#: apps/transactions/models.py:325 apps/transactions/models.py:623
#: apps/transactions/models.py:846 apps/transactions/models.py:1091
msgid "Type"
msgstr ""
#: apps/rules/forms.py:175 apps/rules/forms.py:189 apps/rules/models.py:37
#: apps/rules/models.py:275 apps/transactions/filters.py:22
#: apps/transactions/forms.py:437 apps/transactions/models.py:312
#: apps/transactions/models.py:1072 templates/cotton/transaction/item.html:20
#: apps/transactions/forms.py:437 apps/transactions/models.py:327
#: apps/transactions/models.py:1093 templates/cotton/transaction/item.html:20
#: templates/cotton/transaction/item.html:31
#: templates/transactions/widgets/paid_toggle_button.html:10
#: templates/transactions/widgets/unselectable_paid_toggle_button.html:13
@@ -1123,15 +1123,15 @@ msgstr ""
#: apps/rules/forms.py:177 apps/rules/forms.py:191 apps/rules/models.py:39
#: apps/rules/models.py:283 apps/transactions/forms.py:89
#: apps/transactions/forms.py:453 apps/transactions/forms.py:603
#: apps/transactions/forms.py:777 apps/transactions/models.py:314
#: apps/transactions/models.py:624 apps/transactions/models.py:853
#: apps/transactions/forms.py:777 apps/transactions/models.py:329
#: apps/transactions/models.py:641 apps/transactions/models.py:870
msgid "Reference Date"
msgstr ""
#: apps/rules/forms.py:178 apps/rules/forms.py:192 apps/rules/models.py:41
#: apps/rules/models.py:287 apps/transactions/forms.py:460
#: apps/transactions/models.py:320 apps/transactions/models.py:834
#: apps/transactions/models.py:1078
#: apps/transactions/models.py:335 apps/transactions/models.py:851
#: apps/transactions/models.py:1099
#: templates/insights/fragments/sankey.html:102
#: templates/installment_plans/fragments/table.html:18
#: templates/quick_transactions/fragments/list.html:15
@@ -1142,27 +1142,27 @@ msgstr ""
#: apps/rules/forms.py:179 apps/rules/forms.py:193 apps/rules/models.py:14
#: apps/rules/models.py:42 apps/rules/models.py:291
#: apps/transactions/forms.py:464 apps/transactions/forms.py:607
#: apps/transactions/models.py:325 apps/transactions/models.py:608
#: apps/transactions/models.py:837 apps/transactions/models.py:1083
#: apps/transactions/models.py:340 apps/transactions/models.py:625
#: apps/transactions/models.py:854 apps/transactions/models.py:1104
msgid "Description"
msgstr ""
#: apps/rules/forms.py:182 apps/rules/forms.py:198 apps/rules/models.py:47
#: apps/rules/models.py:299 apps/transactions/models.py:364
#: apps/transactions/models.py:1105
#: apps/rules/models.py:299 apps/transactions/models.py:379
#: apps/transactions/models.py:1126
msgid "Internal Note"
msgstr ""
#: apps/rules/forms.py:183 apps/rules/forms.py:199 apps/rules/models.py:48
#: apps/rules/models.py:303 apps/transactions/models.py:366
#: apps/transactions/models.py:1107
#: apps/rules/models.py:303 apps/transactions/models.py:381
#: apps/transactions/models.py:1128
msgid "Internal ID"
msgstr ""
#: apps/rules/forms.py:186 apps/rules/forms.py:200 apps/rules/models.py:40
#: apps/rules/models.py:319 apps/transactions/forms.py:620
#: apps/transactions/models.py:224 apps/transactions/models.py:315
#: apps/transactions/models.py:1073
#: apps/transactions/models.py:239 apps/transactions/models.py:330
#: apps/transactions/models.py:1094
msgid "Mute"
msgstr ""
@@ -1175,7 +1175,7 @@ msgid "Set Values"
msgstr ""
#: apps/rules/forms.py:407 apps/rules/forms.py:442 apps/rules/forms.py:477
#: apps/transactions/models.py:387 apps/transactions/models.py:544
#: apps/transactions/models.py:402 apps/transactions/models.py:560
msgid "Transaction"
msgstr ""
@@ -1322,58 +1322,58 @@ msgstr ""
msgid "Muted"
msgstr ""
#: apps/transactions/filters.py:45
#: apps/transactions/filters.py:51
msgid "Content"
msgstr ""
#: apps/transactions/filters.py:51
#: apps/transactions/filters.py:57
msgid "Transaction Type"
msgstr ""
#: apps/transactions/filters.py:89
#: apps/transactions/filters.py:95
msgid "Mute Status"
msgstr ""
#: apps/transactions/filters.py:94
#: apps/transactions/filters.py:100
msgid "Date from"
msgstr ""
#: apps/transactions/filters.py:99 apps/transactions/filters.py:109
#: apps/transactions/filters.py:105 apps/transactions/filters.py:115
msgid "Until"
msgstr ""
#: apps/transactions/filters.py:104
#: apps/transactions/filters.py:110
msgid "Reference date from"
msgstr ""
#: apps/transactions/filters.py:114
#: apps/transactions/filters.py:120
msgid "Amount min"
msgstr ""
#: apps/transactions/filters.py:119
#: apps/transactions/filters.py:125
msgid "Amount max"
msgstr ""
#: apps/transactions/filters.py:202
#: apps/transactions/filters.py:208
msgid "Categorized"
msgstr ""
#: apps/transactions/filters.py:209
#: apps/transactions/filters.py:215
msgid "Tagged"
msgstr ""
#: apps/transactions/filters.py:209
#: apps/transactions/filters.py:215
#: templates/insights/fragments/category_overview/index.html:189
#: templates/insights/fragments/month_by_month.html:121
#: templates/insights/fragments/year_by_year.html:75
msgid "Untagged"
msgstr ""
#: apps/transactions/filters.py:215
#: apps/transactions/filters.py:221
msgid "Any entity"
msgstr ""
#: apps/transactions/filters.py:216
#: apps/transactions/filters.py:222
#: templates/insights/fragments/category_overview/index.html:282
#: templates/insights/fragments/month_by_month.html:123
#: templates/insights/fragments/year_by_year.html:77
@@ -1448,42 +1448,42 @@ msgstr ""
msgid "End date should be after the start date"
msgstr ""
#: apps/transactions/models.py:229
#: apps/transactions/models.py:244
msgid ""
"Deactivated categories won't be able to be selected when creating new "
"transactions"
msgstr ""
#: apps/transactions/models.py:237
#: apps/transactions/models.py:252
msgid "Transaction Category"
msgstr ""
#: apps/transactions/models.py:238
#: apps/transactions/models.py:253
msgid "Transaction Categories"
msgstr ""
#: apps/transactions/models.py:253
#: apps/transactions/models.py:268
msgid ""
"Deactivated tags won't be able to be selected when creating new transactions"
msgstr ""
#: apps/transactions/models.py:261 apps/transactions/models.py:262
#: apps/transactions/models.py:276 apps/transactions/models.py:277
msgid "Transaction Tags"
msgstr ""
#: apps/transactions/models.py:277
#: apps/transactions/models.py:292
msgid ""
"Deactivated entities won't be able to be selected when creating new "
"transactions"
msgstr ""
#: apps/transactions/models.py:285
#: apps/transactions/models.py:300
#: templates/insights/fragments/month_by_month.html:88
#: templates/insights/fragments/year_by_year.html:56
msgid "Entity"
msgstr ""
#: apps/transactions/models.py:297 apps/transactions/models.py:1050
#: apps/transactions/models.py:312 apps/transactions/models.py:1071
#: templates/calendar_view/fragments/list.html:42
#: templates/calendar_view/fragments/list.html:44
#: templates/calendar_view/fragments/list.html:52
@@ -1495,7 +1495,7 @@ msgstr ""
msgid "Income"
msgstr ""
#: apps/transactions/models.py:298 apps/transactions/models.py:1051
#: apps/transactions/models.py:313 apps/transactions/models.py:1072
#: templates/calendar_view/fragments/list.html:46
#: templates/calendar_view/fragments/list.html:48
#: templates/calendar_view/fragments/list.html:56
@@ -1506,157 +1506,157 @@ msgstr ""
msgid "Expense"
msgstr ""
#: apps/transactions/models.py:353 apps/transactions/models.py:663
#: apps/transactions/models.py:368 apps/transactions/models.py:680
msgid "Installment Plan"
msgstr ""
#: apps/transactions/models.py:362 apps/transactions/models.py:887
#: apps/transactions/models.py:377 apps/transactions/models.py:904
msgid "Recurring Transaction"
msgstr ""
#: apps/transactions/models.py:370
#: apps/transactions/models.py:385
msgid "Deleted"
msgstr ""
#: apps/transactions/models.py:375
#: apps/transactions/models.py:390
msgid "Deleted At"
msgstr ""
#: apps/transactions/models.py:489 templates/tags/fragments/table.html:69
#: apps/transactions/models.py:504 templates/tags/fragments/table.html:69
msgid "No tags"
msgstr ""
#: apps/transactions/models.py:491
#: apps/transactions/models.py:506
msgid "No category"
msgstr ""
#: apps/transactions/models.py:493
#: apps/transactions/models.py:508
msgid "No description"
msgstr ""
#: apps/transactions/models.py:549
#: apps/transactions/models.py:565
msgid "File"
msgstr ""
#: apps/transactions/models.py:551
#: apps/transactions/models.py:567
msgid "Original Name"
msgstr ""
#: apps/transactions/models.py:553
#: apps/transactions/models.py:569
msgid "Content Type"
msgstr ""
#: apps/transactions/models.py:555
#: apps/transactions/models.py:571
msgid "Size"
msgstr ""
#: apps/transactions/models.py:560
#: apps/transactions/models.py:576
msgid "Uploaded By"
msgstr ""
#: apps/transactions/models.py:565
#: apps/transactions/models.py:581
msgid "Transaction Attachment"
msgstr ""
#: apps/transactions/models.py:566
#: apps/transactions/models.py:582
msgid "Transaction Attachments"
msgstr ""
#: apps/transactions/models.py:595 templates/includes/sidebar.html:57
#: apps/transactions/models.py:612 templates/includes/sidebar.html:57
msgid "Yearly"
msgstr ""
#: apps/transactions/models.py:596 apps/users/models.py:469
#: apps/transactions/models.py:613 apps/users/models.py:469
#: templates/includes/sidebar.html:51
msgid "Monthly"
msgstr ""
#: apps/transactions/models.py:597
#: apps/transactions/models.py:614
msgid "Weekly"
msgstr ""
#: apps/transactions/models.py:598
#: apps/transactions/models.py:615
msgid "Daily"
msgstr ""
#: apps/transactions/models.py:611
#: apps/transactions/models.py:628
msgid "Number of Installments"
msgstr ""
#: apps/transactions/models.py:616
#: apps/transactions/models.py:633
msgid "Installment Start"
msgstr ""
#: apps/transactions/models.py:617
#: apps/transactions/models.py:634
msgid "The installment number to start counting from"
msgstr ""
#: apps/transactions/models.py:622 apps/transactions/models.py:857
#: apps/transactions/models.py:639 apps/transactions/models.py:874
msgid "Start Date"
msgstr ""
#: apps/transactions/models.py:626 apps/transactions/models.py:858
#: apps/transactions/models.py:643 apps/transactions/models.py:875
msgid "End Date"
msgstr ""
#: apps/transactions/models.py:631
#: apps/transactions/models.py:648
msgid "Recurrence"
msgstr ""
#: apps/transactions/models.py:634
#: apps/transactions/models.py:651
msgid "Installment Amount"
msgstr ""
#: apps/transactions/models.py:653 apps/transactions/models.py:877
#: apps/transactions/models.py:670 apps/transactions/models.py:894
msgid "Add description to transactions"
msgstr ""
#: apps/transactions/models.py:656 apps/transactions/models.py:880
#: apps/transactions/models.py:673 apps/transactions/models.py:897
msgid "Add notes to transactions"
msgstr ""
#: apps/transactions/models.py:816
#: apps/transactions/models.py:833
msgid "day(s)"
msgstr ""
#: apps/transactions/models.py:817
#: apps/transactions/models.py:834
msgid "week(s)"
msgstr ""
#: apps/transactions/models.py:818
#: apps/transactions/models.py:835
msgid "month(s)"
msgstr ""
#: apps/transactions/models.py:819
#: apps/transactions/models.py:836
msgid "year(s)"
msgstr ""
#: apps/transactions/models.py:821
#: apps/transactions/models.py:838
#: templates/recurring_transactions/fragments/list.html:18
msgid "Paused"
msgstr ""
#: apps/transactions/models.py:860
#: apps/transactions/models.py:877
msgid "Recurrence Type"
msgstr ""
#: apps/transactions/models.py:863
#: apps/transactions/models.py:880
msgid "Recurrence Interval"
msgstr ""
#: apps/transactions/models.py:866
#: apps/transactions/models.py:883
msgid "Keep at most"
msgstr ""
#: apps/transactions/models.py:870
#: apps/transactions/models.py:887
msgid "Last Generated Date"
msgstr ""
#: apps/transactions/models.py:873
#: apps/transactions/models.py:890
msgid "Last Generated Reference Date"
msgstr ""
#: apps/transactions/models.py:1117
#: apps/transactions/models.py:1138
#: apps/transactions/views/quick_transactions.py:178
#: apps/transactions/views/quick_transactions.py:187
#: apps/transactions/views/quick_transactions.py:189
@@ -1665,7 +1665,7 @@ msgstr ""
msgid "Quick Transaction"
msgstr ""
#: apps/transactions/models.py:1118 templates/includes/sidebar.html:98
#: apps/transactions/models.py:1139 templates/includes/sidebar.html:98
#: templates/quick_transactions/pages/index.html:5
#: templates/quick_transactions/pages/index.html:15
msgid "Quick Transactions"
@@ -1889,9 +1889,9 @@ msgstr ""
#: apps/users/forms.py:68 apps/users/forms.py:81 apps/users/forms.py:103
#: templates/monthly_overview/pages/overview.html:98
#: templates/monthly_overview/pages/overview.html:245
#: templates/monthly_overview/pages/overview.html:247
#: templates/transactions/pages/transactions.html:47
#: templates/transactions/pages/transactions.html:195
#: templates/transactions/pages/transactions.html:196
msgid "Default"
msgstr ""
@@ -1911,7 +1911,7 @@ msgstr ""
msgid "Default Account"
msgstr ""
#: apps/users/forms.py:178
#: apps/users/forms.py:177
#, python-format
msgid ""
"This changes the language (if available) and how numbers and dates are "
@@ -1919,79 +1919,79 @@ msgid ""
"Consider helping translate WYGIWYH to your language at %(translation_link)s"
msgstr ""
#: apps/users/forms.py:187
#: apps/users/forms.py:186
msgid "New Password"
msgstr ""
#: apps/users/forms.py:190
#: apps/users/forms.py:189
msgid "Leave blank to keep the current password."
msgstr ""
#: apps/users/forms.py:193
#: apps/users/forms.py:192
msgid "Confirm New Password"
msgstr ""
#: apps/users/forms.py:205 apps/users/forms.py:362
#: apps/users/forms.py:204 apps/users/forms.py:361
msgid ""
"Designates whether this user should be treated as active. Unselect this "
"instead of deleting accounts."
msgstr ""
#: apps/users/forms.py:208 apps/users/forms.py:365
#: apps/users/forms.py:207 apps/users/forms.py:364
msgid ""
"Designates that this user has all permissions without explicitly assigning "
"them."
msgstr ""
#: apps/users/forms.py:275
#: apps/users/forms.py:274
msgid "This email address is already in use by another account."
msgstr ""
#: apps/users/forms.py:283
#: apps/users/forms.py:282
msgid "The two password fields didn't match."
msgstr ""
#: apps/users/forms.py:285
#: apps/users/forms.py:284
msgid "Please confirm your new password."
msgstr ""
#: apps/users/forms.py:287
#: apps/users/forms.py:286
msgid "Please enter the new password first."
msgstr ""
#: apps/users/forms.py:307
#: apps/users/forms.py:306
msgid "You cannot deactivate your own account using this form."
msgstr ""
#: apps/users/forms.py:320
#: apps/users/forms.py:319
msgid "Cannot remove status from the last superuser."
msgstr ""
#: apps/users/forms.py:326
#: apps/users/forms.py:325
msgid "You cannot remove your own superuser status using this form."
msgstr ""
#: apps/users/forms.py:419
#: apps/users/forms.py:418
msgid "A user with this email address already exists."
msgstr ""
#: apps/users/forms.py:439
#: apps/users/forms.py:438
msgid "Token name"
msgstr ""
#: apps/users/forms.py:441
#: apps/users/forms.py:440
msgid "Use a descriptive name such as n8n, Home Assistant, or backup job."
msgstr ""
#: apps/users/forms.py:447
#: apps/users/forms.py:446
msgid "Expires in days"
msgstr ""
#: apps/users/forms.py:448
#: apps/users/forms.py:447
msgid "Leave empty for a non-expiring token."
msgstr ""
#: apps/users/forms.py:463
#: apps/users/forms.py:462
msgid "Create token"
msgstr ""
@@ -2212,6 +2212,7 @@ msgstr ""
#: templates/rules/fragments/transaction_rule/view.html:92
#: templates/rules/fragments/transaction_rule/view.html:133
#: templates/tags/fragments/table.html:51
#: templates/transactions/fragments/filter_presets.html:28
#: templates/users/fragments/api_tokens.html:93
msgid "Delete"
msgstr ""
@@ -2316,8 +2317,8 @@ msgid "Current balance"
msgstr ""
#: templates/accounts/fragments/account_reconciliation.html:36
#: templates/net_worth/net_worth.html:146
#: templates/net_worth/net_worth.html:396
#: templates/net_worth/net_worth.html:147
#: templates/net_worth/net_worth.html:407
msgid "Difference"
msgstr ""
@@ -2697,19 +2698,19 @@ msgstr ""
msgid "Amount Bought"
msgstr ""
#: templates/dca/fragments/strategy/details.html:384
#: templates/dca/fragments/strategy/details.html:409
msgid "Entry Price vs Current Price"
msgstr ""
#: templates/dca/fragments/strategy/details.html:398
#: templates/dca/fragments/strategy/details.html:423
msgid "Days Between Investments"
msgstr ""
#: templates/dca/fragments/strategy/details.html:444
#: templates/dca/fragments/strategy/details.html:469
msgid "Investment Frequency"
msgstr ""
#: templates/dca/fragments/strategy/details.html:446
#: templates/dca/fragments/strategy/details.html:471
msgid "The straighter the blue line, the more consistent your DCA strategy is."
msgstr ""
@@ -2946,6 +2947,7 @@ msgid "Reload"
msgstr ""
#: templates/includes/scripts/hyperscript/swal.html:13
#: templates/transactions/fragments/filter_actions.html:4
msgid "Cancel"
msgstr ""
@@ -3360,16 +3362,16 @@ msgid "Summary"
msgstr ""
#: templates/monthly_overview/pages/overview.html:99
#: templates/monthly_overview/pages/overview.html:254
#: templates/monthly_overview/pages/overview.html:256
#: templates/transactions/pages/transactions.html:48
#: templates/transactions/pages/transactions.html:204
#: templates/transactions/pages/transactions.html:205
msgid "Oldest first"
msgstr ""
#: templates/monthly_overview/pages/overview.html:100
#: templates/monthly_overview/pages/overview.html:263
#: templates/monthly_overview/pages/overview.html:265
#: templates/transactions/pages/transactions.html:49
#: templates/transactions/pages/transactions.html:213
#: templates/transactions/pages/transactions.html:214
msgid "Newest first"
msgstr ""
@@ -3378,8 +3380,8 @@ msgstr ""
msgid "Filter transactions"
msgstr ""
#: templates/monthly_overview/pages/overview.html:235
#: templates/transactions/pages/transactions.html:185
#: templates/monthly_overview/pages/overview.html:237
#: templates/transactions/pages/transactions.html:186
msgid "Order by"
msgstr ""
@@ -3388,24 +3390,24 @@ msgstr ""
msgid "By currency"
msgstr ""
#: templates/net_worth/net_worth.html:84
#: templates/net_worth/net_worth.html:84 templates/net_worth/net_worth.html:85
msgid "Consolidated"
msgstr ""
#: templates/net_worth/net_worth.html:134
#: templates/net_worth/net_worth.html:135
msgid "Evolution"
msgstr ""
#: templates/net_worth/net_worth.html:162
#: templates/net_worth/net_worth.html:163
#: templates/yearly_overview/pages/overview_by_account.html:4
msgid "By account"
msgstr ""
#: templates/net_worth/net_worth.html:270
#: templates/net_worth/net_worth.html:271
msgid "Evolution by currency"
msgstr ""
#: templates/net_worth/net_worth.html:334
#: templates/net_worth/net_worth.html:345
msgid "Evolution by account"
msgstr ""
@@ -3636,6 +3638,40 @@ msgstr ""
msgid "transactions"
msgstr ""
#: templates/transactions/fragments/filter_actions.html:2
msgid "Save filter preset"
msgstr ""
#: templates/transactions/fragments/filter_actions.html:3
msgid "Preset name"
msgstr ""
#: templates/transactions/fragments/filter_actions.html:40
msgid "Save preset"
msgstr ""
#: templates/transactions/fragments/filter_presets.html:6
msgid "Filter presets"
msgstr ""
#: templates/transactions/fragments/filter_presets.html:21
#, python-format
msgid "Delete %(name)s"
msgstr ""
#: templates/transactions/fragments/filter_presets.html:26
msgid "Delete filter preset?"
msgstr ""
#: templates/transactions/fragments/filter_presets.html:27
#, python-format
msgid "Delete “%(name)s”?"
msgstr ""
#: templates/transactions/fragments/filter_presets.html:34
msgid "No saved presets"
msgstr ""
#: templates/transactions/fragments/list_all.html:58
msgid "No transactions found"
msgstr ""
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+212 -176
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-04 15:39+0000\n"
"POT-Creation-Date: 2026-08-16 04:46+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -29,8 +29,8 @@ msgstr ""
#: apps/transactions/forms.py:417 apps/transactions/forms.py:536
#: apps/transactions/forms.py:880 apps/transactions/forms.py:919
#: apps/transactions/forms.py:947 apps/transactions/forms.py:978
#: apps/transactions/forms.py:1128 apps/users/forms.py:246
#: apps/users/forms.py:404
#: apps/transactions/forms.py:1128 apps/users/forms.py:245
#: apps/users/forms.py:403
#: templates/rules/fragments/transaction_rule/dry_run/updated.html:5
#: templates/rules/fragments/transaction_rule/view.html:128
msgid "Update"
@@ -45,7 +45,7 @@ msgstr ""
#: apps/transactions/forms.py:424 apps/transactions/forms.py:886
#: apps/transactions/forms.py:925 apps/transactions/forms.py:953
#: apps/transactions/forms.py:984 apps/transactions/forms.py:1134
#: apps/users/forms.py:252 apps/users/forms.py:410
#: apps/users/forms.py:251 apps/users/forms.py:409
#: templates/mini_tools/unit_price_calculator.html:168
msgid "Add"
msgstr ""
@@ -64,9 +64,9 @@ msgstr ""
#: apps/transactions/forms.py:61 apps/transactions/forms.py:307
#: apps/transactions/forms.py:475 apps/transactions/forms.py:572
#: apps/transactions/forms.py:579 apps/transactions/forms.py:763
#: apps/transactions/forms.py:1007 apps/transactions/models.py:331
#: apps/transactions/models.py:641 apps/transactions/models.py:841
#: apps/transactions/models.py:1089
#: apps/transactions/forms.py:1007 apps/transactions/models.py:346
#: apps/transactions/models.py:658 apps/transactions/models.py:858
#: apps/transactions/models.py:1110
#: templates/insights/fragments/category_overview/index.html:86
#: templates/insights/fragments/category_overview/index.html:542
#: templates/insights/fragments/month_by_month.html:84
@@ -77,13 +77,13 @@ msgstr ""
#: apps/accounts/forms.py:132 apps/dca/forms.py:95 apps/dca/forms.py:103
#: apps/export_app/forms.py:43 apps/export_app/forms.py:132
#: apps/rules/forms.py:184 apps/rules/forms.py:194 apps/rules/models.py:45
#: apps/rules/models.py:315 apps/transactions/filters.py:73
#: apps/rules/models.py:315 apps/transactions/filters.py:79
#: apps/transactions/forms.py:69 apps/transactions/forms.py:315
#: apps/transactions/forms.py:483 apps/transactions/forms.py:588
#: apps/transactions/forms.py:596 apps/transactions/forms.py:756
#: apps/transactions/forms.py:1000 apps/transactions/models.py:337
#: apps/transactions/models.py:643 apps/transactions/models.py:845
#: apps/transactions/models.py:1095 templates/includes/sidebar.html:150
#: apps/transactions/forms.py:1000 apps/transactions/models.py:352
#: apps/transactions/models.py:660 apps/transactions/models.py:862
#: apps/transactions/models.py:1116 templates/includes/sidebar.html:150
#: templates/insights/fragments/category_overview/index.html:40
#: templates/insights/fragments/month_by_month.html:29
#: templates/insights/fragments/month_by_month.html:32
@@ -95,8 +95,8 @@ msgstr ""
#: apps/accounts/models.py:12 apps/accounts/models.py:29 apps/dca/models.py:13
#: apps/import_app/models.py:14 apps/rules/models.py:13
#: apps/transactions/models.py:223 apps/transactions/models.py:248
#: apps/transactions/models.py:272 apps/transactions/models.py:1057
#: apps/transactions/models.py:238 apps/transactions/models.py:263
#: apps/transactions/models.py:287 apps/transactions/models.py:1078
#: apps/users/models.py:572 templates/account_groups/fragments/list.html:22
#: templates/accounts/fragments/list.html:22
#: templates/categories/fragments/table.html:17
@@ -164,9 +164,9 @@ msgstr ""
#: apps/rules/models.py:35 apps/rules/models.py:267
#: apps/transactions/forms.py:81 apps/transactions/forms.py:327
#: apps/transactions/forms.py:442 apps/transactions/forms.py:748
#: apps/transactions/forms.py:992 apps/transactions/models.py:303
#: apps/transactions/models.py:601 apps/transactions/models.py:823
#: apps/transactions/models.py:1063
#: apps/transactions/forms.py:992 apps/transactions/models.py:318
#: apps/transactions/models.py:618 apps/transactions/models.py:840
#: apps/transactions/models.py:1084
#: templates/installment_plans/fragments/table.html:17
#: templates/quick_transactions/fragments/list.html:14
#: templates/recurring_transactions/fragments/table.html:19
@@ -175,7 +175,7 @@ msgid "Account"
msgstr ""
#: apps/accounts/models.py:76 apps/export_app/forms.py:19
#: apps/export_app/forms.py:129 apps/transactions/filters.py:57
#: apps/export_app/forms.py:129 apps/transactions/filters.py:63
#: templates/accounts/fragments/list.html:9
#: templates/accounts/pages/index.html:4 templates/includes/sidebar.html:162
#: templates/includes/sidebar.html:164
@@ -343,7 +343,8 @@ msgid ""
"owner.<br/>Public: Shown for all users. Only editable by the owner."
msgstr ""
#: apps/common/forms.py:76 apps/users/forms.py:173
#: apps/common/forms.py:76 apps/users/forms.py:172
#: templates/transactions/fragments/filter_actions.html:5
msgid "Save"
msgstr ""
@@ -458,10 +459,9 @@ msgstr ""
#: apps/common/widgets/tom_select.py:15
#: templates/mini_tools/unit_price_calculator.html:180
#: templates/monthly_overview/pages/overview.html:275
#: templates/monthly_overview/pages/overview.html:287
#: templates/transactions/pages/transactions.html:225
#: templates/transactions/pages/transactions.html:237
#: templates/monthly_overview/pages/overview.html:284
#: templates/transactions/fragments/filter_actions.html:48
#: templates/transactions/pages/transactions.html:233
msgid "Clear"
msgstr ""
@@ -480,7 +480,7 @@ msgstr ""
#: apps/currencies/forms.py:66 apps/dca/models.py:158 apps/rules/forms.py:176
#: apps/rules/forms.py:190 apps/rules/models.py:38 apps/rules/models.py:279
#: apps/transactions/forms.py:85 apps/transactions/forms.py:447
#: apps/transactions/forms.py:600 apps/transactions/models.py:313
#: apps/transactions/forms.py:600 apps/transactions/models.py:328
#: templates/dca/fragments/strategy/details.html:49
#: templates/exchange_rates/fragments/table.html:10
#: templates/exchange_rates_services/fragments/table.html:11
@@ -500,7 +500,7 @@ msgid "Decimal Places"
msgstr ""
#: apps/currencies/models.py:45 apps/export_app/forms.py:25
#: apps/export_app/forms.py:130 apps/transactions/filters.py:64
#: apps/export_app/forms.py:130 apps/transactions/filters.py:70
#: templates/currencies/fragments/list.html:9
#: templates/currencies/pages/index.html:4 templates/includes/sidebar.html:176
#: templates/includes/sidebar.html:178
@@ -545,29 +545,29 @@ msgstr ""
msgid "From and To currencies cannot be the same."
msgstr ""
#: apps/currencies/models.py:110
#: apps/currencies/models.py:111
msgid "On"
msgstr ""
#: apps/currencies/models.py:111
#: apps/currencies/models.py:112
msgid "Every X hours"
msgstr ""
#: apps/currencies/models.py:112
#: apps/currencies/models.py:113
msgid "Not on"
msgstr ""
#: apps/currencies/models.py:114
#: apps/currencies/models.py:115
msgid "Service Name"
msgstr ""
#: apps/currencies/models.py:116
#: apps/currencies/models.py:117
msgid "Service Type"
msgstr ""
#: apps/currencies/models.py:118 apps/transactions/filters.py:27
#: apps/transactions/models.py:227 apps/transactions/models.py:251
#: apps/transactions/models.py:275 templates/categories/fragments/list.html:16
#: apps/currencies/models.py:119 apps/transactions/filters.py:27
#: apps/transactions/models.py:242 apps/transactions/models.py:266
#: apps/transactions/models.py:290 templates/categories/fragments/list.html:16
#: templates/entities/fragments/list.html:16
#: templates/installment_plans/fragments/list.html:16
#: templates/recurring_transactions/fragments/list.html:16
@@ -577,77 +577,77 @@ msgstr ""
msgid "Active"
msgstr ""
#: apps/currencies/models.py:123
#: apps/currencies/models.py:124
msgid "API Key"
msgstr ""
#: apps/currencies/models.py:124
#: apps/currencies/models.py:125
msgid "API key for the service (if required)"
msgstr ""
#: apps/currencies/models.py:129
#: apps/currencies/models.py:130
msgid "Interval Type"
msgstr ""
#: apps/currencies/models.py:133
#: apps/currencies/models.py:134
msgid "Interval"
msgstr ""
#: apps/currencies/models.py:136
#: apps/currencies/models.py:137
msgid "Last Successful Fetch"
msgstr ""
#: apps/currencies/models.py:143
#: apps/currencies/models.py:144
msgid "Target Currencies"
msgstr ""
#: apps/currencies/models.py:145
#: apps/currencies/models.py:146
msgid ""
"Select currencies to fetch exchange rates for. Rates will be fetched for "
"each currency against their set exchange currency."
msgstr ""
#: apps/currencies/models.py:153
#: apps/currencies/models.py:154
msgid "Target Accounts"
msgstr ""
#: apps/currencies/models.py:155
#: apps/currencies/models.py:156
msgid ""
"Select accounts to fetch exchange rates for. Rates will be fetched for each "
"account's currency against their set exchange currency."
msgstr ""
#: apps/currencies/models.py:162
#: apps/currencies/models.py:163
msgid "Single exchange rate"
msgstr ""
#: apps/currencies/models.py:165
#: apps/currencies/models.py:166
msgid "Create one exchange rate and keep updating it. Avoids database clutter."
msgstr ""
#: apps/currencies/models.py:170
#: apps/currencies/models.py:171
msgid "Exchange Rate Service"
msgstr ""
#: apps/currencies/models.py:171
#: apps/currencies/models.py:172
msgid "Exchange Rate Services"
msgstr ""
#: apps/currencies/models.py:223
#: apps/currencies/models.py:224
msgid "'Every X hours' interval type requires a positive integer."
msgstr ""
#: apps/currencies/models.py:232
#: apps/currencies/models.py:233
msgid "'Every X hours' interval must be between 1 and 24."
msgstr ""
#: apps/currencies/models.py:246
#: apps/currencies/models.py:247
msgid ""
"Invalid hour format. Use comma-separated hours (0-23) and/or ranges (e.g., "
"'1-5,8,10-12')."
msgstr ""
#: apps/currencies/models.py:257
#: apps/currencies/models.py:258
msgid ""
"Invalid format. Please check the requirements for your selected interval "
"type."
@@ -746,8 +746,8 @@ msgstr ""
#: apps/dca/models.py:26 apps/dca/models.py:181 apps/rules/forms.py:180
#: apps/rules/forms.py:196 apps/rules/models.py:43 apps/rules/models.py:295
#: apps/transactions/forms.py:469 apps/transactions/forms.py:616
#: apps/transactions/models.py:327 apps/transactions/models.py:650
#: apps/transactions/models.py:851 apps/transactions/models.py:1085
#: apps/transactions/models.py:342 apps/transactions/models.py:667
#: apps/transactions/models.py:868 apps/transactions/models.py:1106
msgid "Notes"
msgstr ""
@@ -810,7 +810,7 @@ msgid "Users"
msgstr ""
#: apps/export_app/forms.py:31 apps/export_app/forms.py:134
#: apps/transactions/models.py:388 templates/includes/sidebar.html:81
#: apps/transactions/models.py:403 templates/includes/sidebar.html:81
#: templates/includes/sidebar.html:142
#: templates/recurring_transactions/fragments/list_transactions.html:5
#: templates/recurring_transactions/fragments/table.html:37
@@ -819,7 +819,7 @@ msgid "Transactions"
msgstr ""
#: apps/export_app/forms.py:37 apps/export_app/forms.py:131
#: apps/transactions/filters.py:68 templates/categories/fragments/list.html:9
#: apps/transactions/filters.py:74 templates/categories/fragments/list.html:9
#: templates/categories/pages/index.html:4 templates/includes/sidebar.html:144
#: templates/insights/fragments/month_by_month.html:18
#: templates/insights/fragments/month_by_month.html:21
@@ -830,12 +830,12 @@ msgstr ""
#: apps/export_app/forms.py:49 apps/export_app/forms.py:133
#: apps/rules/forms.py:185 apps/rules/forms.py:195 apps/rules/models.py:46
#: apps/rules/models.py:307 apps/transactions/filters.py:78
#: apps/rules/models.py:307 apps/transactions/filters.py:84
#: apps/transactions/forms.py:77 apps/transactions/forms.py:323
#: apps/transactions/forms.py:491 apps/transactions/forms.py:771
#: apps/transactions/forms.py:1015 apps/transactions/models.py:286
#: apps/transactions/models.py:342 apps/transactions/models.py:646
#: apps/transactions/models.py:848 apps/transactions/models.py:1100
#: apps/transactions/forms.py:1015 apps/transactions/models.py:301
#: apps/transactions/models.py:357 apps/transactions/models.py:663
#: apps/transactions/models.py:865 apps/transactions/models.py:1121
#: templates/entities/fragments/list.html:9
#: templates/entities/pages/index.html:4 templates/includes/sidebar.html:156
#: templates/insights/fragments/category_overview/index.html:54
@@ -847,14 +847,14 @@ msgid "Entities"
msgstr ""
#: apps/export_app/forms.py:55 apps/export_app/forms.py:137
#: apps/transactions/models.py:888 templates/includes/sidebar.html:110
#: apps/transactions/models.py:905 templates/includes/sidebar.html:110
#: templates/recurring_transactions/fragments/list.html:9
#: templates/recurring_transactions/pages/index.html:4
msgid "Recurring Transactions"
msgstr ""
#: apps/export_app/forms.py:61 apps/export_app/forms.py:135
#: apps/transactions/models.py:664 templates/includes/sidebar.html:104
#: apps/transactions/models.py:681 templates/includes/sidebar.html:104
#: templates/installment_plans/fragments/list.html:9
#: templates/installment_plans/pages/index.html:4
msgid "Installment Plans"
@@ -1006,7 +1006,7 @@ msgid "Run deleted successfully"
msgstr ""
#: apps/insights/forms.py:118 apps/insights/utils/sankey.py:36
#: apps/insights/utils/sankey.py:167 apps/transactions/filters.py:203
#: apps/insights/utils/sankey.py:167 apps/transactions/filters.py:209
#: templates/insights/fragments/category_overview/index.html:96
#: templates/insights/fragments/category_overview/index.html:407
#: templates/insights/fragments/category_overview/index.html:436
@@ -1104,15 +1104,15 @@ msgstr ""
#: apps/rules/forms.py:174 apps/rules/forms.py:188 apps/rules/models.py:36
#: apps/rules/models.py:271 apps/transactions/forms.py:433
#: apps/transactions/models.py:310 apps/transactions/models.py:606
#: apps/transactions/models.py:829 apps/transactions/models.py:1070
#: apps/transactions/models.py:325 apps/transactions/models.py:623
#: apps/transactions/models.py:846 apps/transactions/models.py:1091
msgid "Type"
msgstr ""
#: apps/rules/forms.py:175 apps/rules/forms.py:189 apps/rules/models.py:37
#: apps/rules/models.py:275 apps/transactions/filters.py:22
#: apps/transactions/forms.py:437 apps/transactions/models.py:312
#: apps/transactions/models.py:1072 templates/cotton/transaction/item.html:20
#: apps/transactions/forms.py:437 apps/transactions/models.py:327
#: apps/transactions/models.py:1093 templates/cotton/transaction/item.html:20
#: templates/cotton/transaction/item.html:31
#: templates/transactions/widgets/paid_toggle_button.html:10
#: templates/transactions/widgets/unselectable_paid_toggle_button.html:13
@@ -1122,15 +1122,15 @@ msgstr ""
#: apps/rules/forms.py:177 apps/rules/forms.py:191 apps/rules/models.py:39
#: apps/rules/models.py:283 apps/transactions/forms.py:89
#: apps/transactions/forms.py:453 apps/transactions/forms.py:603
#: apps/transactions/forms.py:777 apps/transactions/models.py:314
#: apps/transactions/models.py:624 apps/transactions/models.py:853
#: apps/transactions/forms.py:777 apps/transactions/models.py:329
#: apps/transactions/models.py:641 apps/transactions/models.py:870
msgid "Reference Date"
msgstr ""
#: apps/rules/forms.py:178 apps/rules/forms.py:192 apps/rules/models.py:41
#: apps/rules/models.py:287 apps/transactions/forms.py:460
#: apps/transactions/models.py:320 apps/transactions/models.py:834
#: apps/transactions/models.py:1078
#: apps/transactions/models.py:335 apps/transactions/models.py:851
#: apps/transactions/models.py:1099
#: templates/insights/fragments/sankey.html:102
#: templates/installment_plans/fragments/table.html:18
#: templates/quick_transactions/fragments/list.html:15
@@ -1141,27 +1141,27 @@ msgstr ""
#: apps/rules/forms.py:179 apps/rules/forms.py:193 apps/rules/models.py:14
#: apps/rules/models.py:42 apps/rules/models.py:291
#: apps/transactions/forms.py:464 apps/transactions/forms.py:607
#: apps/transactions/models.py:325 apps/transactions/models.py:608
#: apps/transactions/models.py:837 apps/transactions/models.py:1083
#: apps/transactions/models.py:340 apps/transactions/models.py:625
#: apps/transactions/models.py:854 apps/transactions/models.py:1104
msgid "Description"
msgstr ""
#: apps/rules/forms.py:182 apps/rules/forms.py:198 apps/rules/models.py:47
#: apps/rules/models.py:299 apps/transactions/models.py:364
#: apps/transactions/models.py:1105
#: apps/rules/models.py:299 apps/transactions/models.py:379
#: apps/transactions/models.py:1126
msgid "Internal Note"
msgstr ""
#: apps/rules/forms.py:183 apps/rules/forms.py:199 apps/rules/models.py:48
#: apps/rules/models.py:303 apps/transactions/models.py:366
#: apps/transactions/models.py:1107
#: apps/rules/models.py:303 apps/transactions/models.py:381
#: apps/transactions/models.py:1128
msgid "Internal ID"
msgstr ""
#: apps/rules/forms.py:186 apps/rules/forms.py:200 apps/rules/models.py:40
#: apps/rules/models.py:319 apps/transactions/forms.py:620
#: apps/transactions/models.py:224 apps/transactions/models.py:315
#: apps/transactions/models.py:1073
#: apps/transactions/models.py:239 apps/transactions/models.py:330
#: apps/transactions/models.py:1094
msgid "Mute"
msgstr ""
@@ -1174,7 +1174,7 @@ msgid "Set Values"
msgstr ""
#: apps/rules/forms.py:407 apps/rules/forms.py:442 apps/rules/forms.py:477
#: apps/transactions/models.py:387 apps/transactions/models.py:544
#: apps/transactions/models.py:402 apps/transactions/models.py:560
msgid "Transaction"
msgstr ""
@@ -1321,58 +1321,58 @@ msgstr ""
msgid "Muted"
msgstr ""
#: apps/transactions/filters.py:45
#: apps/transactions/filters.py:51
msgid "Content"
msgstr ""
#: apps/transactions/filters.py:51
#: apps/transactions/filters.py:57
msgid "Transaction Type"
msgstr ""
#: apps/transactions/filters.py:89
#: apps/transactions/filters.py:95
msgid "Mute Status"
msgstr ""
#: apps/transactions/filters.py:94
#: apps/transactions/filters.py:100
msgid "Date from"
msgstr ""
#: apps/transactions/filters.py:99 apps/transactions/filters.py:109
#: apps/transactions/filters.py:105 apps/transactions/filters.py:115
msgid "Until"
msgstr ""
#: apps/transactions/filters.py:104
#: apps/transactions/filters.py:110
msgid "Reference date from"
msgstr ""
#: apps/transactions/filters.py:114
#: apps/transactions/filters.py:120
msgid "Amount min"
msgstr ""
#: apps/transactions/filters.py:119
#: apps/transactions/filters.py:125
msgid "Amount max"
msgstr ""
#: apps/transactions/filters.py:202
#: apps/transactions/filters.py:208
msgid "Categorized"
msgstr ""
#: apps/transactions/filters.py:209
#: apps/transactions/filters.py:215
msgid "Tagged"
msgstr ""
#: apps/transactions/filters.py:209
#: apps/transactions/filters.py:215
#: templates/insights/fragments/category_overview/index.html:189
#: templates/insights/fragments/month_by_month.html:121
#: templates/insights/fragments/year_by_year.html:75
msgid "Untagged"
msgstr ""
#: apps/transactions/filters.py:215
#: apps/transactions/filters.py:221
msgid "Any entity"
msgstr ""
#: apps/transactions/filters.py:216
#: apps/transactions/filters.py:222
#: templates/insights/fragments/category_overview/index.html:282
#: templates/insights/fragments/month_by_month.html:123
#: templates/insights/fragments/year_by_year.html:77
@@ -1447,42 +1447,42 @@ msgstr ""
msgid "End date should be after the start date"
msgstr ""
#: apps/transactions/models.py:229
#: apps/transactions/models.py:244
msgid ""
"Deactivated categories won't be able to be selected when creating new "
"transactions"
msgstr ""
#: apps/transactions/models.py:237
#: apps/transactions/models.py:252
msgid "Transaction Category"
msgstr ""
#: apps/transactions/models.py:238
#: apps/transactions/models.py:253
msgid "Transaction Categories"
msgstr ""
#: apps/transactions/models.py:253
#: apps/transactions/models.py:268
msgid ""
"Deactivated tags won't be able to be selected when creating new transactions"
msgstr ""
#: apps/transactions/models.py:261 apps/transactions/models.py:262
#: apps/transactions/models.py:276 apps/transactions/models.py:277
msgid "Transaction Tags"
msgstr ""
#: apps/transactions/models.py:277
#: apps/transactions/models.py:292
msgid ""
"Deactivated entities won't be able to be selected when creating new "
"transactions"
msgstr ""
#: apps/transactions/models.py:285
#: apps/transactions/models.py:300
#: templates/insights/fragments/month_by_month.html:88
#: templates/insights/fragments/year_by_year.html:56
msgid "Entity"
msgstr ""
#: apps/transactions/models.py:297 apps/transactions/models.py:1050
#: apps/transactions/models.py:312 apps/transactions/models.py:1071
#: templates/calendar_view/fragments/list.html:42
#: templates/calendar_view/fragments/list.html:44
#: templates/calendar_view/fragments/list.html:52
@@ -1494,7 +1494,7 @@ msgstr ""
msgid "Income"
msgstr ""
#: apps/transactions/models.py:298 apps/transactions/models.py:1051
#: apps/transactions/models.py:313 apps/transactions/models.py:1072
#: templates/calendar_view/fragments/list.html:46
#: templates/calendar_view/fragments/list.html:48
#: templates/calendar_view/fragments/list.html:56
@@ -1505,157 +1505,157 @@ msgstr ""
msgid "Expense"
msgstr ""
#: apps/transactions/models.py:353 apps/transactions/models.py:663
#: apps/transactions/models.py:368 apps/transactions/models.py:680
msgid "Installment Plan"
msgstr ""
#: apps/transactions/models.py:362 apps/transactions/models.py:887
#: apps/transactions/models.py:377 apps/transactions/models.py:904
msgid "Recurring Transaction"
msgstr ""
#: apps/transactions/models.py:370
#: apps/transactions/models.py:385
msgid "Deleted"
msgstr ""
#: apps/transactions/models.py:375
#: apps/transactions/models.py:390
msgid "Deleted At"
msgstr ""
#: apps/transactions/models.py:489 templates/tags/fragments/table.html:69
#: apps/transactions/models.py:504 templates/tags/fragments/table.html:69
msgid "No tags"
msgstr ""
#: apps/transactions/models.py:491
#: apps/transactions/models.py:506
msgid "No category"
msgstr ""
#: apps/transactions/models.py:493
#: apps/transactions/models.py:508
msgid "No description"
msgstr ""
#: apps/transactions/models.py:549
#: apps/transactions/models.py:565
msgid "File"
msgstr ""
#: apps/transactions/models.py:551
#: apps/transactions/models.py:567
msgid "Original Name"
msgstr ""
#: apps/transactions/models.py:553
#: apps/transactions/models.py:569
msgid "Content Type"
msgstr ""
#: apps/transactions/models.py:555
#: apps/transactions/models.py:571
msgid "Size"
msgstr ""
#: apps/transactions/models.py:560
#: apps/transactions/models.py:576
msgid "Uploaded By"
msgstr ""
#: apps/transactions/models.py:565
#: apps/transactions/models.py:581
msgid "Transaction Attachment"
msgstr ""
#: apps/transactions/models.py:566
#: apps/transactions/models.py:582
msgid "Transaction Attachments"
msgstr ""
#: apps/transactions/models.py:595 templates/includes/sidebar.html:57
#: apps/transactions/models.py:612 templates/includes/sidebar.html:57
msgid "Yearly"
msgstr ""
#: apps/transactions/models.py:596 apps/users/models.py:469
#: apps/transactions/models.py:613 apps/users/models.py:469
#: templates/includes/sidebar.html:51
msgid "Monthly"
msgstr ""
#: apps/transactions/models.py:597
#: apps/transactions/models.py:614
msgid "Weekly"
msgstr ""
#: apps/transactions/models.py:598
#: apps/transactions/models.py:615
msgid "Daily"
msgstr ""
#: apps/transactions/models.py:611
#: apps/transactions/models.py:628
msgid "Number of Installments"
msgstr ""
#: apps/transactions/models.py:616
#: apps/transactions/models.py:633
msgid "Installment Start"
msgstr ""
#: apps/transactions/models.py:617
#: apps/transactions/models.py:634
msgid "The installment number to start counting from"
msgstr ""
#: apps/transactions/models.py:622 apps/transactions/models.py:857
#: apps/transactions/models.py:639 apps/transactions/models.py:874
msgid "Start Date"
msgstr ""
#: apps/transactions/models.py:626 apps/transactions/models.py:858
#: apps/transactions/models.py:643 apps/transactions/models.py:875
msgid "End Date"
msgstr ""
#: apps/transactions/models.py:631
#: apps/transactions/models.py:648
msgid "Recurrence"
msgstr ""
#: apps/transactions/models.py:634
#: apps/transactions/models.py:651
msgid "Installment Amount"
msgstr ""
#: apps/transactions/models.py:653 apps/transactions/models.py:877
#: apps/transactions/models.py:670 apps/transactions/models.py:894
msgid "Add description to transactions"
msgstr ""
#: apps/transactions/models.py:656 apps/transactions/models.py:880
#: apps/transactions/models.py:673 apps/transactions/models.py:897
msgid "Add notes to transactions"
msgstr ""
#: apps/transactions/models.py:816
#: apps/transactions/models.py:833
msgid "day(s)"
msgstr ""
#: apps/transactions/models.py:817
#: apps/transactions/models.py:834
msgid "week(s)"
msgstr ""
#: apps/transactions/models.py:818
#: apps/transactions/models.py:835
msgid "month(s)"
msgstr ""
#: apps/transactions/models.py:819
#: apps/transactions/models.py:836
msgid "year(s)"
msgstr ""
#: apps/transactions/models.py:821
#: apps/transactions/models.py:838
#: templates/recurring_transactions/fragments/list.html:18
msgid "Paused"
msgstr ""
#: apps/transactions/models.py:860
#: apps/transactions/models.py:877
msgid "Recurrence Type"
msgstr ""
#: apps/transactions/models.py:863
#: apps/transactions/models.py:880
msgid "Recurrence Interval"
msgstr ""
#: apps/transactions/models.py:866
#: apps/transactions/models.py:883
msgid "Keep at most"
msgstr ""
#: apps/transactions/models.py:870
#: apps/transactions/models.py:887
msgid "Last Generated Date"
msgstr ""
#: apps/transactions/models.py:873
#: apps/transactions/models.py:890
msgid "Last Generated Reference Date"
msgstr ""
#: apps/transactions/models.py:1117
#: apps/transactions/models.py:1138
#: apps/transactions/views/quick_transactions.py:178
#: apps/transactions/views/quick_transactions.py:187
#: apps/transactions/views/quick_transactions.py:189
@@ -1664,7 +1664,7 @@ msgstr ""
msgid "Quick Transaction"
msgstr ""
#: apps/transactions/models.py:1118 templates/includes/sidebar.html:98
#: apps/transactions/models.py:1139 templates/includes/sidebar.html:98
#: templates/quick_transactions/pages/index.html:5
#: templates/quick_transactions/pages/index.html:15
msgid "Quick Transactions"
@@ -1888,9 +1888,9 @@ msgstr ""
#: apps/users/forms.py:68 apps/users/forms.py:81 apps/users/forms.py:103
#: templates/monthly_overview/pages/overview.html:98
#: templates/monthly_overview/pages/overview.html:245
#: templates/monthly_overview/pages/overview.html:247
#: templates/transactions/pages/transactions.html:47
#: templates/transactions/pages/transactions.html:195
#: templates/transactions/pages/transactions.html:196
msgid "Default"
msgstr ""
@@ -1910,7 +1910,7 @@ msgstr ""
msgid "Default Account"
msgstr ""
#: apps/users/forms.py:178
#: apps/users/forms.py:177
#, python-format
msgid ""
"This changes the language (if available) and how numbers and dates are "
@@ -1918,79 +1918,79 @@ msgid ""
"Consider helping translate WYGIWYH to your language at %(translation_link)s"
msgstr ""
#: apps/users/forms.py:187
#: apps/users/forms.py:186
msgid "New Password"
msgstr ""
#: apps/users/forms.py:190
#: apps/users/forms.py:189
msgid "Leave blank to keep the current password."
msgstr ""
#: apps/users/forms.py:193
#: apps/users/forms.py:192
msgid "Confirm New Password"
msgstr ""
#: apps/users/forms.py:205 apps/users/forms.py:362
#: apps/users/forms.py:204 apps/users/forms.py:361
msgid ""
"Designates whether this user should be treated as active. Unselect this "
"instead of deleting accounts."
msgstr ""
#: apps/users/forms.py:208 apps/users/forms.py:365
#: apps/users/forms.py:207 apps/users/forms.py:364
msgid ""
"Designates that this user has all permissions without explicitly assigning "
"them."
msgstr ""
#: apps/users/forms.py:275
#: apps/users/forms.py:274
msgid "This email address is already in use by another account."
msgstr ""
#: apps/users/forms.py:283
#: apps/users/forms.py:282
msgid "The two password fields didn't match."
msgstr ""
#: apps/users/forms.py:285
#: apps/users/forms.py:284
msgid "Please confirm your new password."
msgstr ""
#: apps/users/forms.py:287
#: apps/users/forms.py:286
msgid "Please enter the new password first."
msgstr ""
#: apps/users/forms.py:307
#: apps/users/forms.py:306
msgid "You cannot deactivate your own account using this form."
msgstr ""
#: apps/users/forms.py:320
#: apps/users/forms.py:319
msgid "Cannot remove status from the last superuser."
msgstr ""
#: apps/users/forms.py:326
#: apps/users/forms.py:325
msgid "You cannot remove your own superuser status using this form."
msgstr ""
#: apps/users/forms.py:419
#: apps/users/forms.py:418
msgid "A user with this email address already exists."
msgstr ""
#: apps/users/forms.py:439
#: apps/users/forms.py:438
msgid "Token name"
msgstr ""
#: apps/users/forms.py:441
#: apps/users/forms.py:440
msgid "Use a descriptive name such as n8n, Home Assistant, or backup job."
msgstr ""
#: apps/users/forms.py:447
#: apps/users/forms.py:446
msgid "Expires in days"
msgstr ""
#: apps/users/forms.py:448
#: apps/users/forms.py:447
msgid "Leave empty for a non-expiring token."
msgstr ""
#: apps/users/forms.py:463
#: apps/users/forms.py:462
msgid "Create token"
msgstr ""
@@ -2211,6 +2211,7 @@ msgstr ""
#: templates/rules/fragments/transaction_rule/view.html:92
#: templates/rules/fragments/transaction_rule/view.html:133
#: templates/tags/fragments/table.html:51
#: templates/transactions/fragments/filter_presets.html:28
#: templates/users/fragments/api_tokens.html:93
msgid "Delete"
msgstr ""
@@ -2315,8 +2316,8 @@ msgid "Current balance"
msgstr ""
#: templates/accounts/fragments/account_reconciliation.html:36
#: templates/net_worth/net_worth.html:146
#: templates/net_worth/net_worth.html:396
#: templates/net_worth/net_worth.html:147
#: templates/net_worth/net_worth.html:407
msgid "Difference"
msgstr ""
@@ -2696,19 +2697,19 @@ msgstr ""
msgid "Amount Bought"
msgstr ""
#: templates/dca/fragments/strategy/details.html:384
#: templates/dca/fragments/strategy/details.html:409
msgid "Entry Price vs Current Price"
msgstr ""
#: templates/dca/fragments/strategy/details.html:398
#: templates/dca/fragments/strategy/details.html:423
msgid "Days Between Investments"
msgstr ""
#: templates/dca/fragments/strategy/details.html:444
#: templates/dca/fragments/strategy/details.html:469
msgid "Investment Frequency"
msgstr ""
#: templates/dca/fragments/strategy/details.html:446
#: templates/dca/fragments/strategy/details.html:471
msgid "The straighter the blue line, the more consistent your DCA strategy is."
msgstr ""
@@ -2944,6 +2945,7 @@ msgid "Reload"
msgstr ""
#: templates/includes/scripts/hyperscript/swal.html:13
#: templates/transactions/fragments/filter_actions.html:4
msgid "Cancel"
msgstr ""
@@ -3358,16 +3360,16 @@ msgid "Summary"
msgstr ""
#: templates/monthly_overview/pages/overview.html:99
#: templates/monthly_overview/pages/overview.html:254
#: templates/monthly_overview/pages/overview.html:256
#: templates/transactions/pages/transactions.html:48
#: templates/transactions/pages/transactions.html:204
#: templates/transactions/pages/transactions.html:205
msgid "Oldest first"
msgstr ""
#: templates/monthly_overview/pages/overview.html:100
#: templates/monthly_overview/pages/overview.html:263
#: templates/monthly_overview/pages/overview.html:265
#: templates/transactions/pages/transactions.html:49
#: templates/transactions/pages/transactions.html:213
#: templates/transactions/pages/transactions.html:214
msgid "Newest first"
msgstr ""
@@ -3376,8 +3378,8 @@ msgstr ""
msgid "Filter transactions"
msgstr ""
#: templates/monthly_overview/pages/overview.html:235
#: templates/transactions/pages/transactions.html:185
#: templates/monthly_overview/pages/overview.html:237
#: templates/transactions/pages/transactions.html:186
msgid "Order by"
msgstr ""
@@ -3386,24 +3388,24 @@ msgstr ""
msgid "By currency"
msgstr ""
#: templates/net_worth/net_worth.html:84
#: templates/net_worth/net_worth.html:84 templates/net_worth/net_worth.html:85
msgid "Consolidated"
msgstr ""
#: templates/net_worth/net_worth.html:134
#: templates/net_worth/net_worth.html:135
msgid "Evolution"
msgstr ""
#: templates/net_worth/net_worth.html:162
#: templates/net_worth/net_worth.html:163
#: templates/yearly_overview/pages/overview_by_account.html:4
msgid "By account"
msgstr ""
#: templates/net_worth/net_worth.html:270
#: templates/net_worth/net_worth.html:271
msgid "Evolution by currency"
msgstr ""
#: templates/net_worth/net_worth.html:334
#: templates/net_worth/net_worth.html:345
msgid "Evolution by account"
msgstr ""
@@ -3634,6 +3636,40 @@ msgstr ""
msgid "transactions"
msgstr ""
#: templates/transactions/fragments/filter_actions.html:2
msgid "Save filter preset"
msgstr ""
#: templates/transactions/fragments/filter_actions.html:3
msgid "Preset name"
msgstr ""
#: templates/transactions/fragments/filter_actions.html:40
msgid "Save preset"
msgstr ""
#: templates/transactions/fragments/filter_presets.html:6
msgid "Filter presets"
msgstr ""
#: templates/transactions/fragments/filter_presets.html:21
#, python-format
msgid "Delete %(name)s"
msgstr ""
#: templates/transactions/fragments/filter_presets.html:26
msgid "Delete filter preset?"
msgstr ""
#: templates/transactions/fragments/filter_presets.html:27
#, python-format
msgid "Delete “%(name)s”?"
msgstr ""
#: templates/transactions/fragments/filter_presets.html:34
msgid "No saved presets"
msgstr ""
#: templates/transactions/fragments/list_all.html:58
msgid "No transactions found"
msgstr ""
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+212 -176
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-04 15:39+0000\n"
"POT-Creation-Date: 2026-08-16 04:46+0000\n"
"PO-Revision-Date: 2025-04-14 06:16+0000\n"
"Last-Translator: Emil <emil.bjorkroth@gmail.com>\n"
"Language-Team: Swedish <https://translations.herculino.com/projects/wygiwyh/"
@@ -31,8 +31,8 @@ msgstr ""
#: apps/transactions/forms.py:417 apps/transactions/forms.py:536
#: apps/transactions/forms.py:880 apps/transactions/forms.py:919
#: apps/transactions/forms.py:947 apps/transactions/forms.py:978
#: apps/transactions/forms.py:1128 apps/users/forms.py:246
#: apps/users/forms.py:404
#: apps/transactions/forms.py:1128 apps/users/forms.py:245
#: apps/users/forms.py:403
#: templates/rules/fragments/transaction_rule/dry_run/updated.html:5
#: templates/rules/fragments/transaction_rule/view.html:128
msgid "Update"
@@ -47,7 +47,7 @@ msgstr "Uppdatera"
#: apps/transactions/forms.py:424 apps/transactions/forms.py:886
#: apps/transactions/forms.py:925 apps/transactions/forms.py:953
#: apps/transactions/forms.py:984 apps/transactions/forms.py:1134
#: apps/users/forms.py:252 apps/users/forms.py:410
#: apps/users/forms.py:251 apps/users/forms.py:409
#: templates/mini_tools/unit_price_calculator.html:168
msgid "Add"
msgstr ""
@@ -66,9 +66,9 @@ msgstr ""
#: apps/transactions/forms.py:61 apps/transactions/forms.py:307
#: apps/transactions/forms.py:475 apps/transactions/forms.py:572
#: apps/transactions/forms.py:579 apps/transactions/forms.py:763
#: apps/transactions/forms.py:1007 apps/transactions/models.py:331
#: apps/transactions/models.py:641 apps/transactions/models.py:841
#: apps/transactions/models.py:1089
#: apps/transactions/forms.py:1007 apps/transactions/models.py:346
#: apps/transactions/models.py:658 apps/transactions/models.py:858
#: apps/transactions/models.py:1110
#: templates/insights/fragments/category_overview/index.html:86
#: templates/insights/fragments/category_overview/index.html:542
#: templates/insights/fragments/month_by_month.html:84
@@ -79,13 +79,13 @@ msgstr ""
#: apps/accounts/forms.py:132 apps/dca/forms.py:95 apps/dca/forms.py:103
#: apps/export_app/forms.py:43 apps/export_app/forms.py:132
#: apps/rules/forms.py:184 apps/rules/forms.py:194 apps/rules/models.py:45
#: apps/rules/models.py:315 apps/transactions/filters.py:73
#: apps/rules/models.py:315 apps/transactions/filters.py:79
#: apps/transactions/forms.py:69 apps/transactions/forms.py:315
#: apps/transactions/forms.py:483 apps/transactions/forms.py:588
#: apps/transactions/forms.py:596 apps/transactions/forms.py:756
#: apps/transactions/forms.py:1000 apps/transactions/models.py:337
#: apps/transactions/models.py:643 apps/transactions/models.py:845
#: apps/transactions/models.py:1095 templates/includes/sidebar.html:150
#: apps/transactions/forms.py:1000 apps/transactions/models.py:352
#: apps/transactions/models.py:660 apps/transactions/models.py:862
#: apps/transactions/models.py:1116 templates/includes/sidebar.html:150
#: templates/insights/fragments/category_overview/index.html:40
#: templates/insights/fragments/month_by_month.html:29
#: templates/insights/fragments/month_by_month.html:32
@@ -97,8 +97,8 @@ msgstr ""
#: apps/accounts/models.py:12 apps/accounts/models.py:29 apps/dca/models.py:13
#: apps/import_app/models.py:14 apps/rules/models.py:13
#: apps/transactions/models.py:223 apps/transactions/models.py:248
#: apps/transactions/models.py:272 apps/transactions/models.py:1057
#: apps/transactions/models.py:238 apps/transactions/models.py:263
#: apps/transactions/models.py:287 apps/transactions/models.py:1078
#: apps/users/models.py:572 templates/account_groups/fragments/list.html:22
#: templates/accounts/fragments/list.html:22
#: templates/categories/fragments/table.html:17
@@ -166,9 +166,9 @@ msgstr ""
#: apps/rules/models.py:35 apps/rules/models.py:267
#: apps/transactions/forms.py:81 apps/transactions/forms.py:327
#: apps/transactions/forms.py:442 apps/transactions/forms.py:748
#: apps/transactions/forms.py:992 apps/transactions/models.py:303
#: apps/transactions/models.py:601 apps/transactions/models.py:823
#: apps/transactions/models.py:1063
#: apps/transactions/forms.py:992 apps/transactions/models.py:318
#: apps/transactions/models.py:618 apps/transactions/models.py:840
#: apps/transactions/models.py:1084
#: templates/installment_plans/fragments/table.html:17
#: templates/quick_transactions/fragments/list.html:14
#: templates/recurring_transactions/fragments/table.html:19
@@ -177,7 +177,7 @@ msgid "Account"
msgstr ""
#: apps/accounts/models.py:76 apps/export_app/forms.py:19
#: apps/export_app/forms.py:129 apps/transactions/filters.py:57
#: apps/export_app/forms.py:129 apps/transactions/filters.py:63
#: templates/accounts/fragments/list.html:9
#: templates/accounts/pages/index.html:4 templates/includes/sidebar.html:162
#: templates/includes/sidebar.html:164
@@ -345,7 +345,8 @@ msgid ""
"owner.<br/>Public: Shown for all users. Only editable by the owner."
msgstr ""
#: apps/common/forms.py:76 apps/users/forms.py:173
#: apps/common/forms.py:76 apps/users/forms.py:172
#: templates/transactions/fragments/filter_actions.html:5
msgid "Save"
msgstr ""
@@ -460,10 +461,9 @@ msgstr ""
#: apps/common/widgets/tom_select.py:15
#: templates/mini_tools/unit_price_calculator.html:180
#: templates/monthly_overview/pages/overview.html:275
#: templates/monthly_overview/pages/overview.html:287
#: templates/transactions/pages/transactions.html:225
#: templates/transactions/pages/transactions.html:237
#: templates/monthly_overview/pages/overview.html:284
#: templates/transactions/fragments/filter_actions.html:48
#: templates/transactions/pages/transactions.html:233
msgid "Clear"
msgstr ""
@@ -482,7 +482,7 @@ msgstr ""
#: apps/currencies/forms.py:66 apps/dca/models.py:158 apps/rules/forms.py:176
#: apps/rules/forms.py:190 apps/rules/models.py:38 apps/rules/models.py:279
#: apps/transactions/forms.py:85 apps/transactions/forms.py:447
#: apps/transactions/forms.py:600 apps/transactions/models.py:313
#: apps/transactions/forms.py:600 apps/transactions/models.py:328
#: templates/dca/fragments/strategy/details.html:49
#: templates/exchange_rates/fragments/table.html:10
#: templates/exchange_rates_services/fragments/table.html:11
@@ -502,7 +502,7 @@ msgid "Decimal Places"
msgstr ""
#: apps/currencies/models.py:45 apps/export_app/forms.py:25
#: apps/export_app/forms.py:130 apps/transactions/filters.py:64
#: apps/export_app/forms.py:130 apps/transactions/filters.py:70
#: templates/currencies/fragments/list.html:9
#: templates/currencies/pages/index.html:4 templates/includes/sidebar.html:176
#: templates/includes/sidebar.html:178
@@ -547,29 +547,29 @@ msgstr ""
msgid "From and To currencies cannot be the same."
msgstr ""
#: apps/currencies/models.py:110
#: apps/currencies/models.py:111
msgid "On"
msgstr ""
#: apps/currencies/models.py:111
#: apps/currencies/models.py:112
msgid "Every X hours"
msgstr ""
#: apps/currencies/models.py:112
#: apps/currencies/models.py:113
msgid "Not on"
msgstr ""
#: apps/currencies/models.py:114
#: apps/currencies/models.py:115
msgid "Service Name"
msgstr ""
#: apps/currencies/models.py:116
#: apps/currencies/models.py:117
msgid "Service Type"
msgstr ""
#: apps/currencies/models.py:118 apps/transactions/filters.py:27
#: apps/transactions/models.py:227 apps/transactions/models.py:251
#: apps/transactions/models.py:275 templates/categories/fragments/list.html:16
#: apps/currencies/models.py:119 apps/transactions/filters.py:27
#: apps/transactions/models.py:242 apps/transactions/models.py:266
#: apps/transactions/models.py:290 templates/categories/fragments/list.html:16
#: templates/entities/fragments/list.html:16
#: templates/installment_plans/fragments/list.html:16
#: templates/recurring_transactions/fragments/list.html:16
@@ -579,77 +579,77 @@ msgstr ""
msgid "Active"
msgstr ""
#: apps/currencies/models.py:123
#: apps/currencies/models.py:124
msgid "API Key"
msgstr ""
#: apps/currencies/models.py:124
#: apps/currencies/models.py:125
msgid "API key for the service (if required)"
msgstr ""
#: apps/currencies/models.py:129
#: apps/currencies/models.py:130
msgid "Interval Type"
msgstr ""
#: apps/currencies/models.py:133
#: apps/currencies/models.py:134
msgid "Interval"
msgstr ""
#: apps/currencies/models.py:136
#: apps/currencies/models.py:137
msgid "Last Successful Fetch"
msgstr ""
#: apps/currencies/models.py:143
#: apps/currencies/models.py:144
msgid "Target Currencies"
msgstr ""
#: apps/currencies/models.py:145
#: apps/currencies/models.py:146
msgid ""
"Select currencies to fetch exchange rates for. Rates will be fetched for "
"each currency against their set exchange currency."
msgstr ""
#: apps/currencies/models.py:153
#: apps/currencies/models.py:154
msgid "Target Accounts"
msgstr ""
#: apps/currencies/models.py:155
#: apps/currencies/models.py:156
msgid ""
"Select accounts to fetch exchange rates for. Rates will be fetched for each "
"account's currency against their set exchange currency."
msgstr ""
#: apps/currencies/models.py:162
#: apps/currencies/models.py:163
msgid "Single exchange rate"
msgstr ""
#: apps/currencies/models.py:165
#: apps/currencies/models.py:166
msgid "Create one exchange rate and keep updating it. Avoids database clutter."
msgstr ""
#: apps/currencies/models.py:170
#: apps/currencies/models.py:171
msgid "Exchange Rate Service"
msgstr ""
#: apps/currencies/models.py:171
#: apps/currencies/models.py:172
msgid "Exchange Rate Services"
msgstr ""
#: apps/currencies/models.py:223
#: apps/currencies/models.py:224
msgid "'Every X hours' interval type requires a positive integer."
msgstr ""
#: apps/currencies/models.py:232
#: apps/currencies/models.py:233
msgid "'Every X hours' interval must be between 1 and 24."
msgstr ""
#: apps/currencies/models.py:246
#: apps/currencies/models.py:247
msgid ""
"Invalid hour format. Use comma-separated hours (0-23) and/or ranges (e.g., "
"'1-5,8,10-12')."
msgstr ""
#: apps/currencies/models.py:257
#: apps/currencies/models.py:258
msgid ""
"Invalid format. Please check the requirements for your selected interval "
"type."
@@ -748,8 +748,8 @@ msgstr ""
#: apps/dca/models.py:26 apps/dca/models.py:181 apps/rules/forms.py:180
#: apps/rules/forms.py:196 apps/rules/models.py:43 apps/rules/models.py:295
#: apps/transactions/forms.py:469 apps/transactions/forms.py:616
#: apps/transactions/models.py:327 apps/transactions/models.py:650
#: apps/transactions/models.py:851 apps/transactions/models.py:1085
#: apps/transactions/models.py:342 apps/transactions/models.py:667
#: apps/transactions/models.py:868 apps/transactions/models.py:1106
msgid "Notes"
msgstr ""
@@ -812,7 +812,7 @@ msgid "Users"
msgstr ""
#: apps/export_app/forms.py:31 apps/export_app/forms.py:134
#: apps/transactions/models.py:388 templates/includes/sidebar.html:81
#: apps/transactions/models.py:403 templates/includes/sidebar.html:81
#: templates/includes/sidebar.html:142
#: templates/recurring_transactions/fragments/list_transactions.html:5
#: templates/recurring_transactions/fragments/table.html:37
@@ -821,7 +821,7 @@ msgid "Transactions"
msgstr ""
#: apps/export_app/forms.py:37 apps/export_app/forms.py:131
#: apps/transactions/filters.py:68 templates/categories/fragments/list.html:9
#: apps/transactions/filters.py:74 templates/categories/fragments/list.html:9
#: templates/categories/pages/index.html:4 templates/includes/sidebar.html:144
#: templates/insights/fragments/month_by_month.html:18
#: templates/insights/fragments/month_by_month.html:21
@@ -832,12 +832,12 @@ msgstr ""
#: apps/export_app/forms.py:49 apps/export_app/forms.py:133
#: apps/rules/forms.py:185 apps/rules/forms.py:195 apps/rules/models.py:46
#: apps/rules/models.py:307 apps/transactions/filters.py:78
#: apps/rules/models.py:307 apps/transactions/filters.py:84
#: apps/transactions/forms.py:77 apps/transactions/forms.py:323
#: apps/transactions/forms.py:491 apps/transactions/forms.py:771
#: apps/transactions/forms.py:1015 apps/transactions/models.py:286
#: apps/transactions/models.py:342 apps/transactions/models.py:646
#: apps/transactions/models.py:848 apps/transactions/models.py:1100
#: apps/transactions/forms.py:1015 apps/transactions/models.py:301
#: apps/transactions/models.py:357 apps/transactions/models.py:663
#: apps/transactions/models.py:865 apps/transactions/models.py:1121
#: templates/entities/fragments/list.html:9
#: templates/entities/pages/index.html:4 templates/includes/sidebar.html:156
#: templates/insights/fragments/category_overview/index.html:54
@@ -849,14 +849,14 @@ msgid "Entities"
msgstr ""
#: apps/export_app/forms.py:55 apps/export_app/forms.py:137
#: apps/transactions/models.py:888 templates/includes/sidebar.html:110
#: apps/transactions/models.py:905 templates/includes/sidebar.html:110
#: templates/recurring_transactions/fragments/list.html:9
#: templates/recurring_transactions/pages/index.html:4
msgid "Recurring Transactions"
msgstr ""
#: apps/export_app/forms.py:61 apps/export_app/forms.py:135
#: apps/transactions/models.py:664 templates/includes/sidebar.html:104
#: apps/transactions/models.py:681 templates/includes/sidebar.html:104
#: templates/installment_plans/fragments/list.html:9
#: templates/installment_plans/pages/index.html:4
msgid "Installment Plans"
@@ -1008,7 +1008,7 @@ msgid "Run deleted successfully"
msgstr ""
#: apps/insights/forms.py:118 apps/insights/utils/sankey.py:36
#: apps/insights/utils/sankey.py:167 apps/transactions/filters.py:203
#: apps/insights/utils/sankey.py:167 apps/transactions/filters.py:209
#: templates/insights/fragments/category_overview/index.html:96
#: templates/insights/fragments/category_overview/index.html:407
#: templates/insights/fragments/category_overview/index.html:436
@@ -1106,15 +1106,15 @@ msgstr ""
#: apps/rules/forms.py:174 apps/rules/forms.py:188 apps/rules/models.py:36
#: apps/rules/models.py:271 apps/transactions/forms.py:433
#: apps/transactions/models.py:310 apps/transactions/models.py:606
#: apps/transactions/models.py:829 apps/transactions/models.py:1070
#: apps/transactions/models.py:325 apps/transactions/models.py:623
#: apps/transactions/models.py:846 apps/transactions/models.py:1091
msgid "Type"
msgstr ""
#: apps/rules/forms.py:175 apps/rules/forms.py:189 apps/rules/models.py:37
#: apps/rules/models.py:275 apps/transactions/filters.py:22
#: apps/transactions/forms.py:437 apps/transactions/models.py:312
#: apps/transactions/models.py:1072 templates/cotton/transaction/item.html:20
#: apps/transactions/forms.py:437 apps/transactions/models.py:327
#: apps/transactions/models.py:1093 templates/cotton/transaction/item.html:20
#: templates/cotton/transaction/item.html:31
#: templates/transactions/widgets/paid_toggle_button.html:10
#: templates/transactions/widgets/unselectable_paid_toggle_button.html:13
@@ -1124,15 +1124,15 @@ msgstr ""
#: apps/rules/forms.py:177 apps/rules/forms.py:191 apps/rules/models.py:39
#: apps/rules/models.py:283 apps/transactions/forms.py:89
#: apps/transactions/forms.py:453 apps/transactions/forms.py:603
#: apps/transactions/forms.py:777 apps/transactions/models.py:314
#: apps/transactions/models.py:624 apps/transactions/models.py:853
#: apps/transactions/forms.py:777 apps/transactions/models.py:329
#: apps/transactions/models.py:641 apps/transactions/models.py:870
msgid "Reference Date"
msgstr ""
#: apps/rules/forms.py:178 apps/rules/forms.py:192 apps/rules/models.py:41
#: apps/rules/models.py:287 apps/transactions/forms.py:460
#: apps/transactions/models.py:320 apps/transactions/models.py:834
#: apps/transactions/models.py:1078
#: apps/transactions/models.py:335 apps/transactions/models.py:851
#: apps/transactions/models.py:1099
#: templates/insights/fragments/sankey.html:102
#: templates/installment_plans/fragments/table.html:18
#: templates/quick_transactions/fragments/list.html:15
@@ -1143,27 +1143,27 @@ msgstr ""
#: apps/rules/forms.py:179 apps/rules/forms.py:193 apps/rules/models.py:14
#: apps/rules/models.py:42 apps/rules/models.py:291
#: apps/transactions/forms.py:464 apps/transactions/forms.py:607
#: apps/transactions/models.py:325 apps/transactions/models.py:608
#: apps/transactions/models.py:837 apps/transactions/models.py:1083
#: apps/transactions/models.py:340 apps/transactions/models.py:625
#: apps/transactions/models.py:854 apps/transactions/models.py:1104
msgid "Description"
msgstr ""
#: apps/rules/forms.py:182 apps/rules/forms.py:198 apps/rules/models.py:47
#: apps/rules/models.py:299 apps/transactions/models.py:364
#: apps/transactions/models.py:1105
#: apps/rules/models.py:299 apps/transactions/models.py:379
#: apps/transactions/models.py:1126
msgid "Internal Note"
msgstr ""
#: apps/rules/forms.py:183 apps/rules/forms.py:199 apps/rules/models.py:48
#: apps/rules/models.py:303 apps/transactions/models.py:366
#: apps/transactions/models.py:1107
#: apps/rules/models.py:303 apps/transactions/models.py:381
#: apps/transactions/models.py:1128
msgid "Internal ID"
msgstr ""
#: apps/rules/forms.py:186 apps/rules/forms.py:200 apps/rules/models.py:40
#: apps/rules/models.py:319 apps/transactions/forms.py:620
#: apps/transactions/models.py:224 apps/transactions/models.py:315
#: apps/transactions/models.py:1073
#: apps/transactions/models.py:239 apps/transactions/models.py:330
#: apps/transactions/models.py:1094
msgid "Mute"
msgstr ""
@@ -1176,7 +1176,7 @@ msgid "Set Values"
msgstr ""
#: apps/rules/forms.py:407 apps/rules/forms.py:442 apps/rules/forms.py:477
#: apps/transactions/models.py:387 apps/transactions/models.py:544
#: apps/transactions/models.py:402 apps/transactions/models.py:560
msgid "Transaction"
msgstr ""
@@ -1323,58 +1323,58 @@ msgstr ""
msgid "Muted"
msgstr ""
#: apps/transactions/filters.py:45
#: apps/transactions/filters.py:51
msgid "Content"
msgstr ""
#: apps/transactions/filters.py:51
#: apps/transactions/filters.py:57
msgid "Transaction Type"
msgstr ""
#: apps/transactions/filters.py:89
#: apps/transactions/filters.py:95
msgid "Mute Status"
msgstr ""
#: apps/transactions/filters.py:94
#: apps/transactions/filters.py:100
msgid "Date from"
msgstr ""
#: apps/transactions/filters.py:99 apps/transactions/filters.py:109
#: apps/transactions/filters.py:105 apps/transactions/filters.py:115
msgid "Until"
msgstr ""
#: apps/transactions/filters.py:104
#: apps/transactions/filters.py:110
msgid "Reference date from"
msgstr ""
#: apps/transactions/filters.py:114
#: apps/transactions/filters.py:120
msgid "Amount min"
msgstr ""
#: apps/transactions/filters.py:119
#: apps/transactions/filters.py:125
msgid "Amount max"
msgstr ""
#: apps/transactions/filters.py:202
#: apps/transactions/filters.py:208
msgid "Categorized"
msgstr ""
#: apps/transactions/filters.py:209
#: apps/transactions/filters.py:215
msgid "Tagged"
msgstr ""
#: apps/transactions/filters.py:209
#: apps/transactions/filters.py:215
#: templates/insights/fragments/category_overview/index.html:189
#: templates/insights/fragments/month_by_month.html:121
#: templates/insights/fragments/year_by_year.html:75
msgid "Untagged"
msgstr ""
#: apps/transactions/filters.py:215
#: apps/transactions/filters.py:221
msgid "Any entity"
msgstr ""
#: apps/transactions/filters.py:216
#: apps/transactions/filters.py:222
#: templates/insights/fragments/category_overview/index.html:282
#: templates/insights/fragments/month_by_month.html:123
#: templates/insights/fragments/year_by_year.html:77
@@ -1449,42 +1449,42 @@ msgstr ""
msgid "End date should be after the start date"
msgstr ""
#: apps/transactions/models.py:229
#: apps/transactions/models.py:244
msgid ""
"Deactivated categories won't be able to be selected when creating new "
"transactions"
msgstr ""
#: apps/transactions/models.py:237
#: apps/transactions/models.py:252
msgid "Transaction Category"
msgstr ""
#: apps/transactions/models.py:238
#: apps/transactions/models.py:253
msgid "Transaction Categories"
msgstr ""
#: apps/transactions/models.py:253
#: apps/transactions/models.py:268
msgid ""
"Deactivated tags won't be able to be selected when creating new transactions"
msgstr ""
#: apps/transactions/models.py:261 apps/transactions/models.py:262
#: apps/transactions/models.py:276 apps/transactions/models.py:277
msgid "Transaction Tags"
msgstr ""
#: apps/transactions/models.py:277
#: apps/transactions/models.py:292
msgid ""
"Deactivated entities won't be able to be selected when creating new "
"transactions"
msgstr ""
#: apps/transactions/models.py:285
#: apps/transactions/models.py:300
#: templates/insights/fragments/month_by_month.html:88
#: templates/insights/fragments/year_by_year.html:56
msgid "Entity"
msgstr ""
#: apps/transactions/models.py:297 apps/transactions/models.py:1050
#: apps/transactions/models.py:312 apps/transactions/models.py:1071
#: templates/calendar_view/fragments/list.html:42
#: templates/calendar_view/fragments/list.html:44
#: templates/calendar_view/fragments/list.html:52
@@ -1496,7 +1496,7 @@ msgstr ""
msgid "Income"
msgstr ""
#: apps/transactions/models.py:298 apps/transactions/models.py:1051
#: apps/transactions/models.py:313 apps/transactions/models.py:1072
#: templates/calendar_view/fragments/list.html:46
#: templates/calendar_view/fragments/list.html:48
#: templates/calendar_view/fragments/list.html:56
@@ -1507,157 +1507,157 @@ msgstr ""
msgid "Expense"
msgstr ""
#: apps/transactions/models.py:353 apps/transactions/models.py:663
#: apps/transactions/models.py:368 apps/transactions/models.py:680
msgid "Installment Plan"
msgstr ""
#: apps/transactions/models.py:362 apps/transactions/models.py:887
#: apps/transactions/models.py:377 apps/transactions/models.py:904
msgid "Recurring Transaction"
msgstr ""
#: apps/transactions/models.py:370
#: apps/transactions/models.py:385
msgid "Deleted"
msgstr ""
#: apps/transactions/models.py:375
#: apps/transactions/models.py:390
msgid "Deleted At"
msgstr ""
#: apps/transactions/models.py:489 templates/tags/fragments/table.html:69
#: apps/transactions/models.py:504 templates/tags/fragments/table.html:69
msgid "No tags"
msgstr ""
#: apps/transactions/models.py:491
#: apps/transactions/models.py:506
msgid "No category"
msgstr ""
#: apps/transactions/models.py:493
#: apps/transactions/models.py:508
msgid "No description"
msgstr ""
#: apps/transactions/models.py:549
#: apps/transactions/models.py:565
msgid "File"
msgstr ""
#: apps/transactions/models.py:551
#: apps/transactions/models.py:567
msgid "Original Name"
msgstr ""
#: apps/transactions/models.py:553
#: apps/transactions/models.py:569
msgid "Content Type"
msgstr ""
#: apps/transactions/models.py:555
#: apps/transactions/models.py:571
msgid "Size"
msgstr ""
#: apps/transactions/models.py:560
#: apps/transactions/models.py:576
msgid "Uploaded By"
msgstr ""
#: apps/transactions/models.py:565
#: apps/transactions/models.py:581
msgid "Transaction Attachment"
msgstr ""
#: apps/transactions/models.py:566
#: apps/transactions/models.py:582
msgid "Transaction Attachments"
msgstr ""
#: apps/transactions/models.py:595 templates/includes/sidebar.html:57
#: apps/transactions/models.py:612 templates/includes/sidebar.html:57
msgid "Yearly"
msgstr ""
#: apps/transactions/models.py:596 apps/users/models.py:469
#: apps/transactions/models.py:613 apps/users/models.py:469
#: templates/includes/sidebar.html:51
msgid "Monthly"
msgstr ""
#: apps/transactions/models.py:597
#: apps/transactions/models.py:614
msgid "Weekly"
msgstr ""
#: apps/transactions/models.py:598
#: apps/transactions/models.py:615
msgid "Daily"
msgstr ""
#: apps/transactions/models.py:611
#: apps/transactions/models.py:628
msgid "Number of Installments"
msgstr ""
#: apps/transactions/models.py:616
#: apps/transactions/models.py:633
msgid "Installment Start"
msgstr ""
#: apps/transactions/models.py:617
#: apps/transactions/models.py:634
msgid "The installment number to start counting from"
msgstr ""
#: apps/transactions/models.py:622 apps/transactions/models.py:857
#: apps/transactions/models.py:639 apps/transactions/models.py:874
msgid "Start Date"
msgstr ""
#: apps/transactions/models.py:626 apps/transactions/models.py:858
#: apps/transactions/models.py:643 apps/transactions/models.py:875
msgid "End Date"
msgstr ""
#: apps/transactions/models.py:631
#: apps/transactions/models.py:648
msgid "Recurrence"
msgstr ""
#: apps/transactions/models.py:634
#: apps/transactions/models.py:651
msgid "Installment Amount"
msgstr ""
#: apps/transactions/models.py:653 apps/transactions/models.py:877
#: apps/transactions/models.py:670 apps/transactions/models.py:894
msgid "Add description to transactions"
msgstr ""
#: apps/transactions/models.py:656 apps/transactions/models.py:880
#: apps/transactions/models.py:673 apps/transactions/models.py:897
msgid "Add notes to transactions"
msgstr ""
#: apps/transactions/models.py:816
#: apps/transactions/models.py:833
msgid "day(s)"
msgstr ""
#: apps/transactions/models.py:817
#: apps/transactions/models.py:834
msgid "week(s)"
msgstr ""
#: apps/transactions/models.py:818
#: apps/transactions/models.py:835
msgid "month(s)"
msgstr ""
#: apps/transactions/models.py:819
#: apps/transactions/models.py:836
msgid "year(s)"
msgstr ""
#: apps/transactions/models.py:821
#: apps/transactions/models.py:838
#: templates/recurring_transactions/fragments/list.html:18
msgid "Paused"
msgstr ""
#: apps/transactions/models.py:860
#: apps/transactions/models.py:877
msgid "Recurrence Type"
msgstr ""
#: apps/transactions/models.py:863
#: apps/transactions/models.py:880
msgid "Recurrence Interval"
msgstr ""
#: apps/transactions/models.py:866
#: apps/transactions/models.py:883
msgid "Keep at most"
msgstr ""
#: apps/transactions/models.py:870
#: apps/transactions/models.py:887
msgid "Last Generated Date"
msgstr ""
#: apps/transactions/models.py:873
#: apps/transactions/models.py:890
msgid "Last Generated Reference Date"
msgstr ""
#: apps/transactions/models.py:1117
#: apps/transactions/models.py:1138
#: apps/transactions/views/quick_transactions.py:178
#: apps/transactions/views/quick_transactions.py:187
#: apps/transactions/views/quick_transactions.py:189
@@ -1666,7 +1666,7 @@ msgstr ""
msgid "Quick Transaction"
msgstr ""
#: apps/transactions/models.py:1118 templates/includes/sidebar.html:98
#: apps/transactions/models.py:1139 templates/includes/sidebar.html:98
#: templates/quick_transactions/pages/index.html:5
#: templates/quick_transactions/pages/index.html:15
msgid "Quick Transactions"
@@ -1890,9 +1890,9 @@ msgstr ""
#: apps/users/forms.py:68 apps/users/forms.py:81 apps/users/forms.py:103
#: templates/monthly_overview/pages/overview.html:98
#: templates/monthly_overview/pages/overview.html:245
#: templates/monthly_overview/pages/overview.html:247
#: templates/transactions/pages/transactions.html:47
#: templates/transactions/pages/transactions.html:195
#: templates/transactions/pages/transactions.html:196
msgid "Default"
msgstr ""
@@ -1912,7 +1912,7 @@ msgstr ""
msgid "Default Account"
msgstr ""
#: apps/users/forms.py:178
#: apps/users/forms.py:177
#, python-format
msgid ""
"This changes the language (if available) and how numbers and dates are "
@@ -1920,79 +1920,79 @@ msgid ""
"Consider helping translate WYGIWYH to your language at %(translation_link)s"
msgstr ""
#: apps/users/forms.py:187
#: apps/users/forms.py:186
msgid "New Password"
msgstr ""
#: apps/users/forms.py:190
#: apps/users/forms.py:189
msgid "Leave blank to keep the current password."
msgstr ""
#: apps/users/forms.py:193
#: apps/users/forms.py:192
msgid "Confirm New Password"
msgstr ""
#: apps/users/forms.py:205 apps/users/forms.py:362
#: apps/users/forms.py:204 apps/users/forms.py:361
msgid ""
"Designates whether this user should be treated as active. Unselect this "
"instead of deleting accounts."
msgstr ""
#: apps/users/forms.py:208 apps/users/forms.py:365
#: apps/users/forms.py:207 apps/users/forms.py:364
msgid ""
"Designates that this user has all permissions without explicitly assigning "
"them."
msgstr ""
#: apps/users/forms.py:275
#: apps/users/forms.py:274
msgid "This email address is already in use by another account."
msgstr ""
#: apps/users/forms.py:283
#: apps/users/forms.py:282
msgid "The two password fields didn't match."
msgstr ""
#: apps/users/forms.py:285
#: apps/users/forms.py:284
msgid "Please confirm your new password."
msgstr ""
#: apps/users/forms.py:287
#: apps/users/forms.py:286
msgid "Please enter the new password first."
msgstr ""
#: apps/users/forms.py:307
#: apps/users/forms.py:306
msgid "You cannot deactivate your own account using this form."
msgstr ""
#: apps/users/forms.py:320
#: apps/users/forms.py:319
msgid "Cannot remove status from the last superuser."
msgstr ""
#: apps/users/forms.py:326
#: apps/users/forms.py:325
msgid "You cannot remove your own superuser status using this form."
msgstr ""
#: apps/users/forms.py:419
#: apps/users/forms.py:418
msgid "A user with this email address already exists."
msgstr ""
#: apps/users/forms.py:439
#: apps/users/forms.py:438
msgid "Token name"
msgstr ""
#: apps/users/forms.py:441
#: apps/users/forms.py:440
msgid "Use a descriptive name such as n8n, Home Assistant, or backup job."
msgstr ""
#: apps/users/forms.py:447
#: apps/users/forms.py:446
msgid "Expires in days"
msgstr ""
#: apps/users/forms.py:448
#: apps/users/forms.py:447
msgid "Leave empty for a non-expiring token."
msgstr ""
#: apps/users/forms.py:463
#: apps/users/forms.py:462
msgid "Create token"
msgstr ""
@@ -2215,6 +2215,7 @@ msgstr ""
#: templates/rules/fragments/transaction_rule/view.html:92
#: templates/rules/fragments/transaction_rule/view.html:133
#: templates/tags/fragments/table.html:51
#: templates/transactions/fragments/filter_presets.html:28
#: templates/users/fragments/api_tokens.html:93
msgid "Delete"
msgstr ""
@@ -2319,8 +2320,8 @@ msgid "Current balance"
msgstr ""
#: templates/accounts/fragments/account_reconciliation.html:36
#: templates/net_worth/net_worth.html:146
#: templates/net_worth/net_worth.html:396
#: templates/net_worth/net_worth.html:147
#: templates/net_worth/net_worth.html:407
msgid "Difference"
msgstr ""
@@ -2700,19 +2701,19 @@ msgstr ""
msgid "Amount Bought"
msgstr ""
#: templates/dca/fragments/strategy/details.html:384
#: templates/dca/fragments/strategy/details.html:409
msgid "Entry Price vs Current Price"
msgstr ""
#: templates/dca/fragments/strategy/details.html:398
#: templates/dca/fragments/strategy/details.html:423
msgid "Days Between Investments"
msgstr ""
#: templates/dca/fragments/strategy/details.html:444
#: templates/dca/fragments/strategy/details.html:469
msgid "Investment Frequency"
msgstr ""
#: templates/dca/fragments/strategy/details.html:446
#: templates/dca/fragments/strategy/details.html:471
msgid "The straighter the blue line, the more consistent your DCA strategy is."
msgstr ""
@@ -2949,6 +2950,7 @@ msgid "Reload"
msgstr ""
#: templates/includes/scripts/hyperscript/swal.html:13
#: templates/transactions/fragments/filter_actions.html:4
msgid "Cancel"
msgstr ""
@@ -3363,16 +3365,16 @@ msgid "Summary"
msgstr ""
#: templates/monthly_overview/pages/overview.html:99
#: templates/monthly_overview/pages/overview.html:254
#: templates/monthly_overview/pages/overview.html:256
#: templates/transactions/pages/transactions.html:48
#: templates/transactions/pages/transactions.html:204
#: templates/transactions/pages/transactions.html:205
msgid "Oldest first"
msgstr ""
#: templates/monthly_overview/pages/overview.html:100
#: templates/monthly_overview/pages/overview.html:263
#: templates/monthly_overview/pages/overview.html:265
#: templates/transactions/pages/transactions.html:49
#: templates/transactions/pages/transactions.html:213
#: templates/transactions/pages/transactions.html:214
msgid "Newest first"
msgstr ""
@@ -3381,8 +3383,8 @@ msgstr ""
msgid "Filter transactions"
msgstr ""
#: templates/monthly_overview/pages/overview.html:235
#: templates/transactions/pages/transactions.html:185
#: templates/monthly_overview/pages/overview.html:237
#: templates/transactions/pages/transactions.html:186
msgid "Order by"
msgstr ""
@@ -3391,24 +3393,24 @@ msgstr ""
msgid "By currency"
msgstr ""
#: templates/net_worth/net_worth.html:84
#: templates/net_worth/net_worth.html:84 templates/net_worth/net_worth.html:85
msgid "Consolidated"
msgstr ""
#: templates/net_worth/net_worth.html:134
#: templates/net_worth/net_worth.html:135
msgid "Evolution"
msgstr ""
#: templates/net_worth/net_worth.html:162
#: templates/net_worth/net_worth.html:163
#: templates/yearly_overview/pages/overview_by_account.html:4
msgid "By account"
msgstr ""
#: templates/net_worth/net_worth.html:270
#: templates/net_worth/net_worth.html:271
msgid "Evolution by currency"
msgstr ""
#: templates/net_worth/net_worth.html:334
#: templates/net_worth/net_worth.html:345
msgid "Evolution by account"
msgstr ""
@@ -3639,6 +3641,40 @@ msgstr ""
msgid "transactions"
msgstr ""
#: templates/transactions/fragments/filter_actions.html:2
msgid "Save filter preset"
msgstr ""
#: templates/transactions/fragments/filter_actions.html:3
msgid "Preset name"
msgstr ""
#: templates/transactions/fragments/filter_actions.html:40
msgid "Save preset"
msgstr ""
#: templates/transactions/fragments/filter_presets.html:6
msgid "Filter presets"
msgstr ""
#: templates/transactions/fragments/filter_presets.html:21
#, python-format
msgid "Delete %(name)s"
msgstr ""
#: templates/transactions/fragments/filter_presets.html:26
msgid "Delete filter preset?"
msgstr ""
#: templates/transactions/fragments/filter_presets.html:27
#, python-format
msgid "Delete “%(name)s”?"
msgstr ""
#: templates/transactions/fragments/filter_presets.html:34
msgid "No saved presets"
msgstr ""
#: templates/transactions/fragments/list_all.html:58
msgid "No transactions found"
msgstr ""
+212 -176
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-04 15:39+0000\n"
"POT-Creation-Date: 2026-08-16 04:46+0000\n"
"PO-Revision-Date: 2026-01-18 19:24+0000\n"
"Last-Translator: Ebrahim Tayabali <ebrahimhakimuddin@gmail.com>\n"
"Language-Team: Swahili <https://translations.herculino.com/projects/wygiwyh/"
@@ -31,8 +31,8 @@ msgstr "Jina La Kundi"
#: apps/transactions/forms.py:417 apps/transactions/forms.py:536
#: apps/transactions/forms.py:880 apps/transactions/forms.py:919
#: apps/transactions/forms.py:947 apps/transactions/forms.py:978
#: apps/transactions/forms.py:1128 apps/users/forms.py:246
#: apps/users/forms.py:404
#: apps/transactions/forms.py:1128 apps/users/forms.py:245
#: apps/users/forms.py:403
#: templates/rules/fragments/transaction_rule/dry_run/updated.html:5
#: templates/rules/fragments/transaction_rule/view.html:128
msgid "Update"
@@ -47,7 +47,7 @@ msgstr ""
#: apps/transactions/forms.py:424 apps/transactions/forms.py:886
#: apps/transactions/forms.py:925 apps/transactions/forms.py:953
#: apps/transactions/forms.py:984 apps/transactions/forms.py:1134
#: apps/users/forms.py:252 apps/users/forms.py:410
#: apps/users/forms.py:251 apps/users/forms.py:409
#: templates/mini_tools/unit_price_calculator.html:168
#, fuzzy
msgid "Add"
@@ -67,9 +67,9 @@ msgstr "Salio Mpya"
#: apps/transactions/forms.py:61 apps/transactions/forms.py:307
#: apps/transactions/forms.py:475 apps/transactions/forms.py:572
#: apps/transactions/forms.py:579 apps/transactions/forms.py:763
#: apps/transactions/forms.py:1007 apps/transactions/models.py:331
#: apps/transactions/models.py:641 apps/transactions/models.py:841
#: apps/transactions/models.py:1089
#: apps/transactions/forms.py:1007 apps/transactions/models.py:346
#: apps/transactions/models.py:658 apps/transactions/models.py:858
#: apps/transactions/models.py:1110
#: templates/insights/fragments/category_overview/index.html:86
#: templates/insights/fragments/category_overview/index.html:542
#: templates/insights/fragments/month_by_month.html:84
@@ -80,13 +80,13 @@ msgstr ""
#: apps/accounts/forms.py:132 apps/dca/forms.py:95 apps/dca/forms.py:103
#: apps/export_app/forms.py:43 apps/export_app/forms.py:132
#: apps/rules/forms.py:184 apps/rules/forms.py:194 apps/rules/models.py:45
#: apps/rules/models.py:315 apps/transactions/filters.py:73
#: apps/rules/models.py:315 apps/transactions/filters.py:79
#: apps/transactions/forms.py:69 apps/transactions/forms.py:315
#: apps/transactions/forms.py:483 apps/transactions/forms.py:588
#: apps/transactions/forms.py:596 apps/transactions/forms.py:756
#: apps/transactions/forms.py:1000 apps/transactions/models.py:337
#: apps/transactions/models.py:643 apps/transactions/models.py:845
#: apps/transactions/models.py:1095 templates/includes/sidebar.html:150
#: apps/transactions/forms.py:1000 apps/transactions/models.py:352
#: apps/transactions/models.py:660 apps/transactions/models.py:862
#: apps/transactions/models.py:1116 templates/includes/sidebar.html:150
#: templates/insights/fragments/category_overview/index.html:40
#: templates/insights/fragments/month_by_month.html:29
#: templates/insights/fragments/month_by_month.html:32
@@ -98,8 +98,8 @@ msgstr ""
#: apps/accounts/models.py:12 apps/accounts/models.py:29 apps/dca/models.py:13
#: apps/import_app/models.py:14 apps/rules/models.py:13
#: apps/transactions/models.py:223 apps/transactions/models.py:248
#: apps/transactions/models.py:272 apps/transactions/models.py:1057
#: apps/transactions/models.py:238 apps/transactions/models.py:263
#: apps/transactions/models.py:287 apps/transactions/models.py:1078
#: apps/users/models.py:572 templates/account_groups/fragments/list.html:22
#: templates/accounts/fragments/list.html:22
#: templates/categories/fragments/table.html:17
@@ -170,9 +170,9 @@ msgstr ""
#: apps/rules/models.py:35 apps/rules/models.py:267
#: apps/transactions/forms.py:81 apps/transactions/forms.py:327
#: apps/transactions/forms.py:442 apps/transactions/forms.py:748
#: apps/transactions/forms.py:992 apps/transactions/models.py:303
#: apps/transactions/models.py:601 apps/transactions/models.py:823
#: apps/transactions/models.py:1063
#: apps/transactions/forms.py:992 apps/transactions/models.py:318
#: apps/transactions/models.py:618 apps/transactions/models.py:840
#: apps/transactions/models.py:1084
#: templates/installment_plans/fragments/table.html:17
#: templates/quick_transactions/fragments/list.html:14
#: templates/recurring_transactions/fragments/table.html:19
@@ -181,7 +181,7 @@ msgid "Account"
msgstr ""
#: apps/accounts/models.py:76 apps/export_app/forms.py:19
#: apps/export_app/forms.py:129 apps/transactions/filters.py:57
#: apps/export_app/forms.py:129 apps/transactions/filters.py:63
#: templates/accounts/fragments/list.html:9
#: templates/accounts/pages/index.html:4 templates/includes/sidebar.html:162
#: templates/includes/sidebar.html:164
@@ -349,7 +349,8 @@ msgid ""
"owner.<br/>Public: Shown for all users. Only editable by the owner."
msgstr ""
#: apps/common/forms.py:76 apps/users/forms.py:173
#: apps/common/forms.py:76 apps/users/forms.py:172
#: templates/transactions/fragments/filter_actions.html:5
msgid "Save"
msgstr ""
@@ -464,10 +465,9 @@ msgstr ""
#: apps/common/widgets/tom_select.py:15
#: templates/mini_tools/unit_price_calculator.html:180
#: templates/monthly_overview/pages/overview.html:275
#: templates/monthly_overview/pages/overview.html:287
#: templates/transactions/pages/transactions.html:225
#: templates/transactions/pages/transactions.html:237
#: templates/monthly_overview/pages/overview.html:284
#: templates/transactions/fragments/filter_actions.html:48
#: templates/transactions/pages/transactions.html:233
msgid "Clear"
msgstr ""
@@ -486,7 +486,7 @@ msgstr ""
#: apps/currencies/forms.py:66 apps/dca/models.py:158 apps/rules/forms.py:176
#: apps/rules/forms.py:190 apps/rules/models.py:38 apps/rules/models.py:279
#: apps/transactions/forms.py:85 apps/transactions/forms.py:447
#: apps/transactions/forms.py:600 apps/transactions/models.py:313
#: apps/transactions/forms.py:600 apps/transactions/models.py:328
#: templates/dca/fragments/strategy/details.html:49
#: templates/exchange_rates/fragments/table.html:10
#: templates/exchange_rates_services/fragments/table.html:11
@@ -506,7 +506,7 @@ msgid "Decimal Places"
msgstr ""
#: apps/currencies/models.py:45 apps/export_app/forms.py:25
#: apps/export_app/forms.py:130 apps/transactions/filters.py:64
#: apps/export_app/forms.py:130 apps/transactions/filters.py:70
#: templates/currencies/fragments/list.html:9
#: templates/currencies/pages/index.html:4 templates/includes/sidebar.html:176
#: templates/includes/sidebar.html:178
@@ -551,29 +551,29 @@ msgstr ""
msgid "From and To currencies cannot be the same."
msgstr ""
#: apps/currencies/models.py:110
#: apps/currencies/models.py:111
msgid "On"
msgstr ""
#: apps/currencies/models.py:111
#: apps/currencies/models.py:112
msgid "Every X hours"
msgstr ""
#: apps/currencies/models.py:112
#: apps/currencies/models.py:113
msgid "Not on"
msgstr ""
#: apps/currencies/models.py:114
#: apps/currencies/models.py:115
msgid "Service Name"
msgstr ""
#: apps/currencies/models.py:116
#: apps/currencies/models.py:117
msgid "Service Type"
msgstr ""
#: apps/currencies/models.py:118 apps/transactions/filters.py:27
#: apps/transactions/models.py:227 apps/transactions/models.py:251
#: apps/transactions/models.py:275 templates/categories/fragments/list.html:16
#: apps/currencies/models.py:119 apps/transactions/filters.py:27
#: apps/transactions/models.py:242 apps/transactions/models.py:266
#: apps/transactions/models.py:290 templates/categories/fragments/list.html:16
#: templates/entities/fragments/list.html:16
#: templates/installment_plans/fragments/list.html:16
#: templates/recurring_transactions/fragments/list.html:16
@@ -583,77 +583,77 @@ msgstr ""
msgid "Active"
msgstr ""
#: apps/currencies/models.py:123
#: apps/currencies/models.py:124
msgid "API Key"
msgstr ""
#: apps/currencies/models.py:124
#: apps/currencies/models.py:125
msgid "API key for the service (if required)"
msgstr ""
#: apps/currencies/models.py:129
#: apps/currencies/models.py:130
msgid "Interval Type"
msgstr ""
#: apps/currencies/models.py:133
#: apps/currencies/models.py:134
msgid "Interval"
msgstr ""
#: apps/currencies/models.py:136
#: apps/currencies/models.py:137
msgid "Last Successful Fetch"
msgstr ""
#: apps/currencies/models.py:143
#: apps/currencies/models.py:144
msgid "Target Currencies"
msgstr ""
#: apps/currencies/models.py:145
#: apps/currencies/models.py:146
msgid ""
"Select currencies to fetch exchange rates for. Rates will be fetched for "
"each currency against their set exchange currency."
msgstr ""
#: apps/currencies/models.py:153
#: apps/currencies/models.py:154
msgid "Target Accounts"
msgstr ""
#: apps/currencies/models.py:155
#: apps/currencies/models.py:156
msgid ""
"Select accounts to fetch exchange rates for. Rates will be fetched for each "
"account's currency against their set exchange currency."
msgstr ""
#: apps/currencies/models.py:162
#: apps/currencies/models.py:163
msgid "Single exchange rate"
msgstr ""
#: apps/currencies/models.py:165
#: apps/currencies/models.py:166
msgid "Create one exchange rate and keep updating it. Avoids database clutter."
msgstr ""
#: apps/currencies/models.py:170
#: apps/currencies/models.py:171
msgid "Exchange Rate Service"
msgstr ""
#: apps/currencies/models.py:171
#: apps/currencies/models.py:172
msgid "Exchange Rate Services"
msgstr ""
#: apps/currencies/models.py:223
#: apps/currencies/models.py:224
msgid "'Every X hours' interval type requires a positive integer."
msgstr ""
#: apps/currencies/models.py:232
#: apps/currencies/models.py:233
msgid "'Every X hours' interval must be between 1 and 24."
msgstr ""
#: apps/currencies/models.py:246
#: apps/currencies/models.py:247
msgid ""
"Invalid hour format. Use comma-separated hours (0-23) and/or ranges (e.g., "
"'1-5,8,10-12')."
msgstr ""
#: apps/currencies/models.py:257
#: apps/currencies/models.py:258
msgid ""
"Invalid format. Please check the requirements for your selected interval "
"type."
@@ -752,8 +752,8 @@ msgstr ""
#: apps/dca/models.py:26 apps/dca/models.py:181 apps/rules/forms.py:180
#: apps/rules/forms.py:196 apps/rules/models.py:43 apps/rules/models.py:295
#: apps/transactions/forms.py:469 apps/transactions/forms.py:616
#: apps/transactions/models.py:327 apps/transactions/models.py:650
#: apps/transactions/models.py:851 apps/transactions/models.py:1085
#: apps/transactions/models.py:342 apps/transactions/models.py:667
#: apps/transactions/models.py:868 apps/transactions/models.py:1106
msgid "Notes"
msgstr ""
@@ -816,7 +816,7 @@ msgid "Users"
msgstr ""
#: apps/export_app/forms.py:31 apps/export_app/forms.py:134
#: apps/transactions/models.py:388 templates/includes/sidebar.html:81
#: apps/transactions/models.py:403 templates/includes/sidebar.html:81
#: templates/includes/sidebar.html:142
#: templates/recurring_transactions/fragments/list_transactions.html:5
#: templates/recurring_transactions/fragments/table.html:37
@@ -825,7 +825,7 @@ msgid "Transactions"
msgstr ""
#: apps/export_app/forms.py:37 apps/export_app/forms.py:131
#: apps/transactions/filters.py:68 templates/categories/fragments/list.html:9
#: apps/transactions/filters.py:74 templates/categories/fragments/list.html:9
#: templates/categories/pages/index.html:4 templates/includes/sidebar.html:144
#: templates/insights/fragments/month_by_month.html:18
#: templates/insights/fragments/month_by_month.html:21
@@ -836,12 +836,12 @@ msgstr ""
#: apps/export_app/forms.py:49 apps/export_app/forms.py:133
#: apps/rules/forms.py:185 apps/rules/forms.py:195 apps/rules/models.py:46
#: apps/rules/models.py:307 apps/transactions/filters.py:78
#: apps/rules/models.py:307 apps/transactions/filters.py:84
#: apps/transactions/forms.py:77 apps/transactions/forms.py:323
#: apps/transactions/forms.py:491 apps/transactions/forms.py:771
#: apps/transactions/forms.py:1015 apps/transactions/models.py:286
#: apps/transactions/models.py:342 apps/transactions/models.py:646
#: apps/transactions/models.py:848 apps/transactions/models.py:1100
#: apps/transactions/forms.py:1015 apps/transactions/models.py:301
#: apps/transactions/models.py:357 apps/transactions/models.py:663
#: apps/transactions/models.py:865 apps/transactions/models.py:1121
#: templates/entities/fragments/list.html:9
#: templates/entities/pages/index.html:4 templates/includes/sidebar.html:156
#: templates/insights/fragments/category_overview/index.html:54
@@ -853,14 +853,14 @@ msgid "Entities"
msgstr ""
#: apps/export_app/forms.py:55 apps/export_app/forms.py:137
#: apps/transactions/models.py:888 templates/includes/sidebar.html:110
#: apps/transactions/models.py:905 templates/includes/sidebar.html:110
#: templates/recurring_transactions/fragments/list.html:9
#: templates/recurring_transactions/pages/index.html:4
msgid "Recurring Transactions"
msgstr ""
#: apps/export_app/forms.py:61 apps/export_app/forms.py:135
#: apps/transactions/models.py:664 templates/includes/sidebar.html:104
#: apps/transactions/models.py:681 templates/includes/sidebar.html:104
#: templates/installment_plans/fragments/list.html:9
#: templates/installment_plans/pages/index.html:4
msgid "Installment Plans"
@@ -1012,7 +1012,7 @@ msgid "Run deleted successfully"
msgstr ""
#: apps/insights/forms.py:118 apps/insights/utils/sankey.py:36
#: apps/insights/utils/sankey.py:167 apps/transactions/filters.py:203
#: apps/insights/utils/sankey.py:167 apps/transactions/filters.py:209
#: templates/insights/fragments/category_overview/index.html:96
#: templates/insights/fragments/category_overview/index.html:407
#: templates/insights/fragments/category_overview/index.html:436
@@ -1110,15 +1110,15 @@ msgstr ""
#: apps/rules/forms.py:174 apps/rules/forms.py:188 apps/rules/models.py:36
#: apps/rules/models.py:271 apps/transactions/forms.py:433
#: apps/transactions/models.py:310 apps/transactions/models.py:606
#: apps/transactions/models.py:829 apps/transactions/models.py:1070
#: apps/transactions/models.py:325 apps/transactions/models.py:623
#: apps/transactions/models.py:846 apps/transactions/models.py:1091
msgid "Type"
msgstr ""
#: apps/rules/forms.py:175 apps/rules/forms.py:189 apps/rules/models.py:37
#: apps/rules/models.py:275 apps/transactions/filters.py:22
#: apps/transactions/forms.py:437 apps/transactions/models.py:312
#: apps/transactions/models.py:1072 templates/cotton/transaction/item.html:20
#: apps/transactions/forms.py:437 apps/transactions/models.py:327
#: apps/transactions/models.py:1093 templates/cotton/transaction/item.html:20
#: templates/cotton/transaction/item.html:31
#: templates/transactions/widgets/paid_toggle_button.html:10
#: templates/transactions/widgets/unselectable_paid_toggle_button.html:13
@@ -1128,15 +1128,15 @@ msgstr ""
#: apps/rules/forms.py:177 apps/rules/forms.py:191 apps/rules/models.py:39
#: apps/rules/models.py:283 apps/transactions/forms.py:89
#: apps/transactions/forms.py:453 apps/transactions/forms.py:603
#: apps/transactions/forms.py:777 apps/transactions/models.py:314
#: apps/transactions/models.py:624 apps/transactions/models.py:853
#: apps/transactions/forms.py:777 apps/transactions/models.py:329
#: apps/transactions/models.py:641 apps/transactions/models.py:870
msgid "Reference Date"
msgstr ""
#: apps/rules/forms.py:178 apps/rules/forms.py:192 apps/rules/models.py:41
#: apps/rules/models.py:287 apps/transactions/forms.py:460
#: apps/transactions/models.py:320 apps/transactions/models.py:834
#: apps/transactions/models.py:1078
#: apps/transactions/models.py:335 apps/transactions/models.py:851
#: apps/transactions/models.py:1099
#: templates/insights/fragments/sankey.html:102
#: templates/installment_plans/fragments/table.html:18
#: templates/quick_transactions/fragments/list.html:15
@@ -1147,27 +1147,27 @@ msgstr ""
#: apps/rules/forms.py:179 apps/rules/forms.py:193 apps/rules/models.py:14
#: apps/rules/models.py:42 apps/rules/models.py:291
#: apps/transactions/forms.py:464 apps/transactions/forms.py:607
#: apps/transactions/models.py:325 apps/transactions/models.py:608
#: apps/transactions/models.py:837 apps/transactions/models.py:1083
#: apps/transactions/models.py:340 apps/transactions/models.py:625
#: apps/transactions/models.py:854 apps/transactions/models.py:1104
msgid "Description"
msgstr ""
#: apps/rules/forms.py:182 apps/rules/forms.py:198 apps/rules/models.py:47
#: apps/rules/models.py:299 apps/transactions/models.py:364
#: apps/transactions/models.py:1105
#: apps/rules/models.py:299 apps/transactions/models.py:379
#: apps/transactions/models.py:1126
msgid "Internal Note"
msgstr ""
#: apps/rules/forms.py:183 apps/rules/forms.py:199 apps/rules/models.py:48
#: apps/rules/models.py:303 apps/transactions/models.py:366
#: apps/transactions/models.py:1107
#: apps/rules/models.py:303 apps/transactions/models.py:381
#: apps/transactions/models.py:1128
msgid "Internal ID"
msgstr ""
#: apps/rules/forms.py:186 apps/rules/forms.py:200 apps/rules/models.py:40
#: apps/rules/models.py:319 apps/transactions/forms.py:620
#: apps/transactions/models.py:224 apps/transactions/models.py:315
#: apps/transactions/models.py:1073
#: apps/transactions/models.py:239 apps/transactions/models.py:330
#: apps/transactions/models.py:1094
msgid "Mute"
msgstr ""
@@ -1180,7 +1180,7 @@ msgid "Set Values"
msgstr ""
#: apps/rules/forms.py:407 apps/rules/forms.py:442 apps/rules/forms.py:477
#: apps/transactions/models.py:387 apps/transactions/models.py:544
#: apps/transactions/models.py:402 apps/transactions/models.py:560
msgid "Transaction"
msgstr ""
@@ -1327,58 +1327,58 @@ msgstr ""
msgid "Muted"
msgstr ""
#: apps/transactions/filters.py:45
#: apps/transactions/filters.py:51
msgid "Content"
msgstr ""
#: apps/transactions/filters.py:51
#: apps/transactions/filters.py:57
msgid "Transaction Type"
msgstr ""
#: apps/transactions/filters.py:89
#: apps/transactions/filters.py:95
msgid "Mute Status"
msgstr ""
#: apps/transactions/filters.py:94
#: apps/transactions/filters.py:100
msgid "Date from"
msgstr ""
#: apps/transactions/filters.py:99 apps/transactions/filters.py:109
#: apps/transactions/filters.py:105 apps/transactions/filters.py:115
msgid "Until"
msgstr ""
#: apps/transactions/filters.py:104
#: apps/transactions/filters.py:110
msgid "Reference date from"
msgstr ""
#: apps/transactions/filters.py:114
#: apps/transactions/filters.py:120
msgid "Amount min"
msgstr ""
#: apps/transactions/filters.py:119
#: apps/transactions/filters.py:125
msgid "Amount max"
msgstr ""
#: apps/transactions/filters.py:202
#: apps/transactions/filters.py:208
msgid "Categorized"
msgstr ""
#: apps/transactions/filters.py:209
#: apps/transactions/filters.py:215
msgid "Tagged"
msgstr ""
#: apps/transactions/filters.py:209
#: apps/transactions/filters.py:215
#: templates/insights/fragments/category_overview/index.html:189
#: templates/insights/fragments/month_by_month.html:121
#: templates/insights/fragments/year_by_year.html:75
msgid "Untagged"
msgstr ""
#: apps/transactions/filters.py:215
#: apps/transactions/filters.py:221
msgid "Any entity"
msgstr ""
#: apps/transactions/filters.py:216
#: apps/transactions/filters.py:222
#: templates/insights/fragments/category_overview/index.html:282
#: templates/insights/fragments/month_by_month.html:123
#: templates/insights/fragments/year_by_year.html:77
@@ -1453,42 +1453,42 @@ msgstr ""
msgid "End date should be after the start date"
msgstr ""
#: apps/transactions/models.py:229
#: apps/transactions/models.py:244
msgid ""
"Deactivated categories won't be able to be selected when creating new "
"transactions"
msgstr ""
#: apps/transactions/models.py:237
#: apps/transactions/models.py:252
msgid "Transaction Category"
msgstr ""
#: apps/transactions/models.py:238
#: apps/transactions/models.py:253
msgid "Transaction Categories"
msgstr ""
#: apps/transactions/models.py:253
#: apps/transactions/models.py:268
msgid ""
"Deactivated tags won't be able to be selected when creating new transactions"
msgstr ""
#: apps/transactions/models.py:261 apps/transactions/models.py:262
#: apps/transactions/models.py:276 apps/transactions/models.py:277
msgid "Transaction Tags"
msgstr ""
#: apps/transactions/models.py:277
#: apps/transactions/models.py:292
msgid ""
"Deactivated entities won't be able to be selected when creating new "
"transactions"
msgstr ""
#: apps/transactions/models.py:285
#: apps/transactions/models.py:300
#: templates/insights/fragments/month_by_month.html:88
#: templates/insights/fragments/year_by_year.html:56
msgid "Entity"
msgstr ""
#: apps/transactions/models.py:297 apps/transactions/models.py:1050
#: apps/transactions/models.py:312 apps/transactions/models.py:1071
#: templates/calendar_view/fragments/list.html:42
#: templates/calendar_view/fragments/list.html:44
#: templates/calendar_view/fragments/list.html:52
@@ -1500,7 +1500,7 @@ msgstr ""
msgid "Income"
msgstr ""
#: apps/transactions/models.py:298 apps/transactions/models.py:1051
#: apps/transactions/models.py:313 apps/transactions/models.py:1072
#: templates/calendar_view/fragments/list.html:46
#: templates/calendar_view/fragments/list.html:48
#: templates/calendar_view/fragments/list.html:56
@@ -1511,157 +1511,157 @@ msgstr ""
msgid "Expense"
msgstr ""
#: apps/transactions/models.py:353 apps/transactions/models.py:663
#: apps/transactions/models.py:368 apps/transactions/models.py:680
msgid "Installment Plan"
msgstr ""
#: apps/transactions/models.py:362 apps/transactions/models.py:887
#: apps/transactions/models.py:377 apps/transactions/models.py:904
msgid "Recurring Transaction"
msgstr ""
#: apps/transactions/models.py:370
#: apps/transactions/models.py:385
msgid "Deleted"
msgstr ""
#: apps/transactions/models.py:375
#: apps/transactions/models.py:390
msgid "Deleted At"
msgstr ""
#: apps/transactions/models.py:489 templates/tags/fragments/table.html:69
#: apps/transactions/models.py:504 templates/tags/fragments/table.html:69
msgid "No tags"
msgstr ""
#: apps/transactions/models.py:491
#: apps/transactions/models.py:506
msgid "No category"
msgstr ""
#: apps/transactions/models.py:493
#: apps/transactions/models.py:508
msgid "No description"
msgstr ""
#: apps/transactions/models.py:549
#: apps/transactions/models.py:565
msgid "File"
msgstr ""
#: apps/transactions/models.py:551
#: apps/transactions/models.py:567
msgid "Original Name"
msgstr ""
#: apps/transactions/models.py:553
#: apps/transactions/models.py:569
msgid "Content Type"
msgstr ""
#: apps/transactions/models.py:555
#: apps/transactions/models.py:571
msgid "Size"
msgstr ""
#: apps/transactions/models.py:560
#: apps/transactions/models.py:576
msgid "Uploaded By"
msgstr ""
#: apps/transactions/models.py:565
#: apps/transactions/models.py:581
msgid "Transaction Attachment"
msgstr ""
#: apps/transactions/models.py:566
#: apps/transactions/models.py:582
msgid "Transaction Attachments"
msgstr ""
#: apps/transactions/models.py:595 templates/includes/sidebar.html:57
#: apps/transactions/models.py:612 templates/includes/sidebar.html:57
msgid "Yearly"
msgstr ""
#: apps/transactions/models.py:596 apps/users/models.py:469
#: apps/transactions/models.py:613 apps/users/models.py:469
#: templates/includes/sidebar.html:51
msgid "Monthly"
msgstr ""
#: apps/transactions/models.py:597
#: apps/transactions/models.py:614
msgid "Weekly"
msgstr ""
#: apps/transactions/models.py:598
#: apps/transactions/models.py:615
msgid "Daily"
msgstr ""
#: apps/transactions/models.py:611
#: apps/transactions/models.py:628
msgid "Number of Installments"
msgstr ""
#: apps/transactions/models.py:616
#: apps/transactions/models.py:633
msgid "Installment Start"
msgstr ""
#: apps/transactions/models.py:617
#: apps/transactions/models.py:634
msgid "The installment number to start counting from"
msgstr ""
#: apps/transactions/models.py:622 apps/transactions/models.py:857
#: apps/transactions/models.py:639 apps/transactions/models.py:874
msgid "Start Date"
msgstr ""
#: apps/transactions/models.py:626 apps/transactions/models.py:858
#: apps/transactions/models.py:643 apps/transactions/models.py:875
msgid "End Date"
msgstr ""
#: apps/transactions/models.py:631
#: apps/transactions/models.py:648
msgid "Recurrence"
msgstr ""
#: apps/transactions/models.py:634
#: apps/transactions/models.py:651
msgid "Installment Amount"
msgstr ""
#: apps/transactions/models.py:653 apps/transactions/models.py:877
#: apps/transactions/models.py:670 apps/transactions/models.py:894
msgid "Add description to transactions"
msgstr ""
#: apps/transactions/models.py:656 apps/transactions/models.py:880
#: apps/transactions/models.py:673 apps/transactions/models.py:897
msgid "Add notes to transactions"
msgstr ""
#: apps/transactions/models.py:816
#: apps/transactions/models.py:833
msgid "day(s)"
msgstr ""
#: apps/transactions/models.py:817
#: apps/transactions/models.py:834
msgid "week(s)"
msgstr ""
#: apps/transactions/models.py:818
#: apps/transactions/models.py:835
msgid "month(s)"
msgstr ""
#: apps/transactions/models.py:819
#: apps/transactions/models.py:836
msgid "year(s)"
msgstr ""
#: apps/transactions/models.py:821
#: apps/transactions/models.py:838
#: templates/recurring_transactions/fragments/list.html:18
msgid "Paused"
msgstr ""
#: apps/transactions/models.py:860
#: apps/transactions/models.py:877
msgid "Recurrence Type"
msgstr ""
#: apps/transactions/models.py:863
#: apps/transactions/models.py:880
msgid "Recurrence Interval"
msgstr ""
#: apps/transactions/models.py:866
#: apps/transactions/models.py:883
msgid "Keep at most"
msgstr ""
#: apps/transactions/models.py:870
#: apps/transactions/models.py:887
msgid "Last Generated Date"
msgstr ""
#: apps/transactions/models.py:873
#: apps/transactions/models.py:890
msgid "Last Generated Reference Date"
msgstr ""
#: apps/transactions/models.py:1117
#: apps/transactions/models.py:1138
#: apps/transactions/views/quick_transactions.py:178
#: apps/transactions/views/quick_transactions.py:187
#: apps/transactions/views/quick_transactions.py:189
@@ -1670,7 +1670,7 @@ msgstr ""
msgid "Quick Transaction"
msgstr ""
#: apps/transactions/models.py:1118 templates/includes/sidebar.html:98
#: apps/transactions/models.py:1139 templates/includes/sidebar.html:98
#: templates/quick_transactions/pages/index.html:5
#: templates/quick_transactions/pages/index.html:15
msgid "Quick Transactions"
@@ -1894,9 +1894,9 @@ msgstr ""
#: apps/users/forms.py:68 apps/users/forms.py:81 apps/users/forms.py:103
#: templates/monthly_overview/pages/overview.html:98
#: templates/monthly_overview/pages/overview.html:245
#: templates/monthly_overview/pages/overview.html:247
#: templates/transactions/pages/transactions.html:47
#: templates/transactions/pages/transactions.html:195
#: templates/transactions/pages/transactions.html:196
msgid "Default"
msgstr ""
@@ -1918,7 +1918,7 @@ msgstr ""
msgid "Default Account"
msgstr "Akaunti ya Mali"
#: apps/users/forms.py:178
#: apps/users/forms.py:177
#, python-format
msgid ""
"This changes the language (if available) and how numbers and dates are "
@@ -1926,81 +1926,81 @@ msgid ""
"Consider helping translate WYGIWYH to your language at %(translation_link)s"
msgstr ""
#: apps/users/forms.py:187
#: apps/users/forms.py:186
msgid "New Password"
msgstr ""
#: apps/users/forms.py:190
#: apps/users/forms.py:189
msgid "Leave blank to keep the current password."
msgstr ""
#: apps/users/forms.py:193
#: apps/users/forms.py:192
msgid "Confirm New Password"
msgstr ""
#: apps/users/forms.py:205 apps/users/forms.py:362
#: apps/users/forms.py:204 apps/users/forms.py:361
msgid ""
"Designates whether this user should be treated as active. Unselect this "
"instead of deleting accounts."
msgstr ""
#: apps/users/forms.py:208 apps/users/forms.py:365
#: apps/users/forms.py:207 apps/users/forms.py:364
msgid ""
"Designates that this user has all permissions without explicitly assigning "
"them."
msgstr ""
#: apps/users/forms.py:275
#: apps/users/forms.py:274
msgid "This email address is already in use by another account."
msgstr ""
#: apps/users/forms.py:283
#: apps/users/forms.py:282
msgid "The two password fields didn't match."
msgstr ""
#: apps/users/forms.py:285
#: apps/users/forms.py:284
msgid "Please confirm your new password."
msgstr ""
#: apps/users/forms.py:287
#: apps/users/forms.py:286
msgid "Please enter the new password first."
msgstr ""
#: apps/users/forms.py:307
#: apps/users/forms.py:306
msgid "You cannot deactivate your own account using this form."
msgstr ""
#: apps/users/forms.py:320
#: apps/users/forms.py:319
msgid "Cannot remove status from the last superuser."
msgstr ""
#: apps/users/forms.py:326
#: apps/users/forms.py:325
msgid "You cannot remove your own superuser status using this form."
msgstr ""
#: apps/users/forms.py:419
#: apps/users/forms.py:418
msgid "A user with this email address already exists."
msgstr ""
#: apps/users/forms.py:439
#: apps/users/forms.py:438
#, fuzzy
#| msgid "Group name"
msgid "Token name"
msgstr "Jina La Kundi"
#: apps/users/forms.py:441
#: apps/users/forms.py:440
msgid "Use a descriptive name such as n8n, Home Assistant, or backup job."
msgstr ""
#: apps/users/forms.py:447
#: apps/users/forms.py:446
msgid "Expires in days"
msgstr ""
#: apps/users/forms.py:448
#: apps/users/forms.py:447
msgid "Leave empty for a non-expiring token."
msgstr ""
#: apps/users/forms.py:463
#: apps/users/forms.py:462
msgid "Create token"
msgstr ""
@@ -2223,6 +2223,7 @@ msgstr ""
#: templates/rules/fragments/transaction_rule/view.html:92
#: templates/rules/fragments/transaction_rule/view.html:133
#: templates/tags/fragments/table.html:51
#: templates/transactions/fragments/filter_presets.html:28
#: templates/users/fragments/api_tokens.html:93
msgid "Delete"
msgstr ""
@@ -2327,8 +2328,8 @@ msgid "Current balance"
msgstr ""
#: templates/accounts/fragments/account_reconciliation.html:36
#: templates/net_worth/net_worth.html:146
#: templates/net_worth/net_worth.html:396
#: templates/net_worth/net_worth.html:147
#: templates/net_worth/net_worth.html:407
msgid "Difference"
msgstr ""
@@ -2708,19 +2709,19 @@ msgstr ""
msgid "Amount Bought"
msgstr ""
#: templates/dca/fragments/strategy/details.html:384
#: templates/dca/fragments/strategy/details.html:409
msgid "Entry Price vs Current Price"
msgstr ""
#: templates/dca/fragments/strategy/details.html:398
#: templates/dca/fragments/strategy/details.html:423
msgid "Days Between Investments"
msgstr ""
#: templates/dca/fragments/strategy/details.html:444
#: templates/dca/fragments/strategy/details.html:469
msgid "Investment Frequency"
msgstr ""
#: templates/dca/fragments/strategy/details.html:446
#: templates/dca/fragments/strategy/details.html:471
msgid "The straighter the blue line, the more consistent your DCA strategy is."
msgstr ""
@@ -2957,6 +2958,7 @@ msgid "Reload"
msgstr ""
#: templates/includes/scripts/hyperscript/swal.html:13
#: templates/transactions/fragments/filter_actions.html:4
msgid "Cancel"
msgstr ""
@@ -3371,16 +3373,16 @@ msgid "Summary"
msgstr ""
#: templates/monthly_overview/pages/overview.html:99
#: templates/monthly_overview/pages/overview.html:254
#: templates/monthly_overview/pages/overview.html:256
#: templates/transactions/pages/transactions.html:48
#: templates/transactions/pages/transactions.html:204
#: templates/transactions/pages/transactions.html:205
msgid "Oldest first"
msgstr ""
#: templates/monthly_overview/pages/overview.html:100
#: templates/monthly_overview/pages/overview.html:263
#: templates/monthly_overview/pages/overview.html:265
#: templates/transactions/pages/transactions.html:49
#: templates/transactions/pages/transactions.html:213
#: templates/transactions/pages/transactions.html:214
msgid "Newest first"
msgstr ""
@@ -3389,8 +3391,8 @@ msgstr ""
msgid "Filter transactions"
msgstr ""
#: templates/monthly_overview/pages/overview.html:235
#: templates/transactions/pages/transactions.html:185
#: templates/monthly_overview/pages/overview.html:237
#: templates/transactions/pages/transactions.html:186
msgid "Order by"
msgstr ""
@@ -3399,24 +3401,24 @@ msgstr ""
msgid "By currency"
msgstr ""
#: templates/net_worth/net_worth.html:84
#: templates/net_worth/net_worth.html:84 templates/net_worth/net_worth.html:85
msgid "Consolidated"
msgstr ""
#: templates/net_worth/net_worth.html:134
#: templates/net_worth/net_worth.html:135
msgid "Evolution"
msgstr ""
#: templates/net_worth/net_worth.html:162
#: templates/net_worth/net_worth.html:163
#: templates/yearly_overview/pages/overview_by_account.html:4
msgid "By account"
msgstr ""
#: templates/net_worth/net_worth.html:270
#: templates/net_worth/net_worth.html:271
msgid "Evolution by currency"
msgstr ""
#: templates/net_worth/net_worth.html:334
#: templates/net_worth/net_worth.html:345
msgid "Evolution by account"
msgstr ""
@@ -3647,6 +3649,40 @@ msgstr ""
msgid "transactions"
msgstr ""
#: templates/transactions/fragments/filter_actions.html:2
msgid "Save filter preset"
msgstr ""
#: templates/transactions/fragments/filter_actions.html:3
msgid "Preset name"
msgstr ""
#: templates/transactions/fragments/filter_actions.html:40
msgid "Save preset"
msgstr ""
#: templates/transactions/fragments/filter_presets.html:6
msgid "Filter presets"
msgstr ""
#: templates/transactions/fragments/filter_presets.html:21
#, python-format
msgid "Delete %(name)s"
msgstr ""
#: templates/transactions/fragments/filter_presets.html:26
msgid "Delete filter preset?"
msgstr ""
#: templates/transactions/fragments/filter_presets.html:27
#, python-format
msgid "Delete “%(name)s”?"
msgstr ""
#: templates/transactions/fragments/filter_presets.html:34
msgid "No saved presets"
msgstr ""
#: templates/transactions/fragments/list_all.html:58
msgid "No transactions found"
msgstr ""
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
Binary file not shown.
Binary file not shown.
@@ -331,6 +331,8 @@
},
scales: {
x: {
min: Math.max(0, priceData.labels.length - 20),
max: Math.max(0, priceData.labels.length - 1),
grid: {
display: false
},
@@ -369,6 +371,29 @@
}
},
plugins: {
zoom: {
limits: {
x: {
min: 0,
max: Math.max(0, priceData.labels.length - 1),
minRange: 5
}
},
pan: {
enabled: true,
mode: 'x'
},
zoom: {
wheel: {
enabled: true,
modifierKey: 'ctrl'
},
pinch: {
enabled: true
},
mode: 'x'
}
},
legend: {
position: 'top'
},
@@ -1,20 +1,12 @@
<script type="text/hyperscript">
on paid if body do not include #settings-mute-sound
js
volume = JSON.parse(document.getElementById('volume').textContent) / 10
paidSound.pause()
paidSound.currentTime = 0
paidSound.volume = volume
paidSound.play()
playSound("sparkle")
end
end
on unpaid if body do not include #settings-mute-sound
js
volume = JSON.parse(document.getElementById('volume').textContent) / 10
unpaidSound.pause()
unpaidSound.currentTime = 0
unpaidSound.volume = volume
unpaidSound.play()
playSound("bloom")
end
end
</script>
+7 -5
View File
@@ -52,7 +52,8 @@
<i class="fa-solid fa-grip"></i>
</div>
<input type="search"
<div class="relative">
<input type="search"
class="input w-full"
id="calculator-input"
_="on click me.focus()
@@ -90,14 +91,15 @@
then remove .swing-out-top-bck from #calculator-result-container
end"
placeholder="2 + 2">
<div class="btn btn-error btn-circle absolute cursor-pointer top-0 right-0 translate-x-1/2 -translate-y-1/2 p-0 flex items-center justify-center w-5 h-5"
_="on click trigger show on #calculator">
<i class="fa-solid fa-xmark flex items-center justify-center w-full h-full content-center text-xs"></i>
</div>
</div>
<div class="hidden" id="calculator-result-container">
<div class="flex flex-row py-3 px-5 justify-between">
<div class="text-subtle">=</div>
<div id="calculator-result" class="select-all"></div>
</div>
</div>
<div class="btn btn-error btn-circle absolute cursor-pointer top-0 left-full start-100 -translate-x-1/2 -translate-y-1/2 p-0 flex items-center justify-center w-5 h-5"
_="on click trigger show on #calculator">
<i class="fa-solid fa-xmark flex items-center justify-center w-full h-full content-center text-xs"></i>
</div>
</div>
@@ -107,7 +107,7 @@
@click="filterOpen = !filterOpen"
:aria-expanded="filterOpen" id="filter-button"
title="{% translate 'Filter transactions' %}"
_="on load or change from #filter
_="on change from #filter-container
-- Check if any filter has a non-default value
set hasActiveFilter to false
@@ -208,7 +208,7 @@
add .hidden to #filter-active-indicator
end">
<i class="fa-solid fa-filter fa-fw"></i>
<span id="filter-active-indicator" class="absolute -top-1 -right-1 w-3 h-3 bg-error rounded-full hidden z-10"></span>
<span id="filter-active-indicator" class="absolute -top-1 -right-1 w-3 h-3 bg-error rounded-full {% if not filter_is_active %}hidden {% endif %}z-10"></span>
</button>
{# Search box #}
@@ -228,6 +228,8 @@
show <.transaction/> in <#transactions-list/>
when its textContent.toLowerCase() contains my value.toLowerCase()">
{% include "transactions/fragments/filter_presets.html" %}
{# Order by icon dropdown #}
<div>
<button class="btn btn-secondary join-item" type="button"
@@ -270,21 +272,16 @@
{# Filter transactions form #}
<div class="z-1" x-show="filterOpen" x-collapse x-cloak>
<div class="card card-body bg-base-200 mt-2">
<div class="text-right">
<button class="btn btn-outline btn-error btn-sm w-fit"
_="on click call #filter.reset() then trigger change on #filter">{% translate 'Clear' %}</button>
</div>
{% include "transactions/fragments/filter_actions.html" %}
<form _="on change or submit or search trigger updated on window
install init_tom_select
install init_datepicker"
id="filter" class="mt-3">
{% crispy filter.form %}
</form>
{% include "transactions/fragments/filter_form.html" %}
<div class="text-right">
<button class="btn btn-outline btn-error btn-sm w-fit"
_="on click call #filter.reset() then trigger change on #filter">{% translate 'Clear' %}</button>
<a class="btn btn-outline btn-error btn-sm w-fit"
href="{{ request.path }}"
hx-get="{% url 'transaction_filter_clear' %}"
hx-target="#filter"
hx-swap="outerHTML">{% translate 'Clear' %}</a>
</div>
</div>
</div>
+16 -5
View File
@@ -56,7 +56,7 @@
<li>
{% if currency.consolidated and currency.consolidated.total_final != currency.total_final %}
<a class="cursor-pointer select-auto flex justify-between items-center w-full"
_="on click showOnlyCurrencyDataset('{{ currency.currency.name }}')">
_="on click showOnlyCurrencyDataset('{{ currency.currency.name }}', '{{ currency.currency.name }}')">
<span
class="currency-name text-start font-mono shrink text-ellipsis">{{ currency.currency.name }}</span>
<span class="text-end shrink-0">
@@ -80,7 +80,8 @@
</a>
<ul>
<li>
<a class="text-base-content/60 select-auto flex justify-between items-center w-full">
<a class="cursor-pointer text-base-content/60 select-auto flex justify-between items-center w-full"
_="on click showOnlyCurrencyDataset('{{ currency.currency.name }} {% trans "Consolidated" %}', '{{ currency.currency.name }}')">
<span class="text-start shrink">{% trans "Consolidated" %}</span>
<span class="text-end shrink-0">
<c-amount.display :amount="currency.consolidated.total_final"
@@ -95,7 +96,7 @@
</ul>
{% else %}
<a class="cursor-pointer select-auto flex justify-between items-center w-full"
_="on click showOnlyCurrencyDataset('{{ currency.currency.name }}')">
_="on click showOnlyCurrencyDataset('{{ currency.currency.name }}', '{{ currency.currency.name }}')">
<span class="currency-name text-start font-mono shrink">{{ currency.currency.name }}</span>
<span class="text-end shrink-0">
<div>
@@ -302,6 +303,16 @@
}
}
});
for (const dataset of currencyChart.data.datasets) {
if (!dataset.colorSource) continue;
const source = currencyChart.data.datasets.find(
candidate => candidate.label === dataset.colorSource
);
dataset.borderColor = source.borderColor;
dataset.backgroundColor = source.backgroundColor;
}
currencyChart.update('none');
}
</script>
<script id="accountBalanceChartScript">
@@ -448,7 +459,7 @@
call accountChart.update()
end
def showOnlyCurrencyDataset(datasetName)
def showOnlyCurrencyDataset(datasetName, differenceDatasetName)
for dataset in currencyChart.data.datasets
set isMatch to dataset.label is datasetName
call currencyChart.setDatasetVisibility(currencyChart.data.datasets.indexOf(dataset), isMatch)
@@ -456,7 +467,7 @@
call currencyChart.update()
for dataset in monthlyDifferenceChart.data.datasets
set isMatch to dataset.label is datasetName
set isMatch to dataset.label is differenceDatasetName
call monthlyDifferenceChart.setDatasetVisibility(monthlyDifferenceChart.data.datasets.indexOf(dataset), isMatch)
end
call monthlyDifferenceChart.update()
@@ -0,0 +1,50 @@
{% load i18n %}
{% translate "Save filter preset" as save_filter_preset_title %}
{% translate "Preset name" as preset_name_label %}
{% translate "Cancel" as cancel_label %}
{% translate "Save" as save_label %}
<div class="flex justify-end gap-2">
<form id="save-filter-preset"
hx-post="{% url 'filter_preset_create' %}"
hx-include="#filter"
hx-target="#filter-presets"
hx-swap="outerHTML">
<input id="filter-preset-name" type="hidden" name="name">
<button class="btn btn-outline btn-primary btn-sm" type="button"
data-title="{{ save_filter_preset_title }}"
data-input-label="{{ preset_name_label }}"
data-cancel-text="{{ cancel_label }}"
data-confirm-text="{{ save_label }}"
_="on click
call Swal.fire({title: @data-title,
input: 'text',
inputLabel: @data-input-label,
inputAttributes: {maxlength: '100'},
showCancelButton: true,
cancelButtonText: @data-cancel-text,
confirmButtonText: @data-confirm-text,
customClass: {
confirmButton: 'btn btn-primary me-3',
cancelButton: 'btn btn-error'
},
buttonsStyling: false})
if result.isConfirmed
set presetName to result.value.trim()
if presetName is not ''
set #filter-preset-name.value to presetName
trigger submit on #save-filter-preset
end
end">
<i class="fa-solid fa-bookmark fa-fw"></i>
{% translate 'Save preset' %}
</button>
</form>
<a class="btn btn-outline btn-error btn-sm"
href="{{ request.path }}"
hx-get="{% url 'transaction_filter_clear' %}"
hx-target="#filter"
hx-swap="outerHTML">
{% translate 'Clear' %}
</a>
</div>
@@ -0,0 +1,18 @@
{% load crispy_forms_tags %}
<form _="on change or submit or search
if event.type is 'submit'
halt the event
end
trigger updated on window
end
install init_tom_select
install init_datepicker"
id="filter" class="mt-3">
{% crispy filter.form %}
</form>
{% if swap_filter_indicator %}
<span id="filter-active-indicator"
class="absolute -top-1 -right-1 w-3 h-3 bg-error rounded-full {% if not filter_is_active %}hidden {% endif %}z-10"
hx-swap-oob="outerHTML"></span>
{% endif %}
@@ -0,0 +1,37 @@
{% load i18n %}
<div id="filter-presets">
<button class="btn btn-secondary join-item" type="button"
data-bs-toggle="dropdown" aria-expanded="false"
title="{% translate 'Filter presets' %}">
<i class="fa-solid fa-bookmark fa-fw"></i>
</button>
<ul class="dropdown-menu dropdown-menu-end menu min-w-52">
{% for preset in filter_presets %}
<li class="group flex-row items-center">
<button class="grow justify-start"
type="button"
hx-get="{% url 'filter_preset_apply' preset.id %}"
hx-target="#filter"
hx-swap="outerHTML">
{{ preset.name }}
</button>
<button class="btn btn-ghost btn-xs opacity-0 group-hover:opacity-100 focus:opacity-100"
type="button"
aria-label="{% blocktranslate with name=preset.name %}Delete {{ name }}{% endblocktranslate %}"
hx-post="{% url 'filter_preset_delete' preset.id %}"
hx-trigger="confirmed"
hx-target="#filter-presets"
hx-swap="outerHTML"
data-title="{% translate 'Delete filter preset?' %}"
data-text="{% blocktranslate with name=preset.name %}Delete “{{ name }}”?{% endblocktranslate %}"
data-confirm-text="{% translate 'Delete' %}"
_="install prompt_swal">
<i class="fa-solid fa-xmark fa-fw"></i>
</button>
</li>
{% empty %}
<li class="menu-disabled"><span>{% translate 'No saved presets' %}</span></li>
{% endfor %}
</ul>
</div>
@@ -56,7 +56,7 @@
@click="filterOpen = !filterOpen"
:aria-expanded="filterOpen" id="filter-button"
title="{% translate 'Filter transactions' %}"
_="on load or change from #filter
_="on change from #filter-container
-- Check if any filter has a non-default value
set hasActiveFilter to false
@@ -157,7 +157,7 @@
add .hidden to #filter-active-indicator
end">
<i class="fa-solid fa-filter fa-fw"></i>
<span id="filter-active-indicator" class="absolute -top-1 -right-1 w-3 h-3 bg-error rounded-full hidden z-10"></span>
<span id="filter-active-indicator" class="absolute -top-1 -right-1 w-3 h-3 bg-error rounded-full {% if not filter_is_active %}hidden {% endif %}z-10"></span>
</button>
{# Search box #}
@@ -177,7 +177,8 @@
show <.transaction/> in <#transactions-list/>
when its textContent.toLowerCase() contains my value.toLowerCase()">
{# Order by icon dropdown #}
{% include "transactions/fragments/filter_presets.html" %}
{# Order by icon dropdown #}
<div>
<button class="btn btn-secondary join-item" type="button"
@@ -220,21 +221,16 @@
{# Filter transactions form #}
<div class="z-1" x-show="filterOpen" x-collapse x-cloak>
<div class="card card-body bg-base-200 mt-2">
<div class="text-right">
<button class="btn btn-outline btn-error btn-sm w-fit"
_="on click call #filter.reset() then trigger change on #filter">{% translate 'Clear' %}</button>
</div>
{% include "transactions/fragments/filter_actions.html" %}
<form _="on change or submit or search trigger updated on window
install init_tom_select
install init_datepicker"
id="filter" class="mt-3">
{% crispy filter.form %}
</form>
{% include "transactions/fragments/filter_form.html" %}
<div class="text-right">
<button class="btn btn-outline btn-error btn-sm w-fit"
_="on click call #filter.reset() then trigger change on #filter">{% translate 'Clear' %}</button>
<a class="btn btn-outline btn-error btn-sm w-fit"
href="{{ request.path }}"
hx-get="{% url 'transaction_filter_clear' %}"
hx-target="#filter"
hx-swap="outerHTML">{% translate 'Clear' %}</a>
</div>
</div>
</div>
+4 -3
View File
@@ -3,9 +3,10 @@ FROM node:lts-alpine
WORKDIR /usr/src/frontend
COPY ./frontend/package.json ./frontend/package-lock.json ./
RUN npm ci --verbose && npm cache clean --force
COPY ./docker/dev/vite/entrypoint.sh /usr/local/bin/vite-entrypoint
RUN sed -i 's/\r$//g' /usr/local/bin/vite-entrypoint && \
chmod +x /usr/local/bin/vite-entrypoint
ENV PATH ./node_modules/.bin/:$PATH
CMD ["npm", "run", "dev"]
ENTRYPOINT ["vite-entrypoint"]
+13
View File
@@ -0,0 +1,13 @@
#!/bin/sh
set -eu
deps_hash="$(sha256sum package.json package-lock.json | sha256sum | cut -d ' ' -f 1)"
deps_stamp="node_modules/.wygiwyh-deps-hash"
if [ ! -f "$deps_stamp" ] || [ "$(cat "$deps_stamp")" != "$deps_hash" ]; then
echo "Installing frontend dependencies..."
npm ci --no-audit --no-fund --prefer-offline
printf '%s\n' "$deps_hash" > "$deps_stamp"
fi
exec npm run dev
+47 -11
View File
@@ -23,11 +23,13 @@
"bootstrap": "^5.3.8",
"chart.js": "^4.5.1",
"chartjs-chart-sankey": "^0.14.3",
"chartjs-plugin-zoom": "^2.2.0",
"cuelume": "^0.1.2",
"daisyui": "5.5.20",
"htmx.org": "^2.0.10",
"hyperscript.org": "^0.9.91",
"mathjs": "^15.2.0",
"postcss": "^8.5.15",
"postcss": "^8.5.26",
"pulltorefreshjs": "^0.1.22",
"sass": "^1.100.0",
"sweetalert2": "^11.26.25",
@@ -1076,6 +1078,12 @@
"integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
"license": "MIT"
},
"node_modules/@types/hammerjs": {
"version": "2.0.46",
"resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.46.tgz",
"integrity": "sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==",
"license": "MIT"
},
"node_modules/@vue/reactivity": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.1.5.tgz",
@@ -1253,6 +1261,19 @@
"chart.js": ">=3.3.0"
}
},
"node_modules/chartjs-plugin-zoom": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/chartjs-plugin-zoom/-/chartjs-plugin-zoom-2.2.0.tgz",
"integrity": "sha512-in6kcdiTlP6npIVLMd4zXZ08PDUXC52gZ4FAy5oyjk1zX3gKarXMAof7B9eFiisf9WOC3bh2saHg+J5WtLXZeA==",
"license": "MIT",
"dependencies": {
"@types/hammerjs": "^2.0.45",
"hammerjs": "^2.0.8"
},
"peerDependencies": {
"chart.js": ">=3.2.0"
}
},
"node_modules/chokidar": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
@@ -1287,6 +1308,12 @@
"url": "https://github.com/sponsors/rawify"
}
},
"node_modules/cuelume": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/cuelume/-/cuelume-0.1.2.tgz",
"integrity": "sha512-VxL0k9l1fyKGot3VKM+wm5Xd2K75fVeBHdNTrR1EHiqKRtD6S5Dxy/vY7hwl9gXp3QT/TIywFXUos77n39YZVQ==",
"license": "MIT"
},
"node_modules/daisyui": {
"version": "5.5.20",
"resolved": "https://registry.npmjs.org/daisyui/-/daisyui-5.5.20.tgz",
@@ -1401,6 +1428,15 @@
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
"license": "ISC"
},
"node_modules/hammerjs": {
"version": "2.0.8",
"resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz",
"integrity": "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==",
"license": "MIT",
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/htmx.org": {
"version": "2.0.10",
"resolved": "https://registry.npmjs.org/htmx.org/-/htmx.org-2.0.10.tgz",
@@ -1417,9 +1453,9 @@
}
},
"node_modules/immutable": {
"version": "5.1.6",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.6.tgz",
"integrity": "sha512-q1swsS8K7L8usSHuOqF2TAoCCkonYz0SG38wLAggaa4Wml70zixIvt2ql4coQ2C2B3hTjltJry4r6bULwgAXLQ==",
"version": "5.1.9",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz",
"integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==",
"license": "MIT"
},
"node_modules/is-extglob": {
@@ -1751,9 +1787,9 @@
}
},
"node_modules/nanoid": {
"version": "3.3.12",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz",
"integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==",
"version": "3.3.18",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz",
"integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==",
"funding": [
{
"type": "github",
@@ -1803,9 +1839,9 @@
}
},
"node_modules/postcss": {
"version": "8.5.15",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz",
"integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==",
"version": "8.5.26",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz",
"integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==",
"funding": [
{
"type": "opencollective",
@@ -1822,7 +1858,7 @@
],
"license": "MIT",
"dependencies": {
"nanoid": "^3.3.12",
"nanoid": "^3.3.17",
"picocolors": "^1.1.1",
"source-map-js": "^1.2.1"
},
+3 -1
View File
@@ -30,11 +30,13 @@
"bootstrap": "^5.3.8",
"chart.js": "^4.5.1",
"chartjs-chart-sankey": "^0.14.3",
"chartjs-plugin-zoom": "^2.2.0",
"cuelume": "^0.1.2",
"daisyui": "5.5.20",
"htmx.org": "^2.0.10",
"hyperscript.org": "^0.9.91",
"mathjs": "^15.2.0",
"postcss": "^8.5.15",
"postcss": "^8.5.26",
"pulltorefreshjs": "^0.1.22",
"sass": "^1.100.0",
"sweetalert2": "^11.26.25",
+2 -1
View File
@@ -1,5 +1,6 @@
import Chart from 'chart.js/auto';
import {SankeyController, Flow} from 'chartjs-chart-sankey';
import zoomPlugin from 'chartjs-plugin-zoom';
Chart.register(SankeyController, Flow);
Chart.register(SankeyController, Flow, zoomPlugin);
window.Chart = Chart;
-5
View File
@@ -14,11 +14,6 @@ Alpine.plugin(mask);
Alpine.plugin(collapse);
Alpine.start();
const successAudio = new Audio("/static/sounds/success.mp3");
const popAudio = new Audio("/static/sounds/pop.mp3");
window.paidSound = successAudio;
window.unpaidSound = popAudio;
/**
* Parse a localized number to a float.
* @param {string} stringNumber - the localized number
+4
View File
@@ -0,0 +1,4 @@
import { play } from "cuelume";
window.playSound = play;
+1
View File
@@ -3,6 +3,7 @@ import 'vite/modulepreload-polyfill';
import './js/bootstrap.js';
import './js/datepicker.js';
import './js/htmx.js';
import './js/sounds.js';
import './js/select.js';
import './js/charts.js';
import './js/autosize.js';
+2 -1
View File
@@ -6,7 +6,7 @@ readme = "README.md"
requires-python = ">=3.11"
dependencies = [
"crispy-bootstrap5==2026.3",
"django~=5.2.15",
"django~=5.2.16",
"django-allauth[socialaccount]~=65.18.0",
"django-browser-reload==1.21.0",
"django-cachalot~=2.9.0",
@@ -35,6 +35,7 @@ dependencies = [
"watchfiles==1.2.0",
"whitenoise[brotli]==6.12.0",
"xlrd~=2.0.1",
"yfinance~=1.5.1",
]
[tool.setuptools]
Generated
+533 -57
View File
@@ -1,6 +1,17 @@
version = 1
revision = 3
requires-python = ">=3.11"
resolution-markers = [
"python_full_version >= '3.14' and sys_platform == 'win32'",
"python_full_version >= '3.14' and sys_platform == 'emscripten'",
"python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'",
"python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'",
"python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'",
"python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'",
"python_full_version < '3.12' and sys_platform == 'win32'",
"python_full_version < '3.12' and sys_platform == 'emscripten'",
"python_full_version < '3.12' and sys_platform != 'emscripten' and sys_platform != 'win32'",
]
[[package]]
name = "annotated-types"
@@ -42,6 +53,19 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" },
]
[[package]]
name = "beautifulsoup4"
version = "4.15.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "soupsieve" },
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/43/65/318323f98dbee45d42dff61d8f047181bc6f2268a9068cfad035a46be5af/beautifulsoup4-4.15.0.tar.gz", hash = "sha256:288e3ca7d54b06f2ac191970bc275c1939cb46d450b255bf6718b04aa37ab4f7", size = 632571, upload-time = "2026-06-07T16:44:20.453Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/88/c6/92fcd42f1ba33e1184263f25bfabf3d27c383410470f169e4b8163bf9c17/beautifulsoup4-4.15.0-py3-none-any.whl", hash = "sha256:d6f88de62e1d4e38ecb1077eb9724cd0eff29d2a08ca16a401e9b9e93f117cf9", size = 109924, upload-time = "2026-06-07T16:44:21.566Z" },
]
[[package]]
name = "brotli"
version = "1.2.0"
@@ -285,61 +309,91 @@ wheels = [
[[package]]
name = "cryptography"
version = "48.0.1"
version = "50.0.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "cffi", marker = "platform_python_implementation != 'PyPy'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/12/45/870e7f4bef50e5f53b9f51d4428aee5290eedf58ba443f16b1ebb7ab8e66/cryptography-48.0.1.tar.gz", hash = "sha256:266f4ee051abb2f725b74ef8072b521ce1feacf685a3364fa6a6b45548db791a", size = 832989, upload-time = "2026-06-09T22:32:31.8Z" }
sdist = { url = "https://files.pythonhosted.org/packages/de/41/6cbdcf9142d00fe82836fbb51e503e58088575cf7a0fe1dbff6695bf0840/cryptography-50.0.0.tar.gz", hash = "sha256:eeac2acb5a20ed25e0ad6d1df9891a520b78b404266b6d11778f25d5d691a6c9", size = 880201, upload-time = "2026-07-31T14:25:10.11Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/1b/bc/ee4137cbbe105652c0ee4252792b78fc8e7afa4b8e61d9d5dc05a7f45731/cryptography-48.0.1-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:3e4a1a3232eef2e6c732827d5722db29a0cc8b27af2a4d865b094cf954be9ca1", size = 8008324, upload-time = "2026-06-09T22:31:00.702Z" },
{ url = "https://files.pythonhosted.org/packages/d5/85/6379d42181bfc713094f081360fc5784d6c816b599d45e7f082502d173ce/cryptography-48.0.1-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:32143b24adb918f078134e1e230f1eb8cc04886b92c28b5f0041aaf3e5699225", size = 4696243, upload-time = "2026-06-09T22:32:33.446Z" },
{ url = "https://files.pythonhosted.org/packages/9c/87/c85d147b53323c7eb4d850920c8901377323c2a0ff8d79c262d4fee89aa2/cryptography-48.0.1-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0d27a5696721ef7a672b8c810f6aded391058e0b9486e63e6d93baf765da691", size = 4713235, upload-time = "2026-06-09T22:31:40.141Z" },
{ url = "https://files.pythonhosted.org/packages/79/58/67cbf8cf1ee7c54b439ca07bbecf8362c07afc11a3724fea70f745784add/cryptography-48.0.1-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:eb86ce1af36fe65041b6db9a8bb064ee621a7e5fded0f80d475ec243477cd242", size = 4702323, upload-time = "2026-06-09T22:31:42.191Z" },
{ url = "https://files.pythonhosted.org/packages/89/c6/24266ac10c47f6cd2a865f4446062b466da1d1f10b27189eac00e61bf0c9/cryptography-48.0.1-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:b024e784ad6c077ee0147b35ea9cbfc1e34e1fd4c1dcca214c2794d73a12df08", size = 5300085, upload-time = "2026-06-09T22:31:58.703Z" },
{ url = "https://files.pythonhosted.org/packages/d2/bb/cc4b78784f97efc8c5874c2a9743708d172be6663024b34a0467885ae0c8/cryptography-48.0.1-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3752f2dbc8f07a30aad2932c986cea495b03bb554887828225da104f732852b6", size = 4746137, upload-time = "2026-06-09T22:31:31.01Z" },
{ url = "https://files.pythonhosted.org/packages/1f/52/0c44de3f5267f8fbe8e835138017522a333436166e406f0db9b9e6e3033f/cryptography-48.0.1-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:bd81490cd5801d755cf97bb68ac191f14b708470b1c7cf4580f669b9c9264cd8", size = 4333867, upload-time = "2026-06-09T22:32:28.096Z" },
{ url = "https://files.pythonhosted.org/packages/9a/2e/772d7adbfa931537bc401640b7cac9976bff689bda187833e5d63b428e49/cryptography-48.0.1-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:66fd0771e7b9c6dcd44cf1120690d2338d16d72795cf40cae2786a39eba65429", size = 4701805, upload-time = "2026-06-09T22:31:38.284Z" },
{ url = "https://files.pythonhosted.org/packages/f8/a3/b06844f303873493c963caf581c04df31c7035e0c1b0f02c4814d319ec80/cryptography-48.0.1-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:3fd2ca57062b241c856670b073487d2e86c4637937ca5601e48f97bf8e11fc8f", size = 5258461, upload-time = "2026-06-09T22:31:04.187Z" },
{ url = "https://files.pythonhosted.org/packages/9f/13/8b765e2e12b07c74941caadb9d1c8fdc006c4dfbf2b8f2d610519758954d/cryptography-48.0.1-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:0ee6ea481db1ab889cba043ec1eda17bb9c1ea79db6722f779c3667f9f70322f", size = 4745488, upload-time = "2026-06-09T22:32:30.07Z" },
{ url = "https://files.pythonhosted.org/packages/2e/aa/48972bce55049b32a94f4907eda4d75fa385aad8a39506cc2fc72196ecf0/cryptography-48.0.1-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f2ceef93cb096aa3c4cc4b5c94ca6131f9196d28c64d6111533402a9b2054d41", size = 4830256, upload-time = "2026-06-09T22:31:43.868Z" },
{ url = "https://files.pythonhosted.org/packages/47/a2/e5079a032fb85cf6005046ca92bbd78b0c82dad2b5751ab8c311659da06f/cryptography-48.0.1-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9bd3f92d76217892b15df84ca256c2c113d386fdda7a7d8691aeeced976507c6", size = 4979117, upload-time = "2026-06-09T22:31:05.845Z" },
{ url = "https://files.pythonhosted.org/packages/b7/a0/8f50cae9c74e718ed769d63ed5c74bd0ea830c9550a74629cebd1b9c7bc7/cryptography-48.0.1-cp311-abi3-win32.whl", hash = "sha256:b9a32b876490d66c8bcc9963ef220199569748434ab01a9d6aaeabf88e7f5158", size = 3304154, upload-time = "2026-06-09T22:32:16.845Z" },
{ url = "https://files.pythonhosted.org/packages/c5/69/0572c77dbace6fef72f33755bd52ea399c71367250d366237f8691826b9e/cryptography-48.0.1-cp311-abi3-win_amd64.whl", hash = "sha256:39489bfca54c7a1f6b297efcd8bc608ab92d16c4ca631b0cad4da46724588b24", size = 3817138, upload-time = "2026-06-09T22:32:00.388Z" },
{ url = "https://files.pythonhosted.org/packages/42/06/3e768b4c3bc78201583fa35a0e18f640dd782ff41afba88f8545481a8874/cryptography-48.0.1-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:f817adc181390bd54f2f700107a7419040fb7c1bdf2fc26f36551a06a68c3345", size = 7989830, upload-time = "2026-06-09T22:31:07.8Z" },
{ url = "https://files.pythonhosted.org/packages/8a/13/6476736484b94041110c8340a3eb63962fea4975baea8cb4a512adb44d4d/cryptography-48.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d5d30989c6917b478b5817902e85fddaea2261efa8648383d965381ccb9e1ac4", size = 4689201, upload-time = "2026-06-09T22:31:09.745Z" },
{ url = "https://files.pythonhosted.org/packages/79/62/65a87f34d2a431546e2509b85d55e8c90df86d668f6731da64d538512ac2/cryptography-48.0.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:df637c05205ea7c1d7fbcbe54bbfea648a52951155f997af13d895d0ecc96991", size = 4702822, upload-time = "2026-06-09T22:32:24.409Z" },
{ url = "https://files.pythonhosted.org/packages/7f/59/810b5204b0a9b10f4b6bc06bd551a8b609803cd931806bc3b71884b225e5/cryptography-48.0.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:869c3b8a53bfe27147832df48b32adadf558249d50e76cb3769d40e986b13265", size = 4694875, upload-time = "2026-06-09T22:32:08.737Z" },
{ url = "https://files.pythonhosted.org/packages/24/dc/d8ca05ffea724eec6d232ea6f18e74c269eb6bdfdcc9bfba689790d1325f/cryptography-48.0.1-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:e361afba8918070d376df76f408a4f67fec0ee9cff81a99e48fe9a233ef59e17", size = 5290385, upload-time = "2026-06-09T22:31:15.212Z" },
{ url = "https://files.pythonhosted.org/packages/03/8c/3be6cb4da181f5bb6c19cf560c2359d60644a6b5fc5b57854e528f47b296/cryptography-48.0.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:d069066deead00ac7f090be101be875a06855908f7ec004c27b8fefb4acfb411", size = 4737082, upload-time = "2026-06-09T22:32:22.66Z" },
{ url = "https://files.pythonhosted.org/packages/aa/f6/d5f60a5a1434dbfd949e227fd0065d194c7e6b6ac526b17f5c06152b8231/cryptography-48.0.1-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:09f73a725d582cef64b91281a322cd798d14a33b2b6f2b7ad9531dc336d84c02", size = 4325328, upload-time = "2026-06-09T22:32:10.777Z" },
{ url = "https://files.pythonhosted.org/packages/17/b7/ba75dd947a14b6ad907b01ae8f6b5b348cdd1b48142f0063dee9e20c1d9d/cryptography-48.0.1-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:15254441469dd6bf027039453288e2072124f8b6603563f5d759e1c9b69273fa", size = 4694530, upload-time = "2026-06-09T22:31:53.105Z" },
{ url = "https://files.pythonhosted.org/packages/62/29/50d6b9e8aff12d8b67afaeb3569335e32dc83a5723e3bbded24fdac9f809/cryptography-48.0.1-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:8ace4507d1e6533c125f4fac754f8bb8b6a74c08e92179dabd7e16571a3efbf3", size = 5245046, upload-time = "2026-06-09T22:31:25.774Z" },
{ url = "https://files.pythonhosted.org/packages/9f/04/618f4115cfc0add0838c82507aa18a346089428da8653ad38b3ff36f5cb3/cryptography-48.0.1-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:b4e391975f038e66432328639620a4aff2d307513b004f1ca06d6225bced815c", size = 4736660, upload-time = "2026-06-09T22:32:12.676Z" },
{ url = "https://files.pythonhosted.org/packages/24/9c/06e062462a0de28a3b3911322eded4c16deb9f441b1b7575d3dc59488ab5/cryptography-48.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42fcd8e26fe555d9b3577a135f5091fefa0aa4e99129c23fb56787a1bd4ada72", size = 4822229, upload-time = "2026-06-09T22:31:17.062Z" },
{ url = "https://files.pythonhosted.org/packages/f4/be/0561971eaaee4b8a0e7d5113c536921063ab91aaf23278ac374eaf881e11/cryptography-48.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c1400da5e32a43253392277eac7490a60e497d810a63dd5608d71bbd7af507c9", size = 4966364, upload-time = "2026-06-09T22:31:32.842Z" },
{ url = "https://files.pythonhosted.org/packages/a4/27/728c77876f12b000820b69ae490f3c4083775e79e07827e9e60be07ad209/cryptography-48.0.1-cp314-cp314t-win32.whl", hash = "sha256:0df56b056bc17c1b7d6821dfa65216e62bd232d8ab05eb3db44e71d235651471", size = 3278498, upload-time = "2026-06-09T22:31:29.154Z" },
{ url = "https://files.pythonhosted.org/packages/06/e3/79a612c6d7b1e6ee0edd43633d53035bec2cfb78c82b76f7864f39e36f34/cryptography-48.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:9de21387aa95e2a895823d0745b430bed4f33503ba9ab5e0b5311f33e37d66d2", size = 3798790, upload-time = "2026-06-09T22:31:56.697Z" },
{ url = "https://files.pythonhosted.org/packages/ca/6c/00fa2a95997164c8b2072ce327c23d4ab20809ccc323ea5fab91e53a4bba/cryptography-48.0.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:4fdc69f8e4316bcf0c8c8ec1f26f285d12e8142d88d96c876a59a03be3f6ae67", size = 7987408, upload-time = "2026-06-09T22:32:20.777Z" },
{ url = "https://files.pythonhosted.org/packages/b0/d9/45f309a7e4e5f3f8f121d6d3be9e94024a7726ec598d6e08ae04edb2f04d/cryptography-48.0.1-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48fe40804d4caa2288f24e70ca8c64c42dd826da0ad7e4f1b41b2128d679e6c8", size = 4690196, upload-time = "2026-06-09T22:31:54.74Z" },
{ url = "https://files.pythonhosted.org/packages/5f/9f/a1bc8bcc798811b8527eb374bbccf30a3f3e806829d967118222bf1125eb/cryptography-48.0.1-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:86be3b1b0b6bf09482fb50a979c508d2950ed95f5621ec77f4e385962006b83a", size = 4696782, upload-time = "2026-06-09T22:31:45.615Z" },
{ url = "https://files.pythonhosted.org/packages/66/c2/81a4fb4e4373c500bb526bc337ac5719dd31dd15b970b84a238168c6aa08/cryptography-48.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:4ab0a343c807bbcd90c971cd1ecf072937cd01847a9e002bef88fb47ac6be577", size = 4696618, upload-time = "2026-06-09T22:31:11.564Z" },
{ url = "https://files.pythonhosted.org/packages/e5/0b/aa68b221dde92d09cb29a024ede17550ee21e77a404e59fc093c82bb51e1/cryptography-48.0.1-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:9621de99d2da096006b629979efd8ae7eb2d8b822488d0c89ee4000c306c59b1", size = 5289970, upload-time = "2026-06-09T22:31:20.368Z" },
{ url = "https://files.pythonhosted.org/packages/78/13/fba657f958d2af66ea959a4ba01212632089249d34af1ae48054136344d7/cryptography-48.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:88c852a0ae366e262e5a1744b685e6a433dc8788dd2a277e418bf4904203609d", size = 4731873, upload-time = "2026-06-09T22:31:22.253Z" },
{ url = "https://files.pythonhosted.org/packages/4c/4c/9a964756d24a26b3e34dfcb16f961b89838786e6700b635b0d1e3adff4b6/cryptography-48.0.1-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:43c5835e2cb98c8733d86f57d6fc879b613f5c3478607281c3e36daffc6dd8a6", size = 4330804, upload-time = "2026-06-09T22:31:36.56Z" },
{ url = "https://files.pythonhosted.org/packages/4b/0f/a10f3a6eb12950a10e3a874070283aa2dd5875b2bfd15fad8a3e17b3f13e/cryptography-48.0.1-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:fe0180af5bf9236518a087e35bf2d9a347d5f5f51e63c579d683ddff424e3d46", size = 4696217, upload-time = "2026-06-09T22:31:13.351Z" },
{ url = "https://files.pythonhosted.org/packages/f3/6f/5cd12f951165ea73ef85266775d97e4c763b2474ccfd816dd69d3a18d6f8/cryptography-48.0.1-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:b7a2d1a937a738a881737cec135a38bb61470589b17515b9f73f571d0ae10401", size = 5245252, upload-time = "2026-06-09T22:32:02.193Z" },
{ url = "https://files.pythonhosted.org/packages/68/ab/8aaa12e4516ec4464033ab79b6f3b592bd5a92102467c4ace8a0d970203f/cryptography-48.0.1-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:b74ca3b8e5ecdd833bf6a002ca41b4793bb27fb8f1c06ffaf2643c9e9140e31b", size = 4731388, upload-time = "2026-06-09T22:32:04.019Z" },
{ url = "https://files.pythonhosted.org/packages/1b/24/50027ea4dca85ec1f40688f3c24fb32ccacd520583c9592c3cc95628e6fb/cryptography-48.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2c37f2461406063b417837f5f3daab668652acd82423efcd7f0a9f04be972de1", size = 4824186, upload-time = "2026-06-09T22:32:18.707Z" },
{ url = "https://files.pythonhosted.org/packages/52/41/04cb5eb17085ade6f50cc611fb657df6a0f5885350de8764ece89c050197/cryptography-48.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:86fe77abb1bd87afb251d4d02ada7ecf53a32cee9b67d976abb2e45a13297475", size = 4964539, upload-time = "2026-06-09T22:31:18.793Z" },
{ url = "https://files.pythonhosted.org/packages/36/bf/ed70785c496e89d7e73b7cda2d21f2447fd6d4e821714b8d04ff217fed92/cryptography-48.0.1-cp39-abi3-win32.whl", hash = "sha256:6b2c0c3e6ccf3ade7750f836ef3ee36eea250cc467d45c256895573ac08cc6f1", size = 3282307, upload-time = "2026-06-09T22:30:53.162Z" },
{ url = "https://files.pythonhosted.org/packages/b3/ff/371ea7d252656ee1eb6d83eeeef3d1d0c6baf1d6497687d081ea03814670/cryptography-48.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:9a49ca6c81417f6a5edb50375a60cccdd70fa0a91a5211829dbea74eba94d2ac", size = 3793408, upload-time = "2026-06-09T22:32:15.191Z" },
{ url = "https://files.pythonhosted.org/packages/a9/d3/eb4e394e587341fdad09a09101fa76478ead3a78b0ad63e55c22f0d75c02/cryptography-48.0.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:08a597acce1ff37f347400087776599e2348a3a8bc53b44120e463cd274efe4a", size = 3951747, upload-time = "2026-06-09T22:31:23.871Z" },
{ url = "https://files.pythonhosted.org/packages/e0/4a/3f43451b4f858bfceaaaffc649e6e787e8d4fb332a1d443af39ab02cc8f1/cryptography-48.0.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:735824ec41b7f74a7c45fb1591349333e4c696cb6c044e5f46356e560143e4cd", size = 4641226, upload-time = "2026-06-09T22:31:02.532Z" },
{ url = "https://files.pythonhosted.org/packages/73/4e/855584c2c23b09e4ce2d3b9c30e983e679cd60b068c513c6bbdb91e11782/cryptography-48.0.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:92a46e1d638daa264ba2971c0b0489c9409787943efae4d60ffda3d091ef832c", size = 4668958, upload-time = "2026-06-09T22:32:06.213Z" },
{ url = "https://files.pythonhosted.org/packages/42/3b/d35750e41d803d1e516fd6d6011f065424924da7af1748cef4cc9cb3ede1/cryptography-48.0.1-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:7e234ac052af99f2700826a5c29ea99d9c1b1f80341cde62d11c8154dc8e0bd9", size = 4640793, upload-time = "2026-06-09T22:32:26.331Z" },
{ url = "https://files.pythonhosted.org/packages/ca/aa/cdb7181fe865285e87e96825aaab239400f1de0c3bfba9bd9769b79f1a92/cryptography-48.0.1-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:33842cf0888951cef5bc7ac724ab844a42044c1727b967b7f8997289a0464f92", size = 4668505, upload-time = "2026-06-09T22:31:27.534Z" },
{ url = "https://files.pythonhosted.org/packages/5d/8c/ce3823c06c2804f194f9e64f0d67fa3f4094a39f2bb1a990cd03603af8fc/cryptography-48.0.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6184ca7b174f28d7c703f1290d4b297217c45355f77a98f67e9b7f14549ac54a", size = 3742204, upload-time = "2026-06-09T22:31:34.773Z" },
{ url = "https://files.pythonhosted.org/packages/c5/5c/59086b4aac5e879d38ddbcf74e4be7ade89cebc3eb199a55da998c3bb46a/cryptography-50.0.0-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:031e2d5dd4bb9caa3ca9c82e5a197fd8ae680232cee62603d1a813f3f07e3d03", size = 4001252, upload-time = "2026-07-31T14:23:33.331Z" },
{ url = "https://files.pythonhosted.org/packages/57/ef/8f2df13c7216bcad3e1c74e07f6e193d93e998e114f524a53877c9af27ad/cryptography-50.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fd9192b7b70c573d7f214eb1ae35e00d359f6f5e4b27c7e21e30de1fc6204645", size = 4719554, upload-time = "2026-07-31T14:23:35.611Z" },
{ url = "https://files.pythonhosted.org/packages/d9/41/029086c34d91052fc3b88bcc8056f709a7c915c7a23b235a54eb800b1c97/cryptography-50.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:06a32a980526a6ab9a4b9bf8f7385800791e2bb960903cb6b530e4817509a3b7", size = 4702130, upload-time = "2026-07-31T14:23:37.635Z" },
{ url = "https://files.pythonhosted.org/packages/7d/ff/b6ce0954962e7f7b969f850a883744197bb3910bdfd7b6da162eab7d9f68/cryptography-50.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:a1b30560f2acc95aa8b2e06e716a13dbfc97314747b80d9707e307f77b40d6b3", size = 4725244, upload-time = "2026-07-31T14:23:39.471Z" },
{ url = "https://files.pythonhosted.org/packages/06/1e/63a1027cb7fec360a182208e1b7767d5aa1fe57be3d6aa856e69a321edc0/cryptography-50.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:8d89f3976b10b4ce31118de72329025f70d2c6ead14a8217c5514dd2c6d5a78f", size = 5342265, upload-time = "2026-07-31T14:23:41.286Z" },
{ url = "https://files.pythonhosted.org/packages/6b/72/a1116d683a6d7ece94590013882515de087edf9ef0e6292aae615a44df73/cryptography-50.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b42a28c1844fd9de8f3f7d540e36b66f3a9c83fceac7170ebc7a6a19edd9dcae", size = 4734609, upload-time = "2026-07-31T14:23:43.139Z" },
{ url = "https://files.pythonhosted.org/packages/15/37/36a9c479bbe49acea2636c7fd3360d20f7b7e079c300352011c44850b181/cryptography-50.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:900131fafd8aead39ac7dd3a7e833be754c17a95cfd91221636949fe4eb0aa8a", size = 4356517, upload-time = "2026-07-31T14:23:44.939Z" },
{ url = "https://files.pythonhosted.org/packages/32/98/8a151d64367204cbc63ec65d37502f1d9c53cf4bfc6ec3c532614dbec60d/cryptography-50.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:07949c449a1abcf60d1ee6e88956d89404c7df3c8258f46589e912988e551987", size = 4724529, upload-time = "2026-07-31T14:23:46.93Z" },
{ url = "https://files.pythonhosted.org/packages/22/f6/ec13b470172126464a86bf54d2294a46d29837fc51ba3e45d4047946fb5e/cryptography-50.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:f89831ef99dd7dd169ab06d63a831adb9e20a87aac6d380266bbda5823349169", size = 5299852, upload-time = "2026-07-31T14:23:48.851Z" },
{ url = "https://files.pythonhosted.org/packages/da/3a/f05e32c99d440c9bb891ea0e36c9091891e36be5a9a87ab2ee6ea20729f6/cryptography-50.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:82148ec5bddac30b51a5b3c1945075f896fa022cb93f8e4a01e9f6ee95292c5f", size = 4734462, upload-time = "2026-07-31T14:23:50.861Z" },
{ url = "https://files.pythonhosted.org/packages/ca/dc/bd72b26be8953f80625f63151efd38eee71c76ca6cf591c08ff34615a79e/cryptography-50.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1489e263a8048bb8b6a8bac662eb2d402ea5d2b7b4699b72f385f1e2772db105", size = 4852708, upload-time = "2026-07-31T14:23:52.715Z" },
{ url = "https://files.pythonhosted.org/packages/27/20/c930314a2ab476d15dec966ec87e2e9637bb02b06106b12c0396c57bb603/cryptography-50.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7cec5b856506da6defb290f30c9ee687d5f5e8cb0bd3f6459dde43b0b4fa40ef", size = 5004179, upload-time = "2026-07-31T14:23:54.887Z" },
{ url = "https://files.pythonhosted.org/packages/32/2e/c9db68a0c4bfa28e310707527c0ee3a2bd254104d2e02e68f368e197aa4c/cryptography-50.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:bd1c592e4d5974f0d08d4888e432157adba757c66da0246918e43677fafa2d30", size = 3840395, upload-time = "2026-07-31T14:23:56.677Z" },
{ url = "https://files.pythonhosted.org/packages/c3/fb/951032a3bf22a5697c83183fb6294a4843772947a70e616c57b3ff5f522e/cryptography-50.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:49e7d93abdbd2990caced757e5fade25302f719c3c8fb6e6fff2dde98999fc41", size = 3989258, upload-time = "2026-07-31T14:23:58.881Z" },
{ url = "https://files.pythonhosted.org/packages/d4/67/91eb047e69c5e845f2f14b8a2e4a1aab0f283cb885531e9e22c8adb176bc/cryptography-50.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:19736989797678c6af1e55cd49055cdbcb55d8f6b5583ac5335f933aba9101dc", size = 4700648, upload-time = "2026-07-31T14:24:00.702Z" },
{ url = "https://files.pythonhosted.org/packages/30/82/85f0f7425c856b9f96459411eb12e74ef72df9caf6f8f15bf23a33ff131f/cryptography-50.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:80b63928fa35083b33966ce1efb70e5b9607181e49dcd1c22c8c005e319f667f", size = 4682442, upload-time = "2026-07-31T14:24:02.538Z" },
{ url = "https://files.pythonhosted.org/packages/1a/28/b555a365adff1cca2fbe7b9e487d68a40de6bc67ff2cb587473eb43de0e7/cryptography-50.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:d58c3db7cd6eed54e6c06744db55456b65ebd7492ddeae9c1e93cfca7aa857d3", size = 4707596, upload-time = "2026-07-31T14:24:04.394Z" },
{ url = "https://files.pythonhosted.org/packages/72/d8/f52538140cc719df62a01cf87d1c7142318d235817109d6f4054d7c352d6/cryptography-50.0.0-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:df2a58a472f332225671c35b0a830208b86d004f82baa8530fa3782c85646533", size = 5314552, upload-time = "2026-07-31T14:24:06.31Z" },
{ url = "https://files.pythonhosted.org/packages/38/14/6120e5bd7c5aa022ad15424ba4d5c5269d0d9448ed4d55e492ea91e3c1c4/cryptography-50.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:11b74db56cdbe3cdee6e3f6982ecb70334fa10dce99ed58bf7894aaaa3b2a037", size = 4717113, upload-time = "2026-07-31T14:24:08.349Z" },
{ url = "https://files.pythonhosted.org/packages/fa/71/190bf38c3ee2e0f8efc9860ae100c9df4169742eef274b91e7aa1cb133b9/cryptography-50.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:f59e38625469987d7ef6d495323c55e7db6c212eaf6112267e0d3b565a2e9c9f", size = 4338580, upload-time = "2026-07-31T14:24:10.227Z" },
{ url = "https://files.pythonhosted.org/packages/3a/63/504ccfbbe61fd8aa983f7f146399cdf034c72c2fc55f5b2dfdcdcdb20c99/cryptography-50.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:ecfed7367f965a0328cfbdd70da860f15441f002f613185668c6e6ebf5a0ac11", size = 4707038, upload-time = "2026-07-31T14:24:12.169Z" },
{ url = "https://files.pythonhosted.org/packages/01/77/2cf79bbfc4d12ca106437a6e170d6aaa01a373e93093118aaaef0e801bd4/cryptography-50.0.0-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:9aa87839c383bdbab6ef865787a1fb877af8dd03464c4400322726feaaadfc6d", size = 5273110, upload-time = "2026-07-31T14:24:14.38Z" },
{ url = "https://files.pythonhosted.org/packages/e5/45/8aae2972c520145377ea3559a605a899bebe227bf070b33cdb445929a9b9/cryptography-50.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:6ba6a53445bd3cfa809ef3ef5f1589aa6ba08784a1d962bf47d0940e871dab1c", size = 4716439, upload-time = "2026-07-31T14:24:16.415Z" },
{ url = "https://files.pythonhosted.org/packages/7b/20/4fe50b619a48c2525cc46e2dbc1ac490708d704be5d467bdaac6dc955682/cryptography-50.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3f5735ffe4996d28b809371756219f5354864902a3b9e7c0b9ee87041209fc9c", size = 4837383, upload-time = "2026-07-31T14:24:18.553Z" },
{ url = "https://files.pythonhosted.org/packages/92/91/3a31366e183343d3703f8995c095f5734676bd6938118047e50fcf279eb4/cryptography-50.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:1b4a266766514614f8aa60416e71f2fc6e575d36e7bdc90f644fadb2f4b75b95", size = 4985772, upload-time = "2026-07-31T14:24:20.385Z" },
{ url = "https://files.pythonhosted.org/packages/74/9a/02ffe35b2853d121689871eb5dce862092562b3a1ed5cc98f1aaed441506/cryptography-50.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:12b9c6996425c76ea6c457ace4f3073e715b8c545add07cd1a8f3a4f90691269", size = 3816291, upload-time = "2026-07-31T14:24:22.125Z" },
{ url = "https://files.pythonhosted.org/packages/03/37/73d005be173aff344af30e9fd2a576575cb2391a7101d9cd3842e1fa8cce/cryptography-50.0.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ccdc4a71a4dabae05de219404f9f4abc38e3b58422177ff93d0da05967dafa07", size = 4036009, upload-time = "2026-07-31T14:24:24.122Z" },
{ url = "https://files.pythonhosted.org/packages/ff/c6/7a6202a534e32103a285b7834a120869557fe198d51d7cfe59754c8bda9c/cryptography-50.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:910e1d2668e7de9648f2bcee30e180db2a6b15c30f887d7c4c93ddf96e3992e3", size = 4745252, upload-time = "2026-07-31T14:24:26.118Z" },
{ url = "https://files.pythonhosted.org/packages/85/4f/0fa8c2f4428198f15d9ff8d63400e27afbf94ce833f6108da1eb3753f945/cryptography-50.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a91296cb61e8df6f86d0c19cc4068228da256bf59bf86049fbd821084565327f", size = 4728939, upload-time = "2026-07-31T14:24:27.994Z" },
{ url = "https://files.pythonhosted.org/packages/d1/63/54dd723490ba2dc09b299682c10b38db38f159728bcaae8c591b8af2f22d/cryptography-50.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e722f16708d854fe924790e051061f6704a472c3bac347b6fd88033ea8dd0dc5", size = 4748483, upload-time = "2026-07-31T14:24:30.254Z" },
{ url = "https://files.pythonhosted.org/packages/1d/dd/7c77d26285cc7f6991efce64a0f5b4f9383bfa5dd8c5033003eaf7db4cdb/cryptography-50.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:d764dcf130c428ef66786f866dd750f53182bc608813489915e9fc106bb0c82f", size = 5367599, upload-time = "2026-07-31T14:24:32.457Z" },
{ url = "https://files.pythonhosted.org/packages/46/c9/f60aed34c013f317f92817b6c171c2d22a78270fa41109bd4b08af26b194/cryptography-50.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:105110f43a471dbd0060b9c9516cb8a6a79233631a04cc2ba16f28323ac6e025", size = 4762647, upload-time = "2026-07-31T14:24:34.599Z" },
{ url = "https://files.pythonhosted.org/packages/be/f3/f9a0173b139372c3a48ed98154b45cc6b9de17c789d5ab552e621c293609/cryptography-50.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:828743d939e9629bc267b8e2d08d8bb67cd4319c771a33d4b18b22dd8fb7440a", size = 4385197, upload-time = "2026-07-31T14:24:36.647Z" },
{ url = "https://files.pythonhosted.org/packages/d8/36/83bb81f6e569bc38e1e4a7bc80f29b46bb9601920bc455fc8e888f5d5742/cryptography-50.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:2a8183b489dc1f7f80f135780fadc1108f14b31b8a40411c7a5b17425f65f28b", size = 4748095, upload-time = "2026-07-31T14:24:39.493Z" },
{ url = "https://files.pythonhosted.org/packages/6b/16/d3008eff98c764979865834c3d386d4fd041b5f52e7f34fc29ac1a5eb515/cryptography-50.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:6e7d61120573a7f2cd94cc095f9e81f6967c61ccdf194285aa143ecec8e0b708", size = 5325948, upload-time = "2026-07-31T14:24:41.556Z" },
{ url = "https://files.pythonhosted.org/packages/9c/f8/d97f9603efda3888187bfdb893f26c41be4735c10631d05d284ee6b047c4/cryptography-50.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:37fdb0d0111f1e2ff07139dfb79f1b49531f8e213c46f1163dd7642979b58c47", size = 4762400, upload-time = "2026-07-31T14:24:43.636Z" },
{ url = "https://files.pythonhosted.org/packages/64/a2/4615c8f7d81a00b1d6e6afe19f694e1543582349fb5f4076f6cb5dc36485/cryptography-50.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c87f62a3d3b9888ed0fdde100ec06aa61ca9cd44bad9057d1dff9a516b5f5bb9", size = 4878208, upload-time = "2026-07-31T14:24:45.522Z" },
{ url = "https://files.pythonhosted.org/packages/d2/1a/efcfb02f91407149a0dacffffab791f7e19bf6385f63b3666dc8b5e5c9c8/cryptography-50.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:65c2c3add92b45fd0709db8594536aea39c2a67af0e27ffcf049c498501140b7", size = 5037050, upload-time = "2026-07-31T14:24:47.697Z" },
{ url = "https://files.pythonhosted.org/packages/57/30/4a22984d4f1bdfb8c054f07a92bc176b97a3134cc1d6c4b3bffb1f3688b4/cryptography-50.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:d24fead1d4d076e1bfb006dcec392074a3cd8d7b4fc8a595aa64073b2b7a96ba", size = 3874135, upload-time = "2026-07-31T14:24:50.085Z" },
{ url = "https://files.pythonhosted.org/packages/9d/3e/e54cde8c01631a5a8226ccd617eab9e57fd5cfdad90f1a9e6bb570794631/cryptography-50.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:5e34edd123674534acd70147f0ca331eaa2c74e6325fb2028c886aa26ba0b68c", size = 3963170, upload-time = "2026-07-31T14:24:51.968Z" },
{ url = "https://files.pythonhosted.org/packages/01/b6/0b9e125e90f3d2dcf599a218a899cda7326a3158cfa258723f0b398b08f6/cryptography-50.0.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:8eb5e1172eb569ea8a872796576e6a67c276351728b6455d5beb01242b027c6a", size = 4692441, upload-time = "2026-07-31T14:24:53.743Z" },
{ url = "https://files.pythonhosted.org/packages/53/c9/a5151588710785a96d7bc4de27d4cd62f263bbbcb203cfe29df537eb6505/cryptography-50.0.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:910d11e1a385c654bf738bf3e6b8e6ed5de0f5610fcae2be9e5b398d8081d20e", size = 4699810, upload-time = "2026-07-31T14:24:55.746Z" },
{ url = "https://files.pythonhosted.org/packages/c7/1a/15b92b25eb6ce3089cd49377ae990a0f3ad485a510f968aed1f19dbdcdf2/cryptography-50.0.0-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:62598a8a57f815db4c6259a4e97d857dab56697e7de8e8ab02352ab74da1995d", size = 4691924, upload-time = "2026-07-31T14:24:58.082Z" },
{ url = "https://files.pythonhosted.org/packages/62/15/219075012ab13e8905f3cd572204f4acb4b111df787104346b9bc0cea789/cryptography-50.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:07479a1cb08219ab719147e742e76090c9c773321959bb94946fffdd397a6437", size = 4699593, upload-time = "2026-07-31T14:24:59.951Z" },
{ url = "https://files.pythonhosted.org/packages/8e/b5/c2c5fce26f0ee40d21bafe7f191d29a34b35a65ac4fe8a1191d1983612e9/cryptography-50.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c99c003e088647b8a5b7c145d6f78c335f6348332b62e142d411c4b63d1460b9", size = 3813796, upload-time = "2026-07-31T14:25:02.298Z" },
]
[[package]]
name = "curl-cffi"
version = "0.15.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "certifi" },
{ name = "cffi" },
{ name = "rich" },
]
sdist = { url = "https://files.pythonhosted.org/packages/48/5b/89fcfebd3e5e85134147ac99e9f2b2271165fd4d71984fc65da5f17819b7/curl_cffi-0.15.0.tar.gz", hash = "sha256:ea0c67652bf6893d34ee0f82c944f37e488f6147e9421bef1771cc6545b02ded", size = 196437, upload-time = "2026-04-03T11:12:31.525Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/5e/42/54ddd442c795f30ce5dd4e49f87ce77505958d3777cd96a91567a3975d2a/curl_cffi-0.15.0-cp310-abi3-macosx_10_9_x86_64.whl", hash = "sha256:bda66404010e9ed743b1b83c20c86f24fe21a9a6873e17479d6e67e29d8ded28", size = 2795267, upload-time = "2026-04-03T11:11:46.48Z" },
{ url = "https://files.pythonhosted.org/packages/83/2d/3915e238579b3c5a92cead5c79130c3b8d20caaba7616cc4d894650e1d6b/curl_cffi-0.15.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:a25620d9bf989c9c029a7d1642999c4c265abb0bad811deb2f77b0b5b2b12e5b", size = 2573544, upload-time = "2026-04-03T11:11:47.951Z" },
{ url = "https://files.pythonhosted.org/packages/2a/b3/9d2f1057749a1b07ba1989db3c1503ce8bed998310bae9aea2c43aa64f20/curl_cffi-0.15.0-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:582e570aa2586b96ed47cf4a17586b9a3c462cbe43f780487c3dc245c6ef1527", size = 10515369, upload-time = "2026-04-03T11:11:50.126Z" },
{ url = "https://files.pythonhosted.org/packages/b5/1d/6d10dded5ce3fd8157e558ebd97d09e551b77a62cdc1c31e93d0a633cee5/curl_cffi-0.15.0-cp310-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:838e48212447d9c81364b04707a5c861daf08f8320f9ecb3406a8919d1d5c3b3", size = 10160045, upload-time = "2026-04-03T11:11:52.664Z" },
{ url = "https://files.pythonhosted.org/packages/5c/12/c70b835487ace3b9ba1502631912e3440082b8ae3a162f60b59cb0b6444d/curl_cffi-0.15.0-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2b6c847d86283b07ae69bb72c82eb8a59242277142aa35b89850f89e792a02fc", size = 11090433, upload-time = "2026-04-03T11:11:55.049Z" },
{ url = "https://files.pythonhosted.org/packages/ea/0d/78edcc4f71934225db99df68197a107386d59080742fc7bf6bb4d007924f/curl_cffi-0.15.0-cp310-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9e5e69eee735f659287e2c84444319d68a1fa68dd37abf228943a4074864283a", size = 10479178, upload-time = "2026-04-03T11:11:57.685Z" },
{ url = "https://files.pythonhosted.org/packages/5b/84/1e101c1acb1ea2f0b4992f5c3024f596d8e21db0d53540b9d583f673c4e7/curl_cffi-0.15.0-cp310-abi3-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:aa1323950224db24f4c510d010b3affa02196ca853fb424191fa917a513d3f4b", size = 10317051, upload-time = "2026-04-03T11:12:00.295Z" },
{ url = "https://files.pythonhosted.org/packages/28/42/8ef236b22a6c23d096c85a1dc507efe37bfdfc7a2f8a4b34efb590197369/curl_cffi-0.15.0-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:41f80170ba844009273b2660da1964ec31e99e5719d16b3422ada87177e32e13", size = 11299660, upload-time = "2026-04-03T11:12:02.791Z" },
{ url = "https://files.pythonhosted.org/packages/1d/01/56aeb055d962da87a1be0d74c6c644e251c7e88129b5471dc44ac724e678/curl_cffi-0.15.0-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1977e1e12cfb5c11352cbb74acef1bed24eb7d226dab61ca57c168c21acd4d61", size = 11945049, upload-time = "2026-04-03T11:12:05.912Z" },
{ url = "https://files.pythonhosted.org/packages/d8/8c/2abf99a38d6340d66cf0557e0c750ef3f8883dfc5d450087e01c85861343/curl_cffi-0.15.0-cp310-abi3-win_amd64.whl", hash = "sha256:5a0c1896a0d5a5ac1eb89cd24b008d2b718dd1df6fd2f75451b59ca66e49e572", size = 1661649, upload-time = "2026-04-03T11:12:07.948Z" },
{ url = "https://files.pythonhosted.org/packages/3d/39/dfd54f2240d3a9b96d77bacc62b97813b35e2aa8ecf5cd5013c683f1ba96/curl_cffi-0.15.0-cp310-abi3-win_arm64.whl", hash = "sha256:a6d57f8389273a3a1f94370473c74897467bcc36af0a17336989780c507fa43d", size = 1410741, upload-time = "2026-04-03T11:12:10.073Z" },
{ url = "https://files.pythonhosted.org/packages/19/6a/c24df8a4fc22fa84070dcd94abeba43c15e08cc09e35869565c0bad196fd/curl_cffi-0.15.0-cp313-abi3-android_24_arm64_v8a.whl", hash = "sha256:4682dc38d4336e0eb0b185374db90a760efde63cbea994b4e63f3521d44c4c92", size = 7190427, upload-time = "2026-04-03T11:12:12.142Z" },
{ url = "https://files.pythonhosted.org/packages/11/56/132225cb3491d07cc6adcce5fe395e059bde87c68cff1ef87a31c88c7819/curl_cffi-0.15.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:967ad7355bd8e9586f8c2d02eaa99953747549e7ea4a9b25cd53353e6b67fe6d", size = 2795723, upload-time = "2026-04-03T11:12:13.668Z" },
{ url = "https://files.pythonhosted.org/packages/07/8f/f4f83cd303bef7e8f1749512e5dd157e7e5d08b0a36c8211f9640a2757bf/curl_cffi-0.15.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7e63539d0d839d0a8c5eacf86229bc68c57803547f35e0db7ee0986328b478c3", size = 2573739, upload-time = "2026-04-03T11:12:15.08Z" },
{ url = "https://files.pythonhosted.org/packages/e8/5c/643d65c7fc9acd742876aa55c2d7823c438cb7665810acd2e66c9976c4d9/curl_cffi-0.15.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:08c799b89740b9bc49c09fbc3d5907f13ac1f845ca52620507ef9466d4639dd5", size = 10521046, upload-time = "2026-04-03T11:12:17.034Z" },
{ url = "https://files.pythonhosted.org/packages/7f/0b/9b8037113c93f4c5323096163471fa7c35c7676c3f608eeaf1287cd99d58/curl_cffi-0.15.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7b7a92767a888ee90147e18964b396d8435ff42737030d6fb00824ffd6094805", size = 11096115, upload-time = "2026-04-03T11:12:19.694Z" },
{ url = "https://files.pythonhosted.org/packages/5f/96/fff2fcbd924ef4042e0d67379f751a8a4e3186a91e75e35a4cf218b306ee/curl_cffi-0.15.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:829cc357061ecb99cc2d406301f609a039e05665322f5c025ec67c38b0dc49ce", size = 11305346, upload-time = "2026-04-03T11:12:22.151Z" },
{ url = "https://files.pythonhosted.org/packages/53/1b/304b253a45ab28691c8c5e8cca1e6cbb9cf8e46dfceae4648dd536f75e73/curl_cffi-0.15.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:408d6f14e346841cd889c2e0962832bb235ba3b6749ebf609f347f747da5e60f", size = 11949834, upload-time = "2026-04-03T11:12:24.986Z" },
{ url = "https://files.pythonhosted.org/packages/5a/ff/4723d92f08259c707a974aba27a08d0a822b9555e35ca581bf18d055a364/curl_cffi-0.15.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b624c7ce087bfda967a013ed0a64702a525444e5b6e97d23534d567ccc6525aa", size = 1702771, upload-time = "2026-04-03T11:12:28.201Z" },
{ url = "https://files.pythonhosted.org/packages/59/8c/36bbe06d66fa2b765e4a07199f643a59a9cd1a754207a96335402a9520f4/curl_cffi-0.15.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0b6c0543b993996670e9e4b78e305a2d60809d5681903ffb5568e21a387434d3", size = 1466312, upload-time = "2026-04-03T11:12:30.054Z" },
]
[[package]]
@@ -353,16 +407,16 @@ wheels = [
[[package]]
name = "django"
version = "5.2.15"
version = "5.2.16"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "asgiref" },
{ name = "sqlparse" },
{ name = "tzdata", marker = "sys_platform == 'win32'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/2b/e3/31722f7284c9f43333daff9aee9184678e4487adcb5506af0db8cea09ce1/django-5.2.15.tar.gz", hash = "sha256:5154a9bf84ac01dde011e367f355c07dbb329532e06810dcf3ef2af269e236e7", size = 10873669, upload-time = "2026-06-03T13:03:35.892Z" }
sdist = { url = "https://files.pythonhosted.org/packages/a9/26/889449d521ae508b26de715954faecd8bcf3f740affb81b2d146a83b42a5/django-5.2.16.tar.gz", hash = "sha256:59ea02020c3136fce14bef0bbece21a10a4febef5eed1c51c22ae468efa22200", size = 10890894, upload-time = "2026-07-07T13:52:17.005Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/92/b5/38140b1643c00d5c46ce69c78e6980fd285aee223100319631bedee4f5e7/django-5.2.15-py3-none-any.whl", hash = "sha256:0eb4a9bb1853a35b0286dbc6d916bd352c8c2687195a7f2d6f80cefd840e4970", size = 8311957, upload-time = "2026-06-03T13:03:31.329Z" },
{ url = "https://files.pythonhosted.org/packages/4e/13/1e5e3e4c15dcecb04281b3cb2a46a4670e1cef131068e202f6040df19224/django-5.2.16-py3-none-any.whl", hash = "sha256:04f354bf9d807a86ad1a8392fe3808d362358a8eafc322848e0e43e59b24371d", size = 8311943, upload-time = "2026-07-07T13:52:11.223Z" },
]
[[package]]
@@ -632,6 +686,27 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/72/24/fb7da4d6613de7001feaf540d4b5969c6b5a1c42839043b0196cb13aa057/jwcrypto-1.5.7-py3-none-any.whl", hash = "sha256:729463fefe28b6de5cf1ebfda3e94f1a1b41d2799148ef98a01cb9678ebe2bb0", size = 94799, upload-time = "2026-04-07T00:35:35.085Z" },
]
[[package]]
name = "markdown-it-py"
version = "4.2.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "mdurl" },
]
sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" },
]
[[package]]
name = "mdurl"
version = "0.1.2"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" },
]
[[package]]
name = "mistune"
version = "3.3.0"
@@ -641,6 +716,158 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/b7/76/b90f9d48d43fbd80a79a20d3eab2e5109859c7a56dc663b23187385898f3/mistune-3.3.0-py3-none-any.whl", hash = "sha256:a758e578acda49d8195f9a860b132dae2cf7bf409381393b1c4e6e489a65397b", size = 61250, upload-time = "2026-06-21T13:11:37.938Z" },
]
[[package]]
name = "multitasking"
version = "0.0.13"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/be/c3/ac2cc9307fb15cc28ed6d4a9266b216c83ee7fe64299f0264047982bce88/multitasking-0.0.13.tar.gz", hash = "sha256:d896b5df877c9ca5eeddbf0e5994124694d6cb535aba698fb23344c7025155a1", size = 20585, upload-time = "2026-04-23T12:14:15.049Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/d3/1c/24dbf69b247f287401c904a396233a43c89fd4fb9b7cd2e50e430e9cd57c/multitasking-0.0.13-py3-none-any.whl", hash = "sha256:ec9243af140c67bfe52dc98d7173c294512735a88e8425c458b250db99dc2b48", size = 16380, upload-time = "2026-04-23T12:14:13.776Z" },
]
[[package]]
name = "numpy"
version = "2.4.6"
source = { registry = "https://pypi.org/simple" }
resolution-markers = [
"python_full_version < '3.12' and sys_platform == 'win32'",
"python_full_version < '3.12' and sys_platform == 'emscripten'",
"python_full_version < '3.12' and sys_platform != 'emscripten' and sys_platform != 'win32'",
]
sdist = { url = "https://files.pythonhosted.org/packages/d0/ad/fed0499ce6a338d2a03ebae59cd15093910c8875328855781952abf6c2fe/numpy-2.4.6.tar.gz", hash = "sha256:f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda", size = 20735807, upload-time = "2026-05-18T23:37:14.07Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/b3/49/ec46835a70be8fa6446c495126ac84fdb28cb2558e1620ffb87a10c8b64c/numpy-2.4.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0280e0356c0829a18d9de1cb7eee50ec22ca639878d7240307ca0943d73cd2c4", size = 16969194, upload-time = "2026-05-18T23:33:13.503Z" },
{ url = "https://files.pythonhosted.org/packages/0e/0d/f5957185c0ee2f3e12f78715aa9e3b353fd83633316c8532b38faa37e3f6/numpy-2.4.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:110f8b71aacb688ec69062bb7f6938a0f8acb01b7c1c4beb453c65b6d234584d", size = 14964111, upload-time = "2026-05-18T23:33:17.795Z" },
{ url = "https://files.pythonhosted.org/packages/ad/40/40a40ee0ddf7ceb782c49af278894b686e586d65d8c1889c8b5da01a3d7d/numpy-2.4.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:4cfe66903cc32a9921a6733d96b19bb6abf310397581bbad89c228f5abaf0ee8", size = 5469159, upload-time = "2026-05-18T23:33:20.654Z" },
{ url = "https://files.pythonhosted.org/packages/63/13/f9a8046535cb21deae82f8d03de9617e08882d274fad2539630761888228/numpy-2.4.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8155154c7c691289fe18f510b5d4657c68c67989f293f0535a91360392ff6538", size = 6798936, upload-time = "2026-05-18T23:33:22.987Z" },
{ url = "https://files.pythonhosted.org/packages/33/a8/6fa8c1a345a8c85dbb21932c447bee07c30a2c2a3f31e369c0a84b300147/numpy-2.4.6-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ab0a9c4ffb1a6d95ef519fe4247dba8eb6b18ad93999f76b7f657039acabd47", size = 15966692, upload-time = "2026-05-18T23:33:26.62Z" },
{ url = "https://files.pythonhosted.org/packages/02/03/74fe2a4cb3817d94d86402f2506554130a2f01414e299b5a843e5a8a957f/numpy-2.4.6-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89cd468399cfd2504718f0ba50e410dca55a170b61a02ad92bb18c8a65186e93", size = 16918164, upload-time = "2026-05-18T23:33:29.955Z" },
{ url = "https://files.pythonhosted.org/packages/c5/80/3615be3313f7e7696609bc194b9f0101da809df79e859bdb84e0cd043f46/numpy-2.4.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2d37ab77531417474168eb79d6d80b14f821a966818505d03013d0833edb7a8", size = 17322877, upload-time = "2026-05-18T23:33:34.724Z" },
{ url = "https://files.pythonhosted.org/packages/ca/ac/a691e0fe2675e370d0e08ff905adc49a1c8830e8cae03efe4477e92cd55d/numpy-2.4.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f407cb6b8e9d6d8c626bc73c945db1706035af8fd632295547bf1c9e46d092d6", size = 18651487, upload-time = "2026-05-18T23:33:38.217Z" },
{ url = "https://files.pythonhosted.org/packages/15/a7/9bc1cd626d7bf6869bfedf27b91b6ab5dd607758bf8e959d6fa80c6a59cb/numpy-2.4.6-cp311-cp311-win32.whl", hash = "sha256:ddea102b48f9e339f3948bf22040944184627a30fdf7f858667673b9c5f033c8", size = 6233945, upload-time = "2026-05-18T23:33:41.331Z" },
{ url = "https://files.pythonhosted.org/packages/c5/31/7fc6239c12bce7e931463251cca4426c465e1876ba3cc785402ef4dd8f4e/numpy-2.4.6-cp311-cp311-win_amd64.whl", hash = "sha256:1e254a00cdf42b1e4d5b3d68d33af63268d41340d8885df2ab6470f2e1500147", size = 12608406, upload-time = "2026-05-18T23:33:44.131Z" },
{ url = "https://files.pythonhosted.org/packages/27/83/140f85a466595a16382996a1bf06b2b54bcd597488921b0c9daaeeda72af/numpy-2.4.6-cp311-cp311-win_arm64.whl", hash = "sha256:ed9749eef4cbd126da3dc1d6bcb3a57f5eb7ac6a6484146bdbf743f552dfc577", size = 10479528, upload-time = "2026-05-18T23:33:50.725Z" },
{ url = "https://files.pythonhosted.org/packages/95/2a/3d7b5ac8aac24feaf9ad7ed58f45b0bbc06d37e4338ae84c9f2298b570f9/numpy-2.4.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:001fbb8e08d942dd57599e781f2472269ee7f2755fae407b4f67b2f0b17da3f1", size = 16689119, upload-time = "2026-05-18T23:33:54.065Z" },
{ url = "https://files.pythonhosted.org/packages/ea/12/92c4c131527599e8288d6918e888d88726f84d805d784b771f32408aeaef/numpy-2.4.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ebfb099f8dcf083deef3ac1ca4c1503f387cf76296fcb3816b66f5ecb5f54fdb", size = 14699246, upload-time = "2026-05-18T23:33:57.621Z" },
{ url = "https://files.pythonhosted.org/packages/ad/fe/c0a6b7b2ca128a8fb228575147073b660656734b8ebe4d76c8fd748dcc79/numpy-2.4.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3213d622a0283a39a93d188f3cf72b26862df52fbb4ca3697f51705016523d41", size = 5204410, upload-time = "2026-05-18T23:34:00.302Z" },
{ url = "https://files.pythonhosted.org/packages/f3/d4/9770d14ba719432bb90a421bfd443872ed0f70f7264b64bec12ea363d5fd/numpy-2.4.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:357cc07a6d7b0b182ff02249616a03742827ebb1277546b5c7cd7f7620a45698", size = 6551240, upload-time = "2026-05-18T23:34:02.852Z" },
{ url = "https://files.pythonhosted.org/packages/c9/c6/50a46a6205feba2343f1d6d17438107c5dc491ed1c736e6ea68689fd906b/numpy-2.4.6-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f9fb9157b4ce2971008323afe46053787b526ef624fea915b261468a8421a0f", size = 15671012, upload-time = "2026-05-18T23:34:05.485Z" },
{ url = "https://files.pythonhosted.org/packages/99/60/14115e6364fa676c5397c2ad3004e527e9aa487abf5d0706ec81bbd08529/numpy-2.4.6-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90f9849678c75fe7afa2d348ac842c168b0a4d3d61919687216dfc547976d853", size = 16645538, upload-time = "2026-05-18T23:34:09.265Z" },
{ url = "https://files.pythonhosted.org/packages/ae/c5/693cbe59e57db94d2231fa519ca3978dc9e19da5a8f088588f5c6e947ff2/numpy-2.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c1a2af6c6ef86344a6b0db6b97834208bf598db514f2b155042439b62605601a", size = 17020706, upload-time = "2026-05-18T23:34:13.053Z" },
{ url = "https://files.pythonhosted.org/packages/ef/fc/85b7c4eff9b4966ade25c2273cf7e7012e92366c032058653934b37de044/numpy-2.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e5805d5a22fd19c8ccff10a9561f9df94436b0545619ea579db2d3c35294bce2", size = 18368541, upload-time = "2026-05-18T23:34:17.024Z" },
{ url = "https://files.pythonhosted.org/packages/f6/81/e1b27545deedce7f4a0b348618c6b62d74e36a4dc9ccd42f3eb2f85eee32/numpy-2.4.6-cp312-cp312-win32.whl", hash = "sha256:e3eeb0aabd6bd5ce64faae67e9935203a6991b4bc2a485a767fbafb2c5125f45", size = 5962825, upload-time = "2026-05-18T23:34:20.3Z" },
{ url = "https://files.pythonhosted.org/packages/ab/ca/feab00bd44aa5fe1ad2c18f08b4d3bb92e26484b0b1d1443897809ed528c/numpy-2.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:d8e8286dd7cea7895157318d1b91cdacac64c479f3cbc8dce548331728484751", size = 12321687, upload-time = "2026-05-18T23:34:23.095Z" },
{ url = "https://files.pythonhosted.org/packages/63/cf/5a6d34850a39d1093558564f77ee8e8e0bee5061151b8f05a55711001ec7/numpy-2.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:4081eb135ac24158bd51cdfbef16f1c64df7063b1143f24731387137c092bec8", size = 10221482, upload-time = "2026-05-18T23:34:25.876Z" },
{ url = "https://files.pythonhosted.org/packages/fb/82/bdab26d7438c6791ca31b7c024ca37c1eab8b726ba236129005cd4a06e45/numpy-2.4.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:511dbaf848decaaaf4b4ca48032619fb3138710c4bf7da7617765edad1ef96b0", size = 16684648, upload-time = "2026-05-18T23:34:29.41Z" },
{ url = "https://files.pythonhosted.org/packages/1b/30/a80189bcc7f5e4258b3fbc3968d909d1756f54d023299ecc39ad6fdb9ef8/numpy-2.4.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bf162abab1c1a736333192707cef898e735a5ca00f38f27eeedf44b39d9e85eb", size = 14693902, upload-time = "2026-05-18T23:34:33.013Z" },
{ url = "https://files.pythonhosted.org/packages/97/12/70b5d0d7c15e1ebb8a6a84a8caa1d19e181d84fb58bb6d70aca29099dec1/numpy-2.4.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:043191bfa8eab18c776647b62723ac9dddece59743b13f49b2016094129c2b3f", size = 5198992, upload-time = "2026-05-18T23:34:36.132Z" },
{ url = "https://files.pythonhosted.org/packages/ba/8c/ebd2a8f8a83541f8d38cc5667e8c2b69cecfd30da6e45693e8158857d44b/numpy-2.4.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:6180d8b35af935aed8ece3a85e0a43f87393ae0ac87c8d2c8bd2c993f7270ef3", size = 6546944, upload-time = "2026-05-18T23:34:38.484Z" },
{ url = "https://files.pythonhosted.org/packages/bb/c5/7b863a97a91671a0338f4253bd3b5a3d3852f0692dae91711c9f4a10e787/numpy-2.4.6-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72fbe16c6fac95aedf5937fa873445cec2110be35d8a4e9433d7501fd98dae6b", size = 15669392, upload-time = "2026-05-18T23:34:41.257Z" },
{ url = "https://files.pythonhosted.org/packages/a5/9d/3584b9984ca4c047aea75214ce1a4c4c73d849bd71b604264b7f5653f8a8/numpy-2.4.6-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7830bab239b79cda9c08c2da014761cafb48da6150e1da17ac06283f43b6089", size = 16633220, upload-time = "2026-05-18T23:34:45.075Z" },
{ url = "https://files.pythonhosted.org/packages/05/ae/7c67fba23bd98caec7c99261f3a16072ade14813486b0282cb29846de832/numpy-2.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ef4aea96ce4d3b074422cb4f2f64e216bf9e213004bb58ecfdf50ea02ea8eb9a", size = 17020800, upload-time = "2026-05-18T23:34:49.065Z" },
{ url = "https://files.pythonhosted.org/packages/d9/5d/3b6725cb31d983c5e66916f5d36f6d7e5521129e4c4404d64f918292a5b6/numpy-2.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dfa20cc6ca228e6b155b11da03825975ce66aea520985dbbddf0f2a5a495c605", size = 18357600, upload-time = "2026-05-18T23:34:52.709Z" },
{ url = "https://files.pythonhosted.org/packages/f7/da/2ccc6c2fe8898dee01d90c75c5f5f914a23daf99e3e0f59516a08760c8b5/numpy-2.4.6-cp313-cp313-win32.whl", hash = "sha256:56b39e5e0622a09a25bf5baf62f4bcf0cb8a41ae6e2819cf49bbc5a74c083f91", size = 5961134, upload-time = "2026-05-18T23:34:55.618Z" },
{ url = "https://files.pythonhosted.org/packages/b5/cd/9cc4dc876fb065d5c220aae4d5e14826b2715331bb7618ce1fb07a679d99/numpy-2.4.6-cp313-cp313-win_amd64.whl", hash = "sha256:c4fc99836233ea196540b17ab0983aff60ed07941751930f5f4d05bc3b3b7359", size = 12318598, upload-time = "2026-05-18T23:34:58.928Z" },
{ url = "https://files.pythonhosted.org/packages/39/1e/c0bcba1f8694116485fe28fd1be698c278fcda4141c5b0e53a2aed8b12a8/numpy-2.4.6-cp313-cp313-win_arm64.whl", hash = "sha256:a7c711e21628b52034bb5ab8d1bce291f752fcc5e92accc615778acee1ff4778", size = 10222272, upload-time = "2026-05-18T23:35:02.167Z" },
{ url = "https://files.pythonhosted.org/packages/63/6d/cc5619247c8f4204e507f5883528372e4ac4bb189e579fb859a12e480b1f/numpy-2.4.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:112b06a867b235ef466ed3508ddf0238050df9c727cafb5301ac385b899189a1", size = 14821197, upload-time = "2026-05-18T23:35:05.468Z" },
{ url = "https://files.pythonhosted.org/packages/00/58/f1c39161c87d9e9bed660f1ed4bafc0e403d5ec9650b6dd77aead07d489b/numpy-2.4.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:eaf7fa2de5c0be8ae6ff8e9bea2ccd725e980541244521d8d4b5f3354a27babe", size = 5326287, upload-time = "2026-05-18T23:35:08.693Z" },
{ url = "https://files.pythonhosted.org/packages/af/57/3917ab0fd97f271a8694513581b8a36c655f111c446852c302f04ccdb6fc/numpy-2.4.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7265a2f3d436e54ef9f2b52b5c937e6be778781bd97a590319d7348f1c1ca997", size = 6646763, upload-time = "2026-05-18T23:35:11.459Z" },
{ url = "https://files.pythonhosted.org/packages/eb/0f/037e64c494b67581ae18193d770adef354c41f3f2c8ebf865602d949bf8f/numpy-2.4.6-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f74a575920ab21fe304421a3fc28793d82e299cae9eccb37084e9fc7f3617c20", size = 15728070, upload-time = "2026-05-18T23:35:14.79Z" },
{ url = "https://files.pythonhosted.org/packages/21/a6/5d2bae9c9542eb4df16dc9c46dc79c186e9bad53805dfa5399a6023c6db0/numpy-2.4.6-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ede83e07a75dd06bc501566c1eca2afc0d61677c1472ac9ad93fdee6e638a48d", size = 16681752, upload-time = "2026-05-18T23:35:18.836Z" },
{ url = "https://files.pythonhosted.org/packages/92/14/23d1dfb410ae362cd59ce53e936b1513d545eb40db3949ced632e19a459e/numpy-2.4.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:68bb27509ac1b9a3443094260f6326150663b06abe40b73a2f81160623da5b67", size = 17086024, upload-time = "2026-05-18T23:35:22.52Z" },
{ url = "https://files.pythonhosted.org/packages/4b/6e/23595a2c642cdf3bc567877064bdd7f91c8b0038a4453cf2daf7248eafe9/numpy-2.4.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a0df0043bdb289bde1f62da130d20df23d58b45429f752bc7a8fc5325a225ecd", size = 18403398, upload-time = "2026-05-18T23:35:26.398Z" },
{ url = "https://files.pythonhosted.org/packages/8a/90/0ac3bc947217e66dec77e7cbc6a1979d1af70b6461b82f620d3bccd5e4c8/numpy-2.4.6-cp313-cp313t-win32.whl", hash = "sha256:29a287e0cf63ff528da061de6b9f64a4618da591ca1046aafc54062e40ca7eab", size = 6084971, upload-time = "2026-05-18T23:35:29.387Z" },
{ url = "https://files.pythonhosted.org/packages/77/71/5673e351671a1d2bd6063b91b44f70c0affea7d1516fa7a6572941ba4aa1/numpy-2.4.6-cp313-cp313t-win_amd64.whl", hash = "sha256:25c692919ac5a01f170a3bfcd62d745b24fd095c353d50812637d6fcab442e75", size = 12458532, upload-time = "2026-05-18T23:35:32.175Z" },
{ url = "https://files.pythonhosted.org/packages/3f/88/19d3503c5046e688f049274b27a3ef3d771152fa80d3ba3d01a3dff61abe/numpy-2.4.6-cp313-cp313t-win_arm64.whl", hash = "sha256:1e978ec1e8bd0e0e4de6bb75de9d30cbb74db6b6a2bb727618613703ca0167dd", size = 10291881, upload-time = "2026-05-18T23:35:35.465Z" },
{ url = "https://files.pythonhosted.org/packages/f8/91/3ab2044d05fd16d343c5ac2e69b127f1b2854040dd20b193257c78028bd3/numpy-2.4.6-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:06ca2f61ec4385a07a6977c55ba998a4466c123642b4a32694d3128fce18c079", size = 16683458, upload-time = "2026-05-18T23:35:38.353Z" },
{ url = "https://files.pythonhosted.org/packages/8e/62/764ce66fa4147ae6d73071a3abf804ffe606f174618697c571acdf26a7c9/numpy-2.4.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:38efbc8de75c7a0fc1ac190162d892787f3f47b57cc291231aafee36b80982b7", size = 14704559, upload-time = "2026-05-18T23:35:42.14Z" },
{ url = "https://files.pythonhosted.org/packages/60/61/23f27c172f022e04025b7dc2367f4d63c1a398120607ec896228649a6f48/numpy-2.4.6-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:d581b735e177fdcdce6fed8e7e8880a3fb6ee4e3653a3ac6af01c6f4c03effc5", size = 5209716, upload-time = "2026-05-18T23:35:45.377Z" },
{ url = "https://files.pythonhosted.org/packages/03/71/21cf70dc6ea3e3acb95fc53a265b2fc248b981f0194ceb5b475271b8809d/numpy-2.4.6-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:0a041d3d761dc3c35cc56ce0351506a02bcbc25f7b169f652435141a17db9096", size = 6543947, upload-time = "2026-05-18T23:35:47.926Z" },
{ url = "https://files.pythonhosted.org/packages/d5/91/64288395ee1799bd2e0b04a305dce9666da90c961e1f3fe982a05ee1c036/numpy-2.4.6-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40fdc1ae7125e518ea98e53e69a4ebc27e1fd50510c47b7ea130cf21e5e1d42b", size = 15685197, upload-time = "2026-05-18T23:35:50.863Z" },
{ url = "https://files.pythonhosted.org/packages/f3/eb/ebffaa97dc55502df69584a8f0dcf07f69a3e0b3e2323670a2722db9aa39/numpy-2.4.6-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a2c306dea656c12c68f51f4cea133cbe78ca7435eb28c735eac1d3ebe73be6e8", size = 16638245, upload-time = "2026-05-18T23:35:54.752Z" },
{ url = "https://files.pythonhosted.org/packages/b8/0b/54f9da33128d7e350fab89c7455902eeae70349ee52bddb448dc4a576f45/numpy-2.4.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:33111801a01c12a8a1e3721f0a9232f8cfc8ae2c6b7098167e6f623c6073f402", size = 17036587, upload-time = "2026-05-18T23:35:58.355Z" },
{ url = "https://files.pythonhosted.org/packages/b6/f0/fdebc1052db1cc37c64beb22072d67cd6d1c71adca1299f53dec2b5e20d3/numpy-2.4.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae506e6902902557576a26ff33eda8695e7ecb3cb36c3b573a0765dee114ebdb", size = 18363226, upload-time = "2026-05-18T23:36:02.845Z" },
{ url = "https://files.pythonhosted.org/packages/aa/b4/298628d98c72b57e57f7165ae6a481a1deaf6f3c28262a6e4c739c275930/numpy-2.4.6-cp314-cp314-win32.whl", hash = "sha256:aaf159caa35993cb1f56fb9b8e4610d35758e7ca005412eb1daa856a78c9c4b1", size = 6010196, upload-time = "2026-05-18T23:36:05.92Z" },
{ url = "https://files.pythonhosted.org/packages/df/ac/46de6dda46478f7942f839e094970be2d4a861e005c4b3bf07c92e291a09/numpy-2.4.6-cp314-cp314-win_amd64.whl", hash = "sha256:b507f5c4c1d508876d1819b6bf9a49d365b96320b5d4993426b33a23ca4b8261", size = 12450334, upload-time = "2026-05-18T23:36:09.107Z" },
{ url = "https://files.pythonhosted.org/packages/78/92/b8b798ac784102c0da830d2257d59358e3d3d90d1e2b3f2575dad976c5cf/numpy-2.4.6-cp314-cp314-win_arm64.whl", hash = "sha256:6f41ae150c4e32db4f3310cdaf64b1593a03dbabe29eec77fc9b50fe64061df6", size = 10495678, upload-time = "2026-05-18T23:36:12.766Z" },
{ url = "https://files.pythonhosted.org/packages/30/34/ec28d1aa8115971537c01469ab2011ee96827930f0a124de1000cc2a7ed7/numpy-2.4.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ece3d2cfe132e7d51f44a832b303895e6f2d499c5e74dfbdb06ee246147a304a", size = 14823672, upload-time = "2026-05-18T23:36:16.473Z" },
{ url = "https://files.pythonhosted.org/packages/16/bd/f6d1fede4e54e8042a7ff97bb495510f3c220f94bcd9e8b228e87c92cc0d/numpy-2.4.6-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:e3e5193ef5a3dc73bceee50f7fdc2c90dbb76c42df8d8fae3d1067a583df579e", size = 5328731, upload-time = "2026-05-18T23:36:19.767Z" },
{ url = "https://files.pythonhosted.org/packages/f4/f0/e105b9e2fd728a9910103884decd6951d9dd73896b914a98d9a231de02ee/numpy-2.4.6-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:17f9ade344e7d9b464a084d69bcf18fc691cb1db67c62ed80820bf4926d78f0e", size = 6649805, upload-time = "2026-05-18T23:36:22.266Z" },
{ url = "https://files.pythonhosted.org/packages/82/dd/1206a7ca6ab15e3f02069707ca96222e202af681bb73756da7527f3cb837/numpy-2.4.6-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cd5ffd25db4e7ba6a375693b3fc0fc1791ec636c17db3720da19bde7180ec43", size = 15730496, upload-time = "2026-05-18T23:36:25.713Z" },
{ url = "https://files.pythonhosted.org/packages/51/e7/38d3ea825dcab85a591734decb2f6c67caa7c8367d374df1a1c3842f9b07/numpy-2.4.6-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d92c3819208a60205a12a245c91ad70cb0a85336659b19b834205573ac8456e", size = 16679616, upload-time = "2026-05-18T23:36:29.652Z" },
{ url = "https://files.pythonhosted.org/packages/93/b7/caabfdf53edf663e0b4eb74d7d405d83baef09eb5e83bcd32d601d72b93e/numpy-2.4.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e85b752a1e912b70eaad4fafbd4d1238007ab221de2009b9a2f5ae7461239895", size = 17085145, upload-time = "2026-05-18T23:36:33.449Z" },
{ url = "https://files.pythonhosted.org/packages/f9/45/68d7c33a6bcf3e5aa3bdbd57a367e6f615286dfd6482f97e8ffeb734306e/numpy-2.4.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:29cb7f67d10b479ff07c17d33e39f78c07f71c40ef30d63c153d340e96cd3fb4", size = 18403813, upload-time = "2026-05-18T23:36:37.369Z" },
{ url = "https://files.pythonhosted.org/packages/9c/50/0753655aa844c99cd9e018aacf76f130f1bd81d881bb74bc0aef5d73a8ba/numpy-2.4.6-cp314-cp314t-win32.whl", hash = "sha256:260a5d70215b61ab4fadf5c7baacd64821842975eea312125ed3c39a6391b063", size = 6156982, upload-time = "2026-05-18T23:36:40.817Z" },
{ url = "https://files.pythonhosted.org/packages/b2/d4/7c67becf668f973cb490cec3e98dfd799d866f9c989a54d355672cfa0db6/numpy-2.4.6-cp314-cp314t-win_amd64.whl", hash = "sha256:81a1cca95ed5bb92aa8b10dd2cdc9a0d3853a50fad926c28b5d7e8ea54389627", size = 12638908, upload-time = "2026-05-18T23:36:43.996Z" },
{ url = "https://files.pythonhosted.org/packages/43/bb/e1c71a4295b1b1d1393d50dbb4f2a36283c6859d9d3892e84f00ec5a91d5/numpy-2.4.6-cp314-cp314t-win_arm64.whl", hash = "sha256:0c9136e14ed34a9e343a31c533d78a9813a69a3148332bce5e9821cb2f996e66", size = 10565867, upload-time = "2026-05-18T23:36:47.114Z" },
{ url = "https://files.pythonhosted.org/packages/de/12/b422cc84439adc0d00de605bf4a308890ae5c26f2c71fbd73e5d08fbb0dd/numpy-2.4.6-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:55cced7c52e981362f708ad635198e97a752dfba412cc03c23bbf3bd8d5cd662", size = 16847511, upload-time = "2026-05-18T23:36:50.673Z" },
{ url = "https://files.pythonhosted.org/packages/44/53/f481bef68011740f8849418d82db07230e825013f31f4eef5ba5b805316a/numpy-2.4.6-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d6da64deb6b8ed903e7560180a92f2d804ee1ba5eeb849ac2748b8c1aba1f6d7", size = 14889064, upload-time = "2026-05-18T23:36:53.879Z" },
{ url = "https://files.pythonhosted.org/packages/7f/57/42ed575c10ced8af951d426bc4e1f8aff16fd851db33f067036215a7f860/numpy-2.4.6-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:68a5124b13fa6cc2086764a20005d30bc0548146f7f5322f02fce212ca14317f", size = 5394157, upload-time = "2026-05-18T23:36:57.194Z" },
{ url = "https://files.pythonhosted.org/packages/6a/ef/f66cc724fcc36c1e364c67f51ae9146090b8b584f27d58b97fdae3edd737/numpy-2.4.6-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:948424b06129ce883307e8cff868c31396d8dc7630a59c61d70d98dbe70f222c", size = 6708728, upload-time = "2026-05-18T23:36:59.575Z" },
{ url = "https://files.pythonhosted.org/packages/1a/9c/c531f2293b91265d8b48e9b329f54fdd7ffae73cb4134ea10cca4237e9cc/numpy-2.4.6-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5dbbdb29840ca3d91ee0fece42fc29278886d908280bfec0a5846c6f901a3eb0", size = 15798374, upload-time = "2026-05-18T23:37:02.674Z" },
{ url = "https://files.pythonhosted.org/packages/1a/b0/413077f6b1153ed3cba361401c6783bbad6114804a000cc22eb71c13e190/numpy-2.4.6-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ad03c0965fb3c692200e74d458ca28c1dbb4ce96f9a479a8aa041ad5fabca02", size = 16747286, upload-time = "2026-05-18T23:37:06.327Z" },
{ url = "https://files.pythonhosted.org/packages/15/ce/e5ec180bc41812edcd8daeb8639d205622c0e8c02259d8ab25a0201b3c2a/numpy-2.4.6-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:2803abfebfc990042cd494d8ce2d5f82e9d847af6d35ec486923aa19dbad5e73", size = 12504263, upload-time = "2026-05-18T23:37:09.715Z" },
]
[[package]]
name = "numpy"
version = "2.5.1"
source = { registry = "https://pypi.org/simple" }
resolution-markers = [
"python_full_version >= '3.14' and sys_platform == 'win32'",
"python_full_version >= '3.14' and sys_platform == 'emscripten'",
"python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'",
"python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'",
"python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'",
"python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'",
]
sdist = { url = "https://files.pythonhosted.org/packages/22/fd/89965aa4ac08c74998539fcbf24fa3540f3e15237fbeb6bcf9c908f4aade/numpy-2.5.1.tar.gz", hash = "sha256:a48a113e6afea91f5608793bafa7ef2ad481fefbda87ec5069f483de61cb9fa3", size = 20755553, upload-time = "2026-07-04T17:08:00.933Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/62/7b/14687aa674250e5e546f616f486b0d56d3631cd5b2415739141ce40bdcea/numpy-2.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2c889b56fe48b1018f764b0eec8df59ab654e9148aa91faa12596043500de277", size = 16801574, upload-time = "2026-07-04T17:06:12.423Z" },
{ url = "https://files.pythonhosted.org/packages/e1/19/cc5bb2a3f2913d27d6dbb2c78d25921fabaedc6741d4a5a615a11f3c5bf3/numpy-2.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ab451b59c5643c570974c43aef780703ef1d3b4965d2be07afd530615a9358d1", size = 11772250, upload-time = "2026-07-04T17:06:15.726Z" },
{ url = "https://files.pythonhosted.org/packages/42/77/fdf34a71dd30f54979b18603bee915e0aaf825b07afe79acd60b04b691e2/numpy-2.5.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:78798bd5b9ad744056af8efa90e3b9ddaa53272a0848a483084a1cc0a13b2dc0", size = 5331516, upload-time = "2026-07-04T17:06:17.913Z" },
{ url = "https://files.pythonhosted.org/packages/ce/e2/eb7efa015b4cce41e2517bf182a7fce0d7d5b9d9ed76a29bfa0f4fe4505c/numpy-2.5.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:2ae0ca40bcb22d6ba59c1dfd5446f49940b0f2d821fde133f10dda11f816b84e", size = 6664863, upload-time = "2026-07-04T17:06:20.02Z" },
{ url = "https://files.pythonhosted.org/packages/a9/4b/a2b32dd94ee9ffbeecb28152240042a3949db33b1c834d44090b80e1b3b8/numpy-2.5.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:61ac47e772e6b8ea489e1d2f441a34c5c3ac17327e7ce294cbdf535795ad4e75", size = 15167977, upload-time = "2026-07-04T17:06:21.621Z" },
{ url = "https://files.pythonhosted.org/packages/b8/a9/6e73d68500f80773f65f0654ea932019d6694329a0eb0ed0533de38df376/numpy-2.5.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:59fda5e192b570217ec2580c96f00e9a7e12ef6866a900eb089b62c1a32545ca", size = 16672469, upload-time = "2026-07-04T17:06:24.064Z" },
{ url = "https://files.pythonhosted.org/packages/24/7d/ad3e59015135f5261c95fd4cafeff159c955febd83a99a1d9250c4233815/numpy-2.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f7119ebff1a9829e9f431a4f9d28e703023bb6b9fe7c8f724467dbfc27c94ab3", size = 16527531, upload-time = "2026-07-04T17:06:26.69Z" },
{ url = "https://files.pythonhosted.org/packages/83/d0/a39b2fbcde9cb17a1dac678f254b33a6336298af9df338824c685425d5e8/numpy-2.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e824c2acf8862052246be5a44c15da1777940c60d010dd2aab897824d9c430f9", size = 18431940, upload-time = "2026-07-04T17:06:29.521Z" },
{ url = "https://files.pythonhosted.org/packages/04/12/cff070947791c1ed425ff76413189adbdc2fbe215eba7ce7fa454a03c7f8/numpy-2.5.1-cp312-cp312-win32.whl", hash = "sha256:08d60c810432eb83360958dea0999ac4cfb94531ea8efcbf0b7f277c2068aeb2", size = 6066764, upload-time = "2026-07-04T17:06:32.571Z" },
{ url = "https://files.pythonhosted.org/packages/65/66/53f31807a48a750f9d748da273bc3fcedd12b27ff1f3e373bfec55ef2dc0/numpy-2.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:f7d60026c0bdb1380e83bfa7a0419c4577ee4b9a08880afcb6dadeb74c649fa2", size = 12430966, upload-time = "2026-07-04T17:06:34.926Z" },
{ url = "https://files.pythonhosted.org/packages/2b/2a/d1a88066b1c14186f5d3c0d18c94f17b064511982bab0578d49ee9d43c29/numpy-2.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:17a25e09640602e10bc8de0e6fa2b3fd68eedd84ba6d7842dc8f32f9ab87bd0b", size = 10350488, upload-time = "2026-07-04T17:06:37.785Z" },
{ url = "https://files.pythonhosted.org/packages/eb/07/ec2a3f0c91761581d4b7104a740791800025983f9a4dc4e73f91a99aeac4/numpy-2.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0bfebd8695f9863592fe744be833a258120b14a9f39da255e8aa8fade2c0ddd1", size = 16796419, upload-time = "2026-07-04T17:06:40.37Z" },
{ url = "https://files.pythonhosted.org/packages/ab/ab/ddb499fc4f8780354395face5b65c7fd107bcd6e1d667a5f07d046956f6f/numpy-2.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:30b44a6b53a7ae63c54c089a8726e5563ed302716c5b7ccc85afade40b0e7ff6", size = 11765832, upload-time = "2026-07-04T17:06:42.768Z" },
{ url = "https://files.pythonhosted.org/packages/88/b3/3c28c558a09fc72100c646dac6d2fce8e834c471b0edca01a29996706117/numpy-2.5.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:6165343f81b56ef8f514f396989e529b61d9dc709b99421b07e9f3e698e2287d", size = 5325143, upload-time = "2026-07-04T17:06:45.466Z" },
{ url = "https://files.pythonhosted.org/packages/5e/0e/ce19b985bb15c596f4f05954e76cccc77c845083b3b8f938a6c68e523128/numpy-2.5.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4939237038ada79308dda3204ac6462df056b5672b2e25db1149cf873668b3e1", size = 6659749, upload-time = "2026-07-04T17:06:47.288Z" },
{ url = "https://files.pythonhosted.org/packages/2e/20/1ee6614d64332a1bba6411f38e68cb79eec1b2459e20a623777c5c5492a2/numpy-2.5.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c6759f538fb912fc46de0a6b1758ccf7b57bc7c7ebebc23974fdac3de8db0cd", size = 15164716, upload-time = "2026-07-04T17:06:49.494Z" },
{ url = "https://files.pythonhosted.org/packages/ed/a7/2bcd3fdbb87804755c35b729bf8709d62025c5f4cfd7d5b2415997097515/numpy-2.5.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9726558e8db4a5bf7929a70ae50f63abda4daf0efe810e3bfbab95976f75fc1a", size = 16661440, upload-time = "2026-07-04T17:06:52.061Z" },
{ url = "https://files.pythonhosted.org/packages/fc/d7/a41e3310c886fe457d36e670bbf24fae411aca8a7b6ad92a32afd924077c/numpy-2.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3935f3b419b244a02732676fa5317a9193cc596a4c0646db07e5b421229ac9f7", size = 16526305, upload-time = "2026-07-04T17:06:54.605Z" },
{ url = "https://files.pythonhosted.org/packages/53/75/4333a9a707c1edd3a4e1a0c58eca52c0f31e55089fa80db02b5565b24df7/numpy-2.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc932a65ded7ce9013d120845a2514dcccb1a67bfc8deb8d37633762951904a6", size = 18423008, upload-time = "2026-07-04T17:06:57.54Z" },
{ url = "https://files.pythonhosted.org/packages/ee/90/e314a32b1c11a2ffe818ddad3a57b50b4b6e1b6c487192eb50cdef0415d0/numpy-2.5.1-cp313-cp313-win32.whl", hash = "sha256:4b4ff1608417eb7a59da7b967bbb798cacfe071d2caf526a24281cd562072ed9", size = 6063885, upload-time = "2026-07-04T17:07:00.14Z" },
{ url = "https://files.pythonhosted.org/packages/10/70/800b3fca480af32df9e8ea9f3d4a0c8feb4b32d7f195d174eabbda4829ad/numpy-2.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:6c3fe51bc6a16453d452997053454f309e8e0ed7b42d6b361ce4ac8c32913d74", size = 12425674, upload-time = "2026-07-04T17:07:02.387Z" },
{ url = "https://files.pythonhosted.org/packages/8b/0b/196350c122f50f6ca56846f2d71efd5e0d24b7b2e07355e019b2e2c7a11e/numpy-2.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:f7feb014281029e628ba2d5a007407443b06e418b6fe451d1e2adcbc8eba0107", size = 10350256, upload-time = "2026-07-04T17:07:04.878Z" },
{ url = "https://files.pythonhosted.org/packages/db/f4/731b6085a83faf6ca843394cbd5e217280c214399f7e8b21b9f552af0ae2/numpy-2.5.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:7c786fe9a5bbe360022e584c5a34cf6b54265c71bd7ec8ac3d8fec38968071f8", size = 16795063, upload-time = "2026-07-04T17:07:07.374Z" },
{ url = "https://files.pythonhosted.org/packages/bf/64/0e215f2048dd11a55bb989ed41b3585ef57452404e638d703a211a3e4157/numpy-2.5.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32985c896d897419ef8da6917872d80b78ad0ea26d85b23245c7366ffde76d75", size = 11776652, upload-time = "2026-07-04T17:07:09.907Z" },
{ url = "https://files.pythonhosted.org/packages/b5/59/2b844c7a6e9deff69b404a66221e1542937734f65d5e6e39411876053862/numpy-2.5.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:efd736408cc97c79b9e6917338dfc8f06013b2274f992e96b1d9a81a71e2a2c2", size = 5335944, upload-time = "2026-07-04T17:07:12.227Z" },
{ url = "https://files.pythonhosted.org/packages/86/51/9bf7cb2cabcebc9e017e4ec7e6322b378317a542c08b4cb68479c1efc716/numpy-2.5.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:ab84dc6b074fa881cae55bea94cc4f68e285181ba7f32497bf7dee6b1496165b", size = 6656266, upload-time = "2026-07-04T17:07:14.368Z" },
{ url = "https://files.pythonhosted.org/packages/83/3e/fb7615b211b82a32f44d5180a6d421b61f84d4fadd578b48ba4ac34e189f/numpy-2.5.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:caf3e317d33d60c37986b452613f4ab51246d0691350c03d0cb4a898627f4a95", size = 15179720, upload-time = "2026-07-04T17:07:16.272Z" },
{ url = "https://files.pythonhosted.org/packages/41/5f/0f992cb24560673496c5d68de61913b57166ce530ffda07c1f280e0cc464/numpy-2.5.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:54ad769f17bc2d833b620851989f62054fb9ab93c969d9e1dc3c8e3d56beea21", size = 16664835, upload-time = "2026-07-04T17:07:19.021Z" },
{ url = "https://files.pythonhosted.org/packages/a2/2f/97d6475ee91afe2587797d09446f9d3e475ad4cb681662d824809327b75a/numpy-2.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c12afb53450fa976d4c681c50a7423729a4c51c0465ed9f32b8a9cabbc472373", size = 16539135, upload-time = "2026-07-04T17:07:22.015Z" },
{ url = "https://files.pythonhosted.org/packages/c4/5b/4db81e4ba0be7e2776b1de68c82aa862c7f8ec27e1b4927d4ae075e20678/numpy-2.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e8c11c405efc5ff6816d5983c96cdfa215bab3428961243af3ff59b228490438", size = 18426684, upload-time = "2026-07-04T17:07:24.941Z" },
{ url = "https://files.pythonhosted.org/packages/1f/64/c0ba2d90724d450279a7df8f32057241070250a26a7e2b5337d77347f481/numpy-2.5.1-cp314-cp314-win32.whl", hash = "sha256:f2479a47f8d5932d1718168a681ad6e536a9df484c83cfcf9de365e164537ace", size = 6116103, upload-time = "2026-07-04T17:07:27.622Z" },
{ url = "https://files.pythonhosted.org/packages/c1/1a/837f9ed7405adcd7a40538792eb169eddd8fa5630c16a1ef49dae71a30f4/numpy-2.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:24d0eb82c0541d3415a33425db64ae439dffccd7b4dbcb30e7c35120205c506a", size = 12562177, upload-time = "2026-07-04T17:07:29.887Z" },
{ url = "https://files.pythonhosted.org/packages/22/ed/49707938b6dd0a78a9178dd93227dc89e4c11af47f5c798d70366e8d0483/numpy-2.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:5a4c988b38d261deeeaad9954e3deb091ad905c94e8bb6708654ef1d97f286b0", size = 10627739, upload-time = "2026-07-04T17:07:32.568Z" },
{ url = "https://files.pythonhosted.org/packages/a6/c7/bb4b882cfe7f299cbc8b66e42e7dd78cf9d14e40f9469fc5e3db7e15b3bd/numpy-2.5.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a33276be12fa045805f477f22482088b66bb758ffbe89a9d21457de863a32e22", size = 11894709, upload-time = "2026-07-04T17:07:34.941Z" },
{ url = "https://files.pythonhosted.org/packages/40/3f/5af7f4a7f6224aef48017aa82bb6174c7a659d724be0c75017b7e64a55b4/numpy-2.5.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:f089d7b00756190aacf1f5d34bdf38c3c430ac82b4f868f8cede73380460fce7", size = 5453810, upload-time = "2026-07-04T17:07:37.495Z" },
{ url = "https://files.pythonhosted.org/packages/20/c9/3474309bc94d634d3f9c3eddf03250ecb8c22cd948ef16fef69a77cc5d7b/numpy-2.5.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:09e9bfd8d2cf479c7d174804fb3811c53a8e9f20a37444008606b57d6b7a826d", size = 6761189, upload-time = "2026-07-04T17:07:39.563Z" },
{ url = "https://files.pythonhosted.org/packages/90/8a/558ae39fdd55d7e7f7fef9a84a6e964ac6b23edbd2a07e52bb084500507d/numpy-2.5.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e68d8dd1e7eba712948f2053a29ec86917bc70ba1358df869d9f06649ef9cf09", size = 15225039, upload-time = "2026-07-04T17:07:41.682Z" },
{ url = "https://files.pythonhosted.org/packages/63/27/ca7392b2d030277bdf0273e7d23255b3ee57d57a7c170a6f4fb3981e1e5d/numpy-2.5.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:99d5095fa265a0c4152e7bb12759e14381ef5496152f1ce58f44bdf55c44beb4", size = 16701306, upload-time = "2026-07-04T17:07:44.611Z" },
{ url = "https://files.pythonhosted.org/packages/02/42/03d53ae7996c44d4374a8262e9dc41671fd56cbb98f7d47ef85cf5da4c6b/numpy-2.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ab87a91b3cc3382b8956095bd8f95e00cf679bb81554339be1a2ba404a1473c1", size = 16589955, upload-time = "2026-07-04T17:07:47.694Z" },
{ url = "https://files.pythonhosted.org/packages/7b/15/6c1784ae469640e65db111e9a34b3d0f14d91e8a38b9ce34810ced370dbb/numpy-2.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:224ca51130ef7da85bea2191625181cb4f337f9cb64b471f10c1a12aa8b60077", size = 18464252, upload-time = "2026-07-04T17:07:50.684Z" },
{ url = "https://files.pythonhosted.org/packages/94/a8/f98e50356cf167df656c526c2dfeec2d7dde182f2a3da4b458a5938e2776/numpy-2.5.1-cp314-cp314t-win32.whl", hash = "sha256:6eab239876581b2b3c5a242281b6007bbdbcd1c7085d7709bb57c5929b11e6bf", size = 6263298, upload-time = "2026-07-04T17:07:53.445Z" },
{ url = "https://files.pythonhosted.org/packages/72/ac/96ae880cdecad0b3275d9359fcec72667b49a4863c9f12942e43679dda02/numpy-2.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:83ce9c80d5b521b0d77ddcbe5447c218d247929b6cc056ca5351342accfff0af", size = 12748623, upload-time = "2026-07-04T17:07:55.384Z" },
{ url = "https://files.pythonhosted.org/packages/a1/5a/4d2b1601df3602dba7a14f3348ba9bfe94a18adb428e693df6154c293831/numpy-2.5.1-cp314-cp314t-win_arm64.whl", hash = "sha256:5a6db61f9aaa57e369905c67d852045d3c4f7126405b29d09b19dec118e9c9cb", size = 10697674, upload-time = "2026-07-04T17:07:58.506Z" },
]
[[package]]
name = "oauthlib"
version = "3.3.1"
@@ -671,6 +898,85 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" },
]
[[package]]
name = "pandas"
version = "3.0.3"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" },
{ name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
{ name = "python-dateutil" },
{ name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/f8/87/4341c6252d1c47b08768c3d25ac487362bf403f0313ddae4a2a26c9b1b4c/pandas-3.0.3.tar.gz", hash = "sha256:696a4a00a2a2a35d4e5deb3fc946641b96c944f02230e4f76137fe35d806c4fc", size = 4651414, upload-time = "2026-05-11T18:54:29.21Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/42/16/b5c76b838fd9bf6ce84d3a53346b8874ec05c5f0040d75ef2c320100cd2a/pandas-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:455f6f8139d4282188f526868dbc3c828470e88a3d9d59a891bd46a455f21b98", size = 10338495, upload-time = "2026-05-11T18:52:11.558Z" },
{ url = "https://files.pythonhosted.org/packages/5a/b0/a4ffc4ae74d2d822200dcc46898987d8eb6032d1e2b219cae39da6f5cbcc/pandas-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4e15135e2ee5df1063313e2425ceef8ac0f4ae775893815b0923651b806a5639", size = 9938250, upload-time = "2026-05-11T18:52:17.005Z" },
{ url = "https://files.pythonhosted.org/packages/2e/b2/3323601a52caee42c019e370090ca4544b241437240ca04f786cce82b0cf/pandas-3.0.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:05f1f1752b8533ea03f7f39a9c15b1a058d067bb48f4748948e7a8691e0510f2", size = 10770558, upload-time = "2026-05-11T18:52:19.865Z" },
{ url = "https://files.pythonhosted.org/packages/32/f1/bbecd2f867b97abebe0f9b53d750f862251b40337e061b36676ded3d920f/pandas-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a1e45c80cceb3b4a21bc5939d52e8cbd8d9b7305309219d59e9754d9ce09e27", size = 11274611, upload-time = "2026-05-11T18:52:22.622Z" },
{ url = "https://files.pythonhosted.org/packages/7f/4f/eafabf2d5fae5adf143b4d18d3706c5efdc368a7c4eb1ee8a3eddabbd0f6/pandas-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:14da8316da4d0c5a77618425996bfb1248ca87fc2c1486e6fde4652bd18b5824", size = 11784670, upload-time = "2026-05-11T18:52:25.4Z" },
{ url = "https://files.pythonhosted.org/packages/49/44/1eb20389301b57b19cc099a1c2f662501f72f08a65f912d05822613c1532/pandas-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a55066a0505dae0ba2b50a46637db34b46f9094c65c5d4800794ef6335010938", size = 12353708, upload-time = "2026-05-11T18:52:28.139Z" },
{ url = "https://files.pythonhosted.org/packages/eb/62/c321f13b5ba1819fc8dca456c7fce578da2dcfecff1abbf0eaddf8406c0f/pandas-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6674ab18ad8c57802867264b00e15e7bb904700cdd9046e3b2fa1fce237439ea", size = 9907609, upload-time = "2026-05-11T18:52:30.982Z" },
{ url = "https://files.pythonhosted.org/packages/53/85/1b7f563ebc6357c27233a02a96b589bcce1fa9c6eb89fb4f0e56421d277e/pandas-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:5cc09a68b3120e0f54870dede8287a7bb1fa463907e4fcec1ea77cab6179bf7a", size = 9165596, upload-time = "2026-05-11T18:52:33.334Z" },
{ url = "https://files.pythonhosted.org/packages/24/f1/392f8c5bfc16f66a0d2d41561c01627c228fe7ed2a0d056ef11315042570/pandas-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fed2ff7fd9779120e388e285fc029bd5cf9490cdd2e4166a9ee22c0e49a9ab09", size = 10357846, upload-time = "2026-05-11T18:52:36.143Z" },
{ url = "https://files.pythonhosted.org/packages/cf/3d/b16412745651e855f357e5e66930248688378853a6e2698a214e331fba1f/pandas-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b168fc218fd80a6cbdbdbc1a97ddc7889ed057d7eb45f50d866ceab5f39904c4", size = 9899550, upload-time = "2026-05-11T18:52:38.976Z" },
{ url = "https://files.pythonhosted.org/packages/31/a8/fa2535168fffcedf67f4f6de28d2dd903a747ca7c8ea6989451aaeb3a92f/pandas-3.0.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0383c72c75cdcca61a9e116e611143902dbfd08bff356829c2f6d1cf40a9ca8c", size = 10412965, upload-time = "2026-05-11T18:52:41.915Z" },
{ url = "https://files.pythonhosted.org/packages/65/b6/09b01cdbc15224e2850365192d17b7bdebb8bdbd8780ed221fcdf0d9a515/pandas-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6dc0b3fd2169c9157deed50b4d519553a3655c8c6a96027136d654592be973a9", size = 10894600, upload-time = "2026-05-11T18:52:45.02Z" },
{ url = "https://files.pythonhosted.org/packages/c9/a4/2eb28f2fccb4ced4a2c79ab2a5dee9ade1ebf44922ebad6fea158c9f95d4/pandas-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7e65d5407dc0b394f509699650e4a2ec01c0514f21850f453fa60f3be79a5dbf", size = 11422824, upload-time = "2026-05-11T18:52:48.058Z" },
{ url = "https://files.pythonhosted.org/packages/f8/45/830bb57f533a4604b355e07edcb8ea18cf88b5f94e5fca92f27052d7c597/pandas-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f8894dc474d648fe7b6ff0ca9b0bd73950d19952bc1a6534540762c5d79d305c", size = 11950889, upload-time = "2026-05-11T18:52:50.905Z" },
{ url = "https://files.pythonhosted.org/packages/b9/c5/fc1b368f303087d20e8c9bf3d6ceb186263cfac0ade735cd938538bea839/pandas-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:c7be265b62cef88e253a941e4698604973736dcfe242fdb5198f0f7bc473cdcc", size = 9755463, upload-time = "2026-05-11T18:52:53.386Z" },
{ url = "https://files.pythonhosted.org/packages/86/bd/fda8f9705b1b09c6ebe14bfc0fa0e4ec8584d54ea673628f157ff55131af/pandas-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:557409bc4178e70ee8d9ddb494798e51ebf6ea59330f6be22c51bab2a7db6c49", size = 9066158, upload-time = "2026-05-11T18:52:56.038Z" },
{ url = "https://files.pythonhosted.org/packages/c5/90/62d8302883c44308c477e222c3daf7c813a34c8e96985882fbd53d964352/pandas-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:67b3b64c11910cfa29f4e94a14d3bff9ee693b6fc76055e7cad549cee0aec5fa", size = 10331071, upload-time = "2026-05-11T18:52:58.838Z" },
{ url = "https://files.pythonhosted.org/packages/7f/ae/6a6493c783a101f165e4356953ba3c74d6f77f0042fa7d753da9dfbb640c/pandas-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:39436b377d56d2a2e52d0395bdbee171f01068e99af5250509aceeb929f765c7", size = 9875690, upload-time = "2026-05-11T18:53:01.431Z" },
{ url = "https://files.pythonhosted.org/packages/62/7c/5df8e9f56c69a2769fbe9382a5ef8f2658c007e376434e1e2cbb57ad895f/pandas-3.0.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4be06d68f9ddcfc645b87534911da79a8fbffc7573c80e0edcf42a5020624d8", size = 10381634, upload-time = "2026-05-11T18:53:04.393Z" },
{ url = "https://files.pythonhosted.org/packages/99/68/1237369725aa617bb358263d535803e3053fdbc593513ec5ed9c9896b5b6/pandas-3.0.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a4eeb6830daf35a71cc09649bd823e2b542dac246cdee9614c6e4bd65028cd6a", size = 10891243, upload-time = "2026-05-11T18:53:07.643Z" },
{ url = "https://files.pythonhosted.org/packages/25/93/77d108e8af7222b4a503ebde0e30215b1c2e4f8e53a526431890f22d5586/pandas-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1928e07221f82db493cd4af1e23c1bfca524a19a4699887975bff68f49a72bfb", size = 11388659, upload-time = "2026-05-11T18:53:10.634Z" },
{ url = "https://files.pythonhosted.org/packages/d0/bd/eff5b4399f332ac386c853f6cd2bd3fa2ca0061b9f36ecd9c4d7c4265649/pandas-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51b1fe551acb77dac643c6fda86084d8d446c10fe64b06a9cc29c4cc8540e7f2", size = 11942880, upload-time = "2026-05-11T18:53:13.536Z" },
{ url = "https://files.pythonhosted.org/packages/2c/20/559ace4200982c3887d0b86bfd0d856a2143ef8ddab63cc07934951a964c/pandas-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:a82d532a3351d435432cd913edbccaf8b8e01d4dd0e5ced5a8d2e8ecd94c7e44", size = 9757091, upload-time = "2026-05-11T18:53:16.306Z" },
{ url = "https://files.pythonhosted.org/packages/3a/66/69055a09fe200f29f922a3eeec4804611900b95f52d932ece3393c3c0c19/pandas-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:275c14e0fce14a2ec20eee474aecd305478ea3c1e6f6a9d8fe219a165542717e", size = 9057282, upload-time = "2026-05-11T18:53:18.768Z" },
{ url = "https://files.pythonhosted.org/packages/57/0e/efe801b0e6811e8e650cd21b7f2608e30f08a7067e2bf6e8752b0d56ee3c/pandas-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:46997386d528eb40376ecd6b033cf4a8a1e5282580f68f43de875b78cba2199d", size = 10767016, upload-time = "2026-05-11T18:53:21.227Z" },
{ url = "https://files.pythonhosted.org/packages/ea/dc/eb55135a1d5f0f0519f28da1f609a206d2cad1f9c35c32d51e38dd7261ae/pandas-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:261e308dfb22448384b7580cf719d2f998fe2966c92893c3e77d14008af1f066", size = 10420210, upload-time = "2026-05-11T18:53:23.982Z" },
{ url = "https://files.pythonhosted.org/packages/c6/3e/b1d5d955ce33ffecb407465a60bc32769d74fcf68224b7ae67ae11d4dea4/pandas-3.0.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dd1a5d1def6a46002e964510bdc67c368aa0951df5d1d9f8365336f5a1f490cd", size = 10336126, upload-time = "2026-05-11T18:53:26.731Z" },
{ url = "https://files.pythonhosted.org/packages/f5/76/a01261711ab60a22d71b862f0de20e4c504bf80457270ad8cb42110f6abc/pandas-3.0.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d72828c20c6d6e83e1e22a6a3b47b326b71664112fa9705dcbccfd7a39b62085", size = 10728051, upload-time = "2026-05-11T18:53:29.125Z" },
{ url = "https://files.pythonhosted.org/packages/e9/21/ea191195e587b18cf682e97f433f81b2d0fbe341380e80a3e0d6e4403c8e/pandas-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d26cbe1fcfc12e8fd900e2454163e466b2d3af84f7c75481df7683ffc073d870", size = 11350796, upload-time = "2026-05-11T18:53:32.056Z" },
{ url = "https://files.pythonhosted.org/packages/64/69/f0eaaf54939f0e8c6768fd06be9af2cef9b36048b96dfb9e1b2c685a807e/pandas-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e91cec1879ada0624fc3dc9953c5cbd60208e59c0db28f540c5d6d47502422f", size = 11799741, upload-time = "2026-05-11T18:53:34.985Z" },
{ url = "https://files.pythonhosted.org/packages/45/a4/865e0e510cae5fc2194de4db28be638952de942571ba9125934fd9c01d47/pandas-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:08d789b41f87e0905880e293cedf6197ce71fe67cc081358b1e148a491b9bd13", size = 10499958, upload-time = "2026-05-11T18:53:37.857Z" },
{ url = "https://files.pythonhosted.org/packages/86/54/effdcc3c0ff7a08037889200e148ebe94c16c4f653be078c7b3675955df1/pandas-3.0.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3650109c0f22879df8bd6179ab9ee3d7f1d1d4e7e0094a3f0032d9f51e2e64ac", size = 10336065, upload-time = "2026-05-11T18:53:41.099Z" },
{ url = "https://files.pythonhosted.org/packages/68/10/bf2d6738d72748b961a3751ab89522d58c54efc36a8e1a12161216cd45cf/pandas-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:bab900348131a7db1f69a7309ef141fd5680f1487094193bcbbb61791573bf8f", size = 9926101, upload-time = "2026-05-11T18:53:43.515Z" },
{ url = "https://files.pythonhosted.org/packages/ae/e9/e35cf11c8a136e757b956f5f0efdcaa50aecde85ea055f1898dfc68262f3/pandas-3.0.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba7e08b9ac1d54569cd1e256e3668975ed624d6826f7b68df0342b012007bddb", size = 10457553, upload-time = "2026-05-11T18:53:46.394Z" },
{ url = "https://files.pythonhosted.org/packages/58/3b/1cdec6772bdbaf7b25dab360c59f03cadf05492dd724c6540af905389b07/pandas-3.0.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d71c63ae4ebdbf70209742096f1fc46a83a0613c99d4b23766cced9ff8cd62a", size = 10914065, upload-time = "2026-05-11T18:53:49.134Z" },
{ url = "https://files.pythonhosted.org/packages/c4/c2/1ef644445fcd72e3627bceec77e3560636f87ddce4ed841afe76b83b5bf9/pandas-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e3a2ec42c98ffa2565a67e08e218d06d72576d758d90facb7c00805194d8f360", size = 11459188, upload-time = "2026-05-11T18:53:52.527Z" },
{ url = "https://files.pythonhosted.org/packages/7e/49/4d8d4f42cbc9c4adc7a1870f269c02cbd6cd40d059622c06fb298addcbad/pandas-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:335f62418ed562cfc3c49e9e196375c28b729dcef8543abf4f9438e381bf3c76", size = 11982966, upload-time = "2026-05-11T18:53:55.043Z" },
{ url = "https://files.pythonhosted.org/packages/38/55/792619469bab9882d8bbd5865d45a72f6478762d04a9af4bf0d08c503e95/pandas-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:3c20a521bbb85902f79f7270c80a59e1b5452d96d170c034f207181870f97ac5", size = 9876755, upload-time = "2026-05-11T18:53:58.067Z" },
{ url = "https://files.pythonhosted.org/packages/2a/af/33c469653b0ba03b50c3a98192d4c07f0c75c66b263ceb097fce0ee97d31/pandas-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:a2d2dff8a04f3917b55ab3910c32990f8ddf7eceba114947838cefa976a68977", size = 9198658, upload-time = "2026-05-11T18:54:00.733Z" },
{ url = "https://files.pythonhosted.org/packages/a2/fa/b8c257bd76b8bd060c3a9151c1fca05e9b9c5e3af5d0f549c0356f6d143d/pandas-3.0.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:0d589105b3c14645af1738ff279b2995102d8f7a03b0a66dc8d95550eb513e04", size = 10787242, upload-time = "2026-05-11T18:54:03.564Z" },
{ url = "https://files.pythonhosted.org/packages/54/eb/f19206ffb0bf1919002969aa448b4702c6594845156a6f8050674855aac3/pandas-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:13fc1e853d9e04743d11ba75a985ccbc2a317fe07d8af61e445a6fd24dacd6a6", size = 10436369, upload-time = "2026-05-11T18:54:06.311Z" },
{ url = "https://files.pythonhosted.org/packages/fd/24/c7c39fb4fe22b71a0c2d78bf0c585c600092d85f94f086d2b3b2f6ca27e2/pandas-3.0.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:819959dab7bbd0049c15623fbac4e29a191b9528160a61fb1032242d8ced2d9c", size = 10358306, upload-time = "2026-05-11T18:54:09.085Z" },
{ url = "https://files.pythonhosted.org/packages/16/ec/dd2a9eb7fa1204df88c0864164e35b228ac581062ac612ba0a67fd812e4c/pandas-3.0.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:60ae316d3fd75d1858d450d0db0103ea2be3e7d4a95ec2f064f7e2ae63f7b028", size = 10758394, upload-time = "2026-05-11T18:54:11.956Z" },
{ url = "https://files.pythonhosted.org/packages/95/6e/00c61ea8e85b4f6d8d35e11852a1a4998fc7fafc91c6a602d1cc9c972d64/pandas-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bd3a518890b400d32f9023722dc9a9a5c969f00b415419a3c06c043f09bb5d7d", size = 11375717, upload-time = "2026-05-11T18:54:14.539Z" },
{ url = "https://files.pythonhosted.org/packages/31/89/8fc1c268969fac43688d65fd92e67df24bd128d53cb4d2eee534cd307399/pandas-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9c39be2d709d01fa972a0cabc522389fceca4f3969332ba25a7d6c5802cf976a", size = 11828897, upload-time = "2026-05-11T18:54:17.146Z" },
{ url = "https://files.pythonhosted.org/packages/56/3b/e7d20dea247a3e6dc0bd8a6953854afbedc03951def4e7371e05e7263e25/pandas-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4db8c527972a821cf5286b40ccc57642a39bc62e62022b42f99f8a67fca8c3a1", size = 10900855, upload-time = "2026-05-11T18:54:19.72Z" },
{ url = "https://files.pythonhosted.org/packages/0f/54/68a0978d1ef8502b8492099beaa6e7a0c1b32e3b5d4f677f5810cb08711c/pandas-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b2c95f8bfc1ee412bf482605d7bfd30c12d1d26bd59fdd91efeef1d4718decb1", size = 9466464, upload-time = "2026-05-11T18:54:22.754Z" },
]
[[package]]
name = "peewee"
version = "4.2.6"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/2b/6d/45b139fba589e185dcee447414c2e0efaebb0a247c06329fdc9bd84ba4aa/peewee-4.2.6.tar.gz", hash = "sha256:f40655c64a62eaa447af228e4b84a5e80d3c812d2de34c7b9c621a3ef0c6555c", size = 779493, upload-time = "2026-07-17T18:11:21.3Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/c0/63/26ec789e68e994d64ed957dd6ee5a08bb78c2f401c40e46fc142669cd8b0/peewee-4.2.6-py3-none-any.whl", hash = "sha256:b54c0f6e09c987465f8268bb2b4c1cba2e1b2788fcc0974c8e2233af1fd5af8f", size = 173774, upload-time = "2026-07-17T18:11:19.787Z" },
]
[[package]]
name = "platformdirs"
version = "4.10.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/52/cd/4f25b2f95b23f5d2c9c1fe43e49841bff5800562149b2666afc09309aa8f/platformdirs-4.10.1.tar.gz", hash = "sha256:ceab4084426fe6319ce18e86deada8ab1b7487c7aee7040c55e277c9ae793695", size = 31678, upload-time = "2026-07-18T03:53:43.808Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/ec/73/6fd0bb9ce84138c3857f12e9de63bc901852975a092d545f18087a204aa2/platformdirs-4.10.1-py3-none-any.whl", hash = "sha256:0e4eff26be2d75293977f7cddc153fd9b8eaa7fb0c7b64ffe4076cb443117443", size = 22906, upload-time = "2026-07-18T03:53:42.576Z" },
]
[[package]]
name = "procrastinate"
version = "3.8.1"
@@ -694,6 +1000,21 @@ django = [
{ name = "django" },
]
[[package]]
name = "protobuf"
version = "7.35.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/da/01/9ef0afd7999eb9badb3a768b4aedd78c86d4c65cfaf1958ab276199e76b4/protobuf-7.35.1.tar.gz", hash = "sha256:ce115a26fe0c39a2c29973d914d327e516a6455464489fe3cd1e51a1b354f81a", size = 458717, upload-time = "2026-06-11T21:55:40.257Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/10/03/8aeeb7458d22546bf64b5250ca1daeb5ff757d900e8e4a7476c6f0db843e/protobuf-7.35.1-cp310-abi3-macosx_10_9_universal2.whl", hash = "sha256:24f857477359a85c0c235261b8ba905fd51b2562f4a64ca1df5473f29850cbf6", size = 433226, upload-time = "2026-06-11T21:55:31.719Z" },
{ url = "https://files.pythonhosted.org/packages/37/4b/dfb89eb0e652a1ff073c39a59fb5e3a83cfe9b57a2c83fa6d78270101767/protobuf-7.35.1-cp310-abi3-manylinux2014_aarch64.whl", hash = "sha256:11d6b0ec246892d85215b0a13ca6e0233cf5284b68f0ac02646427f4ff88a799", size = 328847, upload-time = "2026-06-11T21:55:34.035Z" },
{ url = "https://files.pythonhosted.org/packages/0f/58/dc12f2cd484951524af6e3382c785869b9b3fb5e52ee95ae23add53ee8f9/protobuf-7.35.1-cp310-abi3-manylinux2014_s390x.whl", hash = "sha256:b73f9489a4b8b1c9cb1f8ed951c736392592edb24b9d6819f36d2e10b171d5b4", size = 344030, upload-time = "2026-06-11T21:55:34.941Z" },
{ url = "https://files.pythonhosted.org/packages/e4/be/5b3cfe508bfab6761414ff944e3366eb13be4fd71efcd69450f89ba39f43/protobuf-7.35.1-cp310-abi3-manylinux2014_x86_64.whl", hash = "sha256:74758715c53d7158fb76caf4f0cfdacc5329a4b1bb994f865d6cf302d413a1c4", size = 327130, upload-time = "2026-06-11T21:55:35.921Z" },
{ url = "https://files.pythonhosted.org/packages/d8/bc/6d6c7ba8709c85f8f2c390b2b118d6fb08a783676a572271851bf45a7d22/protobuf-7.35.1-cp310-abi3-win32.whl", hash = "sha256:353652e4efd0bca5b5fc2656abf8307ef351f0cf938c9eba09f0e09c20a25c30", size = 428945, upload-time = "2026-06-11T21:55:37.034Z" },
{ url = "https://files.pythonhosted.org/packages/0a/19/8d0cb6f20a1ef7b18f1c8986ad5783f22f84cce39c6ce9a6e645ea55192e/protobuf-7.35.1-cp310-abi3-win_amd64.whl", hash = "sha256:230a75ddfc2de4806e56696ce9640c1cdfdb6543b7cfce98d42a4c0a0e7bdb87", size = 439996, upload-time = "2026-06-11T21:55:38.123Z" },
{ url = "https://files.pythonhosted.org/packages/19/c7/5f7c636ec43e0c545e28d1f1db71990108306f7bdcb89f069ba97e428e7f/protobuf-7.35.1-py3-none-any.whl", hash = "sha256:4bc97768d8fe4ad6743c8a19403e314511ed9f6d13205b687e52421c023ac1b9", size = 171659, upload-time = "2026-06-11T21:55:39.155Z" },
]
[[package]]
name = "psycopg"
version = "3.3.4"
@@ -904,6 +1225,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/4b/2d/69abac8f838090bbecd5df894befb2c2619e7996a98ddb949db9f3b93225/pydantic_core-2.46.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:d51026d73fcfd93610abc7b27789c26b313920fcfb20e27462d74a7f8b06e983", size = 2193071, upload-time = "2026-05-06T13:38:08.682Z" },
]
[[package]]
name = "pygments"
version = "2.20.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" },
]
[[package]]
name = "pyjwt"
version = "2.13.0"
@@ -1023,6 +1353,19 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" },
]
[[package]]
name = "rich"
version = "15.0.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "markdown-it-py" },
{ name = "pygments" },
]
sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" },
]
[[package]]
name = "rpds-py"
version = "2026.5.1"
@@ -1178,6 +1521,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" },
]
[[package]]
name = "soupsieve"
version = "2.8.4"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/47/2c/0a5f6f8ee0d5589e48c7640213ed5175d52cf540a06725b628cc1a45d6ce/soupsieve-2.8.4.tar.gz", hash = "sha256:e121fd02e975c695e4e9e8774a5ee35d74714b59307868dcc5319ad2d9e3328e", size = 121110, upload-time = "2026-05-24T13:55:57.154Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/5e/f5/0c41cb68dcae6b7de4fac4188a3a9589e21fb31df21ea3a2e888db95e6c9/soupsieve-2.8.4-py3-none-any.whl", hash = "sha256:e7e6b0769c8f51ed59acab6e994b00621096cfb1c640a7509295987388fbaf65", size = 37304, upload-time = "2026-05-24T13:55:55.406Z" },
]
[[package]]
name = "sqlparse"
version = "0.5.5"
@@ -1189,11 +1541,11 @@ wheels = [
[[package]]
name = "tablib"
version = "3.9.0"
version = "3.10.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/11/00/416d2ba54d7d58a7f7c61bf62dfeb48fd553cf49614daf83312f2d2c156e/tablib-3.9.0.tar.gz", hash = "sha256:1b6abd8edb0f35601e04c6161d79660fdcde4abb4a54f66cc9f9054bd55d5fe2", size = 125565, upload-time = "2025-10-15T18:21:56.263Z" }
sdist = { url = "https://files.pythonhosted.org/packages/96/b9/59d9c8b9c34642e7a718e8a1a7a91af3eb9b48f79bac794263702d41519c/tablib-3.10.0.tar.gz", hash = "sha256:781cfa9a42de8f33c52aff857fd0a04e483de4fd1c53eaaa9a6aeac62bad11de", size = 127128, upload-time = "2026-07-31T17:30:15.577Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/66/6b/32e51d847148b299088fc42d3d896845fd09c5247190133ea69dbe71ba51/tablib-3.9.0-py3-none-any.whl", hash = "sha256:eda17cd0d4dda614efc0e710227654c60ddbeb1ca92cdcfc5c3bd1fc5f5a6e4a", size = 49580, upload-time = "2025-10-15T18:21:44.185Z" },
{ url = "https://files.pythonhosted.org/packages/fc/0f/3ae17545ff976687f679ed3a101df7017135ee04769e858a4ccea0cc3f3e/tablib-3.10.0-py3-none-any.whl", hash = "sha256:5721bf3a52d491f8f843628a3a3200db164f6ad9e92fb6eaa64dc3f945f30ad9", size = 50170, upload-time = "2026-07-31T17:30:04.925Z" },
]
[[package]]
@@ -1348,6 +1700,105 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/e9/f9/45d021e4a5cc7b9dd567f7cbb06d3b75f751a690063fb6cc7ec60f4e46b7/watchfiles-1.2.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a88fc94e647bc4eec523f1caa540258eb71d14278b9daf72fa1e2658a98df0f0", size = 457771, upload-time = "2026-05-18T04:30:56.331Z" },
]
[[package]]
name = "websockets"
version = "16.1.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/21/f7/bc3a25c5ec26ce62ce487690becc2f3710bbc7b33338f005ad390db0b986/websockets-16.1.1.tar.gz", hash = "sha256:db234eda965dcce15df96bb9709f587cd87d4d52aaf0e80e2f34ec04c7670c57", size = 182204, upload-time = "2026-07-17T22:51:05.858Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/2b/03/47debfe28e9d6d354be5d777b67fd44c359b9eb299a5d103500bd7cc3e37/websockets-16.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d0fcf657e9f13ff4b177960ab2200237b12994232dfb6df16f1cfe1d4339f93c", size = 179566, upload-time = "2026-07-17T22:48:49.596Z" },
{ url = "https://files.pythonhosted.org/packages/72/93/31efa1ed78c17e5cfc229fd449e3966e1b9cc15753204cd585cc8dd01f4a/websockets-16.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b852788aa51764e2d8e4cf5493d559326bcae5e38d16ba25ffa322b034df272a", size = 177250, upload-time = "2026-07-17T22:48:50.942Z" },
{ url = "https://files.pythonhosted.org/packages/01/4a/542378ab3972b0c1cf1df3df3eff9591cea0d30c58c3aa3c4ddbc244e787/websockets-16.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1427fb4cf0d72f66333e2cacc3ff5f575bf2d7008166ce991a4a470b21d51a22", size = 177528, upload-time = "2026-07-17T22:48:52.59Z" },
{ url = "https://files.pythonhosted.org/packages/33/d9/162321f63c7eed558e9e1798ed7a1e34a4f6dab51f35419e4ed7a4907979/websockets-16.1.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:da4ca1a9d72f9030b3146b8d7022719a9f3d478f61efe6f7dd51d243f61c51b2", size = 186859, upload-time = "2026-07-17T22:48:53.915Z" },
{ url = "https://files.pythonhosted.org/packages/de/09/87df740f7430ce564bd52402e9c9458d4d0459cc7d2ee29e530c8204851b/websockets-16.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:86d7f0f8bdb25d2c632b72527325e4776430fd5bc61b9118de4e2b8ddb5f5b01", size = 188095, upload-time = "2026-07-17T22:48:55.384Z" },
{ url = "https://files.pythonhosted.org/packages/d2/12/3d2703af7cc095f3c81904c92208cc1ae79affbc67376944b50ee9301f73/websockets-16.1.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7dfcad78ea1492ee3a9ec765cb7f51bbc17d477107aaf6b22abf7b2558d1c5a0", size = 191385, upload-time = "2026-07-17T22:48:56.742Z" },
{ url = "https://files.pythonhosted.org/packages/1d/69/986aa0234a964a00f5149cfc46e136e96c8faad1c783474550f40d31aef4/websockets-16.1.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fb9a0a6dc3d1b3986cb88091b6899f0396651e0f74e2c9766ab8d6ffc3842e29", size = 188653, upload-time = "2026-07-17T22:48:58.134Z" },
{ url = "https://files.pythonhosted.org/packages/35/6b/10f9d03e3970a69ba67bd3b46b87a929b586d0300fadbfe14f57c1f85490/websockets-16.1.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29dfa8114c4a620c69591c5973860f768eac29d3fd6904f37f34266cb219c512", size = 187426, upload-time = "2026-07-17T22:48:59.515Z" },
{ url = "https://files.pythonhosted.org/packages/56/db/bb3aad62bf63d8bb3f0634b2eabffcfb3677a34bd19492110ff6869cf703/websockets-16.1.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6ff9417c0ada4d0f7d212f928303e5579bdf3ace4c802fa4afabb30995da58c3", size = 184882, upload-time = "2026-07-17T22:49:00.916Z" },
{ url = "https://files.pythonhosted.org/packages/6c/4c/c09a2ea9bfbeccce52fdc383e5f28af4bc8843338aabac28c81489af6120/websockets-16.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fe0b50da2d84535fb4f7b4bfa951280f97ce3d558a0443b541166d609e67b57", size = 187584, upload-time = "2026-07-17T22:49:02.283Z" },
{ url = "https://files.pythonhosted.org/packages/c7/8b/31bb4eb4d9eaacf1fdd39d115772a8aeaedfc19b5dc262e57ffbc8a9d42c/websockets-16.1.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:34420aaa64440ebd51ac72ca8a45ef4626429438c9b02e633ae412ed43f925d3", size = 186174, upload-time = "2026-07-17T22:49:03.973Z" },
{ url = "https://files.pythonhosted.org/packages/2f/e4/dc02d725610a1ad49e193ef91a548194d71bdc6cdf27da83067dd1f73995/websockets-16.1.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a6a61aff018180c9c50b7b0da33bfd29d378af3497429c95006c589a23a11648", size = 187986, upload-time = "2026-07-17T22:49:05.553Z" },
{ url = "https://files.pythonhosted.org/packages/e0/73/30ed84c8bfd14c73d4af29d5ed9323c3073b48e0b7b23b67070f4e7fd59b/websockets-16.1.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:04fd29a0e2fe9414a95b00e92c67ae51bf900c50c0f8a4b2dafdad621f49ea1d", size = 185565, upload-time = "2026-07-17T22:49:06.959Z" },
{ url = "https://files.pythonhosted.org/packages/7d/d3/4be8d4959f51e31b4f8fc0ece12b45bd3b6c0d15ea23b9990d9c11fc805f/websockets-16.1.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5c31aa7e39ee3e8a358573257f1c0bb5c52430d1b637030dd9c8cc2c282926be", size = 186598, upload-time = "2026-07-17T22:49:08.293Z" },
{ url = "https://files.pythonhosted.org/packages/26/fa/abb38597a52d84ed9cfacadc7a0c6f2db282c0ab23cdf72b58a666a21227/websockets-16.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d14bfb217eb4701e850f1525c9d29d79c44794cdf1c299ead25f39f8c78dea81", size = 186834, upload-time = "2026-07-17T22:49:09.766Z" },
{ url = "https://files.pythonhosted.org/packages/59/80/1119ad08a228b90c4eb77fbe48df7836731a605f5f881ba701ca826a4a65/websockets-16.1.1-cp311-cp311-win32.whl", hash = "sha256:2e28e602bb13da44fbe518c1781a88e3b9d4c3d48d02c9bad83e546164336f57", size = 179940, upload-time = "2026-07-17T22:49:11.196Z" },
{ url = "https://files.pythonhosted.org/packages/71/b2/e511c1c6f64a95c2f3fc54bffda0e14eaa7e9442be605c29270f7589b918/websockets-16.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:7421fad442de870a8cbf2287d1cad7e706ece0dbfeba5e911df132cbdc1cb56a", size = 180239, upload-time = "2026-07-17T22:49:12.519Z" },
{ url = "https://files.pythonhosted.org/packages/17/9d/681cda21c9eee743203a6cb79b9d3d05adad9aa60ec660c6c9bf4dd619ca/websockets-16.1.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:cc97814dfb786a83b6e2dc2e79351e1b83e6d715647d6887fcabd83026417a00", size = 179600, upload-time = "2026-07-17T22:49:13.92Z" },
{ url = "https://files.pythonhosted.org/packages/fb/8d/6195a88b45e8d2a8f745fc2046e36f885a3c9763e6767d2c46229bf9510c/websockets-16.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e047dc87ef7ca50f4d309bf775ad4a71711c58556d75d7bd0604b2317f43e94b", size = 177272, upload-time = "2026-07-17T22:49:15.453Z" },
{ url = "https://files.pythonhosted.org/packages/73/e3/fe2d498c64dea0095c9a9f9a351af4cd6eef31b618395582bc1f38ba45ff/websockets-16.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:01fbdcbac298efe19360b94bc0039c8f746f0220ba570f327577bfee81059175", size = 177542, upload-time = "2026-07-17T22:49:16.875Z" },
{ url = "https://files.pythonhosted.org/packages/fe/ed/f1831681fce0e3242346e5458486003c5f124ed69e5e0b847fd029db4973/websockets-16.1.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0f62863e8a00a6d33c3d6566ec0b89f23787b747ffe0c3bc71ec0e76b82c94b1", size = 187137, upload-time = "2026-07-17T22:49:18.323Z" },
{ url = "https://files.pythonhosted.org/packages/6f/79/4ff9dcc1bb46f6b4c536936dde1fd60f9b564f3304307274db97f4c9496d/websockets-16.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8087e82f842609734c9b5a1330464f8e94e346ba0e18c832c08bafa4b0d63c15", size = 188374, upload-time = "2026-07-17T22:49:19.65Z" },
{ url = "https://files.pythonhosted.org/packages/62/c3/5c49b6efb36cab733d23773f6de575e1dba65736ead17d5d2b2a1daef779/websockets-16.1.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2bb5d041a8307d2e18782e7ce777f6fdb1e8c2f5d09291484b18c294b789d9aa", size = 191155, upload-time = "2026-07-17T22:49:21.331Z" },
{ url = "https://files.pythonhosted.org/packages/6e/f6/56ccceda3a4838d18f1d40821480da4775397e8b1eecf4031e20c50e2e90/websockets-16.1.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1db4de4a0e95673f7545d393c49eeb0c2f18ac1ef93073218c79d5cdb2ee75ab", size = 189011, upload-time = "2026-07-17T22:49:22.889Z" },
{ url = "https://files.pythonhosted.org/packages/86/d6/ad5286241a2bce1107e2798d3bfbd62cf79aee167bdb654f8cb1e9dbf949/websockets-16.1.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f17dbe07eb3ea7f99e4df9b7e0efefe80fbf30d37a8cc4d561a0aed310bc8847", size = 187766, upload-time = "2026-07-17T22:49:24.339Z" },
{ url = "https://files.pythonhosted.org/packages/bc/67/d65c970b7e347fdca69479beb7811c2060529956730a7a4e3ae7c66b0e31/websockets-16.1.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4b57693728576d84ede0a77987ab16881b783d2cd9f1dc180a8fbbc3f79c4428", size = 185173, upload-time = "2026-07-17T22:49:25.743Z" },
{ url = "https://files.pythonhosted.org/packages/1d/5b/14af3cd4ee69d8ea9baca58f3dc3cfb1ba78332a347fd478cb096549d60e/websockets-16.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2a636ff1e7a5c4edf71ef0e79adae7f25dba93b4fcbe3dc958733477ffeb0eaf", size = 187809, upload-time = "2026-07-17T22:49:27.147Z" },
{ url = "https://files.pythonhosted.org/packages/7b/11/be301710d70de97e3e7b3586e6d492c9c06d6a61bf1c2202c36cf0c75607/websockets-16.1.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d6bec75c290fe484a8ba4cacdf838501e17c06ecfbbf31eede81a9e431bd7751", size = 186412, upload-time = "2026-07-17T22:49:28.611Z" },
{ url = "https://files.pythonhosted.org/packages/db/07/fe1435bf6fe738a3d3b54dbe0c18dabf12cba4d909ac8b58b539ce27c1f4/websockets-16.1.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:54509b8e92fee4453e152b7558ddef37ce9705a044922f2095a6105e3f80c96f", size = 188290, upload-time = "2026-07-17T22:49:29.965Z" },
{ url = "https://files.pythonhosted.org/packages/8a/0a/81f394aff8efcbb01208c1ced77df0a3c7fcce584a88c7273663697946c2/websockets-16.1.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:f0aa4aad3b1b69ad3fd85a0fd0952ec64331c762bd77ec51cc814170873890b2", size = 185844, upload-time = "2026-07-17T22:49:31.447Z" },
{ url = "https://files.pythonhosted.org/packages/39/5c/dd485b995473f415510251fe9bd708f2d24458f439fce958daf8d66dc7c6/websockets-16.1.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:42290eb6db4ccaca7012656738214f8514082fb6fa40cdeb61bb9a471b52e383", size = 186823, upload-time = "2026-07-17T22:49:33.104Z" },
{ url = "https://files.pythonhosted.org/packages/9d/0b/f78de76ff446f1e66af12b43c48a35f31744de93cfdec2f4ea67d5d7bbf1/websockets-16.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:53260c8930da5771cec89439bff99c20c8cb03ddb9588b980697355a83cd4bd3", size = 187102, upload-time = "2026-07-17T22:49:34.616Z" },
{ url = "https://files.pythonhosted.org/packages/37/a1/4cf892007778eaf84ad162bfc98046e0ed89b63ac55949e3236626b2a23f/websockets-16.1.1-cp312-cp312-win32.whl", hash = "sha256:1d27fa8462ad6a1cb36206a3d0640b2333340def181fae11ed7f9adeaa5c0747", size = 179943, upload-time = "2026-07-17T22:49:36.213Z" },
{ url = "https://files.pythonhosted.org/packages/d9/de/6abe251d28c3a3f217096575400b27750b18e0b1d2fff3a2a239960fea07/websockets-16.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:b436f6ec4fc3a6b4237c84d3f83170ed2b40bb584222f0ac47a0c8a5921980c7", size = 180243, upload-time = "2026-07-17T22:49:37.626Z" },
{ url = "https://files.pythonhosted.org/packages/ce/fd/6ec6c6d2850aea25b1b2aa9901a016980bb87d01e89b3eb00470b1b5d471/websockets-16.1.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ab59169ace05dcb49a1d4118f0bde139557adf45091bd85747e36bf5de984dd1", size = 179587, upload-time = "2026-07-17T22:49:38.959Z" },
{ url = "https://files.pythonhosted.org/packages/5f/d8/1d299d2dd34087db39831a34cc645ef8a6f89d78efada6983093513cd81c/websockets-16.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5e3b7d601f6f84156b08cc4a5e541c2b50ad7b36cfc302b657a12477c904a5df", size = 177272, upload-time = "2026-07-17T22:49:40.293Z" },
{ url = "https://files.pythonhosted.org/packages/3d/86/0a70d3ae2f0f2256bb41302d9804dbca65d4360281e7feb3e1f94102ac46/websockets-16.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cd2ca96a082a36964aca83e992f72abeb61b7306c1a6cba4c7d06a7b93750cac", size = 177530, upload-time = "2026-07-17T22:49:41.786Z" },
{ url = "https://files.pythonhosted.org/packages/b5/c2/c676c69444d9db448b3f0a55a98dcc534affce0bce961d9d2f0b8499b10a/websockets-16.1.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f5d497865f05bb222cab7016c6034542e84e5f29f49c6fd3f4939cda7197b5b8", size = 187197, upload-time = "2026-07-17T22:49:43.658Z" },
{ url = "https://files.pythonhosted.org/packages/0b/13/88137fbaf726ebe29d62c1117fa11fa2bbb6209dc79d4ad738efbe36a2aa/websockets-16.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bae954c382e013d5ea5b190d2830526bfa45ad121c326da0049b8c769f185db6", size = 188433, upload-time = "2026-07-17T22:49:45.147Z" },
{ url = "https://files.pythonhosted.org/packages/01/6d/46c2f2ce6751cb26f39293e1ecbf8544cb01321397cd476c2756b98c216d/websockets-16.1.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e09f753a169951eb4f28c2c774f71069304f66e7277e0f5a2892423599cfa854", size = 189868, upload-time = "2026-07-17T22:49:46.581Z" },
{ url = "https://files.pythonhosted.org/packages/29/2b/170a9e8097636cfde4dc3c592b6e00b18a44a2f5407606d96ca542dd5838/websockets-16.1.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:024193f8551a2b0eafbdd160911012c4e6c228c28430c84433253299a9e42d6a", size = 189059, upload-time = "2026-07-17T22:49:47.972Z" },
{ url = "https://files.pythonhosted.org/packages/a7/48/f0d4ebc9ab4b473b8861b9e20fdb663d515d42f7befdf62cdb60fee7a1ec/websockets-16.1.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:aabe464bfd13bd25f4821faf111da6fefdc389f870265a53105580e45b0a2e49", size = 187814, upload-time = "2026-07-17T22:49:49.344Z" },
{ url = "https://files.pythonhosted.org/packages/d5/ba/39a41d3ae8e72696a9492581900611c5a91e2b07563b0bcd2523adea9854/websockets-16.1.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a28fcbc9b6baf54a2e23f8655f308e4ccc6afdd7266f8fe7954f320dcda0f785", size = 185229, upload-time = "2026-07-17T22:49:50.787Z" },
{ url = "https://files.pythonhosted.org/packages/3c/36/ac15b604f850d1907f0a85ed721cefe47cd45034b3620069b829746cccbe/websockets-16.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:79eace538c6a97e96d0d03d4f9d314f9677f5ed85a8a984992ffd90b13cb8a56", size = 187874, upload-time = "2026-07-17T22:49:52.228Z" },
{ url = "https://files.pythonhosted.org/packages/a8/f3/3fbd5d71d59299c3770faa5884d4f45070236ca5a35ab3a61830812c409a/websockets-16.1.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:496af849a472b531f758dbd4d61338f5000538cb1a7b3d20d9d32a264517f509", size = 186469, upload-time = "2026-07-17T22:49:53.776Z" },
{ url = "https://files.pythonhosted.org/packages/b4/fc/dd90349bba58af2a53ef2ddd9c32716c81eb6d59a0687939fff561860878/websockets-16.1.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5283810d2646741a0d8da2aa733d6aefa0545809afccb2a5d105a26bc45125f1", size = 188347, upload-time = "2026-07-17T22:49:55.202Z" },
{ url = "https://files.pythonhosted.org/packages/4c/f3/f73ba86427682da59b78c11d77ba56d5b801c32e84afe79b274bbd6a9bb2/websockets-16.1.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:4e3b680b1e0a27457e727a0d572fd81dffa87b6dbf8b228ab57da64f7d85aead", size = 185903, upload-time = "2026-07-17T22:49:56.75Z" },
{ url = "https://files.pythonhosted.org/packages/34/7c/f95eb20e80104173b3a0a092291f89ea4047ef6e608e0a57ca06eb14eecb/websockets-16.1.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:69159730a823dde3ea8d08783e8d47ef135a6d7e8d44eb127e32b321c9db8e3e", size = 186855, upload-time = "2026-07-17T22:49:58.467Z" },
{ url = "https://files.pythonhosted.org/packages/b0/35/dd875b3e050ff232d60fa377707f890e369f74d134f1be32e8f68879747c/websockets-16.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ed5bb271084b46530ee2ddc0410537a9961152c5ccba2fc98c5276d992ccba87", size = 187140, upload-time = "2026-07-17T22:50:00.016Z" },
{ url = "https://files.pythonhosted.org/packages/e8/dc/5cbfcb41824502f6af93b8f3943a4d06c67c23c7d2e31eb18748c4a5b2a7/websockets-16.1.1-cp313-cp313-win32.whl", hash = "sha256:cfb70b4eb56cac4da0a83588f3ad50d46beb0690391082f3d4e2d488c70b68ea", size = 179928, upload-time = "2026-07-17T22:50:01.685Z" },
{ url = "https://files.pythonhosted.org/packages/b0/c1/71e5deb5b7f8f226997ab64908c184ac3105c0155ce2d486f318e5dd08a8/websockets-16.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:d9531d9cbeac99af6f038fb1bc351403531f7d634a2c2e10e2f7c854c6ed5b68", size = 180242, upload-time = "2026-07-17T22:50:03.117Z" },
{ url = "https://files.pythonhosted.org/packages/73/a2/ba78a164eeea4620df4a4df4bd2ed6017438c4655cc0f36f2c0bc0432355/websockets-16.1.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:443aefe96b7fdb132e2a70806cca1f2af49bb3f28e47abcd7c2e9dcf4d8fa1b8", size = 179635, upload-time = "2026-07-17T22:50:05.001Z" },
{ url = "https://files.pythonhosted.org/packages/b9/08/d26d7a7628cd4ac34cbbdb63ac80914ca842ed8e42938c40a53567806df3/websockets-16.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:6456ff333092d509127d75a638cb411afae8ff17f092635015d1902efec8a293", size = 177320, upload-time = "2026-07-17T22:50:06.427Z" },
{ url = "https://files.pythonhosted.org/packages/0f/45/ebec83e6269536aa5932533c67b0af5c781f3e73fdbcd68672dcf43f4f44/websockets-16.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:fce6c48559c86d1ac3632ccb1bebc7d5442fbe79bd9bb0e40379ee54be2a4051", size = 177544, upload-time = "2026-07-17T22:50:07.834Z" },
{ url = "https://files.pythonhosted.org/packages/c9/d5/abc614d2297f6c1c3e01e61260364457a47c25cc1cf6a879038902bc6aa8/websockets-16.1.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:92b820d345f7a3fc7b8163949ee92df910f290c3fc517b3d5301c78065adafe1", size = 187270, upload-time = "2026-07-17T22:50:09.275Z" },
{ url = "https://files.pythonhosted.org/packages/52/71/4c99af3b87dff1b2927981f6876607d4acb45338c665242168d3982f7758/websockets-16.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a606d9c24035242a3e256e9d5b77ed9cd6bccfcb7cf993e5ca3c0f6f68fb6a7", size = 188509, upload-time = "2026-07-17T22:50:10.722Z" },
{ url = "https://files.pythonhosted.org/packages/9b/b4/5c8ca14b0df7eb84ed0524165c5359150210140817a3312aee57bf62a1cf/websockets-16.1.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:414e596c75f74e0994084694189d7dc9229fb278e33064d6784b73ffbba3ca31", size = 189882, upload-time = "2026-07-17T22:50:12.293Z" },
{ url = "https://files.pythonhosted.org/packages/25/c1/bedfba9e70557129cb8083748d167bdcc01483dedf0f0df143676df05cbe/websockets-16.1.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:536676848fc5961aca9d20389951f59169508f765637a172403dc5434d722fa0", size = 189114, upload-time = "2026-07-17T22:50:13.789Z" },
{ url = "https://files.pythonhosted.org/packages/df/09/aa835b2787835aebd839114be5de51b797cb480b63ba42b26d34dfe147cb/websockets-16.1.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:97fd3a0e8b53efa41970ac1dff3d8cf0d2884cadeb4caaf95db7ad1526926ee3", size = 187861, upload-time = "2026-07-17T22:50:15.179Z" },
{ url = "https://files.pythonhosted.org/packages/20/26/f6408330694dbc9830857d9d23bc14ac4f6875127a480cfdda8d5ca21198/websockets-16.1.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7b1b19636af86a3c7995d4d028dbe376f39b4bf31541146f9c123582a6c94562", size = 185286, upload-time = "2026-07-17T22:50:16.741Z" },
{ url = "https://files.pythonhosted.org/packages/17/9a/e0675e70dd8a80762cf35bb18799d3f290a4890ffe6439bc51d222796083/websockets-16.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:41c8e77f17294c0ac18008a7309b99b34ee72247ef10b6dff4c3f8b5ac29896b", size = 187935, upload-time = "2026-07-17T22:50:18.213Z" },
{ url = "https://files.pythonhosted.org/packages/33/c1/3234cfb86afde01b81e9bddcc6e534c440975d60a13991259e833069ab3e/websockets-16.1.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:9f63bcef7f4b02b06b35fc01c93b96c43b5e88e1e8868676caacf493d5a31f3a", size = 186444, upload-time = "2026-07-17T22:50:19.67Z" },
{ url = "https://files.pythonhosted.org/packages/89/87/9c15206e1d778923d8daa9657de07aa62ea815e13448319c98458c37b281/websockets-16.1.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:dab9eb87869da2d6ed3af3f3adf28414baae6ec9d4df355ffc18889132f3436c", size = 188409, upload-time = "2026-07-17T22:50:21.28Z" },
{ url = "https://files.pythonhosted.org/packages/f2/00/cf5de5c67676de2d3eef8b2a518f168f6796595447a5b7161ba0d012915c/websockets-16.1.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:43e3a9fdd7cbf7ba6040c31fae0faf84ca1474fef777c4e37912f1540f854499", size = 185958, upload-time = "2026-07-17T22:50:22.719Z" },
{ url = "https://files.pythonhosted.org/packages/62/c0/731b6ddede2e4136912ec4cff2cffbda35af73546be4762c3d7bd3bd79af/websockets-16.1.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:056ae37939ed7e9974f364f5864e76e49182622d8f9751ac1903c0d09b013985", size = 186911, upload-time = "2026-07-17T22:50:24.108Z" },
{ url = "https://files.pythonhosted.org/packages/8c/7f/39c634472c4469a24a7c09cecddffb08fac6d0e74f73881a94ee8a40a196/websockets-16.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a0eadbbf2c30f01efa58e1f110eb6fa293261f6b0b1aa38f7f48707107690af9", size = 187204, upload-time = "2026-07-17T22:50:25.548Z" },
{ url = "https://files.pythonhosted.org/packages/26/89/9667c256c256dafcc62d21328ce7a40067da857969b68ee9af375b0aaf72/websockets-16.1.1-cp314-cp314-win32.whl", hash = "sha256:195c978b065fa40910582464f99d6b15c8b314c68e0546549a55ed83f4735328", size = 179603, upload-time = "2026-07-17T22:50:27.086Z" },
{ url = "https://files.pythonhosted.org/packages/bd/dd/1c099d6c0fc5deb6b46ccdbb6981fdb4b12c917869cb3952408409dc18db/websockets-16.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:4e8d01cc3bcae7bbf8167f944aeafefed590fae5693552bba9794a9df68371cc", size = 179948, upload-time = "2026-07-17T22:50:28.521Z" },
{ url = "https://files.pythonhosted.org/packages/35/25/9956b2d5e0529d5d23924f21bba1440d4c5c88a562e4f08550871ffa97a7/websockets-16.1.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0ffd3031ea8bda8d61762e84220186105ba3b748b3c8da2ae4f7816fac03e573", size = 179963, upload-time = "2026-07-17T22:50:29.982Z" },
{ url = "https://files.pythonhosted.org/packages/17/06/55ffc976c488b6aee9ea05761ff7c4e88e7c1fd82818c8ca7b556ad2f90c/websockets-16.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:84a2cef8deffbd9ab8ee0ea546a2a6a7030c28f44e6cdd4547dbfeb489eb8999", size = 177497, upload-time = "2026-07-17T22:50:31.396Z" },
{ url = "https://files.pythonhosted.org/packages/0c/e8/f7dac2e980bacc92bdc26cebae4ae4d50cae5380732c50980598fc0bbae4/websockets-16.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3df13f73af9b3b38ab1195eb299ecb67a4330c911c97ae04043ff74085728abe", size = 177698, upload-time = "2026-07-17T22:50:32.829Z" },
{ url = "https://files.pythonhosted.org/packages/b2/39/26762f734113e22da2b942c3aca85798e0c0405d64c256549540ff31e5a1/websockets-16.1.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:23253dd5bcae3f9aaee0a1d30967a8dbd52e5d3cff93a2e5b84df57b77d4750d", size = 187561, upload-time = "2026-07-17T22:50:34.24Z" },
{ url = "https://files.pythonhosted.org/packages/11/94/c3f330851806b9b02138b774d593478323e73c99238681b4b93efe64e02d/websockets-16.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c1c5705e314449e3308872fe084b8571ce078ee4fc55a98a769bdefe5917392", size = 188732, upload-time = "2026-07-17T22:50:36.088Z" },
{ url = "https://files.pythonhosted.org/packages/d1/f2/eb2c450f052de334ae33cf200ece6e87b0e14d186807074e4eb1cd2cdea2/websockets-16.1.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:69e52d175a0a7d1e13b4b67ad41c560b7d98e8c6f6126eb0bda496c784faf8c7", size = 190872, upload-time = "2026-07-17T22:50:38.008Z" },
{ url = "https://files.pythonhosted.org/packages/70/31/2ac8cecf3a74f7fed9132129fc3d90b3998a1554570c11a69b2a8c20332d/websockets-16.1.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1f79c89b5eb034d1722938a891916582f8f7f503f58ca22518a63c3f2cd18499", size = 189305, upload-time = "2026-07-17T22:50:39.53Z" },
{ url = "https://files.pythonhosted.org/packages/6a/cf/8ab19650d3c0d4562c92e70ab47c257c4aa5c6a713ed87fe63766b31fefc/websockets-16.1.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:39f2a024af5c345ffe8fcf1ee18c049c024c94df393bb09b044a6917c77bde43", size = 188033, upload-time = "2026-07-17T22:50:40.912Z" },
{ url = "https://files.pythonhosted.org/packages/66/d7/a49a38a6127a4acb134fb1912b215d900cc657605cff32445bf519f3acc4/websockets-16.1.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:952303a7318d4cbe1011400839bb2051c9f84fa0a35923267f5daba34b15d458", size = 185748, upload-time = "2026-07-17T22:50:42.559Z" },
{ url = "https://files.pythonhosted.org/packages/95/3e/ad1fa40388c7f2e0bb2c7930d0090b6c5498594bd1cdaec18864df3d9e97/websockets-16.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:249116b4a76063d930a46391ad56e135c286e4562a18309029fc2c73f4ed4c62", size = 188285, upload-time = "2026-07-17T22:50:43.974Z" },
{ url = "https://files.pythonhosted.org/packages/35/b8/d5db28ca264b9104f82196f92dc8843e35fd391f763d42e4ad358f5bc97e/websockets-16.1.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:61922544a0587a13fd3f53e4c0e5e606510c7b0d9d22c8444e5fae22a06b38cb", size = 186777, upload-time = "2026-07-17T22:50:45.474Z" },
{ url = "https://files.pythonhosted.org/packages/42/9c/726cb39d0cc43ae848dce4aa2acb04eecc6738b1264ec6d700bf6bcfb9f8/websockets-16.1.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:46dcaa042cd1de6c59e7d9269fa63ff7572b6df40510600b678f0826b3c7af51", size = 188682, upload-time = "2026-07-17T22:50:46.973Z" },
{ url = "https://files.pythonhosted.org/packages/be/c7/1168704de8c2dd483edabe4a22cbe4465dd8be8dd95561d214f9fe092871/websockets-16.1.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:38565aca3e01ea8734e578fb2118dade0ecb0250533f29e22b8d1a7a196cf4d0", size = 186377, upload-time = "2026-07-17T22:50:48.413Z" },
{ url = "https://files.pythonhosted.org/packages/ca/40/f9ff2d630ffce4e7dfea0b2288e1caf9ebbf9ff8a9ec9396136ce8b94935/websockets-16.1.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:42f599f4d48c7e1a3338fdaac3acd075be3b3cf02d4b274f3bf2767aedd3d217", size = 187148, upload-time = "2026-07-17T22:50:49.845Z" },
{ url = "https://files.pythonhosted.org/packages/b5/71/e177c8299f78d7cbe2d14df228643c10c70c0e86e108e092056bbcc16e46/websockets-16.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dcc04fedf83effaeb9cce98abc9469bb1b42ef85f03e01c8c1f4438ef7555737", size = 187578, upload-time = "2026-07-17T22:50:51.619Z" },
{ url = "https://files.pythonhosted.org/packages/49/b2/b6987faf330f5af5c787a2610124c2e8403d51724f9001ec4fff6311fe7a/websockets-16.1.1-cp314-cp314t-win32.whl", hash = "sha256:8483c2096363120eea8b07c06ae7304d520f686665fffd4811fad423930a65d7", size = 179729, upload-time = "2026-07-17T22:50:53.269Z" },
{ url = "https://files.pythonhosted.org/packages/a2/6e/fbac6ed878dd362fbad7d415fa4f84d38e3e33fed8cde45c64e783acf826/websockets-16.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:bcce07e23e5769375158f5efdcdafa8d5cd014b93c6683865b840ed65b96f231", size = 180072, upload-time = "2026-07-17T22:50:54.969Z" },
{ url = "https://files.pythonhosted.org/packages/e1/ed/71fea6e141590cafc40b14dc5943b0845606bee87bdb52a21b6a73eb4311/websockets-16.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:820fb8450edddae3812fd58cbc08e2bf22812cb248ecb5f06dbb82119a56e869", size = 177185, upload-time = "2026-07-17T22:50:56.665Z" },
{ url = "https://files.pythonhosted.org/packages/01/ec/00e7eeca200facf9266a83e4cbbf1bed0e67fba1d4d45031d3e5b3d81b5c/websockets-16.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:125f22dbefaf1554fea66fc83851490edb284ce4f501d37ffed2752f418332d9", size = 177459, upload-time = "2026-07-17T22:50:58.197Z" },
{ url = "https://files.pythonhosted.org/packages/75/fd/5774c4b33f7c0d8f0c51809c8b3a93456c48e3543579262cfa64eb5f522e/websockets-16.1.1-pp311-pypy311_pp73-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:30bbe120437b5648a77d3519b7024ea09530e0b5b18d3698c5a0ae536fe0cc2e", size = 178294, upload-time = "2026-07-17T22:50:59.641Z" },
{ url = "https://files.pythonhosted.org/packages/37/c3/48e2c03d2bd79bb45948841c592d24156312dd5f58cdf8f549febe652fb6/websockets-16.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b6b9dadbef0cccd9f4c4ee96b08898afa73e26803bbe0f6aeb5bb12b0074206d", size = 179190, upload-time = "2026-07-17T22:51:01.129Z" },
{ url = "https://files.pythonhosted.org/packages/2d/3f/73e511ecf2496ceac57dd4ed8388efe2bcf0769338a2dbf242c8366ae87e/websockets-16.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56cd5fc4f10a9ea8aa0804bddb7b42506cf9e136046f3b4c27de8fec9e2ecba5", size = 180330, upload-time = "2026-07-17T22:51:02.603Z" },
{ url = "https://files.pythonhosted.org/packages/be/4d/2d0d67834092e354d2b0498f014a41249a89556bc406cf86f3e1557bb463/websockets-16.1.1-py3-none-any.whl", hash = "sha256:6abbd3e82c731c8e531714466acd5d87b5e88ac3243465337ba71d68e23ae7e3", size = 173814, upload-time = "2026-07-17T22:51:04.184Z" },
]
[[package]]
name = "whitenoise"
version = "6.12.0"
@@ -1396,12 +1847,13 @@ dependencies = [
{ name = "watchfiles" },
{ name = "whitenoise", extra = ["brotli"] },
{ name = "xlrd" },
{ name = "yfinance" },
]
[package.metadata]
requires-dist = [
{ name = "crispy-bootstrap5", specifier = "==2026.3" },
{ name = "django", specifier = "~=5.2.15" },
{ name = "django", specifier = "~=5.2.16" },
{ name = "django-allauth", extras = ["socialaccount"], specifier = "~=65.18.0" },
{ name = "django-browser-reload", specifier = "==1.21.0" },
{ name = "django-cachalot", specifier = "~=2.9.0" },
@@ -1430,6 +1882,7 @@ requires-dist = [
{ name = "watchfiles", specifier = "==1.2.0" },
{ name = "whitenoise", extras = ["brotli"], specifier = "==6.12.0" },
{ name = "xlrd", specifier = "~=2.0.1" },
{ name = "yfinance", specifier = "~=1.5.1" },
]
[[package]]
@@ -1440,3 +1893,26 @@ sdist = { url = "https://files.pythonhosted.org/packages/07/5a/377161c2d3538d199
wheels = [
{ url = "https://files.pythonhosted.org/packages/1a/62/c8d562e7766786ba6587d09c5a8ba9f718ed3fa8af7f4553e8f91c36f302/xlrd-2.0.2-py2.py3-none-any.whl", hash = "sha256:ea762c3d29f4cca48d82df517b6d89fbce4db3107f9d78713e48cd321d5c9aa9", size = 96555, upload-time = "2025-06-14T08:46:37.766Z" },
]
[[package]]
name = "yfinance"
version = "1.5.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "beautifulsoup4" },
{ name = "curl-cffi" },
{ name = "multitasking" },
{ name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" },
{ name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
{ name = "pandas" },
{ name = "peewee" },
{ name = "platformdirs" },
{ name = "protobuf" },
{ name = "pytz" },
{ name = "requests" },
{ name = "websockets" },
]
sdist = { url = "https://files.pythonhosted.org/packages/75/f1/095457c99cd5fb44802e0dafbb17051e0bfdbf264bd4531556e662f57fbf/yfinance-1.5.1.tar.gz", hash = "sha256:89c48a1d45fb870f8e3066c22643c6911118ede9cead747b48925ce8e01a6940", size = 167897, upload-time = "2026-06-28T18:13:59.593Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/2b/53/ba0f45c93c45cafe010c9fe2f509c70d1ad0f96ae7b6ca93369db0c17942/yfinance-1.5.1-py2.py3-none-any.whl", hash = "sha256:a5c9cfc1b9c990f217b643e4fb92444e023cc02b2bacdea9c1fb472509fdfe22", size = 144223, upload-time = "2026-06-28T18:13:58.349Z" },
]