Commit graph

61 commits

Author SHA1 Message Date
6e31a9c8b5 Upgrade tooling on the project.
- Replace black by ruff, as it's quicker ;
- Use `uv` wherever possible as a replacement for pip, as it's way faster to run, add an `uv.lock` file which will be synced before the releases and published here ;
- Remove tox, it's too complex for this project and can easily be replaced by `uv` ;
- Apply `ruff` formatting ;
- Update the makefile accordingly ;
- Update the CI accordingly
2024-12-20 17:17:31 +01:00
Baptiste Jonglez
312dfef14b Reformat code with black and isort 2024-03-25 20:46:39 +01:00
TomRoussel
720f0e52dd
Adding bill types and automatic settling between people (#1290)
* Bill types added in Bill and Project Model, Implemented in BillForm
* import and export bill feature updated with bill type, tests modified to reflect the behavior
* eliminating unnecessary bill type
* typo fixed, test cases fixed for the current bill types
* button added
* settle button added
* new changes
* test cases added
* bchen-reimbursement
* tests for different bill types
* test cases fixed
* fixed reimbursement test case
* Replaced assertEqual with assert
* Fixed missing bill_type in unit tests
* Removed commented code
* Reverted unnecessary string edit
* Changed bill_type to an Enum
* Added test checking correct bill_type validation
* Fixed  billtype displaying in all caps
* Removed 'Transfer' bill type
* Added migration rule and set default bill_type in alembic
* bill_type is now an optional parameter in the BillForm
* Use enum name instead of value as SQL server_default

SQLAlchemy uses the Enum names in the database, as the values could be
generic python objects.
https://docs.sqlalchemy.org/en/20/core/type_basics.html#sqlalchemy.types.Enum

* Removed bill type from the Bills html table
* Replaced string bill type with enum
* Made "Settlement" translatable
* Manually handle the new Enum creation

Alembic does not handle postgres Enums correctly, so we need to manually
generate the new enum type.
See https://github.com/sqlalchemy/alembic/issues/278

---------

Co-authored-by: Ruitao Li <ruital@andrew.cmu.edu>
Co-authored-by: MelodyZhangYiqun <98992024+MelodyZhangYiqun@users.noreply.github.com>
Co-authored-by: Ruitao Li <49292515+FlowingCloudRTL@users.noreply.github.com>
Co-authored-by: MelodyZhangYiqun <yiqunz@andrew.cmu.edu>
Co-authored-by: Brandan Chen <bychen@andrew.cmu.edu>
Co-authored-by: Emilie Zhou <54161959+ez157@users.noreply.github.com>
Co-authored-by: Tom <tom.roussel@esat.kuleuven.be>
2024-03-16 12:20:48 +01:00
Turtle6665
ba117ba0a6
Changing any settings is prevented when project has existing currency (#1292) 2024-03-15 22:32:10 +01:00
zorun
1a2fa0476b
Currency hotfixes (#1240)
* hotfix: hardcode list of currencies to workaround failing API calls

See https://github.com/spiral-project/ihatemoney/issues/1232 for a discussion on currencies

* Temporarily disable some currency operations to prevent crashes

Here is what is disabled:

- setting or changing the default currency on an existing project

- adding or editing a bill with a currency that differs from the default
  currency of the project

---------

Co-authored-by: Baptiste Jonglez <git@bitsofnetworks.org>
2023-10-04 00:05:10 +02:00
Éloi Rivard
857ca2d5b0
tests: speed up unit tests (#1215)
Adds two configuration parameters that are passed to
generate_password_hash:

- PASSWORD_HASH_METHOD
- PASSWORD_HASH_SALT_LENGTH

The unit tests use high-speed low-security values and
gain 50% speed.
2023-08-13 00:04:06 +02:00
Baptiste Jonglez
68e1dac75c Require private code to edit a project settings
This is something we had documented in our security documentation [1], but
we didn't actually do it...

As mentioned in [1], this has good security properties: you can invite
somebody with an invitation link, and they will be able to access the
project but not change the private code (because they don't know the
current private code).

This new check also applies to all other settings (email address, history
settings, currency), which is desirable.  Only somebody with knowledge of
the private code can now change these settings.

[1] https://ihatemoney.readthedocs.io/en/latest/security.html#giving-access-to-a-project
2023-07-29 14:02:49 +02:00
Baptiste Jonglez
f06c49ce74 More consistent translations 2023-07-14 10:09:34 +02:00
Baptiste Jonglez
081f8dcf49 Allow bills with an amount of zero
Bills with an amount of zero may be useful to remember that a transaction
happened on a specific date, while the amount doesn't matter.

I use that with per-year projects when a reimbursement happens in year N
but is relative to year N-1: I record it with an amount of zero in the
project of year N, and with the real amount in the project of year N-1.

Besides, it's already possible to create such bills: while "0" is refused,
"0.0" is accepted.  There are no visible issues with this kind of bills.
2023-02-03 20:35:15 +01:00
Glandos
9ccfc2981d side-effect: add autofocus on admin field 2022-12-10 18:22:41 +01:00
Glandos
f98b126e58 Captcha value should be case insensitive on both side (form and l10n values)
Fixes #1060
2022-09-09 22:44:27 +02:00
Glandos
667b65b9cc
Surround email in case of error (#1044)
fix https://huntr.dev/bounties/441cc44c-6837-46ec-9b30-52455aa71a2f/
2022-07-16 23:26:51 +02:00
Glandos
31fef4f4d6
Fix CSRF on logout (#1040)
fix for https://huntr.dev/bounties/a3045614-1125-4901-bb7a-9d51be4beeed/
2022-07-14 15:45:32 +02:00
Glandos
e355894cee
Check for too high values (#989)
* check for too high values

see https://github.com/python-babel/babel/issues/821

fix #957

* black & isort

* add API test
2022-02-02 10:09:49 +01:00
Glandos
07e1eac0a9
Null amount validator was broken (#990) 2022-01-30 16:33:18 +01:00
7c3ced06f8
Some small cleanups (#976)
Co-authored-by: Glandos <bugs-github@antipoul.fr>
2022-01-30 15:26:22 +01:00
Glandos
1a90e4cdd8
Fix broken captcha validation when field is empty and we use WTForms 3 (#988) 2022-01-25 22:26:56 +01:00
Glandos
40ce32d9fa
Support WTForms 3 (#916)
* Support WTForms 3

* default value to None for WTForm backward compatibility

* switch back to empty string as default

WTForm backward compatibility needs that

* format
2022-01-23 19:43:32 +01:00
Youe Graillot
747824a298
CSV bills import (cospend compatible) (#951)
* proper import form (fix messy errors)
* csv compatible import
* cospend compatible import
* localization (best effort)
* refactoring
* revert localization (best effort)
* import return 400 on error
* fix Person.query.get_by_ids calls
* Bill explicit init parameters
* fix tests
* refacto tests with self.get_project
* separate import tests
* fix tests
* csv import test case
* fix import csv parsing
* revert DestructiveActionProjectForm renaming
* fix csv import test
* fix error redirection on import
* fix lint
* import file input type hint
* various fixes from review

Co-authored-by: Youe Graillot <youe.graillot@gmail.com>
2021-12-22 00:00:34 +01:00
1698841f6d
Do not require a captcha when using the API (#931)
* Do not require a captcha when using the API

This was trickier than expected, due to some side effects : when the
captcha is set to `True` via configuration, it doesn't change the
behavior directly of the ProjectForm class, but does so only when the
project form is used in the `web.py` module.

So, when just using the API (and not using the web.py module, for
instance during tests — manual or functional), no problem was shown,
and everything was working properly.

But at soon as somebody sees the "/" endpoint, the captcha was
required, by both the API and the `web.py` module.

This fixes it by adding a way to bypass the captcha with a new
`bypass_captcha` property on the form.

Prior to this commit, things were done by activating or deactivating a
"captcha" property on the class on-the-fly, which caused side-effects.

This is now using subclasses, which makes the code simpler to
understand, and less prone to side-effects.

Thanks @zorun for the idea.
2021-11-25 00:44:21 +01:00
35a74100cb
Rename all strings to "participants", clean old and small weird stuff (#871)
* Rename all strings to "participants".
* Update the tests with the new strings
* Update tests
2021-11-01 18:25:57 +01:00
JocelynDelalande
5ab12f41bd
Consistently use questions in bill form (#900)
* Consistently use questions in bill form

* fixup
2021-10-30 17:35:43 +02:00
Glandos
7a15051996
Make multiple currency optional (#864)
* Make multiple currency optional
Fixes #848

A description is provided in project settings to make the feature self explanatory.

* I forgot the description.
Let's update translation altogether.

* black format
2021-10-18 23:46:53 +02:00
Baptiste Jonglez
421cfbe645 project: set XXX as default default_currency for API backwards compatibility
The new support for currency broke backwards compatibility on the API:

    $ curl -X POST $URL/api/projects -d 'name=yay&id=yay&password=yay&contact_email=yay@notmyidea.org'
    {"default_currency": ["This field is required."]}

This is a case we were not testing (will be fixed in subsequent commits)

To fix this, simply set default_currency to XXX by default.
2021-10-14 00:07:41 +02:00
2bcc41bdb3
Add optional support for a simple CAPTCHA. (#844)
* Add optional support for a simple CAPTCHA.
* formatting
* add test case
* Flake8

Co-authored-by: Glandos <bugs-github@antipoul.fr>
2021-10-11 17:39:24 +02:00
zorun
7554842b1f
Add URL validation to external link to prevent XSS (#846)
Co-authored-by: Baptiste Jonglez <git@bitsofnetworks.org>
2021-10-10 18:39:03 +02:00
Baptiste Jonglez
4bf9308908 Add currency to import and export formats 2021-09-07 23:15:40 +02:00
Baptiste Jonglez
db982572aa History: also ask for private code to confirm deletion
This is the same idea as deleting a project: deleting history is also a
major destructive action.  We reuse the same form as for project deletion
to ask for the private code and provide CSRF validation.
2021-07-17 13:54:11 +02:00
Baptiste Jonglez
2bb6f2b6a7 Rework project deletion to add CSRF validation
It requires reworking the user interface, but it's probably for the best.
2021-07-17 13:54:11 +02:00
Baptiste Jonglez
109d7fca17 Add CSRF validation to most disruptive actions
This also switches all such actions to POST requests.

Deleting the project is handled in another commit because it requires more
changes.
2021-07-17 13:54:11 +02:00
Baptiste Jonglez
8b2da3757c Add missing field description from #774 2021-07-09 01:24:29 +02:00
Baptiste Jonglez
ec1e6cf26e project edit form: allow empty private code (= no change)
Currently, the private code is mandatory in the edit form, and it's not
clear whether it's meant to **check** for the right private code or to
**change** the private code.

Make the field optional and rename the help message to make it clearer
it's only meant to **change** the private code.

Also change the field type to "password" instead of simple string.
2021-07-09 01:20:50 +02:00
Baptiste Jonglez
856412a70d project forms: Clarify relation between inheriting classes
The save() function is used to create a new project, so it belongs to the
form creation class.

Also clarify overriden form fields.
2021-07-09 01:20:50 +02:00
Baptiste Jonglez
dae7870b12 Fix error message syntax to allow translation extraction 2021-07-07 01:01:00 +02:00
Glandos
07b86bc580
Rework currency switching (#661)
Co-authored-by: Alexis Métaireau <alexis@notmyidea.org>

Currency switching is both simpler and less powerful. This was done primarily for users, to have a clear and logical understanding, but the code is also simpler. The main change is that it is now forbidden to switch a project to "no currency" if bills don't share the same currency.

Also, tests assume that projects are created without currency, as in the web UI.
2021-07-06 21:51:32 +02:00
Glandos
c62965d4bf fix basic deprecation warnings 2021-06-10 00:09:59 +02:00
Glandos
6c43ffaac4 Adapt code for https://github.com/wtforms/wtforms/pull/288 2021-06-09 23:38:05 +02:00
Glandos
58e5eca270
update to black 20.8b1 (#676)
Some trailing commas were removed because of some black changes.
2020-08-27 22:09:04 +02:00
Glandos
040d76af83
Relax pin point dependencies (#660)
* Please don't pin point releases and future releases
Fixes #658

* fix expression checked by new flake8

* (really) fix condition

* ensure Flask-WTF is ok

* don't forget, it's >= not >

Co-authored-by: Glandos <bugs-framagit@antipoul.fr>
2020-07-26 18:21:55 +02:00
Glandos
981edd413a
Improve currencies (#604)
- Rename "No Currency" to ISO4217 "XXX"
- Use Babel to render currency symbols and names in currency lists
- Improve i18n in bill lists

Fix #601
Fix #600
2020-05-07 22:56:17 +02:00
dark0dave
f389c56259
Feature/currencies (#541)
Now each project can have a currency, default to None.
Each bill can use a different currency, and a conversion to project default currency is done on settle.

Fix #512
2020-04-29 22:57:08 +02:00
Rémy HUBSCHER
299c64a48c
Add isort support. (#561) 2020-04-21 13:59:41 +02:00
Andrew Dickinson
026a072235
Add Project History Page (#553)
Co-Authored-By: Glandos <bugs-github@antipoul.fr>

All project activity can be tracked, using SQLAlchemy-continuum.
IP addresses can optionally be recorded.
2020-04-20 15:30:27 +02:00
eMerzh
03251c090e
merge settings and import to avoid clutter (#550) 2020-04-08 14:00:24 +02:00
Nicolas Vanvyve
9aa7e62d0f Import previously exported json data (#518)
Fix #417 

* New tab upload

* Extract data from JSON

* Add users

* Black format

* Try to add bill

* Import bills

* Add french translation msg

* Black reformat missing

* Deactivated users are supported

* Test import

* Remove temp file in upload_json()

* Incomplete tests

* tests import

* Update ihatemoney/translations/fr/LC_MESSAGES/messages.po

Co-Authored-By: Rémy HUBSCHER <hubscher.remy@gmail.com>

* Remove useless variable and check json format

* Use String.IO and test for wrong json

* Remove coma

Co-authored-by: Rémy HUBSCHER <hubscher.remy@gmail.com>
2020-01-13 21:17:55 +01:00
José Antonio de la Torre
a0cb2b78b7 Removed unused textarea to solve flake8 error 2019-10-17 20:17:38 +02:00
José Antonio de la Torre
5e37e33716 Added support to split messages #133 2019-10-17 20:17:38 +02:00
f260a2c9e7 Use black to refomat the files. 2019-10-14 21:20:38 +02:00
Leo Mouyna
e453c917ed Add new translations 2019-10-03 18:17:25 +02:00
Leo Mouyna
afc9353180 feat: Optional field 'external link' in bill form.
An optional field has been added to the bill form to add a link to a real bill. A new action button allow user to see this bill. Breaking change with Bill model update for database, a migration is needed.

See issue #429.
2019-10-03 18:15:50 +02:00