Compare commits

...

719 Commits

Author SHA1 Message Date
vabene1111
f14acc371d Revert "Merge pull request #3055 from tooboredtocode/develop"
This reverts commit d7669279ff, reversing
changes made to 4293ec77c0.
2024-04-08 07:20:41 +02:00
vabene1111
c031db9019 downgraded recipe scrapers to pass tests for now 2024-04-05 21:18:01 +02:00
vabene1111
d7669279ff Merge pull request #3055 from tooboredtocode/develop
Improve docker run speeds
2024-04-04 20:52:48 +02:00
vabene1111
4293ec77c0 fixed changing categories of shopping items 2024-04-04 20:49:48 +02:00
vabene1111
0a30c39add Merge pull request #3082 from TandoorRecipes/dependabot/github_actions/awalsh128/cache-apt-pkgs-action-1.4.2
Bump awalsh128/cache-apt-pkgs-action from 1.4.1 to 1.4.2
2024-04-04 20:42:52 +02:00
vabene1111
1b6449270b Merge pull request #3081 from TandoorRecipes/dependabot/pip/beautifulsoup4-4.12.3
Bump beautifulsoup4 from 4.12.2 to 4.12.3
2024-04-04 20:42:41 +02:00
vabene1111
3ae264eea7 Merge pull request #3080 from TandoorRecipes/dependabot/pip/django-debug-toolbar-4.3.0
Bump django-debug-toolbar from 4.2.0 to 4.3.0
2024-04-04 20:42:35 +02:00
vabene1111
c9dc7164f5 Merge pull request #3078 from TandoorRecipes/dependabot/pip/pytest-cov-5.0.0
Bump pytest-cov from 4.1.0 to 5.0.0
2024-04-04 20:42:22 +02:00
vabene1111
5751ba1ec5 Merge pull request #3079 from TandoorRecipes/dependabot/pip/django-crispy-forms-2.1
Bump django-crispy-forms from 2.0 to 2.1
2024-04-04 20:42:16 +02:00
vabene1111
3eca8c6db4 Merge pull request #3077 from TandoorRecipes/dependabot/pip/recipe-scrapers-14.55.0
Bump recipe-scrapers from 14.52.0 to 14.55.0
2024-04-04 20:42:03 +02:00
vabene1111
5cccbb8e5c Merge pull request #3092 from TandoorRecipes/dependabot/pip/pillow-10.3.0
Bump pillow from 10.2.0 to 10.3.0
2024-04-04 15:56:09 +02:00
dependabot[bot]
4390703c0c Bump pillow from 10.2.0 to 10.3.0
Bumps [pillow](https://github.com/python-pillow/Pillow) from 10.2.0 to 10.3.0.
- [Release notes](https://github.com/python-pillow/Pillow/releases)
- [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst)
- [Commits](https://github.com/python-pillow/Pillow/compare/10.2.0...10.3.0)

---
updated-dependencies:
- dependency-name: pillow
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-03 16:22:02 +00:00
smilerz
47bc3cfbe7 Update backup.md
update compose configuration for pgbackup to include .env file
2024-04-03 09:07:09 -05:00
atom karinca
30a2012e90 Translated using Weblate (Turkish)
Currently translated at 5.9% (29 of 485 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/tr/
2024-04-01 22:04:36 +00:00
dependabot[bot]
b38ea866b4 Bump awalsh128/cache-apt-pkgs-action from 1.4.1 to 1.4.2
Bumps [awalsh128/cache-apt-pkgs-action](https://github.com/awalsh128/cache-apt-pkgs-action) from 1.4.1 to 1.4.2.
- [Release notes](https://github.com/awalsh128/cache-apt-pkgs-action/releases)
- [Commits](https://github.com/awalsh128/cache-apt-pkgs-action/compare/v1.4.1...v1.4.2)

---
updated-dependencies:
- dependency-name: awalsh128/cache-apt-pkgs-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-01 01:02:35 +00:00
dependabot[bot]
5a0b9e14d2 Bump beautifulsoup4 from 4.12.2 to 4.12.3
Bumps [beautifulsoup4](https://www.crummy.com/software/BeautifulSoup/bs4/) from 4.12.2 to 4.12.3.

---
updated-dependencies:
- dependency-name: beautifulsoup4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-01 00:53:28 +00:00
dependabot[bot]
4f0f59a55c Bump django-debug-toolbar from 4.2.0 to 4.3.0
Bumps [django-debug-toolbar](https://github.com/jazzband/django-debug-toolbar) from 4.2.0 to 4.3.0.
- [Release notes](https://github.com/jazzband/django-debug-toolbar/releases)
- [Changelog](https://github.com/jazzband/django-debug-toolbar/blob/main/docs/changes.rst)
- [Commits](https://github.com/jazzband/django-debug-toolbar/compare/4.2...4.3)

---
updated-dependencies:
- dependency-name: django-debug-toolbar
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-01 00:53:25 +00:00
dependabot[bot]
768b678c93 Bump django-crispy-forms from 2.0 to 2.1
Bumps [django-crispy-forms](https://github.com/django-crispy-forms/django-crispy-forms) from 2.0 to 2.1.
- [Release notes](https://github.com/django-crispy-forms/django-crispy-forms/releases)
- [Changelog](https://github.com/django-crispy-forms/django-crispy-forms/blob/main/CHANGELOG.md)
- [Commits](https://github.com/django-crispy-forms/django-crispy-forms/compare/2.0...2.1)

---
updated-dependencies:
- dependency-name: django-crispy-forms
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-01 00:53:19 +00:00
dependabot[bot]
10373b6ac5 Bump pytest-cov from 4.1.0 to 5.0.0
Bumps [pytest-cov](https://github.com/pytest-dev/pytest-cov) from 4.1.0 to 5.0.0.
- [Changelog](https://github.com/pytest-dev/pytest-cov/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest-cov/compare/v4.1.0...v5.0.0)

---
updated-dependencies:
- dependency-name: pytest-cov
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-01 00:53:12 +00:00
dependabot[bot]
4e0780d512 Bump recipe-scrapers from 14.52.0 to 14.55.0
Bumps [recipe-scrapers](https://github.com/hhursev/recipe-scrapers) from 14.52.0 to 14.55.0.
- [Release notes](https://github.com/hhursev/recipe-scrapers/releases)
- [Commits](https://github.com/hhursev/recipe-scrapers/compare/14.52.0...14.55.0)

---
updated-dependencies:
- dependency-name: recipe-scrapers
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-01 00:53:06 +00:00
atom karinca
959ad2a45c Translated using Weblate (Turkish)
Currently translated at 33.7% (192 of 569 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/tr/
2024-03-31 20:08:43 +00:00
vabene1111
94045905d3 Merge pull request #3069 from TandoorRecipes/dependabot/npm_and_yarn/vue/express-4.19.2
Bump express from 4.18.2 to 4.19.2 in /vue
2024-03-28 07:40:49 +01:00
dependabot[bot]
ad8d8daf79 Bump express from 4.18.2 to 4.19.2 in /vue
Bumps [express](https://github.com/expressjs/express) from 4.18.2 to 4.19.2.
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/master/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2)

---
updated-dependencies:
- dependency-name: express
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-28 06:40:03 +00:00
vabene1111
b623abf81e Merge pull request #3067 from Mikhail5555/move-away-from-homeassistant-api
use normal async client for api calls
2024-03-28 07:38:43 +01:00
tooboredtocode
f8b8d3f199 Merge branch 'TandoorRecipes:develop' into develop 2024-03-27 23:31:44 +01:00
Axel Breiterman
be388b0d10 Translated using Weblate (Spanish)
Currently translated at 53.1% (258 of 485 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/es/
2024-03-27 19:02:41 +00:00
Mikhail Epifanov
41a448578a extra check if we arent accidently doing a query 2024-03-26 23:21:23 +01:00
Mikhail Epifanov
441c55936d use normal async client for api calls 2024-03-26 22:46:04 +01:00
vabene1111
b67281bbc8 fixed property helper calculation 2024-03-25 20:27:33 +01:00
vabene1111
5a1a5f3c4d Merge pull request #3057 from TandoorRecipes/dependabot/npm_and_yarn/vue/webpack-dev-middleware-5.3.4
Bump webpack-dev-middleware from 5.3.3 to 5.3.4 in /vue
2024-03-25 07:43:18 +01:00
vabene1111
30e2fc4895 Merge pull request #3052 from smilerz/test_performance
Test performance
2024-03-25 07:33:39 +01:00
vabene1111
57304f9c6c Merge pull request #3059 from richid/fix-system-issue-3503
bug: Fix TypeError at /system due to invalid PostgreSQL values [Closes #3053]
2024-03-25 07:31:28 +01:00
jorge Teixeira
87327b0959 Translated using Weblate (Portuguese (Brazil))
Currently translated at 84.5% (481 of 569 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/pt_BR/
2024-03-24 16:02:39 +00:00
Rich Schumacher
7957413ca0 bug: Fix TypeError at /system due to invalid PostgreSQL values [Closes #3053]
The bug was a missing tuple index introduced in #3027. Added the index
and also wrapped everything in a try/catch to prevent future issues.
2024-03-23 15:31:44 -04:00
dependabot[bot]
d99a157416 Bump webpack-dev-middleware from 5.3.3 to 5.3.4 in /vue
Bumps [webpack-dev-middleware](https://github.com/webpack/webpack-dev-middleware) from 5.3.3 to 5.3.4.
- [Release notes](https://github.com/webpack/webpack-dev-middleware/releases)
- [Changelog](https://github.com/webpack/webpack-dev-middleware/blob/v5.3.4/CHANGELOG.md)
- [Commits](https://github.com/webpack/webpack-dev-middleware/compare/v5.3.3...v5.3.4)

---
updated-dependencies:
- dependency-name: webpack-dev-middleware
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-23 06:40:34 +00:00
tooboredtocode
20b812c2cc feat: re-add venv 2024-03-22 19:04:29 +01:00
tooboredtocode
7bfa23b953 feat: better messages 2024-03-22 11:32:30 +01:00
tooboredtocode
ae37abf8b2 fix: fix modified the wrong file 2024-03-22 11:26:26 +01:00
tooboredtocode
5f211e420e fix: moving into exisiting files 2024-03-22 02:50:18 +01:00
tooboredtocode
1235cb8da5 feat: improve docker run speeds 2024-03-22 00:50:02 +01:00
smilerz
5e3a5eb8f5 fix errant IF statement 2024-03-21 09:18:38 -05:00
smilerz
b6a42e8e81 enable parallel test execution 2024-03-21 09:13:11 -05:00
smilerz
49539ef3ba add TEST_DATABASE env parameters 2024-03-21 09:11:57 -05:00
Johannes Jandke
db310c4076 Translated using Weblate (German)
Currently translated at 100.0% (569 of 569 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/
2024-03-21 14:02:41 +00:00
vabene1111
0248e1c500 Merge pull request #3006 from TandoorRecipes/dependabot/pip/django-cors-headers-4.3.1
Bump django-cors-headers from 4.2.0 to 4.3.1
2024-03-21 14:59:33 +01:00
vabene1111
db04386997 Merge pull request #3008 from TandoorRecipes/dependabot/pip/cryptography-42.0.5
Bump cryptography from 42.0.4 to 42.0.5
2024-03-21 14:59:16 +01:00
vabene1111
54f0b2b036 Merge pull request #3009 from TandoorRecipes/dependabot/pip/gunicorn-21.2.0
Bump gunicorn from 20.1.0 to 21.2.0
2024-03-21 14:59:04 +01:00
smilerz
33b23b299d removed unused docs/coverage/ reports 2024-03-21 08:58:32 -05:00
smilerz
a047613edb enabled entire test_recipe_full_text_search unit tests 2024-03-21 08:56:45 -05:00
smilerz
149cf93618 removed unused CustomTestRunner 2024-03-21 08:56:21 -05:00
vabene1111
ceb68af503 compiled and made messages 2024-03-21 14:40:13 +01:00
vabene1111
d8c86a4bb8 Merge pull request #3048 from smilerz/shoppinglist_fix
Shoppinglist fix
2024-03-21 14:08:23 +01:00
dependabot[bot]
a9dcc7261c Bump cryptography from 42.0.4 to 42.0.5
Bumps [cryptography](https://github.com/pyca/cryptography) from 42.0.4 to 42.0.5.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/42.0.4...42.0.5)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-21 13:04:03 +00:00
vabene1111
341c6abc02 Merge pull request #3046 from TandoorRecipes/dependabot/pip/django-4.2.11
Bump django from 4.2.10 to 4.2.11
2024-03-21 14:03:09 +01:00
Tomasz Klimczak
5c2d92103b Translated using Weblate (Polish)
Currently translated at 100.0% (569 of 569 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/pl/
2024-03-19 23:47:14 +00:00
Johannes Jandke
7b9bd5bc2a Translated using Weblate (German)
Currently translated at 100.0% (569 of 569 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/
2024-03-19 23:47:13 +00:00
Thomas
e242412ec4 Translated using Weblate (German)
Currently translated at 100.0% (569 of 569 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/
2024-03-19 23:47:13 +00:00
Bastian
6aaec29c8a Translated using Weblate (German)
Currently translated at 100.0% (569 of 569 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/
2024-03-19 23:47:13 +00:00
Tomasz Klimczak
854af133c4 Translated using Weblate (Polish)
Currently translated at 46.8% (227 of 485 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/pl/
2024-03-19 23:47:13 +00:00
Johannes Jandke
ac961ef7d2 Translated using Weblate (German)
Currently translated at 91.5% (444 of 485 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/de/
2024-03-19 23:47:13 +00:00
smilerz
b6f3ed6bd9 handle auto_onhand on bulkShoppingListEntry api 2024-03-19 09:12:31 -05:00
Johannes Jandke
ccf56e24be Translated using Weblate (German)
Currently translated at 100.0% (569 of 569 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/
2024-03-19 13:59:35 +00:00
Anthony BARRIER
5298b69d83 Translated using Weblate (French)
Currently translated at 95.6% (544 of 569 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fr/
2024-03-19 13:59:35 +00:00
Lukas B
f2f004db87 Translated using Weblate (German)
Currently translated at 100.0% (569 of 569 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/
2024-03-19 13:59:35 +00:00
Johannes Jandke
9416406732 Translated using Weblate (German)
Currently translated at 100.0% (569 of 569 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/
2024-03-19 13:59:35 +00:00
Jan
eeae2c1740 Translated using Weblate (German)
Currently translated at 100.0% (569 of 569 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/
2024-03-19 13:59:35 +00:00
Anthony BARRIER
45d3fd34be Translated using Weblate (French)
Currently translated at 87.2% (423 of 485 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/fr/
2024-03-19 13:59:35 +00:00
smilerz
bd61906aa4 counting delayed unchecked should check if null or in past 2024-03-18 18:09:56 -05:00
dependabot[bot]
c322782e89 Bump django from 4.2.10 to 4.2.11
Bumps [django](https://github.com/django/django) from 4.2.10 to 4.2.11.
- [Commits](https://github.com/django/django/compare/4.2.10...4.2.11)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-18 20:53:10 +00:00
vabene1111
2e6becb73d Merge pull request #3041 from TandoorRecipes/dependabot/npm_and_yarn/vue/follow-redirects-1.15.6
Bump follow-redirects from 1.15.5 to 1.15.6 in /vue
2024-03-17 10:10:50 +01:00
dependabot[bot]
d2aeef7e63 Bump follow-redirects from 1.15.5 to 1.15.6 in /vue
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.5 to 1.15.6.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.5...v1.15.6)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-17 00:25:33 +00:00
Miguel
8e700ba53c Translated using Weblate (Spanish)
Currently translated at 99.4% (566 of 569 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/es/
2024-03-16 09:02:46 +00:00
vabene1111
2f203d7786 reverted api plan ical having optional parameters 2024-03-15 19:11:11 +01:00
smilerz
2d021a83cf Update launch.json
adding .vscode configuration to the project broke/changed a bunch of stuff.  this fixes the ability to debug pytest
2024-03-13 08:25:22 -05:00
Tor Stokka
dda2cc16e7 Translated using Weblate (Norwegian Bokmål)
Currently translated at 65.2% (371 of 569 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nb_NO/
2024-03-11 13:02:39 +00:00
Kn
07957814f9 Translated using Weblate (Swedish)
Currently translated at 100.0% (569 of 569 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sv/
2024-03-11 13:02:39 +00:00
Kn
658bc5ca54 Translated using Weblate (Swedish)
Currently translated at 55.2% (268 of 485 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/sv/
2024-03-11 13:02:39 +00:00
vabene1111
539eb8e612 make and compile all messages 2024-03-10 07:25:13 +01:00
Kn
ba54a44e04 Translated using Weblate (Finnish)
Currently translated at 37.1% (211 of 568 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fi/
2024-03-10 06:12:01 +00:00
Kn
5ecddaf02f Translated using Weblate (Finnish)
Currently translated at 4.4% (22 of 493 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/fi/
2024-03-10 06:12:01 +00:00
Kn
a6c0dba684 Translated using Weblate (Swedish)
Currently translated at 100.0% (568 of 568 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sv/
2024-03-10 06:12:01 +00:00
Kn
7986d9c8f3 Translated using Weblate (Swedish)
Currently translated at 100.0% (371 of 371 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/sv/
2024-03-10 06:12:01 +00:00
vabene1111
02523f5325 fixed duplicate operation ID for plan-ical endpoint 2024-03-09 12:54:49 +01:00
vabene1111
36887b3488 added open data slug to shopping category form 2024-03-09 12:36:24 +01:00
vabene1111
bb77f80abf fixed shopping category headers showing when only containing delayed entries 2024-03-09 07:56:22 +01:00
vabene1111
9c92e0f4c0 fixed deleteting the selected supermarket in shopping breaking page 2024-03-09 07:47:33 +01:00
vabene1111
a6e8fa8ddf Merge branch 'develop' of https://github.com/TandoorRecipes/recipes into develop 2024-03-09 07:44:36 +01:00
vabene1111
37fb0418ac fixed default page setting and made PWA respect that setting 2024-03-09 07:44:32 +01:00
vabene1111
2264050d40 Merge pull request #3027 from richid/system-pg-version-fix
bug: Fix decimal.InvalidOperation on /system for some PG versions
2024-03-09 07:32:23 +01:00
vabene1111
aebc4a45ff fixed boot script for systems that dont support ipv6 2024-03-09 07:31:28 +01:00
Enric Bergadà
f061e02a95 Translated using Weblate (Catalan)
Currently translated at 14.0% (80 of 568 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ca/
2024-03-08 23:19:57 +00:00
Enric Bergadà
952d50d8dd Translated using Weblate (Catalan)
Currently translated at 85.5% (419 of 490 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/ca/
2024-03-08 23:19:56 +00:00
Rich Schumacher
3489216daf bug: Fix decimal.InvalidOperation on /system for some PG versions
In https://github.com/TandoorRecipes/recipes/pull/2730 the /system page was improved to warn the user if the version of Postgres they are using is out of date and should be updated. The current code attempts to determine the major versions by replacing `00` with `.` and then converting to a `Decimal`. Unfortunately, it appears the only value this method _does not_ work for are initial releases of major versions, like `16.0.0`.

For reference, either Postgres or the PsyCog driver represents the semver values but without the dots, so `16.0.0` becomes `1600000`.

This change removes the string replace and Decimal conversion in favor of using the divmod() function. In this application it will return a tuple with the first element being the major version of Postgres. This is then used as before to compare against deprecated versions.
2024-03-07 20:47:40 -05:00
Enric Bergadà
8e9285a24e Added translation using Weblate (Catalan) 2024-03-07 22:49:50 +00:00
Michel Blankenstein
8f55e15767 Translated using Weblate (Dutch)
Currently translated at 91.3% (518 of 567 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2024-03-05 22:19:58 +00:00
Jan
f2ce164a1e Translated using Weblate (German)
Currently translated at 99.1% (562 of 567 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/
2024-03-05 22:19:58 +00:00
Jocelin Lebreton
bfdd5a8bfc Translated using Weblate (French)
Currently translated at 96.5% (473 of 490 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/fr/
2024-03-05 22:19:58 +00:00
vabene1111
d104974ca8 downgraded home assistant api libnrary 2024-03-05 12:33:02 +01:00
vabene1111
b1a7212fce upgrade container base 2024-03-05 10:36:59 +01:00
vabene1111
eaee474cb7 updated wheel and setuptools rust 2024-03-05 10:34:48 +01:00
vabene1111
64f5b9ad1f Merge pull request #2931 from ambroisie/declarative-media-root
add ability to set 'MEDIA_ROOT'
2024-03-05 09:04:50 +01:00
vabene1111
c23df3d474 better shopping placeholder 2024-03-05 08:54:40 +01:00
vabene1111
0f06506f18 fixed device setting supermarkt refresh 2024-03-05 08:39:45 +01:00
vabene1111
56223df80b updated translations 2024-03-05 07:45:43 +01:00
Jocelin Lebreton
fe581e538f Translated using Weblate (French)
Currently translated at 95.2% (540 of 567 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fr/
2024-03-03 23:19:58 +00:00
M Ugur
88efe7ac8e Translated using Weblate (Turkish)
Currently translated at 6.5% (32 of 490 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/tr/
2024-03-03 23:19:58 +00:00
Jocelin Lebreton
be999c726b Translated using Weblate (French)
Currently translated at 96.5% (473 of 490 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/fr/
2024-03-03 23:19:58 +00:00
Bruno BELANYI
857d287233 add ability to set 'MEDIA_ROOT' 2024-03-02 14:33:06 +00:00
vabene1111
02ceacd232 Merge pull request #3020 from smilerz/coverage
removed action Publish Results
2024-03-01 22:04:42 +01:00
smilerz
d42308281c remove timeout value on CI action 2024-03-01 14:32:25 -06:00
smilerz
1f09f778c7 removed action Publish Results 2024-03-01 14:13:27 -06:00
vabene1111
2304ec0633 Merge pull request #3016 from smilerz/coverage
Coverage
2024-03-01 19:22:27 +01:00
smilerz
fe358eab16 remove coverage badge from README 2024-03-01 07:59:09 -06:00
Einir Einisson
e656a2da8c Translated using Weblate (Icelandic)
Currently translated at 3.1% (18 of 567 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/is/
2024-03-01 11:19:57 +00:00
vabene1111
2f3beb4f13 Merge pull request #3012 from TandoorRecipes/dependabot/npm_and_yarn/vue/codemirror/lang-markdown-6.2.4
Bump @codemirror/lang-markdown from 6.2.3 to 6.2.4 in /vue
2024-03-01 07:35:19 +01:00
dependabot[bot]
641e65c7ab Bump @codemirror/lang-markdown from 6.2.3 to 6.2.4 in /vue
Bumps [@codemirror/lang-markdown](https://github.com/codemirror/lang-markdown) from 6.2.3 to 6.2.4.
- [Changelog](https://github.com/codemirror/lang-markdown/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codemirror/lang-markdown/compare/6.2.3...6.2.4)

---
updated-dependencies:
- dependency-name: "@codemirror/lang-markdown"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-01 06:34:35 +00:00
vabene1111
d04075732e Merge pull request #3004 from c0mputerguru/ical-default-dates
Support unspecified to/from dates for fetching meal plan ical
2024-03-01 07:33:02 +01:00
vabene1111
678d0dff3a Merge pull request #3014 from TandoorRecipes/dependabot/npm_and_yarn/vue/codemirror/commands-6.3.3
Bump @codemirror/commands from 6.3.2 to 6.3.3 in /vue
2024-03-01 07:31:12 +01:00
dependabot[bot]
ca068a3ae0 Bump @codemirror/commands from 6.3.2 to 6.3.3 in /vue
Bumps [@codemirror/commands](https://github.com/codemirror/commands) from 6.3.2 to 6.3.3.
- [Changelog](https://github.com/codemirror/commands/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codemirror/commands/compare/6.3.2...6.3.3)

---
updated-dependencies:
- dependency-name: "@codemirror/commands"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-01 00:24:22 +00:00
dependabot[bot]
cf61de0dba Bump gunicorn from 20.1.0 to 21.2.0
Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 20.1.0 to 21.2.0.
- [Release notes](https://github.com/benoitc/gunicorn/releases)
- [Commits](https://github.com/benoitc/gunicorn/compare/20.1.0...21.2.0)

---
updated-dependencies:
- dependency-name: gunicorn
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-01 00:05:19 +00:00
dependabot[bot]
29a937c44d Bump django-cors-headers from 4.2.0 to 4.3.1
Bumps [django-cors-headers](https://github.com/adamchainz/django-cors-headers) from 4.2.0 to 4.3.1.
- [Changelog](https://github.com/adamchainz/django-cors-headers/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/adamchainz/django-cors-headers/compare/4.2.0...4.3.1)

---
updated-dependencies:
- dependency-name: django-cors-headers
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-01 00:04:56 +00:00
smilerz
c597aed956 updated branch info 2024-02-29 11:13:25 -06:00
smilerz
7e6f3ad92b add badges to README
publish reports to gh-pages
2024-02-29 11:13:06 -06:00
smilerz
b2c5e3d5e7 Pytest and Coverage Reports 2024-02-29 11:12:19 -06:00
smilerz
9344bf80da added coverage
added pytest reporting
updated Github Action CI/CD to write coverage output to docs
updated GA CI/CD to generate test and coverage badges
2024-02-29 11:11:41 -06:00
smilerz
b78597fa52 updated link to Dependabot documentation 2024-02-29 11:09:52 -06:00
smilerz
75b7397343 created Development dependencies in requirements.txt
exclude installing Dev libraries in Dockerfile
2024-02-29 11:09:46 -06:00
Anand Patel
7b506ff903 Remove unnecessary imports in meal plan ical test. 2024-02-29 16:13:17 +00:00
c0mputerguru
23a6efbb05 Merge branch 'TandoorRecipes:develop' into ical-default-dates 2024-02-29 08:07:21 -08:00
vabene1111
701f631c5f Merge pull request #2998 from TandoorRecipes/dependabot/npm_and_yarn/vue/workbox-expiration-7.0.0
Bump workbox-expiration from 6.6.1 to 7.0.0 in /vue
2024-02-29 16:52:01 +01:00
vabene1111
a829cdd85d Merge pull request #2996 from TandoorRecipes/dependabot/npm_and_yarn/vue/workbox-precaching-7.0.0
Bump workbox-precaching from 6.6.1 to 7.0.0 in /vue
2024-02-29 16:51:52 +01:00
vabene1111
27b2743e82 Merge pull request #2995 from TandoorRecipes/dependabot/pip/django-webpack-loader-3.0.1
Bump django-webpack-loader from 1.8.1 to 3.0.1
2024-02-29 16:51:40 +01:00
vabene1111
095b70d446 Merge pull request #2989 from TandoorRecipes/dependabot/github_actions/actions/checkout-4
Bump actions/checkout from 3 to 4
2024-02-29 16:51:01 +01:00
vabene1111
da313916db Merge pull request #2991 from TandoorRecipes/dependabot/pip/pyppeteer-2.0.0
Bump pyppeteer from 1.0.2 to 2.0.0
2024-02-29 16:50:53 +01:00
vabene1111
f4ea70081c Merge pull request #2994 from TandoorRecipes/dependabot/pip/lxml-5.1.0
Bump lxml from 4.9.3 to 5.1.0
2024-02-29 16:50:42 +01:00
dependabot[bot]
203e0795ad Bump pyppeteer from 1.0.2 to 2.0.0
Bumps [pyppeteer](https://github.com/pyppeteer/pyppeteer) from 1.0.2 to 2.0.0.
- [Changelog](https://github.com/pyppeteer/pyppeteer/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/pyppeteer/pyppeteer/compare/1.0.2...2.0.0)

---
updated-dependencies:
- dependency-name: pyppeteer
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-29 15:50:22 +00:00
vabene1111
ecdeb6b66b Merge pull request #2992 from TandoorRecipes/dependabot/github_actions/actions/cache-4
Bump actions/cache from 3 to 4
2024-02-29 16:50:18 +01:00
vabene1111
003e4a8b37 Merge pull request #2997 from TandoorRecipes/dependabot/npm_and_yarn/vue/codemirror/view-6.24.1
Bump @codemirror/view from 6.23.1 to 6.24.1 in /vue
2024-02-29 16:50:04 +01:00
vabene1111
107984de11 Merge pull request #2993 from TandoorRecipes/dependabot/pip/icalendar-5.0.11
Bump icalendar from 5.0.7 to 5.0.11
2024-02-29 16:49:07 +01:00
dependabot[bot]
70ea97a551 Bump actions/checkout from 3 to 4
Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-29 15:49:02 +00:00
vabene1111
1965a7213a Merge pull request #2990 from TandoorRecipes/dependabot/pip/homeassistant-api-4.2.1
Bump homeassistant-api from 4.1.1.post2 to 4.2.1
2024-02-29 16:48:58 +01:00
dependabot[bot]
9f95f9eb14 Bump @codemirror/view from 6.23.1 to 6.24.1 in /vue
Bumps [@codemirror/view](https://github.com/codemirror/view) from 6.23.1 to 6.24.1.
- [Changelog](https://github.com/codemirror/view/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codemirror/view/compare/6.23.1...6.24.1)

---
updated-dependencies:
- dependency-name: "@codemirror/view"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-29 15:48:22 +00:00
vabene1111
fd1bdef440 Merge pull request #2988 from TandoorRecipes/dependabot/github_actions/awalsh128/cache-apt-pkgs-action-1.4.1
Bump awalsh128/cache-apt-pkgs-action from 1.3.1 to 1.4.1
2024-02-29 16:47:49 +01:00
vabene1111
60ac24acb0 Merge pull request #2999 from TandoorRecipes/dependabot/npm_and_yarn/vue/vue/composition-api-1.7.2
Bump @vue/composition-api from 1.7.1 to 1.7.2 in /vue
2024-02-29 16:46:57 +01:00
vabene1111
f147f51ba2 Merge pull request #3001 from TandoorRecipes/dependabot/npm_and_yarn/vue/moment-2.30.1
Bump moment from 2.29.4 to 2.30.1 in /vue
2024-02-29 16:46:41 +01:00
dependabot[bot]
b36483410b Bump moment from 2.29.4 to 2.30.1 in /vue
Bumps [moment](https://github.com/moment/moment) from 2.29.4 to 2.30.1.
- [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/moment/moment/compare/2.29.4...2.30.1)

---
updated-dependencies:
- dependency-name: moment
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-29 15:44:52 +00:00
vabene1111
98aa1297b1 Merge pull request #3000 from TandoorRecipes/dependabot/npm_and_yarn/vue/codemirror/autocomplete-6.13.0
Bump @codemirror/autocomplete from 6.11.1 to 6.13.0 in /vue
2024-02-29 16:44:35 +01:00
dependabot[bot]
fa273cd4fe Bump @codemirror/autocomplete from 6.11.1 to 6.13.0 in /vue
Bumps [@codemirror/autocomplete](https://github.com/codemirror/autocomplete) from 6.11.1 to 6.13.0.
- [Changelog](https://github.com/codemirror/autocomplete/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codemirror/autocomplete/compare/6.11.1...6.13.0)

---
updated-dependencies:
- dependency-name: "@codemirror/autocomplete"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-29 15:43:44 +00:00
dependabot[bot]
5da8569b8e Bump @vue/composition-api from 1.7.1 to 1.7.2 in /vue
Bumps [@vue/composition-api](https://github.com/vuejs/composition-api) from 1.7.1 to 1.7.2.
- [Release notes](https://github.com/vuejs/composition-api/releases)
- [Changelog](https://github.com/vuejs/composition-api/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/composition-api/compare/v1.7.1...v1.7.2)

---
updated-dependencies:
- dependency-name: "@vue/composition-api"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-29 15:43:09 +00:00
dependabot[bot]
46430b81a0 Bump workbox-expiration from 6.6.1 to 7.0.0 in /vue
Bumps [workbox-expiration](https://github.com/googlechrome/workbox) from 6.6.1 to 7.0.0.
- [Release notes](https://github.com/googlechrome/workbox/releases)
- [Commits](https://github.com/googlechrome/workbox/commits/v7.0.0)

---
updated-dependencies:
- dependency-name: workbox-expiration
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-29 15:42:47 +00:00
dependabot[bot]
7e3b74b926 Bump workbox-precaching from 6.6.1 to 7.0.0 in /vue
Bumps [workbox-precaching](https://github.com/googlechrome/workbox) from 6.6.1 to 7.0.0.
- [Release notes](https://github.com/googlechrome/workbox/releases)
- [Commits](https://github.com/googlechrome/workbox/commits/v7.0.0)

---
updated-dependencies:
- dependency-name: workbox-precaching
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-29 15:41:57 +00:00
dependabot[bot]
7cf629d8ee Bump django-webpack-loader from 1.8.1 to 3.0.1
Bumps [django-webpack-loader](https://github.com/django-webpack/django-webpack-loader) from 1.8.1 to 3.0.1.
- [Release notes](https://github.com/django-webpack/django-webpack-loader/releases)
- [Changelog](https://github.com/django-webpack/django-webpack-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/django-webpack/django-webpack-loader/compare/1.8.1...3.0.1)

---
updated-dependencies:
- dependency-name: django-webpack-loader
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-29 15:41:28 +00:00
dependabot[bot]
20653618bb Bump lxml from 4.9.3 to 5.1.0
Bumps [lxml](https://github.com/lxml/lxml) from 4.9.3 to 5.1.0.
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-4.9.3...lxml-5.1.0)

---
updated-dependencies:
- dependency-name: lxml
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-29 15:41:24 +00:00
dependabot[bot]
7ffe0efc07 Bump icalendar from 5.0.7 to 5.0.11
Bumps [icalendar](https://github.com/collective/icalendar) from 5.0.7 to 5.0.11.
- [Changelog](https://github.com/collective/icalendar/blob/master/CHANGES.rst)
- [Commits](https://github.com/collective/icalendar/compare/v5.0.7...v5.0.11)

---
updated-dependencies:
- dependency-name: icalendar
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-29 15:41:13 +00:00
dependabot[bot]
5447b2bce4 Bump actions/cache from 3 to 4
Bumps [actions/cache](https://github.com/actions/cache) from 3 to 4.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-29 15:41:09 +00:00
dependabot[bot]
0cfa61692c Bump homeassistant-api from 4.1.1.post2 to 4.2.1
Bumps [homeassistant-api](https://github.com/GrandMoff100/HomeAssistantAPI) from 4.1.1.post2 to 4.2.1.
- [Release notes](https://github.com/GrandMoff100/HomeAssistantAPI/releases)
- [Commits](https://github.com/GrandMoff100/HomeAssistantAPI/compare/v4.1.1.post2...v4.2.1)

---
updated-dependencies:
- dependency-name: homeassistant-api
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-29 15:41:05 +00:00
dependabot[bot]
006a83132b Bump awalsh128/cache-apt-pkgs-action from 1.3.1 to 1.4.1
Bumps [awalsh128/cache-apt-pkgs-action](https://github.com/awalsh128/cache-apt-pkgs-action) from 1.3.1 to 1.4.1.
- [Release notes](https://github.com/awalsh128/cache-apt-pkgs-action/releases)
- [Commits](https://github.com/awalsh128/cache-apt-pkgs-action/compare/v1.3.1...v1.4.1)

---
updated-dependencies:
- dependency-name: awalsh128/cache-apt-pkgs-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-29 15:41:01 +00:00
vabene1111
ba9f816513 Merge pull request #2987 from c0mputerguru/devcontainer
Add devcontainer support
2024-02-29 16:40:27 +01:00
Einir Einisson
498cbe0191 Added translation using Weblate (Icelandic) 2024-02-29 10:20:10 +00:00
Anand Patel
49d3d6cbc2 Add tests for plan-ical 2024-02-29 04:35:25 +00:00
Anand Patel
0d56d8a836 Merge commit '23c58868dee75fbe7a082d4cc2113f8e3ea9a9b2' into ical-default-dates 2024-02-28 18:34:09 -08:00
Tomasz Klimczak
6548f7f4d8 Translated using Weblate (Polish)
Currently translated at 100.0% (567 of 567 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/pl/
2024-02-29 02:19:57 +00:00
M Ugur
e639ff9d77 Translated using Weblate (Turkish)
Currently translated at 3.6% (18 of 490 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/tr/
2024-02-29 02:19:57 +00:00
c0mputerguru
23c58868de Allow tokens for getting ical 2024-02-28 18:03:50 -08:00
Anand Patel
3936e4c66f Add self to contributors list 2024-02-29 01:43:40 +00:00
Anand Patel
ea0675b35e Add instructions on how to use devcontainers in vscode. 2024-02-29 01:40:59 +00:00
Anand Patel
f855ba1c0f Update docs as vscode tasks are not devcontainer specific. 2024-02-29 01:30:56 +00:00
Anand Patel
59f645d8c9 Documentation updates for devcontainer based development. 2024-02-29 01:29:25 +00:00
Anand Patel
061f874f45 Refactor some vscode tasks and add doc dependency. 2024-02-29 01:23:11 +00:00
Anand Patel
5ccc8d12f0 Add task to serve documentation. 2024-02-29 01:06:45 +00:00
Anand Patel
42e841d1e6 Add the fact that dev server depends on building Vue components 2024-02-29 00:57:44 +00:00
Anand Patel
ba6cac803c Fix dependencies to set tests up. 2024-02-29 00:47:31 +00:00
Anand Patel
0b51d87a06 Add task for collection of static files as it is needed for tests to pass. 2024-02-29 00:26:49 +00:00
Anand Patel
77d2e29fe4 Add devcontainer configuration 2024-02-28 23:42:52 +00:00
vabene1111
54c5655b85 SLE's dont need to belong to a shopping list 2024-02-28 20:21:03 +01:00
vabene1111
a02e9e806c fixed migration tree 2024-02-28 17:21:18 +01:00
vabene1111
66a904568b fixed merge error 2024-02-28 17:19:10 +01:00
vabene1111
7f6f579757 fixed imports again 2024-02-28 17:11:46 +01:00
vabene1111
6c993aabad Merge pull request #2967 from smilerz/deprecate_old_code
Deprecate old code
2024-02-28 17:10:11 +01:00
vabene1111
1a31847223 Merge branch 'develop' into deprecate_old_code 2024-02-28 17:10:03 +01:00
vabene1111
9996d521f5 fixed imports 2024-02-28 17:02:33 +01:00
vabene1111
7ebbad3827 Merge pull request #2975 from smilerz/api_enhancements
Api enhancements
2024-02-28 17:01:56 +01:00
vabene1111
1e1399cfe9 Merge branch 'develop' into api_enhancements 2024-02-28 17:00:08 +01:00
vabene1111
5b32160051 Merge pull request #2983 from jdecourval/develop
doc: Add installation instructions for ArchLinux
2024-02-28 16:58:16 +01:00
Jerome
d4ba2b9dd2 Add archlinux doc to mkdocs config + add warning 2024-02-28 10:43:49 -05:00
Jerome
961201412e doc: Add installation instructions for ArchLinux 2024-02-28 10:43:49 -05:00
Lukas Åteg
67b294c141 Translated using Weblate (Swedish)
Currently translated at 95.3% (536 of 562 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sv/
2024-02-27 12:19:58 +00:00
Lukas Åteg
d71557dcec Translated using Weblate (Swedish)
Currently translated at 100.0% (371 of 371 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/sv/
2024-02-27 12:19:58 +00:00
vabene1111
c5d39b1c99 Merge pull request #2979 from jinnatar/develop
docs(authentication): Improve auth docs to match current allauth best practices and syntax
2024-02-27 07:23:39 +01:00
vabene1111
c9e0f40e88 fixed mealmaster regex 2024-02-26 16:29:04 +01:00
vabene1111
dc5de6f0a2 added migration and try/catch to apps.py 2024-02-26 16:13:19 +01:00
Jinna Kiisuo
4a7eb91e67 docs(authentication): Improve auth docs to match current allauth best practices and syntax 2024-02-26 13:55:53 +02:00
vabene1111
c15bd663cb Merge pull request #2874 from Mikhail5555/HomeAssistantConnector
Home assistant connector
2024-02-26 08:06:50 +01:00
vabene1111
95fdf893f4 Merge pull request #2968 from smilerz/keywords_not_required
change Recipe API to make keywords an optional field
2024-02-26 08:01:25 +01:00
vabene1111
63f9d5c181 Merge pull request #2974 from smilerz/logging_api_paging
paginate cooklog and viewlog tables on history view
2024-02-26 07:56:00 +01:00
c0mputerguru
86b80a78d6 Allow non-specified to/from dates for ical. 2024-02-24 20:31:58 -08:00
vabene1111
59ecc40dc6 added comment field and a recipe filter to cook log 2024-02-24 13:18:08 +01:00
vabene1111
ae70064c06 renamed ingredients_markdown and removed ingredients_vue 2024-02-24 13:05:23 +01:00
vabene1111
6de68707ed fixed missing servings get parameter breaking view in some cases 2024-02-24 11:16:09 +01:00
smilerz
6224e38138 add filter for automation type on automation API 2024-02-23 13:27:59 -06:00
smilerz
0e8cac7ab9 paginated steps on GenericModelList
paginate CustomFilter api and GenericModelList
paginate Automation api and GenericModelList
2024-02-23 08:33:50 -06:00
smilerz
64ab768add paginate cooklog and viewlog tables on history view 2024-02-23 07:23:10 -06:00
vabene1111
f6607aa2e3 Merge pull request #2969 from TandoorRecipes/dependabot/pip/cryptography-42.0.4
Bump cryptography from 42.0.2 to 42.0.4
2024-02-22 06:19:10 +01:00
dependabot[bot]
dccdb7cc2f Bump cryptography from 42.0.2 to 42.0.4
Bumps [cryptography](https://github.com/pyca/cryptography) from 42.0.2 to 42.0.4.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/42.0.2...42.0.4)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-21 20:50:58 +00:00
smilerz
b1f418622f change Recipe API to make keywords an optional field 2024-02-21 08:25:06 -06:00
smilerz
23a7dc0ebf remove django_autocomplete_light from requirements
add back CreateRecipe view
2024-02-21 08:19:45 -06:00
smilerz
70e754eb37 remove unused delete and new forms 2024-02-20 17:56:55 -06:00
smilerz
ae9a78f2e1 remove commented out methods and functions 2024-02-20 17:47:23 -06:00
smilerz
a4849adb4c remove recipebook and recipebookentry pages 2024-02-20 17:30:29 -06:00
smilerz
da9a2b4dc2 remove Supermarket view and template 2024-02-20 17:17:43 -06:00
smilerz
8f65ecfc18 remove dal autocomplete 2024-02-20 17:14:55 -06:00
smilerz
c8c8792ea8 remove ShoppingList model and tests 2024-02-20 17:09:18 -06:00
Mikhail Epifanov
4e43a7a325 add connectors to mkdocs 2024-02-20 17:54:58 +01:00
Mikhail Epifanov
8f3effe194 bump pytest-asyncio for pytest 8.0.0 2024-02-20 17:53:26 +01:00
Mikhail Epifanov
5e508944a3 move env settings to configuration with backlink from connectors page 2024-02-20 17:48:35 +01:00
Mikhail Epifanov
6ce95fb393 add reference to the feature configuration in configuration.md 2024-02-20 09:25:04 +01:00
Mikhail Epifanov
3e641e4d28 Merge remote-tracking branch 'origin/develop' into HomeAssistantConnector
# Conflicts:
#	cookbook/forms.py
#	requirements.txt
2024-02-20 09:18:19 +01:00
vabene1111
de80702e3f fixed property duplicate detection 2024-02-20 07:54:13 +01:00
vabene1111
565a732ff0 remove property 2024-02-19 21:56:16 +01:00
vabene1111
e6fce0b4a7 property editor enhancements 2024-02-19 21:28:38 +01:00
vabene1111
04e0a6df4a Merge branch 'develop' of https://github.com/TandoorRecipes/recipes into develop 2024-02-19 20:53:13 +01:00
vabene1111
b8cadf1faa fixed property editor fdc import 2024-02-19 20:53:07 +01:00
vabene1111
2b15a5e6be Merge pull request #2956 from smilerz/openapi_types
fixed openapi schema type int ==> integer
2024-02-19 20:27:42 +01:00
vabene1111
21094eecc6 fixed meal plan not loading 2024-02-19 20:04:31 +01:00
vabene1111
fece7e9bd6 fixed food create 2024-02-19 19:57:56 +01:00
vabene1111
b109e28b0c almost all unit conversion working 2024-02-19 17:20:04 +01:00
smilerz
e766df947e fixed openapi schema type int ==> integer 2024-02-19 07:34:32 -06:00
vabene1111
0725fb0f2b added management command to delete duplicate food properties 2024-02-19 13:07:34 +01:00
vabene1111
33ac00e294 improved importer functions unit and category 2024-02-19 09:41:45 +01:00
vabene1111
6b6556d532 fixed showing import numbers on open data component 2024-02-19 08:09:09 +01:00
vabene1111
47c508831c fixed unit edit not showing plural input 2024-02-19 08:08:17 +01:00
vabene1111
3a349b1bd2 use ID in unit food import 2024-02-18 21:38:52 +01:00
vabene1111
f085e7ff2f fixed merging issue 2024-02-18 21:35:16 +01:00
vabene1111
ac68fd30ae fixed two more import errors 2024-02-18 21:30:02 +01:00
vabene1111
b0439cc13b food editor open data slug fix 2024-02-18 18:20:45 +01:00
vabene1111
7c1de82c8a what you get for not testing locally 2024-02-18 18:12:24 +01:00
vabene1111
7bc567ab95 name uniquness checking for food import 2024-02-18 18:01:59 +01:00
vabene1111
596ec9134e fixed title of space management page 2024-02-18 17:59:06 +01:00
vabene1111
bfb8c31329 fixed issue in open data importer 2024-02-18 17:51:01 +01:00
vabene1111
55b8b78a16 show where properties are missing 2024-02-18 17:48:47 +01:00
vabene1111
9e63c5321e fixed property calculation issues
- don't count ingredients without amounts as missing properties
- don't fail when property_amount is null
2024-02-18 17:45:56 +01:00
vabene1111
28479e96e9 improved property system to differentiate between unknown and zero 2024-02-18 11:26:16 +01:00
vabene1111
717d4d2346 added open data slug to food editor 2024-02-18 09:06:51 +01:00
vabene1111
f57d2ca832 improved open data importer and fdc API 2024-02-18 08:50:50 +01:00
vabene1111
03ccc8e044 Merge pull request #2941 from tomtjes/add-human-friendly-css-classes
Add human-friendly css classes and scaling indicators
2024-02-18 08:05:10 +01:00
vabene1111
d62ba2f5e8 Merge branch 'develop' into add-human-friendly-css-classes 2024-02-18 08:04:27 +01:00
Andrea
d75c4ffaed Translated using Weblate (Italian)
Currently translated at 93.0% (456 of 490 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/it/
2024-02-17 19:16:35 +00:00
vabene1111
4869f9596a fixerd serving size parsing in property importer 2024-02-17 11:08:21 +01:00
vabene1111
0989a58af5 fixed rezeptsuite importer 2024-02-17 10:52:08 +01:00
vabene1111
278258946f Merge branch 'develop' of https://github.com/TandoorRecipes/recipes into develop 2024-02-17 10:52:02 +01:00
vabene1111
2f0b32f3c2 added help to importer page 2024-02-17 10:51:57 +01:00
vabene1111
d78d23b096 Merge pull request #2924 from TandoorRecipes/dependabot/pip/pytest-django-4.8.0
Bump pytest-django from 4.6.0 to 4.8.0
2024-02-17 10:33:21 +01:00
dependabot[bot]
b6a99e2494 Bump pytest-django from 4.6.0 to 4.8.0
Bumps [pytest-django](https://github.com/pytest-dev/pytest-django) from 4.6.0 to 4.8.0.
- [Release notes](https://github.com/pytest-dev/pytest-django/releases)
- [Changelog](https://github.com/pytest-dev/pytest-django/blob/master/docs/changelog.rst)
- [Commits](https://github.com/pytest-dev/pytest-django/compare/v4.6.0...v4.8.0)

---
updated-dependencies:
- dependency-name: pytest-django
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-17 09:32:58 +00:00
vabene1111
896ab1636f Merge pull request #2923 from TandoorRecipes/dependabot/pip/pytest-8.0.0
Bump pytest from 7.4.3 to 8.0.0
2024-02-17 10:32:20 +01:00
vabene1111
9cf13e898c all types of unit conversion fixed 2024-02-17 10:10:09 +01:00
vabene1111
705fa18dd6 fixed open data property type and category 2024-02-17 08:43:41 +01:00
vabene1111
b3a283c1a4 fixed two more comparisons 2024-02-17 08:19:46 +01:00
vabene1111
e409fc03e9 Merge pull request #2951 from TandoorRecipes/dependabot/pip/cryptography-42.0.2
Bump cryptography from 42.0.0 to 42.0.2
2024-02-17 08:09:43 +01:00
dependabot[bot]
0a154ec847 Bump cryptography from 42.0.0 to 42.0.2
Bumps [cryptography](https://github.com/pyca/cryptography) from 42.0.0 to 42.0.2.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/42.0.0...42.0.2)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-17 00:53:52 +00:00
vabene1111
53e27d62e6 fixed open data import for units 2024-02-16 22:56:19 +01:00
vabene1111
48447f1c8a fixed always false check 2024-02-16 20:40:40 +01:00
vabene1111
ce32c20f67 fixed to space delete 2024-02-16 20:36:08 +01:00
vabene1111
3fd3c8ec12 recipe book entry order 2024-02-16 20:09:38 +01:00
Mikhail Epifanov
f50bf39e60 merge 2024-02-17 00:34:16 +05:30
Mikhail Epifanov
beb860acc6 Merge remote-tracking branch 'origin/develop' into HomeAssistantConnector
# Conflicts:
#	cookbook/views/api.py
#	recipes/settings.py
2024-02-17 00:29:29 +05:30
vabene1111
778f40eac4 Merge pull request #2950 from smilerz/deprecate_settings_form
deprecate unused forms
2024-02-16 19:58:36 +01:00
vabene1111
1883da5e49 Merge branch 'develop' into deprecate_settings_form 2024-02-16 19:58:31 +01:00
dependabot[bot]
dd0ae9b1b3 Bump pytest from 7.4.3 to 8.0.0
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.4.3 to 8.0.0.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/7.4.3...8.0.0)

---
updated-dependencies:
- dependency-name: pytest
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-16 18:56:20 +00:00
vabene1111
db484f8adb Merge pull request #2918 from TandoorRecipes/dependabot/npm_and_yarn/vue/webpack-bundle-tracker-3.0.1
Bump webpack-bundle-tracker from 1.8.1 to 3.0.1 in /vue
2024-02-16 19:55:38 +01:00
vabene1111
c94f9291ce Merge pull request #2920 from TandoorRecipes/dependabot/pip/python-ldap-3.4.4
Bump python-ldap from 3.4.3 to 3.4.4
2024-02-16 19:55:10 +01:00
vabene1111
dfbab2c57a Merge pull request #2915 from TandoorRecipes/dependabot/npm_and_yarn/vue/typescript-5.3.3
Bump typescript from 5.1.6 to 5.3.3 in /vue
2024-02-16 19:54:53 +01:00
vabene1111
631af65cf3 Merge pull request #2810 from m7modSy/develop
Reorder books #2338
2024-02-16 19:53:38 +01:00
vabene1111
9b84b82b58 Merge pull request #2919 from TandoorRecipes/dependabot/npm_and_yarn/vue/codemirror/view-6.23.1
Bump @codemirror/view from 6.22.2 to 6.23.1 in /vue
2024-02-16 19:48:48 +01:00
dependabot[bot]
144f72fc79 Bump python-ldap from 3.4.3 to 3.4.4
Bumps [python-ldap](https://github.com/python-ldap/python-ldap) from 3.4.3 to 3.4.4.
- [Release notes](https://github.com/python-ldap/python-ldap/releases)
- [Commits](https://github.com/python-ldap/python-ldap/compare/python-ldap-3.4.3...python-ldap-3.4.4)

---
updated-dependencies:
- dependency-name: python-ldap
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-16 18:48:41 +00:00
vabene1111
a9e9f8345a Merge pull request #2916 from TandoorRecipes/dependabot/npm_and_yarn/vue/axios-1.6.7
Bump axios from 1.6.0 to 1.6.7 in /vue
2024-02-16 19:48:05 +01:00
vabene1111
b7c95a1d11 Merge pull request #2917 from TandoorRecipes/dependabot/npm_and_yarn/vue/pinia-2.1.7
Bump pinia from 2.1.6 to 2.1.7 in /vue
2024-02-16 19:47:52 +01:00
vabene1111
047aace9c2 Merge pull request #2922 from TandoorRecipes/dependabot/pip/django-auth-ldap-4.6.0
Bump django-auth-ldap from 4.4.0 to 4.6.0
2024-02-16 19:47:44 +01:00
vabene1111
b64319a232 Merge pull request #2921 from TandoorRecipes/dependabot/pip/django-tables2-2.7.0
Bump django-tables2 from 2.5.3 to 2.7.0
2024-02-16 19:47:39 +01:00
vabene1111
b99443cb30 Merge pull request #2938 from patmagauran/meal-plan-serving-size-link
Add ability to open recipes with specified number of servings from meal plan
2024-02-16 19:46:36 +01:00
smilerz
9506f2889a deprecate unused forms 2024-02-16 09:21:27 -06:00
tomtjes
f34dc4d242 move escapeCSS function to mixins 2024-02-15 14:56:04 -05:00
vabene1111
5bbcdd2551 Merge branch 'develop' of https://github.com/TandoorRecipes/recipes into develop 2024-02-15 20:55:02 +01:00
vabene1111
43443305e6 basic bold function 2024-02-15 20:54:54 +01:00
dalan
038d03783f Translated using Weblate (Chinese (Simplified))
Currently translated at 99.2% (558 of 562 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hans/
2024-02-15 03:19:57 +00:00
dalan
80c594d486 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (490 of 490 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/zh_Hans/
2024-02-15 03:19:57 +00:00
tomtjes
b5a204265a fix CSS escape (remove HTML sanitize) 2024-02-14 17:18:26 -05:00
tomtjes
8e72108290 use BEM classes
add class names for foods, units, keywords (not following BEM closely)
2024-02-14 16:44:12 -05:00
vabene1111
d1042835a5 Merge pull request #2948 from maxemann96/bugfix/wrong-keycloak-docs
Fixed wrong keycloak docs
2024-02-14 07:42:25 +01:00
Patrick Magauran
cf190734b2 Switches to named GET Parameter for servings 2024-02-13 20:59:04 -05:00
Patrick Magauran
a9a3dd6e51 Revert "Add Setting to enable / disable feature"
This reverts commit 768e9f8801.
2024-02-13 20:30:59 -05:00
vabene1111
00ff13ae08 basic button affecting editor 2024-02-13 17:59:44 +01:00
Kirstin Seidel-Gebert
d7d34b2326 Translated using Weblate (German)
Currently translated at 100.0% (490 of 490 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/de/
2024-02-13 16:19:57 +00:00
Maximilian Hippler
250d58f8a1 Fixed wrong keycloak docs 2024-02-13 16:09:06 +01:00
vabene1111
0499745772 added captcha option to password reset form 2024-02-13 10:56:43 +01:00
vabene1111
1b2c4a3062 added additional rate limiting to password reset 2024-02-13 10:03:24 +01:00
Tomasz Klimczak
9232465e21 Translated using Weblate (Polish)
Currently translated at 100.0% (562 of 562 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/pl/
2024-02-12 12:19:57 +00:00
Kirstin Seidel-Gebert
30e853088c Translated using Weblate (German)
Currently translated at 100.0% (562 of 562 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/
2024-02-12 12:19:57 +00:00
Kirstin Seidel-Gebert
c45a88d048 Translated using Weblate (German)
Currently translated at 100.0% (490 of 490 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/de/
2024-02-12 12:19:57 +00:00
vabene1111
8f272eba3b able to edit template strings 2024-02-11 10:41:15 +01:00
vabene1111
ad5562d850 Merge branch 'develop' of https://github.com/TandoorRecipes/recipes into develop 2024-02-11 10:00:54 +01:00
vabene1111
ca35052ac0 some more markdown editor progress 2024-02-11 10:00:49 +01:00
vabene1111
3f19d94d2f Merge pull request #2937 from smilerz/automation_fix
regex replace not run on food if there are no food aliases
2024-02-11 09:31:15 +01:00
Jonan B
b5c3ef72ef Translated using Weblate (Dutch)
Currently translated at 100.0% (490 of 490 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/nl/
2024-02-10 12:20:02 +00:00
vabene1111
cca7b7f558 codemirror history and highlighting 2024-02-10 12:10:21 +01:00
vabene1111
3f962345f7 placeholder working 2024-02-10 10:08:32 +01:00
dependabot[bot]
d92211485d Bump typescript from 5.1.6 to 5.3.3 in /vue
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 5.1.6 to 5.3.3.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/compare/v5.1.6...v5.3.3)

---
updated-dependencies:
- dependency-name: typescript
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-10 08:29:08 +00:00
vabene1111
0827cb387f markdown editor in test view 2024-02-10 09:28:44 +01:00
vabene1111
b2a4b084d7 Merge branch 'feature/shopping-ui' into develop 2024-02-10 09:26:46 +01:00
vabene1111
8e4e785179 added editor button for scalable number 2024-02-10 09:26:29 +01:00
vabene1111
ef0f181268 Merge branch 'develop' into feature/shopping-ui 2024-02-10 09:12:34 +01:00
vabene1111
f3e42f13b1 Merge pull request #2940 from TandoorRecipes/dependabot/pip/django-4.2.10
Bump django from 4.2.7 to 4.2.10
2024-02-10 09:07:56 +01:00
vabene1111
fb8e04fee5 swipe test view 2024-02-10 09:07:03 +01:00
vabene1111
03c775d1cc added merge capabilities to supermarket category 2024-02-10 09:01:21 +01:00
vabene1111
6aa2aa42c7 added more editing capabilities to line item modal 2024-02-10 08:56:15 +01:00
Mikhail Epifanov
20e1435abf remove migration 2024-02-08 17:28:33 +01:00
tomtjes
0ee5164aac remove class used twice 2024-02-07 20:51:59 -05:00
tomtjes
1819ff2bbd add classes to main components/views 2024-02-07 19:18:51 -05:00
tomtjes
14c2be9277 add classes to scalable numbers
apply "scalable" to all
apply "scaled-up" when ingredient factor is >1
apply "unscaled" when ingredient factor is 1
apply "scaled-down" when factor is <1
2024-02-07 16:51:19 -05:00
dependabot[bot]
6377d55ea5 Bump django from 4.2.7 to 4.2.10
Bumps [django](https://github.com/django/django) from 4.2.7 to 4.2.10.
- [Commits](https://github.com/django/django/compare/4.2.7...4.2.10)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-07 18:21:59 +00:00
Patrick Magauran
768e9f8801 Add Setting to enable / disable feature 2024-02-06 22:52:59 -05:00
Patrick Magauran
e8db2b6401 Clicking on Recipe in Meal Plan auto does servings 2024-02-06 22:37:25 -05:00
Patrick Magauran
13f532a67b Add serving size to recipe url so it loads with num 2024-02-06 22:21:37 -05:00
vabene1111
61ccc6061c updated api client 2024-02-06 19:21:55 +01:00
smilerz
dc7db75963 regex replace not run on food if there are no food aliases 2024-02-06 11:14:47 -06:00
vabene1111
98b06b6f3c improved modal 2024-02-06 14:48:18 +01:00
vabene1111
dffb2d4eae fixed test 2024-02-06 14:42:14 +01:00
vabene1111
08a2b4d0b2 formatted file 2024-02-06 14:10:36 +01:00
vabene1111
5211fbe6da styling and bg sync message 2024-02-06 13:52:26 +01:00
vabene1111
a2cb1ccf3a Revert "playing with checkbox design"
This reverts commit ece7ca7e82.
2024-02-06 13:25:34 +01:00
vabene1111
29438109a6 fixed postgres update doc mv -R 2024-02-06 10:58:17 +01:00
vabene1111
4bb4c3e9a4 Merge pull request #2935 from TandoorRecipes/dependabot/pip/cryptography-42.0.0
Bump cryptography from 41.0.7 to 42.0.0
2024-02-06 10:56:19 +01:00
dependabot[bot]
46dc0f1f03 Bump cryptography from 41.0.7 to 42.0.0
Bumps [cryptography](https://github.com/pyca/cryptography) from 41.0.7 to 42.0.0.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/41.0.7...42.0.0)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-06 03:28:24 +00:00
Mikhail Epifanov
1dc9244ac2 dont use timezone in test 2024-02-06 00:47:46 +01:00
Mikhail Epifanov
962d617839 switch to threading, f multiprocessing in python 2024-02-06 00:37:37 +01:00
Mikhail Epifanov
65a7c82af9 terminate worker on finalize 2024-02-06 00:17:23 +01:00
Mikhail Epifanov
2bfc8b0717 format 2024-02-06 00:11:46 +01:00
Mikhail Epifanov
16e8c1e8e3 disable connector in tests 2024-02-06 00:02:38 +01:00
Mikhail Epifanov
2a6c13fc5c add finalizer to stop worker on terminate 2024-02-05 23:50:57 +01:00
Mikhail Epifanov
408c2271a6 reduce timeout, remove report generation 2024-02-05 23:43:13 +01:00
Mikhail Epifanov
0e945f4bd7 add startup & termination log to worker 2024-02-05 23:40:50 +01:00
Mikhail Epifanov
0279013f72 remove loop closing 2024-02-05 23:37:18 +01:00
Mikhail Epifanov
074244ee12 add timeout to async test 2024-02-05 23:35:39 +01:00
Mikhail Epifanov
247907ef25 move from signals to apps, add dedicated feature docs, add config toggle to menu item, undo unnecessary changes 2024-02-05 23:26:33 +01:00
Mikhail Epifanov
c88dda90d4 Merge branch 'develop' into HomeAssistantConnector 2024-02-05 16:18:23 +01:00
vabene1111
59e949067c Merge branch 'develop' into feature/shopping-ui 2024-02-05 16:15:56 +01:00
vabene1111
3e97fa9633 fixed dash in PR 2024-02-05 16:15:50 +01:00
Mikhail Epifanov
513082255b Merge branch 'develop' into HomeAssistantConnector 2024-02-05 16:09:47 +01:00
vabene1111
1a5881bb4b Merge branch 'develop' into feature/shopping-ui
# Conflicts:
#	cookbook/serializer.py
2024-02-05 15:59:56 +01:00
vabene1111
b6cbb28a87 Merge pull request #2914 from Mikhail5555/CiPipelineImprovements
Add Caching and Test export to CI workflow
2024-02-05 15:50:25 +01:00
vabene1111
36c0fbffbe fixed duplicate detection in migration 0200 2024-02-05 14:52:40 +01:00
vabene1111
febf3a3d86 removed flawed duplicate detection 2024-02-05 14:05:11 +01:00
vabene1111
3f859e5227 Merge branch 'develop' of https://github.com/vabene1111/recipes into develop 2024-02-05 13:52:58 +01:00
vabene1111
7e39e6fea5 fixed meal type constraint 2024-02-05 13:52:52 +01:00
vabene1111
2fd72fe985 Merge pull request #2932 from software2000/develop
Update postgres in documentation
2024-02-05 13:51:33 +01:00
software2000
ce0ee8caaa update postgres in documentation to version 16 2024-02-04 22:32:03 +01:00
Mikhail Epifanov
75c0ca8a9e bunp migration 2024-02-02 20:52:05 +01:00
vabene1111
4eafbddfdb fixed SLE api endpoint 2024-02-02 09:31:33 +01:00
vabene1111
010fb0112f Merge branch 'develop' into feature/shopping-ui 2024-02-02 07:46:48 +01:00
vabene1111
ece7ca7e82 playing with checkbox design 2024-02-01 21:09:21 +01:00
vabene1111
bb1b1a40b6 fixed search on userfile and supermarket generic select 2024-02-01 20:00:51 +01:00
vabene1111
f7b25c9b31 easier supermarket select on mobile 2024-02-01 19:39:11 +01:00
vabene1111
7f6cd16a77 changed default supermarket prefs 2024-02-01 19:36:07 +01:00
Lorenzo
e5303967df Translated using Weblate (Italian)
Currently translated at 84.6% (469 of 554 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/it/
2024-02-01 17:22:53 +00:00
Lorenzo
199caff2a2 Translated using Weblate (Italian)
Currently translated at 93.0% (456 of 490 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/it/
2024-02-01 17:22:53 +00:00
dependabot[bot]
c3eb12160a Bump django-auth-ldap from 4.4.0 to 4.6.0
Bumps [django-auth-ldap](https://github.com/django-auth-ldap/django-auth-ldap) from 4.4.0 to 4.6.0.
- [Release notes](https://github.com/django-auth-ldap/django-auth-ldap/releases)
- [Changelog](https://github.com/django-auth-ldap/django-auth-ldap/blob/master/docs/changes.rst)
- [Commits](https://github.com/django-auth-ldap/django-auth-ldap/compare/4.4.0...4.6.0)

---
updated-dependencies:
- dependency-name: django-auth-ldap
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-01 00:34:00 +00:00
dependabot[bot]
f017c6ae68 Bump django-tables2 from 2.5.3 to 2.7.0
Bumps [django-tables2](https://github.com/jieter/django-tables2) from 2.5.3 to 2.7.0.
- [Changelog](https://github.com/jieter/django-tables2/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jieter/django-tables2/compare/v2.5.3...v2.7.0)

---
updated-dependencies:
- dependency-name: django-tables2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-01 00:33:57 +00:00
dependabot[bot]
b2f270a829 Bump @codemirror/view from 6.22.2 to 6.23.1 in /vue
Bumps [@codemirror/view](https://github.com/codemirror/view) from 6.22.2 to 6.23.1.
- [Changelog](https://github.com/codemirror/view/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codemirror/view/compare/6.22.2...6.23.1)

---
updated-dependencies:
- dependency-name: "@codemirror/view"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-01 00:28:43 +00:00
dependabot[bot]
f87fe43796 Bump webpack-bundle-tracker from 1.8.1 to 3.0.1 in /vue
Bumps [webpack-bundle-tracker](https://github.com/django-webpack/webpack-bundle-tracker) from 1.8.1 to 3.0.1.
- [Release notes](https://github.com/django-webpack/webpack-bundle-tracker/releases)
- [Commits](https://github.com/django-webpack/webpack-bundle-tracker/compare/1.8.1...v3.0.1)

---
updated-dependencies:
- dependency-name: webpack-bundle-tracker
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-01 00:28:22 +00:00
dependabot[bot]
b46809155a Bump pinia from 2.1.6 to 2.1.7 in /vue
Bumps [pinia](https://github.com/vuejs/pinia) from 2.1.6 to 2.1.7.
- [Release notes](https://github.com/vuejs/pinia/releases)
- [Commits](https://github.com/vuejs/pinia/compare/pinia@2.1.6...pinia@2.1.7)

---
updated-dependencies:
- dependency-name: pinia
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-01 00:28:00 +00:00
dependabot[bot]
30d69432ff Bump axios from 1.6.0 to 1.6.7 in /vue
Bumps [axios](https://github.com/axios/axios) from 1.6.0 to 1.6.7.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.6.0...v1.6.7)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-01 00:27:48 +00:00
vabene1111
6ccd74edab Merge branch 'develop' into feature/shopping-ui 2024-01-29 10:29:48 +01:00
Mikhail Epifanov
8b5b063da6 Merge branch 'develop' into HomeAssistantConnector 2024-01-29 09:57:10 +01:00
Mikhail Epifanov
a8983a4b8a undo workflow changes 2024-01-29 09:56:40 +01:00
Mikhail Epifanov
1ad5f4843f Merge branch 'develop' into CiPipelineImprovements 2024-01-29 09:49:39 +01:00
Mikhail Epifanov
971b58ccb0 add caching and test export 2024-01-29 09:48:19 +01:00
vabene1111
1d236998d2 Merge pull request #2909 from tomtjes/fixes-for-beta
fix description scroll
2024-01-29 09:06:49 +01:00
vabene1111
77f81523d0 lmiit SLE endpoint and always fitler for recent days 2024-01-29 09:02:11 +01:00
vabene1111
aac729a3a0 fixed firefox 2024-01-29 08:46:34 +01:00
vabene1111
ee7cdacc40 cleared TODOs 2024-01-29 08:41:02 +01:00
vabene1111
0f1a3ba5d8 improvements 2024-01-29 08:37:53 +01:00
vabene1111
4c6410d7ae fixed inspectioin rule 2024-01-29 08:03:51 +01:00
Mikhail Epifanov
502a606534 Update the code based on feedback. set Default to enabled, add to documentation how to disable it. Add extra documentation 2024-01-28 22:59:51 +01:00
vabene1111
fff2ecd58d some fixes 2024-01-28 20:31:24 +01:00
tomtjes
f54a6480f7 fix description scroll 2024-01-28 13:20:00 -05:00
Benedikt Weinheimer
1f5b5df6a5 Translated using Weblate (German)
Currently translated at 100.0% (554 of 554 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/
2024-01-28 17:20:02 +00:00
vabene1111
eaff34a3de fixed meal plan content shift 2024-01-28 16:34:18 +01:00
vabene1111
4724104f50 eslint rule 2024-01-28 16:34:12 +01:00
vabene1111
e2ebccda85 fixed meal plan content shift 2024-01-28 16:33:54 +01:00
vabene1111
79b57eab13 fixed paddings/horizontal scrol 2024-01-28 16:29:53 +01:00
Mahmoud
d4fbc266a1 removing wrong import and deleting migrations 2024-01-28 14:04:50 +01:00
vabene1111
558a2d2a30 really no flickering maybe 2024-01-28 14:03:36 +01:00
vabene1111
55877d69a0 hopefully this really prevents multiple auto syncs even in HMR 2024-01-28 12:27:24 +01:00
vabene1111
3c93e760d2 no more loading spinner size flicker 2024-01-28 12:21:24 +01:00
vabene1111
3fbfcb9939 translation and minor style tweaks 2024-01-28 12:17:46 +01:00
vabene1111
44f6a581c7 some more icons 2024-01-28 12:11:25 +01:00
vabene1111
5853ca9243 handle partially delayed/checked 2024-01-28 12:06:27 +01:00
vabene1111
09c1446c06 fixed pdf export 2024-01-28 11:39:00 +01:00
vabene1111
f0853ee11c not full width on large screens 2024-01-28 11:19:06 +01:00
vabene1111
6e6af47d8c fixed migration order 2024-01-28 11:06:38 +01:00
vabene1111
3e51bdc7f0 Merge branch 'develop' into feature/shopping-ui
# Conflicts:
#	cookbook/serializer.py
2024-01-28 11:05:56 +01:00
vabene1111
5001d05df2 removed use plurarl from space serializer 2024-01-28 11:05:31 +01:00
vabene1111
58989a96e3 added force theme 2024-01-28 09:22:37 +01:00
vabene1111
25c8f18b79 Merge pull request #2380 from RomRider/fix-1706
add: support to scale numbers/amounts in a recipe step
2024-01-28 09:18:19 +01:00
vabene1111
255ecd4a88 Merge pull request #2826 from sohmc/update-documentation
Updated nginx documentation to include image server instructions
2024-01-28 08:49:35 +01:00
vabene1111
6b4b2a8f87 removed use_plural space attribute and left over settings 2024-01-28 08:42:42 +01:00
vabene1111
67f6e04680 Merge branch 'develop' into feature/shopping-ui 2024-01-28 08:32:31 +01:00
vabene1111
fb8ca52280 hide ingredient edit modal 2024-01-28 08:31:55 +01:00
vabene1111
126e8a5a53 fixed FDC migration 2024-01-28 08:22:04 +01:00
vabene1111
d10c70b797 fixed iCal endpoint 2024-01-28 08:21:57 +01:00
Mikhail Epifanov
ba169ba38d better logging on skipped action 2024-01-24 08:59:31 +01:00
Mikhail Epifanov
578bb2af25 better error handling during connector initilization 2024-01-24 08:57:24 +01:00
vabene1111
8e4c8821dc recipe list and detail modal background 2024-01-23 18:48:29 +01:00
vabene1111
7673e794bf moved date format functions to utilities 2024-01-23 18:25:56 +01:00
vabene1111
64e54ceaec added mealplan info to recipes tab 2024-01-23 18:09:13 +01:00
vabene1111
f431e18336 fixed test 2024-01-23 18:03:31 +01:00
vabene1111
5842022d0a fixed some exports 2024-01-23 17:49:03 +01:00
vabene1111
c118dca2c0 Merge branch 'develop' into feature/shopping-ui 2024-01-23 16:04:18 +01:00
vabene1111
b0ca2ff228 hide description scrollbar 2024-01-23 15:55:26 +01:00
vabene1111
43aac60e9c Merge branch 'develop' into feature/shopping-ui 2024-01-23 15:52:31 +01:00
vabene1111
cca56cd6db Merge pull request #2822 from smilerz/rating_on_card
add rating to recipe card
2024-01-23 15:51:44 +01:00
smilerz
dd9e93498d set default servings when opening MealPlanEditModal 2024-01-23 08:48:40 -06:00
vabene1111
1eecb098a6 workbox webpack plugin update 2024-01-23 15:28:59 +01:00
vabene1111
85eefb4852 Merge pull request #2900 from TandoorRecipes/dependabot/pip/pillow-10.2.0
Bump pillow from 10.1.0 to 10.2.0
2024-01-23 15:27:38 +01:00
dependabot[bot]
5243eaf63a Bump pillow from 10.1.0 to 10.2.0
Bumps [pillow](https://github.com/python-pillow/Pillow) from 10.1.0 to 10.2.0.
- [Release notes](https://github.com/python-pillow/Pillow/releases)
- [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst)
- [Commits](https://github.com/python-pillow/Pillow/compare/10.1.0...10.2.0)

---
updated-dependencies:
- dependency-name: pillow
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-22 22:25:00 +00:00
vabene1111
a1da77fe31 Merge pull request #2891 from langfingaz/patch-1
docs: specify database and user role when running psql
2024-01-22 14:20:51 +01:00
vabene1111
9450d75ca4 Merge pull request #2895 from tomtjes/fix-iOS-view
Fix iOS view
2024-01-22 14:17:28 +01:00
vabene1111
8b11b31f8c Merge pull request #2892 from langfingaz/patch-2
docs: fix typo
2024-01-22 14:13:19 +01:00
vabene1111
8490cdaf78 Merge pull request #2899 from jmbhughes/patch-1
fix tiny typo in README
2024-01-22 14:09:23 +01:00
vabene1111
30019ec946 Merge pull request #2898 from tomtjes/fix-description-overflow
Fix description overflow
2024-01-22 14:04:18 +01:00
tomtjes
48d75a6c7e restore short descriptions to be vertically centered 2024-01-21 13:47:06 -05:00
Marcus Hughes
6e86680eca fix tiny typo in README 2024-01-21 10:02:20 -07:00
tomtjes
a557e4628e match quick action button border color with hamburger menu button 2024-01-21 11:17:52 -05:00
tomtjes
22dec90921 add scroll property to description 2024-01-21 11:04:18 -05:00
tomtjes
da3dea60c0 remove changes from BottomNavigationBar.vue 2024-01-20 11:50:19 -05:00
tomtjes
9d1abe3419 add styles for recipe edit view 2024-01-20 10:43:09 -05:00
tomtjes
570aefc9fa add styles to base 2024-01-20 10:42:52 -05:00
tomtjes
321dbc10d3 add style 2024-01-19 22:34:21 -05:00
tomtjes
d94de6abd1 Merge branch 'TandoorRecipes:develop' into fix-iOS-view 2024-01-19 18:55:04 -05:00
vabene1111
2b9c294c2a undefined always first 2024-01-20 02:51:23 +08:00
vabene1111
7d74979859 properly edit settings 2024-01-20 02:37:28 +08:00
vabene1111
7de9758ee1 auto sync proper data merging 2024-01-20 02:17:48 +08:00
Daniel Langbein
20027cf127 docs: fix typo 2024-01-19 16:56:48 +00:00
vabene1111
71ea67dc30 sync check items in background 2024-01-20 00:18:45 +08:00
Daniel Langbein
a661eaf221 docs: specify database and user role when running psql 2024-01-19 15:12:56 +00:00
vabene1111
ff77aa7268 added method descirption 2024-01-19 21:59:49 +08:00
vabene1111
e321c80dd6 debugging 2024-01-19 21:42:48 +08:00
vabene1111
12db67bd96 removed unused vars and improved auto sync conditions 2024-01-19 20:48:48 +08:00
vabene1111
57100baf7c improved document visibility handling 2024-01-19 20:09:46 +08:00
vabene1111
05cf7cc081 autosync new entries 2024-01-19 19:55:59 +08:00
vabene1111
c8a070f473 properly display item counter 2024-01-19 19:42:03 +08:00
vabene1111
eae409da67 prevent auto sync from running mulitple time 2024-01-19 19:36:34 +08:00
vabene1111
62e1d860a9 Merge branch 'develop' into feature/shopping-ui 2024-01-19 18:17:33 +08:00
vabene1111
5129ef77c9 Merge pull request #2715 from nyanSpruk/patch-1
fix: Typo in shopping.md
2024-01-19 17:41:00 +08:00
vabene1111
deba961085 Merge pull request #2722 from swnf/bind-ipv6
Make gunicorn and nginx listen to IPv6
2024-01-19 17:27:18 +08:00
vabene1111
92cfd09155 Merge pull request #2785 from axeleroy/patch-1
Add instructions to add the PWA on Firefox for Android
2024-01-19 17:24:54 +08:00
vabene1111
14b7a8fd85 Merge pull request #2866 from Colcothar/automation-doc-typo
Fix typo in automation doc
2024-01-19 17:21:30 +08:00
vabene1111
ab4bac0d21 Merge pull request #2766 from TandoorRecipes/dependabot/pip/cryptography-41.0.7
Bump cryptography from 41.0.6 to 41.0.7
2024-01-19 17:17:31 +08:00
vabene1111
838edc5b97 Merge pull request #2859 from harry48225/touchable-fix
Touchable fix
2024-01-19 17:15:39 +08:00
vabene1111
8910784cfd Merge pull request #2657 from TandoorRecipes/dependabot/npm_and_yarn/vue/workbox-background-sync-7.0.0
Bump workbox-background-sync from 6.6.1 to 7.0.0 in /vue
2024-01-19 17:13:10 +08:00
vabene1111
e951490825 Merge pull request #2526 from TandoorRecipes/dependabot/npm_and_yarn/vue/workbox-window-7.0.0
Bump workbox-window from 6.6.1 to 7.0.0 in /vue
2024-01-19 17:13:00 +08:00
vabene1111
0d9e2a8f5b Merge pull request #2850 from TandoorRecipes/dependabot/github_actions/github/codeql-action-3
Bump github/codeql-action from 2 to 3
2024-01-19 17:09:35 +08:00
vabene1111
e3445c4c71 Merge pull request #2849 from TandoorRecipes/dependabot/github_actions/actions/setup-python-5
Bump actions/setup-python from 4 to 5
2024-01-19 17:09:13 +08:00
vabene1111
1aa68f14e1 Merge pull request #2658 from TandoorRecipes/dependabot/npm_and_yarn/vue/workbox-routing-7.0.0
Bump workbox-routing from 6.6.1 to 7.0.0 in /vue
2024-01-19 17:08:29 +08:00
dependabot[bot]
ccdd678582 Bump actions/setup-python from 4 to 5
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 4 to 5.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-19 09:02:56 +00:00
vabene1111
a3a2812e3f Merge pull request #2713 from TandoorRecipes/dependabot/github_actions/actions/checkout-4
Bump actions/checkout from 3 to 4
2024-01-19 17:02:07 +08:00
vabene1111
8ef343c41d Merge pull request #2527 from TandoorRecipes/dependabot/npm_and_yarn/vue/workbox-navigation-preload-7.0.0
Bump workbox-navigation-preload from 6.6.1 to 7.0.0 in /vue
2024-01-19 17:01:39 +08:00
vabene1111
e38b7841f1 Merge pull request #2712 from TandoorRecipes/dependabot/github_actions/actions/setup-node-4
Bump actions/setup-node from 3 to 4
2024-01-19 17:01:21 +08:00
vabene1111
90eba291a5 Merge pull request #2765 from TandoorRecipes/dependabot/pip/django-storages-1.14.2
Bump django-storages from 1.13.2 to 1.14.2
2024-01-19 16:58:52 +08:00
vabene1111
1a262ef56f Merge pull request #2764 from TandoorRecipes/dependabot/pip/pytest-factoryboy-2.6.0
Bump pytest-factoryboy from 2.5.1 to 2.6.0
2024-01-19 16:58:35 +08:00
vabene1111
06ce3606cf Merge pull request #2767 from TandoorRecipes/dependabot/pip/django-autocomplete-light-3.9.7
Bump django-autocomplete-light from 3.9.4 to 3.9.7
2024-01-19 16:58:14 +08:00
vabene1111
0584fc3305 Merge pull request #2848 from TandoorRecipes/dependabot/pip/pillow-10.1.0
Bump pillow from 10.0.1 to 10.1.0
2024-01-19 16:57:47 +08:00
vabene1111
b430476a82 Merge pull request #2884 from ebwinters/ebwinters/fix_mobile_weeks
Fix next/prev week on mobile meal plan
2024-01-19 16:56:32 +08:00
vabene1111
72d4404665 Merge pull request #2887 from adjokic/patch-1
Add documenation for Docker + Apache + Subfolder
2024-01-19 16:53:58 +08:00
vabene1111
0c94cf1c2e Merge pull request #2870 from TandoorRecipes/dependabot/npm_and_yarn/vue/follow-redirects-1.15.4
Bump follow-redirects from 1.15.2 to 1.15.4 in /vue
2024-01-19 16:44:06 +08:00
vabene1111
1673254934 Merge pull request #2873 from TandoorRecipes/dependabot/pip/jinja2-3.1.3
Bump jinja2 from 3.1.2 to 3.1.3
2024-01-19 16:43:50 +08:00
vabene1111
0493ef7e3a Merge pull request #2872 from FaySmash/patch-1
Improved the understandability of the postgres upgrade steps
2024-01-19 16:13:28 +08:00
Tomasz Klimczak
1fd6a47e9c Translated using Weblate (Polish)
Currently translated at 100.0% (554 of 554 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/pl/
2024-01-18 00:19:56 +00:00
Mikhail Epifanov
5f9d59317b Merge branch 'develop' into HomeAssistantConnector 2024-01-17 22:55:21 +01:00
Mikhail Epifanov
409c0295ec convert example & homeassistant specific configs to a generic with all optional fields 2024-01-17 22:40:44 +01:00
vabene1111
764cd7dba0 SLE bulk permission and tests 2024-01-17 22:32:34 +08:00
adjokic
d6d806791d Add documenation for Docker + Apache + Subfolder 2024-01-16 21:58:21 -06:00
vabene1111
dc81ca19b9 fixed old migrations in shopping tree 2024-01-16 08:06:37 +08:00
vabene1111
2697e42af7 added bulk api endpoint for SLE checking 2024-01-16 08:06:26 +08:00
vabene1111
2b1eda12d1 added undo to category checking 2024-01-16 07:33:20 +08:00
tomtjes
36fd097ec5 Update base.html 2024-01-14 19:18:17 -05:00
vabene1111
40da2cee19 updated migration 2024-01-15 07:58:10 +08:00
vabene1111
31de43196a Merge branch 'develop' into feature/shopping-ui 2024-01-15 07:57:09 +08:00
vabene1111
bb52f8902d added max spaces per user + added custom app name + fixed theming tests 2024-01-15 07:41:51 +08:00
ebwinters@comcast.net
8ec8d98be6 fix mobile arrows 2024-01-14 12:29:00 -08:00
Mikhail Epifanov
245787b89e make the connectors form be able to display all types for connectors 2024-01-14 17:03:02 +01:00
vabene1111
4a7bd6a885 only auto sync when window is focused 2024-01-14 22:16:38 +08:00
vabene1111
35eff630ff updated theming tests 2024-01-14 15:39:02 +08:00
vabene1111
8d90fada1d fixed theming breaking for users without space 2024-01-14 15:33:14 +08:00
vabene1111
d1865b57f1 group checking and unchecking 2024-01-14 12:14:47 +08:00
vabene1111
1692230f01 swiping working for all items 2024-01-14 12:04:52 +08:00
vabene1111
5a0ca3f4e5 basic swiping working 2024-01-14 11:54:10 +08:00
vabene1111
37c7a62853 Merge branch 'beta' into feature/shopping-ui 2024-01-14 08:40:24 +08:00
vabene1111
2ba2b97f9c moved manifest to use main theming function 2024-01-14 08:40:05 +08:00
Mikhail Epifanov
fb65100b14 add debug logging 2024-01-13 20:30:54 +01:00
Mikhail Epifanov
17163b0dba save cache on failed tests 2024-01-13 16:44:18 +01:00
Mikhail Epifanov
362c0340fc skip whole yarn and static files if there was a cache hit 2024-01-13 16:40:25 +01:00
vabene1111
3d6d560c5d add undo functionality to shopping 2024-01-13 22:58:28 +08:00
vabene1111
fd821c30c7 removed ingredient from shopping list entry API 2024-01-13 21:34:27 +08:00
vabene1111
995d423a6f WIP shopping undo 2024-01-13 21:30:48 +08:00
vabene1111
65dd82e292 fixed to string of ingredient 2024-01-13 21:30:39 +08:00
Mikhail Epifanov
87ede4b9cc change formatting a bit, and add async close method 2024-01-13 13:43:08 +01:00
Mikhail Epifanov
c7dd61e239 add caching to the ci-cd workflow 2024-01-13 12:25:48 +01:00
Mikhail Epifanov
48ac70de95 make the tests check for any error message 2024-01-13 11:56:51 +01:00
vabene1111
8302521427 Merge branch 'develop' into feature/shopping-ui 2024-01-13 08:08:38 +08:00
vabene1111
26408c33f4 removed debug code 2024-01-13 07:42:54 +08:00
vabene1111
e045849e89 more theming firendly classses in shopping 2024-01-13 07:36:41 +08:00
Mikhail Epifanov
50eb232fff update tests and fix small bug in connector_manager 2024-01-13 00:24:58 +01:00
Mikhail Epifanov
1a37961ceb add mock to requirements 2024-01-12 23:44:15 +01:00
Cilantro4858
72b0bd7f1e Translated using Weblate (German)
Currently translated at 100.0% (554 of 554 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/
2024-01-12 22:40:47 +00:00
Mikhail Epifanov
022439e017 increase queue size to account for recipe adding burst 2024-01-12 23:40:16 +01:00
Mikhail Epifanov
9c804863a8 undo accidental changes 2024-01-12 23:15:28 +01:00
Mikhail Epifanov
9cf3bdd5f2 write some simple tests 2024-01-12 23:13:53 +01:00
Mikhail Epifanov
445e64c71e add an config toggle for external connectors 2024-01-12 22:20:55 +01:00
Mikhail Epifanov
d576394c99 run everything in a seperate process 2024-01-12 20:50:23 +01:00
Mikhail Epifanov
a61f79507b add enabled field 2024-01-11 23:11:04 +01:00
Mikhail Epifanov
f1b41461db bugfix for not working space loading 2024-01-11 22:46:29 +01:00
Mikhail Epifanov
6a393acd26 redo migration. cleanup commented out code 2024-01-11 22:35:58 +01:00
Mikhail Epifanov
bf0462cd74 add missing from rebase 2024-01-11 22:14:22 +01:00
Mikhail Epifanov
e5f0c19cdc Add ConnectorManager component which allows for Connectors to listen to triggers and do actions on them. Also add HomeAssistantConfig which stores the configuration for the HomeAssistantConnector 2024-01-11 22:13:20 +01:00
dependabot[bot]
45f0413fb9 Bump jinja2 from 3.1.2 to 3.1.3
Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.2 to 3.1.3.
- [Release notes](https://github.com/pallets/jinja/releases)
- [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/jinja/compare/3.1.2...3.1.3)

---
updated-dependencies:
- dependency-name: jinja2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-11 19:51:57 +00:00
FaySmash
38c464ebae Improved the understandability of the postgres upgrade steps
I improved the understandability some parts in the psql examples for someone not familiar with the psql syntax.
2024-01-11 17:56:45 +01:00
Jan Kubošek
b4f158b913 Translated using Weblate (Czech)
Currently translated at 100.0% (554 of 554 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/cs/
2024-01-11 02:19:55 +00:00
dependabot[bot]
da49b6bda0 Bump follow-redirects from 1.15.2 to 1.15.4 in /vue
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.2 to 1.15.4.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.2...v1.15.4)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-10 08:50:00 +00:00
vabene1111
66a07ab39d only show entry scaler if not a recipe 2024-01-10 06:54:54 +08:00
vabene1111
6d4f094455 number scaler component and changing entry amount 2024-01-10 06:51:34 +08:00
Jan Kubošek
e7d9d7b7b3 Translated using Weblate (Czech)
Currently translated at 100.0% (554 of 554 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/cs/
2024-01-09 21:53:32 +00:00
Mára Štěpánek
5f7a57a258 Translated using Weblate (Czech)
Currently translated at 92.0% (510 of 554 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/cs/
2024-01-09 18:40:00 +00:00
Jan Kubošek
4b1a80a0ed Translated using Weblate (Czech)
Currently translated at 92.0% (510 of 554 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/cs/
2024-01-09 18:40:00 +00:00
vabene1111
69b24db442 added missing string and improved tabs titels 2024-01-09 22:34:48 +08:00
vabene1111
a1ff54bf3f reduced top margin 2024-01-09 22:26:05 +08:00
vabene1111
748935d0b8 Merge branch 'develop' into feature/shopping-ui 2024-01-09 21:55:06 +08:00
Mára Štěpánek
8efc3de11f Translated using Weblate (Czech)
Currently translated at 90.5% (491 of 542 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/cs/
2024-01-09 12:07:20 +00:00
Jan Kubošek
1f3cd11964 Translated using Weblate (Czech)
Currently translated at 90.5% (491 of 542 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/cs/
2024-01-09 12:07:20 +00:00
Jan Kubošek
94cfc36ed5 Translated using Weblate (Czech)
Currently translated at 100.0% (362 of 362 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/cs/
2024-01-09 12:07:20 +00:00
vabene1111
d493ba72a1 fixed mealplan to date set wrongly when open multiple times 2024-01-08 20:24:23 +08:00
vabene1111
a5135de50b Merge branch 'develop' into feature/shopping-ui
# Conflicts:
#	cookbook/models.py
#	vue/src/locales/en.json
2024-01-08 06:45:56 +08:00
vabene1111
71e5484f0c test for theming function + sticky nav 2024-01-07 22:34:59 +08:00
vabene1111
761e423bde fixed markdown info 2024-01-07 18:17:31 +08:00
vabene1111
c8e674da16 all themes in one function 2024-01-07 18:07:47 +08:00
vabene1111
6f3d4491ed implemented user settings 2024-01-07 17:51:33 +08:00
vabene1111
54e2615c86 cleaned up into single flow 2024-01-07 17:24:20 +08:00
vabene1111
77942a7144 Merge branch 'develop' into beta 2024-01-07 17:17:22 +08:00
vabene1111
5a5ce4d736 moved theming functions to main tag 2024-01-07 17:17:14 +08:00
vabene1111
0d966b5e59 Merge branch 'develop' into beta 2024-01-07 16:55:22 +08:00
vabene1111
1dda4126c1 fxied theming tags 2024-01-07 16:55:12 +08:00
vabene1111
5ffe821407 Merge branch 'develop' into beta 2024-01-07 08:13:36 +08:00
vabene1111
f9bfb8e258 added custom logo to space manage view 2024-01-07 08:12:20 +08:00
Colcothar
8e0bc3acc7 Fix typo in automation doc 2024-01-06 17:29:43 +00:00
vabene1111
c6fa635af2 basics of custom icons 2024-01-06 23:23:17 +08:00
vabene1111
50e1eaf645 fixed bg color for unauthenticated nav 2024-01-06 22:35:22 +08:00
vabene1111
953dc75a8d added ability to change unauthenticated theme 2024-01-06 21:43:40 +08:00
vabene1111
ac5333d0e7 cleaned .env template and created dedicated docs page for environment configuration 2024-01-06 15:34:55 +08:00
vabene1111
ecf985f5e3 change gunicorn media default 2024-01-06 14:38:27 +08:00
vabene1111
44ac3cf51e user pref store with caching 2024-01-05 21:21:34 +08:00
vabene1111
3cab0ab52e basic auto sync working 2024-01-04 20:22:31 +01:00
harry
d131278aa5 Tweak alignment 2024-01-03 22:38:38 +00:00
harry
d0cbe350a7 Adds psuedo selectors to increase touch target 2024-01-03 22:38:38 +00:00
vabene1111
b6d4c4c3b8 Merge branch 'develop' into beta 2024-01-03 15:13:51 +01:00
vabene1111
30f3a697f0 fixed space theme defaults in model 2024-01-03 15:13:39 +01:00
vabene1111
964afd5f73 fixed migration tree 2024-01-03 15:13:31 +01:00
vabene1111
1fa2186dd0 fixed space theme defaults in model 2024-01-03 15:13:24 +01:00
vabene1111
146e97c8ec Merge branch 'develop' into feature/shopping-ui
# Conflicts:
#	vue/src/locales/en.json
2024-01-03 15:09:30 +01:00
vabene1111
42ced25e10 improved settings override message 2024-01-03 15:05:44 +01:00
vabene1111
6011cf359f Merge pull request #2853 from AquaticLava/Auto-Planner
Auto planner bug fix
2024-01-03 14:37:37 +01:00
AquaticLava
f57acc412b Merge remote-tracking branch 'origin/Auto-Planner' into Auto-Planner 2024-01-02 18:44:39 -07:00
AquaticLava
200cacb9ac changed keywords to be index based. 2024-01-02 18:44:23 -07:00
AquaticLava
5c89173373 changed random recipe to be index based. 2024-01-02 18:43:22 -07:00
AquaticLava
61b67cd37a Merge remote-tracking branch 'origin/Auto-Planner' into Auto-Planner 2024-01-02 15:38:47 -07:00
vabene1111
12c2f2f7aa Merge branch 'develop' into beta 2024-01-01 22:14:27 +01:00
vabene1111
3d8b1d6ccb lots of theming related changes
- upload a custom logo for your space
    - space settings can override user settings for theming
    - spaces can upload custom CSS overrides
    - allow users to disable showing the tandoor/space logo
    - allow changing navigation background color to any color desired
    - allow switching navigation text color between dark/light (different effects depending on theme)
2024-01-01 22:14:01 +01:00
Arnon Meshoulam
aa0d6b5a6b Translated using Weblate (Hebrew)
Currently translated at 95.3% (517 of 542 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/he/
2024-01-01 20:19:56 +00:00
Murphy
64ed75156c Translated using Weblate (German)
Currently translated at 98.7% (535 of 542 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/
2024-01-01 20:19:56 +00:00
vabene1111
c6d41e8810 fixed migrations 200 and 204 2024-01-01 19:11:37 +01:00
vabene1111
2a10843101 compiled translations 2024-01-01 15:06:58 +01:00
vabene1111
f861b39d05 Merge pull request #2833 from luc-ass/develop
Fix truenas_portainer compose example/documentation
2024-01-01 14:55:28 +01:00
vabene1111
5c18c09944 Merge branch 'develop' into develop 2024-01-01 14:55:21 +01:00
vabene1111
1bd5f96029 Merge pull request #2792 from Sriyukthika26/my-contribution
Update truenas_portainer.md
2024-01-01 14:53:47 +01:00
vabene1111
988df4eb00 Merge pull request #2823 from smilerz/admin_updates
Admin updates
2024-01-01 14:53:01 +01:00
vabene1111
bf61b6474e fixed ingredient note field to high 2024-01-01 14:51:20 +01:00
vabene1111
c76f5d9482 starting work on new sync algorithm 2024-01-01 12:01:39 +01:00
dependabot[bot]
bace2f7ba4 Bump github/codeql-action from 2 to 3
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2 to 3.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-01 00:44:38 +00:00
dependabot[bot]
0576337e9c Bump pillow from 10.0.1 to 10.1.0
Bumps [pillow](https://github.com/python-pillow/Pillow) from 10.0.1 to 10.1.0.
- [Release notes](https://github.com/python-pillow/Pillow/releases)
- [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst)
- [Commits](https://github.com/python-pillow/Pillow/compare/10.0.1...10.1.0)

---
updated-dependencies:
- dependency-name: pillow
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-01 00:37:18 +00:00
AquaticLava
be177cf258 Merge remote-tracking branch 'origin/Auto-Planner' into Auto-Planner 2023-12-31 11:20:06 -07:00
Jaan
5059abc232 Translated using Weblate (Russian)
Currently translated at 63.4% (344 of 542 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ru/
2023-12-30 15:19:57 +00:00
vabene1111
475ce44df9 move supermarket editing to store 2023-12-30 08:52:43 +01:00
vabene1111
492d266fbe dont show categories without entries 2023-12-30 08:13:13 +01:00
vabene1111
c695f0dacb update SLR servings UI 2023-12-30 07:59:27 +01:00
smilerz
cb63bb2615 avoid recursion in ingredient.__str__ 2023-12-28 10:44:51 -06:00
smilerz
7ca5a34b28 fixed recursion in Step.__str__() 2023-12-28 10:00:15 -06:00
vabene1111
57d87c899c total stats 2023-12-28 14:27:55 +01:00
vabene1111
e37f8b3a51 shoppig list structure statistics 2023-12-28 14:25:48 +01:00
vabene1111
df03818f45 fixed button hover effect 2023-12-28 14:03:50 +01:00
vabene1111
063c64d078 improvements to recipe tab 2023-12-28 00:19:12 +01:00
vabene1111
2c3e0b547b stuff and things 2023-12-27 23:20:31 +01:00
vabene1111
999e3794f5 info row settings 2023-12-27 23:04:01 +01:00
vabene1111
5e5caf201c shopping device settings 2023-12-27 22:39:45 +01:00
vabene1111
0ce4d45eeb sorting 2023-12-27 21:15:24 +01:00
vabene1111
0dacdcc72f paddings 2023-12-27 15:39:17 +01:00
vabene1111
629dfd5d52 configurable info row 2023-12-27 14:04:36 +01:00
vabene1111
20bc1c5c2a fixed deleting objects 2023-12-27 12:01:13 +01:00
vabene1111
d3376b33d8 new datastructure 2023-12-27 11:34:55 +01:00
Lucas Gasenzer
a7ea7a8987 fix code block and replace tab with spaces 2023-12-27 10:43:56 +01:00
Mahmoud
80c0c71b13 migrations 2023-12-25 19:56:49 +01:00
Mahmoud
42839a5886 Manual order: you can now change the order by dragging and dropping 2023-12-25 19:44:23 +01:00
vabene1111
b0c561661b basic category chaning 2023-12-23 11:11:36 +01:00
vabene1111
ae3818611d fixed checking food always works 2023-12-23 08:46:42 +01:00
vabene1111
d1c4e51842 fixed popover header in dark theme 2023-12-23 08:46:31 +01:00
vabene1111
e6f7f07220 some things actually working 2023-12-22 23:31:28 +01:00
vabene1111
245e8311ba more basics working 2023-12-22 15:10:56 +01:00
vabene1111
3b916cc6a4 fixed schema for recipe from source endpoint 2023-12-22 14:48:58 +01:00
vabene1111
a70ebd5130 somewhat working list 2023-12-22 14:35:17 +01:00
vabene1111
ddf9ef11a0 basic working shopping list store 2023-12-22 13:12:28 +01:00
vabene1111
f65597c391 basic nocer ui, nothing really working 2023-12-22 11:40:17 +01:00
vabene1111
8d7b4f614c improved mobile shopping entry adding layout 2023-12-22 09:25:30 +01:00
vabene1111
df67d3ce7b improved shopping context dark theme 2023-12-22 09:25:18 +01:00
vabene1111
54119ed1ec Merge branch 'develop' into beta 2023-12-22 08:38:25 +01:00
Michael Soh
c1d77a8fe3 Updated nginx documentation 2023-12-21 13:27:46 -05:00
smilerz
26f694576a update __str__() on Step and Ingredient models 2023-12-20 15:55:02 -06:00
smilerz
7a5b744ff0 order recipes in admin 2023-12-20 15:49:54 -06:00
smilerz
4058c997de updates to admin pages 2023-12-20 15:46:28 -06:00
smilerz
089677d799 add rating to recipe card 2023-12-20 13:51:04 -06:00
vabene1111
4de9be5c89 Merge pull request #2808 from smilerz/add_mealtype_filter
add ability to filter meal plans based on type
2023-12-20 15:55:09 +01:00
vabene1111
34ee03b720 Merge pull request #2818 from smilerz/modal_updates
Modal updates
2023-12-20 15:51:24 +01:00
smilerz
48dacf46c3 updated RecipeSwitcher with new MealPlan API format 2023-12-19 16:50:32 -06:00
smilerz
181c270b34 added substitute children to food edit modal 2023-12-19 15:22:26 -06:00
smilerz
e89c3887ec remove reference to facets on Space page 2023-12-19 15:09:18 -06:00
smilerz
99cd9bfb5b update meal_type filter on MealPlan to be a list 2023-12-19 12:59:24 -06:00
smilerz
8bbccad7a9 updated API correclty this time 2023-12-19 12:59:24 -06:00
smilerz
a59a78f44c update meal-plan API on MealPlanStore 2023-12-19 12:59:24 -06:00
smilerz
205bf5253d add ability to filter meal plans based on type 2023-12-19 12:59:19 -06:00
Mahmoud
45c14f6a12 automatic ordering through api 2023-12-17 16:35:46 +01:00
vabene1111
0fed6b9fb3 added migration status to system page 2023-12-16 14:03:32 +01:00
vabene1111
dd3e91e10d added ability to set rate limiting for url import 2023-12-16 09:19:12 +01:00
vabene1111
76b84898f6 lmit ingredient parser to 512 characters to prevent too complex computations 2023-12-16 09:08:50 +01:00
vabene1111
05d971835f autoamtically keep meal plan to date relative to from date 2023-12-16 08:40:20 +01:00
vabene1111
0a814fa896 dont hide ingredients in edit when hiding them in view 2023-12-16 08:18:05 +01:00
vabene1111
05ba11a48e Merge branch 'develop' of https://github.com/TandoorRecipes/recipes into develop 2023-12-16 08:09:22 +01:00
vabene1111
6a7a22626e use commit hash as version number if not on a tagged release 2023-12-16 08:09:18 +01:00
vabene1111
1635a3a335 Merge pull request #2794 from TyreceDJ/mobileCalender/sort
Sorted by current day in meal plan
2023-12-16 07:57:18 +01:00
vabene1111
1d84e7851b Merge pull request #2706 from ambroisie/bump-allauth
Bump django-allauth from 0.54.0 to 0.58.1
2023-12-16 07:54:08 +01:00
vabene1111
44d1cc3a30 Merge pull request #2802 from smilerz/automation_fixes
kw automation not applying during url import
2023-12-16 07:48:49 +01:00
vabene1111
04b4f552f8 comment out orphaned files 2023-12-16 07:40:09 +01:00
vabene1111
6214176fe5 Merge pull request #2730 from smilerz/orphan_file_cleanup
view and delete orphaned files
2023-12-16 07:36:08 +01:00
vabene1111
205dc11125 changed raspi docs 2023-12-16 07:30:39 +01:00
Mahmoud
e423fc1df4 last changes 2023-12-15 02:23:08 +01:00
Mahmoud
3e0b0a87e9 Basic Implementation for reordering books 2023-12-13 15:03:15 +01:00
smilerz
ba5112e138 kw automation not applying during url import 2023-12-12 13:49:23 -06:00
Khuslen Misheel
0e34cc72d5 Proper fix for Calendar 2023-12-10 13:46:55 -05:00
Khuslen Misheel
31c6defc93 Only fixed current day in meal plan 2023-12-10 13:44:01 -05:00
vabene1111
d4c544bb4b partially working replace logic 2023-12-10 16:32:12 +01:00
vabene1111
2b05efeff6 Merge branch 'develop' of https://github.com/TandoorRecipes/recipes into develop 2023-12-10 16:03:18 +01:00
vabene1111
d7ddcd3214 playing around with codemirror 2023-12-10 16:03:14 +01:00
Robin Wilmet
29133f4236 Translated using Weblate (French)
Currently translated at 96.1% (521 of 542 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fr/
2023-12-10 14:19:57 +00:00
Robin Wilmet
b440b09be5 Translated using Weblate (French)
Currently translated at 93.0% (456 of 490 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/fr/
2023-12-10 14:19:57 +00:00
smilerz
ed1f656167 fix version information on system page 2023-12-10 07:54:44 -06:00
smilerz
4f3e6d3765 added Postgres version to system page.
Added warnings for out of date Postgres versions
2023-12-10 07:54:43 -06:00
smilerz
46a50d7835 view and delete orphaned files
miscelaneous bug fixes discovered during testing
2023-12-10 07:54:37 -06:00
Khuslen Misheel
65513a8f60 Sorted by current day in meal plan 2023-12-09 15:19:40 -05:00
Sriyukthika
044ed1ec18 Update truenas_portainer.md Spelling Error 2023-12-10 00:44:15 +05:30
Sriyukthika
8f53b399c6 Update truenas_portainer.md 2023-12-09 23:58:26 +05:30
Bruno BELANYI
702c1d67d3 Bump django-allauth from 0.54.0 to 0.58.1
See the backwards incompatible changes [1].

[1]: https://docs.allauth.org/en/latest/release-notes/recent.html#id10
2023-12-06 21:59:20 +00:00
Axel Leroy
3adb4c5233 Add instructions to add the PWA on Firefox for Android 2023-12-06 10:00:48 +01:00
smilerz
c654cc469a Update RecipeEditView.vue
fixes #2781
2023-12-05 07:53:33 -06:00
Ferenc
8df846c9c2 Translated using Weblate (Hungarian)
Currently translated at 85.3% (460 of 539 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/hu/
2023-12-05 09:15:12 +00:00
Ferenc
7070f6c964 Translated using Weblate (Hungarian)
Currently translated at 98.7% (484 of 490 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/hu/
2023-12-05 09:15:12 +00:00
vabene1111
b454960676 some playing around 2023-12-03 15:48:37 +01:00
vabene1111
bd0e1bcefe Merge branch 'develop' into beta 2023-12-02 21:32:24 +01:00
dependabot[bot]
8c87e0aced Bump django-autocomplete-light from 3.9.4 to 3.9.7
Bumps [django-autocomplete-light](https://github.com/yourlabs/django-autocomplete-light) from 3.9.4 to 3.9.7.
- [Release notes](https://github.com/yourlabs/django-autocomplete-light/releases)
- [Changelog](https://github.com/yourlabs/django-autocomplete-light/blob/master/CHANGELOG)
- [Commits](https://github.com/yourlabs/django-autocomplete-light/compare/3.9.4...3.9.7)

---
updated-dependencies:
- dependency-name: django-autocomplete-light
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-01 00:59:22 +00:00
dependabot[bot]
3140480f36 Bump cryptography from 41.0.6 to 41.0.7
Bumps [cryptography](https://github.com/pyca/cryptography) from 41.0.6 to 41.0.7.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/41.0.6...41.0.7)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-01 00:59:18 +00:00
dependabot[bot]
52cd588b45 Bump django-storages from 1.13.2 to 1.14.2
Bumps [django-storages](https://github.com/jschneier/django-storages) from 1.13.2 to 1.14.2.
- [Changelog](https://github.com/jschneier/django-storages/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/jschneier/django-storages/compare/1.13.2...1.14.2)

---
updated-dependencies:
- dependency-name: django-storages
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-01 00:59:13 +00:00
dependabot[bot]
517e465d2f Bump pytest-factoryboy from 2.5.1 to 2.6.0
Bumps [pytest-factoryboy](https://github.com/pytest-dev/pytest-factoryboy) from 2.5.1 to 2.6.0.
- [Changelog](https://github.com/pytest-dev/pytest-factoryboy/blob/master/CHANGES.rst)
- [Commits](https://github.com/pytest-dev/pytest-factoryboy/compare/2.5.1...2.6.0)

---
updated-dependencies:
- dependency-name: pytest-factoryboy
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-01 00:59:10 +00:00
vabene1111
899a9955fb Merge branch 'develop' into beta 2023-11-27 20:21:37 +01:00
swnf
5a6a1787cf Make gunicorn and nginx listen to IPv6 2023-11-06 18:01:53 +01:00
Nik Jan Špruk
8d4cb4f08d fix: Typo in shopping.md
Made capital i in the sentence.
2023-11-02 12:36:20 +01:00
dependabot[bot]
537276c62f Bump actions/checkout from 3 to 4
Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-01 00:40:31 +00:00
dependabot[bot]
f168fb825f Bump actions/setup-node from 3 to 4
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 3 to 4.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-01 00:40:27 +00:00
vabene1111
3cabe85091 Merge branch 'develop' into beta 2023-10-05 19:05:09 +02:00
dependabot[bot]
4e05bc2f6a Bump workbox-routing from 6.6.1 to 7.0.0 in /vue
Bumps [workbox-routing](https://github.com/googlechrome/workbox) from 6.6.1 to 7.0.0.
- [Release notes](https://github.com/googlechrome/workbox/releases)
- [Commits](https://github.com/googlechrome/workbox/commits/v7.0.0)

---
updated-dependencies:
- dependency-name: workbox-routing
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-01 00:49:42 +00:00
dependabot[bot]
8f8147fda4 Bump workbox-background-sync from 6.6.1 to 7.0.0 in /vue
Bumps [workbox-background-sync](https://github.com/googlechrome/workbox) from 6.6.1 to 7.0.0.
- [Release notes](https://github.com/googlechrome/workbox/releases)
- [Commits](https://github.com/googlechrome/workbox/commits/v7.0.0)

---
updated-dependencies:
- dependency-name: workbox-background-sync
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-01 00:49:08 +00:00
AquaticLava
530d6b0cb6 changed random recipe to be index based. 2023-07-23 11:51:07 -06:00
dependabot[bot]
2397c66218 Bump workbox-navigation-preload from 6.6.1 to 7.0.0 in /vue
Bumps [workbox-navigation-preload](https://github.com/googlechrome/workbox) from 6.6.1 to 7.0.0.
- [Release notes](https://github.com/googlechrome/workbox/releases)
- [Commits](https://github.com/googlechrome/workbox/commits/v7.0.0)

---
updated-dependencies:
- dependency-name: workbox-navigation-preload
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-01 00:05:24 +00:00
dependabot[bot]
f826f93b03 Bump workbox-window from 6.6.1 to 7.0.0 in /vue
Bumps [workbox-window](https://github.com/googlechrome/workbox) from 6.6.1 to 7.0.0.
- [Release notes](https://github.com/googlechrome/workbox/releases)
- [Commits](https://github.com/googlechrome/workbox/commits/v7.0.0)

---
updated-dependencies:
- dependency-name: workbox-window
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-01 00:04:56 +00:00
vabene1111
9da66c9f6c Merge branch 'develop' into beta 2023-06-29 17:26:54 +02:00
vabene1111
124211a2f4 Merge branch 'develop' into beta 2023-06-27 16:11:45 +02:00
vabene1111
71555fee28 Merge branch 'develop' into beta 2023-06-26 21:06:56 +02:00
vabene1111
05a99c9b64 Merge branch 'develop' into beta 2023-06-20 16:49:07 +02:00
vabene1111
32690f04b2 Merge branch 'develop' into beta 2023-06-20 15:46:51 +02:00
vabene1111
29b74557a6 Merge branch 'develop' into beta 2023-06-13 13:24:05 +02:00
vabene1111
c43e7e0331 Merge branch 'develop' into beta 2023-05-29 17:51:17 +02:00
vabene1111
fe7fd7700d Merge branch 'develop' into beta 2023-05-29 12:44:12 +02:00
vabene1111
c6ef0e0087 Merge branch 'develop' into beta 2023-05-26 16:11:30 +02:00
vabene1111
6149f693ab Merge branch 'develop' into beta 2023-04-26 07:46:56 +02:00
vabene1111
daef57823f Merge branch 'develop' into beta 2023-03-28 15:43:44 +02:00
Jérôme Wiedemann
332c4bd94a add: support to scale numbers/amounts 2023-03-21 18:04:03 +01:00
vabene1111
5c7b9a93ae Merge branch 'master' into beta 2023-03-14 23:10:44 +01:00
vabene1111
b681364f95 Merge branch 'develop' into beta 2023-02-27 17:26:27 +01:00
vabene1111
40d14eeb9f Merge branch 'develop' into beta 2023-02-24 23:32:45 +01:00
vabene1111
46b09f11b6 Merge branch 'develop' into beta 2023-02-24 20:40:41 +01:00
vabene1111
900291dc5f Merge branch 'develop' into beta 2023-02-12 13:30:40 +01:00
vabene1111
e9f9134e2e Merge branch 'develop' into beta 2023-02-11 17:57:48 +01:00
vabene1111
8fe11b12f8 Merge branch 'develop' into beta 2023-01-27 15:52:54 +01:00
vabene1111
a1cfb7ad9f Merge branch 'develop' into beta 2023-01-20 14:58:31 +01:00
vabene1111
2bddf21175 Merge branch 'develop' into beta 2023-01-19 19:14:47 +01:00
vabene1111
aa5490adb3 Merge branch 'develop' into beta 2023-01-07 10:32:48 +01:00
vabene1111
bea089dd5e Merge branch 'develop' into beta 2022-11-09 13:23:48 +01:00
vabene1111
2c7237adaa Merge branch 'develop' into beta 2022-09-21 16:32:53 +02:00
vabene1111
98af1e1e4c Merge branch 'develop' into beta 2022-09-15 19:05:57 +02:00
vabene1111
4a1aee38a3 Merge branch 'develop' into beta 2022-08-05 18:02:48 +02:00
vabene1111
92c21bc382 Merge branch 'develop' into beta 2022-08-05 16:55:00 +02:00
vabene1111
ba748cc5fe Merge branch 'develop' into beta 2022-07-11 23:42:31 +02:00
vabene1111
22b1a9634a Merge branch 'develop' into beta 2022-07-07 19:17:21 +02:00
vabene1111
eeb5395efc Merge branch 'develop' into beta 2022-07-01 11:58:40 +02:00
vabene1111
6ea259596a Merge branch 'develop' into beta 2022-06-26 12:54:24 +02:00
vabene1111
49275a96fe Merge branch 'develop' into beta 2022-06-20 16:53:31 +02:00
326 changed files with 52985 additions and 37458 deletions

11
.coveragerc Normal file
View File

@@ -0,0 +1,11 @@
[run]
omit =
*/apps.py,
*/migrations/*,
*/settings*,
*/test*,
*/tests/*,
*urls.py,
*/wsgi*,
manage.py,
*__init__*

26
.devcontainer/Dockerfile Normal file
View File

@@ -0,0 +1,26 @@
FROM python:3.10-alpine3.18
#Install all dependencies.
RUN apk add --no-cache postgresql-libs postgresql-client gettext zlib libjpeg libwebp libxml2-dev libxslt-dev openldap git yarn
#Print all logs without buffering it.
ENV PYTHONUNBUFFERED 1
#This port will be used by gunicorn.
EXPOSE 8000
#This port will be used by vue
EXPOSE 8080
#Install all python dependencies to the image
COPY requirements.txt /tmp/pip-tmp/
RUN \
if [ `apk --print-arch` = "armv7" ]; then \
printf "[global]\nextra-index-url=https://www.piwheels.org/simple\n" > /etc/pip.conf ; \
fi
RUN apk add --no-cache --virtual .build-deps gcc musl-dev postgresql-dev zlib-dev jpeg-dev libwebp-dev openssl-dev libffi-dev cargo openldap-dev python3-dev && \
echo -n "INPUT ( libldap.so )" > /usr/lib/libldap_r.so && \
pip3 --disable-pip-version-check --no-cache-dir install -r /tmp/pip-tmp/requirements.txt && \
rm -rf /tmp/pip-tmp && \
apk --purge del .build-deps

View File

@@ -0,0 +1,27 @@
// For format details, see https://aka.ms/devcontainer.json.
{
"name": "Tandoor Dev Container",
"build": { "context": "..", "dockerfile": "Dockerfile" },
// Features to add to the dev container. More info: https://containers.dev/features.
// "features": {},
// Use 'forwardPorts' to make a list of ports inside the container available locally.
"forwardPorts": [8000, 8080],
// Use 'postCreateCommand' to run commands after the container is created.
// "postCreateCommand": "pip3 install --user -r requirements.txt"
// Configure tool-specific properties.
"customizations": {
"vscode": {
"extensions": [
"ms-python.debugpy",
"ms-python.python"
]
}
}
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
// "remoteUser": "root"
}

View File

@@ -1,187 +1,15 @@
# only set this to true when testing/debugging
# when unset: 1 (true) - dont unset this, just for development
DEBUG=0
SQL_DEBUG=0
DEBUG_TOOLBAR=0
# Gunicorn log level for debugging (default value is "info" when unset)
# (see https://docs.gunicorn.org/en/stable/settings.html#loglevel for available settings)
# GUNICORN_LOG_LEVEL="debug"
# HTTP port to bind to
# TANDOOR_PORT=8080
# hosts the application can run under e.g. recipes.mydomain.com,cooking.mydomain.com,...
ALLOWED_HOSTS=*
# Cross Site Request Forgery protection
# (https://docs.djangoproject.com/en/4.2/ref/settings/#std-setting-CSRF_TRUSTED_ORIGINS)
# CSRF_TRUSTED_ORIGINS = []
# Cross Origin Resource Sharing
# (https://github.com/adamchainz/django-cors-header)
# CORS_ALLOW_ALL_ORIGINS = True
# ---------------------------------------------------------------------------
# This template contains only required options.
# Visit the docs to find more https://docs.tandoor.dev/system/configuration/
# ---------------------------------------------------------------------------
# random secret key, use for example `base64 /dev/urandom | head -c50` to generate one
# ---------------------------- AT LEAST ONE REQUIRED -------------------------
SECRET_KEY=
SECRET_KEY_FILE=
# ---------------------------------------------------------------
# your default timezone See https://timezonedb.com/time-zones for a list of timezones
TZ=Europe/Berlin
# add only a database password if you want to run with the default postgres, otherwise change settings accordingly
DB_ENGINE=django.db.backends.postgresql
# DB_OPTIONS= {} # e.g. {"sslmode":"require"} to enable ssl
POSTGRES_HOST=db_recipes
POSTGRES_DB=djangodb
POSTGRES_PORT=5432
POSTGRES_USER=djangouser
# ---------------------------- AT LEAST ONE REQUIRED -------------------------
POSTGRES_PASSWORD=
POSTGRES_PASSWORD_FILE=
# ---------------------------------------------------------------
POSTGRES_DB=djangodb
# database connection string, when used overrides other database settings.
# format might vary depending on backend
# DATABASE_URL = engine://username:password@host:port/dbname
# the default value for the user preference 'fractions' (enable/disable fraction support)
# default: disabled=0
FRACTION_PREF_DEFAULT=0
# the default value for the user preference 'comments' (enable/disable commenting system)
# default comments enabled=1
COMMENT_PREF_DEFAULT=1
# Users can set a amount of time after which the shopping list is refreshed when they are in viewing mode
# This is the minimum interval users can set. Setting this to low will allow users to refresh very frequently which
# might cause high load on the server. (Technically they can obviously refresh as often as they want with their own scripts)
SHOPPING_MIN_AUTOSYNC_INTERVAL=5
# Default for user setting sticky navbar
# STICKY_NAV_PREF_DEFAULT=1
# If base URL is something other than just / (you are serving a subfolder in your proxy for instance http://recipe_app/recipes/)
# Be sure to not have a trailing slash: e.g. '/recipes' instead of '/recipes/'
# SCRIPT_NAME=/recipes
# If staticfiles are stored at a different location uncomment and change accordingly, MUST END IN /
# this is not required if you are just using a subfolder
# This can either be a relative path from the applications base path or the url of an external host
# STATIC_URL=/static/
# If mediafiles are stored at a different location uncomment and change accordingly, MUST END IN /
# this is not required if you are just using a subfolder
# This can either be a relative path from the applications base path or the url of an external host
# MEDIA_URL=/media/
# Serve mediafiles directly using gunicorn. Basically everyone recommends not doing this. Please use any of the examples
# provided that include an additional nxginx container to handle media file serving.
# If you know what you are doing turn this back on (1) to serve media files using djangos serve() method.
# when unset: 1 (true) - this is temporary until an appropriate amount of time has passed for everyone to migrate
GUNICORN_MEDIA=0
# GUNICORN SERVER RELATED SETTINGS (see https://docs.gunicorn.org/en/stable/design.html#how-many-workers for recommended settings)
# GUNICORN_WORKERS=1
# GUNICORN_THREADS=1
# S3 Media settings: store mediafiles in s3 or any compatible storage backend (e.g. minio)
# as long as S3_ACCESS_KEY is not set S3 features are disabled
# S3_ACCESS_KEY=
# S3_SECRET_ACCESS_KEY=
# S3_BUCKET_NAME=
# S3_REGION_NAME= # default none, set your region might be required
# S3_QUERYSTRING_AUTH=1 # default true, set to 0 to serve media from a public bucket without signed urls
# S3_QUERYSTRING_EXPIRE=3600 # number of seconds querystring are valid for
# S3_ENDPOINT_URL= # when using a custom endpoint like minio
# S3_CUSTOM_DOMAIN= # when using a CDN/proxy to S3 (see https://github.com/TandoorRecipes/recipes/issues/1943)
# Email Settings, see https://docs.djangoproject.com/en/3.2/ref/settings/#email-host
# Required for email confirmation and password reset (automatically activates if host is set)
# EMAIL_HOST=
# EMAIL_PORT=
# EMAIL_HOST_USER=
# EMAIL_HOST_PASSWORD=
# EMAIL_USE_TLS=0
# EMAIL_USE_SSL=0
# email sender address (default 'webmaster@localhost')
# DEFAULT_FROM_EMAIL=
# prefix used for account related emails (default "[Tandoor Recipes] ")
# ACCOUNT_EMAIL_SUBJECT_PREFIX=
# allow authentication via the REMOTE-USER header (can be used for e.g. authelia).
# ATTENTION: Leave off if you don't know what you are doing! Enabling this without proper configuration will enable anybody
# to login with any username!
# See docs for additional information: https://docs.tandoor.dev/features/authentication/#reverse-proxy-authentication
# when unset: 0 (false)
REMOTE_USER_AUTH=0
# Default settings for spaces, apply per space and can be changed in the admin view
# SPACE_DEFAULT_MAX_RECIPES=0 # 0=unlimited recipes
# SPACE_DEFAULT_MAX_USERS=0 # 0=unlimited users per space
# SPACE_DEFAULT_MAX_FILES=0 # Maximum file storage for space in MB. 0 for unlimited, -1 to disable file upload.
# SPACE_DEFAULT_ALLOW_SHARING=1 # Allow users to share recipes with public links
# allow people to create local accounts on your application instance (without an invite link)
# social accounts will always be able to sign up
# when unset: 0 (false)
# ENABLE_SIGNUP=0
# If signup is enabled you might want to add a captcha to it to prevent spam
# HCAPTCHA_SITEKEY=
# HCAPTCHA_SECRET=
# if signup is enabled you might want to provide urls to data protection policies or terms and conditions
# TERMS_URL=
# PRIVACY_URL=
# IMPRINT_URL=
# enable serving of prometheus metrics under the /metrics path
# ATTENTION: view is not secured (as per the prometheus default way) so make sure to secure it
# trough your web server (or leave it open of you dont care if the stats are exposed)
# ENABLE_METRICS=0
# allows you to setup OAuth providers
# see docs for more information https://docs.tandoor.dev/features/authentication/
# SOCIAL_PROVIDERS = allauth.socialaccount.providers.github, allauth.socialaccount.providers.nextcloud,
# Should a newly created user from a social provider get assigned to the default space and given permission by default ?
# ATTENTION: This feature might be deprecated in favor of a space join and public viewing system in the future
# default 0 (false), when 1 (true) users will be assigned space and group
# SOCIAL_DEFAULT_ACCESS = 1
# if SOCIAL_DEFAULT_ACCESS is used, which group should be added
# SOCIAL_DEFAULT_GROUP=guest
# Django session cookie settings. Can be changed to allow a single django application to authenticate several applications
# when running under the same database
# SESSION_COOKIE_DOMAIN=.example.com
# SESSION_COOKIE_NAME=sessionid # use this only to not interfere with non unified django applications under the same top level domain
# by default SORT_TREE_BY_NAME is disabled this will store all Keywords and Food in the order they are created
# enabling this setting makes saving new keywords and foods very slow, which doesn't matter in most usecases.
# however, when doing large imports of recipes that will create new objects, can increase total run time by 10-15x
# Keywords and Food can be manually sorted by name in Admin
# This value can also be temporarily changed in Admin, it will revert the next time the application is started
# This will be fixed/changed in the future by changing the implementation or finding a better workaround for sorting
# SORT_TREE_BY_NAME=0
# LDAP authentication
# default 0 (false), when 1 (true) list of allowed users will be fetched from LDAP server
#LDAP_AUTH=
#AUTH_LDAP_SERVER_URI=
#AUTH_LDAP_BIND_DN=
#AUTH_LDAP_BIND_PASSWORD=
#AUTH_LDAP_USER_SEARCH_BASE_DN=
#AUTH_LDAP_TLS_CACERTFILE=
#AUTH_LDAP_START_TLS=
# Enables exporting PDF (see export docs)
# Disabled by default, uncomment to enable
# ENABLE_PDF_EXPORT=1
# Recipe exports are cached for a certain time by default, adjust time if needed
# EXPORT_FILE_CACHE_DURATION=600
# if you want to do many requests to the FDC API you need to get a (free) API key. Demo key is limited to 30 requests / hour or 50 requests / day
#FDC_API_KEY=DEMO_KEY

View File

@@ -1,10 +1,15 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
# https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
version: 2
updates:
- package-ecosystem: "devcontainers"
directory: "/"
schedule:
interval: weekly
- package-ecosystem: "pip"
directory: "/"
schedule:

View File

@@ -21,7 +21,7 @@ jobs:
suffix: ""
continue-on-error: false
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Get version number
id: get_version
@@ -43,7 +43,7 @@ jobs:
path: ./recipes/plugins/open_data_plugin
# Build Vue frontend
- uses: actions/setup-node@v3
- uses: actions/setup-node@v4
with:
node-version: '18'
cache: yarn

View File

@@ -21,7 +21,7 @@ jobs:
suffix: ""
continue-on-error: false
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Get version number
id: get_version
@@ -35,7 +35,7 @@ jobs:
fi
# Build Vue frontend
- uses: actions/setup-node@v3
- uses: actions/setup-node@v4
with:
node-version: '18'
cache: yarn

View File

@@ -3,38 +3,79 @@ name: Continuous Integration
on: [push, pull_request]
jobs:
build:
if: github.repository_owner == 'TandoorRecipes'
runs-on: ubuntu-latest
strategy:
max-parallel: 4
matrix:
python-version: ['3.10']
build:
if: github.repository_owner == 'TandoorRecipes'
runs-on: ubuntu-latest
strategy:
max-parallel: 4
matrix:
python-version: ["3.10"]
node-version: ["18"]
steps:
- uses: actions/checkout@v3
- name: Set up Python 3.10
uses: actions/setup-python@v4
with:
python-version: '3.10'
# Build Vue frontend
- uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install Vue dependencies
working-directory: ./vue
run: yarn install
- name: Build Vue dependencies
working-directory: ./vue
run: yarn build
- name: Install Django dependencies
run: |
sudo apt-get -y update
sudo apt-get install -y libsasl2-dev python3-dev libldap2-dev libssl-dev
python -m pip install --upgrade pip
pip install -r requirements.txt
python3 manage.py collectstatic --noinput
python3 manage.py collectstatic_js_reverse
- name: Django Testing project
run: |
pytest
steps:
- uses: actions/checkout@v4
- uses: awalsh128/cache-apt-pkgs-action@v1.4.2
with:
packages: libsasl2-dev python3-dev libldap2-dev libssl-dev
version: 1.0
# Setup python & dependencies
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
cache: "pip"
- name: Install Python Dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Cache StaticFiles
uses: actions/cache@v4
id: django_cache
with:
path: |
./cookbook/static
./vue/webpack-stats.json
./staticfiles
key: |
${{ runner.os }}-${{ matrix.python-version }}-${{ matrix.node-version }}-collectstatic-${{ hashFiles('**/*.css', '**/*.js', 'vue/src/*') }}
# Build Vue frontend & Dependencies
- name: Set up Node ${{ matrix.node-version }}
if: steps.django_cache.outputs.cache-hit != 'true'
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: "yarn"
cache-dependency-path: ./vue/yarn.lock
- name: Install Vue dependencies
if: steps.django_cache.outputs.cache-hit != 'true'
working-directory: ./vue
run: yarn install
- name: Build Vue dependencies
if: steps.django_cache.outputs.cache-hit != 'true'
working-directory: ./vue
run: yarn build
- name: Compile Django StaticFiles
if: steps.django_cache.outputs.cache-hit != 'true'
run: |
python3 manage.py collectstatic --noinput
python3 manage.py collectstatic_js_reverse
- uses: actions/cache/save@v4
if: steps.django_cache.outputs.cache-hit != 'true'
with:
path: |
./cookbook/static
./vue/webpack-stats.json
./staticfiles
key: |
${{ runner.os }}-${{ matrix.python-version }}-${{ matrix.node-version }}-collectstatic-${{ hashFiles('**/*.css', '**/*.js', 'vue/src/*') }}
- name: Django Testing project
run: pytest --junitxml=junit/test-results-${{ matrix.python-version }}.xml

View File

@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
# We must fetch at least the immediate parents so that if this is
# a pull request then we can checkout the head.
@@ -25,7 +25,7 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
uses: github/codeql-action/init@v3
# Override language selection by uncommenting this and choosing your languages
with:
languages: python, javascript
@@ -47,6 +47,6 @@ jobs:
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
uses: github/codeql-action/analyze@v3
with:
languages: javascript, python

View File

@@ -1,17 +1,20 @@
name: Make Docs
on:
push:
branches:
- master
# the 1st condition
workflow_run:
workflows: ["Continuous Integration"]
branches: [master]
types:
- completed
jobs:
deploy:
if: github.repository_owner == 'TandoorRecipes'
if: github.repository_owner == 'TandoorRecipes' && ${{ github.event.workflow_run.conclusion == 'success' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: 3.x
- run: pip install mkdocs-material mkdocs-include-markdown-plugin
- run: mkdocs gh-deploy --force
- run: mkdocs gh-deploy --force

5
.gitignore vendored
View File

@@ -43,6 +43,7 @@ htmlcov/
nosetests.xml
coverage.xml
*,cover
docs/reports/**
# Django stuff:
*.log
@@ -54,7 +55,6 @@ docs/_build/
target/
\.idea/dataSources/
\.idea/dataSources\.xml
\.idea/dataSources\.local\.xml
@@ -80,10 +80,11 @@ data/
/docker-compose.override.yml
vue/node_modules
plugins
.vscode/
vetur.config.js
cookbook/static/vue
vue/webpack-stats.json
cookbook/templates/sw.js
.prettierignore
vue/.yarn
vue3/.vite
vue3/node_modules

View File

@@ -1,8 +1,10 @@
<component name="ProjectDictionaryState">
<dictionary name="vaben">
<words>
<w>mealplan</w>
<w>pinia</w>
<w>selfhosted</w>
<w>unapplied</w>
</words>
</dictionary>
</component>

View File

@@ -1,5 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="PROJECT_PROFILE" value="Default" />
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>

33
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,33 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python Debugger: Django",
"type": "debugpy",
"request": "launch",
"program": "${workspaceFolder}/manage.py",
"args": ["runserver"],
"django": true,
"justMyCode": true
},
{
"name": "Python: Debug Tests",
"type": "debugpy",
"request": "launch",
"program": "${file}",
"purpose": [
"debug-test"
],
"console": "integratedTerminal",
"env": {
// coverage and pytest can't both be running at the same time
"PYTEST_ADDOPTS": "--no-cov"
},
"django": true,
"justMyCode": true
},
]
}

7
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,7 @@
{
"python.testing.pytestArgs": [
"cookbook/tests"
],
"python.testing.unittestEnabled": false,
"python.testing.pytestEnabled": true
}

75
.vscode/tasks.json vendored Normal file
View File

@@ -0,0 +1,75 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "Run Migrations",
"type": "shell",
"command": "python3 manage.py migrate",
},
{
"label": "Collect Static Files",
"type": "shell",
"command": "python3 manage.py collectstatic",
"dependsOn": ["Yarn Build"],
},
{
"label": "Setup Dev Server",
"dependsOn": ["Run Migrations", "Yarn Build"],
},
{
"label": "Run Dev Server",
"type": "shell",
"dependsOn": ["Setup Dev Server"],
"command": "python3 manage.py runserver",
},
{
"label": "Yarn Install",
"type": "shell",
"command": "yarn install",
"options": {
"cwd": "${workspaceFolder}/vue"
}
},
{
"label": "Yarn Serve",
"type": "shell",
"command": "yarn serve",
"dependsOn": ["Yarn Install"],
"options": {
"cwd": "${workspaceFolder}/vue"
}
},
{
"label": "Yarn Build",
"type": "shell",
"command": "yarn build",
"dependsOn": ["Yarn Install"],
"options": {
"cwd": "${workspaceFolder}/vue"
},
"group": "build",
},
{
"label": "Setup Tests",
"dependsOn": ["Run Migrations", "Collect Static Files"],
},
{
"label": "Run all pytests",
"type": "shell",
"command": "python3 -m pytest cookbook/tests",
"dependsOn": ["Setup Tests"],
"group": "test",
},
{
"label": "Setup Documentation Dependencies",
"type": "shell",
"command": "pip install mkdocs-material mkdocs-include-markdown-plugin",
},
{
"label": "Serve Documentation",
"type": "shell",
"command": "mkdocs serve",
"dependsOn": ["Setup Documentation Dependencies"],
}
]
}

View File

@@ -20,6 +20,7 @@ Below are some of the larger contributions made yet.
- [murphy83] added support for IPv6 #1490
- [TheHaf] added custom serving size component #1411
- [lostlont] added LDAP support #960
- [c0mputerguru] added devcontainers for ease of development
## Translations

View File

@@ -1,4 +1,4 @@
FROM python:3.10-alpine3.18
FROM python:3.12-alpine3.19
#Install all dependencies.
RUN apk add --no-cache postgresql-libs postgresql-client gettext zlib libjpeg libwebp libxml2-dev libxslt-dev openldap git
@@ -19,12 +19,14 @@ RUN \
if [ `apk --print-arch` = "armv7" ]; then \
printf "[global]\nextra-index-url=https://www.piwheels.org/simple\n" > /etc/pip.conf ; \
fi
# remove Development dependencies from requirements.txt
RUN sed -i '/# Development/,$d' requirements.txt
RUN apk add --no-cache --virtual .build-deps gcc musl-dev postgresql-dev zlib-dev jpeg-dev libwebp-dev openssl-dev libffi-dev cargo openldap-dev python3-dev && \
echo -n "INPUT ( libldap.so )" > /usr/lib/libldap_r.so && \
python -m venv venv && \
/opt/recipes/venv/bin/python -m pip install --upgrade pip && \
venv/bin/pip install wheel==0.37.1 && \
venv/bin/pip install setuptools_rust==1.1.2 && \
venv/bin/pip install wheel==0.42.0 && \
venv/bin/pip install setuptools_rust==1.9.0 && \
venv/bin/pip install -r requirements.txt --no-cache-dir &&\
apk --purge del .build-deps

View File

@@ -39,13 +39,13 @@
- 🔍 Powerful & customizable **search** with fulltext support and [TrigramSimilarity](https://docs.djangoproject.com/en/3.0/ref/contrib/postgres/search/#trigram-similarity)
- 🏷️ Create and search for **tags**, assign them in batch to all files matching certain filters
- ↔️ Quickly merge and rename ingredients, tags and units
- ↔️ Quickly merge and rename ingredients, tags and units
- 📥️ **Import recipes** from thousands of websites supporting [ld+json or microdata](https://schema.org/Recipe)
- ➗ Support for **fractions** or decimals
- 🐳 Easy setup with **Docker** and included examples for **Kubernetes**, **Unraid** and **Synology**
- 🎨 Customize your interface with **themes**
- 📦 **Sync** files with Dropbox and Nextcloud
## All the must haves
- 📱Optimized for use on **mobile** devices
@@ -54,7 +54,7 @@
- Many more like recipe scaling, image compression, printing views and supermarkets
This application is meant for people with a collection of recipes they want to share with family and friends or simply
store them in a nicely organized way. A basic permission system exists but this application is not meant to be run as
store them in a nicely organized way. A basic permission system exists but this application is not meant to be run as
a public page.
## Docs
@@ -62,13 +62,13 @@ a public page.
Documentation can be found [here](https://docs.tandoor.dev/).
## Support our work
Tandoor is developed by volunteers in their free time just because its fun. That said earning
Tandoor is developed by volunteers in their free time just because its fun. That said earning
some money with the project allows us to spend more time on it and thus make improvements we otherwise couldn't.
Because of that there are several ways you can support us
- **GitHub Sponsors** You can sponsor contributors of this project on GitHub: [vabene1111](https://github.com/sponsors/vabene1111)
- **Host at Hetzner** We have been very happy customers of Hetzner for multiple years for all of our projects. If you want to get into self-hosting or are tired of the expensive big providers, their cloud servers are a great place to get started. When you sign up via our [referral link](https://hetzner.cloud/?ref=ISdlrLmr9kGj) you will get 20€ worth of cloud credits and we get a small kickback too.
- **Let us host for you** We are offering a [hosted version](https://app.tandoor.dev) where all profits support us and the development of tandoor (currently only available in germany).
- **Let us host for you** We are offering a [hosted version](https://app.tandoor.dev) where all profits support us and the development of tandoor (currently only available in germany).
## Contributing
Contributions are welcome but please read [this](https://docs.tandoor.dev/contribute/#contributing-code) **BEFORE** contributing anything!
@@ -96,11 +96,11 @@ Share some information on how you use Tandoor to help me improve the application
Beginning with version 0.10.0 the code in this repository is licensed under the [GNU AGPL v3](https://www.gnu.org/licenses/agpl-3.0.de.html) license with a
[common clause](https://commonsclause.com/) selling exception. See [LICENSE.md](https://github.com/vabene1111/recipes/blob/develop/LICENSE.md) for details.
> NOTE: There appears to be a whole range of legal issues with licensing anything else then the standard completely open licenses.
> NOTE: There appears to be a whole range of legal issues with licensing anything other than the standard completely open licenses.
> I am in the process of getting some professional legal advice to sort out these issues.
> Please also see [Issue 238](https://github.com/vabene1111/recipes/issues/238) for some discussion and **reasoning** regarding the topic.
**Reasoning**
**Reasoning**
**This software and *all* its features are and will always be free for everyone to use and enjoy.**
The reason for the selling exception is that a significant amount of time was spend over multiple years to develop this software.

View File

@@ -76,4 +76,11 @@ echo "Done"
chmod -R 755 /opt/recipes/mediafiles
exec gunicorn -b :$TANDOOR_PORT --workers $GUNICORN_WORKERS --threads $GUNICORN_THREADS --access-logfile - --error-logfile - --log-level $GUNICORN_LOG_LEVEL recipes.wsgi
ipv6_disable=$(cat /sys/module/ipv6/parameters/disable)
# Check if IPv6 is enabled, only then run gunicorn with ipv6 support
if [ "$ipv6_disable" -eq 0 ]; then
exec gunicorn -b "[::]:$TANDOOR_PORT" --workers $GUNICORN_WORKERS --threads $GUNICORN_THREADS --access-logfile - --error-logfile - --log-level $GUNICORN_LOG_LEVEL recipes.wsgi
else
exec gunicorn -b ":$TANDOOR_PORT" --workers $GUNICORN_WORKERS --threads $GUNICORN_THREADS --access-logfile - --error-logfile - --log-level $GUNICORN_LOG_LEVEL recipes.wsgi
fi

View File

@@ -13,10 +13,10 @@ from cookbook.managers import DICTIONARY
from .models import (BookmarkletImport, Comment, CookLog, Food, ImportLog, Ingredient, InviteLink,
Keyword, MealPlan, MealType, NutritionInformation, Property, PropertyType,
Recipe, RecipeBook, RecipeBookEntry, RecipeImport, SearchPreference, ShareLink,
ShoppingList, ShoppingListEntry, ShoppingListRecipe, Space, Step, Storage,
ShoppingListEntry, ShoppingListRecipe, Space, Step, Storage,
Supermarket, SupermarketCategory, SupermarketCategoryRelation, Sync, SyncLog,
TelegramBot, Unit, UnitConversion, UserFile, UserPreference, UserSpace,
ViewLog)
ViewLog, ConnectorConfig)
class CustomUserAdmin(UserAdmin):
@@ -60,9 +60,9 @@ admin.site.register(UserSpace, UserSpaceAdmin)
class UserPreferenceAdmin(admin.ModelAdmin):
list_display = ('name', 'theme', 'nav_color', 'default_page',)
list_display = ('name', 'theme', 'default_page')
search_fields = ('user__username',)
list_filter = ('theme', 'nav_color', 'default_page',)
list_filter = ('theme', 'default_page',)
date_hierarchy = 'created_at'
filter_horizontal = ('plan_share', 'shopping_share',)
@@ -95,6 +95,14 @@ class StorageAdmin(admin.ModelAdmin):
admin.site.register(Storage, StorageAdmin)
class ConnectorConfigAdmin(admin.ModelAdmin):
list_display = ('id', 'name', 'type', 'enabled', 'url')
search_fields = ('name', 'url')
admin.site.register(ConnectorConfig, ConnectorConfigAdmin)
class SyncAdmin(admin.ModelAdmin):
list_display = ('storage', 'path', 'active', 'last_checked')
search_fields = ('storage__name', 'path')
@@ -108,11 +116,16 @@ class SupermarketCategoryInline(admin.TabularInline):
class SupermarketAdmin(admin.ModelAdmin):
list_display = ('name', 'space',)
inlines = (SupermarketCategoryInline,)
class SupermarketCategoryAdmin(admin.ModelAdmin):
list_display = ('name', 'space',)
admin.site.register(Supermarket, SupermarketAdmin)
admin.site.register(SupermarketCategory)
admin.site.register(SupermarketCategory, SupermarketCategoryAdmin)
class SyncLogAdmin(admin.ModelAdmin):
@@ -163,10 +176,18 @@ def delete_unattached_steps(modeladmin, request, queryset):
class StepAdmin(admin.ModelAdmin):
list_display = ('name', 'order',)
search_fields = ('name',)
list_display = ('recipe_and_name', 'order', 'space')
ordering = ('recipe__name', 'name', 'space',)
search_fields = ('name', 'recipe__name')
actions = [delete_unattached_steps]
@staticmethod
@admin.display(description="Name")
def recipe_and_name(obj):
if not obj.recipe_set.exists():
return f"Orphaned Step{'':s if not obj.name else f': {obj.name}'}"
return f"{obj.recipe_set.first().name}: {obj.name}" if obj.name else obj.recipe_set.first().name
admin.site.register(Step, StepAdmin)
@@ -183,8 +204,9 @@ def rebuild_index(modeladmin, request, queryset):
class RecipeAdmin(admin.ModelAdmin):
list_display = ('name', 'internal', 'created_by', 'storage')
list_display = ('name', 'internal', 'created_by', 'storage', 'space')
search_fields = ('name', 'created_by__username')
ordering = ('name', 'created_by__username',)
list_filter = ('internal',)
date_hierarchy = 'created_at'
@@ -198,7 +220,14 @@ class RecipeAdmin(admin.ModelAdmin):
admin.site.register(Recipe, RecipeAdmin)
admin.site.register(Unit)
class UnitAdmin(admin.ModelAdmin):
list_display = ('name', 'space')
ordering = ('name', 'space',)
search_fields = ('name',)
admin.site.register(Unit, UnitAdmin)
# admin.site.register(FoodInheritField)
@@ -229,10 +258,16 @@ def delete_unattached_ingredients(modeladmin, request, queryset):
class IngredientAdmin(admin.ModelAdmin):
list_display = ('food', 'amount', 'unit')
search_fields = ('food__name', 'unit__name')
list_display = ('recipe_name', 'amount', 'unit', 'food', 'space')
search_fields = ('food__name', 'unit__name', 'step__recipe__name')
actions = [delete_unattached_ingredients]
@staticmethod
@admin.display(description="Recipe")
def recipe_name(obj):
recipes = obj.step_set.first().recipe_set.all() if obj.step_set.exists() else None
return recipes.first().name if recipes else 'Orphaned Ingredient'
admin.site.register(Ingredient, IngredientAdmin)
@@ -258,7 +293,7 @@ admin.site.register(RecipeImport, RecipeImportAdmin)
class RecipeBookAdmin(admin.ModelAdmin):
list_display = ('name', 'user_name')
list_display = ('name', 'user_name', 'space')
search_fields = ('name', 'created_by__username')
@staticmethod
@@ -288,8 +323,8 @@ admin.site.register(MealPlan, MealPlanAdmin)
class MealTypeAdmin(admin.ModelAdmin):
list_display = ('name', 'created_by', 'order')
search_fields = ('name', 'created_by__username')
list_display = ('name', 'space', 'created_by', 'order')
search_fields = ('name', 'space', 'created_by__username')
admin.site.register(MealType, MealTypeAdmin)
@@ -334,13 +369,6 @@ class ShoppingListEntryAdmin(admin.ModelAdmin):
admin.site.register(ShoppingListEntry, ShoppingListEntryAdmin)
class ShoppingListAdmin(admin.ModelAdmin):
list_display = ('id', 'created_by', 'created_at')
admin.site.register(ShoppingList, ShoppingListAdmin)
class ShareLinkAdmin(admin.ModelAdmin):
list_display = ('recipe', 'created_by', 'uuid', 'created_at',)

View File

@@ -3,6 +3,7 @@ import traceback
from django.apps import AppConfig
from django.conf import settings
from django.db import OperationalError, ProgrammingError
from django.db.models.signals import post_save, post_delete
from django_scopes import scopes_disabled
from recipes.settings import DEBUG
@@ -14,6 +15,16 @@ class CookbookConfig(AppConfig):
def ready(self):
import cookbook.signals # noqa
if not settings.DISABLE_EXTERNAL_CONNECTORS:
try:
from cookbook.connectors.connector_manager import ConnectorManager # Needs to be here to prevent loading race condition of oauth2 modules in models.py
handler = ConnectorManager()
post_save.connect(handler, dispatch_uid="connector_manager")
post_delete.connect(handler, dispatch_uid="connector_manager")
except Exception as e:
traceback.print_exc()
print('Failed to initialize connectors')
pass
# if not settings.DISABLE_TREE_FIX_STARTUP:
# # when starting up run fix_tree to:
# # a) make sure that nodes are sorted when switching between sort modes

View File

View File

@@ -0,0 +1,29 @@
from abc import ABC, abstractmethod
from cookbook.models import ShoppingListEntry, Space, ConnectorConfig
# A Connector is 'destroyed' & recreated each time 'any' ConnectorConfig in a space changes.
class Connector(ABC):
@abstractmethod
def __init__(self, config: ConnectorConfig):
pass
@abstractmethod
async def on_shopping_list_entry_created(self, space: Space, instance: ShoppingListEntry) -> None:
pass
# This method might not trigger on 'direct' entry updates: https://stackoverflow.com/a/35238823
@abstractmethod
async def on_shopping_list_entry_updated(self, space: Space, instance: ShoppingListEntry) -> None:
pass
@abstractmethod
async def on_shopping_list_entry_deleted(self, space: Space, instance: ShoppingListEntry) -> None:
pass
@abstractmethod
async def close(self) -> None:
pass
# TODO: Add Recipes & possibly Meal Place listeners/hooks (And maybe more?)

View File

@@ -0,0 +1,179 @@
import asyncio
import logging
import queue
import threading
from asyncio import Task
from dataclasses import dataclass
from enum import Enum
from types import UnionType
from typing import List, Any, Dict, Optional, Type
from django.conf import settings
from django_scopes import scope
from cookbook.connectors.connector import Connector
from cookbook.connectors.homeassistant import HomeAssistant
from cookbook.models import ShoppingListEntry, Space, ConnectorConfig
REGISTERED_CLASSES: UnionType | Type = ShoppingListEntry
class ActionType(Enum):
CREATED = 1
UPDATED = 2
DELETED = 3
@dataclass
class Work:
instance: REGISTERED_CLASSES | ConnectorConfig
actionType: ActionType
# The way ConnectionManager works is as follows:
# 1. On init, it starts a worker & creates a queue for 'Work'
# 2. Then any time its called, it verifies the type of action (create/update/delete) and if the item is of interest, pushes the Work (non-blocking) to the queue.
# 3. The worker consumes said work from the queue.
# 3.1 If the work is of type ConnectorConfig, it flushes its cache of known connectors (per space.id)
# 3.2 If work is of type REGISTERED_CLASSES, it asynchronously fires of all connectors and wait for them to finish (runtime should depend on the 'slowest' connector)
# 4. Work is marked as consumed, and next entry of the queue is consumed.
# Each 'Work' is processed in sequential by the worker, so the throughput is about [workers * the slowest connector]
class ConnectorManager:
_queue: queue.Queue
_listening_to_classes = REGISTERED_CLASSES | ConnectorConfig
def __init__(self):
self._queue = queue.Queue(maxsize=settings.EXTERNAL_CONNECTORS_QUEUE_SIZE)
self._worker = threading.Thread(target=self.worker, args=(0, self._queue,), daemon=True)
self._worker.start()
# Called by post save & post delete signals
def __call__(self, instance: Any, **kwargs) -> None:
if not isinstance(instance, self._listening_to_classes) or not hasattr(instance, "space"):
return
action_type: ActionType
if "created" in kwargs and kwargs["created"]:
action_type = ActionType.CREATED
elif "created" in kwargs and not kwargs["created"]:
action_type = ActionType.UPDATED
elif "origin" in kwargs:
action_type = ActionType.DELETED
else:
return
try:
self._queue.put_nowait(Work(instance, action_type))
except queue.Full:
logging.info(f"queue was full, so skipping {action_type} of type {type(instance)}")
return
def stop(self):
self._queue.join()
self._worker.join()
@staticmethod
def worker(worker_id: int, worker_queue: queue.Queue):
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
logging.info(f"started ConnectionManager worker {worker_id}")
# When multiple workers are used, please make sure the cache is shared across all threads, otherwise it might lead to un-expected behavior.
_connectors_cache: Dict[int, List[Connector]] = dict()
while True:
try:
item: Optional[Work] = worker_queue.get()
except KeyboardInterrupt:
break
if item is None:
break
# If a Connector was changed/updated, refresh connector from the database for said space
refresh_connector_cache = isinstance(item.instance, ConnectorConfig)
space: Space = item.instance.space
connectors: Optional[List[Connector]] = _connectors_cache.get(space.id)
if connectors is None or refresh_connector_cache:
if connectors is not None:
loop.run_until_complete(close_connectors(connectors))
with scope(space=space):
connectors: List[Connector] = list()
for config in space.connectorconfig_set.all():
config: ConnectorConfig = config
if not config.enabled:
continue
try:
connector: Optional[Connector] = ConnectorManager.get_connected_for_config(config)
except BaseException:
logging.exception(f"failed to initialize {config.name}")
continue
if connector is not None:
connectors.append(connector)
_connectors_cache[space.id] = connectors
if len(connectors) == 0 or refresh_connector_cache:
worker_queue.task_done()
continue
loop.run_until_complete(run_connectors(connectors, space, item.instance, item.actionType))
worker_queue.task_done()
logging.info(f"terminating ConnectionManager worker {worker_id}")
asyncio.set_event_loop(None)
loop.close()
@staticmethod
def get_connected_for_config(config: ConnectorConfig) -> Optional[Connector]:
match config.type:
case ConnectorConfig.HOMEASSISTANT:
return HomeAssistant(config)
case _:
return None
async def close_connectors(connectors: List[Connector]):
tasks: List[Task] = [asyncio.create_task(connector.close()) for connector in connectors]
if len(tasks) == 0:
return
try:
await asyncio.gather(*tasks, return_exceptions=False)
except BaseException:
logging.exception("received an exception while closing one of the connectors")
async def run_connectors(connectors: List[Connector], space: Space, instance: REGISTERED_CLASSES, action_type: ActionType):
tasks: List[Task] = list()
if isinstance(instance, ShoppingListEntry):
shopping_list_entry: ShoppingListEntry = instance
match action_type:
case ActionType.CREATED:
for connector in connectors:
tasks.append(asyncio.create_task(connector.on_shopping_list_entry_created(space, shopping_list_entry)))
case ActionType.UPDATED:
for connector in connectors:
tasks.append(asyncio.create_task(connector.on_shopping_list_entry_updated(space, shopping_list_entry)))
case ActionType.DELETED:
for connector in connectors:
tasks.append(asyncio.create_task(connector.on_shopping_list_entry_deleted(space, shopping_list_entry)))
if len(tasks) == 0:
return
try:
# Wait for all async tasks to finish, if one fails, the others still continue.
await asyncio.gather(*tasks, return_exceptions=False)
except BaseException:
logging.exception("received an exception from one of the connectors")

View File

@@ -0,0 +1,103 @@
import logging
from logging import Logger
from typing import Dict, Tuple
from urllib.parse import urljoin
from aiohttp import ClientError, request
from cookbook.connectors.connector import Connector
from cookbook.models import ShoppingListEntry, ConnectorConfig, Space
class HomeAssistant(Connector):
_config: ConnectorConfig
_logger: Logger
def __init__(self, config: ConnectorConfig):
if not config.token or not config.url or not config.todo_entity:
raise ValueError("config for HomeAssistantConnector in incomplete")
if config.url[-1] != "/":
config.url += "/"
self._config = config
self._logger = logging.getLogger("connector.HomeAssistant")
async def homeassistant_api_call(self, method: str, path: str, data: Dict) -> str:
headers = {
"Authorization": f"Bearer {self._config.token}",
"Content-Type": "application/json"
}
async with request(method, urljoin(self._config.url, path), headers=headers, json=data) as response:
response.raise_for_status()
return await response.json()
async def on_shopping_list_entry_created(self, space: Space, shopping_list_entry: ShoppingListEntry) -> None:
if not self._config.on_shopping_list_entry_created_enabled:
return
item, description = _format_shopping_list_entry(shopping_list_entry)
logging.debug(f"adding {item=} to {self._config.name}")
data = {
"entity_id": self._config.todo_entity,
"item": item,
"description": description,
}
try:
await self.homeassistant_api_call("POST", "services/todo/add_item", data)
except ClientError as err:
self._logger.warning(f"[HomeAssistant {self._config.name}] Received an exception from the api: {err=}, {type(err)=}")
async def on_shopping_list_entry_updated(self, space: Space, shopping_list_entry: ShoppingListEntry) -> None:
if not self._config.on_shopping_list_entry_updated_enabled:
return
pass
async def on_shopping_list_entry_deleted(self, space: Space, shopping_list_entry: ShoppingListEntry) -> None:
if not self._config.on_shopping_list_entry_deleted_enabled:
return
if not hasattr(shopping_list_entry._state.fields_cache, "food"):
# Sometimes the food foreign key is not loaded, and we cant load it from an async process
self._logger.debug("required property was not present in ShoppingListEntry")
return
item, _ = _format_shopping_list_entry(shopping_list_entry)
logging.debug(f"removing {item=} from {self._config.name}")
data = {
"entity_id": self._config.todo_entity,
"item": item,
}
try:
await self.homeassistant_api_call("POST", "services/todo/remove_item", data)
except ClientError as err:
# This error will always trigger if the item is not present/found
self._logger.debug(f"[HomeAssistant {self._config.name}] Received an exception from the api: {err=}, {type(err)=}")
async def close(self) -> None:
pass
def _format_shopping_list_entry(shopping_list_entry: ShoppingListEntry) -> Tuple[str, str]:
item = shopping_list_entry.food.name
if shopping_list_entry.amount > 0:
item += f" ({shopping_list_entry.amount:.2f}".rstrip('0').rstrip('.')
if shopping_list_entry.unit and shopping_list_entry.unit.base_unit and len(shopping_list_entry.unit.base_unit) > 0:
item += f" {shopping_list_entry.unit.base_unit})"
elif shopping_list_entry.unit and shopping_list_entry.unit.name and len(shopping_list_entry.unit.name) > 0:
item += f" {shopping_list_entry.unit.name})"
else:
item += ")"
description = "From TandoorRecipes"
if shopping_list_entry.created_by.first_name and len(shopping_list_entry.created_by.first_name) > 0:
description += f", by {shopping_list_entry.created_by.first_name}"
else:
description += f", by {shopping_list_entry.created_by.username}"
return item, description

View File

@@ -1,5 +1,6 @@
from datetime import datetime
from allauth.account.forms import ResetPasswordForm, SignupForm
from django import forms
from django.conf import settings
from django.core.exceptions import ValidationError
@@ -9,18 +10,19 @@ from django_scopes import scopes_disabled
from django_scopes.forms import SafeModelChoiceField, SafeModelMultipleChoiceField
from hcaptcha.fields import hCaptchaField
from .models import (Comment, Food, InviteLink, Keyword, Recipe, RecipeBook, RecipeBookEntry,
SearchPreference, Space, Storage, Sync, User, UserPreference)
from .models import Comment, InviteLink, Keyword, Recipe, SearchPreference, Space, Storage, Sync, User, UserPreference, ConnectorConfig
class SelectWidget(widgets.Select):
class Media:
js = ('custom/js/form_select.js',)
js = ('custom/js/form_select.js', )
class MultiSelectWidget(widgets.SelectMultiple):
class Media:
js = ('custom/js/form_multiselect.js',)
js = ('custom/js/form_multiselect.js', )
# Yes there are some stupid browsers that still dont support this but
@@ -33,64 +35,6 @@ class DateWidget(forms.DateInput):
super().__init__(**kwargs)
class UserPreferenceForm(forms.ModelForm):
prefix = 'preference'
def __init__(self, *args, **kwargs):
space = kwargs.pop('space')
super().__init__(*args, **kwargs)
self.fields['plan_share'].queryset = User.objects.filter(userspace__space=space).all()
class Meta:
model = UserPreference
fields = (
'default_unit', 'use_fractions', 'use_kj', 'theme', 'nav_color',
'sticky_navbar', 'default_page', 'plan_share', 'ingredient_decimals', 'comments', 'left_handed', 'show_step_ingredients',
)
labels = {
'default_unit': _('Default unit'),
'use_fractions': _('Use fractions'),
'use_kj': _('Use KJ'),
'theme': _('Theme'),
'nav_color': _('Navbar color'),
'sticky_navbar': _('Sticky navbar'),
'default_page': _('Default page'),
'plan_share': _('Plan sharing'),
'ingredient_decimals': _('Ingredient decimal places'),
'shopping_auto_sync': _('Shopping list auto sync period'),
'comments': _('Comments'),
'left_handed': _('Left-handed mode'),
'show_step_ingredients': _('Show step ingredients table')
}
help_texts = {
'nav_color': _('Color of the top navigation bar. Not all colors work with all themes, just try them out!'),
'default_unit': _('Default Unit to be used when inserting a new ingredient into a recipe.'),
'use_fractions': _(
'Enables support for fractions in ingredient amounts (e.g. convert decimals to fractions automatically)'),
'use_kj': _('Display nutritional energy amounts in joules instead of calories'),
'plan_share': _('Users with whom newly created meal plans should be shared by default.'),
'shopping_share': _('Users with whom to share shopping lists.'),
'ingredient_decimals': _('Number of decimals to round ingredients.'),
'comments': _('If you want to be able to create and see comments underneath recipes.'),
'shopping_auto_sync': _(
'Setting to 0 will disable auto sync. When viewing a shopping list the list is updated every set seconds to sync changes someone else might have made. Useful when shopping with multiple people but might use a little bit '
'of mobile data. If lower than instance limit it is reset when saving.'
),
'sticky_navbar': _('Makes the navbar stick to the top of the page.'),
'mealplan_autoadd_shopping': _('Automatically add meal plan ingredients to shopping list.'),
'mealplan_autoexclude_onhand': _('Exclude ingredients that are on hand.'),
'left_handed': _('Will optimize the UI for use with your left hand.'),
'show_step_ingredients': _('Add ingredients table next to recipe steps. Applies at creation time for manually created and URL imported recipes. Individual steps can be overridden in the edit recipe view.')
}
widgets = {
'plan_share': MultiSelectWidget,
'shopping_share': MultiSelectWidget,
}
class UserNameForm(forms.ModelForm):
prefix = 'name'
@@ -98,9 +42,7 @@ class UserNameForm(forms.ModelForm):
model = User
fields = ('first_name', 'last_name')
help_texts = {
'first_name': _('Both fields are optional. If none are given the username will be displayed instead')
}
help_texts = {'first_name': _('Both fields are optional. If none are given the username will be displayed instead')}
class ExternalRecipeForm(forms.ModelForm):
@@ -114,23 +56,14 @@ class ExternalRecipeForm(forms.ModelForm):
class Meta:
model = Recipe
fields = (
'name', 'description', 'servings', 'working_time', 'waiting_time',
'file_path', 'file_uid', 'keywords'
)
fields = ('name', 'description', 'servings', 'working_time', 'waiting_time', 'file_path', 'file_uid', 'keywords')
labels = {
'name': _('Name'),
'keywords': _('Keywords'),
'working_time': _('Preparation time in minutes'),
'waiting_time': _('Waiting time (cooking/baking) in minutes'),
'file_path': _('Path'),
'file_uid': _('Storage UID'),
'name': _('Name'), 'keywords': _('Keywords'), 'working_time': _('Preparation time in minutes'), 'waiting_time': _('Waiting time (cooking/baking) in minutes'),
'file_path': _('Path'), 'file_uid': _('Storage UID'),
}
widgets = {'keywords': MultiSelectWidget}
field_classes = {
'keywords': SafeModelMultipleChoiceField,
}
field_classes = {'keywords': SafeModelMultipleChoiceField, }
class ImportExportBase(forms.Form):
@@ -157,14 +90,11 @@ class ImportExportBase(forms.Form):
REZEPTSUITEDE = 'REZEPTSUITEDE'
PDF = 'PDF'
type = forms.ChoiceField(choices=(
(DEFAULT, _('Default')), (PAPRIKA, 'Paprika'), (NEXTCLOUD, 'Nextcloud Cookbook'),
(MEALIE, 'Mealie'), (CHOWDOWN, 'Chowdown'), (SAFFRON, 'Saffron'), (CHEFTAP, 'ChefTap'),
(PEPPERPLATE, 'Pepperplate'), (RECETTETEK, 'RecetteTek'), (RECIPESAGE, 'Recipe Sage'), (DOMESTICA, 'Domestica'),
(MEALMASTER, 'MealMaster'), (REZKONV, 'RezKonv'), (OPENEATS, 'Openeats'), (RECIPEKEEPER, 'Recipe Keeper'),
(PLANTOEAT, 'Plantoeat'), (COOKBOOKAPP, 'CookBookApp'), (COPYMETHAT, 'CopyMeThat'), (PDF, 'PDF'), (MELARECIPES, 'Melarecipes'),
(COOKMATE, 'Cookmate'), (REZEPTSUITEDE, 'Recipesuite.de')
))
type = forms.ChoiceField(choices=((DEFAULT, _('Default')), (PAPRIKA, 'Paprika'), (NEXTCLOUD, 'Nextcloud Cookbook'), (MEALIE, 'Mealie'), (CHOWDOWN, 'Chowdown'),
(SAFFRON, 'Saffron'), (CHEFTAP, 'ChefTap'), (PEPPERPLATE, 'Pepperplate'), (RECETTETEK, 'RecetteTek'), (RECIPESAGE, 'Recipe Sage'),
(DOMESTICA, 'Domestica'), (MEALMASTER, 'MealMaster'), (REZKONV, 'RezKonv'), (OPENEATS, 'Openeats'), (RECIPEKEEPER, 'Recipe Keeper'),
(PLANTOEAT, 'Plantoeat'), (COOKBOOKAPP, 'CookBookApp'), (COPYMETHAT, 'CopyMeThat'), (PDF, 'PDF'), (MELARECIPES, 'Melarecipes'),
(COOKMATE, 'Cookmate'), (REZEPTSUITEDE, 'Recipesuite.de')))
class MultipleFileInput(forms.ClearableFileInput):
@@ -172,6 +102,7 @@ class MultipleFileInput(forms.ClearableFileInput):
class MultipleFileField(forms.FileField):
def __init__(self, *args, **kwargs):
kwargs.setdefault("widget", MultipleFileInput())
super().__init__(*args, **kwargs)
@@ -187,9 +118,8 @@ class MultipleFileField(forms.FileField):
class ImportForm(ImportExportBase):
files = MultipleFileField(required=True)
duplicates = forms.BooleanField(help_text=_(
'To prevent duplicates recipes with the same name as existing ones are ignored. Check this box to import everything.'),
required=False)
duplicates = forms.BooleanField(help_text=_('To prevent duplicates recipes with the same name as existing ones are ignored. Check this box to import everything.'),
required=False)
class ExportForm(ImportExportBase):
@@ -208,59 +138,71 @@ class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = ('text',)
fields = ('text', )
labels = {
'text': _('Add your comment: '),
}
widgets = {
'text': forms.Textarea(attrs={'rows': 2, 'cols': 15}),
}
labels = {'text': _('Add your comment: '), }
widgets = {'text': forms.Textarea(attrs={'rows': 2, 'cols': 15}), }
class StorageForm(forms.ModelForm):
username = forms.CharField(
widget=forms.TextInput(attrs={'autocomplete': 'new-password'}),
required=False
)
password = forms.CharField(
widget=forms.TextInput(attrs={'autocomplete': 'new-password', 'type': 'password'}),
required=False,
help_text=_('Leave empty for dropbox and enter app password for nextcloud.')
)
token = forms.CharField(
widget=forms.TextInput(
attrs={'autocomplete': 'new-password', 'type': 'password'}
),
required=False,
help_text=_('Leave empty for nextcloud and enter api token for dropbox.')
)
username = forms.CharField(widget=forms.TextInput(attrs={'autocomplete': 'new-password'}), required=False)
password = forms.CharField(widget=forms.TextInput(attrs={'autocomplete': 'new-password', 'type': 'password'}),
required=False,
help_text=_('Leave empty for dropbox and enter app password for nextcloud.'))
token = forms.CharField(widget=forms.TextInput(attrs={'autocomplete': 'new-password', 'type': 'password'}),
required=False,
help_text=_('Leave empty for nextcloud and enter api token for dropbox.'))
class Meta:
model = Storage
fields = ('name', 'method', 'username', 'password', 'token', 'url', 'path')
help_texts = {
'url': _(
'Leave empty for dropbox and enter only base url for nextcloud (<code>/remote.php/webdav/</code> is added automatically)'),
}
help_texts = {'url': _('Leave empty for dropbox and enter only base url for nextcloud (<code>/remote.php/webdav/</code> is added automatically)'), }
# TODO: Deprecate
class RecipeBookEntryForm(forms.ModelForm):
prefix = 'bookmark'
def __init__(self, *args, **kwargs):
space = kwargs.pop('space')
super().__init__(*args, **kwargs)
self.fields['book'].queryset = RecipeBook.objects.filter(space=space).all()
class ConnectorConfigForm(forms.ModelForm):
enabled = forms.BooleanField(
help_text="Is the connector enabled",
required=False,
)
on_shopping_list_entry_created_enabled = forms.BooleanField(
help_text="Enable action for ShoppingListEntry created events",
required=False,
)
on_shopping_list_entry_updated_enabled = forms.BooleanField(
help_text="Enable action for ShoppingListEntry updated events",
required=False,
)
on_shopping_list_entry_deleted_enabled = forms.BooleanField(
help_text="Enable action for ShoppingListEntry deleted events",
required=False,
)
update_token = forms.CharField(
widget=forms.TextInput(attrs={'autocomplete': 'update-token', 'type': 'password'}),
required=False,
help_text=_('<a href="https://www.home-assistant.io/docs/authentication/#your-account-profile">Long Lived Access Token</a> for your HomeAssistant instance')
)
url = forms.URLField(
required=False,
help_text=_('Something like http://homeassistant.local:8123/api'),
)
class Meta:
model = RecipeBookEntry
fields = ('book',)
model = ConnectorConfig
field_classes = {
'book': SafeModelChoiceField,
fields = (
'name', 'type', 'enabled', 'on_shopping_list_entry_created_enabled', 'on_shopping_list_entry_updated_enabled',
'on_shopping_list_entry_deleted_enabled', 'url', 'todo_entity',
)
help_texts = {
'url': _('http://homeassistant.local:8123/api for example'),
}
@@ -275,25 +217,14 @@ class SyncForm(forms.ModelForm):
model = Sync
fields = ('storage', 'path', 'active')
field_classes = {
'storage': SafeModelChoiceField,
}
field_classes = {'storage': SafeModelChoiceField, }
labels = {
'storage': _('Storage'),
'path': _('Path'),
'active': _('Active')
}
labels = {'storage': _('Storage'), 'path': _('Path'), 'active': _('Active')}
# TODO deprecate
class BatchEditForm(forms.Form):
search = forms.CharField(label=_('Search String'))
keywords = forms.ModelMultipleChoiceField(
queryset=Keyword.objects.none(),
required=False,
widget=MultiSelectWidget
)
keywords = forms.ModelMultipleChoiceField(queryset=Keyword.objects.none(), required=False, widget=MultiSelectWidget)
def __init__(self, *args, **kwargs):
space = kwargs.pop('space')
@@ -302,6 +233,7 @@ class BatchEditForm(forms.Form):
class ImportRecipeForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
space = kwargs.pop('space')
super().__init__(*args, **kwargs)
@@ -311,19 +243,13 @@ class ImportRecipeForm(forms.ModelForm):
model = Recipe
fields = ('name', 'keywords', 'file_path', 'file_uid')
labels = {
'name': _('Name'),
'keywords': _('Keywords'),
'file_path': _('Path'),
'file_uid': _('File ID'),
}
labels = {'name': _('Name'), 'keywords': _('Keywords'), 'file_path': _('Path'), 'file_uid': _('File ID'), }
widgets = {'keywords': MultiSelectWidget}
field_classes = {
'keywords': SafeModelChoiceField,
}
field_classes = {'keywords': SafeModelChoiceField, }
class InviteLinkForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
user = kwargs.pop('user')
super().__init__(*args, **kwargs)
@@ -331,8 +257,8 @@ class InviteLinkForm(forms.ModelForm):
def clean(self):
space = self.cleaned_data['space']
if space.max_users != 0 and (UserPreference.objects.filter(space=space).count() +
InviteLink.objects.filter(valid_until__gte=datetime.today(), used_by=None, space=space).count()) >= space.max_users:
if space.max_users != 0 and (UserPreference.objects.filter(space=space).count()
+ InviteLink.objects.filter(valid_until__gte=datetime.today(), used_by=None, space=space).count()) >= space.max_users:
raise ValidationError(_('Maximum number of users for this space reached.'))
def clean_email(self):
@@ -346,12 +272,8 @@ class InviteLinkForm(forms.ModelForm):
class Meta:
model = InviteLink
fields = ('email', 'group', 'valid_until', 'space')
help_texts = {
'email': _('An email address is not required but if present the invite link will be sent to the user.'),
}
field_classes = {
'space': SafeModelChoiceField,
}
help_texts = {'email': _('An email address is not required but if present the invite link will be sent to the user.'), }
field_classes = {'space': SafeModelChoiceField, }
class SpaceCreateForm(forms.Form):
@@ -371,12 +293,12 @@ class SpaceJoinForm(forms.Form):
token = forms.CharField()
class AllAuthSignupForm(forms.Form):
class AllAuthSignupForm(SignupForm):
captcha = hCaptchaField()
terms = forms.BooleanField(label=_('Accept Terms and Privacy'))
def __init__(self, **kwargs):
super(AllAuthSignupForm, self).__init__(**kwargs)
super().__init__(**kwargs)
if settings.PRIVACY_URL == '' and settings.TERMS_URL == '':
self.fields.pop('terms')
if settings.HCAPTCHA_SECRET == '':
@@ -386,135 +308,50 @@ class AllAuthSignupForm(forms.Form):
pass
class CustomPasswordResetForm(ResetPasswordForm):
captcha = hCaptchaField()
def __init__(self, **kwargs):
super(CustomPasswordResetForm, self).__init__(**kwargs)
if settings.HCAPTCHA_SECRET == '':
self.fields.pop('captcha')
class UserCreateForm(forms.Form):
name = forms.CharField(label='Username')
password = forms.CharField(
widget=forms.TextInput(
attrs={'autocomplete': 'new-password', 'type': 'password'}
)
)
password_confirm = forms.CharField(
widget=forms.TextInput(
attrs={'autocomplete': 'new-password', 'type': 'password'}
)
)
password = forms.CharField(widget=forms.TextInput(attrs={'autocomplete': 'new-password', 'type': 'password'}))
password_confirm = forms.CharField(widget=forms.TextInput(attrs={'autocomplete': 'new-password', 'type': 'password'}))
class SearchPreferenceForm(forms.ModelForm):
prefix = 'search'
trigram_threshold = forms.DecimalField(min_value=0.01, max_value=1, decimal_places=2,
trigram_threshold = forms.DecimalField(min_value=0.01,
max_value=1,
decimal_places=2,
widget=NumberInput(attrs={'class': "form-control-range", 'type': 'range'}),
help_text=_(
'Determines how fuzzy a search is if it uses trigram similarity matching (e.g. low values mean more typos are ignored).'))
help_text=_('Determines how fuzzy a search is if it uses trigram similarity matching (e.g. low values mean more typos are ignored).'))
preset = forms.CharField(widget=forms.HiddenInput(), required=False)
class Meta:
model = SearchPreference
fields = (
'search', 'lookup', 'unaccent', 'icontains', 'istartswith', 'trigram', 'fulltext', 'trigram_threshold')
fields = ('search', 'lookup', 'unaccent', 'icontains', 'istartswith', 'trigram', 'fulltext', 'trigram_threshold')
help_texts = {
'search': _(
'Select type method of search. Click <a href="/docs/search/">here</a> for full description of choices.'),
'lookup': _('Use fuzzy matching on units, keywords and ingredients when editing and importing recipes.'),
'unaccent': _(
'Fields to search ignoring accents. Selecting this option can improve or degrade search quality depending on language'),
'icontains': _(
"Fields to search for partial matches. (e.g. searching for 'Pie' will return 'pie' and 'piece' and 'soapie')"),
'istartswith': _(
"Fields to search for beginning of word matches. (e.g. searching for 'sa' will return 'salad' and 'sandwich')"),
'trigram': _(
"Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) Note: this option will conflict with 'web' and 'raw' methods of search."),
'fulltext': _(
"Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods only function with fulltext fields."),
'search': _('Select type method of search. Click <a href="/docs/search/">here</a> for full description of choices.'), 'lookup':
_('Use fuzzy matching on units, keywords and ingredients when editing and importing recipes.'), 'unaccent':
_('Fields to search ignoring accents. Selecting this option can improve or degrade search quality depending on language'), 'icontains':
_("Fields to search for partial matches. (e.g. searching for 'Pie' will return 'pie' and 'piece' and 'soapie')"), 'istartswith':
_("Fields to search for beginning of word matches. (e.g. searching for 'sa' will return 'salad' and 'sandwich')"), 'trigram':
_("Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) Note: this option will conflict with 'web' and 'raw' methods of search."), 'fulltext':
_("Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods only function with fulltext fields."),
}
labels = {
'search': _('Search Method'),
'lookup': _('Fuzzy Lookups'),
'unaccent': _('Ignore Accent'),
'icontains': _("Partial Match"),
'istartswith': _("Starts With"),
'trigram': _("Fuzzy Search"),
'fulltext': _("Full Text")
'search': _('Search Method'), 'lookup': _('Fuzzy Lookups'), 'unaccent': _('Ignore Accent'), 'icontains': _("Partial Match"), 'istartswith': _("Starts With"),
'trigram': _("Fuzzy Search"), 'fulltext': _("Full Text")
}
widgets = {
'search': SelectWidget,
'unaccent': MultiSelectWidget,
'icontains': MultiSelectWidget,
'istartswith': MultiSelectWidget,
'trigram': MultiSelectWidget,
'fulltext': MultiSelectWidget,
}
class ShoppingPreferenceForm(forms.ModelForm):
prefix = 'shopping'
class Meta:
model = UserPreference
fields = (
'shopping_share', 'shopping_auto_sync', 'mealplan_autoadd_shopping', 'mealplan_autoexclude_onhand',
'mealplan_autoinclude_related', 'shopping_add_onhand', 'default_delay', 'filter_to_supermarket', 'shopping_recent_days', 'csv_delim', 'csv_prefix'
)
help_texts = {
'shopping_share': _('Users will see all items you add to your shopping list. They must add you to see items on their list.'),
'shopping_auto_sync': _(
'Setting to 0 will disable auto sync. When viewing a shopping list the list is updated every set seconds to sync changes someone else might have made. Useful when shopping with multiple people but might use a little bit '
'of mobile data. If lower than instance limit it is reset when saving.'
),
'mealplan_autoadd_shopping': _('Automatically add meal plan ingredients to shopping list.'),
'mealplan_autoinclude_related': _('When adding a meal plan to the shopping list (manually or automatically), include all related recipes.'),
'mealplan_autoexclude_onhand': _('When adding a meal plan to the shopping list (manually or automatically), exclude ingredients that are on hand.'),
'default_delay': _('Default number of hours to delay a shopping list entry.'),
'filter_to_supermarket': _('Filter shopping list to only include supermarket categories.'),
'shopping_recent_days': _('Days of recent shopping list entries to display.'),
'shopping_add_onhand': _("Mark food 'On Hand' when checked off shopping list."),
'csv_delim': _('Delimiter to use for CSV exports.'),
'csv_prefix': _('Prefix to add when copying list to the clipboard.'),
}
labels = {
'shopping_share': _('Share Shopping List'),
'shopping_auto_sync': _('Autosync'),
'mealplan_autoadd_shopping': _('Auto Add Meal Plan'),
'mealplan_autoexclude_onhand': _('Exclude On Hand'),
'mealplan_autoinclude_related': _('Include Related'),
'default_delay': _('Default Delay Hours'),
'filter_to_supermarket': _('Filter to Supermarket'),
'shopping_recent_days': _('Recent Days'),
'csv_delim': _('CSV Delimiter'),
"csv_prefix_label": _("List Prefix"),
'shopping_add_onhand': _("Auto On Hand"),
}
widgets = {
'shopping_share': MultiSelectWidget
}
class SpacePreferenceForm(forms.ModelForm):
prefix = 'space'
reset_food_inherit = forms.BooleanField(label=_("Reset Food Inheritance"), initial=False, required=False,
help_text=_("Reset all food to inherit the fields configured."))
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # populates the post
self.fields['food_inherit'].queryset = Food.inheritable_fields
class Meta:
model = Space
fields = ('food_inherit', 'reset_food_inherit', 'use_plural')
help_texts = {
'food_inherit': _('Fields on food that should be inherited by default.'),
'use_plural': _('Use the plural form for units and food inside this space.'),
}
widgets = {
'food_inherit': MultiSelectWidget
'search': SelectWidget, 'unaccent': MultiSelectWidget, 'icontains': MultiSelectWidget, 'istartswith': MultiSelectWidget, 'trigram': MultiSelectWidget, 'fulltext':
MultiSelectWidget,
}

View File

@@ -1,8 +0,0 @@
from django.test.runner import DiscoverRunner
from django_scopes import scopes_disabled
class CustomTestRunner(DiscoverRunner):
def run_tests(self, *args, **kwargs):
with scopes_disabled():
return super().run_tests(*args, **kwargs)

View File

@@ -7,7 +7,7 @@ class Round(Func):
def str2bool(v):
if type(v) == bool or v is None:
if isinstance(v, bool) or v is None:
return v
else:
return v.lower() in ("yes", "true", "1")

View File

@@ -1,6 +1,4 @@
import cookbook.helper.dal
from cookbook.helper.AllAuthCustomAdapter import AllAuthCustomAdapter
__all__ = [
'dal',
]

View File

@@ -98,7 +98,7 @@ class AutomationEngine:
try:
return self.food_aliases[food.lower()]
except KeyError:
return food
return self.apply_regex_replace_automation(food, Automation.FOOD_REPLACE)
else:
if automation := Automation.objects.filter(space=self.request.space, type=Automation.FOOD_ALIAS, param_1__iexact=food, disabled=False).order_by('order').first():
return automation.param_2

View File

@@ -11,4 +11,5 @@ def context_settings(request):
'PRIVACY_URL': settings.PRIVACY_URL,
'IMPRINT_URL': settings.IMPRINT_URL,
'SHOPPING_MIN_AUTOSYNC_INTERVAL': settings.SHOPPING_MIN_AUTOSYNC_INTERVAL,
'DISABLE_EXTERNAL_CONNECTORS': settings.DISABLE_EXTERNAL_CONNECTORS,
}

View File

@@ -1,34 +0,0 @@
from cookbook.models import Food, Keyword, Recipe, Unit
from dal import autocomplete
class BaseAutocomplete(autocomplete.Select2QuerySetView):
model = None
def get_queryset(self):
if not self.request.user.is_authenticated:
return self.model.objects.none()
qs = self.model.objects.filter(space=self.request.space).all()
if self.q:
qs = qs.filter(name__icontains=self.q)
return qs
class KeywordAutocomplete(BaseAutocomplete):
model = Keyword
class IngredientsAutocomplete(BaseAutocomplete):
model = Food
class RecipeAutocomplete(BaseAutocomplete):
model = Recipe
class UnitAutocomplete(BaseAutocomplete):
model = Unit

View File

@@ -169,6 +169,9 @@ class IngredientParser:
if len(ingredient) == 0:
raise ValueError('string to parse cannot be empty')
if len(ingredient) > 512:
raise ValueError('cannot parse ingredients with more than 512 characters')
# some people/languages put amount and unit at the end of the ingredient string
# if something like this is detected move it to the beginning so the parser can handle it
if len(ingredient) < 1000 and re.search(r'^([^\W\d_])+(.)*[1-9](\d)*\s*([^\W\d_])+', ingredient):

View File

@@ -1,5 +1,20 @@
import traceback
from collections import defaultdict
from decimal import Decimal
from cookbook.models import (Food, FoodProperty, Property, PropertyType, Supermarket,
SupermarketCategory, SupermarketCategoryRelation, Unit, UnitConversion)
import re
class OpenDataImportResponse:
total_created = 0
total_updated = 0
total_untouched = 0
total_errored = 0
def to_dict(self):
return {'total_created': self.total_created, 'total_updated': self.total_updated, 'total_untouched': self.total_untouched, 'total_errored': self.total_errored}
class OpenDataImporter:
@@ -18,69 +33,269 @@ class OpenDataImporter:
def _update_slug_cache(self, object_class, datatype):
self.slug_id_cache[datatype] = dict(object_class.objects.filter(space=self.request.space, open_data_slug__isnull=False).values_list('open_data_slug', 'id', ))
def import_units(self):
datatype = 'unit'
@staticmethod
def _is_obj_identical(field_list, obj, existing_obj):
"""
checks if the obj meant for import is identical to an already existing one
:param field_list: list of field names to check
:type field_list: list[str]
:param obj: object meant for import
:type obj: Object
:param existing_obj: object already in DB
:type existing_obj: Object
:return: if objects are identical
:rtype: bool
"""
for field in field_list:
if isinstance(getattr(obj, field), float) or isinstance(getattr(obj, field), Decimal):
if abs(float(getattr(obj, field)) - float(existing_obj[field])) > 0.001: # convert both to float and check if basically equal
print(f'comparing FLOAT {obj} failed because field {field} is not equal ({getattr(obj, field)} != {existing_obj[field]})')
return False
elif getattr(obj, field) != existing_obj[field]:
print(f'comparing {obj} failed because field {field} is not equal ({getattr(obj, field)} != {existing_obj[field]})')
return False
return True
@staticmethod
def _merge_if_conflicting(model_type, obj, existing_data_slugs, existing_data_names):
"""
sometimes there might be two objects conflicting for open data import (one has the slug, the other the name)
this function checks if that is the case and merges the two objects if possible
:param model_type: type of model to check/merge
:type model_type: Model
:param obj: object that should be created/updated
:type obj: Model
:param existing_data_slugs: dict of open data slugs mapped to objects
:type existing_data_slugs: dict
:param existing_data_names: dict of names mapped to objects
:type existing_data_names: dict
:return: true if merge was successful or not necessary else false
:rtype: bool
"""
if obj.open_data_slug in existing_data_slugs and obj.name in existing_data_names and existing_data_slugs[obj.open_data_slug]['pk'] != existing_data_names[obj.name]['pk']:
try:
source_obj = model_type.objects.get(pk=existing_data_slugs[obj.open_data_slug]['pk'])
del existing_data_slugs[obj.open_data_slug]
source_obj.merge_into(model_type.objects.get(pk=existing_data_names[obj.name]['pk']))
return True
except RuntimeError:
return False # in the edge case (e.g. parent/child) that an object cannot be merged don't update it for now
else:
return True
@staticmethod
def _get_existing_obj(obj, existing_data_slugs, existing_data_names):
"""
gets the existing object from slug or name cache
:param obj: object that should be found
:type obj: Model
:param existing_data_slugs: dict of open data slugs mapped to objects
:type existing_data_slugs: dict
:param existing_data_names: dict of names mapped to objects
:type existing_data_names: dict
:return: existing object
:rtype: dict
"""
existing_obj = None
if obj.open_data_slug in existing_data_slugs:
existing_obj = existing_data_slugs[obj.open_data_slug]
elif obj.name in existing_data_names:
existing_obj = existing_data_names[obj.name]
return existing_obj
def import_units(self):
od_response = OpenDataImportResponse()
datatype = 'unit'
model_type = Unit
field_list = ['name', 'plural_name', 'base_unit', 'open_data_slug']
existing_data_slugs = {}
existing_data_names = {}
for obj in model_type.objects.filter(space=self.request.space).values('pk', *field_list):
existing_data_slugs[obj['open_data_slug']] = obj
existing_data_names[obj['name']] = obj
update_list = []
create_list = []
insert_list = []
for u in list(self.data[datatype].keys()):
insert_list.append(Unit(
obj = model_type(
name=self.data[datatype][u]['name'],
plural_name=self.data[datatype][u]['plural_name'],
base_unit=self.data[datatype][u]['base_unit'] if self.data[datatype][u]['base_unit'] != '' else None,
base_unit=self.data[datatype][u]['base_unit'].lower() if self.data[datatype][u]['base_unit'] != '' else None,
open_data_slug=u,
space=self.request.space
))
)
if obj.open_data_slug in existing_data_slugs or obj.name in existing_data_names:
if not self._merge_if_conflicting(model_type, obj, existing_data_slugs, existing_data_names):
od_response.total_errored += 1
continue # if conflicting objects exist and cannot be merged skip object
if self.update_existing:
return Unit.objects.bulk_create(insert_list, update_conflicts=True, update_fields=(
'name', 'plural_name', 'base_unit', 'open_data_slug'), unique_fields=('space', 'name',))
else:
return Unit.objects.bulk_create(insert_list, update_conflicts=True, update_fields=('open_data_slug',), unique_fields=('space', 'name',))
existing_obj = self._get_existing_obj(obj, existing_data_slugs, existing_data_names)
if not self._is_obj_identical(field_list, obj, existing_obj):
obj.pk = existing_obj['pk']
update_list.append(obj)
else:
od_response.total_untouched += 1
else:
create_list.append(obj)
if self.update_existing and len(update_list) > 0:
model_type.objects.bulk_update(update_list, field_list)
od_response.total_updated += len(update_list)
if len(create_list) > 0:
model_type.objects.bulk_create(create_list, update_conflicts=True, update_fields=field_list, unique_fields=('space', 'name',))
od_response.total_created += len(create_list)
return od_response
def import_category(self):
od_response = OpenDataImportResponse()
datatype = 'category'
model_type = SupermarketCategory
field_list = ['name', 'open_data_slug']
existing_data_slugs = {}
existing_data_names = {}
for obj in model_type.objects.filter(space=self.request.space).values('pk', *field_list):
existing_data_slugs[obj['open_data_slug']] = obj
existing_data_names[obj['name']] = obj
update_list = []
create_list = []
insert_list = []
for k in list(self.data[datatype].keys()):
insert_list.append(SupermarketCategory(
obj = model_type(
name=self.data[datatype][k]['name'],
open_data_slug=k,
space=self.request.space
))
)
return SupermarketCategory.objects.bulk_create(insert_list, update_conflicts=True, update_fields=('open_data_slug',), unique_fields=('space', 'name',))
if obj.open_data_slug in existing_data_slugs or obj.name in existing_data_names:
if not self._merge_if_conflicting(model_type, obj, existing_data_slugs, existing_data_names):
od_response.total_errored += 1
continue # if conflicting objects exist and cannot be merged skip object
existing_obj = self._get_existing_obj(obj, existing_data_slugs, existing_data_names)
if not self._is_obj_identical(field_list, obj, existing_obj):
obj.pk = existing_obj['pk']
update_list.append(obj)
else:
od_response.total_untouched += 1
else:
create_list.append(obj)
if self.update_existing and len(update_list) > 0:
model_type.objects.bulk_update(update_list, field_list)
od_response.total_updated += len(update_list)
if len(create_list) > 0:
model_type.objects.bulk_create(create_list, update_conflicts=True, update_fields=field_list, unique_fields=('space', 'name',))
od_response.total_created += len(create_list)
return od_response
def import_property(self):
od_response = OpenDataImportResponse()
datatype = 'property'
model_type = PropertyType
field_list = ['name', 'unit', 'fdc_id', 'open_data_slug']
existing_data_slugs = {}
existing_data_names = {}
for obj in model_type.objects.filter(space=self.request.space).values('pk', *field_list):
existing_data_slugs[obj['open_data_slug']] = obj
existing_data_names[obj['name']] = obj
update_list = []
create_list = []
insert_list = []
for k in list(self.data[datatype].keys()):
insert_list.append(PropertyType(
obj = model_type(
name=self.data[datatype][k]['name'],
unit=self.data[datatype][k]['unit'],
fdc_id=self.data[datatype][k]['fdc_id'],
open_data_slug=k,
space=self.request.space
))
)
return PropertyType.objects.bulk_create(insert_list, update_conflicts=True, update_fields=('open_data_slug',), unique_fields=('space', 'name',))
if obj.open_data_slug in existing_data_slugs or obj.name in existing_data_names:
if not self._merge_if_conflicting(model_type, obj, existing_data_slugs, existing_data_names):
od_response.total_errored += 1
continue # if conflicting objects exist and cannot be merged skip object
existing_obj = self._get_existing_obj(obj, existing_data_slugs, existing_data_names)
if not self._is_obj_identical(field_list, obj, existing_obj):
obj.pk = existing_obj['pk']
update_list.append(obj)
else:
od_response.total_untouched += 1
else:
create_list.append(obj)
if self.update_existing and len(update_list) > 0:
model_type.objects.bulk_update(update_list, field_list)
od_response.total_updated += len(update_list)
if len(create_list) > 0:
model_type.objects.bulk_create(create_list, update_conflicts=True, update_fields=field_list, unique_fields=('space', 'name',))
od_response.total_created += len(create_list)
return od_response
def import_supermarket(self):
od_response = OpenDataImportResponse()
datatype = 'store'
model_type = Supermarket
field_list = ['name', 'open_data_slug']
existing_data_slugs = {}
existing_data_names = {}
for obj in model_type.objects.filter(space=self.request.space).values('pk', *field_list):
existing_data_slugs[obj['open_data_slug']] = obj
existing_data_names[obj['name']] = obj
update_list = []
create_list = []
self._update_slug_cache(SupermarketCategory, 'category')
insert_list = []
for k in list(self.data[datatype].keys()):
insert_list.append(Supermarket(
obj = model_type(
name=self.data[datatype][k]['name'],
open_data_slug=k,
space=self.request.space
))
)
if obj.open_data_slug in existing_data_slugs or obj.name in existing_data_names:
if not self._merge_if_conflicting(model_type, obj, existing_data_slugs, existing_data_names):
od_response.total_errored += 1
continue # if conflicting objects exist and cannot be merged skip object
existing_obj = self._get_existing_obj(obj, existing_data_slugs, existing_data_names)
if not self._is_obj_identical(field_list, obj, existing_obj):
obj.pk = existing_obj['pk']
update_list.append(obj)
else:
od_response.total_untouched += 1
else:
create_list.append(obj)
if self.update_existing and len(update_list) > 0:
model_type.objects.bulk_update(update_list, field_list)
od_response.total_updated += len(update_list)
if len(create_list) > 0:
model_type.objects.bulk_create(create_list, update_conflicts=True, update_fields=field_list, unique_fields=('space', 'name',))
od_response.total_created += len(create_list)
# always add open data slug if matching supermarket is found, otherwise relation might fail
supermarkets = Supermarket.objects.bulk_create(insert_list, unique_fields=('space', 'name',), update_conflicts=True, update_fields=('open_data_slug',))
self._update_slug_cache(Supermarket, 'store')
insert_list = []
for k in list(self.data[datatype].keys()):
relations = []
order = 0
@@ -96,115 +311,186 @@ class OpenDataImporter:
SupermarketCategoryRelation.objects.bulk_create(relations, ignore_conflicts=True, unique_fields=('supermarket', 'category',))
return supermarkets
return od_response
def import_food(self):
identifier_list = []
od_response = OpenDataImportResponse()
datatype = 'food'
for k in list(self.data[datatype].keys()):
identifier_list.append(self.data[datatype][k]['name'])
identifier_list.append(self.data[datatype][k]['plural_name'])
model_type = Food
field_list = ['name', 'open_data_slug']
existing_objects_flat = []
existing_objects = {}
for f in Food.objects.filter(space=self.request.space).filter(name__in=identifier_list).values_list('id', 'name', 'plural_name'):
existing_objects_flat.append(f[1])
existing_objects_flat.append(f[2])
existing_objects[f[1]] = f
existing_objects[f[2]] = f
existing_data_slugs = {}
existing_data_names = {}
for obj in model_type.objects.filter(space=self.request.space).values('pk', *field_list):
existing_data_slugs[obj['open_data_slug']] = obj
existing_data_names[obj['name']] = obj
update_list = []
create_list = []
self._update_slug_cache(Unit, 'unit')
self._update_slug_cache(PropertyType, 'property')
self._update_slug_cache(SupermarketCategory, 'category')
unit_g = Unit.objects.filter(space=self.request.space, base_unit__iexact='g').first()
insert_list = []
insert_list_flat = []
update_list = []
update_field_list = []
for k in list(self.data[datatype].keys()):
if not (self.data[datatype][k]['name'] in existing_objects_flat or self.data[datatype][k]['plural_name'] in existing_objects_flat):
if not (self.data[datatype][k]['name'] in insert_list_flat or self.data[datatype][k]['plural_name'] in insert_list_flat):
insert_list.append({'data': {
'name': self.data[datatype][k]['name'],
'plural_name': self.data[datatype][k]['plural_name'] if self.data[datatype][k]['plural_name'] != '' else None,
'supermarket_category_id': self.slug_id_cache['category'][self.data[datatype][k]['store_category']],
'fdc_id': self.data[datatype][k]['fdc_id'] if self.data[datatype][k]['fdc_id'] != '' else None,
'open_data_slug': k,
'space': self.request.space.id,
}})
# build a fake second flat array to prevent duplicate foods from being inserted.
# trying to insert a duplicate would throw a db error :(
insert_list_flat.append(self.data[datatype][k]['name'])
insert_list_flat.append(self.data[datatype][k]['plural_name'])
obj_dict = {
'name': self.data[datatype][k]['name'],
'plural_name': self.data[datatype][k]['plural_name'] if self.data[datatype][k]['plural_name'] != '' else None,
'supermarket_category_id': self.slug_id_cache['category'][self.data[datatype][k]['store_category']],
'fdc_id': re.sub(r'\D', '', self.data[datatype][k]['fdc_id']) if self.data[datatype][k]['fdc_id'] != '' else None,
'open_data_slug': k,
'properties_food_unit_id': None,
'space_id': self.request.space.id,
}
if unit_g:
obj_dict['properties_food_unit_id'] = unit_g.id
obj = model_type(**obj_dict)
if obj.open_data_slug in existing_data_slugs or obj.name in existing_data_names:
if not self._merge_if_conflicting(model_type, obj, existing_data_slugs, existing_data_names):
od_response.total_errored += 1
continue # if conflicting objects exist and cannot be merged skip object
existing_obj = self._get_existing_obj(obj, existing_data_slugs, existing_data_names)
if not self._is_obj_identical(field_list, obj, existing_obj):
obj.pk = existing_obj['pk']
update_list.append(obj)
else:
od_response.total_untouched += 1
else:
if self.data[datatype][k]['name'] in existing_objects:
existing_food_id = existing_objects[self.data[datatype][k]['name']][0]
else:
existing_food_id = existing_objects[self.data[datatype][k]['plural_name']][0]
create_list.append({'data': obj_dict})
if self.update_existing:
update_field_list = ['name', 'plural_name', 'preferred_unit_id', 'preferred_shopping_unit_id', 'supermarket_category_id', 'fdc_id', 'open_data_slug', ]
update_list.append(Food(
id=existing_food_id,
name=self.data[datatype][k]['name'],
plural_name=self.data[datatype][k]['plural_name'] if self.data[datatype][k]['plural_name'] != '' else None,
supermarket_category_id=self.slug_id_cache['category'][self.data[datatype][k]['store_category']],
fdc_id=self.data[datatype][k]['fdc_id'] if self.data[datatype][k]['fdc_id'] != '' else None,
open_data_slug=k,
))
else:
update_field_list = ['open_data_slug', ]
update_list.append(Food(id=existing_food_id, open_data_slug=k, ))
if self.update_existing and len(update_list) > 0:
model_type.objects.bulk_update(update_list, field_list)
od_response.total_updated += len(update_list)
Food.load_bulk(insert_list, None)
if len(update_list) > 0:
Food.objects.bulk_update(update_list, update_field_list)
if len(create_list) > 0:
Food.load_bulk(create_list, None)
od_response.total_created += len(create_list)
# --------------- PROPERTY STUFF -----------------------
model_type = Property
field_list = ['property_type_id', 'property_amount', 'open_data_food_slug']
existing_data_slugs = {}
existing_data_property_types = {}
for obj in model_type.objects.filter(space=self.request.space).values('pk', *field_list):
existing_data_slugs[obj['open_data_food_slug']] = obj
existing_data_property_types[obj['property_type_id']] = obj
update_list = []
create_list = []
self._update_slug_cache(Food, 'food')
food_property_list = []
# alias_list = []
for k in list(self.data['food'].keys()):
for fp in self.data['food'][k]['properties']['type_values']:
obj = model_type(
property_type_id=self.slug_id_cache['property'][fp['property_type']],
property_amount=fp['property_value'],
open_data_food_slug=k,
space=self.request.space,
)
for k in list(self.data[datatype].keys()):
for fp in self.data[datatype][k]['properties']['type_values']:
# try catch here because somettimes key "k" is not set for he food cache
try:
food_property_list.append(Property(
property_type_id=self.slug_id_cache['property'][fp['property_type']],
property_amount=fp['property_value'],
import_food_id=self.slug_id_cache['food'][k],
space=self.request.space,
))
except KeyError:
print(str(k) + ' is not in self.slug_id_cache["food"]')
if obj.open_data_food_slug in existing_data_slugs and obj.property_type_id in existing_data_property_types and existing_data_slugs[obj.open_data_food_slug] == existing_data_property_types[obj.property_type_id]:
existing_obj = existing_data_slugs[obj.open_data_food_slug]
Property.objects.bulk_create(food_property_list, ignore_conflicts=True, unique_fields=('space', 'import_food_id', 'property_type',))
if not self._is_obj_identical(field_list, obj, existing_obj):
obj.pk = existing_obj['pk']
update_list.append(obj)
else:
create_list.append(obj)
if self.update_existing and len(update_list) > 0:
model_type.objects.bulk_update(update_list, field_list)
if len(create_list) > 0:
model_type.objects.bulk_create(create_list, ignore_conflicts=True, unique_fields=('space', 'open_data_food_slug', 'property_type',))
linked_properties = list(FoodProperty.objects.filter(food__space=self.request.space).values_list('property_id', flat=True).all())
property_food_relation_list = []
for p in Property.objects.filter(space=self.request.space, import_food_id__isnull=False).values_list('import_food_id', 'id', ):
property_food_relation_list.append(Food.properties.through(food_id=p[0], property_id=p[1]))
for p in model_type.objects.filter(space=self.request.space, open_data_food_slug__isnull=False).values_list('open_data_food_slug', 'id', ):
if p[1] == 147:
pass
# slug_id_cache should always exist, don't create relations for already linked properties (ignore_conflicts would do that as well but this is more performant)
if p[0] in self.slug_id_cache['food'] and p[1] not in linked_properties:
property_food_relation_list.append(Food.properties.through(food_id=self.slug_id_cache['food'][p[0]], property_id=p[1]))
FoodProperty.objects.bulk_create(property_food_relation_list, ignore_conflicts=True, unique_fields=('food_id', 'property_id',))
FoodProperty.objects.bulk_create(property_food_relation_list, unique_fields=('food_id', 'property_id',))
return insert_list + update_list
return od_response
def import_conversion(self):
od_response = OpenDataImportResponse()
datatype = 'conversion'
model_type = UnitConversion
field_list = ['base_amount', 'base_unit_id', 'converted_amount', 'converted_unit_id', 'food_id', 'open_data_slug']
self._update_slug_cache(Food, 'food')
self._update_slug_cache(Unit, 'unit')
existing_data_slugs = {}
existing_data_foods = defaultdict(list)
for obj in model_type.objects.filter(space=self.request.space).values('pk', *field_list):
existing_data_slugs[obj['open_data_slug']] = obj
existing_data_foods[obj['food_id']].append(obj)
update_list = []
create_list = []
insert_list = []
for k in list(self.data[datatype].keys()):
# try catch here because sometimes key "k" is not set for he food cache
# try catch here because sometimes key "k" is not set for the food cache
try:
insert_list.append(UnitConversion(
base_amount=self.data[datatype][k]['base_amount'],
obj = model_type(
base_amount=Decimal(self.data[datatype][k]['base_amount']),
base_unit_id=self.slug_id_cache['unit'][self.data[datatype][k]['base_unit']],
converted_amount=self.data[datatype][k]['converted_amount'],
converted_amount=Decimal(self.data[datatype][k]['converted_amount']),
converted_unit_id=self.slug_id_cache['unit'][self.data[datatype][k]['converted_unit']],
food_id=self.slug_id_cache['food'][self.data[datatype][k]['food']],
open_data_slug=k,
space=self.request.space,
created_by=self.request.user,
))
except KeyError:
print(str(k) + ' is not in self.slug_id_cache["food"]')
created_by_id=self.request.user.id,
)
return UnitConversion.objects.bulk_create(insert_list, ignore_conflicts=True, unique_fields=('space', 'base_unit', 'converted_unit', 'food', 'open_data_slug'))
if obj.open_data_slug in existing_data_slugs:
existing_obj = existing_data_slugs[obj.open_data_slug]
if not self._is_obj_identical(field_list, obj, existing_obj):
obj.pk = existing_obj['pk']
update_list.append(obj)
else:
od_response.total_untouched += 1
else:
matching_existing_found = False
if obj.food_id in existing_data_foods:
for edf in existing_data_foods[obj.food_id]:
if obj.base_unit_id == edf['base_unit_id'] and obj.converted_unit_id == edf['converted_unit_id']:
matching_existing_found = True
if not self._is_obj_identical(field_list, obj, edf):
obj.pk = edf['pk']
update_list.append(obj)
else:
od_response.total_untouched += 1
if not matching_existing_found:
create_list.append(obj)
except KeyError as e:
traceback.print_exc()
od_response.total_errored += 1
print(self.data[datatype][k]['food'] + ' is not in self.slug_id_cache["food"]')
if self.update_existing and len(update_list) > 0:
od_response.total_updated = model_type.objects.bulk_update(update_list, field_list)
od_response.total_errored += len(update_list) - od_response.total_updated
if len(create_list) > 0:
objs_created = model_type.objects.bulk_create(create_list, ignore_conflicts=True, unique_fields=('space', 'base_unit', 'converted_unit', 'food', 'open_data_slug'))
od_response.total_created = len(objs_created)
od_response.total_errored += len(create_list) - od_response.total_created
return od_response

View File

@@ -75,7 +75,7 @@ def is_object_owner(user, obj):
if not user.is_authenticated:
return False
try:
return obj.get_owner() == user
return obj.get_owner() == 'orphan' or obj.get_owner() == user
except Exception:
return False

View File

@@ -45,12 +45,12 @@ class FoodPropertyHelper:
conversions = uch.get_conversions(i)
for pt in property_types:
found_property = False
if i.food.properties_food_amount == 0 or i.food.properties_food_unit is None:
computed_properties[pt.id]['food_values'][i.food.id] = {'id': i.food.id, 'food': i.food.name, 'value': 0}
computed_properties[pt.id]['missing_value'] = i.food.properties_food_unit is None
if i.food.properties_food_amount == 0 or i.food.properties_food_unit is None: # if food is configured incorrectly
computed_properties[pt.id]['food_values'][i.food.id] = {'id': i.food.id, 'food': i.food.name, 'value': None}
computed_properties[pt.id]['missing_value'] = True
else:
for p in i.food.properties.all():
if p.property_type == pt:
if p.property_type == pt and p.property_amount is not None:
for c in conversions:
if c.unit == i.food.properties_food_unit:
found_property = True
@@ -58,16 +58,20 @@ class FoodPropertyHelper:
computed_properties[pt.id]['food_values'] = self.add_or_create(
computed_properties[p.property_type.id]['food_values'], c.food.id, (c.amount / i.food.properties_food_amount) * p.property_amount, c.food)
if not found_property:
computed_properties[pt.id]['missing_value'] = True
computed_properties[pt.id]['food_values'][i.food.id] = {'id': i.food.id, 'food': i.food.name, 'value': 0}
if i.amount == 0: # don't count ingredients without an amount as missing
computed_properties[pt.id]['missing_value'] = computed_properties[pt.id]['missing_value'] or False # don't override if another food was already missing
computed_properties[pt.id]['food_values'][i.food.id] = {'id': i.food.id, 'food': i.food.name, 'value': 0}
else:
computed_properties[pt.id]['missing_value'] = True
computed_properties[pt.id]['food_values'][i.food.id] = {'id': i.food.id, 'food': i.food.name, 'value': None}
return computed_properties
# small dict helper to add to existing key or create new, probably a better way of doing this
# TODO move to central helper ?
# TODO move to central helper ? --> use defaultdict
@staticmethod
def add_or_create(d, key, value, food):
if key in d:
if key in d and d[key]['value']:
d[key]['value'] += value
else:
d[key] = {'id': food.id, 'food': food.name, 'value': value}

View File

@@ -309,7 +309,7 @@ class RecipeSearch():
def _favorite_recipes(self, times_cooked=None):
if self._sort_includes('favorite') or times_cooked:
less_than = '-' in (times_cooked or []) and not self._sort_includes('-favorite')
less_than = '-' in (str(times_cooked) or []) and not self._sort_includes('-favorite')
if less_than:
default = 1000
else:

View File

@@ -231,7 +231,7 @@ def get_recipe_properties(space, property_data):
'id': pt.id,
'name': pt.name,
},
'property_amount': parse_servings(property_data[properties[p]]) / float(property_data['servingSize']),
'property_amount': parse_servings(property_data[properties[p]]) / parse_servings(property_data['servingSize']),
})
return recipe_properties
@@ -415,8 +415,8 @@ def parse_keywords(keyword_json, request):
# if alias exists use that instead
if len(kw) != 0:
automation_engine.apply_keyword_automation(kw)
if k := Keyword.objects.filter(name=kw, space=request.space).first():
kw = automation_engine.apply_keyword_automation(kw)
if k := Keyword.objects.filter(name__iexact=kw, space=request.space).first():
keywords.append({'label': str(k), 'name': k.name, 'id': k.id})
else:
keywords.append({'label': kw, 'name': kw})

View File

@@ -1,9 +1,8 @@
from datetime import timedelta
from decimal import Decimal
from django.db.models import F, OuterRef, Q, Subquery, Value
from django.db.models.functions import Coalesce
from django.utils import timezone
from django.utils.translation import gettext as _
from cookbook.models import (Ingredient, MealPlan, Recipe, ShoppingListEntry, ShoppingListRecipe,
@@ -27,9 +26,6 @@ def shopping_helper(qs, request):
elif checked in ['true', 1, '1']:
qs = qs.filter(checked=True)
elif checked in ['recent']:
today_start = timezone.now().replace(hour=0, minute=0, second=0)
week_ago = today_start - timedelta(days=user.userpreference.shopping_recent_days)
qs = qs.filter(Q(checked=False) | Q(completed_at__gte=week_ago))
supermarket_order = ['checked'] + supermarket_order
return qs.distinct().order_by(*supermarket_order).select_related('unit', 'food', 'ingredient', 'created_by', 'list_recipe', 'list_recipe__mealplan', 'list_recipe__recipe')
@@ -79,10 +75,8 @@ class RecipeShoppingEditor():
@staticmethod
def get_shopping_list_recipe(id, user, space):
return ShoppingListRecipe.objects.filter(id=id).filter(Q(shoppinglist__space=space) | Q(entries__space=space)).filter(
Q(shoppinglist__created_by=user)
| Q(shoppinglist__shared=user)
| Q(entries__created_by=user)
return ShoppingListRecipe.objects.filter(id=id).filter(entries__space=space).filter(
Q(entries__created_by=user)
| Q(entries__created_by__in=list(user.get_shopping_share()))
).prefetch_related('entries').first()

View File

@@ -14,12 +14,14 @@ class IngredientObject(object):
unit = ""
food = ""
note = ""
numeric_amount = 0
def __init__(self, ingredient):
if ingredient.no_amount:
self.amount = ""
else:
self.amount = f"<scalable-number v-bind:number='{bleach.clean(str(ingredient.amount))}' v-bind:factor='ingredient_factor'></scalable-number>"
self.numeric_amount = float(ingredient.amount)
if ingredient.unit:
if ingredient.unit.plural_name in (None, ""):
self.unit = bleach.clean(str(ingredient.unit))
@@ -83,9 +85,12 @@ def render_instructions(step): # TODO deduplicate markdown cleanup code
for i in step.ingredients.all():
ingredients.append(IngredientObject(i))
def scale(number):
return f"<scalable-number v-bind:number='{bleach.clean(str(number))}' v-bind:factor='ingredient_factor'></scalable-number>"
try:
template = Template(instructions)
instructions = template.render(ingredients=ingredients)
instructions = template.render(ingredients=ingredients, scale=scale)
except TemplateSyntaxError:
return _('Could not parse template code.') + ' Error: Template Syntax broken'
except UndefinedError:

View File

@@ -22,7 +22,7 @@ class MealMaster(Integration):
if 'Yield:' in line:
servings_text = line.replace('Yield:', '').strip()
else:
if re.match('\s{2,}([0-9])+', line):
if re.match(r'\s{2,}([0-9])+', line):
ingredients.append(line.strip())
else:
directions.append(line.strip())

View File

@@ -1,6 +1,6 @@
import base64
from io import BytesIO
from xml import etree
from lxml import etree
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.helper.recipe_url_import import parse_servings, parse_servings_text
@@ -53,7 +53,10 @@ class Rezeptsuitede(Integration):
u = ingredient_parser.get_unit(ingredient.attrib['unit'])
amount = 0
if ingredient.attrib['qty'].strip() != '':
amount, unit, note = ingredient_parser.parse_amount(ingredient.attrib['qty'])
try:
amount, unit, note = ingredient_parser.parse_amount(ingredient.attrib['qty'])
except ValueError: # sometimes quantities contain words which cant be parsed
pass
ingredient_step.ingredients.add(Ingredient.objects.create(food=f, unit=u, amount=amount, space=self.request.space, ))
try:

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

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

File diff suppressed because it is too large Load Diff

Binary file not shown.

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

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

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

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

Some files were not shown because too many files have changed in this diff Show More