Compare commits

...

1426 Commits

Author SHA1 Message Date
vabene1111
2cba0e18af Merge branch 'develop' 2025-09-19 16:20:56 +02:00
vabene1111
ec6e81316a fixed unwanted redirect to start page 2025-09-19 16:20:48 +02:00
vabene1111
b72897b222 Merge branch 'develop' 2025-09-18 18:17:58 +02:00
vabene1111
bca1ebbf99 various fixes 2025-09-18 18:10:58 +02:00
vabene1111
f0342d4568 fixed some tests 2025-09-17 18:04:02 +02:00
vabene1111
81f62de500 Merge pull request #4050 from TandoorRecipes/revert-4040-ipv6
Revert "feat: make nginx respect ipv6 disable fixes #3996"
2025-09-17 16:20:13 +02:00
vabene1111
f783949a61 Revert "feat: make nginx respect ipv6 disable fixes #3996" 2025-09-17 16:20:03 +02:00
vabene1111
820fad1b5c Merge pull request #4040 from wilmardo/ipv6
feat: make nginx respect ipv6 disable fixes #3996
2025-09-17 16:19:44 +02:00
vabene1111
1169abd942 mealie docs update 2025-09-17 07:55:29 +02:00
vabene1111
48e175f58f mealie importer working with settings 2025-09-17 07:50:56 +02:00
wilmardo
5450e18342 feat: make nginx respect ipv6 disable fixes #3996
Signed-off-by: wilmardo <info@wilmardenouden.nl>
2025-09-16 15:01:54 +02:00
vabene1111
ea590f8e49 mealie importer options 2025-09-16 08:00:22 +02:00
vabene1111
13626ca11b mealie importer improvements 2025-09-16 07:48:58 +02:00
vabene1111
f53fe1e3c4 import comments 2025-09-15 22:12:52 +02:00
vabene1111
d177316b47 mealie 1.0 importer WIP 2025-09-15 22:05:15 +02:00
vabene1111
338db1fac2 fixed default properties view 2025-09-15 21:26:51 +02:00
vabene1111
377619473c small fixes 2025-09-15 07:49:17 +02:00
vabene1111
000962c5bb moved create space to its own file 2025-09-14 12:05:09 +02:00
vabene1111
9228c1d59f fixed ai import layout 2025-09-14 11:55:58 +02:00
vabene1111
27007de7a0 improved start page with little recipes 2025-09-14 11:12:46 +02:00
vabene1111
29c99b66a1 fixed thermomix special symbol parser 2025-09-14 11:11:22 +02:00
vabene1111
bc179f430d Merge branch 'develop' of https://github.com/TandoorRecipes/recipes into develop 2025-09-14 11:03:53 +02:00
vabene1111
58c412ad95 space and user space api updates 2025-09-14 09:57:57 +02:00
vabene1111
4f248afe76 overhauld space management and settings system 2025-09-14 08:48:49 +02:00
vabene1111
f722d24eaa wip space editor 2025-09-14 07:37:31 +02:00
vabene1111
723b74509f moved space stuff to database and reworked invite link backend logic 2025-09-11 21:44:40 +02:00
vabene1111
ad4b1393dd various improvements 2025-09-11 18:58:44 +02:00
vabene1111
04bab7072c WIP stepper and language select component 2025-09-11 07:55:06 +02:00
vabene1111
6391cee9eb Merge pull request #4025 from TandoorRecipes/dependabot/npm_and_yarn/vue3/vite-7.1.5
Bump vite from 7.1.4 to 7.1.5 in /vue3
2025-09-11 07:07:50 +02:00
vabene1111
14884fc0d4 Merge pull request #3985 from TandoorRecipes/dependabot/github_actions/awalsh128/cache-apt-pkgs-action-1.5.3
Bump awalsh128/cache-apt-pkgs-action from 1.5.1 to 1.5.3
2025-09-11 07:07:44 +02:00
vabene1111
f2191f79dd auto space creation and redirect to welcome page 2025-09-10 22:18:09 +02:00
vabene1111
c2533d9ea2 add migration shortcut 2025-09-10 21:28:10 +02:00
dependabot[bot]
db72fdb1bb Bump vite from 7.1.4 to 7.1.5 in /vue3
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.1.4 to 7.1.5.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.1.5/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.1.5
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-10 19:03:01 +00:00
dependabot[bot]
78252662cb Bump awalsh128/cache-apt-pkgs-action from 1.5.1 to 1.5.3
Bumps [awalsh128/cache-apt-pkgs-action](https://github.com/awalsh128/cache-apt-pkgs-action) from 1.5.1 to 1.5.3.
- [Release notes](https://github.com/awalsh128/cache-apt-pkgs-action/releases)
- [Commits](https://github.com/awalsh128/cache-apt-pkgs-action/compare/v1.5.1...v1.5.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-10 18:59:37 +00:00
vabene1111
4e078bf477 updated to django 5 2025-09-10 20:56:47 +02:00
vabene1111
2e9e226fe0 Merge pull request #3994 from TandoorRecipes/dependabot/npm_and_yarn/vue3/vite-plugin-pwa-1.0.3
Bump vite-plugin-pwa from 1.0.2 to 1.0.3 in /vue3
2025-09-10 20:44:54 +02:00
dependabot[bot]
18cfbd80ab Bump vite-plugin-pwa from 1.0.2 to 1.0.3 in /vue3
Bumps [vite-plugin-pwa](https://github.com/vite-pwa/vite-plugin-pwa) from 1.0.2 to 1.0.3.
- [Release notes](https://github.com/vite-pwa/vite-plugin-pwa/releases)
- [Commits](https://github.com/vite-pwa/vite-plugin-pwa/compare/v1.0.2...v1.0.3)

---
updated-dependencies:
- dependency-name: vite-plugin-pwa
  dependency-version: 1.0.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-10 18:42:09 +00:00
vabene1111
4d284b4fff Merge pull request #3984 from TandoorRecipes/dependabot/github_actions/actions/checkout-5
Bump actions/checkout from 4 to 5
2025-09-10 20:42:06 +02:00
vabene1111
b1128dd134 Merge pull request #3986 from TandoorRecipes/dependabot/pip/django-storages-1.14.6
Bump django-storages from 1.14.2 to 1.14.6
2025-09-10 20:41:46 +02:00
vabene1111
3aebf58406 Merge pull request #3987 from TandoorRecipes/dependabot/pip/djangorestframework-3.16.1
Bump djangorestframework from 3.15.2 to 3.16.1
2025-09-10 20:41:39 +02:00
vabene1111
f3816a77df Merge pull request #3988 from TandoorRecipes/dependabot/pip/django-prometheus-2.4.1
Bump django-prometheus from 2.3.1 to 2.4.1
2025-09-10 20:41:31 +02:00
vabene1111
e4183d79ab Merge pull request #3989 from TandoorRecipes/dependabot/pip/drf-spectacular-sidecar-2025.8.1
Bump drf-spectacular-sidecar from 2025.7.1 to 2025.8.1
2025-09-10 20:41:25 +02:00
vabene1111
f4aa1a083f Merge pull request #3990 from TandoorRecipes/dependabot/pip/python-dotenv-1.1.1
Bump python-dotenv from 1.0.0 to 1.1.1
2025-09-10 20:41:18 +02:00
vabene1111
ed5508b576 Merge pull request #3991 from TandoorRecipes/dependabot/npm_and_yarn/vue3/vue-i18n-11.1.11
Bump vue-i18n from 11.1.10 to 11.1.11 in /vue3
2025-09-10 20:40:57 +02:00
vabene1111
040e247487 Merge pull request #3992 from TandoorRecipes/dependabot/npm_and_yarn/vue3/vue-tsc-3.0.6
Bump vue-tsc from 2.2.10 to 3.0.6 in /vue3
2025-09-10 20:40:50 +02:00
vabene1111
5d28c7b17d Merge pull request #3995 from TandoorRecipes/dependabot/npm_and_yarn/vue3/vuetify-3.9.6
Bump vuetify from 3.9.3 to 3.9.6 in /vue3
2025-09-10 20:40:39 +02:00
vabene1111
15b2df07f2 Merge pull request #3993 from TandoorRecipes/dependabot/npm_and_yarn/vue3/vite-7.1.3
Bump vite from 6.3.5 to 7.1.3 in /vue3
2025-09-10 20:40:26 +02:00
vabene1111
ed8f97e9e0 Merge branch 'develop'
# Conflicts:
#	vue3/src/locales/de.json
2025-09-10 20:36:33 +02:00
vabene1111
034f68fc28 Merge branch 'develop' of https://github.com/TandoorRecipes/recipes into develop 2025-09-10 20:34:55 +02:00
vabene1111
0158087a0b fixed ai test 2025-09-10 20:34:51 +02:00
vabene1111
cb6bfd741d Merge pull request #4023 from TandoorRecipes/dependabot/pip/django-4.2.24
Bump django from 4.2.22 to 4.2.24
2025-09-10 20:34:21 +02:00
vabene1111
afeee5f7cb fixed link for subpath setups 2025-09-10 20:16:22 +02:00
vabene1111
b43d6e08d4 food batch editor implementation 2025-09-10 16:52:35 +02:00
vabene1111
1188624376 food batch update dialog and first api functions 2025-09-10 07:54:42 +02:00
dependabot[bot]
9ac837c969 Bump django from 4.2.22 to 4.2.24
Bumps [django](https://github.com/django/django) from 4.2.22 to 4.2.24.
- [Commits](https://github.com/django/django/compare/4.2.22...4.2.24)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-10 02:19:20 +00:00
vabene1111
fc4b017d30 food batch update endpoint 2025-09-09 16:54:29 +02:00
vabene1111
4636ac28f9 ai system improvements 2025-09-09 16:30:54 +02:00
vabene1111
397912e87f WIP AI system 2025-09-09 14:58:32 +02:00
vabene1111
d0b860e623 shorter create message for model select 2025-09-09 13:36:05 +02:00
vabene1111
8a90ed1274 fixed ingredient parser error 2025-09-09 13:33:18 +02:00
vabene1111
163c2a53b6 fixed space overview 2025-09-09 07:55:31 +02:00
vabene1111
286d707347 lots of AI provider stuff 2025-09-09 07:54:59 +02:00
vabene1111
98d308aee9 fixed space overview 2025-09-09 07:54:45 +02:00
vabene1111
a7c5240227 ai provider system 2025-09-08 22:15:57 +02:00
vabene1111
75fcff8e70 font show sponsor link on hosted edition 2025-09-08 21:15:20 +02:00
vabene1111
2f27cf4deb fixed meal plan loading 2025-09-08 21:13:33 +02:00
vabene1111
686b595f45 fixed demo auto login 2025-09-08 20:55:20 +02:00
vabene1111
0f9f9e8f7c Merge pull request #4013 from tomtjes/fix-logo-font
Make logo consistent across end user systems
2025-09-08 20:15:19 +02:00
dependabot[bot]
7be7c5b954 Bump vite from 6.3.5 to 7.1.3 in /vue3
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.3.5 to 7.1.3.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.1.3/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.1.3
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-08 06:53:43 +00:00
dependabot[bot]
0853a9ec64 Bump vuetify from 3.9.3 to 3.9.6 in /vue3
Bumps [vuetify](https://github.com/vuetifyjs/vuetify/tree/HEAD/packages/vuetify) from 3.9.3 to 3.9.6.
- [Release notes](https://github.com/vuetifyjs/vuetify/releases)
- [Commits](https://github.com/vuetifyjs/vuetify/commits/v3.9.6/packages/vuetify)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-08 06:51:27 +00:00
dependabot[bot]
fa3daee965 Bump vue-tsc from 2.2.10 to 3.0.6 in /vue3
Bumps [vue-tsc](https://github.com/vuejs/language-tools/tree/HEAD/packages/tsc) from 2.2.10 to 3.0.6.
- [Release notes](https://github.com/vuejs/language-tools/releases)
- [Changelog](https://github.com/vuejs/language-tools/blob/master/CHANGELOG.md)
- [Commits](https://github.com/vuejs/language-tools/commits/v3.0.6/packages/tsc)

---
updated-dependencies:
- dependency-name: vue-tsc
  dependency-version: 3.0.6
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-08 06:42:43 +00:00
vabene1111
aba45657c3 fixed vite config 2025-09-08 08:38:53 +02:00
vabene1111
e6abdf8cd4 fixed vite config 2025-09-08 08:38:46 +02:00
vabene1111
6cedde7b2d plugin and hosted fixes
# Conflicts:
#	vue3/src/locales/de.json
2025-09-08 08:33:05 +02:00
vabene1111
741e9eb370 plugin and hosted fixes 2025-09-08 08:31:01 +02:00
tomtjes
7db523d8c4 convert text to path 2025-09-07 19:34:11 +00:00
vabene1111
41f0060c43 basics of AI provider system 2025-09-05 21:36:43 +02:00
vabene1111
5572833f64 dont display 0 amount in ingredient table 2025-09-05 18:02:09 +02:00
vabene1111
780e441a3b fixed migration tree 2025-09-05 17:50:02 +02:00
vabene1111
c4fd2d0b4e fixed timer localization 2025-09-05 17:46:18 +02:00
vabene1111
1c6618f452 Merge pull request #3999 from icedieler/patch-1
Update nginx configuration for manual setup
2025-09-05 17:30:00 +02:00
vabene1111
8c96a75a1e basics of ai database 2025-09-05 14:50:10 +02:00
vabene1111
44baa8322c Merge branch 'develop' 2025-09-04 22:24:18 +02:00
vabene1111
0fbb95438a added auto meal planner back 2025-09-04 22:23:50 +02:00
vabene1111
c56dd9563c fixed accidentally closing meal plan dialog when opened from recipe context menu 2025-09-04 21:41:51 +02:00
vabene1111
0008b7c975 fixed servings scaler missing on mobile 2025-09-04 21:38:21 +02:00
vabene1111
524f086cc5 added merged steps overview 2025-09-04 21:35:28 +02:00
vabene1111
8550387e0c added ability to delete external recipe file 2025-09-04 21:09:34 +02:00
vabene1111
1618f8df79 fixed meal plan data loading 2025-09-04 20:51:54 +02:00
vabene1111
22dfb2a410 Merge pull request #3998 from Valinor/WEBP-Support
Support WEBP format in image processing #3997
2025-09-04 20:49:21 +02:00
Matthias Lange
f099e2e5d3 Update nginx configuration for manual setup
Since v2 tandoor added user session tracking which requires the reverse proxy to add an extra header.

This change adds the `X-Forwarded-For` header to the example nginx configuration. This header fixes the issue described in #3943.
2025-09-03 10:22:49 +02:00
Valinor
6973c65142 Support WEBP format in image processing
Add support for WEBP file format in image processing.
2025-09-01 15:45:26 +02:00
dependabot[bot]
774c05e76f Bump vue-i18n from 11.1.10 to 11.1.11 in /vue3
Bumps [vue-i18n](https://github.com/intlify/vue-i18n/tree/HEAD/packages/vue-i18n) from 11.1.10 to 11.1.11.
- [Release notes](https://github.com/intlify/vue-i18n/releases)
- [Changelog](https://github.com/intlify/vue-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/intlify/vue-i18n/commits/v11.1.11/packages/vue-i18n)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-01 01:07:24 +00:00
dependabot[bot]
b08c39e284 Bump python-dotenv from 1.0.0 to 1.1.1
Bumps [python-dotenv](https://github.com/theskumar/python-dotenv) from 1.0.0 to 1.1.1.
- [Release notes](https://github.com/theskumar/python-dotenv/releases)
- [Changelog](https://github.com/theskumar/python-dotenv/blob/main/CHANGELOG.md)
- [Commits](https://github.com/theskumar/python-dotenv/compare/v1.0.0...v1.1.1)

---
updated-dependencies:
- dependency-name: python-dotenv
  dependency-version: 1.1.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-01 00:05:39 +00:00
dependabot[bot]
ae036cfa9a Bump drf-spectacular-sidecar from 2025.7.1 to 2025.8.1
Bumps [drf-spectacular-sidecar](https://github.com/tfranzel/drf-spectacular-sidecar) from 2025.7.1 to 2025.8.1.
- [Commits](https://github.com/tfranzel/drf-spectacular-sidecar/compare/2025.7.1...2025.8.1)

---
updated-dependencies:
- dependency-name: drf-spectacular-sidecar
  dependency-version: 2025.8.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-01 00:05:35 +00:00
dependabot[bot]
37628c1735 Bump django-prometheus from 2.3.1 to 2.4.1
Bumps [django-prometheus](https://github.com/korfuri/django-prometheus) from 2.3.1 to 2.4.1.
- [Release notes](https://github.com/korfuri/django-prometheus/releases)
- [Changelog](https://github.com/django-commons/django-prometheus/blob/master/CHANGELOG.md)
- [Commits](https://github.com/korfuri/django-prometheus/compare/v2.3.1...v2.4.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-01 00:05:31 +00:00
dependabot[bot]
530a6db35c Bump djangorestframework from 3.15.2 to 3.16.1
Bumps [djangorestframework](https://github.com/encode/django-rest-framework) from 3.15.2 to 3.16.1.
- [Release notes](https://github.com/encode/django-rest-framework/releases)
- [Commits](https://github.com/encode/django-rest-framework/compare/3.15.2...3.16.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-01 00:05:28 +00:00
dependabot[bot]
2930093da0 Bump django-storages from 1.14.2 to 1.14.6
Bumps [django-storages](https://github.com/jschneier/django-storages) from 1.14.2 to 1.14.6.
- [Changelog](https://github.com/jschneier/django-storages/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/jschneier/django-storages/compare/1.14.2...1.14.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-01 00:05:24 +00:00
dependabot[bot]
b7e63a466b Bump actions/checkout from 4 to 5
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-01 00:02:38 +00:00
vabene1111
a01f86a14e migrated comments, improved recipe activity, added editor 2025-08-31 12:32:12 +02:00
vabene1111
9704268fdc added proper query binding to ModelListPager 2025-08-31 09:42:27 +02:00
vabene1111
84cc4c1165 food create serializer case insensitive 2025-08-31 09:23:27 +02:00
vabene1111
5cb70becb8 ingredient parser case insenstiive 2025-08-31 09:23:18 +02:00
vabene1111
5f99abf459 food and unit plurals in shopping 2025-08-30 11:20:02 +02:00
vabene1111
4a8ddce391 added fuzzy filtering to UnitConversionApi 2025-08-30 11:08:16 +02:00
vabene1111
9a14a87c27 import log view improvement 2025-08-30 08:39:31 +02:00
vabene1111
c01634f9bd remove search links from unauthenticated recipe view 2025-08-30 08:31:15 +02:00
vabene1111
f055df3b4d fixed original text for pasted ingredients 2025-08-30 08:29:07 +02:00
vabene1111
a83f474d70 note 2025-08-30 08:08:54 +02:00
vabene1111
63d358df36 indicate private reciesp 2025-08-29 13:08:16 +02:00
vabene1111
e70548fcc0 added split/merge steps to recipe view 2025-08-28 18:20:26 +02:00
vabene1111
17b03905e6 half increment rating display 2025-08-28 17:47:43 +02:00
vabene1111
90403e6a13 Merge pull request #3960 from dertasiu/develop
Allow video file types to be uploaded
2025-08-28 17:45:40 +02:00
vabene1111
db400cae25 Merge pull request #3956 from c0mputerguru/devcontainer-updatevue3
Update devcontainer to work with new vue3 UI.
2025-08-28 17:45:03 +02:00
vabene1111
0f8eee4e0f Merge branch 'develop' of https://github.com/vabene1111/recipes into develop 2025-08-28 07:55:55 +02:00
vabene1111
1f532f6276 quick fix 2025-08-28 07:55:47 +02:00
c0mputerguru
b32715e493 Update documentation for vscode devcontainer about either starting vite or collecting static files prior to starting django. 2025-08-23 16:50:57 +00:00
c0mputerguru
0d19e12118 Remove dependencies from devcontainer tasks and have django run in debug mode. 2025-08-23 16:41:36 +00:00
dertasiu
96e5213fa6 Allow video files to be uploaded 2025-08-23 11:02:03 +02:00
vabene1111
44c567d20b Merge branch 'develop' 2025-08-23 09:07:19 +02:00
vabene1111
3c920593cf hide AI import when disabeld 2025-08-23 09:07:12 +02:00
vabene1111
1d90f8b6f1 updated docs and fixed links 2025-08-23 08:49:10 +02:00
vabene1111
6b1217ec35 first draft of a hirarchy editor 2025-08-22 16:58:12 +02:00
c0mputerguru
a71564a424 Update devcontainer to work with new vue3 UI.
Fixes #3925
2025-08-21 22:41:13 +00:00
vabene1111
76c2e144fc fix windows issue 2025-08-21 18:20:00 +02:00
vabene1111
981353380c plugin python script 2025-08-21 18:12:45 +02:00
vabene1111
96a520b1af install JS dependencies 2025-08-21 17:48:14 +02:00
vabene1111
05f537dc6b shouldn't be necessary but apperently is 2025-08-21 17:43:42 +02:00
vabene1111
948d8da3b1 fixed wrong import 2025-08-21 17:36:24 +02:00
vabene1111
f8e4b39d88 testing .. 2025-08-21 17:12:51 +02:00
vabene1111
6c498f7dac playing with plugin building 2025-08-21 17:10:13 +02:00
vabene1111
d25702b717 added recipe batch editing dialog 2025-08-21 15:50:13 +02:00
vabene1111
aca18fcbe0 moved open data plugin to its own repo again 2025-08-21 15:50:01 +02:00
vabene1111
98b57d2854 foundations of recipe batch editing 2025-08-20 22:55:38 +02:00
vabene1111
5e1c804fd1 batch merge view 2025-08-20 22:20:23 +02:00
vabene1111
a30deb4bae added batch delete dialog 2025-08-20 21:47:43 +02:00
vabene1111
45a567856a added badge to serach page 2025-08-20 20:49:36 +02:00
vabene1111
7065d96f90 links in recipe created at/on and updated 2025-08-20 20:36:57 +02:00
vabene1111
f8cd42dec9 table select box 2025-08-20 17:31:04 +02:00
vabene1111
8d736c0f88 some small tweaks 2025-08-20 17:00:11 +02:00
vabene1111
8183e350c9 Merge branch 'develop' 2025-08-17 11:24:15 +02:00
vabene1111
4438bfcb89 Merge pull request #3924 from tomtjes/community
add community links
2025-08-17 10:57:27 +02:00
vabene1111
f42b2cfd31 improved original text display in recipe editor 2025-08-17 10:54:46 +02:00
vabene1111
09131e8eae limit recipe description input 2025-08-17 10:46:22 +02:00
vabene1111
f5f001b3d2 made keywords klickable again 2025-08-17 10:39:22 +02:00
vabene1111
7f8587922d decimal places setting 2025-08-17 10:36:46 +02:00
vabene1111
a3460bc023 fixed page reset in search page 2025-08-17 10:31:51 +02:00
vabene1111
5faa74a75d fixed vite config for dev server 2025-08-17 10:17:37 +02:00
vabene1111
65dbc643d3 fixed step rendering logic 2025-08-17 10:08:14 +02:00
vabene1111
f0b169647b Merge pull request #3935 from AdrienPoupa/fix/vite3-base-url
fix(vite): Configure Vite to use subfolder
2025-08-17 10:07:14 +02:00
vabene1111
d786ee09fa API settings localization 2025-08-17 10:01:50 +02:00
vabene1111
a46f3958fe added titles 2025-08-17 09:59:22 +02:00
vabene1111
6c17937313 fixed update servings after import 2025-08-16 15:21:46 +02:00
vabene1111
a26835ccc4 default state for external recipe 2025-08-16 15:17:00 +02:00
vabene1111
86fc4aa2d0 added basic AI import and improved display for external recipes 2025-08-16 15:08:25 +02:00
vabene1111
4bd3da451d hide property view if no properties are present 2025-08-16 14:25:13 +02:00
vabene1111
0003405e98 fixed importing tandoor urls 2025-08-16 14:11:22 +02:00
vabene1111
b586794337 fixed some Food Editor dropdowns not really visible #3891 2025-08-16 14:02:54 +02:00
vabene1111
460cb43113 improved sub recipe rendering 2025-08-16 13:59:25 +02:00
vabene1111
5128fcc9eb improved meal plan cards on home page 2025-08-16 13:49:36 +02:00
vabene1111
243ff8601c fixed invalid times or servings breaking recipe editor 2025-08-16 13:14:20 +02:00
vabene1111
97f8d46afb fixed error header trnslation 2025-08-16 13:14:07 +02:00
vabene1111
e469ebf35e SLE border + no append to body for SL model input 2025-08-16 13:02:15 +02:00
vabene1111
e04c729476 open recipe in new tab from meal plan dialog 2025-08-16 12:42:11 +02:00
vabene1111
d98bf9155d small fixes to rating display 2025-08-16 12:04:30 +02:00
vabene1111
e98d00a962 improved invite link view 2025-08-16 11:24:24 +02:00
vabene1111
cf5f896cec removed used by field from InviteLink browsable API view 2025-08-16 10:59:39 +02:00
vabene1111
e8d616ac98 Merge branch 'develop' of https://github.com/TandoorRecipes/recipes into develop 2025-08-16 10:55:59 +02:00
vabene1111
7a22d43959 updated alpine 2025-08-16 10:55:55 +02:00
vabene1111
6b68f48227 Merge pull request #3861 from MyDigitalLife/fix-k8s-documentation
Fixed k8s setup for tandoor 2
2025-08-16 10:48:35 +02:00
vabene1111
115f18889a removed LDAP fix
https://github.com/TandoorRecipes/recipes/pull/3905
2025-08-16 10:47:43 +02:00
vabene1111
0aaffb7545 Merge pull request #3904 from wilmardo/docker
Docker optimizations
2025-08-16 10:45:43 +02:00
Romulo frutuoso ALves
087cbdade8 Translated using Weblate (Portuguese (Brazil))
Currently translated at 82.4% (657 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/pt_BR/
2025-08-14 23:38:27 +00:00
Adrien Poupa
7e55115a3a fix(vite): Configure Vite to use subfolder 2025-08-13 00:21:48 -04:00
Tomasz Rzymyszkiewicz
31ee55a113 Translated using Weblate (Polish)
Currently translated at 74.6% (595 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/pl/
2025-08-11 20:18:09 +00:00
tomtjes
61be55e4b7 add community links 2025-08-10 15:26:04 -04:00
Enzo La Rafale
e3f695bde1 Translated using Weblate (French)
Currently translated at 96.9% (773 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fr/
2025-08-10 11:36:14 +00:00
Elias Sjögreen
0fb3d22f6a Translated using Weblate (Swedish)
Currently translated at 68.2% (333 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/sv/
2025-08-10 11:36:13 +00:00
Enzo La Rafale
7ba5187ecf Translated using Weblate (French)
Currently translated at 93.2% (455 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/fr/
2025-08-10 11:36:13 +00:00
Enzo La Rafale
168c0f3a0d Translated using Weblate (French)
Currently translated at 89.3% (712 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fr/
2025-08-10 10:18:03 +00:00
Enzo La Rafale
1179e226ab Translated using Weblate (French)
Currently translated at 88.0% (702 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fr/
2025-08-10 10:11:42 +00:00
Romain Spychala
bed22c055d Translated using Weblate (French)
Currently translated at 74.0% (590 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fr/
2025-08-09 21:27:07 +00:00
Elias Sjögreen
c25a1df480 Translated using Weblate (Swedish)
Currently translated at 76.0% (606 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sv/
2025-08-09 13:46:58 +00:00
Elias Sjögreen
d1df772218 Translated using Weblate (Swedish)
Currently translated at 71.5% (570 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sv/
2025-08-09 13:34:09 +00:00
PierreB
cbdd23020b Translated using Weblate (French)
Currently translated at 92.8% (453 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/fr/
2025-08-05 09:38:32 +00:00
wilmarguida
10f8a56343 fix: mark boot.sh as executable in git
Signed-off-by: wilmarguida <w.denouden@guida.nl>
2025-08-05 09:06:22 +02:00
wilmarguida
006c5b3af8 fix: deprecation warning about env declaration syntax in Dockerfile
Signed-off-by: wilmarguida <w.denouden@guida.nl>
2025-08-05 08:58:24 +02:00
wilmarguida
562a0dceae feat: make nginx error/access visible on stdout
Signed-off-by: wilmarguida <w.denouden@guida.nl>
2025-08-05 08:55:32 +02:00
wilmarguida
cde03a0f33 fix: respect TANDOOR_PORT MEDIA_ROOT and STATIC_ROOT in the nginx config
Signed-off-by: wilmarguida <w.denouden@guida.nl>
2025-08-05 08:55:02 +02:00
wilmarguida
b42285a9a5 clean: remove armv7 pip wheels config, not support in v2
Signed-off-by: wilmarguida <w.denouden@guida.nl>
2025-08-05 08:07:19 +02:00
wilmarguida
f4d4a5b714 fix: use rust from alpine repo instead of running curl on aarch64
Signed-off-by: wilmarguida <w.denouden@guida.nl>
2025-08-05 08:06:47 +02:00
wilmarguida
ee7d611086 fix: make sure nginx process in entrypoint will receive SIGTERM by using tini
Signed-off-by: wilmarguida <w.denouden@guida.nl>
2025-08-05 07:59:37 +02:00
wilmarguida
e51fda5f20 fix: use MEDIA_ROOT when specified in chown in boot.sh
Signed-off-by: wilmarguida <w.denouden@guida.nl>
2025-08-04 20:31:55 +02:00
Vincenzo Reale
bee759e166 Translated using Weblate (Italian)
Currently translated at 100.0% (797 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/it/
2025-08-04 06:47:27 +00:00
Paulo Vitor Bettini de Paiva Lima
5802dfd0a5 Translated using Weblate (Portuguese (Brazil))
Currently translated at 81.1% (647 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/pt_BR/
2025-08-03 19:33:46 +00:00
Christoph Wagner
c18ce7635d Translated using Weblate (German)
Currently translated at 99.7% (795 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/
2025-08-03 10:04:30 +00:00
Christoph Wagner
942a8a6119 Translated using Weblate (German)
Currently translated at 99.7% (795 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/
2025-08-03 09:58:10 +00:00
Matjaž T
4015edde90 Translated using Weblate (Slovenian)
Currently translated at 100.0% (797 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sl/
2025-08-03 06:29:30 +00:00
Samuel
1c32940f5c Translated using Weblate (French)
Currently translated at 71.7% (572 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fr/
2025-08-02 11:07:53 +00:00
Matjaž T
447ffa9fe2 Translated using Weblate (Slovenian)
Currently translated at 100.0% (797 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sl/
2025-08-02 07:49:46 +00:00
TC Kuo
8480234592 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/zh_Hant/
2025-08-02 07:49:46 +00:00
TC Kuo
2e0345a4a8 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (797 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hant/
2025-08-02 03:59:39 +00:00
TC Kuo
49fc0cf80f Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/zh_Hant/
2025-08-02 03:59:39 +00:00
TC Kuo
c67ecb6e31 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 88.9% (709 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hant/
2025-08-01 20:33:11 +00:00
TC Kuo
b4f12c4e84 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 62.3% (497 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hant/
2025-08-01 20:08:30 +00:00
TC Kuo
0b2adf5249 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 29.9% (239 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hant/
2025-08-01 19:47:32 +00:00
TC Kuo
7dcb5884d9 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 1.0% (8 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hant/
2025-08-01 18:43:34 +00:00
TC Kuo
35bd550101 Translated using Weblate (English)
Currently translated at 100.0% (797 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/en/
2025-08-01 18:43:34 +00:00
vabene1111
707abfacb0 Merge branch 'develop' of https://github.com/TandoorRecipes/recipes into develop 2025-08-01 20:16:03 +02:00
vabene1111
ed4f4c77e8 add rating to review view 2025-08-01 20:15:58 +02:00
TC Kuo
c492fb513b Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 0.2% (2 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hant/
2025-08-01 17:56:24 +00:00
TC Kuo
310b8e04e1 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 0.2% (2 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hans/
2025-08-01 17:56:23 +00:00
TC Kuo
efeae4debc Translated using Weblate (Ukrainian)
Currently translated at 0.1% (1 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/uk/
2025-08-01 17:56:23 +00:00
TC Kuo
6bc25c32ff Translated using Weblate (Turkish)
Currently translated at 0.2% (2 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/tr/
2025-08-01 17:56:22 +00:00
TC Kuo
7f2b0438fe Translated using Weblate (Swedish)
Currently translated at 0.2% (2 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sv/
2025-08-01 17:56:21 +00:00
TC Kuo
8481f8c658 Translated using Weblate (Romanian)
Currently translated at 0.1% (1 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ro/
2025-08-01 17:56:18 +00:00
TC Kuo
d842795c25 Translated using Weblate (Portuguese (Brazil))
Currently translated at 0.3% (3 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/pt_BR/
2025-08-01 17:56:17 +00:00
TC Kuo
58dd700207 Translated using Weblate (Portuguese)
Currently translated at 0.1% (1 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/pt/
2025-08-01 17:56:16 +00:00
TC Kuo
1331d2cb6d Translated using Weblate (Polish)
Currently translated at 0.2% (2 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/pl/
2025-08-01 17:56:15 +00:00
TC Kuo
ad2a613fd8 Translated using Weblate (Norwegian Bokmål)
Currently translated at 0.1% (1 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nb_NO/
2025-08-01 17:56:13 +00:00
TC Kuo
0565189580 Translated using Weblate (Latvian)
Currently translated at 0.0% (0 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/lv/
2025-08-01 17:56:12 +00:00
TC Kuo
5aa351b885 Translated using Weblate (Lithuanian)
Currently translated at 0.0% (0 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/lt/
2025-08-01 17:56:12 +00:00
TC Kuo
d5226eb5cf Translated using Weblate (Icelandic)
Currently translated at 0.0% (0 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/is/
2025-08-01 17:56:11 +00:00
TC Kuo
9ead1d0022 Translated using Weblate (Indonesian)
Currently translated at 0.0% (0 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/id/
2025-08-01 17:56:11 +00:00
TC Kuo
67342c3ba9 Translated using Weblate (Armenian)
Currently translated at 0.0% (0 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/hy/
2025-08-01 17:56:10 +00:00
TC Kuo
3fecd82cd0 Translated using Weblate (Hungarian)
Currently translated at 0.1% (1 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/hu/
2025-08-01 17:56:10 +00:00
TC Kuo
a033c4290f Translated using Weblate (Croatian)
Currently translated at 0.2% (2 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/hr/
2025-08-01 17:56:09 +00:00
TC Kuo
b6597af0d7 Translated using Weblate (Hebrew)
Currently translated at 0.2% (2 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/he/
2025-08-01 17:56:09 +00:00
TC Kuo
af6ed4bd24 Translated using Weblate (French)
Currently translated at 0.2% (2 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fr/
2025-08-01 17:56:07 +00:00
TC Kuo
cc4bddb3fe Translated using Weblate (Finnish)
Currently translated at 0.2% (2 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fi/
2025-08-01 17:56:07 +00:00
TC Kuo
95a9df9c05 Translated using Weblate (Greek)
Currently translated at 0.2% (2 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/el/
2025-08-01 17:56:05 +00:00
TC Kuo
c44de28c2c Translated using Weblate (Danish)
Currently translated at 0.2% (2 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/da/
2025-08-01 17:56:02 +00:00
TC Kuo
9f1b87fa4f Translated using Weblate (Czech)
Currently translated at 0.2% (2 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/cs/
2025-08-01 17:56:01 +00:00
TC Kuo
b96e0bab11 Translated using Weblate (Catalan)
Currently translated at 0.2% (2 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ca/
2025-08-01 17:55:56 +00:00
TC Kuo
fe97fb371b Translated using Weblate (Bulgarian)
Currently translated at 0.0% (0 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/bg/
2025-08-01 17:55:55 +00:00
TC Kuo
bb7df960cc Translated using Weblate (English)
Currently translated at 100.0% (797 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/en/
2025-08-01 17:55:54 +00:00
TC Kuo
c3c7d803dc Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 75.9% (605 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hant/
2025-08-01 17:23:10 +00:00
TC Kuo
99ce3327cc Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/zh_Hant/
2025-08-01 17:23:10 +00:00
TC Kuo
d1949df23d Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 75.0% (598 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hant/
2025-08-01 17:04:23 +00:00
TC Kuo
119b47c3c4 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 71.5% (570 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hant/
2025-08-01 16:51:38 +00:00
TC Kuo
8b50c59ad3 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/zh_Hant/
2025-08-01 16:51:38 +00:00
TC Kuo
e2ac65467b Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/zh_Hant/
2025-08-01 16:49:24 +00:00
vabene1111
c5cc492f0a navigate to start page when space is switched 2025-08-01 18:45:21 +02:00
vabene1111
8c73b5254c Merge pull request #3865 from TandoorRecipes/dependabot/npm_and_yarn/vue3/vueuse/router-13.6.0
Bump @vueuse/router from 13.4.0 to 13.6.0 in /vue3
2025-08-01 18:34:01 +02:00
dependabot[bot]
4b0315ffd3 Bump @vueuse/router from 13.4.0 to 13.6.0 in /vue3
Bumps [@vueuse/router](https://github.com/vueuse/vueuse/tree/HEAD/packages/router) from 13.4.0 to 13.6.0.
- [Release notes](https://github.com/vueuse/vueuse/releases)
- [Commits](https://github.com/vueuse/vueuse/commits/v13.6.0/packages/router)

---
updated-dependencies:
- dependency-name: "@vueuse/router"
  dependency-version: 13.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-01 16:08:02 +00:00
vabene1111
6a96f5b7c5 Merge pull request #3873 from TandoorRecipes/dependabot/pip/redis-6.2.0
Bump redis from 5.2.1 to 6.2.0
2025-08-01 18:04:42 +02:00
vabene1111
8875dd4083 Merge pull request #3871 from TandoorRecipes/dependabot/pip/mock-5.2.0
Bump mock from 5.1.0 to 5.2.0
2025-08-01 18:02:12 +02:00
dependabot[bot]
7299f265d3 Bump mock from 5.1.0 to 5.2.0
Bumps [mock](https://github.com/testing-cabal/mock) from 5.1.0 to 5.2.0.
- [Changelog](https://github.com/testing-cabal/mock/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/testing-cabal/mock/compare/5.1.0...5.2.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-01 16:02:03 +00:00
vabene1111
cac186f63c Merge pull request #3864 from TandoorRecipes/dependabot/npm_and_yarn/vue3/vite-plugin-pwa-1.0.2
Bump vite-plugin-pwa from 1.0.1 to 1.0.2 in /vue3
2025-08-01 18:02:01 +02:00
vabene1111
fd4c571e48 Merge pull request #3866 from TandoorRecipes/dependabot/npm_and_yarn/vue3/multi-e4d86410fd
Bump luxon and @types/luxon in /vue3
2025-08-01 18:01:45 +02:00
dependabot[bot]
db99450475 Bump redis from 5.2.1 to 6.2.0
Bumps [redis](https://github.com/redis/redis-py) from 5.2.1 to 6.2.0.
- [Release notes](https://github.com/redis/redis-py/releases)
- [Changelog](https://github.com/redis/redis-py/blob/master/CHANGES)
- [Commits](https://github.com/redis/redis-py/compare/v5.2.1...v6.2.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-01 16:01:36 +00:00
vabene1111
ec50add571 Merge pull request #3867 from TandoorRecipes/dependabot/npm_and_yarn/vue3/vueuse/core-13.6.0
Bump @vueuse/core from 13.4.0 to 13.6.0 in /vue3
2025-08-01 18:01:31 +02:00
vabene1111
1fc3746619 Merge pull request #3868 from TandoorRecipes/dependabot/npm_and_yarn/vue3/vuetify-3.9.3
Bump vuetify from 3.9.0 to 3.9.3 in /vue3
2025-08-01 18:01:16 +02:00
vabene1111
debf4c124a Merge pull request #3869 from TandoorRecipes/dependabot/github_actions/awalsh128/cache-apt-pkgs-action-1.5.1
Bump awalsh128/cache-apt-pkgs-action from 1.4.3 to 1.5.1
2025-08-01 18:00:58 +02:00
vabene1111
0e071255e5 Merge pull request #3870 from TandoorRecipes/dependabot/github_actions/Ilshidur/action-discord-0.4.0
Bump Ilshidur/action-discord from 0.3.2 to 0.4.0
2025-08-01 18:00:35 +02:00
vabene1111
4d0b8c690b Merge pull request #3872 from TandoorRecipes/dependabot/pip/pillow-11.3.0
Bump pillow from 11.1.0 to 11.3.0
2025-08-01 18:00:24 +02:00
vabene1111
85b3e0a0a6 Merge pull request #3874 from TandoorRecipes/dependabot/pip/aiohttp-3.12.15
Bump aiohttp from 3.12.14 to 3.12.15
2025-08-01 18:00:01 +02:00
vabene1111
d8573ce16f Merge pull request #3875 from TandoorRecipes/dependabot/pip/recipe-scrapers-15.8.0
Bump recipe-scrapers from 15.6.0 to 15.8.0
2025-08-01 17:59:53 +02:00
Michael van Laar
7f7e3180fa Translated using Weblate (German)
Currently translated at 99.1% (790 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/
2025-08-01 13:05:40 +00:00
Aleksey
57cc6feef0 Translated using Weblate (Russian)
Currently translated at 50.0% (244 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/ru/
2025-08-01 08:40:28 +00:00
dependabot[bot]
fb198a80d2 Bump recipe-scrapers from 15.6.0 to 15.8.0
Bumps [recipe-scrapers](https://github.com/hhursev/recipe-scrapers) from 15.6.0 to 15.8.0.
- [Release notes](https://github.com/hhursev/recipe-scrapers/releases)
- [Commits](https://github.com/hhursev/recipe-scrapers/compare/15.6.0...15.8.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-01 00:49:41 +00:00
dependabot[bot]
5b324a86dc Bump aiohttp from 3.12.14 to 3.12.15
---
updated-dependencies:
- dependency-name: aiohttp
  dependency-version: 3.12.15
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-01 00:49:39 +00:00
dependabot[bot]
f633274bef Bump pillow from 11.1.0 to 11.3.0
Bumps [pillow](https://github.com/python-pillow/Pillow) from 11.1.0 to 11.3.0.
- [Release notes](https://github.com/python-pillow/Pillow/releases)
- [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst)
- [Commits](https://github.com/python-pillow/Pillow/compare/11.1.0...11.3.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-01 00:49:01 +00:00
dependabot[bot]
65b2eb6d7e Bump Ilshidur/action-discord from 0.3.2 to 0.4.0
Bumps [Ilshidur/action-discord](https://github.com/ilshidur/action-discord) from 0.3.2 to 0.4.0.
- [Release notes](https://github.com/ilshidur/action-discord/releases)
- [Commits](https://github.com/ilshidur/action-discord/compare/0.3.2...0.4.0)

---
updated-dependencies:
- dependency-name: Ilshidur/action-discord
  dependency-version: 0.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-01 00:20:59 +00:00
dependabot[bot]
0c509ec02e Bump awalsh128/cache-apt-pkgs-action from 1.4.3 to 1.5.1
Bumps [awalsh128/cache-apt-pkgs-action](https://github.com/awalsh128/cache-apt-pkgs-action) from 1.4.3 to 1.5.1.
- [Release notes](https://github.com/awalsh128/cache-apt-pkgs-action/releases)
- [Commits](https://github.com/awalsh128/cache-apt-pkgs-action/compare/v1.4.3...v1.5.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-01 00:20:57 +00:00
dependabot[bot]
babcddeeb1 Bump vuetify from 3.9.0 to 3.9.3 in /vue3
Bumps [vuetify](https://github.com/vuetifyjs/vuetify/tree/HEAD/packages/vuetify) from 3.9.0 to 3.9.3.
- [Release notes](https://github.com/vuetifyjs/vuetify/releases)
- [Commits](https://github.com/vuetifyjs/vuetify/commits/v3.9.3/packages/vuetify)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-01 00:17:54 +00:00
dependabot[bot]
f23b282f27 Bump @vueuse/core from 13.4.0 to 13.6.0 in /vue3
Bumps [@vueuse/core](https://github.com/vueuse/vueuse/tree/HEAD/packages/core) from 13.4.0 to 13.6.0.
- [Release notes](https://github.com/vueuse/vueuse/releases)
- [Commits](https://github.com/vueuse/vueuse/commits/v13.6.0/packages/core)

---
updated-dependencies:
- dependency-name: "@vueuse/core"
  dependency-version: 13.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-01 00:17:45 +00:00
dependabot[bot]
fcfedd3026 Bump luxon and @types/luxon in /vue3
Bumps [luxon](https://github.com/moment/luxon) and [@types/luxon](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/luxon). These dependencies needed to be updated together.

Updates `luxon` from 3.6.1 to 3.7.1
- [Changelog](https://github.com/moment/luxon/blob/master/CHANGELOG.md)
- [Commits](https://github.com/moment/luxon/compare/3.6.1...3.7.1)

Updates `@types/luxon` from 3.6.2 to 3.7.1
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/luxon)

---
updated-dependencies:
- dependency-name: luxon
  dependency-version: 3.7.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: "@types/luxon"
  dependency-version: 3.7.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-01 00:17:38 +00:00
dependabot[bot]
efd65c1024 Bump vite-plugin-pwa from 1.0.1 to 1.0.2 in /vue3
Bumps [vite-plugin-pwa](https://github.com/vite-pwa/vite-plugin-pwa) from 1.0.1 to 1.0.2.
- [Release notes](https://github.com/vite-pwa/vite-plugin-pwa/releases)
- [Commits](https://github.com/vite-pwa/vite-plugin-pwa/compare/v1.0.1...v1.0.2)

---
updated-dependencies:
- dependency-name: vite-plugin-pwa
  dependency-version: 1.0.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-01 00:17:20 +00:00
Justin Straver
6f4f5381ff Translated using Weblate (Dutch)
Currently translated at 100.0% (797 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2025-07-31 20:02:18 +00:00
Peter Smeets
95b63f5180 Update kubernetes.md 2025-07-31 21:51:26 +02:00
Peter Smeets
f33a52a94c Update 50-deployment.yaml 2025-07-31 21:41:56 +02:00
Justin Straver
90baf26eb8 Translated using Weblate (Dutch)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/nl/
2025-07-31 19:14:46 +00:00
vabene1111
9119d773f1 Merge branch 'develop' 2025-07-31 19:28:03 +02:00
vabene1111
4ea5cdb8b9 Merge branch 'develop' of https://github.com/TandoorRecipes/recipes into develop 2025-07-31 19:27:56 +02:00
vabene1111
f36e5f1d89 re-enabled latest push 2025-07-31 19:27:51 +02:00
Justin Straver
bce95ff604 Translated using Weblate (Slovenian)
Currently translated at 99.6% (794 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sl/
2025-07-31 17:26:43 +00:00
Justin Straver
0f0a5b32cd Translated using Weblate (Dutch)
Currently translated at 99.4% (793 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2025-07-31 17:26:43 +00:00
Justin Straver
0bd0b794df Translated using Weblate (Spanish)
Currently translated at 95.6% (762 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/es/
2025-07-31 17:26:43 +00:00
Justin Straver
5267ac12b0 Translated using Weblate (German)
Currently translated at 99.1% (790 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/
2025-07-31 17:26:43 +00:00
Justin Straver
02678ffe30 Translated using Weblate (English)
Currently translated at 100.0% (797 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/en/
2025-07-31 17:26:43 +00:00
Justin Straver
2907e29a11 Translated using Weblate (Dutch)
Currently translated at 99.2% (791 of 797 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2025-07-31 16:42:55 +00:00
vabene1111
9d49c4d550 Merge branch 'develop' of http://translate.tandoor.dev/git/tandoor/recipes-backend into develop
# Conflicts:
#	vue3/src/locales/it.json
#	vue3/src/locales/ru.json
2025-07-31 18:04:43 +02:00
vabene1111
e2c6eec628 updated release flow 2025-07-31 17:52:47 +02:00
vabene1111
63716e4397 removed debug code 2025-07-31 17:43:42 +02:00
vabene1111
27e5955c78 Merge branch 'develop' 2025-07-31 17:29:28 +02:00
vabene1111
e9e6cdccca improved help page and dialog 2025-07-31 17:28:36 +02:00
vabene1111
8c8096e348 add ability to disable frontend plugins 2025-07-31 16:17:28 +02:00
vabene1111
9fcbbc17e8 port change logic 2025-07-31 16:04:30 +02:00
vabene1111
0a2f83cf85 localhost in nginx config 2025-07-31 15:49:48 +02:00
vabene1111
01fff0783f additions to help page 2025-07-29 18:04:40 +02:00
vabene1111
7ccdb90f9b updated docs for tandoor 2 setup 2025-07-29 17:37:42 +02:00
vabene1111
c2e522d9f2 service worker 2025-07-29 16:57:51 +02:00
vabene1111
92578dd6a2 new nginx config directory 2025-07-29 16:01:32 +02:00
vabene1111
3103f28fc8 maybe now ? 2025-07-28 22:19:06 +02:00
vabene1111
a5df1275ec try a different way 2025-07-28 22:09:58 +02:00
vabene1111
a4308f9864 run nginx as part of boot script 2025-07-28 22:06:55 +02:00
vabene1111
21526fb676 nginx run 2025-07-28 21:48:19 +02:00
vabene1111
5dc3116c44 service worker settings 2025-07-28 21:45:45 +02:00
vabene1111
2a6a87ec16 run nginx 2025-07-28 21:37:22 +02:00
vabene1111
8149b05185 delete http.d by default 2025-07-28 21:32:59 +02:00
vabene1111
61afbbdfbe tweaking nginx 2025-07-28 21:22:43 +02:00
vabene1111
a37455ccda fix delete failure? 2025-07-28 20:32:22 +02:00
vabene1111
6d711aff41 first try adding nginx directly to container 2025-07-28 20:28:07 +02:00
vabene1111
d4adb975ec fixed theming test 2025-07-28 20:16:37 +02:00
Aleksey
9b581d58bd Translated using Weblate (Russian)
Currently translated at 100.0% (795 of 795 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ru/
2025-07-28 17:58:41 +00:00
Vincenzo Reale
79db8a2fe0 Translated using Weblate (Italian)
Currently translated at 100.0% (795 of 795 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/it/
2025-07-28 17:58:41 +00:00
Aleksey
f722d4751b Translated using Weblate (Russian)
Currently translated at 17.4% (85 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/ru/
2025-07-28 17:58:40 +00:00
vabene1111
368ed2aaf3 updated pytest and fixed ingredient parser 2025-07-28 19:29:20 +02:00
vabene1111
50400e1d20 fixed theming issue 2025-07-28 18:20:30 +02:00
vabene1111
750115cab5 improved properties dialog 2025-07-28 18:20:24 +02:00
vabene1111
9d8acdc41f removed duplicate package.json 2025-07-28 17:37:16 +02:00
vabene1111
7ab36f1a7a small fixes 2025-07-28 17:36:55 +02:00
Justin Straver
b8d0e32550 Translated using Weblate (Dutch)
Currently translated at 99.4% (791 of 795 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2025-07-23 21:11:45 +00:00
Justin Straver
d9f0889b36 Translated using Weblate (English)
Currently translated at 100.0% (795 of 795 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/en/
2025-07-23 21:11:44 +00:00
Justin Straver
35f40f175c Translated using Weblate (Dutch)
Currently translated at 99.6% (792 of 795 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2025-07-23 08:15:32 +00:00
Aija Kozlovska
291ff86c42 Translated using Weblate (Latvian)
Currently translated at 70.0% (342 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/lv/
2025-07-21 09:43:37 +00:00
Matjaž T
d2b0aeab52 Translated using Weblate (Slovenian)
Currently translated at 100.0% (795 of 795 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sl/
2025-07-21 07:29:54 +00:00
Vincenzo Reale
3cab6e538e Translated using Weblate (Italian)
Currently translated at 100.0% (795 of 795 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/it/
2025-07-21 07:29:54 +00:00
Justin Straver
db67ab6b30 Translated using Weblate (English)
Currently translated at 100.0% (795 of 795 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/en/
2025-07-20 16:23:25 +00:00
Justin Straver
b5b31b3dc6 Translated using Weblate (Dutch)
Currently translated at 99.6% (792 of 795 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2025-07-20 15:05:13 +00:00
Justin Straver
a15dd2ccbc Translated using Weblate (German)
Currently translated at 99.3% (790 of 795 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/
2025-07-20 15:05:13 +00:00
Justin Straver
62cc54f9f5 Translated using Weblate (English)
Currently translated at 100.0% (795 of 795 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/en/
2025-07-20 15:05:13 +00:00
Justin Straver
75c5bba7e5 Translated using Weblate (Dutch)
Currently translated at 100.0% (795 of 795 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2025-07-20 14:51:34 +00:00
Justin Straver
642a0493af Translated using Weblate (Dutch)
Currently translated at 95.2% (757 of 795 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2025-07-20 14:23:53 +00:00
Justin Straver
8d8e0be328 Translated using Weblate (Dutch)
Currently translated at 89.3% (710 of 795 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2025-07-20 14:07:24 +00:00
Justin Straver
744b588cea Translated using Weblate (Dutch)
Currently translated at 87.2% (694 of 795 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2025-07-20 13:56:22 +00:00
Justin Straver
d3a21b9ff0 Translated using Weblate (Dutch)
Currently translated at 87.1% (693 of 795 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2025-07-20 11:08:36 +00:00
Justin Straver
3a9c40c566 Translated using Weblate (Dutch)
Currently translated at 79.3% (631 of 795 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2025-07-20 09:49:52 +00:00
Justin Straver
387e0a5250 Translated using Weblate (Dutch)
Currently translated at 78.8% (627 of 795 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2025-07-20 09:42:17 +00:00
Justin Straver
4ea28ba22a Translated using Weblate (Dutch)
Currently translated at 74.8% (595 of 795 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2025-07-20 09:19:02 +00:00
Justin Straver
20660f547c Translated using Weblate (Dutch)
Currently translated at 74.7% (594 of 795 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2025-07-20 09:17:57 +00:00
Justin Straver
2ee63d8568 Translated using Weblate (Dutch)
Currently translated at 74.4% (590 of 793 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2025-07-20 08:37:14 +00:00
vabene1111
2179d7d1f7 playing with plugins 2025-07-18 15:49:46 +02:00
Matjaž T
034d59373f Translated using Weblate (Slovenian)
Currently translated at 100.0% (793 of 793 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sl/
2025-07-18 08:00:26 +00:00
vabene1111
d1ad0ade0f playing with programmatic navigation creation 2025-07-17 16:21:10 +02:00
vabene1111
991089c17a various little fixes 2025-07-17 16:04:31 +02:00
vabene1111
54960d8480 basics of an open data plugin (tmp in this repo)
temporarily in the main repo while testing and playing around
2025-07-17 15:40:05 +02:00
vabene1111
5fcfe09bb6 added basic plugin support 2025-07-17 15:34:51 +02:00
vabene1111
01c4974507 Merge pull request #3815 from caffeinated-tech/cookbookapp-images-import
Cookbookapp images import
2025-07-17 09:44:27 +02:00
vabene1111
2d57e0dab2 Merge pull request #3832 from TandoorRecipes/dependabot/npm_and_yarn/vue3/vue-i18n-11.1.10
Bump vue-i18n from 11.1.7 to 11.1.10 in /vue3
2025-07-17 08:11:05 +02:00
vabene1111
d52e5408c0 Merge pull request #3825 from TandoorRecipes/dependabot/pip/aiohttp-3.12.14
Bump aiohttp from 3.10.11 to 3.12.14
2025-07-17 08:10:48 +02:00
dependabot[bot]
fdce69daf4 Bump vue-i18n from 11.1.7 to 11.1.10 in /vue3
Bumps [vue-i18n](https://github.com/intlify/vue-i18n/tree/HEAD/packages/vue-i18n) from 11.1.7 to 11.1.10.
- [Release notes](https://github.com/intlify/vue-i18n/releases)
- [Changelog](https://github.com/intlify/vue-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/intlify/vue-i18n/commits/v11.1.10/packages/vue-i18n)

---
updated-dependencies:
- dependency-name: vue-i18n
  dependency-version: 11.1.10
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-16 19:36:39 +00:00
Vincenzo Reale
cb3ffcb12d Translated using Weblate (Italian)
Currently translated at 100.0% (793 of 793 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/it/
2025-07-16 03:44:42 +00:00
vabene1111
d7342a349b Merge branch 'develop' of http://translate.tandoor.dev/git/tandoor/recipes-backend into develop
# Conflicts:
#	vue3/src/locales/es.json
#	vue3/src/locales/it.json
#	vue3/src/locales/pt_BR.json
#	vue3/src/locales/sl.json
2025-07-15 12:59:52 +02:00
dependabot[bot]
794bbed833 Bump aiohttp from 3.10.11 to 3.12.14
Bumps [aiohttp](https://github.com/aio-libs/aiohttp) from 3.10.11 to 3.12.14.
- [Release notes](https://github.com/aio-libs/aiohttp/releases)
- [Changelog](https://github.com/aio-libs/aiohttp/blob/master/CHANGES.rst)
- [Commits](https://github.com/aio-libs/aiohttp/compare/v3.10.11...v3.12.14)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-15 09:25:01 +00:00
vabene1111
0b335e80a6 first help dialog draft 2025-07-11 22:54:03 +02:00
vabene1111
2716d72e31 fixed redis settings? 2025-07-11 22:22:31 +02:00
vabene1111
8c849a1077 added redis as cache backend 2025-07-11 21:51:54 +02:00
vabene1111
8c1769458d multiselect CSS for every variant and fix is-selected class 2025-07-11 21:17:55 +02:00
vabene1111
2ac6451370 added FDC import to food editor 2025-07-11 21:08:56 +02:00
vabene1111
7841397b59 fixed step editor recipe selection 2025-07-11 20:51:21 +02:00
vabene1111
cd11194ce5 fixed css 2025-07-11 20:07:25 +02:00
vabene1111
be7558f82b allow automation directly from ingredient editor 2025-07-11 19:59:10 +02:00
vabene1111
35a7875f6f fixed generic model merge for multi word model names 2025-07-11 19:50:17 +02:00
vabene1111
55f1f834c2 improved meal plan editor shopping integration 2025-07-11 19:43:34 +02:00
vabene1111
f5f32912b1 added ability to add recipes to shopping list from shopping list view 2025-07-11 19:16:06 +02:00
vabene1111
5709435d43 removed JS_REVERSE_SCRIPT_PREFIX config variable 2025-07-11 19:04:37 +02:00
vabene1111
1c219dbc3b fixed error on account pages 2025-07-11 19:03:18 +02:00
vabene1111
1262982588 time picker out of labs 2025-07-11 18:46:54 +02:00
vabene1111
be8a340a0c fixed custom CSS problem after build 2025-07-11 18:44:40 +02:00
liam
fb1de15de6 cookbook app: only import the first valid image 2025-07-07 20:39:00 +00:00
liam
2180f11768 ignore venv in dockerfile to prevent my local venv overwriting the alpine one 2025-07-07 20:39:00 +00:00
caffeinated-tech
1083b7521e Merge branch 'TandoorRecipes:develop' into cookbookapp-images-import 2025-07-07 21:33:23 +01:00
vabene1111
70d40f9e70 fixed missing template 2025-07-07 17:56:54 +02:00
vabene1111
1094cf2d92 temporarily disabled service worker url 2025-07-07 17:39:18 +02:00
vabene1111
aaf6e0f197 Merge branch 'develop' of https://github.com/TandoorRecipes/recipes into develop 2025-07-06 18:26:50 +02:00
vabene1111
ec59cd6e4f playing around with a help dialog 2025-07-06 18:26:46 +02:00
vabene1111
3f7cb41db7 Merge pull request #3790 from TandoorRecipes/dependabot/npm_and_yarn/vue3/vitejs/plugin-vue-6.0.0
Bump @vitejs/plugin-vue from 5.2.4 to 6.0.0 in /vue3
2025-07-06 16:14:38 +02:00
vabene1111
432ed09ef8 updated pytest dependencies 2025-07-06 16:13:55 +02:00
vabene1111
6c8a8841c7 supermarket quick selection to shopping list 2025-07-06 16:11:07 +02:00
vabene1111
c3c762c262 Merge branch 'develop' of https://github.com/TandoorRecipes/recipes into develop 2025-07-06 15:59:59 +02:00
vabene1111
cc6f393a86 fixed open data food import with missing category 2025-07-06 15:59:54 +02:00
dependabot[bot]
2546c5b74c Bump @vitejs/plugin-vue from 5.2.4 to 6.0.0 in /vue3
Bumps [@vitejs/plugin-vue](https://github.com/vitejs/vite-plugin-vue/tree/HEAD/packages/plugin-vue) from 5.2.4 to 6.0.0.
- [Release notes](https://github.com/vitejs/vite-plugin-vue/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-vue/blob/main/packages/plugin-vue/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-vue/commits/plugin-vue@6.0.0/packages/plugin-vue)

---
updated-dependencies:
- dependency-name: "@vitejs/plugin-vue"
  dependency-version: 6.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-06 13:48:43 +00:00
vabene1111
118440c960 Merge pull request #3791 from TandoorRecipes/dependabot/npm_and_yarn/vue3/vue-i18n-11.1.7
Bump vue-i18n from 11.1.6 to 11.1.7 in /vue3
2025-07-06 15:46:31 +02:00
vabene1111
4f8ca0710f Merge pull request #3789 from TandoorRecipes/dependabot/pip/pytest-8.4.1
Bump pytest from 8.0.0 to 8.4.1
2025-07-06 15:46:22 +02:00
vabene1111
e2c1c4c1f7 Merge pull request #3792 from TandoorRecipes/dependabot/npm_and_yarn/vue3/vite-plugin-pwa-1.0.1
Bump vite-plugin-pwa from 1.0.0 to 1.0.1 in /vue3
2025-07-06 15:46:10 +02:00
vabene1111
8c18499fd7 Merge pull request #3793 from TandoorRecipes/dependabot/pip/pytubefix-9.2.2
Bump pytubefix from 8.13.1 to 9.2.2
2025-07-06 15:45:56 +02:00
vabene1111
bd9d5200b1 Merge pull request #3794 from TandoorRecipes/dependabot/npm_and_yarn/vue3/types/node-24.0.8
Bump @types/node from 22.15.32 to 24.0.8 in /vue3
2025-07-06 15:45:54 +02:00
vabene1111
cb98b6347b Merge pull request #3795 from TandoorRecipes/dependabot/pip/drf-spectacular-sidecar-2025.6.1
Bump drf-spectacular-sidecar from 2024.2.1 to 2025.6.1
2025-07-06 15:45:38 +02:00
vabene1111
a34d403b2c Merge pull request #3796 from TandoorRecipes/dependabot/pip/django-vite-3.1.0
Bump django-vite from 3.0.3 to 3.1.0
2025-07-06 15:45:31 +02:00
vabene1111
957d8092a3 Merge pull request #3797 from TandoorRecipes/dependabot/pip/cryptography-45.0.4
Bump cryptography from 44.0.1 to 45.0.4
2025-07-06 15:45:24 +02:00
vabene1111
eb799dead3 Merge pull request #3798 from TandoorRecipes/dependabot/npm_and_yarn/vue3/vuetify-3.8.11
Bump vuetify from 3.8.10 to 3.8.11 in /vue3
2025-07-06 15:45:14 +02:00
vabene1111
b37d9e2c25 Merge pull request #3778 from mkieledunsche/patch-1
Improved timer finish time display: adding "+Xd" suffix (localized)
2025-07-06 15:44:26 +02:00
vabene1111
9fc6e775aa markdown editor fixes 2025-07-06 14:40:52 +02:00
vabene1111
211bf226eb clear output directory on buiild 2025-07-06 14:09:08 +02:00
vabene1111
360a923e96 removed deprecated tests 2025-07-06 13:35:08 +02:00
vabene1111
2b689ffd6b fixed step editor ingredient sorting 2025-07-06 13:32:33 +02:00
vabene1111
feb6107c79 fixed import error permanently showing 2025-07-06 13:14:23 +02:00
vabene1111
d39d5d4cbf fixed open data slug for supermarket category 2025-07-06 13:00:10 +02:00
dependabot[bot]
62a66aa9a7 Bump vuetify from 3.8.10 to 3.8.11 in /vue3
Bumps [vuetify](https://github.com/vuetifyjs/vuetify/tree/HEAD/packages/vuetify) from 3.8.10 to 3.8.11.
- [Release notes](https://github.com/vuetifyjs/vuetify/releases)
- [Commits](https://github.com/vuetifyjs/vuetify/commits/v3.8.11/packages/vuetify)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-06 10:58:32 +00:00
dependabot[bot]
885433a1bd Bump vite-plugin-pwa from 1.0.0 to 1.0.1 in /vue3
Bumps [vite-plugin-pwa](https://github.com/vite-pwa/vite-plugin-pwa) from 1.0.0 to 1.0.1.
- [Release notes](https://github.com/vite-pwa/vite-plugin-pwa/releases)
- [Commits](https://github.com/vite-pwa/vite-plugin-pwa/compare/v1.0.0...v1.0.1)

---
updated-dependencies:
- dependency-name: vite-plugin-pwa
  dependency-version: 1.0.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-06 10:58:19 +00:00
vabene1111
f67efd55a7 udapted workbox dependencies 2025-07-06 12:56:38 +02:00
vabene1111
c238ea9136 fixed recipe export with images 2025-07-06 12:52:31 +02:00
caffeinated-tech
5a0a5b09a1 Merge branch 'TandoorRecipes:develop' into cookbookapp-images-import 2025-07-06 01:16:27 +01:00
liam
e698d14ec3 fixed documentation links 2025-07-06 00:10:53 +00:00
liam
0caf2fe77f added libxml workaround for building devcontainers 2025-07-06 00:03:19 +00:00
liam
c079f49d71 import all images from cookbookapp, ignoring branding images 2025-07-06 00:02:53 +00:00
vabene1111
dd921f1555 fixed CI workflow 2025-07-03 17:04:27 +02:00
dependabot[bot]
e1a504564f Bump drf-spectacular-sidecar from 2024.2.1 to 2025.6.1
Bumps [drf-spectacular-sidecar](https://github.com/tfranzel/drf-spectacular-sidecar) from 2024.2.1 to 2025.6.1.
- [Commits](https://github.com/tfranzel/drf-spectacular-sidecar/compare/2024.2.1...2025.6.1)

---
updated-dependencies:
- dependency-name: drf-spectacular-sidecar
  dependency-version: 2025.6.1
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-03 14:31:14 +00:00
dependabot[bot]
424fbd4de8 Bump cryptography from 44.0.1 to 45.0.4
Bumps [cryptography](https://github.com/pyca/cryptography) from 44.0.1 to 45.0.4.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/44.0.1...45.0.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-03 14:31:13 +00:00
vabene1111
7266ff8978 restored some deleted stuff 2025-07-03 16:29:54 +02:00
dependabot[bot]
3c8d434358 Bump django-vite from 3.0.3 to 3.1.0
Bumps [django-vite](https://github.com/MrBin99/django-vite) from 3.0.3 to 3.1.0.
- [Release notes](https://github.com/MrBin99/django-vite/releases)
- [Commits](https://github.com/MrBin99/django-vite/compare/3.0.3...3.1.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-01 04:44:54 +00:00
dependabot[bot]
088387fa90 Bump @types/node from 22.15.32 to 24.0.8 in /vue3
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 22.15.32 to 24.0.8.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.0.8
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-01 04:32:30 +00:00
dependabot[bot]
7bc7017162 Bump pytubefix from 8.13.1 to 9.2.2
Bumps [pytubefix](https://github.com/juanbindez/pytubefix) from 8.13.1 to 9.2.2.
- [Release notes](https://github.com/juanbindez/pytubefix/releases)
- [Commits](https://github.com/juanbindez/pytubefix/compare/v8.13.1...v9.2.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-01 04:31:55 +00:00
dependabot[bot]
22adc9fef9 Bump vue-i18n from 11.1.6 to 11.1.7 in /vue3
Bumps [vue-i18n](https://github.com/intlify/vue-i18n/tree/HEAD/packages/vue-i18n) from 11.1.6 to 11.1.7.
- [Release notes](https://github.com/intlify/vue-i18n/releases)
- [Changelog](https://github.com/intlify/vue-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/intlify/vue-i18n/commits/v11.1.7/packages/vue-i18n)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-01 04:07:45 +00:00
dependabot[bot]
1f688c3fe2 Bump pytest from 8.0.0 to 8.4.1
Bumps [pytest](https://github.com/pytest-dev/pytest) from 8.0.0 to 8.4.1.
- [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/8.0.0...8.4.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-01 03:59:30 +00:00
mkieledunsche
68040aa568 added localization for "+Xd" suffix in Timer.vue 2025-06-23 12:31:27 +02:00
mkieledunsche
1d751f73ff Merge branch 'TandoorRecipes:develop' into patch-1 2025-06-23 12:03:29 +02:00
Lucas Ortega
8490ac01cc Translated using Weblate (Portuguese (Brazil))
Currently translated at 78.4% (609 of 776 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/pt_BR/
2025-06-23 08:28:59 +00:00
Ángel
84477ef52a Translated using Weblate (Spanish)
Currently translated at 57.3% (280 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/es/
2025-06-23 08:28:59 +00:00
Matjaž T
b789573de3 Translated using Weblate (Slovenian)
Currently translated at 100.0% (776 of 776 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sl/
2025-06-23 08:28:59 +00:00
Ángel
d5d8e7ce63 Translated using Weblate (Spanish)
Currently translated at 98.8% (767 of 776 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/es/
2025-06-23 08:28:58 +00:00
Vincenzo Reale
c7a49458b9 Translated using Weblate (Italian)
Currently translated at 100.0% (776 of 776 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/it/
2025-06-23 08:28:58 +00:00
vabene1111
a5dde3d3c8 build independent system page 2025-06-22 15:59:11 +02:00
vabene1111
5f2fff229d remove reverse 2025-06-22 15:14:50 +02:00
vabene1111
f3c67f134c removed deleted apps 2025-06-22 14:47:51 +02:00
vabene1111
1c48fc1c53 removed another tables reference 2025-06-22 14:00:47 +02:00
vabene1111
7c51419f3b Merge pull request #3775 from TandoorRecipes/dependabot/npm_and_yarn/vue3/vite-6.3.5
Bump vite from 6.2.7 to 6.3.5 in /vue3
2025-06-22 13:45:23 +02:00
vabene1111
b3984b02b4 Merge pull request #3773 from TandoorRecipes/dependabot/pip/six-1.17.0
Bump six from 1.16.0 to 1.17.0
2025-06-22 13:45:00 +02:00
vabene1111
758c3fa1a9 Merge pull request #3772 from TandoorRecipes/dependabot/pip/icalendar-6.3.1
Bump icalendar from 6.1.0 to 6.3.1
2025-06-22 13:44:48 +02:00
vabene1111
52a55edd04 Merge pull request #3771 from TandoorRecipes/dependabot/pip/django-cleanup-9.0.0
Bump django-cleanup from 8.0.0 to 9.0.0
2025-06-22 13:44:38 +02:00
vabene1111
896dd28fa8 Merge pull request #3770 from TandoorRecipes/dependabot/pip/flake8-7.3.0
Bump flake8 from 7.1.1 to 7.3.0
2025-06-22 13:44:07 +02:00
vabene1111
c7b4fcd761 Merge pull request #3769 from TandoorRecipes/dependabot/pip/drf-writable-nested-0.7.2
Bump drf-writable-nested from 0.7.1 to 0.7.2
2025-06-22 13:43:58 +02:00
vabene1111
075e50b911 cleanup tables 2025-06-22 13:43:34 +02:00
dependabot[bot]
cc436898d5 Bump vite from 6.2.7 to 6.3.5 in /vue3
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.2.7 to 6.3.5.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v6.3.5/packages/vite)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-22 11:41:25 +00:00
dependabot[bot]
a2cd7fb82d Bump six from 1.16.0 to 1.17.0
Bumps [six](https://github.com/benjaminp/six) from 1.16.0 to 1.17.0.
- [Changelog](https://github.com/benjaminp/six/blob/main/CHANGES)
- [Commits](https://github.com/benjaminp/six/compare/1.16.0...1.17.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-22 11:40:43 +00:00
dependabot[bot]
213ca2009c Bump icalendar from 6.1.0 to 6.3.1
Bumps [icalendar](https://github.com/collective/icalendar) from 6.1.0 to 6.3.1.
- [Release notes](https://github.com/collective/icalendar/releases)
- [Changelog](https://github.com/collective/icalendar/blob/main/CHANGES.rst)
- [Commits](https://github.com/collective/icalendar/compare/v6.1.0...v6.3.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-22 11:40:41 +00:00
dependabot[bot]
6add8b9b02 Bump django-cleanup from 8.0.0 to 9.0.0
Bumps [django-cleanup](https://github.com/un1t/django-cleanup) from 8.0.0 to 9.0.0.
- [Changelog](https://github.com/un1t/django-cleanup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/un1t/django-cleanup/compare/8.0.0...9.0.0)

---
updated-dependencies:
- dependency-name: django-cleanup
  dependency-version: 9.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-22 11:40:39 +00:00
dependabot[bot]
adbff13556 Bump flake8 from 7.1.1 to 7.3.0
Bumps [flake8](https://github.com/pycqa/flake8) from 7.1.1 to 7.3.0.
- [Commits](https://github.com/pycqa/flake8/compare/7.1.1...7.3.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-22 11:40:37 +00:00
dependabot[bot]
65757b0019 Bump drf-writable-nested from 0.7.1 to 0.7.2
Bumps [drf-writable-nested](https://github.com/beda-software/drf-writable-nested) from 0.7.1 to 0.7.2.
- [Release notes](https://github.com/beda-software/drf-writable-nested/releases)
- [Changelog](https://github.com/beda-software/drf-writable-nested/blob/master/CHANGELOG.md)
- [Commits](https://github.com/beda-software/drf-writable-nested/compare/v0.7.1...v0.7.2)

---
updated-dependencies:
- dependency-name: drf-writable-nested
  dependency-version: 0.7.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-22 11:40:35 +00:00
vabene1111
0b17ef329f start dependabot for vue 3 2025-06-22 13:39:38 +02:00
vabene1111
d51a44a240 Merge pull request #3768 from TandoorRecipes/dependabot/npm_and_yarn/vue3/vite-6.2.7
Bump vite from 6.2.6 to 6.2.7 in /vue3
2025-06-22 13:37:43 +02:00
vabene1111
f4a7ef144f moved search settings to frontend 2025-06-22 13:37:02 +02:00
dependabot[bot]
2a8a79b263 Bump vite from 6.2.6 to 6.2.7 in /vue3
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.2.6 to 6.2.7.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v6.2.7/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v6.2.7/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 6.2.7
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-22 09:38:45 +00:00
vabene1111
edcc5f6441 big cleanup 2025-06-22 11:37:35 +02:00
vabene1111
9fc77be51b fixed error added by debug code 2025-06-22 10:28:26 +02:00
vabene1111
a861d8a89c fixed space theming and custom CSS 2025-06-22 10:14:02 +02:00
vabene1111
6baf640e6d fixed file upload 2025-06-22 10:03:34 +02:00
vabene1111
1dd3f227ac cleanup on testpage 2025-06-22 09:30:19 +02:00
vabene1111
a89cf71c17 fixed avatar nav link to database 2025-06-22 09:30:13 +02:00
vabene1111
2a6a785453 wip service worker 2025-06-19 17:48:06 +02:00
vabene1111
7dc9e012fa Merge branch 'feature/vue3' of https://github.com/vabene1111/recipes into feature/vue3 2025-06-19 17:36:44 +02:00
vabene1111
5d65c76686 small fixes 2025-06-19 17:36:39 +02:00
vabene1111
ff184f7e5d fixed ingredients without amount could count into missing properties 2025-06-14 22:37:58 +02:00
vabene1111
767cc9b58a fixed selecting foods with leading numbers in ShoppingListEntryInput 2025-06-14 22:24:52 +02:00
vabene1111
d8f444e596 improved model dialog los changes warning 2025-06-11 22:00:59 +02:00
vabene1111
6bc3e26eff meal plan sort order 2025-06-11 21:48:22 +02:00
vabene1111
68399acb8f improved SearchPage random behavior 2025-06-11 21:13:46 +02:00
vabene1111
22923b8e7e hint in model select 2025-06-11 20:51:42 +02:00
vabene1111
612c5e6668 fixed click on ingredient table rows checking row 2025-06-11 20:32:58 +02:00
vabene1111
a5a0264e41 fixed MealPlanEditor closing when changing date 2025-06-11 20:31:19 +02:00
vabene1111
fdb73563d6 Merge branch 'develop' into feature/vue3 2025-06-11 19:53:36 +02:00
vabene1111
cd2c4b35df Merge pull request #3742 from TandoorRecipes/dependabot/pip/psycopg2-binary-2.9.10
Bump psycopg2-binary from 2.9.9 to 2.9.10
2025-06-11 19:34:54 +02:00
dependabot[bot]
d1d4cec00f Bump psycopg2-binary from 2.9.9 to 2.9.10
Bumps [psycopg2-binary](https://github.com/psycopg/psycopg2) from 2.9.9 to 2.9.10.
- [Changelog](https://github.com/psycopg/psycopg2/blob/master/NEWS)
- [Commits](https://github.com/psycopg/psycopg2/compare/2.9.9...2.9.10)

---
updated-dependencies:
- dependency-name: psycopg2-binary
  dependency-version: 2.9.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-11 17:33:27 +00:00
vabene1111
6940f405eb Merge pull request #3757 from TandoorRecipes/dependabot/pip/requests-2.32.4
Bump requests from 2.32.3 to 2.32.4
2025-06-11 19:32:20 +02:00
dependabot[bot]
3e6f7a554a Bump requests from 2.32.3 to 2.32.4
Bumps [requests](https://github.com/psf/requests) from 2.32.3 to 2.32.4.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.32.3...v2.32.4)

---
updated-dependencies:
- dependency-name: requests
  dependency-version: 2.32.4
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-10 10:03:22 +00:00
vabene1111
4df451a540 Merge pull request #3752 from TandoorRecipes/dependabot/pip/django-4.2.22
Bump django from 4.2.21 to 4.2.22
2025-06-09 11:07:17 +02:00
vabene1111
78e2ee6631 fixed external recipes not sharable 2025-06-09 11:05:54 +02:00
dependabot[bot]
fd06d67218 Bump django from 4.2.21 to 4.2.22
Bumps [django](https://github.com/django/django) from 4.2.21 to 4.2.22.
- [Commits](https://github.com/django/django/compare/4.2.21...4.2.22)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-06 23:32:28 +00:00
vabene1111
97aa3301ea prepared global theming trough spaces 2025-06-06 19:14:45 +02:00
vabene1111
ec0bc43c21 implemented some missing settings 2025-06-06 15:42:39 +02:00
mkieledunsche
a8a5db401f Improved timer finish time display in Timer.vue: adding "+Xd" suffix to hh:mm for future days
as discussed in  #382
2025-06-06 15:09:56 +02:00
vabene1111
23c4c2e543 api settings linked browser and docs 2025-06-06 14:50:29 +02:00
vabene1111
d1a69dac90 added print mode to recipes 2025-06-05 17:29:08 +02:00
vabene1111
7b819843b7 fixed connector config test 2025-06-05 16:28:01 +02:00
vabene1111
8e1893a215 fixed test and accidental method override 2025-06-05 16:22:30 +02:00
vabene1111
6a43a01dd4 added connector config ui 2025-06-04 20:52:59 +02:00
vabene1111
63069dd716 added support for external recipes to new frontend 2025-06-04 20:35:35 +02:00
vabene1111
cd707d20a1 first parts of external recipes in frontend 2025-06-03 20:25:00 +02:00
vabene1111
c648ee954c changed model list navigation 2025-06-03 18:04:46 +02:00
vabene1111
5695cacc0e fixed initial navigation to modellistpage pushing wrong web history 2025-06-03 15:50:02 +02:00
vabene1111
bad5ad1f1f added recipe export 2025-06-02 21:59:51 +02:00
vabene1111
db8d35e332 improved image processing 2025-06-02 20:26:20 +02:00
vabene1111
c88df548e9 Merge branch 'feature/vue3' of https://github.com/TandoorRecipes/recipes into feature/vue3 2025-05-28 19:12:24 +02:00
vabene1111
81180207ba shopping export dialog 2025-05-28 19:12:19 +02:00
vabene1111
2a1a6ea433 Merge pull request #3724 from mikhail5555/feature/connector_manager_bulk_insert
Feature/connector manager bulk insert
2025-05-28 17:54:08 +02:00
vabene1111
fa8af5596f various fixes and improvements 2025-05-27 16:53:10 +02:00
Hennadii Lysenko
f546a4d382 Translated using Weblate (Ukrainian)
Currently translated at 53.6% (306 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/uk/
2025-05-21 14:58:39 +00:00
Mikhail Epifanov
fc0b12af12 remove redundant len, and fix optional 2025-05-19 23:11:39 +02:00
Mikhail Epifanov
b2da40421b fix test 2025-05-19 22:35:17 +02:00
Mikhail Epifanov
8740bf3a83 use DTO object, and cleanup some code which is no longer needed 2025-05-19 21:46:40 +02:00
querty
c2ecf7ef57 Translated using Weblate (Portuguese)
Currently translated at 60.0% (342 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/pt/
2025-05-18 10:58:40 +00:00
querty
b9771d7c11 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/pt_BR/
2025-05-18 10:58:39 +00:00
querty
d5b53d2bca Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/pt_BR/
2025-05-18 10:58:39 +00:00
Vincenzo Reale
f502cd47e1 Translated using Weblate (Italian)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/it/
2025-05-18 10:58:39 +00:00
Anna Kh
358fab9a8f Translated using Weblate (Russian)
Currently translated at 84.9% (484 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ru/
2025-05-16 13:58:39 +00:00
Tales Garcia Fernandes
445e78825a Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/pt_BR/
2025-05-15 10:58:40 +00:00
Mikhail Epifanov
d49e17f088 add a static method to manually suggest 'work' to be added to the queue 2025-05-14 18:25:58 +02:00
vabene1111
e7d9824520 Merge pull request #3691 from TandoorRecipes/dependabot/pip/pytubefix-8.13.1
Bump pytubefix from 8.12.2 to 8.13.1
2025-05-14 07:08:37 +02:00
vabene1111
c9ebbdd4ec Merge pull request #3707 from EifX/fix-doc-updating
Fix doc updating postgress
2025-05-14 07:07:07 +02:00
vabene1111
85fa211390 Merge pull request #3695 from tpansino/s3-secret-access-key-file
Support reading S3_SECRET_ACCESS_KEY from file
2025-05-14 07:05:42 +02:00
vabene1111
40a7db086f Merge pull request #3702 from tomtjes/vue3
fix bookmarklet
2025-05-14 07:02:49 +02:00
vabene1111
20f066104c added libgcc libstdc++ as dev dependency for arm builds?! 2025-05-14 06:51:37 +02:00
vabene1111
1d9de9bae2 Recipe editor improvements 2025-05-14 06:49:29 +02:00
vabene1111
086272f103 fixed no amount unit display 2025-05-14 06:00:40 +02:00
vabene1111
9a7a05e8a9 some fixes and changes 2025-05-13 16:24:23 +02:00
vabene1111
36352ae6fb data import fixes 2025-05-13 15:51:55 +02:00
vabene1111
9419a823e2 tweaked small layout as well 2025-05-12 21:21:24 +02:00
vabene1111
f32fcd6e11 improved recipe view on large screens 2025-05-12 21:19:22 +02:00
vabene1111
4ded92fcde fixed pluralization and noAmount ingredietns 2025-05-12 20:51:24 +02:00
vabene1111
1206215ea7 fixed AI import 2025-05-12 20:33:06 +02:00
vabene1111
ac033600e9 fixed regex warning 2025-05-12 20:26:12 +02:00
vabene1111
5013d5ec94 tweked help 2025-05-11 11:58:11 +02:00
EifX
3f5db2cb03 fix: removing sudo 2025-05-10 20:42:10 +02:00
EifX
79227b347e fix: Documentation around updating postgres 2025-05-10 20:39:14 +02:00
vabene1111
ffe0c22b3e Merge pull request #3704 from TandoorRecipes/dependabot/pip/django-4.2.21
Bump django from 4.2.20 to 4.2.21
2025-05-09 11:07:02 +02:00
dependabot[bot]
25e5faf135 Bump django from 4.2.20 to 4.2.21
Bumps [django](https://github.com/django/django) from 4.2.20 to 4.2.21.
- [Commits](https://github.com/django/django/compare/4.2.20...4.2.21)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-08 15:44:57 +00:00
tomtjes
e57ab1835c fix bookmarklet 2025-05-05 21:26:56 +02:00
Tom Pansino
a6f8a9ef06 Support reading S3_SECRET_ACCESS_KEY from file 2025-05-03 09:07:14 -07:00
dependabot[bot]
05b51e83a6 Bump pytubefix from 8.12.2 to 8.13.1
Bumps [pytubefix](https://github.com/juanbindez/pytubefix) from 8.12.2 to 8.13.1.
- [Release notes](https://github.com/juanbindez/pytubefix/releases)
- [Commits](https://github.com/juanbindez/pytubefix/compare/v8.12.2...v8.13.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-01 00:42:16 +00:00
Nico G
5625a9ae4f Translated using Weblate (Catalan)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/ca/
2025-04-29 02:39:17 +00:00
vabene1111
ac440aa8b1 testing with imports 2025-04-27 17:59:00 +02:00
vabene1111
0cebc33e27 testing import order 2025-04-27 17:47:26 +02:00
vabene1111
11678431e1 playing with validation 2025-04-26 23:35:12 +02:00
vabene1111
75c03706cb even smaller 2025-04-26 23:24:25 +02:00
vabene1111
7232c9373f make success snackbar less obstrusive 2025-04-26 23:23:50 +02:00
vabene1111
06920807c6 meal plan type name in SLE trunction indicator + improved click area in SLE 2025-04-26 23:12:22 +02:00
vabene1111
ccae32f21c use proper local format for all date pickers 2025-04-26 23:02:29 +02:00
vabene1111
eaad4e21e4 search page saves filters, tweaked reset 2025-04-26 23:00:02 +02:00
vabene1111
6b4b65109d added search page to side nav 2025-04-26 22:46:31 +02:00
vabene1111
441e9ea887 fixed model select create indicator in dark mode 2025-04-26 22:46:21 +02:00
vabene1111
25c369d400 cleanup in frontend localization system 2025-04-26 22:40:53 +02:00
vabene1111
491b5beded fixed using correct file for fallback locale 2025-04-26 22:32:02 +02:00
vabene1111
13c26d199b even more changes 2025-04-26 21:47:49 +02:00
vabene1111
a02722a525 PDF js trial and error 2025-04-26 21:43:47 +02:00
vabene1111
2553bea835 possible pathing fix 2025-04-26 21:39:52 +02:00
vabene1111
302528256c fixed external recipe viewer 2025-04-26 18:53:14 +02:00
vabene1111
ca28a44743 fixed rating half increments 2025-04-26 17:59:58 +02:00
vabene1111
32fd6e3827 fixed number input precision 2025-04-26 17:53:46 +02:00
vabene1111
ec4fa50012 fixed search page 2025-04-26 17:48:59 +02:00
Nico G
8e60a1954b Translated using Weblate (Catalan)
Currently translated at 96.3% (470 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/ca/
2025-04-26 11:58:40 +00:00
vabene1111
885a316955 Merge branch 'feature/vue3' of https://github.com/vabene1111/recipes into feature/vue3 2025-04-25 16:50:05 +02:00
vabene1111
cb1d45b625 small fixes 2025-04-25 16:50:01 +02:00
vabene1111
52d2d75fe9 Merge pull request #3653 from TandoorRecipes/dependabot/npm_and_yarn/vue/http-proxy-middleware-2.0.9
Bump http-proxy-middleware from 2.0.6 to 2.0.9 in /vue
2025-04-25 16:12:56 +02:00
vabene1111
41d4728c89 Merge pull request #3637 from wilmardo/setup-status-root-env
feat: introduce STATIC_ROOT env var
2025-04-25 16:11:26 +02:00
Nico G
edb669ab36 Translated using Weblate (Catalan)
Currently translated at 95.6% (467 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/ca/
2025-04-25 09:58:39 +00:00
Nico G
e9ed28b44d Translated using Weblate (Catalan)
Currently translated at 94.2% (460 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/ca/
2025-04-24 07:58:39 +00:00
Nico G
343373bf4d Translated using Weblate (Catalan)
Currently translated at 93.4% (456 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/ca/
2025-04-22 10:12:51 +00:00
vabene1111
4a9082b70c small tweaks 2025-04-18 13:48:41 +02:00
vabene1111
c1e56920ec prepared test view 2025-04-18 13:31:15 +02:00
vabene1111
fe64da0841 fixed adding recipes with headers to shopping 2025-04-18 13:29:29 +02:00
vabene1111
6bf605f98e show info when AI key is not configured 2025-04-18 13:28:37 +02:00
vabene1111
e18b0ad049 disable ai import if no key is set 2025-04-18 13:23:47 +02:00
vabene1111
d7f37e8293 update dependencies and improved/fixed meal plan date picker 2025-04-18 13:13:13 +02:00
vabene1111
f576aa34e4 fixed use servings when adding recipe to meal plan 2025-04-18 10:58:45 +02:00
dependabot[bot]
698ede9eb6 Bump http-proxy-middleware from 2.0.6 to 2.0.9 in /vue
Bumps [http-proxy-middleware](https://github.com/chimurai/http-proxy-middleware) from 2.0.6 to 2.0.9.
- [Release notes](https://github.com/chimurai/http-proxy-middleware/releases)
- [Changelog](https://github.com/chimurai/http-proxy-middleware/blob/v2.0.9/CHANGELOG.md)
- [Commits](https://github.com/chimurai/http-proxy-middleware/compare/v2.0.6...v2.0.9)

---
updated-dependencies:
- dependency-name: http-proxy-middleware
  dependency-version: 2.0.9
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-16 15:34:33 +00:00
Nico G
3ae73f7cad Translated using Weblate (Catalan)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ca/
2025-04-16 07:58:39 +00:00
Nico G
340d36c628 Translated using Weblate (Catalan)
Currently translated at 88.1% (430 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/ca/
2025-04-16 07:58:39 +00:00
vabene1111
b08c119e57 Update StepEditor.vue 2025-04-11 16:47:34 +02:00
Nico G
703f782be1 Translated using Weblate (Catalan)
Currently translated at 87.3% (498 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ca/
2025-04-11 13:58:39 +00:00
vabene1111
052219e141 added AI text import 2025-04-11 15:49:11 +02:00
vabene1111
604d18d594 fixed youtube importer by setting defaults 2025-04-11 15:12:51 +02:00
vabene1111
f23d4a4188 fixed missing description in recipe viewer 2025-04-11 14:47:22 +02:00
vabene1111
88f2177e9b fixed multi ingerdient parser 2025-04-11 14:47:09 +02:00
vabene1111
675d7a0647 model select show icon only on mobile for create indicator 2025-04-11 14:12:37 +02:00
vabene1111
781d8845be fixed more tab index problems and number select precision 2025-04-11 14:11:38 +02:00
vabene1111
c2fdf4812c Merge pull request #3645 from mikhail5555/feature/improved-multi-select-for-steps-edit
add small chip indicating if you are selecting existing item or creaing a new one
2025-04-11 14:05:25 +02:00
Mikhail Epifanov
ae1532e509 also add template for the clear button to disable tabindex 2025-04-11 08:48:59 +02:00
Mikhail Epifanov
121d2471a7 only show the new/existing template when creating is actually allowed 2025-04-11 08:21:36 +02:00
Mikhail Epifanov
278342f3f0 add small chip indicating if you are selecting existing item or creating a new one 2025-04-10 22:38:24 +02:00
vabene1111
608526b348 small fixes 2025-04-10 18:04:13 +02:00
wilmarguida
a0ba1ecfae feat: introduce STATIC_ROOT env var
Signed-off-by: wilmarguida <w.denouden@guida.nl>
2025-04-08 18:23:12 +02:00
Nico G
2ef4514987 Translated using Weblate (Catalan)
Currently translated at 84.5% (482 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ca/
2025-04-08 08:58:38 +00:00
vabene1111
67f63730a3 changed build for alpha release 2025-04-06 18:12:43 +02:00
vabene1111
eeb3b2e5d5 docs for AI feature 2025-04-06 17:42:17 +02:00
vabene1111
7314572fc0 various fixes and improvements 2025-04-04 22:00:10 +02:00
vabene1111
934d78c50e first draft of help system 2025-04-02 20:37:01 +02:00
vabene1111
431eb7baf7 visiual AI import improvements 2025-04-02 19:18:01 +02:00
vabene1111
e0c8895733 AI import improvements 2025-04-02 18:40:29 +02:00
vabene1111
b18a1d0110 tweaks and changes 2025-04-02 09:01:52 +02:00
Nico G
a89411aeec Translated using Weblate (Catalan)
Currently translated at 85.4% (417 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/ca/
2025-04-01 12:58:40 +00:00
vabene1111
838ce6615b translations 2025-04-01 11:42:33 +02:00
vabene1111
e0cc42653d before custom filter transform function 2025-03-31 20:33:08 +02:00
vabene1111
74b940d4eb save and load of custom filter WIP 2025-03-31 20:24:32 +02:00
vabene1111
c03e82f094 various improvements 2025-03-31 16:06:20 +02:00
vabene1111
235c5d6b4a fixed tests, cleanup, frontend fix 2025-03-31 09:45:50 +02:00
vabene1111
42e6e0bc50 concept for custom filter conversion, continue later 2025-03-31 09:20:13 +02:00
vabene1111
f7eabfe458 implemented all filters in frontend 2025-03-31 08:58:32 +02:00
vabene1111
988dcd1522 build proper date transformer for route query binding 2025-03-31 08:48:27 +02:00
vabene1111
22aa0d2cb7 WIP search date based filters 2025-03-30 14:00:29 +02:00
vabene1111
dd1975817e WIP search page 2025-03-30 00:08:25 +01:00
vabene1111
77195718d8 working filter for food/keyword/book 2025-03-29 13:38:53 +01:00
vabene1111
ebd354bc8d search prototype with keyword filters 2025-03-29 12:09:19 +01:00
vabene1111
aa1fa3a40e testing useRouteQuery for SearchPage 2025-03-29 09:09:07 +01:00
vabene1111
2add3b70a4 updated dependencies + added vueUse Router plugin 2025-03-29 09:08:49 +01:00
vabene1111
d38a4a2e7e update search when query param updates 2025-03-29 08:51:54 +01:00
vabene1111
8827e6f453 fixed shopping undo hanging until auto refresh 2025-03-27 18:35:18 +01:00
vabene1111
742297c1fc fixed unsaved change warning after confirming editor close 2025-03-27 17:39:35 +01:00
vabene1111
7ae66a14be Merge branch 'develop' into feature/vue3 2025-03-27 17:17:54 +01:00
vabene1111
0cf89ca33c Merge pull request #3614 from stritti/feature/mobile-apps-update
docs: mobile apps updated
2025-03-27 17:14:03 +01:00
Stephan Strittmatter
68ceada28b chore: mobile apps updated 2025-03-25 11:16:18 +00:00
Vlad
192ca44d89 Translated using Weblate (Ukrainian)
Currently translated at 44.7% (255 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/uk/
2025-03-23 15:07:19 +00:00
vabene1111
421dab2405 Merge branch 'develop' into feature/vue3 2025-03-22 11:15:18 +01:00
vabene1111
3204aaf161 Merge pull request #3607 from TandoorRecipes/dependabot/pip/gunicorn-23.0.0
Bump gunicorn from 22.0.0 to 23.0.0
2025-03-22 09:33:08 +01:00
dependabot[bot]
6cf6791fe6 Bump gunicorn from 22.0.0 to 23.0.0
Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 22.0.0 to 23.0.0.
- [Release notes](https://github.com/benoitc/gunicorn/releases)
- [Commits](https://github.com/benoitc/gunicorn/compare/22.0.0...23.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-22 03:20:08 +00:00
vabene1111
0ff16f280e better number inputs 2025-03-21 22:30:26 +01:00
vabene1111
a297e4731c switched to ingredients in property editor 2025-03-21 22:03:13 +01:00
vabene1111
de5ac9181f property view unit conversion/edit 2025-03-21 21:22:32 +01:00
vabene1111
fbab90e954 basic property viewer 2025-03-21 20:28:26 +01:00
vabene1111
05472b5a29 link to recipe in property editor 2025-03-21 19:08:17 +01:00
vabene1111
d6839c5dfa fdc search in property editor 2025-03-21 19:05:06 +01:00
vabene1111
dea4fa000e playing with FDC search integration 2025-03-20 22:09:44 +01:00
vabene1111
c36eaf934f enable food property deletion 2025-03-20 21:33:51 +01:00
vabene1111
4a13cc63ae add calculator to property editore 2025-03-20 21:27:45 +01:00
vabene1111
96e0be0a78 property editor 2025-03-20 21:18:50 +01:00
vabene1111
5f190bdc6c import improvements 2025-03-20 18:26:28 +01:00
vabene1111
73c376427c some fixes 2025-03-20 16:16:09 +01:00
vabene1111
d34f39a9e0 very basic app import working 2025-03-19 19:42:05 +01:00
vabene1111
8ae9de580d improve import stepper 2025-03-19 18:06:51 +01:00
vabene1111
a144f347f8 downgraded dependency for real 2025-03-17 17:28:21 +01:00
vabene1111
f43788d676 update lock 2025-03-17 08:41:53 +01:00
vabene1111
cac00423a2 downgrade again 2025-03-17 07:47:30 +01:00
vabene1111
32429af5e9 testing static import of mealplanpage 2025-03-17 07:43:04 +01:00
vabene1111
792c3a07e3 default view mode grid 2025-03-16 19:50:21 +01:00
vabene1111
2879fa466e search page improvements 2025-03-16 19:39:18 +01:00
vabene1111
9eed6693b4 book recipe open action 2025-03-16 16:37:26 +01:00
vabene1111
c4c6eb3ca6 route lazy loading + route naming improvements 2025-03-16 16:25:55 +01:00
vabene1111
e29f318453 dont run autosync when not on page 2025-03-16 16:11:08 +01:00
vabene1111
8eb2ba9512 applied custom openapi generator fix for omit generation 2025-03-16 15:38:37 +01:00
vabene1111
e9f87bb475 fixed share link generation 2025-03-16 15:22:10 +01:00
vabene1111
8b4e6ac5ae show metadata on recipe view 2025-03-16 15:07:06 +01:00
vabene1111
ee0f652981 shopping / meal plan improvements 2025-03-16 13:36:42 +01:00
vabene1111
7f06f888df ci dependencies 2025-03-16 13:14:41 +01:00
vabene1111
54f43c7938 Merge branch 'develop' into feature/vue3
# Conflicts:
#	.github/workflows/ci.yml
2025-03-16 13:14:15 +01:00
vabene1111
6ebb18a932 more ci dependency tests 2025-03-16 13:11:28 +01:00
vabene1111
7bde1bf44f split migrations, CI denendencies 2025-03-16 13:08:06 +01:00
vabene1111
e00c6459ab ci dependencies 2025-03-16 12:57:15 +01:00
vabene1111
3075ec066f Merge pull request #3595 from TandoorRecipes/dependabot/npm_and_yarn/vue/babel/runtime-7.26.10
Bump @babel/runtime from 7.22.15 to 7.26.10 in /vue
2025-03-16 12:53:55 +01:00
vabene1111
3ddc3c3768 Merge pull request #3594 from TandoorRecipes/dependabot/npm_and_yarn/vue/babel/helpers-7.26.10
Bump @babel/helpers from 7.22.15 to 7.26.10 in /vue
2025-03-16 12:53:46 +01:00
vabene1111
4d8d4af42a added CI dependencies 2025-03-14 14:23:57 +01:00
vabene1111
1fd0028351 shopping list fixes 2025-03-14 14:07:33 +01:00
vabene1111
f59c5ae16e Merge branch 'develop' into feature/vue3
# Conflicts:
#	cookbook/serializer.py
2025-03-14 13:53:47 +01:00
vabene1111
7b7b726ec5 migration to store space and created_by on ShoppingListRecipe
ATTENTION: This deletes all old shopping list recipes that do not have entries associated with it. This should not matter but just for the record
2025-03-14 13:51:49 +01:00
vabene1111
9c1d161785 wip 2025-03-14 11:39:31 +01:00
vabene1111
5f542e9ce6 Merge branch 'develop' into feature/vue3
# Conflicts:
#	Dockerfile
2025-03-14 11:21:30 +01:00
vabene1111
5484506bc3 build requirements 2025-03-14 10:41:03 +01:00
vabene1111
2e71bc4505 Merge branch 'develop' into feature/vue3
# Conflicts:
#	requirements.txt
2025-03-14 10:32:22 +01:00
vabene1111
136f05b886 requirments for django allauth 2025-03-14 10:31:42 +01:00
dependabot[bot]
83cf03a10b Bump @babel/runtime from 7.22.15 to 7.26.10 in /vue
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.22.15 to 7.26.10.
- [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.26.10/packages/babel-runtime)

---
updated-dependencies:
- dependency-name: "@babel/runtime"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-14 09:17:29 +00:00
dependabot[bot]
7b56719716 Bump @babel/helpers from 7.22.15 to 7.26.10 in /vue
Bumps [@babel/helpers](https://github.com/babel/babel/tree/HEAD/packages/babel-helpers) from 7.22.15 to 7.26.10.
- [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.26.10/packages/babel-helpers)

---
updated-dependencies:
- dependency-name: "@babel/helpers"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-14 09:17:26 +00:00
vabene1111
348296763d Merge branch 'develop' 2025-03-14 10:15:46 +01:00
vabene1111
5c7a57ac32 added missing dependency 2025-03-14 10:15:40 +01:00
Jader Moraes
0c0b8ea455 Translated using Weblate (Portuguese (Brazil))
Currently translated at 66.5% (325 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/pt_BR/
2025-03-13 22:58:38 +00:00
Jader Moraes
2f20f43efe Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/pt_BR/
2025-03-13 22:58:38 +00:00
vabene1111
cf6435503c show user files and sub recipes 2025-03-12 20:49:04 +01:00
vabene1111
752e98275d improve search/start page 2025-03-12 20:12:02 +01:00
vabene1111
40ee21a613 Merge branch 'develop' into feature/vue3 2025-03-12 17:54:13 +01:00
Nico G
1662b793a5 Translated using Weblate (Catalan)
Currently translated at 84.8% (414 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/ca/
2025-03-12 09:58:39 +00:00
vabene1111
2e4efe2500 Merge branch 'develop' 2025-03-11 17:42:32 +01:00
vabene1111
3d01faed5f updated recipe scrapers 2025-03-11 17:21:47 +01:00
vabene1111
9bc3443a3c Merge pull request #3565 from TandoorRecipes/dependabot/pip/bleach-6.2.0
Bump bleach from 6.0.0 to 6.2.0
2025-03-11 17:18:36 +01:00
vabene1111
87dc32210e Merge pull request #3566 from TandoorRecipes/dependabot/pip/django-treebeard-4.7.1
Bump django-treebeard from 4.7 to 4.7.1
2025-03-11 17:18:07 +01:00
vabene1111
671216488e Merge pull request #3562 from TandoorRecipes/dependabot/pip/lxml-5.3.1
Bump lxml from 5.3.0 to 5.3.1
2025-03-11 17:17:50 +01:00
vabene1111
f596fc33a1 Merge pull request #3564 from TandoorRecipes/dependabot/pip/pytest-django-4.10.0
Bump pytest-django from 4.9.0 to 4.10.0
2025-03-11 17:17:43 +01:00
vabene1111
82756923ad Merge pull request #3563 from TandoorRecipes/dependabot/pip/pytubefix-8.12.2
Bump pytubefix from 8.12.0 to 8.12.2
2025-03-11 17:17:27 +01:00
vabene1111
14042563bf Merge pull request #3576 from racehd/develop
Revise Synology Guide
2025-03-11 17:16:07 +01:00
vabene1111
06e12396e8 Merge pull request #3574 from JiDW/develop
Add webp file as allowed file type
2025-03-11 17:14:18 +01:00
vabene1111
b698eee3a1 Merge pull request #3590 from TandoorRecipes/dependabot/pip/django-4.2.20
Bump django from 4.2.18 to 4.2.20
2025-03-11 17:13:51 +01:00
vabene1111
9d15634dc8 Merge pull request #3589 from TandoorRecipes/dependabot/pip/jinja2-3.1.6
Bump jinja2 from 3.1.5 to 3.1.6
2025-03-11 17:13:40 +01:00
dependabot[bot]
5f6c298d04 Bump django from 4.2.18 to 4.2.20
Bumps [django](https://github.com/django/django) from 4.2.18 to 4.2.20.
- [Commits](https://github.com/django/django/compare/4.2.18...4.2.20)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-11 16:13:19 +00:00
dependabot[bot]
f20a2ca781 Bump jinja2 from 3.1.5 to 3.1.6
Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.5 to 3.1.6.
- [Release notes](https://github.com/pallets/jinja/releases)
- [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/jinja/compare/3.1.5...3.1.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-11 16:13:12 +00:00
vabene1111
6dcfbc24a9 Merge pull request #3588 from TandoorRecipes/dependabot/npm_and_yarn/vue/prismjs-1.30.0
Bump prismjs from 1.29.0 to 1.30.0 in /vue
2025-03-11 17:12:18 +01:00
vabene1111
ea9404301b Merge pull request #3580 from TandoorRecipes/dependabot/npm_and_yarn/vue/axios-1.8.2
Bump axios from 1.6.7 to 1.8.2 in /vue
2025-03-11 17:12:12 +01:00
dependabot[bot]
da268b4429 Bump prismjs from 1.29.0 to 1.30.0 in /vue
Bumps [prismjs](https://github.com/PrismJS/prism) from 1.29.0 to 1.30.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.29.0...v1.30.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-10 22:29:43 +00:00
Nico G
2775960cf7 Translated using Weblate (Catalan)
Currently translated at 77.8% (444 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ca/
2025-03-10 12:39:16 +00:00
dependabot[bot]
bff6b2ffb0 Bump axios from 1.6.7 to 1.8.2 in /vue
Bumps [axios](https://github.com/axios/axios) from 1.6.7 to 1.8.2.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.6.7...v1.8.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-07 20:47:21 +00:00
yonatan ben-menachem
193600564e Translated using Weblate (Hebrew)
Currently translated at 18.4% (90 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/he/
2025-03-07 15:08:51 +00:00
Nico G
2abd683759 Translated using Weblate (Catalan)
Currently translated at 72.4% (413 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ca/
2025-03-06 03:42:27 +00:00
Toni Miquel
0163800a05 Translated using Weblate (Spanish)
Currently translated at 99.2% (566 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/es/
2025-03-04 17:58:38 +00:00
racehd
958ccd7f7d Revise Synology Guide
- Rewrote/revised most of the guide to bring it to current
- Previous guide was last updated several years ago and was largely depreciated. I moved the prior guide references to the end for historical purposes
- Added a depreciated warning under the Firewall section. I have been using the project for a week so far without a firewall rule set-up and have not had any issues.
2025-03-03 22:50:07 +00:00
Mathias Latournerie
a0eb1df4fa Add webp file as allowed file type 2025-03-03 01:30:36 +01:00
fabio souza jr
3f1c6d1dd0 Translated using Weblate (Portuguese (Brazil))
Currently translated at 66.1% (323 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/pt_BR/
2025-03-02 16:58:38 +00:00
vabene1111
49d1946f29 shopping input test 2025-03-02 08:32:58 +01:00
vabene1111
7c448a5362 fixed tabs hiding on mobile in editors 2025-03-02 07:48:04 +01:00
vabene1111
06c40b6c80 fixed SLI grouping entries with different delay/check state 2025-03-02 07:41:58 +01:00
vabene1111
63f24e75b3 added created_by scroller to start page 2025-03-02 07:12:24 +01:00
vabene1111
87f4068736 fixed home redirect and added another random horizontal scroler 2025-03-02 06:58:48 +01:00
Nico G
87a80e0caa Translated using Weblate (Catalan)
Currently translated at 69.8% (398 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ca/
2025-03-01 07:58:38 +00:00
dependabot[bot]
debdd03a7a Bump django-treebeard from 4.7 to 4.7.1
Bumps [django-treebeard](https://github.com/django-treebeard/django-treebeard) from 4.7 to 4.7.1.
- [Changelog](https://github.com/django-treebeard/django-treebeard/blob/master/CHANGES.md)
- [Commits](https://github.com/django-treebeard/django-treebeard/compare/4.7...4.7.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-01 00:11:59 +00:00
dependabot[bot]
c58697aecd Bump bleach from 6.0.0 to 6.2.0
Bumps [bleach](https://github.com/mozilla/bleach) from 6.0.0 to 6.2.0.
- [Changelog](https://github.com/mozilla/bleach/blob/main/CHANGES)
- [Commits](https://github.com/mozilla/bleach/compare/v6.0.0...v6.2.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-01 00:11:56 +00:00
dependabot[bot]
3b3ad37d64 Bump pytest-django from 4.9.0 to 4.10.0
Bumps [pytest-django](https://github.com/pytest-dev/pytest-django) from 4.9.0 to 4.10.0.
- [Release notes](https://github.com/pytest-dev/pytest-django/releases)
- [Changelog](https://github.com/pytest-dev/pytest-django/blob/main/docs/changelog.rst)
- [Commits](https://github.com/pytest-dev/pytest-django/compare/v4.9.0...v4.10.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-01 00:11:54 +00:00
dependabot[bot]
d392b06e98 Bump pytubefix from 8.12.0 to 8.12.2
Bumps [pytubefix](https://github.com/juanbindez/pytubefix) from 8.12.0 to 8.12.2.
- [Release notes](https://github.com/juanbindez/pytubefix/releases)
- [Commits](https://github.com/juanbindez/pytubefix/compare/v8.12.0...v8.12.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-01 00:11:52 +00:00
dependabot[bot]
99a9f594e2 Bump lxml from 5.3.0 to 5.3.1
Bumps [lxml](https://github.com/lxml/lxml) from 5.3.0 to 5.3.1.
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-5.3.0...lxml-5.3.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-01 00:11:48 +00:00
Nico G
549a5b764d Translated using Weblate (Catalan)
Currently translated at 63.8% (364 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ca/
2025-02-27 10:58:38 +00:00
Nico G
26592c31a9 Translated using Weblate (Catalan)
Currently translated at 82.5% (403 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/ca/
2025-02-27 10:58:38 +00:00
Nico G
378eb924e9 Translated using Weblate (Catalan)
Currently translated at 58.5% (334 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ca/
2025-02-26 08:58:38 +00:00
Andre Bovendorp
f8f4a87a99 Translated using Weblate (Portuguese (Brazil))
Currently translated at 65.7% (321 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/pt_BR/
2025-02-26 08:58:38 +00:00
Nico G
55289e6837 Translated using Weblate (Catalan)
Currently translated at 52.6% (300 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ca/
2025-02-21 10:58:38 +00:00
Filipe Neves
60efbd0389 Translated using Weblate (Portuguese)
Currently translated at 32.9% (161 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/pt/
2025-02-21 10:58:38 +00:00
Nico G
f3903c1aa5 Translated using Weblate (Catalan)
Currently translated at 47.5% (271 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ca/
2025-02-20 08:58:38 +00:00
Nico G
b01e62007f Translated using Weblate (Catalan)
Currently translated at 78.2% (382 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/ca/
2025-02-20 08:58:38 +00:00
vabene1111
d23139cd8a playing around 2025-02-17 21:18:56 +01:00
vabene1111
f59a450448 playing with custom filter 2025-02-17 21:12:43 +01:00
vabene1111
e14bb78ed1 WIP custom filter usage 2025-02-17 20:48:04 +01:00
Cots Partier
7730890525 Translated using Weblate (Romanian)
Currently translated at 89.9% (439 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/ro/
2025-02-16 14:58:38 +00:00
Cots Partier
29977609aa Translated using Weblate (Dutch)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/nl/
2025-02-16 14:58:38 +00:00
Elvis Gosselin
88c3a7d0bf Translated using Weblate (French)
Currently translated at 89.3% (436 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/fr/
2025-02-16 14:58:38 +00:00
vabene1111
2c89add187 query params advanced search 2025-02-15 12:50:54 +01:00
vabene1111
0461c57cf3 usable books page 2025-02-15 09:50:40 +01:00
Juha Antikainen
ba0335bb28 Translated using Weblate (Finnish)
Currently translated at 90.5% (516 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fi/
2025-02-14 23:58:39 +00:00
Juha Antikainen
51e01ee40c Translated using Weblate (Finnish)
Currently translated at 37.0% (181 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/fi/
2025-02-14 23:58:39 +00:00
vabene1111
09a76a2057 books page 2025-02-14 16:43:18 +01:00
vabene1111
741220aefe model editors default prop 2025-02-14 16:43:12 +01:00
vabene1111
2917d6ffcf remove imghdr import 2025-02-12 17:29:48 +01:00
vabene1111
6c73ca5b45 fixed architecture check 2025-02-12 10:46:02 +01:00
vabene1111
79658e2f7c print arch 2025-02-12 10:41:20 +01:00
vabene1111
f335c3f755 add correct command 2025-02-12 09:57:54 +01:00
vabene1111
86fe129eba packages 2025-02-12 09:47:11 +01:00
vabene1111
081104e655 missing && 2025-02-12 09:43:42 +01:00
vabene1111
96d997a817 install rust for arm runs 2025-02-12 09:17:57 +01:00
vabene1111
b55ceda978 Merge pull request #3549 from TandoorRecipes/dependabot/pip/cryptography-44.0.1
Bump cryptography from 44.0.0 to 44.0.1
2025-02-12 09:15:10 +01:00
dependabot[bot]
37b4f5c896 Bump cryptography from 44.0.0 to 44.0.1
Bumps [cryptography](https://github.com/pyca/cryptography) from 44.0.0 to 44.0.1.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/44.0.0...44.0.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-11 19:36:25 +00:00
vabene1111
b0821a9c6b trying with build-base 2025-02-11 14:52:18 +01:00
vabene1111
f178790709 only binary 2025-02-11 14:33:18 +01:00
vabene1111
425b71984a updated psycopg2 2025-02-11 14:09:06 +01:00
vabene1111
3cb2cf5333 changed docker python version and print pip debug 2025-02-11 13:04:44 +01:00
vabene1111
9c0dc64a47 baisc implementation of books WIP 2025-02-10 17:35:14 +01:00
vabene1111
4a9bd3626e switched to litellm 2025-02-10 17:25:55 +01:00
vabene1111
23a561e8cd added simple comment view 2025-02-09 15:25:52 +01:00
vabene1111
2a2f1033d0 try installing grpcio via package 2025-02-09 12:30:26 +01:00
vabene1111
4234c5b35f allow opening shared recipes and redirect old urls 2025-02-09 12:18:06 +01:00
vabene1111
1b09234e91 fixed import page share intent 2025-02-09 09:32:16 +01:00
vabene1111
9b5878faae antoher grpcio test 2025-02-09 09:24:36 +01:00
vabene1111
e27f4c5768 added build base for grcpio build 2025-02-07 15:22:48 +01:00
Mattias G
a78b42d9ab Translated using Weblate (Swedish)
Currently translated at 65.3% (319 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/sv/
2025-02-07 08:58:37 +00:00
vabene1111
a1f1bc19e5 updated alpine and added linux-headers 2025-02-06 20:26:59 +01:00
vabene1111
f6983993d5 fixed model select slots taking up space 2025-02-06 18:11:47 +01:00
vabene1111
a868860b7d lots of shopping list improvements 2025-02-06 17:51:42 +01:00
Domagoj Levanić
d1b6a4eb43 Translated using Weblate (Croatian)
Currently translated at 54.5% (266 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/hr/
2025-02-03 16:58:38 +00:00
Juha Antikainen
61bfaf012b Translated using Weblate (Finnish)
Currently translated at 87.0% (496 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fi/
2025-02-03 16:58:38 +00:00
Juha Antikainen
92adc9b610 Translated using Weblate (Finnish)
Currently translated at 36.8% (180 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/fi/
2025-02-03 16:58:37 +00:00
Juha Antikainen
feb4a63bb0 Translated using Weblate (Finnish)
Currently translated at 81.7% (466 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fi/
2025-02-02 09:58:38 +00:00
Juha Antikainen
30f8318531 Translated using Weblate (Finnish)
Currently translated at 35.2% (172 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/fi/
2025-02-02 09:58:37 +00:00
vabene1111
75eff42329 downgrade grpcio 2025-02-01 14:33:20 +01:00
Domagoj Levanić
5b040900a7 Translated using Weblate (Croatian)
Currently translated at 33.1% (162 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/hr/
2025-02-01 08:58:39 +00:00
Juha Antikainen
717666fc14 Translated using Weblate (Finnish)
Currently translated at 72.1% (411 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fi/
2025-02-01 08:58:39 +00:00
Juha Antikainen
a012a6f0d5 Translated using Weblate (Finnish)
Currently translated at 28.6% (140 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/fi/
2025-02-01 08:58:39 +00:00
vabene1111
d0703f9639 support fraction display 2025-02-01 08:51:13 +01:00
vabene1111
7b2ade5fcd update wheel and setup tools 2025-02-01 08:51:04 +01:00
vabene1111
28c839a59d potentially fixed ingredient render component 2025-02-01 08:38:35 +01:00
vabene1111
1ead724af6 Merge branch 'develop' into feature/vue3
# Conflicts:
#	recipes/settings.py
#	requirements.txt
2025-02-01 08:17:14 +01:00
vabene1111
3341c6db19 Merge pull request #3523 from Honza-m/default-debug-variables
Disable DEBUG and DEBUG_TOOLBAR by default
2025-02-01 08:12:50 +01:00
vabene1111
206d13594a Merge pull request #3530 from TandoorRecipes/dependabot/pip/pillow-11.1.0
Bump pillow from 10.4.0 to 11.1.0
2025-02-01 08:11:59 +01:00
vabene1111
37af406831 Merge pull request #3531 from TandoorRecipes/dependabot/pip/drf-writable-nested-0.7.1
Bump drf-writable-nested from 0.7.0 to 0.7.1
2025-02-01 08:11:51 +01:00
vabene1111
88f18a1b24 Merge pull request #3532 from TandoorRecipes/dependabot/pip/django-allauth-65.3.1
Bump django-allauth from 0.61.1 to 65.3.1
2025-02-01 08:11:43 +01:00
vabene1111
8bf410dbca Merge pull request #3533 from TandoorRecipes/dependabot/pip/django-prometheus-2.3.1
Bump django-prometheus from 2.2.0 to 2.3.1
2025-02-01 08:11:35 +01:00
vabene1111
c98411ca0e Merge pull request #3534 from TandoorRecipes/dependabot/pip/autopep8-2.3.2
Bump autopep8 from 2.0.4 to 2.3.2
2025-02-01 08:11:25 +01:00
vabene1111
fcfb404edf Merge pull request #3535 from TandoorRecipes/dependabot/github_actions/awalsh128/cache-apt-pkgs-action-1.4.3
Bump awalsh128/cache-apt-pkgs-action from 1.4.2 to 1.4.3
2025-02-01 08:10:40 +01:00
vabene1111
a0c8b39f0c Merge branch 'develop' 2025-02-01 08:08:55 +01:00
dependabot[bot]
3a1f2540b1 Bump awalsh128/cache-apt-pkgs-action from 1.4.2 to 1.4.3
Bumps [awalsh128/cache-apt-pkgs-action](https://github.com/awalsh128/cache-apt-pkgs-action) from 1.4.2 to 1.4.3.
- [Release notes](https://github.com/awalsh128/cache-apt-pkgs-action/releases)
- [Commits](https://github.com/awalsh128/cache-apt-pkgs-action/compare/v1.4.2...v1.4.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-01 00:48:21 +00:00
dependabot[bot]
9c680bc59c Bump autopep8 from 2.0.4 to 2.3.2
Bumps [autopep8](https://github.com/hhatto/autopep8) from 2.0.4 to 2.3.2.
- [Release notes](https://github.com/hhatto/autopep8/releases)
- [Commits](https://github.com/hhatto/autopep8/compare/v2.0.4...v2.3.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-01 00:30:40 +00:00
dependabot[bot]
fde95a6a8e Bump django-prometheus from 2.2.0 to 2.3.1
Bumps [django-prometheus](https://github.com/korfuri/django-prometheus) from 2.2.0 to 2.3.1.
- [Release notes](https://github.com/korfuri/django-prometheus/releases)
- [Changelog](https://github.com/korfuri/django-prometheus/blob/master/CHANGELOG.md)
- [Commits](https://github.com/korfuri/django-prometheus/compare/v2.2.0...v2.3.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-01 00:30:37 +00:00
dependabot[bot]
150a0332f6 Bump django-allauth from 0.61.1 to 65.3.1
Bumps [django-allauth](https://github.com/sponsors/pennersr) from 0.61.1 to 65.3.1.
- [Commits](https://github.com/sponsors/pennersr/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-01 00:30:34 +00:00
dependabot[bot]
618c32bdb8 Bump drf-writable-nested from 0.7.0 to 0.7.1
Bumps [drf-writable-nested](https://github.com/beda-software/drf-writable-nested) from 0.7.0 to 0.7.1.
- [Release notes](https://github.com/beda-software/drf-writable-nested/releases)
- [Changelog](https://github.com/beda-software/drf-writable-nested/blob/master/CHANGELOG.md)
- [Commits](https://github.com/beda-software/drf-writable-nested/compare/v0.7.0...v0.7.1)

---
updated-dependencies:
- dependency-name: drf-writable-nested
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-01 00:30:30 +00:00
dependabot[bot]
ea35850b71 Bump pillow from 10.4.0 to 11.1.0
Bumps [pillow](https://github.com/python-pillow/Pillow) from 10.4.0 to 11.1.0.
- [Release notes](https://github.com/python-pillow/Pillow/releases)
- [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst)
- [Commits](https://github.com/python-pillow/Pillow/compare/10.4.0...11.1.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-01 00:30:28 +00:00
Neuri Jr
87561943f9 Translated using Weblate (Portuguese)
Currently translated at 53.8% (307 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/pt/
2025-01-31 01:58:38 +00:00
Jan Morawiec
5fd8d4e847 Disable DEBUG and DEBUG_TOOLBAR by default 2025-01-30 23:13:54 +00:00
vabene1111
3880f205b6 various fixes 2025-01-30 10:29:21 +01:00
vabene1111
fcbc4cb792 screen wake lock 2025-01-29 20:28:40 +01:00
vabene1111
f5837fdbd2 Merge branch 'develop' into feature/vue3 2025-01-29 20:22:04 +01:00
Vinicius José Fritzen
eb6d0d7922 Translated using Weblate (Portuguese (Brazil))
Currently translated at 57.5% (281 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/pt_BR/
2025-01-29 13:44:16 +00:00
Ángel
d3dd9099f6 Translated using Weblate (Spanish)
Currently translated at 52.8% (258 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/es/
2025-01-29 13:44:16 +00:00
Vinicius José Fritzen
a112b23d07 Translated using Weblate (Portuguese (Brazil))
Currently translated at 48.3% (236 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/pt_BR/
2025-01-28 23:17:34 +00:00
Vinicius José Fritzen
4c591f3827 Translated using Weblate (Spanish)
Currently translated at 52.6% (257 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/es/
2025-01-28 23:17:34 +00:00
Ángel
62a28f57f6 Translated using Weblate (Spanish)
Currently translated at 52.6% (257 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/es/
2025-01-28 23:17:34 +00:00
Vinicius José Fritzen
ef689b0857 Translated using Weblate (Portuguese (Brazil))
Currently translated at 99.2% (566 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/pt_BR/
2025-01-28 19:08:20 +00:00
vabene1111
aa903da042 fixed file type check case sensitivity 2025-01-28 07:37:37 +01:00
Anders
9587d8832d Translated using Weblate (Norwegian Bokmål)
Currently translated at 70.5% (402 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nb_NO/
2025-01-28 02:08:22 +00:00
Ole Martin Ruud
f125be1347 Translated using Weblate (Norwegian Bokmål)
Currently translated at 65.9% (376 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nb_NO/
2025-01-26 05:58:39 +00:00
Dominik Ruczajewski
269301852a Translated using Weblate (Polish)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/pl/
2025-01-26 05:58:39 +00:00
Ole Martin Ruud
8e5dcd57ce Translated using Weblate (Norwegian Bokmål)
Currently translated at 31.3% (153 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/nb_NO/
2025-01-26 05:58:39 +00:00
Dominik Ruczajewski
920273197d Translated using Weblate (Polish)
Currently translated at 56.9% (278 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/pl/
2025-01-26 05:58:39 +00:00
vabene1111
1be2e9fbb2 Merge branch 'develop' 2025-01-21 16:34:26 +01:00
vabene1111
7c93eededf fixed RecipeImageSerializer 2025-01-20 09:43:43 +01:00
vabene1111
e0b414d8e9 playing with AI import 2025-01-20 09:40:22 +01:00
Yigit
1b17031523 Translated using Weblate (Turkish)
Currently translated at 100.0% (570 of 570 strings)

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

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/tr/
2025-01-20 05:20:47 +00:00
vabene1111
a56c7c29a6 disable quickimport if no data is present 2025-01-19 19:35:54 +01:00
vabene1111
54f2e26f93 quick import 2025-01-19 19:32:30 +01:00
vabene1111
842f5bed81 improved import page actions 2025-01-19 19:28:26 +01:00
vabene1111
1e5c656e51 fixed RecipeImageSerializer 2025-01-19 19:28:19 +01:00
vabene1111
539e01f97d improved shopping line item dialog 2025-01-19 19:16:31 +01:00
vabene1111
503a4881fe Merge branch 'develop' into feature/vue3 2025-01-19 18:44:14 +01:00
vabene1111
03dd4370b9 update nextcloud import docs 2025-01-19 18:44:09 +01:00
vabene1111
04181fdda7 update nextcloud import docs 2025-01-19 18:44:01 +01:00
vabene1111
316fd65ab8 fixed another test 2025-01-19 18:43:52 +01:00
vabene1111
e8cbd91baf delete obsolete tests + fixes 2025-01-19 18:35:23 +01:00
smilerz
157af15a2a added (',', ';', ':') to notes tokenization in ingredient_parser.py 2025-01-18 09:29:09 -06:00
vabene1111
cba80aeac9 fixed serializer and step editor 2025-01-18 14:46:19 +01:00
vabene1111
efa9e8aa3b ingredient step sorting dialog and headline option on desktop 2025-01-18 14:32:20 +01:00
vabene1111
d294341926 fixed list groups 2025-01-18 13:28:14 +01:00
vabene1111
b930ecdcd0 Merge branch 'develop' 2025-01-18 12:49:49 +01:00
vabene1111
35dce661bf Merge branch 'develop' into feature/vue3
# Conflicts:
#	requirements.txt
2025-01-18 12:49:25 +01:00
vabene1111
100242f0a6 Merge pull request #3498 from TandoorRecipes/dependabot/pip/pytubefix-8.12.0
Bump pytubefix from 8.9.0 to 8.12.0
2025-01-18 12:48:23 +01:00
vabene1111
d695f71d36 Merge pull request #3497 from mitcdh/develop
Prevent paprika.py from importing empty image_url content
2025-01-18 12:47:53 +01:00
dependabot[bot]
5d60b7a67c Bump pytubefix from 8.9.0 to 8.12.0
Bumps [pytubefix](https://github.com/juanbindez/pytubefix) from 8.9.0 to 8.12.0.
- [Release notes](https://github.com/juanbindez/pytubefix/releases)
- [Commits](https://github.com/juanbindez/pytubefix/compare/v8.9.0...v8.12.0)

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

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

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

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

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

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/uk/
2025-01-16 18:58:38 +00:00
vabene1111
749f2bff02 fixed path reload matching 2025-01-16 07:39:46 +01:00
vabene1111
cd8f8bb90c fixed manifest and added v3 redirect 2025-01-14 19:17:52 +01:00
vabene1111
3a031bbbaf shortcut icons 2025-01-14 19:03:20 +01:00
vabene1111
f4b1acb757 changed paths to have vue3 as standard 2025-01-14 18:18:13 +01:00
vabene1111
3e55e04fbd tweak limit warnings 2025-01-13 17:56:56 +01:00
vabene1111
1822a62e14 allow ingredient delete during import 2025-01-13 17:24:07 +01:00
vabene1111
2f991b5557 small fixes 2025-01-13 17:15:16 +01:00
vabene1111
827efbd783 improter improvements + nav 2025-01-05 20:28:12 +01:00
vabene1111
9573a68bfe Merge branch 'develop' into feature/vue3 2025-01-05 16:06:55 +01:00
vabene1111
738aa12243 Merge branch 'develop' 2025-01-05 11:38:52 +01:00
vabene1111
f25de4b4ce remove healthcheck 2025-01-05 11:38:35 +01:00
vabene1111
c75d265686 many editor improvements (and more) 2025-01-04 17:59:56 +01:00
vabene1111
c691d6028b removed debug logs 2025-01-04 16:09:37 +01:00
vabene1111
c073512b17 model list page table fixes 2025-01-04 16:01:28 +01:00
vabene1111
dc827df95c ModelListView Pagination 2025-01-04 15:20:10 +01:00
vabene1111
b8db54d198 first steps to advanced search 2025-01-03 23:14:16 +01:00
vabene1111
dc58b42f68 improved startpage 2025-01-03 22:14:38 +01:00
vabene1111
9eca4673cd small tweaks 2025-01-03 20:49:12 +01:00
vabene1111
ac41a55d4f ingredient editor improvements 2025-01-02 18:02:54 +01:00
vabene1111
741c05a519 Basic ingredient editor 2025-01-02 14:56:18 +01:00
vabene1111
ac2d78f7a5 food editor model append to body 2025-01-02 11:12:52 +01:00
vabene1111
a4a93c5f4a refresh list after merge 2025-01-02 11:11:13 +01:00
vabene1111
05e507278e merge & automate 2025-01-02 11:07:05 +01:00
vabene1111
cab1641b33 fully generic merge dialog 2025-01-02 10:44:31 +01:00
vabene1111
9e99edf6f6 shopping fixes 2025-01-02 09:39:47 +01:00
vabene1111
2841e086df improved ingredient table 2025-01-02 09:34:12 +01:00
vabene1111
00ae511076 various meal plan fixes 2025-01-02 09:21:52 +01:00
vabene1111
f97d8ffdfd shopping load with pagination 2025-01-01 13:44:07 +01:00
vabene1111
34f337290c fixed comment 2025-01-01 10:07:49 +01:00
vabene1111
8159838fc3 warn before leaving model edit page 2025-01-01 10:07:27 +01:00
vabene1111
698aa5a753 Merge branch 'develop' 2025-01-01 09:24:51 +01:00
vabene1111
60f2494eae allow router back while snackbar is running 2025-01-01 08:56:29 +01:00
vabene1111
303f999b74 test include async results in global search 2025-01-01 08:51:34 +01:00
vabene1111
f83daf154f removed tests for no longer existing signal 2025-01-01 08:22:49 +01:00
vabene1111
6444680e06 Merge pull request #3475 from TandoorRecipes/dependabot/pip/cryptography-44.0.0
Bump cryptography from 43.0.1 to 44.0.0
2025-01-01 08:16:19 +01:00
dependabot[bot]
38e1db9c53 Bump pytubefix from 8.5.1 to 8.9.0
Bumps [pytubefix](https://github.com/juanbindez/pytubefix) from 8.5.1 to 8.9.0.
- [Release notes](https://github.com/juanbindez/pytubefix/releases)
- [Commits](https://github.com/juanbindez/pytubefix/compare/v8.5.1...v8.9.0)

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

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

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

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

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

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

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

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

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-01 00:33:42 +00:00
vabene1111
55ee75fed1 ingredient checkboxes and table style 2024-12-31 16:44:10 +01:00
vabene1111
846a4796e2 recipe view as model chain and ingredient checkbox 2024-12-31 15:23:44 +01:00
vabene1111
545c464f4f very very basic merge dialog working 2024-12-30 18:43:10 +01:00
vabene1111
fabf0c28e3 WIP merge button 2024-12-30 17:07:38 +01:00
vabene1111
e219f7e07c fixed SLE create 2024-12-30 14:49:34 +01:00
vabene1111
830ce14c65 Merge branch 'develop' into feature/vue3
# Conflicts:
#	.gitignore
#	recipes/settings.py
2024-12-30 14:48:10 +01:00
vabene1111
79abb8bf8f Merge branch 'develop' 2024-12-29 13:46:24 +01:00
vabene1111
fd4236672e update gitignore like vue3 branch 2024-12-29 13:46:17 +01:00
vabene1111
00148a2993 made shopping list compatible with SLR entries without a recipe 2024-12-29 13:44:43 +01:00
vabene1111
359fcb24cf fixed social signup form 2024-12-29 13:42:12 +01:00
vabene1111
c1bfa563a3 shopping from meal plan edit 2024-12-28 23:26:22 +01:00
vabene1111
bf4fc9a7aa basic shopping view in MealPlanEditor 2024-12-28 21:56:54 +01:00
vabene1111
4312b5ad65 mobile ingredient edit improvements 2024-12-28 18:36:26 +01:00
vabene1111
6fc078090a improved shopping 2024-12-28 15:24:07 +01:00
vabene1111
a4548abc19 shopping line item number formatting 2024-12-28 15:13:37 +01:00
vabene1111
1a39066b45 Revert "removed more unused stuff"
This reverts commit a0ac379b3c.
2024-12-28 15:11:34 +01:00
vabene1111
9cf1435130 Revert "removed dependency from settings"
This reverts commit f5cb393138.
2024-12-28 15:11:30 +01:00
vabene1111
e895bda80b Revert "remove unneeded dependencies"
This reverts commit b93f8e5e95.
2024-12-28 15:11:27 +01:00
vabene1111
882f18ac29 open edit page after model creation 2024-12-28 15:09:07 +01:00
vabene1111
ebfe5eee6d re added for now 2024-12-28 14:50:54 +01:00
vabene1111
afac08dc01 remove dependency import 2024-12-28 14:45:58 +01:00
vabene1111
a0ac379b3c removed more unused stuff 2024-12-28 14:41:00 +01:00
vabene1111
f5cb393138 removed dependency from settings 2024-12-28 14:33:06 +01:00
vabene1111
b93f8e5e95 remove unneeded dependencies 2024-12-28 14:17:31 +01:00
vabene1111
38c8e1b84f display external recipes 2024-12-28 14:15:44 +01:00
vabene1111
275c879e62 search and recipe improvements 2024-12-28 13:05:48 +01:00
vabene1111
cde632241b meal plan and recipe editor improvements 2024-12-28 12:55:20 +01:00
vabene1111
ea1e47e579 Merge branch 'develop' into feature/vue3 2024-12-28 11:23:12 +01:00
vabene1111
07b399cd80 ignore build staticfiles gitignore 2024-12-28 08:35:28 +01:00
vabene1111
ed20cf3df4 ignore build staticfiles 2024-12-28 08:35:19 +01:00
vabene1111
f5d7919f72 Merge pull request #3448 from igorsantos07/patch-1
Update system.html: Django Recipes > Tandoor
2024-12-28 08:26:53 +01:00
vabene1111
86c4278553 Merge pull request #3454 from TandoorRecipes/dependabot/pip/jinja2-3.1.5
Bump jinja2 from 3.1.4 to 3.1.5
2024-12-28 08:26:44 +01:00
dependabot[bot]
2a5c0bb740 Bump jinja2 from 3.1.4 to 3.1.5
Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.4 to 3.1.5.
- [Release notes](https://github.com/pallets/jinja/releases)
- [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/jinja/compare/3.1.4...3.1.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-28 07:25:33 +00:00
Igor Santos
432dfa9e86 Update system.html: Django Recipes > Tandoor 2024-12-24 02:28:21 -03:00
vabene1111
8a4e32f05e disable templating for now 2024-12-23 15:18:55 +01:00
vabene1111
5a8b4fb4ce minor tweaks 2024-12-23 14:49:07 +01:00
vabene1111
65034e523f fixed global search dialog manual select 2024-12-23 14:43:34 +01:00
vabene1111
0c6637406a layout fixes 2024-12-23 14:10:38 +01:00
vabene1111
4b0d022db1 meal plan tweaks 2024-12-23 13:53:44 +01:00
vabene1111
7a2b3c2d2e some styling stuff 2024-12-23 12:28:42 +01:00
vabene1111
205eae785e working add to shopping dialog 2024-12-23 12:07:28 +01:00
vabene1111
e0223e0c5c wip shopping dialog 2024-12-22 18:36:56 +01:00
vabene1111
d611391bea recipe context actions 2024-12-22 17:18:47 +01:00
vabene1111
0c547353cd add to shopping from meal plan editor 2024-12-22 15:36:58 +01:00
vabene1111
5ce859f267 space switcher 2024-12-22 14:06:55 +01:00
vabene1111
8e0da93476 fixed model switcher 2024-12-22 13:55:04 +01:00
vabene1111
3f7c22cfe0 fixed image import in URL import 2024-12-22 13:18:46 +01:00
vabene1111
55ee575c9c file upload in UserFileEditor and RecipeEditor 2024-12-22 13:11:48 +01:00
vabene1111
de6627ab32 Merge branch 'develop' into feature/vue3 2024-12-22 12:13:09 +01:00
vabene1111
f61a8371f4 Revert "added user filkes to recipe and added is_image flag to user file"
This reverts commit 0bcdf5e0a3.
2024-12-22 12:12:37 +01:00
vabene1111
9b586ae709 Merge branch 'develop' into feature/vue3 2024-12-22 12:05:53 +01:00
vabene1111
0bcdf5e0a3 added user filkes to recipe and added is_image flag to user file 2024-12-22 12:05:47 +01:00
vabene1111
64a43d3d40 basic user file upload working 2024-12-21 16:03:13 +01:00
vabene1111
679957b48c vue 3 permission generally set to guest 2024-12-21 10:33:55 +01:00
vabene1111
0399763888 new recipe fix 2024-12-19 21:22:39 +01:00
vabene1111
3e3780028b improved code quality of start page scrollers 2024-12-19 21:16:15 +01:00
vabene1111
1c9d19fc76 fixed navigating with global search 2024-12-19 20:21:00 +01:00
vabene1111
ecdb1e9fee fixed userpreference test and added user info to recipe endpoint 2024-12-19 20:08:13 +01:00
vabene1111
b9e5126ab4 recipe view tweaks 2024-12-19 20:03:52 +01:00
vabene1111
a34fddc866 improved URL import 2024-12-19 19:35:21 +01:00
vabene1111
9b3bfd3d1c url import fully functioning 2024-12-12 18:27:21 +01:00
vabene1111
74000551e6 fix recipe import test 2024-12-12 18:09:50 +01:00
vabene1111
325ee16d39 importer stuff 2024-12-12 17:26:01 +01:00
vabene1111
37761bf6e7 split, merge and auto sort steps in importer 2024-12-11 22:01:21 +01:00
vabene1111
ad57ce7790 import stuff 2024-12-11 20:56:27 +01:00
vabene1111
169f799a23 Merge pull request #3428 from hawthorc/develop
Add note about Python 3.12 dependency to manual.md
2024-12-11 15:19:59 +01:00
vabene1111
942d1130a1 Merge pull request #3416 from zodac/develop
Adding healthcheck to docker image
2024-12-11 15:17:28 +01:00
vabene1111
64cc20aed2 Merge pull request #3426 from TandoorRecipes/dependabot/pip/icalendar-6.1.0
Bump icalendar from 5.0.11 to 6.1.0
2024-12-11 15:12:09 +01:00
vabene1111
3a6731ec8d Merge pull request #3425 from TandoorRecipes/dependabot/pip/pytest-factoryboy-2.7.0
Bump pytest-factoryboy from 2.6.0 to 2.7.0
2024-12-11 15:11:32 +01:00
vabene1111
e6f11a17b9 Merge pull request #3423 from TandoorRecipes/dependabot/pip/pytest-django-4.9.0
Bump pytest-django from 4.8.0 to 4.9.0
2024-12-11 15:11:17 +01:00
vabene1111
cc1cd610e7 Merge pull request #3424 from TandoorRecipes/dependabot/pip/crispy-bootstrap4-2024.10
Bump crispy-bootstrap4 from 2024.1 to 2024.10
2024-12-11 15:10:19 +01:00
vabene1111
6a3b5ee844 Merge pull request #3431 from TandoorRecipes/dependabot/pip/django-4.2.17
Bump django from 4.2.16 to 4.2.17
2024-12-11 15:09:46 +01:00
Matjaž T
49b119571e Translated using Weblate (Slovenian)
Currently translated at 100.0% (570 of 570 strings)

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

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/it/
2024-12-09 00:58:36 +00:00
vabene1111
f1f907ee33 fixed error in account settings 2024-12-08 22:04:06 +01:00
vabene1111
e3f20459dd basic url importer working 2024-12-08 21:54:14 +01:00
vabene1111
da567a9d6c small improvements 2024-12-08 17:16:38 +01:00
vabene1111
01a4fb57df moved food property to seperate component and re-used that for the recipe editor 2024-12-08 16:47:03 +01:00
dependabot[bot]
7ccedb559d Bump django from 4.2.16 to 4.2.17
Bumps [django](https://github.com/django/django) from 4.2.16 to 4.2.17.
- [Commits](https://github.com/django/django/compare/4.2.16...4.2.17)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-06 18:57:23 +00:00
vabene1111
01d52143e8 recipe editor 2024-12-05 18:00:13 +01:00
vabene1111
35461ba926 cleanup 2024-12-04 18:26:00 +01:00
vabene1111
b9f49cad45 ingredient from string API 2024-12-04 18:21:19 +01:00
vabene1111
d7487c6d5c step editor WIP 2024-12-04 17:39:22 +01:00
vabene1111
15122387f4 lots of improvements to recipe editor 2024-12-04 16:55:50 +01:00
zodac
103daf000d Using --spider for healthcheck, which performs a HEAD request instead of a GET request 2024-12-02 20:44:12 +13:00
Vincenzo Reale
70df456307 Translated using Weblate (Italian)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/it/
2024-12-02 04:53:51 +00:00
Carter Hawthorne
375174ee41 Add note about Python 3.12 dependency to manual.md 2024-12-01 18:38:38 -08:00
vabene1111
931064a695 playing with a step timeline 2024-12-01 16:25:57 +01:00
vabene1111
49c8a5a375 recipe editor in model editor system basics 2024-12-01 16:02:32 +01:00
vabene1111
ab9f9701d8 general layout improvements 2024-12-01 15:35:40 +01:00
vabene1111
da4abcfce2 shopping recipe scaling 2024-12-01 14:46:31 +01:00
vabene1111
4149549c88 shopping supermarket quick edit 2024-12-01 14:27:08 +01:00
vabene1111
fa8cd4a2f0 shopping cleanup 2024-12-01 13:16:45 +01:00
vabene1111
423dc7a6bf lots of shopping tweaks 2024-12-01 12:32:16 +01:00
dependabot[bot]
f19beba014 Bump icalendar from 5.0.11 to 6.1.0
Bumps [icalendar](https://github.com/collective/icalendar) from 5.0.11 to 6.1.0.
- [Release notes](https://github.com/collective/icalendar/releases)
- [Changelog](https://github.com/collective/icalendar/blob/main/CHANGES.rst)
- [Commits](https://github.com/collective/icalendar/compare/v5.0.11...v6.1.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-01 00:39:31 +00:00
dependabot[bot]
865756e4b2 Bump pytest-factoryboy from 2.6.0 to 2.7.0
Bumps [pytest-factoryboy](https://github.com/pytest-dev/pytest-factoryboy) from 2.6.0 to 2.7.0.
- [Changelog](https://github.com/pytest-dev/pytest-factoryboy/blob/master/CHANGES.rst)
- [Commits](https://github.com/pytest-dev/pytest-factoryboy/compare/2.6.0...2.7.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-01 00:39:28 +00:00
dependabot[bot]
41f834db08 Bump crispy-bootstrap4 from 2024.1 to 2024.10
Bumps [crispy-bootstrap4](https://github.com/django-crispy-forms/crispy-bootstrap4) from 2024.1 to 2024.10.
- [Release notes](https://github.com/django-crispy-forms/crispy-bootstrap4/releases)
- [Changelog](https://github.com/django-crispy-forms/crispy-bootstrap4/blob/main/CHANGELOG.md)
- [Commits](https://github.com/django-crispy-forms/crispy-bootstrap4/compare/2024.1...2024.10)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-01 00:39:26 +00:00
dependabot[bot]
2c94753a5a Bump pytest-django from 4.8.0 to 4.9.0
Bumps [pytest-django](https://github.com/pytest-dev/pytest-django) from 4.8.0 to 4.9.0.
- [Release notes](https://github.com/pytest-dev/pytest-django/releases)
- [Changelog](https://github.com/pytest-dev/pytest-django/blob/main/docs/changelog.rst)
- [Commits](https://github.com/pytest-dev/pytest-django/compare/v4.8.0...v4.9.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-01 00:39:23 +00:00
vabene1111
557954a259 added stats 2024-11-30 11:41:46 +01:00
vabene1111
38b72c8c72 shopping list recipes 2024-11-30 11:34:35 +01:00
vabene1111
3f395e816f working shopping list 2024-11-30 11:18:54 +01:00
zodac
0e05c77fa7 Adding healthcheck to docker image 2024-11-29 14:15:24 +13:00
vabene1111
6dcc77243a small fix 2024-11-28 15:31:05 +01:00
vabene1111
110ffe52b7 several shopping fixes 2024-11-27 16:52:48 +01:00
vabene1111
2fab51ea9b Merge branch 'develop' into feature/vue3
# Conflicts:
#	cookbook/views/api.py
2024-11-27 15:57:39 +01:00
vabene1111
425f00860f Merge branch 'develop' into feature/vue3
# Conflicts:
#	docs/features/authentication.md
2024-11-27 15:56:28 +01:00
vabene1111
793c152b26 Merge pull request #3412 from lavanyamehn/duplicate_urls
Display a warning message when duplicate recipe is imported
2024-11-27 15:50:54 +01:00
Lavanya Mehndiratta
9df75f551c Changed functionality to only display a warning message 2024-11-26 18:09:55 -05:00
vabene1111
da49280ef2 Merge branch 'develop' 2024-11-26 17:29:57 +01:00
vabene1111
e6087d5129 use Sandbox Environment to render templates 2024-11-26 17:18:47 +01:00
vabene1111
d91a3080d5 autosync WIP 2024-11-25 18:36:11 +01:00
vabene1111
0485e5192b shopping list improvements 2024-11-25 16:50:56 +01:00
vabene1111
4f9bff20c8 Merge pull request #3411 from bishtawi/bishtawi/secret-files
Support reading more secrets from files
2024-11-25 16:46:56 +01:00
Anders Obro
683f1ac10a Translated using Weblate (Danish)
Currently translated at 100.0% (570 of 570 strings)

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

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

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sl/
2024-11-22 07:58:36 +00:00
vabene1111
7531c83379 shopping list delay fix and category change implemented 2024-11-19 16:32:26 +01:00
Daniel Legin
6188f175ae Translated using Weblate (Croatian)
Currently translated at 30.9% (151 of 488 strings)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-01 00:03:14 +00:00
Vincenzo Reale
9af22bcf9f Translated using Weblate (Italian)
Currently translated at 100.0% (570 of 570 strings)

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

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

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

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

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

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

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

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/it/
2024-10-30 13:30:42 +00:00
vabene1111
ba401877e8 strange 2024-10-27 14:40:33 +01:00
vabene1111
77748a951b various improvements for shopping line item dialog 2024-10-23 18:23:48 +02:00
vabene1111
4692526e48 shopping line item dialog WIP 2024-10-22 18:31:43 +02:00
vabene1111
eb4b8555c2 closable card title component 2024-10-22 18:31:36 +02:00
vabene1111
6a12ca78d1 recipe view shopping 2024-10-20 14:00:19 +02:00
vabene1111
2ed53f8e50 lots of shopping improvements 2024-10-20 12:47:44 +02:00
vabene1111
615e3bfa3d ugly but working shopping list 2024-10-17 20:41:39 +02:00
vabene1111
e406bdbc2c vuetify 2024-10-17 17:15:44 +02:00
vabene1111
7fd402aade lots of work on shopping store 2024-10-16 20:58:56 +02:00
vabene1111
e8522a4a6d disable model editor buttons when loadign 2024-10-16 19:16:59 +02:00
vabene1111
eb872ddbf6 settings cleanup 2024-10-14 17:53:36 +02:00
vabene1111
1b1c1bdd5e fixed missing locale key and min shopping interval 2024-10-14 17:39:40 +02:00
vabene1111
b2f950ebe4 Merge branch 'develop' into feature/vue3 2024-10-14 17:20:17 +02:00
vabene1111
8501dcc34e some user file editor bits 2024-10-14 17:18:14 +02:00
vabene1111
9fd1d76fd8 supermarket editor done 2024-10-14 16:52:01 +02:00
vabene1111
3a002cce9e Merge pull request #3359 from Chronophylos/mealie-import
Fix null-constrait errors in mealie import
2024-10-14 08:25:11 +02:00
vabene1111
416ddf3d34 Merge pull request #3361 from tlambertz/paprika-fix
Fix Paprika Import Images when not downloading from URL.
2024-10-14 08:22:19 +02:00
vabene1111
e0f8d1ea9e moved to category relation instead of category 2024-10-13 17:48:55 +02:00
vabene1111
be886b108c supermarket category editor improvements 2024-10-13 13:24:00 +02:00
vabene1111
8b0a19c6a2 Merge pull request #3357 from TandoorRecipes/dependabot/npm_and_yarn/vue/elliptic-6.5.7
Bump elliptic from 6.5.4 to 6.5.7 in /vue
2024-10-13 12:30:59 +02:00
Thomas Lambertz
757fa1b768 Fix Paprika Import Images when not downloading from URL.
Previously, the code only tried to use the cropped image from paprika when downloading actively failed.
But if a user takes an image himself, the url will be empty, thus downloading won't be attempted and won't fail.
This change makes it so that the download is tried first, but the photo_data is always tried if no image exists for whatever reason.
2024-10-12 21:15:37 +02:00
Chronophylos
736d829bd0 Fix null-constrait errors in mealie import 2024-10-12 16:01:32 +02:00
dependabot[bot]
6829d5351d Bump elliptic from 6.5.4 to 6.5.7 in /vue
Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.4 to 6.5.7.
- [Commits](https://github.com/indutny/elliptic/compare/v6.5.4...v6.5.7)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-12 03:18:39 +00:00
vabene1111
cbcddfbcd1 meal plan and model editors
- changed signature to options object
- added ability to set defaults
- meal plan clickable item creation
2024-10-11 17:45:47 +02:00
vabene1111
7d531d18d4 new model editor activators 2024-10-10 21:42:37 +02:00
vabene1111
eee8ed70e7 meal plan editor tweaks 2024-10-10 21:13:58 +02:00
vabene1111
805eb87754 Merge pull request #3353 from TandoorRecipes/dependabot/pip/django-4.2.16
Bump django from 4.2.15 to 4.2.16
2024-10-10 13:07:43 +02:00
dependabot[bot]
e910ec4a51 Bump django from 4.2.15 to 4.2.16
Bumps [django](https://github.com/django/django) from 4.2.15 to 4.2.16.
- [Commits](https://github.com/django/django/compare/4.2.15...4.2.16)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-08 21:29:14 +00:00
vabene1111
4f425fb99a MealPlan editor in new editor system 2024-10-08 19:23:20 +02:00
vabene1111
9395a456f0 model list page url case sensitivity 2024-10-08 18:50:16 +02:00
vabene1111
a8256b461a model edit improvements 2024-10-08 18:45:41 +02:00
vabene1111
3494bce2b8 Merge branch 'develop' into feature/vue3 2024-10-08 18:26:42 +02:00
vabene1111
4c0ace1d84 Merge branch 'develop' 2024-10-08 18:25:17 +02:00
vabene1111
cae26e7fe0 updated recipe scrapers 2024-10-08 18:22:03 +02:00
vabene1111
b6b3e83c1e disable selects for now 2024-10-08 07:46:37 +02:00
vabene1111
7d47fcf4e9 async component loading for model editor components 2024-10-08 07:44:17 +02:00
vabene1111
b857c9e4d9 fixed saving page item number in model list 2024-10-08 07:09:43 +02:00
vabene1111
25de4326d2 fixed some things but page param still broken 2024-10-07 21:11:21 +02:00
vabene1111
257f4f2b5b no longer build arm/v7 for tandoor 2 2024-10-06 11:14:13 +02:00
vabene1111
e4a6bd0a1f made ModelEditor setupState function properly handle async requests 2024-10-05 07:51:48 +02:00
vabene1111
4ab0fbf36b WIP supermarket category editor 2024-10-05 07:26:42 +02:00
supaeasy
8d070349a6 Translated using Weblate (German)
Currently translated at 100.0% (570 of 570 strings)

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

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

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-01 00:42:42 +00:00
dependabot[bot]
c9edec6308 Bump lxml from 5.1.0 to 5.3.0
Bumps [lxml](https://github.com/lxml/lxml) from 5.1.0 to 5.3.0.
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-5.1.0...lxml-5.3.0)

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

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

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

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

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

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

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

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/de/
2024-09-27 13:58:35 +00:00
vabene1111
67fff17f06 composable for model editor functions WIP 2024-09-26 21:53:04 +02:00
vabene1111
5ada8e529c changed access token editor to use generic model api 2024-09-26 21:22:19 +02:00
vabene1111
22a3654dfd model select stuff 2024-09-26 16:05:54 +02:00
vabene1111
9a94c650da model related stuff 2024-09-26 15:02:07 +02:00
vabene1111
ddaeb054d0 added v3 beta setting 2024-09-26 07:35:35 +02:00
nenormalniy
7d1461a752 Translated using Weblate (Russian)
Currently translated at 63.3% (361 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ru/
2024-09-26 03:58:35 +00:00
vabene1111
0a3611b94a use HTML 5 history mode for vue frontend 2024-09-25 16:45:11 +02:00
vabene1111
0db439c80d fixed test for real 2024-09-25 16:44:57 +02:00
vabene1111
99103bc419 Revert "fixed space test to reflect new logic"
This reverts commit fcf9f30af0.
2024-09-25 16:43:41 +02:00
vabene1111
fcf9f30af0 fixed space test to reflect new logic 2024-09-25 16:28:36 +02:00
vabene1111
beab927f64 more models and model select with new system 2024-09-25 16:23:02 +02:00
vabene1111
91f2f34cd3 improved generic type 2024-09-24 16:00:31 +02:00
Emmker
24a589fe41 Translated using Weblate (Greek)
Currently translated at 46.3% (226 of 488 strings)

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

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/de/
2024-09-23 21:58:37 +00:00
vabene1111
a44f61b507 WIP model list page, broke models system 2024-09-23 17:37:48 +02:00
vabene1111
fc567d2fbb added some test code and python script for openapi generation 2024-09-23 14:05:27 +02:00
vabene1111
12e0c7fd7b updated openapi generator 2024-09-23 13:57:37 +02:00
vabene1111
7e77e56e7f updated api client for latest model change 2024-09-23 10:34:37 +02:00
vabene1111
46706c633e Merge branch 'develop' into feature/vue3 2024-09-23 10:28:01 +02:00
vabene1111
6b376fbfbb Merge pull request #3302 from mikhail5555/dont-log-sensitive-headers-in-err
Allow HomeAssistant Connector to work with Debug=False (and logging improvements)
2024-09-23 07:44:01 +02:00
vabene1111
c532b1f94f Merge branch 'develop' into dont-log-sensitive-headers-in-err 2024-09-23 07:43:55 +02:00
vabene1111
26ab7f5580 Merge pull request #3305 from ehowe/develop
Make HomeAssistant description field optional
2024-09-23 07:37:34 +02:00
Emmker
72c638ca6f Translated using Weblate (Greek)
Currently translated at 99.8% (569 of 570 strings)

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

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ru/
2024-09-22 21:31:52 +00:00
vabene1111
ea8ab582eb all food editor functions implemented 2024-09-22 20:07:12 +02:00
vabene1111
73e4f22256 food editor WIP 2024-09-22 12:31:59 +02:00
vabene1111
a173e66a59 first draft of model list view and edit pages 2024-09-21 19:02:42 +02:00
vabene1111
cad75408c3 mealplan settings including meal type 2024-09-21 14:48:33 +02:00
vabene1111
cd93d9c697 basic meal plan settings 2024-09-21 14:17:13 +02:00
vabene1111
ce869950c3 space settings and message 2024-09-21 13:36:36 +02:00
vabene1111
55bd417105 settings and model dialogs 2024-09-21 12:46:54 +02:00
vabene1111
ed4592ae0c api page + model edit dialog 2024-09-21 11:12:56 +02:00
vabene1111
7c30204dd7 basic model editor workflow done 2024-09-19 07:52:57 +02:00
Mikhail Epifanov
e6eacc48d6 update code so it also works in DEBUG=false 2024-09-17 22:25:08 +02:00
Bebbe K
0259e000e3 Translated using Weblate (Swedish)
Currently translated at 61.4% (300 of 488 strings)

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

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/hu/
2024-09-14 12:44:44 +00:00
Mikhail Epifanov
8c8834e6aa dont log err.headers which can contain sensitive info 2024-09-13 22:36:05 +02:00
vabene1111
b52d61b6db working on model editor 2024-09-12 07:58:12 +02:00
vabene1111
1bed90b804 start of model edit dialogs 2024-09-10 08:55:28 +02:00
vabene1111
5eabf6869d api settings component 2024-09-09 18:54:43 +02:00
vabene1111
4ee5d348bf fixed endpoint descriptions 2024-09-09 18:43:29 +02:00
vabene1111
252a7207f6 work on settings component 2024-09-09 18:41:25 +02:00
vabene1111
abc2dc8437 Merge branch 'develop' into feature/vue3 2024-09-09 17:18:39 +02:00
Tomer Alcavi
145abfa344 Translated using Weblate (Hebrew)
Currently translated at 18.2% (89 of 488 strings)

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

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

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

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

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

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

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

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

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

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-01 00:34:14 +00:00
dependabot[bot]
0cdff07e4b Bump pillow from 10.3.0 to 10.4.0
Bumps [pillow](https://github.com/python-pillow/Pillow) from 10.3.0 to 10.4.0.
- [Release notes](https://github.com/python-pillow/Pillow/releases)
- [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst)
- [Commits](https://github.com/python-pillow/Pillow/compare/10.3.0...10.4.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-01 00:34:11 +00:00
dependabot[bot]
8a142c3b11 Bump django-crispy-forms from 2.1 to 2.3
Bumps [django-crispy-forms](https://github.com/django-crispy-forms/django-crispy-forms) from 2.1 to 2.3.
- [Release notes](https://github.com/django-crispy-forms/django-crispy-forms/releases)
- [Changelog](https://github.com/django-crispy-forms/django-crispy-forms/blob/main/CHANGELOG.md)
- [Commits](https://github.com/django-crispy-forms/django-crispy-forms/compare/2.1...2.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-01 00:34:05 +00:00
dependabot[bot]
20ca7151d1 Bump pyyaml from 6.0.1 to 6.0.2
Bumps [pyyaml](https://github.com/yaml/pyyaml) from 6.0.1 to 6.0.2.
- [Release notes](https://github.com/yaml/pyyaml/releases)
- [Changelog](https://github.com/yaml/pyyaml/blob/main/CHANGES)
- [Commits](https://github.com/yaml/pyyaml/compare/6.0.1...6.0.2)

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

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

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

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

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

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

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

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

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

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

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

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

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

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/zh_Hans/
2024-08-24 14:58:37 +00:00
vabene1111
830a385bda tweaked file input 2024-08-24 10:09:46 +02:00
vabene1111
c92c19d9b2 basic working file selector 2024-08-24 09:59:48 +02:00
vabene1111
8fe6f5c141 fixed space test and space api endpoint 2024-08-24 09:18:57 +02:00
vabene1111
39ab8b00c4 Merge branch 'develop' into feature/vue3 2024-08-24 08:29:04 +02:00
vabene1111
d3164d3e0d minor work on file uploader 2024-08-23 13:57:01 +02:00
vabene1111
beb1823a57 Merge pull request #3268 from smilerz/source_import_fix
set URL when none provided
2024-08-23 08:06:33 +02:00
smilerz
b6fa74c601 text 2024-08-22 12:45:49 -05:00
Matjaž T
596b6c6f98 Translated using Weblate (Slovenian)
Currently translated at 15.1% (74 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/sl/
2024-08-21 16:58:36 +00:00
vabene1111
e6af0e3845 very basic file list 2024-08-21 16:26:21 +02:00
vabene1111
0eabf1f7c4 central cookie function 2024-08-21 16:26:13 +02:00
vabene1111
91111c7d74 first file upload working 2024-08-21 16:17:03 +02:00
vabene1111
7397f4c381 space settings and file dialog 2024-08-20 15:17:06 +02:00
vabene1111
02ffb727d5 space settings base page 2024-08-20 13:50:58 +02:00
vabene1111
4ba769a49e updated space api endpoint to list all spaces + addtional /current/ endpoint 2024-08-20 13:49:12 +02:00
vabene1111
ad71804b70 fixed denisty on space member list 2024-08-20 12:34:23 +02:00
vabene1111
1bf9696a27 fixed models 2024-08-20 12:24:32 +02:00
vabene1111
b5e0055876 Merge branch 'develop' into feature/vue3
# Conflicts:
#	cookbook/views/api.py
#	vue/src/utils/models.js
2024-08-20 11:54:19 +02:00
vabene1111
6a3534da76 basic space member settings 2024-08-05 20:47:10 +02:00
vabene1111
105a5f2bdc fixed message list dialog icons 2024-08-05 20:15:03 +02:00
vabene1111
45543e9669 disable pagination for localization viewset 2024-08-05 07:51:16 +02:00
vabene1111
36bc96f192 more work on settings 2024-08-04 20:04:35 +02:00
vabene1111
516b345807 settings page WIP 2024-08-04 16:59:56 +02:00
vabene1111
4a6d542965 first idea of a settings page 2024-08-01 16:28:24 +02:00
vabene1111
fb9bbafd6e link changed 2024-08-01 15:24:18 +02:00
vabene1111
0e44243e55 Merge branch 'develop' into feature/vue3
# Conflicts:
#	recipes/settings.py
#	requirements.txt
2024-08-01 15:03:40 +02:00
vabene1111
65b451b465 improving the start page layout 2024-07-31 18:56:43 +02:00
vabene1111
abff1136f9 imrpvoed recipe card design 2024-07-31 18:43:10 +02:00
vabene1111
3630172723 mybe this time 2024-07-31 17:49:58 +02:00
vabene1111
d241ee3cde maybe fix build issues 2024-07-31 17:42:24 +02:00
vabene1111
6994f6bc1d removed ununsed imports 2024-07-31 17:02:27 +02:00
vabene1111
25147f84ec cleaned up locale loading 2024-07-31 17:02:06 +02:00
vabene1111
c02523ee51 lazy load locale based on user settings 2024-07-31 16:59:02 +02:00
vabene1111
8a4ffc5e0c working on locale (not yet fully working) 2024-07-21 07:03:21 +02:00
vabene1111
5b3445a5b5 user pref store tweaks 2024-07-20 13:47:39 +02:00
vabene1111
b05bff0fa0 basic user preference store 2024-07-20 13:44:36 +02:00
vabene1111
51f0f943f7 meal plan dialog 2024-07-20 13:15:24 +02:00
vabene1111
11b42470b6 mealplandialog date range working and moving 2024-07-20 10:02:32 +02:00
vabene1111
71e5e32206 meal plan dialog 2024-07-19 15:39:27 +02:00
vabene1111
6f44c8ba17 almost nothing and broken 2024-07-18 20:03:06 +02:00
vabene1111
45a6564e17 added FAB to editor 2024-07-10 17:39:20 +02:00
vabene1111
65641c1256 added small user menu 2024-07-09 07:52:00 +02:00
vabene1111
930e686cbd Merge branch 'develop' into feature/vue3
# Conflicts:
#	.env.template
#	cookbook/views/views.py
#	requirements.txt
2024-07-09 07:26:11 +02:00
vabene1111
08309a6f04 Merge pull request #3161 from fliiiix/bugfix/strip-env-list
Setttings: strip whitespace between entries
2024-06-11 17:20:55 +02:00
fliiiix
10b4c3da05 Use getenv default instead of or syntax 2024-06-11 12:35:21 +02:00
fliiiix
6257f6ffb7 Refactor extract settings to helper functions 2024-06-11 12:34:06 +02:00
fliiiix
80f8a524ef Strip whitespace in comma lists
This makes configurations valid which contain one or more
extra spaces.

Example:
CSRF_TRUSTED_ORIGINS = "https://foo.bar.example, http://foo.example"

Would be invalid.
2024-06-11 12:34:06 +02:00
vabene1111
6f3fc2fcab fixed message list dialog sorting 2024-05-22 13:07:01 +02:00
vabene1111
6a8b2b6338 playing with AI image recognition 2024-05-18 14:29:42 +02:00
vabene1111
fd1c6d718e allow create in model select and fixed some stuff 2024-05-07 07:57:45 +02:00
vabene1111
5f2e683b6b Merge pull request #3143 from smilerz/feature/vue3
updated Vue2 pages to work with drf_spectacular schemas
2024-05-02 16:50:22 +02:00
smilerz
5f4283ca3f update MealPlan queryset filtering to use dates instead of datetime 2024-05-01 12:03:10 -05:00
smilerz
9df03a73d9 updated Vue2 pages to work with drf_spectacular schemas 2024-05-01 11:02:27 -05:00
vabene1111
6d813ebb2f meal plan stuff 2024-05-01 15:37:33 +02:00
vabene1111
f961413e94 api client update 2024-05-01 13:47:25 +02:00
vabene1111
17693b90b5 Merge branch 'develop' into feature/vue3 2024-05-01 13:45:37 +02:00
vabene1111
c11dd8bcae cleanup vueform 2024-05-01 12:48:17 +02:00
vabene1111
ef3913d91f meal plan stuff 2024-05-01 11:14:39 +02:00
vabene1111
569b7e78fe models, messages and multiselects 2024-05-01 10:04:19 +02:00
vabene1111
32b75250dc Merge pull request #3131 from smilerz/feature/vue3
rename property apis
2024-04-30 10:04:07 +02:00
smilerz
743fcbcfc1 Merge branch 'feature/vue3' of github.com:smilerz/recipes into feature/vue3 2024-04-29 13:07:04 -05:00
smilerz
748db37a1b update Recipe Search, Edit and View to work with updated API 2024-04-29 13:06:00 -05:00
smilerz
a75650c045 Merge branch 'TandoorRecipes:feature/vue3' into feature/vue3 2024-04-29 09:34:30 -05:00
smilerz
ce9c469acc rename food-property and food-property-type 2024-04-29 09:33:42 -05:00
vabene1111
dc8958bee1 added all watcher tasks 2024-04-27 19:03:03 +02:00
vabene1111
e405aab310 no longer split schema in request/response 2024-04-27 10:40:09 +02:00
vabene1111
846c3e36cc Merge branch 'develop' into feature/vue3 2024-04-27 10:37:44 +02:00
vabene1111
b42a444a67 Merge pull request #3126 from smilerz/feature/vue3
legacy API
2024-04-27 09:19:47 +02:00
smilerz
4771f890cb add ability to generate legacy API with legacy naming scheme
regenerate legacy API
2024-04-26 12:21:34 -05:00
vabene1111
991ff88767 Merge pull request #3123 from smilerz/feature/vue3
Feature/vue3
2024-04-26 16:28:40 +02:00
smilerz
4fa7155fc3 delete extraneous openapi files 2024-04-25 07:31:51 -05:00
smilerz
9e49652f80 deleted openapi models at root of project 2024-04-25 07:28:02 -05:00
smilerz
931865b61f restore original openapi update.bat 2024-04-24 13:44:21 -05:00
smilerz
f0088b256e delete openapi generated files from root of vue3 2024-04-24 13:37:54 -05:00
smilerz
a047d36bf1 update tests to reflect API changes 2024-04-24 12:26:05 -05:00
smilerz
ebcc814abf remove deprecated api endpoints
api/log_cooking
api/plan-ical/
api/backup/
2024-04-24 12:24:19 -05:00
smilerz
b83f3a291b update documentation 2024-04-24 12:23:35 -05:00
smilerz
e4ff6ed732 adding TZ to default .env.template 2024-04-24 12:16:53 -05:00
smilerz
a67b084b52 regenerate API 2024-04-23 10:35:45 -05:00
smilerz
dd3f38fe75 Merge remote-tracking branch 'upstream/feature/vue3' into feature/vue3 2024-04-23 09:47:09 -05:00
smilerz
3184deb00e change reset_food_inheritance from GET to POST 2024-04-23 09:32:18 -05:00
smilerz
2847721584 update tests to reflect pagination and API changes 2024-04-23 09:18:48 -05:00
vabene1111
894a298f45 maybe better without vueform ? 2024-04-22 20:48:46 +02:00
vabene1111
17610663c1 playing with vueform 2024-04-22 20:18:09 +02:00
vabene1111
12cf9da8fc fixed api client generation 2024-04-22 19:33:09 +02:00
vabene1111
c47e46263c mostly composition now 2024-04-21 16:06:28 +02:00
vabene1111
e040a10096 moved many compoents to composition API 2024-04-21 15:58:31 +02:00
vabene1111
ce6c43fb62 shopping stuff 2024-04-21 11:49:07 +02:00
vabene1111
faf025d2c4 first shopping items showing 2024-04-21 11:42:49 +02:00
vabene1111
8e50742372 meal plan improvements 2024-04-21 08:07:47 +02:00
vabene1111
b0533f2f9b Merge branch 'develop' into feature/vue3
# Conflicts:
#	requirements.txt
2024-04-21 07:15:46 +02:00
smilerz
fd0d5813fb update SpaceFilterSerializer to handle both lists and QuerySets 2024-04-19 09:00:19 -05:00
smilerz
8cd79cdc20 update SpaceFilterSerializer to reflect paginated ViewSets provide
a list instead of a queryset
2024-04-19 08:37:27 -05:00
smilerz
d3abe4db3e updated tests to reflect API changes in pagination 2024-04-19 07:43:29 -05:00
smilerz
71765f3542 change function based views to @api_view
implement schemas on all @api_view
2024-04-18 17:52:29 -05:00
smilerz
1e326fe414 remove apis no longer in use 2024-04-18 17:52:04 -05:00
smilerz
f06b3e8af0 add enum to filters that have Choice fields 2024-04-18 16:25:02 -05:00
smilerz
4edd729850 add schema parameters for all list endpoinst with filters 2024-04-18 15:55:16 -05:00
smilerz
8412aa19fb paginate all list endpoints or explicitly mark as pagination_disabled 2024-04-18 15:18:51 -05:00
smilerz
5f0eb73927 regenerate vue typescript API 2024-04-18 10:59:05 -05:00
smilerz
fd8411b475 regenerate fetch API 2024-04-18 10:56:15 -05:00
smilerz
f312f6028d ensure that all schema fields are typed correctly 2024-04-18 10:54:45 -05:00
smilerz
f401b0f635 add test to validate all list endpoints are paginated
add test to valoidate that all endpoints have a schema
2024-04-18 10:52:41 -05:00
vabene1111
e22c89a0e9 basics of drag and drop 2024-04-15 21:03:24 +02:00
vabene1111
e5691d0e98 meal plan style improvements 2024-04-15 20:12:50 +02:00
vabene1111
4266029e84 somewhat broken initial meal plan version 2024-04-14 22:23:45 +02:00
vabene1111
849856df26 Merge branch 'develop' into feature/vue3
# Conflicts:
#	cookbook/views/api.py
2024-04-14 21:24:43 +02:00
vabene1111
e398fc0b38 Merge branch 'develop' into feature/vue3
# Conflicts:
#	.gitignore
#	docs/contribute.md
#	recipes/settings.py
#	requirements.txt
2024-04-11 18:00:42 +02:00
vabene1111
514c4106b1 basic calendar 2024-04-07 13:29:00 +02:00
vabene1111
3cf89aca10 playing with calendars 2024-04-07 12:54:05 +02:00
vabene1111
9bf8b615dc re added basic recipe activity 2024-04-07 09:28:11 +02:00
vabene1111
cb8dd3bc99 sizing and navs 2024-04-07 08:29:21 +02:00
vabene1111
1cd9caef4a step display tweaks 2024-04-07 07:56:58 +02:00
vabene1111
1025829123 proper timer component 2024-04-07 07:15:25 +02:00
vabene1111
019a931b99 structure cleanup 2024-04-07 06:27:59 +02:00
vabene1111
8398193a51 Merge branch 'develop' into feature/vue3 2024-04-05 21:18:06 +02:00
smilerz
f560365ded stub out schema completeness tests 2024-04-05 08:15:01 -05:00
vabene1111
ebc2902450 Merge branch 'develop' into feature/vue3
# Conflicts:
#	requirements.txt
2024-04-04 20:58:44 +02:00
vabene1111
dfd9f7b066 posprocessing hook for DRF 2024-03-30 11:01:37 +01:00
vabene1111
cb98b6723f first version of meal plan diaglo 2024-03-29 20:08:48 +01:00
vabene1111
dcf7d44d72 vueform mealplan dialog 2024-03-29 17:18:30 +01:00
vabene1111
369c460837 playing with vueforms 2024-03-29 14:38:22 +01:00
smilerz
e99ff005d6 added test to check for API pagination 2024-03-28 17:39:06 -05:00
vabene1111
c1d6e98349 playing with meal plan edit dialog 2024-03-28 16:44:20 +01:00
smilerz
497a4bbeb9 Merge pull request #3071 from smilerz/feature/vue3
rebuild APIs and vue apps
2024-03-28 09:44:14 -05:00
smilerz
f47c806ebd rebuild APIs and vue apps 2024-03-28 09:43:03 -05:00
smilerz
bb2a0eb642 Merge pull request #3070 from smilerz/feature/vue3
fix formatting on ci.yml
2024-03-28 09:18:11 -05:00
smilerz
28fd1917ec fix formatting on ci.yml 2024-03-28 09:16:41 -05:00
smilerz
cf0f7482f1 Merge pull request #3068 from smilerz/feature/vue3
Feature/vue3
2024-03-28 08:01:41 -05:00
smilerz
2475eadab9 Merge remote-tracking branch 'upstream/feature/vue3' into feature/vue3 2024-03-28 07:59:44 -05:00
smilerz
97cf2e6372 regen axios api 2024-03-28 07:47:50 -05:00
smilerz
2c12ce3edf added permissions to docs/api
added swagger api view
added authentication method to openapi schema
added logo to docs/api
fixed tree and merge schemas
2024-03-27 15:45:51 -05:00
smilerz
daf343c5fd convert TreeMixin and FuzzyFilterMixin to swagger schemas 2024-03-27 11:51:57 -05:00
smilerz
31eacad5fb WIP 2024-03-27 11:13:58 -05:00
smilerz
54e147ce8e regenerate openapi 2024-03-27 08:38:38 -05:00
smilerz
b217ac7ae7 update contribute.md with vue3 and typescript-fetch instructions 2024-03-27 08:38:38 -05:00
smilerz
0727a52b8a make update.bat executable on linux 2024-03-27 08:38:37 -05:00
smilerz
2c24017e96 remove custom QueryParams with extend_schema decorator 2024-03-27 08:38:37 -05:00
smilerz
0f5d37fc7c apply PK only update to NestedWritableSerializer 2024-03-27 08:38:36 -05:00
vabene1111
2b3e2039b8 playing with the timer 2024-03-27 08:38:36 -05:00
vabene1111
748518f567 number scaler 2024-03-27 08:38:36 -05:00
vabene1111
91980d91e8 lots of visual improvements 2024-03-27 08:38:35 -05:00
vabene1111
630f2fbf4e improved recipe card 2024-03-27 08:38:35 -05:00
vabene1111
394d7d73ed first overlay working 2024-03-27 08:38:34 -05:00
vabene1111
49a437b103 fixed meal plan window filter condition 2024-03-27 08:38:34 -05:00
c0mputerguru
15b38241da Add drf-spectacular parameter/response schema for meal plan retrieve ical API 2024-03-27 08:38:33 -05:00
c0mputerguru
e02594ba83 Add CSRF trusted origins to support github codespaces. 2024-03-27 08:38:33 -05:00
vabene1111
061fbfff65 meal plan in its own component 2024-03-27 08:38:32 -05:00
vabene1111
a5aa6d74b5 card skeleton loader improvement 2024-03-27 08:38:32 -05:00
vabene1111
8a9e150f64 recipe card 2024-03-27 08:38:32 -05:00
vabene1111
44a68bab71 meal plan store and start page widget 2024-03-27 08:38:31 -05:00
vabene1111
facbe08e20 start page taking shape 2024-03-27 08:38:31 -05:00
vabene1111
728bb76a43 improved start page 2024-03-27 08:38:30 -05:00
Anand Patel
bdd9ff796a Introduce ical action on MealPlanViewSet to expose ical format for listing meal plans. 2024-03-27 08:38:30 -05:00
vabene1111
77a46a4ef6 working on select components 2024-03-27 08:37:01 -05:00
vabene1111
a4225769f6 working on model select 2024-03-27 08:37:00 -05:00
vabene1111
cf74187be1 playing with generic select 2024-03-27 08:37:00 -05:00
vabene1111
454a05986c editor improvements 2024-03-27 08:37:00 -05:00
vabene1111
fa2fcf4f08 only apply keybind when visible 2024-03-27 08:36:59 -05:00
vabene1111
44d7f18428 more recipe editor 2024-03-27 08:36:59 -05:00
vabene1111
da60b4a097 improved global search dialog 2024-03-27 08:36:58 -05:00
vabene1111
40d460b458 servings 2024-03-27 08:36:58 -05:00
vabene1111
86652a8f1f cleanup 2024-03-27 08:36:57 -05:00
vabene1111
e4caf4169f first working number scaling 2024-03-27 08:36:57 -05:00
vabene1111
5cd7538ed5 markdown editor 2024-03-27 08:36:57 -05:00
vabene1111
bfbe19b49b very basic editor 2024-03-27 08:36:56 -05:00
vabene1111
45f8d2b1c8 general UI tweaks 2024-03-27 08:36:56 -05:00
vabene1111
8006d7663c start page 2024-03-27 08:36:55 -05:00
vabene1111
17f875863c working search with flat endpoint 2024-03-27 08:36:55 -05:00
vabene1111
4a8ad3db1e drf spectacular 2024-03-27 08:36:27 -05:00
vabene1111
71261fc767 basics of shopping 2024-03-27 08:35:17 -05:00
vabene1111
58d1c94b79 search tweaking 2024-03-27 08:35:16 -05:00
vabene1111
761b974aa5 recipe view timer 2024-03-27 08:35:16 -05:00
vabene1111
bd96a29200 v3 update 2024-03-27 08:35:15 -05:00
vabene1111
1427dd989f search 2024-03-27 08:35:15 -05:00
vabene1111
b4281aaf83 reverted .ts change in old vue 2024-03-27 08:35:15 -05:00
vabene1111
418821d8d3 saerch dialogh 2024-03-27 08:34:49 -05:00
vabene1111
22968495fd playing with search 2024-03-27 08:34:22 -05:00
vabene1111
ab3de1871c added some cooklog stuff 2024-03-27 08:34:22 -05:00
vabene1111
f691da53d7 steps 2024-03-27 08:34:21 -05:00
vabene1111
25887c0595 steps overview in recipe view 2024-03-27 08:34:21 -05:00
vabene1111
644be2d59b some more things in recipe view 2024-03-27 08:34:20 -05:00
vabene1111
3f880ef304 playing with navs 2024-03-27 08:34:20 -05:00
vabene1111
851cb28714 first few pieces 2024-03-27 08:34:19 -05:00
vabene1111
92b7439969 some basic views 2024-03-27 08:34:19 -05:00
vabene1111
257e886d87 more basics 2024-03-27 08:34:19 -05:00
vabene1111
89c6964e30 basic app sceleton 2024-03-27 08:34:18 -05:00
vabene1111
bb6356cfa8 first vue 3 commit 2024-03-27 08:34:18 -05:00
vabene1111
8728865b97 added captcha option to password reset form 2024-03-27 08:30:37 -05:00
vabene1111
62bfc6f7b0 added additional rate limiting to password reset 2024-03-27 08:29:42 -05:00
smilerz
54ad7db2c1 regenerate openapi 2024-03-27 08:20:26 -05:00
smilerz
ccbbebccef update contribute.md with vue3 and typescript-fetch instructions 2024-03-27 08:19:53 -05:00
smilerz
0a5b707fec make update.bat executable on linux 2024-03-27 08:19:27 -05:00
smilerz
fb3473459d remove custom QueryParams with extend_schema decorator 2024-03-27 08:18:50 -05:00
smilerz
d6929e5cf9 apply PK only update to NestedWritableSerializer 2024-03-27 08:17:20 -05:00
vabene1111
3207b69874 playing with the timer 2024-03-26 07:52:43 +01:00
vabene1111
bd317858bf number scaler 2024-03-23 21:57:42 +01:00
vabene1111
9d4c26fd29 lots of visual improvements 2024-03-23 21:11:59 +01:00
vabene1111
f0d0550251 improved recipe card 2024-03-22 16:30:37 +01:00
vabene1111
f132eacb83 first overlay working 2024-03-22 09:15:33 +01:00
vabene1111
b75e3a7848 fixed meal plan window filter condition 2024-03-21 16:14:50 +01:00
vabene1111
79a7e60cfc Merge branch 'feature/vue3' of https://github.com/vabene1111/recipes into feature/vue3 2024-03-21 14:59:51 +01:00
vabene1111
673c660d26 Merge pull request #3038 from c0mputerguru/ical-default-dates-new-api
Add ical action on MealPlanViewSet to expose filterable ical API in restful manner
2024-03-21 14:55:02 +01:00
vabene1111
8f03899302 Merge branch 'master' into feature/vue3 2024-03-21 14:54:25 +01:00
c0mputerguru
8ccd4b5045 Add drf-spectacular parameter/response schema for meal plan retrieve ical API 2024-03-18 17:41:12 +00:00
c0mputerguru
5b3207bc24 Add CSRF trusted origins to support github codespaces. 2024-03-18 17:33:02 +00:00
c0mputerguru
57314c56c8 Merge branch 'feature/vue3' into ical-default-dates-new-api 2024-03-18 09:34:25 -07:00
vabene1111
4cd1e0a4a5 meal plan in its own component 2024-03-18 16:26:40 +01:00
vabene1111
83e9a2bbfb card skeleton loader improvement 2024-03-18 15:58:48 +01:00
vabene1111
46d2b7730e recipe card 2024-03-18 15:46:34 +01:00
vabene1111
b7c2b5c294 meal plan store and start page widget 2024-03-17 11:45:39 +01:00
vabene1111
7b9d140e74 start page taking shape 2024-03-17 09:58:26 +01:00
vabene1111
0c6850d498 improved start page 2024-03-16 22:51:15 +01:00
Anand Patel
ffe02bf210 Introduce ical action on MealPlanViewSet to expose ical format for listing meal plans. 2024-03-16 05:28:16 +00:00
Anand Patel
e78dd305f3 Add pytest-xdist to allow debugging tests in vscode. 2024-03-16 04:15:46 +00:00
vabene1111
e12c83faf1 working on select components 2024-03-15 22:38:52 +01:00
vabene1111
05102d3842 Merge branch 'develop' into feature/vue3 2024-03-15 19:11:24 +01:00
vabene1111
18767c54ce working on model select 2024-03-11 19:46:37 +01:00
vabene1111
09dc35228f playing with generic select 2024-03-10 13:00:39 +01:00
vabene1111
312c215813 Merge branch 'develop' into feature/vue3
# Conflicts:
#	cookbook/urls.py
2024-03-09 14:34:44 +01:00
vabene1111
95583dbe2c editor improvements 2024-03-06 21:44:55 +01:00
vabene1111
cf20b22404 only apply keybind when visible 2024-03-06 20:29:41 +01:00
vabene1111
73ba5a591d more recipe editor 2024-03-05 21:46:50 +01:00
vabene1111
82ebeacea9 improved global search dialog 2024-03-05 20:43:18 +01:00
vabene1111
c0c71c3967 servings 2024-03-05 17:16:07 +01:00
vabene1111
aa5a87a1fc cleanup 2024-03-05 16:48:03 +01:00
vabene1111
302faa193a first working number scaling 2024-03-05 16:40:10 +01:00
vabene1111
9fe3eeb823 Merge branch 'master' into feature/vue3
# Conflicts:
#	requirements.txt
2024-03-05 14:45:53 +01:00
vabene1111
e0f7ce5de9 markdown editor 2024-03-02 10:15:39 +01:00
vabene1111
76eecedfb5 very basic editor 2024-03-02 08:52:29 +01:00
vabene1111
8f216a2791 general UI tweaks 2024-03-02 07:58:58 +01:00
vabene1111
75e3d826a0 Merge branch 'develop' into feature/vue3
# Conflicts:
#	.github/workflows/ci.yml
#	.gitignore
#	requirements.txt
2024-03-02 07:41:07 +01:00
vabene1111
a57b8f6081 start page 2024-02-29 21:28:44 +01:00
vabene1111
1cac34d2a0 working search with flat endpoint 2024-02-29 20:08:37 +01:00
vabene1111
e47bdd043e drf spectacular 2024-02-29 16:34:13 +01:00
vabene1111
521c71733a basics of shopping 2024-02-28 21:38:55 +01:00
vabene1111
963273853f search tweaking 2024-02-28 21:18:45 +01:00
vabene1111
c0c26a5a20 recipe view timer 2024-02-28 21:04:43 +01:00
vabene1111
b7533457de Merge branch 'develop' into feature/vue3 2024-02-28 20:21:15 +01:00
vabene1111
388a7ceb16 v3 update 2024-02-28 17:58:27 +01:00
vabene1111
8391365d05 search 2024-02-28 17:55:11 +01:00
vabene1111
6a7c3b472a Merge branch 'develop' into feature/vue3
# Conflicts:
#	recipes/settings.py
2024-02-28 17:25:14 +01:00
vabene1111
f9efe44e1d reverted .ts change in old vue 2024-02-28 17:17:35 +01:00
vabene1111
7817ed2f7e Merge branch 'develop' into feature/vue3
# Conflicts:
#	recipes/settings.py
#	vue/vue.config.js
2024-02-28 17:13:25 +01:00
vabene1111
79c71bd5d9 saerch dialogh 2024-02-26 21:54:38 +01:00
vabene1111
0ddb013e94 Merge branch 'develop' into feature/vue3
# Conflicts:
#	requirements.txt
2024-02-26 16:32:28 +01:00
vabene1111
3b2e75db1d playing with search 2024-02-25 17:10:40 +01:00
vabene1111
3c7fd0fa35 added some cooklog stuff 2024-02-24 13:44:20 +01:00
vabene1111
1e349214fe Merge branch 'develop' into feature/vue3
# Conflicts:
#	.gitignore
2024-02-24 13:18:52 +01:00
vabene1111
e689cef201 steps 2024-02-24 12:44:33 +01:00
vabene1111
f58d9e49d8 steps overview in recipe view 2024-02-24 12:16:24 +01:00
vabene1111
1b8d501208 Merge branch 'develop' into feature/vue3 2024-02-24 11:16:55 +01:00
vabene1111
1842bb7105 some more things in recipe view 2024-02-24 11:14:58 +01:00
vabene1111
d53706bd5d playing with navs 2024-02-22 22:19:00 +01:00
vabene1111
b0e01e13bf first few pieces 2024-02-21 22:06:07 +01:00
vabene1111
5587429475 some basic views 2024-02-21 20:18:54 +01:00
vabene1111
1e6e843e05 more basics 2024-02-21 18:09:51 +01:00
vabene1111
4972418dc5 basic app sceleton 2024-02-20 22:13:45 +01:00
vabene1111
1f39ed9d4e first vue 3 commit 2024-02-20 20:11:51 +01:00
1426 changed files with 261209 additions and 181969 deletions

View File

@@ -1,7 +1,7 @@
FROM python:3.10-alpine3.18
FROM python:3.13-alpine3.22
#Install all dependencies.
RUN apk add --no-cache postgresql-libs postgresql-client gettext zlib libjpeg libwebp libxml2-dev libxslt-dev openldap git yarn
RUN apk add --no-cache postgresql-libs postgresql-client gettext zlib libjpeg libwebp libxml2-dev libxslt-dev openldap git yarn libgcc libstdc++ nginx tini envsubst nodejs npm
#Print all logs without buffering it.
ENV PYTHONUNBUFFERED 1
@@ -19,8 +19,10 @@ RUN \
if [ `apk --print-arch` = "armv7" ]; then \
printf "[global]\nextra-index-url=https://www.piwheels.org/simple\n" > /etc/pip.conf ; \
fi
RUN apk add --no-cache --virtual .build-deps gcc musl-dev postgresql-dev zlib-dev jpeg-dev libwebp-dev openssl-dev libffi-dev cargo openldap-dev python3-dev && \
echo -n "INPUT ( libldap.so )" > /usr/lib/libldap_r.so && \
pip3 --disable-pip-version-check --no-cache-dir install -r /tmp/pip-tmp/requirements.txt && \
rm -rf /tmp/pip-tmp && \
RUN apk add --no-cache --virtual .build-deps gcc musl-dev postgresql-dev zlib-dev jpeg-dev libwebp-dev openssl-dev libffi-dev cargo openldap-dev python3-dev xmlsec-dev xmlsec build-base g++ curl rust && \
python -m pip install --upgrade pip && \
pip debug -v && \
pip install wheel==0.45.1 && \
pip install setuptools_rust==1.10.2 && \
pip install -r /tmp/pip-tmp/requirements.txt --no-cache-dir &&\
apk --purge del .build-deps

View File

@@ -20,6 +20,10 @@
"ms-python.python"
]
}
},
"containerEnv": {
"CSRF_TRUSTED_ORIGINS": "http://localhost:8000,http://localhost:8080"
}
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.

View File

@@ -29,3 +29,4 @@ vue/babel.config*
vue/package.json
vue/tsconfig.json
vue/src/utils/openapi
venv

View File

@@ -6,6 +6,9 @@
# random secret key, use for example `base64 /dev/urandom | head -c50` to generate one
SECRET_KEY=
# your default timezone See https://timezonedb.com/time-zones for a list of timezones
TZ=Europe/Berlin
# allowed hosts (see documentation), should be set to your hostname(s) but might be * (default) for some proxies/providers
# ALLOWED_HOSTS=recipes.mydomain.com

View File

@@ -16,7 +16,7 @@ updates:
interval: "monthly"
- package-ecosystem: "npm"
directory: "/vue/"
directory: "/vue3/"
schedule:
interval: "monthly"

View File

@@ -1,110 +0,0 @@
name: Build Docker Container with open data plugin installed
on: push
jobs:
build-container:
name: Build ${{ matrix.name }} Container
runs-on: ubuntu-latest
if: github.repository_owner == 'TandoorRecipes'
continue-on-error: ${{ matrix.continue-on-error }}
permissions:
contents: read
packages: write
strategy:
matrix:
include:
# Standard build config
- name: Standard
dockerfile: Dockerfile
platforms: linux/amd64,linux/arm64
suffix: ""
continue-on-error: false
steps:
- uses: actions/checkout@v4
- name: Get version number
id: get_version
run: |
if [[ "$GITHUB_REF" = refs/tags/* ]]; then
echo "VERSION=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_OUTPUT
elif [[ "$GITHUB_REF" = refs/heads/beta ]]; then
echo VERSION=beta >> $GITHUB_OUTPUT
else
echo VERSION=develop >> $GITHUB_OUTPUT
fi
# clone open data plugin
- name: clone open data plugin repo
uses: actions/checkout@master
with:
repository: TandoorRecipes/open_data_plugin
ref: master
path: ./recipes/plugins/open_data_plugin
# Build Vue frontend
- uses: actions/setup-node@v4
with:
node-version: '18'
cache: yarn
cache-dependency-path: vue/yarn.lock
- name: Install dependencies
working-directory: ./vue
run: yarn install --frozen-lockfile
- name: Build dependencies
working-directory: ./vue
run: yarn build
- name: Setup Open Data Plugin Links
working-directory: ./recipes/plugins/open_data_plugin
run: python setup_repo.py
- name: Build Open Data Frontend
working-directory: ./recipes/plugins/open_data_plugin/vue
run: yarn build
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@v3
if: github.secret_source == 'Actions'
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
if: github.secret_source == 'Actions'
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ github.token }}
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: |
vabene1111/recipes
ghcr.io/TandoorRecipes/recipes
flavor: |
latest=false
suffix=${{ matrix.suffix }}
tags: |
type=raw,value=latest,suffix=-open-data-plugin,enable=${{ startsWith(github.ref, 'refs/tags/') }}
type=semver,suffix=-open-data-plugin,pattern={{version}}
type=semver,suffix=-open-data-plugin,pattern={{major}}.{{minor}}
type=semver,suffix=-open-data-plugin,pattern={{major}}
type=ref,suffix=-open-data-plugin,event=branch
- name: Build and Push
uses: docker/build-push-action@v5
with:
context: .
file: ${{ matrix.dockerfile }}
pull: true
push: ${{ github.secret_source == 'Actions' }}
platforms: ${{ matrix.platforms }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max

View File

@@ -17,11 +17,11 @@ jobs:
# Standard build config
- name: Standard
dockerfile: Dockerfile
platforms: linux/amd64,linux/arm64,linux/arm/v7
platforms: linux/amd64,linux/arm64
suffix: ""
continue-on-error: false
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Get version number
id: get_version
@@ -34,17 +34,17 @@ jobs:
echo VERSION=develop >> $GITHUB_OUTPUT
fi
# Build Vue frontend
# Build Vue 3 frontend
- uses: actions/setup-node@v4
with:
node-version: '18'
node-version: '22'
cache: yarn
cache-dependency-path: vue/yarn.lock
cache-dependency-path: vue3/yarn.lock
- name: Install dependencies
working-directory: ./vue
working-directory: ./vue3
run: yarn install --frozen-lockfile
- name: Build dependencies
working-directory: ./vue
working-directory: ./vue3
run: yarn build
- name: Set up QEMU
@@ -107,7 +107,7 @@ jobs:
- name: Discord notification
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_RELEASE_WEBHOOK }}
uses: Ilshidur/action-discord@0.3.2
uses: Ilshidur/action-discord@0.4.0
with:
args: '🚀 Version {{ VERSION }} of tandoor has been released 🥳 Check it out https://github.com/vabene1111/recipes/releases/tag/{{ VERSION }}'
@@ -121,6 +121,6 @@ jobs:
- name: Discord notification
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_BETA_WEBHOOK }}
uses: Ilshidur/action-discord@0.3.2
uses: Ilshidur/action-discord@0.4.0
with:
args: '🚀 The BETA Image has been updated! 🥳'
args: '🚀 The Tandoor 2 Image has been updated! 🥳'

View File

@@ -9,14 +9,13 @@ jobs:
strategy:
max-parallel: 4
matrix:
python-version: ["3.10"]
node-version: ["18"]
python-version: ["3.12"]
node-version: ["22"]
steps:
- uses: actions/checkout@v4
- uses: awalsh128/cache-apt-pkgs-action@v1.4.2
- uses: actions/checkout@v5
- uses: awalsh128/cache-apt-pkgs-action@v1.5.3
with:
packages: libsasl2-dev python3-dev libldap2-dev libssl-dev
packages: libsasl2-dev python3-dev libxml2-dev libxmlsec1-dev libxslt-dev libxmlsec1-openssl libxslt-dev libldap2-dev libssl-dev gcc musl-dev postgresql-dev zlib-dev jpeg-dev libwebp-dev openssl-dev libffi-dev cargo openldap-dev python3-dev xmlsec-dev xmlsec build-base g++ curl
version: 1.0
# Setup python & dependencies
@@ -37,10 +36,9 @@ jobs:
with:
path: |
./cookbook/static
./vue/webpack-stats.json
./staticfiles
key: |
${{ runner.os }}-${{ matrix.python-version }}-${{ matrix.node-version }}-collectstatic-${{ hashFiles('**/*.css', '**/*.js', 'vue/src/*') }}
${{ runner.os }}-${{ matrix.python-version }}-${{ matrix.node-version }}-collectstatic-${{ hashFiles('**/*.css', '**/*.js', 'vue3/src/*') }}
# Build Vue frontend & Dependencies
- name: Set up Node ${{ matrix.node-version }}
@@ -49,30 +47,28 @@ jobs:
with:
node-version: ${{ matrix.node-version }}
cache: "yarn"
cache-dependency-path: ./vue/yarn.lock
cache-dependency-path: ./vue3/yarn.lock
- name: Install Vue dependencies
if: steps.django_cache.outputs.cache-hit != 'true'
working-directory: ./vue
working-directory: ./vue3
run: yarn install
- name: Build Vue dependencies
if: steps.django_cache.outputs.cache-hit != 'true'
working-directory: ./vue
working-directory: ./vue3
run: yarn build
- name: Compile Django StaticFiles
if: steps.django_cache.outputs.cache-hit != 'true'
run: |
python3 manage.py collectstatic --noinput
python3 manage.py collectstatic_js_reverse
- uses: actions/cache/save@v4
if: steps.django_cache.outputs.cache-hit != 'true'
with:
path: |
./cookbook/static
./vue/webpack-stats.json
./staticfiles
key: |
${{ runner.os }}-${{ matrix.python-version }}-${{ matrix.node-version }}-collectstatic-${{ hashFiles('**/*.css', '**/*.js', 'vue/src/*') }}

View File

@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
# We must fetch at least the immediate parents so that if this is
# a pull request then we can checkout the head.

View File

@@ -12,7 +12,7 @@ jobs:
if: github.repository_owner == 'TandoorRecipes' && ${{ github.event.workflow_run.conclusion == 'success' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: actions/setup-python@v5
with:
python-version: 3.x

12
.gitignore vendored
View File

@@ -75,8 +75,10 @@ cookbook/static/vue
vue/webpack-stats.json
/docker-compose.override.yml
vue/node_modules
plugins
vue3/node_modules
/recipes/plugins
vetur.config.js
cookbook/static/vue
vue/webpack-stats.json
cookbook/templates/sw.js
vue/.yarn
vue3/.vite
@@ -84,3 +86,9 @@ vue3/.vite
# Configs
vetur.config.js
venv/
.idea/easy-i18n.xml
cookbook/static/vue3
vue3/node_modules
cookbook/tests/other/docs/reports/tests/tests.html
cookbook/tests/other/docs/reports/tests/pytest.xml
vue3/src/plugins

6
.idea/prettier.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="PrettierConfiguration">
<option name="myConfigurationMode" value="AUTOMATIC" />
</component>
</project>

2
.idea/recipes.iml generated
View File

@@ -18,7 +18,7 @@
<excludeFolder url="file://$MODULE_DIR$/staticfiles" />
<excludeFolder url="file://$MODULE_DIR$/venv" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="jdk" jdkName="Python 3.12 (recipes)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="TemplatesService">

2
.idea/vcs.xml generated
View File

@@ -2,5 +2,7 @@
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
<mapping directory="$PROJECT_DIR$/recipes/plugins/enterprise_plugin" vcs="Git" />
<mapping directory="$PROJECT_DIR$/recipes/plugins/open_data_plugin" vcs="Git" />
</component>
</project>

62
.idea/watcherTasks.xml generated
View File

@@ -5,7 +5,7 @@
<option name="arguments" value="-m flake8 $FilePath$ --config $ContentRoot$\.flake8" />
<option name="checkSyntaxErrors" value="true" />
<option name="description" />
<option name="exitCodeBehavior" value="ALWAYS" />
<option name="exitCodeBehavior" value="NEVER" />
<option name="fileExtension" value="py" />
<option name="immediateSync" value="false" />
<option name="name" value="Flake8 Watcher" />
@@ -27,5 +27,65 @@
<option name="workingDir" value="" />
<envs />
</TaskOptions>
<TaskOptions isEnabled="false">
<option name="arguments" value="-m isort $FilePath$" />
<option name="checkSyntaxErrors" value="true" />
<option name="description" />
<option name="exitCodeBehavior" value="ERROR" />
<option name="fileExtension" value="py" />
<option name="immediateSync" value="false" />
<option name="name" value="isort Watcher" />
<option name="output" value="$FilePath$" />
<option name="outputFilters">
<array />
</option>
<option name="outputFromStdout" value="false" />
<option name="program" value="$PyInterpreterDirectory$/python" />
<option name="runOnExternalChanges" value="false" />
<option name="scopeName" value="Project Files" />
<option name="trackOnlyRoot" value="false" />
<option name="workingDir" value="" />
<envs />
</TaskOptions>
<TaskOptions isEnabled="false">
<option name="arguments" value="-m yapf -i $FilePath$" />
<option name="checkSyntaxErrors" value="true" />
<option name="description" />
<option name="exitCodeBehavior" value="NEVER" />
<option name="fileExtension" value="py" />
<option name="immediateSync" value="false" />
<option name="name" value="YAPF" />
<option name="output" value="$FilePath$" />
<option name="outputFilters">
<array />
</option>
<option name="outputFromStdout" value="false" />
<option name="program" value="$PyInterpreterDirectory$/python" />
<option name="runOnExternalChanges" value="false" />
<option name="scopeName" value="Project Files" />
<option name="trackOnlyRoot" value="false" />
<option name="workingDir" value="" />
<envs />
</TaskOptions>
<TaskOptions isEnabled="false">
<option name="arguments" value="--cwd $ProjectFileDir$\vue prettier -w --config $ProjectFileDir$\.prettierrc $FilePath$" />
<option name="checkSyntaxErrors" value="true" />
<option name="description" />
<option name="exitCodeBehavior" value="ERROR" />
<option name="fileExtension" value="*" />
<option name="immediateSync" value="true" />
<option name="name" value="Prettier" />
<option name="output" value="" />
<option name="outputFilters">
<array />
</option>
<option name="outputFromStdout" value="false" />
<option name="program" value="yarn" />
<option name="runOnExternalChanges" value="true" />
<option name="scopeName" value="Prettier" />
<option name="trackOnlyRoot" value="false" />
<option name="workingDir" value="" />
<envs />
</TaskOptions>
</component>
</project>

2
.vscode/launch.json vendored
View File

@@ -24,7 +24,7 @@
"console": "integratedTerminal",
"env": {
// coverage and pytest can't both be running at the same time
"PYTEST_ADDOPTS": "--no-cov"
"PYTEST_ADDOPTS": "--no-cov -n 0"
},
"django": true,
"justMyCode": true

154
.vscode/tasks.json vendored
View File

@@ -1,75 +1,83 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "Run Migrations",
"type": "shell",
"command": "python3 manage.py migrate",
},
{
"label": "Collect Static Files",
"type": "shell",
"command": "python3 manage.py collectstatic",
"dependsOn": ["Yarn Build"],
},
{
"label": "Setup Dev Server",
"dependsOn": ["Run Migrations", "Yarn Build"],
},
{
"label": "Run Dev Server",
"type": "shell",
"dependsOn": ["Setup Dev Server"],
"command": "python3 manage.py runserver",
},
{
"label": "Yarn Install",
"type": "shell",
"command": "yarn install",
"options": {
"cwd": "${workspaceFolder}/vue"
}
},
{
"label": "Yarn Serve",
"type": "shell",
"command": "yarn serve",
"dependsOn": ["Yarn Install"],
"options": {
"cwd": "${workspaceFolder}/vue"
}
},
{
"label": "Yarn Build",
"type": "shell",
"command": "yarn build",
"dependsOn": ["Yarn Install"],
"options": {
"cwd": "${workspaceFolder}/vue"
},
"group": "build",
},
{
"label": "Setup Tests",
"dependsOn": ["Run Migrations", "Collect Static Files"],
},
{
"label": "Run all pytests",
"type": "shell",
"command": "python3 -m pytest cookbook/tests",
"dependsOn": ["Setup Tests"],
"group": "test",
},
{
"label": "Setup Documentation Dependencies",
"type": "shell",
"command": "pip install mkdocs-material mkdocs-include-markdown-plugin",
},
{
"label": "Serve Documentation",
"type": "shell",
"command": "mkdocs serve",
"dependsOn": ["Setup Documentation Dependencies"],
"version": "2.0.0",
"tasks": [
{
"label": "Run Migrations",
"type": "shell",
"command": "python3 manage.py migrate"
},
{
"label": "Collect Static Files",
"type": "shell",
"command": "python3 manage.py collectstatic",
"dependsOn": ["Yarn Build"]
},
{
"label": "Setup Dev Server",
"dependsOn": ["Run Migrations"]
},
{
"label": "Run Dev Server",
"type": "shell",
"dependsOn": ["Setup Dev Server"],
"command": "DEBUG=1 python3 manage.py runserver"
},
{
"label": "Yarn Install",
"type": "shell",
"command": "yarn install --force",
"options": {
"cwd": "${workspaceFolder}/vue3"
}
]
}
},
{
"label": "Generate API",
"type": "shell",
"command": "openapi-generator-cli generate -g typescript-fetch -i http://127.0.0.1:8000/openapi/",
"options": {
"cwd": "${workspaceFolder}/vue3/src/openapi"
}
},
{
"label": "Yarn Dev",
"type": "shell",
"command": "yarn dev",
"dependsOn": ["Yarn Install"],
"options": {
"cwd": "${workspaceFolder}/vue3"
}
},
{
"label": "Yarn Build",
"type": "shell",
"command": "yarn build",
"dependsOn": ["Yarn Install"],
"options": {
"cwd": "${workspaceFolder}/vue3"
},
"group": "build"
},
{
"label": "Setup Tests",
"dependsOn": ["Run Migrations", "Collect Static Files"]
},
{
"label": "Run all pytests",
"type": "shell",
"command": "python3 -m pytest cookbook/tests",
"dependsOn": ["Setup Tests"],
"group": "test"
},
{
"label": "Setup Documentation Dependencies",
"type": "shell",
"command": "pip install mkdocs-material mkdocs-include-markdown-plugin"
},
{
"label": "Serve Documentation",
"type": "shell",
"command": "mkdocs serve",
"dependsOn": ["Setup Documentation Dependencies"]
}
]
}

View File

@@ -1,15 +1,14 @@
FROM python:3.12-alpine3.19
FROM python:3.13-alpine3.22
#Install all dependencies.
RUN apk add --no-cache postgresql-libs postgresql-client gettext zlib libjpeg libwebp libxml2-dev libxslt-dev openldap git
RUN apk add --no-cache postgresql-libs postgresql-client gettext zlib libjpeg libwebp libxml2-dev libxslt-dev openldap git libgcc libstdc++ nginx tini envsubst nodejs npm
#Print all logs without buffering it.
ENV PYTHONUNBUFFERED 1
ENV DOCKER true
ENV PYTHONUNBUFFERED=1 \
DOCKER=true
#This port will be used by gunicorn.
EXPOSE 8080
EXPOSE 80 8080
#Create app dir and install requirements.
RUN mkdir /opt/recipes
@@ -17,28 +16,38 @@ WORKDIR /opt/recipes
COPY requirements.txt ./
RUN \
if [ `apk --print-arch` = "armv7" ]; then \
printf "[global]\nextra-index-url=https://www.piwheels.org/simple\n" > /etc/pip.conf ; \
fi
# remove Development dependencies from requirements.txt
RUN sed -i '/# Development/,$d' requirements.txt
RUN apk add --no-cache --virtual .build-deps gcc musl-dev postgresql-dev zlib-dev jpeg-dev libwebp-dev openssl-dev libffi-dev cargo openldap-dev python3-dev && \
echo -n "INPUT ( libldap.so )" > /usr/lib/libldap_r.so && \
RUN apk add --no-cache --virtual .build-deps gcc musl-dev postgresql-dev zlib-dev jpeg-dev libwebp-dev openssl-dev libffi-dev cargo openldap-dev python3-dev xmlsec-dev xmlsec build-base g++ curl rust && \
python -m venv venv && \
/opt/recipes/venv/bin/python -m pip install --upgrade pip && \
venv/bin/pip install wheel==0.42.0 && \
venv/bin/pip install setuptools_rust==1.9.0 && \
venv/bin/pip debug -v && \
venv/bin/pip install wheel==0.45.1 && \
venv/bin/pip install setuptools_rust==1.10.2 && \
venv/bin/pip install -r requirements.txt --no-cache-dir &&\
apk --purge del .build-deps
#Copy project and execute it.
COPY . ./
# delete default nginx config and link it to tandoors config
# create symlinks to access and error log to show them on stdout
RUN rm -rf /etc/nginx/http.d && \
ln -s /opt/recipes/http.d /etc/nginx/http.d && \
ln -sf /dev/stdout /var/log/nginx/access.log && \
ln -sf /dev/stderr /var/log/nginx/error.log
# commented for now https://github.com/TandoorRecipes/recipes/issues/3478
#HEALTHCHECK --interval=30s \
# --timeout=5s \
# --start-period=10s \
# --retries=3 \
# CMD [ "/usr/bin/wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1:8080/openapi" ]
# collect information from git repositories
RUN /opt/recipes/venv/bin/python version.py
# delete git repositories to reduce image size
RUN find . -type d -name ".git" | xargs rm -rf
RUN chmod +x boot.sh
ENTRYPOINT ["/opt/recipes/boot.sh"]
ENTRYPOINT ["/sbin/tini", "--", "/opt/recipes/boot.sh"]

View File

@@ -15,14 +15,15 @@
<a href="https://discord.gg/RhzBrfWgtp" target="_blank" rel="noopener noreferrer"><img src="https://badgen.net/badge/icon/discord?icon=discord&label" ></a>
<a href="https://hub.docker.com/r/vabene1111/recipes" target="_blank" rel="noopener noreferrer"><img src="https://img.shields.io/docker/pulls/vabene1111/recipes" ></a>
<a href="https://github.com/vabene1111/recipes/releases/latest" rel="noopener noreferrer"><img src="https://img.shields.io/github/v/release/vabene1111/recipes" ></a>
<a href="https://app.tandoor.dev/accounts/login/?demo" rel="noopener noreferrer"><img src="https://img.shields.io/badge/demo-available-success" ></a>
<a href="https://app.tandoor.dev/e/demo-auto-login/" rel="noopener noreferrer"><img src="https://img.shields.io/badge/demo-available-success" ></a>
</p>
<p align="center">
<a href="https://tandoor.dev" target="_blank" rel="noopener noreferrer">Website</a> •
<a href="https://docs.tandoor.dev/install/docker/" target="_blank" rel="noopener noreferrer">Installation</a> •
<a href="https://docs.tandoor.dev/" target="_blank" rel="noopener noreferrer">Docs</a> •
<a href="https://app.tandoor.dev/accounts/login/?demo" target="_blank" rel="noopener noreferrer">Demo</a> •
<a href="https://app.tandoor.dev/e/demo-auto-login/" target="_blank" rel="noopener noreferrer">Demo</a> •
<a href="https://community.tandoor.dev" target="_blank" rel="noopener noreferrer">Community</a> •
<a href="https://discord.gg/RhzBrfWgtp" target="_blank" rel="noopener noreferrer">Discord</a>
</p>
@@ -81,13 +82,13 @@ Share some information on how you use Tandoor to help me improve the application
<table>
<tr>
<td><a href="https://discord.gg/RhzBrfWgtp">Discord</a></td>
<td>We have a public Discord server that anyone can join. This is where all our developers and contributors hang out and where we make announcements</td>
<td><a href="https://community.tandoor.dev">Community</a></td>
<td>Get support, share best practices, discuss feature ideas, and meet other Tandoor users.</td>
</tr>
<tr>
<td><a href="https://twitter.com/TandoorRecipes">Twitter</a></td>
<td>You can follow our Twitter account to get updates on new features or releases</td>
<td><a href="https://discord.gg/RhzBrfWgtp">Discord</a></td>
<td>We have a public Discord server that anyone can join. This is where all our developers and contributors hang out and where we make announcements</td>
</tr>
</table>

53
boot.sh Normal file → Executable file
View File

@@ -1,11 +1,21 @@
#!/bin/sh
source venv/bin/activate
TANDOOR_PORT="${TANDOOR_PORT:-8080}"
# these are envsubst in the nginx config, make sure they default to something sensible when unset
export TANDOOR_PORT="${TANDOOR_PORT:-8080}"
export MEDIA_ROOT=${MEDIA_ROOT:-/opt/recipes/mediafiles};
export STATIC_ROOT=${STATIC_ROOT:-/opt/recipes/staticfiles};
GUNICORN_WORKERS="${GUNICORN_WORKERS:-3}"
GUNICORN_THREADS="${GUNICORN_THREADS:-2}"
GUNICORN_LOG_LEVEL="${GUNICORN_LOG_LEVEL:-'info'}"
NGINX_CONF_FILE=/opt/recipes/nginx/conf.d/Recipes.conf
PLUGINS_BUILD="${PLUGINS_BUILD:-0}"
if [ "${TANDOOR_PORT}" -eq 80 ]; then
echo "TANDOOR_PORT set to 8080 because 80 is now taken by the integrated nginx"
TANDOOR_PORT=8080
fi
display_warning() {
echo "[WARNING]"
@@ -14,11 +24,6 @@ display_warning() {
echo "Checking configuration..."
# Nginx config file must exist if gunicorn is not active
if [ ! -f "$NGINX_CONF_FILE" ] && [ $GUNICORN_MEDIA -eq 0 ]; then
display_warning "Nginx configuration file could not be found at the default location!\nPath: ${NGINX_CONF_FILE}"
fi
# SECRET_KEY (or a valid file at SECRET_KEY_FILE) must be set in .env file
if [ -f "${SECRET_KEY_FILE}" ]; then
@@ -29,6 +34,21 @@ if [ -z "${SECRET_KEY}" ]; then
display_warning "The environment variable 'SECRET_KEY' (or 'SECRET_KEY_FILE' that points to an existing file) is not set but REQUIRED for running Tandoor!"
fi
if [ -f "${AUTH_LDAP_BIND_PASSWORD_FILE}" ]; then
export AUTH_LDAP_BIND_PASSWORD=$(cat "$AUTH_LDAP_BIND_PASSWORD_FILE")
fi
if [ -f "${EMAIL_HOST_PASSWORD_FILE}" ]; then
export EMAIL_HOST_PASSWORD=$(cat "$EMAIL_HOST_PASSWORD_FILE")
fi
if [ -f "${SOCIALACCOUNT_PROVIDERS_FILE}" ]; then
export SOCIALACCOUNT_PROVIDERS=$(cat "$SOCIALACCOUNT_PROVIDERS_FILE")
fi
if [ -f "${S3_SECRET_ACCESS_KEY_FILE}" ]; then
export S3_SECRET_ACCESS_KEY=$(cat "$S3_SECRET_ACCESS_KEY_FILE")
fi
echo "Waiting for database to be ready..."
@@ -64,23 +84,34 @@ echo "Database is ready"
echo "Migrating database"
python manage.py migrate
if [ "${PLUGINS_BUILD}" -eq 1 ]; then
echo "Running yarn build at startup because PLUGINS_BUILD is enabled"
python plugin.py
fi
echo "Collecting static files, this may take a while..."
python manage.py collectstatic_js_reverse
python manage.py collectstatic --noinput
echo "Done"
chmod -R 755 /opt/recipes/mediafiles
chmod -R 755 ${MEDIA_ROOT:-/opt/recipes/mediafiles}
ipv6_disable=$(cat /sys/module/ipv6/parameters/disable)
# prepare nginx config
envsubst '$MEDIA_ROOT $STATIC_ROOT $TANDOOR_PORT' < /opt/recipes/http.d/Recipes.conf.template > /opt/recipes/http.d/Recipes.conf
# start nginx
echo "Starting nginx"
nginx
echo "Starting gunicorn"
# Check if IPv6 is enabled, only then run gunicorn with ipv6 support
if [ "$ipv6_disable" -eq 0 ]; then
exec gunicorn -b "[::]:$TANDOOR_PORT" --workers $GUNICORN_WORKERS --threads $GUNICORN_THREADS --access-logfile - --error-logfile - --log-level $GUNICORN_LOG_LEVEL recipes.wsgi
else
exec gunicorn -b ":$TANDOOR_PORT" --workers $GUNICORN_WORKERS --threads $GUNICORN_THREADS --access-logfile - --error-logfile - --log-level $GUNICORN_LOG_LEVEL recipes.wsgi
fi
fi

View File

@@ -7,16 +7,19 @@ from django.utils import translation
from django_scopes import scopes_disabled
from treebeard.admin import TreeAdmin
from treebeard.forms import movenodeform_factory
from allauth.account.decorators import secure_admin_login
from cookbook.managers import DICTIONARY
from .models import (BookmarkletImport, Comment, CookLog, Food, ImportLog, Ingredient, InviteLink,
from .models import (BookmarkletImport, Comment, CookLog, CustomFilter, Food, ImportLog, Ingredient, InviteLink,
Keyword, MealPlan, MealType, NutritionInformation, Property, PropertyType,
Recipe, RecipeBook, RecipeBookEntry, RecipeImport, SearchPreference, ShareLink,
ShoppingListEntry, ShoppingListRecipe, Space, Step, Storage,
Supermarket, SupermarketCategory, SupermarketCategoryRelation, Sync, SyncLog,
TelegramBot, Unit, UnitConversion, UserFile, UserPreference, UserSpace,
ViewLog, ConnectorConfig)
ViewLog, ConnectorConfig, AiProvider, AiLog)
admin.site.login = secure_admin_login(admin.site.login)
class CustomUserAdmin(UserAdmin):
@@ -87,6 +90,20 @@ class SearchPreferenceAdmin(admin.ModelAdmin):
admin.site.register(SearchPreference, SearchPreferenceAdmin)
class AiProviderAdmin(admin.ModelAdmin):
list_display = ('name', 'space', 'model',)
search_fields = ('name', 'space', 'model',)
admin.site.register(AiProvider, AiProviderAdmin)
class AiLogAdmin(admin.ModelAdmin):
list_display = ('ai_provider', 'function', 'credit_cost', 'created_by', 'created_at',)
admin.site.register(AiLog, AiLogAdmin)
class StorageAdmin(admin.ModelAdmin):
list_display = ('name', 'method')
search_fields = ('name',)
@@ -103,6 +120,13 @@ class ConnectorConfigAdmin(admin.ModelAdmin):
admin.site.register(ConnectorConfig, ConnectorConfigAdmin)
class CustomFilterAdmin(admin.ModelAdmin):
list_display = ('id', 'type', 'name')
admin.site.register(CustomFilter, CustomFilterAdmin)
class SyncAdmin(admin.ModelAdmin):
list_display = ('storage', 'path', 'active', 'last_checked')
search_fields = ('storage__name', 'path')

View File

@@ -16,15 +16,11 @@ class CookbookConfig(AppConfig):
import cookbook.signals # noqa
if not settings.DISABLE_EXTERNAL_CONNECTORS:
try:
from cookbook.connectors.connector_manager import ConnectorManager # Needs to be here to prevent loading race condition of oauth2 modules in models.py
handler = ConnectorManager()
post_save.connect(handler, dispatch_uid="connector_manager")
post_delete.connect(handler, dispatch_uid="connector_manager")
except Exception as e:
traceback.print_exc()
print('Failed to initialize connectors')
pass
from cookbook.connectors.connector_manager import ConnectorManager # Needs to be here to prevent loading race condition of oauth2 modules in models.py
handler = ConnectorManager()
post_save.connect(handler, dispatch_uid="post_save-connector_manager")
post_delete.connect(handler, dispatch_uid="post_delete-connector_manager")
# if not settings.DISABLE_TREE_FIX_STARTUP:
# # when starting up run fix_tree to:
# # a) make sure that nodes are sorted when switching between sort modes
@@ -45,4 +41,4 @@ class CookbookConfig(AppConfig):
# except Exception:
# if DEBUG:
# traceback.print_exc()
# pass # dont break startup just because fix could not run, need to investigate cases when this happens
# pass # dont break startup just because fix could not run, need to investigate cases when this happens

View File

@@ -1,6 +1,43 @@
from abc import ABC, abstractmethod
from dataclasses import dataclass
from typing import Optional
from cookbook.models import ShoppingListEntry, Space, ConnectorConfig
from cookbook.models import ShoppingListEntry, User, ConnectorConfig
@dataclass
class UserDTO:
username: str
first_name: Optional[str]
@staticmethod
def create_from_user(instance: User) -> 'UserDTO':
return UserDTO(
username=instance.username,
first_name=instance.first_name if instance.first_name else None
)
@dataclass
class ShoppingListEntryDTO:
food_name: str
amount: Optional[float]
base_unit: Optional[str]
unit_name: Optional[str]
created_by: UserDTO
@staticmethod
def try_create_from_entry(instance: ShoppingListEntry) -> Optional['ShoppingListEntryDTO']:
if instance.food is None or instance.created_by is None:
return None
return ShoppingListEntryDTO(
food_name=instance.food.name,
amount=instance.amount if instance.amount else None,
unit_name=instance.unit.name if instance.unit else None,
base_unit=instance.unit.base_unit if instance.unit and instance.unit.base_unit else None,
created_by=UserDTO.create_from_user(instance.created_by),
)
# A Connector is 'destroyed' & recreated each time 'any' ConnectorConfig in a space changes.
@@ -10,20 +47,18 @@ class Connector(ABC):
pass
@abstractmethod
async def on_shopping_list_entry_created(self, space: Space, instance: ShoppingListEntry) -> None:
async def on_shopping_list_entry_created(self, instance: ShoppingListEntryDTO) -> None:
pass
# This method might not trigger on 'direct' entry updates: https://stackoverflow.com/a/35238823
@abstractmethod
async def on_shopping_list_entry_updated(self, space: Space, instance: ShoppingListEntry) -> None:
async def on_shopping_list_entry_updated(self, instance: ShoppingListEntryDTO) -> None:
pass
@abstractmethod
async def on_shopping_list_entry_deleted(self, space: Space, instance: ShoppingListEntry) -> None:
async def on_shopping_list_entry_deleted(self, instance: ShoppingListEntryDTO) -> None:
pass
@abstractmethod
async def close(self) -> None:
pass
# TODO: Add Recipes & possibly Meal Place listeners/hooks (And maybe more?)

View File

@@ -12,7 +12,7 @@ from typing import List, Any, Dict, Optional, Type
from django.conf import settings
from django_scopes import scope
from cookbook.connectors.connector import Connector
from cookbook.connectors.connector import Connector, ShoppingListEntryDTO
from cookbook.connectors.homeassistant import HomeAssistant
from cookbook.models import ShoppingListEntry, Space, ConnectorConfig
@@ -31,6 +31,15 @@ class Work:
actionType: ActionType
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
# The way ConnectionManager works is as follows:
# 1. On init, it starts a worker & creates a queue for 'Work'
# 2. Then any time its called, it verifies the type of action (create/update/delete) and if the item is of interest, pushes the Work (non-blocking) to the queue.
@@ -39,22 +48,21 @@ class Work:
# 3.2 If work is of type REGISTERED_CLASSES, it asynchronously fires of all connectors and wait for them to finish (runtime should depend on the 'slowest' connector)
# 4. Work is marked as consumed, and next entry of the queue is consumed.
# Each 'Work' is processed in sequential by the worker, so the throughput is about [workers * the slowest connector]
class ConnectorManager:
# The Singleton class is used for ConnectorManager to have a self-reference and so Python does not garbage collect it
class ConnectorManager(metaclass=Singleton):
_logger: Logger
_queue: queue.Queue
_listening_to_classes = REGISTERED_CLASSES | ConnectorConfig
def __init__(self):
self._logger = logging.getLogger("recipes.connector")
self._logger.debug("ConnectorManager initializing")
self._queue = queue.Queue(maxsize=settings.EXTERNAL_CONNECTORS_QUEUE_SIZE)
self._worker = threading.Thread(target=self.worker, args=(0, self._queue,), daemon=True)
self._worker.start()
# Called by post save & post delete signals
def __call__(self, instance: Any, **kwargs) -> None:
if not isinstance(instance, self._listening_to_classes) or not hasattr(instance, "space"):
return
action_type: ActionType
if "created" in kwargs and kwargs["created"]:
action_type = ActionType.CREATED
@@ -65,16 +73,37 @@ class ConnectorManager:
else:
return
try:
self._queue.put_nowait(Work(instance, action_type))
except queue.Full:
self._logger.info(f"queue was full, so skipping {action_type} of type {type(instance)}")
return
self._add_work(action_type, instance)
def _add_work(self, action_type: ActionType, *instances: REGISTERED_CLASSES):
for instance in instances:
if not isinstance(instance, self._listening_to_classes) or not hasattr(instance, "space"):
continue
try:
_force_load_instance(instance)
self._queue.put_nowait(Work(instance, action_type))
except queue.Full:
self._logger.info(f"queue was full, so skipping {action_type} of type {type(instance)}")
def stop(self):
self._queue.join()
self._worker.join()
@classmethod
def is_initialized(cls):
return cls in cls._instances
@staticmethod
def add_work(action_type: ActionType, *instances: REGISTERED_CLASSES):
"""
Manually inject work that failed to come in through the __call__ (aka Django signal)
Before the work is processed, we check if the connectionManager is initialized, because if it's not, we don't want to accidentally initialize it.
Be careful calling it, because it might result in a instance being processed twice.
"""
if not ConnectorManager.is_initialized():
return
ConnectorManager()._add_work(action_type, *instances)
@staticmethod
def worker(worker_id: int, worker_queue: queue.Queue):
logger = logging.getLogger("recipes.connector.worker")
@@ -106,7 +135,7 @@ class ConnectorManager:
if connectors is None or refresh_connector_cache:
if connectors is not None:
loop.run_until_complete(close_connectors(connectors))
loop.run_until_complete(_close_connectors(connectors))
with scope(space=space):
connectors: List[Connector] = list()
@@ -132,7 +161,7 @@ class ConnectorManager:
logger.debug(f"running {len(connectors)} connectors for {item.instance=} with {item.actionType=}")
loop.run_until_complete(run_connectors(connectors, space, item.instance, item.actionType))
loop.run_until_complete(run_connectors(connectors, item.instance, item.actionType))
worker_queue.task_done()
logger.info(f"terminating ConnectionManager worker {worker_id}")
@@ -149,7 +178,14 @@ class ConnectorManager:
return None
async def close_connectors(connectors: List[Connector]):
def _force_load_instance(instance: REGISTERED_CLASSES):
if isinstance(instance, ShoppingListEntry):
_ = instance.food # Force load food
_ = instance.unit # Force load unit
_ = instance.created_by # Force load created_by
async def _close_connectors(connectors: List[Connector]):
tasks: List[Task] = [asyncio.create_task(connector.close()) for connector in connectors]
if len(tasks) == 0:
@@ -161,22 +197,24 @@ async def close_connectors(connectors: List[Connector]):
logging.exception("received an exception while closing one of the connectors")
async def run_connectors(connectors: List[Connector], space: Space, instance: REGISTERED_CLASSES, action_type: ActionType):
async def run_connectors(connectors: List[Connector], instance: REGISTERED_CLASSES, action_type: ActionType):
tasks: List[Task] = list()
if isinstance(instance, ShoppingListEntry):
shopping_list_entry: ShoppingListEntry = instance
shopping_list_entry = ShoppingListEntryDTO.try_create_from_entry(instance)
if shopping_list_entry is None:
return
match action_type:
case ActionType.CREATED:
for connector in connectors:
tasks.append(asyncio.create_task(connector.on_shopping_list_entry_created(space, shopping_list_entry)))
tasks.append(asyncio.create_task(connector.on_shopping_list_entry_created(shopping_list_entry)))
case ActionType.UPDATED:
for connector in connectors:
tasks.append(asyncio.create_task(connector.on_shopping_list_entry_updated(space, shopping_list_entry)))
tasks.append(asyncio.create_task(connector.on_shopping_list_entry_updated(shopping_list_entry)))
case ActionType.DELETED:
for connector in connectors:
tasks.append(asyncio.create_task(connector.on_shopping_list_entry_deleted(space, shopping_list_entry)))
tasks.append(asyncio.create_task(connector.on_shopping_list_entry_deleted(shopping_list_entry)))
if len(tasks) == 0:
return

View File

@@ -3,10 +3,10 @@ from logging import Logger
from typing import Dict, Tuple
from urllib.parse import urljoin
from aiohttp import ClientError, request
from aiohttp import request, ClientResponseError
from cookbook.connectors.connector import Connector
from cookbook.models import ShoppingListEntry, ConnectorConfig, Space
from cookbook.connectors.connector import Connector, ShoppingListEntryDTO
from cookbook.models import ConnectorConfig
class HomeAssistant(Connector):
@@ -32,42 +32,39 @@ class HomeAssistant(Connector):
response.raise_for_status()
return await response.json()
async def on_shopping_list_entry_created(self, space: Space, shopping_list_entry: ShoppingListEntry) -> None:
async def on_shopping_list_entry_created(self, shopping_list_entry: ShoppingListEntryDTO) -> None:
if not self._config.on_shopping_list_entry_created_enabled:
return
item, description = _format_shopping_list_entry(shopping_list_entry)
self._logger.debug(f"adding {item=}")
self._logger.debug(f"adding {item=} with {description=} to {self._config.todo_entity}")
data = {
"entity_id": self._config.todo_entity,
"item": item,
"description": description,
}
if self._config.supports_description_field:
data["description"] = description
try:
await self.homeassistant_api_call("POST", "services/todo/add_item", data)
except ClientError as err:
self._logger.warning(f"received an exception from the api: {err=}, {type(err)=}")
except ClientResponseError as err:
self._logger.warning(f"received an exception from the api: {err.request_info.url=}, {err.request_info.method=}, {err.status=}, {err.message=}, {type(err)=}")
async def on_shopping_list_entry_updated(self, space: Space, shopping_list_entry: ShoppingListEntry) -> None:
async def on_shopping_list_entry_updated(self, shopping_list_entry: ShoppingListEntryDTO) -> None:
if not self._config.on_shopping_list_entry_updated_enabled:
return
pass
async def on_shopping_list_entry_deleted(self, space: Space, shopping_list_entry: ShoppingListEntry) -> None:
async def on_shopping_list_entry_deleted(self, shopping_list_entry: ShoppingListEntryDTO) -> None:
if not self._config.on_shopping_list_entry_deleted_enabled:
return
if not hasattr(shopping_list_entry._state.fields_cache, "food"):
# Sometimes the food foreign key is not loaded, and we cant load it from an async process
self._logger.debug("required property was not present in ShoppingListEntry")
return
item, _ = _format_shopping_list_entry(shopping_list_entry)
self._logger.debug(f"removing {item=}")
self._logger.debug(f"removing {item=} from {self._config.todo_entity}")
data = {
"entity_id": self._config.todo_entity,
@@ -76,27 +73,27 @@ class HomeAssistant(Connector):
try:
await self.homeassistant_api_call("POST", "services/todo/remove_item", data)
except ClientError as err:
except ClientResponseError as err:
# This error will always trigger if the item is not present/found
self._logger.debug(f"received an exception from the api: {err=}, {type(err)=}")
self._logger.debug(f"received an exception from the api: {err.request_info.url=}, {err.request_info.method=}, {err.status=}, {err.message=}, {type(err)=}")
async def close(self) -> None:
pass
def _format_shopping_list_entry(shopping_list_entry: ShoppingListEntry) -> Tuple[str, str]:
item = shopping_list_entry.food.name
if shopping_list_entry.amount > 0:
def _format_shopping_list_entry(shopping_list_entry: ShoppingListEntryDTO) -> Tuple[str, str]:
item = shopping_list_entry.food_name
if shopping_list_entry.amount:
item += f" ({shopping_list_entry.amount:.2f}".rstrip('0').rstrip('.')
if shopping_list_entry.unit and shopping_list_entry.unit.base_unit and len(shopping_list_entry.unit.base_unit) > 0:
item += f" {shopping_list_entry.unit.base_unit})"
elif shopping_list_entry.unit and shopping_list_entry.unit.name and len(shopping_list_entry.unit.name) > 0:
item += f" {shopping_list_entry.unit.name})"
if shopping_list_entry.base_unit:
item += f" {shopping_list_entry.base_unit})"
elif shopping_list_entry.unit_name:
item += f" {shopping_list_entry.unit_name})"
else:
item += ")"
description = "From TandoorRecipes"
if shopping_list_entry.created_by.first_name and len(shopping_list_entry.created_by.first_name) > 0:
if shopping_list_entry.created_by.first_name:
description += f", by {shopping_list_entry.created_by.first_name}"
else:
description += f", by {shopping_list_entry.created_by.username}"

View File

@@ -1,6 +1,7 @@
from datetime import datetime
from allauth.account.forms import ResetPasswordForm, SignupForm
from allauth.socialaccount.forms import SignupForm as SocialSignupForm
from django import forms
from django.conf import settings
from django.core.exceptions import ValidationError
@@ -12,65 +13,20 @@ from hcaptcha.fields import hCaptchaField
from .models import Comment, InviteLink, Keyword, Recipe, SearchPreference, Space, Storage, Sync, User, UserPreference, ConnectorConfig
class SelectWidget(widgets.Select):
class Media:
js = ('custom/js/form_select.js', )
js = ('custom/js/form_select.js',)
class MultiSelectWidget(widgets.SelectMultiple):
class Media:
js = ('custom/js/form_multiselect.js', )
# Yes there are some stupid browsers that still dont support this but
# I dont support people using these browsers.
class DateWidget(forms.DateInput):
input_type = 'date'
def __init__(self, **kwargs):
kwargs["format"] = "%Y-%m-%d"
super().__init__(**kwargs)
class UserNameForm(forms.ModelForm):
prefix = 'name'
class Meta:
model = User
fields = ('first_name', 'last_name')
help_texts = {'first_name': _('Both fields are optional. If none are given the username will be displayed instead')}
class ExternalRecipeForm(forms.ModelForm):
file_path = forms.CharField(disabled=True, required=False)
file_uid = forms.CharField(disabled=True, required=False)
def __init__(self, *args, **kwargs):
space = kwargs.pop('space')
super().__init__(*args, **kwargs)
self.fields['keywords'].queryset = Keyword.objects.filter(space=space).all()
class Meta:
model = Recipe
fields = ('name', 'description', 'servings', 'working_time', 'waiting_time', 'file_path', 'file_uid', 'keywords')
labels = {
'name': _('Name'), 'keywords': _('Keywords'), 'working_time': _('Preparation time in minutes'), 'waiting_time': _('Waiting time (cooking/baking) in minutes'),
'file_path': _('Path'), 'file_uid': _('Storage UID'),
}
widgets = {'keywords': MultiSelectWidget}
field_classes = {'keywords': SafeModelMultipleChoiceField, }
js = ('custom/js/form_multiselect.js',)
class ImportExportBase(forms.Form):
DEFAULT = 'DEFAULT'
PAPRIKA = 'PAPRIKA'
NEXTCLOUD = 'NEXTCLOUD'
MEALIE = 'MEALIE'
MEALIE1 = 'MEALIE1'
CHOWDOWN = 'CHOWDOWN'
SAFFRON = 'SAFFRON'
CHEFTAP = 'CHEFTAP'
@@ -89,13 +45,13 @@ class ImportExportBase(forms.Form):
COOKMATE = 'COOKMATE'
REZEPTSUITEDE = 'REZEPTSUITEDE'
PDF = 'PDF'
GOURMET = 'GOURMET'
type = forms.ChoiceField(choices=((DEFAULT, _('Default')), (PAPRIKA, 'Paprika'), (NEXTCLOUD, 'Nextcloud Cookbook'), (MEALIE, 'Mealie'), (CHOWDOWN, 'Chowdown'),
type = forms.ChoiceField(choices=((DEFAULT, _('Default')), (PAPRIKA, 'Paprika'), (NEXTCLOUD, 'Nextcloud Cookbook'), (MEALIE, 'Mealie'), (MEALIE1, 'Mealie1'), (CHOWDOWN, 'Chowdown'),
(SAFFRON, 'Saffron'), (CHEFTAP, 'ChefTap'), (PEPPERPLATE, 'Pepperplate'), (RECETTETEK, 'RecetteTek'), (RECIPESAGE, 'Recipe Sage'),
(DOMESTICA, 'Domestica'), (MEALMASTER, 'MealMaster'), (REZKONV, 'RezKonv'), (OPENEATS, 'Openeats'), (RECIPEKEEPER, 'Recipe Keeper'),
(PLANTOEAT, 'Plantoeat'), (COOKBOOKAPP, 'CookBookApp'), (COPYMETHAT, 'CopyMeThat'), (PDF, 'PDF'), (MELARECIPES, 'Melarecipes'),
(COOKMATE, 'Cookmate'), (REZEPTSUITEDE, 'Recipesuite.de')))
(COOKMATE, 'Cookmate'), (REZEPTSUITEDE, 'Recipesuite.de'), (GOURMET, 'Gourmet')))
class MultipleFileInput(forms.ClearableFileInput):
allow_multiple_selected = True
@@ -120,6 +76,9 @@ class ImportForm(ImportExportBase):
files = MultipleFileField(required=True)
duplicates = forms.BooleanField(help_text=_('To prevent duplicates recipes with the same name as existing ones are ignored. Check this box to import everything.'),
required=False)
meal_plans = forms.BooleanField(required=False)
shopping_lists = forms.BooleanField(required=False)
nutrition_per_serving = forms.BooleanField(required=False) # some managers (e.g. mealie) do not specify what the nutrition's relate to so we let the user choose
class ExportForm(ImportExportBase):
@@ -132,120 +91,7 @@ class ExportForm(ImportExportBase):
super().__init__(*args, **kwargs)
self.fields['recipes'].queryset = Recipe.objects.filter(space=space).all()
class CommentForm(forms.ModelForm):
prefix = 'comment'
class Meta:
model = Comment
fields = ('text', )
labels = {'text': _('Add your comment: '), }
widgets = {'text': forms.Textarea(attrs={'rows': 2, 'cols': 15}), }
class StorageForm(forms.ModelForm):
username = forms.CharField(widget=forms.TextInput(attrs={'autocomplete': 'new-password'}), required=False)
password = forms.CharField(widget=forms.TextInput(attrs={'autocomplete': 'new-password', 'type': 'password'}),
required=False,
help_text=_('Leave empty for dropbox and enter app password for nextcloud.'))
token = forms.CharField(widget=forms.TextInput(attrs={'autocomplete': 'new-password', 'type': 'password'}),
required=False,
help_text=_('Leave empty for nextcloud and enter api token for dropbox.'))
class Meta:
model = Storage
fields = ('name', 'method', 'username', 'password', 'token', 'url', 'path')
help_texts = {'url': _('Leave empty for dropbox and enter only base url for nextcloud (<code>/remote.php/webdav/</code> is added automatically)'), }
class ConnectorConfigForm(forms.ModelForm):
enabled = forms.BooleanField(
help_text="Is the connector enabled",
required=False,
)
on_shopping_list_entry_created_enabled = forms.BooleanField(
help_text="Enable action for ShoppingListEntry created events",
required=False,
)
on_shopping_list_entry_updated_enabled = forms.BooleanField(
help_text="Enable action for ShoppingListEntry updated events",
required=False,
)
on_shopping_list_entry_deleted_enabled = forms.BooleanField(
help_text="Enable action for ShoppingListEntry deleted events",
required=False,
)
update_token = forms.CharField(
widget=forms.TextInput(attrs={'autocomplete': 'update-token', 'type': 'password'}),
required=False,
help_text=_('<a href="https://www.home-assistant.io/docs/authentication/#your-account-profile">Long Lived Access Token</a> for your HomeAssistant instance')
)
url = forms.URLField(
required=False,
help_text=_('Something like http://homeassistant.local:8123/api'),
)
class Meta:
model = ConnectorConfig
fields = (
'name', 'type', 'enabled', 'on_shopping_list_entry_created_enabled', 'on_shopping_list_entry_updated_enabled',
'on_shopping_list_entry_deleted_enabled', 'url', 'todo_entity',
)
help_texts = {
'url': _('http://homeassistant.local:8123/api for example'),
}
class SyncForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
space = kwargs.pop('space')
super().__init__(*args, **kwargs)
self.fields['storage'].queryset = Storage.objects.filter(space=space).all()
class Meta:
model = Sync
fields = ('storage', 'path', 'active')
field_classes = {'storage': SafeModelChoiceField, }
labels = {'storage': _('Storage'), 'path': _('Path'), 'active': _('Active')}
class BatchEditForm(forms.Form):
search = forms.CharField(label=_('Search String'))
keywords = forms.ModelMultipleChoiceField(queryset=Keyword.objects.none(), required=False, widget=MultiSelectWidget)
def __init__(self, *args, **kwargs):
space = kwargs.pop('space')
super().__init__(*args, **kwargs)
self.fields['keywords'].queryset = Keyword.objects.filter(space=space).all().order_by('id')
class ImportRecipeForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
space = kwargs.pop('space')
super().__init__(*args, **kwargs)
self.fields['keywords'].queryset = Keyword.objects.filter(space=space).all()
class Meta:
model = Recipe
fields = ('name', 'keywords', 'file_path', 'file_uid')
labels = {'name': _('Name'), 'keywords': _('Keywords'), 'file_path': _('Path'), 'file_uid': _('File ID'), }
widgets = {'keywords': MultiSelectWidget}
field_classes = {'keywords': SafeModelChoiceField, }
from .models import InviteLink, SearchPreference, Space, User, UserPreference
class InviteLinkForm(forms.ModelForm):
@@ -308,6 +154,18 @@ class AllAuthSignupForm(SignupForm):
pass
class AllAuthSocialSignupForm(SocialSignupForm):
terms = forms.BooleanField(label=_('Accept Terms and Privacy'))
def __init__(self, **kwargs):
super().__init__(**kwargs)
if settings.PRIVACY_URL == '' and settings.TERMS_URL == '':
self.fields.pop('terms')
def signup(self, request, user):
pass
class CustomPasswordResetForm(ResetPasswordForm):
captcha = hCaptchaField()
@@ -321,37 +179,3 @@ class UserCreateForm(forms.Form):
name = forms.CharField(label='Username')
password = forms.CharField(widget=forms.TextInput(attrs={'autocomplete': 'new-password', 'type': 'password'}))
password_confirm = forms.CharField(widget=forms.TextInput(attrs={'autocomplete': 'new-password', 'type': 'password'}))
class SearchPreferenceForm(forms.ModelForm):
prefix = 'search'
trigram_threshold = forms.DecimalField(min_value=0.01,
max_value=1,
decimal_places=2,
widget=NumberInput(attrs={'class': "form-control-range", 'type': 'range'}),
help_text=_('Determines how fuzzy a search is if it uses trigram similarity matching (e.g. low values mean more typos are ignored).'))
preset = forms.CharField(widget=forms.HiddenInput(), required=False)
class Meta:
model = SearchPreference
fields = ('search', 'lookup', 'unaccent', 'icontains', 'istartswith', 'trigram', 'fulltext', 'trigram_threshold')
help_texts = {
'search': _('Select type method of search. Click <a href="/docs/search/">here</a> for full description of choices.'), 'lookup':
_('Use fuzzy matching on units, keywords and ingredients when editing and importing recipes.'), 'unaccent':
_('Fields to search ignoring accents. Selecting this option can improve or degrade search quality depending on language'), 'icontains':
_("Fields to search for partial matches. (e.g. searching for 'Pie' will return 'pie' and 'piece' and 'soapie')"), 'istartswith':
_("Fields to search for beginning of word matches. (e.g. searching for 'sa' will return 'salad' and 'sandwich')"), 'trigram':
_("Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) Note: this option will conflict with 'web' and 'raw' methods of search."), 'fulltext':
_("Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods only function with fulltext fields."),
}
labels = {
'search': _('Search Method'), 'lookup': _('Fuzzy Lookups'), 'unaccent': _('Ignore Accent'), 'icontains': _("Partial Match"), 'istartswith': _("Starts With"),
'trigram': _("Fuzzy Search"), 'fulltext': _("Full Text")
}
widgets = {
'search': SelectWidget, 'unaccent': MultiSelectWidget, 'icontains': MultiSelectWidget, 'istartswith': MultiSelectWidget, 'trigram': MultiSelectWidget, 'fulltext':
MultiSelectWidget,
}

View File

@@ -0,0 +1,83 @@
from decimal import Decimal
from django.utils import timezone
from django.db.models import Sum
from litellm import CustomLogger
from cookbook.models import AiLog
from recipes import settings
def get_monthly_token_usage(space):
"""
returns the number of credits the space has used in the current month
"""
token_usage = AiLog.objects.filter(space=space, credits_from_balance=False, created_at__month=timezone.now().month).aggregate(Sum('credit_cost'))['credit_cost__sum']
if token_usage is None:
token_usage = 0
return token_usage
def has_monthly_token(space):
"""
checks if the monthly credit limit has been exceeded
"""
return get_monthly_token_usage(space) < space.ai_credits_monthly
def can_perform_ai_request(space):
return (has_monthly_token(space) or space.ai_credits_balance > 0) and space.ai_enabled
class AiCallbackHandler(CustomLogger):
space = None
user = None
ai_provider = None
def __init__(self, space, user, ai_provider):
super().__init__()
self.space = space
self.user = user
self.ai_provider = ai_provider
def log_pre_api_call(self, model, messages, kwargs):
pass
def log_post_api_call(self, kwargs, response_obj, start_time, end_time):
pass
def log_success_event(self, kwargs, response_obj, start_time, end_time):
self.create_ai_log(kwargs, response_obj, start_time, end_time)
def log_failure_event(self, kwargs, response_obj, start_time, end_time):
self.create_ai_log(kwargs, response_obj, start_time, end_time)
def create_ai_log(self, kwargs, response_obj, start_time, end_time):
credit_cost = 0
credits_from_balance = False
if self.ai_provider.log_credit_cost:
credit_cost = kwargs.get("response_cost", 0) * 100
if (not has_monthly_token(self.space)) and self.space.ai_credits_balance > 0:
remaining_balance = self.space.ai_credits_balance - Decimal(str(credit_cost))
if remaining_balance < 0:
remaining_balance = 0
if settings.HOSTED:
self.space.ai_enabled = False
self.space.ai_credits_balance = remaining_balance
credits_from_balance = True
self.space.save()
AiLog.objects.create(
created_by=self.user,
space=self.space,
ai_provider=self.ai_provider,
start_time=start_time,
end_time=end_time,
input_tokens=response_obj['usage']['prompt_tokens'],
output_tokens=response_obj['usage']['completion_tokens'],
function=AiLog.F_FILE_IMPORT,
credit_cost=credit_cost,
credits_from_balance=credits_from_balance,
)

View File

@@ -109,7 +109,7 @@ class AutomationEngine:
Moves a string that should never be treated as a unit to next token and optionally replaced with default unit
e.g. NEVER_UNIT: param1: egg, param2: None would modify ['1', 'egg', 'white'] to ['1', '', 'egg', 'white']
or NEVER_UNIT: param1: egg, param2: pcs would modify ['1', 'egg', 'yolk'] to ['1', 'pcs', 'egg', 'yolk']
:param1 string: string that should never be considered a unit, will be moved to token[2]
:param1 tokens: string that should never be considered a unit, will be moved to token[2]
:param2 (optional) unit as string: will insert unit string into token[1]
:return: unit as string (possibly changed by automation)
"""
@@ -135,7 +135,7 @@ class AutomationEngine:
new_unit = self.never_unit[tokens[1].lower()]
never_unit = True
except KeyError:
return tokens
return tokens, never_unit
else:
if a := Automation.objects.annotate(param_1_lower=Lower('param_1')).filter(space=self.request.space, type=Automation.NEVER_UNIT, param_1_lower__in=[
tokens[1].lower(), alt_unit.lower()], disabled=False).order_by('order').first():
@@ -144,7 +144,7 @@ class AutomationEngine:
if never_unit:
tokens.insert(1, new_unit)
return tokens
return tokens, never_unit
def apply_transpose_automation(self, string):
"""

View File

@@ -0,0 +1,22 @@
def add_to_relation(relation_model, base_field_name, base_ids, related_field_name, related_ids):
"""
given a model, the base and related field and the base and related ids, bulk create relation objects
"""
relation_objects = []
for b in base_ids:
for r in related_ids:
relation_objects.append(relation_model(**{base_field_name: b, related_field_name: r}))
relation_model.objects.bulk_create(relation_objects, ignore_conflicts=True, unique_fields=(base_field_name, related_field_name,))
def remove_from_relation(relation_model, base_field_name, base_ids, related_field_name, related_ids):
relation_model.objects.filter(**{f'{base_field_name}__in': base_ids, f'{related_field_name}__in': related_ids}).delete()
def remove_all_from_relation(relation_model, base_field_name, base_ids):
relation_model.objects.filter(**{f'{base_field_name}__in': base_ids}).delete()
def set_relation(relation_model, base_field_name, base_ids, related_field_name, related_ids):
remove_all_from_relation(relation_model, base_field_name, base_ids)
add_to_relation(relation_model, base_field_name, base_ids, related_field_name, related_ids)

View File

@@ -0,0 +1,102 @@
# custom processing for schema
# reason: DRF writable nested needs ID's to decide if a nested object should be created or updated
# the API schema/client make ID's read only by default and strips them entirely in request objects (with COMPONENT_SPLIT_REQUEST enabled)
# change the schema to make IDs optional but writable so they are included in the request
def custom_postprocessing_hook(result, generator, request, public):
for c in result['components']['schemas'].keys():
# handle schemas used by the client to do requests on the server
if 'properties' in result['components']['schemas'][c] and 'id' in result['components']['schemas'][c]['properties']:
# make ID field not read only so it's not stripped from the request on the client
result['components']['schemas'][c]['properties']['id']['readOnly'] = False
# make ID field not required
if 'required' in result['components']['schemas'][c] and 'id' in result['components']['schemas'][c]['required']:
result['components']['schemas'][c]['required'].remove('id')
return result
# TODO remove below once legacy API has been fully deprecated
from drf_spectacular.openapi import AutoSchema # noqa: E402 isort: skip
import functools # noqa: E402 isort: skip
import re # noqa: E402 isort: skip
class LegacySchema(AutoSchema):
operation_id_base = None
@functools.cached_property
def path(self):
path = re.sub(pattern=self.path_prefix, repl='', string=self.path, flags=re.IGNORECASE)
# remove path variables
return re.sub(pattern=r'\{[\w\-]+\}', repl='', string=path)
def get_operation_id(self):
"""
Compute an operation ID from the view type and get_operation_id_base method.
"""
method_name = getattr(self.view, 'action', self.method.lower())
if self._is_list_view():
action = 'list'
elif method_name not in self.method_mapping:
action = self._to_camel_case(method_name)
else:
action = self.method_mapping[self.method.lower()]
name = self.get_operation_id_base(action)
return action + name
def get_operation_id_base(self, action):
"""
Compute the base part for operation ID from the model, serializer or view name.
"""
model = getattr(getattr(self.view, 'queryset', None), 'model', None)
if self.operation_id_base is not None:
name = self.operation_id_base
# Try to deduce the ID from the view's model
elif model is not None:
name = model.__name__
# Try with the serializer class name
elif self.get_serializer() is not None:
name = self.get_serializer().__class__.__name__
if name.endswith('Serializer'):
name = name[:-10]
# Fallback to the view name
else:
name = self.view.__class__.__name__
if name.endswith('APIView'):
name = name[:-7]
elif name.endswith('View'):
name = name[:-4]
# Due to camel-casing of classes and `action` being lowercase, apply title in order to find if action truly
# comes at the end of the name
if name.endswith(action.title()): # ListView, UpdateAPIView, ThingDelete ...
name = name[:-len(action)]
if action == 'list' and not name.endswith('s'): # listThings instead of listThing
name += 's'
return name
def get_serializer(self):
view = self.view
if not hasattr(view, 'get_serializer'):
return None
try:
return view.get_serializer()
except Exception:
return None
def _to_camel_case(self, snake_str):
components = snake_str.split('_')
# We capitalize the first letter of each component except the first one
# with the 'title' method and join them together.
return components[0] + ''.join(x.title() for x in components[1:])

View File

@@ -35,6 +35,33 @@ def get_filetype(name):
return '.jpeg'
def is_file_type_allowed(filename, image_only=False):
is_file_allowed = False
allowed_file_types = ['.pdf', '.docx', '.xlsx', '.css', '.mp4', '.mov']
allowed_image_types = ['.png', '.jpg', '.jpeg', '.gif', '.webp']
check_list = allowed_image_types
if not image_only:
check_list += allowed_file_types
for file_type in check_list:
if filename.lower().endswith(file_type):
is_file_allowed = True
return is_file_allowed
def strip_image_meta(image_object, file_format):
image_object = Image.open(image_object)
data = list(image_object.getdata())
image_without_exif = Image.new(image_object.mode, image_object.size)
image_without_exif.putdata(data)
im_io = BytesIO()
image_without_exif.save(im_io, file_format)
return im_io
# TODO this whole file needs proper documentation, refactoring, and testing
# TODO also add env variable to define which images sizes should be compressed
# filetype argument can not be optional, otherwise this function will treat all images as if they were a jpeg
@@ -45,9 +72,21 @@ def handle_image(request, image_object, filetype):
except Exception:
return None
file_format = None
if filetype == '.jpeg' or filetype == '.jpg':
file_format = 'JPEG'
if filetype == '.png':
file_format = 'PNG'
if filetype == '.webp':
file_format = 'WEBP'
if (image_object.size / 1000) > 500: # if larger than 500 kb compress
if filetype == '.jpeg' or filetype == '.jpg':
return rescale_image_jpeg(image_object)
if filetype == '.png':
return rescale_image_png(image_object)
else:
return strip_image_meta(image_object, file_format)
# TODO webp and gifs bypass the scaling and metadata checks, fix
return image_object

View File

@@ -118,7 +118,7 @@ class IngredientParser:
note = ''
start = 0
# search for first occurrence of an argument ending in a comma
while start < len(tokens) and not tokens[start].endswith(','):
while start < len(tokens) and not tokens[start].endswith((',', ';', ':')):
start += 1
if start == len(tokens):
# no token ending in a comma found -> use everything as food
@@ -176,7 +176,6 @@ class IngredientParser:
# if something like this is detected move it to the beginning so the parser can handle it
if len(ingredient) < 1000 and re.search(r'^([^\W\d_])+(.)*[1-9](\d)*\s*([^\W\d_])+', ingredient):
match = re.search(r'[1-9](\d)*\s*([^\W\d_])+', ingredient)
print(f'reording from {ingredient} to {ingredient[match.start():match.end()] + " " + ingredient.replace(ingredient[match.start():match.end()], "")}')
ingredient = ingredient[match.start():match.end()] + ' ' + ingredient.replace(ingredient[match.start():match.end()], '')
# if the string contains parenthesis early on remove it and place it at the end
@@ -211,39 +210,46 @@ class IngredientParser:
# three arguments if it already has a unit there can't be
# a fraction for the amount
if len(tokens) > 2:
never_unit_applied = False
if not self.ignore_rules:
tokens = self.automation.apply_never_unit_automation(tokens)
try:
if unit is not None:
# a unit is already found, no need to try the second argument for a fraction
# probably not the best method to do it, but I didn't want to make an if check and paste the exact same thing in the else as already is in the except
raise ValueError
# try to parse second argument as amount and add that, in case of '2 1/2' or '2 ½'
amount += self.parse_fraction(tokens[1])
# assume that units can't end with a comma
if len(tokens) > 3 and not tokens[2].endswith(','):
# try to use third argument as unit and everything else as food, use everything as food if it fails
try:
food, note = self.parse_food(tokens[3:])
unit = tokens[2]
except ValueError:
tokens, never_unit_applied = self.automation.apply_never_unit_automation(tokens)
if never_unit_applied:
unit = tokens[1]
food, note = self.parse_food(tokens[2:])
else:
try:
if unit is not None:
# a unit is already found, no need to try the second argument for a fraction
# probably not the best method to do it, but I didn't want to make an if check and paste the exact same thing in the else as already is in the except
raise ValueError
# try to parse second argument as amount and add that, in case of '2 1/2' or '2 ½'
if tokens[1]:
amount += self.parse_fraction(tokens[1])
# assume that units can't end with a comma
if len(tokens) > 3 and not tokens[2].endswith(','):
# try to use third argument as unit and everything else as food, use everything as food if it fails
try:
food, note = self.parse_food(tokens[3:])
unit = tokens[2]
except ValueError:
food, note = self.parse_food(tokens[2:])
else:
food, note = self.parse_food(tokens[2:])
else:
food, note = self.parse_food(tokens[2:])
except ValueError:
# assume that units can't end with a comma
if not tokens[1].endswith(','):
# try to use second argument as unit and everything else as food, use everything as food if it fails
try:
food, note = self.parse_food(tokens[2:])
if unit is None:
unit = tokens[1]
else:
note = tokens[1]
except ValueError:
except ValueError:
# assume that units can't end with a comma
if not tokens[1].endswith(','):
# try to use second argument as unit and everything else as food, use everything as food if it fails
try:
food, note = self.parse_food(tokens[2:])
if unit is None:
unit = tokens[1]
else:
note = tokens[1]
except ValueError:
food, note = self.parse_food(tokens[1:])
else:
food, note = self.parse_food(tokens[1:])
else:
food, note = self.parse_food(tokens[1:])
else:
# only two arguments, first one is the amount
# which means this is the food
@@ -264,6 +270,7 @@ class IngredientParser:
if food and not self.ignore_rules:
food = self.automation.apply_food_automation(food)
if len(food) > Food._meta.get_field('name').max_length: # test if food name is to long
# try splitting it at a space and taking only the first arg
if len(food.split()) > 1 and len(food.split()[0]) < Food._meta.get_field('name').max_length:

View File

@@ -7,7 +7,9 @@ class StyleTreeprocessor(Treeprocessor):
def run_processor(self, node):
for child in node:
if child.tag == "table":
child.set("class", "table table-bordered")
child.set("class", "markdown-table")
if child.tag == "th" or child.tag == "td":
child.set("class", "markdown-table-cell")
if child.tag == "img":
child.set("class", "img-fluid")
self.run_processor(child)

View File

@@ -6,6 +6,8 @@ from cookbook.models import (Food, FoodProperty, Property, PropertyType, Superma
SupermarketCategory, SupermarketCategoryRelation, Unit, UnitConversion)
import re
from recipes.settings import DEBUG
class OpenDataImportResponse:
total_created = 0
@@ -339,7 +341,7 @@ class OpenDataImporter:
obj_dict = {
'name': self.data[datatype][k]['name'],
'plural_name': self.data[datatype][k]['plural_name'] if self.data[datatype][k]['plural_name'] != '' else None,
'supermarket_category_id': self.slug_id_cache['category'][self.data[datatype][k]['store_category']],
'supermarket_category_id': self.slug_id_cache['category'][self.data[datatype][k]['store_category']] if self.data[datatype][k]['store_category'] in self.slug_id_cache['category'] else None,
'fdc_id': re.sub(r'\D', '', self.data[datatype][k]['fdc_id']) if self.data[datatype][k]['fdc_id'] != '' else None,
'open_data_slug': k,
'properties_food_unit_id': None,
@@ -367,12 +369,28 @@ class OpenDataImporter:
create_list.append({'data': obj_dict})
if self.update_existing and len(update_list) > 0:
model_type.objects.bulk_update(update_list, field_list)
od_response.total_updated += len(update_list)
try:
model_type.objects.bulk_update(update_list, field_list)
od_response.total_updated += len(update_list)
except Exception:
if DEBUG:
print('========= LOAD FOOD FAILED ============')
print(update_list)
print(existing_data_names)
print(existing_data_slugs)
traceback.print_exc()
if len(create_list) > 0:
Food.load_bulk(create_list, None)
od_response.total_created += len(create_list)
try:
Food.load_bulk(create_list, None)
od_response.total_created += len(create_list)
except Exception:
if DEBUG:
print('========= LOAD FOOD FAILED ============')
print(create_list)
print(existing_data_names)
print(existing_data_slugs)
traceback.print_exc()
# --------------- PROPERTY STUFF -----------------------
model_type = Property

View File

@@ -3,17 +3,19 @@ import inspect
from django.conf import settings
from django.contrib import messages
from django.contrib.auth.decorators import user_passes_test
from django.contrib.auth.models import Group
from django.core.cache import cache
from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.http import HttpResponseRedirect
from django.urls import reverse, reverse_lazy
from django.utils.translation import gettext as _
from django_scopes import scopes_disabled
from oauth2_provider.contrib.rest_framework import TokenHasReadWriteScope, TokenHasScope
from oauth2_provider.models import AccessToken
from rest_framework import permissions
from rest_framework.permissions import SAFE_METHODS
from cookbook.models import Recipe, ShareLink, UserSpace
import random
from cookbook.models import Recipe, ShareLink, UserSpace, Space
def get_allowed_groups(groups_required):
@@ -160,18 +162,15 @@ class GroupRequiredMixin(object):
def dispatch(self, request, *args, **kwargs):
if not has_group_permission(request.user, self.groups_required):
if not request.user.is_authenticated:
messages.add_message(request, messages.ERROR,
_('You are not logged in and therefore cannot view this page!'))
messages.add_message(request, messages.ERROR, _('You are not logged in and therefore cannot view this page!'))
return HttpResponseRedirect(reverse_lazy('account_login') + '?next=' + request.path)
else:
messages.add_message(request, messages.ERROR,
_('You do not have the required permissions to view this page!'))
messages.add_message(request, messages.ERROR, _('You do not have the required permissions to view this page!'))
return HttpResponseRedirect(reverse_lazy('index'))
try:
obj = self.get_object()
if obj.get_space() != request.space:
messages.add_message(request, messages.ERROR,
_('You do not have the required permissions to view this page!'))
messages.add_message(request, messages.ERROR, _('You do not have the required permissions to view this page!'))
return HttpResponseRedirect(reverse_lazy('index'))
except AttributeError:
pass
@@ -334,6 +333,25 @@ class CustomRecipePermission(permissions.BasePermission):
or has_group_permission(request.user, ['user'])) and obj.space == request.space
class CustomAiProviderPermission(permissions.BasePermission):
"""
Custom permission class for the AiProvider api endpoint
users: can read all
admins: can read and write
superusers: can read and write + write providers without a space
"""
message = _('You do not have the required permissions to view this page!')
def has_permission(self, request, view): # user is either at least a user and the request is safe
return (has_group_permission(request.user, ['user']) and request.method in SAFE_METHODS) or (has_group_permission(request.user, ['admin']) or request.user.is_superuser)
# editing of global providers allowed for superusers, space providers by admins and users can read only access
def has_object_permission(self, request, view, obj):
return ((obj.space is None and request.user.is_superuser)
or (obj.space == request.space and has_group_permission(request.user, ['admin']))
or (obj.space == request.space and has_group_permission(request.user, ['user']) and request.method in SAFE_METHODS))
class CustomUserPermission(permissions.BasePermission):
"""
Custom permission class for user api endpoint
@@ -440,3 +458,36 @@ class IsReadOnlyDRF(permissions.BasePermission):
def has_permission(self, request, view):
return request.method in SAFE_METHODS
class IsCreateDRF(permissions.BasePermission):
message = 'You cannot interact with this object, you can only create'
def has_permission(self, request, view):
return request.method == 'POST'
def create_space_for_user(user, name=None):
with scopes_disabled():
if not name:
name = f"{user.username}'s Space"
if Space.objects.filter(name=name).exists():
name = f'{name} #{random.randrange(1, 10 ** 5)}'
created_space = Space(name=name,
created_by=user,
max_file_storage_mb=settings.SPACE_DEFAULT_MAX_FILES,
max_recipes=settings.SPACE_DEFAULT_MAX_RECIPES,
max_users=settings.SPACE_DEFAULT_MAX_USERS,
allow_sharing=settings.SPACE_DEFAULT_ALLOW_SHARING,
ai_enabled=settings.SPACE_AI_ENABLED,
ai_credits_monthly=settings.SPACE_AI_CREDITS_MONTHLY,
space_setup_completed=False, )
created_space.save()
UserSpace.objects.filter(user=user).update(active=False)
user_space = UserSpace.objects.create(space=created_space, user=user, active=True)
user_space.groups.add(Group.objects.filter(name='admin').get())
return user_space

View File

@@ -44,13 +44,17 @@ class FoodPropertyHelper:
if i.food is not None:
conversions = uch.get_conversions(i)
for pt in property_types:
# if a property could be calculated with an actual value
found_property = False
if i.food.properties_food_amount == 0 or i.food.properties_food_unit is None: # if food is configured incorrectly
computed_properties[pt.id]['food_values'][i.food.id] = {'id': i.food.id, 'food': i.food.name, 'value': None}
# if food has a value for the given property type (no matter if conversion is possible)
has_property_value = False
if i.food.properties_food_amount == 0 or i.food.properties_food_unit is None and not (i.amount == 0 or i.no_amount): # if food is configured incorrectly
computed_properties[pt.id]['food_values'][i.food.id] = {'id': i.food.id, 'food': {'id': i.food.id, 'name': i.food.name}, 'value': None}
computed_properties[pt.id]['missing_value'] = True
else:
for p in i.food.properties.all():
if p.property_type == pt and p.property_amount is not None:
has_property_value = True
for c in conversions:
if c.unit == i.food.properties_food_unit:
found_property = True
@@ -58,12 +62,19 @@ class FoodPropertyHelper:
computed_properties[pt.id]['food_values'] = self.add_or_create(
computed_properties[p.property_type.id]['food_values'], c.food.id, (c.amount / i.food.properties_food_amount) * p.property_amount, c.food)
if not found_property:
if i.amount == 0: # don't count ingredients without an amount as missing
computed_properties[pt.id]['missing_value'] = computed_properties[pt.id]['missing_value'] or False # don't override if another food was already missing
computed_properties[pt.id]['food_values'][i.food.id] = {'id': i.food.id, 'food': i.food.name, 'value': 0}
# if no amount and food does not exist yet add it but don't count as missing
if i.amount == 0 or i.no_amount and i.food.id not in computed_properties[pt.id]['food_values']:
computed_properties[pt.id]['food_values'][i.food.id] = {'id': i.food.id, 'food': {'id': i.food.id, 'name': i.food.name}, 'value': 0}
# if amount is present but unit is missing indicate it in the result
elif i.unit is None:
if i.food.id not in computed_properties[pt.id]['food_values']:
computed_properties[pt.id]['food_values'][i.food.id] = {'id': i.food.id, 'food': {'id': i.food.id, 'name': i.food.name}, 'value': 0}
computed_properties[pt.id]['food_values'][i.food.id]['missing_unit'] = True
else:
computed_properties[pt.id]['missing_value'] = True
computed_properties[pt.id]['food_values'][i.food.id] = {'id': i.food.id, 'food': i.food.name, 'value': None}
computed_properties[pt.id]['food_values'][i.food.id] = {'id': i.food.id, 'food': {'id': i.food.id, 'name': i.food.name}, 'value': None}
if has_property_value and i.unit is not None:
computed_properties[pt.id]['food_values'][i.food.id]['missing_conversion'] = {'base_unit': {'id': i.unit.id, 'name': i.unit.name}, 'converted_unit': {'id': i.food.properties_food_unit.id, 'name': i.food.properties_food_unit.name}}
return computed_properties
@@ -74,5 +85,5 @@ class FoodPropertyHelper:
if key in d and d[key]['value']:
d[key]['value'] += value
else:
d[key] = {'id': food.id, 'food': food.name, 'value': value}
d[key] = {'id': food.id, 'food': {'id': food.id, 'name': food.name}, 'value': value}
return d

View File

@@ -49,7 +49,11 @@ class RecipeSearch():
self._search_prefs = SearchPreference()
self._string = self._params.get('query').strip(
) if self._params.get('query', None) else None
self._rating = self._params.get('rating', None)
self._rating_gte = self._params.get('rating_gte', None)
self._rating_lte = self._params.get('rating_lte', None)
self._keywords = {
'or': self._params.get('keywords_or', None) or self._params.get('keywords', None),
'and': self._params.get('keywords_and', None),
@@ -70,20 +74,36 @@ class RecipeSearch():
}
self._steps = self._params.get('steps', None)
self._units = self._params.get('units', None)
# TODO add created by
# TODO image exists
self._sort_order = self._params.get('sort_order', None)
self._internal = str2bool(self._params.get('internal', None))
self._random = str2bool(self._params.get('random', False))
self._sort_order = self._params.get('sort_order', None)
if self._sort_order == 'random':
self._random = True
self.sort_order = None
else:
self._random = str2bool(self._params.get('random', False))
self._new = str2bool(self._params.get('new', False))
self._num_recent = int(self._params.get('num_recent', 0))
self._include_children = str2bool(
self._params.get('include_children', None))
self._timescooked = self._params.get('timescooked', None)
self._cookedon = self._params.get('cookedon', None)
self._timescooked_gte = self._params.get('timescooked_gte', None)
self._timescooked_lte = self._params.get('timescooked_lte', None)
self._createdon = self._params.get('createdon', None)
self._createdon_gte = self._params.get('createdon_gte', None)
self._createdon_lte = self._params.get('createdon_lte', None)
self._updatedon = self._params.get('updatedon', None)
self._viewedon = self._params.get('viewedon', None)
self._updatedon_gte = self._params.get('updatedon_gte', None)
self._updatedon_lte = self._params.get('updatedon_lte', None)
self._viewedon_gte = self._params.get('viewedon_gte', None)
self._viewedon_lte = self._params.get('viewedon_lte', None)
self._cookedon_gte = self._params.get('cookedon_gte', None)
self._cookedon_lte = self._params.get('cookedon_lte', None)
self._createdby = self._params.get('createdby', None)
self._makenow = self._params.get('makenow', None)
# this supports hidden feature to find recipes missing X ingredients
if isinstance(self._makenow, bool) and self._makenow == True:
@@ -130,16 +150,19 @@ class RecipeSearch():
self._build_sort_order()
self._recently_viewed(num_recent=self._num_recent)
self._cooked_on_filter(cooked_date=self._cookedon)
self._created_on_filter(created_date=self._createdon)
self._updated_on_filter(updated_date=self._updatedon)
self._viewed_on_filter(viewed_date=self._viewedon)
self._favorite_recipes(times_cooked=self._timescooked)
self._cooked_on_filter()
self._created_on_filter()
self._updated_on_filter()
self._viewed_on_filter()
self._created_by_filter(created_by_user_id=self._createdby)
self._favorite_recipes()
self._new_recipes()
self.keyword_filters(**self._keywords)
self.food_filters(**self._foods)
self.book_filters(**self._books)
self.rating_filter(rating=self._rating)
self.rating_filter()
self.internal_filter(internal=self._internal)
self.step_filters(steps=self._steps)
self.unit_filters(units=self._units)
@@ -186,9 +209,9 @@ class RecipeSearch():
else:
order += default_order
order[:] = [Lower('name').asc() if x ==
'name' else x for x in order]
'name' else x for x in order]
order[:] = [Lower('name').desc() if x ==
'-name' else x for x in order]
'-name' else x for x in order]
self.orderby = order
def string_filters(self, string=None):
@@ -227,9 +250,9 @@ class RecipeSearch():
query_filter |= Q(**{"%s" % f: self._string})
self._queryset = self._queryset.filter(query_filter).distinct()
def _cooked_on_filter(self, cooked_date=None):
if self._sort_includes('lastcooked') or cooked_date:
lessthan = self._sort_includes('-lastcooked') or '-' in (cooked_date or [])[:1]
def _cooked_on_filter(self):
if self._sort_includes('lastcooked') or self._cookedon_gte or self._cookedon_lte:
lessthan = self._sort_includes('-lastcooked') or self._cookedon_lte
if lessthan:
default = timezone.now() - timedelta(days=100000)
else:
@@ -237,51 +260,44 @@ class RecipeSearch():
self._queryset = self._queryset.annotate(
lastcooked=Coalesce(Max(Case(When(cooklog__created_by=self._request.user, cooklog__space=self._request.space, then='cooklog__created_at'))), Value(default))
)
if cooked_date is None:
return
cooked_date = date(*[int(x)for x in cooked_date.split('-') if x != ''])
if lessthan:
self._queryset = self._queryset.filter(lastcooked__date__lte=cooked_date).exclude(lastcooked=default)
else:
self._queryset = self._queryset.filter(lastcooked__date__gte=cooked_date).exclude(lastcooked=default)
def _created_on_filter(self, created_date=None):
if created_date is None:
return
lessthan = '-' in created_date[:1]
created_date = date(*[int(x) for x in created_date.split('-') if x != ''])
if lessthan:
self._queryset = self._queryset.filter(created_at__date__lte=created_date)
else:
self._queryset = self._queryset.filter(created_at__date__gte=created_date)
def _updated_on_filter(self, updated_date=None):
if updated_date is None:
return
lessthan = '-' in updated_date[:1]
updated_date = date(*[int(x)for x in updated_date.split('-') if x != ''])
if lessthan:
self._queryset = self._queryset.filter(updated_at__date__lte=updated_date)
else:
self._queryset = self._queryset.filter(updated_at__date__gte=updated_date)
if self._cookedon_lte:
self._queryset = self._queryset.filter(lastcooked__date__lte=self._cookedon_lte).exclude(lastcooked=default)
elif self._cookedon_gte:
self._queryset = self._queryset.filter(lastcooked__date__gte=self._cookedon_gte).exclude(lastcooked=default)
def _viewed_on_filter(self, viewed_date=None):
if self._sort_includes('lastviewed') or viewed_date:
if self._sort_includes('lastviewed') or self._viewedon_gte or self._viewedon_lte:
longTimeAgo = timezone.now() - timedelta(days=100000)
self._queryset = self._queryset.annotate(
lastviewed=Coalesce(Max(Case(When(viewlog__created_by=self._request.user, viewlog__space=self._request.space, then='viewlog__created_at'))), Value(longTimeAgo))
)
if viewed_date is None:
return
lessthan = '-' in viewed_date[:1]
viewed_date = date(*[int(x)for x in viewed_date.split('-') if x != ''])
if lessthan:
self._queryset = self._queryset.filter(lastviewed__date__lte=viewed_date).exclude(lastviewed=longTimeAgo)
else:
self._queryset = self._queryset.filter(lastviewed__date__gte=viewed_date).exclude(lastviewed=longTimeAgo)
if self._viewedon_lte:
self._queryset = self._queryset.filter(lastviewed__date__lte=self._viewedon_lte).exclude(lastviewed=longTimeAgo)
elif self._viewedon_gte:
self._queryset = self._queryset.filter(lastviewed__date__gte=self._viewedon_gte).exclude(lastviewed=longTimeAgo)
def _created_on_filter(self):
if self._createdon:
self._queryset = self._queryset.filter(created_at__date=self._createdon)
elif self._createdon_lte:
self._queryset = self._queryset.filter(created_at__date__lte=self._createdon_lte)
elif self._createdon_gte:
self._queryset = self._queryset.filter(created_at__date__gte=self._createdon_gte)
def _updated_on_filter(self):
if self._updatedon:
self._queryset = self._queryset.filter(updated_at__date__date=self._updatedon)
elif self._updatedon_lte:
self._queryset = self._queryset.filter(updated_at__date__lte=self._updatedon_lte)
elif self._updatedon_gte:
self._queryset = self._queryset.filter(updated_at__date__gte=self._updatedon_gte)
def _created_by_filter(self, created_by_user_id=None):
if created_by_user_id is None:
return
self._queryset = self._queryset.filter(created_by__id=created_by_user_id)
def _new_recipes(self, new_days=7):
# TODO make new days a user-setting
@@ -307,9 +323,9 @@ class RecipeSearch():
)
self._queryset = self._queryset.annotate(recent=Coalesce(Max(Case(When(pk__in=num_recent_recipes.values('recipe'), then='viewlog__pk'))), Value(0)))
def _favorite_recipes(self, times_cooked=None):
if self._sort_includes('favorite') or times_cooked:
less_than = '-' in (str(times_cooked) or []) and not self._sort_includes('-favorite')
def _favorite_recipes(self):
if self._sort_includes('favorite') or self._timescooked or self._timescooked_gte or self._timescooked_lte:
less_than = self._timescooked_lte and not self._sort_includes('-favorite')
if less_than:
default = 1000
else:
@@ -321,15 +337,13 @@ class RecipeSearch():
.values('count')
)
self._queryset = self._queryset.annotate(favorite=Coalesce(Subquery(favorite_recipes), default))
if times_cooked is None:
return
if times_cooked == '0':
if self._timescooked:
self._queryset = self._queryset.filter(favorite=0)
elif less_than:
self._queryset = self._queryset.filter(favorite__lte=int(times_cooked.replace('-', ''))).exclude(favorite=0)
else:
self._queryset = self._queryset.filter(favorite__gte=int(times_cooked))
elif self._timescooked_lte:
self._queryset = self._queryset.filter(favorite__lte=int(self._timescooked_lte)).exclude(favorite=0)
elif self._timescooked_gte:
self._queryset = self._queryset.filter(favorite__gte=int(self._timescooked_gte))
def keyword_filters(self, **kwargs):
if all([kwargs[x] is None for x in kwargs]):
@@ -407,25 +421,16 @@ class RecipeSearch():
units = [units]
self._queryset = self._queryset.filter(steps__ingredients__unit__in=units)
def rating_filter(self, rating=None):
if rating or self._sort_includes('rating'):
lessthan = '-' in (rating or [])
reverse = 'rating' in (self._sort_order or []) and '-rating' not in (self._sort_order or [])
if lessthan or reverse:
default = 100
else:
default = 0
# TODO make ratings a settings user-only vs all-users
self._queryset = self._queryset.annotate(rating=Round(Avg(Case(When(cooklog__created_by=self._request.user, then='cooklog__rating'), default=default))))
if rating is None:
return
def rating_filter(self):
if self._rating or self._rating_lte or self._rating_gte or self._sort_includes('rating'):
self._queryset = self._queryset.annotate(rating=Round(Avg(Case(When(cooklog__created_by=self._request.user, then='cooklog__rating'), default=0))))
if rating == '0':
self._queryset = self._queryset.filter(rating=0)
elif lessthan:
self._queryset = self._queryset.filter(rating__lte=int(rating[1:])).exclude(rating=0)
else:
self._queryset = self._queryset.filter(rating__gte=int(rating))
if self._rating:
self._queryset = self._queryset.filter(rating=round(int(self._rating)))
elif self._rating_gte:
self._queryset = self._queryset.filter(rating__gte=int(self._rating_gte))
elif self._rating_lte:
self._queryset = self._queryset.filter(rating__gte=int(self._rating_lte)).exclude(rating=0)
def internal_filter(self, internal=None):
if not internal:
@@ -535,11 +540,11 @@ class RecipeSearch():
shopping_users = [*self._request.user.get_shopping_share(), self._request.user]
onhand_filter = (
Q(steps__ingredients__food__onhand_users__in=shopping_users) # food onhand
# or substitute food onhand
| Q(steps__ingredients__food__substitute__onhand_users__in=shopping_users)
| Q(steps__ingredients__food__in=self.__children_substitute_filter(shopping_users))
| Q(steps__ingredients__food__in=self.__sibling_substitute_filter(shopping_users))
Q(steps__ingredients__food__onhand_users__in=shopping_users) # food onhand
# or substitute food onhand
| Q(steps__ingredients__food__substitute__onhand_users__in=shopping_users)
| Q(steps__ingredients__food__in=self.__children_substitute_filter(shopping_users))
| Q(steps__ingredients__food__in=self.__sibling_substitute_filter(shopping_users))
)
makenow_recipes = Recipe.objects.annotate(
count_food=Count('steps__ingredients__food__pk', filter=Q(steps__ingredients__food__isnull=False), distinct=True),

View File

@@ -6,7 +6,7 @@ from django.utils.dateparse import parse_duration
from django.utils.translation import gettext as _
from isodate import parse_duration as iso_parse_duration
from isodate.isoerror import ISO8601Error
from pytube import YouTube
from pytubefix import YouTube
from recipe_scrapers._utils import get_host_name, get_minutes
from cookbook.helper.automation_helper import AutomationEngine
@@ -28,7 +28,9 @@ def get_from_scraper(scrape, request):
source_url = scrape.url
except Exception:
pass
if source_url:
if source_url == "https://urlnotfound.none" or not source_url:
recipe_json['source_url'] = ''
else:
recipe_json['source_url'] = source_url
try:
keywords.append(source_url.replace('http://', '').replace('https://', '').split('/')[0])
@@ -104,14 +106,14 @@ def get_from_scraper(scrape, request):
# assign image
try:
recipe_json['image'] = parse_image(scrape.image()) or None
recipe_json['image_url'] = parse_image(scrape.image()) or None
except Exception:
recipe_json['image'] = None
if not recipe_json['image']:
recipe_json['image_url'] = None
if not recipe_json['image_url']:
try:
recipe_json['image'] = parse_image(scrape.schema.data.get('image')) or ''
recipe_json['image_url'] = parse_image(scrape.schema.data.get('image')) or ''
except Exception:
recipe_json['image'] = ''
recipe_json['image_url'] = ''
# assign keywords
try:
@@ -203,6 +205,7 @@ def get_from_scraper(scrape, request):
except Exception:
pass
recipe_json['properties'] = []
try:
recipe_json['properties'] = get_recipe_properties(request.space, scrape.schema.nutrients())
print(recipe_json['properties'])
@@ -225,6 +228,13 @@ def get_recipe_properties(space, property_data):
"property-proteins": "proteinContent",
"property-fats": "fatContent",
}
serving_size = 1
try:
serving_size = parse_servings(property_data['servingSize'])
except KeyError:
pass
recipe_properties = []
for pt in PropertyType.objects.filter(space=space, open_data_slug__in=list(properties.keys())).all():
for p in list(properties.keys()):
@@ -235,7 +245,7 @@ def get_recipe_properties(space, property_data):
'id': pt.id,
'name': pt.name,
},
'property_amount': parse_servings(property_data[properties[p]]) / parse_servings(property_data['servingSize']),
'property_amount': parse_servings(property_data[properties[p]]) / serving_size,
})
return recipe_properties
@@ -272,9 +282,8 @@ def get_from_youtube_scraper(url, request):
default_recipe_json['image'] = video.thumbnail_url
if video.description:
default_recipe_json['steps'][0]['instruction'] = automation_engine.apply_regex_replace_automation(video.description, Automation.INSTRUCTION_REPLACE)
except Exception:
pass
traceback.print_exc()
return default_recipe_json
@@ -310,10 +319,10 @@ def clean_instruction_string(instruction):
.replace("", _('reverse rotation')) \
.replace("", _('careful rotation')) \
.replace("", _('knead')) \
.replace("Andicken ", _('thicken')) \
.replace("Erwärmen ", _('warm up')) \
.replace("Fermentieren ", _('ferment')) \
.replace("Sous-vide ", _("sous-vide"))
.replace("", _('thicken')) \
.replace("", _('warm up')) \
.replace("", _('ferment')) \
.replace("", _("sous-vide"))
def parse_instructions(instructions):
@@ -394,6 +403,8 @@ def parse_servings_text(servings):
def parse_time(recipe_time):
if not recipe_time:
return 0
if type(recipe_time) not in [int, float]:
try:
recipe_time = float(re.search(r'\d+', recipe_time).group())
@@ -423,9 +434,9 @@ def parse_keywords(keyword_json, request):
if len(kw) != 0:
kw = automation_engine.apply_keyword_automation(kw)
if k := Keyword.objects.filter(name__iexact=kw, space=request.space).first():
keywords.append({'label': str(k), 'name': k.name, 'id': k.id})
keywords.append({'label': str(k), 'name': k.name, 'id': k.id, 'import_keyword': True})
else:
keywords.append({'label': kw, 'name': kw})
keywords.append({'label': kw, 'name': kw, 'import_keyword': False})
return keywords
@@ -482,7 +493,11 @@ def get_images_from_soup(soup, url):
u = u.split('?')[0]
filename = re.search(r'/([\w_-]+[.](jpg|jpeg|gif|png))$', u)
if filename:
if (('http' not in u) and (url)):
if u.startswith('//'):
# urls from e.g. ottolenghi.co.uk start with //
u = 'https:' + u
if ('http' not in u) and url:
print(f'rewriting URL {u}')
# sometimes an image source can be relative
# if it is provide the base url
u = '{}://{}{}'.format(prot, site, u)

View File

@@ -1,8 +1,15 @@
from django.contrib.auth.models import Group
from django.http import HttpResponseRedirect
from django.urls import reverse
from django_scopes import scope, scopes_disabled
from oauth2_provider.contrib.rest_framework import OAuth2Authentication
from psycopg2.errors import UniqueViolation
from rest_framework.exceptions import AuthenticationFailed
import random
from cookbook.helper.permission_helper import create_space_for_user
from cookbook.models import Space, UserSpace
from cookbook.views import views
from recipes import settings
@@ -12,7 +19,7 @@ class ScopeMiddleware:
self.get_response = get_response
def __call__(self, request):
prefix = settings.JS_REVERSE_SCRIPT_PREFIX or ''
prefix = settings.SCRIPT_NAME or ''
# need to disable scopes for writing requests into userpref and enable for loading ?
if request.path.startswith(prefix + '/api/user-preference/'):
@@ -34,16 +41,28 @@ class ScopeMiddleware:
if request.path.startswith(prefix + '/switch-space/'):
return self.get_response(request)
with scopes_disabled():
if request.user.userspace_set.count() == 0 and not reverse('account_logout') in request.path:
return views.space_overview(request)
if request.path.startswith(prefix + '/invite/'):
return self.get_response(request)
# get active user space, if for some reason more than one space is active select first (group permission checks will fail, this is not intended at this point)
user_space = request.user.userspace_set.filter(active=True).first()
if not user_space:
return views.space_overview(request)
if not user_space and request.user.userspace_set.count() > 0:
# if the users has a userspace but nothing is active, activate the first one
user_space = request.user.userspace_set.first()
if user_space:
user_space.active = True
user_space.save()
if not user_space:
if 'signup_token' in request.session:
# if user is authenticated, has no space but a signup token (InviteLink) is present, redirect to invite link logic
return HttpResponseRedirect(reverse('view_invite', args=[request.session.pop('signup_token', '')]))
else:
# if user does not yet have a space create one for him
user_space = create_space_for_user(request.user)
# TODO remove the need for this view
if user_space.groups.count() == 0 and not reverse('account_logout') in request.path:
return views.no_groups(request)

View File

@@ -113,7 +113,7 @@ class RecipeShoppingEditor():
if not self.servings:
self.servings = getattr(self.mealplan, 'servings', None) or getattr(self.recipe, 'servings', 1.0)
self._shopping_list_recipe = ShoppingListRecipe.objects.create(recipe=self.recipe, mealplan=self.mealplan, servings=self.servings)
self._shopping_list_recipe = ShoppingListRecipe.objects.create(recipe=self.recipe, mealplan=self.mealplan, servings=self.servings, space=self.space, created_by=self.created_by)
if ingredients:
self._add_ingredients(ingredients=ingredients)
@@ -153,8 +153,9 @@ class RecipeShoppingEditor():
return True
for sle in ShoppingListEntry.objects.filter(list_recipe=self._shopping_list_recipe):
sle.amount = sle.ingredient.amount * Decimal(self._servings_factor)
sle.save()
if sle.ingredient: # TODO temporarily dont scale manual entries until ingredient_amount or some other base amount has been migrated to SLE
sle.amount = sle.ingredient.amount * Decimal(self._servings_factor)
sle.save()
self._shopping_list_recipe.servings = self.servings
self._shopping_list_recipe.save()
return True

View File

@@ -3,6 +3,8 @@ from gettext import gettext as _
import bleach
import markdown as md
from jinja2 import Template, TemplateSyntaxError, UndefinedError
from jinja2.exceptions import SecurityError
from jinja2.sandbox import SandboxedEnvironment
from markdown.extensions.tables import TableExtension
from cookbook.helper.mdx_attributes import MarkdownFormatExtension
@@ -68,7 +70,7 @@ def render_instructions(step): # TODO deduplicate markdown cleanup code
parsed_md = md.markdown(
instructions,
extensions=[
'markdown.extensions.fenced_code', TableExtension(),
'markdown.extensions.fenced_code', 'markdown.extensions.sane_lists', 'markdown.extensions.nl2br', TableExtension(),
UrlizeExtension(), MarkdownFormatExtension()
]
)
@@ -89,11 +91,13 @@ def render_instructions(step): # TODO deduplicate markdown cleanup code
return f"<scalable-number v-bind:number='{bleach.clean(str(number))}' v-bind:factor='ingredient_factor'></scalable-number>"
try:
template = Template(instructions)
instructions = template.render(ingredients=ingredients, scale=scale)
env = SandboxedEnvironment()
instructions = env.from_string(instructions).render(ingredients=ingredients, scale=scale)
except TemplateSyntaxError:
return _('Could not parse template code.') + ' Error: Template Syntax broken'
except UndefinedError:
return _('Could not parse template code.') + ' Error: Undefined Error'
except SecurityError:
return _('Could not parse template code.') + ' Error: Security Error'
return instructions

View File

@@ -60,14 +60,15 @@ class CookBookApp(Integration):
food=f, unit=u, amount=ingredient.get('amount', None), note=ingredient.get('note', None), original_text=ingredient.get('original_text', None), space=self.request.space,
))
if len(images) > 0:
try:
url = images[0]
if validate_import_url(url):
try:
for url in images:
# import the first valid image which is not cookbookapp branding
if validate_import_url(url) and not url.startswith("https://media.cookbookmanager.com/brand/"):
response = requests.get(url)
self.import_recipe_image(recipe, BytesIO(response.content))
except Exception as e:
print('failed to import image ', str(e))
break
except Exception as e:
print('failed to import image ', str(e))
recipe.save()
return recipe

View File

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

View File

@@ -26,6 +26,12 @@ class Integration:
files = None
export_type = None
ignored_recipes = []
import_log = None
import_duplicates = False
import_meal_plans = True
import_shopping_lists = True
nutrition_per_serving = False
def __init__(self, request, export_type):
"""
@@ -102,7 +108,7 @@ class Integration:
"""
return True
def do_import(self, files, il, import_duplicates):
def do_import(self, files, il, import_duplicates, meal_plans=True, shopping_lists=True, nutrition_per_serving=False):
"""
Imports given files
:param import_duplicates: if true duplicates are imported as well
@@ -111,6 +117,12 @@ class Integration:
:return: HttpResponseRedirect to the recipe search showing all imported recipes
"""
with scope(space=self.request.space):
self.import_log = il
self.import_duplicates = import_duplicates
self.import_meal_plans = meal_plans
self.import_shopping_lists = shopping_lists
self.nutrition_per_serving = nutrition_per_serving
try:
self.files = files
@@ -153,20 +165,37 @@ class Integration:
il.total_recipes = len(new_file_list)
file_list = new_file_list
for z in file_list:
try:
if not hasattr(z, 'filename') or isinstance(z, Tag):
recipe = self.get_recipe_from_file(z)
else:
recipe = self.get_recipe_from_file(BytesIO(import_zip.read(z.filename)))
recipe.keywords.add(self.keyword)
il.msg += self.get_recipe_processed_msg(recipe)
self.handle_duplicates(recipe, import_duplicates)
il.imported_recipes += 1
il.save()
except Exception as e:
traceback.print_exc()
self.handle_exception(e, log=il, message=f'-------------------- \nERROR \n{e}\n--------------------\n')
if isinstance(self, cookbook.integration.gourmet.Gourmet):
self.import_zip = import_zip
new_file_list = []
for file in file_list:
if file.file_size == 0:
next
if file.filename.startswith("index.htm"):
next
if file.filename.endswith(".htm"):
new_file_list += self.split_recipe_file(BytesIO(import_zip.read(file.filename)))
il.total_recipes = len(new_file_list)
file_list = new_file_list
if isinstance(self, cookbook.integration.mealie1.Mealie1):
# since the mealie 1.0 export is a backup and not a classic recipe export we treat it a bit differently
recipes = self.get_recipe_from_file(import_zip)
else:
for z in file_list:
try:
if not hasattr(z, 'filename') or isinstance(z, Tag):
recipe = self.get_recipe_from_file(z)
else:
recipe = self.get_recipe_from_file(BytesIO(import_zip.read(z.filename)))
recipe.keywords.add(self.keyword)
il.msg += self.get_recipe_processed_msg(recipe)
self.handle_duplicates(recipe, import_duplicates)
il.imported_recipes += 1
il.save()
except Exception as e:
traceback.print_exc()
self.handle_exception(e, log=il, message=f'-------------------- \nERROR \n{e}\n--------------------\n')
import_zip.close()
elif '.json' in f['name'] or '.xml' in f['name'] or '.txt' in f['name'] or '.mmf' in f['name'] or '.rk' in f['name'] or '.melarecipe' in f['name']:
data_list = self.split_recipe_file(f['file'])

View File

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

View File

@@ -0,0 +1,342 @@
import json
import re
import traceback
import uuid
from decimal import Decimal
from io import BytesIO
from zipfile import ZipFile
from gettext import gettext as _
from django.db import transaction
from cookbook.helper import ingredient_parser
from cookbook.helper.image_processing import get_filetype
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.helper.recipe_url_import import parse_servings, parse_servings_text, parse_time
from cookbook.integration.integration import Integration
from cookbook.models import Ingredient, Keyword, Recipe, Step, Food, Unit, SupermarketCategory, PropertyType, Property, MealType, MealPlan, CookLog, ShoppingListEntry
class Mealie1(Integration):
"""
integration for mealie past version 1.0
"""
def get_recipe_from_file(self, file):
mealie_database = json.loads(BytesIO(file.read('database.json')).getvalue().decode("utf-8"))
self.import_log.total_recipes = len(mealie_database['recipes'])
self.import_log.msg += f"Importing {len(mealie_database["categories"]) + len(mealie_database["tags"])} tags and categories as keywords...\n"
self.import_log.save()
keywords_categories_dict = {}
for c in mealie_database['categories']:
if keyword := Keyword.objects.filter(name=c['name'], space=self.request.space).first():
keywords_categories_dict[c['id']] = keyword.pk
else:
keyword = Keyword.objects.create(name=c['name'], space=self.request.space)
keywords_categories_dict[c['id']] = keyword.pk
keywords_tags_dict = {}
for t in mealie_database['tags']:
if keyword := Keyword.objects.filter(name=t['name'], space=self.request.space).first():
keywords_tags_dict[t['id']] = keyword.pk
else:
keyword = Keyword.objects.create(name=t['name'], space=self.request.space)
keywords_tags_dict[t['id']] = keyword.pk
self.import_log.msg += f"Importing {len(mealie_database["multi_purpose_labels"])} multi purpose labels as supermarket categories...\n"
self.import_log.save()
supermarket_categories_dict = {}
for m in mealie_database['multi_purpose_labels']:
if supermarket_category := SupermarketCategory.objects.filter(name=m['name'], space=self.request.space).first():
supermarket_categories_dict[m['id']] = supermarket_category.pk
else:
supermarket_category = SupermarketCategory.objects.create(name=m['name'], space=self.request.space)
supermarket_categories_dict[m['id']] = supermarket_category.pk
self.import_log.msg += f"Importing {len(mealie_database["ingredient_foods"])} foods...\n"
self.import_log.save()
foods_dict = {}
for f in mealie_database['ingredient_foods']:
if food := Food.objects.filter(name=f['name'], space=self.request.space).first():
foods_dict[f['id']] = food.pk
else:
food = {'name': f['name'],
'plural_name': f['plural_name'],
'description': f['description'],
'space': self.request.space}
if f['label_id'] and f['label_id'] in supermarket_categories_dict:
food['supermarket_category_id'] = supermarket_categories_dict[f['label_id']]
food = Food.objects.create(**food)
if f['on_hand']:
food.onhand_users.add(self.request.user)
foods_dict[f['id']] = food.pk
self.import_log.msg += f"Importing {len(mealie_database["ingredient_units"])} units...\n"
self.import_log.save()
units_dict = {}
for u in mealie_database['ingredient_units']:
if unit := Unit.objects.filter(name=u['name'], space=self.request.space).first():
units_dict[u['id']] = unit.pk
else:
unit = Unit.objects.create(name=u['name'], plural_name=u['plural_name'], description=u['description'], space=self.request.space)
units_dict[u['id']] = unit.pk
recipes_dict = {}
recipe_property_factor_dict = {}
recipes = []
recipe_keyword_relation = []
for r in mealie_database['recipes']:
if Recipe.objects.filter(space=self.request.space, name=r['name']).exists() and not self.import_duplicates:
self.import_log.msg += f"Ignoring {r['name']} because a recipe with this name already exists.\n"
self.import_log.save()
else:
recipe = Recipe.objects.create(
waiting_time=parse_time(r['perform_time']),
working_time=parse_time(r['prep_time']),
description=r['description'][:512],
name=r['name'],
source_url=r['org_url'],
servings=r['recipe_servings'] if r['recipe_servings'] and r['recipe_servings'] != 0 else 1,
servings_text=r['recipe_yield'].strip() if r['recipe_yield'] else "",
internal=True,
created_at=r['created_at'],
space=self.request.space,
created_by=self.request.user,
)
if not self.nutrition_per_serving:
recipe_property_factor_dict[r['id']] = recipe.servings
self.import_log.msg += self.get_recipe_processed_msg(recipe)
self.import_log.imported_recipes += 1
self.import_log.save()
recipes.append(recipe)
recipes_dict[r['id']] = recipe.pk
recipe_keyword_relation.append(Recipe.keywords.through(recipe_id=recipe.pk, keyword_id=self.keyword.pk))
Recipe.keywords.through.objects.bulk_create(recipe_keyword_relation, ignore_conflicts=True)
self.import_log.msg += f"Importing {len(mealie_database["recipe_instructions"])} instructions...\n"
self.import_log.save()
steps_relation = []
first_step_of_recipe_dict = {}
for s in mealie_database['recipe_instructions']:
if s['recipe_id'] in recipes_dict:
step = Step.objects.create(instruction=(s['text'] if s['text'] else "") + (f" \n {s['summary']}" if s['summary'] else ""),
order=s['position'],
name=s['title'],
space=self.request.space)
steps_relation.append(Recipe.steps.through(recipe_id=recipes_dict[s['recipe_id']], step_id=step.pk))
if s['recipe_id'] not in first_step_of_recipe_dict:
first_step_of_recipe_dict[s['recipe_id']] = step.pk
for n in mealie_database['notes']:
if n['recipe_id'] in recipes_dict:
step = Step.objects.create(instruction=n['text'],
name=n['title'],
order=100,
space=self.request.space)
steps_relation.append(Recipe.steps.through(recipe_id=recipes_dict[n['recipe_id']], step_id=step.pk))
Recipe.steps.through.objects.bulk_create(steps_relation)
ingredient_parser = IngredientParser(self.request, True)
self.import_log.msg += f"Importing {len(mealie_database["recipes_ingredients"])} ingredients...\n"
self.import_log.save()
ingredients_relation = []
for i in mealie_database['recipes_ingredients']:
if i['recipe_id'] in recipes_dict:
if i['title']:
title_ingredient = Ingredient.objects.create(
note=i['title'],
is_header=True,
space=self.request.space,
)
ingredients_relation.append(Step.ingredients.through(step_id=first_step_of_recipe_dict[i['recipe_id']], ingredient_id=title_ingredient.pk))
if i['food_id']:
ingredient = Ingredient.objects.create(
food_id=foods_dict[i['food_id']] if i['food_id'] in foods_dict else None,
unit_id=units_dict[i['unit_id']] if i['unit_id'] in units_dict else None,
original_text=i['original_text'],
order=i['position'],
amount=i['quantity'],
note=i['note'],
space=self.request.space,
)
ingredients_relation.append(Step.ingredients.through(step_id=first_step_of_recipe_dict[i['recipe_id']], ingredient_id=ingredient.pk))
elif i['note'].strip():
amount, unit, food, note = ingredient_parser.parse(i['note'].strip())
f = ingredient_parser.get_food(food)
u = ingredient_parser.get_unit(unit)
ingredient = Ingredient.objects.create(
food=f,
unit=u,
amount=amount,
note=note,
original_text=i['original_text'],
space=self.request.space,
)
ingredients_relation.append(Step.ingredients.through(step_id=first_step_of_recipe_dict[i['recipe_id']], ingredient_id=ingredient.pk))
Step.ingredients.through.objects.bulk_create(ingredients_relation)
self.import_log.msg += f"Importing {len(mealie_database["recipes_to_categories"]) + len(mealie_database["recipes_to_tags"])} category and keyword relations...\n"
self.import_log.save()
recipe_keyword_relation = []
for rC in mealie_database['recipes_to_categories']:
if rC['recipe_id'] in recipes_dict:
recipe_keyword_relation.append(Recipe.keywords.through(recipe_id=recipes_dict[rC['recipe_id']], keyword_id=keywords_categories_dict[rC['category_id']]))
for rT in mealie_database['recipes_to_tags']:
if rT['recipe_id'] in recipes_dict:
recipe_keyword_relation.append(Recipe.keywords.through(recipe_id=recipes_dict[rT['recipe_id']], keyword_id=keywords_tags_dict[rT['tag_id']]))
Recipe.keywords.through.objects.bulk_create(recipe_keyword_relation, ignore_conflicts=True)
self.import_log.msg += f"Importing {len(mealie_database["recipe_nutrition"])} properties...\n"
self.import_log.save()
property_types_dict = {
'calories': PropertyType.objects.get_or_create(name=_('Calories'), space=self.request.space, defaults={'unit': 'kcal', 'fdc_id': 1008})[0],
'carbohydrate_content': PropertyType.objects.get_or_create(name=_('Carbohydrates'), space=self.request.space, defaults={'unit': 'g', 'fdc_id': 1005})[0],
'cholesterol_content': PropertyType.objects.get_or_create(name=_('Cholesterol'), space=self.request.space, defaults={'unit': 'mg', 'fdc_id': 1253})[0],
'fat_content': PropertyType.objects.get_or_create(name=_('Fat'), space=self.request.space, defaults={'unit': 'g', 'fdc_id': 1004})[0],
'fiber_content': PropertyType.objects.get_or_create(name=_('Fiber'), space=self.request.space, defaults={'unit': 'g', 'fdc_id': 1079})[0],
'protein_content': PropertyType.objects.get_or_create(name=_('Protein'), space=self.request.space, defaults={'unit': 'g', 'fdc_id': 1003})[0],
'saturated_fat_content': PropertyType.objects.get_or_create(name=_('Saturated Fat'), space=self.request.space, defaults={'unit': 'g', 'fdc_id': 1258})[0],
'sodium_content': PropertyType.objects.get_or_create(name=_('Sodium'), space=self.request.space, defaults={'unit': 'mg', 'fdc_id': 1093})[0],
'sugar_content': PropertyType.objects.get_or_create(name=_('Sugar'), space=self.request.space, defaults={'unit': 'g', 'fdc_id': 1063})[0],
'trans_fat_content': PropertyType.objects.get_or_create(name=_('Trans Fat'), space=self.request.space, defaults={'unit': 'g', 'fdc_id': 1257})[0],
'unsaturated_fat_content': PropertyType.objects.get_or_create(name=_('Unsaturated Fat'), space=self.request.space, defaults={'unit': 'g'})[0],
}
with transaction.atomic():
recipe_properties_relation = []
properties_relation = []
for r in mealie_database['recipe_nutrition']:
if r['recipe_id'] in recipes_dict:
for key in property_types_dict:
if r[key]:
properties_relation.append(
Property(property_type_id=property_types_dict[key].pk,
property_amount=Decimal(str(r[key])) / (
Decimal(str(recipe_property_factor_dict[r['recipe_id']])) if r['recipe_id'] in recipe_property_factor_dict else 1),
open_data_food_slug=r['recipe_id'],
space=self.request.space))
properties = Property.objects.bulk_create(properties_relation)
property_ids = []
for p in properties:
recipe_properties_relation.append(Recipe.properties.through(recipe_id=recipes_dict[p.open_data_food_slug], property_id=p.pk))
property_ids.append(p.pk)
Recipe.properties.through.objects.bulk_create(recipe_properties_relation, ignore_conflicts=True)
Property.objects.filter(id__in=property_ids).update(open_data_food_slug=None)
# delete unused property types
for pT in property_types_dict:
try:
property_types_dict[pT].delete()
except:
pass
self.import_log.msg += f"Importing {len(mealie_database["recipe_comments"]) + len(mealie_database["recipe_timeline_events"])} comments and cook logs...\n"
self.import_log.save()
cook_log_list = []
for c in mealie_database['recipe_comments']:
if c['recipe_id'] in recipes_dict:
cook_log_list.append(CookLog(
recipe_id=recipes_dict[c['recipe_id']],
comment=c['text'],
created_at=c['created_at'],
created_by=self.request.user,
space=self.request.space,
))
for c in mealie_database['recipe_timeline_events']:
if c['recipe_id'] in recipes_dict:
if c['event_type'] == 'comment':
cook_log_list.append(CookLog(
recipe_id=recipes_dict[c['recipe_id']],
comment=c['message'],
created_at=c['created_at'],
created_by=self.request.user,
space=self.request.space,
))
CookLog.objects.bulk_create(cook_log_list)
if self.import_meal_plans:
self.import_log.msg += f"Importing {len(mealie_database["group_meal_plans"])} meal plans...\n"
self.import_log.save()
meal_types_dict = {}
meal_plans = []
for m in mealie_database['group_meal_plans']:
if m['recipe_id'] in recipes_dict:
if not m['entry_type'] in meal_types_dict:
meal_type = MealType.objects.get_or_create(name=m['entry_type'], created_by=self.request.user, space=self.request.space)[0]
meal_types_dict[m['entry_type']] = meal_type.pk
meal_plans.append(MealPlan(
recipe_id=recipes_dict[m['recipe_id']] if m['recipe_id'] else None,
title=m['title'] if m['title'] else "",
note=m['text'] if m['text'] else "",
from_date=m['date'],
to_date=m['date'],
meal_type_id=meal_types_dict[m['entry_type']],
created_by=self.request.user,
space=self.request.space,
))
MealPlan.objects.bulk_create(meal_plans)
if self.import_shopping_lists:
self.import_log.msg += f"Importing {len(mealie_database["shopping_list_items"])} shopping list items...\n"
self.import_log.save()
shopping_list_items = []
for sli in mealie_database['shopping_list_items']:
if not sli['checked']:
if sli['food_id']:
shopping_list_items.append(ShoppingListEntry(
amount=sli['quantity'],
unit_id=units_dict[sli['unit_id']] if sli['unit_id'] else None,
food_id=foods_dict[sli['food_id']] if sli['food_id'] else None,
created_by=self.request.user,
space=self.request.space,
))
elif not sli['food_id'] and sli['note'].strip():
amount, unit, food, note = ingredient_parser.parse(sli['note'].strip())
f = ingredient_parser.get_food(food)
u = ingredient_parser.get_unit(unit)
shopping_list_items.append(ShoppingListEntry(
amount=amount,
unit=u,
food=f,
created_by=self.request.user,
space=self.request.space,
))
ShoppingListEntry.objects.bulk_create(shopping_list_items)
self.import_log.msg += f"Importing Images. This might take some time ...\n"
self.import_log.save()
for r in mealie_database['recipes']:
try:
if recipe := Recipe.objects.filter(pk=recipes_dict[r['id']]).first():
self.import_recipe_image(recipe, BytesIO(file.read(f'data/recipes/{str(uuid.UUID(str(r['id'])))}/images/original.webp')), filetype='.webp')
except Exception:
pass
return recipes
def get_file_from_recipe(self, recipe):
raise NotImplementedError('Method not implemented in storage integration')

View File

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

View File

@@ -1,10 +1,10 @@
import imghdr
import json
import re
from io import BytesIO
from zipfile import ZipFile
import requests
from PIL import Image
from django.utils.translation import gettext as _
@@ -128,7 +128,7 @@ class RecetteTek(Integration):
url = file['originalPicture']
if validate_import_url(url):
response = requests.get(url)
if imghdr.what(BytesIO(response.content)) is not None:
if Image.open(BytesIO(response.content)).verify():
self.import_recipe_image(recipe, BytesIO(response.content), filetype=get_filetype(file['originalPicture']))
else:
raise Exception("Original image failed to download.")

File diff suppressed because it is too large Load Diff

View File

@@ -15,10 +15,10 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2024-07-31 13:05+0000\n"
"Last-Translator: vabene1111 <vabene1234@googlemail.com>\n"
"Language-Team: German <http://translate.tandoor.dev/projects/tandoor/recipes-"
"backend/de/>\n"
"PO-Revision-Date: 2024-09-27 13:58+0000\n"
"Last-Translator: supaeasy <crafty_renewably854@supaeasy.de>\n"
"Language-Team: German <http://translate.tandoor.dev/projects/tandoor/"
"recipes-backend/de/>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -478,7 +478,7 @@ msgstr "Essensplan"
#: .\cookbook\models.py:456 .\cookbook\templates\base.html:122
#: .\cookbook\views\views.py:459
msgid "Books"
msgstr "Bücher"
msgstr "Kochbücher"
#: .\cookbook\models.py:457 .\cookbook\templates\base.html:118
#: .\cookbook\views\views.py:460
@@ -542,10 +542,8 @@ msgid "Instruction Replace"
msgstr "Anleitung ersetzen"
#: .\cookbook\models.py:1472
#, fuzzy
#| msgid "New Unit"
msgid "Never Unit"
msgstr "Neue Einheit"
msgstr "Nie Einheit"
#: .\cookbook\models.py:1473
msgid "Transpose Words"
@@ -2143,7 +2141,7 @@ msgstr ""
#: .\cookbook\templates\system.html:86
msgid "Allowed Hosts"
msgstr ""
msgstr "Erlaubte Hosts"
#: .\cookbook\templates\system.html:90
msgid ""
@@ -2153,6 +2151,11 @@ msgid ""
"this.\n"
" "
msgstr ""
"\n"
" Die erlaubten Hosts sind so konfiguriert, dass sie jeden Host "
"erlauben. Das mag in einigen Fällen in Ordnung sein, sollte aber im "
"Regelfall vermieden werden. Bitte lies in der Dokumentation dazu nach.\n"
" "
#: .\cookbook\templates\system.html:97
msgid "Database"
@@ -2504,16 +2507,12 @@ msgid "Filter for entries with the given recipe"
msgstr "Filter für Einträge mit dem angegebenen Rezept"
#: .\cookbook\views\api.py:1292
#, fuzzy
#| msgid ""
#| "Returns the shopping list entry with a primary key of id. Multiple "
#| "values allowed."
msgid ""
"Return the Automations matching the automation type. Multiple values "
"allowed."
msgstr ""
"Zeigt denjenigen Eintrag auf der Einkaufliste mit der angegebenen ID. Kann "
"mehrfach angegeben werden."
"Zeigt Automationen, die dem Automationstyp entsprechen. Kann mehrfach "
"angegeben werden."
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
@@ -2582,10 +2581,8 @@ msgstr ""
"Monitor verwendet wird."
#: .\cookbook\views\delete.py:135
#, fuzzy
#| msgid "Storage Backend"
msgid "Connectors Config Backend"
msgstr "Speicherquelle"
msgstr "Backendkonfiguration für Konnektoren"
#: .\cookbook\views\delete.py:157
msgid "Invite Link"
@@ -2644,10 +2641,8 @@ msgid "Shopping List"
msgstr "Einkaufsliste"
#: .\cookbook\views\lists.py:77 .\cookbook\views\new.py:98
#, fuzzy
#| msgid "Storage Backend"
msgid "Connector Config Backend"
msgstr "Speicherquelle"
msgstr "Backendkonfiguration für Konnektoren"
#: .\cookbook\views\lists.py:91
msgid "Invite Links"
@@ -2743,7 +2738,7 @@ msgstr "Sie verwenden PostgreSQL %(v1)s. PostgreSQL %(v2)s wird empfohlen"
#: .\cookbook\views\views.py:313
msgid "Unable to determine PostgreSQL version."
msgstr ""
msgstr "PostgreSQL version konnte nicht erkannt werden."
#: .\cookbook\views\views.py:317
msgid ""
@@ -2755,18 +2750,14 @@ msgstr ""
"PostgreSQL-Datenbanken funktionieren."
#: .\cookbook\views\views.py:360
#, fuzzy
#| msgid ""
#| "The setup page can only be used to create the first user! If you have "
#| "forgotten your superuser credentials please consult the django "
#| "documentation on how to reset passwords."
msgid ""
"The setup page can only be used to create the first "
"user! If you have forgotten your superuser credentials "
"please consult the django documentation on how to reset passwords."
msgstr ""
"Die Setup-Seite kann nur für den ersten Nutzer verwendet werden. Zum "
"Zurücksetzen von Passwörtern bitte der Django-Dokumentation folgen."
"Die Setup-Seite kann nur für den ersten Nutzer verwendet "
"werden. Falls du die Superuser Logindaten vergessen "
"hast, folge bitte der Django-Dokumentation um Passwörter zurückzusetzen."
#: .\cookbook\views\views.py:369
msgid "Passwords dont match!"

View File

@@ -8,16 +8,16 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2023-08-21 09:19+0000\n"
"Last-Translator: Theodoros Grammenos <teogramm@outlook.com>\n"
"Language-Team: Greek <http://translate.tandoor.dev/projects/tandoor/recipes-"
"backend/el/>\n"
"PO-Revision-Date: 2024-09-23 21:58+0000\n"
"Last-Translator: Emmker <emmker@gmail.com>\n"
"Language-Team: Greek <http://translate.tandoor.dev/projects/tandoor/"
"recipes-backend/el/>\n"
"Language: el\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.15\n"
"X-Generator: Weblate 5.6.2\n"
#: .\cookbook\forms.py:45
msgid ""
@@ -33,7 +33,7 @@ msgstr "Όνομα"
#: .\cookbook\forms.py:62 .\cookbook\forms.py:246 .\cookbook\views\lists.py:103
msgid "Keywords"
msgstr "Λέξεις κλειδιά"
msgstr "Λέξεις Κλειδιά"
#: .\cookbook\forms.py:62
msgid "Preparation time in minutes"
@@ -98,7 +98,7 @@ msgstr ""
#: .\cookbook\forms.py:205
msgid "http://homeassistant.local:8123/api for example"
msgstr ""
msgstr "http://homeassistant.local:8123/api για παράδειγμα"
#: .\cookbook\forms.py:222 .\cookbook\views\edit.py:117
msgid "Storage"

View File

@@ -14,8 +14,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2024-03-27 19:02+0000\n"
"Last-Translator: Axel Breiterman <axelbreiterman@gmail.com>\n"
"PO-Revision-Date: 2025-06-23 08:28+0000\n"
"Last-Translator: Ángel <1024mb@users.noreply.translate.tandoor.dev>\n"
"Language-Team: Spanish <http://translate.tandoor.dev/projects/tandoor/"
"recipes-backend/es/>\n"
"Language: es\n"
@@ -23,7 +23,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.4.2\n"
"X-Generator: Weblate 5.8.4\n"
#: .\cookbook\forms.py:45
msgid ""
@@ -66,31 +66,30 @@ msgid ""
"To prevent duplicates recipes with the same name as existing ones are "
"ignored. Check this box to import everything."
msgstr ""
"Para evitar duplicados, las recetas con el mismo nombre serán ignoradas. "
"Marca esta opción para importar todas las recetas."
"Para evitar duplicados, las recetas con el mismo nombre que las ya "
"existentes serán ignoradas. Marca esta casilla para importar todo."
#: .\cookbook\forms.py:143
msgid "Add your comment: "
msgstr "Añada su comentario: "
msgstr "Añade tu comentario: "
#: .\cookbook\forms.py:151
msgid "Leave empty for dropbox and enter app password for nextcloud."
msgstr ""
"Déjelo vacío para Dropbox e ingrese la contraseña de la aplicación para "
"nextcloud."
"Déjalo vacío para Dropbox o ingresa la contraseña de la aplicación para "
"Nextcloud."
#: .\cookbook\forms.py:154
msgid "Leave empty for nextcloud and enter api token for dropbox."
msgstr ""
"Déjelo en blanco para nextcloud e ingrese el token de api para dropbox."
msgstr "Déjalo vacío para Nextcloud o ingresa el token API para Dropbox."
#: .\cookbook\forms.py:160
msgid ""
"Leave empty for dropbox and enter only base url for nextcloud (<code>/remote."
"php/webdav/</code> is added automatically)"
msgstr ""
"Dejar vac para Dropbox e introducir sólo la URL base para Nextcloud "
"(<code>/remote.php/webdav/</code> se añade automáticamente)"
"Déjalo vacío para Dropbox o ingresa solo la URL base para Nextcloud "
"(<code>/remote.php/webdav/</code> es añadido automáticamente)"
#: .\cookbook\forms.py:188
msgid ""
@@ -98,15 +97,16 @@ msgid ""
"profile\">Long Lived Access Token</a> for your HomeAssistant instance"
msgstr ""
"<a href=\"https://www.home-assistant.io/docs/authentication/#your-account-"
"profile\">Token de larga duración</a>para tu instancia de HomeAssistant"
"profile\">Token de acceso de larga duración</a> para tu instancia de "
"HomeAssistant"
#: .\cookbook\forms.py:193
msgid "Something like http://homeassistant.local:8123/api"
msgstr "Algo similar a http://homeassistant.local:8123/api"
msgstr "Algo como http://homeassistant.local:8123/api"
#: .\cookbook\forms.py:205
msgid "http://homeassistant.local:8123/api for example"
msgstr "por ejemplo http://homeassistant.local:8123/api for example"
msgstr "Por ejemplo http://homeassistant.local:8123/api"
#: .\cookbook\forms.py:222 .\cookbook\views\edit.py:117
msgid "Storage"
@@ -284,14 +284,12 @@ msgid "You have more users than allowed in your space."
msgstr "Tenés mas usuarios que los permitidos en tu espacio"
#: .\cookbook\helper\recipe_url_import.py:310
#, fuzzy
#| msgid "Use fractions"
msgid "reverse rotation"
msgstr "Usar fracciones"
msgstr "rotación inversa"
#: .\cookbook\helper\recipe_url_import.py:311
msgid "careful rotation"
msgstr ""
msgstr "rotación cuidadosa"
#: .\cookbook\helper\recipe_url_import.py:312
msgid "knead"
@@ -398,8 +396,9 @@ msgid "Section"
msgstr "Sección"
#: .\cookbook\management\commands\fix_duplicate_properties.py:15
#, fuzzy
msgid "Fixes foods with "
msgstr ""
msgstr "Corrige alimentos con "
#: .\cookbook\management\commands\rebuildindex.py:14
msgid "Rebuilds full text search index on Recipe"
@@ -436,16 +435,14 @@ msgid "Other"
msgstr "Otro"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:17
#, fuzzy
#| msgid "Fats"
msgid "Fat"
msgstr "Grasas"
msgstr "Grasa"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:17
#: .\cookbook\migrations\0190_auto_20230525_1506.py:18
#: .\cookbook\migrations\0190_auto_20230525_1506.py:19
msgid "g"
msgstr ""
msgstr "gr."
#: .\cookbook\migrations\0190_auto_20230525_1506.py:18
msgid "Carbohydrates"
@@ -468,6 +465,8 @@ msgid ""
"Maximum file storage for space in MB. 0 for unlimited, -1 to disable file "
"upload."
msgstr ""
"Almacenamiento máximo de archivos para el espacio en MB. 0 para ilimitado, -"
"1 para desactivar la carga de archivos."
#: .\cookbook\models.py:454 .\cookbook\templates\search.html:7
#: .\cookbook\templates\settings.html:18
@@ -498,18 +497,16 @@ msgid "Nutrition"
msgstr "Información Nutricional"
#: .\cookbook\models.py:918
#, fuzzy
#| msgid "Merge"
msgid "Allergen"
msgstr "Combinar"
msgstr "Alérgeno"
#: .\cookbook\models.py:919
msgid "Price"
msgstr ""
msgstr "Precio"
#: .\cookbook\models.py:919
msgid "Goal"
msgstr ""
msgstr "Objetivo"
#: .\cookbook\models.py:1408 .\cookbook\templates\search_info.html:28
msgid "Simple"
@@ -532,54 +529,40 @@ msgid "Food Alias"
msgstr "Alias de la Comida"
#: .\cookbook\models.py:1468
#, fuzzy
#| msgid "Units"
msgid "Unit Alias"
msgstr "Unidades"
msgstr "Alias de unidad"
#: .\cookbook\models.py:1469
#, fuzzy
#| msgid "Keywords"
msgid "Keyword Alias"
msgstr "Palabras clave"
msgstr "Alias de palabra clave"
#: .\cookbook\models.py:1470
#, fuzzy
#| msgid "Description"
msgid "Description Replace"
msgstr "Descripción"
msgstr "Reemplazo de descripción"
#: .\cookbook\models.py:1471
#, fuzzy
#| msgid "Instructions"
msgid "Instruction Replace"
msgstr "Instrucciones"
msgstr "Reemplazo de instrucciones"
#: .\cookbook\models.py:1472
#, fuzzy
#| msgid "New Unit"
msgid "Never Unit"
msgstr "Nueva Unidad"
msgstr "Unidad prohibida"
#: .\cookbook\models.py:1473
msgid "Transpose Words"
msgstr ""
msgstr "Transponer palabras"
#: .\cookbook\models.py:1474
#, fuzzy
#| msgid "Food Alias"
msgid "Food Replace"
msgstr "Alias de la Comida"
msgstr "Reemplazo de alimento"
#: .\cookbook\models.py:1475
#, fuzzy
#| msgid "Description"
msgid "Unit Replace"
msgstr "Descripción"
msgstr "Reemplazo de unidad"
#: .\cookbook\models.py:1476
msgid "Name Replace"
msgstr ""
msgstr "Reemplazo de nombre"
#: .\cookbook\models.py:1503 .\cookbook\views\delete.py:40
#: .\cookbook\views\edit.py:210 .\cookbook\views\new.py:39
@@ -587,10 +570,8 @@ msgid "Recipe"
msgstr "Receta"
#: .\cookbook\models.py:1504
#, fuzzy
#| msgid "Food"
msgid "Food"
msgstr "Comida"
msgstr "Alimento"
#: .\cookbook\models.py:1505 .\cookbook\templates\base.html:149
msgid "Keyword"
@@ -648,22 +629,26 @@ msgstr "Invitación para Tandoor Recipes"
#: .\cookbook\serializer.py:1426
msgid "Existing shopping list to update"
msgstr ""
msgstr "Lista de compras existente para actualizar"
#: .\cookbook\serializer.py:1428
msgid ""
"List of ingredient IDs from the recipe to add, if not provided all "
"ingredients will be added."
msgstr ""
"Lista de IDs de ingredientes de la receta para agregar; si no se "
"proporciona, se agregarán todos los ingredientes."
#: .\cookbook\serializer.py:1430
msgid ""
"Providing a list_recipe ID and servings of 0 will delete that shopping list."
msgstr ""
"Proporcionar un ID list_recipe y porciones igual a 0 eliminará esa lista de "
"compras."
#: .\cookbook\serializer.py:1439
msgid "Amount of food to add to the shopping list"
msgstr ""
msgstr "Cantidad de alimento a agregar a la lista de compras"
#: .\cookbook\serializer.py:1441
msgid "ID of unit to use for the shopping list"

File diff suppressed because it is too large Load Diff

View File

@@ -14,16 +14,16 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2024-05-28 00:57+0000\n"
"Last-Translator: tarek EL SOL <tarek.elsol@gmail.com>\n"
"Language-Team: French <http://translate.tandoor.dev/projects/tandoor/recipes-"
"backend/fr/>\n"
"PO-Revision-Date: 2025-08-10 11:36+0000\n"
"Last-Translator: Enzo La Rafale <enzo.chaussivert@gmail.com>\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"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.4.2\n"
"X-Generator: Weblate 5.8.4\n"
#: .\cookbook\forms.py:45
msgid ""
@@ -405,7 +405,7 @@ msgstr "Rubrique"
#: .\cookbook\management\commands\fix_duplicate_properties.py:15
msgid "Fixes foods with "
msgstr ""
msgstr "Corriger les aliments avec "
#: .\cookbook\management\commands\rebuildindex.py:14
msgid "Rebuilds full text search index on Recipe"
@@ -442,8 +442,6 @@ msgid "Other"
msgstr "Autre"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:17
#, fuzzy
#| msgid "Fats"
msgid "Fat"
msgstr "Matières grasses"
@@ -451,7 +449,7 @@ msgstr "Matières grasses"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:18
#: .\cookbook\migrations\0190_auto_20230525_1506.py:19
msgid "g"
msgstr ""
msgstr "g"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:18
msgid "Carbohydrates"
@@ -467,7 +465,7 @@ msgstr "Calories"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:20
msgid "kcal"
msgstr ""
msgstr "kcal"
#: .\cookbook\models.py:325
msgid ""
@@ -506,18 +504,16 @@ msgid "Nutrition"
msgstr "Informations nutritionnelles"
#: .\cookbook\models.py:918
#, fuzzy
#| msgid "Merge"
msgid "Allergen"
msgstr "Fusionner"
msgstr "Allergène"
#: .\cookbook\models.py:919
msgid "Price"
msgstr ""
msgstr "Prix"
#: .\cookbook\models.py:919
msgid "Goal"
msgstr ""
msgstr "Objectif"
#: .\cookbook\models.py:1408 .\cookbook\templates\search_info.html:28
msgid "Simple"
@@ -556,30 +552,24 @@ msgid "Instruction Replace"
msgstr "Remplacer l'instruction"
#: .\cookbook\models.py:1472
#, fuzzy
#| msgid "New Unit"
msgid "Never Unit"
msgstr "Nouvelle unité"
msgstr "Aucune unité"
#: .\cookbook\models.py:1473
msgid "Transpose Words"
msgstr ""
msgstr "Transposer les mots"
#: .\cookbook\models.py:1474
#, fuzzy
#| msgid "Food Alias"
msgid "Food Replace"
msgstr "Aliment équivalent"
msgstr "Aliment alternatif"
#: .\cookbook\models.py:1475
#, fuzzy
#| msgid "Description Replace"
msgid "Unit Replace"
msgstr "Remplacer la Description"
msgstr "Remplacer l'unité"
#: .\cookbook\models.py:1476
msgid "Name Replace"
msgstr ""
msgstr "Remplacer le nom"
#: .\cookbook\models.py:1503 .\cookbook\views\delete.py:40
#: .\cookbook\views\edit.py:210 .\cookbook\views\new.py:39
@@ -1039,13 +1029,11 @@ msgstr "Exporter"
#: .\cookbook\templates\base.html:287
msgid "Properties"
msgstr ""
msgstr "Propriétés"
#: .\cookbook\templates\base.html:301 .\cookbook\views\lists.py:255
#, fuzzy
#| msgid "Account Connections"
msgid "Unit Conversions"
msgstr "Comptes connectés"
msgstr "Conversions d'unités"
#: .\cookbook\templates\base.html:318 .\cookbook\templates\index.html:47
msgid "Import Recipe"
@@ -1065,10 +1053,8 @@ msgid "Space Settings"
msgstr "Paramètres de groupe"
#: .\cookbook\templates\base.html:340
#, fuzzy
#| msgid "External Recipes"
msgid "External Connectors"
msgstr "Recettes externes"
msgstr "Connecteurs externes"
#: .\cookbook\templates\base.html:345 .\cookbook\templates\system.html:13
msgid "System"
@@ -1532,10 +1518,8 @@ msgid "Back"
msgstr "Retour"
#: .\cookbook\templates\property_editor.html:7
#, fuzzy
#| msgid "Ingredient Editor"
msgid "Property Editor"
msgstr "Éditeur dingrédients"
msgstr "Éditeur de propriété"
#: .\cookbook\templates\recipe_view.html:36
msgid "Comments"
@@ -2013,10 +1997,8 @@ msgid "Sign in using"
msgstr "Se connecter avec"
#: .\cookbook\templates\space_manage.html:7
#, fuzzy
#| msgid "Space Membership"
msgid "Space Management"
msgstr "Adhésion à l'espace"
msgstr "Gestion de l'espace"
#: .\cookbook\templates\space_manage.html:26
msgid "Space:"
@@ -2112,6 +2094,11 @@ msgid ""
"script to generate version information (done automatically in docker).\n"
" "
msgstr ""
"\n"
" Vous devez exécuter <code>version.py</code> dans votre script de "
"mise à jour pour générer les informations de version (automatique avec "
"docker).\n"
" "
#: .\cookbook\templates\system.html:46
msgid "Media Serving"
@@ -2199,7 +2186,7 @@ msgstr ""
#: .\cookbook\templates\system.html:86
msgid "Allowed Hosts"
msgstr ""
msgstr "Hôtes autorisés"
#: .\cookbook\templates\system.html:90
msgid ""
@@ -2209,6 +2196,11 @@ msgid ""
"this.\n"
" "
msgstr ""
"\n"
" Votre configuration autorise tous les hôtes, cela ok dans "
"certaines installations mais évité. Veuillez consulter les documentations à "
"ce sujet.\n"
" "
#: .\cookbook\templates\system.html:97
msgid "Database"
@@ -2219,10 +2211,8 @@ msgid "Info"
msgstr "Info"
#: .\cookbook\templates\system.html:110 .\cookbook\templates\system.html:127
#, fuzzy
#| msgid "Use fractions"
msgid "Migrations"
msgstr "Utiliser les fractions"
msgstr "Migrations"
#: .\cookbook\templates\system.html:116
msgid ""
@@ -2235,24 +2225,30 @@ msgid ""
"issue.\n"
" "
msgstr ""
"\n"
" Les migrations de données ne devraient jamais échouer!\n"
" Les échecs de migrations vont causer des problèmes de "
"fonctionnement majeurs dans lapplication..\n"
" Si une migration échoue, vérifiez que vous êtes sur la dernière "
"version et si c'est le cas veuillez créer un ticket sur GitHub avec le "
"contenu du journal de migration.\n"
" "
#: .\cookbook\templates\system.html:182
msgid "False"
msgstr ""
msgstr "Faux"
#: .\cookbook\templates\system.html:182
msgid "True"
msgstr ""
msgstr "Vrai"
#: .\cookbook\templates\system.html:207
msgid "Hide"
msgstr ""
msgstr "Cacher"
#: .\cookbook\templates\system.html:210
#, fuzzy
#| msgid "Show Log"
msgid "Show"
msgstr "Afficher le journal"
msgstr "Afficher"
#: .\cookbook\templates\url_import.html:8
msgid "URL Import"
@@ -2328,18 +2324,18 @@ msgstr "{obj.name} a été ajouté(e) à la liste de courses."
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
msgstr "Filtrer les repas depuis la date (incluse) avec le format YYYY-MM-DD."
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
"Filtrer les plannings de repas depuis la date (incluse) avec le format YYYY-"
"MM-DD."
#: .\cookbook\views\api.py:744
#, fuzzy
#| msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
msgstr ""
"Identifiant de la recette dont fait partie une étape. Pour plusieurs "
"Filtrer le planning des repas avec l'identifiant MealType. Pour plusieurs "
"paramètres de répétition."
#: .\cookbook\views\api.py:872
@@ -2442,18 +2438,27 @@ msgstr ""
#: .\cookbook\views\api.py:922
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
"ID du livre dans lequel une recette doit se trouver. Pour plusieurs "
"paramètres de répétition."
#: .\cookbook\views\api.py:923
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr ""
"IDs de livre, répéter pour plusieurs livres. Renvoie les recettes dans "
"n'importe quel livre."
#: .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr ""
"IDs de livre, répéter pour plusieurs livres. Renvoie les recettes dans tous "
"les livre."
#: .\cookbook\views\api.py:925
#, fuzzy
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
"Identifiants de livres : répéter pour plusieurs. Exclure les recettes de "
"l'un des livres."
#: .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."

View File

@@ -8,17 +8,17 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2024-07-28 08:38+0000\n"
"Last-Translator: dudu dor <dudpon@gmail.com>\n"
"Language-Team: Hebrew <http://translate.tandoor.dev/projects/tandoor/recipes-"
"backend/he/>\n"
"PO-Revision-Date: 2025-03-07 15:08+0000\n"
"Last-Translator: yonatan ben-menachem <2bmyonatan@gmail.com>\n"
"Language-Team: Hebrew <http://translate.tandoor.dev/projects/tandoor/"
"recipes-backend/he/>\n"
"Language: he\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && "
"n % 10 == 0) ? 2 : 3));\n"
"X-Generator: Weblate 5.4.2\n"
"X-Generator: Weblate 5.8.4\n"
#: .\cookbook\forms.py:45
msgid ""
@@ -59,18 +59,20 @@ msgid ""
"To prevent duplicates recipes with the same name as existing ones are "
"ignored. Check this box to import everything."
msgstr ""
"בשביל למנוע כפילויות, מתוכנים בעלי שם זהה למתכון קיים לא יעובדו. סמן כאן כדי "
"לייבא בכל זאת."
#: .\cookbook\forms.py:143
msgid "Add your comment: "
msgstr "הוף את ההערות שלך:- "
msgstr "הוסף את ההערה שלך::- "
#: .\cookbook\forms.py:151
msgid "Leave empty for dropbox and enter app password for nextcloud."
msgstr "השאר ריק עבור dropbox והכנס סיסמאת יישום עבור nextcloud."
msgstr "השאר ריק עבור Dropbox והכנס סיסמא עבור NextCloud."
#: .\cookbook\forms.py:154
msgid "Leave empty for nextcloud and enter api token for dropbox."
msgstr "השאר ריק עבור nextcloud והכנס טוקן API עבור dropbox."
msgstr "השאר ריק עבור NextCloud והכנס טוקן API עבור Dropbox."
#: .\cookbook\forms.py:160
msgid ""
@@ -149,6 +151,7 @@ msgid ""
"Use fuzzy matching on units, keywords and ingredients when editing and "
"importing recipes."
msgstr ""
"השתמש בהתאמה גמישה ליחידות, מילות מפתח ורכיבים בעת עריכה וייבוא מתכונים."
#: .\cookbook\forms.py:342
msgid ""
@@ -237,7 +240,7 @@ msgstr ""
#: .\cookbook\helper\permission_helper.py:237
#: .\cookbook\helper\permission_helper.py:252
msgid "You cannot interact with this object as it is not owned by you!"
msgstr ""
msgstr "אינך יכול/ה לפעול על אובייקט זה כיוון שהוא לא בבעלותך!"
#: .\cookbook\helper\permission_helper.py:402
msgid "You have reached the maximum number of recipes for your space."
@@ -441,7 +444,7 @@ msgstr ""
#: .\cookbook\models.py:457 .\cookbook\templates\base.html:118
#: .\cookbook\views\views.py:460
msgid "Shopping"
msgstr ""
msgstr "קניות"
#: .\cookbook\models.py:752
msgid " is part of a recipe step and cannot be deleted"
@@ -526,7 +529,7 @@ msgstr ""
#: .\cookbook\models.py:1504
msgid "Food"
msgstr ""
msgstr "אוכל"
#: .\cookbook\models.py:1505 .\cookbook\templates\base.html:149
msgid "Keyword"
@@ -546,7 +549,7 @@ msgstr ""
#: .\cookbook\serializer.py:1270
msgid "Hello"
msgstr ""
msgstr "שלום"
#: .\cookbook\serializer.py:1270
msgid "You have been invited by "
@@ -567,12 +570,12 @@ msgstr ""
#: .\cookbook\serializer.py:1278
msgid "The invitation is valid until "
msgstr ""
msgstr "ההזמנה תקפה עד "
#: .\cookbook\serializer.py:1280
msgid ""
"Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub "
msgstr ""
msgstr "Tandoor Recipes הוא מנהל מתכונים בקוד פתוח. ניתן למצוא אותנו ב-GitHub. "
#: .\cookbook\serializer.py:1283
msgid "Tandoor Recipes Invite"
@@ -610,11 +613,11 @@ msgstr ""
#: .\cookbook\templates\generic\delete_template.html:15
#: .\cookbook\templates\generic\edit_template.html:28
msgid "Delete"
msgstr ""
msgstr "מחיקה"
#: .\cookbook\templates\404.html:5
msgid "404 Error"
msgstr ""
msgstr "שגיאה 404"
#: .\cookbook\templates\404.html:18
msgid "The page you are looking for could not be found."
@@ -626,12 +629,12 @@ msgstr ""
#: .\cookbook\templates\404.html:35
msgid "Report a Bug"
msgstr ""
msgstr "דווח על באג"
#: .\cookbook\templates\account\email.html:6
#: .\cookbook\templates\account\email.html:17
msgid "E-mail Addresses"
msgstr ""
msgstr "כתובות אימייל"
#: .\cookbook\templates\account\email.html:12
#: .\cookbook\templates\account\password_change.html:11
@@ -641,11 +644,11 @@ msgstr ""
#: .\cookbook\templates\socialaccount\connections.html:10
#: .\cookbook\templates\user_settings.html:8
msgid "Settings"
msgstr ""
msgstr "הגדרות"
#: .\cookbook\templates\account\email.html:13
msgid "Email"
msgstr ""
msgstr "מייל"
#: .\cookbook\templates\account\email.html:19
msgid "The following e-mail addresses are associated with your account:"
@@ -653,33 +656,33 @@ msgstr ""
#: .\cookbook\templates\account\email.html:36
msgid "Verified"
msgstr ""
msgstr "מאומת"
#: .\cookbook\templates\account\email.html:38
msgid "Unverified"
msgstr ""
msgstr "לא מאומת"
#: .\cookbook\templates\account\email.html:40
msgid "Primary"
msgstr ""
msgstr "ראשי"
#: .\cookbook\templates\account\email.html:47
msgid "Make Primary"
msgstr ""
msgstr "הגדר כראשי"
#: .\cookbook\templates\account\email.html:49
msgid "Re-send Verification"
msgstr ""
msgstr "שלח אימות מחדש"
#: .\cookbook\templates\account\email.html:50
#: .\cookbook\templates\generic\delete_template.html:57
#: .\cookbook\templates\socialaccount\connections.html:44
msgid "Remove"
msgstr ""
msgstr "הסרה"
#: .\cookbook\templates\account\email.html:58
msgid "Warning:"
msgstr ""
msgstr "אזהרה:"
#: .\cookbook\templates\account\email.html:58
msgid ""
@@ -689,11 +692,11 @@ msgstr ""
#: .\cookbook\templates\account\email.html:64
msgid "Add E-mail Address"
msgstr ""
msgstr "הוספת כתובת מייל"
#: .\cookbook\templates\account\email.html:69
msgid "Add E-mail"
msgstr ""
msgstr "הוספת מייל"
#: .\cookbook\templates\account\email.html:79
msgid "Do you really want to remove the selected e-mail address?"
@@ -702,7 +705,7 @@ msgstr ""
#: .\cookbook\templates\account\email_confirm.html:6
#: .\cookbook\templates\account\email_confirm.html:10
msgid "Confirm E-mail Address"
msgstr ""
msgstr "אשר כתובת מייל"
#: .\cookbook\templates\account\email_confirm.html:16
#, python-format
@@ -716,7 +719,7 @@ msgstr ""
#: .\cookbook\templates\account\email_confirm.html:22
#: .\cookbook\templates\generic\delete_template.html:72
msgid "Confirm"
msgstr ""
msgstr "אשר"
#: .\cookbook\templates\account\email_confirm.html:29
#, python-format
@@ -729,7 +732,7 @@ msgstr ""
#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:388
#: .\cookbook\templates\openid\login.html:8
msgid "Login"
msgstr ""
msgstr "התחבר"
#: .\cookbook\templates\account\login.html:15
#: .\cookbook\templates\account\login.html:31
@@ -741,7 +744,7 @@ msgstr ""
#: .\cookbook\templates\openid\login.html:26
#: .\cookbook\templates\socialaccount\authentication_error.html:15
msgid "Sign In"
msgstr ""
msgstr "התחבר"
#: .\cookbook\templates\account\login.html:34
#: .\cookbook\templates\account\password_reset.html:41
@@ -749,7 +752,7 @@ msgstr ""
#: .\cookbook\templates\socialaccount\signup.html:8
#: .\cookbook\templates\socialaccount\signup.html:57
msgid "Sign Up"
msgstr ""
msgstr "הירשם"
#: .\cookbook\templates\account\login.html:38
msgid "Lost your password?"
@@ -758,7 +761,7 @@ msgstr ""
#: .\cookbook\templates\account\login.html:39
#: .\cookbook\templates\account\password_reset.html:29
msgid "Reset My Password"
msgstr ""
msgstr "איפוס סיסמא"
#: .\cookbook\templates\account\login.html:50
msgid "Social Login"
@@ -772,7 +775,7 @@ msgstr ""
#: .\cookbook\templates\account\logout.html:9
#: .\cookbook\templates\account\logout.html:18
msgid "Sign Out"
msgstr ""
msgstr "התנתק"
#: .\cookbook\templates\account\logout.html:11
msgid "Are you sure you want to sign out?"
@@ -791,7 +794,7 @@ msgstr ""
#: .\cookbook\templates\account\password_change.html:12
#: .\cookbook\templates\account\password_set.html:12
msgid "Password"
msgstr ""
msgstr "סיסמא"
#: .\cookbook\templates\account\password_change.html:22
msgid "Forgot Password?"
@@ -846,52 +849,52 @@ msgstr ""
#: .\cookbook\templates\account\password_set.html:16
#: .\cookbook\templates\account\password_set.html:21
msgid "Set Password"
msgstr ""
msgstr "קבע סיסמא"
#: .\cookbook\templates\account\signup.html:6
msgid "Register"
msgstr ""
msgstr "הירשם"
#: .\cookbook\templates\account\signup.html:12
msgid "Create an Account"
msgstr ""
msgstr "צור משתמש"
#: .\cookbook\templates\account\signup.html:42
#: .\cookbook\templates\socialaccount\signup.html:33
msgid "I accept the follwoing"
msgstr ""
msgstr "אני מקבל את התנאים הבאים"
#: .\cookbook\templates\account\signup.html:45
#: .\cookbook\templates\socialaccount\signup.html:36
msgid "Terms and Conditions"
msgstr ""
msgstr "תנאים והגבלות"
#: .\cookbook\templates\account\signup.html:48
#: .\cookbook\templates\socialaccount\signup.html:39
msgid "and"
msgstr ""
msgstr "ו"
#: .\cookbook\templates\account\signup.html:52
#: .\cookbook\templates\socialaccount\signup.html:43
msgid "Privacy Policy"
msgstr ""
msgstr "מדיניות פרטיות"
#: .\cookbook\templates\account\signup.html:65
msgid "Create User"
msgstr ""
msgstr "צור משתמש"
#: .\cookbook\templates\account\signup.html:69
msgid "Already have an account?"
msgstr ""
msgstr "יש לך חשבון?"
#: .\cookbook\templates\account\signup_closed.html:5
#: .\cookbook\templates\account\signup_closed.html:11
msgid "Sign Up Closed"
msgstr ""
msgstr "ההרשמה סגורה"
#: .\cookbook\templates\account\signup_closed.html:13
msgid "We are sorry, but the sign up is currently closed."
msgstr ""
msgstr "אנו מצטערים, אך ההרשמה כרגע סגורה."
#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:378
#: .\cookbook\templates\rest_framework\api.html:11
@@ -900,11 +903,11 @@ msgstr ""
#: .\cookbook\templates\base.html:110 .\cookbook\templates\index.html:87
msgid "Recipes"
msgstr ""
msgstr "מתכונים"
#: .\cookbook\templates\base.html:161 .\cookbook\views\lists.py:120
msgid "Foods"
msgstr ""
msgstr "מאכלים"
#: .\cookbook\templates\base.html:173 .\cookbook\views\lists.py:137
msgid "Units"
@@ -920,11 +923,11 @@ msgstr ""
#: .\cookbook\templates\base.html:211 .\cookbook\views\lists.py:186
msgid "Automations"
msgstr ""
msgstr "אוטומציות"
#: .\cookbook\templates\base.html:225 .\cookbook\views\lists.py:222
msgid "Files"
msgstr ""
msgstr "קבצים"
#: .\cookbook\templates\base.html:237
msgid "Batch Edit"
@@ -945,7 +948,7 @@ msgstr ""
#: .\cookbook\templates\export_response.html:7
#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20
msgid "Export"
msgstr ""
msgstr "יצא"
#: .\cookbook\templates\base.html:287
msgid "Properties"
@@ -970,7 +973,7 @@ msgstr ""
#: .\cookbook\templates\base.html:336 .\cookbook\templates\space_manage.html:15
msgid "Space Settings"
msgstr ""
msgstr "הגדרות מרחב"
#: .\cookbook\templates\base.html:340
msgid "External Connectors"
@@ -978,21 +981,21 @@ msgstr ""
#: .\cookbook\templates\base.html:345 .\cookbook\templates\system.html:13
msgid "System"
msgstr ""
msgstr "מערכת"
#: .\cookbook\templates\base.html:347
msgid "Admin"
msgstr ""
msgstr "מנהל"
#: .\cookbook\templates\base.html:351
#: .\cookbook\templates\space_overview.html:25
msgid "Your Spaces"
msgstr ""
msgstr "המרחבים שלך"
#: .\cookbook\templates\base.html:362
#: .\cookbook\templates\space_overview.html:6
msgid "Overview"
msgstr ""
msgstr "סקירה כללית"
#: .\cookbook\templates\base.html:372
msgid "Markdown Guide"
@@ -1012,7 +1015,7 @@ msgstr ""
#: .\cookbook\templates\base.html:383
msgid "Log out"
msgstr ""
msgstr "התנתק"
#: .\cookbook\templates\base.html:406
msgid "You are using the free version of Tandor"
@@ -1070,7 +1073,7 @@ msgstr ""
#: .\cookbook\templates\batch\monitor.html:29
msgid "Show Recipes"
msgstr ""
msgstr "הראה מתכונים"
#: .\cookbook\templates\batch\monitor.html:30
msgid "Show Log"
@@ -1111,7 +1114,7 @@ msgstr ""
#: .\cookbook\templates\generic\delete_template.html:22
msgid "This cannot be undone!"
msgstr ""
msgstr "לא ניתן לבטל פעולה זו!"
#: .\cookbook\templates\generic\delete_template.html:27
msgid "Protected"
@@ -1128,7 +1131,7 @@ msgstr ""
#: .\cookbook\templates\generic\edit_template.html:6
#: .\cookbook\templates\generic\edit_template.html:14
msgid "Edit"
msgstr ""
msgstr "ערוך"
#: .\cookbook\templates\generic\edit_template.html:32
msgid "View"
@@ -1162,7 +1165,7 @@ msgstr ""
#: .\cookbook\templates\generic\table_template.html:98
msgid "next"
msgstr ""
msgstr "הבא"
#: .\cookbook\templates\history.html:20
msgid "View Log"
@@ -1175,7 +1178,7 @@ msgstr ""
#: .\cookbook\templates\import_response.html:7 .\cookbook\views\delete.py:90
#: .\cookbook\views\edit.py:174
msgid "Import"
msgstr ""
msgstr "יבא"
#: .\cookbook\templates\include\storage_backend_warning.html:4
msgid "Security Warning"
@@ -1356,7 +1359,7 @@ msgstr ""
#: .\cookbook\templates\no_groups_info.html:5
#: .\cookbook\templates\no_groups_info.html:12
msgid "No Permissions"
msgstr ""
msgstr "אין הרשאות"
#: .\cookbook\templates\no_groups_info.html:17
msgid "You do not have any groups and therefor cannot use this application."
@@ -1365,12 +1368,12 @@ msgstr ""
#: .\cookbook\templates\no_groups_info.html:18
#: .\cookbook\templates\no_perm_info.html:15
msgid "Please contact your administrator."
msgstr ""
msgstr "אנא פנה למנהל המערכת."
#: .\cookbook\templates\no_perm_info.html:5
#: .\cookbook\templates\no_perm_info.html:12
msgid "No Permission"
msgstr ""
msgstr "אין הרשאות"
#: .\cookbook\templates\no_perm_info.html:15
msgid ""
@@ -1380,11 +1383,11 @@ msgstr ""
#: .\cookbook\templates\offline.html:6
msgid "Offline"
msgstr ""
msgstr "לא מקוון"
#: .\cookbook\templates\offline.html:19
msgid "You are currently offline!"
msgstr ""
msgstr "אתה כרגע במצב לא מקוון!"
#: .\cookbook\templates\offline.html:20
msgid ""
@@ -1395,7 +1398,7 @@ msgstr ""
#: .\cookbook\templates\openid\login.html:27
#: .\cookbook\templates\socialaccount\authentication_error.html:27
msgid "Back"
msgstr ""
msgstr "אחורה"
#: .\cookbook\templates\property_editor.html:7
msgid "Property Editor"
@@ -1422,7 +1425,7 @@ msgstr ""
#: .\cookbook\templates\search_info.html:9
#: .\cookbook\templates\settings.html:24
msgid "Search Settings"
msgstr ""
msgstr "הגדרות חיפוש"
#: .\cookbook\templates\search_info.html:10
msgid ""
@@ -1438,7 +1441,7 @@ msgstr ""
#: .\cookbook\templates\search_info.html:19
msgid "Search Methods"
msgstr ""
msgstr "שיטות חיפוש"
#: .\cookbook\templates\search_info.html:23
msgid ""
@@ -1521,7 +1524,7 @@ msgstr ""
#: .\cookbook\templates\search_info.html:69
msgid "Search Fields"
msgstr ""
msgstr "שדות חיפוש"
#: .\cookbook\templates\search_info.html:73
msgid ""

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2023-08-19 21:36+0000\n"
"Last-Translator: NeoID <neoid@animenord.com>\n"
"PO-Revision-Date: 2025-01-26 05:58+0000\n"
"Last-Translator: Ole Martin Ruud <nett@barskern.no>\n"
"Language-Team: Norwegian Bokmål <http://translate.tandoor.dev/projects/"
"tandoor/recipes-backend/nb_NO/>\n"
"Language: nb_NO\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.15\n"
"X-Generator: Weblate 5.8.4\n"
#: .\cookbook\forms.py:45
msgid ""
@@ -326,10 +326,8 @@ msgid "Imported %s recipes."
msgstr "Importerte %s oppskrifter."
#: .\cookbook\integration\openeats.py:28
#, fuzzy
#| msgid "Recipes"
msgid "Recipe source:"
msgstr "Oppskrifter"
msgstr "Oppskriftskilde:"
#: .\cookbook\integration\paprika.py:49
msgid "Notes"
@@ -555,7 +553,7 @@ msgstr "Oppskrift"
#: .\cookbook\models.py:1504
msgid "Food"
msgstr ""
msgstr "Mat"
#: .\cookbook\models.py:1505 .\cookbook\templates\base.html:149
msgid "Keyword"
@@ -846,10 +844,8 @@ msgid ""
msgstr ""
#: .\cookbook\templates\account\password_reset.html:32
#, fuzzy
#| msgid "Password reset is not implemented for the time being!"
msgid "Password reset is disabled on this instance."
msgstr "Det er foreløpig ikke implementert funksjon for å nullstille passord!"
msgstr "Nullstilling av passord er skrudd av for denne instansen."
#: .\cookbook\templates\account\password_reset_done.html:25
msgid ""
@@ -912,7 +908,7 @@ msgstr ""
#: .\cookbook\templates\account\signup.html:48
#: .\cookbook\templates\socialaccount\signup.html:39
msgid "and"
msgstr ""
msgstr "og"
#: .\cookbook\templates\account\signup.html:52
#: .\cookbook\templates\socialaccount\signup.html:43
@@ -946,8 +942,6 @@ msgid "Recipes"
msgstr "Oppskrifter"
#: .\cookbook\templates\base.html:161 .\cookbook\views\lists.py:120
#, fuzzy
#| msgid "New Food"
msgid "Foods"
msgstr "Ny matvare"
@@ -989,10 +983,8 @@ msgstr "Historikk"
#: .\cookbook\templates\base.html:263
#: .\cookbook\templates\ingredient_editor.html:7
#: .\cookbook\templates\ingredient_editor.html:13
#, fuzzy
#| msgid "Ingredients"
msgid "Ingredient Editor"
msgstr "Ingredienser"
msgstr "Ingrediensredigerer"
#: .\cookbook\templates\base.html:275
#: .\cookbook\templates\export_response.html:7
@@ -1002,7 +994,7 @@ msgstr "Eksporter"
#: .\cookbook\templates\base.html:287
msgid "Properties"
msgstr ""
msgstr "Egenskaper"
#: .\cookbook\templates\base.html:301 .\cookbook\views\lists.py:255
msgid "Unit Conversions"
@@ -1179,7 +1171,7 @@ msgstr ""
#: .\cookbook\templates\generic\delete_template.html:27
msgid "Protected"
msgstr ""
msgstr "Beskyttet"
#: .\cookbook\templates\generic\delete_template.html:42
msgid "Cascade"
@@ -1938,7 +1930,7 @@ msgstr ""
#: .\cookbook\templates\system.html:75 .\cookbook\templates\system.html:88
#: .\cookbook\templates\system.html:102 .\cookbook\templates\system.html:113
msgid "Warning"
msgstr ""
msgstr "Advarsel"
#: .\cookbook\templates\system.html:47 .\cookbook\templates\system.html:61
#: .\cookbook\templates\system.html:75 .\cookbook\templates\system.html:88

View File

@@ -13,16 +13,16 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2024-02-10 12:20+0000\n"
"Last-Translator: Jonan B <jonanb@pm.me>\n"
"Language-Team: Dutch <http://translate.tandoor.dev/projects/tandoor/recipes-"
"backend/nl/>\n"
"PO-Revision-Date: 2025-07-31 19:14+0000\n"
"Last-Translator: Justin Straver <justin.straver@gmail.com>\n"
"Language-Team: Dutch <http://translate.tandoor.dev/projects/tandoor/"
"recipes-backend/nl/>\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.15\n"
"X-Generator: Weblate 5.8.4\n"
#: .\cookbook\forms.py:45
msgid ""
@@ -46,7 +46,7 @@ msgstr "Voorbereidingstijd in minuten"
#: .\cookbook\forms.py:62
msgid "Waiting time (cooking/baking) in minutes"
msgstr "Wacht tijd in minuten (koken en bakken)"
msgstr "Wachttijd in minuten (koken en bakken)"
#: .\cookbook\forms.py:63 .\cookbook\forms.py:222 .\cookbook\forms.py:246
msgid "Path"
@@ -286,7 +286,7 @@ msgstr "omgekeerde rotatie"
#: .\cookbook\helper\recipe_url_import.py:311
msgid "careful rotation"
msgstr "voorzichtige rotatie"
msgstr "rotire atentă"
#: .\cookbook\helper\recipe_url_import.py:312
msgid "knead"
@@ -306,7 +306,7 @@ msgstr "gisten"
#: .\cookbook\helper\recipe_url_import.py:316
msgid "sous-vide"
msgstr "sous-vide"
msgstr "sous-vide (vacuümgaren)"
#: .\cookbook\helper\shopping_helper.py:150
msgid "You must supply a servings size"
@@ -476,7 +476,7 @@ msgstr "Maaltijdplan"
#: .\cookbook\models.py:456 .\cookbook\templates\base.html:122
#: .\cookbook\views\views.py:459
msgid "Books"
msgstr "Boeken"
msgstr "Kookboeken"
#: .\cookbook\models.py:457 .\cookbook\templates\base.html:118
#: .\cookbook\views\views.py:460
@@ -570,7 +570,7 @@ msgstr "Ingrediënt"
#: .\cookbook\models.py:1505 .\cookbook\templates\base.html:149
msgid "Keyword"
msgstr "Etiket"
msgstr "Trefwoord"
#: .\cookbook\serializer.py:222
msgid "File uploads are not enabled for this Space."
@@ -630,8 +630,8 @@ msgid ""
"List of ingredient IDs from the recipe to add, if not provided all "
"ingredients will be added."
msgstr ""
"Lijst van ingrediënten ID's van het toe te voegen recept, als deze niet "
"opgegeven worden worden alle ingrediënten toegevoegd."
"Lijst van ingrediënt ID's van het toe te voegen recept, als deze niet worden "
"opgegeven worden alle ingrediënten toegevoegd."
#: .\cookbook\serializer.py:1430
msgid ""
@@ -1432,7 +1432,7 @@ msgid ""
"rel=\"noreferrer noopener\" target=\"_blank\">this one.</a>"
msgstr ""
"Het is lastig om met de hand Markdown tabellen te maken. Het wordt "
"aangeraden om een tabel editor zoals <a href=\"https://www.tablesgenerator."
"aangeraden om een tabel 'editor' zoals <a href=\"https://www.tablesgenerator."
"com/markdown_tables\" rel=\"noreferrer noopener\" target=\"_blank\">deze</a> "
"te gebruiken."
@@ -1843,7 +1843,7 @@ msgstr "Perfect voor grote databases"
#: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5
msgid "Cookbook Setup"
msgstr "Kookboek Setup"
msgstr "Kookboek configuratie"
#: .\cookbook\templates\setup.html:14
msgid "Setup"
@@ -2397,24 +2397,30 @@ msgstr "Een waardering van een recept gaat van 0 tot 5."
#: .\cookbook\views\api.py:922 .\cookbook\views\api.py:923
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
"ID van boek dat een recept moet hebben. Herhaal parameter voor meerdere."
"ID van een kookboek dat een recept moet bevatten. Herhaal parameter voor "
"meerdere."
#: .\cookbook\views\api.py:923 .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr "Boek ID, herhaal voor meerdere. Geeft recepten uit alle boeken weer"
msgstr ""
"Kookboek ID, herhaal voor meerdere. Geeft recepten uit de geselecteerde "
"kookboeken weer"
#: .\cookbook\views\api.py:924 .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr "Boek IDs, herhaal voor meerdere. Geeft recepten weer uit alle boeken."
msgstr ""
"Kookboek IDs, herhaal voor meerdere. Geeft recepten weer uit alle kookboeken."
#: .\cookbook\views\api.py:925 .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
"Boek IDs, herhaal voor meerdere. Sluit recepten uit elk van de boeken uit."
"Kookboek IDs, herhaal voor meerdere. Sluit recepten uit elk van de "
"geselecteerde kookboeken uit."
#: .\cookbook\views\api.py:926 .\cookbook\views\api.py:927
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr "Boek IDs, herhaal voor meerdere. Sluit recepten uit alle boeken uit."
msgstr ""
"Kookboek IDs, herhaal voor meerdere. Sluit recepten uit alle boeken uit."
#: .\cookbook\views\api.py:927 .\cookbook\views\api.py:928
msgid "If only internal recipes should be returned. [true/<b>false</b>]"

View File

@@ -11,18 +11,18 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2024-03-19 23:47+0000\n"
"Last-Translator: Tomasz Klimczak <klemensble@gmail.com>\n"
"Language-Team: Polish <http://translate.tandoor.dev/projects/tandoor/recipes-"
"backend/pl/>\n"
"PO-Revision-Date: 2025-01-26 05:58+0000\n"
"Last-Translator: Dominik Ruczajewski <slick.moose.dev@gmail.com>\n"
"Language-Team: Polish <http://translate.tandoor.dev/projects/tandoor/"
"recipes-backend/pl/>\n"
"Language: pl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n"
"%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n"
"%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
"X-Generator: Weblate 5.4.2\n"
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && ("
"n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && "
"n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
"X-Generator: Weblate 5.8.4\n"
#: .\cookbook\forms.py:45
msgid ""
@@ -65,6 +65,8 @@ msgid ""
"To prevent duplicates recipes with the same name as existing ones are "
"ignored. Check this box to import everything."
msgstr ""
"Aby zapobiec duplikatom, przepisy o tej samej nazwie co istniejące zostaną "
"pominięte. Zaznacz to pole, aby zaimportować wszystko."
#: .\cookbook\forms.py:143
msgid "Add your comment: "
@@ -91,14 +93,16 @@ msgid ""
"<a href=\"https://www.home-assistant.io/docs/authentication/#your-account-"
"profile\">Long Lived Access Token</a> for your HomeAssistant instance"
msgstr ""
"<a href=\"https://www.home-assistant.io/docs/authentication/#your-account-"
"profile\">Long Lived Access Token</a> dla Twojej instancji Home Assistant"
#: .\cookbook\forms.py:193
msgid "Something like http://homeassistant.local:8123/api"
msgstr ""
msgstr "Coś w stylu http://homeassistant.local:8123/api"
#: .\cookbook\forms.py:205
msgid "http://homeassistant.local:8123/api for example"
msgstr ""
msgstr "na przykład http://homeassistant.local:8123/api"
#: .\cookbook\forms.py:222 .\cookbook\views\edit.py:117
msgid "Storage"
@@ -106,11 +110,11 @@ msgstr "Magazyn"
#: .\cookbook\forms.py:222
msgid "Active"
msgstr ""
msgstr "Aktywuj"
#: .\cookbook\forms.py:226
msgid "Search String"
msgstr "Wyszukaj ciąg"
msgstr "Wyszukaj tekst"
#: .\cookbook\forms.py:246
msgid "File ID"
@@ -118,101 +122,117 @@ msgstr "Numer identyfikacyjny pliku"
#: .\cookbook\forms.py:262
msgid "Maximum number of users for this space reached."
msgstr ""
msgstr "Osiągnięto maksymalną liczbę użytkowników dla tej przestrzeni."
#: .\cookbook\forms.py:268
msgid "Email address already taken!"
msgstr ""
msgstr "Wybrany adres email jest już zajęty!"
#: .\cookbook\forms.py:275
msgid ""
"An email address is not required but if present the invite link will be sent "
"to the user."
msgstr ""
"Adres email nie jest wymagany, jednak gdy zostanie podany link z "
"zaproszeniem zostanie wysłany do użytkownika."
#: .\cookbook\forms.py:287
msgid "Name already taken."
msgstr ""
msgstr "Podana nazwa jest już zajęta."
#: .\cookbook\forms.py:298
msgid "Accept Terms and Privacy"
msgstr ""
msgstr "Zaakceptuj Regulamin oraz Politykę Prywatności"
#: .\cookbook\forms.py:332
msgid ""
"Determines how fuzzy a search is if it uses trigram similarity matching (e."
"g. low values mean more typos are ignored)."
msgstr ""
"Określa, jak niedokładne może być wyszukiwanie, jeśli wykorzystuje "
"dopasowanie podobieństwa trigramowego (np. niskie wartości oznaczają, że "
"więcej literówek jest ignorowanych)."
#: .\cookbook\forms.py:340
msgid ""
"Select type method of search. Click <a href=\"/docs/search/\">here</a> for "
"full description of choices."
msgstr ""
"Wybierz metodę wyszukiwania. Kliknij <a href=\"/docs/search/\">tutaj</a>, "
"aby zapoznać się z pełnym opisem dostępnych opcji."
#: .\cookbook\forms.py:341
msgid ""
"Use fuzzy matching on units, keywords and ingredients when editing and "
"importing recipes."
msgstr ""
"Użyj niedokładnego dopasowywania dla jednostek, słów kluczowych i składników "
"podczas edytowania i importowania przepisów."
#: .\cookbook\forms.py:342
msgid ""
"Fields to search ignoring accents. Selecting this option can improve or "
"degrade search quality depending on language"
msgstr ""
"Pola do przeszukiwania z pominięciem akcentów. Wybranie tej opcji może "
"poprawić lub pogorszyć jakość wyszukiwania w zależności od języka"
#: .\cookbook\forms.py:343
msgid ""
"Fields to search for partial matches. (e.g. searching for 'Pie' will return "
"'pie' and 'piece' and 'soapie')"
msgstr ""
"Pola do przeszukiwania częściowych dopasowań (np. wyszukiwanie 'Ciasto' "
"zwróci 'ciasto', 'ciasteczko' i 'ciastolina')"
#: .\cookbook\forms.py:344
msgid ""
"Fields to search for beginning of word matches. (e.g. searching for 'sa' "
"will return 'salad' and 'sandwich')"
msgstr ""
"Pola do przeszukiwania dopasowań na początku wyrazu (np. wyszukiwanie 'sa' "
"zwróci 'sałatka' i 'sandwich')"
#: .\cookbook\forms.py:345
msgid ""
"Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) "
"Note: this option will conflict with 'web' and 'raw' methods of search."
msgstr ""
"Pola do wyszukiwania z użyciem 'niedokładnego' dopasowywania (np. "
"wyszukiwanie 'przepisz' znajdzie 'przepis'). Uwaga: ta opcja będzie "
"kolidować z metodami wyszukiwania 'web' i 'raw'."
#: .\cookbook\forms.py:346
msgid ""
"Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods "
"only function with fulltext fields."
msgstr ""
"Pola do wyszukiwania pełno tekstowego. Uwaga: metody wyszukiwania 'web', "
"'phrase' i 'raw' działają wyłącznie z polami pełno tekstowymi."
#: .\cookbook\forms.py:350
#, fuzzy
#| msgid "Search"
msgid "Search Method"
msgstr "Szukaj"
msgstr "Metoda wyszukiwania"
#: .\cookbook\forms.py:350
msgid "Fuzzy Lookups"
msgstr ""
msgstr "Niedokładne dopasowanie"
#: .\cookbook\forms.py:350
msgid "Ignore Accent"
msgstr ""
msgstr "Ignoruj akcenty"
#: .\cookbook\forms.py:350
msgid "Partial Match"
msgstr ""
msgstr "Częściowe dopasowanie"
#: .\cookbook\forms.py:350
msgid "Starts With"
msgstr ""
msgstr "Zaczyna się od"
#: .\cookbook\forms.py:351
#, fuzzy
#| msgid "Search"
msgid "Fuzzy Search"
msgstr "Szukaj"
msgstr "Niedokładne wyszukiwanie"
#: .\cookbook\forms.py:351
#, fuzzy
@@ -225,6 +245,8 @@ msgid ""
"In order to prevent spam, the requested email was not send. Please wait a "
"few minutes and try again."
msgstr ""
"Aby zapobiec spamowi, żądany e-mail nie został wysłany. Proszę poczekać "
"kilka minut i spróbować ponownie."
#: .\cookbook\helper\permission_helper.py:164
#: .\cookbook\helper\permission_helper.py:187 .\cookbook\views\views.py:117
@@ -255,57 +277,57 @@ msgstr ""
#: .\cookbook\helper\permission_helper.py:402
msgid "You have reached the maximum number of recipes for your space."
msgstr ""
msgstr "Osiągnąłeś maksymalną liczbę przepisów dla swojej przestrzeni."
#: .\cookbook\helper\permission_helper.py:414
msgid "You have more users than allowed in your space."
msgstr ""
msgstr "Masz więcej użytkowników, niż jest dozwolone w Twojej przestrzeni."
#: .\cookbook\helper\recipe_url_import.py:310
msgid "reverse rotation"
msgstr ""
msgstr "rotacja wsteczna"
#: .\cookbook\helper\recipe_url_import.py:311
msgid "careful rotation"
msgstr ""
msgstr "delikatna rotacja"
#: .\cookbook\helper\recipe_url_import.py:312
msgid "knead"
msgstr ""
msgstr "zagnieść"
#: .\cookbook\helper\recipe_url_import.py:313
msgid "thicken"
msgstr ""
msgstr "zagęścić"
#: .\cookbook\helper\recipe_url_import.py:314
msgid "warm up"
msgstr ""
msgstr "podgrzać"
#: .\cookbook\helper\recipe_url_import.py:315
msgid "ferment"
msgstr ""
msgstr "doprowadzić do wrzenia"
#: .\cookbook\helper\recipe_url_import.py:316
msgid "sous-vide"
msgstr ""
msgstr "gotować w próżni"
#: .\cookbook\helper\shopping_helper.py:150
msgid "You must supply a servings size"
msgstr ""
msgstr "Musisz podać wielkość porcji"
#: .\cookbook\helper\template_helper.py:95
#: .\cookbook\helper\template_helper.py:97
msgid "Could not parse template code."
msgstr ""
msgstr "Nie można przeanalizować kodu szablonu."
#: .\cookbook\integration\copymethat.py:44
#: .\cookbook\integration\melarecipes.py:37
msgid "Favorite"
msgstr ""
msgstr "Ulubione"
#: .\cookbook\integration\copymethat.py:50
msgid "I made this"
msgstr ""
msgstr "Stworzyłem to"
#: .\cookbook\integration\integration.py:209
msgid ""
@@ -320,10 +342,12 @@ msgid ""
"An unexpected error occurred during the import. Please make sure you have "
"uploaded a valid file."
msgstr ""
"Wystąpił nieoczekiwany błąd podczas importu. Upewnij się, że przesłałeś "
"prawidłowy plik."
#: .\cookbook\integration\integration.py:217
msgid "The following recipes were ignored because they already existed:"
msgstr ""
msgstr "Następujące przepisy zostały pominięte, ponieważ już istnieją:"
#: .\cookbook\integration\integration.py:221
#, python-format
@@ -341,14 +365,12 @@ msgid "Notes"
msgstr "Notatka"
#: .\cookbook\integration\paprika.py:52
#, fuzzy
#| msgid "Information"
msgid "Nutritional Information"
msgstr "Informacja"
msgstr "Informacje o wartości odżywczej"
#: .\cookbook\integration\paprika.py:56
msgid "Source"
msgstr ""
msgstr "Źródło"
#: .\cookbook\integration\recettetek.py:54
#: .\cookbook\integration\recipekeeper.py:70
@@ -377,23 +399,25 @@ msgstr "Sekcja"
#: .\cookbook\management\commands\fix_duplicate_properties.py:15
msgid "Fixes foods with "
msgstr ""
msgstr "Poprawia potrawy z "
#: .\cookbook\management\commands\rebuildindex.py:14
msgid "Rebuilds full text search index on Recipe"
msgstr ""
msgstr "Odbudowuje indeks wyszukiwania pełno tekstowego dla przepisu"
#: .\cookbook\management\commands\rebuildindex.py:18
msgid "Only Postgresql databases use full text search, no index to rebuild"
msgstr ""
"Pełno tekstowe wyszukiwanie jest używane tylko w bazach danych PostgreSQL, "
"brak indeksu do odbudowy"
#: .\cookbook\management\commands\rebuildindex.py:29
msgid "Recipe index rebuild complete."
msgstr ""
msgstr "Odbudowa indeksu przepisu zakończona."
#: .\cookbook\management\commands\rebuildindex.py:31
msgid "Recipe index rebuild failed."
msgstr ""
msgstr "Odbudowa indeksu przepisu nie powiodła się."
#: .\cookbook\migrations\0047_auto_20200602_1133.py:14
msgid "Breakfast"
@@ -412,8 +436,6 @@ msgid "Other"
msgstr "Inne"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:17
#, fuzzy
#| msgid "Fats"
msgid "Fat"
msgstr "Tłuszcze"
@@ -421,7 +443,7 @@ msgstr "Tłuszcze"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:18
#: .\cookbook\migrations\0190_auto_20230525_1506.py:19
msgid "g"
msgstr ""
msgstr "g"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:18
msgid "Carbohydrates"
@@ -437,13 +459,15 @@ msgstr "Kalorie"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:20
msgid "kcal"
msgstr ""
msgstr "kcal"
#: .\cookbook\models.py:325
msgid ""
"Maximum file storage for space in MB. 0 for unlimited, -1 to disable file "
"upload."
msgstr ""
"Maksymalna pojemność na pliki dla przestrzeni w MB. 0 oznacza brak limitu, -"
"1 wyłącza możliwość przesyłania plików."
#: .\cookbook\models.py:454 .\cookbook\templates\search.html:7
#: .\cookbook\templates\settings.html:18

View File

@@ -12,8 +12,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2023-10-07 18:02+0000\n"
"Last-Translator: Guilherme Roda <glealroda@gmail.com>\n"
"PO-Revision-Date: 2025-02-21 10:58+0000\n"
"Last-Translator: Filipe Neves <homemdasneves@gmail.com>\n"
"Language-Team: Portuguese <http://translate.tandoor.dev/projects/tandoor/"
"recipes-backend/pt/>\n"
"Language: pt\n"
@@ -21,7 +21,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Weblate 4.15\n"
"X-Generator: Weblate 5.8.4\n"
#: .\cookbook\forms.py:45
msgid ""
@@ -94,14 +94,16 @@ msgid ""
"<a href=\"https://www.home-assistant.io/docs/authentication/#your-account-"
"profile\">Long Lived Access Token</a> for your HomeAssistant instance"
msgstr ""
"<a href=\"https://www.home-assistant.io/docs/authentication/#your-account-"
"profile\">Token de longa duração</a>para a sua instância HomeAssistant"
#: .\cookbook\forms.py:193
msgid "Something like http://homeassistant.local:8123/api"
msgstr ""
msgstr "Algo como http://homeassistant.local:8123/api"
#: .\cookbook\forms.py:205
msgid "http://homeassistant.local:8123/api for example"
msgstr ""
msgstr "http://homeassistant.local:8123/api por exemplo"
#: .\cookbook\forms.py:222 .\cookbook\views\edit.py:117
msgid "Storage"
@@ -181,18 +183,25 @@ msgid ""
"Fields to search for partial matches. (e.g. searching for 'Pie' will return "
"'pie' and 'piece' and 'soapie')"
msgstr ""
"Campos a pesquisar por correspondência. (Ex: pesquisar por 'mor' retorna "
"'morango' e 'amora')"
#: .\cookbook\forms.py:344
msgid ""
"Fields to search for beginning of word matches. (e.g. searching for 'sa' "
"will return 'salad' and 'sandwich')"
msgstr ""
"Campos a pesquisar para correspondências no início da palavra. (por exemplo, "
"pesquisar por \"sa\" retornará \"salada\" e \"sanduíche\")"
#: .\cookbook\forms.py:345
msgid ""
"Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) "
"Note: this option will conflict with 'web' and 'raw' methods of search."
msgstr ""
"Campos para pesquisa aproximada. (por exemplo, pesquisar por \"recita\" "
"encontrará \"receita\"). Nota: esta opção entra em conflito com os métodos "
"de pesquisa \"web\" e \"raw\"."
#: .\cookbook\forms.py:346
msgid ""
@@ -206,19 +215,19 @@ msgstr "Método de Pesquisa"
#: .\cookbook\forms.py:350
msgid "Fuzzy Lookups"
msgstr ""
msgstr "Pesquisas Aproximadas"
#: .\cookbook\forms.py:350
msgid "Ignore Accent"
msgstr ""
msgstr "Ignorar pronúncia"
#: .\cookbook\forms.py:350
msgid "Partial Match"
msgstr ""
msgstr "Correspondência parcial"
#: .\cookbook\forms.py:350
msgid "Starts With"
msgstr ""
msgstr "Começa com"
#: .\cookbook\forms.py:351
msgid "Fuzzy Search"
@@ -233,6 +242,8 @@ msgid ""
"In order to prevent spam, the requested email was not send. Please wait a "
"few minutes and try again."
msgstr ""
"Para evitar spam, o email solicitado não foi enviado. Por favor, aguarde "
"alguns minutos e tente novamente."
#: .\cookbook\helper\permission_helper.py:164
#: .\cookbook\helper\permission_helper.py:187 .\cookbook\views\views.py:117
@@ -257,11 +268,11 @@ msgstr "Sem permissões para aceder a esta página!"
#: .\cookbook\helper\permission_helper.py:237
#: .\cookbook\helper\permission_helper.py:252
msgid "You cannot interact with this object as it is not owned by you!"
msgstr ""
msgstr "Não pode interagir com este objeto, pois não é seu!"
#: .\cookbook\helper\permission_helper.py:402
msgid "You have reached the maximum number of recipes for your space."
msgstr ""
msgstr "Atingiu o número máximo de receitas para o seu espaço."
#: .\cookbook\helper\permission_helper.py:414
msgid "You have more users than allowed in your space."

File diff suppressed because it is too large Load Diff

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2023-04-27 08:55+0000\n"
"Last-Translator: noxonad <noxonad@proton.me>\n"
"PO-Revision-Date: 2025-02-16 14:58+0000\n"
"Last-Translator: Cots Partier <cots.pastier.34@icloud.com>\n"
"Language-Team: Romanian <http://translate.tandoor.dev/projects/tandoor/"
"recipes-backend/ro/>\n"
"Language: ro\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
"20)) ? 1 : 2;\n"
"X-Generator: Weblate 4.15\n"
"X-Generator: Weblate 5.8.4\n"
#: .\cookbook\forms.py:45
msgid ""
@@ -91,14 +91,16 @@ msgid ""
"<a href=\"https://www.home-assistant.io/docs/authentication/#your-account-"
"profile\">Long Lived Access Token</a> for your HomeAssistant instance"
msgstr ""
"<a href=\"https://www.home-assistant.io/docs/authentication/#your-account-"
"profile\">Token the acces</a> pentru instanța ta de HomeAssistant"
#: .\cookbook\forms.py:193
msgid "Something like http://homeassistant.local:8123/api"
msgstr ""
msgstr "Asemănător cu http://homeassistant.local:8123/api"
#: .\cookbook\forms.py:205
msgid "http://homeassistant.local:8123/api for example"
msgstr ""
msgstr "http://homeassistant.local:8123/api de exemplu"
#: .\cookbook\forms.py:222 .\cookbook\views\edit.py:117
msgid "Storage"
@@ -150,10 +152,6 @@ msgstr ""
"multe greșeli de scriere sunt ignorate)."
#: .\cookbook\forms.py:340
#, fuzzy
#| msgid ""
#| "Select type method of search. Click <a href=\"/docs/search/\">here</a> "
#| "for full desciption of choices."
msgid ""
"Select type method of search. Click <a href=\"/docs/search/\">here</a> for "
"full description of choices."
@@ -227,8 +225,6 @@ msgid "Partial Match"
msgstr "Potrivire parțială"
#: .\cookbook\forms.py:350
#, fuzzy
#| msgid "Starts Wtih"
msgid "Starts With"
msgstr "Începe cu"
@@ -284,38 +280,36 @@ msgid "You have more users than allowed in your space."
msgstr "Aveți mai mulți utilizatori decât este permis în spațiul dvs."
#: .\cookbook\helper\recipe_url_import.py:310
#, fuzzy
#| msgid "Use fractions"
msgid "reverse rotation"
msgstr "Utilizare fracții"
msgstr "rotație inversă"
#: .\cookbook\helper\recipe_url_import.py:311
msgid "careful rotation"
msgstr ""
msgstr "rotire atentă"
#: .\cookbook\helper\recipe_url_import.py:312
msgid "knead"
msgstr ""
msgstr "frământă"
#: .\cookbook\helper\recipe_url_import.py:313
msgid "thicken"
msgstr ""
msgstr "se îngroașă"
#: .\cookbook\helper\recipe_url_import.py:314
msgid "warm up"
msgstr ""
msgstr "încălzire"
#: .\cookbook\helper\recipe_url_import.py:315
msgid "ferment"
msgstr ""
msgstr "ferment"
#: .\cookbook\helper\recipe_url_import.py:316
msgid "sous-vide"
msgstr ""
msgstr "sous-vide"
#: .\cookbook\helper\shopping_helper.py:150
msgid "You must supply a servings size"
msgstr ""
msgstr "Trebuie să specificați dimensiunea porției"
#: .\cookbook\helper\template_helper.py:95
#: .\cookbook\helper\template_helper.py:97
@@ -325,11 +319,11 @@ msgstr "Nu s-a putut analiza codul șablonului."
#: .\cookbook\integration\copymethat.py:44
#: .\cookbook\integration\melarecipes.py:37
msgid "Favorite"
msgstr ""
msgstr "Favorit"
#: .\cookbook\integration\copymethat.py:50
msgid "I made this"
msgstr ""
msgstr "Am făcut acest lucru"
#: .\cookbook\integration\integration.py:209
msgid ""
@@ -357,10 +351,8 @@ msgid "Imported %s recipes."
msgstr "%s rețete importate."
#: .\cookbook\integration\openeats.py:28
#, fuzzy
#| msgid "Recipe Home"
msgid "Recipe source:"
msgstr "Rețetă acasă"
msgstr "Sursa rețetei:"
#: .\cookbook\integration\paprika.py:49
msgid "Notes"
@@ -376,10 +368,8 @@ msgstr "Sursă"
#: .\cookbook\integration\recettetek.py:54
#: .\cookbook\integration\recipekeeper.py:70
#, fuzzy
#| msgid "Import Log"
msgid "Imported from"
msgstr "Jurnal de import"
msgstr "Importat din"
#: .\cookbook\integration\saffron.py:23
msgid "Servings"
@@ -403,19 +393,17 @@ msgstr "Secțiune"
#: .\cookbook\management\commands\fix_duplicate_properties.py:15
msgid "Fixes foods with "
msgstr ""
msgstr "Corectează alimentele cu "
#: .\cookbook\management\commands\rebuildindex.py:14
msgid "Rebuilds full text search index on Recipe"
msgstr "Reconstruiește indexul de căutare text complet pe rețetă"
#: .\cookbook\management\commands\rebuildindex.py:18
#, fuzzy
#| msgid "Only Postgress databases use full text search, no index to rebuild"
msgid "Only Postgresql databases use full text search, no index to rebuild"
msgstr ""
"Numai bazele de date Postgress utilizează căutare text complet, nici un "
"index de reconstruit"
"Numai bazele de date Postgress utilizează ccăutarea textului integral, nici "
"un index de reconstruit"
#: .\cookbook\management\commands\rebuildindex.py:29
msgid "Recipe index rebuild complete."
@@ -443,29 +431,29 @@ msgstr "Altele"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:17
msgid "Fat"
msgstr ""
msgstr "Grăsime"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:17
#: .\cookbook\migrations\0190_auto_20230525_1506.py:18
#: .\cookbook\migrations\0190_auto_20230525_1506.py:19
msgid "g"
msgstr ""
msgstr "g"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:18
msgid "Carbohydrates"
msgstr ""
msgstr "Carbohidrați"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:19
msgid "Proteins"
msgstr ""
msgstr "Proteine"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:20
msgid "Calories"
msgstr ""
msgstr "Calorii"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:20
msgid "kcal"
msgstr ""
msgstr "kcal"
#: .\cookbook\models.py:325
msgid ""
@@ -500,24 +488,20 @@ msgid " is part of a recipe step and cannot be deleted"
msgstr " face parte dintr-un pas de rețetă și nu poate fi șters"
#: .\cookbook\models.py:918
#, fuzzy
#| msgid "Automations"
msgid "Nutrition"
msgstr "Automatizări"
msgstr "Nutriție"
#: .\cookbook\models.py:918
#, fuzzy
#| msgid "Merge"
msgid "Allergen"
msgstr "Unire"
msgstr "Alergen"
#: .\cookbook\models.py:919
msgid "Price"
msgstr ""
msgstr "Preț"
#: .\cookbook\models.py:919
msgid "Goal"
msgstr ""
msgstr "Obiectiv"
#: .\cookbook\models.py:1408 .\cookbook\templates\search_info.html:28
msgid "Simple"
@@ -548,42 +532,32 @@ msgid "Keyword Alias"
msgstr "Pseudonim cuvânt cheie"
#: .\cookbook\models.py:1470
#, fuzzy
#| msgid "Description"
msgid "Description Replace"
msgstr "Descriere"
msgstr "Înlocuire Descriere"
#: .\cookbook\models.py:1471
#, fuzzy
#| msgid "Instructions"
msgid "Instruction Replace"
msgstr "Instrucțiuni"
msgstr "Înlocuire Instrucțiuni"
#: .\cookbook\models.py:1472
#, fuzzy
#| msgid "Select Unit"
msgid "Never Unit"
msgstr "Selectare unitate"
msgstr "Unitate nulă"
#: .\cookbook\models.py:1473
msgid "Transpose Words"
msgstr ""
msgstr "Schimbă Ordinea Cuvintelor"
#: .\cookbook\models.py:1474
#, fuzzy
#| msgid "Food Alias"
msgid "Food Replace"
msgstr "Pseudonim produse alimentare"
msgstr "Aliment echivalent"
#: .\cookbook\models.py:1475
#, fuzzy
#| msgid "Unit Alias"
msgid "Unit Replace"
msgstr "Pseudonim unități"
msgstr "Unitate echivalentă"
#: .\cookbook\models.py:1476
msgid "Name Replace"
msgstr ""
msgstr "Înlocuire Nume"
#: .\cookbook\models.py:1503 .\cookbook\views\delete.py:40
#: .\cookbook\views\edit.py:210 .\cookbook\views\new.py:39
@@ -591,10 +565,8 @@ msgid "Recipe"
msgstr "Rețetă"
#: .\cookbook\models.py:1504
#, fuzzy
#| msgid "Foods"
msgid "Food"
msgstr "Alimente"
msgstr "Mâncare"
#: .\cookbook\models.py:1505 .\cookbook\templates\base.html:149
msgid "Keyword"
@@ -610,7 +582,7 @@ msgstr "Ați atins limita de încărcare a fișierelor."
#: .\cookbook\serializer.py:328
msgid "Cannot modify Space owner permission."
msgstr ""
msgstr "Nu se poate modifica permisiunea proprietarului spațiului."
#: .\cookbook\serializer.py:1270
msgid "Hello"
@@ -651,30 +623,35 @@ msgstr "Invitație Tandoor Recipes"
#: .\cookbook\serializer.py:1426
msgid "Existing shopping list to update"
msgstr ""
msgstr "Lista de cumpărături existentă de actualizat"
#: .\cookbook\serializer.py:1428
msgid ""
"List of ingredient IDs from the recipe to add, if not provided all "
"ingredients will be added."
msgstr ""
"ID-urile ingredientelor din rețetă pentru a fi adăugate, dacă nu sunt "
"specificate toate ingrediente vor fi adăugate."
#: .\cookbook\serializer.py:1430
msgid ""
"Providing a list_recipe ID and servings of 0 will delete that shopping list."
msgstr ""
"Furnizarea unui ID de rețetă și un număr de porții egal cu 0 va șterge lista "
"cumpărături."
#: .\cookbook\serializer.py:1439
msgid "Amount of food to add to the shopping list"
msgstr ""
msgstr "Cantitatea de mâncare pentru a fi adăugată în lista cumpărături"
#: .\cookbook\serializer.py:1441
msgid "ID of unit to use for the shopping list"
msgstr ""
msgstr "ID-ul unității pentru a fi utilizat în lista de cumpărături"
#: .\cookbook\serializer.py:1443
msgid "When set to true will delete all food from active shopping lists."
msgstr ""
"Când este activ se șterge toată mâncarea din listele de cumpărături active."
#: .\cookbook\tables.py:69 .\cookbook\tables.py:83
#: .\cookbook\templates\generic\delete_template.html:7
@@ -1027,10 +1004,8 @@ msgstr "Istoric"
#: .\cookbook\templates\base.html:263
#: .\cookbook\templates\ingredient_editor.html:7
#: .\cookbook\templates\ingredient_editor.html:13
#, fuzzy
#| msgid "Ingredients"
msgid "Ingredient Editor"
msgstr "Ingrediente"
msgstr "Editor de Ingrediente"
#: .\cookbook\templates\base.html:275
#: .\cookbook\templates\export_response.html:7
@@ -1040,13 +1015,11 @@ msgstr "Exportă"
#: .\cookbook\templates\base.html:287
msgid "Properties"
msgstr ""
msgstr "Atribute"
#: .\cookbook\templates\base.html:301 .\cookbook\views\lists.py:255
#, fuzzy
#| msgid "Account Connections"
msgid "Unit Conversions"
msgstr "Conexiuni de cont"
msgstr "Conversii de unități"
#: .\cookbook\templates\base.html:318 .\cookbook\templates\index.html:47
msgid "Import Recipe"
@@ -1066,10 +1039,8 @@ msgid "Space Settings"
msgstr "Setări spațiu"
#: .\cookbook\templates\base.html:340
#, fuzzy
#| msgid "External Recipes"
msgid "External Connectors"
msgstr "Rețete externe"
msgstr "Conectori externi"
#: .\cookbook\templates\base.html:345 .\cookbook\templates\system.html:13
msgid "System"
@@ -1081,15 +1052,13 @@ msgstr "Admin"
#: .\cookbook\templates\base.html:351
#: .\cookbook\templates\space_overview.html:25
#, fuzzy
#| msgid "No Space"
msgid "Your Spaces"
msgstr "Fără spațiu"
msgstr "Spațiul tău"
#: .\cookbook\templates\base.html:362
#: .\cookbook\templates\space_overview.html:6
msgid "Overview"
msgstr ""
msgstr "Sumar"
#: .\cookbook\templates\base.html:372
msgid "Markdown Guide"
@@ -1113,11 +1082,11 @@ msgstr "Deconectare"
#: .\cookbook\templates\base.html:406
msgid "You are using the free version of Tandor"
msgstr ""
msgstr "Utilizați o versiune gratuită de Tandor"
#: .\cookbook\templates\base.html:407
msgid "Upgrade Now"
msgstr ""
msgstr "Actualizează acum"
#: .\cookbook\templates\batch\edit.html:6
msgid "Batch edit Category"
@@ -1213,7 +1182,7 @@ msgstr "Sunteți sigur că doriți să ștergeți %(title)s: <b>%(object)s</b> "
#: .\cookbook\templates\generic\delete_template.html:22
msgid "This cannot be undone!"
msgstr ""
msgstr "Este ireversibil!"
#: .\cookbook\templates\generic\delete_template.html:27
msgid "Protected"
@@ -1230,7 +1199,7 @@ msgstr "Anulare"
#: .\cookbook\templates\generic\edit_template.html:6
#: .\cookbook\templates\generic\edit_template.html:14
msgid "Edit"
msgstr "Editare"
msgstr "Editează"
#: .\cookbook\templates\generic\edit_template.html:32
msgid "View"
@@ -1379,8 +1348,6 @@ msgstr ""
#: .\cookbook\templates\markdown_info.html:57
#: .\cookbook\templates\markdown_info.html:73
#, fuzzy
#| msgid "or by leaving a blank line inbetween."
msgid "or by leaving a blank line in between."
msgstr "sau lăsând o linie goală între ele."
@@ -1404,10 +1371,6 @@ msgid "Lists"
msgstr "Liste"
#: .\cookbook\templates\markdown_info.html:85
#, fuzzy
#| msgid ""
#| "Lists can ordered or unorderd. It is <b>important to leave a blank line "
#| "before the list!</b>"
msgid ""
"Lists can ordered or unordered. It is <b>important to leave a blank line "
"before the list!</b>"
@@ -1539,11 +1502,11 @@ msgstr ""
#: .\cookbook\templates\openid\login.html:27
#: .\cookbook\templates\socialaccount\authentication_error.html:27
msgid "Back"
msgstr ""
msgstr "Înapoi"
#: .\cookbook\templates\property_editor.html:7
msgid "Property Editor"
msgstr ""
msgstr "Editor atribute"
#: .\cookbook\templates\recipe_view.html:36
msgid "Comments"
@@ -1620,15 +1583,6 @@ msgstr ""
" "
#: .\cookbook\templates\search_info.html:29
#, fuzzy
#| msgid ""
#| " \n"
#| " Simple searches ignore punctuation and common words such as "
#| "'the', 'a', 'and'. And will treat seperate words as required.\n"
#| " Searching for 'apple or flour' will return any recipe that "
#| "includes both 'apple' and 'flour' anywhere in the fields that have been "
#| "selected for a full text search.\n"
#| " "
msgid ""
" \n"
" Simple searches ignore punctuation and common words such as "
@@ -1666,23 +1620,6 @@ msgstr ""
" "
#: .\cookbook\templates\search_info.html:39
#, fuzzy
#| msgid ""
#| " \n"
#| " Web searches simulate functionality found on many web search "
#| "sites supporting special syntax.\n"
#| " Placing quotes around several words will convert those words "
#| "into a phrase.\n"
#| " 'or' is recongized as searching for the word (or phrase) "
#| "immediately before 'or' OR the word (or phrase) directly after.\n"
#| " '-' is recognized as searching for recipes that do not "
#| "include the word (or phrase) that comes immediately after. \n"
#| " For example searching for 'apple pie' or cherry -butter will "
#| "return any recipe that includes the phrase 'apple pie' or the word "
#| "'cherry' \n"
#| " in any field included in the full text search but exclude any "
#| "recipe that has the word 'butter' in any field included.\n"
#| " "
msgid ""
" \n"
" Web searches simulate functionality found on many web search "
@@ -1705,8 +1642,8 @@ msgstr ""
"uri de căutare web care acceptă sintaxa specială.\n"
" Plasarea ghilimelelor în jurul mai multor cuvinte va converti "
"aceste cuvinte într-o frază.\n"
" 'sau' este recunoscut pentru căutarea pentru cuvântul (sau "
"fraza) imediat înainte de 'sau' SAU cuvântul (sau fraza) direct după.\n"
" 'sau' este recunoscut pentru căutarea pentru cuvântul (sau fraza)"
" imediat înainte de 'sau' SAU cuvântul (sau fraza) direct după.\n"
" '-' este recunoscut pentru căutarea rețetelor care nu includ "
"cuvântul (sau fraza) care vine imediat după. \n"
" De exemplu, căutarea 'plăcintei cu mere' sau a untului de cireșe "
@@ -1729,19 +1666,6 @@ msgstr ""
" "
#: .\cookbook\templates\search_info.html:59
#, fuzzy
#| msgid ""
#| " \n"
#| " Another approach to searching that also requires Postgresql "
#| "is fuzzy search or trigram similarity. A trigram is a group of three "
#| "consecutive characters.\n"
#| " For example searching for 'apple' will create x trigrams "
#| "'app', 'ppl', 'ple' and will create a score of how closely words match "
#| "the generated trigrams.\n"
#| " One benefit of searching trigams is that a search for "
#| "'sandwich' will find mispelled words such as 'sandwhich' that would be "
#| "missed by other methods.\n"
#| " "
msgid ""
" \n"
" Another approach to searching that also requires Postgresql is "
@@ -1948,17 +1872,15 @@ msgstr "Creează cont superuser"
#: .\cookbook\templates\socialaccount\authentication_error.html:7
#: .\cookbook\templates\socialaccount\authentication_error.html:23
#, fuzzy
#| msgid "Social Login"
msgid "Social Network Login Failure"
msgstr "Autentificare utilizând rețeaua socială"
msgstr "Eșec la conectarea la rețeaua socială"
#: .\cookbook\templates\socialaccount\authentication_error.html:25
#, fuzzy
#| msgid "An error occurred attempting to move "
msgid ""
"An error occurred while attempting to login via your social network account."
msgstr "A apărut o eroare la încercarea de a muta "
msgstr ""
"S-a produs o eroare în timp ce se încearca autentificarea prin contul tău de "
"rețea socială."
#: .\cookbook\templates\socialaccount\connections.html:4
#: .\cookbook\templates\socialaccount\connections.html:15
@@ -1994,17 +1916,18 @@ msgstr "Înregistrare"
#: .\cookbook\templates\socialaccount\login.html:9
#, python-format
msgid "Connect %(provider)s"
msgstr ""
msgstr "Conectează %(provider)s"
#: .\cookbook\templates\socialaccount\login.html:11
#, python-format
msgid "You are about to connect a new third party account from %(provider)s."
msgstr ""
"Sunteți pe cale să conectați un nou cont de terță parte din %(provider)s."
#: .\cookbook\templates\socialaccount\login.html:13
#, python-format
msgid "Sign In Via %(provider)s"
msgstr ""
msgstr "Intră în cont prin %(provider)s"
#: .\cookbook\templates\socialaccount\login.html:15
#, python-format
@@ -2013,7 +1936,7 @@ msgstr ""
#: .\cookbook\templates\socialaccount\login.html:20
msgid "Continue"
msgstr ""
msgstr "Continuă"
#: .\cookbook\templates\socialaccount\signup.html:10
#, python-format
@@ -2046,7 +1969,7 @@ msgstr "Conectați-vă utilizând"
#: .\cookbook\templates\space_manage.html:7
msgid "Space Management"
msgstr ""
msgstr "Managementul spațiului"
#: .\cookbook\templates\space_manage.html:26
msgid "Space:"
@@ -2057,10 +1980,8 @@ msgid "Manage Subscription"
msgstr "Gestionarea abonamentului"
#: .\cookbook\templates\space_overview.html:13 .\cookbook\views\delete.py:184
#, fuzzy
#| msgid "Space:"
msgid "Space"
msgstr "Spațiu:"
msgstr "Spațiu"
#: .\cookbook\templates\space_overview.html:17
msgid ""
@@ -2078,13 +1999,11 @@ msgstr ""
#: .\cookbook\templates\space_overview.html:53
msgid "Owner"
msgstr ""
msgstr "Proprietar"
#: .\cookbook\templates\space_overview.html:57
#, fuzzy
#| msgid "Create Space"
msgid "Leave Space"
msgstr "Creare spațiu"
msgstr "Părăsire spațiu"
#: .\cookbook\templates\space_overview.html:78
#: .\cookbook\templates\space_overview.html:88
@@ -2147,6 +2066,11 @@ msgid ""
"script to generate version information (done automatically in docker).\n"
" "
msgstr ""
"\n"
" Trebuie să executați <code>version.py</code> în scripturile de "
"actualizare pentru a genera informații despre versiune (realizate automat în "
"docker).\n"
" "
#: .\cookbook\templates\system.html:46
msgid "Media Serving"
@@ -2237,7 +2161,7 @@ msgstr ""
#: .\cookbook\templates\system.html:86
msgid "Allowed Hosts"
msgstr ""
msgstr "Domenii Permise"
#: .\cookbook\templates\system.html:90
msgid ""
@@ -2257,10 +2181,8 @@ msgid "Info"
msgstr "Informație"
#: .\cookbook\templates\system.html:110 .\cookbook\templates\system.html:127
#, fuzzy
#| msgid "Use fractions"
msgid "Migrations"
msgstr "Utilizare fracții"
msgstr "Migrări"
#: .\cookbook\templates\system.html:116
msgid ""
@@ -2276,19 +2198,17 @@ msgstr ""
#: .\cookbook\templates\system.html:182
msgid "False"
msgstr ""
msgstr "Fals"
#: .\cookbook\templates\system.html:182
msgid "True"
msgstr ""
msgstr "Adevărat"
#: .\cookbook\templates\system.html:207
msgid "Hide"
msgstr ""
msgstr "Ascunde"
#: .\cookbook\templates\system.html:210
#, fuzzy
#| msgid "Show Log"
msgid "Show"
msgstr "Afișare jurnal"
@@ -2355,29 +2275,34 @@ msgstr "{child.name} a fost mutat cu succes la părintele {parent.name}"
#: .\cookbook\views\api.py:589
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
msgstr "{obj.name} a fost șters din lista de cumpărături."
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
msgstr "{obj.name} a fost adăugat la lista de cumpărături."
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
msgstr "Filtrează planurile de masă din data (inclusiv) în formatul AAAA-LL-ZZ."
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
"Filtrează planurile de masă până la data (inclusiv) în formatul AAAA-LL-ZZ."
#: .\cookbook\views\api.py:744
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
msgstr ""
"Filtrează planurile de masă cu ID-ul tipului de rețetă. Pentru mai multe "
"repetă parametrul."
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
"ID-ul rețetei din care face pasul face parte. Pentru mai multe repetă "
"parametrul."
#: .\cookbook\views\api.py:873
msgid "Query string matched (fuzzy) against object name."
@@ -2555,8 +2480,6 @@ msgid "Bad URL Schema."
msgstr ""
#: .\cookbook\views\api.py:1474
#, fuzzy
#| msgid "No useable data could be found."
msgid "No usable data could be found."
msgstr "Nu au putut fi găsite date utilizabile."
@@ -2611,20 +2534,16 @@ msgstr ""
"puțin un supervizor."
#: .\cookbook\views\delete.py:135
#, fuzzy
#| msgid "Storage Backend"
msgid "Connectors Config Backend"
msgstr "Backend de stocare"
msgstr "Configurare Backend Conectori"
#: .\cookbook\views\delete.py:157
msgid "Invite Link"
msgstr "Link de invitare"
#: .\cookbook\views\delete.py:168
#, fuzzy
#| msgid "Members"
msgid "Space Membership"
msgstr "Membri"
msgstr "Membri spațiu"
#: .\cookbook\views\edit.py:84
msgid "You cannot edit this storage!"
@@ -2639,10 +2558,8 @@ msgid "There was an error updating this storage backend!"
msgstr "A existat o eroare la actualizarea acestui backend de stocare!"
#: .\cookbook\views\edit.py:134
#, fuzzy
#| msgid "Changes saved!"
msgid "Config saved!"
msgstr "Modificări salvate!"
msgstr "Configurare salvată!"
#: .\cookbook\views\edit.py:142
msgid "ConnectorConfig"
@@ -2675,10 +2592,8 @@ msgid "Shopping List"
msgstr "Listă de cumpărături"
#: .\cookbook\views\lists.py:77 .\cookbook\views\new.py:98
#, fuzzy
#| msgid "Storage Backend"
msgid "Connector Config Backend"
msgstr "Backend de stocare"
msgstr "Configurare Backend pentru Conector"
#: .\cookbook\views\lists.py:91
msgid "Invite Links"
@@ -2693,10 +2608,8 @@ msgid "Shopping Categories"
msgstr "Categorii de cumpărături"
#: .\cookbook\views\lists.py:202
#, fuzzy
#| msgid "Filter"
msgid "Custom Filters"
msgstr "Filtru"
msgstr "Filtre Personalizate"
#: .\cookbook\views\lists.py:239
msgid "Steps"
@@ -2707,10 +2620,8 @@ msgid "Property Types"
msgstr ""
#: .\cookbook\views\new.py:86
#, fuzzy
#| msgid "This feature is not available in the demo version!"
msgid "This feature is not enabled by the server admin!"
msgstr "Această funcție nu este disponibilă în versiunea demo!"
msgstr "Această funcție nu a fost activată de către administrator!"
#: .\cookbook\views\new.py:123
msgid "Imported new recipe!"
@@ -2726,11 +2637,9 @@ msgid "This feature is not available in the demo version!"
msgstr "Această funcție nu este disponibilă în versiunea demo!"
#: .\cookbook\views\views.py:74
#, fuzzy
#| msgid "You have reached the maximum number of recipes for your space."
msgid ""
"You have the reached the maximum amount of spaces that can be owned by you."
msgstr "Ai ajuns la numărul maxim de rețete pentru spațiul dvs."
msgstr "Ai ajuns la numărul maxim de spații pe care le poți deține."
#: .\cookbook\views\views.py:89
msgid ""
@@ -2779,29 +2688,15 @@ msgid "Unable to determine PostgreSQL version."
msgstr ""
#: .\cookbook\views\views.py:317
#, fuzzy
#| msgid ""
#| "\n"
#| " This application is not running with a Postgres database "
#| "backend. This is ok but not recommended as some\n"
#| " features only work with postgres databases.\n"
#| " "
msgid ""
"This application is not running with a Postgres database backend. This is ok "
"but not recommended as some features only work with postgres databases."
msgstr ""
"\n"
" Această aplicație nu se execută cu un backend de bază de date "
"Postgres. Acest lucru este ok, dar nu este recomandat deoarece unele\n"
" caracteristicile funcționează numai cu baze de date Postgres.\n"
" "
"Această aplicație nu se execută cu un backend de bază de date Postgres. "
"Acest lucru este ok, dar nu este recomandat deoarece unele caracteristicile "
"funcționează numai cu baze de date Postgres."
#: .\cookbook\views\views.py:360
#, fuzzy
#| msgid ""
#| "The setup page can only be used to create the first user! If you have "
#| "forgotten your superuser credentials please consult the django "
#| "documentation on how to reset passwords."
msgid ""
"The setup page can only be used to create the first "
"user! If you have forgotten your superuser credentials "
@@ -2852,10 +2747,8 @@ msgid "Manage recipes, shopping list, meal plans and more."
msgstr ""
#: .\cookbook\views\views.py:458
#, fuzzy
#| msgid "Meal-Plan"
msgid "Plan"
msgstr "Plan de alimentare"
msgstr "Plan"
#: .\cookbook\views\views.py:458
msgid "View your meal Plan"
@@ -2863,13 +2756,11 @@ msgstr ""
#: .\cookbook\views\views.py:459
msgid "View your cookbooks"
msgstr ""
msgstr "Vizualizează cărțile de bucate"
#: .\cookbook\views\views.py:460
#, fuzzy
#| msgid "New Shopping List"
msgid "View your shopping lists"
msgstr "Listă de cumpărături nouă"
msgstr "Vezi listele de cumpărături"
#~ msgid "Default unit"
#~ msgstr "Unitate implicită"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2024-03-11 13:02+0000\n"
"Last-Translator: Kn <kn@users.noreply.translate.tandoor.dev>\n"
"PO-Revision-Date: 2025-08-10 11:36+0000\n"
"Last-Translator: Elias Sjögreen <eliassjogreen1@gmail.com>\n"
"Language-Team: Swedish <http://translate.tandoor.dev/projects/tandoor/"
"recipes-backend/sv/>\n"
"Language: sv\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.4.2\n"
"X-Generator: Weblate 5.8.4\n"
#: .\cookbook\forms.py:45
msgid ""
@@ -151,48 +151,61 @@ msgid ""
"Select type method of search. Click <a href=\"/docs/search/\">here</a> for "
"full description of choices."
msgstr ""
"Välj typ av sökmetod. Klicka <a href=\"/docs/search/\">här</a> för "
"fullständig beskrivning av alternativen."
#: .\cookbook\forms.py:341
msgid ""
"Use fuzzy matching on units, keywords and ingredients when editing and "
"importing recipes."
msgstr ""
"Använd \"fuzzy\" matchning på enheter, nyckelord och ingredienser när du "
"redigerar och importerar recept."
#: .\cookbook\forms.py:342
msgid ""
"Fields to search ignoring accents. Selecting this option can improve or "
"degrade search quality depending on language"
msgstr ""
"Fält att söka medan man ignorerar accenter. Val av detta alternativ kan "
"förbättra eller försämra sökkvaliteten beroende på språk"
#: .\cookbook\forms.py:343
msgid ""
"Fields to search for partial matches. (e.g. searching for 'Pie' will return "
"'pie' and 'piece' and 'soapie')"
msgstr ""
"Fält att söka efter delvisa matchningar. (t.ex. att söka efter 'Pie' kommer "
"att returnera 'pie' och 'piece' och 'soapie')"
#: .\cookbook\forms.py:344
msgid ""
"Fields to search for beginning of word matches. (e.g. searching for 'sa' "
"will return 'salad' and 'sandwich')"
msgstr ""
"Fält att söka för matchningar i början av ord. (t.ex. att söka efter 'sa' "
"kommer att returnera 'salad' och 'sandwich')"
#: .\cookbook\forms.py:345
msgid ""
"Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) "
"Note: this option will conflict with 'web' and 'raw' methods of search."
msgstr ""
"Fält för 'fuzzy'-sökning. (t.ex. att söka efter 'recpie' kommer att hitta "
"'recipe'.Observera: detta alternativet kommer att komma i konflikt med "
"sökmetoderna 'web' och 'raw'.)"
#: .\cookbook\forms.py:346
msgid ""
"Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods "
"only function with fulltext fields."
msgstr ""
"Fält för fulltextsökning. Observera: Sökmetoderna 'web', 'phrase' och 'raw' "
"fungerar endast med fulltextfält."
#: .\cookbook\forms.py:350
#, fuzzy
#| msgid "Search"
msgid "Search Method"
msgstr "Sök"
msgstr "Sök Metod"
#: .\cookbook\forms.py:350
msgid "Fuzzy Lookups"
@@ -211,22 +224,20 @@ msgid "Starts With"
msgstr "Börjar med"
#: .\cookbook\forms.py:351
#, fuzzy
#| msgid "Search"
msgid "Fuzzy Search"
msgstr "Sök"
msgstr "Fuzzy Sök"
#: .\cookbook\forms.py:351
#, fuzzy
#| msgid "Text"
msgid "Full Text"
msgstr "Text"
msgstr "Hel Text"
#: .\cookbook\helper\AllAuthCustomAdapter.py:41
msgid ""
"In order to prevent spam, the requested email was not send. Please wait a "
"few minutes and try again."
msgstr ""
"För att förhindra spam, så skickades inte den begärda e-posten. Vänta några "
"minuter och försök igen."
#: .\cookbook\helper\permission_helper.py:164
#: .\cookbook\helper\permission_helper.py:187 .\cookbook\views\views.py:117
@@ -255,19 +266,19 @@ msgstr "Du kan inte interagera med detta objekt för att det ägs inte av dig!"
#: .\cookbook\helper\permission_helper.py:402
msgid "You have reached the maximum number of recipes for your space."
msgstr ""
msgstr "Du har nått det maximala antalet recept för din utrymme."
#: .\cookbook\helper\permission_helper.py:414
msgid "You have more users than allowed in your space."
msgstr ""
msgstr "Du har mer användare än tillåtet för ditt utrymme."
#: .\cookbook\helper\recipe_url_import.py:310
msgid "reverse rotation"
msgstr ""
msgstr "återvänd rotering"
#: .\cookbook\helper\recipe_url_import.py:311
msgid "careful rotation"
msgstr ""
msgstr "försiktig rotering"
#: .\cookbook\helper\recipe_url_import.py:312
msgid "knead"
@@ -291,7 +302,7 @@ msgstr "sous-vide"
#: .\cookbook\helper\shopping_helper.py:150
msgid "You must supply a servings size"
msgstr ""
msgstr "Du måste ange en portionstorlek"
#: .\cookbook\helper\template_helper.py:95
#: .\cookbook\helper\template_helper.py:97
@@ -305,7 +316,7 @@ msgstr "Favorit"
#: .\cookbook\integration\copymethat.py:50
msgid "I made this"
msgstr ""
msgstr "Jag gjorde den här"
#: .\cookbook\integration\integration.py:209
msgid ""
@@ -319,6 +330,8 @@ msgid ""
"An unexpected error occurred during the import. Please make sure you have "
"uploaded a valid file."
msgstr ""
"Ett oväntat fel uppstod under importeringen. Se till att du har laddat upp "
"en giltig fil."
#: .\cookbook\integration\integration.py:217
msgid "The following recipes were ignored because they already existed:"
@@ -330,10 +343,8 @@ msgid "Imported %s recipes."
msgstr "Importerade %s recept."
#: .\cookbook\integration\openeats.py:28
#, fuzzy
#| msgid "Recipe Home"
msgid "Recipe source:"
msgstr "Recept Hem"
msgstr "Recept källa:"
#: .\cookbook\integration\paprika.py:49
msgid "Notes"
@@ -374,23 +385,25 @@ msgstr "Sektion"
#: .\cookbook\management\commands\fix_duplicate_properties.py:15
msgid "Fixes foods with "
msgstr ""
msgstr "Korrigerar livsmedel med "
#: .\cookbook\management\commands\rebuildindex.py:14
msgid "Rebuilds full text search index on Recipe"
msgstr ""
msgstr "Återuppbygger fulltextsökningens index för Recept"
#: .\cookbook\management\commands\rebuildindex.py:18
msgid "Only Postgresql databases use full text search, no index to rebuild"
msgstr ""
"Endast Postgresql-databaser använder fulltextsökning, inget index att "
"återuppbygga med"
#: .\cookbook\management\commands\rebuildindex.py:29
msgid "Recipe index rebuild complete."
msgstr ""
msgstr "Recept index återbyggning färdig."
#: .\cookbook\management\commands\rebuildindex.py:31
msgid "Recipe index rebuild failed."
msgstr ""
msgstr "Recept index återbyggning misslyckades."
#: .\cookbook\migrations\0047_auto_20200602_1133.py:14
msgid "Breakfast"
@@ -439,6 +452,8 @@ msgid ""
"Maximum file storage for space in MB. 0 for unlimited, -1 to disable file "
"upload."
msgstr ""
"Maximal lagringsutrymme för utrymme i MB. 0 för obegränsad, -1 för att "
"inaktivera filuppladdning."
#: .\cookbook\models.py:454 .\cookbook\templates\search.html:7
#: .\cookbook\templates\settings.html:18
@@ -462,7 +477,7 @@ msgstr "Handla"
#: .\cookbook\models.py:752
msgid " is part of a recipe step and cannot be deleted"
msgstr ""
msgstr " är en del av ett receptsteg och kan inte tas bort"
#: .\cookbook\models.py:918
msgid "Nutrition"
@@ -501,34 +516,24 @@ msgid "Food Alias"
msgstr "Alternativt namn för mat"
#: .\cookbook\models.py:1468
#, fuzzy
#| msgid "Units"
msgid "Unit Alias"
msgstr "Enheter"
msgstr "Enhetsalias"
#: .\cookbook\models.py:1469
#, fuzzy
#| msgid "Keywords"
msgid "Keyword Alias"
msgstr "Nyckelord"
msgstr "Nyckelordsalias"
#: .\cookbook\models.py:1470
#, fuzzy
#| msgid "Description"
msgid "Description Replace"
msgstr "Beskrivning"
msgstr "Beskrivning Ersätt"
#: .\cookbook\models.py:1471
#, fuzzy
#| msgid "Instructions"
msgid "Instruction Replace"
msgstr "Instruktioner"
msgstr "Instruktioner Ersätt"
#: .\cookbook\models.py:1472
#, fuzzy
#| msgid "New Unit"
msgid "Never Unit"
msgstr "Ny enhet"
msgstr "Aldrig Enhet"
#: .\cookbook\models.py:1473
msgid "Transpose Words"
@@ -539,14 +544,12 @@ msgid "Food Replace"
msgstr "Ersätt mat"
#: .\cookbook\models.py:1475
#, fuzzy
#| msgid "Edit Recipe"
msgid "Unit Replace"
msgstr "Redigera recept"
msgstr "Ersätt Enhet"
#: .\cookbook\models.py:1476
msgid "Name Replace"
msgstr ""
msgstr "Ersättningsnamn"
#: .\cookbook\models.py:1503 .\cookbook\views\delete.py:40
#: .\cookbook\views\edit.py:210 .\cookbook\views\new.py:39
@@ -563,15 +566,15 @@ msgstr "Nyckelord"
#: .\cookbook\serializer.py:222
msgid "File uploads are not enabled for this Space."
msgstr ""
msgstr "Filuppladdning är inte aktiverat för det här utrymmet."
#: .\cookbook\serializer.py:233
msgid "You have reached your file upload limit."
msgstr ""
msgstr "Du har nått din maxgräns för uppladdningar."
#: .\cookbook\serializer.py:328
msgid "Cannot modify Space owner permission."
msgstr ""
msgstr "Kan inte modifiera utrymmets ägar-rättigheter."
#: .\cookbook\serializer.py:1270
msgid "Hello"
@@ -579,60 +582,67 @@ msgstr "Hej"
#: .\cookbook\serializer.py:1270
msgid "You have been invited by "
msgstr ""
msgstr "Du har bjudits in av "
#: .\cookbook\serializer.py:1272
msgid " to join their Tandoor Recipes space "
msgstr ""
msgstr " för att ansluta till deras Tandoor recept utrymme "
#: .\cookbook\serializer.py:1274
msgid "Click the following link to activate your account: "
msgstr ""
msgstr "Klicka på länken för att aktivera ditt konto: "
#: .\cookbook\serializer.py:1276
msgid ""
"If the link does not work use the following code to manually join the space: "
msgstr ""
"Om länken inte fungerar kan du testa följande kod för att manuellt aktivera "
"ditt utrymme: "
#: .\cookbook\serializer.py:1278
msgid "The invitation is valid until "
msgstr ""
msgstr "Inbjudningen är giltig till "
#: .\cookbook\serializer.py:1280
msgid ""
"Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub "
msgstr ""
"Tandoor recept är en recept-hanterar med öppen källkod. Se mer på GitHub "
#: .\cookbook\serializer.py:1283
msgid "Tandoor Recipes Invite"
msgstr ""
msgstr "Tandoor recept inbjudan"
#: .\cookbook\serializer.py:1426
msgid "Existing shopping list to update"
msgstr ""
msgstr "Existerande inköpslistor att uppdatera"
#: .\cookbook\serializer.py:1428
msgid ""
"List of ingredient IDs from the recipe to add, if not provided all "
"ingredients will be added."
msgstr ""
"Lista med ingrediens ID:n från receptet att lägga till, om inget angetts "
"kommer alla ingredienser bli tillagda."
#: .\cookbook\serializer.py:1430
msgid ""
"Providing a list_recipe ID and servings of 0 will delete that shopping list."
msgstr ""
msgstr "Anges ett list_recept ID och 0 portioner kommer den listan raderas."
#: .\cookbook\serializer.py:1439
msgid "Amount of food to add to the shopping list"
msgstr ""
msgstr "Mängd av ingrediens att lägga till på inköpslistan"
#: .\cookbook\serializer.py:1441
msgid "ID of unit to use for the shopping list"
msgstr ""
msgstr "ID eller enhet att använda för inköpslistan"
#: .\cookbook\serializer.py:1443
msgid "When set to true will delete all food from active shopping lists."
msgstr ""
"Om det här alternativet är aktiverat kommer alla matvaror att raderas från "
"de aktiva inköpslistorna."
#: .\cookbook\tables.py:69 .\cookbook\tables.py:83
#: .\cookbook\templates\generic\delete_template.html:7
@@ -678,7 +688,7 @@ msgstr "Email"
#: .\cookbook\templates\account\email.html:19
msgid "The following e-mail addresses are associated with your account:"
msgstr ""
msgstr "Följande epost-addresser är associerade med ditt konto:"
#: .\cookbook\templates\account\email.html:36
msgid "Verified"
@@ -693,14 +703,12 @@ msgid "Primary"
msgstr "Primär"
#: .\cookbook\templates\account\email.html:47
#, fuzzy
#| msgid "Make Header"
msgid "Make Primary"
msgstr "Skapa titel"
msgstr "Markera som primär"
#: .\cookbook\templates\account\email.html:49
msgid "Re-send Verification"
msgstr ""
msgstr "Sänd verifikationen igen"
#: .\cookbook\templates\account\email.html:50
#: .\cookbook\templates\generic\delete_template.html:57
@@ -717,10 +725,13 @@ msgid ""
"You currently do not have any e-mail address set up. You should really add "
"an e-mail address so you can receive notifications, reset your password, etc."
msgstr ""
"Just nu har du inga e-post adresser konfigurerade. Du borde verkligen lägga "
"till en e-post adress så att du kan får notiser, återställa ditt lösenord, "
"mm."
#: .\cookbook\templates\account\email.html:64
msgid "Add E-mail Address"
msgstr ""
msgstr "Lägg till en e-post adress"
#: .\cookbook\templates\account\email.html:69
msgid "Add E-mail"
@@ -728,12 +739,12 @@ msgstr "Lägg till email"
#: .\cookbook\templates\account\email.html:79
msgid "Do you really want to remove the selected e-mail address?"
msgstr ""
msgstr "Vill du verkligen ta bort den valda e-postadressen?"
#: .\cookbook\templates\account\email_confirm.html:6
#: .\cookbook\templates\account\email_confirm.html:10
msgid "Confirm E-mail Address"
msgstr ""
msgstr "Bekräfta e-postadress"
#: .\cookbook\templates\account\email_confirm.html:16
#, python-format
@@ -743,6 +754,10 @@ msgid ""
"for user %(user_display)s\n"
" ."
msgstr ""
"Vänligen bekräfra att\n"
" <a href=\"mailto:%(email)s\">%(email)s</a> är e-postadressen för "
"användaren %(user_display)s\n"
" ."
#: .\cookbook\templates\account\email_confirm.html:22
#: .\cookbook\templates\generic\delete_template.html:72
@@ -756,6 +771,9 @@ msgid ""
" <a href=\"%(email_url)s\">issue a new e-mail confirmation "
"request</a>."
msgstr ""
"Denna e-post bekräftelselänk är utgången eller felaktig. Vänligen\n"
" <a href=\"%(email_url)s\">skapa en ny "
"e-postbekräftelsebegäran</a>."
#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:388
#: .\cookbook\templates\openid\login.html:8
@@ -779,19 +797,17 @@ msgstr "Logga in"
#: .\cookbook\templates\account\password_reset_done.html:33
#: .\cookbook\templates\socialaccount\signup.html:8
#: .\cookbook\templates\socialaccount\signup.html:57
#, fuzzy
#| msgid "Sign In"
msgid "Sign Up"
msgstr "Logga in"
msgstr "Registrera dig"
#: .\cookbook\templates\account\login.html:38
msgid "Lost your password?"
msgstr ""
msgstr "Glömt ditt lösenord?"
#: .\cookbook\templates\account\login.html:39
#: .\cookbook\templates\account\password_reset.html:29
msgid "Reset My Password"
msgstr ""
msgstr "Återställ mitt lösenord"
#: .\cookbook\templates\account\login.html:50
msgid "Social Login"
@@ -818,10 +834,8 @@ msgstr "Är du säker på att du vill logga ut?"
#: .\cookbook\templates\account\password_reset_from_key.html:13
#: .\cookbook\templates\account\password_reset_from_key_done.html:7
#: .\cookbook\templates\account\password_reset_from_key_done.html:13
#, fuzzy
#| msgid "Changes saved!"
msgid "Change Password"
msgstr "Ändringar sparade!"
msgstr "Ändra lösenord"
#: .\cookbook\templates\account\password_change.html:12
#: .\cookbook\templates\account\password_set.html:12
@@ -844,18 +858,20 @@ msgid ""
"Forgotten your password? Enter your e-mail address below, and we'll send you "
"an e-mail allowing you to reset it."
msgstr ""
"Glömt ditt lösenord? Ange din e-postadress nedanför så skickar vi ett "
"återställningmail."
#: .\cookbook\templates\account\password_reset.html:32
#, fuzzy
#| msgid "Password reset is not implemented for the time being!"
msgid "Password reset is disabled on this instance."
msgstr "Återställning av lösenord har ännu inte lagts till!"
msgstr "Återställning av lösenord är avaktiverat på denna instans."
#: .\cookbook\templates\account\password_reset_done.html:25
msgid ""
"We have sent you an e-mail. Please contact us if you do not receive it "
"within a few minutes."
msgstr ""
"Vi har skickat ett e-postmeddelande till dig. Om du inte har fått det inom "
"några minuter, vänligen kontakta oss."
#: .\cookbook\templates\account\password_reset_from_key.html:13
#, fuzzy

View File

@@ -11,8 +11,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2024-07-03 16:38+0000\n"
"Last-Translator: Taylan TATLI <uyelik-tandoor@tatli.me>\n"
"PO-Revision-Date: 2025-01-20 05:20+0000\n"
"Last-Translator: Yigit <yigit.gungor@outlook.com>\n"
"Language-Team: Turkish <http://translate.tandoor.dev/projects/tandoor/"
"recipes-backend/tr/>\n"
"Language: tr\n"
@@ -20,7 +20,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Weblate 5.4.2\n"
"X-Generator: Weblate 5.8.4\n"
#: .\cookbook\forms.py:45
msgid ""
@@ -199,7 +199,7 @@ msgstr ""
#: .\cookbook\forms.py:350
msgid "Search Method"
msgstr ""
msgstr "Arama Metodu"
#: .\cookbook\forms.py:350
msgid "Fuzzy Lookups"
@@ -207,15 +207,15 @@ msgstr ""
#: .\cookbook\forms.py:350
msgid "Ignore Accent"
msgstr ""
msgstr "Harflerdeki Vurguları Görmezden Gel"
#: .\cookbook\forms.py:350
msgid "Partial Match"
msgstr ""
msgstr "Kısmi Eşleşme"
#: .\cookbook\forms.py:350
msgid "Starts With"
msgstr ""
msgstr "İle başlayan"
#: .\cookbook\forms.py:351
msgid "Fuzzy Search"
@@ -223,18 +223,20 @@ msgstr ""
#: .\cookbook\forms.py:351
msgid "Full Text"
msgstr ""
msgstr "Tam Metin"
#: .\cookbook\helper\AllAuthCustomAdapter.py:41
msgid ""
"In order to prevent spam, the requested email was not send. Please wait a "
"few minutes and try again."
msgstr ""
"İstenmeyen e-postayı önlemek için istenen e-posta gönderilemedi. Lütfen "
"birkaç dakika bekleyin ve tekrar deneyin."
#: .\cookbook\helper\permission_helper.py:164
#: .\cookbook\helper\permission_helper.py:187 .\cookbook\views\views.py:117
msgid "You are not logged in and therefore cannot view this page!"
msgstr ""
msgstr "Giriş yapmadınız ve bu nedenle bu sayfayı görüntüleyemezsiniz!"
#: .\cookbook\helper\permission_helper.py:168
#: .\cookbook\helper\permission_helper.py:174
@@ -247,68 +249,68 @@ msgstr ""
#: .\cookbook\helper\permission_helper.py:341 .\cookbook\views\data.py:35
#: .\cookbook\views\views.py:127 .\cookbook\views\views.py:131
msgid "You do not have the required permissions to view this page!"
msgstr ""
msgstr "Bu sayfayı görüntülemek için gerekli izinlere sahip değilsiniz!"
#: .\cookbook\helper\permission_helper.py:192
#: .\cookbook\helper\permission_helper.py:215
#: .\cookbook\helper\permission_helper.py:237
#: .\cookbook\helper\permission_helper.py:252
msgid "You cannot interact with this object as it is not owned by you!"
msgstr ""
msgstr "Bu nesne size ait olmadığı için onunla etkileşime giremezsiniz!"
#: .\cookbook\helper\permission_helper.py:402
msgid "You have reached the maximum number of recipes for your space."
msgstr ""
msgstr "Alanınız için maksimum tarif sayısına ulaştınız."
#: .\cookbook\helper\permission_helper.py:414
msgid "You have more users than allowed in your space."
msgstr ""
msgstr "Alanınızda izin verilenden daha fazla kullanıcı var."
#: .\cookbook\helper\recipe_url_import.py:310
msgid "reverse rotation"
msgstr ""
msgstr "ters dönüş"
#: .\cookbook\helper\recipe_url_import.py:311
msgid "careful rotation"
msgstr ""
msgstr "dikkatli dönüş"
#: .\cookbook\helper\recipe_url_import.py:312
msgid "knead"
msgstr ""
msgstr "yoğur"
#: .\cookbook\helper\recipe_url_import.py:313
msgid "thicken"
msgstr ""
msgstr "kalınlaştır"
#: .\cookbook\helper\recipe_url_import.py:314
msgid "warm up"
msgstr ""
msgstr "ısıt"
#: .\cookbook\helper\recipe_url_import.py:315
msgid "ferment"
msgstr ""
msgstr "mayala"
#: .\cookbook\helper\recipe_url_import.py:316
msgid "sous-vide"
msgstr ""
msgstr "sous-vide"
#: .\cookbook\helper\shopping_helper.py:150
msgid "You must supply a servings size"
msgstr ""
msgstr "Bir porsiyon büyüklüğü vermelisiniz"
#: .\cookbook\helper\template_helper.py:95
#: .\cookbook\helper\template_helper.py:97
msgid "Could not parse template code."
msgstr ""
msgstr "Şablon kodu ayrıştırılamadı."
#: .\cookbook\integration\copymethat.py:44
#: .\cookbook\integration\melarecipes.py:37
msgid "Favorite"
msgstr ""
msgstr "Favori"
#: .\cookbook\integration\copymethat.py:50
msgid "I made this"
msgstr ""
msgstr "Bunu yaptım"
#: .\cookbook\integration\integration.py:209
msgid ""
@@ -324,28 +326,28 @@ msgstr ""
#: .\cookbook\integration\integration.py:217
msgid "The following recipes were ignored because they already existed:"
msgstr ""
msgstr "Aşağıdaki tarifler zaten mevcut olduğu için göz ardı edildi:"
#: .\cookbook\integration\integration.py:221
#, python-format
msgid "Imported %s recipes."
msgstr ""
msgstr "%s tarif içe aktarıldı."
#: .\cookbook\integration\openeats.py:28
msgid "Recipe source:"
msgstr ""
msgstr "Tarif kaynağı:"
#: .\cookbook\integration\paprika.py:49
msgid "Notes"
msgstr ""
msgstr "Notlar"
#: .\cookbook\integration\paprika.py:52
msgid "Nutritional Information"
msgstr ""
msgstr "Beslenme Bilgileri"
#: .\cookbook\integration\paprika.py:56
msgid "Source"
msgstr ""
msgstr "Kaynak"
#: .\cookbook\integration\recettetek.py:54
#: .\cookbook\integration\recipekeeper.py:70
@@ -354,23 +356,23 @@ msgstr ""
#: .\cookbook\integration\saffron.py:23
msgid "Servings"
msgstr ""
msgstr "Porsiyon"
#: .\cookbook\integration\saffron.py:25
msgid "Waiting time"
msgstr ""
msgstr "Bekleme süresi"
#: .\cookbook\integration\saffron.py:27
msgid "Preparation Time"
msgstr ""
msgstr "Hazırlık Süresi"
#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\index.html:7
msgid "Cookbook"
msgstr ""
msgstr "Yemek kitabı"
#: .\cookbook\integration\saffron.py:31
msgid "Section"
msgstr ""
msgstr "Bölüm"
#: .\cookbook\management\commands\fix_duplicate_properties.py:15
msgid "Fixes foods with "
@@ -383,6 +385,8 @@ msgstr ""
#: .\cookbook\management\commands\rebuildindex.py:18
msgid "Only Postgresql databases use full text search, no index to rebuild"
msgstr ""
"Yalnızca Postgresql veritabanları tam metin araması kullanır, yeniden "
"oluşturulacak dizin yoktur"
#: .\cookbook\management\commands\rebuildindex.py:29
msgid "Recipe index rebuild complete."

View File

@@ -8,17 +8,17 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2023-04-12 11:55+0000\n"
"Last-Translator: noxonad <noxonad@proton.me>\n"
"PO-Revision-Date: 2025-01-16 18:58+0000\n"
"Last-Translator: Anton Shevtsov <ashevtsovs@gmail.com>\n"
"Language-Team: Ukrainian <http://translate.tandoor.dev/projects/tandoor/"
"recipes-backend/uk/>\n"
"Language: uk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.15\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 5.8.4\n"
#: .\cookbook\forms.py:45
msgid ""
@@ -32,51 +32,55 @@ msgstr ""
#: .\cookbook\forms.py:62 .\cookbook\forms.py:246 .\cookbook\views\lists.py:103
msgid "Keywords"
msgstr ""
msgstr "Ключові слова"
#: .\cookbook\forms.py:62
msgid "Preparation time in minutes"
msgstr ""
msgstr "Час приготування у хвилинах"
#: .\cookbook\forms.py:62
msgid "Waiting time (cooking/baking) in minutes"
msgstr ""
msgstr "Час очікування (варіння/випічка) у хвилинах"
#: .\cookbook\forms.py:63 .\cookbook\forms.py:222 .\cookbook\forms.py:246
msgid "Path"
msgstr ""
msgstr "Шлях"
#: .\cookbook\forms.py:63
msgid "Storage UID"
msgstr ""
msgstr "UID сховища"
#: .\cookbook\forms.py:93
msgid "Default"
msgstr ""
msgstr "За замовчуванням"
#: .\cookbook\forms.py:121
msgid ""
"To prevent duplicates recipes with the same name as existing ones are "
"ignored. Check this box to import everything."
msgstr ""
"Щоб запобігти дублюванням, рецепти з назвами, що вже існують, "
"ігноруватимуться. Установіть цей прапорець, щоб імпортувати все."
#: .\cookbook\forms.py:143
msgid "Add your comment: "
msgstr ""
msgstr "Додайте ваш коментар: "
#: .\cookbook\forms.py:151
msgid "Leave empty for dropbox and enter app password for nextcloud."
msgstr ""
msgstr "Залиште порожнім для dropbox і введіть api ключі для nextcloud."
#: .\cookbook\forms.py:154
msgid "Leave empty for nextcloud and enter api token for dropbox."
msgstr ""
msgstr "Залиште порожнім для nextcloud і введіть api ключі для dropbox."
#: .\cookbook\forms.py:160
msgid ""
"Leave empty for dropbox and enter only base url for nextcloud (<code>/remote."
"php/webdav/</code> is added automatically)"
msgstr ""
"Залиште порожнім для dropbox і введіть лише базовий url для nextcloud "
"(<code>/remote.php/webdav/</code> буде додано автоматично)"
#: .\cookbook\forms.py:188
msgid ""
@@ -937,13 +941,13 @@ msgstr ""
#: .\cookbook\templates\ingredient_editor.html:7
#: .\cookbook\templates\ingredient_editor.html:13
msgid "Ingredient Editor"
msgstr ""
msgstr "Редактор Інгредієнтів"
#: .\cookbook\templates\base.html:275
#: .\cookbook\templates\export_response.html:7
#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20
msgid "Export"
msgstr ""
msgstr "Експорт"
#: .\cookbook\templates\base.html:287
msgid "Properties"

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2024-02-15 03:19+0000\n"
"Last-Translator: dalan <xzdlj@outlook.com>\n"
"PO-Revision-Date: 2024-11-04 10:29+0000\n"
"Last-Translator: Johnny Ip <ip.iohnny@gmail.com>\n"
"Language-Team: Chinese (Simplified) <http://translate.tandoor.dev/projects/"
"tandoor/recipes-backend/zh_Hans/>\n"
"Language: zh_CN\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.15\n"
"X-Generator: Weblate 5.6.2\n"
#: .\cookbook\forms.py:45
msgid ""
@@ -86,14 +86,16 @@ msgid ""
"<a href=\"https://www.home-assistant.io/docs/authentication/#your-account-"
"profile\">Long Lived Access Token</a> for your HomeAssistant instance"
msgstr ""
"您的HomeAssistant示例的<a href=\"https://www.home-assistant.io/docs/"
"authentication/#your-account-profile\">长期访问令牌</a>"
#: .\cookbook\forms.py:193
msgid "Something like http://homeassistant.local:8123/api"
msgstr ""
msgstr "形如 http://homeassistant.local:8123/api"
#: .\cookbook\forms.py:205
msgid "http://homeassistant.local:8123/api for example"
msgstr ""
msgstr "例如 http://homeassistant.local:8123/api"
#: .\cookbook\forms.py:222 .\cookbook\views\edit.py:117
msgid "Storage"
@@ -356,7 +358,7 @@ msgstr "准备时间"
#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\index.html:7
msgid "Cookbook"
msgstr "菜谱"
msgstr "烹饪手册"
#: .\cookbook\integration\saffron.py:31
msgid "Section"
@@ -364,7 +366,7 @@ msgstr "部分"
#: .\cookbook\management\commands\fix_duplicate_properties.py:15
msgid "Fixes foods with "
msgstr ""
msgstr "修复食谱中的重复字段 "
#: .\cookbook\management\commands\rebuildindex.py:14
msgid "Rebuilds full text search index on Recipe"
@@ -400,29 +402,29 @@ msgstr "其他"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:17
msgid "Fat"
msgstr ""
msgstr "脂肪"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:17
#: .\cookbook\migrations\0190_auto_20230525_1506.py:18
#: .\cookbook\migrations\0190_auto_20230525_1506.py:19
msgid "g"
msgstr ""
msgstr ""
#: .\cookbook\migrations\0190_auto_20230525_1506.py:18
msgid "Carbohydrates"
msgstr ""
msgstr "碳水化合物"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:19
msgid "Proteins"
msgstr ""
msgstr "蛋白质"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:20
msgid "Calories"
msgstr ""
msgstr "卡路里"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:20
msgid "kcal"
msgstr ""
msgstr "千卡"
#: .\cookbook\models.py:325
msgid ""
@@ -443,7 +445,7 @@ msgstr "膳食计划"
#: .\cookbook\models.py:456 .\cookbook\templates\base.html:122
#: .\cookbook\views\views.py:459
msgid "Books"
msgstr "书籍"
msgstr "烹饪手册"
#: .\cookbook\models.py:457 .\cookbook\templates\base.html:118
#: .\cookbook\views\views.py:460
@@ -455,24 +457,20 @@ msgid " is part of a recipe step and cannot be deleted"
msgstr " 是菜谱步骤的一部分,不能删除"
#: .\cookbook\models.py:918
#, fuzzy
#| msgid "Automations"
msgid "Nutrition"
msgstr "自动化"
msgstr "营养"
#: .\cookbook\models.py:918
#, fuzzy
#| msgid "Merge"
msgid "Allergen"
msgstr "合并"
msgstr "过敏原"
#: .\cookbook\models.py:919
msgid "Price"
msgstr ""
msgstr "价格"
#: .\cookbook\models.py:919
msgid "Goal"
msgstr ""
msgstr "目标"
#: .\cookbook\models.py:1408 .\cookbook\templates\search_info.html:28
msgid "Simple"
@@ -511,30 +509,24 @@ msgid "Instruction Replace"
msgstr "指示"
#: .\cookbook\models.py:1472
#, fuzzy
#| msgid "New Unit"
msgid "Never Unit"
msgstr "新单位"
msgstr "禁用单位识别"
#: .\cookbook\models.py:1473
msgid "Transpose Words"
msgstr ""
msgstr "字符串转置"
#: .\cookbook\models.py:1474
#, fuzzy
#| msgid "Food Alias"
msgid "Food Replace"
msgstr "食物别名"
msgstr "食物替换"
#: .\cookbook\models.py:1475
#, fuzzy
#| msgid "Description Replace"
msgid "Unit Replace"
msgstr "描述"
msgstr "单位替换"
#: .\cookbook\models.py:1476
msgid "Name Replace"
msgstr ""
msgstr "名称替换"
#: .\cookbook\models.py:1503 .\cookbook\views\delete.py:40
#: .\cookbook\views\edit.py:210 .\cookbook\views\new.py:39
@@ -571,7 +563,7 @@ msgstr "您已被邀请至 "
#: .\cookbook\serializer.py:1272
msgid " to join their Tandoor Recipes space "
msgstr " 加入他们的泥炉食谱空间 "
msgstr " 加入他们的 Tandoor 食谱空间 "
#: .\cookbook\serializer.py:1274
msgid "Click the following link to activate your account: "
@@ -589,11 +581,11 @@ msgstr "邀请有效期至 "
#: .\cookbook\serializer.py:1280
msgid ""
"Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub "
msgstr "泥炉食谱是一个开源食谱管理器。 在 GitHub 上查看 "
msgstr "Tandoor 是一个开源食谱管理器。 在 GitHub 上查看 "
#: .\cookbook\serializer.py:1283
msgid "Tandoor Recipes Invite"
msgstr "泥炉食谱邀请"
msgstr "Tandoor 食谱邀请"
#: .\cookbook\serializer.py:1426
msgid "Existing shopping list to update"
@@ -979,13 +971,11 @@ msgstr "导出"
#: .\cookbook\templates\base.html:287
msgid "Properties"
msgstr ""
msgstr "属性"
#: .\cookbook\templates\base.html:301 .\cookbook\views\lists.py:255
#, fuzzy
#| msgid "Account Connections"
msgid "Unit Conversions"
msgstr "帐号连接"
msgstr "单位转换"
#: .\cookbook\templates\base.html:318 .\cookbook\templates\index.html:47
msgid "Import Recipe"
@@ -1005,10 +995,8 @@ msgid "Space Settings"
msgstr "空间设置"
#: .\cookbook\templates\base.html:340
#, fuzzy
#| msgid "External Recipes"
msgid "External Connectors"
msgstr "外部菜谱"
msgstr "外部连接器"
#: .\cookbook\templates\base.html:345 .\cookbook\templates\system.html:13
msgid "System"
@@ -1038,7 +1026,7 @@ msgstr "GitHub"
#: .\cookbook\templates\base.html:376
msgid "Translate Tandoor"
msgstr "翻译泥炉"
msgstr "翻译 Tandoor"
#: .\cookbook\templates\base.html:380
msgid "API Browser"
@@ -1050,7 +1038,7 @@ msgstr "退出"
#: .\cookbook\templates\base.html:406
msgid "You are using the free version of Tandor"
msgstr "你正在使用免费版的泥炉"
msgstr "你正在使用免费版的 Tandoor"
#: .\cookbook\templates\base.html:407
msgid "Upgrade Now"
@@ -1123,7 +1111,7 @@ msgstr "这可能需要几分钟,取决于同步的菜谱数量,请等待。
#: .\cookbook\templates\books.html:7
msgid "Recipe Books"
msgstr "菜谱书"
msgstr "烹饪手册"
#: .\cookbook\templates\export.html:7 .\cookbook\templates\test2.html:6
msgid "Export Recipes"
@@ -1453,10 +1441,8 @@ msgid "Back"
msgstr "返回"
#: .\cookbook\templates\property_editor.html:7
#, fuzzy
#| msgid "Ingredient Editor"
msgid "Property Editor"
msgstr "食材编辑器"
msgstr "属性编辑器"
#: .\cookbook\templates\recipe_view.html:36
msgid "Comments"
@@ -1770,7 +1756,7 @@ msgstr "非常适合大型数据库"
#: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5
msgid "Cookbook Setup"
msgstr "安装菜谱"
msgstr "安装菜谱应用"
#: .\cookbook\templates\setup.html:14
msgid "Setup"
@@ -1879,10 +1865,8 @@ msgid "Sign in using"
msgstr "登录使用"
#: .\cookbook\templates\space_manage.html:7
#, fuzzy
#| msgid "Space Membership"
msgid "Space Management"
msgstr "成员"
msgstr "空间管理"
#: .\cookbook\templates\space_manage.html:26
msgid "Space:"
@@ -1974,6 +1958,10 @@ msgid ""
"script to generate version information (done automatically in docker).\n"
" "
msgstr ""
"\n"
" 您需要在您的更新脚本中执行 <code>version.py</code> "
"生成版本信息Docker实例中会自动执行。\n"
" "
#: .\cookbook\templates\system.html:46
msgid "Media Serving"
@@ -2000,9 +1988,11 @@ msgid ""
" your installation.\n"
" "
msgstr ""
"<b>不推荐</b> 使用 gunicorn/python 提供媒体文件\n"
" 请按照 <a href=\"https://github.com/vabene1111/recipes/releases/"
"tag/0.8.1\">这里</a> 描述的步骤操作更新安装。\n"
"<b>不推荐</b> 使用 gunicorn/python 提供媒体文件\n"
" 请按照\n"
" <a href=\"https://github.com/vabene1111/recipes/releases/tag/0.8."
"1\">这里</a> 描述的步骤\n"
" 操作更新安装。\n"
" "
#: .\cookbook\templates\system.html:55 .\cookbook\templates\system.html:70
@@ -2057,7 +2047,7 @@ msgstr ""
#: .\cookbook\templates\system.html:86
msgid "Allowed Hosts"
msgstr ""
msgstr "域名白名单"
#: .\cookbook\templates\system.html:90
msgid ""
@@ -2067,6 +2057,10 @@ msgid ""
"this.\n"
" "
msgstr ""
"\n"
" 您未配置域名白名单,本实例可以通过任意域名访问,某些特殊情况下可"
"能有用,但请尽量避免这样配置,请参考文档配置 ALLOWED_HOSTS 。\n"
" "
#: .\cookbook\templates\system.html:97
msgid "Database"
@@ -2077,10 +2071,8 @@ msgid "Info"
msgstr "信息"
#: .\cookbook\templates\system.html:110 .\cookbook\templates\system.html:127
#, fuzzy
#| msgid "Use fractions"
msgid "Migrations"
msgstr "使用分数"
msgstr "数据库结构变更"
#: .\cookbook\templates\system.html:116
msgid ""
@@ -2093,24 +2085,28 @@ msgid ""
"issue.\n"
" "
msgstr ""
"\n"
" 正常情况下数据库迁移不应产生任何报错!\n"
" 数据库迁移失败很可能导致本应用的功能出错或完全不可用。\n"
" 如果您在最新版本上数据库迁移依然产生错误,"
"请将数据库迁移日志和页面下方的信息反馈至 Github Issue 中。\n"
" "
#: .\cookbook\templates\system.html:182
msgid "False"
msgstr ""
msgstr ""
#: .\cookbook\templates\system.html:182
msgid "True"
msgstr ""
msgstr ""
#: .\cookbook\templates\system.html:207
msgid "Hide"
msgstr ""
msgstr "隐藏"
#: .\cookbook\templates\system.html:210
#, fuzzy
#| msgid "Show Log"
msgid "Show"
msgstr "显示记录"
msgstr "显示"
#: .\cookbook\templates\url_import.html:8
msgid "URL Import"
@@ -2184,17 +2180,15 @@ msgstr "{obj.name} 已添加到购物清单中。"
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
msgstr "指定开始日期以过滤膳食计划(包含选择的日期),日期格式为 YYYY-MM-DD。"
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
msgstr "指定结束日期以过滤膳食计划(包含选择的日期),日期格式为 YYYY-MM-DD。"
#: .\cookbook\views\api.py:744
#, fuzzy
#| msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
msgstr "食谱中的步骤ID。 对于多个重复参数。"
msgstr "指定 MealType ID 以过滤膳食计划,重复参数以选择多个对象。"
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
@@ -2341,17 +2335,13 @@ msgid ""
msgstr "返回主键为 id 的购物清单条目。 允许多个值。"
#: .\cookbook\views\api.py:1125
#, fuzzy
#| msgid ""
#| "Filter shopping list entries on checked. [true, false, both, <b>recent</"
#| "b>]<br> - recent includes unchecked items and recently completed items."
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently "
"completed items."
msgstr ""
"在选中时筛选购物清单列表。 [真, 假, 两者都有, <b>最近</b>]<br> - 最近包括未"
"选中的项目和最近完成的项目。"
"勾选并筛选购物清单列表。 [真, 假, 两者都有, <b>最近</b>]"
"<br> - 最近包括未选中的项目和最近完成的项目。"
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
@@ -2359,17 +2349,13 @@ msgstr "返回按超市分类排序的购物清单列表。"
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr ""
msgstr "筛选包含所选食谱的对象"
#: .\cookbook\views\api.py:1292
#, fuzzy
#| msgid ""
#| "Returns the shopping list entry with a primary key of id. Multiple "
#| "values allowed."
msgid ""
"Return the Automations matching the automation type. Multiple values "
"allowed."
msgstr "返回主键为 id 的购物清单条目。 允许多个值。"
msgstr "返回与自动化类型相匹配的自动化条目。 允许多个值。"
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
@@ -2393,7 +2379,7 @@ msgstr "找不到可用的数据。"
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr ""
msgstr "文件大小超出空间限值"
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
@@ -2403,7 +2389,7 @@ msgstr "此提供程序未实现导入"
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr "此功能在泥炉的托管版本中尚不可用!"
msgstr "此功能在 Tandoor 的托管版本中尚不可用!"
#: .\cookbook\views\api.py:1671
msgid "Sync successful!"
@@ -2434,10 +2420,8 @@ msgid ""
msgstr "无法删除此存储后端,因为它至少在一台显示器中使用。"
#: .\cookbook\views\delete.py:135
#, fuzzy
#| msgid "Storage Backend"
msgid "Connectors Config Backend"
msgstr "存储后端"
msgstr "连接器后端配置"
#: .\cookbook\views\delete.py:157
msgid "Invite Link"
@@ -2460,14 +2444,12 @@ msgid "There was an error updating this storage backend!"
msgstr "更新此存储后端时出错!"
#: .\cookbook\views\edit.py:134
#, fuzzy
#| msgid "Changes saved!"
msgid "Config saved!"
msgstr "更改已保存!"
msgstr "配置已保存!"
#: .\cookbook\views\edit.py:142
msgid "ConnectorConfig"
msgstr ""
msgstr "连接器配置"
#: .\cookbook\views\edit.py:198
msgid "Changes saved!"
@@ -2496,10 +2478,8 @@ msgid "Shopping List"
msgstr "采购单"
#: .\cookbook\views\lists.py:77 .\cookbook\views\new.py:98
#, fuzzy
#| msgid "Storage Backend"
msgid "Connector Config Backend"
msgstr "存储后端"
msgstr "连接器后端配置"
#: .\cookbook\views\lists.py:91
msgid "Invite Links"
@@ -2523,13 +2503,11 @@ msgstr "步骤"
#: .\cookbook\views\lists.py:270
msgid "Property Types"
msgstr ""
msgstr "属性类型"
#: .\cookbook\views\new.py:86
#, fuzzy
#| msgid "This feature is not available in the demo version!"
msgid "This feature is not enabled by the server admin!"
msgstr "此功能在演示版本中不可用!"
msgstr "此功能被服务器管理员禁用!"
#: .\cookbook\views\new.py:123
msgid "Imported new recipe!"
@@ -2545,11 +2523,9 @@ msgid "This feature is not available in the demo version!"
msgstr "此功能在演示版本中不可用!"
#: .\cookbook\views\views.py:74
#, fuzzy
#| msgid "You have reached the maximum number of recipes for your space."
msgid ""
"You have the reached the maximum amount of spaces that can be owned by you."
msgstr "你已经达到了空间的菜谱的最大数量。"
msgstr "你拥有的空间数量已经达到上限。"
#: .\cookbook\views\views.py:89
msgid ""
@@ -2582,48 +2558,32 @@ msgstr "模糊搜索与此搜索方法不兼容!"
#: .\cookbook\views\views.py:306
#, python-format
msgid "PostgreSQL %(v)s is deprecated. Upgrade to a fully supported version!"
msgstr ""
msgstr "PostgreSQL %(v)s 版本过时。请升级到支持的版本!"
#: .\cookbook\views\views.py:309
#, python-format
msgid "You are running PostgreSQL %(v1)s. PostgreSQL %(v2)s is recommended"
msgstr ""
msgstr "您运行的 PostgreSQL 版本是 %(v1)s。推荐版本为 PostgreSQL %(v2)s"
#: .\cookbook\views\views.py:313
msgid "Unable to determine PostgreSQL version."
msgstr ""
msgstr "无法确认 PostgreSQL 版本。"
#: .\cookbook\views\views.py:317
#, fuzzy
#| msgid ""
#| "\n"
#| " This application is not running with a Postgres database "
#| "backend. This is ok but not recommended as some\n"
#| " features only work with postgres databases.\n"
#| " "
msgid ""
"This application is not running with a Postgres database backend. This is ok "
"but not recommended as some features only work with postgres databases."
msgstr ""
"\n"
" 此应用程序未使用 PostgreSQL 数据库在后端运行。 这并没有关系,但这"
"是不推荐的,\n"
" 因为有些功能仅适用于 PostgreSQL 数据库。\n"
" "
msgstr "此应用未使用 PostgreSQL 数据库作为后端。 这是可运行的配置,但不推荐,"
"因为部分功能仅在 PostgreSQL 数据库下可用。"
#: .\cookbook\views\views.py:360
#, fuzzy
#| msgid ""
#| "The setup page can only be used to create the first user! If you have "
#| "forgotten your superuser credentials please consult the django "
#| "documentation on how to reset passwords."
msgid ""
"The setup page can only be used to create the first "
"user! If you have forgotten your superuser credentials "
"please consult the django documentation on how to reset passwords."
msgstr ""
"设置页面只能用于创建第一个用户!如果您忘记了超级用户凭据,请参阅 Django 文"
"档,了解如何重置密码。"
"设置页面只能用于创建第一个用户! "
"如果您忘记了超级用户凭据,请参阅 Django 文档,了解如何重置密码。"
#: .\cookbook\views\views.py:369
msgid "Passwords dont match!"
@@ -2659,27 +2619,23 @@ msgstr "菜谱共享链接已被禁用!有关更多信息,请与页面管理
#: .\cookbook\views\views.py:451
msgid "Manage recipes, shopping list, meal plans and more."
msgstr ""
msgstr "管理菜谱、购物清单、膳食计划等。"
#: .\cookbook\views\views.py:458
#, fuzzy
#| msgid "Meal-Plan"
msgid "Plan"
msgstr "膳食计划"
msgstr "计划"
#: .\cookbook\views\views.py:458
msgid "View your meal Plan"
msgstr ""
msgstr "查看您的膳食计划"
#: .\cookbook\views\views.py:459
msgid "View your cookbooks"
msgstr ""
msgstr "查看你的烹饪手册"
#: .\cookbook\views\views.py:460
#, fuzzy
#| msgid "New Shopping List"
msgid "View your shopping lists"
msgstr "购物清单"
msgstr "查看你的购物清单"
#~ msgid "Default unit"
#~ msgstr "默认单位"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.15 on 2024-09-15 10:30
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0218_alter_mealplan_from_date_alter_mealplan_to_date'),
]
operations = [
migrations.AddField(
model_name='connectorconfig',
name='supports_description_field',
field=models.BooleanField(default=True, help_text='Does the todo entity support the description field'),
),
]

View File

@@ -0,0 +1,24 @@
# Generated by Django 4.2.18 on 2025-03-14 10:50
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('cookbook', '0219_connectorconfig_supports_description_field'),
]
operations = [
migrations.AddField(
model_name='shoppinglistrecipe',
name='created_by',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='shoppinglistrecipe',
name='space',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='cookbook.space'),
),
]

View File

@@ -0,0 +1,42 @@
# Generated by Django 4.2.18 on 2025-03-14 10:50
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
from django.db.models import F, Count
from django_scopes import scopes_disabled
def add_space_and_owner_to_shopping_list_recipe(apps, schema_editor):
print('migrating shopping list recipe space attribute, this might take a while ...')
with scopes_disabled():
ShoppingListRecipe = apps.get_model('cookbook', 'ShoppingListRecipe')
# delete all shopping list recipes that do not have entries as those are of no use anyway
ShoppingListRecipe.objects.annotate(entry_count=Count('entries')).filter(entry_count__lte=0).delete()
shopping_list_recipes = ShoppingListRecipe.objects.all().prefetch_related('entries')
update_list = []
for slr in shopping_list_recipes:
if entry := slr.entries.first():
if entry.space and entry.created_by:
slr.space = entry.space
slr.created_by = entry.created_by
update_list.append(slr)
else:
print(slr, 'missing data on entry')
else:
print(slr, 'missing entry')
ShoppingListRecipe.objects.bulk_update(update_list, ['space', 'created_by'], batch_size=500)
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0220_shoppinglistrecipe_created_by_and_more'),
]
operations = [
migrations.RunPython(add_space_and_owner_to_shopping_list_recipe),
]

View File

@@ -0,0 +1,26 @@
# Generated by Django 4.2.18 on 2025-03-14 12:41
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('cookbook', '0221_migrate_shoppinglistrecipe_space_created_by'),
]
operations = [
migrations.AlterField(
model_name='shoppinglistrecipe',
name='created_by',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
migrations.AlterField(
model_name='shoppinglistrecipe',
name='space',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cookbook.space'),
),
]

View File

@@ -0,0 +1,34 @@
# Generated by Django 4.2.22 on 2025-08-31 09:11
from django.db import migrations
from django_scopes import scopes_disabled
def migrate_comments(apps, schema_editor):
with scopes_disabled():
Comment = apps.get_model('cookbook', 'Comment')
CookLog = apps.get_model('cookbook', 'CookLog')
cook_logs = []
for c in Comment.objects.all():
cook_logs.append(CookLog(
recipe=c.recipe,
created_by=c.created_by,
created_at=c.created_at,
comment=c.text,
space=c.recipe.space,
))
CookLog.objects.bulk_create(cook_logs, unique_fields=('recipe', 'comment', 'created_at', 'created_by'))
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0222_alter_shoppinglistrecipe_created_by_and_more'),
]
operations = [
migrations.RunPython(migrate_comments),
]

View File

@@ -0,0 +1,60 @@
# Generated by Django 4.2.22 on 2025-09-05 06:51
import cookbook.models
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('cookbook', '0223_auto_20250831_1111'),
]
operations = [
migrations.AddField(
model_name='space',
name='ai_credits_balance',
field=models.IntegerField(default=0),
),
migrations.AddField(
model_name='space',
name='ai_credits_monthly',
field=models.IntegerField(default=100),
),
migrations.CreateModel(
name='AiProvider',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=128)),
('description', models.TextField(blank=True)),
('api_key', models.CharField(max_length=2048)),
('model_name', models.CharField(max_length=256)),
('url', models.CharField(blank=True, max_length=2048, null=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('space', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='cookbook.space')),
],
),
migrations.CreateModel(
name='AiLog',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('function', models.CharField(max_length=64)),
('credit_cost', models.DecimalField(decimal_places=4, max_digits=16)),
('credits_from_balance', models.BooleanField(default=False)),
('input_tokens', models.IntegerField(default=0)),
('output_tokens', models.IntegerField(default=0)),
('start_time', models.DateTimeField(null=True)),
('end_time', models.DateTimeField(null=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('ai_provider', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='cookbook.aiprovider')),
('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
('space', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cookbook.space')),
],
bases=(models.Model, cookbook.models.PermissionModelMixin),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.22 on 2025-09-08 19:21
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0224_space_ai_credits_balance_space_ai_credits_monthly_and_more'),
]
operations = [
migrations.AddField(
model_name='space',
name='ai_enabled',
field=models.BooleanField(default=True),
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 4.2.22 on 2025-09-08 20:00
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0225_space_ai_enabled'),
]
operations = [
migrations.AddField(
model_name='aiprovider',
name='log_credit_cost',
field=models.BooleanField(default=True),
),
migrations.AlterField(
model_name='space',
name='ai_credits_monthly',
field=models.IntegerField(default=10000),
),
]

View File

@@ -0,0 +1,24 @@
# Generated by Django 4.2.22 on 2025-09-09 11:40
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0226_aiprovider_log_credit_cost_and_more'),
]
operations = [
migrations.AddField(
model_name='space',
name='ai_default_provider',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='space_ai_default_provider', to='cookbook.aiprovider'),
),
migrations.AlterField(
model_name='space',
name='ai_credits_balance',
field=models.DecimalField(decimal_places=4, default=0, max_digits=16),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.2.6 on 2025-09-10 20:11
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0001_squashed_0227_space_ai_default_provider_and_more'),
]
operations = [
migrations.AddField(
model_name='space',
name='space_setup_completed',
field=models.BooleanField(default=True),
),
]

View File

@@ -126,7 +126,7 @@ class TreeModel(MP_Node):
return None
@property
def full_name(self):
def full_name(self) -> str:
"""
Returns a string representation of a tree node and it's ancestors,
e.g. 'Cuisine > Asian > Chinese > Catonese'.
@@ -329,6 +329,13 @@ class Space(ExportModelOperationsMixin('space'), models.Model):
demo = models.BooleanField(default=False)
food_inherit = models.ManyToManyField(FoodInheritField, blank=True)
space_setup_completed = models.BooleanField(default=True)
ai_enabled = models.BooleanField(default=True)
ai_credits_monthly = models.IntegerField(default=100)
ai_credits_balance = models.DecimalField(default=0, max_digits=16, decimal_places=4)
ai_default_provider = models.ForeignKey("AiProvider", on_delete=models.SET_NULL, null=True, blank=True, related_name='space_ai_default_provider')
internal_note = models.TextField(blank=True, null=True)
def safe_delete(self):
@@ -341,6 +348,9 @@ class Space(ExportModelOperationsMixin('space'), models.Model):
BookmarkletImport.objects.filter(space=self).delete()
CustomFilter.objects.filter(space=self).delete()
AiLog.objects.filter(space=self).delete()
AiProvider.objects.filter(space=self).delete()
Property.objects.filter(space=self).delete()
PropertyType.objects.filter(space=self).delete()
@@ -393,6 +403,41 @@ class Space(ExportModelOperationsMixin('space'), models.Model):
return self.name
class AiProvider(models.Model):
name = models.CharField(max_length=128)
description = models.TextField(blank=True)
# AiProviders can be global, so space=null is allowed (configurable by superusers)
space = models.ForeignKey(Space, on_delete=models.CASCADE, null=True)
api_key = models.CharField(max_length=2048)
model_name = models.CharField(max_length=256)
url = models.CharField(max_length=2048, blank=True, null=True)
log_credit_cost = models.BooleanField(default=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class AiLog(models.Model, PermissionModelMixin):
F_FILE_IMPORT = 'FILE_IMPORT'
ai_provider = models.ForeignKey(AiProvider, on_delete=models.SET_NULL, null=True)
function = models.CharField(max_length=64)
credit_cost = models.DecimalField(max_digits=16, decimal_places=4)
# if credits from balance were used, else its from monthly quota
credits_from_balance = models.BooleanField(default=False)
input_tokens = models.IntegerField(default=0)
output_tokens = models.IntegerField(default=0)
start_time = models.DateTimeField(null=True)
end_time = models.DateTimeField(null=True)
space = models.ForeignKey(Space, on_delete=models.CASCADE)
created_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class ConnectorConfig(models.Model, PermissionModelMixin):
HOMEASSISTANT = 'HomeAssistant'
CONNECTER_TYPE = ((HOMEASSISTANT, 'HomeAssistant'),)
@@ -406,6 +451,7 @@ class ConnectorConfig(models.Model, PermissionModelMixin):
on_shopping_list_entry_created_enabled = models.BooleanField(default=False)
on_shopping_list_entry_updated_enabled = models.BooleanField(default=False)
on_shopping_list_entry_deleted_enabled = models.BooleanField(default=False)
supports_description_field = models.BooleanField(default=True, help_text="Does the todo entity support the description field")
url = models.URLField(blank=True, null=True)
token = models.CharField(max_length=512, blank=True, null=True)
@@ -911,12 +957,19 @@ class PropertyType(models.Model, PermissionModelMixin, MergeModelMixin):
GOAL = 'GOAL'
OTHER = 'OTHER'
CHOICES = (
(NUTRITION, _('Nutrition')),
(ALLERGEN, _('Allergen')),
(PRICE, _('Price')),
(GOAL, _('Goal')),
(OTHER, _('Other')),
)
name = models.CharField(max_length=128)
unit = models.CharField(max_length=64, blank=True, null=True)
order = models.IntegerField(default=0)
description = models.CharField(max_length=512, blank=True, null=True)
category = models.CharField(max_length=64, choices=((NUTRITION, _('Nutrition')), (ALLERGEN, _('Allergen')),
(PRICE, _('Price')), (GOAL, _('Goal')), (OTHER, _('Other'))), null=True, blank=True)
category = models.CharField(max_length=64, choices=CHOICES, null=True, blank=True)
open_data_slug = models.CharField(max_length=128, null=True, blank=True, default=None)
fdc_id = models.IntegerField(null=True, default=None, blank=True)
@@ -1086,6 +1139,19 @@ class RecipeImport(models.Model, PermissionModelMixin):
def __str__(self):
return self.name
def convert_to_recipe(self, user):
recipe = Recipe(
name=self.name,
file_path=self.file_path,
storage=self.storage,
file_uid=self.file_uid,
created_by=user,
space=self.space
)
recipe.save()
self.delete()
return recipe
class RecipeBook(ExportModelOperationsMixin('book'), models.Model, PermissionModelMixin):
name = models.CharField(max_length=128)
@@ -1178,31 +1244,18 @@ class MealPlan(ExportModelOperationsMixin('meal_plan'), models.Model, Permission
class ShoppingListRecipe(ExportModelOperationsMixin('shopping_list_recipe'), models.Model, PermissionModelMixin):
name = models.CharField(max_length=32, blank=True, default='')
recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE, null=True, blank=True) # TODO make required after old shoppinglist deprecated
servings = models.DecimalField(default=1, max_digits=8, decimal_places=4)
recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE, null=True, blank=True)
mealplan = models.ForeignKey(MealPlan, on_delete=models.CASCADE, null=True, blank=True)
objects = ScopedManager(space='recipe__space')
created_by = models.ForeignKey(User, on_delete=models.CASCADE)
space = models.ForeignKey(Space, on_delete=models.CASCADE)
@staticmethod
def get_space_key():
return 'recipe', 'space'
def get_space(self):
return self.recipe.space
objects = ScopedManager(space='space')
def __str__(self):
return f'Shopping list recipe {self.id} - {self.recipe}'
def get_owner(self):
try:
if not self.entries.exists():
return 'orphan'
else:
return getattr(self.entries.first(), 'created_by', None)
except AttributeError:
return None
class ShoppingListEntry(ExportModelOperationsMixin('shopping_list_entry'), models.Model, PermissionModelMixin):
list_recipe = models.ForeignKey(ShoppingListRecipe, on_delete=models.CASCADE, null=True, blank=True, related_name='entries')
@@ -1462,19 +1515,21 @@ class Automation(ExportModelOperationsMixin('automations'), models.Model, Permis
UNIT_REPLACE = 'UNIT_REPLACE'
NAME_REPLACE = 'NAME_REPLACE'
automation_types = (
(FOOD_ALIAS, _('Food Alias')),
(UNIT_ALIAS, _('Unit Alias')),
(KEYWORD_ALIAS, _('Keyword Alias')),
(DESCRIPTION_REPLACE, _('Description Replace')),
(INSTRUCTION_REPLACE, _('Instruction Replace')),
(NEVER_UNIT, _('Never Unit')),
(TRANSPOSE_WORDS, _('Transpose Words')),
(FOOD_REPLACE, _('Food Replace')),
(UNIT_REPLACE, _('Unit Replace')),
(NAME_REPLACE, _('Name Replace')),
)
type = models.CharField(max_length=128,
choices=(
(FOOD_ALIAS, _('Food Alias')),
(UNIT_ALIAS, _('Unit Alias')),
(KEYWORD_ALIAS, _('Keyword Alias')),
(DESCRIPTION_REPLACE, _('Description Replace')),
(INSTRUCTION_REPLACE, _('Instruction Replace')),
(NEVER_UNIT, _('Never Unit')),
(TRANSPOSE_WORDS, _('Transpose Words')),
(FOOD_REPLACE, _('Food Replace')),
(UNIT_REPLACE, _('Unit Replace')),
(NAME_REPLACE, _('Name Replace')),
))
choices=automation_types)
name = models.CharField(max_length=128, default='')
description = models.TextField(blank=True, null=True)

View File

@@ -31,7 +31,7 @@ class Dropbox(Provider):
except ValueError:
log_entry = SyncLog(status='ERROR', msg=str(r), sync=monitor)
log_entry.save()
return r
return log_entry
import_count = 0
# TODO check if has_more is set and import that as well
@@ -59,7 +59,7 @@ class Dropbox(Provider):
monitor.last_checked = datetime.now()
monitor.save()
return True
return log_entry
@staticmethod
def create_share_link(recipe):

View File

@@ -12,21 +12,25 @@ class Local(Provider):
@staticmethod
def import_all(monitor):
if '/etc/' in monitor.path or '/root/' in monitor.path or '/mediafiles/' in monitor.path or '/usr/' in monitor.path:
return False
files = [f for f in listdir(monitor.path) if isfile(join(monitor.path, f))]
import_count = 0
for file in files:
path = monitor.path + '/' + file
if not Recipe.objects.filter(file_path__iexact=path, space=monitor.space).exists() and not RecipeImport.objects.filter(file_path=path, space=monitor.space).exists():
name = os.path.splitext(file)[0]
new_recipe = RecipeImport(
name=name,
file_path=path,
storage=monitor.storage,
space=monitor.space,
)
new_recipe.save()
import_count += 1
if file.endswith('.pdf') or file.endswith('.png') or file.endswith('.jpg') or file.endswith('.jpeg') or file.endswith('.gif'):
path = monitor.path + '/' + file
if not Recipe.objects.filter(file_path__iexact=path, space=monitor.space).exists() and not RecipeImport.objects.filter(file_path=path, space=monitor.space).exists():
name = os.path.splitext(file)[0]
new_recipe = RecipeImport(
name=name,
file_path=path,
storage=monitor.storage,
space=monitor.space,
)
new_recipe.save()
import_count += 1
log_entry = SyncLog(
status='SUCCESS',
@@ -38,7 +42,7 @@ class Local(Provider):
monitor.last_checked = datetime.now()
monitor.save()
return True
return log_entry
@staticmethod
def get_file(recipe):

View File

@@ -66,7 +66,7 @@ class Nextcloud(Provider):
monitor.last_checked = datetime.now()
monitor.save()
return True
return log_entry
@staticmethod
def create_share_link(recipe):

View File

@@ -1,69 +0,0 @@
from rest_framework.schemas.openapi import AutoSchema
from rest_framework.schemas.utils import is_list_view
class QueryParam(object):
def __init__(self, name, description=None, qtype='string', required=False):
self.name = name
self.description = description
self.qtype = qtype
self.required = required
def __str__(self):
return f'{self.name}, {self.qtype}, {self.description}'
class QueryParamAutoSchema(AutoSchema):
def get_path_parameters(self, path, method):
if not is_list_view(path, method, self.view):
return super().get_path_parameters(path, method)
parameters = super().get_path_parameters(path, method)
for q in self.view.query_params:
parameters.append({
"name": q.name, "in": "query", "required": q.required,
"description": q.description,
'schema': {'type': q.qtype, },
})
return parameters
class TreeSchema(AutoSchema):
def get_path_parameters(self, path, method):
if not is_list_view(path, method, self.view):
return super(TreeSchema, self).get_path_parameters(path, method)
api_name = path.split('/')[2]
parameters = super().get_path_parameters(path, method)
parameters.append({
"name": 'query', "in": "query", "required": False,
"description": 'Query string matched against {} name.'.format(api_name),
'schema': {'type': 'string', },
})
parameters.append({
"name": 'root', "in": "query", "required": False,
"description": 'Return first level children of {obj} with ID [int]. Integer 0 will return root {obj}s.'.format(
obj=api_name),
'schema': {'type': 'integer', },
})
parameters.append({
"name": 'tree', "in": "query", "required": False,
"description": 'Return all self and children of {} with ID [int].'.format(api_name),
'schema': {'type': 'integer', },
})
return parameters
class FilterSchema(AutoSchema):
def get_path_parameters(self, path, method):
if not is_list_view(path, method, self.view):
return super(FilterSchema, self).get_path_parameters(path, method)
api_name = path.split('/')[2]
parameters = super().get_path_parameters(path, method)
parameters.append({
"name": 'query', "in": "query", "required": False,
"description": 'Query string matched against {} name.'.format(api_name),
'schema': {'type': 'string', },
})
return parameters

File diff suppressed because it is too large Load Diff

View File

@@ -120,37 +120,6 @@ def update_food_inheritance(sender, instance=None, created=False, **kwargs):
child.save()
@receiver(post_save, sender=MealPlan)
def auto_add_shopping(sender, instance=None, created=False, weak=False, **kwargs):
print("MEAL_AUTO_ADD Signal trying to auto add to shopping")
if not instance:
print("MEAL_AUTO_ADD Instance is none")
return
try:
space = instance.get_space()
user = instance.get_owner()
with scope(space=space):
slr_exists = instance.shoppinglistrecipe_set.exists()
if not created and slr_exists:
for x in instance.shoppinglistrecipe_set.all():
# assuming that permissions checks for the MealPlan have happened upstream
if instance.servings != x.servings:
SLR = RecipeShoppingEditor(id=x.id, user=user, space=instance.space)
SLR.edit_servings(servings=instance.servings)
elif not user.userpreference.mealplan_autoadd_shopping or not instance.recipe:
print("MEAL_AUTO_ADD No recipe or no setting")
return
if created:
SLR = RecipeShoppingEditor(user=user, space=space)
SLR.create(mealplan=instance, servings=instance.servings)
print("MEAL_AUTO_ADD Created SLR")
except AttributeError:
pass
@receiver(post_save, sender=Unit)
def clear_unit_cache(sender, instance=None, created=False, **kwargs):
if instance:

View File

@@ -0,0 +1,87 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 26.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1"
id="svg48" inkscape:export-xdpi="48" inkscape:export-ydpi="48" sodipodi:docname="logo_color_shopping.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:serif="http://www.serif.com/" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 558.1 558.1"
style="enable-background:new 0 0 558.1 558.1;" xml:space="preserve">
<style type="text/css">
.st0{fill-rule:evenodd;clip-rule:evenodd;fill:url(#ellipse2_00000062882008473870802360000001235346600214014370_);}
.st1{clip-path:url(#SVGID_00000040562990235419179500000014537515251997333940_);}
.st2{fill-rule:evenodd;clip-rule:evenodd;fill:#161616;}
.st3{fill-rule:evenodd;clip-rule:evenodd;fill:#FFCB76;}
.st4{fill-rule:evenodd;clip-rule:evenodd;fill:#FF6F00;}
.st5{clip-path:url(#SVGID_00000026884998257896383920000012290328997039565247_);}
.st6{fill-rule:evenodd;clip-rule:evenodd;fill:#FFD100;}
.st7{fill:#161616;}
</style>
<sodipodi:namedview bordercolor="#666666" borderopacity="1" gridtolerance="10" guidetolerance="10" id="namedview50" inkscape:current-layer="svg48" inkscape:cx="256" inkscape:cy="256" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-height="1377" inkscape:window-maximized="1" inkscape:window-width="2560" inkscape:window-x="2552" inkscape:window-y="-8" inkscape:zoom="2.0039062" objecttolerance="10" pagecolor="#ffffff" showgrid="false">
</sodipodi:namedview>
<g id="Kreis" transform="matrix(0.92371046,0,0,0.95776263,3.7134303,-54.329713)">
<linearGradient id="ellipse2_00000072976586691886204630000005673338158137684613_" gradientUnits="userSpaceOnUse" x1="-24.1585" y1="348.0664" x2="-23.1585" y2="348.0664" gradientTransform="matrix(2.147900e-06 0 0 -2.227081e-06 4347.1548 66.3621)">
<stop offset="0" style="stop-color:#272727"/>
<stop offset="1" style="stop-color:#6C6C6C"/>
</linearGradient>
<ellipse id="ellipse2" style="fill-rule:evenodd;clip-rule:evenodd;fill:url(#ellipse2_00000072976586691886204630000005673338158137684613_);" cx="298.1" cy="348.1" rx="302.1" ry="291.3"/>
<g>
<defs>
<circle id="SVGID_1_" cx="298.1" cy="348.1" r="279"/>
</defs>
<clipPath id="SVGID_00000080899089203538361760000014164288875061347472_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g id="g18" style="clip-path:url(#SVGID_00000080899089203538361760000014164288875061347472_);">
<g id="Shadow" transform="matrix(1.10322,0,0,1.064,-5.58287,50.5786)">
<path id="path7" class="st2" d="M163.2,477.5l271.2,271.2L759.1,557L416.4,214.2L163.2,477.5z"/>
<g id="g11" transform="translate(-4.22105,0.775864)">
<path id="path9" class="st2" d="M223.4,188.6L545.8,511l121-106.1L326,64.1l-3.2,78.4L223.4,188.6z"/>
</g>
<g id="g15" transform="translate(-85.3876,27.8512)">
<path id="path13" class="st2" d="M328.5,154.7l322.4,322.4l3.1-71.6L313.3,64.7l-3.6,82.2L328.5,154.7z"/>
</g>
</g>
</g>
</g>
</g>
<g id="g23" transform="matrix(0.93750213,0,0,0.93750213,15.953517,15.99888)">
<path id="path21" class="st3" d="M280.6,238.7c35.1,0,65.8-14.8,85.3-30.1c19.7-15.6,48.3-12.5,64.2,6.9
c26.2,31.7,41.8,71.9,41.8,115.6c0,71.6-44.2,159.9-105.6,190.9c-26.4,13.3-53.8,19.6-85.6,19.6l0,0h-0.1h-0.1l0,0
c-31.8,0-59.2-6.3-85.6-19.6C133.5,491.1,89.3,402.7,89.3,331.2c0-43.7,15.7-83.9,41.8-115.6c15.9-19.4,44.5-22.5,64.2-6.9
C214.8,224,245.5,238.7,280.6,238.7L280.6,238.7z"/>
</g>
<g id="Flame-2" transform="matrix(0.61547875,0,0,0.56833279,-138.25728,-438.60298)" serif:id="Flame 2">
<path id="path25" class="st4" d="M636,823.4c-2.8-4-2.8-9.6-0.1-13.7c2.8-4.1,7.7-5.6,12.1-3.9c22.2,8.9,51.2,22.5,73.8,40.9
c46.9,38.3,59.7,63.9,70.2,90.3c12.4,31.2,14.2,63.5,11.6,86c-7.6,64.6-56,117.9-125,117.9c-69,0-123.9-52.8-125-117.9
c-0.7-39.2,12.1-70.5,26.1-92.8c3.5-5.6,10-7.8,15.8-5.6c5.8,2.3,9.5,8.6,8.8,15.3c-2,14.1-3.3,28.8-2.7,40.6
c2.2,39.8,25.9,50,50.2,49.8c25.9-0.2,52.1-22.2,42.7-78.4C686.3,902.9,656.8,853.5,636,823.4L636,823.4z"/>
<g>
<defs>
<path id="SVGID_00000067227953264718972400000007310393595166440114_" d="M636,823.4c-2.8-4-2.8-9.6-0.1-13.7
c2.8-4.1,7.7-5.6,12.1-3.9c22.2,8.9,51.2,22.5,73.8,40.9c46.9,38.3,59.7,63.9,70.2,90.3c12.4,31.2,14.2,63.5,11.6,86
c-7.6,64.6-56,117.9-125,117.9c-69,0-123.9-52.8-125-117.9c-0.7-39.2,12.1-70.5,26.1-92.8c3.5-5.6,10-7.8,15.8-5.6
c5.8,2.3,9.5,8.6,8.8,15.3c-2,14.1-3.3,28.8-2.7,40.6c2.2,39.8,25.9,50,50.2,49.8c25.9-0.2,52.1-22.2,42.7-78.4
C686.3,902.9,656.8,853.5,636,823.4L636,823.4z"/>
</defs>
<clipPath id="SVGID_00000178886517717031376290000002615817110574070691_">
<use xlink:href="#SVGID_00000067227953264718972400000007310393595166440114_" style="overflow:visible;"/>
</clipPath>
<g id="g34" style="clip-path:url(#SVGID_00000178886517717031376290000002615817110574070691_);">
<g id="g32" transform="matrix(1.28784,-0.270602,0.285942,1.59598,247.349,825.209)">
<path id="path30" class="st6" d="M279.8,36.7c28.5,13.5,59.3,44.8,67.8,85.1c14.1,67-25.3,85.6-59.1,84
c-54.2-2.6-72.4-45.5-36.2-97.1C274.8,76.8,253.9,24.5,279.8,36.7z"/>
</g>
</g>
</g>
</g>
<path class="st7" d="M245.7,280.1c6.2,0,11.1,5,11.1,11.1v11.1h44.5v-11.1c0-6.2,5-11.1,11.1-11.1s11.1,5,11.1,11.1v11.1h16.7
c9.2,0,16.7,7.5,16.7,16.7v16.7H201.2V319c0-9.2,7.5-16.7,16.7-16.7h16.7v-11.1C234.5,285,239.5,280.1,245.7,280.1z M201.2,346.8
h155.8v94.6c0,9.2-7.5,16.7-16.7,16.7H217.8c-9.2,0-16.7-7.5-16.7-16.7V346.8z M223.4,374.6v11.1c0,3.1,2.5,5.6,5.6,5.6h11.1
c3.1,0,5.6-2.5,5.6-5.6v-11.1c0-3.1-2.5-5.6-5.6-5.6H229C225.9,369.1,223.4,371.6,223.4,374.6z M267.9,374.6v11.1
c0,3.1,2.5,5.6,5.6,5.6h11.1c3.1,0,5.6-2.5,5.6-5.6v-11.1c0-3.1-2.5-5.6-5.6-5.6h-11.1C270.4,369.1,267.9,371.6,267.9,374.6z
M318,369.1c-3.1,0-5.6,2.5-5.6,5.6v11.1c0,3.1,2.5,5.6,5.6,5.6h11.1c3.1,0,5.6-2.5,5.6-5.6v-11.1c0-3.1-2.5-5.6-5.6-5.6H318z
M223.4,419.1v11.1c0,3.1,2.5,5.6,5.6,5.6h11.1c3.1,0,5.6-2.5,5.6-5.6v-11.1c0-3.1-2.5-5.6-5.6-5.6H229
C225.9,413.6,223.4,416.1,223.4,419.1z M273.5,413.6c-3.1,0-5.6,2.5-5.6,5.6v11.1c0,3.1,2.5,5.6,5.6,5.6h11.1c3.1,0,5.6-2.5,5.6-5.6
v-11.1c0-3.1-2.5-5.6-5.6-5.6H273.5z M312.4,419.1v11.1c0,3.1,2.5,5.6,5.6,5.6h11.1c3.1,0,5.6-2.5,5.6-5.6v-11.1
c0-3.1-2.5-5.6-5.6-5.6H318C314.9,413.6,312.4,416.1,312.4,419.1z"/>
</svg>

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -0,0 +1,83 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 26.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1"
id="svg48" inkscape:export-xdpi="48" inkscape:export-ydpi="48" sodipodi:docname="logo_color_shopping.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:serif="http://www.serif.com/" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 558.1 558.1"
style="enable-background:new 0 0 558.1 558.1;" xml:space="preserve">
<style type="text/css">
.st0{fill-rule:evenodd;clip-rule:evenodd;fill:url(#ellipse2_00000123406314579419878720000015292012387505797789_);}
.st1{clip-path:url(#SVGID_00000069378195777491616980000011609770225407185072_);}
.st2{fill-rule:evenodd;clip-rule:evenodd;fill:#161616;}
.st3{fill-rule:evenodd;clip-rule:evenodd;fill:#FFCB76;}
.st4{fill-rule:evenodd;clip-rule:evenodd;fill:#FF6F00;}
.st5{clip-path:url(#SVGID_00000129168706913539839680000006972943119257724314_);}
.st6{fill-rule:evenodd;clip-rule:evenodd;fill:#FFD100;}
</style>
<sodipodi:namedview bordercolor="#666666" borderopacity="1" gridtolerance="10" guidetolerance="10" id="namedview50" inkscape:current-layer="svg48" inkscape:cx="256" inkscape:cy="256" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-height="1377" inkscape:window-maximized="1" inkscape:window-width="2560" inkscape:window-x="2552" inkscape:window-y="-8" inkscape:zoom="2.0039062" objecttolerance="10" pagecolor="#ffffff" showgrid="false">
</sodipodi:namedview>
<g id="Kreis" transform="matrix(0.92371046,0,0,0.95776263,3.7134303,-54.329713)">
<linearGradient id="ellipse2_00000092432231847401152480000013557045245219773118_" gradientUnits="userSpaceOnUse" x1="-24.1585" y1="348.0664" x2="-23.1585" y2="348.0664" gradientTransform="matrix(2.147900e-06 0 0 -2.227081e-06 4347.1548 66.3621)">
<stop offset="0" style="stop-color:#272727"/>
<stop offset="1" style="stop-color:#6C6C6C"/>
</linearGradient>
<ellipse id="ellipse2" style="fill-rule:evenodd;clip-rule:evenodd;fill:url(#ellipse2_00000092432231847401152480000013557045245219773118_);" cx="298.1" cy="348.1" rx="302.1" ry="291.3"/>
<g>
<defs>
<circle id="SVGID_1_" cx="298.1" cy="348.1" r="279"/>
</defs>
<clipPath id="SVGID_00000078750348294658121660000005213362532985289101_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g id="g18" style="clip-path:url(#SVGID_00000078750348294658121660000005213362532985289101_);">
<g id="Shadow" transform="matrix(1.10322,0,0,1.064,-5.58287,50.5786)">
<path id="path7" class="st2" d="M163.2,477.5l271.2,271.2L759.1,557L416.4,214.2L163.2,477.5z"/>
<g id="g11" transform="translate(-4.22105,0.775864)">
<path id="path9" class="st2" d="M223.4,188.6L545.8,511l121-106.1L326,64.1l-3.2,78.4L223.4,188.6z"/>
</g>
<g id="g15" transform="translate(-85.3876,27.8512)">
<path id="path13" class="st2" d="M328.5,154.7l322.4,322.4l3.1-71.6L313.3,64.7l-3.6,82.2L328.5,154.7z"/>
</g>
</g>
</g>
</g>
</g>
<g id="g23" transform="matrix(0.93750213,0,0,0.93750213,15.953517,15.99888)">
<path id="path21" class="st3" d="M280.6,238.7c35.1,0,65.8-14.8,85.3-30.1c19.7-15.6,48.3-12.5,64.2,6.9
c26.2,31.7,41.8,71.9,41.8,115.6c0,71.6-44.2,159.9-105.6,190.9c-26.4,13.3-53.8,19.6-85.6,19.6l0,0h-0.1h-0.1l0,0
c-31.8,0-59.2-6.3-85.6-19.6C133.5,491.1,89.3,402.7,89.3,331.2c0-43.7,15.7-83.9,41.8-115.6c15.9-19.4,44.5-22.5,64.2-6.9
C214.8,224,245.5,238.7,280.6,238.7L280.6,238.7z"/>
</g>
<g id="Flame-2" transform="matrix(0.61547875,0,0,0.56833279,-138.25728,-438.60298)" serif:id="Flame 2">
<path id="path25" class="st4" d="M636,823.4c-2.8-4-2.8-9.6-0.1-13.7c2.8-4.1,7.7-5.6,12.1-3.9c22.2,8.9,51.2,22.5,73.8,40.9
c46.9,38.3,59.7,63.9,70.2,90.3c12.4,31.2,14.2,63.5,11.6,86c-7.6,64.6-56,117.9-125,117.9c-69,0-123.9-52.8-125-117.9
c-0.7-39.2,12.1-70.5,26.1-92.8c3.5-5.6,10-7.8,15.8-5.6c5.8,2.3,9.5,8.6,8.8,15.3c-2,14.1-3.3,28.8-2.7,40.6
c2.2,39.8,25.9,50,50.2,49.8c25.9-0.2,52.1-22.2,42.7-78.4C686.3,902.9,656.8,853.5,636,823.4L636,823.4z"/>
<g>
<defs>
<path id="SVGID_00000170974775404888027640000005842834300324528060_" d="M636,823.4c-2.8-4-2.8-9.6-0.1-13.7
c2.8-4.1,7.7-5.6,12.1-3.9c22.2,8.9,51.2,22.5,73.8,40.9c46.9,38.3,59.7,63.9,70.2,90.3c12.4,31.2,14.2,63.5,11.6,86
c-7.6,64.6-56,117.9-125,117.9c-69,0-123.9-52.8-125-117.9c-0.7-39.2,12.1-70.5,26.1-92.8c3.5-5.6,10-7.8,15.8-5.6
c5.8,2.3,9.5,8.6,8.8,15.3c-2,14.1-3.3,28.8-2.7,40.6c2.2,39.8,25.9,50,50.2,49.8c25.9-0.2,52.1-22.2,42.7-78.4
C686.3,902.9,656.8,853.5,636,823.4L636,823.4z"/>
</defs>
<clipPath id="SVGID_00000137101924108689735560000002063526552501109413_">
<use xlink:href="#SVGID_00000170974775404888027640000005842834300324528060_" style="overflow:visible;"/>
</clipPath>
<g id="g34" style="clip-path:url(#SVGID_00000137101924108689735560000002063526552501109413_);">
<g id="g32" transform="matrix(1.28784,-0.270602,0.285942,1.59598,247.349,825.209)">
<path id="path30" class="st6" d="M279.8,36.7c28.5,13.5,59.3,44.8,67.8,85.1c14.1,67-25.3,85.6-59.1,84
c-54.2-2.6-72.4-45.5-36.2-97.1C274.8,76.8,253.9,24.5,279.8,36.7z"/>
</g>
</g>
</g>
</g>
<path id="path958" class="st2" d="M182.4,290.6c0-4.5,3.6-8.1,8.1-8.1h15.4c7.4,0,14,4.3,17.1,10.8h139.1c8.9,0,15.4,8.5,13.1,17.1
l-13.9,51.5c-2.9,10.6-12.5,18-23.5,18h-97.6l1.8,9.6c0.7,3.8,4.1,6.6,8,6.6h97.6c4.5,0,8.1,3.6,8.1,8.1s-3.6,8.1-8.1,8.1H250
c-11.7,0-21.8-8.3-23.9-19.8L208.6,301c-0.2-1.3-1.4-2.2-2.7-2.2h-15.4C186,298.8,182.4,295.1,182.4,290.6L182.4,290.6z
M225.7,439.5c0-9,7.3-16.3,16.2-16.3c9,0,16.3,7.3,16.3,16.2c0,0,0,0,0,0c0,9-7.3,16.3-16.2,16.3
C233,455.8,225.7,448.5,225.7,439.5C225.7,439.6,225.7,439.5,225.7,439.5z M339.4,423.3c9,0,16.2,7.3,16.3,16.2
c0,9-7.3,16.2-16.2,16.3c0,0,0,0,0,0c-9,0-16.2-7.3-16.3-16.2C323.2,430.6,330.4,423.3,339.4,423.3
C339.4,423.3,339.4,423.3,339.4,423.3z"/>
</svg>

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

File diff suppressed because one or more lines are too long

View File

@@ -1,721 +0,0 @@
/*!
* Select2 Bootstrap Theme v0.1.0-beta.10 (https://select2.github.io/select2-bootstrap-theme)
* Copyright 2015-2017 Florian Kissling and contributors (https://github.com/select2/select2-bootstrap-theme/graphs/contributors)
* Licensed under MIT (https://github.com/select2/select2-bootstrap-theme/blob/master/LICENSE)
*/
.select2-container--bootstrap {
display: block;
/*------------------------------------* #COMMON STYLES
\*------------------------------------*/
/**
* Search field in the Select2 dropdown.
*/
/**
* No outline for all search fields - in the dropdown
* and inline in multi Select2s.
*/
/**
* Adjust Select2's choices hover and selected styles to match
* Bootstrap 3's default dropdown styles.
*
* @see http://getbootstrap.com/components/#dropdowns
*/
/**
* Clear the selection.
*/
/**
* Address disabled Select2 styles.
*
* @see https://select2.github.io/examples.html#disabled
* @see http://getbootstrap.com/css/#forms-control-disabled
*/
/*------------------------------------* #DROPDOWN
\*------------------------------------*/
/**
* Dropdown border color and box-shadow.
*/
/**
* Limit the dropdown height.
*/
/*------------------------------------* #SINGLE SELECT2
\*------------------------------------*/
/*------------------------------------* #MULTIPLE SELECT2
\*------------------------------------*/
/**
* Address Bootstrap control sizing classes
*
* 1. Reset Bootstrap defaults.
* 2. Adjust the dropdown arrow button icon position.
*
* @see http://getbootstrap.com/css/#forms-control-sizes
*/
/* 1 */
/*------------------------------------* #RTL SUPPORT
\*------------------------------------*/
}
.select2-container--bootstrap .select2-selection {
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
background-color: #fff;
border: 1px solid #ccc;
border-radius: 4px;
color: #555555;
font-size: 14px;
outline: 0;
}
.select2-container--bootstrap .select2-selection.form-control {
border-radius: 4px;
}
.select2-container--bootstrap .select2-search--dropdown .select2-search__field {
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
background-color: #fff;
border: 1px solid #ccc;
border-radius: 4px;
color: #555555;
font-size: 14px;
}
.select2-container--bootstrap .select2-search__field {
outline: 0;
/* Firefox 18- */
/**
* Firefox 19+
*
* @see http://stackoverflow.com/questions/24236240/color-for-styled-placeholder-text-is-muted-in-firefox
*/
}
.select2-container--bootstrap .select2-search__field::-webkit-input-placeholder {
color: #999;
}
.select2-container--bootstrap .select2-search__field:-moz-placeholder {
color: #999;
}
.select2-container--bootstrap .select2-search__field::-moz-placeholder {
color: #999;
opacity: 1;
}
.select2-container--bootstrap .select2-search__field:-ms-input-placeholder {
color: #999;
}
.select2-container--bootstrap .select2-results__option {
padding: 6px 12px;
/**
* Disabled results.
*
* @see https://select2.github.io/examples.html#disabled-results
*/
/**
* Hover state.
*/
/**
* Selected state.
*/
}
.select2-container--bootstrap .select2-results__option[role=group] {
padding: 0;
}
.select2-container--bootstrap .select2-results__option[aria-disabled=true] {
color: #777777;
cursor: not-allowed;
}
.select2-container--bootstrap .select2-results__option[aria-selected=true] {
background-color: #f5f5f5;
color: #262626;
}
.select2-container--bootstrap .select2-results__option--highlighted[aria-selected] {
background-color: #337ab7;
color: #fff;
}
.select2-container--bootstrap .select2-results__option .select2-results__option {
padding: 6px 12px;
}
.select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__group {
padding-left: 0;
}
.select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__option {
margin-left: -12px;
padding-left: 24px;
}
.select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
margin-left: -24px;
padding-left: 36px;
}
.select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
margin-left: -36px;
padding-left: 48px;
}
.select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
margin-left: -48px;
padding-left: 60px;
}
.select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
margin-left: -60px;
padding-left: 72px;
}
.select2-container--bootstrap .select2-results__group {
color: #777777;
display: block;
padding: 6px 12px;
font-size: 12px;
line-height: 1.42857143;
white-space: nowrap;
}
.select2-container--bootstrap.select2-container--focus .select2-selection, .select2-container--bootstrap.select2-container--open .select2-selection {
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
-webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
-o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
-webkit-transition: border-color ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s;
transition: border-color ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s;
transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s;
border-color: #66afe9;
}
.select2-container--bootstrap.select2-container--open {
/**
* Make the dropdown arrow point up while the dropdown is visible.
*/
/**
* Handle border radii of the container when the dropdown is showing.
*/
}
.select2-container--bootstrap.select2-container--open .select2-selection .select2-selection__arrow b {
border-color: transparent transparent #999 transparent;
border-width: 0 4px 4px 4px;
}
.select2-container--bootstrap.select2-container--open.select2-container--below .select2-selection {
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
border-bottom-color: transparent;
}
.select2-container--bootstrap.select2-container--open.select2-container--above .select2-selection {
border-top-right-radius: 0;
border-top-left-radius: 0;
border-top-color: transparent;
}
.select2-container--bootstrap .select2-selection__clear {
color: #999;
cursor: pointer;
float: right;
font-weight: bold;
margin-right: 10px;
}
.select2-container--bootstrap .select2-selection__clear:hover {
color: #333;
}
.select2-container--bootstrap.select2-container--disabled .select2-selection {
border-color: #ccc;
-webkit-box-shadow: none;
box-shadow: none;
}
.select2-container--bootstrap.select2-container--disabled .select2-selection,
.select2-container--bootstrap.select2-container--disabled .select2-search__field {
cursor: not-allowed;
}
.select2-container--bootstrap.select2-container--disabled .select2-selection,
.select2-container--bootstrap.select2-container--disabled .select2-selection--multiple .select2-selection__choice {
background-color: #eeeeee;
}
.select2-container--bootstrap.select2-container--disabled .select2-selection__clear,
.select2-container--bootstrap.select2-container--disabled .select2-selection--multiple .select2-selection__choice__remove {
display: none;
}
.select2-container--bootstrap .select2-dropdown {
-webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
border-color: #66afe9;
overflow-x: hidden;
margin-top: -1px;
}
.select2-container--bootstrap .select2-dropdown--above {
-webkit-box-shadow: 0px -6px 12px rgba(0, 0, 0, 0.175);
box-shadow: 0px -6px 12px rgba(0, 0, 0, 0.175);
margin-top: 1px;
}
.select2-container--bootstrap .select2-results > .select2-results__options {
max-height: 200px;
overflow-y: auto;
}
.select2-container--bootstrap .select2-selection--single {
height: 34px;
line-height: 1.42857143;
padding: 6px 24px 6px 12px;
/**
* Adjust the single Select2's dropdown arrow button appearance.
*/
}
.select2-container--bootstrap .select2-selection--single .select2-selection__arrow {
position: absolute;
bottom: 0;
right: 12px;
top: 0;
width: 4px;
}
.select2-container--bootstrap .select2-selection--single .select2-selection__arrow b {
border-color: #999 transparent transparent transparent;
border-style: solid;
border-width: 4px 4px 0 4px;
height: 0;
left: 0;
margin-left: -4px;
margin-top: -2px;
position: absolute;
top: 50%;
width: 0;
}
.select2-container--bootstrap .select2-selection--single .select2-selection__rendered {
color: #555555;
padding: 0;
}
.select2-container--bootstrap .select2-selection--single .select2-selection__placeholder {
color: #999;
}
.select2-container--bootstrap .select2-selection--multiple {
min-height: 34px;
padding: 0;
height: auto;
/**
* Make Multi Select2's choices match Bootstrap 3's default button styles.
*/
/**
* Minus 2px borders.
*/
/**
* Clear the selection.
*/
}
.select2-container--bootstrap .select2-selection--multiple .select2-selection__rendered {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
display: block;
line-height: 1.42857143;
list-style: none;
margin: 0;
overflow: hidden;
padding: 0;
width: 100%;
text-overflow: ellipsis;
white-space: nowrap;
}
.select2-container--bootstrap .select2-selection--multiple .select2-selection__placeholder {
color: #999;
float: left;
margin-top: 5px;
}
.select2-container--bootstrap .select2-selection--multiple .select2-selection__choice {
color: #555555;
background: #fff;
border: 1px solid #ccc;
border-radius: 4px;
cursor: default;
float: left;
margin: 5px 0 0 6px;
padding: 0 6px;
}
.select2-container--bootstrap .select2-selection--multiple .select2-search--inline .select2-search__field {
background: transparent;
padding: 0 12px;
height: 32px;
line-height: 1.42857143;
margin-top: 0;
min-width: 5em;
}
.select2-container--bootstrap .select2-selection--multiple .select2-selection__choice__remove {
color: #999;
cursor: pointer;
display: inline-block;
font-weight: bold;
margin-right: 3px;
}
.select2-container--bootstrap .select2-selection--multiple .select2-selection__choice__remove:hover {
color: #333;
}
.select2-container--bootstrap .select2-selection--multiple .select2-selection__clear {
margin-top: 6px;
}
.select2-container--bootstrap .select2-selection--single.input-sm,
.input-group-sm .select2-container--bootstrap .select2-selection--single,
.form-group-sm .select2-container--bootstrap .select2-selection--single {
border-radius: 3px;
font-size: 12px;
height: 30px;
line-height: 1.5;
padding: 5px 22px 5px 10px;
/* 2 */
}
.select2-container--bootstrap .select2-selection--single.input-sm .select2-selection__arrow b,
.input-group-sm .select2-container--bootstrap .select2-selection--single .select2-selection__arrow b,
.form-group-sm .select2-container--bootstrap .select2-selection--single .select2-selection__arrow b {
margin-left: -5px;
}
.select2-container--bootstrap .select2-selection--multiple.input-sm,
.input-group-sm .select2-container--bootstrap .select2-selection--multiple,
.form-group-sm .select2-container--bootstrap .select2-selection--multiple {
min-height: 30px;
border-radius: 3px;
}
.select2-container--bootstrap .select2-selection--multiple.input-sm .select2-selection__choice,
.input-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-selection__choice,
.form-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-selection__choice {
font-size: 12px;
line-height: 1.5;
margin: 4px 0 0 5px;
padding: 0 5px;
}
.select2-container--bootstrap .select2-selection--multiple.input-sm .select2-search--inline .select2-search__field,
.input-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-search--inline .select2-search__field,
.form-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-search--inline .select2-search__field {
padding: 0 10px;
font-size: 12px;
height: 28px;
line-height: 1.5;
}
.select2-container--bootstrap .select2-selection--multiple.input-sm .select2-selection__clear,
.input-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-selection__clear,
.form-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-selection__clear {
margin-top: 5px;
}
.select2-container--bootstrap .select2-selection--single.input-lg,
.input-group-lg .select2-container--bootstrap .select2-selection--single,
.form-group-lg .select2-container--bootstrap .select2-selection--single {
border-radius: 6px;
font-size: 18px;
height: 46px;
line-height: 1.3333333;
padding: 10px 31px 10px 16px;
/* 1 */
}
.select2-container--bootstrap .select2-selection--single.input-lg .select2-selection__arrow,
.input-group-lg .select2-container--bootstrap .select2-selection--single .select2-selection__arrow,
.form-group-lg .select2-container--bootstrap .select2-selection--single .select2-selection__arrow {
width: 5px;
}
.select2-container--bootstrap .select2-selection--single.input-lg .select2-selection__arrow b,
.input-group-lg .select2-container--bootstrap .select2-selection--single .select2-selection__arrow b,
.form-group-lg .select2-container--bootstrap .select2-selection--single .select2-selection__arrow b {
border-width: 5px 5px 0 5px;
margin-left: -5px;
margin-left: -10px;
margin-top: -2.5px;
}
.select2-container--bootstrap .select2-selection--multiple.input-lg,
.input-group-lg .select2-container--bootstrap .select2-selection--multiple,
.form-group-lg .select2-container--bootstrap .select2-selection--multiple {
min-height: 46px;
border-radius: 6px;
}
.select2-container--bootstrap .select2-selection--multiple.input-lg .select2-selection__choice,
.input-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-selection__choice,
.form-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-selection__choice {
font-size: 18px;
line-height: 1.3333333;
border-radius: 4px;
margin: 9px 0 0 8px;
padding: 0 10px;
}
.select2-container--bootstrap .select2-selection--multiple.input-lg .select2-search--inline .select2-search__field,
.input-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-search--inline .select2-search__field,
.form-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-search--inline .select2-search__field {
padding: 0 16px;
font-size: 18px;
height: 44px;
line-height: 1.3333333;
}
.select2-container--bootstrap .select2-selection--multiple.input-lg .select2-selection__clear,
.input-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-selection__clear,
.form-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-selection__clear {
margin-top: 10px;
}
.select2-container--bootstrap .select2-selection.input-lg.select2-container--open .select2-selection--single {
/**
* Make the dropdown arrow point up while the dropdown is visible.
*/
}
.select2-container--bootstrap .select2-selection.input-lg.select2-container--open .select2-selection--single .select2-selection__arrow b {
border-color: transparent transparent #999 transparent;
border-width: 0 5px 5px 5px;
}
.input-group-lg .select2-container--bootstrap .select2-selection.select2-container--open .select2-selection--single {
/**
* Make the dropdown arrow point up while the dropdown is visible.
*/
}
.input-group-lg .select2-container--bootstrap .select2-selection.select2-container--open .select2-selection--single .select2-selection__arrow b {
border-color: transparent transparent #999 transparent;
border-width: 0 5px 5px 5px;
}
.select2-container--bootstrap[dir="rtl"] {
/**
* Single Select2
*
* 1. Makes sure that .select2-selection__placeholder is positioned
* correctly.
*/
/**
* Multiple Select2
*/
}
.select2-container--bootstrap[dir="rtl"] .select2-selection--single {
padding-left: 24px;
padding-right: 12px;
}
.select2-container--bootstrap[dir="rtl"] .select2-selection--single .select2-selection__rendered {
padding-right: 0;
padding-left: 0;
text-align: right;
/* 1 */
}
.select2-container--bootstrap[dir="rtl"] .select2-selection--single .select2-selection__clear {
float: left;
}
.select2-container--bootstrap[dir="rtl"] .select2-selection--single .select2-selection__arrow {
left: 12px;
right: auto;
}
.select2-container--bootstrap[dir="rtl"] .select2-selection--single .select2-selection__arrow b {
margin-left: 0;
}
.select2-container--bootstrap[dir="rtl"] .select2-selection--multiple .select2-selection__choice,
.select2-container--bootstrap[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder,
.select2-container--bootstrap[dir="rtl"] .select2-selection--multiple .select2-search--inline {
float: right;
}
.select2-container--bootstrap[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
margin-left: 0;
margin-right: 6px;
}
.select2-container--bootstrap[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
margin-left: 2px;
margin-right: auto;
}
/*------------------------------------* #ADDITIONAL GOODIES
\*------------------------------------*/
/**
* Address Bootstrap's validation states
*
* If a Select2 widget parent has one of Bootstrap's validation state modifier
* classes, adjust Select2's border colors and focus states accordingly.
* You may apply said classes to the Select2 dropdown (body > .select2-container)
* via JavaScript match Bootstraps' to make its styles match.
*
* @see http://getbootstrap.com/css/#forms-control-validation
*/
.has-warning .select2-dropdown,
.has-warning .select2-selection {
border-color: #8a6d3b;
}
.has-warning .select2-container--focus .select2-selection,
.has-warning .select2-container--open .select2-selection {
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
border-color: #66512c;
}
.has-warning.select2-drop-active {
border-color: #66512c;
}
.has-warning.select2-drop-active.select2-drop.select2-drop-above {
border-top-color: #66512c;
}
.has-error .select2-dropdown,
.has-error .select2-selection {
border-color: #a94442;
}
.has-error .select2-container--focus .select2-selection,
.has-error .select2-container--open .select2-selection {
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
border-color: #843534;
}
.has-error.select2-drop-active {
border-color: #843534;
}
.has-error.select2-drop-active.select2-drop.select2-drop-above {
border-top-color: #843534;
}
.has-success .select2-dropdown,
.has-success .select2-selection {
border-color: #3c763d;
}
.has-success .select2-container--focus .select2-selection,
.has-success .select2-container--open .select2-selection {
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
border-color: #2b542c;
}
.has-success.select2-drop-active {
border-color: #2b542c;
}
.has-success.select2-drop-active.select2-drop.select2-drop-above {
border-top-color: #2b542c;
}
/**
* Select2 widgets in Bootstrap Input Groups
*
* @see http://getbootstrap.com/components/#input-groups
* @see https://github.com/twbs/bootstrap/blob/master/less/input-groups.less
*/
/**
* Reset rounded corners
*/
.input-group > .select2-hidden-accessible:first-child + .select2-container--bootstrap > .selection > .select2-selection,
.input-group > .select2-hidden-accessible:first-child + .select2-container--bootstrap > .selection > .select2-selection.form-control {
border-bottom-right-radius: 0;
border-top-right-radius: 0;
}
.input-group > .select2-hidden-accessible:not(:first-child) + .select2-container--bootstrap:not(:last-child) > .selection > .select2-selection,
.input-group > .select2-hidden-accessible:not(:first-child) + .select2-container--bootstrap:not(:last-child) > .selection > .select2-selection.form-control {
border-radius: 0;
}
.input-group > .select2-hidden-accessible:not(:first-child):not(:last-child) + .select2-container--bootstrap:last-child > .selection > .select2-selection,
.input-group > .select2-hidden-accessible:not(:first-child):not(:last-child) + .select2-container--bootstrap:last-child > .selection > .select2-selection.form-control {
border-bottom-left-radius: 0;
border-top-left-radius: 0;
}
.input-group > .select2-container--bootstrap {
display: table;
table-layout: fixed;
position: relative;
z-index: 2;
width: 100%;
margin-bottom: 0;
/**
* Adjust z-index like Bootstrap does to show the focus-box-shadow
* above appended buttons in .input-group and .form-group.
*/
/**
* Adjust alignment of Bootstrap buttons in Bootstrap Input Groups to address
* Multi Select2's height which - depending on how many elements have been selected -
* may grow taller than its initial size.
*
* @see http://getbootstrap.com/components/#input-groups
*/
}
.input-group > .select2-container--bootstrap > .selection > .select2-selection.form-control {
float: none;
}
.input-group > .select2-container--bootstrap.select2-container--open, .input-group > .select2-container--bootstrap.select2-container--focus {
z-index: 3;
}
.input-group > .select2-container--bootstrap,
.input-group > .select2-container--bootstrap .input-group-btn,
.input-group > .select2-container--bootstrap .input-group-btn .btn {
vertical-align: top;
}
/**
* Temporary fix for https://github.com/select2/select2-bootstrap-theme/issues/9
*
* Provides `!important` for certain properties of the class applied to the
* original `<select>` element to hide it.
*
* @see https://github.com/select2/select2/pull/3301
* @see https://github.com/fk/select2/commit/31830c7b32cb3d8e1b12d5b434dee40a6e753ada
*/
.form-control.select2-hidden-accessible {
position: absolute !important;
width: 1px !important;
}
/**
* Display override for inline forms
*/
@media (min-width: 768px) {
.form-inline .select2-container--bootstrap {
display: inline-block;
}
}

File diff suppressed because one or more lines are too long

View File

@@ -1,3 +0,0 @@
$(document).ready(function () {
$('.multiselectwidget').select2();
});

View File

@@ -1,3 +0,0 @@
$(document).ready(function () {
$('.selectwidget').select2();
});

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