Commit Graph
1994 Commits
Author SHA1 Message Date
Herculino Trotta 34f6066187 docs(readme): give IMPORT_TEMP_ROOT a literal default and move path vars up
List the Docker path as the default like the other rows do, and move
both rows out from under the dev-only Vite settings.
2026-11-08 03:17:33 -03:00
eitchtee de1df9d13c chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-11-08 06:13:26 +00:00
Herculino Trotta 56c37d0012 Merge pull request #643 from officialasishkumar/fix/configurable-app-paths
fix(import): stop hardcoding the Docker image's paths
2026-11-08 03:13:03 -03:00
Herculino Trotta e0c1e4d5ff fix(import): resolve symlinks when checking the upload path
The temp root is resolve()d in settings but the file path was only
abspath()ed, so a symlink inside the temp folder could point outside it
and still pass the check. Resolve both sides the same way.

Also drop the unused /temp folder from the prod image.
2026-11-08 03:09:04 -03:00
eitchtee a42265ba49 chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-11-08 06:01:38 +00:00
Herculino Trotta 03900ab4d1 Merge pull request #642 from cahthuranag/feat/allratestoday-provider
feat(automatic-exchange-rates): add central bank tables as a provider
2026-11-08 03:01:13 -03:00
Herculino Trotta 6a335b1a63 fix(automatic-exchange-rates): skip bad AllRatesToday rows individually
A non-numeric, NaN or infinite value raised while parsing and threw away
the whole table. Each bad row is now skipped on its own.

Log a warning when a table has rows but none of a usable rate type, so a
bank with unknown types does not fail silently.
2026-11-08 02:57:07 -03:00
Herculino Trotta 43145be24d feat(automatic-exchange-rates): add provider options field
Add an Options field to exchange rate services. Providers get the raw
text, can validate it on save through clean_options, and describe it
with options_help.

The service form now shows API Key only for providers that require one,
and Options only for providers that read it, with that provider's help.

AllRatesToday reads its bank code from Options instead of API Key.
2026-11-08 02:57:07 -03:00
Herculino Trotta 38118c56d3 Merge remote-tracking branch 'origin/main' into fix/configurable-app-paths 2026-11-08 02:53:53 -03:00
Herculino Trotta a50bdb10ff Merge remote-tracking branch 'origin/main' into feat/allratestoday-provider 2026-11-08 02:53:53 -03:00
Herculino Trotta 23acf85a6b Merge pull request #645 from eitchtee/chore/worktree-dev-setup
chore(dev): run the dev stack in multiple git worktrees
2026-11-08 02:51:05 -03:00
Herculino Trotta a691da7523 chore(dev): run the dev stack in multiple git worktrees
Drop fixed container names so each worktree gets its own containers,
add docker/dev/worktree.sh to set up and tear down a worktree, and
document it under a new Development section in the README.
2026-11-08 02:48:59 -03:00
Herculino Trotta 914c665faf Merge pull request #644 from officialasishkumar/fix/datepicker-mobile-overlay
fix(datepicker): keep the mobile overlay attached after boosted navigation
2026-11-08 02:33:13 -03:00
Herculino Trotta 26d0751df6 fix(datepicker): reset a stale overlay before reattaching it
Navigating back while a mobile picker was open reattached its overlay still
active, leaving the page covered by an overlay nothing could close. Also skip
the reattach when the global container doesn't exist yet.
2026-11-08 02:25:31 -03:00
Herculino Trotta a7b8f2c3a9 Merge pull request #641 from eitchtee/dependabot/uv/oauthlib-4.0.1
build(deps): bump oauthlib from 4.0.0 to 4.0.1
2026-11-08 02:13:55 -03:00
Herculino Trotta da7a77a06d docs(readme): update demo url and space out sponsor note 2026-11-07 13:28:27 -03:00
Herculino Trotta fa120bb9f0 docs(readme): credit Simafri for demo and site hosting 2026-11-07 13:25:50 -03:00
Asish Kumar 6cf8cbf786 fix(import): stop hardcoding the Docker image's paths
Import uploads were always written to /usr/src/app/temp, presets were
read from /usr/src/app/import_presets and the caches lived in /var/tmp,
so WYGIWYH only worked from the Docker image's layout. Running it as a
systemd service with a strict sandbox, or on an immutable distro like
NixOS, needs these folders to follow the app or be configurable.

- Presets are read from IMPORT_PRESETS_ROOT, the import_presets folder
  next to the app.
- Uploads wait in IMPORT_TEMP_ROOT, the temp folder next to the app by
  default, and movable with the IMPORT_TEMP_ROOT env var. The web views,
  the API and the import service all use it.
- The file-based caches live under CACHE_ROOT, /var/tmp by default, and
  movable with the CACHE_ROOT env var.

In the Docker image the app sits in /usr/src/app, so every default
resolves to the same folder as before.

The import service checked that a file was inside the temp folder with a
plain string prefix, which also accepted sibling folders such as
/usr/src/app/temp-other. It now compares paths.

