Compare commits

..

1091 Commits

Author SHA1 Message Date
vabene1111
1be2e9fbb2 Merge branch 'develop' 2025-01-21 16:34:26 +01:00
vabene1111
7c93eededf fixed RecipeImageSerializer 2025-01-20 09:43:43 +01:00
Yigit
1b17031523 Translated using Weblate (Turkish)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/tr/
2025-01-20 05:20:47 +00:00
Yigit
2d76c3e84c Translated using Weblate (Turkish)
Currently translated at 13.7% (67 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/tr/
2025-01-20 05:20:47 +00:00
vabene1111
03dd4370b9 update nextcloud import docs 2025-01-19 18:44:09 +01:00
smilerz
157af15a2a added (',', ';', ':') to notes tokenization in ingredient_parser.py 2025-01-18 09:29:09 -06:00
vabene1111
b930ecdcd0 Merge branch 'develop' 2025-01-18 12:49:49 +01:00
vabene1111
100242f0a6 Merge pull request #3498 from TandoorRecipes/dependabot/pip/pytubefix-8.12.0
Bump pytubefix from 8.9.0 to 8.12.0
2025-01-18 12:48:23 +01:00
vabene1111
d695f71d36 Merge pull request #3497 from mitcdh/develop
Prevent paprika.py from importing empty image_url content
2025-01-18 12:47:53 +01:00
dependabot[bot]
5d60b7a67c Bump pytubefix from 8.9.0 to 8.12.0
Bumps [pytubefix](https://github.com/juanbindez/pytubefix) from 8.9.0 to 8.12.0.
- [Release notes](https://github.com/juanbindez/pytubefix/releases)
- [Commits](https://github.com/juanbindez/pytubefix/compare/v8.9.0...v8.12.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-18 11:47:22 +00:00
vabene1111
5d5d89dab9 Merge pull request #3477 from TandoorRecipes/dependabot/pip/pytubefix-8.9.0
Bump pytubefix from 8.5.1 to 8.9.0
2025-01-18 12:46:53 +01:00
vabene1111
35a625e04b Merge pull request #3476 from TandoorRecipes/dependabot/pip/django-tables2-2.7.4
Bump django-tables2 from 2.7.0 to 2.7.4
2025-01-18 12:46:45 +01:00
vabene1111
1a2d3bb441 Merge pull request #3474 from TandoorRecipes/dependabot/pip/whitenoise-6.8.2
Bump whitenoise from 6.7.0 to 6.8.2
2025-01-18 12:46:35 +01:00
vabene1111
2e3ac02afb Merge pull request #3473 from TandoorRecipes/dependabot/pip/redis-5.2.1
Bump redis from 5.2.0 to 5.2.1
2025-01-18 12:46:29 +01:00
vabene1111
a5b8a65b7d actually fixed test 2025-01-18 11:33:51 +01:00
vabene1111
dc320f2e6d Merge branch 'develop' 2025-01-18 09:30:51 +01:00
vabene1111
acbca83553 fixed test to reflect new permission 2025-01-18 09:30:43 +01:00
vabene1111
cb26c5dfc8 allow gif 2025-01-18 09:23:56 +01:00
vabene1111
b5c4174700 default mediafiles content disposition header attatchement 2025-01-18 09:22:46 +01:00
vabene1111
3e37d11c6a restrict file upload to certain types 2025-01-18 09:22:29 +01:00
vabene1111
36e83a9d01 restrict local external recipes to superusers and restrict file path/type 2025-01-18 08:57:46 +01:00
vabene1111
efcd759869 Merge pull request #3496 from TandoorRecipes/dependabot/pip/django-4.2.18
Bump django from 4.2.17 to 4.2.18
2025-01-18 08:11:35 +01:00
Mitchell Hewes
9f8830b341 Prevent paprika.py from importing empty image_url content 2025-01-17 15:04:28 +01:00
dependabot[bot]
7c81396ec5 Bump django from 4.2.17 to 4.2.18
Bumps [django](https://github.com/django/django) from 4.2.17 to 4.2.18.
- [Commits](https://github.com/django/django/compare/4.2.17...4.2.18)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-17 13:58:22 +00:00
smilerz
9b50665375 bump recipe-scrapers
fixes #3495
2025-01-17 07:57:30 -06:00
Anton Shevtsov
83795581e6 Translated using Weblate (Ukrainian)
Currently translated at 44.3% (253 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/uk/
2025-01-16 18:58:38 +00:00
Anton Shevtsov
af51524109 Translated using Weblate (Ukrainian)
Currently translated at 2.8% (14 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/uk/
2025-01-16 18:58:38 +00:00
vabene1111
738aa12243 Merge branch 'develop' 2025-01-05 11:38:52 +01:00
vabene1111
f25de4b4ce remove healthcheck 2025-01-05 11:38:35 +01:00
vabene1111
698aa5a753 Merge branch 'develop' 2025-01-01 09:24:51 +01:00
vabene1111
6444680e06 Merge pull request #3475 from TandoorRecipes/dependabot/pip/cryptography-44.0.0
Bump cryptography from 43.0.1 to 44.0.0
2025-01-01 08:16:19 +01:00
dependabot[bot]
38e1db9c53 Bump pytubefix from 8.5.1 to 8.9.0
Bumps [pytubefix](https://github.com/juanbindez/pytubefix) from 8.5.1 to 8.9.0.
- [Release notes](https://github.com/juanbindez/pytubefix/releases)
- [Commits](https://github.com/juanbindez/pytubefix/compare/v8.5.1...v8.9.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-01 00:33:54 +00:00
dependabot[bot]
d71c929ba8 Bump django-tables2 from 2.7.0 to 2.7.4
Bumps [django-tables2](https://github.com/jieter/django-tables2) from 2.7.0 to 2.7.4.
- [Changelog](https://github.com/jieter/django-tables2/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jieter/django-tables2/compare/v2.7.0...v2.7.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-01 00:33:51 +00:00
dependabot[bot]
c604369e86 Bump cryptography from 43.0.1 to 44.0.0
Bumps [cryptography](https://github.com/pyca/cryptography) from 43.0.1 to 44.0.0.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/43.0.1...44.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-01 00:33:49 +00:00
dependabot[bot]
4865b742c7 Bump whitenoise from 6.7.0 to 6.8.2
Bumps [whitenoise](https://github.com/evansd/whitenoise) from 6.7.0 to 6.8.2.
- [Changelog](https://github.com/evansd/whitenoise/blob/main/docs/changelog.rst)
- [Commits](https://github.com/evansd/whitenoise/compare/6.7.0...6.8.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-01 00:33:45 +00:00
dependabot[bot]
1246549f4b Bump redis from 5.2.0 to 5.2.1
Bumps [redis](https://github.com/redis/redis-py) from 5.2.0 to 5.2.1.
- [Release notes](https://github.com/redis/redis-py/releases)
- [Changelog](https://github.com/redis/redis-py/blob/master/CHANGES)
- [Commits](https://github.com/redis/redis-py/compare/v5.2.0...v5.2.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-01 00:33:42 +00:00
vabene1111
79abb8bf8f Merge branch 'develop' 2024-12-29 13:46:24 +01:00
vabene1111
fd4236672e update gitignore like vue3 branch 2024-12-29 13:46:17 +01:00
vabene1111
00148a2993 made shopping list compatible with SLR entries without a recipe 2024-12-29 13:44:43 +01:00
vabene1111
359fcb24cf fixed social signup form 2024-12-29 13:42:12 +01:00
vabene1111
f5d7919f72 Merge pull request #3448 from igorsantos07/patch-1
Update system.html: Django Recipes > Tandoor
2024-12-28 08:26:53 +01:00
vabene1111
86c4278553 Merge pull request #3454 from TandoorRecipes/dependabot/pip/jinja2-3.1.5
Bump jinja2 from 3.1.4 to 3.1.5
2024-12-28 08:26:44 +01:00
dependabot[bot]
2a5c0bb740 Bump jinja2 from 3.1.4 to 3.1.5
Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.4 to 3.1.5.
- [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.4...3.1.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-28 07:25:33 +00:00
Igor Santos
432dfa9e86 Update system.html: Django Recipes > Tandoor 2024-12-24 02:28:21 -03:00
vabene1111
f61a8371f4 Revert "added user filkes to recipe and added is_image flag to user file"
This reverts commit 0bcdf5e0a3.
2024-12-22 12:12:37 +01:00
vabene1111
0bcdf5e0a3 added user filkes to recipe and added is_image flag to user file 2024-12-22 12:05:47 +01:00
vabene1111
169f799a23 Merge pull request #3428 from hawthorc/develop
Add note about Python 3.12 dependency to manual.md
2024-12-11 15:19:59 +01:00
vabene1111
942d1130a1 Merge pull request #3416 from zodac/develop
Adding healthcheck to docker image
2024-12-11 15:17:28 +01:00
vabene1111
64cc20aed2 Merge pull request #3426 from TandoorRecipes/dependabot/pip/icalendar-6.1.0
Bump icalendar from 5.0.11 to 6.1.0
2024-12-11 15:12:09 +01:00
vabene1111
3a6731ec8d Merge pull request #3425 from TandoorRecipes/dependabot/pip/pytest-factoryboy-2.7.0
Bump pytest-factoryboy from 2.6.0 to 2.7.0
2024-12-11 15:11:32 +01:00
vabene1111
e6f11a17b9 Merge pull request #3423 from TandoorRecipes/dependabot/pip/pytest-django-4.9.0
Bump pytest-django from 4.8.0 to 4.9.0
2024-12-11 15:11:17 +01:00
vabene1111
cc1cd610e7 Merge pull request #3424 from TandoorRecipes/dependabot/pip/crispy-bootstrap4-2024.10
Bump crispy-bootstrap4 from 2024.1 to 2024.10
2024-12-11 15:10:19 +01:00
vabene1111
6a3b5ee844 Merge pull request #3431 from TandoorRecipes/dependabot/pip/django-4.2.17
Bump django from 4.2.16 to 4.2.17
2024-12-11 15:09:46 +01:00
Matjaž T
49b119571e Translated using Weblate (Slovenian)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sl/
2024-12-10 07:58:36 +00:00
Vincenzo Reale
e024e3deb0 Translated using Weblate (Italian)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/it/
2024-12-09 00:58:36 +00:00
dependabot[bot]
7ccedb559d Bump django from 4.2.16 to 4.2.17
Bumps [django](https://github.com/django/django) from 4.2.16 to 4.2.17.
- [Commits](https://github.com/django/django/compare/4.2.16...4.2.17)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-06 18:57:23 +00:00
zodac
103daf000d Using --spider for healthcheck, which performs a HEAD request instead of a GET request 2024-12-02 20:44:12 +13:00
Vincenzo Reale
70df456307 Translated using Weblate (Italian)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/it/
2024-12-02 04:53:51 +00:00
Carter Hawthorne
375174ee41 Add note about Python 3.12 dependency to manual.md 2024-12-01 18:38:38 -08:00
dependabot[bot]
f19beba014 Bump icalendar from 5.0.11 to 6.1.0
Bumps [icalendar](https://github.com/collective/icalendar) from 5.0.11 to 6.1.0.
- [Release notes](https://github.com/collective/icalendar/releases)
- [Changelog](https://github.com/collective/icalendar/blob/main/CHANGES.rst)
- [Commits](https://github.com/collective/icalendar/compare/v5.0.11...v6.1.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-01 00:39:31 +00:00
dependabot[bot]
865756e4b2 Bump pytest-factoryboy from 2.6.0 to 2.7.0
Bumps [pytest-factoryboy](https://github.com/pytest-dev/pytest-factoryboy) from 2.6.0 to 2.7.0.
- [Changelog](https://github.com/pytest-dev/pytest-factoryboy/blob/master/CHANGES.rst)
- [Commits](https://github.com/pytest-dev/pytest-factoryboy/compare/2.6.0...2.7.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>
2024-12-01 00:39:28 +00:00
dependabot[bot]
41f834db08 Bump crispy-bootstrap4 from 2024.1 to 2024.10
Bumps [crispy-bootstrap4](https://github.com/django-crispy-forms/crispy-bootstrap4) from 2024.1 to 2024.10.
- [Release notes](https://github.com/django-crispy-forms/crispy-bootstrap4/releases)
- [Changelog](https://github.com/django-crispy-forms/crispy-bootstrap4/blob/main/CHANGELOG.md)
- [Commits](https://github.com/django-crispy-forms/crispy-bootstrap4/compare/2024.1...2024.10)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-01 00:39:26 +00:00
dependabot[bot]
2c94753a5a Bump pytest-django from 4.8.0 to 4.9.0
Bumps [pytest-django](https://github.com/pytest-dev/pytest-django) from 4.8.0 to 4.9.0.
- [Release notes](https://github.com/pytest-dev/pytest-django/releases)
- [Changelog](https://github.com/pytest-dev/pytest-django/blob/main/docs/changelog.rst)
- [Commits](https://github.com/pytest-dev/pytest-django/compare/v4.8.0...v4.9.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-12-01 00:39:23 +00:00
zodac
0e05c77fa7 Adding healthcheck to docker image 2024-11-29 14:15:24 +13:00
vabene1111
793c152b26 Merge pull request #3412 from lavanyamehn/duplicate_urls
Display a warning message when duplicate recipe is imported
2024-11-27 15:50:54 +01:00
Lavanya Mehndiratta
9df75f551c Changed functionality to only display a warning message 2024-11-26 18:09:55 -05:00
vabene1111
da49280ef2 Merge branch 'develop' 2024-11-26 17:29:57 +01:00
vabene1111
e6087d5129 use Sandbox Environment to render templates 2024-11-26 17:18:47 +01:00
vabene1111
4f9bff20c8 Merge pull request #3411 from bishtawi/bishtawi/secret-files
Support reading more secrets from files
2024-11-25 16:46:56 +01:00
Anders Obro
683f1ac10a Translated using Weblate (Danish)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/da/
2024-11-25 12:45:13 +00:00
Bishtawi
e844d2995a Support reading secrets from files 2024-11-24 12:31:17 -08:00
vabene1111
c0af3d19cd Merge branch 'develop' 2024-11-23 21:59:46 +01:00
vabene1111
78d20e8340 removed log 2024-11-23 21:59:40 +01:00
vabene1111
6a90caee04 removed log 2024-11-23 21:58:57 +01:00
vabene1111
98c95a94bc fixed youtube importer 2024-11-23 21:56:32 +01:00
vabene1111
d4dc4a30b8 fixed system page 2024-11-23 13:26:12 +01:00
Oleh Hudyma
70d2dc089c Translated using Weblate (Ukrainian)
Currently translated at 2.2% (11 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/uk/
2024-11-22 07:58:36 +00:00
Matjaž T
8698ad3054 Translated using Weblate (Slovenian)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sl/
2024-11-22 07:58:36 +00:00
Daniel Legin
6188f175ae Translated using Weblate (Croatian)
Currently translated at 30.9% (151 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/hr/
2024-11-19 06:58:39 +00:00
Daniel Legin
189fab2401 Translated using Weblate (Croatian)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/hr/
2024-11-19 06:58:39 +00:00
Anders Obro
a3adba1941 Translated using Weblate (Danish)
Currently translated at 94.5% (539 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/da/
2024-11-19 06:58:39 +00:00
Mario Dvorsek
cea41af1b8 Translated using Weblate (Slovenian)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sl/
2024-11-19 06:58:39 +00:00
Matjaž T
a325070f7f Translated using Weblate (Slovenian)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sl/
2024-11-19 06:58:39 +00:00
Matjaž T
d782c54c2c Translated using Weblate (Slovenian)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/sl/
2024-11-19 06:58:39 +00:00
vabene1111
58917fbc4d Merge pull request #3403 from TandoorRecipes/dependabot/pip/aiohttp-3.10.11
Bump aiohttp from 3.10.2 to 3.10.11
2024-11-19 07:11:06 +01:00
dependabot[bot]
8b0547aeb9 Bump aiohttp from 3.10.2 to 3.10.11
---
updated-dependencies:
- dependency-name: aiohttp
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-19 06:10:25 +00:00
Daniel Legin
9efc101161 Added translation using Weblate (Croatian) 2024-11-18 19:04:53 +00:00
Daniel Legin
691e8a940b Added translation using Weblate (Croatian) 2024-11-18 11:13:47 +00:00
Matjaž T
bee7623eaf Translated using Weblate (Slovenian)
Currently translated at 71.7% (409 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sl/
2024-11-17 16:58:38 +00:00
Matjaž T
430697879f Translated using Weblate (Slovenian)
Currently translated at 84.0% (410 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/sl/
2024-11-17 16:58:38 +00:00
Vincenzo Reale
749974654a Translated using Weblate (Italian)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/it/
2024-11-17 16:58:36 +00:00
Matjaž T
f31a661aaf Translated using Weblate (Slovenian)
Currently translated at 71.7% (409 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sl/
2024-11-16 14:09:25 +00:00
Matjaž T
70ea3acb05 Translated using Weblate (Slovenian)
Currently translated at 15.3% (75 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/sl/
2024-11-16 14:09:25 +00:00
vabene1111
81547563c6 Merge branch 'develop' 2024-11-14 16:07:51 +01:00
vabene1111
c107f2f497 fixed system view 2024-11-14 16:06:58 +01:00
Владислав
5fea2131cd Translated using Weblate (Russian)
Currently translated at 5.5% (27 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/ru/
2024-11-12 17:58:38 +00:00
Владислав
d671df30a3 Translated using Weblate (Russian)
Currently translated at 82.9% (473 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ru/
2024-11-12 17:58:38 +00:00
vabene1111
100b75a5d2 Merge branch 'develop' 2024-11-12 16:15:31 +01:00
vabene1111
7dba36d210 switched to space stats 2024-11-12 16:15:01 +01:00
vabene1111
0dea5c9877 api stats 2024-11-12 15:53:13 +01:00
vabene1111
1777dfe821 Revert "Merge pull request #3334 from TandoorRecipes/dependabot/pip/pytest-asyncio-0.24.0"
This reverts commit c30e1bb43a, reversing
changes made to 31051086ba.
2024-11-11 18:10:14 +01:00
vabene1111
2b6edfb96d fixed import_export docs format 2024-11-11 18:06:29 +01:00
vabene1111
faa3c99965 Merge pull request #3280 from vitoller/feature/import-gourmet
import of gourmet files
2024-11-11 18:04:55 +01:00
vabene1111
1cc5a0a094 Merge pull request #3382 from TandoorRecipes/dependabot/pip/django-cors-headers-4.6.0
Bump django-cors-headers from 4.3.1 to 4.6.0
2024-11-11 17:58:58 +01:00
vabene1111
cbafbd44a4 Merge pull request #3337 from TandoorRecipes/dependabot/pip/flake8-7.1.1
Bump flake8 from 6.1.0 to 7.1.1
2024-11-11 17:58:52 +01:00
vabene1111
f16a804758 Merge pull request #3335 from TandoorRecipes/dependabot/pip/lxml-5.3.0
Bump lxml from 5.1.0 to 5.3.0
2024-11-11 17:58:36 +01:00
vabene1111
c30e1bb43a Merge pull request #3334 from TandoorRecipes/dependabot/pip/pytest-asyncio-0.24.0
Bump pytest-asyncio from 0.23.5 to 0.24.0
2024-11-11 17:58:29 +01:00
vabene1111
31051086ba Merge pull request #3333 from TandoorRecipes/dependabot/pip/requests-2.32.3
Bump requests from 2.32.0 to 2.32.3
2024-11-11 17:58:22 +01:00
vabene1111
67d3c852dd Merge pull request #3381 from TandoorRecipes/dependabot/npm_and_yarn/vue/elliptic-6.6.0
Bump elliptic from 6.5.7 to 6.6.0 in /vue
2024-11-11 17:57:18 +01:00
Aija Kozlovska
4ea9b10fc4 Translated using Weblate (Latvian)
Currently translated at 2.8% (16 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/lv/
2024-11-05 10:58:36 +00:00
Aija Kozlovska
e609f4e0e0 Translated using Weblate (Latvian)
Currently translated at 67.6% (330 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/lv/
2024-11-05 10:58:36 +00:00
Dragan
b9ee2611a3 Translated using Weblate (Slovenian)
Currently translated at 54.0% (308 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sl/
2024-11-04 10:29:24 +00:00
Johnny Ip
8de3c41958 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hant/
2024-11-04 10:29:24 +00:00
Johnny Ip
2a350a9bbe Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/zh_Hant/
2024-11-04 10:29:23 +00:00
Johnny Ip
89c4c09481 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/zh_Hans/
2024-11-04 10:29:23 +00:00
Aija Kozlovska
a97b023504 Translated using Weblate (Latvian)
Currently translated at 45.9% (224 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/lv/
2024-11-04 10:29:23 +00:00
Aija Kozlovska
4aa7152ab4 Added translation using Weblate (Latvian) 2024-11-04 08:31:40 +00:00
Johnny Ip
80ff8ddb12 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hant/
2024-11-03 16:34:45 +00:00
Johnny Ip
45aeeaa069 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hant/
2024-11-03 16:32:49 +00:00
Vincenzo Reale
0c24db72c6 Translated using Weblate (Italian)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/it/
2024-11-01 06:58:36 +00:00
Vincenzo Reale
95c4d72b74 Translated using Weblate (Italian)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/it/
2024-11-01 06:58:36 +00:00
dependabot[bot]
1330c0e7a3 Bump django-cors-headers from 4.3.1 to 4.6.0
Bumps [django-cors-headers](https://github.com/adamchainz/django-cors-headers) from 4.3.1 to 4.6.0.
- [Changelog](https://github.com/adamchainz/django-cors-headers/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/adamchainz/django-cors-headers/compare/4.3.1...4.6.0)

---
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-11-01 00:03:14 +00:00
Vincenzo Reale
9af22bcf9f Translated using Weblate (Italian)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/it/
2024-10-31 06:00:00 +00:00
Vincenzo Reale
d24214c463 Translated using Weblate (Italian)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/it/
2024-10-31 06:00:00 +00:00
dependabot[bot]
e8101dd433 Bump elliptic from 6.5.7 to 6.6.0 in /vue
Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.7 to 6.6.0.
- [Commits](https://github.com/indutny/elliptic/compare/v6.5.7...v6.6.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-31 02:20:39 +00:00
Vincenzo Reale
94bd343eed Translated using Weblate (Italian)
Currently translated at 96.6% (551 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/it/
2024-10-30 16:02:55 +00:00
Vincenzo Reale
f409633ade Translated using Weblate (Italian)
Currently translated at 93.4% (456 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/it/
2024-10-30 16:02:55 +00:00
Vincenzo Reale
e927418535 Translated using Weblate (Italian)
Currently translated at 82.6% (471 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/it/
2024-10-30 13:30:42 +00:00
Vincenzo Reale
be9f9d68db Translated using Weblate (Italian)
Currently translated at 89.3% (436 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/it/
2024-10-30 13:30:42 +00:00
vabene1111
3a002cce9e Merge pull request #3359 from Chronophylos/mealie-import
Fix null-constrait errors in mealie import
2024-10-14 08:25:11 +02:00
vabene1111
416ddf3d34 Merge pull request #3361 from tlambertz/paprika-fix
Fix Paprika Import Images when not downloading from URL.
2024-10-14 08:22:19 +02:00
vabene1111
8b0a19c6a2 Merge pull request #3357 from TandoorRecipes/dependabot/npm_and_yarn/vue/elliptic-6.5.7
Bump elliptic from 6.5.4 to 6.5.7 in /vue
2024-10-13 12:30:59 +02:00
Thomas Lambertz
757fa1b768 Fix Paprika Import Images when not downloading from URL.
Previously, the code only tried to use the cropped image from paprika when downloading actively failed.
But if a user takes an image himself, the url will be empty, thus downloading won't be attempted and won't fail.
This change makes it so that the download is tried first, but the photo_data is always tried if no image exists for whatever reason.
2024-10-12 21:15:37 +02:00
Chronophylos
736d829bd0 Fix null-constrait errors in mealie import 2024-10-12 16:01:32 +02:00
dependabot[bot]
6829d5351d Bump elliptic from 6.5.4 to 6.5.7 in /vue
Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.4 to 6.5.7.
- [Commits](https://github.com/indutny/elliptic/compare/v6.5.4...v6.5.7)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-12 03:18:39 +00:00
vabene1111
805eb87754 Merge pull request #3353 from TandoorRecipes/dependabot/pip/django-4.2.16
Bump django from 4.2.15 to 4.2.16
2024-10-10 13:07:43 +02:00
dependabot[bot]
e910ec4a51 Bump django from 4.2.15 to 4.2.16
Bumps [django](https://github.com/django/django) from 4.2.15 to 4.2.16.
- [Commits](https://github.com/django/django/compare/4.2.15...4.2.16)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-08 21:29:14 +00:00
vabene1111
4c0ace1d84 Merge branch 'develop' 2024-10-08 18:25:17 +02:00
vabene1111
cae26e7fe0 updated recipe scrapers 2024-10-08 18:22:03 +02:00
supaeasy
8d070349a6 Translated using Weblate (German)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/
2024-10-02 23:58:36 +00:00
vabene1111
166697d791 Merge pull request #3340 from TandoorRecipes/revert-3326-develop
Revert "Update connectors.md"
2024-10-02 14:29:36 +02:00
vabene1111
90d93b733d Revert "Update connectors.md" 2024-10-02 14:29:24 +02:00
vabene1111
272d2e94a1 Merge pull request #3327 from IkkiOcean/patch-1
Update manual.md with required python version
2024-10-02 09:24:46 +02:00
vabene1111
f84a401714 Merge pull request #3326 from supaeasy/develop
Update connectors.md
2024-10-02 09:23:01 +02:00
Jorge Martinez
f6b19d40b1 Translated using Weblate (Spanish)
Currently translated at 99.2% (566 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/es/
2024-10-01 18:58:35 +00:00
dependabot[bot]
969b7ba492 Bump flake8 from 6.1.0 to 7.1.1
Bumps [flake8](https://github.com/pycqa/flake8) from 6.1.0 to 7.1.1.
- [Commits](https://github.com/pycqa/flake8/compare/6.1.0...7.1.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-01 00:42:42 +00:00
dependabot[bot]
c9edec6308 Bump lxml from 5.1.0 to 5.3.0
Bumps [lxml](https://github.com/lxml/lxml) from 5.1.0 to 5.3.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-5.1.0...lxml-5.3.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-01 00:42:37 +00:00
dependabot[bot]
9f0ff1348c Bump pytest-asyncio from 0.23.5 to 0.24.0
Bumps [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) from 0.23.5 to 0.24.0.
- [Release notes](https://github.com/pytest-dev/pytest-asyncio/releases)
- [Commits](https://github.com/pytest-dev/pytest-asyncio/compare/v0.23.5...v0.24.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-01 00:42:31 +00:00
dependabot[bot]
c85d62fc66 Bump requests from 2.32.0 to 2.32.3
Bumps [requests](https://github.com/psf/requests) from 2.32.0 to 2.32.3.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.32.0...v2.32.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-01 00:42:28 +00:00
Vivek Prakash
dae51a8d3e Update manual.md with required python version
The code written in https://github.com/TandoorRecipes/recipes/blob/develop/cookbook/connectors/connector_manager.py makes use of features introduced in Python 3.10, such as the structural pattern matching (match and case) and the union types with the pipe operator (|) which are not compatible with Python 3.9. That's why the minimum required python version for the manual installation should be python version 3.10.
2024-10-01 00:53:04 +05:30
supaeasy
d522534a12 Update connectors.md
Fixed errors in description:
- add / after api
- omit 'todo.' when adding HA-Entity
2024-09-30 14:17:18 +02:00
supaeasy
a38308a24a Translated using Weblate (German)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/
2024-09-27 13:58:36 +00:00
supaeasy
b981960221 Translated using Weblate (German)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/de/
2024-09-27 13:58:35 +00:00
nenormalniy
7d1461a752 Translated using Weblate (Russian)
Currently translated at 63.3% (361 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ru/
2024-09-26 03:58:35 +00:00
Emmker
24a589fe41 Translated using Weblate (Greek)
Currently translated at 46.3% (226 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/el/
2024-09-23 21:58:37 +00:00
supaeasy
b1d28a46c3 Translated using Weblate (German)
Currently translated at 98.9% (483 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/de/
2024-09-23 21:58:37 +00:00
vabene1111
6b376fbfbb Merge pull request #3302 from mikhail5555/dont-log-sensitive-headers-in-err
Allow HomeAssistant Connector to work with Debug=False (and logging improvements)
2024-09-23 07:44:01 +02:00
vabene1111
c532b1f94f Merge branch 'develop' into dont-log-sensitive-headers-in-err 2024-09-23 07:43:55 +02:00
vabene1111
26ab7f5580 Merge pull request #3305 from ehowe/develop
Make HomeAssistant description field optional
2024-09-23 07:37:34 +02:00
Emmker
72c638ca6f Translated using Weblate (Greek)
Currently translated at 99.8% (569 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/el/
2024-09-22 21:31:53 +00:00
Georgii Bogdanov
5478b7d550 Translated using Weblate (Russian)
Currently translated at 62.9% (359 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ru/
2024-09-22 21:31:52 +00:00
Mikhail Epifanov
e6eacc48d6 update code so it also works in DEBUG=false 2024-09-17 22:25:08 +02:00
Bebbe K
0259e000e3 Translated using Weblate (Swedish)
Currently translated at 61.4% (300 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/sv/
2024-09-17 11:58:35 +00:00
Eugene Howe
eb0a95f594 Make HomeAssistant description field optional 2024-09-15 10:44:30 -04:00
Muck Péter
41ee8cf66f Translated using Weblate (Hungarian)
Currently translated at 81.5% (465 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/hu/
2024-09-14 12:44:44 +00:00
Mikhail Epifanov
8c8834e6aa dont log err.headers which can contain sensitive info 2024-09-13 22:36:05 +02:00
Tomer Alcavi
145abfa344 Translated using Weblate (Hebrew)
Currently translated at 18.2% (89 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/he/
2024-09-08 12:58:37 +00:00
Jaan
f60e61e331 Translated using Weblate (Russian)
Currently translated at 62.4% (356 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ru/
2024-09-08 12:58:37 +00:00
Sergei
fd534aba95 Translated using Weblate (Russian)
Currently translated at 62.4% (356 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ru/
2024-09-08 12:58:37 +00:00
vabene1111
f23c99f5ea Merge pull request #3293 from TandoorRecipes/dependabot/pip/cryptography-43.0.1
Bump cryptography from 42.0.5 to 43.0.1
2024-09-06 07:32:00 +02:00
dependabot[bot]
1a14cc9513 Bump cryptography from 42.0.5 to 43.0.1
Bumps [cryptography](https://github.com/pyca/cryptography) from 42.0.5 to 43.0.1.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/42.0.5...43.0.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-04 00:11:21 +00:00
S. v.d. Gevel
e98131ce7a Translated using Weblate (Dutch)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2024-09-03 19:58:35 +00:00
S. v.d. Gevel
7cff47efab Translated using Weblate (Dutch)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/nl/
2024-09-03 19:58:35 +00:00
Stefan van der Gevel
1dcc3e06d4 Translated using Weblate (Dutch)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2024-09-02 19:31:07 +00:00
S. v.d. Gevel
9125921038 Translated using Weblate (Dutch)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2024-09-02 19:31:07 +00:00
vabene1111
eea2a2c252 Merge pull request #3287 from TandoorRecipes/dependabot/pip/pyyaml-6.0.2
Bump pyyaml from 6.0.1 to 6.0.2
2024-09-02 16:39:46 +02:00
vabene1111
9554c69a39 Merge pull request #3288 from TandoorRecipes/dependabot/pip/django-crispy-forms-2.3
Bump django-crispy-forms from 2.1 to 2.3
2024-09-02 16:39:21 +02:00
vabene1111
506ab0f0c7 Merge pull request #3290 from TandoorRecipes/dependabot/pip/pillow-10.4.0
Bump pillow from 10.3.0 to 10.4.0
2024-09-02 16:39:03 +02:00
vabene1111
3e26ca5c68 Merge pull request #3291 from TandoorRecipes/dependabot/pip/whitenoise-6.7.0
Bump whitenoise from 6.6.0 to 6.7.0
2024-09-02 16:38:51 +02:00
dependabot[bot]
3fa8a9f27e Bump whitenoise from 6.6.0 to 6.7.0
Bumps [whitenoise](https://github.com/evansd/whitenoise) from 6.6.0 to 6.7.0.
- [Changelog](https://github.com/evansd/whitenoise/blob/main/docs/changelog.rst)
- [Commits](https://github.com/evansd/whitenoise/compare/6.6.0...6.7.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-01 00:34:14 +00:00
dependabot[bot]
0cdff07e4b Bump pillow from 10.3.0 to 10.4.0
Bumps [pillow](https://github.com/python-pillow/Pillow) from 10.3.0 to 10.4.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.3.0...10.4.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-09-01 00:34:11 +00:00
dependabot[bot]
8a142c3b11 Bump django-crispy-forms from 2.1 to 2.3
Bumps [django-crispy-forms](https://github.com/django-crispy-forms/django-crispy-forms) from 2.1 to 2.3.
- [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.1...2.3)

---
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-09-01 00:34:05 +00:00
dependabot[bot]
20ca7151d1 Bump pyyaml from 6.0.1 to 6.0.2
Bumps [pyyaml](https://github.com/yaml/pyyaml) from 6.0.1 to 6.0.2.
- [Release notes](https://github.com/yaml/pyyaml/releases)
- [Changelog](https://github.com/yaml/pyyaml/blob/main/CHANGES)
- [Commits](https://github.com/yaml/pyyaml/compare/6.0.1...6.0.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-01 00:34:02 +00:00
Horst
15abe9f24b import of gourmet files
* in gourmet export as html and zip folder
* 'menus' are not imported

Note: it appears that the native format '.grmt' does not include the unit for ingredients
2024-08-30 10:05:19 +02:00
vabene1111
754b7c3376 Merge pull request #3278 from Priyanshu1035/fixtypo
Fixed the typo in the base.html file
2024-08-29 17:28:04 +02:00
Stefan van der Gevel
00b02248d3 Translated using Weblate (Dutch)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2024-08-28 18:49:54 +00:00
Priyanshu1035
fda302ebb6 fixedtypo 2024-08-28 23:29:41 +05:30
Stefan van der Gevel
70cd675aa1 Translated using Weblate (Dutch)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2024-08-28 12:58:35 +00:00
Stefan van der Gevel
960db5aaab Translated using Weblate (Dutch)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/nl/
2024-08-28 12:58:35 +00:00
Known Rabbit
8daf43d6e8 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hans/
2024-08-27 07:58:35 +00:00
Stefan van der Gevel
114ca55b26 Translated using Weblate (Dutch)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2024-08-27 07:58:35 +00:00
Known Rabbit
59f5219c0b Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/zh_Hans/
2024-08-27 07:58:35 +00:00
Stefan van der Gevel
bc465c7b2f Translated using Weblate (Dutch)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/nl/
2024-08-27 07:58:35 +00:00
Known Rabbit
bf1b2db415 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hans/
2024-08-26 06:47:13 +00:00
Known Rabbit
9085756fca Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/zh_Hans/
2024-08-26 06:47:13 +00:00
Known Rabbit
db43bd1962 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hans/
2024-08-24 14:58:37 +00:00
Known Rabbit
3c13c06ce1 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/zh_Hans/
2024-08-24 14:58:37 +00:00
vabene1111
beb1823a57 Merge pull request #3268 from smilerz/source_import_fix
set URL when none provided
2024-08-23 08:06:33 +02:00
smilerz
b6fa74c601 text 2024-08-22 12:45:49 -05:00
Matjaž T
596b6c6f98 Translated using Weblate (Slovenian)
Currently translated at 15.1% (74 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/sl/
2024-08-21 16:58:36 +00:00
vabene1111
1bfe5bb6a0 Merge branch 'develop' 2024-08-20 12:21:11 +02:00
vabene1111
f6f6754669 removed validators library and improved url validation 2024-08-20 11:45:23 +02:00
vabene1111
752a25b1f8 fixed comma 2024-08-18 14:41:17 +02:00
vabene1111
8e8e4bb8bb added us_cup as base unit 2024-08-18 14:26:10 +02:00
vabene1111
06dc02d6b2 Merge pull request #3260 from yuekaim/patch-1
Update unit_conversion_helper.py
2024-08-18 14:24:17 +02:00
vabene1111
540daf2a38 fixed test 2024-08-18 14:20:09 +02:00
vabene1111
9e671d93cb added guest read only permission to keyword/api/space endpoint 2024-08-18 12:59:34 +02:00
Stefan van der Gevel
269be4e31a Translated using Weblate (Dutch)
Currently translated at 100.0% (569 of 569 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2024-08-17 12:58:35 +00:00
Stefan van der Gevel
5969edc0b8 Translated using Weblate (Dutch)
Currently translated at 100.0% (569 of 569 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2024-08-16 11:58:37 +00:00
Stefan van der Gevel
42176f42ed Translated using Weblate (Dutch)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/nl/
2024-08-16 11:58:37 +00:00
cleo miao
8c8bb159ea Update unit_conversion_helper.py
added us cup as a volume measurement
2024-08-14 02:43:19 +02:00
vabene1111
b9cf29a0ec Merge pull request #3259 from TandoorRecipes/dependabot/pip/django-4.2.15
Bump django from 4.2.14 to 4.2.15
2024-08-13 13:04:44 +02:00
dependabot[bot]
5db9f33723 Bump django from 4.2.14 to 4.2.15
Bumps [django](https://github.com/django/django) from 4.2.14 to 4.2.15.
- [Commits](https://github.com/django/django/compare/4.2.14...4.2.15)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-13 11:04:28 +00:00
vabene1111
1ba09cc119 Merge pull request #3248 from TandoorRecipes/dependabot/pip/aiohttp-3.10.2
Bump aiohttp from 3.10.0 to 3.10.2
2024-08-13 13:03:29 +02:00
dependabot[bot]
02bbe3fa13 Bump aiohttp from 3.10.0 to 3.10.2
Bumps [aiohttp](https://github.com/aio-libs/aiohttp) from 3.10.0 to 3.10.2.
- [Release notes](https://github.com/aio-libs/aiohttp/releases)
- [Changelog](https://github.com/aio-libs/aiohttp/blob/master/CHANGES.rst)
- [Commits](https://github.com/aio-libs/aiohttp/compare/v3.10.0...v3.10.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-09 16:52:46 +00:00
vabene1111
0c77ca91c1 updated translations 2024-08-01 15:04:19 +02:00
vabene1111
fbadf14b58 Merge pull request #3238 from TandoorRecipes/dependabot/pip/crispy-bootstrap4-2024.1
Bump crispy-bootstrap4 from 2022.1 to 2024.1
2024-08-01 13:58:55 +02:00
vabene1111
2558fe6c2b Merge pull request #3237 from TandoorRecipes/dependabot/pip/aiohttp-3.10.0
Bump aiohttp from 3.9.4 to 3.10.0
2024-08-01 13:58:27 +02:00
vabene1111
10fca9b5ae Merge pull request #3235 from TandoorRecipes/dependabot/pip/pytest-xdist-3.6.1
Bump pytest-xdist from 3.5.0 to 3.6.1
2024-08-01 13:58:11 +02:00
dependabot[bot]
01f338e58b Bump aiohttp from 3.9.4 to 3.10.0
Bumps [aiohttp](https://github.com/aio-libs/aiohttp) from 3.9.4 to 3.10.0.
- [Release notes](https://github.com/aio-libs/aiohttp/releases)
- [Changelog](https://github.com/aio-libs/aiohttp/blob/master/CHANGES.rst)
- [Commits](https://github.com/aio-libs/aiohttp/compare/v3.9.4...v3.10.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-01 11:58:10 +00:00
vabene1111
5e998796ab Merge pull request #3236 from TandoorRecipes/dependabot/pip/django-oauth-toolkit-2.4.0
Bump django-oauth-toolkit from 2.3.0 to 2.4.0
2024-08-01 13:57:51 +02:00
vabene1111
40231f45f6 Merge pull request #3239 from TandoorRecipes/dependabot/pip/validators-0.33.0
Bump validators from 0.20.0 to 0.33.0
2024-08-01 13:57:00 +02:00
vabene1111
b19b51c275 Merge pull request #3215 from mikhail5555/enable-global-logging-and-more-connector-logging
enable logging for whole project and add more logging to connectors
2024-08-01 13:52:20 +02:00
vabene1111
854877e685 Merge pull request #3226 from jknndy/Contribute-readme
Update link in Contributing section of readme
2024-08-01 13:49:30 +02:00
vabene1111
028a8ddbda Merge pull request #3227 from smilerz/scraper-updates
Scraper updates
2024-08-01 13:48:38 +02:00
dependabot[bot]
abb81209af Bump validators from 0.20.0 to 0.33.0
Bumps [validators](https://github.com/python-validators/validators) from 0.20.0 to 0.33.0.
- [Release notes](https://github.com/python-validators/validators/releases)
- [Changelog](https://github.com/python-validators/validators/blob/master/CHANGES.md)
- [Commits](https://github.com/python-validators/validators/compare/0.20.0...0.33.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-01 01:01:21 +00:00
dependabot[bot]
578201c519 Bump crispy-bootstrap4 from 2022.1 to 2024.1
Bumps [crispy-bootstrap4](https://github.com/django-crispy-forms/crispy-bootstrap4) from 2022.1 to 2024.1.
- [Release notes](https://github.com/django-crispy-forms/crispy-bootstrap4/releases)
- [Changelog](https://github.com/django-crispy-forms/crispy-bootstrap4/blob/main/CHANGELOG.md)
- [Commits](https://github.com/django-crispy-forms/crispy-bootstrap4/compare/2022.1...2024.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-01 01:01:19 +00:00
dependabot[bot]
a5a23b366e Bump django-oauth-toolkit from 2.3.0 to 2.4.0
Bumps [django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) from 2.3.0 to 2.4.0.
- [Release notes](https://github.com/jazzband/django-oauth-toolkit/releases)
- [Changelog](https://github.com/jazzband/django-oauth-toolkit/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jazzband/django-oauth-toolkit/compare/2.3.0...2.4.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-01 01:01:10 +00:00
dependabot[bot]
ac57837f53 Bump pytest-xdist from 3.5.0 to 3.6.1
Bumps [pytest-xdist](https://github.com/pytest-dev/pytest-xdist) from 3.5.0 to 3.6.1.
- [Release notes](https://github.com/pytest-dev/pytest-xdist/releases)
- [Changelog](https://github.com/pytest-dev/pytest-xdist/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest-xdist/compare/v3.5.0...v3.6.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-01 01:01:08 +00:00
vabene1111
5cdc8302bb Translated using Weblate (German)
Currently translated at 98.3% (480 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/de/
2024-07-31 13:05:41 +00:00
smilerz
b095718545 add user-agent to URL import html request 2024-07-30 14:03:12 -05:00
smilerz
0b53285b89 bump recipe scrapers to 15.0.0 2024-07-29 10:01:31 -05:00
dudu dor
d1ea4360ca Translated using Weblate (Hebrew)
Currently translated at 4.7% (23 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/he/
2024-07-28 08:38:59 +00:00
dudu dor
257372db5a Translated using Weblate (Hebrew)
Currently translated at 100.0% (569 of 569 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/he/
2024-07-28 08:38:58 +00:00
Joey
855f20f2da Update README.md 2024-07-25 16:54:17 -04:00
Adam Krivanek
4f73e57ab2 Translated using Weblate (Czech)
Currently translated at 98.2% (559 of 569 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/cs/
2024-07-16 21:58:40 +00:00
Mikhail Epifanov
1b529bba10 update variable name and change default to warning, add docs 2024-07-13 22:41:08 +02:00
vabene1111
072cd00e59 Merge pull request #3216 from TandoorRecipes/dependabot/pip/django-4.2.14
Bump django from 4.2.11 to 4.2.14
2024-07-12 17:48:07 +02:00
dependabot[bot]
4b03c1a8dd Bump django from 4.2.11 to 4.2.14
Bumps [django](https://github.com/django/django) from 4.2.11 to 4.2.14.
- [Commits](https://github.com/django/django/compare/4.2.11...4.2.14)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-10 22:10:20 +00:00
Mikhail Epifanov
f614413fb1 use self._logger everywhere 2024-07-10 11:17:06 +02:00
Mikhail Epifanov
74153d79b8 add process and thread name aswell 2024-07-10 10:56:39 +02:00
Mikhail Epifanov
edf06944e0 enable logging for whole project and add more logging to connectors 2024-07-10 10:54:41 +02:00
smilerz
a02582e9f8 rebase 2024-07-09 08:01:39 -05:00
vabene1111
c4ff29beda added missing requirement for openapi endpoint 2024-07-09 07:20:49 +02:00
vabene1111
cc839a1ae9 Merge branch 'develop' 2024-07-08 20:32:15 +02:00
vabene1111
af9a95651d test respect new validation logic 2024-07-08 18:13:49 +02:00
vabene1111
45106ae99a Merge branch 'develop' of https://github.com/TandoorRecipes/recipes into develop 2024-07-08 18:02:50 +02:00
vabene1111
0ac3c55180 update translations 2024-07-08 18:02:44 +02:00
vabene1111
a289fd427b Merge pull request #3204 from AlD/develop
Gracefully handle lookup errors in resolveDjangoUrl
2024-07-08 17:44:00 +02:00
smilerz
6385866e98 url import fixes 2024-07-08 08:35:59 -05:00
smilerz
c2176305db fix invalid syntax in admin/step 2024-07-08 08:28:49 -05:00
Jean-Félix ALLARD
fd3760198b Translated using Weblate (French)
Currently translated at 96.8% (551 of 569 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fr/
2024-07-05 16:38:58 +00:00
Taylan TATLI
826ddddd5d Translated using Weblate (Turkish)
Currently translated at 100.0% (569 of 569 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/tr/
2024-07-03 16:39:00 +00:00
Taylan TATLI
93613c9781 Translated using Weblate (Turkish)
Currently translated at 6.8% (33 of 485 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/tr/
2024-07-03 16:39:00 +00:00
Daniel Albers
818ca0b2e4 Gracefully handle lookup errors in resolveDjangoUrl 2024-07-03 13:45:33 +02:00
vabene1111
17d34c5ca7 improved allowed hosts docs, default config and added a system warning 2024-06-27 13:48:11 +02:00
vabene1111
965f7c04d8 Merge pull request #3188 from TandoorRecipes/dependabot/npm_and_yarn/vue/ws-7.5.10
Bump ws from 7.5.9 to 7.5.10 in /vue
2024-06-27 13:26:40 +02:00
vabene1111
0e1e312f7c Merge pull request #3196 from TandoorRecipes/dependabot/pip/djangorestframework-3.15.2
Bump djangorestframework from 3.14.0 to 3.15.2
2024-06-27 13:26:09 +02:00
dependabot[bot]
202d8afa10 Bump djangorestframework from 3.14.0 to 3.15.2
Bumps [djangorestframework](https://github.com/encode/django-rest-framework) from 3.14.0 to 3.15.2.
- [Release notes](https://github.com/encode/django-rest-framework/releases)
- [Commits](https://github.com/encode/django-rest-framework/compare/3.14.0...3.15.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-26 19:05:46 +00:00
Renato
769561349f Translated using Weblate (Portuguese (Brazil))
Currently translated at 89.2% (508 of 569 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/pt_BR/
2024-06-21 14:38:58 +00:00
dependabot[bot]
0cb415f70d Bump ws from 7.5.9 to 7.5.10 in /vue
Bumps [ws](https://github.com/websockets/ws) from 7.5.9 to 7.5.10.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/7.5.9...7.5.10)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-18 17:23:52 +00:00
tarek EL SOL
6d4dbc26a4 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-05-28 00:57:11 +00:00
vabene1111
63759c985f Merge pull request #3160 from TandoorRecipes/dependabot/pip/requests-2.32.0
Bump requests from 2.31.0 to 2.32.0
2024-05-21 16:11:16 +02:00
dependabot[bot]
98d4ce5ff8 ---
updated-dependencies:
- dependency-name: requests
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-21 05:30:33 +00:00
only
2cf9c288be Translated using Weblate (Chinese (Traditional))
Currently translated at 8.2% (47 of 569 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hant/
2024-05-19 13:38:57 +00:00
only
9254a36636 Translated using Weblate (Chinese (Traditional))
Currently translated at 11.3% (55 of 485 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/zh_Hant/
2024-05-19 13:38:57 +00:00
Jakob Priesner
3f258fbd87 Translated using Weblate (German)
Currently translated at 98.7% (479 of 485 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/de/
2024-05-11 00:33:05 +00:00
vabene1111
7100f4eb8b Merge pull request #3147 from bhagerty/patch-1
Remove obsolete "version: 3" to eliminate warning message
2024-05-07 07:56:00 +02:00
vabene1111
7285d8b01c Merge pull request #3150 from bhagerty/develop
Delete obsolete "version" entry from last two compose.yml files
2024-05-07 07:55:23 +02:00
vabene1111
78da168a2e Merge pull request #3149 from bhagerty/patch-2
Remove obsolete "version:" entry
2024-05-07 07:55:02 +02:00
vabene1111
f54009ae00 Merge pull request #3151 from TandoorRecipes/dependabot/pip/jinja2-3.1.4
Bump jinja2 from 3.1.3 to 3.1.4
2024-05-07 07:53:34 +02:00
dependabot[bot]
f92f18ecb2 Bump jinja2 from 3.1.3 to 3.1.4
Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.3 to 3.1.4.
- [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.3...3.1.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-06 20:55:38 +00:00
Brian Hagerty
44832f7c11 Delete obsolete "version" entry from compose.yml
Per my other PR, "version" is obsolete
2024-05-06 12:38:13 -05:00
Brian Hagerty
e475115b6a Delete obsolete "version" entry
Per my first PR, "version" is obsolete and throws a warning.
2024-05-06 12:36:53 -05:00
Brian Hagerty
b32a7a9134 Remove obsolete "version:" entry
Per my other PR, "version" is obsolete and throws a warning.
2024-05-06 12:31:35 -05:00
Brian Hagerty
381adb2a5b Merge pull request #1 from TandoorRecipes/develop
Translated using Weblate (German)
2024-05-06 12:29:48 -05:00
Carsten Docktor
d976fafd45 Translated using Weblate (German)
Currently translated at 95.6% (464 of 485 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/de/
2024-05-04 19:10:19 +00:00
Brian Hagerty
7e7657e444 Remove obsolete "version: 3" to eliminate warning message
The "version: 3" entry is obsolete and throws a warning: 'version' is obsolete. AFAIK, there's no reason to keep it. There's a lengthy discussion of this issue in a different repo: https://github.com/jasonacox/Powerwall-Dashboard/issues/453

They got rid of "version" in that project. It seems like it should be removed here too.
2024-05-04 11:00:08 -05:00
vabene1111
4b551c595a MealPlan from/to date to datetime, added time to MealType 2024-05-01 13:45:12 +02:00
vabene1111
c87964f6d0 Merge pull request #3132 from smilerz/collectstatic_fix
removing pre-cached staticfiles from Docker & boot.sh
2024-04-30 17:55:41 +02:00
Fymyte
353b2d6d21 Translated using Weblate (French)
Currently translated at 96.8% (551 of 569 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fr/
2024-04-30 14:59:33 +00:00
smilerz
1d58f318ca removing pre-cached staticfiles from Docker & boot.sh 2024-04-30 07:21:30 -05:00
vabene1111
771375b40b added missing doctype attribute 2024-04-27 09:28:19 +02:00
vabene1111
1e4f6d243c Merge pull request #3120 from ellezhu1/planToEat
Fix #2982 - PlantoEat Importer
2024-04-22 08:03:43 +02:00
vabene1111
717c989ae9 Merge pull request #3121 from ellezhu1/nextCloud
Fix #3060 Next Cloud handle special ingredients ##
2024-04-22 08:03:00 +02:00
ellezhu1
4933726b79 made some changes 2024-04-21 21:23:40 +00:00
ellezhu1
d81e7f6c2b remove ##ingredients 2024-04-21 11:28:51 +00:00
ellezhu1
f1ab60bcd1 Merge branch 'develop' into planToEat 2024-04-21 06:18:51 -05:00
ellezhu1
68e6ab4be5 get step name 2024-04-21 08:31:29 +00:00
ellezhu1
7ea9592398 tested 2024-04-21 06:25:02 +00:00
ellezhu1
52d8e8d9ba issue2982 - plantToEat 2024-04-21 06:09:55 +00:00
vabene1111
b7e23df4c2 Merge pull request #3115 from TandoorRecipes/dependabot/pip/aiohttp-3.9.4
Bump aiohttp from 3.9.3 to 3.9.4
2024-04-19 07:31:52 +02:00
dependabot[bot]
fce57f7f03 Bump aiohttp from 3.9.3 to 3.9.4
Bumps [aiohttp](https://github.com/aio-libs/aiohttp) from 3.9.3 to 3.9.4.
- [Release notes](https://github.com/aio-libs/aiohttp/releases)
- [Changelog](https://github.com/aio-libs/aiohttp/blob/master/CHANGES.rst)
- [Commits](https://github.com/aio-libs/aiohttp/compare/v3.9.3...v3.9.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-18 16:18:46 +00:00
vabene1111
7eaa33ac69 Merge pull request #3113 from TandoorRecipes/dependabot/pip/gunicorn-22.0.0
Bump gunicorn from 21.2.0 to 22.0.0
2024-04-18 09:38:53 +02:00
dependabot[bot]
7ce2c042c3 Bump gunicorn from 21.2.0 to 22.0.0
Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 21.2.0 to 22.0.0.
- [Release notes](https://github.com/benoitc/gunicorn/releases)
- [Commits](https://github.com/benoitc/gunicorn/compare/21.2.0...22.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-17 02:51:06 +00:00
vabene1111
371d8a76b8 added flake8 watcher 2024-04-14 18:58:52 +02:00
vabene1111
7f63451b9a Merge pull request #3095 from Manon-ds/fixRounding
fix: rounding units
2024-04-14 18:21:28 +02:00
vabene1111
ee8237d493 Merge pull request #3101 from tooboredtocode/develop
improve docker run speed
2024-04-14 18:20:06 +02:00
vabene1111
91d3c43422 Merge pull request #3109 from smilerz/recipe_scrapers
Compatible with recipe_scrapers v15
2024-04-14 18:15:20 +02:00
smilerz
1700b9c531 change test_automations to use scrape_html
remove reliance on custom text_scraper class
changed url on test case to generic wildmode vs specific site
2024-04-12 09:20:56 -05:00
smilerz
7133249f4b update recipe_scrapers to use scrape_html
scrape_me has been deprecated
2024-04-12 08:11:59 -05:00
smilerz
ab9ea87549 upgrade recipe-scrapers 2024-04-12 08:11:58 -05:00
smilerz
975ad34672 Revert "tests for pk only nested serializer"
This reverts commit 714242b6df.
2024-04-12 07:02:57 -05:00
smilerz
6cb6861228 Revert "Revert "moved prettier configuration to .prettierrc""
This reverts commit cc24964368.
2024-04-12 07:02:42 -05:00
smilerz
cc24964368 Revert "moved prettier configuration to .prettierrc"
This reverts commit c33c4ed79b.
2024-04-11 18:24:44 -05:00
smilerz
714242b6df tests for pk only nested serializer 2024-04-11 17:36:24 -05:00
smilerz
c33c4ed79b moved prettier configuration to .prettierrc 2024-04-11 07:27:22 -05:00
vabene1111
971f8f3dad Merge pull request #3102 from smilerz/yapf_prettier
Yapf prettier
2024-04-11 07:46:12 +02:00
vabene1111
ca5fda7927 added property type delete admin 2024-04-10 20:04:17 +02:00
smilerz
2e6cc3e58e document configurations required for formatting and linting 2024-04-08 19:16:18 -05:00
tooboredtocode
42b7d1afcb fix: image not working in docker compose environments 2024-04-08 23:58:10 +02:00
tooboredtocode
99868e4e80 Reapply "Merge pull request #3055 from tooboredtocode/develop"
This reverts commit f14acc371d.
2024-04-08 23:56:49 +02:00
smilerz
38b22f3a56 setup project level linting with flake8
project level formatting with prettier
project level formatting with yapf
2024-04-08 10:49:53 -05:00
Manon Brun
b70a3bce9f Merge branch 'develop' into fixRounding 2024-04-08 09:13:57 +01:00
vabene1111
fb821ba0ef Merge branch 'develop' 2024-04-08 07:21:09 +02:00
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
Manon Brun
78686faad3 fix: rounding units 2024-04-05 15:57:09 +01:00
vabene1111
b9e806b818 Merge branch 'develop' 2024-04-04 20:57:53 +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
20e0c948c4 Merge branch 'develop' 2024-03-21 14:40:23 +01: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
a626bda1ab Merge branch 'develop' 2024-03-05 14:06:56 +01: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
21f1700d6d Merge branch 'develop'
# Conflicts:
#	cookbook/forms.py
2024-03-05 08:55:33 +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
vabene1111
57d7bda803 added captcha option to password reset form 2024-02-14 07:28:47 +01:00
vabene1111
a088697812 added additional rate limiting to password reset 2024-02-14 07:28:47 +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
2a15d19551 Merge branch 'develop' 2024-02-02 07:45:24 +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
abf8f79136 Merge branch 'develop'
# Conflicts:
#	docs/faq.md
2023-12-03 14:10:28 +01:00
vabene1111
fd028047d6 clean test view 2023-12-03 14:09:58 +01:00
vabene1111
bd0e1bcefe Merge branch 'develop' into beta 2023-12-02 21:32:24 +01:00
vabene1111
a2aa0dc3b9 automatically open ingredient editor in new tab 2023-12-02 21:26:54 +01:00
vabene1111
1758aebb73 choice input datatype detection 2023-12-02 21:13:14 +01:00
vabene1111
ecffe30062 dont show property warning for 0 values any more 2023-12-02 21:07:11 +01:00
vabene1111
21653465e0 show order and add property types from property editor 2023-12-02 20:37:23 +01:00
vabene1111
f3e11e6358 fixed and improvements to property editor 2023-12-02 20:14:12 +01:00
vabene1111
0c381ed46c fixed recipe card description overlay 2023-12-02 19:28:34 +01:00
vabene1111
fd978f9c19 fixed copying recipes with properties 2023-12-02 18:58:44 +01:00
vabene1111
b069a49954 Merge pull request #2771 from tourn/bugfix/database-url-with-port
Fix parsing DATABASE_URL with port number
2023-12-02 18:48:41 +01:00
vabene1111
11c8422fbb fixed youtube import and handle resize without ingredients 2023-12-02 18:45:34 +01:00
vabene1111
2cb010c8b4 Merge pull request #2763 from smilerz/fix_long_description
truncated long description
2023-12-02 18:11:59 +01:00
vabene1111
8f96c7f0a3 Merge pull request #2768 from TandoorRecipes/dependabot/pip/pytest-7.4.3
Bump pytest from 7.3.1 to 7.4.3
2023-12-02 18:11:34 +01:00
vabene1111
3054297357 improved error handling and fixed meal plan api 2023-12-02 18:11:09 +01:00
vabene1111
3e083e2168 fully integrated property editor 2023-12-02 18:02:22 +01:00
vabene1111
d1174ea50d fixed api comment 2023-12-02 17:42:04 +01:00
vabene1111
fe11b88fd0 pretty nice property editor 2023-12-02 17:41:02 +01:00
vabene1111
a3a2433d2a made to_date field optional in meal plan api 2023-12-02 16:29:37 +01:00
vabene1111
92be2db9fd mostly working property editor 2023-12-02 15:35:33 +01:00
vabene1111
be2f759048 add disabled capabilities to generic multiselect 2023-12-02 15:22:27 +01:00
Marco Agostino
52e88ddfd3 Translated using Weblate (Italian)
Currently translated at 86.4% (466 of 539 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/it/
2023-12-02 11:19:56 +00:00
Daniel Latzer
fe208e9844 Fix parsing DATABASE_URL with port number 2023-12-02 09:42:29 +01:00
dependabot[bot]
15e7f32001 Bump pytest from 7.3.1 to 7.4.3
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.3.1 to 7.4.3.
- [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.3.1...7.4.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-01 00:59:26 +00: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
smilerz
745c045f06 truncated long description 2023-11-30 16:24:24 -06:00
Anders Obro
4b5abec458 Translated using Weblate (Danish)
Currently translated at 99.8% (535 of 536 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/da/
2023-11-30 13:19:57 +00:00
vabene1111
f6ed49b5c4 property editor 2023-11-29 22:04:23 +01:00
vabene1111
0a0e3a48c3 first working property editor prototype 2023-11-29 21:20:10 +01:00
vabene1111
cce2407bc0 Merge pull request #2758 from smilerz/updated_documentation
Updated documentation
2023-11-29 19:28:46 +01:00
vabene1111
9b18cab145 Update settings.py 2023-11-29 19:28:19 +01:00
smilerz
8b9a09b268 Update settings.py 2023-11-29 10:56:33 -06:00
vabene1111
db1709cef7 recipe context add to meal plan default to_date 2023-11-29 17:50:01 +01:00
vabene1111
4844e5cbc8 Merge branch 'develop' of https://github.com/vabene1111/recipes into develop 2023-11-29 17:48:35 +01:00
vabene1111
e90781983f fixed meal plan multi period arrow breaking view #2678 2023-11-29 17:48:25 +01:00
vabene1111
86496069b3 Merge pull request #2728 from jrester/improve-import-error-msg
Improve import error messages
2023-11-29 17:24:06 +01:00
vabene1111
e1aee23c54 Merge pull request #2759 from TandoorRecipes/dependabot/pip/cryptography-41.0.6
Bump cryptography from 41.0.4 to 41.0.6
2023-11-29 17:20:22 +01:00
Jan-Niklas Weghorn
1000badd2f remove venv from .dockerignore 2023-11-29 11:41:19 +01:00
dependabot[bot]
9ae0b50558 Bump cryptography from 41.0.4 to 41.0.6
Bumps [cryptography](https://github.com/pyca/cryptography) from 41.0.4 to 41.0.6.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/41.0.4...41.0.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-29 00:16:22 +00:00
smilerz
f69813f729 added installing extensions if necessary 2023-11-28 16:22:17 -06:00
smilerz
fcb2c07acd Update updating.md 2023-11-28 15:52:21 -06:00
smilerz
a076d20cba Update updating.md 2023-11-28 15:51:51 -06:00
smilerz
bae777bc69 Update updating.md 2023-11-28 15:51:06 -06:00
smilerz
49781bfa7f Update updating.md 2023-11-28 15:50:35 -06:00
smilerz
72d3ace0f9 Update updating.md 2023-11-28 15:49:20 -06:00
smilerz
7f44a6f187 Update updating.md 2023-11-28 15:48:33 -06:00
smilerz
92b8799d26 Update faq.md 2023-11-28 15:47:14 -06:00
smilerz
7f1eecddc4 updated documentation for postgres upgrade
installing pgbackup container
installing with DockSTARTer
2023-11-28 15:45:27 -06:00
vabene1111
4723a7ecbd added pg upgrade faq 2023-11-28 20:38:45 +01:00
smilerz
6af28e6fe5 alpine uses TZ to set OS timezone, to stay consistent
changed TIMEZONE env variable to TZ
added deprecated warning to TIMEZONE
2023-11-28 11:47:23 -06:00
vabene1111
899a9955fb Merge branch 'develop' into beta 2023-11-27 20:21:37 +01:00
Jan-Niklas Weghorn
3c08e3a3f1 Improve import error messages 2023-11-10 13:28:20 +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
396 changed files with 65073 additions and 35816 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,185 +1,18 @@
# 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
TIMEZONE=Europe/Berlin
# allowed hosts (see documentation), should be set to your hostname(s) but might be * (default) for some proxies/providers
# ALLOWED_HOSTS=recipes.mydomain.com
# 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

22
.flake8 Normal file
View File

@@ -0,0 +1,22 @@
[flake8]
extend-ignore =
# Whitespace before ':' - Required for black compatibility
E203,
# Line break occurred before a binary operator - Required for black compatibility
W503,
# Comparison to False should be 'if cond is False:' or 'if not cond:'
E712
exclude =
.git,
**/__pycache__,
**/.git,
**/.svn,
**/.hg,
**/CVS,
**/.DS_Store,
.vscode,
**/*.pyc
per-file-ignores=
cookbook/apps.py:F401
max-line-length = 179

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

33
.gitignore vendored
View File

@@ -43,9 +43,15 @@ htmlcov/
nosetests.xml
coverage.xml
*,cover
docs/reports/**
# Django stuff:
*.log
mediafiles/
*.sqlite3*
staticfiles/
postgresql/
data/
# Sphinx documentation
docs/_build/
@@ -54,36 +60,29 @@ docs/_build/
target/
\.idea/dataSources/
\.idea/dataSources\.xml
\.idea/dataSources\.local\.xml
venv/
mediafiles/
*.sqlite3*
\.idea/workspace\.xml
\.idea/misc\.xml
# Deployment
\.env
staticfiles/
postgresql/
data/
cookbook/static/vue
vue/webpack-stats.json
/docker-compose.override.yml
vue/node_modules
plugins
.vscode/
vetur.config.js
cookbook/static/vue
vue/webpack-stats.json
vue3/node_modules
cookbook/templates/sw.js
.prettierignore
vue/.yarn
vue3/.vite
# Configs
vetur.config.js
venv/
.idea/easy-i18n.xml
cookbook/static/vue3

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>

31
.idea/watcherTasks.xml generated Normal file
View File

@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectTasksOptions">
<TaskOptions isEnabled="false">
<option name="arguments" value="-m flake8 $FilePath$ --config $ContentRoot$\.flake8" />
<option name="checkSyntaxErrors" value="true" />
<option name="description" />
<option name="exitCodeBehavior" value="ALWAYS" />
<option name="fileExtension" value="py" />
<option name="immediateSync" value="false" />
<option name="name" value="Flake8 Watcher" />
<option name="output" value="$FilePath$" />
<option name="outputFilters">
<array>
<FilterInfo>
<option name="description" value="" />
<option name="name" value="" />
<option name="regExp" value="$FILE_PATH$:$LINE$:$COLUMN$: $MESSAGE$" />
</FilterInfo>
</array>
</option>
<option name="outputFromStdout" value="false" />
<option name="program" value="$PyInterpreterDirectory$/python" />
<option name="runOnExternalChanges" value="false" />
<option name="scopeName" value="Current File" />
<option name="trackOnlyRoot" value="false" />
<option name="workingDir" value="" />
<envs />
</TaskOptions>
</component>
</project>

13
.prettierignore Normal file
View File

@@ -0,0 +1,13 @@
# generated files
api.ts
vue/src/apps/*.js
vue/node_modules
staticfiles/
docs/reports/
/vue3/src/openapi/
# ignored files - prettier interferes with django templates and github actions
*.html
*.yml
*.yaml

7
.prettierrc Normal file
View File

@@ -0,0 +1,7 @@
{
"printWidth": 179,
"trailingComma": "es5",
"tabWidth": 2,
"semi": false,
"experimentalTernaries": true
}

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
},
]
}

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

@@ -0,0 +1,14 @@
{
"python.testing.pytestArgs": [
"cookbook/tests"
],
"python.testing.unittestEnabled": false,
"python.testing.pytestEnabled": true,
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"[python]": {
"editor.defaultFormatter": "eeyore.yapf",
},
"yapf.args": [],
"isort.args": []
}

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
@@ -6,6 +6,8 @@ RUN apk add --no-cache postgresql-libs postgresql-client gettext zlib libjpeg li
#Print all logs without buffering it.
ENV PYTHONUNBUFFERED 1
ENV DOCKER true
#This port will be used by gunicorn.
EXPOSE 8080
@@ -19,18 +21,27 @@ 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
#Copy project and execute it.
COPY . ./
# commented for now https://github.com/TandoorRecipes/recipes/issues/3478
#HEALTHCHECK --interval=30s \
# --timeout=5s \
# --start-period=10s \
# --retries=3 \
# CMD [ "/usr/bin/wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1:8080/openapi" ]
# collect information from git repositories
RUN /opt/recipes/venv/bin/python version.py
# delete git repositories to reduce image size

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,16 +62,16 @@ 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!
Contributions are welcome but please read [this](https://docs.tandoor.dev/contribute/guidelines/) **BEFORE** contributing anything!
## Your Feedback
@@ -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.

23
boot.sh
View File

@@ -29,6 +29,18 @@ if [ -z "${SECRET_KEY}" ]; then
display_warning "The environment variable 'SECRET_KEY' (or 'SECRET_KEY_FILE' that points to an existing file) is not set but REQUIRED for running Tandoor!"
fi
if [ -f "${AUTH_LDAP_BIND_PASSWORD_FILE}" ]; then
export AUTH_LDAP_BIND_PASSWORD=$(cat "$AUTH_LDAP_BIND_PASSWORD_FILE")
fi
if [ -f "${EMAIL_HOST_PASSWORD_FILE}" ]; then
export EMAIL_HOST_PASSWORD=$(cat "$EMAIL_HOST_PASSWORD_FILE")
fi
if [ -f "${SOCIALACCOUNT_PROVIDERS_FILE}" ]; then
export SOCIALACCOUNT_PROVIDERS=$(cat "$SOCIALACCOUNT_PROVIDERS_FILE")
fi
echo "Waiting for database to be ready..."
@@ -67,7 +79,7 @@ echo "Migrating database"
python manage.py migrate
echo "Generating static files"
echo "Collecting static files, this may take a while..."
python manage.py collectstatic_js_reverse
python manage.py collectstatic --noinput
@@ -76,4 +88,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 "Orphaned Step" + ('' 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',)
@@ -348,8 +376,17 @@ class ShareLinkAdmin(admin.ModelAdmin):
admin.site.register(ShareLink, ShareLinkAdmin)
@admin.action(description='Delete all properties with type')
def delete_properties_with_type(modeladmin, request, queryset):
for pt in queryset:
Property.objects.filter(property_type=pt).delete()
class PropertyTypeAdmin(admin.ModelAdmin):
list_display = ('id', 'name')
search_fields = ('name',)
list_display = ('id', 'space', 'name', 'fdc_id')
actions = [delete_properties_with_type]
admin.site.register(PropertyType, PropertyTypeAdmin)

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,12 @@ class CookbookConfig(AppConfig):
def ready(self):
import cookbook.signals # noqa
if not settings.DISABLE_EXTERNAL_CONNECTORS:
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="post_save-connector_manager")
post_delete.connect(handler, dispatch_uid="post_delete-connector_manager")
# 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
@@ -34,4 +41,4 @@ class CookbookConfig(AppConfig):
# except Exception:
# if DEBUG:
# traceback.print_exc()
# pass # dont break startup just because fix could not run, need to investigate cases when this happens
# pass # dont break startup just because fix could not run, need to investigate cases when this happens

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,198 @@
import asyncio
import logging
import queue
import threading
from asyncio import Task
from dataclasses import dataclass
from enum import Enum
from logging import Logger
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
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
# 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]
# The Singleton class is used for ConnectorManager to have a self-reference and so Python does not garbage collect it
class ConnectorManager(metaclass=Singleton):
_logger: Logger
_queue: queue.Queue
_listening_to_classes = REGISTERED_CLASSES | ConnectorConfig
def __init__(self):
self._logger = logging.getLogger("recipes.connector")
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:
self._logger.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):
logger = logging.getLogger("recipes.connector.worker")
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
logger.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
logger.debug(f"received {item.instance=} with {item.actionType=}")
# 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:
logger.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
logger.debug(f"running {len(connectors)} connectors for {item.instance=} with {item.actionType=}")
loop.run_until_complete(run_connectors(connectors, space, item.instance, item.actionType))
worker_queue.task_done()
logger.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,108 @@
import logging
from logging import Logger
from typing import Dict, Tuple
from urllib.parse import urljoin
from aiohttp import request, ClientResponseError
from cookbook.connectors.connector import Connector
from cookbook.models import ShoppingListEntry, ConnectorConfig, Space
class HomeAssistant(Connector):
_config: ConnectorConfig
_logger: Logger
_required_foreign_keys = ("food", "unit", "created_by")
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")
self._logger = logging.getLogger(f"recipes.connector.homeassistant.{config.name}")
if config.url[-1] != "/":
config.url += "/"
self._config = config
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)
self._logger.debug(f"adding {item=} with {description=} to {self._config.todo_entity}")
data = {
"entity_id": self._config.todo_entity,
"item": item,
}
if self._config.supports_description_field:
data["description"] = description
try:
await self.homeassistant_api_call("POST", "services/todo/add_item", data)
except ClientResponseError as err:
self._logger.warning(f"received an exception from the api: {err.request_info.url=}, {err.request_info.method=}, {err.status=}, {err.message=}, {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 all(k in shopping_list_entry._state.fields_cache for k in self._required_foreign_keys):
# 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)
self._logger.debug(f"removing {item=} from {self._config.todo_entity}")
data = {
"entity_id": self._config.todo_entity,
"item": item,
}
try:
await self.homeassistant_api_call("POST", "services/todo/remove_item", data)
except ClientResponseError as err:
# This error will always trigger if the item is not present/found
self._logger.debug(f"received an exception from the api: {err.request_info.url=}, {err.request_info.method=}, {err.status=}, {err.message=}, {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,8 @@
from datetime import datetime
from allauth.account.forms import ResetPasswordForm, SignupForm
from allauth.socialaccount.forms import SignupForm as SocialSignupForm
from django import forms
from django.conf import settings
from django.core.exceptions import ValidationError
@@ -9,8 +12,7 @@ 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):
@@ -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):
@@ -156,15 +89,13 @@ class ImportExportBase(forms.Form):
COOKMATE = 'COOKMATE'
REZEPTSUITEDE = 'REZEPTSUITEDE'
PDF = 'PDF'
GOURMET = 'GOURMET'
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'), (GOURMET, 'Gourmet')))
class MultipleFileInput(forms.ClearableFileInput):
@@ -172,6 +103,7 @@ class MultipleFileInput(forms.ClearableFileInput):
class MultipleFileField(forms.FileField):
def __init__(self, *args, **kwargs):
kwargs.setdefault("widget", MultipleFileInput())
super().__init__(*args, **kwargs)
@@ -187,9 +119,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):
@@ -210,57 +141,74 @@ class CommentForm(forms.ModelForm):
model = Comment
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'
class ConnectorConfigForm(forms.ModelForm):
enabled = forms.BooleanField(
help_text="Is the connector enabled",
required=False,
)
def __init__(self, *args, **kwargs):
space = kwargs.pop('space')
super().__init__(*args, **kwargs)
self.fields['book'].queryset = RecipeBook.objects.filter(space=space).all()
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,
)
supports_description_field = forms.BooleanField(
help_text="Does the connector todo entity support the description field",
initial=True,
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', 'supports_description_field', 'url', 'todo_entity',
)
help_texts = {
'url': _('http://homeassistant.local:8123/api for example'),
}
@@ -275,25 +223,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 +239,7 @@ class BatchEditForm(forms.Form):
class ImportRecipeForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
space = kwargs.pop('space')
super().__init__(*args, **kwargs)
@@ -311,19 +249,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 +263,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 +278,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 +299,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 +314,63 @@ class AllAuthSignupForm(forms.Form):
pass
class AllAuthSocialSignupForm(SocialSignupForm):
terms = forms.BooleanField(label=_('Accept Terms and Privacy'))
def __init__(self, **kwargs):
super().__init__(**kwargs)
if settings.PRIVACY_URL == '' and settings.TERMS_URL == '':
self.fields.pop('terms')
def signup(self, request, user):
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

@@ -1,4 +1,12 @@
import socket
from urllib.parse import urlparse
from django.core.exceptions import ValidationError
from django.core.validators import URLValidator
from django.db.models import Func
from ipaddress import ip_address
from recipes import settings
class Round(Func):
@@ -7,7 +15,34 @@ 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")
"""
validates an url that is supposed to be imported
checks that the protocol used is http(s) and that no local address is accessed
@:param url to test
@:return true if url is valid, false otherwise
"""
def validate_import_url(url):
try:
validator = URLValidator(schemes=['http', 'https'])
validator(url)
except ValidationError:
# if schema is not http or https, consider url invalid
return False
# resolve IP address of url
try:
url_ip_address = ip_address(str(socket.gethostbyname(urlparse(url).hostname)))
except (ValueError, AttributeError, TypeError, Exception) as e:
# if ip cannot be parsed, consider url invalid
return False
# validate that IP is neither private nor any other special address
return not any([url_ip_address.is_private, url_ip_address.is_reserved, url_ip_address.is_loopback, url_ip_address.is_multicast, url_ip_address.is_link_local, ])

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

@@ -0,0 +1,19 @@
import json
def get_all_nutrient_types():
f = open('') # <--- download the foundation food or any other dataset and retrieve all nutrition ID's from it https://fdc.nal.usda.gov/download-datasets.html
json_data = json.loads(f.read())
nutrients = {}
for food in json_data['FoundationFoods']:
for entry in food['foodNutrients']:
nutrients[entry['nutrient']['id']] = {'name': entry['nutrient']['name'], 'unit': entry['nutrient']['unitName']}
nutrient_ids = list(nutrients.keys())
nutrient_ids.sort()
for nid in nutrient_ids:
print('{', f'value: {nid}, text: "{nutrients[nid]["name"]} [{nutrients[nid]["unit"]}] ({nid})"', '},')
get_all_nutrient_types()

View File

@@ -35,6 +35,20 @@ def get_filetype(name):
return '.jpeg'
def is_file_type_allowed(filename, image_only=False):
is_file_allowed = False
allowed_file_types = ['.pdf','.docx', '.xlsx']
allowed_image_types = ['.png', '.jpg', '.jpeg', '.gif']
check_list = allowed_image_types
if not image_only:
check_list += allowed_file_types
for file_type in check_list:
if filename.endswith(file_type):
is_file_allowed = True
return is_file_allowed
# TODO this whole file needs proper documentation, refactoring, and testing
# TODO also add env variable to define which images sizes should be compressed
# filetype argument can not be optional, otherwise this function will treat all images as if they were a jpeg

View File

@@ -118,7 +118,7 @@ class IngredientParser:
note = ''
start = 0
# search for first occurrence of an argument ending in a comma
while start < len(tokens) and not tokens[start].endswith(','):
while start < len(tokens) and not tokens[start].endswith((',', ';', ':')):
start += 1
if start == len(tokens):
# no token ending in a comma found -> use everything as food
@@ -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

@@ -6,7 +6,7 @@ from django.utils.dateparse import parse_duration
from django.utils.translation import gettext as _
from isodate import parse_duration as iso_parse_duration
from isodate.isoerror import ISO8601Error
from pytube import YouTube
from pytubefix import YouTube
from recipe_scrapers._utils import get_host_name, get_minutes
from cookbook.helper.automation_helper import AutomationEngine
@@ -15,12 +15,9 @@ from cookbook.models import Automation, Keyword, PropertyType
def get_from_scraper(scrape, request):
# converting the scrape_me object to the existing json format based on ld+json
# converting the scrape_html object to the existing json format based on ld+json
recipe_json = {
'steps': [],
'internal': True
}
recipe_json = {'steps': [], 'internal': True}
keywords = []
# assign source URL
@@ -31,7 +28,9 @@ def get_from_scraper(scrape, request):
source_url = scrape.url
except Exception:
pass
if source_url:
if source_url == "https://urlnotfound.none" or not source_url:
recipe_json['source_url'] = ''
else:
recipe_json['source_url'] = source_url
try:
keywords.append(source_url.replace('http://', '').replace('https://', '').split('/')[0])
@@ -157,16 +156,22 @@ def get_from_scraper(scrape, request):
# assign steps
try:
for i in parse_instructions(scrape.instructions()):
recipe_json['steps'].append({'instruction': i, 'ingredients': [], 'show_ingredients_table': request.user.userpreference.show_step_ingredients, })
recipe_json['steps'].append({
'instruction': i,
'ingredients': [],
'show_ingredients_table': request.user.userpreference.show_step_ingredients,
})
except Exception:
pass
if len(recipe_json['steps']) == 0:
recipe_json['steps'].append({'instruction': '', 'ingredients': [], })
recipe_json['steps'].append({
'instruction': '',
'ingredients': [],
})
recipe_json['description'] = recipe_json['description'][:512]
if len(recipe_json['description']) > 256: # split at 256 as long descriptions don't look good on recipe cards
recipe_json['steps'][0]['instruction'] = f"*{recipe_json['description']}* \n\n" + recipe_json['steps'][0]['instruction']
else:
recipe_json['description'] = recipe_json['description'][:512]
try:
for x in scrape.ingredients():
@@ -183,20 +188,20 @@ def get_from_scraper(scrape, request):
'original_text': x
}
if unit:
ingredient['unit'] = {'name': unit, }
ingredient['unit'] = {
'name': unit,
}
recipe_json['steps'][0]['ingredients'].append(ingredient)
except Exception:
recipe_json['steps'][0]['ingredients'].append(
{
'amount': 0,
'unit': None,
'food': {
'name': x,
},
'note': '',
'original_text': x
}
)
recipe_json['steps'][0]['ingredients'].append({
'amount': 0,
'unit': None,
'food': {
'name': x,
},
'note': '',
'original_text': x
})
except Exception:
pass
@@ -232,7 +237,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
@@ -249,26 +254,28 @@ def get_from_youtube_scraper(url, request):
'working_time': 0,
'waiting_time': 0,
'image': "",
'keywords': [{'name': kw.name, 'label': kw.name, 'id': kw.pk}],
'keywords': [{
'name': kw.name,
'label': kw.name,
'id': kw.pk
}],
'source_url': url,
'steps': [
{
'ingredients': [],
'instruction': ''
}
]
'steps': [{
'ingredients': [],
'instruction': ''
}]
}
# TODO add automation here
try:
automation_engine = AutomationEngine(request, source=url)
video = YouTube(url=url)
video = YouTube(url)
video.streams.first() # this is required to execute some kind of generator/web request that fetches the description
default_recipe_json['name'] = automation_engine.apply_regex_replace_automation(video.title, Automation.NAME_REPLACE)
default_recipe_json['image'] = video.thumbnail_url
default_recipe_json['steps'][0]['instruction'] = automation_engine.apply_regex_replace_automation(video.description, Automation.INSTRUCTION_REPLACE)
if video.description:
default_recipe_json['steps'][0]['instruction'] = automation_engine.apply_regex_replace_automation(video.description, Automation.INSTRUCTION_REPLACE)
except Exception:
pass
traceback.print_exc()
return default_recipe_json
@@ -367,8 +374,8 @@ def parse_servings(servings):
servings = 1
elif isinstance(servings, list):
try:
servings = int(re.findall(r'\b\d+\b', servings[0])[0])
except KeyError:
servings = int(re.findall(r'\b\d+\b', str(servings[0]))[0])
except (KeyError, IndexError):
servings = 1
return servings
@@ -415,8 +422,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})
@@ -452,10 +459,7 @@ def normalize_string(string):
def iso_duration_to_minutes(string):
match = re.match(
r'P((?P<years>\d+)Y)?((?P<months>\d+)M)?((?P<weeks>\d+)W)?((?P<days>\d+)D)?T((?P<hours>\d+)H)?((?P<minutes>\d+)M)?((?P<seconds>\d+)S)?',
string
).groupdict()
match = re.match(r'P((?P<years>\d+)Y)?((?P<months>\d+)M)?((?P<weeks>\d+)W)?((?P<days>\d+)D)?T((?P<hours>\d+)H)?((?P<minutes>\d+)M)?((?P<seconds>\d+)S)?', string).groupdict()
return int(match['days'] or 0) * 24 * 60 + int(match['hours'] or 0) * 60 + int(match['minutes'] or 0)

View File

@@ -1,68 +0,0 @@
import json
from recipe_scrapers._abstract import AbstractScraper
class CooksIllustrated(AbstractScraper):
@classmethod
def host(cls, site='cooksillustrated'):
return {
'cooksillustrated': f"{site}.com",
'americastestkitchen': f"{site}.com",
'cookscountry': f"{site}.com",
}.get(site)
def title(self):
return self.schema.title()
def image(self):
return self.schema.image()
def total_time(self):
if not self.recipe:
self.get_recipe()
return self.recipe['recipeTimeNote']
def yields(self):
if not self.recipe:
self.get_recipe()
return self.recipe['yields']
def ingredients(self):
if not self.recipe:
self.get_recipe()
ingredients = []
for group in self.recipe['ingredientGroups']:
ingredients += group['fields']['recipeIngredientItems']
return [
"{} {} {}{}".format(
i['fields']['qty'] or '',
i['fields']['measurement'] or '',
i['fields']['ingredient']['fields']['title'] or '',
i['fields']['postText'] or ''
)
for i in ingredients
]
def instructions(self):
if not self.recipe:
self.get_recipe()
if self.recipe.get('headnote', False):
i = ['Note: ' + self.recipe.get('headnote', '')]
else:
i = []
return "\n".join(
i
+ [self.recipe.get('whyThisWorks', '')]
+ [
instruction['fields']['content']
for instruction in self.recipe['instructions']
]
)
def nutrients(self):
raise NotImplementedError("This should be implemented.")
def get_recipe(self):
j = json.loads(self.soup.find(type='application/json').string)
name = list(j['props']['initialState']['content']['documents'])[0]
self.recipe = j['props']['initialState']['content']['documents'][name]

View File

@@ -1,43 +0,0 @@
from json import JSONDecodeError
from bs4 import BeautifulSoup
from recipe_scrapers import SCRAPERS, get_host_name
from recipe_scrapers._factory import SchemaScraperFactory
from recipe_scrapers._schemaorg import SchemaOrg
from .cooksillustrated import CooksIllustrated
CUSTOM_SCRAPERS = {
CooksIllustrated.host(site="cooksillustrated"): CooksIllustrated,
CooksIllustrated.host(site="americastestkitchen"): CooksIllustrated,
CooksIllustrated.host(site="cookscountry"): CooksIllustrated,
}
SCRAPERS.update(CUSTOM_SCRAPERS)
def text_scraper(text, url=None):
domain = None
if url:
domain = get_host_name(url)
if domain in SCRAPERS:
scraper_class = SCRAPERS[domain]
else:
scraper_class = SchemaScraperFactory.SchemaScraper
class TextScraper(scraper_class):
def __init__(
self,
html=None,
url=None,
):
self.wild_mode = False
self.meta_http_equiv = False
self.soup = BeautifulSoup(html, "html.parser")
self.url = url
self.recipe = None
try:
self.schema = SchemaOrg(html)
except (JSONDecodeError, AttributeError):
pass
return TextScraper(url=url, html=text)

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

@@ -3,6 +3,8 @@ from gettext import gettext as _
import bleach
import markdown as md
from jinja2 import Template, TemplateSyntaxError, UndefinedError
from jinja2.exceptions import SecurityError
from jinja2.sandbox import SandboxedEnvironment
from markdown.extensions.tables import TableExtension
from cookbook.helper.mdx_attributes import MarkdownFormatExtension
@@ -14,12 +16,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,12 +87,17 @@ 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)
env = SandboxedEnvironment()
instructions = env.from_string(instructions).render(ingredients=ingredients, scale=scale)
except TemplateSyntaxError:
return _('Could not parse template code.') + ' Error: Template Syntax broken'
except UndefinedError:
return _('Could not parse template code.') + ' Error: Undefined Error'
except SecurityError:
return _('Could not parse template code.') + ' Error: Security Error'
return instructions

View File

@@ -20,6 +20,7 @@ CONVERSION_TABLE = {
'gallon': 0.264172,
'tbsp': 67.628,
'tsp': 202.884,
'us_cup': 4.22675,
'imperial_fluid_ounce': 35.1951,
'imperial_pint': 1.75975,
'imperial_quart': 0.879877,

View File

@@ -2,12 +2,12 @@ import re
from io import BytesIO
import requests
import validators
from cookbook.helper.HelperFunctions import validate_import_url
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.helper.recipe_url_import import (get_from_scraper, get_images_from_soup,
iso_duration_to_minutes)
from cookbook.helper.scrapers.scrapers import text_scraper
from recipe_scrapers import scrape_html
from cookbook.integration.integration import Integration
from cookbook.models import Ingredient, Recipe, Step
@@ -20,7 +20,7 @@ class CookBookApp(Integration):
def get_recipe_from_file(self, file):
recipe_html = file.getvalue().decode("utf-8")
scrape = text_scraper(text=recipe_html)
scrape = scrape_html(html=recipe_html, org_url="https://cookbookapp.import", supported_only=False)
recipe_json = get_from_scraper(scrape, self.request)
images = list(dict.fromkeys(get_images_from_soup(scrape.soup, None)))
@@ -63,7 +63,7 @@ class CookBookApp(Integration):
if len(images) > 0:
try:
url = images[0]
if validators.url(url, public=True):
if validate_import_url(url):
response = requests.get(url)
self.import_recipe_image(recipe, BytesIO(response.content))
except Exception as e:

View File

@@ -1,8 +1,8 @@
from io import BytesIO
import requests
import validators
from cookbook.helper.HelperFunctions import validate_import_url
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.helper.recipe_url_import import parse_servings, parse_servings_text, parse_time
from cookbook.integration.integration import Integration
@@ -69,7 +69,7 @@ class Cookmate(Integration):
if recipe_xml.find('imageurl') is not None:
try:
url = recipe_xml.find('imageurl').text.strip()
if validators.url(url, public=True):
if validate_import_url(url):
response = requests.get(url)
self.import_recipe_image(recipe, BytesIO(response.content))
except Exception as e:

View File

@@ -0,0 +1,211 @@
import base64
from io import BytesIO
from lxml import etree
import requests
from pathlib import Path
from bs4 import BeautifulSoup, Tag
from cookbook.helper.HelperFunctions import validate_import_url
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.helper.recipe_url_import import parse_servings, parse_servings_text, parse_time, iso_duration_to_minutes
from cookbook.integration.integration import Integration
from cookbook.models import Ingredient, Recipe, Step, Keyword
from recipe_scrapers import scrape_html
class Gourmet(Integration):
def split_recipe_file(self, file):
encoding = 'utf-8'
byte_string = file.read()
text_obj = byte_string.decode(encoding, errors="ignore")
soup = BeautifulSoup(text_obj, "html.parser")
return soup.find_all("div", {"class": "recipe"})
def get_ingredients_recursive(self, step, ingredients, ingredient_parser):
if isinstance(ingredients, Tag):
for ingredient in ingredients.children:
if not isinstance(ingredient, Tag):
continue
if ingredient.name in ["li"]:
step_name = "".join(ingredient.findAll(text=True, recursive=False)).strip().rstrip(":")
step.ingredients.add(Ingredient.objects.create(
is_header=True,
note=step_name[:256],
original_text=step_name,
space=self.request.space,
))
next_ingrediets = ingredient.find("ul", {"class": "ing"})
self.get_ingredients_recursive(step, next_ingrediets, ingredient_parser)
else:
try:
amount, unit, food, note = ingredient_parser.parse(ingredient.text.strip())
f = ingredient_parser.get_food(food)
u = ingredient_parser.get_unit(unit)
step.ingredients.add(
Ingredient.objects.create(
food=f,
unit=u,
amount=amount,
note=note,
original_text=ingredient.text.strip(),
space=self.request.space,
)
)
except ValueError:
pass
def get_recipe_from_file(self, file):
# 'file' comes is as a beautifulsoup object
source_url = None
for item in file.find_all('a'):
if item.has_attr('href'):
source_url = item.get("href")
break
name = file.find("p", {"class": "title"}).find("span", {"itemprop": "name"}).text.strip()
recipe = Recipe.objects.create(
name=name[:128],
source_url=source_url,
created_by=self.request.user,
internal=True,
space=self.request.space,
)
for category in file.find_all("span", {"itemprop": "recipeCategory"}):
keyword, created = Keyword.objects.get_or_create(name=category.text, space=self.request.space)
recipe.keywords.add(keyword)
try:
recipe.servings = parse_servings(file.find("span", {"itemprop": "recipeYield"}).text.strip())
except AttributeError:
pass
try:
prep_time = file.find("span", {"itemprop": "prepTime"}).text.strip().split()
prep_time[0] = prep_time[0].replace(',', '.')
if prep_time[1].lower() in ['stunde', 'stunden', 'hour', 'hours']:
prep_time_min = int(float(prep_time[0]) * 60)
elif prep_time[1].lower() in ['tag', 'tage', 'day', 'days']:
prep_time_min = int(float(prep_time[0]) * 60 * 24)
else:
prep_time_min = int(prep_time[0])
recipe.waiting_time = prep_time_min
except AttributeError:
pass
try:
cook_time = file.find("span", {"itemprop": "cookTime"}).text.strip().split()
cook_time[0] = cook_time[0].replace(',', '.')
if cook_time[1].lower() in ['stunde', 'stunden', 'hour', 'hours']:
cook_time_min = int(float(cook_time[0]) * 60)
elif cook_time[1].lower() in ['tag', 'tage', 'day', 'days']:
cook_time_min = int(float(cook_time[0]) * 60 * 24)
else:
cook_time_min = int(cook_time[0])
recipe.working_time = cook_time_min
except AttributeError:
pass
for cuisine in file.find_all('span', {'itemprop': 'recipeCuisine'}):
cuisine_name = cuisine.text
keyword = Keyword.objects.get_or_create(space=self.request.space, name=cuisine_name)
if len(keyword):
recipe.keywords.add(keyword[0])
for category in file.find_all('span', {'itemprop': 'recipeCategory'}):
category_name = category.text
keyword = Keyword.objects.get_or_create(space=self.request.space, name=category_name)
if len(keyword):
recipe.keywords.add(keyword[0])
step = Step.objects.create(
instruction='',
space=self.request.space,
show_ingredients_table=self.request.user.userpreference.show_step_ingredients,
)
ingredient_parser = IngredientParser(self.request, True)
ingredients = file.find("ul", {"class": "ing"})
self.get_ingredients_recursive(step, ingredients, ingredient_parser)
instructions = file.find("div", {"class": "instructions"})
if isinstance(instructions, Tag):
for instruction in instructions.children:
if not isinstance(instruction, Tag) or instruction.text == "":
continue
if instruction.name == "h3":
if step.instruction:
step.save()
recipe.steps.add(step)
step = Step.objects.create(
instruction='',
space=self.request.space,
)
step.name = instruction.text.strip()[:128]
else:
if instruction.name == "div":
for instruction_step in instruction.children:
for br in instruction_step.find_all("br"):
br.replace_with("\n")
step.instruction += instruction_step.text.strip() + ' \n\n'
notes = file.find("div", {"class": "modifications"})
if notes:
for n in notes.children:
if n.text == "":
continue
if n.name == "h3":
step.instruction += f'*{n.text.strip()}:* \n\n'
else:
for br in n.find_all("br"):
br.replace_with("\n")
step.instruction += '*' + n.text.strip() + '* \n\n'
description = ''
try:
description = file.find("div", {"id": "description"}).text.strip()
except AttributeError:
pass
if len(description) <= 512:
recipe.description = description
else:
recipe.description = description[:480] + ' ... (full description below)'
step.instruction += '*Description:* \n\n*' + description + '* \n\n'
step.save()
recipe.steps.add(step)
# import the Primary recipe image that is stored in the Zip
try:
image_path = file.find("img").get("src")
image_filename = image_path.split("\\")[1]
for f in self.import_zip.filelist:
zip_file_name = Path(f.filename).name
if image_filename == zip_file_name:
image_file = self.import_zip.read(f)
image_bytes = BytesIO(image_file)
self.import_recipe_image(recipe, image_bytes, filetype='.jpeg')
break
except Exception as e:
print(recipe.name, ': failed to import image ', str(e))
recipe.save()
return recipe
def get_files_from_recipes(self, recipes, el, cookie):
raise NotImplementedError('Method not implemented in storage integration')
def get_file_from_recipe(self, recipe):
raise NotImplementedError('Method not implemented in storage integration')

View File

@@ -153,6 +153,19 @@ class Integration:
il.total_recipes = len(new_file_list)
file_list = new_file_list
if isinstance(self, cookbook.integration.gourmet.Gourmet):
self.import_zip = import_zip
new_file_list = []
for file in file_list:
if file.file_size == 0:
next
if file.filename.startswith("index.htm"):
next
if file.filename.endswith(".htm"):
new_file_list += self.split_recipe_file(BytesIO(import_zip.read(file.filename)))
il.total_recipes = len(new_file_list)
file_list = new_file_list
for z in file_list:
try:
if not hasattr(z, 'filename') or isinstance(z, Tag):

View File

@@ -72,14 +72,14 @@ class Mealie(Integration):
)
recipe.steps.add(step)
if 'recipe_yield' in recipe_json:
if 'recipe_yield' in recipe_json and recipe_json['recipe_yield'] is not None:
recipe.servings = parse_servings(recipe_json['recipe_yield'])
recipe.servings_text = parse_servings_text(recipe_json['recipe_yield'])
if 'total_time' in recipe_json and recipe_json['total_time'] is not None:
recipe.working_time = parse_time(recipe_json['total_time'])
if 'org_url' in recipe_json:
if 'org_url' in recipe_json and recipe_json['org_url'] is not None:
recipe.source_url = recipe_json['org_url']
recipe.save()

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

@@ -60,20 +60,20 @@ class NextcloudCookbook(Integration):
step = Step.objects.create(
instruction=s, space=self.request.space, show_ingredients_table=self.request.user.userpreference.show_step_ingredients,
)
if not ingredients_added:
if len(recipe_json['description'].strip()) > 500:
step.instruction = recipe_json['description'].strip() + '\n\n' + step.instruction
ingredients_added = True
ingredient_parser = IngredientParser(self.request, True)
ingredient_parser = IngredientParser(self.request, True)
if ingredients_added == False:
for ingredient in recipe_json['recipeIngredient']:
amount, unit, food, note = ingredient_parser.parse(ingredient)
f = ingredient_parser.get_food(food)
u = ingredient_parser.get_unit(unit)
step.ingredients.add(Ingredient.objects.create(
food=f, unit=u, amount=amount, note=note, original_text=ingredient, space=self.request.space,
))
ingredients_added = True
if ingredient.startswith('##'):
subheader = ingredient.replace('##', '', 1)
step.ingredients.add(Ingredient.objects.create(note=subheader, is_header=True, no_amount=True, space=self.request.space))
else:
amount, unit, food, note = ingredient_parser.parse(ingredient)
f = ingredient_parser.get_food(food)
u = ingredient_parser.get_unit(unit)
step.ingredients.add(Ingredient.objects.create(
food=f, unit=u, amount=amount, note=note, original_text=ingredient, space=self.request.space,))
recipe.steps.add(step)
if 'nutrition' in recipe_json:

View File

@@ -6,8 +6,8 @@ from gettext import gettext as _
from io import BytesIO
import requests
import validators
from cookbook.helper.HelperFunctions import validate_import_url
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.helper.recipe_url_import import parse_servings, parse_servings_text
from cookbook.integration.integration import Integration
@@ -84,13 +84,23 @@ class Paprika(Integration):
recipe.steps.add(step)
# Paprika exports can have images in either of image_url, or photo_data.
# If a user takes an image himself, only photo_data will be set.
# If a user imports an image, both will be set. But the photo_data will be a center-cropped square resized version, so the image_url is preferred.
# Try to download image if possible
try:
if recipe_json.get("image_url", None):
url = recipe_json.get("image_url", None)
if validators.url(url, public=True):
if validate_import_url(url):
response = requests.get(url)
self.import_recipe_image(recipe, BytesIO(response.content))
if response.status_code == 200 and len(response.content) > 0:
self.import_recipe_image(recipe, BytesIO(response.content))
except Exception:
pass
# If no image downloaded, try to extract from photo_data
if not recipe.image:
if recipe_json.get("photo_data", None):
self.import_recipe_image(recipe, BytesIO(base64.b64decode(recipe_json['photo_data'])), filetype='.jpeg')

View File

@@ -1,9 +1,10 @@
from io import BytesIO
import requests
import validators
from cookbook.helper.HelperFunctions import validate_import_url
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.helper.recipe_url_import import parse_servings, parse_servings_text, parse_time
from cookbook.integration.integration import Integration
from cookbook.models import Ingredient, Keyword, Recipe, Step
@@ -18,32 +19,38 @@ class Plantoeat(Integration):
tags = None
ingredients = []
directions = []
description = ''
fields = {}
for line in file.replace('\r', '').split('\n'):
if line.strip() != '':
if 'Title:' in line:
title = line.replace('Title:', '').replace('"', '').strip()
fields['name'] = line.replace('Title:', '').replace('"', '').strip()
if 'Description:' in line:
description = line.replace('Description:', '').strip()
if 'Source:' in line or 'Serves:' in line or 'Prep Time:' in line or 'Cook Time:' in line:
directions.append(line.strip() + '\n')
fields['description'] = line.replace('Description:', '').strip()
if 'Serves:' in line:
fields['servings'] = parse_servings(line.replace('Serves:', '').strip())
if 'Source:' in line:
fields['source_url'] = line.replace('Source:', '').strip()
if 'Photo Url:' in line:
image_url = line.replace('Photo Url:', '').strip()
if 'Prep Time:' in line:
fields['working_time'] = parse_time(line.replace('Prep Time:', '').strip())
if 'Cook Time:' in line:
fields['waiting_time'] = parse_time(line.replace('Cook Time:', '').strip())
if 'Tags:' in line:
tags = line.replace('Tags:', '').strip()
if ingredient_mode:
if len(line) > 2 and 'Instructions:' not in line:
ingredients.append(line.strip())
if direction_mode:
if len(line) > 2:
directions.append(line.strip() + '\n')
if 'Ingredients:' in line:
ingredient_mode = True
if 'Directions:' in line:
ingredient_mode = False
direction_mode = True
if ingredient_mode:
if len(line) > 2 and 'Ingredients:' not in line:
ingredients.append(line.strip())
if direction_mode:
if len(line) > 2:
directions.append(line.strip() + '\n')
recipe = Recipe.objects.create(name=title, description=description, created_by=self.request.user, internal=True, space=self.request.space)
recipe = Recipe.objects.create(**fields, created_by=self.request.user, internal=True, space=self.request.space)
step = Step.objects.create(
instruction='\n'.join(directions) + '\n\n', space=self.request.space, show_ingredients_table=self.request.user.userpreference.show_step_ingredients,
@@ -68,7 +75,7 @@ class Plantoeat(Integration):
if image_url:
try:
if validators.url(image_url, public=True):
if validate_import_url(image_url):
response = requests.get(image_url)
self.import_recipe_image(recipe, BytesIO(response.content))
except Exception as e:

View File

@@ -5,9 +5,10 @@ from io import BytesIO
from zipfile import ZipFile
import requests
import validators
from django.utils.translation import gettext as _
from cookbook.helper.HelperFunctions import validate_import_url
from cookbook.helper.image_processing import get_filetype
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.integration.integration import Integration
@@ -125,7 +126,7 @@ class RecetteTek(Integration):
else:
if file['originalPicture'] != '':
url = file['originalPicture']
if validators.url(url, public=True):
if validate_import_url(url):
response = requests.get(url)
if imghdr.what(BytesIO(response.content)) is not None:
self.import_recipe_image(recipe, BytesIO(response.content), filetype=get_filetype(file['originalPicture']))

View File

@@ -2,8 +2,8 @@ import json
from io import BytesIO
import requests
import validators
from cookbook.helper.HelperFunctions import validate_import_url
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.helper.recipe_url_import import parse_servings, parse_servings_text, parse_time
from cookbook.integration.integration import Integration
@@ -56,7 +56,7 @@ class RecipeSage(Integration):
if len(file['image']) > 0:
try:
url = file['image'][0]
if validators.url(url, public=True):
if validate_import_url(url):
response = requests.get(url)
self.import_recipe_image(recipe, BytesIO(response.content))
except Exception as e:

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

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