Compare commits

...

91 Commits

Author SHA1 Message Date
vabene1111
bc82049f42 work in progress, playing around 2022-10-02 16:39:56 +02:00
vabene1111
da8262a9b5 Merge pull request #2088 from TandoorRecipes/dependabot/npm_and_yarn/vue/workbox-webpack-plugin-6.5.4
Bump workbox-webpack-plugin from 6.5.3 to 6.5.4 in /vue
2022-10-02 12:28:29 +02:00
vabene1111
f0cf4a23e4 Merge pull request #2095 from TandoorRecipes/feature/ingredient-actions
Feature/ingredient actions
2022-10-01 19:28:23 +02:00
vabene1111
489c81c378 Merge pull request #2094 from TandoorRecipes/feature/step-time-format
format step time
2022-10-01 19:28:13 +02:00
vabene1111
730344e326 duplicate ingredient to correct location 2022-10-01 19:27:09 +02:00
vabene1111
7e6b1d3638 added move and copy buttons to ingredient 2022-10-01 19:25:18 +02:00
vabene1111
15f65cd711 format step time 2022-10-01 19:10:58 +02:00
vabene1111
dba205dafb Merge pull request #2092 from wellart/develop
add indonesian language
2022-10-01 19:04:29 +02:00
KangAlleW
5ae149a1b6 add indonesian language 2022-10-01 23:55:37 +07:00
dependabot[bot]
4bb2307007 Bump workbox-webpack-plugin from 6.5.3 to 6.5.4 in /vue
Bumps [workbox-webpack-plugin](https://github.com/googlechrome/workbox) from 6.5.3 to 6.5.4.
- [Release notes](https://github.com/googlechrome/workbox/releases)
- [Commits](https://github.com/googlechrome/workbox/compare/v6.5.3...v6.5.4)

---
updated-dependencies:
- dependency-name: workbox-webpack-plugin
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 16:45:04 +00:00
vabene1111
be0088aec6 Merge pull request #2091 from TandoorRecipes/feature/fix-nc-import-nutrition
fixed nc importer nutritions
2022-10-01 18:42:16 +02:00
vabene1111
c56710ae0c fixed nc importer nutritions 2022-10-01 18:42:03 +02:00
vabene1111
1a420bc002 Merge pull request #2090 from TandoorRecipes/feature/fix-dependencies
fixed vue template compiler version and removed debug print from perm…
2022-10-01 18:41:21 +02:00
wella
545e4f7af4 Translated using Weblate (Indonesian)
Currently translated at 5.3% (28 of 524 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/id/
2022-10-01 16:38:41 +00:00
wella
d2a148ae7d Translated using Weblate (Indonesian)
Currently translated at 22.8% (105 of 460 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/id/
2022-10-01 16:32:26 +00:00
wella
580591a69e Added translation using Weblate (Indonesian) 2022-10-01 16:32:26 +00:00
vabene1111
409b438776 fixed vue template compiler version and removed debug print from permission helper 2022-10-01 18:18:00 +02:00
vabene1111
549175b56d Merge pull request #2086 from TandoorRecipes/dependabot/npm_and_yarn/vue/vue/cli-service-5.0.8
Bump @vue/cli-service from 5.0.4 to 5.0.8 in /vue
2022-10-01 18:09:21 +02:00
vabene1111
0e3f5006b1 Merge pull request #2087 from TandoorRecipes/dependabot/npm_and_yarn/vue/workbox-expiration-6.5.4
Bump workbox-expiration from 6.5.3 to 6.5.4 in /vue
2022-10-01 18:09:14 +02:00
vabene1111
54043a0ae5 Merge pull request #2089 from TandoorRecipes/dependabot/npm_and_yarn/vue/typescript-4.8.4
Bump typescript from 4.8.2 to 4.8.4 in /vue
2022-10-01 18:09:06 +02:00
dependabot[bot]
36fdc8cd9e Bump typescript from 4.8.2 to 4.8.4 in /vue
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.8.2 to 4.8.4.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/compare/v4.8.2...v4.8.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 16:04:36 +00:00
dependabot[bot]
87cf3b2289 Bump workbox-expiration from 6.5.3 to 6.5.4 in /vue
Bumps [workbox-expiration](https://github.com/googlechrome/workbox) from 6.5.3 to 6.5.4.
- [Release notes](https://github.com/googlechrome/workbox/releases)
- [Commits](https://github.com/googlechrome/workbox/compare/v6.5.3...v6.5.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 16:03:36 +00:00
dependabot[bot]
adb4071fdb Bump @vue/cli-service from 5.0.4 to 5.0.8 in /vue
Bumps [@vue/cli-service](https://github.com/vuejs/vue-cli/tree/HEAD/packages/@vue/cli-service) from 5.0.4 to 5.0.8.
- [Release notes](https://github.com/vuejs/vue-cli/releases)
- [Changelog](https://github.com/vuejs/vue-cli/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-cli/commits/v5.0.8/packages/@vue/cli-service)

---
updated-dependencies:
- dependency-name: "@vue/cli-service"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 16:03:22 +00:00
vabene1111
2a20f5e6e2 Merge pull request #2082 from TandoorRecipes/dependabot/npm_and_yarn/vue/prismjs-1.29.0
Bump prismjs from 1.28.0 to 1.29.0 in /vue
2022-10-01 17:59:43 +02:00
vabene1111
00f7ae3d66 Merge pull request #2084 from TandoorRecipes/dependabot/npm_and_yarn/vue/vue/cli-plugin-babel-5.0.8
Bump @vue/cli-plugin-babel from 5.0.4 to 5.0.8 in /vue
2022-10-01 17:59:36 +02:00
vabene1111
f1f4e7ca8e Merge pull request #2085 from TandoorRecipes/dependabot/npm_and_yarn/vue/workbox-precaching-6.5.4
Bump workbox-precaching from 6.5.3 to 6.5.4 in /vue
2022-10-01 17:59:32 +02:00
wella
6d7b3b8bfa Translated using Weblate (Indonesian)
Currently translated at 5.0% (23 of 460 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/id/
2022-10-01 15:56:03 +00:00
wella
7ebccf564d Added translation using Weblate (Indonesian) 2022-10-01 15:44:15 +00:00
dependabot[bot]
0421a1aa6c Bump prismjs from 1.28.0 to 1.29.0 in /vue
Bumps [prismjs](https://github.com/PrismJS/prism) from 1.28.0 to 1.29.0.
- [Release notes](https://github.com/PrismJS/prism/releases)
- [Changelog](https://github.com/PrismJS/prism/blob/master/CHANGELOG.md)
- [Commits](https://github.com/PrismJS/prism/compare/v1.28.0...v1.29.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 15:09:02 +00:00
dependabot[bot]
c118ab9a3c Bump workbox-precaching from 6.5.3 to 6.5.4 in /vue
Bumps [workbox-precaching](https://github.com/googlechrome/workbox) from 6.5.3 to 6.5.4.
- [Release notes](https://github.com/googlechrome/workbox/releases)
- [Commits](https://github.com/googlechrome/workbox/compare/v6.5.3...v6.5.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 15:09:01 +00:00
dependabot[bot]
02a12cf724 Bump @vue/cli-plugin-babel from 5.0.4 to 5.0.8 in /vue
Bumps [@vue/cli-plugin-babel](https://github.com/vuejs/vue-cli/tree/HEAD/packages/@vue/cli-plugin-babel) from 5.0.4 to 5.0.8.
- [Release notes](https://github.com/vuejs/vue-cli/releases)
- [Changelog](https://github.com/vuejs/vue-cli/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-cli/commits/v5.0.8/packages/@vue/cli-plugin-babel)

---
updated-dependencies:
- dependency-name: "@vue/cli-plugin-babel"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 15:08:51 +00:00
vabene1111
f28ca41b7b Merge pull request #2080 from TandoorRecipes/dependabot/npm_and_yarn/vue/vue-i18n-8.27.2
Bump vue-i18n from 8.27.1 to 8.27.2 in /vue
2022-10-01 17:05:50 +02:00
vabene1111
6e677cf3cd Merge pull request #1972 from TandoorRecipes/dependabot/npm_and_yarn/vue/vue/cli-plugin-typescript-5.0.8
Bump @vue/cli-plugin-typescript from 5.0.4 to 5.0.8 in /vue
2022-10-01 15:58:53 +02:00
vabene1111
d30a23f7ef Merge pull request #2079 from TandoorRecipes/dependabot/npm_and_yarn/vue/vue/cli-plugin-eslint-5.0.8
Bump @vue/cli-plugin-eslint from 5.0.4 to 5.0.8 in /vue
2022-10-01 15:58:49 +02:00
vabene1111
88fea6f25d Merge pull request #2081 from TandoorRecipes/dependabot/npm_and_yarn/vue/vue/compiler-sfc-3.2.40
Bump @vue/compiler-sfc from 3.2.36 to 3.2.40 in /vue
2022-10-01 15:58:42 +02:00
dependabot[bot]
fc0b5bd738 Bump @vue/cli-plugin-eslint from 5.0.4 to 5.0.8 in /vue
Bumps [@vue/cli-plugin-eslint](https://github.com/vuejs/vue-cli/tree/HEAD/packages/@vue/cli-plugin-eslint) from 5.0.4 to 5.0.8.
- [Release notes](https://github.com/vuejs/vue-cli/releases)
- [Changelog](https://github.com/vuejs/vue-cli/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-cli/commits/v5.0.8/packages/@vue/cli-plugin-eslint)

---
updated-dependencies:
- dependency-name: "@vue/cli-plugin-eslint"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 08:44:05 +00:00
dependabot[bot]
5174f9939c Bump @vue/cli-plugin-typescript from 5.0.4 to 5.0.8 in /vue
Bumps [@vue/cli-plugin-typescript](https://github.com/vuejs/vue-cli/tree/HEAD/packages/@vue/cli-plugin-typescript) from 5.0.4 to 5.0.8.
- [Release notes](https://github.com/vuejs/vue-cli/releases)
- [Changelog](https://github.com/vuejs/vue-cli/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-cli/commits/v5.0.8/packages/@vue/cli-plugin-typescript)

---
updated-dependencies:
- dependency-name: "@vue/cli-plugin-typescript"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 08:43:38 +00:00
dependabot[bot]
8f9a489c7e Bump @vue/compiler-sfc from 3.2.36 to 3.2.40 in /vue
Bumps [@vue/compiler-sfc](https://github.com/vuejs/core/tree/HEAD/packages/compiler-sfc) from 3.2.36 to 3.2.40.
- [Release notes](https://github.com/vuejs/core/releases)
- [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/core/commits/v3.2.40/packages/compiler-sfc)

---
updated-dependencies:
- dependency-name: "@vue/compiler-sfc"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 08:41:31 +00:00
dependabot[bot]
fc72efac04 Bump vue-i18n from 8.27.1 to 8.27.2 in /vue
Bumps [vue-i18n](https://github.com/intlify/vue-i18n-next/tree/HEAD/packages/vue-i18n) from 8.27.1 to 8.27.2.
- [Release notes](https://github.com/intlify/vue-i18n-next/releases)
- [Changelog](https://github.com/intlify/vue-i18n-next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/intlify/vue-i18n-next/commits/HEAD/packages/vue-i18n)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 08:41:18 +00:00
vabene1111
72f57cf671 Merge pull request #2078 from TandoorRecipes/dependabot/npm_and_yarn/vue/vue-template-compiler-2.7.10
Bump vue-template-compiler from 2.6.14 to 2.7.10 in /vue
2022-10-01 10:41:05 +02:00
vabene1111
85b95d1e96 Merge pull request #2076 from TandoorRecipes/dependabot/npm_and_yarn/vue/core-js-3.25.3
Bump core-js from 3.25.0 to 3.25.3 in /vue
2022-10-01 10:40:55 +02:00
vabene1111
35dee43f0b Merge pull request #2077 from TandoorRecipes/dependabot/npm_and_yarn/vue/popperjs/core-2.11.6
Bump @popperjs/core from 2.11.5 to 2.11.6 in /vue
2022-10-01 10:40:46 +02:00
dependabot[bot]
fb683bf230 Bump vue-template-compiler from 2.6.14 to 2.7.10 in /vue
Bumps [vue-template-compiler](https://github.com/vuejs/vue) from 2.6.14 to 2.7.10.
- [Release notes](https://github.com/vuejs/vue/releases)
- [Changelog](https://github.com/vuejs/vue/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue/compare/v2.6.14...v2.7.10)

---
updated-dependencies:
- dependency-name: vue-template-compiler
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 08:40:45 +00:00
dependabot[bot]
a852f581ba Bump @popperjs/core from 2.11.5 to 2.11.6 in /vue
Bumps [@popperjs/core](https://github.com/popperjs/popper-core) from 2.11.5 to 2.11.6.
- [Release notes](https://github.com/popperjs/popper-core/releases)
- [Commits](https://github.com/popperjs/popper-core/compare/v2.11.5...v2.11.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 08:40:32 +00:00
dependabot[bot]
cc417f1499 Bump core-js from 3.25.0 to 3.25.3 in /vue
Bumps [core-js](https://github.com/zloirock/core-js) from 3.25.0 to 3.25.3.
- [Release notes](https://github.com/zloirock/core-js/releases)
- [Changelog](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zloirock/core-js/compare/v3.25.0...v3.25.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 08:40:08 +00:00
vabene1111
7f9da4c4fb Merge pull request #2074 from TandoorRecipes/dependabot/npm_and_yarn/vue/babel/eslint-parser-7.19.1
Bump @babel/eslint-parser from 7.18.2 to 7.19.1 in /vue
2022-10-01 10:39:57 +02:00
dependabot[bot]
31d3f9abee Bump @babel/eslint-parser from 7.18.2 to 7.19.1 in /vue
Bumps [@babel/eslint-parser](https://github.com/babel/babel/tree/HEAD/eslint/babel-eslint-parser) from 7.18.2 to 7.19.1.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.19.1/eslint/babel-eslint-parser)

---
updated-dependencies:
- dependency-name: "@babel/eslint-parser"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 08:39:30 +00:00
vabene1111
f9670e9833 Merge pull request #2073 from TandoorRecipes/dependabot/npm_and_yarn/vue/vue/cli-5.0.8
Bump @vue/cli from 5.0.4 to 5.0.8 in /vue
2022-10-01 10:39:16 +02:00
dependabot[bot]
465af8c1a4 Bump @vue/cli from 5.0.4 to 5.0.8 in /vue
Bumps [@vue/cli](https://github.com/vuejs/vue-cli/tree/HEAD/packages/@vue/cli) from 5.0.4 to 5.0.8.
- [Release notes](https://github.com/vuejs/vue-cli/releases)
- [Changelog](https://github.com/vuejs/vue-cli/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-cli/commits/v5.0.8/packages/@vue/cli)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 08:39:06 +00:00
vabene1111
ffe743e233 Merge pull request #2070 from TandoorRecipes/dependabot/pip/python-ldap-3.4.3
Bump python-ldap from 3.4.2 to 3.4.3
2022-10-01 10:38:54 +02:00
vabene1111
6b09731a55 Merge pull request #2071 from TandoorRecipes/dependabot/pip/djangorestframework-3.14.0
Bump djangorestframework from 3.13.1 to 3.14.0
2022-10-01 10:38:46 +02:00
vabene1111
182a94e0c7 Merge pull request #1971 from TandoorRecipes/dependabot/npm_and_yarn/vue/vue/cli-plugin-pwa-5.0.8
Bump @vue/cli-plugin-pwa from 5.0.4 to 5.0.8 in /vue
2022-10-01 10:38:33 +02:00
vabene1111
2adaedfd1a Merge pull request #2028 from TandoorRecipes/dependabot/npm_and_yarn/vue/workbox-navigation-preload-6.5.4
Bump workbox-navigation-preload from 6.5.3 to 6.5.4 in /vue
2022-10-01 10:38:19 +02:00
dependabot[bot]
5074326471 Bump python-ldap from 3.4.2 to 3.4.3
Bumps [python-ldap](https://github.com/python-ldap/python-ldap) from 3.4.2 to 3.4.3.
- [Release notes](https://github.com/python-ldap/python-ldap/releases)
- [Commits](https://github.com/python-ldap/python-ldap/compare/python-ldap-3.4.2...python-ldap-3.4.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 08:38:06 +00:00
dependabot[bot]
4807a16a0f Bump djangorestframework from 3.13.1 to 3.14.0
Bumps [djangorestframework](https://github.com/encode/django-rest-framework) from 3.13.1 to 3.14.0.
- [Release notes](https://github.com/encode/django-rest-framework/releases)
- [Commits](https://github.com/encode/django-rest-framework/compare/3.13.1...3.14.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 08:38:05 +00:00
vabene1111
af044f1002 Merge pull request #2072 from TandoorRecipes/dependabot/pip/recipe-scrapers-14.14.1
Bump recipe-scrapers from 14.14.0 to 14.14.1
2022-10-01 10:37:47 +02:00
dependabot[bot]
cdf77c8796 Bump recipe-scrapers from 14.14.0 to 14.14.1
Bumps [recipe-scrapers](https://github.com/hhursev/recipe-scrapers) from 14.14.0 to 14.14.1.
- [Release notes](https://github.com/hhursev/recipe-scrapers/releases)
- [Commits](https://github.com/hhursev/recipe-scrapers/compare/14.14.0...14.14.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 08:37:36 +00:00
vabene1111
e68bedf7eb Merge pull request #2037 from TandoorRecipes/dependabot/pip/django-storages-1.13.1
Bump django-storages from 1.12.3 to 1.13.1
2022-10-01 10:37:20 +02:00
vabene1111
5e21e7fa8e Merge pull request #1896 from TandoorRecipes/dependabot/npm_and_yarn/vue/webpack-bundle-tracker-1.6.0
Bump webpack-bundle-tracker from 1.5.0 to 1.6.0 in /vue
2022-10-01 10:37:07 +02:00
dependabot[bot]
f49b39b216 Bump django-storages from 1.12.3 to 1.13.1
Bumps [django-storages](https://github.com/jschneier/django-storages) from 1.12.3 to 1.13.1.
- [Release notes](https://github.com/jschneier/django-storages/releases)
- [Changelog](https://github.com/jschneier/django-storages/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/jschneier/django-storages/compare/1.12.3...1.13.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 08:37:02 +00:00
vabene1111
0d24292f52 Merge pull request #1890 from TandoorRecipes/dependabot/pip/django-webpack-loader-1.6.0
Bump django-webpack-loader from 1.5.0 to 1.6.0
2022-10-01 10:37:02 +02:00
vabene1111
f3b7016be8 Merge pull request #2027 from TandoorRecipes/dependabot/npm_and_yarn/vue/workbox-routing-6.5.4
Bump workbox-routing from 6.5.3 to 6.5.4 in /vue
2022-10-01 10:36:41 +02:00
vabene1111
0f77c831c9 Merge pull request #2026 from TandoorRecipes/dependabot/pip/cryptography-38.0.1
Bump cryptography from 37.0.2 to 38.0.1
2022-10-01 10:36:35 +02:00
vabene1111
be48e57453 Merge pull request #2068 from TandoorRecipes/dependabot/pip/pytest-7.1.3
Bump pytest from 7.1.2 to 7.1.3
2022-10-01 10:36:24 +02:00
vabene1111
3b45ca18af Merge pull request #2069 from TandoorRecipes/dependabot/pip/boto3-1.24.84
Bump boto3 from 1.24.21 to 1.24.84
2022-10-01 10:36:18 +02:00
dependabot[bot]
da1b22c148 Bump boto3 from 1.24.21 to 1.24.84
Bumps [boto3](https://github.com/boto/boto3) from 1.24.21 to 1.24.84.
- [Release notes](https://github.com/boto/boto3/releases)
- [Changelog](https://github.com/boto/boto3/blob/develop/CHANGELOG.rst)
- [Commits](https://github.com/boto/boto3/compare/1.24.21...1.24.84)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 00:03:55 +00:00
dependabot[bot]
9dab21f972 Bump pytest from 7.1.2 to 7.1.3
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.1.2 to 7.1.3.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/7.1.2...7.1.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 00:03:45 +00:00
vabene1111
7be705f6a1 fixed error in token generation endpoint 2022-09-30 15:42:07 +02:00
vabene1111
8e60566311 fixed recipekeeper import 2022-09-27 15:49:13 +02:00
vabene1111
0cf63cd715 Merge pull request #2065 from smarth42/patch-1
Update faq.md
2022-09-27 07:38:15 +02:00
Noé Feutry
5dc7bf5b0e Translated using Weblate (French)
Currently translated at 86.7% (399 of 460 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fr/
2022-09-26 16:33:07 +00:00
Noé Feutry
c4c66aa640 Translated using Weblate (French)
Currently translated at 84.7% (444 of 524 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/fr/
2022-09-26 16:33:06 +00:00
vabene1111
f64be72a98 compiled translations 2022-09-26 09:18:19 +02:00
vabene1111
a3ed2bdcac Merge branch 'develop' of https://github.com/vabene1111/recipes into develop 2022-09-26 07:58:57 +02:00
vabene1111
996b8bedac fixed fuzzy search postgres 2022-09-26 07:58:52 +02:00
smarth42
a05a785e22 Update faq.md
updated user invite location.
2022-09-25 21:04:10 -05:00
Oliver Cervera
b470602317 Translated using Weblate (Italian)
Currently translated at 75.0% (345 of 460 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/it/
2022-09-25 12:33:12 +00:00
Oliver Cervera
cf8ab02d0e Translated using Weblate (Italian)
Currently translated at 81.1% (425 of 524 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/it/
2022-09-25 12:33:12 +00:00
vabene1111
60043fff59 changed contributions guidelines, please ask/talk first about new features 2022-09-23 17:07:04 +02:00
vabene1111
36c30f9e11 fixed print from card when recipe is not open 2022-09-23 16:55:25 +02:00
vabene1111
12a8582a9a fixed importer and copy recipe 2022-09-23 16:43:22 +02:00
vabene1111
13b91e5b91 improved swiping behavior on shopping list 2022-09-23 16:27:16 +02:00
vabene1111
d02b253242 fixed search settings not working with sqlite DB 2022-09-23 16:16:44 +02:00
henrique roberto lino
16528c4c89 Translated using Weblate (Portuguese)
Currently translated at 10.4% (48 of 460 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/pt/
2022-09-23 02:33:11 +00:00
henrique roberto lino
6442e174b3 Translated using Weblate (Portuguese (Brazil))
Currently translated at 35.0% (161 of 460 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/pt_BR/
2022-09-23 02:33:11 +00:00
dependabot[bot]
ca9c96647e Bump cryptography from 37.0.2 to 38.0.1
Bumps [cryptography](https://github.com/pyca/cryptography) from 37.0.2 to 38.0.1.
- [Release notes](https://github.com/pyca/cryptography/releases)
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/37.0.2...38.0.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-19 05:14:20 +00:00
dependabot[bot]
70e6585669 Bump django-webpack-loader from 1.5.0 to 1.6.0
Bumps [django-webpack-loader](https://github.com/django-webpack/django-webpack-loader) from 1.5.0 to 1.6.0.
- [Release notes](https://github.com/django-webpack/django-webpack-loader/releases)
- [Changelog](https://github.com/django-webpack/django-webpack-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/django-webpack/django-webpack-loader/compare/1.5.0...1.6.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-12 18:00:05 +00:00
dependabot[bot]
d0cb7a79f9 Bump webpack-bundle-tracker from 1.5.0 to 1.6.0 in /vue
Bumps [webpack-bundle-tracker](https://github.com/django-webpack/webpack-bundle-tracker) from 1.5.0 to 1.6.0.
- [Release notes](https://github.com/django-webpack/webpack-bundle-tracker/releases)
- [Commits](https://github.com/django-webpack/webpack-bundle-tracker/compare/1.5.0...1.6.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-09 16:09:30 +00:00
dependabot[bot]
cfd24de72a Bump workbox-navigation-preload from 6.5.3 to 6.5.4 in /vue
Bumps [workbox-navigation-preload](https://github.com/googlechrome/workbox) from 6.5.3 to 6.5.4.
- [Release notes](https://github.com/googlechrome/workbox/releases)
- [Commits](https://github.com/googlechrome/workbox/compare/v6.5.3...v6.5.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-09 16:07:08 +00:00
dependabot[bot]
54acfe3e39 Bump workbox-routing from 6.5.3 to 6.5.4 in /vue
Bumps [workbox-routing](https://github.com/googlechrome/workbox) from 6.5.3 to 6.5.4.
- [Release notes](https://github.com/googlechrome/workbox/releases)
- [Commits](https://github.com/googlechrome/workbox/compare/v6.5.3...v6.5.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-09 16:06:53 +00:00
dependabot[bot]
2f8b479fdd Bump @vue/cli-plugin-pwa from 5.0.4 to 5.0.8 in /vue
Bumps [@vue/cli-plugin-pwa](https://github.com/vuejs/vue-cli/tree/HEAD/packages/@vue/cli-plugin-pwa) from 5.0.4 to 5.0.8.
- [Release notes](https://github.com/vuejs/vue-cli/releases)
- [Changelog](https://github.com/vuejs/vue-cli/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-cli/commits/v5.0.8/packages/@vue/cli-plugin-pwa)

---
updated-dependencies:
- dependency-name: "@vue/cli-plugin-pwa"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-01 00:28:30 +00:00
67 changed files with 6916 additions and 985 deletions

View File

@@ -3,6 +3,8 @@
<words>
<w>autosync</w>
<w>chowdown</w>
<w>cookingmachine</w>
<w>cookit</w>
<w>csrftoken</w>
<w>gunicorn</w>
<w>ical</w>

View File

@@ -71,8 +71,7 @@ Because of that there are several ways you can support us
- **Let us host for you** We are offering a [hosted version](https://app.tandoor.dev) where all profits support us and the development of tandoor (currently only available in germany).
## Contributing
You can help out with the ongoing development by looking for potential bugs in our code base, or by contributing new features. We are always welcoming new pull requests containing bug fixes, refactors and new features. We have a list of tasks and bugs on our issue tracker on Github. Please comment on issues if you want to contribute with, to avoid duplicating effort.
Contributions are welcome but please read [this](https://docs.tandoor.dev/contribute/#contributing-code) **BEFORE** contributing anything!
## Your Feedback

View File

View File

@@ -0,0 +1,116 @@
import json
import random
from datetime import timedelta
import requests
from django.utils.timezone import now
from cookbook.models import CookingMachine
# Tandoor is not affiliated in any way or form with the holders of Trademark or other right associated with the mentioned names. All mentioned protected names are purely used to identify to the user a certain device or integration.
class HomeConnectCookit:
AUTH_AUTHORIZE_URL = 'https://api.home-connect.com/security/oauth/authorize'
AUTH_TOKEN_URL = 'https://api.home-connect.com/security/oauth/token'
AUTH_REFRESH_URL = 'https://api.home-connect.com/security/oauth/token'
RECIPE_API_URL = 'https://prod.reu.rest.homeconnectegw.com/user-generated-recipes/server/api/v1/recipes'
IMAGE_API_URL = 'https://prod.reu.rest.homeconnectegw.com/user-generated-recipes/server/api/v1/images'
CLIENT_ID = '' # TODO load from .env settings
_CLIENT_SECRET = '' # TODO load from .env settings
_cooking_machine = None
def __init__(self, cooking_machine):
self._cooking_machine = cooking_machine
def get_auth_link(self):
return f"{self.AUTH_AUTHORIZE_URL}?client_id={self.CLIENT_ID}&response_type=code&scope=IdentifyAppliance%20Settings&state={random.randint(100000, 999999)}"
def _validate_token(self):
if self._cooking_machine.access_token is None and self._cooking_machine.refresh_token is None:
return False # user needs to login
elif self._cooking_machine.access_token_expiry < now() + timedelta(minutes=10):
return False # refresh token
def _refresh_access_token(self):
token_response = requests.post(self.AUTH_REFRESH_URL, {
'grant_type': 'refresh_token',
'refresh_token': self._cooking_machine.refresh_token,
'client_secret': self._CLIENT_SECRET,
})
if token_response.status_code == 200:
token_response_body = json.loads(token_response.content)
self._cooking_machine.access_token = token_response_body['access_token']
self._cooking_machine.access_token_expiry = now() + timedelta(seconds=(token_response_body['expires_in'] - (60 * 10)))
self._cooking_machine.refresh_token = token_response_body['refresh_token']
self._cooking_machine.refresh_token_expiry = now() + timedelta(days=58)
self._cooking_machine.save()
def get_access_token(self, code):
token_response = requests.post(self.AUTH_TOKEN_URL, {
'grant_type': 'authorization_code',
'code': code,
'client_id': self.CLIENT_ID,
'client_secret': self._CLIENT_SECRET,
})
if token_response.status_code == 200:
token_response_body = json.loads(token_response.content)
self._cooking_machine.access_token = token_response_body['access_token']
self._cooking_machine.access_token_expiry = now() + timedelta(seconds=(token_response_body['expires_in'] - (60 * 10)))
self._cooking_machine.refresh_token = token_response_body['refresh_token']
self._cooking_machine.refresh_token_expiry = now() + timedelta(days=58)
self._cooking_machine.save()
def _get_default_headers(self):
auth_token = ''
return {
'authorization': f'Bearer {self._cooking_machine.access_token}',
'accept-language': "en-US",
"referer": "https://prod.reu.rest.homeconnectegw.com/user-generated- recipes/client/editor/recipedetails",
"user-agent": "Mozilla/5.0 (Linux; Android 10; Android SDK built for x86 Build/QSR1.210802.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.185 Mobile Safari/537.36",
"x-requested-with": "com.bshg.homeconnect.android.release"
}
def push_recipe(self, recipe):
data = {
"title": recipe.name,
"description": recipe.description,
"ingredients": [],
"steps": [],
"durations": {
"totalTime": (recipe.working_time + recipe.waiting_time) * 60,
"cookingTime": 0, # recipe.waiting_time * 60, #TODO cooking time must be sum of step duration attribute, otherwise creation fails
"preparationTime": recipe.working_time * 60,
},
"keywords": [],
"servings": {
"amount": int(recipe.servings),
"unit": 'portion', # required
},
"servingTipsStep": {
"textInstructions": "Serve"
},
"complexityLevel": "medium",
"image": {
"url": "https://media3.bsh-group.com/Recipes/800x480/17062805_210217_My-own-recipe_Picture_188ppi.jpg",
"mimeType": "image/jpeg"
# TODO add image upload
},
"accessories": [], # TODO add once tandoor supports tools
"legalDisclaimerApproved": True # TODO force user to approve disclaimer
}
for step in recipe.steps.all():
data['steps'].append({
"textInstructions": step.instruction
})
for i in step.ingredients.all():
data['ingredients'].append({
"amount": int(i.amount),
"unit": i.unit.name,
"name": i.food.name,
})
# TODO create synced recipe
response = requests.post(f'{self.RECIPE_API_URL}', json=data, headers=self._get_default_headers())
return response

View File

@@ -52,7 +52,6 @@ def has_group_permission(user, groups, no_cache=False):
return cached_result
result = False
print('running check', user, groups_allowed)
if user.is_authenticated:
if user_space := user.userspace_set.filter(active=True):
if len(user_space) != 1:

View File

@@ -21,7 +21,7 @@ def get_from_scraper(scrape, request):
# converting the scrape_me object to the existing json format based on ld+json
recipe_json = {}
try:
recipe_json['name'] = parse_name(scrape.title() or None)
recipe_json['name'] = parse_name(scrape.title()[:128] or None)
except Exception:
recipe_json['name'] = None
if not recipe_json['name']:

View File

@@ -7,7 +7,7 @@ from cookbook.helper.image_processing import get_filetype
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.helper.recipe_url_import import iso_duration_to_minutes
from cookbook.integration.integration import Integration
from cookbook.models import Ingredient, Keyword, Recipe, Step
from cookbook.models import Ingredient, Keyword, Recipe, Step, NutritionInformation
class NextcloudCookbook(Integration):
@@ -70,12 +70,21 @@ class NextcloudCookbook(Integration):
recipe.steps.add(step)
if 'nutrition' in recipe_json:
nutrition = {}
try:
recipe.nutrition.calories = recipe_json['nutrition']['calories'].replace(' kcal', '').replace(' ', '')
recipe.nutrition.proteins = recipe_json['nutrition']['calories'].replace(' g', '').replace(',', '.').replace(' ', '')
recipe.nutrition.fats = recipe_json['nutrition']['calories'].replace(' g', '').replace(',', '.').replace(' ', '')
recipe.nutrition.carbohydrates = recipe_json['nutrition']['calories'].replace(' g', '').replace(',', '.').replace(' ', '')
except Exception:
if 'calories' in recipe_json['nutrition']:
nutrition['calories'] = int(re.search(r'\d+', recipe_json['nutrition']['calories']).group())
if 'proteinContent' in recipe_json['nutrition']:
nutrition['proteins'] = int(re.search(r'\d+', recipe_json['nutrition']['proteinContent']).group())
if 'fatContent' in recipe_json['nutrition']:
nutrition['fats'] = int(re.search(r'\d+', recipe_json['nutrition']['fatContent']).group())
if 'carbohydrateContent' in recipe_json['nutrition']:
nutrition['carbohydrates'] = int(re.search(r'\d+', recipe_json['nutrition']['carbohydrateContent']).group())
if nutrition != {}:
recipe.nutrition = NutritionInformation.objects.create(**nutrition, space=self.request.space)
recipe.save()
except Exception as e:
pass
for f in self.files:

View File

@@ -41,7 +41,7 @@ class RecipeKeeper(Integration):
except AttributeError:
pass
step = Step.objects.create(instruction='', space=self.request.space,)
step = Step.objects.create(instruction='', space=self.request.space, )
ingredient_parser = IngredientParser(self.request, True)
for ingredient in file.find("div", {"itemprop": "recipeIngredients"}).findChildren("p"):
@@ -51,7 +51,7 @@ class RecipeKeeper(Integration):
f = ingredient_parser.get_food(food)
u = ingredient_parser.get_unit(unit)
step.ingredients.add(Ingredient.objects.create(
food=f, unit=u, amount=amount, note=note, original_text=ingredient, space=self.request.space,
food=f, unit=u, amount=amount, note=note, original_text=str(ingredient).replace('<p>', '').replace('</p>', ''), space=self.request.space,
))
for s in file.find("div", {"itemprop": "recipeDirections"}).find_all("p"):

View File

@@ -14,10 +14,10 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-07-12 19:20+0200\n"
"PO-Revision-Date: 2022-02-09 01:31+0000\n"
"Last-Translator: Marion Kämpfer <marion@murphyslantech.de>\n"
"Language-Team: French <http://translate.tandoor.dev/projects/tandoor/recipes-"
"backend/fr/>\n"
"PO-Revision-Date: 2022-09-26 16:33+0000\n"
"Last-Translator: Noé Feutry <noe.feutry@free.fr>\n"
"Language-Team: French <http://translate.tandoor.dev/projects/tandoor/"
"recipes-backend/fr/>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -85,7 +85,7 @@ msgstr "Commentaires"
#: .\cookbook\forms.py:66
msgid "Left-handed mode"
msgstr ""
msgstr "Mode gaucher"
#: .\cookbook\forms.py:70
msgid ""

File diff suppressed because it is too large Load Diff

View File

@@ -12,7 +12,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-07-12 19:20+0200\n"
"PO-Revision-Date: 2022-08-04 11:32+0000\n"
"PO-Revision-Date: 2022-09-25 12:33+0000\n"
"Last-Translator: Oliver Cervera <olivercervera@yahoo.it>\n"
"Language-Team: Italian <http://translate.tandoor.dev/projects/tandoor/"
"recipes-backend/it/>\n"
@@ -122,10 +122,8 @@ msgstr ""
"devono essere condivise per impostazione predefinita."
#: .\cookbook\forms.py:78
#, fuzzy
#| msgid "Try the new shopping list"
msgid "Users with whom to share shopping lists."
msgstr "Prova la nuova lista della spesa"
msgstr "Utenti con i quali condividere le liste della spesa."
#: .\cookbook\forms.py:80
msgid "Show recently viewed recipes on search page."
@@ -502,10 +500,8 @@ msgid "Fields on food that should be inherited by default."
msgstr "Alimento che dovrebbe essere rimpiazzato."
#: .\cookbook\forms.py:545
#, fuzzy
#| msgid "Show recently viewed recipes on search page."
msgid "Show recipe counts on search filters"
msgstr "Mostra le ricette visualizzate di recente nella pagina di ricerca."
msgstr "Mostra il conteggio delle ricette nei filtri di ricerca"
#: .\cookbook\helper\AllAuthCustomAdapter.py:36
msgid ""
@@ -552,10 +548,8 @@ msgid "One of queryset or hash_key must be provided"
msgstr ""
#: .\cookbook\helper\shopping_helper.py:152
#, fuzzy
#| msgid "You must provide at least a recipe or a title."
msgid "You must supply a servings size"
msgstr "Devi fornire almeno una ricetta o un titolo."
msgstr "Devi fornire le dimensione delle porzioni"
#: .\cookbook\helper\template_helper.py:64
#: .\cookbook\helper\template_helper.py:66
@@ -744,10 +738,8 @@ msgid "Recipe"
msgstr "Ricetta"
#: .\cookbook\models.py:1228
#, fuzzy
#| msgid "Foods"
msgid "Food"
msgstr "Alimenti"
msgstr "Alimento"
#: .\cookbook\models.py:1229 .\cookbook\templates\base.html:138
msgid "Keyword"
@@ -910,7 +902,7 @@ msgstr "Rimuovi"
#: .\cookbook\templates\account\email.html:58
msgid "Warning:"
msgstr "Avviso:"
msgstr "Attenzione:"
#: .\cookbook\templates\account\email.html:58
msgid ""
@@ -1169,7 +1161,7 @@ msgstr "Supermercato"
#: .\cookbook\templates\base.html:188
msgid "Supermarket Category"
msgstr "Categoria Supermercato"
msgstr "Categoria supermercato"
#: .\cookbook\templates\base.html:200 .\cookbook\views\lists.py:171
msgid "Automations"
@@ -1191,10 +1183,8 @@ msgstr "Cronologia"
#: .\cookbook\templates\base.html:252
#: .\cookbook\templates\ingredient_editor.html:7
#: .\cookbook\templates\ingredient_editor.html:13
#, fuzzy
#| msgid "Ingredients"
msgid "Ingredient Editor"
msgstr "Ingredienti"
msgstr "Editor Ingredienti"
#: .\cookbook\templates\base.html:264
#: .\cookbook\templates\export_response.html:7
@@ -1377,10 +1367,11 @@ msgid ""
msgstr ""
"\n"
" Questo modulo può essere utilizzato se, accidentalmente, sono stati "
"creati due (o più) unità di misura o ingredienti che dovrebbero essere lo "
"stesso. \n"
"Unisce due unità di misura o ingredienti e aggiorna tutte le ricette che li "
"utilizzano."
"creati due (o più) unità di misura o ingredienti che\n"
" dovrebbero essere lo stesso.\n"
" Unisce due unità di misura o ingredienti e aggiorna tutte le ricette "
"che li utilizzano.\n"
" "
#: .\cookbook\templates\forms\ingredients.html:26
msgid "Are you sure that you want to merge these two units?"
@@ -1398,7 +1389,7 @@ msgstr "Sei sicuro di volere unire questi due ingredienti?"
#: .\cookbook\templates\generic\delete_template.html:21
#, python-format
msgid "Are you sure you want to delete the %(title)s: <b>%(object)s</b> "
msgstr "Sei sicuro di volere eliminare %(title)s: <b>%(object)s</b>"
msgstr "Sei sicuro di volere eliminare %(title)s: <b>%(object)s</b> "
#: .\cookbook\templates\generic\delete_template.html:22
msgid "This cannot be undone!"
@@ -1490,11 +1481,14 @@ msgid ""
" "
msgstr ""
"\n"
"I campi <b>Password e Token</b> sono salvati <b>in chiaro</b> nel database.\n"
"È necessario perché servono per fare richieste API, ma questo aumenta il "
"rischio che\n"
"qualcuno possa impossessarsene.<br/>\n"
"Per liminare il danno puoi usare account con accesso limitato o i token."
" I campi <b>Password e Token</b> sono salvati <b>in chiaro</b> nel "
"database.\n"
" È necessario perché sono usati per fare richieste API, ma ciò "
"aumenta il rischio che\n"
" qualcuno possa impossessarsene.<br/>\n"
" Per liminare i possibili danni puoi usare account con accesso "
"limitato o i token.\n"
" "
#: .\cookbook\templates\index.html:29
msgid "Search recipe ..."
@@ -1541,16 +1535,17 @@ msgid ""
" "
msgstr ""
"\n"
" Markdown è un linguaggio di markup molto leggero che può essere "
" Markdown è un linguaggio di markup molto leggero che può essere "
"utilizzato per formattare facilmente del testo.\n"
" Questo sito utilizza la libreria <a href=\"https://python-markdown."
" Questo sito utilizza la libreria <a href=\"https://python-markdown."
"github.io/\" target=\"_blank\">Python Markdown</a> per\n"
" convertire il tuo testo in HTML formattato. È possibile trovare la "
" convertire il tuo testo in HTML formattato. È possibile trovare la "
"documentazione completa del markdown\n"
" <a href=\"https://daringfireball.net/projects/markdown/syntax\" target="
"\"_blank\">qui</a>.\n"
" Di seguito è possibile trovare una documentazione incompleta ma molto "
"probabilmente sufficiente."
" <a href=\"https://daringfireball.net/projects/markdown/syntax\" "
"target=\"_blank\">qui</a>.\n"
" Di seguito è possibile trovare una documentazione incompleta ma "
"probabilmente sufficiente.\n"
" "
#: .\cookbook\templates\markdown_info.html:25
msgid "Headers"
@@ -1697,7 +1692,7 @@ msgstr "Condiviso con"
#: .\cookbook\templates\meal_plan_entry.html:48
#: .\cookbook\templates\recipes_table.html:64
msgid "Last cooked"
msgstr "Cucinato ultimamente"
msgstr "Cucinato di recente"
#: .\cookbook\templates\meal_plan_entry.html:50
msgid "Never cooked before."
@@ -2136,7 +2131,8 @@ msgid ""
"You can sign in to your account using any of the following third party\n"
" accounts:"
msgstr ""
"Puoi accedere al tuo account usando uno dei seguenti account di terze parti:"
"Puoi accedere al tuo account usando uno di questi \n"
" account di terze parti:"
#: .\cookbook\templates\socialaccount\connections.html:52
msgid ""
@@ -2213,10 +2209,8 @@ msgid "Manage Subscription"
msgstr "Gestisci iscrizione"
#: .\cookbook\templates\space_overview.html:13 .\cookbook\views\delete.py:216
#, fuzzy
#| msgid "Space:"
msgid "Space"
msgstr "Istanza:"
msgstr "Istanza"
#: .\cookbook\templates\space_overview.html:17
msgid ""
@@ -2315,10 +2309,12 @@ msgid ""
" "
msgstr ""
"\n"
"Django Recipes è una applicazione gratuita e open source. È disponibile su "
"<a href=\"https://github.com/vabene1111/recipes\">GitHub</a>.\n"
"Le ultime novità sono disponibili <a href=\"https://github.com/vabene1111/"
"recipes/releases\">qui</a>."
" Django Recipes è una applicazione gratuita e open source. È "
"disponibile su\n"
" <a href=\"https://github.com/vabene1111/recipes\">GitHub</a>.\n"
" Puoi consultare le ultime novità <a href=\"https://github.com/"
"vabene1111/recipes/releases\">qui</a>.\n"
" "
#: .\cookbook\templates\system.html:36
msgid "Media Serving"
@@ -2327,7 +2323,7 @@ msgstr "File multimediali"
#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52
#: .\cookbook\templates\system.html:68
msgid "Warning"
msgstr "Avviso"
msgstr "Attenzione"
#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52
#: .\cookbook\templates\system.html:68 .\cookbook\templates\system.html:83
@@ -2343,11 +2339,12 @@ msgid ""
" your installation.\n"
" "
msgstr ""
"Erogare i file multimediali usando gunicorn/python <b>non è raccomandato</"
"b>!\n"
"Segui i passi descritti\n"
"<a href=\"https://github.com/vabene1111/recipes/releases/tag/0.8.1\">qui</a> "
"per aggiornare la tua installazione."
"<b>Non è raccomandato</b> erogare i file multimediali con gunicorn/pyton!\n"
" Segui i passi descritti\n"
" <a href=\"https://github.com/vabene1111/recipes/releases/tag/0.8."
"1\">qui</a> per aggiornare\n"
" la tua installazione.\n"
" "
#: .\cookbook\templates\system.html:45 .\cookbook\templates\system.html:61
#: .\cookbook\templates\system.html:76 .\cookbook\templates\system.html:90
@@ -2371,10 +2368,13 @@ msgid ""
" "
msgstr ""
"\n"
"Non hai inserito una <code>SECRET_KEY</code> nel file <code>.env</code>. "
"Django ha dovuto usare la chiave standard\n"
"dell'installazione che è pubblica e insicura! Sei pregato di aggiungere una\n"
"<code>SECRET_KEY</code> nel file di configurazione <code>.env</code>."
" Non hai inserito una <code>SECRET_KEY</code> nel file <code>."
"env</code>. Django ha dovuto usare la\n"
" chiave standard\n"
" dell'installazione che è pubblica e insicura! Sei pregato di "
"aggiungere una\n"
"\t\t\t<code>SECRET_KEY</code> nel file di configurazione <code>.env</code>.\n"
" "
#: .\cookbook\templates\system.html:66
msgid "Debug Mode"
@@ -2391,10 +2391,12 @@ msgid ""
" "
msgstr ""
"\n"
"Questa applicazione è in esecuzione in modalità di debug. Probabilmente non "
"è necessario, spegni la modalità di debug \n"
"configurando\n"
"<code>DEBUG=0</code> nel file di configurazione<code>.env</code>."
" Questa applicazione è in esecuzione in modalità di debug. "
"Probabilmente non è necessario, spegni la modalità di debug\n"
" configurando\n"
" <code>DEBUG=0</code> nel file di configurazione<code>.env</code>."
"\n"
" "
#: .\cookbook\templates\system.html:81
msgid "Database"
@@ -2413,9 +2415,10 @@ msgid ""
" "
msgstr ""
"\n"
"Questa applicazione non sta girando su un database Postgres. Non è "
"raccomandato perché alcune\n"
"funzionalità sono disponibili solo con un database Posgres."
" Questa applicazione non sta girando su un database Postgres. Non "
"è raccomandato perché alcune\n"
" funzionalità sono disponibili solo con un database Posgres.\n"
" "
#: .\cookbook\templates\url_import.html:8
msgid "URL Import"

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,31 @@
# Generated by Django 4.0.7 on 2022-10-02 11:51
import cookbook.models
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0184_alter_userpreference_image'),
]
operations = [
migrations.CreateModel(
name='CookingMachine',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('type', models.CharField(choices=[('HOMECONNECT_COOKIT', 'HomeConnect CookIt')], max_length=128)),
('name', models.CharField(max_length=128)),
('serial', models.CharField(blank=True, max_length=512, null=True)),
('description', models.TextField(blank=True, default='')),
('access_token', models.CharField(blank=True, max_length=4096, null=True)),
('access_token_expiry', models.DateTimeField(blank=True, null=True)),
('refresh_token', models.CharField(blank=True, max_length=4096, null=True)),
('refresh_token_expiry', models.DateTimeField(blank=True, null=True)),
('space', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cookbook.space')),
],
bases=(models.Model, cookbook.models.PermissionModelMixin),
),
]

View File

@@ -366,7 +366,7 @@ class UserPreference(models.Model, PermissionModelMixin):
)
user = AutoOneToOneField(User, on_delete=models.CASCADE, primary_key=True)
image = models.ForeignKey("UserFile", on_delete=models.SET_NULL, null=True,blank=True, related_name='user_image')
image = models.ForeignKey("UserFile", on_delete=models.SET_NULL, null=True, blank=True, related_name='user_image')
theme = models.CharField(choices=THEMES, max_length=128, default=TANDOOR)
nav_color = models.CharField(choices=COLORS, max_length=128, default=PRIMARY)
default_unit = models.CharField(max_length=32, default='g')
@@ -1010,6 +1010,27 @@ def default_valid_until():
return date.today() + timedelta(days=14)
class CookingMachine(models.Model, PermissionModelMixin):
# Tandoor is not affiliated in any way or form with the holders of Trademark or other right associated with the mentioned names. All mentioned protected names are purely used to identify to the user a certain device or integration.
HOMECONNECT_COOKIT = 'HOMECONNECT_COOKIT'
MACHINE_TYPES = (
(HOMECONNECT_COOKIT, _('HomeConnect CookIt')),
)
type = models.CharField(choices=MACHINE_TYPES, max_length=128)
name = models.CharField(max_length=128)
serial = models.CharField(max_length=512, null=True, blank=True)
description = models.TextField(default='', blank=True)
access_token = models.CharField(max_length=4096, null=True, blank=True)
access_token_expiry = models.DateTimeField(null=True, blank=True)
refresh_token = models.CharField(max_length=4096, null=True, blank=True)
refresh_token_expiry = models.DateTimeField(null=True, blank=True)
space = models.ForeignKey(Space, on_delete=models.CASCADE)
objects = ScopedManager(space='space')
class InviteLink(ExportModelOperationsMixin('invite_link'), models.Model, PermissionModelMixin):
uuid = models.UUIDField(default=uuid.uuid4)
email = models.EmailField(blank=True)

View File

@@ -709,7 +709,7 @@ class RecipeOverviewSerializer(RecipeBaseSerializer):
class Meta:
model = Recipe
fields = (
'id', 'name', 'description', 'image', 'keywords', 'working_time',
'id', 'name', 'description', 'image', 'keywords', 'working_time',
'waiting_time', 'created_by', 'created_at', 'updated_at',
'internal', 'servings', 'servings_text', 'rating', 'last_cooked', 'new', 'recent'
)
@@ -721,8 +721,8 @@ class RecipeSerializer(RecipeBaseSerializer):
steps = StepSerializer(many=True)
keywords = KeywordSerializer(many=True)
shared = UserSerializer(many=True, required=False)
rating = CustomDecimalField(required=False, allow_null=True)
last_cooked = serializers.DateTimeField(required=False, allow_null=True)
rating = CustomDecimalField(required=False, allow_null=True, read_only=True)
last_cooked = serializers.DateTimeField(required=False, allow_null=True, read_only=True)
class Meta:
model = Recipe
@@ -1124,14 +1124,14 @@ class AccessTokenSerializer(serializers.ModelSerializer):
token = serializers.SerializerMethodField('get_token')
def create(self, validated_data):
validated_data['token'] = f'tda_{str(uuid.uuid4()).replace("-","_")}'
validated_data['token'] = f'tda_{str(uuid.uuid4()).replace("-", "_")}'
validated_data['user'] = self.context['request'].user
return super().create(validated_data)
def get_token(self, obj):
if (timezone.now() - obj.created).seconds < 15:
return obj.token
return f'tda_************_******_***********{obj.token[len(obj.token)-4:]}'
return f'tda_************_******_***********{obj.token[len(obj.token) - 4:]}'
class Meta:
model = AccessToken

View File

@@ -67,6 +67,7 @@
function applyPreset(preset) {
$('#id_search-preset').val(preset);
$('#id_search-search').val('plain');
$('#search_form_button').click();
}
</script>

View File

@@ -10,6 +10,10 @@
{% block content_fluid %}
<a href="{{ login_url }}" target="_blank" rel="noreferrer nofollow">Login CookIt</a>
<br/>
<a href="?sync=748" >Sync</a>
{{ data }}
{% endblock %}

View File

@@ -120,6 +120,8 @@ urlpatterns = [
path('api/download-file/<int:file_id>/', api.download_file, name='api_download_file'),
path('cooking-machine/auth/homeconnect/', views.test2, name='cookingmachine_auth_homeconnect'),
path('dal/keyword/', dal.KeywordAutocomplete.as_view(), name='dal_keyword'),
# TODO is this deprecated? not yet, some old forms remain, could likely be changed to generic API endpoints
path('dal/food/', dal.IngredientsAutocomplete.as_view(), name='dal_food'), # TODO is this deprecated?

View File

@@ -170,7 +170,7 @@ class FuzzyFilterMixin(ViewSetMixin, ExtendedRecipeMixin):
'field', flat=True)])
if query is not None and query not in ["''", '']:
if fuzzy:
if fuzzy and (settings.DATABASES['default']['ENGINE'] in ['django.db.backends.postgresql_psycopg2', 'django.db.backends.postgresql']):
if any([self.model.__name__.lower() in x for x in
self.request.user.searchpreference.unaccent.values_list('field', flat=True)]):
self.queryset = self.queryset.annotate(trigram=TrigramSimilarity('name__unaccent', query))
@@ -1116,16 +1116,17 @@ class CustomAuthToken(ObtainAuthToken):
context={'request': request})
serializer.is_valid(raise_exception=True)
user = serializer.validated_data['user']
if token := AccessToken.objects.filter(scope__contains='read').filter(scope__contains='write').first():
if token := AccessToken.objects.filter(user=user, expires__gt=timezone.now(), scope__contains='read').filter(scope__contains='write').first():
access_token = token
else:
access_token = AccessToken.objects.create(user=request.user, token=f'tda_{str(uuid.uuid4()).replace("-", "_")}', expires=(timezone.now() + timezone.timedelta(days=365 * 5)), scope='read write app')
access_token = AccessToken.objects.create(user=user, token=f'tda_{str(uuid.uuid4()).replace("-", "_")}', expires=(timezone.now() + timezone.timedelta(days=365 * 5)), scope='read write app')
return Response({
'id': access_token.id,
'token': access_token.token,
'scope': access_token.scope,
'expires': access_token.expires,
'user_id': user.pk,
'user_id': access_token.user.pk,
'test': user.pk
})

View File

@@ -20,12 +20,13 @@ from django.utils.translation import gettext as _
from django_scopes import scopes_disabled
from oauth2_provider.models import AccessToken
from cookbook.cooking_machines.homeconnect_cookit import HomeConnectCookit
from cookbook.forms import (CommentForm, Recipe, SearchPreferenceForm, ShoppingPreferenceForm,
SpaceCreateForm, SpaceJoinForm, User,
UserCreateForm, UserNameForm, UserPreference, UserPreferenceForm)
from cookbook.helper.permission_helper import group_required, has_group_permission, share_link_valid, switch_user_active_space
from cookbook.models import (Comment, CookLog, InviteLink, SearchFields, SearchPreference, ShareLink,
Space, ViewLog, UserSpace)
Space, ViewLog, UserSpace, CookingMachine)
from cookbook.tables import (CookLogTable, ViewLogTable)
from recipes.version import BUILD_REF, VERSION_NUMBER
@@ -215,7 +216,6 @@ def shopping_settings(request):
if request.method == "POST":
if 'search_form' in request.POST:
active_tab = 'search'
search_form = SearchPreferenceForm(request.POST, prefix='search')
if search_form.is_valid():
if not sp:
@@ -226,7 +226,28 @@ def shopping_settings(request):
+ len(search_form.cleaned_data['trigram'])
+ len(search_form.cleaned_data['fulltext'])
)
if fields_searched == 0:
if search_form.cleaned_data['preset'] == 'fuzzy':
sp.search = SearchPreference.SIMPLE
sp.lookup = True
sp.unaccent.set([SearchFields.objects.get(name='Name')])
sp.icontains.set([SearchFields.objects.get(name='Name')])
sp.istartswith.clear()
sp.trigram.set([SearchFields.objects.get(name='Name')])
sp.fulltext.clear()
sp.trigram_threshold = 0.2
sp.save()
elif search_form.cleaned_data['preset'] == 'precise':
sp.search = SearchPreference.WEB
sp.lookup = True
sp.unaccent.set(SearchFields.objects.all())
# full text on food is very slow, add search_vector field and index it (including Admin functions and postsave signal to rebuild index)
sp.icontains.set([SearchFields.objects.get(name='Name')])
sp.istartswith.set([SearchFields.objects.get(name='Name')])
sp.trigram.clear()
sp.fulltext.set(SearchFields.objects.filter(name__in=['Ingredients']))
sp.trigram_threshold = 0.2
sp.save()
elif fields_searched == 0:
search_form.add_error(None, _('You must select at least one field to search!'))
search_error = True
elif search_form.cleaned_data['search'] in ['websearch', 'raw'] and len(
@@ -247,29 +268,9 @@ def shopping_settings(request):
sp.trigram.set(search_form.cleaned_data['trigram'])
sp.fulltext.set(search_form.cleaned_data['fulltext'])
sp.trigram_threshold = search_form.cleaned_data['trigram_threshold']
if search_form.cleaned_data['preset'] == 'fuzzy':
sp.search = SearchPreference.SIMPLE
sp.lookup = True
sp.unaccent.set([SearchFields.objects.get(name='Name')])
sp.icontains.set([SearchFields.objects.get(name='Name')])
sp.istartswith.clear()
sp.trigram.set([SearchFields.objects.get(name='Name')])
sp.fulltext.clear()
sp.trigram_threshold = 0.2
if search_form.cleaned_data['preset'] == 'precise':
sp.search = SearchPreference.WEB
sp.lookup = True
sp.unaccent.set(SearchFields.objects.all())
# full text on food is very slow, add search_vector field and index it (including Admin functions and postsave signal to rebuild index)
sp.icontains.set([SearchFields.objects.get(name='Name')])
sp.istartswith.set([SearchFields.objects.get(name='Name')])
sp.trigram.clear()
sp.fulltext.set(SearchFields.objects.filter(name__in=['Ingredients']))
sp.trigram_threshold = 0.2
sp.save()
else:
search_error = True
fields_searched = len(sp.icontains.all()) + len(sp.istartswith.all()) + len(sp.trigram.all()) + len(
sp.fulltext.all())
@@ -281,10 +282,10 @@ def shopping_settings(request):
# these fields require postgresql - just disable them if postgresql isn't available
if not settings.DATABASES['default']['ENGINE'] in ['django.db.backends.postgresql_psycopg2',
'django.db.backends.postgresql']:
search_form.fields['search'].disabled = True
search_form.fields['lookup'].disabled = True
search_form.fields['trigram'].disabled = True
search_form.fields['fulltext'].disabled = True
sp.search = SearchPreference.SIMPLE
sp.trigram.clear()
sp.fulltext.clear()
sp.save()
return render(request, 'settings.html', {
'search_form': search_form,
@@ -434,17 +435,22 @@ def test(request):
if not settings.DEBUG:
return HttpResponseRedirect(reverse('index'))
from cookbook.helper.ingredient_parser import IngredientParser
parser = IngredientParser(request, False)
machine = CookingMachine.objects.get_or_create(type=CookingMachine.HOMECONNECT_COOKIT, name='Test', space=request.space)[0]
test = HomeConnectCookit(machine)
data = {
'original': '1 Porreestange(n) , ca. 200 g'
}
data['parsed'] = parser.parse(data['original'])
return render(request, 'test.html', {'data': data})
return render(request, 'test.html', {'login_url': test.get_auth_link()})
def test2(request):
if not settings.DEBUG:
return HttpResponseRedirect(reverse('index'))
machine = CookingMachine.objects.get_or_create(type=CookingMachine.HOMECONNECT_COOKIT, name='Test', space=request.space)[0]
test = HomeConnectCookit(machine)
if 'code' in request.GET:
test.get_access_token(request.GET['code'])
if 'sync' in request.GET:
result = test.push_recipe(Recipe.objects.get(pk=request.GET['sync'], space=request.space))
return render(request, 'test.html', {'data': request})

View File

@@ -11,8 +11,13 @@ over at [GitHub issues](https://github.com/vabene1111/recipes/issues).
Without feedback improvement can't happen, so don't hesitate to say what you want to say.
## Contributing Code
Code contributions are always welcome. There are no special rules for what you need to do,
just do your best and we will work together to get your idea and code merged into the project.
If you want to contribute bug fixes or small tweaks then your pull requests are always welcome!
!!! danger "Discuss First!"
If you want to contribute larger features that introduce more complexity to the project please
make sure to **first submit a technical description** outlining what and how you want to do it.
This allows me and the community to give feedback and manage the complexity of the overall
application. If you don't do this please don't be mad if I reject your PR
!!! info
The dev setup is a little messy as this application combines the best (at least in my opinion) of both Django and Vue.js.

View File

@@ -53,7 +53,7 @@ If removed, the nginx webserver needs to be replaced by something else that serv
Please refer to [here](install/docker.md#setup-issues-on-raspberry-pi).
## How can I create users?
To create a new user click on your name (top right corner) and select system. There click on invite links and create a new invite link.
To create a new user click on your name (top right corner) and select 'space settings'. There under invites click create.
It is not possible to create users through the admin because users must be assigned a default group and space.

12
node_modules/.yarn-integrity generated vendored Normal file
View File

@@ -0,0 +1,12 @@
{
"systemParams": "win32-x64-93",
"modulesFolders": [
"node_modules"
],
"flags": [],
"linkedModules": [],
"topLevelPatterns": [],
"lockfileEntries": {},
"files": [],
"artifacts": {}
}

View File

@@ -1,11 +1,11 @@
Django==4.0.7
cryptography==37.0.2
cryptography==38.0.1
django-annoying==0.10.6
django-autocomplete-light==3.9.4
django-cleanup==6.0.0
django-crispy-forms==1.14.0
django-tables2==2.4.1
djangorestframework==3.13.1
djangorestframework==3.14.0
drf-writable-nested==0.7.0
django-oauth-toolkit==2.1.0
django-debug-toolbar==3.6.0
@@ -27,20 +27,20 @@ uritemplate==4.1.1
beautifulsoup4==4.11.1
microdata==0.8.0
Jinja2==3.1.2
django-webpack-loader==1.5.0
django-webpack-loader==1.6.0
git+https://github.com/ierror/django-js-reverse@7cab78c4531780ab4b32033d5104ccd5be1a246a
django-allauth==0.51.0
recipe-scrapers==14.14.0
recipe-scrapers==14.14.1
django-scopes==1.2.0.post1
pytest==7.1.2
pytest==7.1.3
pytest-django==4.5.2
django-treebeard==4.5.1
django-cors-headers==3.13.0
django-storages==1.12.3
boto3==1.24.21
django-storages==1.13.1
boto3==1.24.84
django-prometheus==2.2.0
django-hCaptcha==0.2.0
python-ldap==3.4.2
python-ldap==3.4.3
django-auth-ldap==4.1.0
pytest-factoryboy==2.5.0
pyppeteer==1.0.2

View File

@@ -8,61 +8,61 @@
"lint": "vue-cli-service lint"
},
"dependencies": {
"@babel/eslint-parser": "^7.16.0",
"@babel/eslint-parser": "^7.19.1",
"@kevinfaguiar/vue-twemoji-picker": "^5.7.4",
"@popperjs/core": "^2.11.2",
"@popperjs/core": "^2.11.6",
"@riophae/vue-treeselect": "^0.4.0",
"@vue/cli": "^5.0.4",
"@vue/cli": "^5.0.8",
"axios": "^0.27.2",
"babel": "^6.23.0",
"babel-core": "^6.26.3",
"babel-loader": "^8.2.5",
"bootstrap-vue": "^2.21.2",
"core-js": "^3.25.0",
"core-js": "^3.25.3",
"html2pdf.js": "^0.10.1",
"lodash": "^4.17.21",
"mavon-editor": "^2.10.4",
"moment": "^2.29.4",
"prismjs": "^1.27.0",
"prismjs": "^1.29.0",
"vue": "^2.6.14",
"vue-class-component": "^7.2.3",
"vue-click-outside": "^1.1.0",
"vue-clickaway": "^2.2.2",
"vue-clipboard2": "^0.3.3",
"vue-cookies": "^1.8.1",
"vue-i18n": "^8.26.8",
"vue-i18n": "^8.27.2",
"vue-infinite-loading": "^2.4.5",
"vue-multiselect": "^2.1.6",
"vue-property-decorator": "^9.1.2",
"vue-sanitize": "^0.2.2",
"vue-simple-calendar": "^5.0.0",
"vue-template-compiler": "^2.6.14",
"vue2-touch-events": "^3.2.2",
"vuedraggable": "^2.24.3",
"vuex": "^3.6.0",
"workbox-webpack-plugin": "^6.3.0"
"vue-template-compiler": "2.6.14",
"workbox-webpack-plugin": "^6.5.4"
},
"devDependencies": {
"@kazupon/vue-i18n-loader": "^0.5.0",
"@typescript-eslint/eslint-plugin": "^4.33.0",
"@typescript-eslint/parser": "^4.32.0",
"@vue/cli-plugin-babel": "^5.0.4",
"@vue/cli-plugin-eslint": "~5.0.4",
"@vue/cli-plugin-pwa": "^5.0.4",
"@vue/cli-plugin-typescript": "^5.0.4",
"@vue/cli-service": "^5.0.4",
"@vue/compiler-sfc": "^3.2.29",
"@vue/cli-plugin-babel": "^5.0.8",
"@vue/cli-plugin-eslint": "~5.0.8",
"@vue/cli-plugin-pwa": "^5.0.8",
"@vue/cli-plugin-typescript": "^5.0.8",
"@vue/cli-service": "^5.0.8",
"@vue/compiler-sfc": "^3.2.40",
"@vue/eslint-config-typescript": "^10.0.0",
"babel-eslint": "^10.1.0",
"eslint": "^7.28.0",
"eslint-plugin-vue": "^8.7.1",
"typescript": "~4.8.2",
"typescript": "~4.8.4",
"vue-cli-plugin-i18n": "^2.3.1",
"webpack-bundle-tracker": "1.5.0",
"workbox-expiration": "^6.3.0",
"workbox-navigation-preload": "^6.0.2",
"workbox-precaching": "^6.5.3",
"workbox-routing": "^6.5.0",
"webpack-bundle-tracker": "1.6.0",
"workbox-expiration": "^6.5.4",
"workbox-navigation-preload": "^6.5.4",
"workbox-precaching": "^6.5.4",
"workbox-routing": "^6.5.4",
"workbox-strategies": "^6.2.4"
},
"eslintConfig": {

View File

@@ -576,6 +576,21 @@
<i class="fas fa-code"></i>
{{ $t("Copy_template_reference") }}
</button>
<button type="button" class="dropdown-item"
@click="duplicateIngredient(step, ingredient, index + 1)">
<i class="fas fa-copy"></i>
{{ $t("Copy") }}
</button>
<button type="button" class="dropdown-item" v-if="index > 0"
@click="moveIngredient(step, ingredient, index-1)">
<i class="fas fa-arrow-up"></i>
{{ $t("Up") }}
</button>
<button type="button" class="dropdown-item" v-if="index !== step.ingredients.length - 1"
@click="moveIngredient(step, ingredient, index+1)">
<i class="fas fa-arrow-down"></i>
{{ $t("Down") }}
</button>
</div>
</div>
</div>
@@ -648,7 +663,8 @@
v-if="recipe !== undefined">
<div class="col-3 col-md-6 mb-1 mb-md-0 pr-2 pl-2">
<a :href="resolveDjangoUrl('delete_recipe', recipe.id)"
class="d-block d-md-none btn btn-block btn-danger shadow-none btn-sm"><i class="fa fa-trash fa-lg"></i></a>
class="d-block d-md-none btn btn-block btn-danger shadow-none btn-sm"><i
class="fa fa-trash fa-lg"></i></a>
<a :href="resolveDjangoUrl('delete_recipe', recipe.id)"
class="d-none d-md-block btn btn-block btn-danger shadow-none btn-sm">{{ $t("Delete") }}</a>
</div>
@@ -1039,6 +1055,12 @@ export default {
this.recipe.steps.splice(new_index < 0 ? 0 : new_index, 0, step)
this.sortSteps()
},
moveIngredient: function (step, ingredient, new_index) {
step.ingredients.splice(step.ingredients.indexOf(ingredient), 1)
step.ingredients.splice(new_index < 0 ? 0 : new_index, 0, ingredient)
this.sortIngredients(step)
},
addFoodType: function (tag, index) {
let [tmp, step, id] = index.split("_")
@@ -1212,6 +1234,10 @@ export default {
}
})
},
duplicateIngredient: function (step, ingredient, new_index) {
delete ingredient.id
step.ingredients.splice(new_index < 0 ? 0 : new_index, 0, ingredient)
}
},
}
</script>

View File

@@ -75,7 +75,7 @@
</div>
<div class="col col-md-2 col-2 mt-2 mt-md-0 text-right">
<recipe-context-menu v-bind:recipe="recipe" :servings="servings"></recipe-context-menu>
<recipe-context-menu v-bind:recipe="recipe" :servings="servings" :disabled_options="{print:false}"></recipe-context-menu>
</div>
</div>
<hr/>

View File

@@ -3,15 +3,15 @@
<template v-if="recipe && recipe.loading">
<b-card no-body v-hover>
<b-card-img-lazy style="height: 15vh; object-fit: cover" class="" :src="placeholder_image"
v-bind:alt="$t('Recipe_Image')" top></b-card-img-lazy>
v-bind:alt="$t('Recipe_Image')" top></b-card-img-lazy>
<b-card-body class="p-4">
<b-card-body class="p-4">
<h6>
<b-skeleton width="95%"></b-skeleton>
</h6>
<b-card-text>
<b-skeleton height="12px" :width="(45 + Math.random() * 45).toString() + '%'"></b-skeleton>
<b-skeleton height="12px" :width="(45 + Math.random() * 45).toString() + '%'"></b-skeleton>
<b-skeleton height="12px" :width="(20 + Math.random() * 25).toString() + '%'"></b-skeleton>
<b-skeleton height="12px" :width="(30 + Math.random() * 35).toString() + '%'"></b-skeleton>
</b-card-text>
@@ -28,7 +28,7 @@
class="card-img-overlay h-100 d-flex flex-column justify-content-right float-right text-right pt-2 pr-1"
v-if="show_context_menu">
<a>
<recipe-context-menu :recipe="recipe" class="float-right"
<recipe-context-menu :recipe="recipe" class="float-right" :disabled_options="context_disabled_options"
v-if="recipe !== null"></recipe-context-menu>
</a>
</div>
@@ -124,7 +124,8 @@ export default {
footer_text: String,
footer_icon: String,
detailed: {type: Boolean, default: true},
show_context_menu: {type: Boolean, default: true}
show_context_menu: {type: Boolean, default: true},
context_disabled_options: Object,
},
data() {
return {

View File

@@ -7,54 +7,54 @@
</a>
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenuLink">
<a class="dropdown-item" :href="resolveDjangoUrl('edit_recipe', recipe.id)"><i
<a class="dropdown-item" :href="resolveDjangoUrl('edit_recipe', recipe.id)" v-if="!disabled_options.edit"><i
class="fas fa-pencil-alt fa-fw"></i> {{ $t("Edit") }}</a>
<a class="dropdown-item" :href="resolveDjangoUrl('edit_convert_recipe', recipe.id)"
v-if="!recipe.internal"><i class="fas fa-exchange-alt fa-fw"></i> {{ $t("convert_internal") }}</a>
v-if="!recipe.internal && !disabled_options.convert"><i class="fas fa-exchange-alt fa-fw"></i> {{ $t("convert_internal") }}</a>
<a href="javascript:void(0);">
<button class="dropdown-item" @click="$bvModal.show(`id_modal_add_book_${modal_id}`)"><i
<button class="dropdown-item" @click="$bvModal.show(`id_modal_add_book_${modal_id}`)" v-if="!disabled_options.books"><i
class="fas fa-bookmark fa-fw"></i> {{ $t("Manage_Books") }}
</button>
</a>
<a class="dropdown-item" v-if="recipe.internal" @click="addToShopping" href="#"> <i
<a class="dropdown-item" v-if="recipe.internal && !disabled_options.shopping" @click="addToShopping" href="#" > <i
class="fas fa-shopping-cart fa-fw"></i> {{ $t("Add_to_Shopping") }} </a>
<a class="dropdown-item" @click="createMealPlan" href="javascript:void(0);"><i
<a class="dropdown-item" @click="createMealPlan" href="javascript:void(0);" v-if="!disabled_options.plan"><i
class="fas fa-calendar fa-fw"></i> {{ $t("Add_to_Plan") }} </a>
<a href="javascript:void(0);">
<button class="dropdown-item" @click="$bvModal.show(`id_modal_cook_log_${modal_id}`)"><i
<button class="dropdown-item" @click="$bvModal.show(`id_modal_cook_log_${modal_id}`)" v-if="!disabled_options.log"><i
class="fas fa-clipboard-list fa-fw"></i> {{ $t("Log_Cooking") }}
</button>
</a>
<a href="javascript:void(0);">
<button class="dropdown-item" onclick="window.print()">
<button class="dropdown-item" onclick="window.print()" v-if="!disabled_options.print">
<i class="fas fa-print fa-fw"></i>
{{ $t("Print") }}
</button>
</a>
<a href="javascript:void(0);">
<button class="dropdown-item" @click="copyToNew"><i class="fas fa-copy fa-fw"></i>
<button class="dropdown-item" @click="copyToNew" v-if="!disabled_options.copy"><i class="fas fa-copy fa-fw"></i>
{{ $t("copy_to_new") }}
</button>
</a>
<a class="dropdown-item" :href="resolveDjangoUrl('view_export') + '?r=' + recipe.id" target="_blank"
rel="noopener noreferrer"><i class="fas fa-file-export fa-fw"></i> {{ $t("Export") }}</a>
rel="noopener noreferrer" v-if="!disabled_options.export"><i class="fas fa-file-export fa-fw"></i> {{ $t("Export") }}</a>
<a href="javascript:void(0);">
<button class="dropdown-item" @click="pinRecipe()">
<button class="dropdown-item" @click="pinRecipe()" v-if="!disabled_options.pin">
<i class="fas fa-thumbtack fa-fw"></i>
{{ $t("Pin") }}
</button>
</a>
<a href="javascript:void(0);">
<button class="dropdown-item" @click="createShareLink()" v-if="recipe.internal"><i
<button class="dropdown-item" @click="createShareLink()" v-if="recipe.internal && !disabled_options.share" ><i
class="fas fa-share-alt fa-fw"></i> {{ $t("Share") }}
</button>
</a>
@@ -147,6 +147,10 @@ export default {
type: Number,
default: -1,
},
disabled_options: {
type: Object,
default: () => ({print:true}),
},
},
mounted() {
this.servings_value = this.servings === -1 ? this.recipe.servings : this.servings

View File

@@ -31,12 +31,12 @@
</b-col>
<b-col cols="8">
<b-row class="d-flex h-100">
<b-col cols="6" md="3" class="d-flex align-items-center"
<b-col cols="6" md="3" class="d-flex align-items-center" v-touch:start="startHandler" v-touch:moving="moveHandler" v-touch:end="endHandler"
v-if="Object.entries(formatAmount).length == 1">
<strong class="mr-1">{{ Object.entries(formatAmount)[0][1] }}</strong>
{{ Object.entries(formatAmount)[0][0] }}
</b-col>
<b-col cols="6" md="3" class="d-flex flex-column"
<b-col cols="6" md="3" class="d-flex flex-column" v-touch:start="startHandler" v-touch:moving="moveHandler" v-touch:end="endHandler"
v-if="Object.entries(formatAmount).length != 1">
<div class="small" v-for="(x, i) in Object.entries(formatAmount)" :key="i">
{{ x[1] }} &ensp;
@@ -44,11 +44,10 @@
</div>
</b-col>
<b-col cols="6" md="6" class="align-items-center d-flex pl-0 pr-0 pl-md-2 pr-md-2"
v-touch:start="startHandler" v-touch:moving="moveHandler" v-touch:end="endHandler">
<b-col cols="6" md="6" class="align-items-center d-flex pl-0 pr-0 pl-md-2 pr-md-2">
{{ formatFood }}
</b-col>
<b-col cols="3" data-html2canvas-ignore="true"
<b-col cols="3" data-html2canvas-ignore="true" v-touch:start="startHandler" v-touch:moving="moveHandler" v-touch:end="endHandler"
class="align-items-center d-none d-md-flex justify-content-end">
<b-button size="sm" @click="showDetails = !showDetails"
class="p-0 mr-0 mr-md-2 p-md-2 text-decoration-none" variant="link">
@@ -62,7 +61,7 @@
</b-col>
</b-row>
</b-col>
<b-col cols="2" class="justify-content-start align-items-center d-flex d-md-none pl-0 pr-0"
<b-col cols="2" class="justify-content-start align-items-center d-flex d-md-none pl-0 pr-0" v-touch:start="startHandler" v-touch:moving="moveHandler" v-touch:end="endHandler"
v-if="!settings.left_handed">
<b-button size="sm" @click="showDetails = !showDetails" class="d-inline-block d-md-none p-0"
variant="link">

View File

@@ -8,7 +8,7 @@
<template v-if="step.name">{{ step.name }}</template>
<template v-else>{{ $t("Step") }} {{ index + 1 }}</template>
<small style="margin-left: 4px" class="text-muted" v-if="step.time !== 0"><i
class="fas fa-user-clock"></i> {{ step.time }} {{ $t("min") }} </small>
class="fas fa-user-clock"></i> {{ step_time }}</small>
<small v-if="start_time !== ''" class="d-print-none">
<b-link :id="`id_reactive_popover_${step.id}`" @click="openPopover" href="#">
{{ moment(start_time).add(step.time_offset, "minutes").format("HH:mm") }}
@@ -131,7 +131,7 @@ import CompileComponent from "@/components/CompileComponent"
import IngredientsCard from "@/components/IngredientsCard"
import Vue from "vue"
import moment from "moment"
import {ResolveUrlMixin} from "@/utils/utils"
import {ResolveUrlMixin, calculateHourMinuteSplit} from "@/utils/utils"
Vue.prototype.moment = moment
@@ -150,6 +150,10 @@ export default {
default: false,
},
},
computed: {
step_time: function() {
return calculateHourMinuteSplit(this.step.time)},
},
data() {
return {
details_visible: true,

View File

@@ -394,5 +394,13 @@
"Copy Link": "Copier le lien",
"Default_Unit": "Unité par défaut",
"Hour": "Heure",
"Day": "Jour"
"Day": "Jour",
"food_inherit_info": "Champs sur les ingrédients qui doivent être hérité par défaut.",
"Invites": "Invitations",
"paste_json": "Collez une source json ou html pour charger la recette.",
"warning_space_delete": "Vous pouvez supprimer votre groupe ainsi que toutes les recettes, listes de courses, menus et autres choses que vous avez créés. Vous ne pourrez pas revenir sur cette suppression ! Êtes-vous sûr de vouloir le faire ?",
"Comments_setting": "Montrer les commentaires",
"import_duplicates": "Pour éviter les doublons, les recettes de même nom seront ignorées. Cocher la case pour tout importer.",
"Account": "Compte",
"Change_Password": "Modifier le mot de passe"
}

462
vue/src/locales/id.json Normal file
View File

@@ -0,0 +1,462 @@
{
"warning_feature_beta": "Fitur ini saat ini dalam status BETA (pengujian). Harap perkirakan bug dan kemungkinan kerusakan perubahan di masa mendatang (mungkin kehilangan data terkait fitur) saat menggunakan fitur ini.",
"err_fetching_resource": "Terjadi kesalahan saat mengambil sumber daya!",
"err_creating_resource": "Terjadi kesalahan saat membuat sumber daya!",
"err_updating_resource": "Terjadi kesalahan saat mengupdate sumber daya!",
"err_deleting_resource": "Terjadi kesalahan saat menghapus sumber daya!",
"err_deleting_protected_resource": "Objek yang Anda coba hapus masih digunakan dan tidak dapat dihapus.",
"err_moving_resource": "Terjadi kesalahan saat memindahkan sumber daya!",
"err_merging_resource": "Terjadi kesalahan saat menggabungkan sumber daya!",
"success_fetching_resource": "Berhasil mengambil sumber daya!",
"success_creating_resource": "Berhasil membuat sumber daya!",
"success_updating_resource": "Berhasil memperbarui sumber daya!",
"success_deleting_resource": "Berhasil menghapus sumber daya!",
"success_moving_resource": "Berhasil memindahkan sumber daya!",
"success_merging_resource": "Berhasil menggabungkan sumber daya!",
"file_upload_disabled": "Unggahan file tidak diaktifkan untuk ruang Anda.",
"warning_space_delete": "Anda dapat menghapus ruang Anda termasuk semua resep, daftar belanja, rencana makan, dan apa pun yang telah Anda buat. Ini tidak dapat dibatalkan! Apakah Anda yakin ingin melakukan ini?",
"food_inherit_info": "Bidang pada makanan yang harus diwarisi secara default.",
"facet_count_info": "Tampilkan jumlah resep pada filter pencarian.",
"step_time_minutes": "Langkah waktu dalam menit",
"confirm_delete": "Anda yakin ingin menghapus {object} ini?",
"import_running": "Impor berjalan, harap tunggu!",
"all_fields_optional": "Semua bidang adalah opsional dan dapat dibiarkan kosong.",
"convert_internal": "Ubah ke resep internal",
"show_only_internal": "Hanya tampilkan resep internal",
"show_split_screen": "Tampilan Terpisah",
"Log_Recipe_Cooking": "Log Resep Memasak",
"External_Recipe_Image": "Gambar Resep Eksternal",
"Add_to_Shopping": "Tambahkan ke Belanja",
"Add_to_Plan": "Tambahkan ke Rencana",
"Step_start_time": "Langkah waktu mulai",
"Sort_by_new": "Urutkan berdasarkan baru",
"Table_of_Contents": "Daftar isi",
"Recipes_per_page": "Resep per Halaman",
"Show_as_header": "Tampilkan sebagai tajuk",
"Hide_as_header": "Sembunyikan sebagai tajuk",
"Add_nutrition_recipe": "Tambahkan nutrisi ke resep",
"Remove_nutrition_recipe": "Hapus nutrisi dari resep",
"Copy_template_reference": "Salin referensi template",
"Save_and_View": "Simpan & Lihat",
"Manage_Books": "Kelola Buku",
"Meal_Plan": "rencana makan",
"Select_Book": "Pilih Buku",
"Select_File": "Pilih Buku",
"Recipe_Image": "Gambar Resep",
"Import_finished": "Impor selesai",
"View_Recipes": "Lihat Resep",
"Log_Cooking": "Log Memasak",
"New_Recipe": "Resep Baru",
"Url_Import": "Impor Url",
"Reset_Search": "Setel Ulang Pencarian",
"Recently_Viewed": "baru saja dilihat",
"Load_More": "Muat lebih banyak",
"New_Keyword": "Kata Kunci Baru",
"Delete_Keyword": "Hapus Kata Kunci",
"Edit_Keyword": "Rubah Kata Kunci",
"Edit_Recipe": "Rubah Resep",
"Move_Keyword": "Pindahkan Kata Kunci",
"Merge_Keyword": "Gabungkan Kata Kunci",
"Hide_Keywords": "Sembunyikan Kata Kunci",
"Hide_Recipes": "Sembunyikan Resep",
"Move_Up": "Pindahkan keatas",
"Move_Down": "Pindahkan kebawah",
"Step_Name": "Nama Langkah",
"Step_Type": "Tipe Langkah",
"Make_Header": "Buat Header",
"Make_Ingredient": "Buat bahan",
"Enable_Amount": "Aktifkan Jumlah",
"Disable_Amount": "Nonaktifkan Jumlah",
"Ingredient Editor": "Editor Bahan",
"Private_Recipe": "Resep Pribadi",
"Private_Recipe_Help": "Resep hanya diperlihatkan kepada Anda dan orang-orang yang dibagikan resep tersebut.",
"reusable_help_text": "Haruskah tautan undangan dapat digunakan untuk lebih dari satu pengguna.",
"Add_Step": "Tambahkan Langkah",
"Keywords": "Kata Kunci",
"Books": "Buku",
"Proteins": "Protein",
"Fats": "Lemak",
"Carbohydrates": "Karbohidrat",
"Calories": "Kalori",
"Energy": "Energi",
"Nutrition": "Nutrisi",
"Date": "Tanggal",
"Share": "Bagikan",
"Automation": "Automatis",
"Parameter": "Parameter",
"Export": "Ekspor",
"Copy": "Salin",
"Rating": "Peringkat",
"Close": "Tutup",
"Cancel": "Batal",
"Link": "Link",
"Add": "Tambahkan",
"New": "Baru",
"Note": "Catatan",
"Success": "Sukses",
"Failure": "Kegagalan",
"Protected": "Terlindung",
"Ingredients": "bahan-bahan",
"Supermarket": "Supermarket",
"Categories": "Kategori",
"Category": "Kategori",
"Selected": "Terpilih",
"min": "min",
"Servings": "Porsi",
"Waiting": "Menunggu",
"Preparation": "",
"External": "",
"Size": "",
"Files": "",
"File": "",
"Edit": "",
"Image": "",
"Delete": "",
"Open": "",
"Ok": "",
"Save": "",
"Step": "",
"Search": "",
"Import": "",
"Print": "",
"Settings": "",
"or": "",
"and": "",
"Information": "",
"Download": "",
"Create": "",
"Search Settings": "",
"View": "",
"Recipes": "",
"Move": "",
"Merge": "",
"Parent": "",
"Copy Link": "",
"Copy Token": "",
"delete_confirmation": "",
"move_confirmation": "",
"merge_confirmation": "",
"create_rule": "",
"move_selection": "",
"merge_selection": "",
"Root": "",
"Ignore_Shopping": "",
"Shopping_Category": "",
"Shopping_Categories": "",
"Edit_Food": "",
"Move_Food": "",
"New_Food": "",
"Hide_Food": "",
"Food_Alias": "",
"Unit_Alias": "",
"Keyword_Alias": "",
"Delete_Food": "",
"No_ID": "",
"Meal_Plan_Days": "",
"merge_title": "",
"move_title": "",
"Food": "",
"Recipe_Book": "",
"del_confirmation_tree": "",
"delete_title": "",
"create_title": "",
"edit_title": "",
"Name": "",
"Type": "",
"Description": "",
"Recipe": "",
"tree_root": "",
"Icon": "",
"Unit": "",
"Decimals": "",
"Default_Unit": "",
"No_Results": "",
"New_Unit": "",
"Create_New_Shopping Category": "",
"Create_New_Food": "",
"Create_New_Keyword": "",
"Create_New_Unit": "",
"Create_New_Meal_Type": "",
"Create_New_Shopping_Category": "",
"and_up": "",
"and_down": "",
"Instructions": "",
"Unrated": "",
"Automate": "",
"Empty": "",
"Key_Ctrl": "",
"Key_Shift": "",
"Time": "",
"Text": "",
"Shopping_list": "",
"Added_by": "",
"Added_on": "",
"AddToShopping": "",
"IngredientInShopping": "",
"NotInShopping": "",
"OnHand": "",
"FoodOnHand": "",
"FoodNotOnHand": "",
"Undefined": "",
"Create_Meal_Plan_Entry": "",
"Edit_Meal_Plan_Entry": "",
"Title": "",
"Week": "",
"Month": "",
"Year": "",
"Planner": "",
"Planner_Settings": "",
"Period": "",
"Plan_Period_To_Show": "",
"Periods": "",
"Plan_Show_How_Many_Periods": "",
"Starting_Day": "",
"Meal_Types": "",
"Meal_Type": "",
"New_Entry": "",
"Clone": "",
"Drag_Here_To_Delete": "",
"Meal_Type_Required": "",
"Title_or_Recipe_Required": "",
"Color": "",
"New_Meal_Type": "",
"Use_Fractions": "",
"Use_Fractions_Help": "",
"AddFoodToShopping": "",
"RemoveFoodFromShopping": "",
"DeleteShoppingConfirm": "",
"IgnoredFood": "",
"Add_Servings_to_Shopping": "",
"Week_Numbers": "",
"Show_Week_Numbers": "",
"Export_As_ICal": "",
"Export_To_ICal": "",
"Cannot_Add_Notes_To_Shopping": "",
"Added_To_Shopping_List": "",
"Shopping_List_Empty": "",
"Next_Period": "",
"Previous_Period": "",
"Current_Period": "",
"Next_Day": "",
"Previous_Day": "",
"Inherit": "",
"InheritFields": "",
"FoodInherit": "",
"ShowUncategorizedFood": "",
"GroupBy": "",
"Language": "",
"Theme": "",
"SupermarketCategoriesOnly": "",
"MoveCategory": "",
"CountMore": "",
"IgnoreThis": "",
"DelayFor": "",
"Warning": "",
"NoCategory": "",
"InheritWarning": "",
"ShowDelayed": "",
"Completed": "",
"OfflineAlert": "",
"shopping_share": "",
"shopping_auto_sync": "",
"one_url_per_line": "",
"mealplan_autoadd_shopping": "",
"mealplan_autoexclude_onhand": "",
"mealplan_autoinclude_related": "",
"default_delay": "",
"plan_share_desc": "",
"shopping_share_desc": "",
"shopping_auto_sync_desc": "",
"mealplan_autoadd_shopping_desc": "",
"mealplan_autoexclude_onhand_desc": "",
"mealplan_autoinclude_related_desc": "",
"default_delay_desc": "",
"filter_to_supermarket": "",
"Coming_Soon": "",
"Auto_Planner": "",
"New_Cookbook": "",
"Hide_Keyword": "",
"Hour": "",
"Hours": "",
"Day": "",
"Days": "",
"Second": "",
"Seconds": "",
"Clear": "",
"Users": "",
"Invites": "",
"err_move_self": "",
"nothing": "",
"err_merge_self": "",
"show_sql": "",
"filter_to_supermarket_desc": "",
"CategoryName": "",
"SupermarketName": "",
"CategoryInstruction": "",
"shopping_recent_days_desc": "",
"shopping_recent_days": "",
"download_pdf": "",
"download_csv": "",
"csv_delim_help": "",
"csv_delim_label": "",
"SuccessClipboard": "",
"copy_to_clipboard": "",
"csv_prefix_help": "",
"csv_prefix_label": "",
"copy_markdown_table": "",
"in_shopping": "",
"DelayUntil": "",
"Pin": "",
"mark_complete": "",
"QuickEntry": "",
"shopping_add_onhand_desc": "",
"shopping_add_onhand": "",
"related_recipes": "",
"today_recipes": "",
"sql_debug": "",
"remember_search": "",
"remember_hours": "",
"tree_select": "",
"OnHand_help": "",
"ignore_shopping_help": "",
"shopping_category_help": "",
"food_recipe_help": "",
"Foods": "",
"Account": "",
"Cosmetic": "",
"API": "",
"enable_expert": "",
"expert_mode": "",
"simple_mode": "",
"advanced": "",
"fields": "",
"show_keywords": "",
"show_foods": "",
"show_books": "",
"show_rating": "",
"show_units": "",
"show_filters": "",
"not": "",
"save_filter": "",
"filter_name": "",
"left_handed": "",
"left_handed_help": "",
"Custom Filter": "",
"shared_with": "",
"sort_by": "",
"asc": "",
"desc": "",
"date_viewed": "",
"last_cooked": "",
"times_cooked": "",
"date_created": "",
"show_sortby": "",
"search_rank": "",
"make_now": "",
"recipe_filter": "",
"book_filter_help": "",
"review_shopping": "",
"view_recipe": "",
"copy_to_new": "",
"recipe_name": "",
"paste_ingredients_placeholder": "",
"paste_ingredients": "",
"ingredient_list": "",
"explain": "",
"filter": "",
"Website": "",
"App": "",
"Message": "",
"Bookmarklet": "",
"Sticky_Nav": "",
"Sticky_Nav_Help": "",
"Nav_Color": "",
"Nav_Color_Help": "",
"Use_Kj": "",
"Comments_setting": "",
"click_image_import": "",
"no_more_images_found": "",
"import_duplicates": "",
"paste_json": "",
"Click_To_Edit": "",
"search_no_recipes": "",
"search_import_help_text": "",
"search_create_help_text": "",
"warning_duplicate_filter": "",
"reset_children": "",
"reset_children_help": "",
"reset_food_inheritance": "",
"reset_food_inheritance_info": "",
"substitute_help": "",
"substitute_siblings_help": "",
"substitute_children_help": "",
"substitute_siblings": "",
"substitute_children": "",
"SubstituteOnHand": "",
"ChildInheritFields": "",
"ChildInheritFields_help": "",
"InheritFields_help": "",
"show_ingredient_overview": "",
"Ingredient Overview": "",
"last_viewed": "",
"created_on": "",
"updatedon": "",
"Imported_From": "",
"advanced_search_settings": "",
"nothing_planned_today": "",
"no_pinned_recipes": "",
"Planned": "",
"Pinned": "",
"Imported": "",
"Quick actions": "",
"Ratings": "",
"Internal": "",
"Units": "",
"Manage_Emails": "",
"Change_Password": "",
"Social_Authentication": "",
"Random Recipes": "",
"parameter_count": "",
"select_keyword": "",
"add_keyword": "",
"select_file": "",
"select_recipe": "",
"select_unit": "",
"select_food": "",
"remove_selection": "",
"empty_list": "",
"Select": "",
"Supermarkets": "",
"User": "",
"Username": "",
"First_name": "",
"Last_name": "",
"Keyword": "",
"Advanced": "",
"Page": "",
"Single": "",
"Multiple": "",
"Reset": "",
"Disabled": "",
"Disable": "",
"Options": "",
"Create Food": "",
"create_food_desc": "",
"additional_options": "",
"Importer_Help": "",
"Documentation": "",
"Select_App_To_Import": "",
"Import_Supported": "",
"Export_Supported": "",
"Import_Not_Yet_Supported": "",
"Export_Not_Yet_Supported": "",
"Import_Result_Info": "",
"Recipes_In_Import": "",
"Toggle": "",
"Import_Error": "",
"Warning_Delete_Supermarket_Category": "",
"New_Supermarket": "",
"New_Supermarket_Category": "",
"Are_You_Sure": "",
"Valid Until": ""
}

View File

@@ -14,7 +14,7 @@
"show_split_screen": "Vista divisa",
"Log_Recipe_Cooking": "Aggiungi a ricette cucinate",
"External_Recipe_Image": "Immagine ricetta esterna",
"Add_to_Shopping": "Aggiunti a lista della spesa",
"Add_to_Shopping": "Aggiunti agli acquisti",
"Add_to_Plan": "Aggiungi a Piano",
"Step_start_time": "Ora di inizio dello Step",
"Sort_by_new": "Prima i nuovi",
@@ -91,18 +91,18 @@
"Recipes": "Ricette",
"Move": "Sposta",
"Merge": "Unisci",
"Parent": "Principale",
"Parent": "Primario",
"delete_confimation": "Sei sicuro di voler eliminare {kw} e tutti gli elementi dipendenti?",
"move_confirmation": "Sposta <i>{child}</i> al primario <i>{parent}</i>",
"merge_confirmation": "Sostituisci <i>{source}</i> con <i>{target}</i>",
"move_selection": "Scegli un primario {type} dove spostare {source}.",
"merge_selection": "Sostituisci tutte le voci di {source} con il {type} selezionato.",
"Root": "Radice",
"Ignore_Shopping": "Ignora lista della spesa",
"Ignore_Shopping": "Ignora spesa",
"delete_confirmation": "Sei sicuro di voler eliminare {source}?",
"Description": "Descrizione",
"Icon": "Icona",
"Unit": "Unità",
"Unit": "Unità di misura",
"No_ID": "ID non trovato, non è possibile eliminare.",
"Recipe_Book": "Libro di Ricette",
"create_title": "Nuovo {type}",
@@ -240,5 +240,110 @@
"nothing": "Nulla da fare",
"show_sql": "Mostra SQL",
"Search Settings": "Impostazioni di ricerca",
"err_deleting_protected_resource": "L'elemento che stai cercando di eliminare è ancora in uso e non può essere eliminato."
"err_deleting_protected_resource": "L'elemento che stai cercando di eliminare è ancora in uso e non può essere eliminato.",
"SupermarketName": "Nome supermercato",
"last_cooked": "Cucinato di recente",
"FoodNotOnHand": "Non hai {food} a disposizione.",
"csv_delim_label": "Delimitatore CSV",
"IgnoredFood": "{food} è impostato per ignorare la spesa.",
"today_recipes": "Ricette di oggi",
"left_handed": "Modalità per mancini",
"Pin": "Pin",
"DelayUntil": "Ritarda fino a",
"Default_Unit": "Unità predefinita",
"Decimals": "Decimali",
"FoodOnHand": "Hai {food} a disposizione.",
"Use_Fractions_Help": "Converti automaticamente i decimali in frazioni quando apri una ricetta.",
"Language": "Lingua",
"Theme": "Tema",
"SupermarketCategoriesOnly": "Solo categorie supermercati",
"CountMore": "...più +{count}",
"IgnoreThis": "Non aggiungere mai {food} alla spesa",
"InheritWarning": "{food} è impostato per ereditare, i cambiamenti potrebbero non essere applicati.",
"mealplan_autoadd_shopping": "Aggiungi automaticamente al piano alimentare",
"plan_share_desc": "Le nuove voci del piano alimentare saranno automaticamente condivise con gli utenti selezionati.",
"Hour": "Ora",
"Hours": "Ore",
"Day": "Giorno",
"Days": "Giorni",
"Second": "Secondo",
"Seconds": "Secondi",
"csv_prefix_help": "Prefisso da aggiungere quando si copia una lista negli appunti.",
"copy_markdown_table": "Copia come tabella Markdown",
"in_shopping": "Nella lista della spesa",
"Account": "Account",
"Cosmetic": "Aspetto",
"API": "API",
"Copy Token": "Copia token",
"mealplan_autoinclude_related": "Aggiungi ricette correlate",
"default_delay": "Ore di ritardo predefinite",
"shopping_share_desc": "Gli utenti vedranno tutti gli elementi che aggiungi alla tua lista della spesa Per poter vedere gli elementi della loro lista, loro dovranno aggiungerti.",
"mealplan_autoexclude_onhand_desc": "Quando aggiungi un piano alimentare alla lista della spesa (manualmente o automaticamente), escludi gli ingredienti che sono già disponibili.",
"default_delay_desc": "Il numero predefinito di ore per ritardare l'inserimento di una lista della spesa.",
"filter_to_supermarket": "Filtra per supermercato",
"filter_to_supermarket_desc": "Per impostazione predefinita, filtra la lista della spesa per includere esclusivamente le categorie del supermercato selezionato.",
"CategoryName": "Nome categoria",
"shopping_recent_days": "Giorni recenti",
"download_pdf": "Scarica PDF",
"download_csv": "Scarica CSV",
"SuccessClipboard": "Lista della spesa copiata negli appunti",
"Users": "Utenti",
"Invites": "Inviti",
"date_viewed": "Recenti",
"copy_to_clipboard": "Copia negli appunti",
"related_recipes": "Ricette correlate",
"Foods": "Alimenti",
"asc": "Crescente",
"desc": "Decrescente",
"Units": "Unità di misura",
"shopping_add_onhand_desc": "Contrassegna gli alimenti come \"disponibili\" quando vengono spuntati dalla lista della spesa.",
"shopping_add_onhand": "Auto disponibilità",
"mark_complete": "Contrassegna come completato",
"QuickEntry": "Inserimento rapido",
"remember_hours": "Ore da ricordare",
"tree_select": "Usa selezione ad albero",
"sql_debug": "Debug SQL",
"remember_search": "Ricorda ricerca",
"facet_count_info": "Mostra il conteggio delle ricette nei filtri di ricerca",
"warning_space_delete": "Stai per eliminare la tua istanza che include tutte le ricette, liste della spesa, piani alimentari e tutto ciò che hai creato. Questa azione non può essere annullata! Sei sicuro di voler procedere?",
"food_inherit_info": "Campi di alimenti che devono essere ereditati per impostazione predefinita.",
"enable_expert": "Abilita modalità esperto",
"expert_mode": "Modalità esperto",
"simple_mode": "Modalità semplice",
"advanced": "Avanzate",
"fields": "Campi",
"show_keywords": "Mostra parole chiave",
"show_foods": "Mostra alimenti",
"show_books": "Mostra libri",
"show_rating": "Mostra valutazione",
"show_filters": "Mostra filtri",
"save_filter": "Salva filtro",
"filter_name": "Nome filtro",
"left_handed_help": "L'interfaccia verrà ottimizzata per l'uso con la mano sinistra.",
"Custom Filter": "Filtro personalizzato",
"shared_with": "Condiviso con",
"sort_by": "Ordina per",
"Ingredient Overview": "Panoramica Ingredienti",
"show_units": "Mostra unità di misura",
"select_unit": "Seleziona unità di misura",
"Ingredient Editor": "Editor Ingredienti",
"Private_Recipe": "Ricetta privata",
"Private_Recipe_Help": "La ricetta viene mostrata solo a te e chi l'hai condivisa.",
"Protected": "Protetto",
"Copy Link": "Copia link",
"Create_New_Shopping_Category": "Aggiungi nuova categoria di spesa",
"and_down": "& Giù",
"OnHand": "Attualmente disponibili",
"New_Entry": "Nuova voce",
"Use_Fractions": "Usa frazioni",
"FoodInherit": "Campi ereditabili dagli Alimenti",
"one_url_per_line": "Un indirizzo per riga",
"mealplan_autoexclude_onhand": "Escludi alimenti disponibili",
"mealplan_autoadd_shopping_desc": "Aggiungi automaticamente gli ingredienti del piano alimentare alla lista della spesa.",
"mealplan_autoinclude_related_desc": "Quando aggiungi un piano alimentare alla lista della spesa (manualmente o automaticamente), includi tutte le ricette correlate.",
"err_merge_self": "Non è possibile unire un elemento in sé stesso",
"shopping_recent_days_desc": "Giorni di visualizzazione delle voci recenti della lista della spesa.",
"csv_delim_help": "Delimitatore usato per le esportazioni CSV.",
"csv_prefix_label": "Prefisso lista",
"not": "not"
}

View File

@@ -1,18 +1,18 @@
{
"warning_feature_beta": "",
"err_fetching_resource": "",
"err_creating_resource": "",
"err_updating_resource": "",
"err_deleting_resource": "",
"err_moving_resource": "",
"err_merging_resource": "",
"success_fetching_resource": "",
"success_creating_resource": "",
"success_updating_resource": "",
"success_deleting_resource": "",
"success_moving_resource": "",
"success_merging_resource": "",
"file_upload_disabled": "",
"warning_feature_beta": "Este recurso está atualmente em BETA (sendo testado). Tenha em mente que podem existir bugs atualmente e haja mudanças drásticas no futuro (que podem causar perda de dados) quando utilizar este recurso.",
"err_fetching_resource": "Ocorreu um erro buscando um recurso!",
"err_creating_resource": "Ocorreu um erro criando um recurso!",
"err_updating_resource": "Ocorreu um erro atualizando um recurso!",
"err_deleting_resource": "Ocorreu um erro deletando um recurso!",
"err_moving_resource": "Ocorreu um erro movendo o recurso!",
"err_merging_resource": "Ocorreu um erro mesclando os recursos!",
"success_fetching_resource": "Recurso carregado com sucesso!",
"success_creating_resource": "Recurso criado com sucesso!",
"success_updating_resource": "Recurso atualizado com sucesso!",
"success_deleting_resource": "Recurso deletado com sucesso!",
"success_moving_resource": "Recurso movido com sucesso!",
"success_merging_resource": "Recurso mesclado com sucesso!",
"file_upload_disabled": "Upload de arquivos não está habilitado para seu espaço.",
"step_time_minutes": "",
"confirm_delete": "",
"import_running": "",
@@ -378,5 +378,9 @@
"Page": "Página",
"Reset": "Reiniciar",
"Create Food": "Criar Comida",
"create_food_desc": "Criar a comida e ligar a esta receita."
"create_food_desc": "Criar a comida e ligar a esta receita.",
"err_deleting_protected_resource": "O objeto que você está tentando deletar ainda está sendo utilizado, portanto não pode ser deletado.",
"food_inherit_info": "Campos no alimento que devem ser herdados por padrão.",
"warning_space_delete": "Você pode deletar seu espaço, inclusive todas as receitas, listas de mercado, planos de comida e tudo mais que você criou. Esta ação não poderá ser desfeita! Você tem certeza que quer fazer isto?",
"facet_count_info": "Mostrar quantidade de receitas nos filtros de busca."
}

View File

@@ -18,137 +18,137 @@
"import_running": "Importação em execução, aguarde!",
"all_fields_optional": "Todos os campos são opcionais e podem ser deixados em branco.",
"convert_internal": "Converter para receita interna",
"show_only_internal": "",
"show_split_screen": "",
"Log_Recipe_Cooking": "",
"External_Recipe_Image": "",
"Add_to_Shopping": "",
"Add_to_Plan": "",
"Step_start_time": "",
"Sort_by_new": "",
"Table_of_Contents": "",
"Recipes_per_page": "",
"Show_as_header": "",
"Hide_as_header": "",
"Add_nutrition_recipe": "",
"Remove_nutrition_recipe": "",
"Copy_template_reference": "",
"Save_and_View": "",
"Manage_Books": "",
"Meal_Plan": "",
"Select_Book": "",
"Select_File": "",
"Recipe_Image": "",
"Import_finished": "",
"View_Recipes": "",
"Log_Cooking": "",
"New_Recipe": "",
"Url_Import": "",
"Reset_Search": "",
"Recently_Viewed": "",
"Load_More": "",
"New_Keyword": "",
"Delete_Keyword": "",
"Edit_Keyword": "",
"Edit_Recipe": "",
"Move_Keyword": "",
"Merge_Keyword": "",
"Hide_Keywords": "",
"Hide_Recipes": "",
"Move_Up": "",
"Move_Down": "",
"Step_Name": "",
"Step_Type": "",
"Make_Header": "",
"Make_Ingredient": "",
"Enable_Amount": "",
"Disable_Amount": "",
"Add_Step": "",
"Keywords": "",
"Books": "",
"Proteins": "",
"Fats": "",
"Carbohydrates": "",
"Calories": "",
"Energy": "",
"Nutrition": "",
"Date": "",
"Share": "",
"Automation": "",
"Parameter": "",
"Export": "",
"Copy": "",
"Rating": "",
"Close": "",
"Cancel": "",
"Link": "",
"Add": "",
"New": "",
"Note": "",
"Success": "",
"Failure": "",
"Ingredients": "",
"Supermarket": "",
"Categories": "",
"Category": "",
"Selected": "",
"min": "",
"Servings": "",
"Waiting": "",
"Preparation": "",
"External": "",
"Size": "",
"Files": "",
"File": "",
"Edit": "",
"Image": "",
"Delete": "",
"Open": "",
"Ok": "",
"Save": "",
"Step": "",
"Search": "",
"Import": "",
"Print": "",
"Settings": "",
"or": "",
"and": "",
"Information": "",
"Download": "",
"Create": "",
"Search Settings": "",
"View": "",
"Recipes": "",
"Move": "",
"Merge": "",
"Parent": "",
"delete_confirmation": "",
"move_confirmation": "",
"merge_confirmation": "",
"create_rule": "",
"move_selection": "",
"merge_selection": "",
"Root": "",
"Ignore_Shopping": "",
"Shopping_Category": "",
"Shopping_Categories": "",
"Edit_Food": "",
"Move_Food": "",
"New_Food": "",
"Hide_Food": "",
"Food_Alias": "",
"Unit_Alias": "",
"Keyword_Alias": "",
"Delete_Food": "",
"No_ID": "",
"Meal_Plan_Days": "",
"merge_title": "",
"move_title": "",
"Food": "",
"Recipe_Book": "",
"del_confirmation_tree": "",
"delete_title": "",
"create_title": "",
"show_only_internal": "Mostrar apenas receitas internas",
"show_split_screen": "Visão dividida",
"Log_Recipe_Cooking": "Registrar receitas feitas",
"External_Recipe_Image": "Imagem externa da receita",
"Add_to_Shopping": "Adicionar ao carrinho",
"Add_to_Plan": "Adicionar ao Plano",
"Step_start_time": "Hora de início",
"Sort_by_new": "Ordenar por novos",
"Table_of_Contents": "Índice",
"Recipes_per_page": "Receitas por página",
"Show_as_header": "Mostrar como título",
"Hide_as_header": "Esconder cabeçalho",
"Add_nutrition_recipe": "Adicionar dados nutricionais à receita",
"Remove_nutrition_recipe": "Deletar dados nutricionais da receita",
"Copy_template_reference": "Copiar template de referência",
"Save_and_View": "Salvar e Visualizar",
"Manage_Books": "Gerenciar Livros",
"Meal_Plan": "Cardápio",
"Select_Book": "Selecionar Livro",
"Select_File": "Selecionar Arquivo",
"Recipe_Image": "Imagem da receita",
"Import_finished": "Importação finalizada",
"View_Recipes": "Ver Receitas",
"Log_Cooking": "Registro de Cozinha",
"New_Recipe": "Nova Receita",
"Url_Import": "Importar de URL",
"Reset_Search": "Resetar Busca",
"Recently_Viewed": "Visto recentemente",
"Load_More": "Carregar mais",
"New_Keyword": "Nova palavra-chave",
"Delete_Keyword": "Deletar palavra-chave",
"Edit_Keyword": "Editar palavra-chave",
"Edit_Recipe": "Editar Receita",
"Move_Keyword": "Mover palavra-chave",
"Merge_Keyword": "Mesclar palavra-chave",
"Hide_Keywords": "Esconder palavra-chave",
"Hide_Recipes": "Esconder Receitas",
"Move_Up": "Mover para cima",
"Move_Down": "Mover para baixo",
"Step_Name": "Nome da etapa",
"Step_Type": "Tipo de etapa",
"Make_Header": "Criar cabeçalho",
"Make_Ingredient": "Criar Ingrediente",
"Enable_Amount": "Habilitar Quantidade",
"Disable_Amount": "Desabilitar Quantidade",
"Add_Step": "Adicionar Etapa",
"Keywords": "Palavras-chave",
"Books": "Livros",
"Proteins": "Proteínas",
"Fats": "Gorduras",
"Carbohydrates": "Carboidratos",
"Calories": "Calorias",
"Energy": "Energia",
"Nutrition": "Nutrição",
"Date": "Data",
"Share": "Compartilhar",
"Automation": "Automação",
"Parameter": "Parâmetro",
"Export": "Exportar",
"Copy": "Copiar",
"Rating": "Nota",
"Close": "Fechar",
"Cancel": "Cancelar",
"Link": "Link",
"Add": "Adicionar",
"New": "Novo",
"Note": "Nota",
"Success": "Sucesso",
"Failure": "Falha",
"Ingredients": "Ingredientes",
"Supermarket": "Supermercado",
"Categories": "Categorias",
"Category": "Categoria",
"Selected": "Selecionado",
"min": "min",
"Servings": "Porções",
"Waiting": "Espera",
"Preparation": "Preparação",
"External": "Externo",
"Size": "Tamanho",
"Files": "Arquivos",
"File": "Arquivo",
"Edit": "Editar",
"Image": "Imagem",
"Delete": "Deletar",
"Open": "Abrir",
"Ok": "Abrir",
"Save": "Salvar",
"Step": "Etapa",
"Search": "Buscar",
"Import": "Importar",
"Print": "Imprimir",
"Settings": "Configurações",
"or": "ou",
"and": "e",
"Information": "Informação",
"Download": "Baixar",
"Create": "Criar",
"Search Settings": "Buscar Configuração",
"View": "Visualizar",
"Recipes": "Receitas",
"Move": "Mover",
"Merge": "Mesclar",
"Parent": "Pai",
"delete_confirmation": "Tem certeza que deseja deletar {source}?",
"move_confirmation": "Movido <i>{child}</i> para <i>{parent}</i>",
"merge_confirmation": "Trocado <i>{source}</i> com <i>{target}</i>",
"create_rule": "e criar automação",
"move_selection": "Selecione um pai {type} para mover para {source}.",
"merge_selection": "Trocar todas as ocorrências de {source} com {type}.",
"Root": "Raiz",
"Ignore_Shopping": "Ignorar Mercado",
"Shopping_Category": "Categoria de Mercado",
"Shopping_Categories": "Categorias de Mercado",
"Edit_Food": "Editar Comida",
"Move_Food": "Mover Comida",
"New_Food": "Nova Comida",
"Hide_Food": "Esconder Comida",
"Food_Alias": "Apelido da Comida",
"Unit_Alias": "Apelido da Unidade",
"Keyword_Alias": "Apelido da palavra-chave",
"Delete_Food": "Deletar Comida",
"No_ID": "ID não encontrado, impossível deletar.",
"Meal_Plan_Days": "Planejamento de Cardápio",
"merge_title": "Mesclar {type}",
"move_title": "Mover {type}",
"Food": "Comida",
"Recipe_Book": "Livro de Receitas",
"del_confirmation_tree": "Tem certeza que deseja deletar {source} e todos seus filhos?",
"delete_title": "Deletar {type}",
"create_title": "Novo {type}",
"edit_title": "",
"Name": "",
"Type": "",
@@ -377,5 +377,15 @@
"Advanced": "",
"Page": "",
"Reset": "",
"err_deleting_protected_resource": "O objeto que você está tentando excluir ainda é usado e não pode ser excluído."
"err_deleting_protected_resource": "O objeto que você está tentando excluir ainda é usado e não pode ser excluído.",
"Copy Link": "Copiar Link",
"Ingredient Editor": "Editor de Ingrediente",
"Protected": "Protegido",
"reusable_help_text": "O convite pode ser utilizado para mais de um usuário.",
"Private_Recipe": "Receita privada",
"Private_Recipe_Help": "Receita é visível somente para você e para pessoas compartilhadas.",
"Copy Token": "Copiar Token",
"warning_space_delete": "Você pode deletar seu espaço, inclusive todas as receitas, listas de mercado, planos de comida e tudo mais que você criou. Esta ação não poderá ser desfeita! Você tem certeza que quer fazer isto?",
"food_inherit_info": "Campos no alimento que devem ser herdados por padrão.",
"facet_count_info": "Mostrar quantidade de receitas nos filtros de busca."
}

File diff suppressed because it is too large Load Diff

4
yarn.lock Normal file
View File

@@ -0,0 +1,4 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1