CI no longer needs to create /usr/src/app before running the tests.

Fixes #472
2026-11-07 14:56:55 +05:30
Asish Kumar 9f4ea846fd fix(datepicker): keep the mobile overlay attached after boosted navigation
On touch devices AirDatepicker opens pickers in mobile mode, which closes
them through a shared overlay rather than on blur. The library keeps that
overlay in its module scope, inside a global container appended to the
body. Boosted navigation swaps the body, so the container and overlay are
removed: the library notices the missing container and builds a new one
for the next picker, but keeps reusing the detached overlay. From then on
nothing receives the outside click, and an open picker stays on screen
over the form until the page is fully reloaded.

Create every picker through a helper that remembers the overlay and moves
it back into the current global container whenever it was left detached.

Fixes #227
2026-11-07 14:45:49 +05:30
cahthuranag 8f361e03d1 feat(automatic-exchange-rates): add central bank tables as a provider 2026-11-06 23:27:53 +00:00
dependabot[bot] b6c2e79031 build(deps): bump oauthlib from 4.0.0 to 4.0.1
Bumps [oauthlib](https://github.com/oauthlib/oauthlib) from 4.0.0 to 4.0.1.
- [Release notes](https://github.com/oauthlib/oauthlib/releases)
- [Changelog](https://github.com/oauthlib/oauthlib/blob/v4.0.1/CHANGELOG.rst)
- [Commits](https://github.com/oauthlib/oauthlib/compare/v4.0.0...v4.0.1)

---
updated-dependencies:
- dependency-name: oauthlib
  dependency-version: 4.0.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-11-06 00:25:07 +00:00
Herculino Trotta c05bdcf2bf Merge pull request #640 from eitchtee/fix/update-check
fix(updates): keep update banner across page loads and restarts
2026-11-02 17:36:01 -03:00
Herculino Trotta a5c73ec436 feat(updates): queue an update check on container startup
Fresh installs no longer wait up to 12 hours for the first periodic check.
2026-11-02 17:24:28 -03:00
Herculino Trotta b10897e64b fix(updates): keep update banner across page loads and restarts
The update check shared the file-based default cache with cachalot, whose culling randomly deleted the key as pages loaded. Store only the latest release in a dedicated cache, compare it to APP_VERSION at render time, and drop the startup delete. Hide the banner when CHECK_FOR_UPDATES is off or APP_VERSION isn't a valid version.
2026-11-02 17:24:28 -03:00
eitchtee 47a7fccd39 chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
0.25.0
2026-11-02 19:54:48 +00:00
Herculino Trotta da2085712b Merge pull request #639 from eitchtee/weblate
Translations update from Weblate
2026-11-02 16:54:19 -03:00
Weblate 3719a09e64 Merge remote-tracking branch 'origin/main' 2026-11-02 19:49:54 +00:00
Herculino Trotta 30019a87b2 locale(Portuguese (Brazil)): update translation
Currently translated at 100.0% (832 of 832 strings)

Translation: WYGIWYH/App
Translate-URL: https://translations.herculino.com/projects/wygiwyh/app/pt_BR/
2026-11-02 19:49:54 +00:00
eitchtee 6d45d097b8 chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-11-02 19:49:49 +00:00
Herculino Trotta 4ded47c5f9 Merge pull request #637 from fariskazmi/feat/oidc-disable-local-login
feat(auth): add OIDC_DISABLE_LOCAL_LOGIN to turn off password logins
2026-11-02 16:49:21 -03:00
Herculino Trotta 5b98779070 test(auth): add positive controls for local login and tighten basic auth check
- Add flag-off login page and admin password tests so the refusal tests can't pass for unrelated reasons
- Expect exactly 401 from refused basic auth
- Gate OIDC_DISABLE_LOCAL_LOGIN on an explicit OIDC_CONFIGURED flag
- Realign the README OIDC table, use "email" consistently, and warn about lockout with OIDC_ALLOW_SIGNUP=false
2026-11-02 16:41:52 -03:00
Herculino Trotta 3e2f3236d7 Merge pull request #638 from eitchtee/weblate
Translations update from Weblate
2026-11-02 16:28:40 -03:00
sorcierwax 318be51281 locale(French): update translation
Currently translated at 99.7% (830 of 832 strings)

Translation: WYGIWYH/App
Translate-URL: https://translations.herculino.com/projects/wygiwyh/app/fr/
2026-11-02 18:46:46 +00:00
Dimitri Decrock 91209f49d1 locale(Dutch): update translation
Currently translated at 100.0% (832 of 832 strings)

Translation: WYGIWYH/App
Translate-URL: https://translations.herculino.com/projects/wygiwyh/app/nl/
2026-11-02 17:58:57 +00:00
fariskazmi 161fc19721 feat(auth): add OIDC_DISABLE_LOCAL_LOGIN to turn off password logins
When the flag is on and an OIDC provider is configured, every e-mail and
password check is refused: the login page, the admin and the API's basic
auth. OIDC logins, API tokens, OAuth apps and permission checks keep working.
The login page hides the password form.
2026-11-02 09:08:30 -06:00
eitchtee ec9efccdf2 chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-11-02 04:18:58 +00:00
Herculino Trotta b956237390 Merge pull request #636 from eitchtee/feat/linked-transfers
feat(transactions): link transfer sides and show them as a single item
2026-11-02 01:18:33 -03:00
Herculino Trotta 3716b9b0e3 feat(transactions): link transfer sides and show them as a single item
Transfers are still two transactions, now linked to each other:
- shown as one item in lists, with each side's amount, account,
  category and tags ("Combine transfers" user setting, on by default)
- date, reference date, paid and mute stay in sync between sides
- edit opens the transfer form; delete, restore, duplicate and bulk
  actions act on both sides
- transfers made by the transfer form now trigger rules for each side

Recurring and quick transactions gain a Transfer type, with a "To
account" and optional "To amount", generating linked transfers. A
transfer can be converted into either.

Existing transfers are left as they are, since there is no reliable
way to pair them.
2026-11-02 01:14:46 -03:00
Herculino Trotta 7cb2713c6c Merge pull request #635 from eitchtee/feat/relative-demo-data
feat(demo): generate demo data relative to today
2026-11-01 00:16:39 -03:00
Herculino Trotta 1d22c9ff66 feat(demo): generate demo data relative to today
Replace the hard-dated demo fixture with a load_demo_data command that
builds the dataset around the current date, so the demo always has data
in the current month. It also covers more features: multi-currency
accounts with exchange rate history, an ETF and Bitcoin tracked with DCA
strategies, transfers, a credit card using reference dates, installment
plans, recurring transactions, quick transactions, rules and filter
presets.
2026-11-01 00:13:01 -03:00
Herculino Trotta 556542ac9e docs(readme): refresh screenshots 2026-11-01 00:12:33 -03:00
eitchtee 83da4226d9 chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-10-31 21:00:46 +00:00
Herculino Trotta 809564a1d3 Merge pull request #634 from eitchtee/feat/reconciliation-cutoff
feat(accounts): reconcile balances against a date or reference month cutoff
2026-10-31 18:00:23 -03:00
Herculino Trotta fcd666946f feat(accounts): reconcile balances against a date or reference month cutoff
Credit cards often have paid transactions dated after the invoice being
closed, which made reconciliation against all paid transactions wrong.

The reconciliation panel now lets you balance against all paid
transactions (previous behavior), paid transactions up to a date, or
paid transactions up to a reference month. The adjustment transaction is
dated at the cutoff so later reconciliations with the same or a later
cutoff include it. An invalid cutoff blocks the reconciliation instead
of silently falling back.
2026-10-31 17:56:36 -03:00
Herculino Trotta 2bb8b4e5d4 Merge pull request #631 from eitchtee/dependabot/uv/djangorestframework-3.18.2
build(deps): bump djangorestframework from 3.17.2 to 3.18.2
2026-10-25 12:11:37 -03:00
Herculino Trotta 948a3426ee Merge pull request #632 from eitchtee/dependabot/uv/brotli-1.2.1
build(deps): bump brotli from 1.2.0 to 1.2.1
2026-10-25 12:11:24 -03:00
Herculino Trotta 02488a1d74 Merge pull request #633 from eitchtee/weblate
Translations update from Weblate
2026-10-25 12:11:12 -03:00
sorcierwax edd87327d0 locale(French): update translation
Currently translated at 100.0% (817 of 817 strings)

Translation: WYGIWYH/App
Translate-URL: https://translations.herculino.com/projects/wygiwyh/app/fr/
2026-10-25 12:58:57 +00:00
dependabot[bot] 785bd054df build(deps): bump brotli from 1.2.0 to 1.2.1
Bumps [brotli](https://github.com/google/brotli) from 1.2.0 to 1.2.1.
- [Release notes](https://github.com/google/brotli/releases)
- [Changelog](https://github.com/google/brotli/blob/go/brotli/v1.2.1/CHANGELOG.md)
- [Commits](https://github.com/google/brotli/compare/v1.2.0...go/brotli/v1.2.1)

---
updated-dependencies:
- dependency-name: brotli
  dependency-version: 1.2.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-24 21:15:51 +00:00
dependabot[bot] b94a6aa4d2 build(deps): bump djangorestframework from 3.17.2 to 3.18.2
Bumps [djangorestframework](https://github.com/encode/django-rest-framework) from 3.17.2 to 3.18.2.
- [Release notes](https://github.com/encode/django-rest-framework/releases)
- [Commits](https://github.com/encode/django-rest-framework/compare/3.17.2...3.18.2)

---
updated-dependencies:
- dependency-name: djangorestframework
  dependency-version: 3.18.2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-24 21:15:42 +00:00