Currently translated at 26.9% (71 of 263 strings)
Co-authored-by: a-g-rao <athrigrao@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/i-hate-money/i-hate-money/kn/
Translation: I Hate Money/I Hate Money
Co-authored-by: a-g-rao <athrigrao@gmail.com>
* 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
* Translated using Weblate (Turkish)
Currently translated at 100.0% (262 of 262 strings)
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/i-hate-money/i-hate-money/tr/
Translation: I Hate Money/I Hate Money
* Translated using Weblate (Kannada)
Currently translated at 22.8% (60 of 263 strings)
Co-authored-by: a-g-rao <athrigrao@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/i-hate-money/i-hate-money/kn/
Translation: I Hate Money/I Hate Money
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Co-authored-by: a-g-rao <athrigrao@gmail.com>
Currently translated at 18.9% (49 of 258 strings)
Co-authored-by: a-g-rao <athrigrao@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/i-hate-money/i-hate-money/kn/
Translation: I Hate Money/I Hate Money
Co-authored-by: a-g-rao <athrigrao@gmail.com>
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.
Fix#780
This a breaking change, the API for authentication is different, as it now requires `project_id`. Token is generated with only the project_id (so it's shorter than before), and signature is done by mixing password with secret key. Thus, it expires on every project code change.
This mock was already applied to all tests, because it was done statically
in the TestCurrencyConverter class definition. But it was really not
clear that it's applied everywhere.
Moving this to the setUp() function makes it much clearer.
Also, remove useless redefinition in other tests.
Fix#803
On some systems, there is no configured local timezone, so LOCALTZ is
a fallback object, that don't fit use case for flask-babel.
Detect this and use 'UTC' instead
Currently, we don't display the current language in the list. This is
confusing because the list changes when switching language.
Now we always display the full list, and we highlight the current
language.
* add the event listener only once, instead of every time the form is clicked
* use a standard button by default, so that the second state with a
"danger" button is more visible
* reset confirmation button to original state when losing focus
Co-authored-by: Glandos <bugs-github@antipoul.fr>
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.
Most of the tests are using a separate database, but we have a few tests
that are loading default values and are writing to /tmp/ihatemoney.db.
This is annoying because it's also the database used for development:
running the test suite breaks the dev database.
To fix this, always use a separate testing database to avoid interference.
The previous query was working fine on sqlite and mariadb, but not on
postgresql :
return self.get_bills_unordered().group_by(Bill.original_currency).count() > 1
psycopg2.errors.GroupingError: column "bill.id" must appear in the GROUP BY clause or be used in an aggregate function
The failing SQL query was:
[SQL: SELECT count(*) AS count_1
FROM (SELECT bill.id AS bill_id, ...
FROM bill JOIN person ON person.id = bill.payer_id JOIN project ON project.id = person.project_id
WHERE bill.payer_id = person.id AND person.project_id = project.id AND project.id = %(id_1)s GROUP BY bill.original_currency) AS anon_1]
The problem is that sqlalchemy creates a subquery for postgresql, and the
internal query does not make sense.
GROUP BY is not actually useful, we simply need to count the number of
distinct currencies in the list of bills.
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.
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.
Currently translated at 100.0% (231 of 231 strings)
Translated using Weblate (Esperanto)
Currently translated at 94.8% (219 of 231 strings)
Translated using Weblate (Esperanto)
Currently translated at 92.6% (214 of 231 strings)
Co-authored-by: phlostically <phlostically@mailinator.com>
Translate-URL: https://hosted.weblate.org/projects/i-hate-money/i-hate-money/eo/
Translation: I Hate Money/I Hate Money
Currently translated at 55.8% (129 of 231 strings)
Translated using Weblate (Greek)
Currently translated at 42.8% (99 of 231 strings)
Translated using Weblate (Greek)
Currently translated at 26.4% (61 of 231 strings)
Co-authored-by: Eugenia Russell <eugenia.russell2019@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/i-hate-money/i-hate-money/el/
Translation: I Hate Money/I Hate Money
Currently translated at 24.6% (57 of 231 strings)
Translated using Weblate (Greek)
Currently translated at 20.7% (48 of 231 strings)
Co-authored-by: Eugenia Russell <eugenia.russell2019@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/i-hate-money/i-hate-money/el/
Translation: I Hate Money/I Hate Money
Currently translated at 91.3% (211 of 231 strings)
Translated using Weblate (Dutch)
Currently translated at 80.0% (185 of 231 strings)
Co-authored-by: Rens <hallo@rensoliemans.nl>
Translate-URL: https://hosted.weblate.org/projects/i-hate-money/i-hate-money/nl/
Translation: I Hate Money/I Hate Money
Currently translated at 78.3% (181 of 231 strings)
Translated using Weblate (Dutch)
Currently translated at 77.4% (179 of 231 strings)
Co-authored-by: Rens <hallo@rensoliemans.nl>
Translate-URL: https://hosted.weblate.org/projects/i-hate-money/i-hate-money/nl/
Translation: I Hate Money/I Hate Money
Currently translated at 78.3% (181 of 231 strings)
Translated using Weblate (Dutch)
Currently translated at 77.4% (179 of 231 strings)
Co-authored-by: Sander Kooijmans <weblate@gogognome.nl>
Translate-URL: https://hosted.weblate.org/projects/i-hate-money/i-hate-money/nl/
Translation: I Hate Money/I Hate Money
By formatting datetime on the server, we get nice localized datetime
strings that are adapted to the currently-selected language. Example:
- English: "Apr 26, 2020, 3:58:54 PM"
- French: "26 avr. 2020 à 15:58:54"
- German: "26.04.2020, 15:58:54"
- Spanish: "26 abr. 2020 15:58:54"
- Indonesian: "26 Apr 2020 15.58.54"
- Chinese: "2020年4月26日 下午3:58:54"
However, there is a downside: time is not adapted to the user timezone.
The solution is to define a timezone on the server: we use the server OS
timezone by default, and it can be customized through the
BABEL_DEFAULT_TIMEZONE setting. It's still not ideal, because it assumes
that all users are in the same timezone (the one configured on the server).
Currently translated at 100.0% (231 of 231 strings)
Translated using Weblate (Japanese)
Currently translated at 77.9% (180 of 231 strings)
Co-authored-by: Jwen921 <yangjingwen0921@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/i-hate-money/i-hate-money/ja/
Translation: I Hate Money/I Hate Money
* Translated using Weblate (German)
Currently translated at 100.0% (231 of 231 strings)
Co-authored-by: mdmdmdmdmd <exe_tmp@gmx.de>
Translate-URL: https://hosted.weblate.org/projects/i-hate-money/i-hate-money/de/
Translation: I Hate Money/I Hate Money
* Translated using Weblate (Japanese)
Currently translated at 15.5% (36 of 231 strings)
Co-authored-by: Jwen921 <yangjingwen0921@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/i-hate-money/i-hate-money/ja/
Translation: I Hate Money/I Hate Money
Co-authored-by: mdmdmdmdmd <exe_tmp@gmx.de>
Co-authored-by: Jwen921 <yangjingwen0921@gmail.com>
Currently translated at 1.7% (4 of 231 strings)
Added translation using Weblate (Swedish)
Co-authored-by: Kristoffer Grundström <swedishsailfishosuser@tutanota.com>
Translate-URL: https://hosted.weblate.org/projects/i-hate-money/i-hate-money/sv/
Translation: I Hate Money/I Hate Money
This was hidden by the CVE-2020-15120 issue: now that we no longer return
members from the wrong project, we need to handle the case where there is
nothing to return.
An authenticated member of one project can modify and delete members of
another project, without knowledge of this other project's private
code. This can be further exploited to access all bills of another project
without knowledge of this other project's private code.
With the default configuration, anybody is allowed to create a new
project. An attacker can create a new project and then use it to become
authenticated and exploit this flaw. As such, the exposure is similar to
an unauthenticated attack, because it is trivial to become authenticated.
This issue was caused by a wrong database queries in PersonQuery.
For more details, see https://github.com/spiral-project/ihatemoney/security/advisories/GHSA-67j9-c52g-w2q9
In one case, we were not catching a family of possible exceptions
(socket.error), and in the two other cases there was no error handling at
all. Sending emails can easily fail if no email server is configured, so
it is really necessary to handle these errors instead of crashing with a
HTTP 500 error.
Refactor email sending code and add proper error handling.
Show alert messages that tell the user if an email was sent or if there
was an error.
When sending a password reminder email or inviting people by email, we
don't proceed to the next step in case of error, because sending emails is
the whole point of these actions.
Translated using Weblate (Italian) Currently translated at 36.4% (83 of 228 strings)
Translated using Weblate (French) Currently translated at 100.0% (228 of 228 strings)
This fixes#607 and add a test case for this bug.
It also renames participants in test cases to avoid alphabetical ordering.
Inserting participants in alphabetical order is a special case, because ordering by ID will be the same as ordering by name. This is a bad idea in test cases, as #607 has shown.
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
Currently the string representation of a Bill is: "<amount> for <description>"
It is used in the History Page to describe changes that were applied to
Bills, for instance:
Bill "42.0 for Test" renamed to "Another Test"
This is inconsistent, not easy to read, and the "for" in the middle is not
translatable.
To solve this issue, simply switch the string representation of a bill to
its description.
Co-authored-by: Baptiste Jonglez <git@bitsofnetworks.org>
* Direct Alembic to ignore the sqlite_sequence table
* Direct Alembic to ignore the sqlite_sequence table
* Fix "Skipping unsupported ALTER" warning on database migration
* Fix user-facing string and update translation catalog
In the flash message confirming member creation, change "member had been
added" into the correct form "member has been added".
No translation has been changed. Some translators seem to have already
spotted the mistake while translating, but I can't tell for all languages.
* Change "Person" to "Participant" in history view
Currently, the main user-facing term is "Participant", as seen for
instance in the "Add participant" form. "Person" is not used anywhere in
the interface.
See #302 for a more general discussion on choosing the right terminology.
* Fix obsolete translations.
Co-authored-by: Baptiste Jonglez <git@bitsofnetworks.org>
Co-authored-by: Rémy HUBSCHER <hubscher.remy@gmail.com>
According to https://hosted.weblate.org/projects/i-hate-money/i-hate-money/
these translations are almost complete (69% and 58% currently, but that's
because there have been lots of new strings to translate recently)
Co-authored-by: Baptiste Jonglez <git@bitsofnetworks.org>
Co-Authored-By: Glandos <bugs-github@antipoul.fr>
All project activity can be tracked, using SQLAlchemy-continuum.
IP addresses can optionally be recorded.
* Added DataTables for table sorting, pagination, and searching of bill_table for dashboard. Issue #112
* Moved datatables CSS/JS to dashboard to reduce loaded data throughout
* Moved link back to proper place, in head tab, but added if to prevent loading CSS/JS for datatables outside of the dashboard. Also added eye icon to drill into list_billa API to be more consistent with the look and feel of the overall site.
Co-authored-by: bmatt <bmatt@nuc01.attlocal.net>
* Align tables in statistics
The table in sidebar is now aligned with the one in content, to avoid
redundant informations.
All tables are back to normal on small devices.
* fix test
* run black on tests
* Added support for multiple API versions
Note that no changes were made to the api, the code was refactored to allow for new versions of the api to be created down the road.
Here's what this would look like:
+-- api/
+-- v1/
+-- __init__.py
+-- resources.py
+-- v1_1/
+-- __init__.py
+-- resources.py
+-- v2/
+-- __init__.py
+-- resources.py
+-- __init__.py
+-- common.py
* reformatted using black
/Users/drthrash/PycharmProjects/ihatemoney/ihatemoney/api/v1/resources.py
reformatted /Users/drthrash/PycharmProjects/ihatemoney/ihatemoney/api/common.py
All done! ✨🍰✨
* Applying fix for unused import in init.py
https://stackoverflow.com/questions/31079047/python-pep8-class-in-init-imported-but-not-used
* Formatting changes recommended by black
All done! ✨🍰✨
1 file reformatted, 22 files left unchanged.
* Update models: Bill.pay_each()
* Import sql func
* reformatted using black
* Added ModelsTestCase.test_bill_pay_each() in order to test the SQL query change within pay_each.
Had to add Project.ProjectQuery.get_by_name() for the test.
* Added translation using Weblate (Indonesian)
* Translated using Weblate (Indonesian)
Currently translated at 100.0% (158 of 158 strings)
Translation: I Hate Money/I Hate Money
Translate-URL: https://hosted.weblate.org/projects/i-hate-money/i-hate-money/id/
* Added translation using Weblate (Ukrainian)
* Translated using Weblate (Ukrainian)
Currently translated at 11.4% (18 of 158 strings)
Translation: I Hate Money/I Hate Money
Translate-URL: https://hosted.weblate.org/projects/i-hate-money/i-hate-money/uk/
* Translated using Weblate (Chinese (Simplified))
Currently translated at 20.9% (33 of 158 strings)
Translation: I Hate Money/I Hate Money
Translate-URL: https://hosted.weblate.org/projects/i-hate-money/i-hate-money/zh_Hans/
* Translated using Weblate (German)
Currently translated at 100.0% (155 of 155 strings)
Translation: I Hate Money/I Hate Money
Translate-URL: https://hosted.weblate.org/projects/i-hate-money/i-hate-money/de/
Co-authored-by: Muhammad Fauzi <fauzipadlaw@users.noreply.github.com>
Co-authored-by: Muge Niu <mugeniu12138@gmail.com>
Co-authored-by: flolilo <30194876+flolilo@users.noreply.github.com>
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>