Compare commits

...

572 Commits

Author SHA1 Message Date
vabene1111
205f76d128 fix that does not really fix anything
see #453/454
2021-02-23 21:43:14 +01:00
vabene1111
4147bc61c7 Merge pull request #390 from smilerz/develop
Add keywords during edit & url import
2021-02-23 21:12:45 +01:00
vabene1111
dfae453925 Merge pull request #450 from albcp/develop
Add environment variable to include Sub-Path in resolve.js.
2021-02-23 21:09:56 +01:00
vabene1111
7507cae44c added some info to .env for DB_OPTIONS 2021-02-23 20:56:53 +01:00
vabene1111
28312774bd Merge pull request #434 from angelnu/develop
Add DB_OPTIONS to enable DBs with SSL
2021-02-23 20:55:23 +01:00
vabene1111
058723d583 compiled translations and added hy 2021-02-23 20:54:42 +01:00
vabene1111
db4abdd31d Merge pull request #426 from vabene1111/translations_cookbook-locale-en-lc-messages-django-po--develop_it
Translate '/cookbook/locale/en/LC_MESSAGES/django.po' in 'it'
2021-02-23 20:50:35 +01:00
vabene1111
727b0e9e61 Merge pull request #403 from vabene1111/translations_cookbook-locale-en-lc-messages-django-po--develop_hy
Translate '/cookbook/locale/en/LC_MESSAGES/django.po' in 'hy'
2021-02-23 20:49:40 +01:00
vabene1111
aa41146735 Merge pull request #448 from vabene1111/translations_cookbook-locale-en-lc-messages-django-po--develop_de
Translate '/cookbook/locale/en/LC_MESSAGES/django.po' in 'de'
2021-02-23 20:48:51 +01:00
vabene1111
670fc9bf35 Merge pull request #451 from vabene1111/dependabot/pip/django-autocomplete-light-3.8.2
Bump django-autocomplete-light from 3.8.1 to 3.8.2
2021-02-23 20:48:27 +01:00
vabene1111
d9a5649adc Merge pull request #446 from vabene1111/dependabot/pip/django-3.1.7
Bump django from 3.1.6 to 3.1.7
2021-02-23 20:48:15 +01:00
vabene1111
5ed300a3ea Merge pull request #445 from vabene1111/dependabot/pip/django-crispy-forms-1.11.1
Bump django-crispy-forms from 1.11.0 to 1.11.1
2021-02-23 20:48:04 +01:00
Alberto
8dffc07072 get JS_REVERSE_SCRIPT_PREFIX from SCRIPT_NAME 2021-02-23 18:57:59 +01:00
dependabot[bot]
76c7ad1ff5 Bump django-autocomplete-light from 3.8.1 to 3.8.2
Bumps [django-autocomplete-light](https://github.com/yourlabs/django-autocomplete-light) from 3.8.1 to 3.8.2.
- [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/commits)

Signed-off-by: dependabot[bot] <support@github.com>
2021-02-23 06:02:25 +00:00
vabene1111
7f391c25a4 fixed test 2021-02-22 19:59:43 +01:00
Alberto
bccc41d177 Add environment variable to include Sub-Path in resolve.js. 2021-02-22 19:56:33 +01:00
transifex-integration[bot]
cc882082d2 Apply translations in de
translation completed for the source file '/cookbook/locale/en/LC_MESSAGES/django.po'
on the 'de' language.
2021-02-22 15:41:54 +00:00
dependabot[bot]
689918c1ac Bump django from 3.1.6 to 3.1.7
Bumps [django](https://github.com/django/django) from 3.1.6 to 3.1.7.
- [Release notes](https://github.com/django/django/releases)
- [Commits](https://github.com/django/django/compare/3.1.6...3.1.7)

Signed-off-by: dependabot[bot] <support@github.com>
2021-02-22 07:00:34 +00:00
dependabot[bot]
1c43be3899 Bump django-crispy-forms from 1.11.0 to 1.11.1
Bumps [django-crispy-forms](https://github.com/django-crispy-forms/django-crispy-forms) from 1.11.0 to 1.11.1.
- [Release notes](https://github.com/django-crispy-forms/django-crispy-forms/releases)
- [Changelog](https://github.com/django-crispy-forms/django-crispy-forms/blob/master/CHANGELOG.md)
- [Commits](https://github.com/django-crispy-forms/django-crispy-forms/compare/1.11.0...1.11.1)

Signed-off-by: dependabot[bot] <support@github.com>
2021-02-22 07:00:29 +00:00
vabene1111
e2b1115b3b fixed servings blank 2021-02-20 18:50:28 +01:00
Vegetto
804adde964 Parse DB_OPTIONS dict 2021-02-20 16:54:42 +01:00
Vegetto
5aa918f478 Document DB_OPTIONS env 2021-02-20 16:53:02 +01:00
Vegetto
a44f72a030 Add DB_OPTIONS to enable DBs with SSL 2021-02-20 16:42:48 +01:00
transifex-integration[bot]
79f823cd62 Apply translations in it
translation completed for the source file '/cookbook/locale/en/LC_MESSAGES/django.po'
on the 'it' language.
2021-02-19 13:42:50 +00:00
smilerz
c60c3f1876 Revert "minor edit"
This reverts commit 35f3ecc7eb.
2021-02-18 07:28:26 -06:00
smilerz
fc5455a0f2 Revert "added new keyword management page"
This reverts commit 6962b0e218.
2021-02-18 07:27:43 -06:00
smilerz
28d8f62af7 Revert "add filter to new keywords page"
This reverts commit c6dd55df4e.
2021-02-18 07:25:31 -06:00
vabene1111
b6b505c361 fixed nutrition scaling fractiosn 2021-02-18 11:11:07 +01:00
vabene1111
97cef449c9 fixed recipe template rendering scaling issue 2021-02-18 09:37:17 +01:00
vabene1111
fef6f695ce chowdown import folder syntax support 2021-02-18 09:36:13 +01:00
vabene1111
73a24a8ef0 chowdown doc warning 2021-02-18 09:29:11 +01:00
vabene1111
e727cae020 fixed typo that broke fractions 2021-02-18 09:17:42 +01:00
smilerz
c6dd55df4e add filter to new keywords page 2021-02-17 10:45:31 -06:00
smilerz
6962b0e218 added new keyword management page 2021-02-17 07:09:19 -06:00
vabene1111
894d2d2e6b gracful recipes api error on wrong format of update_at 2021-02-16 22:14:40 +01:00
transifex-integration[bot]
8bf4a32dfd Apply translations in hy
translation completed for the source file '/cookbook/locale/en/LC_MESSAGES/django.po'
on the 'hy' language.
2021-02-16 19:31:09 +00:00
smilerz
505650518e Merge branch 'develop' of https://github.com/vabene1111/recipes into develop 2021-02-16 07:45:22 -06:00
smilerz
35f3ecc7eb minor edit 2021-02-16 07:44:41 -06:00
vabene1111
543e52d596 updated preview image 2021-02-15 22:05:04 +01:00
vabene1111
f39433142d typo 2021-02-15 21:48:21 +01:00
vabene1111
f2765c75c6 favicon path in markdown docs 2021-02-15 21:16:31 +01:00
vabene1111
47049808b7 Merge branch 'beta' into develop 2021-02-15 21:02:12 +01:00
vabene1111
150d4c7309 refactor assset and paths 2021-02-15 21:01:54 +01:00
vabene1111
d116d08adf Merge pull request #401 from tdvantine/patch-3
Update .env.template
2021-02-15 20:51:42 +01:00
vabene1111
82d2e479b2 Merge pull request #400 from tdvantine/patch-2
Update Recipes.conf
2021-02-15 20:48:35 +01:00
tdvantine
df81aec02e Update .env.template
Matched the db user to that of the install instructions, fixed some grammar/spelling error and simplified wording...hopefully.
2021-02-15 11:25:58 -07:00
tdvantine
74779fc488 Update Recipes.conf 2021-02-15 10:25:10 -07:00
vabene1111
ac9922ff61 manifest fixes 2021-02-15 16:08:18 +01:00
vabene1111
ff0cd6fa93 fixed import log 2021-02-15 15:30:19 +01:00
vabene1111
777f4518be servings default to 1 on import 2021-02-15 15:16:15 +01:00
vabene1111
84591fd17a fixed issue with shopping list saving 2021-02-15 15:13:59 +01:00
vabene1111
7536425e39 added czech locale 2021-02-15 15:13:40 +01:00
vabene1111
9d28ce48fe Merge pull request #397 from vabene1111/translations_cookbook-locale-en-lc-messages-django-po--develop_cs
Translate '/cookbook/locale/en/LC_MESSAGES/django.po' in 'cs'
2021-02-15 15:11:50 +01:00
vabene1111
d6b438b5f4 Merge pull request #398 from l0c4lh057/master
Fix ingredient parsing for fractions using '/'
2021-02-14 18:51:18 +01:00
Aaron
87d6ca0200 Fix ingredient parsing for fractions using '/'
Even though ingredients like '1 1/2 something' already worked fine and got converted to 1.5 something
I just came across a recipe using '1/2' as the whole amount without any whole number before that.
Apparently I overlooked that case before so I now also fixed that.
2021-02-14 18:43:38 +01:00
transifex-integration[bot]
bcda57a4fa Apply translations in cs
translation completed for the source file '/cookbook/locale/en/LC_MESSAGES/django.po'
on the 'cs' language.
2021-02-14 13:12:22 +00:00
vabene1111
3e55207a8d fixed path 2021-02-13 18:19:38 +01:00
vabene1111
80eee945a0 updated logo path 2021-02-13 18:08:05 +01:00
vabene1111
3436ef4877 added cname file 2021-02-13 18:06:40 +01:00
vabene1111
20e9d4a990 new style and icon 2021-02-13 18:04:33 +01:00
vabene1111
3a1c9aa462 Update README.md 2021-02-13 15:54:08 +01:00
vabene1111
de9f0ad8f8 Update README.md 2021-02-13 15:51:21 +01:00
vabene1111
61f43f78ec Update README.md 2021-02-13 15:42:20 +01:00
vabene1111
a3f2c1bed2 Testing new logo 2021-02-13 15:28:10 +01:00
smilerz
e0a0eeeecc add keyword during url import 2021-02-09 12:55:40 -06:00
smilerz
4a4dafd69c add keyword during recipe edit 2021-02-09 11:17:31 -06:00
vabene1111
6781128c1b added help to import/export 2021-02-09 18:02:45 +01:00
vabene1111
73b7f60222 translations 2021-02-09 18:01:32 +01:00
vabene1111
46a9d19374 safron import 2021-02-09 17:34:38 +01:00
vabene1111
6ba1ff4505 added chowdown importer 2021-02-09 17:15:47 +01:00
vabene1111
58c5b2c301 add paprika import image support 2021-02-09 16:10:28 +01:00
vabene1111
5d1d6d4248 added mealie importer 2021-02-08 21:19:46 +01:00
vabene1111
0f251bee9b nextcloud import instructions 2021-02-08 19:27:18 +01:00
vabene1111
149c5b5f5e nextcloud import working with images 2021-02-08 19:19:56 +01:00
vabene1111
7d051336d3 basic nextcloud import 2021-02-08 19:09:45 +01:00
vabene1111
79da8db889 added paprika import 2021-02-08 13:47:06 +01:00
vabene1111
ec842aa657 testing docker with new dependecy 2021-02-08 11:55:40 +01:00
vabene1111
61c2d5eb61 import export docs and docker tests 2021-02-08 11:52:22 +01:00
vabene1111
41e3ec41e9 update pip during build 2021-02-08 11:41:28 +01:00
vabene1111
086570ce90 using new import/export module 2021-02-08 11:38:38 +01:00
vabene1111
d2783429a1 added documentation to importer 2021-02-08 11:26:41 +01:00
vabene1111
de19a10cba more abstract import/export interface 2021-02-08 11:18:13 +01:00
vabene1111
f312631676 import tag recipes and show results after import 2021-02-08 10:54:04 +01:00
vabene1111
6c52b7bbd9 remove pre commit from build dependencies 2021-02-08 10:02:30 +01:00
vabene1111
900f1a6f7a Merge pull request #389 from vabene1111/dependabot/pip/pre-commit-2.10.1
Bump pre-commit from 2.10.0 to 2.10.1
2021-02-08 08:46:06 +01:00
dependabot[bot]
ff0a7c5262 Bump pre-commit from 2.10.0 to 2.10.1
Bumps [pre-commit](https://github.com/pre-commit/pre-commit) from 2.10.0 to 2.10.1.
- [Release notes](https://github.com/pre-commit/pre-commit/releases)
- [Changelog](https://github.com/pre-commit/pre-commit/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pre-commit/pre-commit/compare/v2.10.0...v2.10.1)

Signed-off-by: dependabot[bot] <support@github.com>
2021-02-08 06:47:48 +00:00
vabene1111
e0acd1de83 importing with image files working 2021-02-07 14:50:43 +01:00
vabene1111
585c31490a export recipe without wrting files 2021-02-07 14:01:37 +01:00
vabene1111
3e7f96c0b8 basic export to zip working 2021-02-07 13:43:24 +01:00
vabene1111
d45adc1688 wip on new import/export system 2021-02-07 13:27:15 +01:00
vabene1111
b0fe98c091 fixed shopping url 2021-02-03 23:50:33 +01:00
vabene1111
103878e107 shopping list shortcut link 2021-02-03 23:05:42 +01:00
vabene1111
175fca2b39 Merge pull request #386 from cesarblancg/develop
Solving Apple web app issue
2021-02-03 20:35:32 +01:00
vabene1111
4600aab13a fixed unit merge bug 2021-02-03 20:28:36 +01:00
vabene1111
966a107414 fixed merge of uncreated food entries 2021-02-03 20:15:42 +01:00
vabene1111
69674e2648 allow entry mode toggle 2021-02-03 19:51:43 +01:00
vabene1111
bcd2e44493 added simple entry mode to shopping 2021-02-03 19:38:09 +01:00
cesarblancg
e745e4be0c Solving ipad pro issue 2021-02-03 18:49:48 +01:00
vabene1111
3afd18ccdc Merge pull request #378 from vabene1111/dependabot/pip/django-3.1.6
Bump django from 3.1.5 to 3.1.6
2021-02-02 08:47:50 +01:00
dependabot[bot]
24f1fb228e Bump django from 3.1.5 to 3.1.6
Bumps [django](https://github.com/django/django) from 3.1.5 to 3.1.6.
- [Release notes](https://github.com/django/django/releases)
- [Commits](https://github.com/django/django/compare/3.1.5...3.1.6)

Signed-off-by: dependabot[bot] <support@github.com>
2021-02-02 07:47:36 +00:00
vabene1111
431e213514 Merge pull request #379 from vabene1111/dependabot/pip/bleach-3.3.0
Bump bleach from 3.2.3 to 3.3.0
2021-02-02 08:46:57 +01:00
dependabot[bot]
1e00fa16db Bump bleach from 3.2.3 to 3.3.0
Bumps [bleach](https://github.com/mozilla/bleach) from 3.2.3 to 3.3.0.
- [Release notes](https://github.com/mozilla/bleach/releases)
- [Changelog](https://github.com/mozilla/bleach/blob/master/CHANGES)
- [Commits](https://github.com/mozilla/bleach/compare/v3.2.3...v3.3.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-02-02 06:06:55 +00:00
vabene1111
ac1c283efb Merge pull request #373 from vabene1111/dependabot/pip/jinja2-2.11.3
Bump jinja2 from 2.11.2 to 2.11.3
2021-02-01 09:42:10 +01:00
vabene1111
0a6a8b760f Merge pull request #374 from vabene1111/dependabot/pip/django-crispy-forms-1.11.0
Bump django-crispy-forms from 1.10.0 to 1.11.0
2021-02-01 09:42:01 +01:00
dependabot[bot]
4cdd784259 Bump django-crispy-forms from 1.10.0 to 1.11.0
Bumps [django-crispy-forms](https://github.com/django-crispy-forms/django-crispy-forms) from 1.10.0 to 1.11.0.
- [Release notes](https://github.com/django-crispy-forms/django-crispy-forms/releases)
- [Changelog](https://github.com/django-crispy-forms/django-crispy-forms/blob/master/CHANGELOG.md)
- [Commits](https://github.com/django-crispy-forms/django-crispy-forms/compare/1.10.0...1.11.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-02-01 07:31:37 +00:00
dependabot[bot]
461cb20a4f Bump jinja2 from 2.11.2 to 2.11.3
Bumps [jinja2](https://github.com/pallets/jinja) from 2.11.2 to 2.11.3.
- [Release notes](https://github.com/pallets/jinja/releases)
- [Changelog](https://github.com/pallets/jinja/blob/master/CHANGES.rst)
- [Commits](https://github.com/pallets/jinja/compare/2.11.2...2.11.3)

Signed-off-by: dependabot[bot] <support@github.com>
2021-02-01 07:31:33 +00:00
vabene1111
7ebf4d5e2a Merge pull request #366 from vabene1111/translations_cookbook-locale-en-lc-messages-django-po--develop_nl
Translate '/cookbook/locale/en/LC_MESSAGES/django.po' in 'nl'
2021-01-31 13:01:21 +01:00
transifex-integration[bot]
e50d3233fd Apply translations in nl
translation completed for the source file '/cookbook/locale/en/LC_MESSAGES/django.po'
on the 'nl' language.
2021-01-29 18:41:14 +00:00
vabene1111
cc980b2e8a fixed broken test for good and improved file api 2021-01-28 16:21:19 +01:00
vabene1111
93e965697a updated test to reflect new permission 2021-01-28 16:17:29 +01:00
vabene1111
8d65d20d1f account linking and docs update 2021-01-28 16:10:26 +01:00
vabene1111
a112824578 maybe fixed container build 2021-01-28 15:19:12 +01:00
vabene1111
6192277778 working on authentication 2021-01-28 15:11:38 +01:00
vabene1111
148324b37f fixed nutrition value database duplication 2021-01-28 14:44:23 +01:00
vabene1111
c30ce471c2 api permissions + shopping list on mobile 2021-01-28 14:41:00 +01:00
vabene1111
63cfa14a21 allauth working and integrated 2021-01-28 13:40:07 +01:00
vabene1111
53c715b6f6 Merge branch 'develop' into feature/allauth
# Conflicts:
#	requirements.txt
2021-01-28 12:07:30 +01:00
vabene1111
96146a388a added recipes to shopping list 2021-01-28 11:20:51 +01:00
vabene1111
d2a0bb1ec1 Merge pull request #362 from vabene1111/dependabot/pip/pre-commit-2.10.0
Bump pre-commit from 2.9.3 to 2.10.0
2021-01-28 10:48:54 +01:00
dependabot[bot]
d826b9f38a Bump pre-commit from 2.9.3 to 2.10.0
Bumps [pre-commit](https://github.com/pre-commit/pre-commit) from 2.9.3 to 2.10.0.
- [Release notes](https://github.com/pre-commit/pre-commit/releases)
- [Changelog](https://github.com/pre-commit/pre-commit/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pre-commit/pre-commit/compare/v2.9.3...v2.10.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-01-28 06:15:44 +00:00
vabene1111
e8d9cc6ad9 shopping list null entry 2021-01-27 17:48:08 +01:00
vabene1111
e9689d347c Merge pull request #356 from vabene1111/dependabot/pip/bleach-3.2.3
Bump bleach from 3.2.2 to 3.2.3
2021-01-27 08:44:11 +01:00
dependabot[bot]
b275fdcf62 Bump bleach from 3.2.2 to 3.2.3
Bumps [bleach](https://github.com/mozilla/bleach) from 3.2.2 to 3.2.3.
- [Release notes](https://github.com/mozilla/bleach/releases)
- [Changelog](https://github.com/mozilla/bleach/blob/master/CHANGES)
- [Commits](https://github.com/mozilla/bleach/compare/v3.2.2...v3.2.3)

Signed-off-by: dependabot[bot] <support@github.com>
2021-01-27 06:17:50 +00:00
vabene1111
a0ebc47ade api permission fixes + shopping list default view mode 2021-01-26 22:15:09 +01:00
vabene1111
b698fad83a fixed no_amount ingredients showing units in ingredient list 2021-01-26 22:00:46 +01:00
vabene1111
5e53c66eaa added ingredient headers again 2021-01-26 21:55:36 +01:00
vabene1111
37008ef290 added unaccent filter for recipe search 2021-01-26 21:14:33 +01:00
vabene1111
35ee5847ca shopping list and docs 2021-01-26 20:58:19 +01:00
vabene1111
935dee853e added ordering of supermarket categories 2021-01-26 19:19:42 +01:00
vabene1111
7b75e279b0 shopping list ui somewhat bearable 2021-01-26 18:21:45 +01:00
vabene1111
15c758b24a update food after changing category 2021-01-26 18:08:41 +01:00
vabene1111
26ec1724a5 updating food working 2021-01-26 17:56:43 +01:00
vabene1111
96c4823664 supermarket shopping list relation 2021-01-26 16:53:05 +01:00
vabene1111
5ab19b7958 supermarket category api working 2021-01-26 16:16:45 +01:00
vabene1111
09716f2b00 wip supermarket categories 2021-01-25 21:58:24 +01:00
vabene1111
138a29770a added supermarket categories to shopping 2021-01-25 21:20:40 +01:00
vabene1111
36584346cb fixed merging and added shopping ignored ingredients 2021-01-25 20:46:19 +01:00
vabene1111
c7dd5dd8bb wip shopping list stuff 2021-01-25 18:21:55 +01:00
vabene1111
a16ad2c887 added ingredient merging to shopping list 2021-01-25 17:24:03 +01:00
vabene1111
ca728b45ca made it possible to disable signup 2021-01-24 16:41:25 +01:00
vabene1111
9fd87dbf23 fixed misaligned check buttons 2021-01-24 16:14:56 +01:00
vabene1111
384a49b1c6 updated docs 2021-01-22 22:48:14 +01:00
vabene1111
477236009c disable settings in demo 2021-01-22 22:38:16 +01:00
vabene1111
93cff8873e docs type 2021-01-22 22:12:17 +01:00
vabene1111
d9feb61e85 updated documentation 2021-01-22 21:58:39 +01:00
vabene1111
00875c0d8e added help page linking 2021-01-22 21:32:29 +01:00
vabene1111
f1b7ed7d7a added option to choose webdav path 2021-01-22 20:29:29 +01:00
vabene1111
fce293e722 fixed tests 2021-01-21 20:58:20 +01:00
vabene1111
09062cb12c fixed recipe book api error 2021-01-21 20:57:26 +01:00
vabene1111
098f88e0b8 super basic working example 2021-01-21 20:54:55 +01:00
vabene1111
6992bf83aa added customizable Servings text 2021-01-21 20:05:46 +01:00
vabene1111
32044907bf template hint 2021-01-21 19:58:18 +01:00
vabene1111
3fcd613ca8 fixed side buttons in recipe edit moving under sticky nav 2021-01-21 19:45:12 +01:00
vabene1111
5b8a22762b fixed print for new recipe view 2021-01-21 19:40:47 +01:00
vabene1111
c41c319d25 added servings to url import 2021-01-21 19:39:06 +01:00
vabene1111
6690c3b206 fixed service worker caching problem 2021-01-21 19:08:36 +01:00
vabene1111
56bcd4f887 very basic offline page working 2021-01-21 18:39:24 +01:00
vabene1111
47c690526e service worker stuff work in progress 2021-01-21 16:16:49 +01:00
vabene1111
ec14338159 fixed share link with pre defined username 2021-01-21 14:42:49 +01:00
vabene1111
bf3fe1c716 Merge pull request #351 from vabene1111/dependabot/pip/pyyaml-5.4.1
Bump pyyaml from 5.4 to 5.4.1
2021-01-21 09:39:47 +01:00
vabene1111
fede79fc04 Merge pull request #352 from vabene1111/dependabot/pip/bleach-3.2.2
Bump bleach from 3.2.1 to 3.2.2
2021-01-21 09:39:34 +01:00
dependabot[bot]
9251613cd6 Bump bleach from 3.2.1 to 3.2.2
Bumps [bleach](https://github.com/mozilla/bleach) from 3.2.1 to 3.2.2.
- [Release notes](https://github.com/mozilla/bleach/releases)
- [Changelog](https://github.com/mozilla/bleach/blob/master/CHANGES)
- [Commits](https://github.com/mozilla/bleach/compare/v3.2.1...v3.2.2)

Signed-off-by: dependabot[bot] <support@github.com>
2021-01-21 05:50:44 +00:00
dependabot[bot]
0bd6df9d57 Bump pyyaml from 5.4 to 5.4.1
Bumps [pyyaml](https://github.com/yaml/pyyaml) from 5.4 to 5.4.1.
- [Release notes](https://github.com/yaml/pyyaml/releases)
- [Changelog](https://github.com/yaml/pyyaml/blob/master/CHANGES)
- [Commits](https://github.com/yaml/pyyaml/compare/5.4...5.4.1)

Signed-off-by: dependabot[bot] <support@github.com>
2021-01-21 05:50:43 +00:00
vabene1111
24e660156c Merge pull request #348 from vabene1111/dependabot/pip/pyyaml-5.4
Bump pyyaml from 5.3.1 to 5.4
2021-01-20 10:33:51 +01:00
dependabot[bot]
345ffe4d6d Bump pyyaml from 5.3.1 to 5.4
Bumps [pyyaml](https://github.com/yaml/pyyaml) from 5.3.1 to 5.4.
- [Release notes](https://github.com/yaml/pyyaml/releases)
- [Changelog](https://github.com/yaml/pyyaml/blob/master/CHANGES)
- [Commits](https://github.com/yaml/pyyaml/compare/5.3.1...5.4)

Signed-off-by: dependabot[bot] <support@github.com>
2021-01-20 05:56:58 +00:00
vabene1111
e5b7cf5f30 further improvised import/export feature 2021-01-19 21:41:52 +01:00
vabene1111
b563447674 ingredient linking fixed + tests fixed 2021-01-19 21:26:20 +01:00
vabene1111
523a2b41d1 fixed keyboard import edit 2021-01-19 21:11:02 +01:00
vabene1111
a0741f6ad3 added warning message to meal plan if no type is given 2021-01-19 20:55:51 +01:00
vabene1111
b52c3d6bd4 testing with the offline page 2021-01-17 21:26:56 +01:00
vabene1111
803369a7a6 basic offline page working 2021-01-17 21:11:03 +01:00
vabene1111
2e3e629406 actually decent service worker wip 2021-01-17 18:33:12 +01:00
vabene1111
d7894e07e9 service worker stuff 2021-01-17 16:58:50 +01:00
vabene1111
63dbdfa4a6 removed service worker stuff 2021-01-17 14:47:13 +01:00
vabene1111
961b3f07b5 added demo setting 2021-01-17 14:37:34 +01:00
vabene1111
7a1ee9a9b2 fixed documentation mistake (again) 2021-01-17 14:06:56 +01:00
vabene1111
f18980a9e2 workbox expirments 2021-01-14 13:31:56 +01:00
vabene1111
08733751aa add to book reimplemented 2021-01-14 01:21:15 +01:00
vabene1111
b271f81af2 updated hook + compiled again 2021-01-14 00:05:42 +01:00
vabene1111
0900e4c57d cleanup 2021-01-14 00:02:11 +01:00
vabene1111
d99e523608 added pre commit hooks and some other workflow stuff 2021-01-14 00:00:26 +01:00
vabene1111
50829dce47 fixed access for shared recipes 2021-01-13 22:59:19 +01:00
vabene1111
910dc29f06 updated javascript files 2021-01-13 22:48:50 +01:00
vabene1111
486c871cb5 also revert boot script for now 2021-01-13 22:35:27 +01:00
vabene1111
2b94500ffe restored old dockerfile order until time for optimization 2021-01-13 22:32:54 +01:00
vabene1111
d25ea34512 moved back together 2021-01-13 22:30:47 +01:00
vabene1111
fbc3dcdfef test 2021-01-13 22:23:00 +01:00
vabene1111
642015b368 testing docker stuff 2021-01-13 22:17:40 +01:00
vabene1111
99f06955dc corrected servings factor 2021-01-13 21:35:39 +01:00
vabene1111
9e5a7b2cc0 added loading spinner and made new view the main recipe view 2021-01-13 20:59:31 +01:00
vabene1111
948eb9be3e keywords 2021-01-13 20:49:04 +01:00
vabene1111
ec778edb93 alignment 2021-01-13 20:41:42 +01:00
vabene1111
a431031c04 ingredient checking 2021-01-13 20:12:20 +01:00
vabene1111
082a656210 Revert "refactored ingredient components"
This reverts commit 9f51b9fd16.
2021-01-13 19:40:39 +01:00
vabene1111
9f51b9fd16 refactored ingredient components 2021-01-13 18:42:59 +01:00
vabene1111
98aadf2869 cooklog improvements 2021-01-13 18:11:42 +01:00
vabene1111
54107000af fixed some browser warnings 2021-01-13 18:05:02 +01:00
vabene1111
999fe2bc61 timers added in recipe view 2021-01-13 17:58:51 +01:00
vabene1111
23bd0a7d90 fixed recipe context menu 2021-01-13 15:51:13 +01:00
vabene1111
f9059f636c update docs + removed old import 2021-01-13 15:25:34 +01:00
vabene1111
95aff5c998 cook log 2021-01-13 15:21:51 +01:00
vabene1111
bf9b8a0230 updated ci + build static files 2021-01-13 13:28:31 +01:00
vabene1111
c79432567c valid_until migration fix 2021-01-13 13:26:57 +01:00
vabene1111
ddc484562b recipe description 2021-01-13 13:26:48 +01:00
vabene1111
97b5f64718 pretty decent looking view 2021-01-13 13:12:22 +01:00
vabene1111
b042ab72cd wip step design 2021-01-13 12:29:23 +01:00
vabene1111
a59ac44f3b recipe page styling 2021-01-13 10:57:38 +01:00
vabene1111
acafcbc077 WIP but slowly seeing progress 2021-01-13 03:28:10 +01:00
vabene1111
6ff0e3b7b3 slowly looking somewhat decently 2021-01-13 03:13:07 +01:00
vabene1111
bb43ed203a display of external recipes 2021-01-13 02:16:16 +01:00
vabene1111
1bb412e007 sanitize inputs of jinja so that output does not need to be 2021-01-13 01:34:21 +01:00
vabene1111
e69d1c3408 save 2021-01-13 01:23:20 +01:00
vabene1111
cd51d12618 still working 2021-01-13 01:16:52 +01:00
vabene1111
ee130f9077 its working 2021-01-13 01:14:03 +01:00
vabene1111
0eebd438ca commit 2021-01-13 01:08:51 +01:00
vabene1111
983d40f2c1 save WIP 2021-01-12 23:28:13 +01:00
vabene1111
bbd01fdb04 Merge branch 'develop' into feature/vue 2021-01-12 21:40:32 +01:00
vabene1111
ea2f493e01 fixed request context for recipe serializer on import 2021-01-12 21:40:14 +01:00
vabene1111
9b364d57c7 partially working recipe view 2021-01-12 21:32:24 +01:00
vabene1111
068a09e28e reverted config change 2021-01-12 21:13:06 +01:00
vabene1111
83c7e318ea secure proxy headers 2021-01-12 21:05:29 +01:00
vabene1111
24ed6a1cd2 recipe stuff 2021-01-12 20:51:28 +01:00
vabene1111
816ced83b5 currently everything working 2021-01-12 19:50:21 +01:00
vabene1111
b93fb99e1b Merge pull request #333 from vabene1111/translations_cookbook-locale-en-lc-messages-django-po--develop_ca
Translate '/cookbook/locale/en/LC_MESSAGES/django.po' in 'ca'
2021-01-12 08:08:48 +01:00
transifex-integration[bot]
9203b8e985 Apply translations in ca
translation completed for the source file '/cookbook/locale/en/LC_MESSAGES/django.po'
on the 'ca' language.
2021-01-11 22:37:24 +00:00
vabene1111
7b936ec4fd removed some debug code 2021-01-11 22:00:40 +01:00
vabene1111
99f0ab830b localization in vue apps working 2021-01-11 22:00:23 +01:00
vabene1111
34028587fc working on a recipe view 2021-01-11 18:31:06 +01:00
vabene1111
df0cfc3677 Merge branch 'develop' into feature/vue 2021-01-11 16:20:49 +01:00
vabene1111
16e2af8c5d remove debug code from service worker 2021-01-11 16:20:32 +01:00
vabene1111
02aec7d6d6 very WIP 2021-01-11 16:19:37 +01:00
vabene1111
cb913f6cea some test code and playing around 2021-01-11 15:04:35 +01:00
vabene1111
5bb20bd479 Merge branch 'develop' into feature/vue 2021-01-11 10:04:55 +01:00
vabene1111
c561ddc08c fixed share link 2021-01-11 10:04:45 +01:00
vabene1111
fd3743377b Merge pull request #328 from bloomcake/small-cleanup
Small cleanup
2021-01-11 09:55:14 +01:00
vabene1111
381c3bf3fa Merge pull request #329 from vabene1111/translations_cookbook-locale-en-lc-messages-django-po--develop_it
Translate '/cookbook/locale/en/LC_MESSAGES/django.po' in 'it'
2021-01-11 09:43:43 +01:00
vabene1111
5d37a1dc0b Merge pull request #330 from vabene1111/dependabot/pip/django-tables2-2.3.4
Bump django-tables2 from 2.3.3 to 2.3.4
2021-01-11 09:43:34 +01:00
dependabot[bot]
cf07040ece Bump django-tables2 from 2.3.3 to 2.3.4
Bumps [django-tables2](https://github.com/jieter/django-tables2) from 2.3.3 to 2.3.4.
- [Release notes](https://github.com/jieter/django-tables2/releases)
- [Changelog](https://github.com/jieter/django-tables2/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jieter/django-tables2/compare/v2.3.3...v2.3.4)

Signed-off-by: dependabot[bot] <support@github.com>
2021-01-11 07:06:07 +00:00
transifex-integration[bot]
f2028ee928 Apply translations in it
translation completed for the source file '/cookbook/locale/en/LC_MESSAGES/django.po'
on the 'it' language.
2021-01-10 23:01:06 +00:00
enrico-kaack
0c39ddcf66 Fixed: inconsistent volume naming as mentioned in #317 2021-01-10 22:56:18 +01:00
Tobias Lindenberg
8ddbc34017 resolve conflicts
Signed-off-by: Tobias Lindenberg <tobias@lindenberg.pm>
2021-01-10 14:44:20 +01:00
Tobias Lindenberg
6ef06b2650 recipes 2021-01-10 14:36:10 +01:00
Tobias Lindenberg
67581c7fa4 tests/api 2021-01-10 14:32:41 +01:00
Tobias Lindenberg
bc1f28eda6 tests/edits 2021-01-10 14:23:52 +01:00
Tobias Lindenberg
61daf9d5c9 tests/other 2021-01-10 14:16:28 +01:00
Tobias Lindenberg
a37c77bb84 tests/views 2021-01-10 14:14:27 +01:00
Tobias Lindenberg
6d2c48a1c8 tests/test_setup 2021-01-10 14:11:29 +01:00
Tobias Lindenberg
bed5b72864 templatetags/theming_tags 2021-01-10 14:10:21 +01:00
Tobias Lindenberg
325d6e4326 templatetags/custom_tags 2021-01-10 14:08:23 +01:00
Tobias Lindenberg
f7ff700c7a provider/nextcloud 2021-01-10 14:06:58 +01:00
Tobias Lindenberg
41c8e53569 provider/dropbox 2021-01-10 14:03:57 +01:00
Tobias Lindenberg
ff8e431630 helper/init 2021-01-10 13:59:27 +01:00
Tobias Lindenberg
eb9b2ac6fe helper/template_helper 2021-01-10 13:57:51 +01:00
Tobias Lindenberg
1ad468e652 helper/recipe_url_import 2021-01-10 13:57:06 +01:00
Tobias Lindenberg
986bda0c81 helper/permission_helper 2021-01-10 13:51:55 +01:00
Tobias Lindenberg
bb361001b9 helper/permissions_config 2021-01-10 13:47:23 +01:00
Tobias Lindenberg
26aa0207aa helper/mdx_urlize 2021-01-10 13:46:53 +01:00
Tobias Lindenberg
8b1bd3c555 helper/ingredient_parser 2021-01-10 13:45:33 +01:00
Tobias Lindenberg
b59c7288b1 helper/ingredient_parser 2021-01-10 13:44:55 +01:00
Tobias Lindenberg
f5b456018d helper/dal 2021-01-10 13:41:09 +01:00
Tobias Lindenberg
4dad26102a fix recipeimport 2021-01-10 13:28:57 +01:00
Tobias Lindenberg
afc7718c95 urls 2021-01-10 13:28:18 +01:00
Tobias Lindenberg
e5ef19ffe4 tables 2021-01-10 13:15:01 +01:00
Tobias Lindenberg
ecf065db2b serializer 2021-01-10 13:12:06 +01:00
Tobias Lindenberg
4c03d1eb87 models 2021-01-10 13:09:23 +01:00
Tobias Lindenberg
b71e9fe57d forms 2021-01-10 13:05:04 +01:00
Tobias Lindenberg
7ab6276397 filters 2021-01-10 12:46:02 +01:00
Tobias Lindenberg
c7da37e7e7 admin 2021-01-10 12:44:42 +01:00
Tobias Lindenberg
00f9bc087c views/view 2021-01-10 12:42:24 +01:00
Tobias Lindenberg
f2c658cb2d views/new 2021-01-10 12:25:28 +01:00
Tobias Lindenberg
c35f71370e views/lists 2021-01-10 12:22:22 +01:00
Tobias Lindenberg
edb9c883f7 views/import_export 2021-01-10 12:19:39 +01:00
Tobias Lindenberg
0405c123f4 views/edit 2021-01-10 12:16:10 +01:00
Tobias Lindenberg
b84a330883 views/delete 2021-01-10 12:12:16 +01:00
Tobias Lindenberg
2d8c6ef44a views/data 2021-01-10 12:10:54 +01:00
Tobias Lindenberg
6af5f59c80 views/api 2021-01-10 12:06:49 +01:00
Tobias Lindenberg
3c4384e2f6 views/__init__ 2021-01-10 12:06:40 +01:00
vabene1111
e50239f067 added basic service worker 2021-01-10 12:00:16 +01:00
Tobias Lindenberg
4fa6919ca0 sort views imports 2021-01-10 11:55:21 +01:00
vabene1111
db6fe4256f added shortcuts to manifest 2021-01-10 10:27:50 +01:00
vabene1111
8a73f018f0 Merge pull request #326 from bloomcake/boomark-unique
Unique constraint on RecipeBookEntry
2021-01-09 23:27:40 +01:00
vabene1111
b93b16d6eb save WIP
not really getting the feel for this, will continue later, need to really learn how this works
2021-01-09 23:27:25 +01:00
vabene1111
6acf4bb831 Revert "temp save vue transition stuff"
This reverts commit 976cedd536.
2021-01-09 23:11:37 +01:00
Tobias Lindenberg
86134eecb4 added unique constraint on RecipeBookEntry table
Signed-off-by: Tobias Lindenberg <tobias@lindenberg.pm>
2021-01-09 22:17:56 +01:00
vabene1111
3716e2bb0f Merge pull request #324 from Hanser/manifest
added webmanifest to improve mobile (shortcut) experience
2021-01-09 09:16:34 +01:00
Johannes Stefan
b5e08a4828 added webmanifest to static files to improve mobile (shortcut) experience 2021-01-09 00:19:09 +01:00
vabene1111
976cedd536 temp save vue transition stuff 2021-01-08 22:31:48 +01:00
vabene1111
4af5a4e96e testing vue stuff 2021-01-08 00:14:31 +01:00
vabene1111
9044f9e1ff testing with vue mixings and components 2021-01-07 23:58:04 +01:00
vabene1111
4b719af4e1 fixed broken microdata blowing up ingredient lists 2021-01-07 23:09:37 +01:00
vabene1111
78fa5338d3 fixed ingredient dropping on parser fail 2021-01-07 22:56:05 +01:00
vabene1111
e9f2b875b9 formatting 2021-01-07 22:47:53 +01:00
vabene1111
fe3f817bc5 Merge pull request #322 from jakobwenzel/fixIngredientParser
Fix ingredient parser to allow Plural-suffixes
2021-01-07 22:35:48 +01:00
vabene1111
32f5cf64e5 stick navbar .env 2021-01-07 22:33:31 +01:00
vabene1111
5aadb66013 Merge pull request #321 from neferin12/develop
Sticky Navbar
2021-01-07 22:29:54 +01:00
Julian Pollinger
6225648e3a Minor formatting 2021-01-07 21:50:26 +01:00
Jakob Wenzel
29903af085 catch error when trying to parse into ingredient/note 2021-01-07 19:49:02 +01:00
Jakob Wenzel
8ed2562454 allow plural-suffixes in ingredient parser 2021-01-07 19:30:07 +01:00
Jakob Wenzel
fd255fd6ad added failing testcase for ingredient parser 2021-01-07 19:20:20 +01:00
Jakob Wenzel
8931fa8557 fix ingredient parser testcase
* call correct function
* flip assertion
2021-01-07 19:06:08 +01:00
Julian Pollinger
251bd88f70 Make the sticky navbar an option 2021-01-07 18:49:11 +01:00
vabene1111
2ac076afa5 readme and documentation 2021-01-07 16:45:01 +01:00
vabene1111
2d82fc1ddd fixed meal plan settings cookie expiring 2021-01-07 15:42:34 +01:00
vabene1111
ba9d85dfc9 updated docker configs 2021-01-07 15:24:56 +01:00
vabene1111
c752b2e81b Merge pull request #316 from KyleWJohnston/develop
Improve documentation formatting
2021-01-07 09:25:23 +01:00
Julian Pollinger
19df1cf65d Sticky Navbar 2021-01-06 19:09:41 +01:00
Julian Pollinger
ebdd8fc053 Update base.html 2021-01-06 18:57:25 +01:00
Kyle Johnston
924576c8ba Correct mistake on ports, clarify documentation
My understanding is if you want to access the app on port 3000, you
would use `docker run -d -p 3000:8080 ...` for a Docker command. For
Docker Compose, it's:
```
nginx_recipes:
  ports:
  - 3000:80
```
2021-01-06 07:30:10 -05:00
vabene1111
f4fa28bfbc Merge pull request #318 from vabene1111/dependabot/pip/jinja2-2.11.2
Bump jinja2 from 2.11.0 to 2.11.2
2021-01-06 07:54:35 +01:00
dependabot[bot]
0c2cb599ba Bump jinja2 from 2.11.0 to 2.11.2
Bumps [jinja2](https://github.com/pallets/jinja) from 2.11.0 to 2.11.2.
- [Release notes](https://github.com/pallets/jinja/releases)
- [Changelog](https://github.com/pallets/jinja/blob/master/CHANGES.rst)
- [Commits](https://github.com/pallets/jinja/compare/2.11.0...2.11.2)

Signed-off-by: dependabot[bot] <support@github.com>
2021-01-06 06:03:30 +00:00
Kyle Johnston
54f85196e7 Fix Docker install instructions
Not having the backslashes for the `docker run` command resulted in an
error.

Using `80:80` is ignored. While it will work on port 80, it fails when
using any other port such as `3000:80`. Using `3000:8080` works.

Volumes should have a colon on the end, otherwise you get a `ERROR:
yaml.scanner.ScannerError: mapping values are not allowed here`

That said, the new Docker install isn't working for me yet, but I love
the idea of bundling the nginx files with the recipes container.
2021-01-05 21:50:56 -05:00
Kyle Johnston
a1093ed918 Fix documentation formatting
Mostly just typos and some minor changes to help new users less familiar
with Docker tools. I preserved the original style as much as possible.
2021-01-05 21:19:16 -05:00
vabene1111
caa33810c4 added more documentation 2021-01-06 00:17:53 +01:00
vabene1111
fd8229684c improved docs and added unraid 2021-01-05 23:41:15 +01:00
vabene1111
320d94a223 fixed incorrect redirects for unauthenticated users 2021-01-05 23:24:58 +01:00
vabene1111
43ccc351c7 added changes typo fix 2021-01-05 22:54:57 +01:00
vabene1111
d36e4c6e0a fixed another typoe 2021-01-05 22:54:46 +01:00
vabene1111
fdeede5717 updated vue and vue bootrap + template improvements 2021-01-05 22:53:08 +01:00
vabene1111
738b601462 templating working 2021-01-05 22:07:46 +01:00
vabene1111
2c93a2f177 Merge branch 'develop' into feature/templating 2021-01-05 21:48:50 +01:00
vabene1111
6b2d164585 fixed broken import chain 2021-01-05 21:48:44 +01:00
vabene1111
ee707eba5c super basic templating working 2021-01-05 21:46:24 +01:00
vabene1111
f26b09cc0a fixed broken translations in help_texts 2021-01-05 21:26:42 +01:00
vabene1111
4e88f846af Merge pull request #312 from vabene1111/translations_cookbook-locale-en-lc-messages-django-po--develop_it
Translate '/cookbook/locale/en/LC_MESSAGES/django.po' in 'it'
2021-01-05 13:11:08 +01:00
transifex-integration[bot]
6a1d892e8b Apply translations in it
translation completed for the source file '/cookbook/locale/en/LC_MESSAGES/django.po'
on the 'it' language.
2021-01-05 11:44:52 +00:00
vabene1111
b90c70b2a3 huge documentation and setup restructure 2021-01-05 10:38:18 +01:00
vabene1111
bcf50f30bc Merge pull request #311 from vabene1111/dependabot/pip/django-3.1.5
Bump django from 3.1.4 to 3.1.5
2021-01-05 08:13:00 +01:00
dependabot[bot]
065ed6c437 Bump django from 3.1.4 to 3.1.5
Bumps [django](https://github.com/django/django) from 3.1.4 to 3.1.5.
- [Release notes](https://github.com/django/django/releases)
- [Commits](https://github.com/django/django/compare/3.1.4...3.1.5)

Signed-off-by: dependabot[bot] <support@github.com>
2021-01-05 06:24:30 +00:00
vabene1111
285e09f40a moved config again 2021-01-05 00:31:48 +01:00
vabene1111
0398f36949 removed ngxinx from ignored directories 2021-01-05 00:19:14 +01:00
vabene1111
ea30eb96cd changed up structure again 2021-01-04 23:40:58 +01:00
vabene1111
b787ae49bb another way of doing it 2021-01-04 23:12:01 +01:00
vabene1111
f8e2283a69 testing automatic creation of nginx config dir 2021-01-04 22:50:07 +01:00
vabene1111
13d51a7b46 further testing of nginx configurations 2021-01-04 22:31:48 +01:00
vabene1111
e74ae06b64 testing nginx configuration 2021-01-04 22:30:03 +01:00
vabene1111
aa495250c9 further work on documentation 2021-01-04 09:41:26 +01:00
vabene1111
f8ee48c23b mkdocs settings 2021-01-04 08:38:57 +01:00
vabene1111
320246b18b Merge pull request #309 from vabene1111/dependabot/pip/pillow-8.1.0
Bump pillow from 8.0.1 to 8.1.0
2021-01-04 08:32:26 +01:00
dependabot[bot]
00992da998 Bump pillow from 8.0.1 to 8.1.0
Bumps [pillow](https://github.com/python-pillow/Pillow) from 8.0.1 to 8.1.0.
- [Release notes](https://github.com/python-pillow/Pillow/releases)
- [Changelog](https://github.com/python-pillow/Pillow/blob/master/CHANGES.rst)
- [Commits](https://github.com/python-pillow/Pillow/compare/8.0.1...8.1.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-01-04 07:22:34 +00:00
vabene1111
2b9ad2feed removed fixture based backup
many different things can lead to this method of backing up failing both on backup and on restore.
to not give the user a false sense of security this feature was removed for the time being.
once i have time i will add a proper backup system.
2021-01-04 00:30:39 +01:00
vabene1111
257127bd4e ... 2021-01-03 10:34:14 +01:00
vabene1111
b1df118140 testing another action 2021-01-03 10:26:29 +01:00
vabene1111
da6b437b20 further testing 2021-01-03 10:19:32 +01:00
vabene1111
6fe4c79b0d testing with mkdocs 2021-01-03 10:08:54 +01:00
vabene1111
1793753cb4 different action to include theme 2021-01-03 10:05:30 +01:00
vabene1111
9ed1aff0d2 theme and name for mkdocs 2021-01-03 10:01:51 +01:00
vabene1111
51c3ec5762 added doc name 2021-01-03 09:58:12 +01:00
vabene1111
5feeabb498 mk docs 2021-01-03 09:57:15 +01:00
vabene1111
c4aa3eb019 test navigation 2021-01-03 09:49:17 +01:00
vabene1111
e8b9f473a6 testing around with github pages 2021-01-03 09:47:57 +01:00
vabene1111
279b4dc025 testing GH pages 2021-01-03 09:35:49 +01:00
vabene1111
6a1226ca26 updated contributers 2021-01-01 21:18:50 +01:00
vabene1111
b9ee7d53fa Merge pull request #299 from melkypie/locale-lv
Add latvian language
2021-01-01 20:59:11 +01:00
melkypie
ace7ee4274 Add latvian language 2020-12-31 18:47:07 +02:00
vabene1111
16968db1cf Update README.md 2020-12-31 13:41:47 +01:00
vabene1111
2b24155dd2 emoji updated 2020-12-31 13:39:10 +01:00
vabene1111
5a7c914fe7 added lots of user information 2020-12-31 13:38:16 +01:00
vabene1111
f822e03be0 Create SECURITY.md 2020-12-31 13:11:00 +01:00
vabene1111
1bdf14dbf9 made and compiled messages + fixed lots of typos 2020-12-31 12:56:18 +01:00
vabene1111
6ef173d82d fixed and cleand up a lot of servings related stuff 2020-12-31 12:44:19 +01:00
vabene1111
1e471ad40d removed all trans tags from javascript code
replaced by django recommended javascript catalog
still need to sort out the different translation domains
2020-12-31 12:30:31 +01:00
vabene1111
4ff1a6bc93 Merge pull request #297 from lipschultz/created-by
Assign authenticated user to created_by
2020-12-31 12:16:16 +01:00
vabene1111
7d1f47edc5 temporary fix for javascript translation 2020-12-30 17:00:38 +01:00
vabene1111
f69d7898d5 Merge pull request #290 from vabene1111/translations_cookbook-locale-en-lc-messages-django-po--develop_es
Translate '/cookbook/locale/en/LC_MESSAGES/django.po' in 'es'
2020-12-30 11:20:32 +01:00
transifex-integration[bot]
9692e2386b Apply translations in es
translation completed for the source file '/cookbook/locale/en/LC_MESSAGES/django.po'
on the 'es' language.
2020-12-28 13:34:59 +00:00
vabene1111
93b2e2d7e4 fixed small issues 2020-12-28 14:18:51 +01:00
vabene1111
8b2833f353 re added stuff 2020-12-28 14:14:34 +01:00
vabene1111
643dbbc294 Merge pull request #58 from tourn/recipe-serving-count
Add serving count to recipe
2020-12-28 10:20:00 +01:00
vabene1111
c4273a4c3f Merge branch 'develop' into recipe-serving-count 2020-12-28 10:19:52 +01:00
vabene1111
95461316a5 prevent creation of empty string units 2020-12-27 23:12:24 +01:00
vabene1111
1775b64ba4 better migration for unit fix 2020-12-27 23:10:22 +01:00
vabene1111
5a9270373f Merge branch 'translations_cookbook-locale-en-lc-messages-django-po--develop_it' into develop
# Conflicts:
#	cookbook/locale/it/LC_MESSAGES/django.po
2020-12-27 16:57:35 +01:00
transifex-integration[bot]
37f98ce9fe Apply translations in it
translation completed for the source file '/cookbook/locale/en/LC_MESSAGES/django.po'
on the 'it' language.
2020-12-27 12:46:39 +00:00
vabene1111
fa556c9a7f added migration to fix emtpy units
set all units to none for all recipes containing empty named units and delete them
2020-12-26 17:20:17 +01:00
vabene1111
29e1d1286c fixed importer empty units 2020-12-26 15:17:37 +01:00
Michael Lipschultz
f489043077 Assign authenticated user to created_by 2020-12-26 09:09:47 -05:00
vabene1111
bdd004518c verified and updated importer tests 2020-12-26 14:50:54 +01:00
vabene1111
840f5ec60d added ingredient parser test 2020-12-26 13:57:51 +01:00
vabene1111
566eea1d75 Merge pull request #277 from l0c4lh057/master
Improve text to ingredient parsing
2020-12-26 13:52:24 +01:00
vabene1111
bb48655acb Merge pull request #279 from l0c4lh057/improve
Minor improvements
2020-12-26 13:48:54 +01:00
vabene1111
d723165b1c updated base translations 2020-12-26 13:48:33 +01:00
vabene1111
592bd4f11e fixed some english translations 2020-12-26 13:46:55 +01:00
vabene1111
0aec23fcdd added tests for recipe view permissions 2020-12-26 13:28:49 +01:00
vabene1111
a23dc717aa added new languages 2020-12-26 13:16:01 +01:00
vabene1111
d364994ed7 compiled messages 2020-12-26 13:14:36 +01:00
vabene1111
a38ed28512 Merge pull request #280 from vabene1111/translations_cookbook-locale-en-lc-messages-django-po--develop_nl
Translate '/cookbook/locale/en/LC_MESSAGES/django.po' in 'nl'
2020-12-26 10:52:56 +01:00
vabene1111
1f5c02bcc3 Merge branch 'develop' into translations_cookbook-locale-en-lc-messages-django-po--develop_nl 2020-12-26 10:52:27 +01:00
vabene1111
f4afdfbc07 Merge pull request #288 from vabene1111/translations_cookbook-locale-en-lc-messages-django-po--develop_es
Translate '/cookbook/locale/en/LC_MESSAGES/django.po' in 'es'
2020-12-26 10:47:51 +01:00
transifex-integration[bot]
f753b63b13 Apply translations in es
translation completed for the source file '/cookbook/locale/en/LC_MESSAGES/django.po'
on the 'es' language.
2020-12-25 22:47:41 +00:00
tourn
6f3068a28c Show default serving count in meal planner 2020-12-24 11:51:51 +01:00
tourn
aa57b47d18 Use correct serving count from recipe view -> add to shopping 2020-12-24 11:28:59 +01:00
tourn
113e9ef1e3 Merge remote-tracking branch 'upstream/develop' into recipe-serving-count 2020-12-24 11:17:56 +01:00
transifex-integration[bot]
5899527621 Apply translations in nl
translation completed for the source file '/cookbook/locale/en/LC_MESSAGES/django.po'
on the 'nl' language.
2020-12-23 15:13:42 +00:00
Aaron
0a40de0f14 Add min/max to servings spinner 2020-12-22 23:52:40 +01:00
Aaron
bc31f013c0 Fix 'All Keywords' label in website import 2020-12-22 23:51:55 +01:00
Aaron
e7fc15dc72 Show advanced search again if it was used 2020-12-22 23:50:59 +01:00
Aaron
79396cec9e switch from double to single quotes 2020-12-21 22:42:27 +01:00
Aaron
5e07c6130f Switch to 4-space indentation 2020-12-21 20:14:32 +01:00
Aaron
94e1fdfbff Improve text to ingredient parsing
The previous implementation of parsing ingredients was very simple. I now wrote a parser
that I would consider good. It takes care of several edge cases and notations.

- Supports fraction unicode (½, ¼, ⅜, ...)
- Supports notations like `1½` and `1 1/2`
- Supports unit directly after the amount without space inbetween (`2g`, `2½g`)
- Supports notes (`5g onion (cubed)` -> amount: 5, unit: g, ingredient: onion, note: cubed)
- Supports notes (`5g onion, cubed` -> amount: 5, unit: g, ingredient: onion, note: cubed)
- Does not break when both commas and brackets exist
2020-12-21 20:00:46 +01:00
vabene1111
a0d414c83f Merge pull request #267 from Nailik/patch-1
Update Synology Setup Readme
2020-12-18 20:16:41 +01:00
Nailik
1441368465 Update Synology Setup Readme
Fixed env folder to .env folder and added instruction to set postgres password

Added information how to setup ssl and a task to update ssl certificate when needed
2020-12-18 16:32:34 +01:00
vabene1111
6f301c4771 Merge pull request #264 from vabene1111/translations_cookbook-locale-en-lc-messages-django-po--develop_it
Translate '/cookbook/locale/en/LC_MESSAGES/django.po' in 'it'
2020-12-18 14:01:08 +01:00
transifex-integration[bot]
ec31d251ea Apply translations in it
translation completed for the source file '/cookbook/locale/en/LC_MESSAGES/django.po'
on the 'it' language.
2020-12-18 12:09:20 +00:00
vabene1111
289625923f Merge pull request #261 from vabene1111/dependabot/pip/requests-2.25.1
Bump requests from 2.25.0 to 2.25.1
2020-12-17 09:36:47 +01:00
dependabot[bot]
a42a76a2cf Bump requests from 2.25.0 to 2.25.1
Bumps [requests](https://github.com/psf/requests) from 2.25.0 to 2.25.1.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/master/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.25.0...v2.25.1)

Signed-off-by: dependabot[bot] <support@github.com>
2020-12-17 06:23:09 +00:00
vabene1111
fd1216cd22 Merge pull request #259 from vabene1111/translations_cookbook-locale-en-lc-messages-django-po--develop_fr
Translate '/cookbook/locale/en/LC_MESSAGES/django.po' in 'fr'
2020-12-16 15:49:05 +01:00
transifex-integration[bot]
3f6a342026 Apply translations in fr
translation completed for the source file '/cookbook/locale/en/LC_MESSAGES/django.po'
on the 'fr' language.
2020-12-16 14:47:47 +00:00
vabene1111
f72fc699f8 fixed import image error 2020-12-15 22:54:10 +01:00
vabene1111
cdcca80196 Merge pull request #252 from vabene1111/dependabot/pip/django-cleanup-5.1.0
Bump django-cleanup from 4.0.0 to 5.1.0
2020-12-15 22:44:08 +01:00
vabene1111
400cd2f6a0 Merge pull request #251 from vabene1111/dependabot/pip/djangorestframework-3.12.2
Bump djangorestframework from 3.11.0 to 3.12.2
2020-12-15 22:44:02 +01:00
dependabot[bot]
37a4821d01 Bump django-cleanup from 4.0.0 to 5.1.0
Bumps [django-cleanup](https://github.com/un1t/django-cleanup) from 4.0.0 to 5.1.0.
- [Release notes](https://github.com/un1t/django-cleanup/releases)
- [Changelog](https://github.com/un1t/django-cleanup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/un1t/django-cleanup/compare/4.0.0...5.1.0)

Signed-off-by: dependabot[bot] <support@github.com>
2020-12-15 21:44:00 +00:00
vabene1111
d165075a96 Merge pull request #250 from vabene1111/dependabot/pip/django-crispy-forms-1.10.0
Bump django-crispy-forms from 1.9.1 to 1.10.0
2020-12-15 22:43:38 +01:00
vabene1111
a062173ebd Merge pull request #249 from vabene1111/dependabot/pip/django-3.1.4
Bump django from 3.1.3 to 3.1.4
2020-12-15 22:43:31 +01:00
vabene1111
806963c396 Merge pull request #248 from vabene1111/dependabot/pip/icalendar-4.0.7
Bump icalendar from 4.0.6 to 4.0.7
2020-12-15 22:42:44 +01:00
vabene1111
851853740d added catalan language chooser 2020-12-15 22:19:36 +01:00
vabene1111
7ca88f3c0a fixed scaling for fractions 2020-12-15 22:16:15 +01:00
vabene1111
ac2e9dd6cb updated german translation 2020-12-15 22:04:40 +01:00
vabene1111
b2a34ce59a Merge pull request #255 from vabene1111/translations_cookbook-locale-en-lc-messages-django-po--develop_de
Translate '/cookbook/locale/en/LC_MESSAGES/django.po' in 'de'
2020-12-15 22:04:12 +01:00
transifex-integration[bot]
6124501f5a Apply translations in de
translation completed for the source file '/cookbook/locale/en/LC_MESSAGES/django.po'
on the 'de' language.
2020-12-15 21:03:40 +00:00
vabene1111
4ec313f752 fixed another importer issue 2020-12-15 21:59:34 +01:00
vabene1111
dd07c56ede fixed issue with new fraction importer 2020-12-15 21:52:56 +01:00
vabene1111
77fae46aee translation updates 2020-12-15 21:39:42 +01:00
vabene1111
ff573b0358 Merge pull request #254 from vabene1111/translations_cookbook-locale-en-lc-messages-django-po--develop_ca
Translate '/cookbook/locale/en/LC_MESSAGES/django.po' in 'ca'
2020-12-15 13:02:52 +01:00
transifex-integration[bot]
247eab2a4f Apply translations in ca
translation completed for the source file '/cookbook/locale/en/LC_MESSAGES/django.po'
on the 'ca' language.
2020-12-15 12:00:28 +00:00
dependabot[bot]
dc46502667 Bump djangorestframework from 3.11.0 to 3.12.2
Bumps [djangorestframework](https://github.com/encode/django-rest-framework) from 3.11.0 to 3.12.2.
- [Release notes](https://github.com/encode/django-rest-framework/releases)
- [Commits](https://github.com/encode/django-rest-framework/compare/3.11.0...3.12.2)

Signed-off-by: dependabot[bot] <support@github.com>
2020-12-15 06:28:44 +00:00
dependabot[bot]
ac58f1959d Bump django-crispy-forms from 1.9.1 to 1.10.0
Bumps [django-crispy-forms](https://github.com/django-crispy-forms/django-crispy-forms) from 1.9.1 to 1.10.0.
- [Release notes](https://github.com/django-crispy-forms/django-crispy-forms/releases)
- [Changelog](https://github.com/django-crispy-forms/django-crispy-forms/blob/master/CHANGELOG.md)
- [Commits](https://github.com/django-crispy-forms/django-crispy-forms/compare/1.9.1...1.10.0)

Signed-off-by: dependabot[bot] <support@github.com>
2020-12-15 06:28:43 +00:00
dependabot[bot]
f4543f8d65 Bump django from 3.1.3 to 3.1.4
Bumps [django](https://github.com/django/django) from 3.1.3 to 3.1.4.
- [Release notes](https://github.com/django/django/releases)
- [Commits](https://github.com/django/django/compare/3.1.3...3.1.4)

Signed-off-by: dependabot[bot] <support@github.com>
2020-12-15 06:28:42 +00:00
dependabot[bot]
d0ef5e27df Bump icalendar from 4.0.6 to 4.0.7
Bumps [icalendar](https://github.com/collective/icalendar) from 4.0.6 to 4.0.7.
- [Release notes](https://github.com/collective/icalendar/releases)
- [Changelog](https://github.com/collective/icalendar/blob/master/CHANGES.rst)
- [Commits](https://github.com/collective/icalendar/compare/4.0.6...4.0.7)

Signed-off-by: dependabot[bot] <support@github.com>
2020-12-15 06:28:41 +00:00
vabene1111
9ea90f1c87 fraction import 2020-12-14 19:56:21 +01:00
vabene1111
e7922a7e47 nutirtion fix 2020-12-14 19:12:01 +01:00
vabene1111
d3bc440c83 meal plan quality of life stuff 2020-12-14 17:37:51 +01:00
vabene1111
910b28fe2d meal plan date handling rewrite 2020-12-14 17:11:40 +01:00
vabene1111
89cd8bc2d2 fixed wrong translation 2020-12-14 15:49:32 +01:00
vabene1111
d2e9ad2ae6 requirement still needed 2020-12-14 15:14:55 +01:00
vabene1111
56c9edd328 removed deprecated psycopg2 2020-12-14 15:11:41 +01:00
vabene1111
7732aa7646 added support for fractions 2020-12-14 14:08:11 +01:00
vabene1111
9863447bac small nutrition fixes 2020-12-14 12:56:18 +01:00
vabene1111
53b00cc4c8 Merge pull request #199 from sebimarkgraf/feature/nutrition
Add nutritional values
2020-12-14 12:29:56 +01:00
vabene1111
4f34ec1be8 Merge pull request #235 from vabene1111/dependabot/pip/pillow-8.0.1
Bump pillow from 7.1.2 to 8.0.1
2020-12-14 12:08:48 +01:00
dependabot[bot]
e444ba91f0 Bump pillow from 7.1.2 to 8.0.1
Bumps [pillow](https://github.com/python-pillow/Pillow) from 7.1.2 to 8.0.1.
- [Release notes](https://github.com/python-pillow/Pillow/releases)
- [Changelog](https://github.com/python-pillow/Pillow/blob/master/CHANGES.rst)
- [Commits](https://github.com/python-pillow/Pillow/compare/7.1.2...8.0.1)

Signed-off-by: dependabot[bot] <support@github.com>
2020-12-14 11:08:35 +00:00
vabene1111
fa3513eb65 Merge pull request #234 from vabene1111/dependabot/pip/webdavclient3-3.14.5
Bump webdavclient3 from 3.14.4 to 3.14.5
2020-12-14 12:08:29 +01:00
vabene1111
d323778f1d Merge pull request #232 from vabene1111/dependabot/pip/django-autocomplete-light-3.8.1
Bump django-autocomplete-light from 3.5.1 to 3.8.1
2020-12-14 12:08:14 +01:00
vabene1111
53cb5afef6 Merge pull request #236 from vabene1111/dependabot/pip/beautifulsoup4-4.9.3
Bump beautifulsoup4 from 4.9.2 to 4.9.3
2020-12-14 12:07:37 +01:00
vabene1111
0349301919 Merge pull request #242 from vabene1111/dependabot/pip/lxml-4.6.2
Bump lxml from 4.5.1 to 4.6.2
2020-12-14 12:07:24 +01:00
vabene1111
a5d2bd75d6 recompiled messages + added timezone setting 2020-12-14 12:03:43 +01:00
vabene1111
26499ad431 Merge pull request #229 from sebimarkgraf/fix/225-random-button
Include random in filtermixin
2020-12-14 11:51:59 +01:00
dependabot[bot]
2eb72953f0 Bump lxml from 4.5.1 to 4.6.2
Bumps [lxml](https://github.com/lxml/lxml) from 4.5.1 to 4.6.2.
- [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.5.1...lxml-4.6.2)

Signed-off-by: dependabot[bot] <support@github.com>
2020-11-30 07:22:55 +00:00
tourn
6fd9cf0d8c Use serving count in shopping list 2020-11-20 15:22:58 +01:00
tourn
1e800889e4 Merge remote-tracking branch 'upstream/master' into recipe-serving-count 2020-11-20 14:44:09 +01:00
Sebastian Markgraf
422113a745 Finish editing of nutritional information 2020-11-17 22:27:01 +01:00
dependabot[bot]
e687d0e569 Bump beautifulsoup4 from 4.9.2 to 4.9.3
Bumps [beautifulsoup4](http://www.crummy.com/software/BeautifulSoup/bs4/) from 4.9.2 to 4.9.3.

Signed-off-by: dependabot[bot] <support@github.com>
2020-11-16 07:19:43 +00:00
dependabot[bot]
76c1529ec1 Bump webdavclient3 from 3.14.4 to 3.14.5
Bumps [webdavclient3](https://github.com/ezhov-evgeny/webdav-client-python-3) from 3.14.4 to 3.14.5.
- [Release notes](https://github.com/ezhov-evgeny/webdav-client-python-3/releases)
- [Changelog](https://github.com/ezhov-evgeny/webdav-client-python-3/blob/develop/RELEASE_NOTES.md)
- [Commits](https://github.com/ezhov-evgeny/webdav-client-python-3/compare/v3.14.4...v3.14.5)

Signed-off-by: dependabot[bot] <support@github.com>
2020-11-16 07:19:41 +00:00
dependabot[bot]
d30b2b7ec8 Bump django-autocomplete-light from 3.5.1 to 3.8.1
Bumps [django-autocomplete-light](https://github.com/yourlabs/django-autocomplete-light) from 3.5.1 to 3.8.1.
- [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.5.1...3.8.1)

Signed-off-by: dependabot[bot] <support@github.com>
2020-11-16 07:19:35 +00:00
Sebastian Markgraf
c4fbad614e Include random in filtermixin 2020-11-14 20:20:30 +01:00
vabene1111
4c92a4b39c fixed shopping list recipe search 2020-11-14 11:20:43 +01:00
vabene1111
3dad5132bb Merge pull request #219 from vabene1111/dependabot/pip/markdown-3.3.3
Bump markdown from 3.2.2 to 3.3.3
2020-11-14 11:16:55 +01:00
vabene1111
7d7890445e Merge pull request #220 from vabene1111/dependabot/pip/django-3.1.3
Bump django from 3.1.1 to 3.1.3
2020-11-14 11:16:49 +01:00
vabene1111
cea015f23d Merge pull request #221 from vabene1111/dependabot/pip/drf-writable-nested-0.6.2
Bump drf-writable-nested from 0.6.1 to 0.6.2
2020-11-14 11:16:43 +01:00
vabene1111
3e8610912e Merge pull request #223 from vabene1111/dependabot/pip/django-tables2-2.3.3
Bump django-tables2 from 2.3.1 to 2.3.3
2020-11-14 11:16:38 +01:00
vabene1111
ba80ca42e6 Merge pull request #226 from vabene1111/dependabot/pip/requests-2.25.0
Bump requests from 2.23.0 to 2.25.0
2020-11-14 11:16:32 +01:00
vabene1111
c413db5460 fixed english typo 2020-11-14 11:16:01 +01:00
vabene1111
0e319ff293 fixed typo in german transaltion 2020-11-14 11:15:21 +01:00
vabene1111
88e3b22dcd Merge pull request #228 from vabene1111/translations_cookbook-locale-en-lc-messages-django-po--develop_nl
Translate '/cookbook/locale/en/LC_MESSAGES/django.po' in 'nl'
2020-11-14 11:02:53 +01:00
transifex-integration[bot]
19e2094ecd Apply translations in nl
translation completed for the source file '/cookbook/locale/en/LC_MESSAGES/django.po'
on the 'nl' language.
2020-11-13 22:21:02 +00:00
dependabot[bot]
215989682b Bump requests from 2.23.0 to 2.25.0
Bumps [requests](https://github.com/psf/requests) from 2.23.0 to 2.25.0.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/master/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.23.0...v2.25.0)

Signed-off-by: dependabot[bot] <support@github.com>
2020-11-12 06:37:40 +00:00
Sebastian Markgraf
2f038edf8c Fix missing string literals for translations. 2020-11-06 17:24:20 +01:00
Sebastian Markgraf
a754002f4e Revert approach to fixed nutritional values. 2020-11-06 17:22:21 +01:00
dependabot[bot]
1af2211010 Bump django-tables2 from 2.3.1 to 2.3.3
Bumps [django-tables2](https://github.com/jieter/django-tables2) from 2.3.1 to 2.3.3.
- [Release notes](https://github.com/jieter/django-tables2/releases)
- [Changelog](https://github.com/jieter/django-tables2/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jieter/django-tables2/compare/v2.3.1...v2.3.3)

Signed-off-by: dependabot[bot] <support@github.com>
2020-11-05 06:32:16 +00:00
dependabot[bot]
724d57ecd7 Bump django from 3.1.1 to 3.1.3
Bumps [django](https://github.com/django/django) from 3.1.1 to 3.1.3.
- [Release notes](https://github.com/django/django/releases)
- [Commits](https://github.com/django/django/compare/3.1.1...3.1.3)

Signed-off-by: dependabot[bot] <support@github.com>
2020-11-05 06:32:15 +00:00
dependabot[bot]
4b04fada51 Bump drf-writable-nested from 0.6.1 to 0.6.2
Bumps [drf-writable-nested](https://github.com/beda-software/drf-writable-nested) from 0.6.1 to 0.6.2.
- [Release notes](https://github.com/beda-software/drf-writable-nested/releases)
- [Changelog](https://github.com/beda-software/drf-writable-nested/blob/master/CHANGELOG.md)
- [Commits](https://github.com/beda-software/drf-writable-nested/compare/v0.6.1...v0.6.2)

Signed-off-by: dependabot[bot] <support@github.com>
2020-11-05 06:32:15 +00:00
dependabot[bot]
4ad7043f91 Bump markdown from 3.2.2 to 3.3.3
Bumps [markdown](https://github.com/Python-Markdown/markdown) from 3.2.2 to 3.3.3.
- [Release notes](https://github.com/Python-Markdown/markdown/releases)
- [Commits](https://github.com/Python-Markdown/markdown/compare/3.2.2...3.3.3)

Signed-off-by: dependabot[bot] <support@github.com>
2020-11-05 06:32:13 +00:00
vabene1111
4dfda4439c re added standard filter to recipe api 2020-11-04 16:53:49 +01:00
vabene1111
591d185b9d improved random recipe queryset function 2020-11-04 15:09:35 +01:00
vabene1111
8d582548bd Merge pull request #213 from tourn/random-recipes2
Show random recipes in meal planner
2020-11-04 15:06:50 +01:00
vabene1111
209924e5b3 Merge pull request #191 from vabene1111/dependabot/pip/psycopg2-binary-2.8.6
Bump psycopg2-binary from 2.8.5 to 2.8.6
2020-11-04 15:01:52 +01:00
dependabot[bot]
7e3e2aadaf Bump psycopg2-binary from 2.8.5 to 2.8.6
Bumps [psycopg2-binary](https://github.com/psycopg/psycopg2) from 2.8.5 to 2.8.6.
- [Release notes](https://github.com/psycopg/psycopg2/releases)
- [Changelog](https://github.com/psycopg/psycopg2/blob/master/NEWS)
- [Commits](https://github.com/psycopg/psycopg2/commits)

Signed-off-by: dependabot[bot] <support@github.com>
2020-11-04 14:01:23 +00:00
vabene1111
0930e615f0 Merge pull request #192 from vabene1111/dependabot/pip/simplejson-3.17.2
Bump simplejson from 3.17.0 to 3.17.2
2020-11-04 15:00:59 +01:00
vabene1111
21c759b127 Merge pull request #193 from vabene1111/dependabot/pip/whitenoise-5.2.0
Bump whitenoise from 5.1.0 to 5.2.0
2020-11-04 15:00:46 +01:00
vabene1111
7d1a83440d Merge pull request #195 from vabene1111/dependabot/pip/bleach-3.2.1
Bump bleach from 3.1.5 to 3.2.1
2020-11-04 15:00:37 +01:00
vabene1111
2d75b303fd Merge pull request #210 from vabene1111/dependabot/pip/python-dotenv-0.15.0
Bump python-dotenv from 0.13.0 to 0.15.0
2020-11-04 15:00:26 +01:00
vabene1111
a1b15d46b8 fixed note only meal plan entries not working 2020-11-04 14:58:31 +01:00
tourn
69a6edee99 Show random recipes in meal planner 2020-11-03 16:46:31 +01:00
vabene1111
0ac23b4e3a Merge pull request #211 from Tmaxxrox97/develop
Username field consistency
2020-10-29 17:00:27 +01:00
Tmaxxrox97
085e777ee0 Changed Username field label from "Name" to "Username" 2020-10-29 09:52:05 -05:00
Tmaxxrox97
c31df3f7a6 Merge pull request #1 from vabene1111/develop
Update repo
2020-10-29 07:58:32 -05:00
dependabot[bot]
98e2c0acaf Bump python-dotenv from 0.13.0 to 0.15.0
Bumps [python-dotenv](https://github.com/theskumar/python-dotenv) from 0.13.0 to 0.15.0.
- [Release notes](https://github.com/theskumar/python-dotenv/releases)
- [Changelog](https://github.com/theskumar/python-dotenv/blob/master/CHANGELOG.md)
- [Commits](https://github.com/theskumar/python-dotenv/compare/v0.13.0...v0.15.0)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-29 06:36:05 +00:00
vabene1111
1509b8243b Update docker-publish-release.yml 2020-10-24 17:19:23 +02:00
vabene1111
e427d8b714 donst export checked items 2020-10-21 20:35:26 +02:00
vabene1111
89b8dbe57f added online check to prevent message spam 2020-10-20 23:08:30 +02:00
vabene1111
f2a17fe3bb fixed shopping list GET param regex 2020-10-20 22:51:19 +02:00
vabene1111
14e0dae6e3 compiled translations 2020-10-20 21:23:37 +02:00
vabene1111
733c281dc8 Merge pull request #200 from vabene1111/translations_cookbook-locale-en-lc-messages-django-po--develop_de
Translate '/cookbook/locale/en/LC_MESSAGES/django.po' in 'de'
2020-10-20 21:22:36 +02:00
transifex-integration[bot]
c542f3154e Apply translations in de
translation completed for the source file '/cookbook/locale/en/LC_MESSAGES/django.po'
on the 'de' language.
2020-10-20 19:22:06 +00:00
vabene1111
c6f40db7e3 shopping list tweaks 2020-10-20 20:54:15 +02:00
Sebastian Markgraf
31dabd4757 Add nutritions output 2020-10-18 17:31:56 +02:00
Sebastian Markgraf
7a89015ac5 Add migrations. 2020-10-16 23:59:19 +02:00
Sebastian Markgraf
2b1cde2efc Add basic output for nutritions. 2020-10-16 23:44:18 +02:00
vabene1111
cb3b8c931e fixed broken defautl share 2020-10-16 00:11:41 +02:00
vabene1111
72bea14c3a added sharing 2020-10-16 00:01:14 +02:00
vabene1111
cd46203d55 added permission classes for sharing + tests 2020-10-15 23:41:38 +02:00
Sebastian Markgraf
368d631602 Add nutrition to model. 2020-10-15 22:03:25 +02:00
vabene1111
5c1cecb7e7 fixed saving null units 2020-10-15 21:37:15 +02:00
vabene1111
526cf13b8d increased max text area size of instructions 2020-10-15 21:27:41 +02:00
vabene1111
3c21baf876 fixed create shopping list from recipe 2020-10-15 21:26:24 +02:00
vabene1111
2d2c38517c fixed null units breaking shopping lists 2020-10-15 21:19:49 +02:00
vabene1111
163b259bd1 fixed migrations for postgres 2020-10-14 22:05:49 +02:00
dependabot[bot]
24ced66c69 Bump bleach from 3.1.5 to 3.2.1
Bumps [bleach](https://github.com/mozilla/bleach) from 3.1.5 to 3.2.1.
- [Release notes](https://github.com/mozilla/bleach/releases)
- [Changelog](https://github.com/mozilla/bleach/blob/master/CHANGES)
- [Commits](https://github.com/mozilla/bleach/compare/v3.1.5...v3.2.1)

Signed-off-by: dependabot[bot] <support@github.com>
2020-09-30 06:25:32 +00:00
dependabot[bot]
6c1982cccb Bump simplejson from 3.17.0 to 3.17.2
Bumps [simplejson](https://github.com/simplejson/simplejson) from 3.17.0 to 3.17.2.
- [Release notes](https://github.com/simplejson/simplejson/releases)
- [Changelog](https://github.com/simplejson/simplejson/blob/master/CHANGES.txt)
- [Commits](https://github.com/simplejson/simplejson/compare/v3.17.0...v3.17.2)

Signed-off-by: dependabot[bot] <support@github.com>
2020-09-30 06:25:31 +00:00
dependabot[bot]
3bae7283d1 Bump whitenoise from 5.1.0 to 5.2.0
Bumps [whitenoise](https://github.com/evansd/whitenoise) from 5.1.0 to 5.2.0.
- [Release notes](https://github.com/evansd/whitenoise/releases)
- [Changelog](https://github.com/evansd/whitenoise/blob/master/docs/changelog.rst)
- [Commits](https://github.com/evansd/whitenoise/compare/v5.1.0...v5.2.0)

Signed-off-by: dependabot[bot] <support@github.com>
2020-09-30 06:25:31 +00:00
vabene1111
0b458f7565 update source file as well 2020-09-29 19:44:46 +02:00
vabene1111
675f30126c updated base translation files 2020-09-29 19:38:58 +02:00
vabene1111
25b051323c shopping list basic sorting 2020-09-29 18:18:43 +02:00
vabene1111
697de3d9fc small mobile layout improvements 2020-09-29 14:19:17 +02:00
vabene1111
7bc09dfe89 finishes shopping lists 2020-09-29 14:15:18 +02:00
vabene1111
711dfbe55f cleanup import 2020-09-29 13:19:06 +02:00
vabene1111
76108c66c6 Merge pull request #189 from vabene1111/dependabot/pip/drf-writable-nested-0.6.1
Bump drf-writable-nested from 0.6.0 to 0.6.1
2020-09-29 12:56:31 +02:00
dependabot[bot]
db3c390d03 Bump drf-writable-nested from 0.6.0 to 0.6.1
Bumps [drf-writable-nested](https://github.com/beda-software/drf-writable-nested) from 0.6.0 to 0.6.1.
- [Release notes](https://github.com/beda-software/drf-writable-nested/releases)
- [Changelog](https://github.com/beda-software/drf-writable-nested/blob/master/CHANGELOG.md)
- [Commits](https://github.com/beda-software/drf-writable-nested/compare/v0.6.0...v0.6.1)

Signed-off-by: dependabot[bot] <support@github.com>
2020-09-29 10:56:26 +00:00
vabene1111
138fb14107 Merge pull request #188 from vabene1111/dependabot/pip/django-3.1.1
Bump django from 3.0.7 to 3.1.1
2020-09-29 12:56:19 +02:00
dependabot[bot]
17ebdd7711 Bump django from 3.0.7 to 3.1.1
Bumps [django](https://github.com/django/django) from 3.0.7 to 3.1.1.
- [Release notes](https://github.com/django/django/releases)
- [Commits](https://github.com/django/django/compare/3.0.7...3.1.1)

Signed-off-by: dependabot[bot] <support@github.com>
2020-09-29 10:56:07 +00:00
vabene1111
fc9a42029a Merge pull request #187 from vabene1111/dependabot/pip/beautifulsoup4-4.9.2
Bump beautifulsoup4 from 4.9.1 to 4.9.2
2020-09-29 12:55:35 +02:00
vabene1111
7d942d551a Merge pull request #186 from vabene1111/dependabot/pip/django-filter-2.4.0
Bump django-filter from 2.2.0 to 2.4.0
2020-09-29 12:55:25 +02:00
vabene1111
78c94f2b64 Merge pull request #185 from vabene1111/dependabot/pip/bleach-whitelist-0.0.11
Bump bleach-whitelist from 0.0.10 to 0.0.11
2020-09-29 12:55:15 +02:00
dependabot[bot]
b317d7ba29 Bump beautifulsoup4 from 4.9.1 to 4.9.2
Bumps [beautifulsoup4](http://www.crummy.com/software/BeautifulSoup/bs4/) from 4.9.1 to 4.9.2.

Signed-off-by: dependabot[bot] <support@github.com>
2020-09-29 10:48:54 +00:00
dependabot[bot]
71b8ddd1bf Bump django-filter from 2.2.0 to 2.4.0
Bumps [django-filter](https://github.com/carltongibson/django-filter) from 2.2.0 to 2.4.0.
- [Release notes](https://github.com/carltongibson/django-filter/releases)
- [Changelog](https://github.com/carltongibson/django-filter/blob/master/CHANGES.rst)
- [Commits](https://github.com/carltongibson/django-filter/compare/2.2.0...2.4.0)

Signed-off-by: dependabot[bot] <support@github.com>
2020-09-29 10:48:52 +00:00
dependabot[bot]
23de4d4239 Bump bleach-whitelist from 0.0.10 to 0.0.11
Bumps [bleach-whitelist](https://github.com/yourcelf/bleach-whitelist) from 0.0.10 to 0.0.11.
- [Release notes](https://github.com/yourcelf/bleach-whitelist/releases)
- [Commits](https://github.com/yourcelf/bleach-whitelist/commits)

Signed-off-by: dependabot[bot] <support@github.com>
2020-09-29 10:48:50 +00:00
vabene1111
4641b81f70 Create dependabot.yml 2020-09-29 12:48:28 +02:00
vabene1111
a9bad5e5f9 create shopping from mealplan 2020-09-29 12:41:59 +02:00
vabene1111
9f7106a325 shopping list fixes 2020-09-29 11:41:10 +02:00
vabene1111
73f13f56e1 added ability to display message to users (via admin) 2020-09-22 12:36:27 +02:00
vabene1111
312c364797 fixed wrongly changed permission check order 2020-09-22 12:19:30 +02:00
vabene1111
ad9b10c9c1 allow entry deletion 2020-09-22 12:17:22 +02:00
vabene1111
678cfaca12 fixed several shopping list issues 2020-09-22 12:01:11 +02:00
vabene1111
9b36f51d16 added .env examples 2020-09-22 09:42:58 +02:00
vabene1111
fa8389d783 Merge pull request #172 from stewartadam/bugfix/configurable-urls
Permit MEDIA_URL and STATIC_URL to be set from environment variables
2020-09-22 09:29:48 +02:00
vabene1111
30d766be77 fixed clearing amount in recipe edit would result in error 2020-09-22 09:09:52 +02:00
vabene1111
5e2dba7b04 added basic exporting 2020-09-22 00:32:42 +02:00
vabene1111
70df7c5307 improved autosync data efficency 2020-09-22 00:20:44 +02:00
vabene1111
f91d9fcfe2 autosync shopping list and settings 2020-09-21 23:54:46 +02:00
vabene1111
086a4aea47 basics of shopping list working 2020-09-21 23:05:58 +02:00
vabene1111
148ce2faef shopping list item checking 2020-09-21 22:55:52 +02:00
vabene1111
4827364e37 basic acceptable design 2020-09-21 22:16:19 +02:00
vabene1111
da958faf33 basic shopping list ui cleanup 2020-09-21 22:05:53 +02:00
vabene1111
f5117abcfb fixed shopping list multipliers and recipe names 2020-09-21 11:56:39 +02:00
vabene1111
df79c8f889 basic shopping list load and save 2020-09-15 16:51:20 +02:00
vabene1111
0ff65d35dc partial shopping list saving 2020-09-07 13:09:03 +02:00
vabene1111
8239dc3604 fixed unit creation typo 2020-09-07 12:27:29 +02:00
vabene1111
4a4d4b4486 shopping display seperation 2020-09-03 11:38:22 +02:00
vabene1111
34733a427f model __str__ methods 2020-09-01 21:37:33 +02:00
vabene1111
7f68bbd25d added link based signup 2020-09-01 21:35:37 +02:00
vabene1111
392ee73719 basics of invite link creation 2020-09-01 14:57:20 +02:00
vabene1111
2a0a85018a fixed import and validation errors 2020-09-01 13:26:58 +02:00
vabene1111
62868cd2b2 added note support for recipe import 2020-09-01 11:49:19 +02:00
vabene1111
4e92be3bbc fixed scrolling issue in internal recipe edit
related to bootstrap vue issue, waiting on proper fix
2020-09-01 11:39:46 +02:00
vabene1111
14c94bf7ab WIP shopping list 2020-09-01 11:31:29 +02:00
Stewart Adam
ce3148ac89 Permit MEDIA_URL and STATIC_URL to be set from environment variables (#143) 2020-08-30 16:39:43 -07:00
tourn
652b4bf2af Add serving count to recipe 2020-08-30 16:00:01 +02:00
vabene1111
bc39b53aad fixed typo 2020-08-27 10:06:53 +02:00
vabene1111
984192e479 basics of scaling 2020-08-26 21:41:04 +02:00
vabene1111
3c73b084cf super basic shopping list working 2020-08-26 21:11:20 +02:00
vabene1111
fc073124d4 Merge pull request #162 from LBBO/amount-without-unit
Show amounts even when unit is empty
2020-08-26 20:33:18 +02:00
Michael Kuckuk
f6fb07926e Show amounts even when unit is empty 2020-08-26 12:39:21 +02:00
vabene1111
90dddd34f3 removed test for invalid recipe as its no longer invalid due to parser improvements 2020-08-26 11:46:56 +02:00
vabene1111
0b948618f3 improved website parser 2020-08-26 11:37:59 +02:00
vabene1111
78be002134 Merge pull request #154 from Mwoua/develop
Instructions for manual installation
2020-08-21 18:09:20 +02:00
Mwoua
7acd72ff3a Clone master instead of getting release 2020-08-21 09:12:57 -04:00
Mwoua
c5edeb7e8f Missing alias for media files 2020-08-19 18:09:23 -04:00
David Lévy
5d5c5a8597 Instructions for manual installation 2020-08-19 17:32:28 -04:00
David Lévy
03bdcdf9b4 Fix markdown rules 2020-08-18 16:32:00 -04:00
vabene1111
16d755fd76 Merge pull request #150 from vabene1111/translations_cookbook-locale-en-lc-messages-django-po--develop_fr
Translate '/cookbook/locale/en/LC_MESSAGES/django.po' in 'fr'
2020-08-12 11:24:17 +02:00
transifex-integration[bot]
587426e3d3 Apply translations in fr
translation completed for the source file '/cookbook/locale/en/LC_MESSAGES/django.po'
on the 'fr' language.
2020-08-11 15:26:15 +00:00
vabene1111
be55e034bf first parts of shopping rework 2020-08-11 15:24:12 +02:00
vabene1111
8055754455 shopping list basics 2020-08-11 12:17:12 +02:00
288 changed files with 45444 additions and 3709 deletions

View File

@@ -14,5 +14,4 @@ LICENSE
.idea
LICENSE.md
docs
nginx
update.sh

View File

@@ -5,31 +5,56 @@ DEBUG=0
# hosts the application can run under e.g. recipes.mydomain.com,cooking.mydomain.com,...
ALLOWED_HOSTS=*
# random secret key, use for example base64 /dev/urandom | head -c50 to generate one
# random secret key, use for example `base64 /dev/urandom | head -c50` to generate one
SECRET_KEY=
# your default timezone See https://timezonedb.com/time-zones for a list of timezones
TIMEZONE=Europe/Berlin
# add only a database password if you want to run with the default postgres, otherwise change settings accordingly
DB_ENGINE=django.db.backends.postgresql_psycopg2
DB_ENGINE=django.db.backends.postgresql
# DB_OPTIONS= {} # e.g. {"sslmode":"require"} to enable ssl
POSTGRES_HOST=db_recipes
POSTGRES_PORT=5432
POSTGRES_USER=djangodb
POSTGRES_USER=djangouser
POSTGRES_PASSWORD=
POSTGRES_DB=djangodb
# 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 staticfiles are stored at a different location uncomment and change accordingly
# STATIC_URL=/static/
# If mediafiles are stored at a different location uncomment and change accordingly
# 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
# allow authentication via reverse proxy (e.g. authelia), leave of if you dont know what you are doing
# docs: https://github.com/vabene1111/recipes/tree/develop/docs/docker/nginx-proxy%20with%20proxy%20authentication
# allow authentication via reverse proxy (e.g. authelia), leave off if you dont know what you are doing
# see docs for more information https://vabene1111.github.io/recipes/features/authentication/
# when unset: 0 (false)
REVERSE_PROXY_AUTH=0
# the default value for the user preference 'comments' (enable/disable commenting system)
# when unset: 1 (true)
COMMENT_PREF_DEFAULT=1
# allows you to setup OAuth providers
# see docs for more information https://vabene1111.github.io/recipes/features/authentication/
# SOCIAL_PROVIDERS = allauth.socialaccount.providers.github, allauth.socialaccount.providers.nextcloud,

11
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,11 @@
# 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
version: 2
updates:
- package-ecosystem: "pip" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "daily"

View File

@@ -22,6 +22,7 @@ jobs:
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: |
python3 manage.py test

View File

@@ -0,0 +1,26 @@
name: publish beta image docker
on:
push:
branches:
- 'beta'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Update version file
uses: DamianReeves/write-file-action@v1.0
with:
path: recipes/version.py
contents: |
VERSION_NUMBER = 'beta'
BUILD_REF = '${{ github.sha }}'
write-mode: overwrite
- name: Build and publish image
uses: ilteoood/docker_buildx@master
with:
publish: true
imageName: vabene1111/recipes
tag: beta
dockerHubUser: ${{ secrets.DOCKER_USERNAME }}
dockerHubPassword: ${{ secrets.DOCKER_PASSWORD }}

View File

@@ -11,7 +11,7 @@ jobs:
name: Build image job
steps:
- name: Checkout master
uses: actions/checkout@master#
uses: actions/checkout@master
- name: Get version number
id: get_version
run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//}

17
.github/workflows/docs.yml vendored Normal file
View File

@@ -0,0 +1,17 @@
name: Make Docs
on:
push:
branches:
- master
- develop
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
python-version: 3.x
- run: pip install mkdocs-material
- run: mkdocs gh-deploy --force

2
.gitignore vendored
View File

@@ -77,3 +77,5 @@ postgresql/
/docker-compose.override.yml
vue/node_modules
.vscode/

5
.idea/codeStyles/codeStyleConfig.xml generated Normal file
View File

@@ -0,0 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
</state>
</component>

View File

@@ -1,9 +1,13 @@
<component name="ProjectDictionaryState">
<dictionary name="vabene1111-PC">
<words>
<w>autosync</w>
<w>chowdown</w>
<w>csrftoken</w>
<w>gunicorn</w>
<w>ical</w>
<w>mealie</w>
<w>safron</w>
<w>traefik</w>
</words>
</dictionary>

4
.idea/recipes.iml generated
View File

@@ -20,10 +20,6 @@
</content>
<orderEntry type="jdk" jdkName="Python 3.8 (recipes)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="jquery-3.4.1" level="application" />
<orderEntry type="library" name="pretty-checkbox" level="application" />
<orderEntry type="library" name="pdf" level="application" />
<orderEntry type="library" name="pdf_viewer" level="application" />
</component>
<component name="TemplatesService">
<option name="TEMPLATE_CONFIGURATION" value="Django" />

31
.pre-commit-config.yaml Normal file
View File

@@ -0,0 +1,31 @@
# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
- repo: local
hooks:
- id: pre-commit-yarn-build
name: Build javascript files
entry: yarn --cwd ./vue build
always_run: true
language: system
types: [ python ]
pass_filenames: false
#- id: pre-commit-django-migrations
# name: Check django migrations
# entry: bash -c './venv/bin/activate && ./manage.py makemigrations --check'
# language: system
# types: [ python ]
# pass_filenames: false
# - id: pre-commit-django-make-messages
# name: Make messages if necessary
# entry: ./manage.py makemessages -i venv -a
# language: system
# types: [ python ]
# pass_filenames: false
# - id: pre-commit-django-compile-messages
# name: Compile messages if necessary
# entry: ./manage.py compilemessages -i venv
# language: system
# types: [ python ]
# pass_filenames: false

View File

@@ -1,11 +1,63 @@
Many thanks to everyone who contributed to this project!
Many thanks to everyone who contributed to this project! If you add something or help out feel free to add yourself
to this list.
## Code/Features
Please have a look at the [list of pull requests](https://github.com/vabene1111/recipes/pulls) for
a complete list of contributions.
Below are some of the larger contributions made yet.
- @tourn provided the serving feature and **several** other improvements!
- @l0c4lh057 provided a much improved ingredient text parser in [#277](https://github.com/vabene1111/recipes/pull/277)
- @sebimarkgraf added nutritional information [#199](https://github.com/vabene1111/recipes/pull/199)
- @cazier added reverse proxy authentication [#88](https://github.com/vabene1111/recipes/pull/88)
## Translations
### Catalan
[Rubenix](https://www.transifex.com/user/profile/rubenix/)
### Dutch
[D0T1X](https://www.transifex.com/user/profile/D0T1X/)
[D0T1X](https://www.transifex.com/user/profile/D0T1X/)
[ikbenfrank](https://www.transifex.com/user/profile/ikbenfrank/)
[kampsj](https://www.transifex.com/user/profile/kampsj/)
### French
[jt117](https://www.transifex.com/user/profile/jt117/)
[nerdinator](https://www.transifex.com/user/profile/nerdinator/)
[nerdinator](https://www.transifex.com/user/profile/nerdinator/)
[agaume](https://www.transifex.com/user/profile/agaume/)
### German
[eTaurus](https://www.transifex.com/user/profile/eTaurus/)
[l0c4lh057](https://www.transifex.com/user/profile/l0c4lh057/)
### Hungarian
[igazka](https://www.transifex.com/user/profile/igazka/)
### Italian
[SK3LA](https://www.transifex.com/user/profile/SK3LA/)
[auanasgheps](https://www.transifex.com/user/profile/auanasgheps/)
### Latvian
[melkypie](https://github.com/melkypie)
### Portuguese
[hds](https://www.transifex.com/user/profile/hds/)
[mlopezifu](https://www.transifex.com/user/profile/mlopezifu/)
[stormsz](https://www.transifex.com/user/profile/stormsz/)
### Spanish
[albertocp](https://www.transifex.com/user/profile/albertocp/)
[alfa5](https://www.transifex.com/user/profile/alfa5/)
[mlopezifu](https://www.transifex.com/user/profile/mlopezifu/)
[sergio.laya](https://www.transifex.com/user/profile/sergio.laya/)
### Turkish
[batmanisnaked](https://www.transifex.com/user/profile/batmanisnaked/)
### Vietnamese
[vuongtrunghieu](https://www.transifex.com/user/profile/vuongtrunghieu/)

View File

@@ -7,11 +7,11 @@ EXPOSE 8080
RUN mkdir /opt/recipes
WORKDIR /opt/recipes
COPY . ./
RUN chmod +x boot.sh setup.sh
RUN ln -s /opt/recipes/setup.sh /usr/local/bin/createsuperuser
RUN chmod +x boot.sh
RUN apk add --no-cache --virtual .build-deps gcc musl-dev postgresql-dev zlib-dev jpeg-dev && \
RUN apk add --no-cache --virtual .build-deps gcc musl-dev postgresql-dev zlib-dev jpeg-dev libressl-dev libffi-dev cargo && \
python -m venv venv && \
/opt/recipes/venv/bin/python -m pip install --upgrade pip && \
venv/bin/pip install -r requirements.txt --no-cache-dir &&\
apk --purge del .build-deps

121
README.md
View File

@@ -1,81 +1,70 @@
# Recipes ![CI](https://github.com/vabene1111/recipes/workflows/Continous%20Integration/badge.svg?branch=develop)
Recipes is a Django application to manage, tag and search recipes using either built in models or external storage providers hosting PDF's, Images or other files.
<h1 align="center">
<br>
<a href="https://app.tandoor.dev"><img src="https://github.com/vabene1111/recipes/raw/develop/docs/logo_color.svg" height="256px" width="256px"></a>
<br>
Tandoor Recipes
<br>
</h1>
<h4 align="center">The recipe manager that allows you to manage your ever growing collection of digital recipes.</h4>
<p align="center">
<img src="https://github.com/vabene1111/recipes/workflows/Continous%20Integration/badge.svg?branch=develop" >
<img src="https://img.shields.io/github/stars/vabene1111/recipes" >
<img src="https://img.shields.io/github/forks/vabene1111/recipes" >
<img src="https://img.shields.io/docker/pulls/vabene1111/recipes" >
</p>
<p align="center">
<a href="https://docs.tandoor.dev/install/docker/" target="_blank" rel="noopener noreferrer">Installation</a> •
<a href="https://docs.tandoor.dev/" target="_blank" rel="noopener noreferrer">Documentation</a> •
<a href="https://app.tandoor.dev/" target="_blank" rel="noopener noreferrer">Demo</a>
</p>
![Preview](docs/preview.png)
[More Screenshots](https://imgur.com/a/V01151p)
## Features
### Features
- 📦 **Sync** files with Dropbox and Nextcloud (more can easily be added)
- 🔍 Powerful **search** with Djangos [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
- 📄 **Create recipes** locally within a nice, standardized web interface
- ⬇️ **Import recipes** from thousands of websites supporting [ld+json or microdata](https://schema.org/Recipe)
- 📱 Optimized for use on **mobile** devices like phones and tablets
- 🛒 Generate **shopping** lists from recipes
- 📆 Create a **Plan** on what to eat when
- 👪 **Share** recipes with friends and comment on them to suggest or remember changes you made
- ➗ automatically convert decimal units to **fractions** for those who like this
- 🐳 Easy setup with **Docker** and included examples for Kubernetes, Unraid and Synology
- 🎨 Customize your interface with **themes**
- ✉️ Export and import recipes from other users
- 🌍 localized in many languages thanks to the awesome community
- Many more like recipe scaling, image compression, cookbooks, printing views, ...
- :package: **Sync** files with Dropbox and Nextcloud (more can easily be added)
- :mag: Powerful **search** with Djangos [TrigramSimilarity](https://docs.djangoproject.com/en/3.0/ref/contrib/postgres/search/#trigram-similarity)
- :label: Create and search for **tags**, assign them in batch to all files matching certain filters
- :page_facing_up: **Create recipes** locally within a nice, standardized web interface
- :arrow_down: **Import recipes** from thousands of websites supporting [ld+json or microdata](https://schema.org/Recipe)
- :iphone: Optimized for use on **mobile** devices like phones and tablets
- :shopping_cart: Generate **shopping** lists from recipes
- :calendar: Create a **Plan** on what to eat when
- :family: **Share** recipes with friends and comment on them to suggest or remember changes you made
- :whale: Easy setup with **Docker**
- :art: Customize your interface with **themes**
- :envelope: Export and import recipes from other users
- :heavy_plus_sign: Many more like recipe scaling, image compression, cookbooks, printing views, ...
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 a public page.
Some Documentation can be found [here](https://github.com/vabene1111/recipes/wiki)
# Installation
The docker image (`vabene1111/recipes`) simply exposes the application on port `8080`. You may choose any preferred installation method, the following are just examples to make it easier.
### Docker-Compose
2. Choose one of the included configurations [here](docs/docker).
2. Download the environment (config) file template and fill it out `wget https://raw.githubusercontent.com/vabene1111/recipes/develop/.env.template -O .env `
3. Start the container `docker-compose up -d`
4. Open the page to create the first user. Alternatively use `docker-compose exec web_recipes createsuperuser`
### Manual
**Python >= 3.8** is required to run this!
Copy `.env.template` to `.env` and fill in the missing values accordingly.
Make sure all variables are available to whatever serves your application.
Otherwise simply follow the instructions for any django based deployment
(for example [this one](http://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html)).
## Updating
While intermediate updates can be skipped when updating please make sure to **read the release notes** in case some special action is required to update.
0. Before updating it is recommended to **create a backup!**
1. Stop the container using `docker-compose down`
2. Pull the latest image using `docker-compose pull`
3. Start the container again using `docker-compose up -d`
## Kubernetes
You can find a basic kubernetes setup [here](docs/k8s/). Please see the README in the folder for more detail.
## Contributing
Pull Requests and ideas are welcome, feel free to contribute in any way.
For any questions on how to work with django please refer to their excellent [documentation](https://www.djangoproject.com/start/).
### Translating
There is a [transifex project](https://www.transifex.com/django-recipes/django-cookbook/) project to enable community driven translations. If you want to contribute a new language or help maintain an already existing one feel free to create a transifex account (using the link above) and request to join the project.
It is also possible to provide the translations directly by creating a new language using `manage.py makemessages -l <language_code> -i venv`. Once finished simply open a PR with the changed files.
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
a public page.
Documentation can be found [here](https://docs.tandoor.dev/).
While this application has been around for a while and is actively used by many (including myself), it is still considered
**beta** software that has a lot of rough edges and unpolished parts.
## License
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 an
[common clause](https://commonsclause.com/) selling exception. See [LICENSE.md](https://github.com/vabene1111/recipes/blob/develop/LICENSE.md) for details.
**Reasoning**
> NOTE: There appears to be a whole range of legal issues with licensing anything else then 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.
#### This software and **all** its features are and will always be free for everyone to use and enjoy.
**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.
The reason for the selling exception is that a significant amount of time was spend over multiple years to develop this software.
A payed hosted version which will be identical in features and code base to the software offered in this repository will
likely be released in the future (including all features needed to sell a hosted version as they might also be useful for personal use).
This will not only benefit me personally but also everyone who self-hosts this software as any profits made trough selling the hosted option
This will not only benefit me personally but also everyone who self-hosts this software as any profits made trough selling the hosted option
allow me to spend more time developing and improving the software for everyone. Selling exceptions are [approved by Richard Stallman](http://www.gnu.org/philosophy/selling-exceptions.en.html) and the
common clause license is very permissive (see the [FAQ](https://commonsclause.com/)).
common clause license is very permissive (see the [FAQ](https://commonsclause.com/)).

10
SECURITY.md Normal file
View File

@@ -0,0 +1,10 @@
# Security Policy
## Supported Versions
Since this software is still considered beta/WIP support is always only given for the latest version. There are no backports of security or any other fixes.
## Reporting a Vulnerability
Please open a normal public issue if you have any security related concerns. If you feel like the issue should not be discussed in
public just open a generic issue and we will discuss further communitcation there (since GitHub does not allow everyone to create a security advisory :/).

View File

@@ -3,6 +3,7 @@ source venv/bin/activate
echo "Updating database"
python manage.py migrate
python manage.py collectstatic_js_reverse
python manage.py collectstatic --noinput
echo "Done"

View File

@@ -1,9 +1,25 @@
from django.contrib import admin
from .models import *
from .models import (Comment, CookLog, Food, Ingredient, InviteLink, Keyword,
MealPlan, MealType, NutritionInformation, Recipe,
RecipeBook, RecipeBookEntry, RecipeImport, ShareLink,
ShoppingList, ShoppingListEntry, ShoppingListRecipe,
Space, Step, Storage, Sync, SyncLog, Unit, UserPreference,
ViewLog, Supermarket, SupermarketCategory, SupermarketCategoryRelation)
class SpaceAdmin(admin.ModelAdmin):
list_display = ('name', 'message')
admin.site.register(Space, SpaceAdmin)
class UserPreferenceAdmin(admin.ModelAdmin):
list_display = ('name', 'theme', 'nav_color', 'default_page', 'search_style', 'comments')
list_display = (
'name', 'theme', 'nav_color',
'default_page', 'search_style', 'comments'
)
@staticmethod
def name(obj):
@@ -27,6 +43,18 @@ class SyncAdmin(admin.ModelAdmin):
admin.site.register(Sync, SyncAdmin)
class SupermarketCategoryInline(admin.TabularInline):
model = SupermarketCategoryRelation
class SupermarketAdmin(admin.ModelAdmin):
inlines = (SupermarketCategoryInline,)
admin.site.register(Supermarket, SupermarketAdmin)
admin.site.register(SupermarketCategory)
class SyncLogAdmin(admin.ModelAdmin):
list_display = ('sync', 'status', 'msg', 'created_at')
@@ -125,6 +153,16 @@ class ViewLogAdmin(admin.ModelAdmin):
admin.site.register(ViewLog, ViewLogAdmin)
class InviteLinkAdmin(admin.ModelAdmin):
list_display = (
'username', 'group', 'valid_until',
'created_by', 'created_at', 'used_by'
)
admin.site.register(InviteLink, InviteLinkAdmin)
class CookLogAdmin(admin.ModelAdmin):
list_display = ('recipe', 'created_by', 'created_at', 'rating', 'servings')
@@ -132,8 +170,36 @@ class CookLogAdmin(admin.ModelAdmin):
admin.site.register(CookLog, CookLogAdmin)
class ShoppingListRecipeAdmin(admin.ModelAdmin):
list_display = ('id', 'recipe', 'servings')
admin.site.register(ShoppingListRecipe, ShoppingListRecipeAdmin)
class ShoppingListEntryAdmin(admin.ModelAdmin):
list_display = ('id', 'food', 'unit', 'list_recipe', 'checked')
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',)
admin.site.register(ShareLink, ShareLinkAdmin)
class NutritionInformationAdmin(admin.ModelAdmin):
list_display = ('id',)
admin.site.register(NutritionInformation, NutritionInformationAdmin)

View File

@@ -1,18 +1,26 @@
import django_filters
from django.conf import settings
from django.contrib.postgres.search import TrigramSimilarity
from django.db.models import Q
from cookbook.forms import MultiSelectWidget
from cookbook.models import Recipe, Keyword, Food
from django.conf import settings
from django.utils.translation import gettext as _
from cookbook.forms import MultiSelectWidget
from cookbook.models import Food, Keyword, Recipe, ShoppingList
class RecipeFilter(django_filters.FilterSet):
name = django_filters.CharFilter(method='filter_name')
keywords = django_filters.ModelMultipleChoiceFilter(queryset=Keyword.objects.all(), widget=MultiSelectWidget,
method='filter_keywords')
foods = django_filters.ModelMultipleChoiceFilter(queryset=Food.objects.all(), widget=MultiSelectWidget,
method='filter_foods', label=_('Ingredients'))
keywords = django_filters.ModelMultipleChoiceFilter(
queryset=Keyword.objects.all(),
widget=MultiSelectWidget,
method='filter_keywords'
)
foods = django_filters.ModelMultipleChoiceFilter(
queryset=Food.objects.all(),
widget=MultiSelectWidget,
method='filter_foods',
label=_('Ingredients')
)
@staticmethod
def filter_keywords(queryset, name, value):
@@ -27,16 +35,20 @@ class RecipeFilter(django_filters.FilterSet):
if not name == 'foods':
return queryset
for x in value:
queryset = queryset.filter(steps__ingredients__food__name=x).distinct()
queryset = queryset.filter(
steps__ingredients__food__name=x
).distinct()
return queryset
@staticmethod
def filter_name(queryset, name, value):
if not name == 'name':
return queryset
if settings.DATABASES['default']['ENGINE'] == 'django.db.backends.postgresql_psycopg2':
queryset = queryset.annotate(similarity=TrigramSimilarity('name', value), ).filter(
Q(similarity__gt=0.1) | Q(name__icontains=value)).order_by('-similarity')
if settings.DATABASES['default']['ENGINE'] == 'django.db.backends.postgresql_psycopg2': # noqa: E501
queryset = queryset \
.annotate(similarity=TrigramSimilarity('name', value), ) \
.filter(Q(similarity__gt=0.1) | Q(name__unaccent__icontains=value)) \
.order_by('-similarity')
else:
queryset = queryset.filter(name__icontains=value)
return queryset
@@ -52,3 +64,16 @@ class IngredientFilter(django_filters.FilterSet):
class Meta:
model = Food
fields = ['name']
class ShoppingListFilter(django_filters.FilterSet):
def __init__(self, data=None, *args, **kwargs):
if data is not None:
data = data.copy()
data.setdefault("finished", False)
super(ShoppingListFilter, self).__init__(data, *args, **kwargs)
class Meta:
model = ShoppingList
fields = ['finished']

View File

@@ -1,10 +1,11 @@
from django import forms
from django.forms import widgets
from django.urls import reverse, reverse_lazy
from django.utils.translation import gettext as _
from django.utils.translation import gettext_lazy as _
from emoji_picker.widgets import EmojiPickerTextInput
from .models import *
from .models import (Comment, Food, InviteLink, Keyword, MealPlan, Recipe,
RecipeBook, RecipeBookEntry, Storage, Sync, Unit, User,
UserPreference)
class SelectWidget(widgets.Select):
@@ -17,7 +18,8 @@ class MultiSelectWidget(widgets.SelectMultiple):
js = ('custom/js/form_multiselect.js',)
# yes there are some stupid browsers that still dont support this but i dont support people using these browsers
# Yes there are some stupid browsers that still dont support this but
# I dont support people using these browsers.
class DateWidget(forms.DateInput):
input_type = 'date'
@@ -31,15 +33,26 @@ class UserPreferenceForm(forms.ModelForm):
class Meta:
model = UserPreference
fields = ('default_unit', 'theme', 'nav_color', 'default_page', 'show_recent', 'search_style', 'plan_share', 'ingredient_decimals', 'comments')
fields = (
'default_unit', 'use_fractions', 'theme', 'nav_color',
'sticky_navbar', 'default_page', 'show_recent', 'search_style',
'plan_share', 'ingredient_decimals', 'shopping_auto_sync',
'comments'
)
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.'),
'plan_share': _('Default user to share newly created meal plan entries with.'),
'show_recent': _('Show recently viewed recipes on search page.'),
'ingredient_decimals': _('Number of decimals to round ingredients.'),
'comments': _('If you want to be able to create and see comments underneath recipes.')
'nav_color': _('Color of the top navigation bar. Not all colors work with all themes, just try them out!'), # noqa: E501
'default_unit': _('Default Unit to be used when inserting a new ingredient into a recipe.'), # noqa: E501
'use_fractions': _('Enables support for fractions in ingredient amounts (e.g. convert decimals to fractions automatically)'), # noqa: E501
'plan_share': _('Users with whom newly created meal plan/shopping list entries should be shared by default.'), # noqa: E501
'show_recent': _('Show recently viewed recipes on search page.'), # noqa: E501
'ingredient_decimals': _('Number of decimals to round ingredients.'), # noqa: E501
'comments': _('If you want to be able to create and see comments underneath recipes.'), # noqa: E501
'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 ' # noqa: E501
'of mobile data. If lower than instance limit it is reset when saving.' # noqa: E501
),
'sticky_navbar': _('Makes the navbar stick to the top of the page.') # noqa: E501
}
widgets = {
@@ -55,18 +68,25 @@ class UserNameForm(forms.ModelForm):
fields = ('first_name', 'last_name')
help_texts = {
'first_name': _('Both fields are optional. If none are given the username will be displayed instead')
'first_name': _('Both fields are optional. If none are given the username will be displayed instead') # noqa: E501
}
class ExternalRecipeForm(forms.ModelForm):
file_path = forms.CharField(disabled=True, required=False)
storage = forms.ModelChoiceField(queryset=Storage.objects.all(), disabled=True, required=False)
storage = forms.ModelChoiceField(
queryset=Storage.objects.all(),
disabled=True,
required=False
)
file_uid = forms.CharField(disabled=True, required=False)
class Meta:
model = Recipe
fields = ('name', 'keywords', 'working_time', 'waiting_time', 'file_path', 'storage', 'file_uid')
fields = (
'name', 'keywords', 'description', 'servings', 'working_time', 'waiting_time',
'file_path', 'storage', 'file_uid'
)
labels = {
'name': _('Name'),
@@ -84,13 +104,17 @@ class InternalRecipeForm(forms.ModelForm):
class Meta:
model = Recipe
fields = ('name', 'image', 'working_time', 'waiting_time', 'keywords')
fields = (
'name', 'image', 'working_time',
'waiting_time', 'servings', 'keywords'
)
labels = {
'name': _('Name'),
'keywords': _('Keywords'),
'working_time': _('Preparation time in minutes'),
'waiting_time': _('Waiting time (cooking/baking) in minutes'),
'servings': _('Number of servings'),
}
widgets = {'keywords': MultiSelectWidget}
@@ -101,29 +125,32 @@ class ShoppingForm(forms.Form):
widget=MultiSelectWidget
)
markdown_format = forms.BooleanField(
help_text=_('Include <code>- [ ]</code> in list for easier usage in markdown based documents.'),
help_text=_('Include <code>- [ ]</code> in list for easier usage in markdown based documents.'), # noqa: E501
required=False,
initial=False
)
class ExportForm(forms.Form):
recipe = forms.ModelChoiceField(
queryset=Recipe.objects.filter(internal=True).all(),
widget=SelectWidget
)
image = forms.BooleanField(
help_text=_('Export Base64 encoded image?'),
required=False
)
download = forms.BooleanField(
help_text=_('Download export directly or show on page?'),
required=False
)
class ImportExportBase(forms.Form):
DEFAULT = 'DEFAULT'
PAPRIKA = 'PAPRIKA'
NEXTCLOUD = 'NEXTCLOUD'
MEALIE = 'MEALIE'
CHOWDOWN = 'CHOWDOWN'
SAFRON = 'SAFRON'
type = forms.ChoiceField(choices=(
(DEFAULT, _('Default')), (PAPRIKA, 'Paprika'), (NEXTCLOUD, 'Nextcloud Cookbook'),
(MEALIE, 'Mealie'), (CHOWDOWN, 'Chowdown'), (SAFRON, 'Safron'),
))
class ImportForm(forms.Form):
recipe = forms.CharField(widget=forms.Textarea, help_text=_('Simply paste a JSON export into this textarea and click import.'))
class ImportForm(ImportExportBase):
files = forms.FileField(required=True, widget=forms.ClearableFileInput(attrs={'multiple': True}))
class ExportForm(ImportExportBase):
recipes = forms.ModelMultipleChoiceField(queryset=Recipe.objects.filter(internal=True).all(), widget=MultiSelectWidget)
class UnitMergeForm(forms.Form):
@@ -185,26 +212,36 @@ class KeywordForm(forms.ModelForm):
class FoodForm(forms.ModelForm):
class Meta:
model = Food
fields = ('name', 'recipe')
fields = ('name', 'description', 'ignore_shopping', 'recipe', 'supermarket_category')
widgets = {'recipe': SelectWidget}
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.') # noqa: E501
)
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.') # noqa: E501
)
class Meta:
model = Storage
fields = ('name', 'method', 'username', 'password', 'token', 'url')
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)'),
'url': _('Leave empty for dropbox and enter only base url for nextcloud (<code>/remote.php/webdav/</code> is added automatically)'), # noqa: E501
}
@@ -224,8 +261,11 @@ class SyncForm(forms.ModelForm):
class BatchEditForm(forms.Form):
search = forms.CharField(label=_('Search String'))
keywords = forms.ModelMultipleChoiceField(queryset=Keyword.objects.all().order_by('id'), required=False,
widget=MultiSelectWidget)
keywords = forms.ModelMultipleChoiceField(
queryset=Keyword.objects.all().order_by('id'),
required=False,
widget=MultiSelectWidget
)
class ImportRecipeForm(forms.ModelForm):
@@ -255,23 +295,49 @@ class MealPlanForm(forms.ModelForm):
cleaned_data = super(MealPlanForm, self).clean()
if cleaned_data['title'] == '' and cleaned_data['recipe'] is None:
raise forms.ValidationError(_('You must provide at least a recipe or a title.'))
raise forms.ValidationError(
_('You must provide at least a recipe or a title.')
)
return cleaned_data
class Meta:
model = MealPlan
fields = ('recipe', 'title', 'meal_type', 'note', 'date', 'shared')
fields = (
'recipe', 'title', 'meal_type', 'note',
'servings', 'date', 'shared'
)
help_texts = {
'shared': _('You can list default users to share recipes with in the settings.'),
'note': _('You can use markdown to format this field. See the <a href="/docs/markdown/">docs here</a>')
'shared': _('You can list default users to share recipes with in the settings.'), # noqa: E501
'note': _('You can use markdown to format this field. See the <a href="/docs/markdown/">docs here</a>') # noqa: E501
}
widgets = {'recipe': SelectWidget, 'date': DateWidget, 'shared': MultiSelectWidget}
widgets = {
'recipe': SelectWidget,
'date': DateWidget,
'shared': MultiSelectWidget
}
class SuperUserForm(forms.Form):
name = forms.CharField()
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 InviteLinkForm(forms.ModelForm):
class Meta:
model = InviteLink
fields = ('username', 'group', 'valid_until')
help_texts = {
'username': _('A username is not required, if left blank the new user can choose one.') # noqa: E501
}
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'}
)
)

View File

@@ -0,0 +1,19 @@
from django.conf import settings
from allauth.account.adapter import DefaultAccountAdapter
class AllAuthCustomAdapter(DefaultAccountAdapter):
def is_open_for_signup(self, request):
"""
Whether to allow sign ups.
"""
if request.resolver_match.view_name == 'account_signup':
return False
else:
return super(AllAuthCustomAdapter, self).is_open_for_signup(request)
# disable password reset for now
def send_mail(self, template_prefix, email, context):
pass

View File

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

View File

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

View File

@@ -0,0 +1,159 @@
import string
import unicodedata
def parse_fraction(x):
if len(x) == 1 and 'fraction' in unicodedata.decomposition(x):
frac_split = unicodedata.decomposition(x[-1:]).split()
return (float((frac_split[1]).replace('003', ''))
/ float((frac_split[3]).replace('003', '')))
else:
frac_split = x.split('/')
if not len(frac_split) == 2:
raise ValueError
try:
return int(frac_split[0]) / int(frac_split[1])
except ZeroDivisionError:
raise ValueError
def parse_amount(x):
amount = 0
unit = ''
did_check_frac = False
end = 0
while (
end < len(x)
and (
x[end] in string.digits
or (
(x[end] == '.' or x[end] == ',' or x[end] == '/')
and end + 1 < len(x)
and x[end + 1] in string.digits
)
)
):
end += 1
if end > 0:
if "/" in x[:end]:
amount = parse_fraction(x[:end])
else:
amount = float(x[:end].replace(',', '.'))
else:
amount = parse_fraction(x[0])
end += 1
did_check_frac = True
if end < len(x):
if did_check_frac:
unit = x[end:]
else:
try:
amount += parse_fraction(x[end])
unit = x[end + 1:]
except ValueError:
unit = x[end:]
return amount, unit
def parse_ingredient_with_comma(tokens):
ingredient = ''
note = ''
start = 0
# search for first occurrence of an argument ending in a comma
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 ingredient
ingredient = ' '.join(tokens)
else:
ingredient = ' '.join(tokens[:start + 1])[:-1]
note = ' '.join(tokens[start + 1:])
return ingredient, note
def parse_ingredient(tokens):
ingredient = ''
note = ''
if tokens[-1].endswith(')'):
# Check if the matching opening bracket is in the same token
if (not tokens[-1].startswith('(')) and ('(' in tokens[-1]):
return parse_ingredient_with_comma(tokens)
# last argument ends with closing bracket -> look for opening bracket
start = len(tokens) - 1
while not tokens[start].startswith('(') and not start == 0:
start -= 1
if start == 0:
# the whole list is wrapped in brackets -> assume it is an error (e.g. assumed first argument was the unit) # noqa: E501
raise ValueError
elif start < 0:
# no opening bracket anywhere -> just ignore the last bracket
ingredient, note = parse_ingredient_with_comma(tokens)
else:
# opening bracket found -> split in ingredient and note, remove brackets from note # noqa: E501
note = ' '.join(tokens[start:])[1:-1]
ingredient = ' '.join(tokens[:start])
else:
ingredient, note = parse_ingredient_with_comma(tokens)
return ingredient, note
def parse(x):
# initialize default values
amount = 0
unit = ''
ingredient = ''
note = ''
tokens = x.split()
if len(tokens) == 1:
# there only is one argument, that must be the ingredient
ingredient = tokens[0]
else:
try:
# try to parse first argument as amount
amount, unit = parse_amount(tokens[0])
# only try to parse second argument as amount if there are at least
# three arguments if it already has a unit there can't be
# a fraction for the amount
if len(tokens) > 2:
try:
if not unit == '':
# a unit is already found, no need to try the second argument for a fraction # noqa: E501
# probably not the best method to do it, but I didn't want to make an if check and paste the exact same thing in the else as already is in the except # noqa: E501
raise ValueError
# try to parse second argument as amount and add that, in case of '2 1/2' or '2 ½' # noqa: E501
amount += parse_fraction(tokens[1])
# assume that units can't end with a comma
if len(tokens) > 3 and not tokens[2].endswith(','):
# try to use third argument as unit and everything else as ingredient, use everything as ingredient if it fails # noqa: E501
try:
ingredient, note = parse_ingredient(tokens[3:])
unit = tokens[2]
except ValueError:
ingredient, note = parse_ingredient(tokens[2:])
else:
ingredient, note = parse_ingredient(tokens[2:])
except ValueError:
# assume that units can't end with a comma
if not tokens[1].endswith(','):
# try to use second argument as unit and everything else as ingredient, use everything as ingredient if it fails # noqa: E501
try:
ingredient, note = parse_ingredient(tokens[2:])
unit = tokens[1]
except ValueError:
ingredient, note = parse_ingredient(tokens[1:])
else:
ingredient, note = parse_ingredient(tokens[1:])
else:
# only two arguments, first one is the amount
# which means this is the ingredient
ingredient = tokens[1]
except ValueError:
try:
# can't parse first argument as amount
# -> no unit -> parse everything as ingredient
ingredient, note = parse_ingredient(tokens)
except ValueError:
ingredient = ' '.join(tokens[1:])
return amount, unit.strip(), ingredient.strip(), note.strip()

View File

@@ -1,5 +1,4 @@
import markdown
from markdown.treeprocessors import Treeprocessor
@@ -21,4 +20,8 @@ class StyleTreeprocessor(Treeprocessor):
class MarkdownFormatExtension(markdown.Extension):
def extendMarkdown(self, md, md_globals):
md.treeprocessors.register(StyleTreeprocessor(), 'StyleTreeprocessor', 10)
md.treeprocessors.register(
StyleTreeprocessor(),
'StyleTreeprocessor',
10
)

View File

@@ -1,4 +1,5 @@
"""A more liberal autolinker
"""
A more liberal autolinker
Inspired by Django's urlize function.
@@ -45,27 +46,30 @@ URLIZE_RE = '(%s)' % '|'.join([
r'[^(<\s]+\.(?:com|net|org)\b',
])
class UrlizePattern(markdown.inlinepatterns.Pattern):
""" Return a link Element given an autolink (`http://example/com`). """
def handleMatch(self, m):
url = m.group(2)
if url.startswith('<'):
url = url[1:-1]
text = url
if not url.split('://')[0] in ('http','https','ftp'):
if '@' in url and not '/' in url:
if not url.split('://')[0] in ('http', 'https', 'ftp'):
if '@' in url and '/' not in url:
url = 'mailto:' + url
else:
url = 'http://' + url
el = markdown.util.etree.Element("a")
el.set('href', url)
el.text = markdown.util.AtomicString(text)
return el
class UrlizeExtension(markdown.Extension):
""" Urlize Extension for Python-Markdown. """
@@ -73,9 +77,12 @@ class UrlizeExtension(markdown.Extension):
""" Replace autolink with UrlizePattern """
md.inlinePatterns['autolink'] = UrlizePattern(URLIZE_RE, md)
def makeExtension(*args, **kwargs):
return UrlizeExtension(*args, **kwargs)
if __name__ == "__main__":
import doctest
doctest.testmod()

View File

@@ -1,5 +1,4 @@
# Permission Config
from cookbook.helper.permission_helper import CustomIsUser, CustomIsOwner, CustomIsAdmin, CustomIsGuest
from cookbook.helper.permission_helper import CustomIsUser
class PermissionConfig:

View File

@@ -1,20 +1,16 @@
"""
Source: https://djangosnippets.org/snippets/1703/
"""
from cookbook.models import ShareLink
from django.contrib import messages
from django.contrib.auth.decorators import user_passes_test
from django.core.exceptions import ValidationError
from django.utils.translation import gettext as _
from django.http import HttpResponseRedirect
from django.urls import reverse_lazy, reverse
from django.urls import reverse, reverse_lazy
from django.utils.translation import gettext as _
from rest_framework import permissions
from rest_framework.permissions import SAFE_METHODS
from cookbook.models import ShareLink
# Helper Functions
def get_allowed_groups(groups_required):
"""
@@ -34,8 +30,8 @@ def get_allowed_groups(groups_required):
def has_group_permission(user, groups):
"""
Tests if a given user is member of a certain group (or any higher group)
Superusers always bypass permission checks. Unauthenticated users cant be member of any
group thus always return false.
Superusers always bypass permission checks.
Unauthenticated users cant be member of any group thus always return false.
:param user: django auth user object
:param groups: list or tuple of groups the user should be checked for
:return: True if user is in allowed groups, false otherwise
@@ -44,7 +40,8 @@ def has_group_permission(user, groups):
return False
groups_allowed = get_allowed_groups(groups)
if user.is_authenticated:
if user.is_superuser | bool(user.groups.filter(name__in=groups_allowed)):
if (user.is_superuser
| bool(user.groups.filter(name__in=groups_allowed))):
return True
return False
@@ -52,13 +49,15 @@ def has_group_permission(user, groups):
def is_object_owner(user, obj):
"""
Tests if a given user is the owner of a given object
test performed by checking user against the objects user and create_by field (if exists)
test performed by checking user against the objects user
and create_by field (if exists)
superusers bypass all checks, unauthenticated users cannot own anything
:param user django auth user object
:param obj any object that should be tested
:return: true if user is owner of object, false otherwise
"""
# TODO this could be improved/cleaned up by adding get_owner methods to all models that allow owner checks
# TODO this could be improved/cleaned up by adding
# get_owner methods to all models that allow owner checks
if not user.is_authenticated:
return False
if user.is_superuser:
@@ -67,18 +66,42 @@ def is_object_owner(user, obj):
return owner == user
if owner := getattr(obj, 'user', None):
return owner == user
if getattr(obj, 'get_owner', None):
return obj.get_owner() == user
return False
def is_object_shared(user, obj):
"""
Tests if a given user is shared for a given object
test performed by checking user against the objects shared table
superusers bypass all checks, unauthenticated users cannot own anything
:param user django auth user object
:param obj any object that should be tested
:return: true if user is shared for object, false otherwise
"""
# TODO this could be improved/cleaned up by adding
# share checks for relevant objects
if not user.is_authenticated:
return False
if user.is_superuser:
return True
return user in obj.shared.all()
def share_link_valid(recipe, share):
"""
Verifies the validity of a share uuid
:param recipe: recipe object
:param share: share uuid
:return: true if a share link with the given recipe and uuid exists, false otherwise
:return: true if a share link with the given recipe and uuid exists
"""
try:
return True if ShareLink.objects.filter(recipe=recipe, uuid=share).exists() else False
return (
True
if ShareLink.objects.filter(recipe=recipe, uuid=share).exists()
else False
)
except ValidationError:
return False
@@ -87,8 +110,8 @@ def share_link_valid(recipe, share):
def group_required(*groups_required):
"""
Decorator that tests the requesting user to be member of at least one of the provided groups
or higher level groups
Decorator that tests the requesting user to be member
of at least one of the provided groups or higher level groups
:param groups_required: list of required groups
:return: true if member of group, false otherwise
"""
@@ -96,7 +119,7 @@ def group_required(*groups_required):
def in_groups(u):
return has_group_permission(u, groups_required)
return user_passes_test(in_groups, login_url='index')
return user_passes_test(in_groups, login_url='view_no_group')
class GroupRequiredMixin(object):
@@ -108,7 +131,11 @@ class GroupRequiredMixin(object):
def dispatch(self, request, *args, **kwargs):
if not has_group_permission(request.user, self.groups_required):
messages.add_message(request, messages.ERROR, _('You do not have the required permissions to view this page!'))
messages.add_message(
request,
messages.ERROR,
_('You do not have the required permissions to view this page!') # noqa: E501
)
return HttpResponseRedirect(reverse_lazy('index'))
return super(GroupRequiredMixin, self).dispatch(request, *args, **kwargs)
@@ -118,14 +145,25 @@ class OwnerRequiredMixin(object):
def dispatch(self, request, *args, **kwargs):
if not request.user.is_authenticated:
messages.add_message(request, messages.ERROR, _('You are not logged in and therefore cannot view this page!'))
return HttpResponseRedirect(reverse_lazy('login'))
messages.add_message(
request,
messages.ERROR,
_('You are not logged in and therefore cannot view this page!')
)
return HttpResponseRedirect(
reverse_lazy('account_login') + '?next=' + request.path
)
else:
if not is_object_owner(request.user, self.get_object()):
messages.add_message(request, messages.ERROR, _('You cannot interact with this object as its not owned by you!'))
messages.add_message(
request,
messages.ERROR,
_('You cannot interact with this object as it is not owned by you!') # noqa: E501
)
return HttpResponseRedirect(reverse('index'))
return super(OwnerRequiredMixin, self).dispatch(request, *args, **kwargs)
return super(OwnerRequiredMixin, self) \
.dispatch(request, *args, **kwargs)
# Django Rest Framework Permission classes
@@ -136,7 +174,7 @@ class CustomIsOwner(permissions.BasePermission):
verifies user has ownership over object
(either user or created_by or user is request user)
"""
message = _('You cannot interact with this object as its not owned by you!')
message = _('You cannot interact with this object as it is not owned by you!') # noqa: E501
def has_permission(self, request, view):
return request.user.is_authenticated
@@ -145,6 +183,21 @@ class CustomIsOwner(permissions.BasePermission):
return is_object_owner(request.user, obj)
# TODO function duplicate/too similar name
class CustomIsShared(permissions.BasePermission):
"""
Custom permission class for django rest framework views
verifies user is shared for the object he is trying to access
"""
message = _('You cannot interact with this object as it is not owned by you!') # noqa: E501
def has_permission(self, request, view):
return request.user.is_authenticated
def has_object_permission(self, request, view, obj):
return is_object_shared(request.user, obj)
class CustomIsGuest(permissions.BasePermission):
"""
Custom permission class for django rest framework views

View File

@@ -5,12 +5,12 @@ from json import JSONDecodeError
import microdata
from bs4 import BeautifulSoup
from cookbook.helper.ingredient_parser import parse as parse_ingredient
from cookbook.models import Keyword
from django.http import JsonResponse
from django.utils.dateparse import parse_duration
from django.utils.translation import gettext as _
from cookbook.models import Keyword
def get_from_html(html_text, url):
soup = BeautifulSoup(html_text, "html.parser")
@@ -18,7 +18,7 @@ def get_from_html(html_text, url):
# first try finding ld+json as its most common
for ld in soup.find_all('script', type='application/ld+json'):
try:
ld_json = json.loads(ld.string)
ld_json = json.loads(ld.string.replace('\n', ''))
if type(ld_json) != list:
ld_json = [ld_json]
@@ -29,26 +29,37 @@ def get_from_html(html_text, url):
if '@type' in x and x['@type'] == 'Recipe':
ld_json_item = x
if '@type' in ld_json_item and ld_json_item['@type'] == 'Recipe':
return find_recipe_json(ld_json_item, url)
if ('@type' in ld_json_item
and ld_json_item['@type'] == 'Recipe'):
return JsonResponse(find_recipe_json(ld_json_item, url))
except JSONDecodeError:
JsonResponse({'error': True, 'msg': _('The requested site provided malformed data and cannot be read.')}, status=400)
return JsonResponse(
{
'error': True,
'msg': _('The requested site provided malformed data and cannot be read.') # noqa: E501
},
status=400)
# now try to find microdata
items = microdata.get_items(html_text)
for i in items:
md_json = json.loads(i.json())
if 'schema.org/Recipe' in str(md_json['type']):
return find_recipe_json(md_json['properties'], url)
return JsonResponse(find_recipe_json(md_json['properties'], url))
return JsonResponse({'error': True, 'msg': _('The requested site does not provide any recognized data format to import the recipe from.')}, status=400)
return JsonResponse(
{
'error': True,
'msg': _('The requested site does not provide any recognized data format to import the recipe from.') # noqa: E501
},
status=400)
def find_recipe_json(ld_json, url):
if type(ld_json['name']) == list:
try:
ld_json['name'] = ld_json['name'][0]
except:
except Exception:
ld_json['name'] = 'ERROR'
# some sites use ingredients instead of recipeIngredients
@@ -57,8 +68,9 @@ def find_recipe_json(ld_json, url):
if 'recipeIngredient' in ld_json:
# some pages have comma separated ingredients in a single array entry
if len(ld_json['recipeIngredient']) == 1 and len(ld_json['recipeIngredient'][0]) > 30:
ld_json['recipeIngredient'] = ld_json['recipeIngredient'][0].split(',')
if (len(ld_json['recipeIngredient']) == 1
and len(ld_json['recipeIngredient'][0]) > 30):
ld_json['recipeIngredient'] = ld_json['recipeIngredient'][0].split(',') # noqa: E501
for x in ld_json['recipeIngredient']:
if '\n' in x:
@@ -69,31 +81,41 @@ def find_recipe_json(ld_json, url):
ingredients = []
for x in ld_json['recipeIngredient']:
ingredient_split = x.split()
ingredient = None
amount = 0
unit = ''
if len(ingredient_split) > 2:
ingredient = " ".join(ingredient_split[2:])
unit = ingredient_split[1]
if x.replace(' ', '') != '':
try:
amount = float(ingredient_split[0].replace(',', '.'))
except ValueError:
amount = 0
ingredient = " ".join(ingredient_split)
if len(ingredient_split) == 2:
ingredient = " ".join(ingredient_split[1:])
unit = ''
try:
amount = float(ingredient_split[0].replace(',', '.'))
except ValueError:
amount = 0
ingredient = " ".join(ingredient_split)
if len(ingredient_split) == 1:
ingredient = " ".join(ingredient_split)
if ingredient:
ingredients.append({'amount': amount, 'unit': {'text': unit, 'id': random.randrange(10000, 99999)}, 'ingredient': {'text': ingredient, 'id': random.randrange(10000, 99999)}, 'original': x})
amount, unit, ingredient, note = parse_ingredient(x)
if ingredient:
ingredients.append(
{
'amount': amount,
'unit': {
'text': unit,
'id': random.randrange(10000, 99999)
},
'ingredient': {
'text': ingredient,
'id': random.randrange(10000, 99999)
},
'note': note,
'original': x
}
)
except Exception:
ingredients.append(
{
'amount': 0,
'unit': {
'text': '',
'id': random.randrange(10000, 99999)
},
'ingredient': {
'text': x,
'id': random.randrange(10000, 99999)
},
'note': '',
'original': x
}
)
ld_json['recipeIngredient'] = ingredients
else:
@@ -107,7 +129,9 @@ def find_recipe_json(ld_json, url):
ld_json['keywords'] = ld_json['keywords'].split(',')
# keywords as string in list
if type(ld_json['keywords']) == list and len(ld_json['keywords']) == 1 and ',' in ld_json['keywords'][0]:
if (type(ld_json['keywords']) == list
and len(ld_json['keywords']) == 1
and ',' in ld_json['keywords'][0]):
ld_json['keywords'] = ld_json['keywords'][0].split(',')
# keywords as list
@@ -115,7 +139,7 @@ def find_recipe_json(ld_json, url):
if k := Keyword.objects.filter(name=kw).first():
keywords.append({'id': str(k.id), 'text': str(k).strip()})
else:
keywords.append({'id': "null", 'text': kw.strip()})
keywords.append({'id': random.randrange(1111111, 9999999, 1), 'text': kw.strip()})
ld_json['keywords'] = keywords
else:
@@ -142,14 +166,15 @@ def find_recipe_json(ld_json, url):
instructions += str(i)
ld_json['recipeInstructions'] = instructions
ld_json['recipeInstructions'] = re.sub(r'\n\s*\n', '\n\n', ld_json['recipeInstructions'])
ld_json['recipeInstructions'] = re.sub(' +', ' ', ld_json['recipeInstructions'])
ld_json['recipeInstructions'] = ld_json['recipeInstructions'].replace('<p>', '')
ld_json['recipeInstructions'] = ld_json['recipeInstructions'].replace('</p>', '')
ld_json['recipeInstructions'] = re.sub(r'\n\s*\n', '\n\n', ld_json['recipeInstructions']) # noqa: E501
ld_json['recipeInstructions'] = re.sub(' +', ' ', ld_json['recipeInstructions']) # noqa: E501
ld_json['recipeInstructions'] = ld_json['recipeInstructions'].replace('<p>', '') # noqa: E501
ld_json['recipeInstructions'] = ld_json['recipeInstructions'].replace('</p>', '') # noqa: E501
else:
ld_json['recipeInstructions'] = ''
ld_json['recipeInstructions'] += '\n\n' + _('Imported from ') + url
if url != '':
ld_json['recipeInstructions'] += '\n\n' + _('Imported from') + ' ' + url
if 'image' in ld_json:
# check if list of images is returned, take first if so
@@ -165,9 +190,14 @@ def find_recipe_json(ld_json, url):
if 'cookTime' in ld_json:
try:
if type(ld_json['cookTime']) == list and len(ld_json['cookTime']) > 0:
if (type(ld_json['cookTime']) == list
and len(ld_json['cookTime']) > 0):
ld_json['cookTime'] = ld_json['cookTime'][0]
ld_json['cookTime'] = round(parse_duration(ld_json['cookTime']).seconds / 60)
ld_json['cookTime'] = round(
parse_duration(
ld_json['cookTime']
).seconds / 60
)
except TypeError:
ld_json['cookTime'] = 0
else:
@@ -175,16 +205,32 @@ def find_recipe_json(ld_json, url):
if 'prepTime' in ld_json:
try:
if type(ld_json['prepTime']) == list and len(ld_json['prepTime']) > 0:
if (type(ld_json['prepTime']) == list
and len(ld_json['prepTime']) > 0):
ld_json['prepTime'] = ld_json['prepTime'][0]
ld_json['prepTime'] = round(parse_duration(ld_json['prepTime']).seconds / 60)
ld_json['prepTime'] = round(
parse_duration(
ld_json['prepTime']
).seconds / 60
)
except TypeError:
ld_json['prepTime'] = 0
else:
ld_json['prepTime'] = 0
ld_json['servings'] = 1
try:
if 'recipeYield' in ld_json:
if type(ld_json['recipeYield']) == str:
ld_json['servings'] = int(re.findall(r'\b\d+\b', ld_json['recipeYield'])[0])
except Exception as e:
print(e)
for key in list(ld_json):
if key not in ['prepTime', 'cookTime', 'image', 'recipeInstructions', 'keywords', 'name', 'recipeIngredient']:
if key not in [
'prepTime', 'cookTime', 'image', 'recipeInstructions',
'keywords', 'name', 'recipeIngredient', 'servings'
]:
ld_json.pop(key, None)
return JsonResponse(ld_json)
return ld_json

View File

@@ -0,0 +1,62 @@
import bleach
import markdown as md
from bleach_whitelist import markdown_attrs, markdown_tags
from cookbook.helper.mdx_attributes import MarkdownFormatExtension
from cookbook.helper.mdx_urlize import UrlizeExtension
from jinja2 import Template, TemplateSyntaxError
class IngredientObject(object):
amount = ""
unit = ""
food = ""
note = ""
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>"
if ingredient.unit:
self.unit = bleach.clean(str(ingredient.unit))
else:
self.unit = ""
self.food = bleach.clean(str(ingredient.food))
self.note = bleach.clean(str(ingredient.note))
def __str__(self):
ingredient = self.amount
if self.unit != "":
ingredient += f' {self.unit}'
return f'{ingredient} {self.food}'
def render_instructions(step): # TODO deduplicate markdown cleanup code
instructions = step.instruction
tags = markdown_tags + [
'pre', 'table', 'td', 'tr', 'th', 'tbody', 'style', 'thead'
]
parsed_md = md.markdown(
instructions,
extensions=[
'markdown.extensions.fenced_code', 'tables',
UrlizeExtension(), MarkdownFormatExtension()
]
)
markdown_attrs['*'] = markdown_attrs['*'] + ['class']
instructions = bleach.clean(parsed_md, tags, markdown_attrs)
ingredients = []
for i in step.ingredients.all():
ingredients.append(IngredientObject(i))
try:
template = Template(instructions)
instructions = template.render(ingredients=ingredients)
except TemplateSyntaxError:
pass
return instructions

View File

@@ -0,0 +1,79 @@
import json
import re
from io import BytesIO
from zipfile import ZipFile
from cookbook.helper.ingredient_parser import parse
from cookbook.integration.integration import Integration
from cookbook.models import Recipe, Step, Food, Unit, Ingredient, Keyword
class Chowdown(Integration):
def import_file_name_filter(self, zip_info_object):
print("testing", zip_info_object.filename)
return re.match(r'^(_)*recipes/([A-Za-z\d\s-])+.md$', zip_info_object.filename)
def get_recipe_from_file(self, file):
ingredient_mode = False
direction_mode = False
description_mode = False
ingredients = []
directions = []
descriptions = []
for fl in file.readlines():
line = fl.decode("utf-8")
if 'title:' in line:
title = line.replace('title:', '').replace('"', '').strip()
if 'image:' in line:
image = line.replace('image:', '').strip()
if 'tags:' in line:
tags = line.replace('tags:', '').strip()
if ingredient_mode:
if len(line) > 2 and 'directions:' not in line:
ingredients.append(line[2:])
if '---' in line and direction_mode:
direction_mode = False
description_mode = True
if direction_mode:
if len(line) > 2:
directions.append(line[2:])
if 'ingredients:' in line:
ingredient_mode = True
if 'directions:' in line:
ingredient_mode = False
direction_mode = True
if description_mode and len(line) > 3 and '---' not in line:
descriptions.append(line)
recipe = Recipe.objects.create(name=title, created_by=self.request.user, internal=True, )
for k in tags.split(','):
keyword, created = Keyword.objects.get_or_create(name=k.strip())
recipe.keywords.add(keyword)
step = Step.objects.create(
instruction='\n'.join(directions) + '\n\n' + '\n'.join(descriptions)
)
for ingredient in ingredients:
amount, unit, ingredient, note = parse(ingredient)
f, created = Food.objects.get_or_create(name=ingredient)
u, created = Unit.objects.get_or_create(name=unit)
step.ingredients.add(Ingredient.objects.create(
food=f, unit=u, amount=amount, note=note
))
recipe.steps.add(step)
for f in self.files:
if '.zip' in f.name:
import_zip = ZipFile(f.file)
for z in import_zip.filelist:
if re.match(f'^images/{image}$', z.filename):
self.import_recipe_image(recipe, BytesIO(import_zip.read(z.filename)))
return recipe
def get_file_from_recipe(self, recipe):
raise NotImplementedError('Method not implemented in storage integration')

View File

@@ -0,0 +1,34 @@
import json
from io import BytesIO
from zipfile import ZipFile
from rest_framework.renderers import JSONRenderer
from cookbook.integration.integration import Integration
from cookbook.serializer import RecipeExportSerializer
class Default(Integration):
def get_recipe_from_file(self, file):
recipe_zip = ZipFile(file)
recipe_string = recipe_zip.read('recipe.json').decode("utf-8")
recipe = self.decode_recipe(recipe_string)
if 'image.png' in recipe_zip.namelist():
self.import_recipe_image(recipe, BytesIO(recipe_zip.read('image.png')))
return recipe
def decode_recipe(self, string):
data = json.loads(string)
serialized_recipe = RecipeExportSerializer(data=data, context={'request': self.request})
if serialized_recipe.is_valid():
recipe = serialized_recipe.save()
return recipe
return None
def get_file_from_recipe(self, recipe):
export = RecipeExportSerializer(recipe).data
return 'recipe.json', JSONRenderer().render(export).decode("utf-8")

View File

@@ -0,0 +1,128 @@
import datetime
import uuid
from io import BytesIO, StringIO
from zipfile import ZipFile, BadZipFile
from django.contrib import messages
from django.core.files import File
from django.http import HttpResponseRedirect, HttpResponse
from django.urls import reverse
from django.utils.formats import date_format
from django.utils.translation import gettext as _
from cookbook.models import Keyword
class Integration:
request = None
keyword = None
files = None
def __init__(self, request):
"""
Integration for importing and exporting recipes
:param request: request context of import session (used to link user to created objects)
"""
self.request = request
self.keyword = Keyword.objects.create(
name=f'Import {date_format(datetime.datetime.now(), "DATETIME_FORMAT")}.{datetime.datetime.now().strftime("%S")}',
description=f'Imported by {request.user.get_user_name()} at {date_format(datetime.datetime.now(), "DATETIME_FORMAT")}',
icon='📥'
)
def do_export(self, recipes):
"""
Perform the export based on a list of recipes
:param recipes: list of recipe objects
:return: HttpResponse with a ZIP file that is directly downloaded
"""
export_zip_stream = BytesIO()
export_zip_obj = ZipFile(export_zip_stream, 'w')
for r in recipes:
if r.internal:
recipe_zip_stream = BytesIO()
recipe_zip_obj = ZipFile(recipe_zip_stream, 'w')
recipe_stream = StringIO()
filename, data = self.get_file_from_recipe(r)
recipe_stream.write(data)
recipe_zip_obj.writestr(filename, recipe_stream.getvalue())
recipe_stream.close()
try:
recipe_zip_obj.write(r.image.path, 'image.png')
except ValueError:
pass
recipe_zip_obj.close()
export_zip_obj.writestr(str(r.pk) + '.zip', recipe_zip_stream.getvalue())
export_zip_obj.close()
response = HttpResponse(export_zip_stream.getvalue(), content_type='application/force-download')
response['Content-Disposition'] = 'attachment; filename="export.zip"'
return response
def import_file_name_filter(self, zip_info_object):
"""
Since zipfile.namelist() returns all files in all subdirectories this function allows filtering of files
If false is returned the file will be ignored
By default all files are included
:param zip_info_object: ZipInfo object
:return: Boolean if object should be included
"""
return True
def do_import(self, files):
"""
Imports given files
:param files: List of in memory files
:return: HttpResponseRedirect to the recipe search showing all imported recipes
"""
try:
self.files = files
for f in files:
if '.zip' in f.name:
import_zip = ZipFile(f.file)
for z in import_zip.filelist:
if self.import_file_name_filter(z):
recipe = self.get_recipe_from_file(BytesIO(import_zip.read(z.filename)))
recipe.keywords.add(self.keyword)
import_zip.close()
else:
recipe = self.get_recipe_from_file(f.file)
recipe.keywords.add(self.keyword)
except BadZipFile:
messages.add_message(self.request, messages.ERROR, _('Importer expected a .zip file. Did you choose the correct importer type for your data ?'))
return HttpResponseRedirect(reverse('view_search') + '?keywords=' + str(self.keyword.pk))
@staticmethod
def import_recipe_image(recipe, image_file):
"""
Adds an image to a recipe naming it correctly
:param recipe: Recipe object
:param image_file: ByteIO stream containing the image
"""
recipe.image = File(image_file, name=f'{uuid.uuid4()}_{recipe.pk}.png')
recipe.save()
def get_recipe_from_file(self, file):
"""
Takes any file like object and converts it into a recipe
:param file: ByteIO or any file like object, depends on provider
:return: Recipe object
"""
raise NotImplementedError('Method not implemented in storage integration')
def get_file_from_recipe(self, recipe):
"""
Takes a recipe object and converts it to a string (depending on the format)
returns both the filename of the exported file and the file contents
:param recipe: Recipe object that should be converted
:returns:
- name - file name in export
- data - string content for file to get created in export zip
"""
raise NotImplementedError('Method not implemented in storage integration')

View File

@@ -0,0 +1,52 @@
import json
import re
from io import BytesIO
from zipfile import ZipFile
from cookbook.helper.ingredient_parser import parse
from cookbook.integration.integration import Integration
from cookbook.models import Recipe, Step, Food, Unit, Ingredient
class Mealie(Integration):
def import_file_name_filter(self, zip_info_object):
return re.match(r'^recipes/([A-Za-z\d-])+.json$', zip_info_object.filename)
def get_recipe_from_file(self, file):
recipe_json = json.loads(file.getvalue().decode("utf-8"))
recipe = Recipe.objects.create(
name=recipe_json['name'].strip(), description=recipe_json['description'].strip(),
created_by=self.request.user, internal=True)
# TODO parse times (given in PT2H3M )
ingredients_added = False
for s in recipe_json['recipeInstructions']:
step = Step.objects.create(
instruction=s['text']
)
if not ingredients_added:
ingredients_added = True
for ingredient in recipe_json['recipeIngredient']:
amount, unit, ingredient, note = parse(ingredient)
f, created = Food.objects.get_or_create(name=ingredient)
u, created = Unit.objects.get_or_create(name=unit)
step.ingredients.add(Ingredient.objects.create(
food=f, unit=u, amount=amount, note=note
))
recipe.steps.add(step)
for f in self.files:
if '.zip' in f.name:
import_zip = ZipFile(f.file)
for z in import_zip.filelist:
if re.match(f'^images/{recipe_json["slug"]}.jpg$', z.filename):
self.import_recipe_image(recipe, BytesIO(import_zip.read(z.filename)))
return recipe
def get_file_from_recipe(self, recipe):
raise NotImplementedError('Method not implemented in storage integration')

View File

@@ -0,0 +1,54 @@
import json
import re
from io import BytesIO
from zipfile import ZipFile
from cookbook.helper.ingredient_parser import parse
from cookbook.integration.integration import Integration
from cookbook.models import Recipe, Step, Food, Unit, Ingredient
class NextcloudCookbook(Integration):
def import_file_name_filter(self, zip_info_object):
return re.match(r'^Recipes/([A-Za-z\d\s])+/recipe.json$', zip_info_object.filename)
def get_recipe_from_file(self, file):
recipe_json = json.loads(file.getvalue().decode("utf-8"))
recipe = Recipe.objects.create(
name=recipe_json['name'].strip(), description=recipe_json['description'].strip(),
created_by=self.request.user, internal=True,
servings=recipe_json['recipeYield'])
# TODO parse times (given in PT2H3M )
# TODO parse keywords
ingredients_added = False
for s in recipe_json['recipeInstructions']:
step = Step.objects.create(
instruction=s
)
if not ingredients_added:
ingredients_added = True
for ingredient in recipe_json['recipeIngredient']:
amount, unit, ingredient, note = parse(ingredient)
f, created = Food.objects.get_or_create(name=ingredient)
u, created = Unit.objects.get_or_create(name=unit)
step.ingredients.add(Ingredient.objects.create(
food=f, unit=u, amount=amount, note=note
))
recipe.steps.add(step)
for f in self.files:
if '.zip' in f.name:
import_zip = ZipFile(f.file)
for z in import_zip.filelist:
if re.match(f'^Recipes/{recipe.name}/full.jpg$', z.filename):
self.import_recipe_image(recipe, BytesIO(import_zip.read(z.filename)))
return recipe
def get_file_from_recipe(self, recipe):
raise NotImplementedError('Method not implemented in storage integration')

View File

@@ -0,0 +1,56 @@
import json
import re
from io import BytesIO
from zipfile import ZipFile
import microdata
from bs4 import BeautifulSoup
from cookbook.helper.recipe_url_import import find_recipe_json
from cookbook.integration.integration import Integration
from cookbook.models import Recipe, Step, Food, Ingredient, Unit
class Paprika(Integration):
def import_file_name_filter(self, zip_info_object):
print("testing", zip_info_object.filename)
return re.match(r'^Recipes/([A-Za-z\s])+.html$', zip_info_object.filename)
def get_file_from_recipe(self, recipe):
raise NotImplementedError('Method not implemented in storage integration')
def get_recipe_from_file(self, file):
html_text = file.getvalue().decode("utf-8")
items = microdata.get_items(html_text)
for i in items:
md_json = json.loads(i.json())
if 'schema.org/Recipe' in str(md_json['type']):
recipe_json = find_recipe_json(md_json['properties'], '')
recipe = Recipe.objects.create(name=recipe_json['name'].strip(), created_by=self.request.user, internal=True)
step = Step.objects.create(
instruction=recipe_json['recipeInstructions']
)
for ingredient in recipe_json['recipeIngredient']:
f, created = Food.objects.get_or_create(name=ingredient['ingredient']['text'])
u, created = Unit.objects.get_or_create(name=ingredient['unit']['text'])
step.ingredients.add(Ingredient.objects.create(
food=f, unit=u, amount=ingredient['amount'], note=ingredient['note']
))
recipe.steps.add(step)
soup = BeautifulSoup(html_text, "html.parser")
image = soup.find('img')
image_name = image.attrs['src'].strip().replace('Images/', '')
for f in self.files:
if '.zip' in f.name:
import_zip = ZipFile(f.file)
for z in import_zip.filelist:
if re.match(f'^Recipes/Images/{image_name}$', z.filename):
self.import_recipe_image(recipe, BytesIO(import_zip.read(z.filename)))
return recipe

View File

@@ -0,0 +1,60 @@
from django.utils.translation import gettext as _
from cookbook.helper.ingredient_parser import parse
from cookbook.integration.integration import Integration
from cookbook.models import Recipe, Step, Food, Unit, Ingredient
class Safron(Integration):
def get_recipe_from_file(self, file):
ingredient_mode = False
direction_mode = False
ingredients = []
directions = []
for fl in file.readlines():
line = fl.decode("utf-8")
if 'Title:' in line:
title = line.replace('Title:', '').strip()
if 'Description:' in line:
description = line.replace('Description:', '').strip()
if 'Yield:' in line:
directions.append(_('Servings') + ' ' + line.replace('Yield:', '').strip() + '\n')
if 'Cook:' in line:
directions.append(_('Waiting time') + ' ' + line.replace('Cook:', '').strip() + '\n')
if 'Prep:' in line:
directions.append(_('Preparation Time') + ' ' + line.replace('Prep:', '').strip() + '\n')
if 'Cookbook:' in line:
directions.append(_('Cookbook') + ' ' + line.replace('Cookbook:', '').strip() + '\n')
if 'Section:' in line:
directions.append(_('Section') + ' ' + line.replace('Section:', '').strip() + '\n')
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())
if 'Ingredients:' in line:
ingredient_mode = True
if 'Instructions:' in line:
ingredient_mode = False
direction_mode = True
recipe = Recipe.objects.create(name=title, description=description, created_by=self.request.user, internal=True, )
step = Step.objects.create(instruction='\n'.join(directions))
for ingredient in ingredients:
amount, unit, ingredient, note = parse(ingredient)
f, created = Food.objects.get_or_create(name=ingredient)
u, created = Unit.objects.get_or_create(name=unit)
step.ingredients.add(Ingredient.objects.create(
food=f, unit=u, amount=amount, note=note
))
recipe.steps.add(step)
return recipe
def get_file_from_recipe(self, recipe):
raise NotImplementedError('Method not implemented in storage integration')

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

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

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,49 @@
# Generated by Django 3.0.7 on 2020-08-11 10:14
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import uuid
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('cookbook', '0074_remove_keyword_created_by'),
]
operations = [
migrations.CreateModel(
name='ShoppingListRecipe',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('multiplier', models.IntegerField(default=1)),
('recipe', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='cookbook.Recipe')),
],
),
migrations.CreateModel(
name='ShoppingListEntry',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('amount', models.IntegerField(default=1)),
('order', models.IntegerField(default=0)),
('checked', models.BooleanField(default=False)),
('food', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cookbook.Food')),
('list_recipe', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='cookbook.ShoppingListRecipe')),
('unit', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='cookbook.Unit')),
],
),
migrations.CreateModel(
name='ShoppingList',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('uuid', models.UUIDField(default=uuid.uuid4)),
('note', models.TextField(blank=True, null=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
('recipes', models.ManyToManyField(blank=True, to='cookbook.ShoppingListRecipe')),
('shared', models.ManyToManyField(blank=True, related_name='list_share', to=settings.AUTH_USER_MODEL)),
],
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 3.0.7 on 2020-08-26 18:46
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0075_shoppinglist_shoppinglistentry_shoppinglistrecipe'),
]
operations = [
migrations.AddField(
model_name='shoppinglist',
name='entries',
field=models.ManyToManyField(blank=True, to='cookbook.ShoppingListEntry'),
),
]

View File

@@ -0,0 +1,29 @@
# Generated by Django 3.0.7 on 2020-09-01 11:31
import datetime
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import uuid
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('cookbook', '0076_shoppinglist_entries'),
]
operations = [
migrations.CreateModel(
name='InviteLink',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('uuid', models.UUIDField(default=uuid.uuid4)),
('username', models.CharField(blank=True, max_length=64)),
('valid_until', models.DateField(default=datetime.date(2020, 9, 15))),
('created_at', models.DateTimeField(auto_now_add=True)),
('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
]

View File

@@ -0,0 +1,21 @@
# Generated by Django 3.0.7 on 2020-09-01 11:39
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('cookbook', '0077_invitelink'),
]
operations = [
migrations.AddField(
model_name='invitelink',
name='used_by',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='used_by', to=settings.AUTH_USER_MODEL),
),
]

View File

@@ -0,0 +1,21 @@
# Generated by Django 3.0.7 on 2020-09-01 12:54
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('auth', '0011_update_proxy_permissions'),
('cookbook', '0078_invitelink_used_by'),
]
operations = [
migrations.AddField(
model_name='invitelink',
name='group',
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='auth.Group'),
preserve_default=False,
),
]

View File

@@ -0,0 +1,24 @@
# Generated by Django 3.0.7 on 2020-09-21 21:31
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0079_invitelink_group'),
]
operations = [
migrations.AddField(
model_name='userpreference',
name='shopping_auto_sync',
field=models.BooleanField(default=True),
),
migrations.AlterField(
model_name='invitelink',
name='valid_until',
field=models.DateField(default=datetime.date(2020, 10, 5)),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 3.0.7 on 2020-09-21 21:49
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0080_auto_20200921_2331'),
]
operations = [
migrations.AlterField(
model_name='userpreference',
name='shopping_auto_sync',
field=models.IntegerField(default=5),
),
]

View File

@@ -0,0 +1,24 @@
# Generated by Django 3.0.7 on 2020-09-22 09:43
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0081_auto_20200921_2349'),
]
operations = [
migrations.AlterField(
model_name='invitelink',
name='valid_until',
field=models.DateField(default=datetime.date(2020, 10, 6)),
),
migrations.AlterField(
model_name='shoppinglistentry',
name='amount',
field=models.DecimalField(decimal_places=16, default=0, max_digits=32),
),
]

View File

@@ -0,0 +1,21 @@
# Generated by Django 3.0.7 on 2020-09-22 10:24
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0082_auto_20200922_1143'),
]
operations = [
migrations.CreateModel(
name='Space',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(default='Default', max_length=128)),
('message', models.CharField(default='', max_length=512)),
],
),
]

View File

@@ -0,0 +1,21 @@
# Generated by Django 3.0.7 on 2020-09-22 10:33
from django.db import migrations
def create_default_space(apps, schema_editor):
Space = apps.get_model('cookbook', 'Space')
Space.objects.create(
name='Default',
message=''
)
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0083_space'),
]
operations = [
migrations.RunPython(create_default_space),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 3.0.7 on 2020-09-22 10:35
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0084_auto_20200922_1233'),
]
operations = [
migrations.AlterField(
model_name='space',
name='message',
field=models.CharField(blank=True, default='', max_length=512),
),
]

View File

@@ -0,0 +1,24 @@
# Generated by Django 3.0.7 on 2020-09-29 09:43
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0085_auto_20200922_1235'),
]
operations = [
migrations.AddField(
model_name='mealplan',
name='recipe_multiplier',
field=models.IntegerField(default=1),
),
migrations.AlterField(
model_name='invitelink',
name='valid_until',
field=models.DateField(default=datetime.date(2020, 10, 13)),
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 3.0.7 on 2020-09-29 09:52
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0086_auto_20200929_1143'),
]
operations = [
migrations.AlterField(
model_name='mealplan',
name='recipe_multiplier',
field=models.DecimalField(decimal_places=4, default=1, max_digits=8),
),
migrations.AlterField(
model_name='shoppinglistrecipe',
name='multiplier',
field=models.DecimalField(decimal_places=4, default=1, max_digits=8),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 3.1.1 on 2020-09-29 11:55
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0087_auto_20200929_1152'),
]
operations = [
migrations.AddField(
model_name='shoppinglist',
name='finished',
field=models.BooleanField(default=False),
),
]

View File

@@ -0,0 +1,36 @@
# Generated by Django 3.1.1 on 2020-11-17 21:22
import datetime
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0088_shoppinglist_finished'),
]
operations = [
migrations.CreateModel(
name='NutritionInformation',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('fats', models.DecimalField(decimal_places=16, default=0, max_digits=32)),
('carbohydrates', models.DecimalField(decimal_places=16, default=0, max_digits=32)),
('proteins', models.DecimalField(decimal_places=16, default=0, max_digits=32)),
('calories', models.DecimalField(decimal_places=16, default=0, max_digits=32)),
('source', models.CharField(blank=True, default='', max_length=512, null=True)),
],
),
migrations.AlterField(
model_name='invitelink',
name='valid_until',
field=models.DateField(default=datetime.date(2020, 12, 1)),
),
migrations.AddField(
model_name='recipe',
name='nutrition',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='cookbook.nutritioninformation'),
),
]

View File

@@ -0,0 +1,24 @@
# Generated by Django 3.1.3 on 2020-12-14 12:59
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0089_auto_20201117_2222'),
]
operations = [
migrations.AddField(
model_name='userpreference',
name='use_fractions',
field=models.BooleanField(default=False),
),
migrations.AlterField(
model_name='invitelink',
name='valid_until',
field=models.DateField(default=datetime.date(2020, 12, 28)),
),
]

View File

@@ -0,0 +1,26 @@
# Generated by Django 3.1.4 on 2020-12-26 14:51
from django.db import migrations
def migrate_empty_units(apps, schema_editor):
Unit = apps.get_model('cookbook', 'Unit')
Ingredient = apps.get_model('cookbook', 'Ingredient')
empty_units = Unit.objects.filter(name='').all()
for x in empty_units:
for i in Ingredient.objects.all():
if i.unit == x:
i.unit = None
i.save()
x.delete()
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0090_auto_20201214_1359'),
]
operations = [
migrations.RunPython(migrate_empty_units),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 3.0.7 on 2020-08-30 13:32
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0091_auto_20201226_1551'),
]
operations = [
migrations.AddField(
model_name='recipe',
name='servings',
field=models.IntegerField(default=1),
),
]

View File

@@ -0,0 +1,30 @@
# Generated by Django 3.1.4 on 2020-12-31 11:36
import datetime
import django.core.validators
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0092_recipe_servings'),
]
operations = [
migrations.RenameField(
model_name='mealplan',
old_name='recipe_multiplier',
new_name='servings',
),
migrations.AlterField(
model_name='invitelink',
name='valid_until',
field=models.DateField(default=datetime.date(2021, 1, 14)),
),
migrations.AlterField(
model_name='unit',
name='name',
field=models.CharField(max_length=128, unique=True, validators=[django.core.validators.MinLengthValidator(1)]),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 3.1.4 on 2020-12-31 11:38
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0093_auto_20201231_1236'),
]
operations = [
migrations.RenameField(
model_name='shoppinglistrecipe',
old_name='multiplier',
new_name='servings',
),
]

View File

@@ -0,0 +1,24 @@
# Generated by Django 3.1.5 on 2021-01-07 17:04
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0094_auto_20201231_1238'),
]
operations = [
migrations.AddField(
model_name='userpreference',
name='sticky_navbar',
field=models.BooleanField(default=True),
),
migrations.AlterField(
model_name='invitelink',
name='valid_until',
field=models.DateField(default=datetime.date(2021, 1, 21)),
),
]

View File

@@ -0,0 +1,31 @@
# Generated by Django 3.1.5 on 2021-01-09 19:44
from django.db import migrations
def delete_duplicate_bookmarks(apps, schema_editor):
"""
In this migration, a unique constraint is set on the fields `recipe` and `book`.
If there are already duplicate entries, the migration will fail.
Therefore all duplicate entries are deleted beforehand.
"""
RecipeBookEntry = apps.get_model('cookbook', 'RecipeBookEntry')
for row in RecipeBookEntry.objects.all():
if RecipeBookEntry.objects.filter(recipe=row.recipe, book=row.book).count() > 1:
row.delete()
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0095_auto_20210107_1804'),
]
operations = [
# run function to delete duplicated bookmarks
migrations.RunPython(delete_duplicate_bookmarks),
migrations.AlterUniqueTogether(
name='recipebookentry',
unique_together={('recipe', 'book')},
),
]

View File

@@ -0,0 +1,25 @@
# Generated by Django 3.1.5 on 2021-01-13 12:15
import datetime
import django.core.validators
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0096_auto_20210109_2044'),
]
operations = [
migrations.AddField(
model_name='recipe',
name='description',
field=models.CharField(blank=True, max_length=512, null=True),
),
migrations.AlterField(
model_name='food',
name='name',
field=models.CharField(max_length=128, unique=True, validators=[django.core.validators.MinLengthValidator(1)]),
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 3.1.5 on 2021-01-13 12:20
import cookbook.models
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0097_auto_20210113_1315'),
]
operations = [
migrations.AlterField(
model_name='invitelink',
name='valid_until',
field=models.DateField(default=cookbook.models.default_valid_until),
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 3.1.5 on 2021-01-13 14:18
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0098_auto_20210113_1320'),
]
operations = [
migrations.AlterField(
model_name='cooklog',
name='created_at',
field=models.DateTimeField(default=django.utils.timezone.now),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 3.1.5 on 2021-01-21 19:02
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0099_auto_20210113_1518'),
]
operations = [
migrations.AddField(
model_name='recipe',
name='servings_text',
field=models.CharField(blank=True, default='', max_length=32),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 3.1.5 on 2021-01-22 18:57
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0100_recipe_servings_text'),
]
operations = [
migrations.AddField(
model_name='storage',
name='path',
field=models.CharField(blank=True, default='', max_length=256),
),
]

View File

@@ -0,0 +1,46 @@
# Generated by Django 3.1.5 on 2021-01-25 10:47
import django.core.validators
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0101_storage_path'),
]
operations = [
migrations.CreateModel(
name='Supermarket',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=128, unique=True, validators=[django.core.validators.MinLengthValidator(1)])),
('description', models.TextField(blank=True, null=True)),
],
),
migrations.CreateModel(
name='SupermarketCategory',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=128, unique=True, validators=[django.core.validators.MinLengthValidator(1)])),
('description', models.TextField(blank=True, null=True)),
],
),
migrations.AddField(
model_name='food',
name='description',
field=models.TextField(blank=True, default=''),
),
migrations.AlterField(
model_name='storage',
name='method',
field=models.CharField(choices=[('DB', 'Dropbox'), ('NEXTCLOUD', 'Nextcloud'), ('LOCAL', 'Local')], default='DB', max_length=128),
),
migrations.AddField(
model_name='food',
name='supermarket_category',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='cookbook.supermarketcategory'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 3.1.5 on 2021-01-25 13:10
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0102_auto_20210125_1147'),
]
operations = [
migrations.AddField(
model_name='food',
name='ignore_shopping',
field=models.BooleanField(default=False),
),
]

View File

@@ -0,0 +1,28 @@
# Generated by Django 3.1.5 on 2021-01-25 20:33
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0103_food_ignore_shopping'),
]
operations = [
migrations.CreateModel(
name='SupermarketCategoryRelation',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('order', models.IntegerField(default=0)),
('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cookbook.supermarketcategory')),
('supermarket', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cookbook.supermarket')),
],
),
migrations.AddField(
model_name='supermarket',
name='categories',
field=models.ManyToManyField(through='cookbook.SupermarketCategoryRelation', to='cookbook.SupermarketCategory'),
),
]

View File

@@ -0,0 +1,24 @@
# Generated by Django 3.1.5 on 2021-01-26 15:04
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0104_auto_20210125_2133'),
]
operations = [
migrations.AlterField(
model_name='supermarketcategoryrelation',
name='category',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='category_to_supermarket', to='cookbook.supermarketcategory'),
),
migrations.AlterField(
model_name='supermarketcategoryrelation',
name='supermarket',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='category_to_supermarket', to='cookbook.supermarket'),
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 3.1.5 on 2021-01-26 15:21
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0105_auto_20210126_1604'),
]
operations = [
migrations.AddField(
model_name='shoppinglist',
name='supermarket',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='cookbook.supermarket'),
),
]

View File

@@ -0,0 +1,17 @@
# Generated by Django 3.1.5 on 2021-01-28 14:35
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0106_shoppinglist_supermarket'),
]
operations = [
migrations.AlterModelOptions(
name='supermarketcategoryrelation',
options={'ordering': ('order',)},
),
]

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