Compare commits

..

99 Commits

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/fr/
2024-03-05 22:19:58 +00:00
dependabot[bot]
cf61de0dba Bump gunicorn from 20.1.0 to 21.2.0
Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 20.1.0 to 21.2.0.
- [Release notes](https://github.com/benoitc/gunicorn/releases)
- [Commits](https://github.com/benoitc/gunicorn/compare/20.1.0...21.2.0)

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

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

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-01 00:04:56 +00:00
238 changed files with 41770 additions and 59373 deletions

View File

@@ -14,7 +14,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- uses: awalsh128/cache-apt-pkgs-action@v1.4.1
- uses: awalsh128/cache-apt-pkgs-action@v1.4.2
with:
packages: libsasl2-dev python3-dev libldap2-dev libssl-dev
version: 1.0

21
.vscode/launch.json vendored
View File

@@ -4,7 +4,6 @@
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python Debugger: Django",
"type": "debugpy",
@@ -13,6 +12,22 @@
"args": ["runserver"],
"django": true,
"justMyCode": true
}
},
{
"name": "Python: Debug Tests",
"type": "debugpy",
"request": "launch",
"program": "${file}",
"purpose": [
"debug-test"
],
"console": "integratedTerminal",
"env": {
// coverage and pytest can't both be running at the same time
"PYTEST_ADDOPTS": "--no-cov"
},
"django": true,
"justMyCode": true
},
]
}
}

View File

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

View File

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

View File

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

View File

@@ -71,7 +71,7 @@ class FoodPropertyHelper:
# TODO move to central helper ? --> use defaultdict
@staticmethod
def add_or_create(d, key, value, food):
if key in d:
if key in d and d[key]['value']:
d[key]['value'] += value
else:
d[key] = {'id': food.id, 'food': food.name, 'value': value}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.10 on 2024-03-09 06:41
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0216_delete_shoppinglist'),
]
operations = [
migrations.AlterField(
model_name='userpreference',
name='default_page',
field=models.CharField(choices=[('SEARCH', 'Search'), ('PLAN', 'Meal-Plan'), ('BOOKS', 'Books'), ('SHOPPING', 'Shopping')], default='SEARCH', max_length=64),
),
]

View File

@@ -449,11 +449,13 @@ class UserPreference(models.Model, PermissionModelMixin):
SEARCH = 'SEARCH'
PLAN = 'PLAN'
BOOKS = 'BOOKS'
SHOPPING = 'SHOPPING'
PAGES = (
(SEARCH, _('Search')),
(PLAN, _('Meal-Plan')),
(BOOKS, _('Books')),
(SHOPPING, _('Shopping')),
)
user = AutoOneToOneField(User, on_delete=models.CASCADE, primary_key=True)

View File

@@ -1,88 +1,88 @@
from datetime import datetime, timedelta
import pytest
from django.contrib import auth
from django.urls import reverse
from icalendar import Calendar
from cookbook.models import MealPlan, MealType
BOUND_URL = 'api_get_plan_ical'
FROM_URL = 'api_get_plan_ical_from'
FUTURE_URL = 'api_get_plan_ical_future'
@pytest.fixture()
def meal_type(space_1, u1_s1):
return MealType.objects.get_or_create(name='test', space=space_1, created_by=auth.get_user(u1_s1))[0]
@pytest.fixture()
def obj_1(space_1, recipe_1_s1, meal_type, u1_s1):
return MealPlan.objects.create(recipe=recipe_1_s1, space=space_1, meal_type=meal_type, from_date=datetime.now(), to_date=datetime.now(),
created_by=auth.get_user(u1_s1))
@pytest.fixture
def obj_2(space_1, recipe_1_s1, meal_type, u1_s1):
return MealPlan.objects.create(recipe=recipe_1_s1, space=space_1, meal_type=meal_type, from_date=datetime.now()+timedelta(days=30), to_date=datetime.now()+timedelta(days=30),
created_by=auth.get_user(u1_s1))
@pytest.fixture
def obj_3(space_1, recipe_1_s1, meal_type, u1_s1):
return MealPlan.objects.create(recipe=recipe_1_s1, space=space_1, meal_type=meal_type, from_date=datetime.now()+timedelta(days=-30), to_date=datetime.now()+timedelta(days=-1),
created_by=auth.get_user(u1_s1))
@pytest.mark.parametrize("arg", [
['a_u', 403],
['g1_s1', 403],
['u1_s1', 200],
['a1_s1', 200],
])
def test_permissions(arg, request):
c = request.getfixturevalue(arg[0])
assert c.get(reverse(FUTURE_URL)).status_code == arg[1]
def test_future(obj_1, obj_2, obj_3, u1_s1):
r = u1_s1.get(reverse(FUTURE_URL))
assert r.status_code == 200
cal = Calendar.from_ical(r.getvalue().decode('UTF-8'))
events = cal.walk('VEVENT')
assert len(events) == 2
def test_from(obj_1, obj_2, obj_3, u1_s1):
from_date_slug = (datetime.now()+timedelta(days=1)).strftime("%Y-%m-%d")
r = u1_s1.get(reverse(FROM_URL, kwargs={'from_date': from_date_slug}))
assert r.status_code == 200
cal = Calendar.from_ical(r.getvalue().decode('UTF-8'))
events = cal.walk('VEVENT')
assert len(events) == 1
def test_bound(obj_1, obj_2, obj_3, u1_s1):
from_date_slug = (datetime.now()+timedelta(days=-1)).strftime("%Y-%m-%d")
to_date_slug = (datetime.now()+timedelta(days=1)).strftime("%Y-%m-%d")
r = u1_s1.get(reverse(BOUND_URL, kwargs={'from_date': from_date_slug, 'to_date': to_date_slug}))
assert r.status_code == 200
cal = Calendar.from_ical(r.getvalue().decode('UTF-8'))
events = cal.walk('VEVENT')
assert len(events) == 1
def test_event(obj_1, u1_s1):
from_date_slug = (datetime.now()+timedelta(days=-1)).strftime("%Y-%m-%d")
to_date_slug = (datetime.now()+timedelta(days=1)).strftime("%Y-%m-%d")
r = u1_s1.get(reverse(BOUND_URL, kwargs={'from_date': from_date_slug, 'to_date': to_date_slug}))
cal = Calendar.from_ical(r.getvalue().decode('UTF-8'))
events = cal.walk('VEVENT')
assert len(events) == 1
event = events[0]
assert int(event['uid']) == obj_1.id
assert event['summary'] == f'{obj_1.meal_type.name}: {obj_1.get_label()}'
assert event['description'] == obj_1.note
assert event.decoded('dtstart') == datetime.now().date()
assert event.decoded('dtend') == datetime.now().date()
# from datetime import datetime, timedelta
#
# import pytest
# from django.contrib import auth
# from django.urls import reverse
# from icalendar import Calendar
#
# from cookbook.models import MealPlan, MealType
#
# BOUND_URL = 'api_get_plan_ical'
# FROM_URL = 'api_get_plan_ical'
# FUTURE_URL = 'api_get_plan_ical'
#
#
# @pytest.fixture()
# def meal_type(space_1, u1_s1):
# return MealType.objects.get_or_create(name='test', space=space_1, created_by=auth.get_user(u1_s1))[0]
#
#
# @pytest.fixture()
# def obj_1(space_1, recipe_1_s1, meal_type, u1_s1):
# return MealPlan.objects.create(recipe=recipe_1_s1, space=space_1, meal_type=meal_type, from_date=datetime.now(), to_date=datetime.now(),
# created_by=auth.get_user(u1_s1))
#
#
# @pytest.fixture
# def obj_2(space_1, recipe_1_s1, meal_type, u1_s1):
# return MealPlan.objects.create(recipe=recipe_1_s1, space=space_1, meal_type=meal_type, from_date=datetime.now()+timedelta(days=30), to_date=datetime.now()+timedelta(days=30),
# created_by=auth.get_user(u1_s1))
#
# @pytest.fixture
# def obj_3(space_1, recipe_1_s1, meal_type, u1_s1):
# return MealPlan.objects.create(recipe=recipe_1_s1, space=space_1, meal_type=meal_type, from_date=datetime.now()+timedelta(days=-30), to_date=datetime.now()+timedelta(days=-1),
# created_by=auth.get_user(u1_s1))
#
#
# @pytest.mark.parametrize("arg", [
# ['a_u', 403],
# ['g1_s1', 403],
# ['u1_s1', 200],
# ['a1_s1', 200],
# ])
# def test_permissions(arg, request):
# c = request.getfixturevalue(arg[0])
# assert c.get(reverse(FUTURE_URL)).status_code == arg[1]
#
# def test_future(obj_1, obj_2, obj_3, u1_s1):
# r = u1_s1.get(reverse(FUTURE_URL))
# assert r.status_code == 200
#
# cal = Calendar.from_ical(r.getvalue().decode('UTF-8'))
# events = cal.walk('VEVENT')
# assert len(events) == 2
#
# def test_from(obj_1, obj_2, obj_3, u1_s1):
# from_date_slug = (datetime.now()+timedelta(days=1)).strftime("%Y-%m-%d")
# r = u1_s1.get(reverse(FROM_URL, kwargs={'from_date': from_date_slug}))
# assert r.status_code == 200
#
# cal = Calendar.from_ical(r.getvalue().decode('UTF-8'))
# events = cal.walk('VEVENT')
# assert len(events) == 1
#
# def test_bound(obj_1, obj_2, obj_3, u1_s1):
# from_date_slug = (datetime.now()+timedelta(days=-1)).strftime("%Y-%m-%d")
# to_date_slug = (datetime.now()+timedelta(days=1)).strftime("%Y-%m-%d")
# r = u1_s1.get(reverse(BOUND_URL, kwargs={'from_date': from_date_slug, 'to_date': to_date_slug}))
# assert r.status_code == 200
#
# cal = Calendar.from_ical(r.getvalue().decode('UTF-8'))
# events = cal.walk('VEVENT')
# assert len(events) == 1
#
# def test_event(obj_1, u1_s1):
# from_date_slug = (datetime.now()+timedelta(days=-1)).strftime("%Y-%m-%d")
# to_date_slug = (datetime.now()+timedelta(days=1)).strftime("%Y-%m-%d")
# r = u1_s1.get(reverse(BOUND_URL, kwargs={'from_date': from_date_slug, 'to_date': to_date_slug}))
#
# cal = Calendar.from_ical(r.getvalue().decode('UTF-8'))
# events = cal.walk('VEVENT')
# assert len(events) == 1
#
# event = events[0]
# assert int(event['uid']) == obj_1.id
# assert event['summary'] == f'{obj_1.meal_type.name}: {obj_1.get_label()}'
# assert event['description'] == obj_1.note
# assert event.decoded('dtstart') == datetime.now().date()
# assert event.decoded('dtend') == datetime.now().date()

View File

@@ -156,6 +156,7 @@ def test_url_import_regex_replace(u1_s1):
if 'cookbook' in os.getcwd():
test_file = os.path.join(os.getcwd(), 'other', 'test_data', recipe)
# TODO this catch doesn't really work depending on from where you start the test, must check for duplicate path sections
else:
test_file = os.path.join(os.getcwd(), 'cookbook', 'tests', 'other', 'test_data', recipe)
with open(test_file, 'r', encoding='UTF-8') as d:

View File

@@ -297,36 +297,36 @@ def test_fuzzy_lookup(found_recipe, recipes, param_type, user1, space_1):
# commenting this out for general use - it is really slow
# it should be run on occasion to ensure everything still works
# @pytest.mark.skipif(sqlite and True, reason="requires PostgreSQL")
# @pytest.mark.parametrize("user1", itertools.product(
# [
# ('fuzzy_search', True), ('fuzzy_search', False),
# ('fulltext', True), ('fulltext', False),
# ('icontains', True), ('icontains', False),
# ('istartswith', True), ('istartswith', False),
# ],
# [('unaccent', True), ('unaccent', False)]
# ), indirect=['user1'])
# @pytest.mark.parametrize("found_recipe", [
# ({'name': True}),
# ({'description': True}),
# ({'instruction': True}),
# ({'keyword': True}),
# ({'food': True}),
# ], indirect=['found_recipe'])
# # user array contains: user client, expected count of search, expected count of mispelled search, search string, mispelled search string, user search preferences
# def test_search_string(found_recipe, recipes, user1, space_1):
# with scope(space=space_1):
# param1 = f"query={user1[3]}"
# param2 = f"query={user1[4]}"
@pytest.mark.skipif(sqlite and True, reason="requires PostgreSQL")
@pytest.mark.parametrize("user1", itertools.product(
[
('fuzzy_search', True), ('fuzzy_search', False),
('fulltext', True), ('fulltext', False),
('icontains', True), ('icontains', False),
('istartswith', True), ('istartswith', False),
],
[('unaccent', True), ('unaccent', False)]
), indirect=['user1'])
@pytest.mark.parametrize("found_recipe", [
({'name': True}),
({'description': True}),
({'instruction': True}),
({'keyword': True}),
({'food': True}),
], indirect=['found_recipe'])
# user array contains: user client, expected count of search, expected count of mispelled search, search string, mispelled search string, user search preferences
def test_search_string(found_recipe, recipes, user1, space_1):
with scope(space=space_1):
param1 = f"query={user1[3]}"
param2 = f"query={user1[4]}"
# r = json.loads(user1[0].get(reverse(LIST_URL) + f'?{param1}').content)
# assert len([x['id'] for x in r['results'] if x['id'] in [
# found_recipe[0].id, found_recipe[1].id]]) == user1[1]
r = json.loads(user1[0].get(reverse(LIST_URL) + f'?{param1}').content)
assert len([x['id'] for x in r['results'] if x['id'] in [
found_recipe[0].id, found_recipe[1].id]]) == user1[1]
# r = json.loads(user1[0].get(reverse(LIST_URL) + f'?{param2}').content)
# assert len([x['id'] for x in r['results'] if x['id'] in [
# found_recipe[0].id, found_recipe[1].id]]) == user1[2]
r = json.loads(user1[0].get(reverse(LIST_URL) + f'?{param2}').content)
assert len([x['id'] for x in r['results'] if x['id'] in [
found_recipe[0].id, found_recipe[1].id]]) == user1[2]
@pytest.mark.parametrize("found_recipe, param_type, result", [

View File

@@ -8,7 +8,6 @@ from rest_framework.schemas import get_schema_view
from cookbook.version_info import TANDOOR_VERSION
from recipes.settings import DEBUG, PLUGINS
from .models import (Automation, Comment, CustomFilter, Food, InviteLink, Keyword, PropertyType,
Recipe, RecipeBook, RecipeBookEntry, RecipeImport, Space, Step,
Storage, Supermarket, SupermarketCategory, Sync, SyncLog, Unit, UnitConversion,
@@ -16,7 +15,7 @@ from .models import (Automation, Comment, CustomFilter, Food, InviteLink, Keywor
from .views import api, data, delete, edit, import_export, lists, new, telegram, views
from .views.api import CustomAuthToken, ImportOpenData
import datetime
# extend DRF default router class to allow including additional routers
class DefaultRouter(routers.DefaultRouter):
@@ -121,9 +120,9 @@ urlpatterns = [
path('api/get_recipe_file/<int:recipe_id>/', api.get_recipe_file, name='api_get_recipe_file'),
path('api/sync_all/', api.sync_all, name='api_sync'),
path('api/log_cooking/<int:recipe_id>/', api.log_cooking, name='api_log_cooking'),
path('api/plan-ical/', api.get_plan_ical, name='api_get_plan_ical_future'),
path('api/plan-ical/<slug:from_date>/', api.get_plan_ical, name='api_get_plan_ical_from'),
path('api/plan-ical/<slug:from_date>/<slug:to_date>/', api.get_plan_ical, name='api_get_plan_ical'),
path('api/recipe-from-source/', api.RecipeUrlImportView.as_view(), name='api_recipe_from_source'),
path('api/backup/', api.get_backup, name='api_backup'),
path('api/ingredient-from-string/', api.ingredient_from_string, name='api_ingredient_from_string'),
@@ -137,7 +136,7 @@ urlpatterns = [
path('docs/markdown/', views.markdown_info, name='docs_markdown'),
path('docs/search/', views.search_info, name='docs_search'),
path('docs/api/', views.api_info, name='docs_api'),
path('openapi/', get_schema_view(title="Django Recipes", version=TANDOOR_VERSION, public=True, permission_classes=(permissions.AllowAny, )), name='openapi-schema'),
path('openapi/', get_schema_view(title="Django Recipes", version=TANDOOR_VERSION, public=True, permission_classes=(permissions.AllowAny,)), name='openapi-schema'),
path('api/', include((router.urls, 'api'))),
path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
path('api-token-auth/', CustomAuthToken.as_view()),
@@ -148,13 +147,11 @@ urlpatterns = [
path('manifest.json', views.web_manifest, name='web_manifest'),
]
generic_models = (
Recipe, RecipeImport, Storage, ConnectorConfig, RecipeBook, SyncLog, Sync,
Comment, RecipeBookEntry, InviteLink, UserSpace, Space
)
for m in generic_models:
py_name = get_model_name(m)
url_name = py_name.replace('_', '-')

View File

@@ -1168,12 +1168,24 @@ class ShoppingListEntryViewSet(viewsets.ModelViewSet):
@decorators.action(detail=False, methods=['POST'], serializer_class=ShoppingListEntryBulkSerializer, permission_classes=[CustomIsUser])
def bulk(self, request):
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
ShoppingListEntry.objects.filter(Q(created_by=self.request.user)
| Q(created_by__in=list(self.request.user.get_shopping_share()))).filter(space=request.space, id__in=serializer.validated_data['ids']
).update(checked=serializer.validated_data['checked'],
updated_at=timezone.now(),
)
print(serializer.validated_data)
bulk_entries = ShoppingListEntry.objects.filter(
Q(created_by=self.request.user) | Q(created_by__in=list(self.request.user.get_shopping_share()))
).filter(space=request.space, id__in=serializer.validated_data['ids'])
bulk_entries.update(checked=(checked := serializer.validated_data['checked']), updated_at=timezone.now(), )
# update the onhand for food if shopping_add_onhand is True
if request.user.userpreference.shopping_add_onhand:
foods = Food.objects.filter(id__in=bulk_entries.values('food'))
if checked:
for f in foods:
f.onhand_users.add(*request.user.userpreference.shopping_share.all(), request.user)
elif checked == False:
for f in foods:
f.onhand_users.remove(*request.user.userpreference.shopping_share.all(), request.user)
return Response(serializer.data)
else:
return Response(serializer.errors, 400)

View File

@@ -38,7 +38,7 @@ def index(request):
return HttpResponseRedirect(reverse_lazy('view_search'))
try:
page_map = {UserPreference.SEARCH: reverse_lazy('view_search'), UserPreference.PLAN: reverse_lazy('view_plan'), UserPreference.BOOKS: reverse_lazy('view_books'), }
page_map = {UserPreference.SEARCH: reverse_lazy('view_search'), UserPreference.PLAN: reverse_lazy('view_plan'), UserPreference.BOOKS: reverse_lazy('view_books'), UserPreference.SHOPPING: reverse_lazy('view_shopping'),}
return HttpResponseRedirect(page_map.get(request.user.userpreference.default_page))
except UserPreference.DoesNotExist:
@@ -293,20 +293,24 @@ def system(request):
if postgres:
postgres_current = 16 # will need to be updated as PostgreSQL releases new major versions
from decimal import Decimal
from django.db import connection
postgres_ver = Decimal(str(connection.pg_version).replace('00', '.'))
if postgres_ver >= postgres_current:
database_status = 'success'
database_message = _('Everything is fine!')
elif postgres_ver < postgres_current - 2:
try:
postgres_ver = divmod(connection.pg_version, 10000)[0]
if postgres_ver >= postgres_current:
database_status = 'success'
database_message = _('Everything is fine!')
elif postgres_ver < postgres_current - 2:
database_status = 'danger'
database_message = _('PostgreSQL %(v)s is deprecated. Upgrade to a fully supported version!') % {'v': postgres_ver}
else:
database_status = 'info'
database_message = _('You are running PostgreSQL %(v1)s. PostgreSQL %(v2)s is recommended') % {'v1': postgres_ver, 'v2': postgres_current}
except Exception as e:
print(f"Error determining PostgreSQL version: {e}")
database_status = 'danger'
database_message = _('PostgreSQL %(v)s is deprecated. Upgrade to a fully supported version!') % {'v': postgres_ver}
else:
database_status = 'info'
database_message = _('You are running PostgreSQL %(v1)s. PostgreSQL %(v2)s is recommended') % {'v1': postgres_ver, 'v2': postgres_current}
database_message = _('Unable to determine PostgreSQL version.')
else:
database_status = 'info'
database_message = _(
@@ -446,7 +450,7 @@ def web_manifest(request):
theme_values['app_name'], "description":
_("Manage recipes, shopping list, meal plans and more."), "icons":
icons, "start_url":
"./search", "background_color":
"./", "background_color":
theme_values['nav_bg_color'], "display":
"standalone", "scope":
".", "theme_color":
@@ -454,7 +458,7 @@ def web_manifest(request):
[{"name": _("Plan"), "short_name": _("Plan"), "description": _("View your meal Plan"), "url":
"./plan"}, {"name": _("Books"), "short_name": _("Books"), "description": _("View your cookbooks"), "url": "./books"},
{"name": _("Shopping"), "short_name": _("Shopping"), "description": _("View your shopping lists"), "url":
"./list/shopping-list/"}], "share_target": {"action": "/data/import/url", "method": "GET", "params": {"title": "title", "url": "url", "text": "text"}}
"./shopping/"}], "share_target": {"action": "/data/import/url", "method": "GET", "params": {"title": "title", "url": "url", "text": "text"}}
}
return JsonResponse(manifest_info, json_dumps_params={'indent': 4})

View File

@@ -1,2 +0,0 @@
# Created by coverage.py
*

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="114" height="20" role="img" aria-label="coverage: 58.61%"><title>coverage: 58.61%</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="114" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="61" height="20" fill="#555"/><rect x="61" width="53" height="20" fill="#fe7d37"/><rect width="114" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text aria-hidden="true" x="315" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="510">coverage</text><text x="315" y="140" transform="scale(.1)" fill="#fff" textLength="510">coverage</text><text aria-hidden="true" x="865" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="430">58.61%</text><text x="865" y="140" transform="scale(.1)" fill="#fff" textLength="430">58.61%</text></g></svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

File diff suppressed because it is too large Load Diff

View File

@@ -1,624 +0,0 @@
// Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
// For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt
// Coverage.py HTML report browser code.
/*jslint browser: true, sloppy: true, vars: true, plusplus: true, maxerr: 50, indent: 4 */
/*global coverage: true, document, window, $ */
coverage = {};
// General helpers
function debounce(callback, wait) {
let timeoutId = null;
return function(...args) {
clearTimeout(timeoutId);
timeoutId = setTimeout(() => {
callback.apply(this, args);
}, wait);
};
};
function checkVisible(element) {
const rect = element.getBoundingClientRect();
const viewBottom = Math.max(document.documentElement.clientHeight, window.innerHeight);
const viewTop = 30;
return !(rect.bottom < viewTop || rect.top >= viewBottom);
}
function on_click(sel, fn) {
const elt = document.querySelector(sel);
if (elt) {
elt.addEventListener("click", fn);
}
}
// Helpers for table sorting
function getCellValue(row, column = 0) {
const cell = row.cells[column] // nosemgrep: eslint.detect-object-injection
if (cell.childElementCount == 1) {
const child = cell.firstElementChild
if (child instanceof HTMLTimeElement && child.dateTime) {
return child.dateTime
} else if (child instanceof HTMLDataElement && child.value) {
return child.value
}
}
return cell.innerText || cell.textContent;
}
function rowComparator(rowA, rowB, column = 0) {
let valueA = getCellValue(rowA, column);
let valueB = getCellValue(rowB, column);
if (!isNaN(valueA) && !isNaN(valueB)) {
return valueA - valueB
}
return valueA.localeCompare(valueB, undefined, {numeric: true});
}
function sortColumn(th) {
// Get the current sorting direction of the selected header,
// clear state on other headers and then set the new sorting direction
const currentSortOrder = th.getAttribute("aria-sort");
[...th.parentElement.cells].forEach(header => header.setAttribute("aria-sort", "none"));
if (currentSortOrder === "none") {
th.setAttribute("aria-sort", th.dataset.defaultSortOrder || "ascending");
} else {
th.setAttribute("aria-sort", currentSortOrder === "ascending" ? "descending" : "ascending");
}
const column = [...th.parentElement.cells].indexOf(th)
// Sort all rows and afterwards append them in order to move them in the DOM
Array.from(th.closest("table").querySelectorAll("tbody tr"))
.sort((rowA, rowB) => rowComparator(rowA, rowB, column) * (th.getAttribute("aria-sort") === "ascending" ? 1 : -1))
.forEach(tr => tr.parentElement.appendChild(tr) );
}
// Find all the elements with data-shortcut attribute, and use them to assign a shortcut key.
coverage.assign_shortkeys = function () {
document.querySelectorAll("[data-shortcut]").forEach(element => {
document.addEventListener("keypress", event => {
if (event.target.tagName.toLowerCase() === "input") {
return; // ignore keypress from search filter
}
if (event.key === element.dataset.shortcut) {
element.click();
}
});
});
};
// Create the events for the filter box.
coverage.wire_up_filter = function () {
// Cache elements.
const table = document.querySelector("table.index");
const table_body_rows = table.querySelectorAll("tbody tr");
const no_rows = document.getElementById("no_rows");
// Observe filter keyevents.
document.getElementById("filter").addEventListener("input", debounce(event => {
// Keep running total of each metric, first index contains number of shown rows
const totals = new Array(table.rows[0].cells.length).fill(0);
// Accumulate the percentage as fraction
totals[totals.length - 1] = { "numer": 0, "denom": 0 }; // nosemgrep: eslint.detect-object-injection
// Hide / show elements.
table_body_rows.forEach(row => {
if (!row.cells[0].textContent.includes(event.target.value)) {
// hide
row.classList.add("hidden");
return;
}
// show
row.classList.remove("hidden");
totals[0]++;
for (let column = 1; column < totals.length; column++) {
// Accumulate dynamic totals
cell = row.cells[column] // nosemgrep: eslint.detect-object-injection
if (column === totals.length - 1) {
// Last column contains percentage
const [numer, denom] = cell.dataset.ratio.split(" ");
totals[column]["numer"] += parseInt(numer, 10); // nosemgrep: eslint.detect-object-injection
totals[column]["denom"] += parseInt(denom, 10); // nosemgrep: eslint.detect-object-injection
} else {
totals[column] += parseInt(cell.textContent, 10); // nosemgrep: eslint.detect-object-injection
}
}
});
// Show placeholder if no rows will be displayed.
if (!totals[0]) {
// Show placeholder, hide table.
no_rows.style.display = "block";
table.style.display = "none";
return;
}
// Hide placeholder, show table.
no_rows.style.display = null;
table.style.display = null;
const footer = table.tFoot.rows[0];
// Calculate new dynamic sum values based on visible rows.
for (let column = 1; column < totals.length; column++) {
// Get footer cell element.
const cell = footer.cells[column]; // nosemgrep: eslint.detect-object-injection
// Set value into dynamic footer cell element.
if (column === totals.length - 1) {
// Percentage column uses the numerator and denominator,
// and adapts to the number of decimal places.
const match = /\.([0-9]+)/.exec(cell.textContent);
const places = match ? match[1].length : 0;
const { numer, denom } = totals[column]; // nosemgrep: eslint.detect-object-injection
cell.dataset.ratio = `${numer} ${denom}`;
// Check denom to prevent NaN if filtered files contain no statements
cell.textContent = denom
? `${(numer * 100 / denom).toFixed(places)}%`
: `${(100).toFixed(places)}%`;
} else {
cell.textContent = totals[column]; // nosemgrep: eslint.detect-object-injection
}
}
}));
// Trigger change event on setup, to force filter on page refresh
// (filter value may still be present).
document.getElementById("filter").dispatchEvent(new Event("input"));
};
coverage.INDEX_SORT_STORAGE = "COVERAGE_INDEX_SORT_2";
// Loaded on index.html
coverage.index_ready = function () {
coverage.assign_shortkeys();
coverage.wire_up_filter();
document.querySelectorAll("[data-sortable] th[aria-sort]").forEach(
th => th.addEventListener("click", e => sortColumn(e.target))
);
// Look for a localStorage item containing previous sort settings:
const stored_list = localStorage.getItem(coverage.INDEX_SORT_STORAGE);
if (stored_list) {
const {column, direction} = JSON.parse(stored_list);
const th = document.querySelector("[data-sortable]").tHead.rows[0].cells[column]; // nosemgrep: eslint.detect-object-injection
th.setAttribute("aria-sort", direction === "ascending" ? "descending" : "ascending");
th.click()
}
// Watch for page unload events so we can save the final sort settings:
window.addEventListener("unload", function () {
const th = document.querySelector('[data-sortable] th[aria-sort="ascending"], [data-sortable] [aria-sort="descending"]');
if (!th) {
return;
}
localStorage.setItem(coverage.INDEX_SORT_STORAGE, JSON.stringify({
column: [...th.parentElement.cells].indexOf(th),
direction: th.getAttribute("aria-sort"),
}));
});
on_click(".button_prev_file", coverage.to_prev_file);
on_click(".button_next_file", coverage.to_next_file);
on_click(".button_show_hide_help", coverage.show_hide_help);
};
// -- pyfile stuff --
coverage.LINE_FILTERS_STORAGE = "COVERAGE_LINE_FILTERS";
coverage.pyfile_ready = function () {
// If we're directed to a particular line number, highlight the line.
var frag = location.hash;
if (frag.length > 2 && frag[1] === "t") {
document.querySelector(frag).closest(".n").classList.add("highlight");
coverage.set_sel(parseInt(frag.substr(2), 10));
} else {
coverage.set_sel(0);
}
on_click(".button_toggle_run", coverage.toggle_lines);
on_click(".button_toggle_mis", coverage.toggle_lines);
on_click(".button_toggle_exc", coverage.toggle_lines);
on_click(".button_toggle_par", coverage.toggle_lines);
on_click(".button_next_chunk", coverage.to_next_chunk_nicely);
on_click(".button_prev_chunk", coverage.to_prev_chunk_nicely);
on_click(".button_top_of_page", coverage.to_top);
on_click(".button_first_chunk", coverage.to_first_chunk);
on_click(".button_prev_file", coverage.to_prev_file);
on_click(".button_next_file", coverage.to_next_file);
on_click(".button_to_index", coverage.to_index);
on_click(".button_show_hide_help", coverage.show_hide_help);
coverage.filters = undefined;
try {
coverage.filters = localStorage.getItem(coverage.LINE_FILTERS_STORAGE);
} catch(err) {}
if (coverage.filters) {
coverage.filters = JSON.parse(coverage.filters);
}
else {
coverage.filters = {run: false, exc: true, mis: true, par: true};
}
for (cls in coverage.filters) {
coverage.set_line_visibilty(cls, coverage.filters[cls]); // nosemgrep: eslint.detect-object-injection
}
coverage.assign_shortkeys();
coverage.init_scroll_markers();
coverage.wire_up_sticky_header();
document.querySelectorAll("[id^=ctxs]").forEach(
cbox => cbox.addEventListener("click", coverage.expand_contexts)
);
// Rebuild scroll markers when the window height changes.
window.addEventListener("resize", coverage.build_scroll_markers);
};
coverage.toggle_lines = function (event) {
const btn = event.target.closest("button");
const category = btn.value
const show = !btn.classList.contains("show_" + category);
coverage.set_line_visibilty(category, show);
coverage.build_scroll_markers();
coverage.filters[category] = show;
try {
localStorage.setItem(coverage.LINE_FILTERS_STORAGE, JSON.stringify(coverage.filters));
} catch(err) {}
};
coverage.set_line_visibilty = function (category, should_show) {
const cls = "show_" + category;
const btn = document.querySelector(".button_toggle_" + category);
if (btn) {
if (should_show) {
document.querySelectorAll("#source ." + category).forEach(e => e.classList.add(cls));
btn.classList.add(cls);
}
else {
document.querySelectorAll("#source ." + category).forEach(e => e.classList.remove(cls));
btn.classList.remove(cls);
}
}
};
// Return the nth line div.
coverage.line_elt = function (n) {
return document.getElementById("t" + n)?.closest("p");
};
// Set the selection. b and e are line numbers.
coverage.set_sel = function (b, e) {
// The first line selected.
coverage.sel_begin = b;
// The next line not selected.
coverage.sel_end = (e === undefined) ? b+1 : e;
};
coverage.to_top = function () {
coverage.set_sel(0, 1);
coverage.scroll_window(0);
};
coverage.to_first_chunk = function () {
coverage.set_sel(0, 1);
coverage.to_next_chunk();
};
coverage.to_prev_file = function () {
window.location = document.getElementById("prevFileLink").href;
}
coverage.to_next_file = function () {
window.location = document.getElementById("nextFileLink").href;
}
coverage.to_index = function () {
location.href = document.getElementById("indexLink").href;
}
coverage.show_hide_help = function () {
const helpCheck = document.getElementById("help_panel_state")
helpCheck.checked = !helpCheck.checked;
}
// Return a string indicating what kind of chunk this line belongs to,
// or null if not a chunk.
coverage.chunk_indicator = function (line_elt) {
const classes = line_elt?.className;
if (!classes) {
return null;
}
const match = classes.match(/\bshow_\w+\b/);
if (!match) {
return null;
}
return match[0];
};
coverage.to_next_chunk = function () {
const c = coverage;
// Find the start of the next colored chunk.
var probe = c.sel_end;
var chunk_indicator, probe_line;
while (true) {
probe_line = c.line_elt(probe);
if (!probe_line) {
return;
}
chunk_indicator = c.chunk_indicator(probe_line);
if (chunk_indicator) {
break;
}
probe++;
}
// There's a next chunk, `probe` points to it.
var begin = probe;
// Find the end of this chunk.
var next_indicator = chunk_indicator;
while (next_indicator === chunk_indicator) {
probe++;
probe_line = c.line_elt(probe);
next_indicator = c.chunk_indicator(probe_line);
}
c.set_sel(begin, probe);
c.show_selection();
};
coverage.to_prev_chunk = function () {
const c = coverage;
// Find the end of the prev colored chunk.
var probe = c.sel_begin-1;
var probe_line = c.line_elt(probe);
if (!probe_line) {
return;
}
var chunk_indicator = c.chunk_indicator(probe_line);
while (probe > 1 && !chunk_indicator) {
probe--;
probe_line = c.line_elt(probe);
if (!probe_line) {
return;
}
chunk_indicator = c.chunk_indicator(probe_line);
}
// There's a prev chunk, `probe` points to its last line.
var end = probe+1;
// Find the beginning of this chunk.
var prev_indicator = chunk_indicator;
while (prev_indicator === chunk_indicator) {
probe--;
if (probe <= 0) {
return;
}
probe_line = c.line_elt(probe);
prev_indicator = c.chunk_indicator(probe_line);
}
c.set_sel(probe+1, end);
c.show_selection();
};
// Returns 0, 1, or 2: how many of the two ends of the selection are on
// the screen right now?
coverage.selection_ends_on_screen = function () {
if (coverage.sel_begin === 0) {
return 0;
}
const begin = coverage.line_elt(coverage.sel_begin);
const end = coverage.line_elt(coverage.sel_end-1);
return (
(checkVisible(begin) ? 1 : 0)
+ (checkVisible(end) ? 1 : 0)
);
};
coverage.to_next_chunk_nicely = function () {
if (coverage.selection_ends_on_screen() === 0) {
// The selection is entirely off the screen:
// Set the top line on the screen as selection.
// This will select the top-left of the viewport
// As this is most likely the span with the line number we take the parent
const line = document.elementFromPoint(0, 0).parentElement;
if (line.parentElement !== document.getElementById("source")) {
// The element is not a source line but the header or similar
coverage.select_line_or_chunk(1);
} else {
// We extract the line number from the id
coverage.select_line_or_chunk(parseInt(line.id.substring(1), 10));
}
}
coverage.to_next_chunk();
};
coverage.to_prev_chunk_nicely = function () {
if (coverage.selection_ends_on_screen() === 0) {
// The selection is entirely off the screen:
// Set the lowest line on the screen as selection.
// This will select the bottom-left of the viewport
// As this is most likely the span with the line number we take the parent
const line = document.elementFromPoint(document.documentElement.clientHeight-1, 0).parentElement;
if (line.parentElement !== document.getElementById("source")) {
// The element is not a source line but the header or similar
coverage.select_line_or_chunk(coverage.lines_len);
} else {
// We extract the line number from the id
coverage.select_line_or_chunk(parseInt(line.id.substring(1), 10));
}
}
coverage.to_prev_chunk();
};
// Select line number lineno, or if it is in a colored chunk, select the
// entire chunk
coverage.select_line_or_chunk = function (lineno) {
var c = coverage;
var probe_line = c.line_elt(lineno);
if (!probe_line) {
return;
}
var the_indicator = c.chunk_indicator(probe_line);
if (the_indicator) {
// The line is in a highlighted chunk.
// Search backward for the first line.
var probe = lineno;
var indicator = the_indicator;
while (probe > 0 && indicator === the_indicator) {
probe--;
probe_line = c.line_elt(probe);
if (!probe_line) {
break;
}
indicator = c.chunk_indicator(probe_line);
}
var begin = probe + 1;
// Search forward for the last line.
probe = lineno;
indicator = the_indicator;
while (indicator === the_indicator) {
probe++;
probe_line = c.line_elt(probe);
indicator = c.chunk_indicator(probe_line);
}
coverage.set_sel(begin, probe);
}
else {
coverage.set_sel(lineno);
}
};
coverage.show_selection = function () {
// Highlight the lines in the chunk
document.querySelectorAll("#source .highlight").forEach(e => e.classList.remove("highlight"));
for (let probe = coverage.sel_begin; probe < coverage.sel_end; probe++) {
coverage.line_elt(probe).querySelector(".n").classList.add("highlight");
}
coverage.scroll_to_selection();
};
coverage.scroll_to_selection = function () {
// Scroll the page if the chunk isn't fully visible.
if (coverage.selection_ends_on_screen() < 2) {
const element = coverage.line_elt(coverage.sel_begin);
coverage.scroll_window(element.offsetTop - 60);
}
};
coverage.scroll_window = function (to_pos) {
window.scroll({top: to_pos, behavior: "smooth"});
};
coverage.init_scroll_markers = function () {
// Init some variables
coverage.lines_len = document.querySelectorAll("#source > p").length;
// Build html
coverage.build_scroll_markers();
};
coverage.build_scroll_markers = function () {
const temp_scroll_marker = document.getElementById("scroll_marker")
if (temp_scroll_marker) temp_scroll_marker.remove();
// Don't build markers if the window has no scroll bar.
if (document.body.scrollHeight <= window.innerHeight) {
return;
}
const marker_scale = window.innerHeight / document.body.scrollHeight;
const line_height = Math.min(Math.max(3, window.innerHeight / coverage.lines_len), 10);
let previous_line = -99, last_mark, last_top;
const scroll_marker = document.createElement("div");
scroll_marker.id = "scroll_marker";
document.getElementById("source").querySelectorAll(
"p.show_run, p.show_mis, p.show_exc, p.show_exc, p.show_par"
).forEach(element => {
const line_top = Math.floor(element.offsetTop * marker_scale);
const line_number = parseInt(element.querySelector(".n a").id.substr(1));
if (line_number === previous_line + 1) {
// If this solid missed block just make previous mark higher.
last_mark.style.height = `${line_top + line_height - last_top}px`;
} else {
// Add colored line in scroll_marker block.
last_mark = document.createElement("div");
last_mark.id = `m${line_number}`;
last_mark.classList.add("marker");
last_mark.style.height = `${line_height}px`;
last_mark.style.top = `${line_top}px`;
scroll_marker.append(last_mark);
last_top = line_top;
}
previous_line = line_number;
});
// Append last to prevent layout calculation
document.body.append(scroll_marker);
};
coverage.wire_up_sticky_header = function () {
const header = document.querySelector("header");
const header_bottom = (
header.querySelector(".content h2").getBoundingClientRect().top -
header.getBoundingClientRect().top
);
function updateHeader() {
if (window.scrollY > header_bottom) {
header.classList.add("sticky");
} else {
header.classList.remove("sticky");
}
}
window.addEventListener("scroll", updateHeader);
updateHeader();
};
coverage.expand_contexts = function (e) {
var ctxs = e.target.parentNode.querySelector(".ctxs");
if (!ctxs.classList.contains("expanded")) {
var ctxs_text = ctxs.textContent;
var width = Number(ctxs_text[0]);
ctxs.textContent = "";
for (var i = 1; i < ctxs_text.length; i += width) {
key = ctxs_text.substring(i, i + width).trim();
ctxs.appendChild(document.createTextNode(contexts[key]));
ctxs.appendChild(document.createElement("br"));
}
ctxs.classList.add("expanded");
}
};
document.addEventListener("DOMContentLoaded", () => {
if (document.body.classList.contains("indexfile")) {
coverage.index_ready();
} else {
coverage.pyfile_ready();
}
});

View File

@@ -1,249 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Coverage for cookbook/provider/dropbox.py: 28%</title>
<link rel="icon" sizes="32x32" href="favicon_32.png">
<link rel="stylesheet" href="style.css" type="text/css">
<script type="text/javascript" src="coverage_html.js" defer></script>
</head>
<body class="pyfile">
<header>
<div class="content">
<h1>
<span class="text">Coverage for </span><b>cookbook/provider/dropbox.py</b>:
<span class="pc_cov">28%</span>
</h1>
<aside id="help_panel_wrapper">
<input id="help_panel_state" type="checkbox">
<label for="help_panel_state">
<img id="keyboard_icon" src="keybd_closed.png" alt="Show/hide keyboard shortcuts" />
</label>
<div id="help_panel">
<p class="legend">Shortcuts on this page</p>
<div class="keyhelp">
<p>
<kbd>r</kbd>
<kbd>m</kbd>
<kbd>x</kbd>
&nbsp; toggle line displays
</p>
<p>
<kbd>j</kbd>
<kbd>k</kbd>
&nbsp; next/prev highlighted chunk
</p>
<p>
<kbd>0</kbd> &nbsp; (zero) top of page
</p>
<p>
<kbd>1</kbd> &nbsp; (one) first highlighted chunk
</p>
<p>
<kbd>[</kbd>
<kbd>]</kbd>
&nbsp; prev/next file
</p>
<p>
<kbd>u</kbd> &nbsp; up to the index
</p>
<p>
<kbd>?</kbd> &nbsp; show/hide this help
</p>
</div>
</div>
</aside>
<h2>
<span class="text">75 statements &nbsp;</span>
<button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">21<span class="text"> run</span></button>
<button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">54<span class="text"> missing</span></button>
<button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
</h2>
<p class="text">
<a id="prevFileLink" class="nav" href="d_a167ab5b5108d61e_models_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_0b5495cf37ee6c4f_local_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
<aside class="hidden">
<button type="button" class="button_next_chunk" data-shortcut="j"/>
<button type="button" class="button_prev_chunk" data-shortcut="k"/>
<button type="button" class="button_top_of_page" data-shortcut="0"/>
<button type="button" class="button_first_chunk" data-shortcut="1"/>
<button type="button" class="button_prev_file" data-shortcut="["/>
<button type="button" class="button_next_file" data-shortcut="]"/>
<button type="button" class="button_to_index" data-shortcut="u"/>
<button type="button" class="button_show_hide_help" data-shortcut="?"/>
</aside>
</div>
</header>
<main id="source">
<p class="run"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">io</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">import</span> <span class="nam">json</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">import</span> <span class="nam">os</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">from</span> <span class="nam">datetime</span> <span class="key">import</span> <span class="nam">datetime</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"><span class="key">import</span> <span class="nam">requests</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="key">import</span> <span class="nam">validators</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">models</span> <span class="key">import</span> <span class="nam">Recipe</span><span class="op">,</span> <span class="nam">RecipeImport</span><span class="op">,</span> <span class="nam">SyncLog</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">provider</span><span class="op">.</span><span class="nam">provider</span> <span class="key">import</span> <span class="nam">Provider</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"><span class="key">class</span> <span class="nam">Dropbox</span><span class="op">(</span><span class="nam">Provider</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"> <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"> <span class="key">def</span> <span class="nam">import_all</span><span class="op">(</span><span class="nam">monitor</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"> <span class="nam">url</span> <span class="op">=</span> <span class="str">"https://api.dropboxapi.com/2/files/list_folder"</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"> <span class="nam">headers</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"> <span class="str">"Authorization"</span><span class="op">:</span> <span class="str">"Bearer "</span> <span class="op">+</span> <span class="nam">monitor</span><span class="op">.</span><span class="nam">storage</span><span class="op">.</span><span class="nam">token</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"> <span class="str">"Content-Type"</span><span class="op">:</span> <span class="str">"application/json"</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"> <span class="nam">data</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"> <span class="str">"path"</span><span class="op">:</span> <span class="nam">monitor</span><span class="op">.</span><span class="nam">path</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"> <span class="nam">r</span> <span class="op">=</span> <span class="nam">requests</span><span class="op">.</span><span class="nam">post</span><span class="op">(</span><span class="nam">url</span><span class="op">,</span> <span class="nam">headers</span><span class="op">=</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">data</span><span class="op">=</span><span class="nam">json</span><span class="op">.</span><span class="nam">dumps</span><span class="op">(</span><span class="nam">data</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"> <span class="nam">recipes</span> <span class="op">=</span> <span class="nam">r</span><span class="op">.</span><span class="nam">json</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"> <span class="key">except</span> <span class="nam">ValueError</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"> <span class="nam">log_entry</span> <span class="op">=</span> <span class="nam">SyncLog</span><span class="op">(</span><span class="nam">status</span><span class="op">=</span><span class="str">'ERROR'</span><span class="op">,</span> <span class="nam">msg</span><span class="op">=</span><span class="nam">str</span><span class="op">(</span><span class="nam">r</span><span class="op">)</span><span class="op">,</span> <span class="nam">sync</span><span class="op">=</span><span class="nam">monitor</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"> <span class="nam">log_entry</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"> <span class="key">return</span> <span class="nam">r</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"> <span class="nam">import_count</span> <span class="op">=</span> <span class="num">0</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="com"># TODO check if has_more is set and import that as well</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"> <span class="key">for</span> <span class="nam">recipe</span> <span class="key">in</span> <span class="nam">recipes</span><span class="op">[</span><span class="str">'entries'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"> <span class="nam">path</span> <span class="op">=</span> <span class="nam">recipe</span><span class="op">[</span><span class="str">'path_lower'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">Recipe</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">filter</span><span class="op">(</span><span class="nam">file_path__iexact</span><span class="op">=</span><span class="nam">path</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">monitor</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span><span class="op">.</span><span class="nam">exists</span><span class="op">(</span><span class="op">)</span> <span class="key">and</span> <span class="key">not</span> <span class="nam">RecipeImport</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">filter</span><span class="op">(</span><span class="nam">file_path</span><span class="op">=</span><span class="nam">path</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">monitor</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span><span class="op">.</span><span class="nam">exists</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="nam">name</span> <span class="op">=</span> <span class="nam">os</span><span class="op">.</span><span class="nam">path</span><span class="op">.</span><span class="nam">splitext</span><span class="op">(</span><span class="nam">recipe</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span><span class="op">)</span><span class="op">[</span><span class="num">0</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"> <span class="nam">new_recipe</span> <span class="op">=</span> <span class="nam">RecipeImport</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"> <span class="nam">name</span><span class="op">=</span><span class="nam">name</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="nam">file_path</span><span class="op">=</span><span class="nam">path</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="nam">storage</span><span class="op">=</span><span class="nam">monitor</span><span class="op">.</span><span class="nam">storage</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="nam">file_uid</span><span class="op">=</span><span class="nam">recipe</span><span class="op">[</span><span class="str">'id'</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"> <span class="nam">space</span><span class="op">=</span><span class="nam">monitor</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="nam">new_recipe</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="nam">import_count</span> <span class="op">+=</span> <span class="num">1</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"> <span class="nam">log_entry</span> <span class="op">=</span> <span class="nam">SyncLog</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"> <span class="nam">status</span><span class="op">=</span><span class="str">'SUCCESS'</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="nam">msg</span><span class="op">=</span><span class="str">'Imported '</span> <span class="op">+</span> <span class="nam">str</span><span class="op">(</span><span class="nam">import_count</span><span class="op">)</span> <span class="op">+</span> <span class="str">' recipes'</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"> <span class="nam">sync</span><span class="op">=</span><span class="nam">monitor</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"> <span class="nam">log_entry</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="nam">monitor</span><span class="op">.</span><span class="nam">last_checked</span> <span class="op">=</span> <span class="nam">datetime</span><span class="op">.</span><span class="nam">now</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"> <span class="nam">monitor</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"> <span class="key">return</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"> <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"> <span class="key">def</span> <span class="nam">create_share_link</span><span class="op">(</span><span class="nam">recipe</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"> <span class="nam">url</span> <span class="op">=</span> <span class="str">"https://api.dropboxapi.com/2/sharing/create_shared_link_with_settings"</span> <span class="com"># noqa: E501</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"> <span class="nam">headers</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"> <span class="str">"Authorization"</span><span class="op">:</span> <span class="str">"Bearer "</span> <span class="op">+</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">storage</span><span class="op">.</span><span class="nam">token</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> <span class="str">"Content-Type"</span><span class="op">:</span> <span class="str">"application/json"</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"> <span class="nam">data</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"> <span class="str">"path"</span><span class="op">:</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">file_uid</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"> <span class="nam">r</span> <span class="op">=</span> <span class="nam">requests</span><span class="op">.</span><span class="nam">post</span><span class="op">(</span><span class="nam">url</span><span class="op">,</span> <span class="nam">headers</span><span class="op">=</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">data</span><span class="op">=</span><span class="nam">json</span><span class="op">.</span><span class="nam">dumps</span><span class="op">(</span><span class="nam">data</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"> <span class="key">return</span> <span class="nam">r</span><span class="op">.</span><span class="nam">json</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t"> <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_share_link</span><span class="op">(</span><span class="nam">recipe</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"> <span class="nam">url</span> <span class="op">=</span> <span class="str">"https://api.dropboxapi.com/2/sharing/list_shared_links"</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"> <span class="nam">headers</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t"> <span class="str">"Authorization"</span><span class="op">:</span> <span class="str">"Bearer "</span> <span class="op">+</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">storage</span><span class="op">.</span><span class="nam">token</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t"> <span class="str">"Content-Type"</span><span class="op">:</span> <span class="str">"application/json"</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t"> <span class="nam">data</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t"> <span class="str">"path"</span><span class="op">:</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">file_path</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t"> <span class="nam">r</span> <span class="op">=</span> <span class="nam">requests</span><span class="op">.</span><span class="nam">post</span><span class="op">(</span><span class="nam">url</span><span class="op">,</span> <span class="nam">headers</span><span class="op">=</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">data</span><span class="op">=</span><span class="nam">json</span><span class="op">.</span><span class="nam">dumps</span><span class="op">(</span><span class="nam">data</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t"> <span class="nam">p</span> <span class="op">=</span> <span class="nam">r</span><span class="op">.</span><span class="nam">json</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t"> <span class="key">for</span> <span class="nam">link</span> <span class="key">in</span> <span class="nam">p</span><span class="op">[</span><span class="str">'links'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t"> <span class="key">return</span> <span class="nam">link</span><span class="op">[</span><span class="str">'url'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t"> <span class="nam">response</span> <span class="op">=</span> <span class="nam">Dropbox</span><span class="op">.</span><span class="nam">create_share_link</span><span class="op">(</span><span class="nam">recipe</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t"> <span class="key">return</span> <span class="nam">response</span><span class="op">[</span><span class="str">'url'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t"> <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_file</span><span class="op">(</span><span class="nam">recipe</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">link</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">link</span> <span class="op">=</span> <span class="nam">Dropbox</span><span class="op">.</span><span class="nam">get_share_link</span><span class="op">(</span><span class="nam">recipe</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t"> <span class="nam">url</span> <span class="op">=</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">link</span><span class="op">.</span><span class="nam">replace</span><span class="op">(</span><span class="str">'www.dropbox.'</span><span class="op">,</span> <span class="str">'dl.dropboxusercontent.'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t"> <span class="key">if</span> <span class="nam">validators</span><span class="op">.</span><span class="nam">url</span><span class="op">(</span><span class="nam">url</span><span class="op">,</span> <span class="nam">public</span><span class="op">=</span><span class="key">True</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t"> <span class="nam">response</span> <span class="op">=</span> <span class="nam">requests</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">url</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t113" href="#t113">113</a></span><span class="t"> <span class="key">return</span> <span class="nam">io</span><span class="op">.</span><span class="nam">BytesIO</span><span class="op">(</span><span class="nam">response</span><span class="op">.</span><span class="nam">content</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t114" href="#t114">114</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t115" href="#t115">115</a></span><span class="t"> <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t116" href="#t116">116</a></span><span class="t"> <span class="key">def</span> <span class="nam">rename_file</span><span class="op">(</span><span class="nam">recipe</span><span class="op">,</span> <span class="nam">new_name</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t117" href="#t117">117</a></span><span class="t"> <span class="nam">url</span> <span class="op">=</span> <span class="str">"https://api.dropboxapi.com/2/files/move_v2"</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t118" href="#t118">118</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t119" href="#t119">119</a></span><span class="t"> <span class="nam">headers</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t120" href="#t120">120</a></span><span class="t"> <span class="str">"Authorization"</span><span class="op">:</span> <span class="str">"Bearer "</span> <span class="op">+</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">storage</span><span class="op">.</span><span class="nam">token</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t121" href="#t121">121</a></span><span class="t"> <span class="str">"Content-Type"</span><span class="op">:</span> <span class="str">"application/json"</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t122" href="#t122">122</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t123" href="#t123">123</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t124" href="#t124">124</a></span><span class="t"> <span class="nam">data</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t125" href="#t125">125</a></span><span class="t"> <span class="str">"from_path"</span><span class="op">:</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">file_path</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t126" href="#t126">126</a></span><span class="t"> <span class="str">"to_path"</span><span class="op">:</span> <span class="str">"%s/%s%s"</span> <span class="op">%</span> <span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t127" href="#t127">127</a></span><span class="t"> <span class="nam">os</span><span class="op">.</span><span class="nam">path</span><span class="op">.</span><span class="nam">dirname</span><span class="op">(</span><span class="nam">recipe</span><span class="op">.</span><span class="nam">file_path</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t128" href="#t128">128</a></span><span class="t"> <span class="nam">new_name</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t129" href="#t129">129</a></span><span class="t"> <span class="nam">os</span><span class="op">.</span><span class="nam">path</span><span class="op">.</span><span class="nam">splitext</span><span class="op">(</span><span class="nam">recipe</span><span class="op">.</span><span class="nam">file_path</span><span class="op">)</span><span class="op">[</span><span class="num">1</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t130" href="#t130">130</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t131" href="#t131">131</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t132" href="#t132">132</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t133" href="#t133">133</a></span><span class="t"> <span class="nam">r</span> <span class="op">=</span> <span class="nam">requests</span><span class="op">.</span><span class="nam">post</span><span class="op">(</span><span class="nam">url</span><span class="op">,</span> <span class="nam">headers</span><span class="op">=</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">data</span><span class="op">=</span><span class="nam">json</span><span class="op">.</span><span class="nam">dumps</span><span class="op">(</span><span class="nam">data</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t134" href="#t134">134</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t135" href="#t135">135</a></span><span class="t"> <span class="key">return</span> <span class="nam">r</span><span class="op">.</span><span class="nam">json</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t136" href="#t136">136</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t137" href="#t137">137</a></span><span class="t"> <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t138" href="#t138">138</a></span><span class="t"> <span class="key">def</span> <span class="nam">delete_file</span><span class="op">(</span><span class="nam">recipe</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t139" href="#t139">139</a></span><span class="t"> <span class="nam">url</span> <span class="op">=</span> <span class="str">"https://api.dropboxapi.com/2/files/delete_v2"</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t140" href="#t140">140</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t141" href="#t141">141</a></span><span class="t"> <span class="nam">headers</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t142" href="#t142">142</a></span><span class="t"> <span class="str">"Authorization"</span><span class="op">:</span> <span class="str">"Bearer "</span> <span class="op">+</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">storage</span><span class="op">.</span><span class="nam">token</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t143" href="#t143">143</a></span><span class="t"> <span class="str">"Content-Type"</span><span class="op">:</span> <span class="str">"application/json"</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t144" href="#t144">144</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t145" href="#t145">145</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t146" href="#t146">146</a></span><span class="t"> <span class="nam">data</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t147" href="#t147">147</a></span><span class="t"> <span class="str">"path"</span><span class="op">:</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">file_path</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t148" href="#t148">148</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t149" href="#t149">149</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t150" href="#t150">150</a></span><span class="t"> <span class="nam">r</span> <span class="op">=</span> <span class="nam">requests</span><span class="op">.</span><span class="nam">post</span><span class="op">(</span><span class="nam">url</span><span class="op">,</span> <span class="nam">headers</span><span class="op">=</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">data</span><span class="op">=</span><span class="nam">json</span><span class="op">.</span><span class="nam">dumps</span><span class="op">(</span><span class="nam">data</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t151" href="#t151">151</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t152" href="#t152">152</a></span><span class="t"> <span class="key">return</span> <span class="nam">r</span><span class="op">.</span><span class="nam">json</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
</main>
<footer>
<div class="content">
<p>
<a id="prevFileLink" class="nav" href="d_a167ab5b5108d61e_models_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_0b5495cf37ee6c4f_local_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
</div>
</footer>
</body>
</html>

View File

@@ -1,155 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Coverage for cookbook/provider/local.py: 44%</title>
<link rel="icon" sizes="32x32" href="favicon_32.png">
<link rel="stylesheet" href="style.css" type="text/css">
<script type="text/javascript" src="coverage_html.js" defer></script>
</head>
<body class="pyfile">
<header>
<div class="content">
<h1>
<span class="text">Coverage for </span><b>cookbook/provider/local.py</b>:
<span class="pc_cov">44%</span>
</h1>
<aside id="help_panel_wrapper">
<input id="help_panel_state" type="checkbox">
<label for="help_panel_state">
<img id="keyboard_icon" src="keybd_closed.png" alt="Show/hide keyboard shortcuts" />
</label>
<div id="help_panel">
<p class="legend">Shortcuts on this page</p>
<div class="keyhelp">
<p>
<kbd>r</kbd>
<kbd>m</kbd>
<kbd>x</kbd>
&nbsp; toggle line displays
</p>
<p>
<kbd>j</kbd>
<kbd>k</kbd>
&nbsp; next/prev highlighted chunk
</p>
<p>
<kbd>0</kbd> &nbsp; (zero) top of page
</p>
<p>
<kbd>1</kbd> &nbsp; (one) first highlighted chunk
</p>
<p>
<kbd>[</kbd>
<kbd>]</kbd>
&nbsp; prev/next file
</p>
<p>
<kbd>u</kbd> &nbsp; up to the index
</p>
<p>
<kbd>?</kbd> &nbsp; show/hide this help
</p>
</div>
</div>
</aside>
<h2>
<span class="text">36 statements &nbsp;</span>
<button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">16<span class="text"> run</span></button>
<button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">20<span class="text"> missing</span></button>
<button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
</h2>
<p class="text">
<a id="prevFileLink" class="nav" href="d_0b5495cf37ee6c4f_dropbox_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_0b5495cf37ee6c4f_nextcloud_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
<aside class="hidden">
<button type="button" class="button_next_chunk" data-shortcut="j"/>
<button type="button" class="button_prev_chunk" data-shortcut="k"/>
<button type="button" class="button_top_of_page" data-shortcut="0"/>
<button type="button" class="button_first_chunk" data-shortcut="1"/>
<button type="button" class="button_prev_file" data-shortcut="["/>
<button type="button" class="button_next_file" data-shortcut="]"/>
<button type="button" class="button_to_index" data-shortcut="u"/>
<button type="button" class="button_show_hide_help" data-shortcut="?"/>
</aside>
</div>
</header>
<main id="source">
<p class="run"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">io</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">import</span> <span class="nam">os</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">from</span> <span class="nam">datetime</span> <span class="key">import</span> <span class="nam">datetime</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">from</span> <span class="nam">os</span> <span class="key">import</span> <span class="nam">listdir</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">from</span> <span class="nam">os</span><span class="op">.</span><span class="nam">path</span> <span class="key">import</span> <span class="nam">isfile</span><span class="op">,</span> <span class="nam">join</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">models</span> <span class="key">import</span> <span class="nam">Recipe</span><span class="op">,</span> <span class="nam">RecipeImport</span><span class="op">,</span> <span class="nam">SyncLog</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">provider</span><span class="op">.</span><span class="nam">provider</span> <span class="key">import</span> <span class="nam">Provider</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="key">class</span> <span class="nam">Local</span><span class="op">(</span><span class="nam">Provider</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"> <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"> <span class="key">def</span> <span class="nam">import_all</span><span class="op">(</span><span class="nam">monitor</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"> <span class="nam">files</span> <span class="op">=</span> <span class="op">[</span><span class="nam">f</span> <span class="key">for</span> <span class="nam">f</span> <span class="key">in</span> <span class="nam">listdir</span><span class="op">(</span><span class="nam">monitor</span><span class="op">.</span><span class="nam">path</span><span class="op">)</span> <span class="key">if</span> <span class="nam">isfile</span><span class="op">(</span><span class="nam">join</span><span class="op">(</span><span class="nam">monitor</span><span class="op">.</span><span class="nam">path</span><span class="op">,</span> <span class="nam">f</span><span class="op">)</span><span class="op">)</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"> <span class="nam">import_count</span> <span class="op">=</span> <span class="num">0</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"> <span class="key">for</span> <span class="nam">file</span> <span class="key">in</span> <span class="nam">files</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"> <span class="nam">path</span> <span class="op">=</span> <span class="nam">monitor</span><span class="op">.</span><span class="nam">path</span> <span class="op">+</span> <span class="str">'/'</span> <span class="op">+</span> <span class="nam">file</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">Recipe</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">filter</span><span class="op">(</span><span class="nam">file_path__iexact</span><span class="op">=</span><span class="nam">path</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">monitor</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span><span class="op">.</span><span class="nam">exists</span><span class="op">(</span><span class="op">)</span> <span class="key">and</span> <span class="key">not</span> <span class="nam">RecipeImport</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">filter</span><span class="op">(</span><span class="nam">file_path</span><span class="op">=</span><span class="nam">path</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">monitor</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span><span class="op">.</span><span class="nam">exists</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"> <span class="nam">name</span> <span class="op">=</span> <span class="nam">os</span><span class="op">.</span><span class="nam">path</span><span class="op">.</span><span class="nam">splitext</span><span class="op">(</span><span class="nam">file</span><span class="op">)</span><span class="op">[</span><span class="num">0</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"> <span class="nam">new_recipe</span> <span class="op">=</span> <span class="nam">RecipeImport</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"> <span class="nam">name</span><span class="op">=</span><span class="nam">name</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"> <span class="nam">file_path</span><span class="op">=</span><span class="nam">path</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"> <span class="nam">storage</span><span class="op">=</span><span class="nam">monitor</span><span class="op">.</span><span class="nam">storage</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"> <span class="nam">space</span><span class="op">=</span><span class="nam">monitor</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"> <span class="nam">new_recipe</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"> <span class="nam">import_count</span> <span class="op">+=</span> <span class="num">1</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"> <span class="nam">log_entry</span> <span class="op">=</span> <span class="nam">SyncLog</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"> <span class="nam">status</span><span class="op">=</span><span class="str">'SUCCESS'</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"> <span class="nam">msg</span><span class="op">=</span><span class="str">'Imported '</span> <span class="op">+</span> <span class="nam">str</span><span class="op">(</span><span class="nam">import_count</span><span class="op">)</span> <span class="op">+</span> <span class="str">' recipes'</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"> <span class="nam">sync</span><span class="op">=</span><span class="nam">monitor</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"> <span class="nam">log_entry</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"> <span class="nam">monitor</span><span class="op">.</span><span class="nam">last_checked</span> <span class="op">=</span> <span class="nam">datetime</span><span class="op">.</span><span class="nam">now</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"> <span class="nam">monitor</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="key">return</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"> <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_file</span><span class="op">(</span><span class="nam">recipe</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="nam">file</span> <span class="op">=</span> <span class="nam">io</span><span class="op">.</span><span class="nam">BytesIO</span><span class="op">(</span><span class="nam">open</span><span class="op">(</span><span class="nam">recipe</span><span class="op">.</span><span class="nam">file_path</span><span class="op">,</span> <span class="str">'rb'</span><span class="op">)</span><span class="op">.</span><span class="nam">read</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"> <span class="key">return</span> <span class="nam">file</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="key">def</span> <span class="nam">rename_file</span><span class="op">(</span><span class="nam">recipe</span><span class="op">,</span> <span class="nam">new_name</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"> <span class="nam">os</span><span class="op">.</span><span class="nam">rename</span><span class="op">(</span><span class="nam">recipe</span><span class="op">.</span><span class="nam">file_path</span><span class="op">,</span> <span class="nam">os</span><span class="op">.</span><span class="nam">path</span><span class="op">.</span><span class="nam">join</span><span class="op">(</span><span class="nam">os</span><span class="op">.</span><span class="nam">path</span><span class="op">.</span><span class="nam">dirname</span><span class="op">(</span><span class="nam">recipe</span><span class="op">.</span><span class="nam">file_path</span><span class="op">)</span><span class="op">,</span> <span class="op">(</span><span class="nam">new_name</span> <span class="op">+</span> <span class="nam">os</span><span class="op">.</span><span class="nam">path</span><span class="op">.</span><span class="nam">splitext</span><span class="op">(</span><span class="nam">recipe</span><span class="op">.</span><span class="nam">file_path</span><span class="op">)</span><span class="op">[</span><span class="num">1</span><span class="op">]</span><span class="op">)</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"> <span class="key">return</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"> <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="key">def</span> <span class="nam">delete_file</span><span class="op">(</span><span class="nam">recipe</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"> <span class="nam">os</span><span class="op">.</span><span class="nam">remove</span><span class="op">(</span><span class="nam">recipe</span><span class="op">.</span><span class="nam">file_path</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"> <span class="key">return</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
</main>
<footer>
<div class="content">
<p>
<a id="prevFileLink" class="nav" href="d_0b5495cf37ee6c4f_dropbox_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_0b5495cf37ee6c4f_nextcloud_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
</div>
</footer>
</body>
</html>

View File

@@ -1,246 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Coverage for cookbook/provider/nextcloud.py: 33%</title>
<link rel="icon" sizes="32x32" href="favicon_32.png">
<link rel="stylesheet" href="style.css" type="text/css">
<script type="text/javascript" src="coverage_html.js" defer></script>
</head>
<body class="pyfile">
<header>
<div class="content">
<h1>
<span class="text">Coverage for </span><b>cookbook/provider/nextcloud.py</b>:
<span class="pc_cov">33%</span>
</h1>
<aside id="help_panel_wrapper">
<input id="help_panel_state" type="checkbox">
<label for="help_panel_state">
<img id="keyboard_icon" src="keybd_closed.png" alt="Show/hide keyboard shortcuts" />
</label>
<div id="help_panel">
<p class="legend">Shortcuts on this page</p>
<div class="keyhelp">
<p>
<kbd>r</kbd>
<kbd>m</kbd>
<kbd>x</kbd>
&nbsp; toggle line displays
</p>
<p>
<kbd>j</kbd>
<kbd>k</kbd>
&nbsp; next/prev highlighted chunk
</p>
<p>
<kbd>0</kbd> &nbsp; (zero) top of page
</p>
<p>
<kbd>1</kbd> &nbsp; (one) first highlighted chunk
</p>
<p>
<kbd>[</kbd>
<kbd>]</kbd>
&nbsp; prev/next file
</p>
<p>
<kbd>u</kbd> &nbsp; up to the index
</p>
<p>
<kbd>?</kbd> &nbsp; show/hide this help
</p>
</div>
</div>
</aside>
<h2>
<span class="text">78 statements &nbsp;</span>
<button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">26<span class="text"> run</span></button>
<button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">52<span class="text"> missing</span></button>
<button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
</h2>
<p class="text">
<a id="prevFileLink" class="nav" href="d_0b5495cf37ee6c4f_local_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_0b5495cf37ee6c4f_provider_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
<aside class="hidden">
<button type="button" class="button_next_chunk" data-shortcut="j"/>
<button type="button" class="button_prev_chunk" data-shortcut="k"/>
<button type="button" class="button_top_of_page" data-shortcut="0"/>
<button type="button" class="button_first_chunk" data-shortcut="1"/>
<button type="button" class="button_prev_file" data-shortcut="["/>
<button type="button" class="button_next_file" data-shortcut="]"/>
<button type="button" class="button_to_index" data-shortcut="u"/>
<button type="button" class="button_show_hide_help" data-shortcut="?"/>
</aside>
</div>
</header>
<main id="source">
<p class="run"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">io</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">import</span> <span class="nam">os</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">import</span> <span class="nam">tempfile</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">from</span> <span class="nam">datetime</span> <span class="key">import</span> <span class="nam">datetime</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"><span class="key">import</span> <span class="nam">requests</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="key">import</span> <span class="nam">validators</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="key">import</span> <span class="nam">webdav3</span><span class="op">.</span><span class="nam">client</span> <span class="key">as</span> <span class="nam">wc</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">models</span> <span class="key">import</span> <span class="nam">Recipe</span><span class="op">,</span> <span class="nam">RecipeImport</span><span class="op">,</span> <span class="nam">SyncLog</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">provider</span><span class="op">.</span><span class="nam">provider</span> <span class="key">import</span> <span class="nam">Provider</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="key">from</span> <span class="nam">requests</span><span class="op">.</span><span class="nam">auth</span> <span class="key">import</span> <span class="nam">HTTPBasicAuth</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"><span class="key">from</span> <span class="nam">recipes</span><span class="op">.</span><span class="nam">settings</span> <span class="key">import</span> <span class="nam">DEBUG</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"><span class="key">class</span> <span class="nam">Nextcloud</span><span class="op">(</span><span class="nam">Provider</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"> <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_client</span><span class="op">(</span><span class="nam">storage</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"> <span class="nam">options</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"> <span class="str">'webdav_hostname'</span><span class="op">:</span> <span class="nam">storage</span><span class="op">.</span><span class="nam">url</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"> <span class="str">'webdav_login'</span><span class="op">:</span> <span class="nam">storage</span><span class="op">.</span><span class="nam">username</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"> <span class="str">'webdav_password'</span><span class="op">:</span> <span class="nam">storage</span><span class="op">.</span><span class="nam">password</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"> <span class="str">'webdav_root'</span><span class="op">:</span> <span class="str">'/remote.php/dav/files/'</span> <span class="op">+</span> <span class="nam">storage</span><span class="op">.</span><span class="nam">username</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"> <span class="key">if</span> <span class="nam">storage</span><span class="op">.</span><span class="nam">path</span> <span class="op">!=</span> <span class="str">''</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"> <span class="nam">options</span><span class="op">[</span><span class="str">'webdav_root'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">storage</span><span class="op">.</span><span class="nam">path</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"> <span class="key">return</span> <span class="nam">wc</span><span class="op">.</span><span class="nam">Client</span><span class="op">(</span><span class="nam">options</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"> <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"> <span class="key">def</span> <span class="nam">import_all</span><span class="op">(</span><span class="nam">monitor</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"> <span class="nam">client</span> <span class="op">=</span> <span class="nam">Nextcloud</span><span class="op">.</span><span class="nam">get_client</span><span class="op">(</span><span class="nam">monitor</span><span class="op">.</span><span class="nam">storage</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"> <span class="key">if</span> <span class="nam">DEBUG</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="str">f'TANDOOR_PROVIDER_DEBUG checking path {monitor.path} with client {client}'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="nam">files</span> <span class="op">=</span> <span class="nam">client</span><span class="op">.</span><span class="nam">list</span><span class="op">(</span><span class="nam">monitor</span><span class="op">.</span><span class="nam">path</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"> <span class="key">if</span> <span class="nam">DEBUG</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="str">f'TANDOOR_PROVIDER_DEBUG file list {files}'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"> <span class="nam">import_count</span> <span class="op">=</span> <span class="num">0</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"> <span class="key">for</span> <span class="nam">file</span> <span class="key">in</span> <span class="nam">files</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="key">if</span> <span class="nam">DEBUG</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="str">f'TANDOOR_PROVIDER_DEBUG importing file {file}'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="nam">path</span> <span class="op">=</span> <span class="nam">monitor</span><span class="op">.</span><span class="nam">path</span> <span class="op">+</span> <span class="str">'/'</span> <span class="op">+</span> <span class="nam">file</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">Recipe</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">filter</span><span class="op">(</span><span class="nam">file_path__iexact</span><span class="op">=</span><span class="nam">path</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">monitor</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span><span class="op">.</span><span class="nam">exists</span><span class="op">(</span><span class="op">)</span> <span class="key">and</span> <span class="key">not</span> <span class="nam">RecipeImport</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">filter</span><span class="op">(</span><span class="nam">file_path</span><span class="op">=</span><span class="nam">path</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">monitor</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span><span class="op">.</span><span class="nam">exists</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="nam">name</span> <span class="op">=</span> <span class="nam">os</span><span class="op">.</span><span class="nam">path</span><span class="op">.</span><span class="nam">splitext</span><span class="op">(</span><span class="nam">file</span><span class="op">)</span><span class="op">[</span><span class="num">0</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="nam">new_recipe</span> <span class="op">=</span> <span class="nam">RecipeImport</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="nam">name</span><span class="op">=</span><span class="nam">name</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"> <span class="nam">file_path</span><span class="op">=</span><span class="nam">path</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"> <span class="nam">storage</span><span class="op">=</span><span class="nam">monitor</span><span class="op">.</span><span class="nam">storage</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"> <span class="nam">space</span><span class="op">=</span><span class="nam">monitor</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"> <span class="nam">new_recipe</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="nam">import_count</span> <span class="op">+=</span> <span class="num">1</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"> <span class="nam">log_entry</span> <span class="op">=</span> <span class="nam">SyncLog</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="nam">status</span><span class="op">=</span><span class="str">'SUCCESS'</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"> <span class="nam">msg</span><span class="op">=</span><span class="str">'Imported '</span> <span class="op">+</span> <span class="nam">str</span><span class="op">(</span><span class="nam">import_count</span><span class="op">)</span> <span class="op">+</span> <span class="str">' recipes'</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"> <span class="nam">sync</span><span class="op">=</span><span class="nam">monitor</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="nam">log_entry</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"> <span class="nam">monitor</span><span class="op">.</span><span class="nam">last_checked</span> <span class="op">=</span> <span class="nam">datetime</span><span class="op">.</span><span class="nam">now</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"> <span class="nam">monitor</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"> <span class="key">return</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"> <span class="key">def</span> <span class="nam">create_share_link</span><span class="op">(</span><span class="nam">recipe</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="nam">url</span> <span class="op">=</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">storage</span><span class="op">.</span><span class="nam">url</span> <span class="op">+</span> <span class="str">'/ocs/v2.php/apps/files_sharing/api/v1/shares?format=json'</span> <span class="com"># noqa: E501</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"> <span class="nam">headers</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t"> <span class="str">"OCS-APIRequest"</span><span class="op">:</span> <span class="str">"true"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t"> <span class="str">"Content-Type"</span><span class="op">:</span> <span class="str">"application/x-www-form-urlencoded"</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"> <span class="nam">data</span> <span class="op">=</span> <span class="op">{</span><span class="str">'path'</span><span class="op">:</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">file_path</span><span class="op">,</span> <span class="str">'shareType'</span><span class="op">:</span> <span class="num">3</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t"> <span class="nam">r</span> <span class="op">=</span> <span class="nam">requests</span><span class="op">.</span><span class="nam">post</span><span class="op">(</span><span class="nam">url</span><span class="op">,</span> <span class="nam">headers</span><span class="op">=</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">auth</span><span class="op">=</span><span class="nam">HTTPBasicAuth</span><span class="op">(</span><span class="nam">recipe</span><span class="op">.</span><span class="nam">storage</span><span class="op">.</span><span class="nam">username</span><span class="op">,</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">storage</span><span class="op">.</span><span class="nam">password</span><span class="op">)</span><span class="op">,</span> <span class="nam">data</span><span class="op">=</span><span class="nam">data</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"> <span class="nam">response_json</span> <span class="op">=</span> <span class="nam">r</span><span class="op">.</span><span class="nam">json</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"> <span class="key">return</span> <span class="nam">response_json</span><span class="op">[</span><span class="str">'ocs'</span><span class="op">]</span><span class="op">[</span><span class="str">'data'</span><span class="op">]</span><span class="op">[</span><span class="str">'url'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t"> <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_share_link</span><span class="op">(</span><span class="nam">recipe</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t"> <span class="nam">url</span> <span class="op">=</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">storage</span><span class="op">.</span><span class="nam">url</span> <span class="op">+</span> <span class="str">'/ocs/v2.php/apps/files_sharing/api/v1/shares?format=json&amp;path='</span> <span class="op">+</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">file_path</span> <span class="com"># noqa: E501</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t"> <span class="nam">headers</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t"> <span class="str">"OCS-APIRequest"</span><span class="op">:</span> <span class="str">"true"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t"> <span class="str">"Content-Type"</span><span class="op">:</span> <span class="str">"application/json"</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t"> <span class="key">if</span> <span class="nam">validators</span><span class="op">.</span><span class="nam">url</span><span class="op">(</span><span class="nam">url</span><span class="op">,</span> <span class="nam">public</span><span class="op">=</span><span class="key">True</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t"> <span class="nam">r</span> <span class="op">=</span> <span class="nam">requests</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t"> <span class="nam">url</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t"> <span class="nam">headers</span><span class="op">=</span><span class="nam">headers</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t"> <span class="nam">auth</span><span class="op">=</span><span class="nam">HTTPBasicAuth</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">storage</span><span class="op">.</span><span class="nam">username</span><span class="op">,</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">storage</span><span class="op">.</span><span class="nam">password</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t"> <span class="nam">response_json</span> <span class="op">=</span> <span class="nam">r</span><span class="op">.</span><span class="nam">json</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t"> <span class="key">for</span> <span class="nam">element</span> <span class="key">in</span> <span class="nam">response_json</span><span class="op">[</span><span class="str">'ocs'</span><span class="op">]</span><span class="op">[</span><span class="str">'data'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"> <span class="key">if</span> <span class="nam">element</span><span class="op">[</span><span class="str">'share_type'</span><span class="op">]</span> <span class="op">==</span> <span class="str">'3'</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t"> <span class="key">return</span> <span class="nam">element</span><span class="op">[</span><span class="str">'url'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t"> <span class="key">return</span> <span class="nam">Nextcloud</span><span class="op">.</span><span class="nam">create_share_link</span><span class="op">(</span><span class="nam">recipe</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t"> <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t113" href="#t113">113</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_file</span><span class="op">(</span><span class="nam">recipe</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t114" href="#t114">114</a></span><span class="t"> <span class="nam">client</span> <span class="op">=</span> <span class="nam">Nextcloud</span><span class="op">.</span><span class="nam">get_client</span><span class="op">(</span><span class="nam">recipe</span><span class="op">.</span><span class="nam">storage</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t115" href="#t115">115</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t116" href="#t116">116</a></span><span class="t"> <span class="nam">tmp_file_path</span> <span class="op">=</span> <span class="nam">tempfile</span><span class="op">.</span><span class="nam">gettempdir</span><span class="op">(</span><span class="op">)</span> <span class="op">+</span> <span class="str">'/'</span> <span class="op">+</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">name</span> <span class="op">+</span> <span class="str">'.pdf'</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t117" href="#t117">117</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t118" href="#t118">118</a></span><span class="t"> <span class="nam">client</span><span class="op">.</span><span class="nam">download_file</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t119" href="#t119">119</a></span><span class="t"> <span class="nam">remote_path</span><span class="op">=</span><span class="nam">recipe</span><span class="op">.</span><span class="nam">file_path</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t120" href="#t120">120</a></span><span class="t"> <span class="nam">local_path</span><span class="op">=</span><span class="nam">tmp_file_path</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t121" href="#t121">121</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t122" href="#t122">122</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t123" href="#t123">123</a></span><span class="t"> <span class="nam">file</span> <span class="op">=</span> <span class="nam">io</span><span class="op">.</span><span class="nam">BytesIO</span><span class="op">(</span><span class="nam">open</span><span class="op">(</span><span class="nam">tmp_file_path</span><span class="op">,</span> <span class="str">'rb'</span><span class="op">)</span><span class="op">.</span><span class="nam">read</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t124" href="#t124">124</a></span><span class="t"> <span class="nam">os</span><span class="op">.</span><span class="nam">remove</span><span class="op">(</span><span class="nam">tmp_file_path</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t125" href="#t125">125</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t126" href="#t126">126</a></span><span class="t"> <span class="key">return</span> <span class="nam">file</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t127" href="#t127">127</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t128" href="#t128">128</a></span><span class="t"> <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t129" href="#t129">129</a></span><span class="t"> <span class="key">def</span> <span class="nam">rename_file</span><span class="op">(</span><span class="nam">recipe</span><span class="op">,</span> <span class="nam">new_name</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t130" href="#t130">130</a></span><span class="t"> <span class="nam">client</span> <span class="op">=</span> <span class="nam">Nextcloud</span><span class="op">.</span><span class="nam">get_client</span><span class="op">(</span><span class="nam">recipe</span><span class="op">.</span><span class="nam">storage</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t131" href="#t131">131</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t132" href="#t132">132</a></span><span class="t"> <span class="nam">client</span><span class="op">.</span><span class="nam">move</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t133" href="#t133">133</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">file_path</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t134" href="#t134">134</a></span><span class="t"> <span class="str">"%s/%s%s"</span> <span class="op">%</span> <span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t135" href="#t135">135</a></span><span class="t"> <span class="nam">os</span><span class="op">.</span><span class="nam">path</span><span class="op">.</span><span class="nam">dirname</span><span class="op">(</span><span class="nam">recipe</span><span class="op">.</span><span class="nam">file_path</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t136" href="#t136">136</a></span><span class="t"> <span class="nam">new_name</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t137" href="#t137">137</a></span><span class="t"> <span class="nam">os</span><span class="op">.</span><span class="nam">path</span><span class="op">.</span><span class="nam">splitext</span><span class="op">(</span><span class="nam">recipe</span><span class="op">.</span><span class="nam">file_path</span><span class="op">)</span><span class="op">[</span><span class="num">1</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t138" href="#t138">138</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t139" href="#t139">139</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t140" href="#t140">140</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t141" href="#t141">141</a></span><span class="t"> <span class="key">return</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t142" href="#t142">142</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t143" href="#t143">143</a></span><span class="t"> <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t144" href="#t144">144</a></span><span class="t"> <span class="key">def</span> <span class="nam">delete_file</span><span class="op">(</span><span class="nam">recipe</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t145" href="#t145">145</a></span><span class="t"> <span class="nam">client</span> <span class="op">=</span> <span class="nam">Nextcloud</span><span class="op">.</span><span class="nam">get_client</span><span class="op">(</span><span class="nam">recipe</span><span class="op">.</span><span class="nam">storage</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t146" href="#t146">146</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t147" href="#t147">147</a></span><span class="t"> <span class="nam">client</span><span class="op">.</span><span class="nam">clean</span><span class="op">(</span><span class="nam">recipe</span><span class="op">.</span><span class="nam">file_path</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t148" href="#t148">148</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t149" href="#t149">149</a></span><span class="t"> <span class="key">return</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
</main>
<footer>
<div class="content">
<p>
<a id="prevFileLink" class="nav" href="d_0b5495cf37ee6c4f_local_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_0b5495cf37ee6c4f_provider_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
</div>
</footer>
</body>
</html>

View File

@@ -1,121 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Coverage for cookbook/provider/provider.py: 68%</title>
<link rel="icon" sizes="32x32" href="favicon_32.png">
<link rel="stylesheet" href="style.css" type="text/css">
<script type="text/javascript" src="coverage_html.js" defer></script>
</head>
<body class="pyfile">
<header>
<div class="content">
<h1>
<span class="text">Coverage for </span><b>cookbook/provider/provider.py</b>:
<span class="pc_cov">68%</span>
</h1>
<aside id="help_panel_wrapper">
<input id="help_panel_state" type="checkbox">
<label for="help_panel_state">
<img id="keyboard_icon" src="keybd_closed.png" alt="Show/hide keyboard shortcuts" />
</label>
<div id="help_panel">
<p class="legend">Shortcuts on this page</p>
<div class="keyhelp">
<p>
<kbd>r</kbd>
<kbd>m</kbd>
<kbd>x</kbd>
&nbsp; toggle line displays
</p>
<p>
<kbd>j</kbd>
<kbd>k</kbd>
&nbsp; next/prev highlighted chunk
</p>
<p>
<kbd>0</kbd> &nbsp; (zero) top of page
</p>
<p>
<kbd>1</kbd> &nbsp; (one) first highlighted chunk
</p>
<p>
<kbd>[</kbd>
<kbd>]</kbd>
&nbsp; prev/next file
</p>
<p>
<kbd>u</kbd> &nbsp; up to the index
</p>
<p>
<kbd>?</kbd> &nbsp; show/hide this help
</p>
</div>
</div>
</aside>
<h2>
<span class="text">19 statements &nbsp;</span>
<button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">13<span class="text"> run</span></button>
<button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">6<span class="text"> missing</span></button>
<button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
</h2>
<p class="text">
<a id="prevFileLink" class="nav" href="d_0b5495cf37ee6c4f_nextcloud_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_a167ab5b5108d61e_schemas_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
<aside class="hidden">
<button type="button" class="button_next_chunk" data-shortcut="j"/>
<button type="button" class="button_prev_chunk" data-shortcut="k"/>
<button type="button" class="button_top_of_page" data-shortcut="0"/>
<button type="button" class="button_first_chunk" data-shortcut="1"/>
<button type="button" class="button_prev_file" data-shortcut="["/>
<button type="button" class="button_next_file" data-shortcut="]"/>
<button type="button" class="button_to_index" data-shortcut="u"/>
<button type="button" class="button_show_hide_help" data-shortcut="?"/>
</aside>
</div>
</header>
<main id="source">
<p class="run"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">class</span> <span class="nam">Provider</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"> <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"> <span class="key">def</span> <span class="nam">import_all</span><span class="op">(</span><span class="nam">monitor</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"> <span class="key">raise</span> <span class="nam">Exception</span><span class="op">(</span><span class="str">'Method not implemented in storage provider'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"> <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"> <span class="key">def</span> <span class="nam">create_share_link</span><span class="op">(</span><span class="nam">recipe</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"> <span class="key">raise</span> <span class="nam">Exception</span><span class="op">(</span><span class="str">'Method not implemented in storage provider'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"> <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_share_link</span><span class="op">(</span><span class="nam">recipe</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"> <span class="key">raise</span> <span class="nam">Exception</span><span class="op">(</span><span class="str">'Method not implemented in storage provider'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"> <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_file</span><span class="op">(</span><span class="nam">recipe</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"> <span class="key">raise</span> <span class="nam">Exception</span><span class="op">(</span><span class="str">'Method not implemented in storage provider'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"> <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"> <span class="key">def</span> <span class="nam">rename_file</span><span class="op">(</span><span class="nam">recipe</span><span class="op">,</span> <span class="nam">new_name</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"> <span class="key">raise</span> <span class="nam">Exception</span><span class="op">(</span><span class="str">'Method not implemented in storage provider'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"> <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"> <span class="key">def</span> <span class="nam">delete_file</span><span class="op">(</span><span class="nam">recipe</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"> <span class="key">raise</span> <span class="nam">Exception</span><span class="op">(</span><span class="str">'Method not implemented in storage provider'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
</main>
<footer>
<div class="content">
<p>
<a id="prevFileLink" class="nav" href="d_0b5495cf37ee6c4f_nextcloud_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_a167ab5b5108d61e_schemas_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
</div>
</footer>
</body>
</html>

View File

@@ -1,308 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Coverage for cookbook/templatetags/custom_tags.py: 73%</title>
<link rel="icon" sizes="32x32" href="favicon_32.png">
<link rel="stylesheet" href="style.css" type="text/css">
<script type="text/javascript" src="coverage_html.js" defer></script>
</head>
<body class="pyfile">
<header>
<div class="content">
<h1>
<span class="text">Coverage for </span><b>cookbook/templatetags/custom_tags.py</b>:
<span class="pc_cov">73%</span>
</h1>
<aside id="help_panel_wrapper">
<input id="help_panel_state" type="checkbox">
<label for="help_panel_state">
<img id="keyboard_icon" src="keybd_closed.png" alt="Show/hide keyboard shortcuts" />
</label>
<div id="help_panel">
<p class="legend">Shortcuts on this page</p>
<div class="keyhelp">
<p>
<kbd>r</kbd>
<kbd>m</kbd>
<kbd>x</kbd>
&nbsp; toggle line displays
</p>
<p>
<kbd>j</kbd>
<kbd>k</kbd>
&nbsp; next/prev highlighted chunk
</p>
<p>
<kbd>0</kbd> &nbsp; (zero) top of page
</p>
<p>
<kbd>1</kbd> &nbsp; (one) first highlighted chunk
</p>
<p>
<kbd>[</kbd>
<kbd>]</kbd>
&nbsp; prev/next file
</p>
<p>
<kbd>u</kbd> &nbsp; up to the index
</p>
<p>
<kbd>?</kbd> &nbsp; show/hide this help
</p>
</div>
</div>
</aside>
<h2>
<span class="text">124 statements &nbsp;</span>
<button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">91<span class="text"> run</span></button>
<button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">33<span class="text"> missing</span></button>
<button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
</h2>
<p class="text">
<a id="prevFileLink" class="nav" href="d_a167ab5b5108d61e_tables_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_1d409d097a8b76e7_theming_tags_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
<aside class="hidden">
<button type="button" class="button_next_chunk" data-shortcut="j"/>
<button type="button" class="button_prev_chunk" data-shortcut="k"/>
<button type="button" class="button_top_of_page" data-shortcut="0"/>
<button type="button" class="button_first_chunk" data-shortcut="1"/>
<button type="button" class="button_prev_file" data-shortcut="["/>
<button type="button" class="button_next_file" data-shortcut="]"/>
<button type="button" class="button_to_index" data-shortcut="u"/>
<button type="button" class="button_show_hide_help" data-shortcut="?"/>
</aside>
</div>
</header>
<main id="source">
<p class="run"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">re</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">from</span> <span class="nam">gettext</span> <span class="key">import</span> <span class="nam">gettext</span> <span class="key">as</span> <span class="nam">_</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">import</span> <span class="nam">bleach</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">import</span> <span class="nam">markdown</span> <span class="key">as</span> <span class="nam">md</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"><span class="key">from</span> <span class="nam">django</span> <span class="key">import</span> <span class="nam">template</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="key">from</span> <span class="nam">django</span><span class="op">.</span><span class="nam">db</span><span class="op">.</span><span class="nam">models</span> <span class="key">import</span> <span class="nam">Avg</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="key">from</span> <span class="nam">django</span><span class="op">.</span><span class="nam">templatetags</span><span class="op">.</span><span class="nam">static</span> <span class="key">import</span> <span class="nam">static</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="key">from</span> <span class="nam">django</span><span class="op">.</span><span class="nam">urls</span> <span class="key">import</span> <span class="nam">NoReverseMatch</span><span class="op">,</span> <span class="nam">reverse</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="key">from</span> <span class="nam">django_scopes</span> <span class="key">import</span> <span class="nam">ScopeError</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="key">from</span> <span class="nam">markdown</span><span class="op">.</span><span class="nam">extensions</span><span class="op">.</span><span class="nam">tables</span> <span class="key">import</span> <span class="nam">TableExtension</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"><span class="key">from</span> <span class="nam">rest_framework</span><span class="op">.</span><span class="nam">authtoken</span><span class="op">.</span><span class="nam">models</span> <span class="key">import</span> <span class="nam">Token</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">helper</span><span class="op">.</span><span class="nam">mdx_attributes</span> <span class="key">import</span> <span class="nam">MarkdownFormatExtension</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">helper</span><span class="op">.</span><span class="nam">mdx_urlize</span> <span class="key">import</span> <span class="nam">UrlizeExtension</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">models</span> <span class="key">import</span> <span class="nam">get_model_name</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"><span class="key">from</span> <span class="nam">recipes</span> <span class="key">import</span> <span class="nam">settings</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"><span class="key">from</span> <span class="nam">recipes</span><span class="op">.</span><span class="nam">settings</span> <span class="key">import</span> <span class="nam">PLUGINS</span><span class="op">,</span> <span class="nam">STATIC_URL</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"><span class="nam">register</span> <span class="op">=</span> <span class="nam">template</span><span class="op">.</span><span class="nam">Library</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"><span class="op">@</span><span class="nam">register</span><span class="op">.</span><span class="nam">filter</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"><span class="key">def</span> <span class="nam">get_class_name</span><span class="op">(</span><span class="nam">value</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"> <span class="key">return</span> <span class="nam">value</span><span class="op">.</span><span class="nam">__class__</span><span class="op">.</span><span class="nam">__name__</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"><span class="op">@</span><span class="nam">register</span><span class="op">.</span><span class="nam">filter</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"><span class="key">def</span> <span class="nam">get_class</span><span class="op">(</span><span class="nam">value</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"> <span class="key">return</span> <span class="nam">value</span><span class="op">.</span><span class="nam">__class__</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"><span class="op">@</span><span class="nam">register</span><span class="op">.</span><span class="nam">simple_tag</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"><span class="key">def</span> <span class="nam">class_name</span><span class="op">(</span><span class="nam">value</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"> <span class="key">return</span> <span class="nam">value</span><span class="op">.</span><span class="nam">__class__</span><span class="op">.</span><span class="nam">__name__</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"><span class="op">@</span><span class="nam">register</span><span class="op">.</span><span class="nam">simple_tag</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"><span class="key">def</span> <span class="nam">delete_url</span><span class="op">(</span><span class="nam">model</span><span class="op">,</span> <span class="nam">pk</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="key">return</span> <span class="nam">reverse</span><span class="op">(</span><span class="str">f'delete_{get_model_name(model)}'</span><span class="op">,</span> <span class="nam">args</span><span class="op">=</span><span class="op">[</span><span class="nam">pk</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"> <span class="key">except</span> <span class="nam">NoReverseMatch</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"> <span class="key">return</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"><span class="op">@</span><span class="nam">register</span><span class="op">.</span><span class="nam">filter</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"><span class="key">def</span> <span class="nam">markdown</span><span class="op">(</span><span class="nam">value</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="nam">tags</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="str">"h1"</span><span class="op">,</span> <span class="str">"h2"</span><span class="op">,</span> <span class="str">"h3"</span><span class="op">,</span> <span class="str">"h4"</span><span class="op">,</span> <span class="str">"h5"</span><span class="op">,</span> <span class="str">"h6"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="str">"b"</span><span class="op">,</span> <span class="str">"i"</span><span class="op">,</span> <span class="str">"strong"</span><span class="op">,</span> <span class="str">"em"</span><span class="op">,</span> <span class="str">"tt"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"> <span class="str">"p"</span><span class="op">,</span> <span class="str">"br"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"> <span class="str">"span"</span><span class="op">,</span> <span class="str">"div"</span><span class="op">,</span> <span class="str">"blockquote"</span><span class="op">,</span> <span class="str">"code"</span><span class="op">,</span> <span class="str">"pre"</span><span class="op">,</span> <span class="str">"hr"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"> <span class="str">"ul"</span><span class="op">,</span> <span class="str">"ol"</span><span class="op">,</span> <span class="str">"li"</span><span class="op">,</span> <span class="str">"dd"</span><span class="op">,</span> <span class="str">"dt"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="str">"img"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"> <span class="str">"a"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="str">"sub"</span><span class="op">,</span> <span class="str">"sup"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"> <span class="str">'pre'</span><span class="op">,</span> <span class="str">'table'</span><span class="op">,</span> <span class="str">'td'</span><span class="op">,</span> <span class="str">'tr'</span><span class="op">,</span> <span class="str">'th'</span><span class="op">,</span> <span class="str">'tbody'</span><span class="op">,</span> <span class="str">'style'</span><span class="op">,</span> <span class="str">'thead'</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="nam">parsed_md</span> <span class="op">=</span> <span class="nam">md</span><span class="op">.</span><span class="nam">markdown</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"> <span class="nam">value</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"> <span class="nam">extensions</span><span class="op">=</span><span class="op">[</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"> <span class="str">'markdown.extensions.fenced_code'</span><span class="op">,</span> <span class="nam">TableExtension</span><span class="op">(</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="nam">UrlizeExtension</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> <span class="nam">MarkdownFormatExtension</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"> <span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"> <span class="nam">markdown_attrs</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t"> <span class="str">"*"</span><span class="op">:</span> <span class="op">[</span><span class="str">"id"</span><span class="op">,</span> <span class="str">"class"</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"> <span class="str">"img"</span><span class="op">:</span> <span class="op">[</span><span class="str">"src"</span><span class="op">,</span> <span class="str">"alt"</span><span class="op">,</span> <span class="str">"title"</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"> <span class="str">"a"</span><span class="op">:</span> <span class="op">[</span><span class="str">"href"</span><span class="op">,</span> <span class="str">"alt"</span><span class="op">,</span> <span class="str">"title"</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="nam">parsed_md</span> <span class="op">=</span> <span class="nam">parsed_md</span><span class="op">[</span><span class="num">3</span><span class="op">:</span><span class="op">]</span> <span class="com"># remove outer paragraph</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"> <span class="nam">parsed_md</span> <span class="op">=</span> <span class="nam">parsed_md</span><span class="op">[</span><span class="op">:</span><span class="nam">len</span><span class="op">(</span><span class="nam">parsed_md</span><span class="op">)</span> <span class="op">-</span> <span class="num">4</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"> <span class="key">return</span> <span class="nam">bleach</span><span class="op">.</span><span class="nam">clean</span><span class="op">(</span><span class="nam">parsed_md</span><span class="op">,</span> <span class="nam">tags</span><span class="op">,</span> <span class="nam">markdown_attrs</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"><span class="op">@</span><span class="nam">register</span><span class="op">.</span><span class="nam">simple_tag</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t"><span class="key">def</span> <span class="nam">recipe_rating</span><span class="op">(</span><span class="nam">recipe</span><span class="op">,</span> <span class="nam">user</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">user</span><span class="op">.</span><span class="nam">is_authenticated</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"> <span class="key">return</span> <span class="str">''</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t"> <span class="nam">rating</span> <span class="op">=</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">cooklog_set</span> <span class="xx">\</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"> <span class="op">.</span><span class="nam">filter</span><span class="op">(</span><span class="nam">created_by</span><span class="op">=</span><span class="nam">user</span><span class="op">,</span> <span class="nam">rating__gt</span><span class="op">=</span><span class="num">0</span><span class="op">)</span> <span class="xx">\</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"> <span class="op">.</span><span class="nam">aggregate</span><span class="op">(</span><span class="nam">Avg</span><span class="op">(</span><span class="str">'rating'</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t"> <span class="key">if</span> <span class="nam">rating</span><span class="op">[</span><span class="str">'rating__avg'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t"> <span class="nam">rating_stars</span> <span class="op">=</span> <span class="str">'&lt;span style="display: inline-block;">'</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t"> <span class="key">for</span> <span class="nam">i</span> <span class="key">in</span> <span class="nam">range</span><span class="op">(</span><span class="nam">int</span><span class="op">(</span><span class="nam">rating</span><span class="op">[</span><span class="str">'rating__avg'</span><span class="op">]</span><span class="op">)</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t"> <span class="nam">rating_stars</span> <span class="op">=</span> <span class="nam">rating_stars</span> <span class="op">+</span> <span class="str">'&lt;i class="fas fa-star fa-xs">&lt;/i>'</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t"> <span class="key">if</span> <span class="nam">rating</span><span class="op">[</span><span class="str">'rating__avg'</span><span class="op">]</span> <span class="op">%</span> <span class="num">1</span> <span class="op">>=</span> <span class="num">0.5</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t"> <span class="nam">rating_stars</span> <span class="op">=</span> <span class="nam">rating_stars</span> <span class="op">+</span> <span class="str">'&lt;i class="fas fa-star-half-alt fa-xs">&lt;/i>'</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t"> <span class="nam">rating_stars</span> <span class="op">+=</span> <span class="str">'&lt;/span>'</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t"> <span class="key">return</span> <span class="nam">rating_stars</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t"> <span class="key">return</span> <span class="str">''</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t"><span class="op">@</span><span class="nam">register</span><span class="op">.</span><span class="nam">simple_tag</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t"><span class="key">def</span> <span class="nam">recipe_last</span><span class="op">(</span><span class="nam">recipe</span><span class="op">,</span> <span class="nam">user</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">user</span><span class="op">.</span><span class="nam">is_authenticated</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t"> <span class="key">return</span> <span class="str">''</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t"> <span class="nam">last</span> <span class="op">=</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">cooklog_set</span><span class="op">.</span><span class="nam">filter</span><span class="op">(</span><span class="nam">created_by</span><span class="op">=</span><span class="nam">user</span><span class="op">)</span><span class="op">.</span><span class="nam">last</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t"> <span class="key">if</span> <span class="nam">last</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t"> <span class="key">return</span> <span class="nam">last</span><span class="op">.</span><span class="nam">created_at</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t"> <span class="key">return</span> <span class="str">''</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t"><span class="op">@</span><span class="nam">register</span><span class="op">.</span><span class="nam">simple_tag</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t"><span class="key">def</span> <span class="nam">page_help</span><span class="op">(</span><span class="nam">page_name</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t113" href="#t113">113</a></span><span class="t"> <span class="nam">help_pages</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t114" href="#t114">114</a></span><span class="t"> <span class="str">'edit_storage'</span><span class="op">:</span> <span class="str">'https://docs.tandoor.dev/features/external_recipes/'</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t115" href="#t115">115</a></span><span class="t"> <span class="str">'view_shopping'</span><span class="op">:</span> <span class="str">'https://docs.tandoor.dev/features/shopping/'</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t116" href="#t116">116</a></span><span class="t"> <span class="str">'view_import'</span><span class="op">:</span> <span class="str">'https://docs.tandoor.dev/features/import_export/'</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t117" href="#t117">117</a></span><span class="t"> <span class="str">'view_export'</span><span class="op">:</span> <span class="str">'https://docs.tandoor.dev/features/import_export/'</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t118" href="#t118">118</a></span><span class="t"> <span class="str">'list_automation'</span><span class="op">:</span> <span class="str">'https://docs.tandoor.dev/features/automation/'</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t119" href="#t119">119</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t120" href="#t120">120</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t121" href="#t121">121</a></span><span class="t"> <span class="nam">link</span> <span class="op">=</span> <span class="nam">help_pages</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">page_name</span><span class="op">,</span> <span class="str">''</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t122" href="#t122">122</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t123" href="#t123">123</a></span><span class="t"> <span class="key">if</span> <span class="nam">link</span> <span class="op">!=</span> <span class="str">''</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t124" href="#t124">124</a></span><span class="t"> <span class="key">return</span> <span class="str">f'&lt;li class="nav-item">&lt;a class="nav-link" target="_blank" rel="nofollow noreferrer" href="{link}">&lt;i class="far fa-question-circle">&lt;/i>&amp;zwnj;&lt;span class="d-lg-none"> {_("Help")}&lt;/span>&lt;/a>&lt;/li>'</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t125" href="#t125">125</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t126" href="#t126">126</a></span><span class="t"> <span class="key">return</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t127" href="#t127">127</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t128" href="#t128">128</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t129" href="#t129">129</a></span><span class="t"><span class="op">@</span><span class="nam">register</span><span class="op">.</span><span class="nam">simple_tag</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t130" href="#t130">130</a></span><span class="t"><span class="key">def</span> <span class="nam">message_of_the_day</span><span class="op">(</span><span class="nam">request</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t131" href="#t131">131</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t132" href="#t132">132</a></span><span class="t"> <span class="key">if</span> <span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">.</span><span class="nam">message</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t133" href="#t133">133</a></span><span class="t"> <span class="key">return</span> <span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">.</span><span class="nam">message</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t134" href="#t134">134</a></span><span class="t"> <span class="key">except</span> <span class="op">(</span><span class="nam">AttributeError</span><span class="op">,</span> <span class="nam">KeyError</span><span class="op">,</span> <span class="nam">ValueError</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t135" href="#t135">135</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t136" href="#t136">136</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t137" href="#t137">137</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t138" href="#t138">138</a></span><span class="t"><span class="op">@</span><span class="nam">register</span><span class="op">.</span><span class="nam">simple_tag</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t139" href="#t139">139</a></span><span class="t"><span class="key">def</span> <span class="nam">is_debug</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t140" href="#t140">140</a></span><span class="t"> <span class="key">return</span> <span class="nam">settings</span><span class="op">.</span><span class="nam">DEBUG</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t141" href="#t141">141</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t142" href="#t142">142</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t143" href="#t143">143</a></span><span class="t"><span class="op">@</span><span class="nam">register</span><span class="op">.</span><span class="nam">simple_tag</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t144" href="#t144">144</a></span><span class="t"><span class="key">def</span> <span class="nam">markdown_link</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t145" href="#t145">145</a></span><span class="t"> <span class="key">return</span> <span class="str">f"{_('You can use markdown to format this field. See the ')}&lt;a target='_blank' href='{reverse('docs_markdown')}'>{_('docs here')}&lt;/a>"</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t146" href="#t146">146</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t147" href="#t147">147</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t148" href="#t148">148</a></span><span class="t"><span class="op">@</span><span class="nam">register</span><span class="op">.</span><span class="nam">simple_tag</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t149" href="#t149">149</a></span><span class="t"><span class="key">def</span> <span class="nam">plugin_dropdown_nav_templates</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t150" href="#t150">150</a></span><span class="t"> <span class="nam">templates</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t151" href="#t151">151</a></span><span class="t"> <span class="key">for</span> <span class="nam">p</span> <span class="key">in</span> <span class="nam">PLUGINS</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t152" href="#t152">152</a></span><span class="t"> <span class="key">if</span> <span class="nam">p</span><span class="op">[</span><span class="str">'nav_dropdown'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t153" href="#t153">153</a></span><span class="t"> <span class="nam">templates</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">p</span><span class="op">[</span><span class="str">'nav_dropdown'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t154" href="#t154">154</a></span><span class="t"> <span class="key">return</span> <span class="nam">templates</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t155" href="#t155">155</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t156" href="#t156">156</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t157" href="#t157">157</a></span><span class="t"><span class="op">@</span><span class="nam">register</span><span class="op">.</span><span class="nam">simple_tag</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t158" href="#t158">158</a></span><span class="t"><span class="key">def</span> <span class="nam">plugin_main_nav_templates</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t159" href="#t159">159</a></span><span class="t"> <span class="nam">templates</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t160" href="#t160">160</a></span><span class="t"> <span class="key">for</span> <span class="nam">p</span> <span class="key">in</span> <span class="nam">PLUGINS</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t161" href="#t161">161</a></span><span class="t"> <span class="key">if</span> <span class="nam">p</span><span class="op">[</span><span class="str">'nav_main'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t162" href="#t162">162</a></span><span class="t"> <span class="nam">templates</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">p</span><span class="op">[</span><span class="str">'nav_main'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t163" href="#t163">163</a></span><span class="t"> <span class="key">return</span> <span class="nam">templates</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t164" href="#t164">164</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t165" href="#t165">165</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t166" href="#t166">166</a></span><span class="t"><span class="op">@</span><span class="nam">register</span><span class="op">.</span><span class="nam">simple_tag</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t167" href="#t167">167</a></span><span class="t"><span class="key">def</span> <span class="nam">bookmarklet</span><span class="op">(</span><span class="nam">request</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t168" href="#t168">168</a></span><span class="t"> <span class="key">if</span> <span class="nam">request</span><span class="op">.</span><span class="nam">is_secure</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t169" href="#t169">169</a></span><span class="t"> <span class="nam">protocol</span> <span class="op">=</span> <span class="str">"https://"</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t170" href="#t170">170</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t171" href="#t171">171</a></span><span class="t"> <span class="nam">protocol</span> <span class="op">=</span> <span class="str">"http://"</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t172" href="#t172">172</a></span><span class="t"> <span class="nam">server</span> <span class="op">=</span> <span class="nam">protocol</span> <span class="op">+</span> <span class="nam">request</span><span class="op">.</span><span class="nam">get_host</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t173" href="#t173">173</a></span><span class="t"> <span class="nam">prefix</span> <span class="op">=</span> <span class="nam">settings</span><span class="op">.</span><span class="nam">JS_REVERSE_SCRIPT_PREFIX</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t174" href="#t174">174</a></span><span class="t"> <span class="com"># TODO is it safe to store the token in clear text in a bookmark?</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t175" href="#t175">175</a></span><span class="t"> <span class="key">if</span> <span class="op">(</span><span class="nam">api_token</span> <span class="op">:=</span> <span class="nam">Token</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">filter</span><span class="op">(</span><span class="nam">user</span><span class="op">=</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">)</span><span class="op">.</span><span class="nam">first</span><span class="op">(</span><span class="op">)</span><span class="op">)</span> <span class="key">is</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t176" href="#t176">176</a></span><span class="t"> <span class="nam">api_token</span> <span class="op">=</span> <span class="nam">Token</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span><span class="nam">user</span><span class="op">=</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t177" href="#t177">177</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t178" href="#t178">178</a></span><span class="t"> <span class="nam">bookmark</span> <span class="op">=</span> <span class="str">"&lt;a href='javascript: \</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t179" href="#t179">179</a></span><span class="t"><span class="str"> (function(){ \</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t180" href="#t180">180</a></span><span class="t"><span class="str"> if(window.bookmarkletTandoor!==undefined){ \</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t181" href="#t181">181</a></span><span class="t"><span class="str"> bookmarkletTandoor(); \</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t182" href="#t182">182</a></span><span class="t"><span class="str"> } else { \</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t183" href="#t183">183</a></span><span class="t"><span class="str"> localStorage.setItem('importURL', '"</span> <span class="op">+</span> <span class="nam">server</span> <span class="op">+</span> <span class="nam">reverse</span><span class="op">(</span><span class="str">'api:bookmarkletimport-list'</span><span class="op">)</span> <span class="op">+</span> <span class="str">"'); \</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t184" href="#t184">184</a></span><span class="t"><span class="str"> localStorage.setItem('redirectURL', '"</span> <span class="op">+</span> <span class="nam">server</span> <span class="op">+</span> <span class="nam">reverse</span><span class="op">(</span><span class="str">'data_import_url'</span><span class="op">)</span> <span class="op">+</span> <span class="str">"'); \</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t185" href="#t185">185</a></span><span class="t"><span class="str"> localStorage.setItem('token', '"</span> <span class="op">+</span> <span class="nam">api_token</span><span class="op">.</span><span class="nam">__str__</span><span class="op">(</span><span class="op">)</span> <span class="op">+</span> <span class="str">"'); \</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t186" href="#t186">186</a></span><span class="t"><span class="str"> document.body.appendChild(document.createElement(\'script\')).src=\'"</span> <span class="xx">\</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t187" href="#t187">187</a></span><span class="t"> <span class="op">+</span> <span class="nam">server</span> <span class="op">+</span> <span class="nam">prefix</span> <span class="op">+</span> <span class="nam">static</span><span class="op">(</span><span class="str">'js/bookmarklet_v3.js'</span><span class="op">)</span> <span class="op">+</span> <span class="str">"? \</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t188" href="#t188">188</a></span><span class="t"><span class="str"> r=\'+Math.floor(Math.random()*999999999);}})();'>Test&lt;/a>"</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t189" href="#t189">189</a></span><span class="t"> <span class="key">return</span> <span class="nam">re</span><span class="op">.</span><span class="nam">sub</span><span class="op">(</span><span class="str">r"[\n\t]*"</span><span class="op">,</span> <span class="str">""</span><span class="op">,</span> <span class="nam">bookmark</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t190" href="#t190">190</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t191" href="#t191">191</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t192" href="#t192">192</a></span><span class="t"><span class="op">@</span><span class="nam">register</span><span class="op">.</span><span class="nam">simple_tag</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t193" href="#t193">193</a></span><span class="t"><span class="key">def</span> <span class="nam">base_path</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="nam">path_type</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t194" href="#t194">194</a></span><span class="t"> <span class="key">if</span> <span class="nam">path_type</span> <span class="op">==</span> <span class="str">'base'</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t195" href="#t195">195</a></span><span class="t"> <span class="key">return</span> <span class="nam">request</span><span class="op">.</span><span class="nam">_current_scheme_host</span> <span class="op">+</span> <span class="nam">request</span><span class="op">.</span><span class="nam">META</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">'HTTP_X_SCRIPT_NAME'</span><span class="op">,</span> <span class="str">''</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t196" href="#t196">196</a></span><span class="t"> <span class="key">elif</span> <span class="nam">path_type</span> <span class="op">==</span> <span class="str">'script'</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t197" href="#t197">197</a></span><span class="t"> <span class="key">return</span> <span class="nam">request</span><span class="op">.</span><span class="nam">META</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">'HTTP_X_SCRIPT_NAME'</span><span class="op">,</span> <span class="str">''</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t198" href="#t198">198</a></span><span class="t"> <span class="key">elif</span> <span class="nam">path_type</span> <span class="op">==</span> <span class="str">'static_base'</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t199" href="#t199">199</a></span><span class="t"> <span class="key">return</span> <span class="nam">STATIC_URL</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t200" href="#t200">200</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t201" href="#t201">201</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t202" href="#t202">202</a></span><span class="t"><span class="op">@</span><span class="nam">register</span><span class="op">.</span><span class="nam">simple_tag</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t203" href="#t203">203</a></span><span class="t"><span class="key">def</span> <span class="nam">user_prefs</span><span class="op">(</span><span class="nam">request</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t204" href="#t204">204</a></span><span class="t"> <span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">serializer</span> <span class="key">import</span> <span class="xx">\</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t205" href="#t205">205</a></span><span class="t"> <span class="nam">UserPreferenceSerializer</span> <span class="com"># putting it with imports caused circular execution</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t206" href="#t206">206</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t207" href="#t207">207</a></span><span class="t"> <span class="key">return</span> <span class="nam">UserPreferenceSerializer</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">.</span><span class="nam">userpreference</span><span class="op">,</span> <span class="nam">context</span><span class="op">=</span><span class="op">{</span><span class="str">'request'</span><span class="op">:</span> <span class="nam">request</span><span class="op">}</span><span class="op">)</span><span class="op">.</span><span class="nam">data</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t208" href="#t208">208</a></span><span class="t"> <span class="key">except</span> <span class="nam">AttributeError</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t209" href="#t209">209</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t210" href="#t210">210</a></span><span class="t"> <span class="key">except</span> <span class="nam">ScopeError</span><span class="op">:</span> <span class="com"># there are pages without an active space that still need to load but don't require prefs</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t211" href="#t211">211</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
</main>
<footer>
<div class="content">
<p>
<a id="prevFileLink" class="nav" href="d_a167ab5b5108d61e_tables_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_1d409d097a8b76e7_theming_tags_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
</div>
</footer>
</body>
</html>

View File

@@ -1,150 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Coverage for cookbook/templatetags/theming_tags.py: 87%</title>
<link rel="icon" sizes="32x32" href="favicon_32.png">
<link rel="stylesheet" href="style.css" type="text/css">
<script type="text/javascript" src="coverage_html.js" defer></script>
</head>
<body class="pyfile">
<header>
<div class="content">
<h1>
<span class="text">Coverage for </span><b>cookbook/templatetags/theming_tags.py</b>:
<span class="pc_cov">87%</span>
</h1>
<aside id="help_panel_wrapper">
<input id="help_panel_state" type="checkbox">
<label for="help_panel_state">
<img id="keyboard_icon" src="keybd_closed.png" alt="Show/hide keyboard shortcuts" />
</label>
<div id="help_panel">
<p class="legend">Shortcuts on this page</p>
<div class="keyhelp">
<p>
<kbd>r</kbd>
<kbd>m</kbd>
<kbd>x</kbd>
&nbsp; toggle line displays
</p>
<p>
<kbd>j</kbd>
<kbd>k</kbd>
&nbsp; next/prev highlighted chunk
</p>
<p>
<kbd>0</kbd> &nbsp; (zero) top of page
</p>
<p>
<kbd>1</kbd> &nbsp; (one) first highlighted chunk
</p>
<p>
<kbd>[</kbd>
<kbd>]</kbd>
&nbsp; prev/next file
</p>
<p>
<kbd>u</kbd> &nbsp; up to the index
</p>
<p>
<kbd>?</kbd> &nbsp; show/hide this help
</p>
</div>
</div>
</aside>
<h2>
<span class="text">30 statements &nbsp;</span>
<button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">26<span class="text"> run</span></button>
<button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">4<span class="text"> missing</span></button>
<button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
</h2>
<p class="text">
<a id="prevFileLink" class="nav" href="d_1d409d097a8b76e7_custom_tags_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_a167ab5b5108d61e_version_info_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
<aside class="hidden">
<button type="button" class="button_next_chunk" data-shortcut="j"/>
<button type="button" class="button_prev_chunk" data-shortcut="k"/>
<button type="button" class="button_top_of_page" data-shortcut="0"/>
<button type="button" class="button_first_chunk" data-shortcut="1"/>
<button type="button" class="button_prev_file" data-shortcut="["/>
<button type="button" class="button_next_file" data-shortcut="]"/>
<button type="button" class="button_to_index" data-shortcut="u"/>
<button type="button" class="button_show_hide_help" data-shortcut="?"/>
</aside>
</div>
</header>
<main id="source">
<p class="run"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">from</span> <span class="nam">django</span> <span class="key">import</span> <span class="nam">template</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">from</span> <span class="nam">django</span><span class="op">.</span><span class="nam">templatetags</span><span class="op">.</span><span class="nam">static</span> <span class="key">import</span> <span class="nam">static</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">models</span> <span class="key">import</span> <span class="nam">UserPreference</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">from</span> <span class="nam">recipes</span><span class="op">.</span><span class="nam">settings</span> <span class="key">import</span> <span class="nam">STICKY_NAV_PREF_DEFAULT</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="nam">register</span> <span class="op">=</span> <span class="nam">template</span><span class="op">.</span><span class="nam">Library</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="op">@</span><span class="nam">register</span><span class="op">.</span><span class="nam">simple_tag</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="key">def</span> <span class="nam">theme_url</span><span class="op">(</span><span class="nam">request</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">.</span><span class="nam">is_authenticated</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"> <span class="key">return</span> <span class="nam">static</span><span class="op">(</span><span class="str">'themes/tandoor.min.css'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"> <span class="nam">themes</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"> <span class="nam">UserPreference</span><span class="op">.</span><span class="nam">BOOTSTRAP</span><span class="op">:</span> <span class="str">'themes/bootstrap.min.css'</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"> <span class="nam">UserPreference</span><span class="op">.</span><span class="nam">FLATLY</span><span class="op">:</span> <span class="str">'themes/flatly.min.css'</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"> <span class="nam">UserPreference</span><span class="op">.</span><span class="nam">DARKLY</span><span class="op">:</span> <span class="str">'themes/darkly.min.css'</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"> <span class="nam">UserPreference</span><span class="op">.</span><span class="nam">SUPERHERO</span><span class="op">:</span> <span class="str">'themes/superhero.min.css'</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"> <span class="nam">UserPreference</span><span class="op">.</span><span class="nam">TANDOOR</span><span class="op">:</span> <span class="str">'themes/tandoor.min.css'</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"> <span class="nam">UserPreference</span><span class="op">.</span><span class="nam">TANDOOR_DARK</span><span class="op">:</span> <span class="str">'themes/tandoor_dark.min.css'</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"> <span class="key">if</span> <span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">.</span><span class="nam">userpreference</span><span class="op">.</span><span class="nam">theme</span> <span class="key">in</span> <span class="nam">themes</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"> <span class="key">return</span> <span class="nam">static</span><span class="op">(</span><span class="nam">themes</span><span class="op">[</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">.</span><span class="nam">userpreference</span><span class="op">.</span><span class="nam">theme</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"> <span class="key">raise</span> <span class="nam">AttributeError</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"><span class="op">@</span><span class="nam">register</span><span class="op">.</span><span class="nam">simple_tag</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"><span class="key">def</span> <span class="nam">logo_url</span><span class="op">(</span><span class="nam">request</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"> <span class="key">if</span> <span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">.</span><span class="nam">is_authenticated</span> <span class="key">and</span> <span class="nam">getattr</span><span class="op">(</span><span class="nam">getattr</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">"space"</span><span class="op">,</span> <span class="op">{</span><span class="op">}</span><span class="op">)</span><span class="op">,</span> <span class="str">'image'</span><span class="op">,</span> <span class="key">None</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"> <span class="key">return</span> <span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">.</span><span class="nam">image</span><span class="op">.</span><span class="nam">file</span><span class="op">.</span><span class="nam">url</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"> <span class="key">return</span> <span class="nam">static</span><span class="op">(</span><span class="str">'assets/brand_logo.png'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"><span class="op">@</span><span class="nam">register</span><span class="op">.</span><span class="nam">simple_tag</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"><span class="key">def</span> <span class="nam">nav_color</span><span class="op">(</span><span class="nam">request</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">.</span><span class="nam">is_authenticated</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"> <span class="key">return</span> <span class="str">'navbar-light bg-primary'</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="key">if</span> <span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">.</span><span class="nam">userpreference</span><span class="op">.</span><span class="nam">nav_color</span><span class="op">.</span><span class="nam">lower</span><span class="op">(</span><span class="op">)</span> <span class="key">in</span> <span class="op">[</span><span class="str">'light'</span><span class="op">,</span> <span class="str">'warning'</span><span class="op">,</span> <span class="str">'info'</span><span class="op">,</span> <span class="str">'success'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"> <span class="key">return</span> <span class="str">f'navbar-light bg-{request.user.userpreference.nav_color.lower()}'</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="key">return</span> <span class="str">f'navbar-dark bg-{request.user.userpreference.nav_color.lower()}'</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"><span class="op">@</span><span class="nam">register</span><span class="op">.</span><span class="nam">simple_tag</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"><span class="key">def</span> <span class="nam">sticky_nav</span><span class="op">(</span><span class="nam">request</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="key">if</span> <span class="op">(</span><span class="key">not</span> <span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">.</span><span class="nam">is_authenticated</span> <span class="key">and</span> <span class="nam">STICKY_NAV_PREF_DEFAULT</span><span class="op">)</span> <span class="key">or</span> <span class="xx">\</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">.</span><span class="nam">is_authenticated</span> <span class="key">and</span> <span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">.</span><span class="nam">userpreference</span><span class="op">.</span><span class="nam">sticky_navbar</span><span class="op">)</span><span class="op">:</span> <span class="com"># noqa: E501</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"> <span class="key">return</span> <span class="str">'position: sticky; top: 0; left: 0; z-index: 1000;'</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"> <span class="key">return</span> <span class="str">''</span>&nbsp;</span><span class="r"></span></p>
</main>
<footer>
<div class="content">
<p>
<a id="prevFileLink" class="nav" href="d_1d409d097a8b76e7_custom_tags_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_a167ab5b5108d61e_version_info_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
</div>
</footer>
</body>
</html>

View File

@@ -1,156 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Coverage for cookbook/integration/cheftap.py: 20%</title>
<link rel="icon" sizes="32x32" href="favicon_32.png">
<link rel="stylesheet" href="style.css" type="text/css">
<script type="text/javascript" src="coverage_html.js" defer></script>
</head>
<body class="pyfile">
<header>
<div class="content">
<h1>
<span class="text">Coverage for </span><b>cookbook/integration/cheftap.py</b>:
<span class="pc_cov">20%</span>
</h1>
<aside id="help_panel_wrapper">
<input id="help_panel_state" type="checkbox">
<label for="help_panel_state">
<img id="keyboard_icon" src="keybd_closed.png" alt="Show/hide keyboard shortcuts" />
</label>
<div id="help_panel">
<p class="legend">Shortcuts on this page</p>
<div class="keyhelp">
<p>
<kbd>r</kbd>
<kbd>m</kbd>
<kbd>x</kbd>
&nbsp; toggle line displays
</p>
<p>
<kbd>j</kbd>
<kbd>k</kbd>
&nbsp; next/prev highlighted chunk
</p>
<p>
<kbd>0</kbd> &nbsp; (zero) top of page
</p>
<p>
<kbd>1</kbd> &nbsp; (one) first highlighted chunk
</p>
<p>
<kbd>[</kbd>
<kbd>]</kbd>
&nbsp; prev/next file
</p>
<p>
<kbd>u</kbd> &nbsp; up to the index
</p>
<p>
<kbd>?</kbd> &nbsp; show/hide this help
</p>
</div>
</div>
</aside>
<h2>
<span class="text">41 statements &nbsp;</span>
<button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">8<span class="text"> run</span></button>
<button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">33<span class="text"> missing</span></button>
<button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
</h2>
<p class="text">
<a id="prevFileLink" class="nav" href="d_f8cd9a78c43a323f_unit_conversion_helper_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_37812bb4c19c71da_chowdown_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
<aside class="hidden">
<button type="button" class="button_next_chunk" data-shortcut="j"/>
<button type="button" class="button_prev_chunk" data-shortcut="k"/>
<button type="button" class="button_top_of_page" data-shortcut="0"/>
<button type="button" class="button_first_chunk" data-shortcut="1"/>
<button type="button" class="button_prev_file" data-shortcut="["/>
<button type="button" class="button_next_file" data-shortcut="]"/>
<button type="button" class="button_to_index" data-shortcut="u"/>
<button type="button" class="button_show_hide_help" data-shortcut="?"/>
</aside>
</div>
</header>
<main id="source">
<p class="run"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">re</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">helper</span><span class="op">.</span><span class="nam">ingredient_parser</span> <span class="key">import</span> <span class="nam">IngredientParser</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">integration</span><span class="op">.</span><span class="nam">integration</span> <span class="key">import</span> <span class="nam">Integration</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">models</span> <span class="key">import</span> <span class="nam">Ingredient</span><span class="op">,</span> <span class="nam">Recipe</span><span class="op">,</span> <span class="nam">Step</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="key">class</span> <span class="nam">ChefTap</span><span class="op">(</span><span class="nam">Integration</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"> <span class="key">def</span> <span class="nam">import_file_name_filter</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">zip_info_object</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="str">"testing"</span><span class="op">,</span> <span class="nam">zip_info_object</span><span class="op">.</span><span class="nam">filename</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"> <span class="key">return</span> <span class="nam">re</span><span class="op">.</span><span class="nam">match</span><span class="op">(</span><span class="str">r'^cheftap_export/([A-Za-z\d\s\-_()\[\]\u00C0-\u017F])+.txt$'</span><span class="op">,</span> <span class="nam">zip_info_object</span><span class="op">.</span><span class="nam">filename</span><span class="op">)</span> <span class="key">or</span> <span class="nam">re</span><span class="op">.</span><span class="nam">match</span><span class="op">(</span><span class="str">r'^([A-Za-z\d\s\-_()\[\]\u00C0-\u017F])+.txt$'</span><span class="op">,</span> <span class="nam">zip_info_object</span><span class="op">.</span><span class="nam">filename</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_recipe_from_file</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">file</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"> <span class="nam">source_url</span> <span class="op">=</span> <span class="str">''</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"> <span class="nam">ingredient_mode</span> <span class="op">=</span> <span class="num">0</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"> <span class="nam">ingredients</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"> <span class="nam">directions</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"> <span class="key">for</span> <span class="nam">i</span><span class="op">,</span> <span class="nam">fl</span> <span class="key">in</span> <span class="nam">enumerate</span><span class="op">(</span><span class="nam">file</span><span class="op">.</span><span class="nam">readlines</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> <span class="nam">start</span><span class="op">=</span><span class="num">0</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"> <span class="nam">line</span> <span class="op">=</span> <span class="nam">fl</span><span class="op">.</span><span class="nam">decode</span><span class="op">(</span><span class="str">"utf-8"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"> <span class="key">if</span> <span class="nam">i</span> <span class="op">==</span> <span class="num">0</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"> <span class="nam">title</span> <span class="op">=</span> <span class="nam">line</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"> <span class="key">if</span> <span class="nam">line</span><span class="op">.</span><span class="nam">startswith</span><span class="op">(</span><span class="str">'https:'</span><span class="op">)</span> <span class="key">or</span> <span class="nam">line</span><span class="op">.</span><span class="nam">startswith</span><span class="op">(</span><span class="str">'http:'</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"> <span class="nam">source_url</span> <span class="op">=</span> <span class="nam">line</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"> <span class="key">if</span> <span class="nam">ingredient_mode</span> <span class="op">==</span> <span class="num">1</span> <span class="key">and</span> <span class="nam">len</span><span class="op">(</span><span class="nam">line</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span> <span class="op">==</span> <span class="num">0</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"> <span class="nam">ingredient_mode</span> <span class="op">=</span> <span class="num">2</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"> <span class="key">if</span> <span class="nam">re</span><span class="op">.</span><span class="nam">match</span><span class="op">(</span><span class="str">r'^([0-9])[^.](.)*$'</span><span class="op">,</span> <span class="nam">line</span><span class="op">)</span> <span class="key">and</span> <span class="nam">ingredient_mode</span> <span class="op">&lt;</span> <span class="num">2</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"> <span class="nam">ingredient_mode</span> <span class="op">=</span> <span class="num">1</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"> <span class="nam">ingredients</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">line</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"> <span class="nam">directions</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">line</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="nam">recipe</span> <span class="op">=</span> <span class="nam">Recipe</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span><span class="nam">name</span><span class="op">=</span><span class="nam">title</span><span class="op">,</span> <span class="nam">created_by</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">,</span> <span class="nam">internal</span><span class="op">=</span><span class="key">True</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"> <span class="nam">step</span> <span class="op">=</span> <span class="nam">Step</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span><span class="nam">instruction</span><span class="op">=</span><span class="str">'\n'</span><span class="op">.</span><span class="nam">join</span><span class="op">(</span><span class="nam">directions</span><span class="op">)</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span> <span class="nam">show_ingredients_table</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">.</span><span class="nam">userpreference</span><span class="op">.</span><span class="nam">show_step_ingredients</span><span class="op">,</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="key">if</span> <span class="nam">source_url</span> <span class="op">!=</span> <span class="str">''</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"> <span class="nam">step</span><span class="op">.</span><span class="nam">instruction</span> <span class="op">+=</span> <span class="str">'\n'</span> <span class="op">+</span> <span class="nam">source_url</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"> <span class="nam">step</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="nam">ingredient_parser</span> <span class="op">=</span> <span class="nam">IngredientParser</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">,</span> <span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="key">for</span> <span class="nam">ingredient</span> <span class="key">in</span> <span class="nam">ingredients</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">ingredient</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="nam">amount</span><span class="op">,</span> <span class="nam">unit</span><span class="op">,</span> <span class="nam">food</span><span class="op">,</span> <span class="nam">note</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">parse</span><span class="op">(</span><span class="nam">ingredient</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="nam">f</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">get_food</span><span class="op">(</span><span class="nam">food</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="nam">u</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">get_unit</span><span class="op">(</span><span class="nam">unit</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"> <span class="nam">step</span><span class="op">.</span><span class="nam">ingredients</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">Ingredient</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"> <span class="nam">food</span><span class="op">=</span><span class="nam">f</span><span class="op">,</span> <span class="nam">unit</span><span class="op">=</span><span class="nam">u</span><span class="op">,</span> <span class="nam">amount</span><span class="op">=</span><span class="nam">amount</span><span class="op">,</span> <span class="nam">note</span><span class="op">=</span><span class="nam">note</span><span class="op">,</span> <span class="nam">original_text</span><span class="op">=</span><span class="nam">ingredient</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"> <span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">steps</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">step</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="key">return</span> <span class="nam">recipe</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_file_from_recipe</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">recipe</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="key">raise</span> <span class="nam">NotImplementedError</span><span class="op">(</span><span class="str">'Method not implemented in storage integration'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
</main>
<footer>
<div class="content">
<p>
<a id="prevFileLink" class="nav" href="d_f8cd9a78c43a323f_unit_conversion_helper_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_37812bb4c19c71da_chowdown_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
</div>
</footer>
</body>
</html>

View File

@@ -1,219 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Coverage for cookbook/integration/chowdown.py: 12%</title>
<link rel="icon" sizes="32x32" href="favicon_32.png">
<link rel="stylesheet" href="style.css" type="text/css">
<script type="text/javascript" src="coverage_html.js" defer></script>
</head>
<body class="pyfile">
<header>
<div class="content">
<h1>
<span class="text">Coverage for </span><b>cookbook/integration/chowdown.py</b>:
<span class="pc_cov">12%</span>
</h1>
<aside id="help_panel_wrapper">
<input id="help_panel_state" type="checkbox">
<label for="help_panel_state">
<img id="keyboard_icon" src="keybd_closed.png" alt="Show/hide keyboard shortcuts" />
</label>
<div id="help_panel">
<p class="legend">Shortcuts on this page</p>
<div class="keyhelp">
<p>
<kbd>r</kbd>
<kbd>m</kbd>
<kbd>x</kbd>
&nbsp; toggle line displays
</p>
<p>
<kbd>j</kbd>
<kbd>k</kbd>
&nbsp; next/prev highlighted chunk
</p>
<p>
<kbd>0</kbd> &nbsp; (zero) top of page
</p>
<p>
<kbd>1</kbd> &nbsp; (one) first highlighted chunk
</p>
<p>
<kbd>[</kbd>
<kbd>]</kbd>
&nbsp; prev/next file
</p>
<p>
<kbd>u</kbd> &nbsp; up to the index
</p>
<p>
<kbd>?</kbd> &nbsp; show/hide this help
</p>
</div>
</div>
</aside>
<h2>
<span class="text">96 statements &nbsp;</span>
<button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">12<span class="text"> run</span></button>
<button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">84<span class="text"> missing</span></button>
<button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
</h2>
<p class="text">
<a id="prevFileLink" class="nav" href="d_37812bb4c19c71da_cheftap_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_37812bb4c19c71da_cookbookapp_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
<aside class="hidden">
<button type="button" class="button_next_chunk" data-shortcut="j"/>
<button type="button" class="button_prev_chunk" data-shortcut="k"/>
<button type="button" class="button_top_of_page" data-shortcut="0"/>
<button type="button" class="button_first_chunk" data-shortcut="1"/>
<button type="button" class="button_prev_file" data-shortcut="["/>
<button type="button" class="button_next_file" data-shortcut="]"/>
<button type="button" class="button_to_index" data-shortcut="u"/>
<button type="button" class="button_show_hide_help" data-shortcut="?"/>
</aside>
</div>
</header>
<main id="source">
<p class="run"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">re</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">from</span> <span class="nam">io</span> <span class="key">import</span> <span class="nam">BytesIO</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">from</span> <span class="nam">zipfile</span> <span class="key">import</span> <span class="nam">ZipFile</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">helper</span><span class="op">.</span><span class="nam">image_processing</span> <span class="key">import</span> <span class="nam">get_filetype</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">helper</span><span class="op">.</span><span class="nam">ingredient_parser</span> <span class="key">import</span> <span class="nam">IngredientParser</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">helper</span><span class="op">.</span><span class="nam">recipe_url_import</span> <span class="key">import</span> <span class="nam">parse_servings</span><span class="op">,</span> <span class="nam">parse_servings_text</span><span class="op">,</span> <span class="nam">parse_time</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">integration</span><span class="op">.</span><span class="nam">integration</span> <span class="key">import</span> <span class="nam">Integration</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">models</span> <span class="key">import</span> <span class="nam">Ingredient</span><span class="op">,</span> <span class="nam">Keyword</span><span class="op">,</span> <span class="nam">Recipe</span><span class="op">,</span> <span class="nam">Step</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"><span class="key">class</span> <span class="nam">Chowdown</span><span class="op">(</span><span class="nam">Integration</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"> <span class="key">def</span> <span class="nam">import_file_name_filter</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">zip_info_object</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="str">"testing"</span><span class="op">,</span> <span class="nam">zip_info_object</span><span class="op">.</span><span class="nam">filename</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"> <span class="key">return</span> <span class="nam">re</span><span class="op">.</span><span class="nam">match</span><span class="op">(</span><span class="str">r'^(_)*recipes/([A-Za-z\d\s\-_()\[\]\u00C0-\u017F])+.md$'</span><span class="op">,</span> <span class="nam">zip_info_object</span><span class="op">.</span><span class="nam">filename</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_recipe_from_file</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">file</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"> <span class="nam">ingredient_mode</span> <span class="op">=</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"> <span class="nam">direction_mode</span> <span class="op">=</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"> <span class="nam">description_mode</span> <span class="op">=</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"> <span class="nam">description</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"> <span class="nam">prep_time</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"> <span class="nam">serving</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"> <span class="nam">ingredients</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"> <span class="nam">directions</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"> <span class="nam">descriptions</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"> <span class="key">for</span> <span class="nam">fl</span> <span class="key">in</span> <span class="nam">file</span><span class="op">.</span><span class="nam">readlines</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"> <span class="nam">line</span> <span class="op">=</span> <span class="nam">fl</span><span class="op">.</span><span class="nam">decode</span><span class="op">(</span><span class="str">"utf-8"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"> <span class="key">if</span> <span class="str">'title:'</span> <span class="key">in</span> <span class="nam">line</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"> <span class="nam">title</span> <span class="op">=</span> <span class="nam">line</span><span class="op">.</span><span class="nam">replace</span><span class="op">(</span><span class="str">'title:'</span><span class="op">,</span> <span class="str">''</span><span class="op">)</span><span class="op">.</span><span class="nam">replace</span><span class="op">(</span><span class="str">'"'</span><span class="op">,</span> <span class="str">''</span><span class="op">)</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"> <span class="key">if</span> <span class="str">'description:'</span> <span class="key">in</span> <span class="nam">line</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"> <span class="nam">description</span> <span class="op">=</span> <span class="nam">line</span><span class="op">.</span><span class="nam">replace</span><span class="op">(</span><span class="str">'description:'</span><span class="op">,</span> <span class="str">''</span><span class="op">)</span><span class="op">.</span><span class="nam">replace</span><span class="op">(</span><span class="str">'"'</span><span class="op">,</span> <span class="str">''</span><span class="op">)</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"> <span class="key">if</span> <span class="str">'prep_time:'</span> <span class="key">in</span> <span class="nam">line</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="nam">prep_time</span> <span class="op">=</span> <span class="nam">line</span><span class="op">.</span><span class="nam">replace</span><span class="op">(</span><span class="str">'prep_time:'</span><span class="op">,</span> <span class="str">''</span><span class="op">)</span><span class="op">.</span><span class="nam">replace</span><span class="op">(</span><span class="str">'"'</span><span class="op">,</span> <span class="str">''</span><span class="op">)</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"> <span class="key">if</span> <span class="str">'yield:'</span> <span class="key">in</span> <span class="nam">line</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"> <span class="nam">serving</span> <span class="op">=</span> <span class="nam">line</span><span class="op">.</span><span class="nam">replace</span><span class="op">(</span><span class="str">'yield:'</span><span class="op">,</span> <span class="str">''</span><span class="op">)</span><span class="op">.</span><span class="nam">replace</span><span class="op">(</span><span class="str">'"'</span><span class="op">,</span> <span class="str">''</span><span class="op">)</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"> <span class="key">if</span> <span class="str">'image:'</span> <span class="key">in</span> <span class="nam">line</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="nam">image</span> <span class="op">=</span> <span class="nam">line</span><span class="op">.</span><span class="nam">replace</span><span class="op">(</span><span class="str">'image:'</span><span class="op">,</span> <span class="str">''</span><span class="op">)</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"> <span class="key">if</span> <span class="str">'tags:'</span> <span class="key">in</span> <span class="nam">line</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"> <span class="nam">tags</span> <span class="op">=</span> <span class="nam">line</span><span class="op">.</span><span class="nam">replace</span><span class="op">(</span><span class="str">'tags:'</span><span class="op">,</span> <span class="str">''</span><span class="op">)</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="key">if</span> <span class="nam">ingredient_mode</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">line</span><span class="op">)</span> <span class="op">></span> <span class="num">2</span> <span class="key">and</span> <span class="str">'directions:'</span> <span class="key">not</span> <span class="key">in</span> <span class="nam">line</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="nam">ingredients</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">line</span><span class="op">[</span><span class="num">2</span><span class="op">:</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"> <span class="key">if</span> <span class="str">'---'</span> <span class="key">in</span> <span class="nam">line</span> <span class="key">and</span> <span class="nam">direction_mode</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="nam">direction_mode</span> <span class="op">=</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="nam">description_mode</span> <span class="op">=</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="key">if</span> <span class="nam">direction_mode</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">line</span><span class="op">)</span> <span class="op">></span> <span class="num">2</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"> <span class="nam">directions</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">line</span><span class="op">[</span><span class="num">2</span><span class="op">:</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"> <span class="key">if</span> <span class="str">'ingredients:'</span> <span class="key">in</span> <span class="nam">line</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="nam">ingredient_mode</span> <span class="op">=</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"> <span class="key">if</span> <span class="str">'directions:'</span> <span class="key">in</span> <span class="nam">line</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="nam">ingredient_mode</span> <span class="op">=</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"> <span class="nam">direction_mode</span> <span class="op">=</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"> <span class="key">if</span> <span class="nam">description_mode</span> <span class="key">and</span> <span class="nam">len</span><span class="op">(</span><span class="nam">line</span><span class="op">)</span> <span class="op">></span> <span class="num">3</span> <span class="key">and</span> <span class="str">'---'</span> <span class="key">not</span> <span class="key">in</span> <span class="nam">line</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="nam">descriptions</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">line</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"> <span class="nam">recipe</span> <span class="op">=</span> <span class="nam">Recipe</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span><span class="nam">name</span><span class="op">=</span><span class="nam">title</span><span class="op">,</span> <span class="nam">created_by</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">,</span> <span class="nam">internal</span><span class="op">=</span><span class="key">True</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"> <span class="key">if</span> <span class="nam">description</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">description</span> <span class="op">=</span> <span class="nam">description</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"> <span class="key">for</span> <span class="nam">k</span> <span class="key">in</span> <span class="nam">tags</span><span class="op">.</span><span class="nam">split</span><span class="op">(</span><span class="str">','</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"> <span class="nam">keyword</span><span class="op">,</span> <span class="nam">created</span> <span class="op">=</span> <span class="nam">Keyword</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">get_or_create</span><span class="op">(</span><span class="nam">name</span><span class="op">=</span><span class="nam">k</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">keywords</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">keyword</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"> <span class="nam">ingredients_added</span> <span class="op">=</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> <span class="key">for</span> <span class="nam">direction</span> <span class="key">in</span> <span class="nam">directions</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">direction</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="nam">step</span> <span class="op">=</span> <span class="nam">Step</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"> <span class="nam">instruction</span><span class="op">=</span><span class="nam">direction</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">''</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span> <span class="nam">show_ingredients_table</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">.</span><span class="nam">userpreference</span><span class="op">.</span><span class="nam">show_step_ingredients</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t"> <span class="nam">step</span> <span class="op">=</span> <span class="nam">Step</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"> <span class="nam">instruction</span><span class="op">=</span><span class="nam">direction</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span> <span class="nam">show_ingredients_table</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">.</span><span class="nam">userpreference</span><span class="op">.</span><span class="nam">show_step_ingredients</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">ingredients_added</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"> <span class="nam">ingredients_added</span> <span class="op">=</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"> <span class="nam">ingredient_parser</span> <span class="op">=</span> <span class="nam">IngredientParser</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">,</span> <span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"> <span class="key">for</span> <span class="nam">ingredient</span> <span class="key">in</span> <span class="nam">ingredients</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">ingredient</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"> <span class="nam">amount</span><span class="op">,</span> <span class="nam">unit</span><span class="op">,</span> <span class="nam">food</span><span class="op">,</span> <span class="nam">note</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">parse</span><span class="op">(</span><span class="nam">ingredient</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t"> <span class="nam">f</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">get_food</span><span class="op">(</span><span class="nam">food</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t"> <span class="nam">u</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">get_unit</span><span class="op">(</span><span class="nam">unit</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t"> <span class="nam">step</span><span class="op">.</span><span class="nam">ingredients</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">Ingredient</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t"> <span class="nam">food</span><span class="op">=</span><span class="nam">f</span><span class="op">,</span> <span class="nam">unit</span><span class="op">=</span><span class="nam">u</span><span class="op">,</span> <span class="nam">amount</span><span class="op">=</span><span class="nam">amount</span><span class="op">,</span> <span class="nam">note</span><span class="op">=</span><span class="nam">note</span><span class="op">,</span> <span class="nam">original_text</span><span class="op">=</span><span class="nam">ingredient</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t"> <span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">steps</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">step</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t"> <span class="key">if</span> <span class="nam">serving</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">servings</span> <span class="op">=</span> <span class="nam">parse_servings</span><span class="op">(</span><span class="nam">serving</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">servings_text</span> <span class="op">=</span> <span class="str">'servings'</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t"> <span class="key">if</span> <span class="nam">prep_time</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">working_time</span> <span class="op">=</span> <span class="nam">parse_time</span><span class="op">(</span><span class="nam">prep_time</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t"> <span class="nam">ingredient_parser</span> <span class="op">=</span> <span class="nam">IngredientParser</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">,</span> <span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t"> <span class="key">for</span> <span class="nam">ingredient</span> <span class="key">in</span> <span class="nam">ingredients</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">ingredient</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t"> <span class="nam">amount</span><span class="op">,</span> <span class="nam">unit</span><span class="op">,</span> <span class="nam">food</span><span class="op">,</span> <span class="nam">note</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">parse</span><span class="op">(</span><span class="nam">ingredient</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t"> <span class="nam">f</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">get_food</span><span class="op">(</span><span class="nam">food</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t"> <span class="nam">u</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">get_unit</span><span class="op">(</span><span class="nam">unit</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t"> <span class="nam">step</span><span class="op">.</span><span class="nam">ingredients</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">Ingredient</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"> <span class="nam">food</span><span class="op">=</span><span class="nam">f</span><span class="op">,</span> <span class="nam">unit</span><span class="op">=</span><span class="nam">u</span><span class="op">,</span> <span class="nam">amount</span><span class="op">=</span><span class="nam">amount</span><span class="op">,</span> <span class="nam">note</span><span class="op">=</span><span class="nam">note</span><span class="op">,</span> <span class="nam">original_text</span><span class="op">=</span><span class="nam">ingredient</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t"> <span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">steps</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">step</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t"> <span class="key">for</span> <span class="nam">f</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">files</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t"> <span class="key">if</span> <span class="str">'.zip'</span> <span class="key">in</span> <span class="nam">f</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t113" href="#t113">113</a></span><span class="t"> <span class="nam">import_zip</span> <span class="op">=</span> <span class="nam">ZipFile</span><span class="op">(</span><span class="nam">f</span><span class="op">[</span><span class="str">'file'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t114" href="#t114">114</a></span><span class="t"> <span class="key">for</span> <span class="nam">z</span> <span class="key">in</span> <span class="nam">import_zip</span><span class="op">.</span><span class="nam">filelist</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t115" href="#t115">115</a></span><span class="t"> <span class="key">if</span> <span class="nam">re</span><span class="op">.</span><span class="nam">match</span><span class="op">(</span><span class="str">f'^images/{image}$'</span><span class="op">,</span> <span class="nam">z</span><span class="op">.</span><span class="nam">filename</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t116" href="#t116">116</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">import_recipe_image</span><span class="op">(</span><span class="nam">recipe</span><span class="op">,</span> <span class="nam">BytesIO</span><span class="op">(</span><span class="nam">import_zip</span><span class="op">.</span><span class="nam">read</span><span class="op">(</span><span class="nam">z</span><span class="op">.</span><span class="nam">filename</span><span class="op">)</span><span class="op">)</span><span class="op">,</span> <span class="nam">filetype</span><span class="op">=</span><span class="nam">get_filetype</span><span class="op">(</span><span class="nam">z</span><span class="op">.</span><span class="nam">filename</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t117" href="#t117">117</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t118" href="#t118">118</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t119" href="#t119">119</a></span><span class="t"> <span class="key">return</span> <span class="nam">recipe</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t120" href="#t120">120</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t121" href="#t121">121</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_file_from_recipe</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">recipe</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t122" href="#t122">122</a></span><span class="t"> <span class="key">raise</span> <span class="nam">NotImplementedError</span><span class="op">(</span><span class="str">'Method not implemented in storage integration'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
</main>
<footer>
<div class="content">
<p>
<a id="prevFileLink" class="nav" href="d_37812bb4c19c71da_cheftap_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_37812bb4c19c71da_cookbookapp_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
</div>
</footer>
</body>
</html>

View File

@@ -1,170 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Coverage for cookbook/integration/cookbookapp.py: 24%</title>
<link rel="icon" sizes="32x32" href="favicon_32.png">
<link rel="stylesheet" href="style.css" type="text/css">
<script type="text/javascript" src="coverage_html.js" defer></script>
</head>
<body class="pyfile">
<header>
<div class="content">
<h1>
<span class="text">Coverage for </span><b>cookbook/integration/cookbookapp.py</b>:
<span class="pc_cov">24%</span>
</h1>
<aside id="help_panel_wrapper">
<input id="help_panel_state" type="checkbox">
<label for="help_panel_state">
<img id="keyboard_icon" src="keybd_closed.png" alt="Show/hide keyboard shortcuts" />
</label>
<div id="help_panel">
<p class="legend">Shortcuts on this page</p>
<div class="keyhelp">
<p>
<kbd>r</kbd>
<kbd>m</kbd>
<kbd>x</kbd>
&nbsp; toggle line displays
</p>
<p>
<kbd>j</kbd>
<kbd>k</kbd>
&nbsp; next/prev highlighted chunk
</p>
<p>
<kbd>0</kbd> &nbsp; (zero) top of page
</p>
<p>
<kbd>1</kbd> &nbsp; (one) first highlighted chunk
</p>
<p>
<kbd>[</kbd>
<kbd>]</kbd>
&nbsp; prev/next file
</p>
<p>
<kbd>u</kbd> &nbsp; up to the index
</p>
<p>
<kbd>?</kbd> &nbsp; show/hide this help
</p>
</div>
</div>
</aside>
<h2>
<span class="text">49 statements &nbsp;</span>
<button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">12<span class="text"> run</span></button>
<button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">37<span class="text"> missing</span></button>
<button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
</h2>
<p class="text">
<a id="prevFileLink" class="nav" href="d_37812bb4c19c71da_chowdown_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_37812bb4c19c71da_cookmate_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
<aside class="hidden">
<button type="button" class="button_next_chunk" data-shortcut="j"/>
<button type="button" class="button_prev_chunk" data-shortcut="k"/>
<button type="button" class="button_top_of_page" data-shortcut="0"/>
<button type="button" class="button_first_chunk" data-shortcut="1"/>
<button type="button" class="button_prev_file" data-shortcut="["/>
<button type="button" class="button_next_file" data-shortcut="]"/>
<button type="button" class="button_to_index" data-shortcut="u"/>
<button type="button" class="button_show_hide_help" data-shortcut="?"/>
</aside>
</div>
</header>
<main id="source">
<p class="run"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">re</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">from</span> <span class="nam">io</span> <span class="key">import</span> <span class="nam">BytesIO</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">import</span> <span class="nam">requests</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">import</span> <span class="nam">validators</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">helper</span><span class="op">.</span><span class="nam">ingredient_parser</span> <span class="key">import</span> <span class="nam">IngredientParser</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">helper</span><span class="op">.</span><span class="nam">recipe_url_import</span> <span class="key">import</span> <span class="op">(</span><span class="nam">get_from_scraper</span><span class="op">,</span> <span class="nam">get_images_from_soup</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"> <span class="nam">iso_duration_to_minutes</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">helper</span><span class="op">.</span><span class="nam">scrapers</span><span class="op">.</span><span class="nam">scrapers</span> <span class="key">import</span> <span class="nam">text_scraper</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">integration</span><span class="op">.</span><span class="nam">integration</span> <span class="key">import</span> <span class="nam">Integration</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">models</span> <span class="key">import</span> <span class="nam">Ingredient</span><span class="op">,</span> <span class="nam">Recipe</span><span class="op">,</span> <span class="nam">Step</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"><span class="key">class</span> <span class="nam">CookBookApp</span><span class="op">(</span><span class="nam">Integration</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"> <span class="key">def</span> <span class="nam">import_file_name_filter</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">zip_info_object</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"> <span class="key">return</span> <span class="nam">zip_info_object</span><span class="op">.</span><span class="nam">filename</span><span class="op">.</span><span class="nam">endswith</span><span class="op">(</span><span class="str">'.html'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_recipe_from_file</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">file</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"> <span class="nam">recipe_html</span> <span class="op">=</span> <span class="nam">file</span><span class="op">.</span><span class="nam">getvalue</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">decode</span><span class="op">(</span><span class="str">"utf-8"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"> <span class="nam">scrape</span> <span class="op">=</span> <span class="nam">text_scraper</span><span class="op">(</span><span class="nam">text</span><span class="op">=</span><span class="nam">recipe_html</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"> <span class="nam">recipe_json</span> <span class="op">=</span> <span class="nam">get_from_scraper</span><span class="op">(</span><span class="nam">scrape</span><span class="op">,</span> <span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"> <span class="nam">images</span> <span class="op">=</span> <span class="nam">list</span><span class="op">(</span><span class="nam">dict</span><span class="op">.</span><span class="nam">fromkeys</span><span class="op">(</span><span class="nam">get_images_from_soup</span><span class="op">(</span><span class="nam">scrape</span><span class="op">.</span><span class="nam">soup</span><span class="op">,</span> <span class="key">None</span><span class="op">)</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"> <span class="nam">recipe</span> <span class="op">=</span> <span class="nam">Recipe</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"> <span class="nam">name</span><span class="op">=</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"> <span class="nam">created_by</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">,</span> <span class="nam">internal</span><span class="op">=</span><span class="key">True</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">servings</span> <span class="op">=</span> <span class="nam">re</span><span class="op">.</span><span class="nam">findall</span><span class="op">(</span><span class="str">'([0-9])+'</span><span class="op">,</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'recipeYield'</span><span class="op">]</span><span class="op">)</span><span class="op">[</span><span class="num">0</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">working_time</span> <span class="op">=</span> <span class="nam">iso_duration_to_minutes</span><span class="op">(</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'prepTime'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">waiting_time</span> <span class="op">=</span> <span class="nam">iso_duration_to_minutes</span><span class="op">(</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'cookTime'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"> <span class="com"># assuming import files only contain single step</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="nam">step</span> <span class="op">=</span> <span class="nam">Step</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span><span class="nam">instruction</span><span class="op">=</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'steps'</span><span class="op">]</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="op">[</span><span class="str">'instruction'</span><span class="op">]</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="nam">show_ingredients_table</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">.</span><span class="nam">userpreference</span><span class="op">.</span><span class="nam">show_step_ingredients</span><span class="op">,</span> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"> <span class="key">if</span> <span class="str">'nutrition'</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="nam">step</span><span class="op">.</span><span class="nam">instruction</span> <span class="op">=</span> <span class="nam">step</span><span class="op">.</span><span class="nam">instruction</span> <span class="op">+</span> <span class="str">'\n\n'</span> <span class="op">+</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'nutrition'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="nam">step</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">steps</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">step</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"> <span class="nam">ingredient_parser</span> <span class="op">=</span> <span class="nam">IngredientParser</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">,</span> <span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="key">for</span> <span class="nam">ingredient</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'steps'</span><span class="op">]</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="op">[</span><span class="str">'ingredients'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"> <span class="nam">f</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">get_food</span><span class="op">(</span><span class="nam">ingredient</span><span class="op">[</span><span class="str">'food'</span><span class="op">]</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="nam">u</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"> <span class="key">if</span> <span class="nam">unit</span> <span class="op">:=</span> <span class="nam">ingredient</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">'unit'</span><span class="op">,</span> <span class="key">None</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"> <span class="nam">u</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">get_unit</span><span class="op">(</span><span class="nam">unit</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">'name'</span><span class="op">,</span> <span class="key">None</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="nam">step</span><span class="op">.</span><span class="nam">ingredients</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">Ingredient</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"> <span class="nam">food</span><span class="op">=</span><span class="nam">f</span><span class="op">,</span> <span class="nam">unit</span><span class="op">=</span><span class="nam">u</span><span class="op">,</span> <span class="nam">amount</span><span class="op">=</span><span class="nam">ingredient</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">'amount'</span><span class="op">,</span> <span class="key">None</span><span class="op">)</span><span class="op">,</span> <span class="nam">note</span><span class="op">=</span><span class="nam">ingredient</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">'note'</span><span class="op">,</span> <span class="key">None</span><span class="op">)</span><span class="op">,</span> <span class="nam">original_text</span><span class="op">=</span><span class="nam">ingredient</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">'original_text'</span><span class="op">,</span> <span class="key">None</span><span class="op">)</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"> <span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">images</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"> <span class="nam">url</span> <span class="op">=</span> <span class="nam">images</span><span class="op">[</span><span class="num">0</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"> <span class="key">if</span> <span class="nam">validators</span><span class="op">.</span><span class="nam">url</span><span class="op">(</span><span class="nam">url</span><span class="op">,</span> <span class="nam">public</span><span class="op">=</span><span class="key">True</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t"> <span class="nam">response</span> <span class="op">=</span> <span class="nam">requests</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">url</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">import_recipe_image</span><span class="op">(</span><span class="nam">recipe</span><span class="op">,</span> <span class="nam">BytesIO</span><span class="op">(</span><span class="nam">response</span><span class="op">.</span><span class="nam">content</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="str">'failed to import image '</span><span class="op">,</span> <span class="nam">str</span><span class="op">(</span><span class="nam">e</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"> <span class="key">return</span> <span class="nam">recipe</span>&nbsp;</span><span class="r"></span></p>
</main>
<footer>
<div class="content">
<p>
<a id="prevFileLink" class="nav" href="d_37812bb4c19c71da_chowdown_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_37812bb4c19c71da_cookmate_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
</div>
</footer>
</body>
</html>

View File

@@ -1,180 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Coverage for cookbook/integration/cookmate.py: 21%</title>
<link rel="icon" sizes="32x32" href="favicon_32.png">
<link rel="stylesheet" href="style.css" type="text/css">
<script type="text/javascript" src="coverage_html.js" defer></script>
</head>
<body class="pyfile">
<header>
<div class="content">
<h1>
<span class="text">Coverage for </span><b>cookbook/integration/cookmate.py</b>:
<span class="pc_cov">21%</span>
</h1>
<aside id="help_panel_wrapper">
<input id="help_panel_state" type="checkbox">
<label for="help_panel_state">
<img id="keyboard_icon" src="keybd_closed.png" alt="Show/hide keyboard shortcuts" />
</label>
<div id="help_panel">
<p class="legend">Shortcuts on this page</p>
<div class="keyhelp">
<p>
<kbd>r</kbd>
<kbd>m</kbd>
<kbd>x</kbd>
&nbsp; toggle line displays
</p>
<p>
<kbd>j</kbd>
<kbd>k</kbd>
&nbsp; next/prev highlighted chunk
</p>
<p>
<kbd>0</kbd> &nbsp; (zero) top of page
</p>
<p>
<kbd>1</kbd> &nbsp; (one) first highlighted chunk
</p>
<p>
<kbd>[</kbd>
<kbd>]</kbd>
&nbsp; prev/next file
</p>
<p>
<kbd>u</kbd> &nbsp; up to the index
</p>
<p>
<kbd>?</kbd> &nbsp; show/hide this help
</p>
</div>
</div>
</aside>
<h2>
<span class="text">56 statements &nbsp;</span>
<button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">12<span class="text"> run</span></button>
<button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">44<span class="text"> missing</span></button>
<button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
</h2>
<p class="text">
<a id="prevFileLink" class="nav" href="d_37812bb4c19c71da_cookbookapp_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_37812bb4c19c71da_copymethat_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
<aside class="hidden">
<button type="button" class="button_next_chunk" data-shortcut="j"/>
<button type="button" class="button_prev_chunk" data-shortcut="k"/>
<button type="button" class="button_top_of_page" data-shortcut="0"/>
<button type="button" class="button_first_chunk" data-shortcut="1"/>
<button type="button" class="button_prev_file" data-shortcut="["/>
<button type="button" class="button_next_file" data-shortcut="]"/>
<button type="button" class="button_to_index" data-shortcut="u"/>
<button type="button" class="button_show_hide_help" data-shortcut="?"/>
</aside>
</div>
</header>
<main id="source">
<p class="run"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">from</span> <span class="nam">io</span> <span class="key">import</span> <span class="nam">BytesIO</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">import</span> <span class="nam">requests</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">import</span> <span class="nam">validators</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">helper</span><span class="op">.</span><span class="nam">ingredient_parser</span> <span class="key">import</span> <span class="nam">IngredientParser</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">helper</span><span class="op">.</span><span class="nam">recipe_url_import</span> <span class="key">import</span> <span class="nam">parse_servings</span><span class="op">,</span> <span class="nam">parse_servings_text</span><span class="op">,</span> <span class="nam">parse_time</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">integration</span><span class="op">.</span><span class="nam">integration</span> <span class="key">import</span> <span class="nam">Integration</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">models</span> <span class="key">import</span> <span class="nam">Ingredient</span><span class="op">,</span> <span class="nam">Recipe</span><span class="op">,</span> <span class="nam">Step</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"><span class="key">class</span> <span class="nam">Cookmate</span><span class="op">(</span><span class="nam">Integration</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"> <span class="key">def</span> <span class="nam">import_file_name_filter</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">zip_info_object</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"> <span class="key">return</span> <span class="nam">zip_info_object</span><span class="op">.</span><span class="nam">filename</span><span class="op">.</span><span class="nam">endswith</span><span class="op">(</span><span class="str">'.xml'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_files_from_recipes</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">recipes</span><span class="op">,</span> <span class="nam">el</span><span class="op">,</span> <span class="nam">cookie</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"> <span class="key">raise</span> <span class="nam">NotImplementedError</span><span class="op">(</span><span class="str">'Method not implemented in storage integration'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_recipe_from_file</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">file</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"> <span class="nam">recipe_xml</span> <span class="op">=</span> <span class="nam">file</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"> <span class="nam">recipe</span> <span class="op">=</span> <span class="nam">Recipe</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"> <span class="nam">name</span><span class="op">=</span><span class="nam">recipe_xml</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">'title'</span><span class="op">)</span><span class="op">.</span><span class="nam">text</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"> <span class="nam">created_by</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">,</span> <span class="nam">internal</span><span class="op">=</span><span class="key">True</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"> <span class="key">if</span> <span class="nam">recipe_xml</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">'preptime'</span><span class="op">)</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span> <span class="key">and</span> <span class="nam">recipe_xml</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">'preptime'</span><span class="op">)</span><span class="op">.</span><span class="nam">text</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">working_time</span> <span class="op">=</span> <span class="nam">parse_time</span><span class="op">(</span><span class="nam">recipe_xml</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">'preptime'</span><span class="op">)</span><span class="op">.</span><span class="nam">text</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"> <span class="key">if</span> <span class="nam">recipe_xml</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">'cooktime'</span><span class="op">)</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span> <span class="key">and</span> <span class="nam">recipe_xml</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">'cooktime'</span><span class="op">)</span><span class="op">.</span><span class="nam">text</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">waiting_time</span> <span class="op">=</span> <span class="nam">parse_time</span><span class="op">(</span><span class="nam">recipe_xml</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">'cooktime'</span><span class="op">)</span><span class="op">.</span><span class="nam">text</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"> <span class="key">if</span> <span class="nam">recipe_xml</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">'quantity'</span><span class="op">)</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span> <span class="key">and</span> <span class="nam">recipe_xml</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">'quantity'</span><span class="op">)</span><span class="op">.</span><span class="nam">text</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">servings</span> <span class="op">=</span> <span class="nam">parse_servings</span><span class="op">(</span><span class="nam">recipe_xml</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">'quantity'</span><span class="op">)</span><span class="op">.</span><span class="nam">text</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">servings_text</span> <span class="op">=</span> <span class="nam">parse_servings_text</span><span class="op">(</span><span class="nam">recipe_xml</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">'quantity'</span><span class="op">)</span><span class="op">.</span><span class="nam">text</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="key">if</span> <span class="nam">recipe_xml</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">'url'</span><span class="op">)</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span> <span class="key">and</span> <span class="nam">recipe_xml</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">'url'</span><span class="op">)</span><span class="op">.</span><span class="nam">text</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">source_url</span> <span class="op">=</span> <span class="nam">recipe_xml</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">'url'</span><span class="op">)</span><span class="op">.</span><span class="nam">text</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"> <span class="key">if</span> <span class="nam">recipe_xml</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">'description'</span><span class="op">)</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span> <span class="com"># description is a list of &lt;li>'s with text</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">recipe_xml</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">'description'</span><span class="op">)</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">description</span> <span class="op">=</span> <span class="nam">recipe_xml</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">'description'</span><span class="op">)</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="op">.</span><span class="nam">text</span><span class="op">[</span><span class="op">:</span><span class="num">512</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="key">if</span> <span class="nam">recipe_text</span> <span class="op">:=</span> <span class="nam">recipe_xml</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">'recipetext'</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="key">for</span> <span class="nam">step</span> <span class="key">in</span> <span class="nam">recipe_text</span><span class="op">.</span><span class="nam">getchildren</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="key">if</span> <span class="nam">step</span><span class="op">.</span><span class="nam">text</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"> <span class="nam">step</span> <span class="op">=</span> <span class="nam">Step</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="nam">instruction</span><span class="op">=</span><span class="nam">step</span><span class="op">.</span><span class="nam">text</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span> <span class="nam">show_ingredients_table</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">.</span><span class="nam">userpreference</span><span class="op">.</span><span class="nam">show_step_ingredients</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">steps</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">step</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"> <span class="nam">ingredient_parser</span> <span class="op">=</span> <span class="nam">IngredientParser</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">,</span> <span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="key">if</span> <span class="nam">recipe_ingredients</span> <span class="op">:=</span> <span class="nam">recipe_xml</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">'ingredient'</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"> <span class="nam">ingredient_step</span> <span class="op">=</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">steps</span><span class="op">.</span><span class="nam">first</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="key">if</span> <span class="nam">ingredient_step</span> <span class="key">is</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"> <span class="nam">ingredient_step</span> <span class="op">=</span> <span class="nam">Step</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span><span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span> <span class="nam">instruction</span><span class="op">=</span><span class="str">''</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="key">for</span> <span class="nam">ingredient</span> <span class="key">in</span> <span class="nam">recipe_ingredients</span><span class="op">.</span><span class="nam">getchildren</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"> <span class="key">if</span> <span class="nam">ingredient</span><span class="op">.</span><span class="nam">text</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"> <span class="key">if</span> <span class="nam">ingredient</span><span class="op">.</span><span class="nam">text</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span> <span class="op">!=</span> <span class="str">''</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"> <span class="nam">amount</span><span class="op">,</span> <span class="nam">unit</span><span class="op">,</span> <span class="nam">food</span><span class="op">,</span> <span class="nam">note</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">parse</span><span class="op">(</span><span class="nam">ingredient</span><span class="op">.</span><span class="nam">text</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="nam">f</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">get_food</span><span class="op">(</span><span class="nam">food</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"> <span class="nam">u</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">get_unit</span><span class="op">(</span><span class="nam">unit</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"> <span class="nam">ingredient_step</span><span class="op">.</span><span class="nam">ingredients</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">Ingredient</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"> <span class="nam">food</span><span class="op">=</span><span class="nam">f</span><span class="op">,</span> <span class="nam">unit</span><span class="op">=</span><span class="nam">u</span><span class="op">,</span> <span class="nam">amount</span><span class="op">=</span><span class="nam">amount</span><span class="op">,</span> <span class="nam">note</span><span class="op">=</span><span class="nam">note</span><span class="op">,</span> <span class="nam">original_text</span><span class="op">=</span><span class="nam">ingredient</span><span class="op">.</span><span class="nam">text</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t"> <span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"> <span class="key">if</span> <span class="nam">recipe_xml</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">'imageurl'</span><span class="op">)</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"> <span class="nam">url</span> <span class="op">=</span> <span class="nam">recipe_xml</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">'imageurl'</span><span class="op">)</span><span class="op">.</span><span class="nam">text</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="key">if</span> <span class="nam">validators</span><span class="op">.</span><span class="nam">url</span><span class="op">(</span><span class="nam">url</span><span class="op">,</span> <span class="nam">public</span><span class="op">=</span><span class="key">True</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"> <span class="nam">response</span> <span class="op">=</span> <span class="nam">requests</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">url</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">import_recipe_image</span><span class="op">(</span><span class="nam">recipe</span><span class="op">,</span> <span class="nam">BytesIO</span><span class="op">(</span><span class="nam">response</span><span class="op">.</span><span class="nam">content</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="str">'failed to import image '</span><span class="op">,</span> <span class="nam">str</span><span class="op">(</span><span class="nam">e</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"> <span class="key">return</span> <span class="nam">recipe</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_file_from_recipe</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">recipe</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"> <span class="key">raise</span> <span class="nam">NotImplementedError</span><span class="op">(</span><span class="str">'Method not implemented in storage integration'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
</main>
<footer>
<div class="content">
<p>
<a id="prevFileLink" class="nav" href="d_37812bb4c19c71da_cookbookapp_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_37812bb4c19c71da_copymethat_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
</div>
</footer>
</body>
</html>

View File

@@ -1,227 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Coverage for cookbook/integration/copymethat.py: 14%</title>
<link rel="icon" sizes="32x32" href="favicon_32.png">
<link rel="stylesheet" href="style.css" type="text/css">
<script type="text/javascript" src="coverage_html.js" defer></script>
</head>
<body class="pyfile">
<header>
<div class="content">
<h1>
<span class="text">Coverage for </span><b>cookbook/integration/copymethat.py</b>:
<span class="pc_cov">14%</span>
</h1>
<aside id="help_panel_wrapper">
<input id="help_panel_state" type="checkbox">
<label for="help_panel_state">
<img id="keyboard_icon" src="keybd_closed.png" alt="Show/hide keyboard shortcuts" />
</label>
<div id="help_panel">
<p class="legend">Shortcuts on this page</p>
<div class="keyhelp">
<p>
<kbd>r</kbd>
<kbd>m</kbd>
<kbd>x</kbd>
&nbsp; toggle line displays
</p>
<p>
<kbd>j</kbd>
<kbd>k</kbd>
&nbsp; next/prev highlighted chunk
</p>
<p>
<kbd>0</kbd> &nbsp; (zero) top of page
</p>
<p>
<kbd>1</kbd> &nbsp; (one) first highlighted chunk
</p>
<p>
<kbd>[</kbd>
<kbd>]</kbd>
&nbsp; prev/next file
</p>
<p>
<kbd>u</kbd> &nbsp; up to the index
</p>
<p>
<kbd>?</kbd> &nbsp; show/hide this help
</p>
</div>
</div>
</aside>
<h2>
<span class="text">94 statements &nbsp;</span>
<button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">13<span class="text"> run</span></button>
<button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">81<span class="text"> missing</span></button>
<button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
</h2>
<p class="text">
<a id="prevFileLink" class="nav" href="d_37812bb4c19c71da_cookmate_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_37812bb4c19c71da_default_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
<aside class="hidden">
<button type="button" class="button_next_chunk" data-shortcut="j"/>
<button type="button" class="button_prev_chunk" data-shortcut="k"/>
<button type="button" class="button_top_of_page" data-shortcut="0"/>
<button type="button" class="button_first_chunk" data-shortcut="1"/>
<button type="button" class="button_prev_file" data-shortcut="["/>
<button type="button" class="button_next_file" data-shortcut="]"/>
<button type="button" class="button_to_index" data-shortcut="u"/>
<button type="button" class="button_show_hide_help" data-shortcut="?"/>
</aside>
</div>
</header>
<main id="source">
<p class="run"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">from</span> <span class="nam">io</span> <span class="key">import</span> <span class="nam">BytesIO</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">from</span> <span class="nam">zipfile</span> <span class="key">import</span> <span class="nam">ZipFile</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">from</span> <span class="nam">bs4</span> <span class="key">import</span> <span class="nam">BeautifulSoup</span><span class="op">,</span> <span class="nam">Tag</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">from</span> <span class="nam">django</span><span class="op">.</span><span class="nam">utils</span><span class="op">.</span><span class="nam">translation</span> <span class="key">import</span> <span class="nam">gettext</span> <span class="key">as</span> <span class="nam">_</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">helper</span><span class="op">.</span><span class="nam">ingredient_parser</span> <span class="key">import</span> <span class="nam">IngredientParser</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">helper</span><span class="op">.</span><span class="nam">recipe_url_import</span> <span class="key">import</span> <span class="nam">iso_duration_to_minutes</span><span class="op">,</span> <span class="nam">parse_servings</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">integration</span><span class="op">.</span><span class="nam">integration</span> <span class="key">import</span> <span class="nam">Integration</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">models</span> <span class="key">import</span> <span class="nam">Ingredient</span><span class="op">,</span> <span class="nam">Keyword</span><span class="op">,</span> <span class="nam">Recipe</span><span class="op">,</span> <span class="nam">Step</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="key">from</span> <span class="nam">recipes</span><span class="op">.</span><span class="nam">settings</span> <span class="key">import</span> <span class="nam">DEBUG</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"><span class="key">class</span> <span class="nam">CopyMeThat</span><span class="op">(</span><span class="nam">Integration</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"> <span class="key">def</span> <span class="nam">import_file_name_filter</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">zip_info_object</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"> <span class="key">if</span> <span class="nam">DEBUG</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="str">"testing"</span><span class="op">,</span> <span class="nam">zip_info_object</span><span class="op">.</span><span class="nam">filename</span><span class="op">,</span> <span class="nam">zip_info_object</span><span class="op">.</span><span class="nam">filename</span> <span class="op">==</span> <span class="str">'recipes.html'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"> <span class="key">return</span> <span class="nam">zip_info_object</span><span class="op">.</span><span class="nam">filename</span> <span class="op">==</span> <span class="str">'recipes.html'</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_recipe_from_file</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">file</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"> <span class="com"># 'file' comes is as a beautifulsoup object</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"> <span class="nam">source</span> <span class="op">=</span> <span class="nam">file</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">"a"</span><span class="op">,</span> <span class="op">{</span><span class="str">"id"</span><span class="op">:</span> <span class="str">"original_link"</span><span class="op">}</span><span class="op">)</span><span class="op">.</span><span class="nam">text</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"> <span class="key">except</span> <span class="nam">AttributeError</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"> <span class="nam">source</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"> <span class="nam">recipe</span> <span class="op">=</span> <span class="nam">Recipe</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span><span class="nam">name</span><span class="op">=</span><span class="nam">file</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">"div"</span><span class="op">,</span> <span class="op">{</span><span class="str">"id"</span><span class="op">:</span> <span class="str">"name"</span><span class="op">}</span><span class="op">)</span><span class="op">.</span><span class="nam">text</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"> <span class="op">)</span><span class="op">[</span><span class="op">:</span><span class="num">128</span><span class="op">]</span><span class="op">,</span> <span class="nam">source_url</span><span class="op">=</span><span class="nam">source</span><span class="op">,</span> <span class="nam">created_by</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">,</span> <span class="nam">internal</span><span class="op">=</span><span class="key">True</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"> <span class="key">for</span> <span class="nam">category</span> <span class="key">in</span> <span class="nam">file</span><span class="op">.</span><span class="nam">find_all</span><span class="op">(</span><span class="str">"span"</span><span class="op">,</span> <span class="op">{</span><span class="str">"class"</span><span class="op">:</span> <span class="str">"recipeCategory"</span><span class="op">}</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"> <span class="nam">keyword</span><span class="op">,</span> <span class="nam">created</span> <span class="op">=</span> <span class="nam">Keyword</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">get_or_create</span><span class="op">(</span><span class="nam">name</span><span class="op">=</span><span class="nam">category</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">keywords</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">keyword</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">servings</span> <span class="op">=</span> <span class="nam">parse_servings</span><span class="op">(</span><span class="nam">file</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">"a"</span><span class="op">,</span> <span class="op">{</span><span class="str">"id"</span><span class="op">:</span> <span class="str">"recipeYield"</span><span class="op">}</span><span class="op">)</span><span class="op">.</span><span class="nam">text</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">working_time</span> <span class="op">=</span> <span class="nam">iso_duration_to_minutes</span><span class="op">(</span><span class="nam">file</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">"span"</span><span class="op">,</span> <span class="op">{</span><span class="str">"meta"</span><span class="op">:</span> <span class="str">"prepTime"</span><span class="op">}</span><span class="op">)</span><span class="op">.</span><span class="nam">text</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">waiting_time</span> <span class="op">=</span> <span class="nam">iso_duration_to_minutes</span><span class="op">(</span><span class="nam">file</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">"span"</span><span class="op">,</span> <span class="op">{</span><span class="str">"meta"</span><span class="op">:</span> <span class="str">"cookTime"</span><span class="op">}</span><span class="op">)</span><span class="op">.</span><span class="nam">text</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"> <span class="key">except</span> <span class="nam">AttributeError</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">file</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">"span"</span><span class="op">,</span> <span class="op">{</span><span class="str">"id"</span><span class="op">:</span> <span class="str">"starred"</span><span class="op">}</span><span class="op">)</span><span class="op">.</span><span class="nam">text</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">keywords</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">Keyword</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">get_or_create</span><span class="op">(</span><span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="nam">_</span><span class="op">(</span><span class="str">'Favorite'</span><span class="op">)</span><span class="op">)</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="key">except</span> <span class="nam">AttributeError</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">file</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">"span"</span><span class="op">,</span> <span class="op">{</span><span class="str">"id"</span><span class="op">:</span> <span class="str">"made_this"</span><span class="op">}</span><span class="op">)</span><span class="op">.</span><span class="nam">text</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">keywords</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">Keyword</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">get_or_create</span><span class="op">(</span><span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="nam">_</span><span class="op">(</span><span class="str">'I made this'</span><span class="op">)</span><span class="op">)</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"> <span class="key">except</span> <span class="nam">AttributeError</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="nam">step</span> <span class="op">=</span> <span class="nam">Step</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span><span class="nam">instruction</span><span class="op">=</span><span class="str">''</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span> <span class="nam">show_ingredients_table</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">.</span><span class="nam">userpreference</span><span class="op">.</span><span class="nam">show_step_ingredients</span><span class="op">,</span> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="nam">ingredient_parser</span> <span class="op">=</span> <span class="nam">IngredientParser</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">,</span> <span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"> <span class="nam">ingredients</span> <span class="op">=</span> <span class="nam">file</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">"ul"</span><span class="op">,</span> <span class="op">{</span><span class="str">"id"</span><span class="op">:</span> <span class="str">"recipeIngredients"</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="key">if</span> <span class="nam">isinstance</span><span class="op">(</span><span class="nam">ingredients</span><span class="op">,</span> <span class="nam">Tag</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"> <span class="key">for</span> <span class="nam">ingredient</span> <span class="key">in</span> <span class="nam">ingredients</span><span class="op">.</span><span class="nam">children</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">isinstance</span><span class="op">(</span><span class="nam">ingredient</span><span class="op">,</span> <span class="nam">Tag</span><span class="op">)</span> <span class="key">or</span> <span class="key">not</span> <span class="nam">ingredient</span><span class="op">.</span><span class="nam">text</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span> <span class="key">or</span> <span class="str">"recipeIngredient_spacer"</span> <span class="key">in</span> <span class="nam">ingredient</span><span class="op">[</span><span class="str">'class'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"> <span class="key">continue</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="key">if</span> <span class="nam">any</span><span class="op">(</span><span class="nam">x</span> <span class="key">in</span> <span class="nam">ingredient</span><span class="op">[</span><span class="str">'class'</span><span class="op">]</span> <span class="key">for</span> <span class="nam">x</span> <span class="key">in</span> <span class="op">[</span><span class="str">"recipeIngredient_subheader"</span><span class="op">,</span> <span class="str">"recipeIngredient_note"</span><span class="op">]</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"> <span class="nam">step</span><span class="op">.</span><span class="nam">ingredients</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"> <span class="nam">Ingredient</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"> <span class="nam">is_header</span><span class="op">=</span><span class="key">True</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t"> <span class="nam">note</span><span class="op">=</span><span class="nam">ingredient</span><span class="op">.</span><span class="nam">text</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">[</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"> <span class="op">:</span><span class="num">256</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"> <span class="nam">original_text</span><span class="op">=</span><span class="nam">ingredient</span><span class="op">.</span><span class="nam">text</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"> <span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"> <span class="nam">amount</span><span class="op">,</span> <span class="nam">unit</span><span class="op">,</span> <span class="nam">food</span><span class="op">,</span> <span class="nam">note</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">parse</span><span class="op">(</span><span class="nam">ingredient</span><span class="op">.</span><span class="nam">text</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"> <span class="nam">f</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">get_food</span><span class="op">(</span><span class="nam">food</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t"> <span class="nam">u</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">get_unit</span><span class="op">(</span><span class="nam">unit</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t"> <span class="nam">step</span><span class="op">.</span><span class="nam">ingredients</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">Ingredient</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span><span class="nam">food</span><span class="op">=</span><span class="nam">f</span><span class="op">,</span> <span class="nam">unit</span><span class="op">=</span><span class="nam">u</span><span class="op">,</span> <span class="nam">amount</span><span class="op">=</span><span class="nam">amount</span><span class="op">,</span> <span class="nam">note</span><span class="op">=</span><span class="nam">note</span><span class="op">,</span> <span class="nam">original_text</span><span class="op">=</span><span class="nam">ingredient</span><span class="op">.</span><span class="nam">text</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span> <span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t"> <span class="nam">instructions</span> <span class="op">=</span> <span class="nam">file</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">"ol"</span><span class="op">,</span> <span class="op">{</span><span class="str">"id"</span><span class="op">:</span> <span class="str">"recipeInstructions"</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"> <span class="key">if</span> <span class="nam">isinstance</span><span class="op">(</span><span class="nam">instructions</span><span class="op">,</span> <span class="nam">Tag</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"> <span class="key">for</span> <span class="nam">instruction</span> <span class="key">in</span> <span class="nam">instructions</span><span class="op">.</span><span class="nam">children</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">isinstance</span><span class="op">(</span><span class="nam">instruction</span><span class="op">,</span> <span class="nam">Tag</span><span class="op">)</span> <span class="key">or</span> <span class="nam">instruction</span><span class="op">.</span><span class="nam">text</span> <span class="op">==</span> <span class="str">""</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"> <span class="key">continue</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"> <span class="key">if</span> <span class="str">"instruction_subheader"</span> <span class="key">in</span> <span class="nam">instruction</span><span class="op">[</span><span class="str">'class'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t"> <span class="key">if</span> <span class="nam">step</span><span class="op">.</span><span class="nam">instruction</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"> <span class="nam">step</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">steps</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">step</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t"> <span class="nam">step</span> <span class="op">=</span> <span class="nam">Step</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span><span class="nam">instruction</span><span class="op">=</span><span class="str">''</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t"> <span class="nam">step</span><span class="op">.</span><span class="nam">name</span> <span class="op">=</span> <span class="nam">instruction</span><span class="op">.</span><span class="nam">text</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">[</span><span class="op">:</span><span class="num">128</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t"> <span class="nam">step</span><span class="op">.</span><span class="nam">instruction</span> <span class="op">+=</span> <span class="nam">instruction</span><span class="op">.</span><span class="nam">text</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span> <span class="op">+</span> <span class="str">' \n\n'</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t"> <span class="nam">notes</span> <span class="op">=</span> <span class="nam">file</span><span class="op">.</span><span class="nam">find_all</span><span class="op">(</span><span class="str">"li"</span><span class="op">,</span> <span class="op">{</span><span class="str">"class"</span><span class="op">:</span> <span class="str">"recipeNote"</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t"> <span class="key">if</span> <span class="nam">notes</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t"> <span class="nam">step</span><span class="op">.</span><span class="nam">instruction</span> <span class="op">+=</span> <span class="str">'*Notes:* \n\n'</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t"> <span class="key">for</span> <span class="nam">n</span> <span class="key">in</span> <span class="nam">notes</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t"> <span class="key">if</span> <span class="nam">n</span><span class="op">.</span><span class="nam">text</span> <span class="op">==</span> <span class="str">""</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t"> <span class="key">continue</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t"> <span class="nam">step</span><span class="op">.</span><span class="nam">instruction</span> <span class="op">+=</span> <span class="str">'*'</span> <span class="op">+</span> <span class="nam">n</span><span class="op">.</span><span class="nam">text</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span> <span class="op">+</span> <span class="str">'* \n\n'</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t"> <span class="nam">description</span> <span class="op">=</span> <span class="str">''</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t"> <span class="nam">description</span> <span class="op">=</span> <span class="nam">file</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">"div"</span><span class="op">,</span> <span class="op">{</span><span class="str">"id"</span><span class="op">:</span> <span class="str">"description"</span><span class="op">}</span><span class="op">)</span><span class="op">.</span><span class="nam">text</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t"> <span class="key">except</span> <span class="nam">AttributeError</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">description</span><span class="op">)</span> <span class="op">&lt;=</span> <span class="num">512</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">description</span> <span class="op">=</span> <span class="nam">description</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">description</span> <span class="op">=</span> <span class="nam">description</span><span class="op">[</span><span class="op">:</span><span class="num">480</span><span class="op">]</span> <span class="op">+</span> <span class="str">' ... (full description below)'</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t"> <span class="nam">step</span><span class="op">.</span><span class="nam">instruction</span> <span class="op">+=</span> <span class="str">'*Description:* \n\n*'</span> <span class="op">+</span> <span class="nam">description</span> <span class="op">+</span> <span class="str">'* \n\n'</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t113" href="#t113">113</a></span><span class="t"> <span class="nam">step</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t114" href="#t114">114</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">steps</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">step</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t115" href="#t115">115</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t116" href="#t116">116</a></span><span class="t"> <span class="com"># import the Primary recipe image that is stored in the Zip</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t117" href="#t117">117</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t118" href="#t118">118</a></span><span class="t"> <span class="key">for</span> <span class="nam">f</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">files</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t119" href="#t119">119</a></span><span class="t"> <span class="key">if</span> <span class="str">'.zip'</span> <span class="key">in</span> <span class="nam">f</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t120" href="#t120">120</a></span><span class="t"> <span class="nam">import_zip</span> <span class="op">=</span> <span class="nam">ZipFile</span><span class="op">(</span><span class="nam">f</span><span class="op">[</span><span class="str">'file'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t121" href="#t121">121</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">import_recipe_image</span><span class="op">(</span><span class="nam">recipe</span><span class="op">,</span> <span class="nam">BytesIO</span><span class="op">(</span><span class="nam">import_zip</span><span class="op">.</span><span class="nam">read</span><span class="op">(</span><span class="nam">file</span><span class="op">.</span><span class="nam">find</span><span class="op">(</span><span class="str">"img"</span><span class="op">,</span> <span class="nam">class_</span><span class="op">=</span><span class="str">"recipeImage"</span><span class="op">)</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"src"</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="op">,</span> <span class="nam">filetype</span><span class="op">=</span><span class="str">'.jpeg'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t122" href="#t122">122</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t123" href="#t123">123</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="nam">recipe</span><span class="op">.</span><span class="nam">name</span><span class="op">,</span> <span class="str">': failed to import image '</span><span class="op">,</span> <span class="nam">str</span><span class="op">(</span><span class="nam">e</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t124" href="#t124">124</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t125" href="#t125">125</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t126" href="#t126">126</a></span><span class="t"> <span class="key">return</span> <span class="nam">recipe</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t127" href="#t127">127</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t128" href="#t128">128</a></span><span class="t"> <span class="key">def</span> <span class="nam">split_recipe_file</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">file</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t129" href="#t129">129</a></span><span class="t"> <span class="nam">soup</span> <span class="op">=</span> <span class="nam">BeautifulSoup</span><span class="op">(</span><span class="nam">file</span><span class="op">,</span> <span class="str">"html.parser"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t130" href="#t130">130</a></span><span class="t"> <span class="key">return</span> <span class="nam">soup</span><span class="op">.</span><span class="nam">find_all</span><span class="op">(</span><span class="str">"div"</span><span class="op">,</span> <span class="op">{</span><span class="str">"class"</span><span class="op">:</span> <span class="str">"recipe"</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
</main>
<footer>
<div class="content">
<p>
<a id="prevFileLink" class="nav" href="d_37812bb4c19c71da_cookmate_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_37812bb4c19c71da_default_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
</div>
</footer>
</body>
</html>

View File

@@ -1,171 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Coverage for cookbook/integration/default.py: 26%</title>
<link rel="icon" sizes="32x32" href="favicon_32.png">
<link rel="stylesheet" href="style.css" type="text/css">
<script type="text/javascript" src="coverage_html.js" defer></script>
</head>
<body class="pyfile">
<header>
<div class="content">
<h1>
<span class="text">Coverage for </span><b>cookbook/integration/default.py</b>:
<span class="pc_cov">26%</span>
</h1>
<aside id="help_panel_wrapper">
<input id="help_panel_state" type="checkbox">
<label for="help_panel_state">
<img id="keyboard_icon" src="keybd_closed.png" alt="Show/hide keyboard shortcuts" />
</label>
<div id="help_panel">
<p class="legend">Shortcuts on this page</p>
<div class="keyhelp">
<p>
<kbd>r</kbd>
<kbd>m</kbd>
<kbd>x</kbd>
&nbsp; toggle line displays
</p>
<p>
<kbd>j</kbd>
<kbd>k</kbd>
&nbsp; next/prev highlighted chunk
</p>
<p>
<kbd>0</kbd> &nbsp; (zero) top of page
</p>
<p>
<kbd>1</kbd> &nbsp; (one) first highlighted chunk
</p>
<p>
<kbd>[</kbd>
<kbd>]</kbd>
&nbsp; prev/next file
</p>
<p>
<kbd>u</kbd> &nbsp; up to the index
</p>
<p>
<kbd>?</kbd> &nbsp; show/hide this help
</p>
</div>
</div>
</aside>
<h2>
<span class="text">54 statements &nbsp;</span>
<button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">14<span class="text"> run</span></button>
<button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">40<span class="text"> missing</span></button>
<button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
</h2>
<p class="text">
<a id="prevFileLink" class="nav" href="d_37812bb4c19c71da_copymethat_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_37812bb4c19c71da_domestica_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
<aside class="hidden">
<button type="button" class="button_next_chunk" data-shortcut="j"/>
<button type="button" class="button_prev_chunk" data-shortcut="k"/>
<button type="button" class="button_top_of_page" data-shortcut="0"/>
<button type="button" class="button_first_chunk" data-shortcut="1"/>
<button type="button" class="button_prev_file" data-shortcut="["/>
<button type="button" class="button_next_file" data-shortcut="]"/>
<button type="button" class="button_to_index" data-shortcut="u"/>
<button type="button" class="button_show_hide_help" data-shortcut="?"/>
</aside>
</div>
</header>
<main id="source">
<p class="run"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">json</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">import</span> <span class="nam">traceback</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">from</span> <span class="nam">io</span> <span class="key">import</span> <span class="nam">BytesIO</span><span class="op">,</span> <span class="nam">StringIO</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">from</span> <span class="nam">re</span> <span class="key">import</span> <span class="nam">match</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">from</span> <span class="nam">zipfile</span> <span class="key">import</span> <span class="nam">ZipFile</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="key">from</span> <span class="nam">rest_framework</span><span class="op">.</span><span class="nam">renderers</span> <span class="key">import</span> <span class="nam">JSONRenderer</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">helper</span><span class="op">.</span><span class="nam">image_processing</span> <span class="key">import</span> <span class="nam">get_filetype</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">integration</span><span class="op">.</span><span class="nam">integration</span> <span class="key">import</span> <span class="nam">Integration</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">serializer</span> <span class="key">import</span> <span class="nam">RecipeExportSerializer</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"><span class="key">class</span> <span class="nam">Default</span><span class="op">(</span><span class="nam">Integration</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_recipe_from_file</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">file</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"> <span class="nam">recipe_zip</span> <span class="op">=</span> <span class="nam">ZipFile</span><span class="op">(</span><span class="nam">file</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"> <span class="nam">recipe_string</span> <span class="op">=</span> <span class="nam">recipe_zip</span><span class="op">.</span><span class="nam">read</span><span class="op">(</span><span class="str">'recipe.json'</span><span class="op">)</span><span class="op">.</span><span class="nam">decode</span><span class="op">(</span><span class="str">"utf-8"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"> <span class="nam">recipe</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">decode_recipe</span><span class="op">(</span><span class="nam">recipe_string</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"> <span class="nam">images</span> <span class="op">=</span> <span class="nam">list</span><span class="op">(</span><span class="nam">filter</span><span class="op">(</span><span class="key">lambda</span> <span class="nam">v</span><span class="op">:</span> <span class="nam">match</span><span class="op">(</span><span class="str">'image.*'</span><span class="op">,</span> <span class="nam">v</span><span class="op">)</span><span class="op">,</span> <span class="nam">recipe_zip</span><span class="op">.</span><span class="nam">namelist</span><span class="op">(</span><span class="op">)</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"> <span class="key">if</span> <span class="nam">images</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">import_recipe_image</span><span class="op">(</span><span class="nam">recipe</span><span class="op">,</span> <span class="nam">BytesIO</span><span class="op">(</span><span class="nam">recipe_zip</span><span class="op">.</span><span class="nam">read</span><span class="op">(</span><span class="nam">images</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="op">)</span><span class="op">)</span><span class="op">,</span> <span class="nam">filetype</span><span class="op">=</span><span class="nam">get_filetype</span><span class="op">(</span><span class="nam">images</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"> <span class="key">except</span> <span class="nam">AttributeError</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"> <span class="nam">traceback</span><span class="op">.</span><span class="nam">print_exc</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"> <span class="key">return</span> <span class="nam">recipe</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"> <span class="key">def</span> <span class="nam">decode_recipe</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">string</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"> <span class="nam">data</span> <span class="op">=</span> <span class="nam">json</span><span class="op">.</span><span class="nam">loads</span><span class="op">(</span><span class="nam">string</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"> <span class="nam">serialized_recipe</span> <span class="op">=</span> <span class="nam">RecipeExportSerializer</span><span class="op">(</span><span class="nam">data</span><span class="op">=</span><span class="nam">data</span><span class="op">,</span> <span class="nam">context</span><span class="op">=</span><span class="op">{</span><span class="str">'request'</span><span class="op">:</span> <span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"> <span class="key">if</span> <span class="nam">serialized_recipe</span><span class="op">.</span><span class="nam">is_valid</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"> <span class="nam">recipe</span> <span class="op">=</span> <span class="nam">serialized_recipe</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"> <span class="key">return</span> <span class="nam">recipe</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"> <span class="key">return</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_file_from_recipe</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">recipe</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"> <span class="nam">export</span> <span class="op">=</span> <span class="nam">RecipeExportSerializer</span><span class="op">(</span><span class="nam">recipe</span><span class="op">)</span><span class="op">.</span><span class="nam">data</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"> <span class="key">return</span> <span class="str">'recipe.json'</span><span class="op">,</span> <span class="nam">JSONRenderer</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">render</span><span class="op">(</span><span class="nam">export</span><span class="op">)</span><span class="op">.</span><span class="nam">decode</span><span class="op">(</span><span class="str">"utf-8"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_files_from_recipes</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">recipes</span><span class="op">,</span> <span class="nam">el</span><span class="op">,</span> <span class="nam">cookie</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="nam">export_zip_stream</span> <span class="op">=</span> <span class="nam">BytesIO</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="nam">export_zip_obj</span> <span class="op">=</span> <span class="nam">ZipFile</span><span class="op">(</span><span class="nam">export_zip_stream</span><span class="op">,</span> <span class="str">'w'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="key">for</span> <span class="nam">r</span> <span class="key">in</span> <span class="nam">recipes</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="key">if</span> <span class="nam">r</span><span class="op">.</span><span class="nam">internal</span> <span class="key">and</span> <span class="nam">r</span><span class="op">.</span><span class="nam">space</span> <span class="op">==</span> <span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="nam">recipe_zip_stream</span> <span class="op">=</span> <span class="nam">BytesIO</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"> <span class="nam">recipe_zip_obj</span> <span class="op">=</span> <span class="nam">ZipFile</span><span class="op">(</span><span class="nam">recipe_zip_stream</span><span class="op">,</span> <span class="str">'w'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"> <span class="nam">recipe_stream</span> <span class="op">=</span> <span class="nam">StringIO</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="nam">filename</span><span class="op">,</span> <span class="nam">data</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">get_file_from_recipe</span><span class="op">(</span><span class="nam">r</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"> <span class="nam">recipe_stream</span><span class="op">.</span><span class="nam">write</span><span class="op">(</span><span class="nam">data</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="nam">recipe_zip_obj</span><span class="op">.</span><span class="nam">writestr</span><span class="op">(</span><span class="nam">filename</span><span class="op">,</span> <span class="nam">recipe_stream</span><span class="op">.</span><span class="nam">getvalue</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"> <span class="nam">recipe_stream</span><span class="op">.</span><span class="nam">close</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"> <span class="nam">recipe_zip_obj</span><span class="op">.</span><span class="nam">writestr</span><span class="op">(</span><span class="str">f'image{get_filetype(r.image.file.name)}'</span><span class="op">,</span> <span class="nam">r</span><span class="op">.</span><span class="nam">image</span><span class="op">.</span><span class="nam">file</span><span class="op">.</span><span class="nam">read</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"> <span class="key">except</span> <span class="op">(</span><span class="nam">ValueError</span><span class="op">,</span> <span class="nam">FileNotFoundError</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"> <span class="nam">recipe_zip_obj</span><span class="op">.</span><span class="nam">close</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"> <span class="nam">export_zip_obj</span><span class="op">.</span><span class="nam">writestr</span><span class="op">(</span><span class="nam">str</span><span class="op">(</span><span class="nam">r</span><span class="op">.</span><span class="nam">pk</span><span class="op">)</span> <span class="op">+</span> <span class="str">'.zip'</span><span class="op">,</span> <span class="nam">recipe_zip_stream</span><span class="op">.</span><span class="nam">getvalue</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"> <span class="nam">el</span><span class="op">.</span><span class="nam">exported_recipes</span> <span class="op">+=</span> <span class="num">1</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"> <span class="nam">el</span><span class="op">.</span><span class="nam">msg</span> <span class="op">+=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">get_recipe_processed_msg</span><span class="op">(</span><span class="nam">r</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> <span class="nam">el</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="nam">export_zip_obj</span><span class="op">.</span><span class="nam">close</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"> <span class="key">return</span> <span class="op">[</span><span class="op">[</span><span class="nam">self</span><span class="op">.</span><span class="nam">get_export_file_name</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> <span class="nam">export_zip_stream</span><span class="op">.</span><span class="nam">getvalue</span><span class="op">(</span><span class="op">)</span><span class="op">]</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
</main>
<footer>
<div class="content">
<p>
<a id="prevFileLink" class="nav" href="d_37812bb4c19c71da_copymethat_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_37812bb4c19c71da_domestica_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
</div>
</footer>
</body>
</html>

View File

@@ -1,154 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Coverage for cookbook/integration/domestica.py: 29%</title>
<link rel="icon" sizes="32x32" href="favicon_32.png">
<link rel="stylesheet" href="style.css" type="text/css">
<script type="text/javascript" src="coverage_html.js" defer></script>
</head>
<body class="pyfile">
<header>
<div class="content">
<h1>
<span class="text">Coverage for </span><b>cookbook/integration/domestica.py</b>:
<span class="pc_cov">29%</span>
</h1>
<aside id="help_panel_wrapper">
<input id="help_panel_state" type="checkbox">
<label for="help_panel_state">
<img id="keyboard_icon" src="keybd_closed.png" alt="Show/hide keyboard shortcuts" />
</label>
<div id="help_panel">
<p class="legend">Shortcuts on this page</p>
<div class="keyhelp">
<p>
<kbd>r</kbd>
<kbd>m</kbd>
<kbd>x</kbd>
&nbsp; toggle line displays
</p>
<p>
<kbd>j</kbd>
<kbd>k</kbd>
&nbsp; next/prev highlighted chunk
</p>
<p>
<kbd>0</kbd> &nbsp; (zero) top of page
</p>
<p>
<kbd>1</kbd> &nbsp; (one) first highlighted chunk
</p>
<p>
<kbd>[</kbd>
<kbd>]</kbd>
&nbsp; prev/next file
</p>
<p>
<kbd>u</kbd> &nbsp; up to the index
</p>
<p>
<kbd>?</kbd> &nbsp; show/hide this help
</p>
</div>
</div>
</aside>
<h2>
<span class="text">34 statements &nbsp;</span>
<button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">10<span class="text"> run</span></button>
<button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">24<span class="text"> missing</span></button>
<button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
</h2>
<p class="text">
<a id="prevFileLink" class="nav" href="d_37812bb4c19c71da_default_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_37812bb4c19c71da_integration_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
<aside class="hidden">
<button type="button" class="button_next_chunk" data-shortcut="j"/>
<button type="button" class="button_prev_chunk" data-shortcut="k"/>
<button type="button" class="button_top_of_page" data-shortcut="0"/>
<button type="button" class="button_first_chunk" data-shortcut="1"/>
<button type="button" class="button_prev_file" data-shortcut="["/>
<button type="button" class="button_next_file" data-shortcut="]"/>
<button type="button" class="button_to_index" data-shortcut="u"/>
<button type="button" class="button_show_hide_help" data-shortcut="?"/>
</aside>
</div>
</header>
<main id="source">
<p class="run"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">base64</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">import</span> <span class="nam">json</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">from</span> <span class="nam">io</span> <span class="key">import</span> <span class="nam">BytesIO</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">helper</span><span class="op">.</span><span class="nam">ingredient_parser</span> <span class="key">import</span> <span class="nam">IngredientParser</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">integration</span><span class="op">.</span><span class="nam">integration</span> <span class="key">import</span> <span class="nam">Integration</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">models</span> <span class="key">import</span> <span class="nam">Ingredient</span><span class="op">,</span> <span class="nam">Recipe</span><span class="op">,</span> <span class="nam">Step</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="key">class</span> <span class="nam">Domestica</span><span class="op">(</span><span class="nam">Integration</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_recipe_from_file</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">file</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"> <span class="nam">recipe</span> <span class="op">=</span> <span class="nam">Recipe</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"> <span class="nam">name</span><span class="op">=</span><span class="nam">file</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"> <span class="nam">created_by</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">,</span> <span class="nam">internal</span><span class="op">=</span><span class="key">True</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"> <span class="key">if</span> <span class="nam">file</span><span class="op">[</span><span class="str">'servings'</span><span class="op">]</span> <span class="op">!=</span> <span class="str">''</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">servings</span> <span class="op">=</span> <span class="nam">file</span><span class="op">[</span><span class="str">'servings'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"> <span class="key">if</span> <span class="nam">file</span><span class="op">[</span><span class="str">'timeCook'</span><span class="op">]</span> <span class="op">!=</span> <span class="str">''</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">waiting_time</span> <span class="op">=</span> <span class="nam">file</span><span class="op">[</span><span class="str">'timeCook'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"> <span class="key">if</span> <span class="nam">file</span><span class="op">[</span><span class="str">'timePrep'</span><span class="op">]</span> <span class="op">!=</span> <span class="str">''</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">working_time</span> <span class="op">=</span> <span class="nam">file</span><span class="op">[</span><span class="str">'timePrep'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"> <span class="nam">step</span> <span class="op">=</span> <span class="nam">Step</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"> <span class="nam">instruction</span><span class="op">=</span><span class="nam">file</span><span class="op">[</span><span class="str">'directions'</span><span class="op">]</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span> <span class="nam">show_ingredients_table</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">.</span><span class="nam">userpreference</span><span class="op">.</span><span class="nam">show_step_ingredients</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"> <span class="key">if</span> <span class="nam">file</span><span class="op">[</span><span class="str">'source'</span><span class="op">]</span> <span class="op">!=</span> <span class="str">''</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"> <span class="nam">step</span><span class="op">.</span><span class="nam">instruction</span> <span class="op">+=</span> <span class="str">'\n'</span> <span class="op">+</span> <span class="nam">file</span><span class="op">[</span><span class="str">'source'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="nam">ingredient_parser</span> <span class="op">=</span> <span class="nam">IngredientParser</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">,</span> <span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"> <span class="key">for</span> <span class="nam">ingredient</span> <span class="key">in</span> <span class="nam">file</span><span class="op">[</span><span class="str">'ingredients'</span><span class="op">]</span><span class="op">.</span><span class="nam">split</span><span class="op">(</span><span class="str">'\n'</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">ingredient</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"> <span class="nam">amount</span><span class="op">,</span> <span class="nam">unit</span><span class="op">,</span> <span class="nam">food</span><span class="op">,</span> <span class="nam">note</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">parse</span><span class="op">(</span><span class="nam">ingredient</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="nam">f</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">get_food</span><span class="op">(</span><span class="nam">food</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"> <span class="nam">u</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">get_unit</span><span class="op">(</span><span class="nam">unit</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"> <span class="nam">step</span><span class="op">.</span><span class="nam">ingredients</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">Ingredient</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="nam">food</span><span class="op">=</span><span class="nam">f</span><span class="op">,</span> <span class="nam">unit</span><span class="op">=</span><span class="nam">u</span><span class="op">,</span> <span class="nam">amount</span><span class="op">=</span><span class="nam">amount</span><span class="op">,</span> <span class="nam">note</span><span class="op">=</span><span class="nam">note</span><span class="op">,</span> <span class="nam">original_text</span><span class="op">=</span><span class="nam">ingredient</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">steps</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">step</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="key">if</span> <span class="nam">file</span><span class="op">[</span><span class="str">'image'</span><span class="op">]</span> <span class="op">!=</span> <span class="str">''</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">import_recipe_image</span><span class="op">(</span><span class="nam">recipe</span><span class="op">,</span> <span class="nam">BytesIO</span><span class="op">(</span><span class="nam">base64</span><span class="op">.</span><span class="nam">b64decode</span><span class="op">(</span><span class="nam">file</span><span class="op">[</span><span class="str">'image'</span><span class="op">]</span><span class="op">.</span><span class="nam">replace</span><span class="op">(</span><span class="str">'data:image/jpeg;base64,'</span><span class="op">,</span> <span class="str">''</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="op">,</span> <span class="nam">filetype</span><span class="op">=</span><span class="str">'.jpeg'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"> <span class="key">return</span> <span class="nam">recipe</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_file_from_recipe</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">recipe</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="key">raise</span> <span class="nam">NotImplementedError</span><span class="op">(</span><span class="str">'Method not implemented in storage integration'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="key">def</span> <span class="nam">split_recipe_file</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">file</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"> <span class="key">return</span> <span class="nam">json</span><span class="op">.</span><span class="nam">loads</span><span class="op">(</span><span class="nam">file</span><span class="op">.</span><span class="nam">read</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">decode</span><span class="op">(</span><span class="str">"utf-8"</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
</main>
<footer>
<div class="content">
<p>
<a id="prevFileLink" class="nav" href="d_37812bb4c19c71da_default_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_37812bb4c19c71da_integration_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
</div>
</footer>
</body>
</html>

View File

@@ -1,393 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Coverage for cookbook/integration/integration.py: 20%</title>
<link rel="icon" sizes="32x32" href="favicon_32.png">
<link rel="stylesheet" href="style.css" type="text/css">
<script type="text/javascript" src="coverage_html.js" defer></script>
</head>
<body class="pyfile">
<header>
<div class="content">
<h1>
<span class="text">Coverage for </span><b>cookbook/integration/integration.py</b>:
<span class="pc_cov">20%</span>
</h1>
<aside id="help_panel_wrapper">
<input id="help_panel_state" type="checkbox">
<label for="help_panel_state">
<img id="keyboard_icon" src="keybd_closed.png" alt="Show/hide keyboard shortcuts" />
</label>
<div id="help_panel">
<p class="legend">Shortcuts on this page</p>
<div class="keyhelp">
<p>
<kbd>r</kbd>
<kbd>m</kbd>
<kbd>x</kbd>
&nbsp; toggle line displays
</p>
<p>
<kbd>j</kbd>
<kbd>k</kbd>
&nbsp; next/prev highlighted chunk
</p>
<p>
<kbd>0</kbd> &nbsp; (zero) top of page
</p>
<p>
<kbd>1</kbd> &nbsp; (one) first highlighted chunk
</p>
<p>
<kbd>[</kbd>
<kbd>]</kbd>
&nbsp; prev/next file
</p>
<p>
<kbd>u</kbd> &nbsp; up to the index
</p>
<p>
<kbd>?</kbd> &nbsp; show/hide this help
</p>
</div>
</div>
</aside>
<h2>
<span class="text">189 statements &nbsp;</span>
<button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">38<span class="text"> run</span></button>
<button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">151<span class="text"> missing</span></button>
<button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
</h2>
<p class="text">
<a id="prevFileLink" class="nav" href="d_37812bb4c19c71da_domestica_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_37812bb4c19c71da_mealie_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
<aside class="hidden">
<button type="button" class="button_next_chunk" data-shortcut="j"/>
<button type="button" class="button_prev_chunk" data-shortcut="k"/>
<button type="button" class="button_top_of_page" data-shortcut="0"/>
<button type="button" class="button_first_chunk" data-shortcut="1"/>
<button type="button" class="button_prev_file" data-shortcut="["/>
<button type="button" class="button_next_file" data-shortcut="]"/>
<button type="button" class="button_to_index" data-shortcut="u"/>
<button type="button" class="button_show_hide_help" data-shortcut="?"/>
</aside>
</div>
</header>
<main id="source">
<p class="run"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">datetime</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">import</span> <span class="nam">traceback</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">import</span> <span class="nam">uuid</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">from</span> <span class="nam">io</span> <span class="key">import</span> <span class="nam">BytesIO</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">from</span> <span class="nam">zipfile</span> <span class="key">import</span> <span class="nam">BadZipFile</span><span class="op">,</span> <span class="nam">ZipFile</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="key">from</span> <span class="nam">bs4</span> <span class="key">import</span> <span class="nam">Tag</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="key">from</span> <span class="nam">django</span><span class="op">.</span><span class="nam">core</span><span class="op">.</span><span class="nam">cache</span> <span class="key">import</span> <span class="nam">cache</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="key">from</span> <span class="nam">django</span><span class="op">.</span><span class="nam">core</span><span class="op">.</span><span class="nam">exceptions</span> <span class="key">import</span> <span class="nam">ObjectDoesNotExist</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="key">from</span> <span class="nam">django</span><span class="op">.</span><span class="nam">core</span><span class="op">.</span><span class="nam">files</span> <span class="key">import</span> <span class="nam">File</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="key">from</span> <span class="nam">django</span><span class="op">.</span><span class="nam">db</span> <span class="key">import</span> <span class="nam">IntegrityError</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"><span class="key">from</span> <span class="nam">django</span><span class="op">.</span><span class="nam">http</span> <span class="key">import</span> <span class="nam">HttpResponse</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"><span class="key">from</span> <span class="nam">django</span><span class="op">.</span><span class="nam">utils</span><span class="op">.</span><span class="nam">formats</span> <span class="key">import</span> <span class="nam">date_format</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"><span class="key">from</span> <span class="nam">django</span><span class="op">.</span><span class="nam">utils</span><span class="op">.</span><span class="nam">translation</span> <span class="key">import</span> <span class="nam">gettext</span> <span class="key">as</span> <span class="nam">_</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"><span class="key">from</span> <span class="nam">django_scopes</span> <span class="key">import</span> <span class="nam">scope</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"><span class="key">from</span> <span class="nam">lxml</span> <span class="key">import</span> <span class="nam">etree</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">helper</span><span class="op">.</span><span class="nam">image_processing</span> <span class="key">import</span> <span class="nam">handle_image</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">models</span> <span class="key">import</span> <span class="nam">Keyword</span><span class="op">,</span> <span class="nam">Recipe</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"><span class="key">from</span> <span class="nam">recipes</span><span class="op">.</span><span class="nam">settings</span> <span class="key">import</span> <span class="nam">DEBUG</span><span class="op">,</span> <span class="nam">EXPORT_FILE_CACHE_DURATION</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"><span class="key">class</span> <span class="nam">Integration</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"> <span class="nam">request</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"> <span class="nam">keyword</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"> <span class="nam">files</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"> <span class="nam">export_type</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"> <span class="nam">ignored_recipes</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"> <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">request</span><span class="op">,</span> <span class="nam">export_type</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"><span class="str"> Integration for importing and exporting recipes</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"><span class="str"> :param request: request context of import session (used to link user to created objects)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">request</span> <span class="op">=</span> <span class="nam">request</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">export_type</span> <span class="op">=</span> <span class="nam">export_type</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">ignored_recipes</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"> <span class="nam">description</span> <span class="op">=</span> <span class="str">f'Imported by {request.user.get_user_display_name()} at {date_format(datetime.datetime.now(), "DATETIME_FORMAT")}. Type: {export_type}'</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"> <span class="nam">last_kw</span> <span class="op">=</span> <span class="nam">Keyword</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">filter</span><span class="op">(</span><span class="nam">name__regex</span><span class="op">=</span><span class="str">r'^(Import [0-9]+)'</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span><span class="op">.</span><span class="nam">latest</span><span class="op">(</span><span class="str">'created_at'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"> <span class="nam">name</span> <span class="op">=</span> <span class="str">f'Import {int(last_kw.name.replace("Import ", "")) + 1}'</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="key">except</span> <span class="op">(</span><span class="nam">ObjectDoesNotExist</span><span class="op">,</span> <span class="nam">ValueError</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="nam">name</span> <span class="op">=</span> <span class="str">'Import 1'</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"> <span class="nam">parent</span><span class="op">,</span> <span class="nam">created</span> <span class="op">=</span> <span class="nam">Keyword</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">get_or_create</span><span class="op">(</span><span class="nam">name</span><span class="op">=</span><span class="str">'Import'</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">keyword</span> <span class="op">=</span> <span class="nam">parent</span><span class="op">.</span><span class="nam">add_child</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="nam">name</span><span class="op">=</span><span class="nam">name</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"> <span class="nam">description</span><span class="op">=</span><span class="nam">description</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"> <span class="nam">space</span><span class="op">=</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="key">except</span> <span class="op">(</span><span class="nam">IntegrityError</span><span class="op">,</span> <span class="nam">ValueError</span><span class="op">)</span><span class="op">:</span> <span class="com"># in case, for whatever reason, the name does exist append UUID to it. Not nice but works for now.</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">keyword</span> <span class="op">=</span> <span class="nam">parent</span><span class="op">.</span><span class="nam">add_child</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="nam">name</span><span class="op">=</span><span class="str">f'{name} {str(uuid.uuid4())[0:8]}'</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"> <span class="nam">description</span><span class="op">=</span><span class="nam">description</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"> <span class="nam">space</span><span class="op">=</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"> <span class="key">def</span> <span class="nam">do_export</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">recipes</span><span class="op">,</span> <span class="nam">el</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="key">with</span> <span class="nam">scope</span><span class="op">(</span><span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"> <span class="nam">el</span><span class="op">.</span><span class="nam">total_recipes</span> <span class="op">=</span> <span class="nam">len</span><span class="op">(</span><span class="nam">recipes</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"> <span class="nam">el</span><span class="op">.</span><span class="nam">cache_duration</span> <span class="op">=</span> <span class="nam">EXPORT_FILE_CACHE_DURATION</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"> <span class="nam">el</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"> <span class="nam">files</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">get_files_from_recipes</span><span class="op">(</span><span class="nam">recipes</span><span class="op">,</span> <span class="nam">el</span><span class="op">,</span> <span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">COOKIES</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">files</span><span class="op">)</span> <span class="op">==</span> <span class="num">1</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"> <span class="nam">filename</span><span class="op">,</span> <span class="nam">file</span> <span class="op">=</span> <span class="nam">files</span><span class="op">[</span><span class="num">0</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="nam">export_filename</span> <span class="op">=</span> <span class="nam">filename</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"> <span class="nam">export_file</span> <span class="op">=</span> <span class="nam">file</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t"> <span class="com"># zip the files if there is more then one file</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"> <span class="nam">export_filename</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">get_export_file_name</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t"> <span class="nam">export_stream</span> <span class="op">=</span> <span class="nam">BytesIO</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"> <span class="nam">export_obj</span> <span class="op">=</span> <span class="nam">ZipFile</span><span class="op">(</span><span class="nam">export_stream</span><span class="op">,</span> <span class="str">'w'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t"> <span class="key">for</span> <span class="nam">filename</span><span class="op">,</span> <span class="nam">file</span> <span class="key">in</span> <span class="nam">files</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"> <span class="nam">export_obj</span><span class="op">.</span><span class="nam">writestr</span><span class="op">(</span><span class="nam">filename</span><span class="op">,</span> <span class="nam">file</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t"> <span class="nam">export_obj</span><span class="op">.</span><span class="nam">close</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"> <span class="nam">export_file</span> <span class="op">=</span> <span class="nam">export_stream</span><span class="op">.</span><span class="nam">getvalue</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t"> <span class="nam">cache</span><span class="op">.</span><span class="nam">set</span><span class="op">(</span><span class="str">'export_file_'</span> <span class="op">+</span> <span class="nam">str</span><span class="op">(</span><span class="nam">el</span><span class="op">.</span><span class="nam">pk</span><span class="op">)</span><span class="op">,</span> <span class="op">{</span><span class="str">'filename'</span><span class="op">:</span> <span class="nam">export_filename</span><span class="op">,</span> <span class="str">'file'</span><span class="op">:</span> <span class="nam">export_file</span><span class="op">}</span><span class="op">,</span> <span class="nam">EXPORT_FILE_CACHE_DURATION</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t"> <span class="nam">el</span><span class="op">.</span><span class="nam">running</span> <span class="op">=</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t"> <span class="nam">el</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t"> <span class="nam">response</span> <span class="op">=</span> <span class="nam">HttpResponse</span><span class="op">(</span><span class="nam">export_file</span><span class="op">,</span> <span class="nam">content_type</span><span class="op">=</span><span class="str">'application/force-download'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t"> <span class="nam">response</span><span class="op">[</span><span class="str">'Content-Disposition'</span><span class="op">]</span> <span class="op">=</span> <span class="str">'attachment; filename="'</span> <span class="op">+</span> <span class="nam">export_filename</span> <span class="op">+</span> <span class="str">'"'</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t"> <span class="key">return</span> <span class="nam">response</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t"> <span class="key">def</span> <span class="nam">import_file_name_filter</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">zip_info_object</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t"><span class="str"> Since zipfile.namelist() returns all files in all subdirectories this function allows filtering of files</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t"><span class="str"> If false is returned the file will be ignored</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t"><span class="str"> By default all files are included</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t"><span class="str"> :param zip_info_object: ZipInfo object</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t"><span class="str"> :return: Boolean if object should be included</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t"> <span class="key">return</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t"> <span class="key">def</span> <span class="nam">do_import</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">files</span><span class="op">,</span> <span class="nam">il</span><span class="op">,</span> <span class="nam">import_duplicates</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"><span class="str"> Imports given files</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t"><span class="str"> :param import_duplicates: if true duplicates are imported as well</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t"><span class="str"> :param files: List of in memory files</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t"><span class="str"> :param il: Import Log object to refresh while running</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t"><span class="str"> :return: HttpResponseRedirect to the recipe search showing all imported recipes</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t113" href="#t113">113</a></span><span class="t"> <span class="key">with</span> <span class="nam">scope</span><span class="op">(</span><span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t114" href="#t114">114</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t115" href="#t115">115</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t116" href="#t116">116</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">files</span> <span class="op">=</span> <span class="nam">files</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t117" href="#t117">117</a></span><span class="t"> <span class="key">for</span> <span class="nam">f</span> <span class="key">in</span> <span class="nam">files</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t118" href="#t118">118</a></span><span class="t"> <span class="key">if</span> <span class="str">'RecipeKeeper'</span> <span class="key">in</span> <span class="nam">f</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t119" href="#t119">119</a></span><span class="t"> <span class="nam">import_zip</span> <span class="op">=</span> <span class="nam">ZipFile</span><span class="op">(</span><span class="nam">f</span><span class="op">[</span><span class="str">'file'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t120" href="#t120">120</a></span><span class="t"> <span class="nam">file_list</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t121" href="#t121">121</a></span><span class="t"> <span class="key">for</span> <span class="nam">z</span> <span class="key">in</span> <span class="nam">import_zip</span><span class="op">.</span><span class="nam">filelist</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t122" href="#t122">122</a></span><span class="t"> <span class="key">if</span> <span class="nam">self</span><span class="op">.</span><span class="nam">import_file_name_filter</span><span class="op">(</span><span class="nam">z</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t123" href="#t123">123</a></span><span class="t"> <span class="nam">file_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">z</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t124" href="#t124">124</a></span><span class="t"> <span class="nam">il</span><span class="op">.</span><span class="nam">total_recipes</span> <span class="op">+=</span> <span class="nam">len</span><span class="op">(</span><span class="nam">file_list</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t125" href="#t125">125</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t126" href="#t126">126</a></span><span class="t"> <span class="key">for</span> <span class="nam">z</span> <span class="key">in</span> <span class="nam">file_list</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t127" href="#t127">127</a></span><span class="t"> <span class="nam">data_list</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">split_recipe_file</span><span class="op">(</span><span class="nam">import_zip</span><span class="op">.</span><span class="nam">read</span><span class="op">(</span><span class="nam">z</span><span class="op">.</span><span class="nam">filename</span><span class="op">)</span><span class="op">.</span><span class="nam">decode</span><span class="op">(</span><span class="str">'utf-8'</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t128" href="#t128">128</a></span><span class="t"> <span class="key">for</span> <span class="nam">d</span> <span class="key">in</span> <span class="nam">data_list</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t129" href="#t129">129</a></span><span class="t"> <span class="nam">recipe</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">get_recipe_from_file</span><span class="op">(</span><span class="nam">d</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t130" href="#t130">130</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">keywords</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">keyword</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t131" href="#t131">131</a></span><span class="t"> <span class="nam">il</span><span class="op">.</span><span class="nam">msg</span> <span class="op">+=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">get_recipe_processed_msg</span><span class="op">(</span><span class="nam">recipe</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t132" href="#t132">132</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">handle_duplicates</span><span class="op">(</span><span class="nam">recipe</span><span class="op">,</span> <span class="nam">import_duplicates</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t133" href="#t133">133</a></span><span class="t"> <span class="nam">il</span><span class="op">.</span><span class="nam">imported_recipes</span> <span class="op">+=</span> <span class="num">1</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t134" href="#t134">134</a></span><span class="t"> <span class="nam">il</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t135" href="#t135">135</a></span><span class="t"> <span class="nam">import_zip</span><span class="op">.</span><span class="nam">close</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t136" href="#t136">136</a></span><span class="t"> <span class="key">elif</span> <span class="str">'.zip'</span> <span class="key">in</span> <span class="nam">f</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span> <span class="key">or</span> <span class="str">'.paprikarecipes'</span> <span class="key">in</span> <span class="nam">f</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span> <span class="key">or</span> <span class="str">'.mcb'</span> <span class="key">in</span> <span class="nam">f</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t137" href="#t137">137</a></span><span class="t"> <span class="nam">import_zip</span> <span class="op">=</span> <span class="nam">ZipFile</span><span class="op">(</span><span class="nam">f</span><span class="op">[</span><span class="str">'file'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t138" href="#t138">138</a></span><span class="t"> <span class="nam">file_list</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t139" href="#t139">139</a></span><span class="t"> <span class="key">for</span> <span class="nam">z</span> <span class="key">in</span> <span class="nam">import_zip</span><span class="op">.</span><span class="nam">filelist</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t140" href="#t140">140</a></span><span class="t"> <span class="key">if</span> <span class="nam">self</span><span class="op">.</span><span class="nam">import_file_name_filter</span><span class="op">(</span><span class="nam">z</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t141" href="#t141">141</a></span><span class="t"> <span class="nam">file_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">z</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t142" href="#t142">142</a></span><span class="t"> <span class="nam">il</span><span class="op">.</span><span class="nam">total_recipes</span> <span class="op">+=</span> <span class="nam">len</span><span class="op">(</span><span class="nam">file_list</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t143" href="#t143">143</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t144" href="#t144">144</a></span><span class="t"> <span class="key">import</span> <span class="nam">cookbook</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t145" href="#t145">145</a></span><span class="t"> <span class="key">if</span> <span class="nam">isinstance</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">integration</span><span class="op">.</span><span class="nam">copymethat</span><span class="op">.</span><span class="nam">CopyMeThat</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t146" href="#t146">146</a></span><span class="t"> <span class="nam">file_list</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">split_recipe_file</span><span class="op">(</span><span class="nam">BytesIO</span><span class="op">(</span><span class="nam">import_zip</span><span class="op">.</span><span class="nam">read</span><span class="op">(</span><span class="str">'recipes.html'</span><span class="op">)</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t147" href="#t147">147</a></span><span class="t"> <span class="nam">il</span><span class="op">.</span><span class="nam">total_recipes</span> <span class="op">+=</span> <span class="nam">len</span><span class="op">(</span><span class="nam">file_list</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t148" href="#t148">148</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t149" href="#t149">149</a></span><span class="t"> <span class="key">if</span> <span class="nam">isinstance</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">integration</span><span class="op">.</span><span class="nam">cookmate</span><span class="op">.</span><span class="nam">Cookmate</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t150" href="#t150">150</a></span><span class="t"> <span class="nam">new_file_list</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t151" href="#t151">151</a></span><span class="t"> <span class="key">for</span> <span class="nam">file</span> <span class="key">in</span> <span class="nam">file_list</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t152" href="#t152">152</a></span><span class="t"> <span class="nam">new_file_list</span> <span class="op">+=</span> <span class="nam">etree</span><span class="op">.</span><span class="nam">parse</span><span class="op">(</span><span class="nam">BytesIO</span><span class="op">(</span><span class="nam">import_zip</span><span class="op">.</span><span class="nam">read</span><span class="op">(</span><span class="nam">file</span><span class="op">.</span><span class="nam">filename</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="op">.</span><span class="nam">getroot</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">getchildren</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t153" href="#t153">153</a></span><span class="t"> <span class="nam">il</span><span class="op">.</span><span class="nam">total_recipes</span> <span class="op">=</span> <span class="nam">len</span><span class="op">(</span><span class="nam">new_file_list</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t154" href="#t154">154</a></span><span class="t"> <span class="nam">file_list</span> <span class="op">=</span> <span class="nam">new_file_list</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t155" href="#t155">155</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t156" href="#t156">156</a></span><span class="t"> <span class="key">for</span> <span class="nam">z</span> <span class="key">in</span> <span class="nam">file_list</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t157" href="#t157">157</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t158" href="#t158">158</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">hasattr</span><span class="op">(</span><span class="nam">z</span><span class="op">,</span> <span class="str">'filename'</span><span class="op">)</span> <span class="key">or</span> <span class="nam">isinstance</span><span class="op">(</span><span class="nam">z</span><span class="op">,</span> <span class="nam">Tag</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t159" href="#t159">159</a></span><span class="t"> <span class="nam">recipe</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">get_recipe_from_file</span><span class="op">(</span><span class="nam">z</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t160" href="#t160">160</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t161" href="#t161">161</a></span><span class="t"> <span class="nam">recipe</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">get_recipe_from_file</span><span class="op">(</span><span class="nam">BytesIO</span><span class="op">(</span><span class="nam">import_zip</span><span class="op">.</span><span class="nam">read</span><span class="op">(</span><span class="nam">z</span><span class="op">.</span><span class="nam">filename</span><span class="op">)</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t162" href="#t162">162</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">keywords</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">keyword</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t163" href="#t163">163</a></span><span class="t"> <span class="nam">il</span><span class="op">.</span><span class="nam">msg</span> <span class="op">+=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">get_recipe_processed_msg</span><span class="op">(</span><span class="nam">recipe</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t164" href="#t164">164</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">handle_duplicates</span><span class="op">(</span><span class="nam">recipe</span><span class="op">,</span> <span class="nam">import_duplicates</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t165" href="#t165">165</a></span><span class="t"> <span class="nam">il</span><span class="op">.</span><span class="nam">imported_recipes</span> <span class="op">+=</span> <span class="num">1</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t166" href="#t166">166</a></span><span class="t"> <span class="nam">il</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t167" href="#t167">167</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t168" href="#t168">168</a></span><span class="t"> <span class="nam">traceback</span><span class="op">.</span><span class="nam">print_exc</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t169" href="#t169">169</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">handle_exception</span><span class="op">(</span><span class="nam">e</span><span class="op">,</span> <span class="nam">log</span><span class="op">=</span><span class="nam">il</span><span class="op">,</span> <span class="nam">message</span><span class="op">=</span><span class="str">f'-------------------- \nERROR \n{e}\n--------------------\n'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t170" href="#t170">170</a></span><span class="t"> <span class="nam">import_zip</span><span class="op">.</span><span class="nam">close</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t171" href="#t171">171</a></span><span class="t"> <span class="key">elif</span> <span class="str">'.json'</span> <span class="key">in</span> <span class="nam">f</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span> <span class="key">or</span> <span class="str">'.xml'</span> <span class="key">in</span> <span class="nam">f</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span> <span class="key">or</span> <span class="str">'.txt'</span> <span class="key">in</span> <span class="nam">f</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span> <span class="key">or</span> <span class="str">'.mmf'</span> <span class="key">in</span> <span class="nam">f</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span> <span class="key">or</span> <span class="str">'.rk'</span> <span class="key">in</span> <span class="nam">f</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span> <span class="key">or</span> <span class="str">'.melarecipe'</span> <span class="key">in</span> <span class="nam">f</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t172" href="#t172">172</a></span><span class="t"> <span class="nam">data_list</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">split_recipe_file</span><span class="op">(</span><span class="nam">f</span><span class="op">[</span><span class="str">'file'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t173" href="#t173">173</a></span><span class="t"> <span class="nam">il</span><span class="op">.</span><span class="nam">total_recipes</span> <span class="op">+=</span> <span class="nam">len</span><span class="op">(</span><span class="nam">data_list</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t174" href="#t174">174</a></span><span class="t"> <span class="key">for</span> <span class="nam">d</span> <span class="key">in</span> <span class="nam">data_list</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t175" href="#t175">175</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t176" href="#t176">176</a></span><span class="t"> <span class="nam">recipe</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">get_recipe_from_file</span><span class="op">(</span><span class="nam">d</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t177" href="#t177">177</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">keywords</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">keyword</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t178" href="#t178">178</a></span><span class="t"> <span class="nam">il</span><span class="op">.</span><span class="nam">msg</span> <span class="op">+=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">get_recipe_processed_msg</span><span class="op">(</span><span class="nam">recipe</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t179" href="#t179">179</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">handle_duplicates</span><span class="op">(</span><span class="nam">recipe</span><span class="op">,</span> <span class="nam">import_duplicates</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t180" href="#t180">180</a></span><span class="t"> <span class="nam">il</span><span class="op">.</span><span class="nam">imported_recipes</span> <span class="op">+=</span> <span class="num">1</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t181" href="#t181">181</a></span><span class="t"> <span class="nam">il</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t182" href="#t182">182</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t183" href="#t183">183</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">handle_exception</span><span class="op">(</span><span class="nam">e</span><span class="op">,</span> <span class="nam">log</span><span class="op">=</span><span class="nam">il</span><span class="op">,</span> <span class="nam">message</span><span class="op">=</span><span class="str">f'-------------------- \nERROR \n{e}\n--------------------\n'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t184" href="#t184">184</a></span><span class="t"> <span class="key">elif</span> <span class="str">'.rtk'</span> <span class="key">in</span> <span class="nam">f</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t185" href="#t185">185</a></span><span class="t"> <span class="nam">import_zip</span> <span class="op">=</span> <span class="nam">ZipFile</span><span class="op">(</span><span class="nam">f</span><span class="op">[</span><span class="str">'file'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t186" href="#t186">186</a></span><span class="t"> <span class="key">for</span> <span class="nam">z</span> <span class="key">in</span> <span class="nam">import_zip</span><span class="op">.</span><span class="nam">filelist</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t187" href="#t187">187</a></span><span class="t"> <span class="key">if</span> <span class="nam">self</span><span class="op">.</span><span class="nam">import_file_name_filter</span><span class="op">(</span><span class="nam">z</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t188" href="#t188">188</a></span><span class="t"> <span class="nam">data_list</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">split_recipe_file</span><span class="op">(</span><span class="nam">import_zip</span><span class="op">.</span><span class="nam">read</span><span class="op">(</span><span class="nam">z</span><span class="op">.</span><span class="nam">filename</span><span class="op">)</span><span class="op">.</span><span class="nam">decode</span><span class="op">(</span><span class="str">'utf-8'</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t189" href="#t189">189</a></span><span class="t"> <span class="nam">il</span><span class="op">.</span><span class="nam">total_recipes</span> <span class="op">+=</span> <span class="nam">len</span><span class="op">(</span><span class="nam">data_list</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t190" href="#t190">190</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t191" href="#t191">191</a></span><span class="t"> <span class="key">for</span> <span class="nam">d</span> <span class="key">in</span> <span class="nam">data_list</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t192" href="#t192">192</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t193" href="#t193">193</a></span><span class="t"> <span class="nam">recipe</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">get_recipe_from_file</span><span class="op">(</span><span class="nam">d</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t194" href="#t194">194</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">keywords</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">keyword</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t195" href="#t195">195</a></span><span class="t"> <span class="nam">il</span><span class="op">.</span><span class="nam">msg</span> <span class="op">+=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">get_recipe_processed_msg</span><span class="op">(</span><span class="nam">recipe</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t196" href="#t196">196</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">handle_duplicates</span><span class="op">(</span><span class="nam">recipe</span><span class="op">,</span> <span class="nam">import_duplicates</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t197" href="#t197">197</a></span><span class="t"> <span class="nam">il</span><span class="op">.</span><span class="nam">imported_recipes</span> <span class="op">+=</span> <span class="num">1</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t198" href="#t198">198</a></span><span class="t"> <span class="nam">il</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t199" href="#t199">199</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t200" href="#t200">200</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">handle_exception</span><span class="op">(</span><span class="nam">e</span><span class="op">,</span> <span class="nam">log</span><span class="op">=</span><span class="nam">il</span><span class="op">,</span> <span class="nam">message</span><span class="op">=</span><span class="str">f'-------------------- \nERROR \n{e}\n--------------------\n'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t201" href="#t201">201</a></span><span class="t"> <span class="nam">import_zip</span><span class="op">.</span><span class="nam">close</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t202" href="#t202">202</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t203" href="#t203">203</a></span><span class="t"> <span class="nam">recipe</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">get_recipe_from_file</span><span class="op">(</span><span class="nam">f</span><span class="op">[</span><span class="str">'file'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t204" href="#t204">204</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">keywords</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">keyword</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t205" href="#t205">205</a></span><span class="t"> <span class="nam">il</span><span class="op">.</span><span class="nam">msg</span> <span class="op">+=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">get_recipe_processed_msg</span><span class="op">(</span><span class="nam">recipe</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t206" href="#t206">206</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">handle_duplicates</span><span class="op">(</span><span class="nam">recipe</span><span class="op">,</span> <span class="nam">import_duplicates</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t207" href="#t207">207</a></span><span class="t"> <span class="key">except</span> <span class="nam">BadZipFile</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t208" href="#t208">208</a></span><span class="t"> <span class="nam">il</span><span class="op">.</span><span class="nam">msg</span> <span class="op">+=</span> <span class="str">'ERROR '</span> <span class="op">+</span> <span class="nam">_</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t209" href="#t209">209</a></span><span class="t"> <span class="str">'Importer expected a .zip file. Did you choose the correct importer type for your data ?'</span><span class="op">)</span> <span class="op">+</span> <span class="str">'\n'</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t210" href="#t210">210</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t211" href="#t211">211</a></span><span class="t"> <span class="nam">msg</span> <span class="op">=</span> <span class="str">'ERROR '</span> <span class="op">+</span> <span class="nam">_</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t212" href="#t212">212</a></span><span class="t"> <span class="str">'An unexpected error occurred during the import. Please make sure you have uploaded a valid file.'</span><span class="op">)</span> <span class="op">+</span> <span class="str">'\n'</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t213" href="#t213">213</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">handle_exception</span><span class="op">(</span><span class="nam">e</span><span class="op">,</span> <span class="nam">log</span><span class="op">=</span><span class="nam">il</span><span class="op">,</span> <span class="nam">message</span><span class="op">=</span><span class="nam">msg</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t214" href="#t214">214</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t215" href="#t215">215</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">ignored_recipes</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t216" href="#t216">216</a></span><span class="t"> <span class="nam">il</span><span class="op">.</span><span class="nam">msg</span> <span class="op">+=</span> <span class="str">'\n'</span> <span class="op">+</span> <span class="nam">_</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t217" href="#t217">217</a></span><span class="t"> <span class="str">'The following recipes were ignored because they already existed:'</span><span class="op">)</span> <span class="op">+</span> <span class="str">' '</span> <span class="op">+</span> <span class="str">', '</span><span class="op">.</span><span class="nam">join</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t218" href="#t218">218</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">ignored_recipes</span><span class="op">)</span> <span class="op">+</span> <span class="str">'\n\n'</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t219" href="#t219">219</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t220" href="#t220">220</a></span><span class="t"> <span class="nam">il</span><span class="op">.</span><span class="nam">keyword</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">keyword</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t221" href="#t221">221</a></span><span class="t"> <span class="nam">il</span><span class="op">.</span><span class="nam">msg</span> <span class="op">+=</span> <span class="op">(</span><span class="nam">_</span><span class="op">(</span><span class="str">'Imported %s recipes.'</span><span class="op">)</span> <span class="op">%</span> <span class="nam">Recipe</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">filter</span><span class="op">(</span><span class="nam">keywords</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">keyword</span><span class="op">)</span><span class="op">.</span><span class="nam">count</span><span class="op">(</span><span class="op">)</span><span class="op">)</span> <span class="op">+</span> <span class="str">'\n'</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t222" href="#t222">222</a></span><span class="t"> <span class="nam">il</span><span class="op">.</span><span class="nam">running</span> <span class="op">=</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t223" href="#t223">223</a></span><span class="t"> <span class="nam">il</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t224" href="#t224">224</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t225" href="#t225">225</a></span><span class="t"> <span class="key">def</span> <span class="nam">handle_duplicates</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">recipe</span><span class="op">,</span> <span class="nam">import_duplicates</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t226" href="#t226">226</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t227" href="#t227">227</a></span><span class="t"><span class="str"> Checks if a recipe is already present, if so deletes it</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t228" href="#t228">228</a></span><span class="t"><span class="str"> :param recipe: Recipe object</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t229" href="#t229">229</a></span><span class="t"><span class="str"> :param import_duplicates: if duplicates should be imported</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t230" href="#t230">230</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t231" href="#t231">231</a></span><span class="t"> <span class="key">if</span> <span class="nam">Recipe</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">filter</span><span class="op">(</span><span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="nam">recipe</span><span class="op">.</span><span class="nam">name</span><span class="op">)</span><span class="op">.</span><span class="nam">count</span><span class="op">(</span><span class="op">)</span> <span class="op">></span> <span class="num">1</span> <span class="key">and</span> <span class="key">not</span> <span class="nam">import_duplicates</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t232" href="#t232">232</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">ignored_recipes</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">recipe</span><span class="op">.</span><span class="nam">name</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t233" href="#t233">233</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">delete</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t234" href="#t234">234</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t235" href="#t235">235</a></span><span class="t"> <span class="key">def</span> <span class="nam">import_recipe_image</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">recipe</span><span class="op">,</span> <span class="nam">image_file</span><span class="op">,</span> <span class="nam">filetype</span><span class="op">=</span><span class="str">'.jpeg'</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t236" href="#t236">236</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t237" href="#t237">237</a></span><span class="t"><span class="str"> Adds an image to a recipe naming it correctly</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t238" href="#t238">238</a></span><span class="t"><span class="str"> :param recipe: Recipe object</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t239" href="#t239">239</a></span><span class="t"><span class="str"> :param image_file: ByteIO stream containing the image</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t240" href="#t240">240</a></span><span class="t"><span class="str"> :param filetype: type of file to write bytes to, default to .jpeg if unknown</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t241" href="#t241">241</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t242" href="#t242">242</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">image</span> <span class="op">=</span> <span class="nam">File</span><span class="op">(</span><span class="nam">handle_image</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">,</span> <span class="nam">File</span><span class="op">(</span><span class="nam">image_file</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">'image'</span><span class="op">)</span><span class="op">,</span> <span class="nam">filetype</span><span class="op">=</span><span class="nam">filetype</span><span class="op">)</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">f'{uuid.uuid4()}_{recipe.pk}{filetype}'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t243" href="#t243">243</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t244" href="#t244">244</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t245" href="#t245">245</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_recipe_from_file</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">file</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t246" href="#t246">246</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t247" href="#t247">247</a></span><span class="t"><span class="str"> Takes any file like object and converts it into a recipe</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t248" href="#t248">248</a></span><span class="t"><span class="str"> :param file: ByteIO or any file like object, depends on provider</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t249" href="#t249">249</a></span><span class="t"><span class="str"> :return: Recipe object</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t250" href="#t250">250</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t251" href="#t251">251</a></span><span class="t"> <span class="key">raise</span> <span class="nam">NotImplementedError</span><span class="op">(</span><span class="str">'Method not implemented in integration'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t252" href="#t252">252</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t253" href="#t253">253</a></span><span class="t"> <span class="key">def</span> <span class="nam">split_recipe_file</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">file</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t254" href="#t254">254</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t255" href="#t255">255</a></span><span class="t"><span class="str"> Takes a file that contains multiple recipes and splits it into a list of strings of various formats (e.g. json, text, ..)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t256" href="#t256">256</a></span><span class="t"><span class="str"> :param file: ByteIO or any file like object, depends on provider</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t257" href="#t257">257</a></span><span class="t"><span class="str"> :return: list of strings</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t258" href="#t258">258</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t259" href="#t259">259</a></span><span class="t"> <span class="key">raise</span> <span class="nam">NotImplementedError</span><span class="op">(</span><span class="str">'Method not implemented in integration'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t260" href="#t260">260</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t261" href="#t261">261</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_file_from_recipe</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">recipe</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t262" href="#t262">262</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t263" href="#t263">263</a></span><span class="t"><span class="str"> Takes a recipe object and converts it to a string (depending on the format)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t264" href="#t264">264</a></span><span class="t"><span class="str"> returns both the filename of the exported file and the file contents</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t265" href="#t265">265</a></span><span class="t"><span class="str"> :param recipe: Recipe object that should be converted</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t266" href="#t266">266</a></span><span class="t"><span class="str"> :returns:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t267" href="#t267">267</a></span><span class="t"><span class="str"> - name - file name in export</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t268" href="#t268">268</a></span><span class="t"><span class="str"> - data - string content for file to get created in export zip</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t269" href="#t269">269</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t270" href="#t270">270</a></span><span class="t"> <span class="key">raise</span> <span class="nam">NotImplementedError</span><span class="op">(</span><span class="str">'Method not implemented in integration'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t271" href="#t271">271</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t272" href="#t272">272</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_files_from_recipes</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">recipes</span><span class="op">,</span> <span class="nam">el</span><span class="op">,</span> <span class="nam">cookie</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t273" href="#t273">273</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t274" href="#t274">274</a></span><span class="t"><span class="str"> Takes a list of recipe object and converts it to a array containing each file.</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t275" href="#t275">275</a></span><span class="t"><span class="str"> Each file is represented as an array [filename, data] where data is a string of the content of the file.</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t276" href="#t276">276</a></span><span class="t"><span class="str"> :param recipe: Recipe object that should be converted</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t277" href="#t277">277</a></span><span class="t"><span class="str"> :returns:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t278" href="#t278">278</a></span><span class="t"><span class="str"> [[filename, data], ...]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t279" href="#t279">279</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t280" href="#t280">280</a></span><span class="t"> <span class="key">raise</span> <span class="nam">NotImplementedError</span><span class="op">(</span><span class="str">'Method not implemented in integration'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t281" href="#t281">281</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t282" href="#t282">282</a></span><span class="t"> <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t283" href="#t283">283</a></span><span class="t"> <span class="key">def</span> <span class="nam">handle_exception</span><span class="op">(</span><span class="nam">exception</span><span class="op">,</span> <span class="nam">log</span><span class="op">=</span><span class="key">None</span><span class="op">,</span> <span class="nam">message</span><span class="op">=</span><span class="str">''</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t284" href="#t284">284</a></span><span class="t"> <span class="key">if</span> <span class="nam">log</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t285" href="#t285">285</a></span><span class="t"> <span class="key">if</span> <span class="nam">message</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t286" href="#t286">286</a></span><span class="t"> <span class="nam">log</span><span class="op">.</span><span class="nam">msg</span> <span class="op">+=</span> <span class="nam">message</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t287" href="#t287">287</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t288" href="#t288">288</a></span><span class="t"> <span class="nam">log</span><span class="op">.</span><span class="nam">msg</span> <span class="op">+=</span> <span class="nam">exception</span><span class="op">.</span><span class="nam">msg</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t289" href="#t289">289</a></span><span class="t"> <span class="key">if</span> <span class="nam">DEBUG</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t290" href="#t290">290</a></span><span class="t"> <span class="nam">traceback</span><span class="op">.</span><span class="nam">print_exc</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t291" href="#t291">291</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t292" href="#t292">292</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_export_file_name</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">format</span><span class="op">=</span><span class="str">'zip'</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t293" href="#t293">293</a></span><span class="t"> <span class="key">return</span> <span class="str">"export_{}.{}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">datetime</span><span class="op">.</span><span class="nam">datetime</span><span class="op">.</span><span class="nam">now</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">strftime</span><span class="op">(</span><span class="str">"%Y-%m-%d"</span><span class="op">)</span><span class="op">,</span> <span class="nam">format</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t294" href="#t294">294</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t295" href="#t295">295</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_recipe_processed_msg</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">recipe</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t296" href="#t296">296</a></span><span class="t"> <span class="key">return</span> <span class="str">f'{recipe.pk} - {recipe.name} \n'</span>&nbsp;</span><span class="r"></span></p>
</main>
<footer>
<div class="content">
<p>
<a id="prevFileLink" class="nav" href="d_37812bb4c19c71da_domestica_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_37812bb4c19c71da_mealie_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
</div>
</footer>
</body>
</html>

View File

@@ -1,196 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Coverage for cookbook/integration/mealie.py: 19%</title>
<link rel="icon" sizes="32x32" href="favicon_32.png">
<link rel="stylesheet" href="style.css" type="text/css">
<script type="text/javascript" src="coverage_html.js" defer></script>
</head>
<body class="pyfile">
<header>
<div class="content">
<h1>
<span class="text">Coverage for </span><b>cookbook/integration/mealie.py</b>:
<span class="pc_cov">19%</span>
</h1>
<aside id="help_panel_wrapper">
<input id="help_panel_state" type="checkbox">
<label for="help_panel_state">
<img id="keyboard_icon" src="keybd_closed.png" alt="Show/hide keyboard shortcuts" />
</label>
<div id="help_panel">
<p class="legend">Shortcuts on this page</p>
<div class="keyhelp">
<p>
<kbd>r</kbd>
<kbd>m</kbd>
<kbd>x</kbd>
&nbsp; toggle line displays
</p>
<p>
<kbd>j</kbd>
<kbd>k</kbd>
&nbsp; next/prev highlighted chunk
</p>
<p>
<kbd>0</kbd> &nbsp; (zero) top of page
</p>
<p>
<kbd>1</kbd> &nbsp; (one) first highlighted chunk
</p>
<p>
<kbd>[</kbd>
<kbd>]</kbd>
&nbsp; prev/next file
</p>
<p>
<kbd>u</kbd> &nbsp; up to the index
</p>
<p>
<kbd>?</kbd> &nbsp; show/hide this help
</p>
</div>
</div>
</aside>
<h2>
<span class="text">70 statements &nbsp;</span>
<button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">13<span class="text"> run</span></button>
<button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">57<span class="text"> missing</span></button>
<button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
</h2>
<p class="text">
<a id="prevFileLink" class="nav" href="d_37812bb4c19c71da_integration_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_37812bb4c19c71da_mealmaster_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
<aside class="hidden">
<button type="button" class="button_next_chunk" data-shortcut="j"/>
<button type="button" class="button_prev_chunk" data-shortcut="k"/>
<button type="button" class="button_top_of_page" data-shortcut="0"/>
<button type="button" class="button_first_chunk" data-shortcut="1"/>
<button type="button" class="button_prev_file" data-shortcut="["/>
<button type="button" class="button_next_file" data-shortcut="]"/>
<button type="button" class="button_to_index" data-shortcut="u"/>
<button type="button" class="button_show_hide_help" data-shortcut="?"/>
</aside>
</div>
</header>
<main id="source">
<p class="run"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">json</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">import</span> <span class="nam">re</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">from</span> <span class="nam">io</span> <span class="key">import</span> <span class="nam">BytesIO</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">from</span> <span class="nam">zipfile</span> <span class="key">import</span> <span class="nam">ZipFile</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">helper</span><span class="op">.</span><span class="nam">image_processing</span> <span class="key">import</span> <span class="nam">get_filetype</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">helper</span><span class="op">.</span><span class="nam">ingredient_parser</span> <span class="key">import</span> <span class="nam">IngredientParser</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">helper</span><span class="op">.</span><span class="nam">recipe_url_import</span> <span class="key">import</span> <span class="nam">parse_servings</span><span class="op">,</span> <span class="nam">parse_servings_text</span><span class="op">,</span> <span class="nam">parse_time</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">integration</span><span class="op">.</span><span class="nam">integration</span> <span class="key">import</span> <span class="nam">Integration</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">models</span> <span class="key">import</span> <span class="nam">Ingredient</span><span class="op">,</span> <span class="nam">Keyword</span><span class="op">,</span> <span class="nam">Recipe</span><span class="op">,</span> <span class="nam">Step</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"><span class="key">class</span> <span class="nam">Mealie</span><span class="op">(</span><span class="nam">Integration</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"> <span class="key">def</span> <span class="nam">import_file_name_filter</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">zip_info_object</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"> <span class="key">return</span> <span class="nam">re</span><span class="op">.</span><span class="nam">match</span><span class="op">(</span><span class="str">r'^recipes/([A-Za-z\d\s\-_()\[\]\u00C0-\u017F])+/([A-Za-z\d\s\-_()\[\]\u00C0-\u017F])+.json$'</span><span class="op">,</span> <span class="nam">zip_info_object</span><span class="op">.</span><span class="nam">filename</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_recipe_from_file</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">file</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"> <span class="nam">recipe_json</span> <span class="op">=</span> <span class="nam">json</span><span class="op">.</span><span class="nam">loads</span><span class="op">(</span><span class="nam">file</span><span class="op">.</span><span class="nam">getvalue</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">decode</span><span class="op">(</span><span class="str">"utf-8"</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"> <span class="nam">description</span> <span class="op">=</span> <span class="str">''</span> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'description'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span> <span class="op">></span> <span class="num">500</span> <span class="key">else</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'description'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"> <span class="nam">recipe</span> <span class="op">=</span> <span class="nam">Recipe</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"> <span class="nam">name</span><span class="op">=</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> <span class="nam">description</span><span class="op">=</span><span class="nam">description</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"> <span class="nam">created_by</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">,</span> <span class="nam">internal</span><span class="op">=</span><span class="key">True</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"> <span class="key">for</span> <span class="nam">s</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'recipe_instructions'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"> <span class="nam">step</span> <span class="op">=</span> <span class="nam">Step</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span><span class="nam">instruction</span><span class="op">=</span><span class="nam">s</span><span class="op">[</span><span class="str">'text'</span><span class="op">]</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span> <span class="nam">show_ingredients_table</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">.</span><span class="nam">userpreference</span><span class="op">.</span><span class="nam">show_step_ingredients</span><span class="op">,</span> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">steps</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">step</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"> <span class="nam">step</span> <span class="op">=</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">steps</span><span class="op">.</span><span class="nam">first</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">step</span><span class="op">:</span> <span class="com"># if there is no step in the exported data</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"> <span class="nam">step</span> <span class="op">=</span> <span class="nam">Step</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span><span class="nam">instruction</span><span class="op">=</span><span class="str">''</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">steps</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">step</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'description'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span> <span class="op">></span> <span class="num">500</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="nam">step</span><span class="op">.</span><span class="nam">instruction</span> <span class="op">=</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'description'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span> <span class="op">+</span> <span class="str">'\n\n'</span> <span class="op">+</span> <span class="nam">step</span><span class="op">.</span><span class="nam">instruction</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"> <span class="nam">ingredient_parser</span> <span class="op">=</span> <span class="nam">IngredientParser</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">,</span> <span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"> <span class="key">for</span> <span class="nam">ingredient</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'recipe_ingredient'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"> <span class="key">if</span> <span class="nam">ingredient</span><span class="op">[</span><span class="str">'food'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"> <span class="nam">f</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">get_food</span><span class="op">(</span><span class="nam">ingredient</span><span class="op">[</span><span class="str">'food'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="nam">u</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">get_unit</span><span class="op">(</span><span class="nam">ingredient</span><span class="op">[</span><span class="str">'unit'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="nam">amount</span> <span class="op">=</span> <span class="nam">ingredient</span><span class="op">[</span><span class="str">'quantity'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="nam">note</span> <span class="op">=</span> <span class="nam">ingredient</span><span class="op">[</span><span class="str">'note'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"> <span class="nam">original_text</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="nam">amount</span><span class="op">,</span> <span class="nam">unit</span><span class="op">,</span> <span class="nam">food</span><span class="op">,</span> <span class="nam">note</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">parse</span><span class="op">(</span><span class="nam">ingredient</span><span class="op">[</span><span class="str">'note'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="nam">f</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">get_food</span><span class="op">(</span><span class="nam">food</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"> <span class="nam">u</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">get_unit</span><span class="op">(</span><span class="nam">unit</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"> <span class="nam">original_text</span> <span class="op">=</span> <span class="nam">ingredient</span><span class="op">[</span><span class="str">'note'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"> <span class="nam">step</span><span class="op">.</span><span class="nam">ingredients</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">Ingredient</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="nam">food</span><span class="op">=</span><span class="nam">f</span><span class="op">,</span> <span class="nam">unit</span><span class="op">=</span><span class="nam">u</span><span class="op">,</span> <span class="nam">amount</span><span class="op">=</span><span class="nam">amount</span><span class="op">,</span> <span class="nam">note</span><span class="op">=</span><span class="nam">note</span><span class="op">,</span> <span class="nam">original_text</span><span class="op">=</span><span class="nam">original_text</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"> <span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="key">if</span> <span class="str">'tags'</span> <span class="key">in</span> <span class="nam">recipe_json</span> <span class="key">and</span> <span class="nam">len</span><span class="op">(</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'tags'</span><span class="op">]</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"> <span class="key">for</span> <span class="nam">k</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'tags'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"> <span class="key">if</span> <span class="str">'name'</span> <span class="key">in</span> <span class="nam">k</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"> <span class="nam">keyword</span><span class="op">,</span> <span class="nam">created</span> <span class="op">=</span> <span class="nam">Keyword</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">get_or_create</span><span class="op">(</span><span class="nam">name</span><span class="op">=</span><span class="nam">k</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">keywords</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">keyword</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"> <span class="key">if</span> <span class="str">'notes'</span> <span class="key">in</span> <span class="nam">recipe_json</span> <span class="key">and</span> <span class="nam">len</span><span class="op">(</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'notes'</span><span class="op">]</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"> <span class="nam">notes_text</span> <span class="op">=</span> <span class="str">"#### Notes \n\n"</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t"> <span class="key">for</span> <span class="nam">n</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'notes'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"> <span class="nam">notes_text</span> <span class="op">+=</span> <span class="str">f'{n["text"]} \n'</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> <span class="nam">step</span> <span class="op">=</span> <span class="nam">Step</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"> <span class="nam">instruction</span><span class="op">=</span><span class="nam">notes_text</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">steps</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">step</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t"> <span class="key">if</span> <span class="str">'recipe_yield'</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">servings</span> <span class="op">=</span> <span class="nam">parse_servings</span><span class="op">(</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'recipe_yield'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">servings_text</span> <span class="op">=</span> <span class="nam">parse_servings_text</span><span class="op">(</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'recipe_yield'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"> <span class="key">if</span> <span class="str">'total_time'</span> <span class="key">in</span> <span class="nam">recipe_json</span> <span class="key">and</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'total_time'</span><span class="op">]</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">working_time</span> <span class="op">=</span> <span class="nam">parse_time</span><span class="op">(</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'total_time'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"> <span class="key">if</span> <span class="str">'org_url'</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">source_url</span> <span class="op">=</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'org_url'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t"> <span class="key">for</span> <span class="nam">f</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">files</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t"> <span class="key">if</span> <span class="str">'.zip'</span> <span class="key">in</span> <span class="nam">f</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t"> <span class="nam">import_zip</span> <span class="op">=</span> <span class="nam">ZipFile</span><span class="op">(</span><span class="nam">f</span><span class="op">[</span><span class="str">'file'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">import_recipe_image</span><span class="op">(</span><span class="nam">recipe</span><span class="op">,</span> <span class="nam">BytesIO</span><span class="op">(</span><span class="nam">import_zip</span><span class="op">.</span><span class="nam">read</span><span class="op">(</span><span class="str">f'recipes/{recipe_json["slug"]}/images/min-original.webp'</span><span class="op">)</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t"> <span class="nam">filetype</span><span class="op">=</span><span class="nam">get_filetype</span><span class="op">(</span><span class="str">f'recipes/{recipe_json["slug"]}/images/original'</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t"> <span class="key">return</span> <span class="nam">recipe</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_file_from_recipe</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">recipe</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t"> <span class="key">raise</span> <span class="nam">NotImplementedError</span><span class="op">(</span><span class="str">'Method not implemented in storage integration'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
</main>
<footer>
<div class="content">
<p>
<a id="prevFileLink" class="nav" href="d_37812bb4c19c71da_integration_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_37812bb4c19c71da_mealmaster_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
</div>
</footer>
</body>
</html>

View File

@@ -1,176 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Coverage for cookbook/integration/mealmaster.py: 15%</title>
<link rel="icon" sizes="32x32" href="favicon_32.png">
<link rel="stylesheet" href="style.css" type="text/css">
<script type="text/javascript" src="coverage_html.js" defer></script>
</head>
<body class="pyfile">
<header>
<div class="content">
<h1>
<span class="text">Coverage for </span><b>cookbook/integration/mealmaster.py</b>:
<span class="pc_cov">15%</span>
</h1>
<aside id="help_panel_wrapper">
<input id="help_panel_state" type="checkbox">
<label for="help_panel_state">
<img id="keyboard_icon" src="keybd_closed.png" alt="Show/hide keyboard shortcuts" />
</label>
<div id="help_panel">
<p class="legend">Shortcuts on this page</p>
<div class="keyhelp">
<p>
<kbd>r</kbd>
<kbd>m</kbd>
<kbd>x</kbd>
&nbsp; toggle line displays
</p>
<p>
<kbd>j</kbd>
<kbd>k</kbd>
&nbsp; next/prev highlighted chunk
</p>
<p>
<kbd>0</kbd> &nbsp; (zero) top of page
</p>
<p>
<kbd>1</kbd> &nbsp; (one) first highlighted chunk
</p>
<p>
<kbd>[</kbd>
<kbd>]</kbd>
&nbsp; prev/next file
</p>
<p>
<kbd>u</kbd> &nbsp; up to the index
</p>
<p>
<kbd>?</kbd> &nbsp; show/hide this help
</p>
</div>
</div>
</aside>
<h2>
<span class="text">54 statements &nbsp;</span>
<button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">8<span class="text"> run</span></button>
<button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">46<span class="text"> missing</span></button>
<button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
</h2>
<p class="text">
<a id="prevFileLink" class="nav" href="d_37812bb4c19c71da_mealie_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_37812bb4c19c71da_melarecipes_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
<aside class="hidden">
<button type="button" class="button_next_chunk" data-shortcut="j"/>
<button type="button" class="button_prev_chunk" data-shortcut="k"/>
<button type="button" class="button_top_of_page" data-shortcut="0"/>
<button type="button" class="button_first_chunk" data-shortcut="1"/>
<button type="button" class="button_prev_file" data-shortcut="["/>
<button type="button" class="button_next_file" data-shortcut="]"/>
<button type="button" class="button_to_index" data-shortcut="u"/>
<button type="button" class="button_show_hide_help" data-shortcut="?"/>
</aside>
</div>
</header>
<main id="source">
<p class="run"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">re</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">helper</span><span class="op">.</span><span class="nam">ingredient_parser</span> <span class="key">import</span> <span class="nam">IngredientParser</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">integration</span><span class="op">.</span><span class="nam">integration</span> <span class="key">import</span> <span class="nam">Integration</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">models</span> <span class="key">import</span> <span class="nam">Ingredient</span><span class="op">,</span> <span class="nam">Keyword</span><span class="op">,</span> <span class="nam">Recipe</span><span class="op">,</span> <span class="nam">Step</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="key">class</span> <span class="nam">MealMaster</span><span class="op">(</span><span class="nam">Integration</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_recipe_from_file</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">file</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"> <span class="nam">servings</span> <span class="op">=</span> <span class="num">1</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"> <span class="nam">ingredients</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"> <span class="nam">directions</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"> <span class="key">for</span> <span class="nam">line</span> <span class="key">in</span> <span class="nam">file</span><span class="op">.</span><span class="nam">replace</span><span class="op">(</span><span class="str">'\r'</span><span class="op">,</span> <span class="str">''</span><span class="op">)</span><span class="op">.</span><span class="nam">split</span><span class="op">(</span><span class="str">'\n'</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">line</span><span class="op">.</span><span class="nam">startswith</span><span class="op">(</span><span class="str">'MMMMM'</span><span class="op">)</span> <span class="key">and</span> <span class="nam">line</span><span class="op">.</span><span class="nam">strip</span> <span class="op">!=</span> <span class="str">''</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"> <span class="key">if</span> <span class="str">'Title:'</span> <span class="key">in</span> <span class="nam">line</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"> <span class="nam">title</span> <span class="op">=</span> <span class="nam">line</span><span class="op">.</span><span class="nam">replace</span><span class="op">(</span><span class="str">'Title:'</span><span class="op">,</span> <span class="str">''</span><span class="op">)</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"> <span class="key">if</span> <span class="str">'Categories:'</span> <span class="key">in</span> <span class="nam">line</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"> <span class="nam">tags</span> <span class="op">=</span> <span class="nam">line</span><span class="op">.</span><span class="nam">replace</span><span class="op">(</span><span class="str">'Categories:'</span><span class="op">,</span> <span class="str">''</span><span class="op">)</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"> <span class="key">if</span> <span class="str">'Yield:'</span> <span class="key">in</span> <span class="nam">line</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"> <span class="nam">servings_text</span> <span class="op">=</span> <span class="nam">line</span><span class="op">.</span><span class="nam">replace</span><span class="op">(</span><span class="str">'Yield:'</span><span class="op">,</span> <span class="str">''</span><span class="op">)</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"> <span class="key">if</span> <span class="nam">re</span><span class="op">.</span><span class="nam">match</span><span class="op">(</span><span class="str">'\s{2,}([0-9])+'</span><span class="op">,</span> <span class="nam">line</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"> <span class="nam">ingredients</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">line</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"> <span class="nam">directions</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">line</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"> <span class="nam">servings</span> <span class="op">=</span> <span class="nam">re</span><span class="op">.</span><span class="nam">findall</span><span class="op">(</span><span class="str">'([0-9])+'</span><span class="op">,</span> <span class="nam">servings_text</span><span class="op">)</span><span class="op">[</span><span class="num">0</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="str">'failed parsing servings '</span><span class="op">,</span> <span class="nam">e</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"> <span class="nam">recipe</span> <span class="op">=</span> <span class="nam">Recipe</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span><span class="nam">name</span><span class="op">=</span><span class="nam">title</span><span class="op">,</span> <span class="nam">servings</span><span class="op">=</span><span class="nam">servings</span><span class="op">,</span> <span class="nam">created_by</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">,</span> <span class="nam">internal</span><span class="op">=</span><span class="key">True</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="key">for</span> <span class="nam">k</span> <span class="key">in</span> <span class="nam">tags</span><span class="op">.</span><span class="nam">split</span><span class="op">(</span><span class="str">','</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"> <span class="nam">keyword</span><span class="op">,</span> <span class="nam">created</span> <span class="op">=</span> <span class="nam">Keyword</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">get_or_create</span><span class="op">(</span><span class="nam">name</span><span class="op">=</span><span class="nam">k</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">keywords</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">keyword</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="nam">step</span> <span class="op">=</span> <span class="nam">Step</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"> <span class="nam">instruction</span><span class="op">=</span><span class="str">'\n'</span><span class="op">.</span><span class="nam">join</span><span class="op">(</span><span class="nam">directions</span><span class="op">)</span> <span class="op">+</span> <span class="str">'\n\n'</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span> <span class="nam">show_ingredients_table</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">.</span><span class="nam">userpreference</span><span class="op">.</span><span class="nam">show_step_ingredients</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="nam">ingredient_parser</span> <span class="op">=</span> <span class="nam">IngredientParser</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">,</span> <span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="key">for</span> <span class="nam">ingredient</span> <span class="key">in</span> <span class="nam">ingredients</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">ingredient</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="nam">amount</span><span class="op">,</span> <span class="nam">unit</span><span class="op">,</span> <span class="nam">food</span><span class="op">,</span> <span class="nam">note</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">parse</span><span class="op">(</span><span class="nam">ingredient</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="nam">f</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">get_food</span><span class="op">(</span><span class="nam">ingredient</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="nam">u</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">get_unit</span><span class="op">(</span><span class="nam">unit</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"> <span class="nam">step</span><span class="op">.</span><span class="nam">ingredients</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">Ingredient</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"> <span class="nam">food</span><span class="op">=</span><span class="nam">f</span><span class="op">,</span> <span class="nam">unit</span><span class="op">=</span><span class="nam">u</span><span class="op">,</span> <span class="nam">amount</span><span class="op">=</span><span class="nam">amount</span><span class="op">,</span> <span class="nam">note</span><span class="op">=</span><span class="nam">note</span><span class="op">,</span> <span class="nam">original_text</span><span class="op">=</span><span class="nam">ingredient</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"> <span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">steps</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">step</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="key">return</span> <span class="nam">recipe</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_file_from_recipe</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">recipe</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="key">raise</span> <span class="nam">NotImplementedError</span><span class="op">(</span><span class="str">'Method not implemented in storage integration'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"> <span class="key">def</span> <span class="nam">split_recipe_file</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">file</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"> <span class="nam">recipe_list</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="nam">current_recipe</span> <span class="op">=</span> <span class="str">''</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"> <span class="key">for</span> <span class="nam">fl</span> <span class="key">in</span> <span class="nam">file</span><span class="op">.</span><span class="nam">readlines</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"> <span class="nam">line</span> <span class="op">=</span> <span class="nam">fl</span><span class="op">.</span><span class="nam">decode</span><span class="op">(</span><span class="str">"windows-1250"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t"> <span class="key">if</span> <span class="op">(</span><span class="nam">line</span><span class="op">.</span><span class="nam">startswith</span><span class="op">(</span><span class="str">'MMMMM'</span><span class="op">)</span> <span class="key">or</span> <span class="nam">line</span><span class="op">.</span><span class="nam">startswith</span><span class="op">(</span><span class="str">'-----'</span><span class="op">)</span><span class="op">)</span> <span class="key">and</span> <span class="str">'meal-master'</span> <span class="key">in</span> <span class="nam">line</span><span class="op">.</span><span class="nam">lower</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"> <span class="key">if</span> <span class="nam">current_recipe</span> <span class="op">!=</span> <span class="str">''</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"> <span class="nam">recipe_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">current_recipe</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> <span class="nam">current_recipe</span> <span class="op">=</span> <span class="str">''</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="nam">current_recipe</span> <span class="op">=</span> <span class="str">''</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"> <span class="nam">current_recipe</span> <span class="op">+=</span> <span class="nam">line</span> <span class="op">+</span> <span class="str">'\n'</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t"> <span class="key">if</span> <span class="nam">current_recipe</span> <span class="op">!=</span> <span class="str">''</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"> <span class="nam">recipe_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">current_recipe</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"> <span class="key">return</span> <span class="nam">recipe_list</span>&nbsp;</span><span class="r"></span></p>
</main>
<footer>
<div class="content">
<p>
<a id="prevFileLink" class="nav" href="d_37812bb4c19c71da_mealie_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_37812bb4c19c71da_melarecipes_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
</div>
</footer>
</body>
</html>

View File

@@ -1,180 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Coverage for cookbook/integration/melarecipes.py: 23%</title>
<link rel="icon" sizes="32x32" href="favicon_32.png">
<link rel="stylesheet" href="style.css" type="text/css">
<script type="text/javascript" src="coverage_html.js" defer></script>
</head>
<body class="pyfile">
<header>
<div class="content">
<h1>
<span class="text">Coverage for </span><b>cookbook/integration/melarecipes.py</b>:
<span class="pc_cov">23%</span>
</h1>
<aside id="help_panel_wrapper">
<input id="help_panel_state" type="checkbox">
<label for="help_panel_state">
<img id="keyboard_icon" src="keybd_closed.png" alt="Show/hide keyboard shortcuts" />
</label>
<div id="help_panel">
<p class="legend">Shortcuts on this page</p>
<div class="keyhelp">
<p>
<kbd>r</kbd>
<kbd>m</kbd>
<kbd>x</kbd>
&nbsp; toggle line displays
</p>
<p>
<kbd>j</kbd>
<kbd>k</kbd>
&nbsp; next/prev highlighted chunk
</p>
<p>
<kbd>0</kbd> &nbsp; (zero) top of page
</p>
<p>
<kbd>1</kbd> &nbsp; (one) first highlighted chunk
</p>
<p>
<kbd>[</kbd>
<kbd>]</kbd>
&nbsp; prev/next file
</p>
<p>
<kbd>u</kbd> &nbsp; up to the index
</p>
<p>
<kbd>?</kbd> &nbsp; show/hide this help
</p>
</div>
</div>
</aside>
<h2>
<span class="text">56 statements &nbsp;</span>
<button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">13<span class="text"> run</span></button>
<button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">43<span class="text"> missing</span></button>
<button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
</h2>
<p class="text">
<a id="prevFileLink" class="nav" href="d_37812bb4c19c71da_mealmaster_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_37812bb4c19c71da_nextcloud_cookbook_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
<aside class="hidden">
<button type="button" class="button_next_chunk" data-shortcut="j"/>
<button type="button" class="button_prev_chunk" data-shortcut="k"/>
<button type="button" class="button_top_of_page" data-shortcut="0"/>
<button type="button" class="button_first_chunk" data-shortcut="1"/>
<button type="button" class="button_prev_file" data-shortcut="["/>
<button type="button" class="button_next_file" data-shortcut="]"/>
<button type="button" class="button_to_index" data-shortcut="u"/>
<button type="button" class="button_show_hide_help" data-shortcut="?"/>
</aside>
</div>
</header>
<main id="source">
<p class="run"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">base64</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">import</span> <span class="nam">json</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">from</span> <span class="nam">io</span> <span class="key">import</span> <span class="nam">BytesIO</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">from</span> <span class="nam">gettext</span> <span class="key">import</span> <span class="nam">gettext</span> <span class="key">as</span> <span class="nam">_</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">helper</span><span class="op">.</span><span class="nam">ingredient_parser</span> <span class="key">import</span> <span class="nam">IngredientParser</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">helper</span><span class="op">.</span><span class="nam">recipe_url_import</span> <span class="key">import</span> <span class="nam">parse_servings</span><span class="op">,</span> <span class="nam">parse_time</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">integration</span><span class="op">.</span><span class="nam">integration</span> <span class="key">import</span> <span class="nam">Integration</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">models</span> <span class="key">import</span> <span class="nam">Ingredient</span><span class="op">,</span> <span class="nam">Keyword</span><span class="op">,</span> <span class="nam">Recipe</span><span class="op">,</span> <span class="nam">Step</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"><span class="key">class</span> <span class="nam">MelaRecipes</span><span class="op">(</span><span class="nam">Integration</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"> <span class="key">def</span> <span class="nam">split_recipe_file</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">file</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"> <span class="key">return</span> <span class="op">[</span><span class="nam">json</span><span class="op">.</span><span class="nam">loads</span><span class="op">(</span><span class="nam">file</span><span class="op">.</span><span class="nam">getvalue</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">decode</span><span class="op">(</span><span class="str">"utf-8"</span><span class="op">)</span><span class="op">)</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_files_from_recipes</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">recipes</span><span class="op">,</span> <span class="nam">el</span><span class="op">,</span> <span class="nam">cookie</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"> <span class="key">raise</span> <span class="nam">NotImplementedError</span><span class="op">(</span><span class="str">'Method not implemented in storage integration'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_recipe_from_file</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">file</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"> <span class="nam">recipe_json</span> <span class="op">=</span> <span class="nam">file</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"> <span class="nam">recipe</span> <span class="op">=</span> <span class="nam">Recipe</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"> <span class="nam">name</span><span class="op">=</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'title'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"> <span class="nam">created_by</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">,</span> <span class="nam">internal</span><span class="op">=</span><span class="key">True</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"> <span class="key">if</span> <span class="str">'yield'</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">servings</span> <span class="op">=</span> <span class="nam">parse_servings</span><span class="op">(</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'yield'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"> <span class="key">if</span> <span class="str">'cookTime'</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">waiting_time</span> <span class="op">=</span> <span class="nam">parse_time</span><span class="op">(</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'cookTime'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"> <span class="key">if</span> <span class="str">'prepTime'</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">working_time</span> <span class="op">=</span> <span class="nam">parse_time</span><span class="op">(</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'prepTime'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"> <span class="key">if</span> <span class="str">'favorite'</span> <span class="key">in</span> <span class="nam">recipe_json</span> <span class="key">and</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'favorite'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">keywords</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">Keyword</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">get_or_create</span><span class="op">(</span><span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="nam">_</span><span class="op">(</span><span class="str">'Favorite'</span><span class="op">)</span><span class="op">)</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"> <span class="key">if</span> <span class="str">'categories'</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="key">for</span> <span class="nam">x</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'categories'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">keywords</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">Keyword</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">get_or_create</span><span class="op">(</span><span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="nam">x</span><span class="op">)</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="nam">instruction</span> <span class="op">=</span> <span class="str">''</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"> <span class="key">if</span> <span class="str">'text'</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="nam">instruction</span> <span class="op">+=</span> <span class="str">f'*{recipe_json["text"].strip()}* \n'</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="key">if</span> <span class="str">'instructions'</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"> <span class="nam">instruction</span> <span class="op">+=</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">"instructions"</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span> <span class="op">+</span> <span class="str">' \n'</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"> <span class="key">if</span> <span class="str">'notes'</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="nam">instruction</span> <span class="op">+=</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">"notes"</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span> <span class="op">+</span> <span class="str">' \n'</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="key">if</span> <span class="str">'link'</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">source_url</span> <span class="op">=</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'link'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="nam">step</span> <span class="op">=</span> <span class="nam">Step</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"> <span class="nam">instruction</span><span class="op">=</span><span class="nam">instruction</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span> <span class="nam">show_ingredients_table</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">.</span><span class="nam">userpreference</span><span class="op">.</span><span class="nam">show_step_ingredients</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="nam">ingredient_parser</span> <span class="op">=</span> <span class="nam">IngredientParser</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">,</span> <span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"> <span class="key">for</span> <span class="nam">ingredient</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'ingredients'</span><span class="op">]</span><span class="op">.</span><span class="nam">split</span><span class="op">(</span><span class="str">'\n'</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"> <span class="key">if</span> <span class="nam">ingredient</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span> <span class="op">!=</span> <span class="str">''</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"> <span class="nam">amount</span><span class="op">,</span> <span class="nam">unit</span><span class="op">,</span> <span class="nam">food</span><span class="op">,</span> <span class="nam">note</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">parse</span><span class="op">(</span><span class="nam">ingredient</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t"> <span class="nam">f</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">get_food</span><span class="op">(</span><span class="nam">food</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"> <span class="nam">u</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">get_unit</span><span class="op">(</span><span class="nam">unit</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"> <span class="nam">step</span><span class="op">.</span><span class="nam">ingredients</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">Ingredient</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> <span class="nam">food</span><span class="op">=</span><span class="nam">f</span><span class="op">,</span> <span class="nam">unit</span><span class="op">=</span><span class="nam">u</span><span class="op">,</span> <span class="nam">amount</span><span class="op">=</span><span class="nam">amount</span><span class="op">,</span> <span class="nam">note</span><span class="op">=</span><span class="nam">note</span><span class="op">,</span> <span class="nam">original_text</span><span class="op">=</span><span class="nam">ingredient</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"> <span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">steps</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">step</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"> <span class="key">if</span> <span class="nam">recipe_json</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"images"</span><span class="op">,</span> <span class="key">None</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">import_recipe_image</span><span class="op">(</span><span class="nam">recipe</span><span class="op">,</span> <span class="nam">BytesIO</span><span class="op">(</span><span class="nam">base64</span><span class="op">.</span><span class="nam">b64decode</span><span class="op">(</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'images'</span><span class="op">]</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="op">)</span><span class="op">)</span><span class="op">,</span> <span class="nam">filetype</span><span class="op">=</span><span class="str">'.jpeg'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"> <span class="key">return</span> <span class="nam">recipe</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_file_from_recipe</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">recipe</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"> <span class="key">raise</span> <span class="nam">NotImplementedError</span><span class="op">(</span><span class="str">'Method not implemented in storage integration'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
</main>
<footer>
<div class="content">
<p>
<a id="prevFileLink" class="nav" href="d_37812bb4c19c71da_mealmaster_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_37812bb4c19c71da_nextcloud_cookbook_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
</div>
</footer>
</body>
</html>

View File

@@ -1,289 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Coverage for cookbook/integration/nextcloud_cookbook.py: 13%</title>
<link rel="icon" sizes="32x32" href="favicon_32.png">
<link rel="stylesheet" href="style.css" type="text/css">
<script type="text/javascript" src="coverage_html.js" defer></script>
</head>
<body class="pyfile">
<header>
<div class="content">
<h1>
<span class="text">Coverage for </span><b>cookbook/integration/nextcloud_cookbook.py</b>:
<span class="pc_cov">13%</span>
</h1>
<aside id="help_panel_wrapper">
<input id="help_panel_state" type="checkbox">
<label for="help_panel_state">
<img id="keyboard_icon" src="keybd_closed.png" alt="Show/hide keyboard shortcuts" />
</label>
<div id="help_panel">
<p class="legend">Shortcuts on this page</p>
<div class="keyhelp">
<p>
<kbd>r</kbd>
<kbd>m</kbd>
<kbd>x</kbd>
&nbsp; toggle line displays
</p>
<p>
<kbd>j</kbd>
<kbd>k</kbd>
&nbsp; next/prev highlighted chunk
</p>
<p>
<kbd>0</kbd> &nbsp; (zero) top of page
</p>
<p>
<kbd>1</kbd> &nbsp; (one) first highlighted chunk
</p>
<p>
<kbd>[</kbd>
<kbd>]</kbd>
&nbsp; prev/next file
</p>
<p>
<kbd>u</kbd> &nbsp; up to the index
</p>
<p>
<kbd>?</kbd> &nbsp; show/hide this help
</p>
</div>
</div>
</aside>
<h2>
<span class="text">141 statements &nbsp;</span>
<button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">18<span class="text"> run</span></button>
<button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">123<span class="text"> missing</span></button>
<button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
</h2>
<p class="text">
<a id="prevFileLink" class="nav" href="d_37812bb4c19c71da_melarecipes_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_37812bb4c19c71da_openeats_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
<aside class="hidden">
<button type="button" class="button_next_chunk" data-shortcut="j"/>
<button type="button" class="button_prev_chunk" data-shortcut="k"/>
<button type="button" class="button_top_of_page" data-shortcut="0"/>
<button type="button" class="button_first_chunk" data-shortcut="1"/>
<button type="button" class="button_prev_file" data-shortcut="["/>
<button type="button" class="button_next_file" data-shortcut="]"/>
<button type="button" class="button_to_index" data-shortcut="u"/>
<button type="button" class="button_show_hide_help" data-shortcut="?"/>
</aside>
</div>
</header>
<main id="source">
<p class="run"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">json</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">import</span> <span class="nam">re</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">from</span> <span class="nam">io</span> <span class="key">import</span> <span class="nam">BytesIO</span><span class="op">,</span> <span class="nam">StringIO</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">from</span> <span class="nam">zipfile</span> <span class="key">import</span> <span class="nam">ZipFile</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"><span class="key">from</span> <span class="nam">PIL</span> <span class="key">import</span> <span class="nam">Image</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">helper</span><span class="op">.</span><span class="nam">image_processing</span> <span class="key">import</span> <span class="nam">get_filetype</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">helper</span><span class="op">.</span><span class="nam">ingredient_parser</span> <span class="key">import</span> <span class="nam">IngredientParser</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">helper</span><span class="op">.</span><span class="nam">recipe_url_import</span> <span class="key">import</span> <span class="nam">iso_duration_to_minutes</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">integration</span><span class="op">.</span><span class="nam">integration</span> <span class="key">import</span> <span class="nam">Integration</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">models</span> <span class="key">import</span> <span class="nam">Ingredient</span><span class="op">,</span> <span class="nam">Keyword</span><span class="op">,</span> <span class="nam">NutritionInformation</span><span class="op">,</span> <span class="nam">Recipe</span><span class="op">,</span> <span class="nam">Step</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"><span class="key">class</span> <span class="nam">NextcloudCookbook</span><span class="op">(</span><span class="nam">Integration</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"> <span class="key">def</span> <span class="nam">import_file_name_filter</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">zip_info_object</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"> <span class="key">return</span> <span class="nam">zip_info_object</span><span class="op">.</span><span class="nam">filename</span><span class="op">.</span><span class="nam">endswith</span><span class="op">(</span><span class="str">'.json'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_recipe_from_file</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">file</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"> <span class="nam">recipe_json</span> <span class="op">=</span> <span class="nam">json</span><span class="op">.</span><span class="nam">loads</span><span class="op">(</span><span class="nam">file</span><span class="op">.</span><span class="nam">getvalue</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">decode</span><span class="op">(</span><span class="str">"utf-8"</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"> <span class="nam">description</span> <span class="op">=</span> <span class="str">''</span> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'description'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span> <span class="op">></span> <span class="num">500</span> <span class="key">else</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'description'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"> <span class="nam">recipe</span> <span class="op">=</span> <span class="nam">Recipe</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"> <span class="nam">name</span><span class="op">=</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> <span class="nam">description</span><span class="op">=</span><span class="nam">description</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"> <span class="nam">created_by</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">,</span> <span class="nam">internal</span><span class="op">=</span><span class="key">True</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"> <span class="nam">servings</span><span class="op">=</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'recipeYield'</span><span class="op">]</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">working_time</span> <span class="op">=</span> <span class="nam">iso_duration_to_minutes</span><span class="op">(</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'prepTime'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">waiting_time</span> <span class="op">=</span> <span class="nam">iso_duration_to_minutes</span><span class="op">(</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'cookTime'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"> <span class="key">if</span> <span class="str">'url'</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">source_url</span> <span class="op">=</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'url'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"> <span class="key">if</span> <span class="str">'recipeCategory'</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">keywords</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">Keyword</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">get_or_create</span><span class="op">(</span><span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'recipeCategory'</span><span class="op">]</span><span class="op">)</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="key">if</span> <span class="str">'keywords'</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"> <span class="key">for</span> <span class="nam">x</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'keywords'</span><span class="op">]</span><span class="op">.</span><span class="nam">split</span><span class="op">(</span><span class="str">','</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="key">if</span> <span class="nam">x</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span> <span class="op">!=</span> <span class="str">''</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">keywords</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">Keyword</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">get_or_create</span><span class="op">(</span><span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="nam">x</span><span class="op">)</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"> <span class="nam">ingredients_added</span> <span class="op">=</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="key">for</span> <span class="nam">s</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'recipeInstructions'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"> <span class="key">if</span> <span class="str">'text'</span> <span class="key">in</span> <span class="nam">s</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="nam">step</span> <span class="op">=</span> <span class="nam">Step</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"> <span class="nam">instruction</span><span class="op">=</span><span class="nam">s</span><span class="op">[</span><span class="str">'text'</span><span class="op">]</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="nam">s</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span> <span class="nam">show_ingredients_table</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">.</span><span class="nam">userpreference</span><span class="op">.</span><span class="nam">show_step_ingredients</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"> <span class="nam">step</span> <span class="op">=</span> <span class="nam">Step</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"> <span class="nam">instruction</span><span class="op">=</span><span class="nam">s</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span> <span class="nam">show_ingredients_table</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">.</span><span class="nam">userpreference</span><span class="op">.</span><span class="nam">show_step_ingredients</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">ingredients_added</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'description'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span> <span class="op">></span> <span class="num">500</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"> <span class="nam">step</span><span class="op">.</span><span class="nam">instruction</span> <span class="op">=</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'description'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span> <span class="op">+</span> <span class="str">'\n\n'</span> <span class="op">+</span> <span class="nam">step</span><span class="op">.</span><span class="nam">instruction</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t"> <span class="nam">ingredients_added</span> <span class="op">=</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"> <span class="nam">ingredient_parser</span> <span class="op">=</span> <span class="nam">IngredientParser</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">,</span> <span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> <span class="key">for</span> <span class="nam">ingredient</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'recipeIngredient'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"> <span class="nam">amount</span><span class="op">,</span> <span class="nam">unit</span><span class="op">,</span> <span class="nam">food</span><span class="op">,</span> <span class="nam">note</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">parse</span><span class="op">(</span><span class="nam">ingredient</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="nam">f</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">get_food</span><span class="op">(</span><span class="nam">food</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"> <span class="nam">u</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">get_unit</span><span class="op">(</span><span class="nam">unit</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"> <span class="nam">step</span><span class="op">.</span><span class="nam">ingredients</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">Ingredient</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t"> <span class="nam">food</span><span class="op">=</span><span class="nam">f</span><span class="op">,</span> <span class="nam">unit</span><span class="op">=</span><span class="nam">u</span><span class="op">,</span> <span class="nam">amount</span><span class="op">=</span><span class="nam">amount</span><span class="op">,</span> <span class="nam">note</span><span class="op">=</span><span class="nam">note</span><span class="op">,</span> <span class="nam">original_text</span><span class="op">=</span><span class="nam">ingredient</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t"> <span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">steps</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">step</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"> <span class="key">if</span> <span class="str">'nutrition'</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"> <span class="nam">nutrition</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"> <span class="key">if</span> <span class="str">'calories'</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'nutrition'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"> <span class="nam">nutrition</span><span class="op">[</span><span class="str">'calories'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">int</span><span class="op">(</span><span class="nam">re</span><span class="op">.</span><span class="nam">search</span><span class="op">(</span><span class="str">r'\d+'</span><span class="op">,</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'nutrition'</span><span class="op">]</span><span class="op">[</span><span class="str">'calories'</span><span class="op">]</span><span class="op">)</span><span class="op">.</span><span class="nam">group</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t"> <span class="key">if</span> <span class="str">'proteinContent'</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'nutrition'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"> <span class="nam">nutrition</span><span class="op">[</span><span class="str">'proteins'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">int</span><span class="op">(</span><span class="nam">re</span><span class="op">.</span><span class="nam">search</span><span class="op">(</span><span class="str">r'\d+'</span><span class="op">,</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'nutrition'</span><span class="op">]</span><span class="op">[</span><span class="str">'proteinContent'</span><span class="op">]</span><span class="op">)</span><span class="op">.</span><span class="nam">group</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t"> <span class="key">if</span> <span class="str">'fatContent'</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'nutrition'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t"> <span class="nam">nutrition</span><span class="op">[</span><span class="str">'fats'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">int</span><span class="op">(</span><span class="nam">re</span><span class="op">.</span><span class="nam">search</span><span class="op">(</span><span class="str">r'\d+'</span><span class="op">,</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'nutrition'</span><span class="op">]</span><span class="op">[</span><span class="str">'fatContent'</span><span class="op">]</span><span class="op">)</span><span class="op">.</span><span class="nam">group</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t"> <span class="key">if</span> <span class="str">'carbohydrateContent'</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'nutrition'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t"> <span class="nam">nutrition</span><span class="op">[</span><span class="str">'carbohydrates'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">int</span><span class="op">(</span><span class="nam">re</span><span class="op">.</span><span class="nam">search</span><span class="op">(</span><span class="str">r'\d+'</span><span class="op">,</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'nutrition'</span><span class="op">]</span><span class="op">[</span><span class="str">'carbohydrateContent'</span><span class="op">]</span><span class="op">)</span><span class="op">.</span><span class="nam">group</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t"> <span class="key">if</span> <span class="nam">nutrition</span> <span class="op">!=</span> <span class="op">{</span><span class="op">}</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">nutrition</span> <span class="op">=</span> <span class="nam">NutritionInformation</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span><span class="op">**</span><span class="nam">nutrition</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t"> <span class="key">for</span> <span class="nam">f</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">files</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t"> <span class="key">if</span> <span class="str">'.zip'</span> <span class="key">in</span> <span class="nam">f</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t"> <span class="nam">import_zip</span> <span class="op">=</span> <span class="nam">ZipFile</span><span class="op">(</span><span class="nam">f</span><span class="op">[</span><span class="str">'file'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t"> <span class="key">for</span> <span class="nam">z</span> <span class="key">in</span> <span class="nam">import_zip</span><span class="op">.</span><span class="nam">filelist</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t"> <span class="key">if</span> <span class="nam">re</span><span class="op">.</span><span class="nam">match</span><span class="op">(</span><span class="str">f'^(.)+{recipe.name}/full.jpg$'</span><span class="op">,</span> <span class="nam">z</span><span class="op">.</span><span class="nam">filename</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">import_recipe_image</span><span class="op">(</span><span class="nam">recipe</span><span class="op">,</span> <span class="nam">BytesIO</span><span class="op">(</span><span class="nam">import_zip</span><span class="op">.</span><span class="nam">read</span><span class="op">(</span><span class="nam">z</span><span class="op">.</span><span class="nam">filename</span><span class="op">)</span><span class="op">)</span><span class="op">,</span> <span class="nam">filetype</span><span class="op">=</span><span class="nam">get_filetype</span><span class="op">(</span><span class="nam">z</span><span class="op">.</span><span class="nam">filename</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t"> <span class="key">return</span> <span class="nam">recipe</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t"> <span class="key">def</span> <span class="nam">formatTime</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">min</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"> <span class="nam">h</span> <span class="op">=</span> <span class="nam">min</span> <span class="op">//</span> <span class="num">60</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t"> <span class="nam">m</span> <span class="op">=</span> <span class="nam">min</span> <span class="op">%</span> <span class="num">60</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t"> <span class="key">return</span> <span class="str">f'PT{h}H{m}M0S'</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_file_from_recipe</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">recipe</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t113" href="#t113">113</a></span><span class="t"> <span class="nam">export</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t114" href="#t114">114</a></span><span class="t"> <span class="nam">export</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">name</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t115" href="#t115">115</a></span><span class="t"> <span class="nam">export</span><span class="op">[</span><span class="str">'description'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">description</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t116" href="#t116">116</a></span><span class="t"> <span class="nam">export</span><span class="op">[</span><span class="str">'url'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">source_url</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t117" href="#t117">117</a></span><span class="t"> <span class="nam">export</span><span class="op">[</span><span class="str">'prepTime'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">formatTime</span><span class="op">(</span><span class="nam">recipe</span><span class="op">.</span><span class="nam">working_time</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t118" href="#t118">118</a></span><span class="t"> <span class="nam">export</span><span class="op">[</span><span class="str">'cookTime'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">formatTime</span><span class="op">(</span><span class="nam">recipe</span><span class="op">.</span><span class="nam">waiting_time</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t119" href="#t119">119</a></span><span class="t"> <span class="nam">export</span><span class="op">[</span><span class="str">'totalTime'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">formatTime</span><span class="op">(</span><span class="nam">recipe</span><span class="op">.</span><span class="nam">working_time</span> <span class="op">+</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">waiting_time</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t120" href="#t120">120</a></span><span class="t"> <span class="nam">export</span><span class="op">[</span><span class="str">'recipeYield'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">servings</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t121" href="#t121">121</a></span><span class="t"> <span class="nam">export</span><span class="op">[</span><span class="str">'image'</span><span class="op">]</span> <span class="op">=</span> <span class="str">f'/Recipes/{recipe.name}/full.jpg'</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t122" href="#t122">122</a></span><span class="t"> <span class="nam">export</span><span class="op">[</span><span class="str">'imageUrl'</span><span class="op">]</span> <span class="op">=</span> <span class="str">f'/Recipes/{recipe.name}/full.jpg'</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t123" href="#t123">123</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t124" href="#t124">124</a></span><span class="t"> <span class="nam">recipeKeyword</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t125" href="#t125">125</a></span><span class="t"> <span class="key">for</span> <span class="nam">k</span> <span class="key">in</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">keywords</span><span class="op">.</span><span class="nam">all</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t126" href="#t126">126</a></span><span class="t"> <span class="nam">recipeKeyword</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">k</span><span class="op">.</span><span class="nam">name</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t127" href="#t127">127</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t128" href="#t128">128</a></span><span class="t"> <span class="nam">export</span><span class="op">[</span><span class="str">'keywords'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">recipeKeyword</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t129" href="#t129">129</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t130" href="#t130">130</a></span><span class="t"> <span class="nam">recipeInstructions</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t131" href="#t131">131</a></span><span class="t"> <span class="nam">recipeIngredient</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t132" href="#t132">132</a></span><span class="t"> <span class="key">for</span> <span class="nam">s</span> <span class="key">in</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">steps</span><span class="op">.</span><span class="nam">all</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t133" href="#t133">133</a></span><span class="t"> <span class="nam">recipeInstructions</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">s</span><span class="op">.</span><span class="nam">instruction</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t134" href="#t134">134</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t135" href="#t135">135</a></span><span class="t"> <span class="key">for</span> <span class="nam">i</span> <span class="key">in</span> <span class="nam">s</span><span class="op">.</span><span class="nam">ingredients</span><span class="op">.</span><span class="nam">all</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t136" href="#t136">136</a></span><span class="t"> <span class="nam">recipeIngredient</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="str">f'{float(i.amount)} {i.unit} {i.food}'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t137" href="#t137">137</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t138" href="#t138">138</a></span><span class="t"> <span class="nam">export</span><span class="op">[</span><span class="str">'recipeIngredient'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">recipeIngredient</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t139" href="#t139">139</a></span><span class="t"> <span class="nam">export</span><span class="op">[</span><span class="str">'recipeInstructions'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">recipeInstructions</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t140" href="#t140">140</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t141" href="#t141">141</a></span><span class="t"> <span class="key">return</span> <span class="str">"recipe.json"</span><span class="op">,</span> <span class="nam">json</span><span class="op">.</span><span class="nam">dumps</span><span class="op">(</span><span class="nam">export</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t142" href="#t142">142</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t143" href="#t143">143</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_files_from_recipes</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">recipes</span><span class="op">,</span> <span class="nam">el</span><span class="op">,</span> <span class="nam">cookie</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t144" href="#t144">144</a></span><span class="t"> <span class="nam">export_zip_stream</span> <span class="op">=</span> <span class="nam">BytesIO</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t145" href="#t145">145</a></span><span class="t"> <span class="nam">export_zip_obj</span> <span class="op">=</span> <span class="nam">ZipFile</span><span class="op">(</span><span class="nam">export_zip_stream</span><span class="op">,</span> <span class="str">'w'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t146" href="#t146">146</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t147" href="#t147">147</a></span><span class="t"> <span class="key">for</span> <span class="nam">recipe</span> <span class="key">in</span> <span class="nam">recipes</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t148" href="#t148">148</a></span><span class="t"> <span class="key">if</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">internal</span> <span class="key">and</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">space</span> <span class="op">==</span> <span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t149" href="#t149">149</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t150" href="#t150">150</a></span><span class="t"> <span class="nam">recipe_stream</span> <span class="op">=</span> <span class="nam">StringIO</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t151" href="#t151">151</a></span><span class="t"> <span class="nam">filename</span><span class="op">,</span> <span class="nam">data</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">get_file_from_recipe</span><span class="op">(</span><span class="nam">recipe</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t152" href="#t152">152</a></span><span class="t"> <span class="nam">recipe_stream</span><span class="op">.</span><span class="nam">write</span><span class="op">(</span><span class="nam">data</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t153" href="#t153">153</a></span><span class="t"> <span class="nam">export_zip_obj</span><span class="op">.</span><span class="nam">writestr</span><span class="op">(</span><span class="str">f'{recipe.name}/{filename}'</span><span class="op">,</span> <span class="nam">recipe_stream</span><span class="op">.</span><span class="nam">getvalue</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t154" href="#t154">154</a></span><span class="t"> <span class="nam">recipe_stream</span><span class="op">.</span><span class="nam">close</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t155" href="#t155">155</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t156" href="#t156">156</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t157" href="#t157">157</a></span><span class="t"> <span class="nam">imageByte</span> <span class="op">=</span> <span class="nam">recipe</span><span class="op">.</span><span class="nam">image</span><span class="op">.</span><span class="nam">file</span><span class="op">.</span><span class="nam">read</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t158" href="#t158">158</a></span><span class="t"> <span class="nam">export_zip_obj</span><span class="op">.</span><span class="nam">writestr</span><span class="op">(</span><span class="str">f'{recipe.name}/full.jpg'</span><span class="op">,</span> <span class="nam">self</span><span class="op">.</span><span class="nam">getJPEG</span><span class="op">(</span><span class="nam">imageByte</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t159" href="#t159">159</a></span><span class="t"> <span class="nam">export_zip_obj</span><span class="op">.</span><span class="nam">writestr</span><span class="op">(</span><span class="str">f'{recipe.name}/thumb.jpg'</span><span class="op">,</span> <span class="nam">self</span><span class="op">.</span><span class="nam">getThumb</span><span class="op">(</span><span class="num">171</span><span class="op">,</span> <span class="nam">imageByte</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t160" href="#t160">160</a></span><span class="t"> <span class="nam">export_zip_obj</span><span class="op">.</span><span class="nam">writestr</span><span class="op">(</span><span class="str">f'{recipe.name}/thumb16.jpg'</span><span class="op">,</span> <span class="nam">self</span><span class="op">.</span><span class="nam">getThumb</span><span class="op">(</span><span class="num">16</span><span class="op">,</span> <span class="nam">imageByte</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t161" href="#t161">161</a></span><span class="t"> <span class="key">except</span> <span class="nam">ValueError</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t162" href="#t162">162</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t163" href="#t163">163</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t164" href="#t164">164</a></span><span class="t"> <span class="nam">el</span><span class="op">.</span><span class="nam">exported_recipes</span> <span class="op">+=</span> <span class="num">1</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t165" href="#t165">165</a></span><span class="t"> <span class="nam">el</span><span class="op">.</span><span class="nam">msg</span> <span class="op">+=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">get_recipe_processed_msg</span><span class="op">(</span><span class="nam">recipe</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t166" href="#t166">166</a></span><span class="t"> <span class="nam">el</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t167" href="#t167">167</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t168" href="#t168">168</a></span><span class="t"> <span class="nam">export_zip_obj</span><span class="op">.</span><span class="nam">close</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t169" href="#t169">169</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t170" href="#t170">170</a></span><span class="t"> <span class="key">return</span> <span class="op">[</span><span class="op">[</span><span class="nam">self</span><span class="op">.</span><span class="nam">get_export_file_name</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> <span class="nam">export_zip_stream</span><span class="op">.</span><span class="nam">getvalue</span><span class="op">(</span><span class="op">)</span><span class="op">]</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t171" href="#t171">171</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t172" href="#t172">172</a></span><span class="t"> <span class="key">def</span> <span class="nam">getJPEG</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">imageByte</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t173" href="#t173">173</a></span><span class="t"> <span class="nam">image</span> <span class="op">=</span> <span class="nam">Image</span><span class="op">.</span><span class="nam">open</span><span class="op">(</span><span class="nam">BytesIO</span><span class="op">(</span><span class="nam">imageByte</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t174" href="#t174">174</a></span><span class="t"> <span class="nam">image</span> <span class="op">=</span> <span class="nam">image</span><span class="op">.</span><span class="nam">convert</span><span class="op">(</span><span class="str">'RGB'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t175" href="#t175">175</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t176" href="#t176">176</a></span><span class="t"> <span class="nam">bytes</span> <span class="op">=</span> <span class="nam">BytesIO</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t177" href="#t177">177</a></span><span class="t"> <span class="nam">image</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="nam">bytes</span><span class="op">,</span> <span class="str">"JPEG"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t178" href="#t178">178</a></span><span class="t"> <span class="key">return</span> <span class="nam">bytes</span><span class="op">.</span><span class="nam">getvalue</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t179" href="#t179">179</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t180" href="#t180">180</a></span><span class="t"> <span class="key">def</span> <span class="nam">getThumb</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">size</span><span class="op">,</span> <span class="nam">imageByte</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t181" href="#t181">181</a></span><span class="t"> <span class="nam">image</span> <span class="op">=</span> <span class="nam">Image</span><span class="op">.</span><span class="nam">open</span><span class="op">(</span><span class="nam">BytesIO</span><span class="op">(</span><span class="nam">imageByte</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t182" href="#t182">182</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t183" href="#t183">183</a></span><span class="t"> <span class="nam">w</span><span class="op">,</span> <span class="nam">h</span> <span class="op">=</span> <span class="nam">image</span><span class="op">.</span><span class="nam">size</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t184" href="#t184">184</a></span><span class="t"> <span class="nam">m</span> <span class="op">=</span> <span class="nam">min</span><span class="op">(</span><span class="nam">w</span><span class="op">,</span> <span class="nam">h</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t185" href="#t185">185</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t186" href="#t186">186</a></span><span class="t"> <span class="nam">image</span> <span class="op">=</span> <span class="nam">image</span><span class="op">.</span><span class="nam">crop</span><span class="op">(</span><span class="op">(</span><span class="op">(</span><span class="nam">w</span> <span class="op">-</span> <span class="nam">m</span><span class="op">)</span> <span class="op">//</span> <span class="num">2</span><span class="op">,</span> <span class="op">(</span><span class="nam">h</span> <span class="op">-</span> <span class="nam">m</span><span class="op">)</span> <span class="op">//</span> <span class="num">2</span><span class="op">,</span> <span class="op">(</span><span class="nam">w</span> <span class="op">+</span> <span class="nam">m</span><span class="op">)</span> <span class="op">//</span> <span class="num">2</span><span class="op">,</span> <span class="op">(</span><span class="nam">h</span> <span class="op">+</span> <span class="nam">m</span><span class="op">)</span> <span class="op">//</span> <span class="num">2</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t187" href="#t187">187</a></span><span class="t"> <span class="nam">image</span> <span class="op">=</span> <span class="nam">image</span><span class="op">.</span><span class="nam">resize</span><span class="op">(</span><span class="op">[</span><span class="nam">size</span><span class="op">,</span> <span class="nam">size</span><span class="op">]</span><span class="op">,</span> <span class="nam">Image</span><span class="op">.</span><span class="nam">Resampling</span><span class="op">.</span><span class="nam">LANCZOS</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t188" href="#t188">188</a></span><span class="t"> <span class="nam">image</span> <span class="op">=</span> <span class="nam">image</span><span class="op">.</span><span class="nam">convert</span><span class="op">(</span><span class="str">'RGB'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t189" href="#t189">189</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t190" href="#t190">190</a></span><span class="t"> <span class="nam">bytes</span> <span class="op">=</span> <span class="nam">BytesIO</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t191" href="#t191">191</a></span><span class="t"> <span class="nam">image</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="nam">bytes</span><span class="op">,</span> <span class="str">"JPEG"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t192" href="#t192">192</a></span><span class="t"> <span class="key">return</span> <span class="nam">bytes</span><span class="op">.</span><span class="nam">getvalue</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
</main>
<footer>
<div class="content">
<p>
<a id="prevFileLink" class="nav" href="d_37812bb4c19c71da_melarecipes_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_37812bb4c19c71da_openeats_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
</div>
</footer>
</body>
</html>

View File

@@ -1,226 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Coverage for cookbook/integration/openeats.py: 11%</title>
<link rel="icon" sizes="32x32" href="favicon_32.png">
<link rel="stylesheet" href="style.css" type="text/css">
<script type="text/javascript" src="coverage_html.js" defer></script>
</head>
<body class="pyfile">
<header>
<div class="content">
<h1>
<span class="text">Coverage for </span><b>cookbook/integration/openeats.py</b>:
<span class="pc_cov">11%</span>
</h1>
<aside id="help_panel_wrapper">
<input id="help_panel_state" type="checkbox">
<label for="help_panel_state">
<img id="keyboard_icon" src="keybd_closed.png" alt="Show/hide keyboard shortcuts" />
</label>
<div id="help_panel">
<p class="legend">Shortcuts on this page</p>
<div class="keyhelp">
<p>
<kbd>r</kbd>
<kbd>m</kbd>
<kbd>x</kbd>
&nbsp; toggle line displays
</p>
<p>
<kbd>j</kbd>
<kbd>k</kbd>
&nbsp; next/prev highlighted chunk
</p>
<p>
<kbd>0</kbd> &nbsp; (zero) top of page
</p>
<p>
<kbd>1</kbd> &nbsp; (one) first highlighted chunk
</p>
<p>
<kbd>[</kbd>
<kbd>]</kbd>
&nbsp; prev/next file
</p>
<p>
<kbd>u</kbd> &nbsp; up to the index
</p>
<p>
<kbd>?</kbd> &nbsp; show/hide this help
</p>
</div>
</div>
</aside>
<h2>
<span class="text">81 statements &nbsp;</span>
<button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">9<span class="text"> run</span></button>
<button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">72<span class="text"> missing</span></button>
<button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
</h2>
<p class="text">
<a id="prevFileLink" class="nav" href="d_37812bb4c19c71da_nextcloud_cookbook_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_37812bb4c19c71da_paprika_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
<aside class="hidden">
<button type="button" class="button_next_chunk" data-shortcut="j"/>
<button type="button" class="button_prev_chunk" data-shortcut="k"/>
<button type="button" class="button_top_of_page" data-shortcut="0"/>
<button type="button" class="button_first_chunk" data-shortcut="1"/>
<button type="button" class="button_prev_file" data-shortcut="["/>
<button type="button" class="button_next_file" data-shortcut="]"/>
<button type="button" class="button_to_index" data-shortcut="u"/>
<button type="button" class="button_show_hide_help" data-shortcut="?"/>
</aside>
</div>
</header>
<main id="source">
<p class="run"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">json</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">from</span> <span class="nam">django</span><span class="op">.</span><span class="nam">utils</span><span class="op">.</span><span class="nam">translation</span> <span class="key">import</span> <span class="nam">gettext</span> <span class="key">as</span> <span class="nam">_</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">helper</span><span class="op">.</span><span class="nam">ingredient_parser</span> <span class="key">import</span> <span class="nam">IngredientParser</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">integration</span><span class="op">.</span><span class="nam">integration</span> <span class="key">import</span> <span class="nam">Integration</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">models</span> <span class="key">import</span> <span class="nam">Comment</span><span class="op">,</span> <span class="nam">CookLog</span><span class="op">,</span> <span class="nam">Ingredient</span><span class="op">,</span> <span class="nam">Keyword</span><span class="op">,</span> <span class="nam">Recipe</span><span class="op">,</span> <span class="nam">Step</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="key">class</span> <span class="nam">OpenEats</span><span class="op">(</span><span class="nam">Integration</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_recipe_from_file</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">file</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"> <span class="nam">description</span> <span class="op">=</span> <span class="nam">file</span><span class="op">[</span><span class="str">'info'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"> <span class="nam">description_max_length</span> <span class="op">=</span> <span class="nam">Recipe</span><span class="op">.</span><span class="nam">_meta</span><span class="op">.</span><span class="nam">get_field</span><span class="op">(</span><span class="str">'description'</span><span class="op">)</span><span class="op">.</span><span class="nam">max_length</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">description</span><span class="op">)</span> <span class="op">></span> <span class="nam">description_max_length</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"> <span class="nam">description</span> <span class="op">=</span> <span class="nam">description</span><span class="op">[</span><span class="num">0</span><span class="op">:</span><span class="nam">description_max_length</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"> <span class="nam">recipe</span> <span class="op">=</span> <span class="nam">Recipe</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span><span class="nam">name</span><span class="op">=</span><span class="nam">file</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> <span class="nam">description</span><span class="op">=</span><span class="nam">description</span><span class="op">,</span> <span class="nam">created_by</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">,</span> <span class="nam">internal</span><span class="op">=</span><span class="key">True</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"> <span class="nam">servings</span><span class="op">=</span><span class="nam">file</span><span class="op">[</span><span class="str">'servings'</span><span class="op">]</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span> <span class="nam">waiting_time</span><span class="op">=</span><span class="nam">file</span><span class="op">[</span><span class="str">'cook_time'</span><span class="op">]</span><span class="op">,</span> <span class="nam">working_time</span><span class="op">=</span><span class="nam">file</span><span class="op">[</span><span class="str">'prep_time'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"> <span class="nam">instructions</span> <span class="op">=</span> <span class="str">''</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"> <span class="key">if</span> <span class="nam">file</span><span class="op">[</span><span class="str">"directions"</span><span class="op">]</span> <span class="op">!=</span> <span class="str">''</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"> <span class="nam">instructions</span> <span class="op">+=</span> <span class="nam">file</span><span class="op">[</span><span class="str">"directions"</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"> <span class="key">if</span> <span class="nam">file</span><span class="op">[</span><span class="str">"source"</span><span class="op">]</span> <span class="op">!=</span> <span class="str">''</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"> <span class="nam">instructions</span> <span class="op">+=</span> <span class="str">'\n'</span> <span class="op">+</span> <span class="nam">_</span><span class="op">(</span><span class="str">'Recipe source:'</span><span class="op">)</span> <span class="op">+</span> <span class="str">f'[{file["source"]}]({file["source"]})'</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"> <span class="nam">cuisine_keyword</span><span class="op">,</span> <span class="nam">created</span> <span class="op">=</span> <span class="nam">Keyword</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">get_or_create</span><span class="op">(</span><span class="nam">name</span><span class="op">=</span><span class="str">"Cuisine"</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"> <span class="key">if</span> <span class="nam">file</span><span class="op">[</span><span class="str">"cuisine"</span><span class="op">]</span> <span class="op">!=</span> <span class="str">''</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"> <span class="nam">keyword</span><span class="op">,</span> <span class="nam">created</span> <span class="op">=</span> <span class="nam">Keyword</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">get_or_create</span><span class="op">(</span><span class="nam">name</span><span class="op">=</span><span class="nam">file</span><span class="op">[</span><span class="str">"cuisine"</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"> <span class="key">if</span> <span class="nam">created</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"> <span class="nam">keyword</span><span class="op">.</span><span class="nam">move</span><span class="op">(</span><span class="nam">cuisine_keyword</span><span class="op">,</span> <span class="nam">pos</span><span class="op">=</span><span class="str">"last-child"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">keywords</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">keyword</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="nam">course_keyword</span><span class="op">,</span> <span class="nam">created</span> <span class="op">=</span> <span class="nam">Keyword</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">get_or_create</span><span class="op">(</span><span class="nam">name</span><span class="op">=</span><span class="str">"Course"</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"> <span class="key">if</span> <span class="nam">file</span><span class="op">[</span><span class="str">"course"</span><span class="op">]</span> <span class="op">!=</span> <span class="str">''</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"> <span class="nam">keyword</span><span class="op">,</span> <span class="nam">created</span> <span class="op">=</span> <span class="nam">Keyword</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">get_or_create</span><span class="op">(</span><span class="nam">name</span><span class="op">=</span><span class="nam">file</span><span class="op">[</span><span class="str">"course"</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"> <span class="key">if</span> <span class="nam">created</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="nam">keyword</span><span class="op">.</span><span class="nam">move</span><span class="op">(</span><span class="nam">course_keyword</span><span class="op">,</span> <span class="nam">pos</span><span class="op">=</span><span class="str">"last-child"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">keywords</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">keyword</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="key">for</span> <span class="nam">tag</span> <span class="key">in</span> <span class="nam">file</span><span class="op">[</span><span class="str">"tags"</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="nam">keyword</span><span class="op">,</span> <span class="nam">created</span> <span class="op">=</span> <span class="nam">Keyword</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">get_or_create</span><span class="op">(</span><span class="nam">name</span><span class="op">=</span><span class="nam">tag</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">keywords</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">keyword</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="key">for</span> <span class="nam">comment</span> <span class="key">in</span> <span class="nam">file</span><span class="op">[</span><span class="str">'comments'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="nam">Comment</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span><span class="nam">recipe</span><span class="op">=</span><span class="nam">recipe</span><span class="op">,</span> <span class="nam">text</span><span class="op">=</span><span class="nam">comment</span><span class="op">[</span><span class="str">'text'</span><span class="op">]</span><span class="op">,</span> <span class="nam">created_by</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="nam">CookLog</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span><span class="nam">recipe</span><span class="op">=</span><span class="nam">recipe</span><span class="op">,</span> <span class="nam">rating</span><span class="op">=</span><span class="nam">comment</span><span class="op">[</span><span class="str">'rating'</span><span class="op">]</span><span class="op">,</span> <span class="nam">created_by</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"> <span class="key">if</span> <span class="nam">file</span><span class="op">[</span><span class="str">"photo"</span><span class="op">]</span> <span class="op">!=</span> <span class="str">''</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">image</span> <span class="op">=</span> <span class="str">f'recipes/openeats-import/{file["photo"]}'</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="nam">step</span> <span class="op">=</span> <span class="nam">Step</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span><span class="nam">instruction</span><span class="op">=</span><span class="nam">instructions</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span> <span class="nam">show_ingredients_table</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">.</span><span class="nam">userpreference</span><span class="op">.</span><span class="nam">show_step_ingredients</span><span class="op">,</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"> <span class="nam">ingredient_parser</span> <span class="op">=</span> <span class="nam">IngredientParser</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">,</span> <span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="key">for</span> <span class="nam">ingredient</span> <span class="key">in</span> <span class="nam">file</span><span class="op">[</span><span class="str">'ingredients'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"> <span class="nam">f</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">get_food</span><span class="op">(</span><span class="nam">ingredient</span><span class="op">[</span><span class="str">'food'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"> <span class="nam">u</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">get_unit</span><span class="op">(</span><span class="nam">ingredient</span><span class="op">[</span><span class="str">'unit'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"> <span class="nam">step</span><span class="op">.</span><span class="nam">ingredients</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">Ingredient</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="nam">food</span><span class="op">=</span><span class="nam">f</span><span class="op">,</span> <span class="nam">unit</span><span class="op">=</span><span class="nam">u</span><span class="op">,</span> <span class="nam">amount</span><span class="op">=</span><span class="nam">ingredient</span><span class="op">[</span><span class="str">'amount'</span><span class="op">]</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"> <span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">steps</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">step</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t"> <span class="key">return</span> <span class="nam">recipe</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"> <span class="key">def</span> <span class="nam">split_recipe_file</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">file</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> <span class="nam">recipe_json</span> <span class="op">=</span> <span class="nam">json</span><span class="op">.</span><span class="nam">loads</span><span class="op">(</span><span class="nam">file</span><span class="op">.</span><span class="nam">read</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"> <span class="nam">recipe_dict</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="nam">ingredient_group_dict</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"> <span class="nam">cuisine_group_dict</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"> <span class="nam">course_group_dict</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t"> <span class="nam">tag_group_dict</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"> <span class="key">for</span> <span class="nam">o</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t"> <span class="key">if</span> <span class="nam">o</span><span class="op">[</span><span class="str">'model'</span><span class="op">]</span> <span class="op">==</span> <span class="str">'recipe.recipe'</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"> <span class="nam">recipe_dict</span><span class="op">[</span><span class="nam">o</span><span class="op">[</span><span class="str">'pk'</span><span class="op">]</span><span class="op">]</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"> <span class="str">'name'</span><span class="op">:</span> <span class="nam">o</span><span class="op">[</span><span class="str">'fields'</span><span class="op">]</span><span class="op">[</span><span class="str">'title'</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t"> <span class="str">'info'</span><span class="op">:</span> <span class="nam">o</span><span class="op">[</span><span class="str">'fields'</span><span class="op">]</span><span class="op">[</span><span class="str">'info'</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"> <span class="str">'directions'</span><span class="op">:</span> <span class="nam">o</span><span class="op">[</span><span class="str">'fields'</span><span class="op">]</span><span class="op">[</span><span class="str">'directions'</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"> <span class="str">'source'</span><span class="op">:</span> <span class="nam">o</span><span class="op">[</span><span class="str">'fields'</span><span class="op">]</span><span class="op">[</span><span class="str">'source'</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t"> <span class="str">'prep_time'</span><span class="op">:</span> <span class="nam">o</span><span class="op">[</span><span class="str">'fields'</span><span class="op">]</span><span class="op">[</span><span class="str">'prep_time'</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"> <span class="str">'cook_time'</span><span class="op">:</span> <span class="nam">o</span><span class="op">[</span><span class="str">'fields'</span><span class="op">]</span><span class="op">[</span><span class="str">'cook_time'</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t"> <span class="str">'servings'</span><span class="op">:</span> <span class="nam">o</span><span class="op">[</span><span class="str">'fields'</span><span class="op">]</span><span class="op">[</span><span class="str">'servings'</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t"> <span class="str">'ingredients'</span><span class="op">:</span> <span class="op">[</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t"> <span class="str">'photo'</span><span class="op">:</span> <span class="nam">o</span><span class="op">[</span><span class="str">'fields'</span><span class="op">]</span><span class="op">[</span><span class="str">'photo'</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t"> <span class="str">'cuisine'</span><span class="op">:</span> <span class="nam">o</span><span class="op">[</span><span class="str">'fields'</span><span class="op">]</span><span class="op">[</span><span class="str">'cuisine'</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t"> <span class="str">'course'</span><span class="op">:</span> <span class="nam">o</span><span class="op">[</span><span class="str">'fields'</span><span class="op">]</span><span class="op">[</span><span class="str">'course'</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t"> <span class="str">'tags'</span><span class="op">:</span> <span class="nam">o</span><span class="op">[</span><span class="str">'fields'</span><span class="op">]</span><span class="op">[</span><span class="str">'tags'</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t"> <span class="str">'comments'</span><span class="op">:</span> <span class="op">[</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t"> <span class="key">if</span> <span class="nam">o</span><span class="op">[</span><span class="str">'model'</span><span class="op">]</span> <span class="op">==</span> <span class="str">'ingredient.ingredientgroup'</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t"> <span class="nam">ingredient_group_dict</span><span class="op">[</span><span class="nam">o</span><span class="op">[</span><span class="str">'pk'</span><span class="op">]</span><span class="op">]</span> <span class="op">=</span> <span class="nam">o</span><span class="op">[</span><span class="str">'fields'</span><span class="op">]</span><span class="op">[</span><span class="str">'recipe'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t"> <span class="key">if</span> <span class="nam">o</span><span class="op">[</span><span class="str">'model'</span><span class="op">]</span> <span class="op">==</span> <span class="str">'recipe_groups.cuisine'</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t"> <span class="nam">cuisine_group_dict</span><span class="op">[</span><span class="nam">o</span><span class="op">[</span><span class="str">'pk'</span><span class="op">]</span><span class="op">]</span> <span class="op">=</span> <span class="nam">o</span><span class="op">[</span><span class="str">'fields'</span><span class="op">]</span><span class="op">[</span><span class="str">'title'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t"> <span class="key">if</span> <span class="nam">o</span><span class="op">[</span><span class="str">'model'</span><span class="op">]</span> <span class="op">==</span> <span class="str">'recipe_groups.course'</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t"> <span class="nam">course_group_dict</span><span class="op">[</span><span class="nam">o</span><span class="op">[</span><span class="str">'pk'</span><span class="op">]</span><span class="op">]</span> <span class="op">=</span> <span class="nam">o</span><span class="op">[</span><span class="str">'fields'</span><span class="op">]</span><span class="op">[</span><span class="str">'title'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t"> <span class="key">if</span> <span class="nam">o</span><span class="op">[</span><span class="str">'model'</span><span class="op">]</span> <span class="op">==</span> <span class="str">'recipe_groups.tag'</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t"> <span class="nam">tag_group_dict</span><span class="op">[</span><span class="nam">o</span><span class="op">[</span><span class="str">'pk'</span><span class="op">]</span><span class="op">]</span> <span class="op">=</span> <span class="nam">o</span><span class="op">[</span><span class="str">'fields'</span><span class="op">]</span><span class="op">[</span><span class="str">'title'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t"> <span class="key">for</span> <span class="nam">o</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t"> <span class="key">if</span> <span class="nam">o</span><span class="op">[</span><span class="str">'model'</span><span class="op">]</span> <span class="op">==</span> <span class="str">'rating.rating'</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t"> <span class="nam">recipe_dict</span><span class="op">[</span><span class="nam">o</span><span class="op">[</span><span class="str">'fields'</span><span class="op">]</span><span class="op">[</span><span class="str">'recipe'</span><span class="op">]</span><span class="op">]</span><span class="op">[</span><span class="str">"comments"</span><span class="op">]</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="op">{</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t"> <span class="str">"text"</span><span class="op">:</span> <span class="nam">o</span><span class="op">[</span><span class="str">'fields'</span><span class="op">]</span><span class="op">[</span><span class="str">'comment'</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"> <span class="str">"rating"</span><span class="op">:</span> <span class="nam">o</span><span class="op">[</span><span class="str">'fields'</span><span class="op">]</span><span class="op">[</span><span class="str">'rating'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t"> <span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t"> <span class="key">if</span> <span class="nam">o</span><span class="op">[</span><span class="str">'model'</span><span class="op">]</span> <span class="op">==</span> <span class="str">'ingredient.ingredient'</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t"> <span class="nam">ingredient</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t"> <span class="str">'food'</span><span class="op">:</span> <span class="nam">o</span><span class="op">[</span><span class="str">'fields'</span><span class="op">]</span><span class="op">[</span><span class="str">'title'</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t"> <span class="str">'unit'</span><span class="op">:</span> <span class="nam">o</span><span class="op">[</span><span class="str">'fields'</span><span class="op">]</span><span class="op">[</span><span class="str">'measurement'</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t113" href="#t113">113</a></span><span class="t"> <span class="str">'amount'</span><span class="op">:</span> <span class="nam">round</span><span class="op">(</span><span class="nam">o</span><span class="op">[</span><span class="str">'fields'</span><span class="op">]</span><span class="op">[</span><span class="str">'numerator'</span><span class="op">]</span> <span class="op">/</span> <span class="nam">o</span><span class="op">[</span><span class="str">'fields'</span><span class="op">]</span><span class="op">[</span><span class="str">'denominator'</span><span class="op">]</span><span class="op">,</span> <span class="num">2</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t114" href="#t114">114</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t115" href="#t115">115</a></span><span class="t"> <span class="nam">recipe_dict</span><span class="op">[</span><span class="nam">ingredient_group_dict</span><span class="op">[</span><span class="nam">o</span><span class="op">[</span><span class="str">'fields'</span><span class="op">]</span><span class="op">[</span><span class="str">'ingredient_group'</span><span class="op">]</span><span class="op">]</span><span class="op">]</span><span class="op">[</span><span class="str">'ingredients'</span><span class="op">]</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">ingredient</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t116" href="#t116">116</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t117" href="#t117">117</a></span><span class="t"> <span class="key">for</span> <span class="nam">k</span><span class="op">,</span> <span class="nam">r</span> <span class="key">in</span> <span class="nam">recipe_dict</span><span class="op">.</span><span class="nam">items</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t118" href="#t118">118</a></span><span class="t"> <span class="key">if</span> <span class="nam">r</span><span class="op">[</span><span class="str">"cuisine"</span><span class="op">]</span> <span class="key">in</span> <span class="nam">cuisine_group_dict</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t119" href="#t119">119</a></span><span class="t"> <span class="nam">r</span><span class="op">[</span><span class="str">"cuisine"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">cuisine_group_dict</span><span class="op">[</span><span class="nam">r</span><span class="op">[</span><span class="str">"cuisine"</span><span class="op">]</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t120" href="#t120">120</a></span><span class="t"> <span class="key">if</span> <span class="nam">r</span><span class="op">[</span><span class="str">"course"</span><span class="op">]</span> <span class="key">in</span> <span class="nam">course_group_dict</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t121" href="#t121">121</a></span><span class="t"> <span class="nam">r</span><span class="op">[</span><span class="str">"course"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">course_group_dict</span><span class="op">[</span><span class="nam">r</span><span class="op">[</span><span class="str">"course"</span><span class="op">]</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t122" href="#t122">122</a></span><span class="t"> <span class="key">for</span> <span class="nam">index</span> <span class="key">in</span> <span class="nam">range</span><span class="op">(</span><span class="nam">len</span><span class="op">(</span><span class="nam">r</span><span class="op">[</span><span class="str">"tags"</span><span class="op">]</span><span class="op">)</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t123" href="#t123">123</a></span><span class="t"> <span class="key">if</span> <span class="nam">r</span><span class="op">[</span><span class="str">"tags"</span><span class="op">]</span><span class="op">[</span><span class="nam">index</span><span class="op">]</span> <span class="key">in</span> <span class="nam">tag_group_dict</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t124" href="#t124">124</a></span><span class="t"> <span class="nam">r</span><span class="op">[</span><span class="str">"tags"</span><span class="op">]</span><span class="op">[</span><span class="nam">index</span><span class="op">]</span> <span class="op">=</span> <span class="nam">tag_group_dict</span><span class="op">[</span><span class="nam">r</span><span class="op">[</span><span class="str">"tags"</span><span class="op">]</span><span class="op">[</span><span class="nam">index</span><span class="op">]</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t125" href="#t125">125</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t126" href="#t126">126</a></span><span class="t"> <span class="key">return</span> <span class="nam">list</span><span class="op">(</span><span class="nam">recipe_dict</span><span class="op">.</span><span class="nam">values</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t127" href="#t127">127</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t128" href="#t128">128</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_file_from_recipe</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">recipe</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t129" href="#t129">129</a></span><span class="t"> <span class="key">raise</span> <span class="nam">NotImplementedError</span><span class="op">(</span><span class="str">'Method not implemented in storage integration'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
</main>
<footer>
<div class="content">
<p>
<a id="prevFileLink" class="nav" href="d_37812bb4c19c71da_nextcloud_cookbook_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_37812bb4c19c71da_paprika_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
</div>
</footer>
</body>
</html>

View File

@@ -1,194 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Coverage for cookbook/integration/paprika.py: 21%</title>
<link rel="icon" sizes="32x32" href="favicon_32.png">
<link rel="stylesheet" href="style.css" type="text/css">
<script type="text/javascript" src="coverage_html.js" defer></script>
</head>
<body class="pyfile">
<header>
<div class="content">
<h1>
<span class="text">Coverage for </span><b>cookbook/integration/paprika.py</b>:
<span class="pc_cov">21%</span>
</h1>
<aside id="help_panel_wrapper">
<input id="help_panel_state" type="checkbox">
<label for="help_panel_state">
<img id="keyboard_icon" src="keybd_closed.png" alt="Show/hide keyboard shortcuts" />
</label>
<div id="help_panel">
<p class="legend">Shortcuts on this page</p>
<div class="keyhelp">
<p>
<kbd>r</kbd>
<kbd>m</kbd>
<kbd>x</kbd>
&nbsp; toggle line displays
</p>
<p>
<kbd>j</kbd>
<kbd>k</kbd>
&nbsp; next/prev highlighted chunk
</p>
<p>
<kbd>0</kbd> &nbsp; (zero) top of page
</p>
<p>
<kbd>1</kbd> &nbsp; (one) first highlighted chunk
</p>
<p>
<kbd>[</kbd>
<kbd>]</kbd>
&nbsp; prev/next file
</p>
<p>
<kbd>u</kbd> &nbsp; up to the index
</p>
<p>
<kbd>?</kbd> &nbsp; show/hide this help
</p>
</div>
</div>
</aside>
<h2>
<span class="text">70 statements &nbsp;</span>
<button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">15<span class="text"> run</span></button>
<button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">55<span class="text"> missing</span></button>
<button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
</h2>
<p class="text">
<a id="prevFileLink" class="nav" href="d_37812bb4c19c71da_openeats_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_37812bb4c19c71da_pdfexport_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
<aside class="hidden">
<button type="button" class="button_next_chunk" data-shortcut="j"/>
<button type="button" class="button_prev_chunk" data-shortcut="k"/>
<button type="button" class="button_top_of_page" data-shortcut="0"/>
<button type="button" class="button_first_chunk" data-shortcut="1"/>
<button type="button" class="button_prev_file" data-shortcut="["/>
<button type="button" class="button_next_file" data-shortcut="]"/>
<button type="button" class="button_to_index" data-shortcut="u"/>
<button type="button" class="button_show_hide_help" data-shortcut="?"/>
</aside>
</div>
</header>
<main id="source">
<p class="run"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">base64</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">import</span> <span class="nam">gzip</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">import</span> <span class="nam">json</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">import</span> <span class="nam">re</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">from</span> <span class="nam">gettext</span> <span class="key">import</span> <span class="nam">gettext</span> <span class="key">as</span> <span class="nam">_</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"><span class="key">from</span> <span class="nam">io</span> <span class="key">import</span> <span class="nam">BytesIO</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="key">import</span> <span class="nam">requests</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="key">import</span> <span class="nam">validators</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">helper</span><span class="op">.</span><span class="nam">ingredient_parser</span> <span class="key">import</span> <span class="nam">IngredientParser</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">helper</span><span class="op">.</span><span class="nam">recipe_url_import</span> <span class="key">import</span> <span class="nam">parse_servings</span><span class="op">,</span> <span class="nam">parse_servings_text</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">integration</span><span class="op">.</span><span class="nam">integration</span> <span class="key">import</span> <span class="nam">Integration</span>&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"><span class="key">from</span> <span class="nam">cookbook</span><span class="op">.</span><span class="nam">models</span> <span class="key">import</span> <span class="nam">Ingredient</span><span class="op">,</span> <span class="nam">Keyword</span><span class="op">,</span> <span class="nam">Recipe</span><span class="op">,</span> <span class="nam">Step</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"><span class="key">class</span> <span class="nam">Paprika</span><span class="op">(</span><span class="nam">Integration</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_file_from_recipe</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">recipe</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"> <span class="key">raise</span> <span class="nam">NotImplementedError</span><span class="op">(</span><span class="str">'Method not implemented in storage integration'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="run"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_recipe_from_file</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">file</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"> <span class="key">with</span> <span class="nam">gzip</span><span class="op">.</span><span class="nam">open</span><span class="op">(</span><span class="nam">file</span><span class="op">,</span> <span class="str">'r'</span><span class="op">)</span> <span class="key">as</span> <span class="nam">recipe_zip</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"> <span class="nam">recipe_json</span> <span class="op">=</span> <span class="nam">json</span><span class="op">.</span><span class="nam">loads</span><span class="op">(</span><span class="nam">recipe_zip</span><span class="op">.</span><span class="nam">read</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">decode</span><span class="op">(</span><span class="str">"utf-8"</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"> <span class="nam">recipe</span> <span class="op">=</span> <span class="nam">Recipe</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"> <span class="nam">name</span><span class="op">=</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> <span class="nam">created_by</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">,</span> <span class="nam">internal</span><span class="op">=</span><span class="key">True</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"> <span class="key">if</span> <span class="str">'description'</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">description</span> <span class="op">=</span> <span class="str">''</span> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'description'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span> <span class="op">></span> <span class="num">500</span> <span class="key">else</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'description'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"> <span class="key">if</span> <span class="str">'servings'</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">servings</span> <span class="op">=</span> <span class="nam">parse_servings</span><span class="op">(</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'servings'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">servings_text</span> <span class="op">=</span> <span class="nam">parse_servings_text</span><span class="op">(</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'servings'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'cook_time'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">waiting_time</span> <span class="op">=</span> <span class="nam">re</span><span class="op">.</span><span class="nam">findall</span><span class="op">(</span><span class="str">r'\d+'</span><span class="op">,</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'cook_time'</span><span class="op">]</span><span class="op">)</span><span class="op">[</span><span class="num">0</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'prep_time'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">working_time</span> <span class="op">=</span> <span class="nam">re</span><span class="op">.</span><span class="nam">findall</span><span class="op">(</span><span class="str">r'\d+'</span><span class="op">,</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'prep_time'</span><span class="op">]</span><span class="op">)</span><span class="op">[</span><span class="num">0</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">save</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"> <span class="nam">instructions</span> <span class="op">=</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'directions'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="key">if</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'notes'</span><span class="op">]</span> <span class="key">and</span> <span class="nam">len</span><span class="op">(</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'notes'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="nam">instructions</span> <span class="op">+=</span> <span class="str">'\n\n### '</span> <span class="op">+</span> <span class="nam">_</span><span class="op">(</span><span class="str">'Notes'</span><span class="op">)</span> <span class="op">+</span> <span class="str">' \n'</span> <span class="op">+</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'notes'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"> <span class="key">if</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'nutritional_info'</span><span class="op">]</span> <span class="key">and</span> <span class="nam">len</span><span class="op">(</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'nutritional_info'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"> <span class="nam">instructions</span> <span class="op">+=</span> <span class="str">'\n\n### '</span> <span class="op">+</span> <span class="nam">_</span><span class="op">(</span><span class="str">'Nutritional Information'</span><span class="op">)</span> <span class="op">+</span> <span class="str">' \n'</span> <span class="op">+</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'nutritional_info'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'source'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span> <span class="key">or</span> <span class="nam">len</span><span class="op">(</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'source_url'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="nam">instructions</span> <span class="op">+=</span> <span class="str">'\n\n### '</span> <span class="op">+</span> <span class="nam">_</span><span class="op">(</span><span class="str">'Source'</span><span class="op">)</span> <span class="op">+</span> <span class="str">' \n'</span> <span class="op">+</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'source'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span> <span class="op">+</span> <span class="str">' \n'</span> <span class="op">+</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'source_url'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"> <span class="key">except</span> <span class="nam">AttributeError</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"> <span class="nam">step</span> <span class="op">=</span> <span class="nam">Step</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"> <span class="nam">instruction</span><span class="op">=</span><span class="nam">instructions</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span> <span class="nam">show_ingredients_table</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">user</span><span class="op">.</span><span class="nam">userpreference</span><span class="op">.</span><span class="nam">show_step_ingredients</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"> <span class="key">if</span> <span class="str">'description'</span> <span class="key">in</span> <span class="nam">recipe_json</span> <span class="key">and</span> <span class="nam">len</span><span class="op">(</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'description'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span> <span class="op">></span> <span class="num">500</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"> <span class="nam">step</span><span class="op">.</span><span class="nam">instruction</span> <span class="op">=</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'description'</span><span class="op">]</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span> <span class="op">+</span> <span class="str">'\n\n'</span> <span class="op">+</span> <span class="nam">step</span><span class="op">.</span><span class="nam">instruction</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t"> <span class="key">if</span> <span class="str">'categories'</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"> <span class="key">for</span> <span class="nam">c</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'categories'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"> <span class="nam">keyword</span><span class="op">,</span> <span class="nam">created</span> <span class="op">=</span> <span class="nam">Keyword</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">get_or_create</span><span class="op">(</span><span class="nam">name</span><span class="op">=</span><span class="nam">c</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">keywords</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">keyword</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="nam">ingredient_parser</span> <span class="op">=</span> <span class="nam">IngredientParser</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">,</span> <span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"> <span class="key">for</span> <span class="nam">ingredient</span> <span class="key">in</span> <span class="nam">recipe_json</span><span class="op">[</span><span class="str">'ingredients'</span><span class="op">]</span><span class="op">.</span><span class="nam">split</span><span class="op">(</span><span class="str">'\n'</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">ingredient</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t"> <span class="nam">amount</span><span class="op">,</span> <span class="nam">unit</span><span class="op">,</span> <span class="nam">food</span><span class="op">,</span> <span class="nam">note</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">parse</span><span class="op">(</span><span class="nam">ingredient</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"> <span class="nam">f</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">get_food</span><span class="op">(</span><span class="nam">food</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t"> <span class="nam">u</span> <span class="op">=</span> <span class="nam">ingredient_parser</span><span class="op">.</span><span class="nam">get_unit</span><span class="op">(</span><span class="nam">unit</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"> <span class="nam">step</span><span class="op">.</span><span class="nam">ingredients</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">Ingredient</span><span class="op">.</span><span class="nam">objects</span><span class="op">.</span><span class="nam">create</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"> <span class="nam">food</span><span class="op">=</span><span class="nam">f</span><span class="op">,</span> <span class="nam">unit</span><span class="op">=</span><span class="nam">u</span><span class="op">,</span> <span class="nam">amount</span><span class="op">=</span><span class="nam">amount</span><span class="op">,</span> <span class="nam">note</span><span class="op">=</span><span class="nam">note</span><span class="op">,</span> <span class="nam">original_text</span><span class="op">=</span><span class="nam">ingredient</span><span class="op">,</span> <span class="nam">space</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">space</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t"> <span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"> <span class="key">except</span> <span class="nam">AttributeError</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"> <span class="nam">recipe</span><span class="op">.</span><span class="nam">steps</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">step</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t"> <span class="key">if</span> <span class="nam">recipe_json</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"image_url"</span><span class="op">,</span> <span class="key">None</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t"> <span class="nam">url</span> <span class="op">=</span> <span class="nam">recipe_json</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"image_url"</span><span class="op">,</span> <span class="key">None</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t"> <span class="key">if</span> <span class="nam">validators</span><span class="op">.</span><span class="nam">url</span><span class="op">(</span><span class="nam">url</span><span class="op">,</span> <span class="nam">public</span><span class="op">=</span><span class="key">True</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t"> <span class="nam">response</span> <span class="op">=</span> <span class="nam">requests</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">url</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">import_recipe_image</span><span class="op">(</span><span class="nam">recipe</span><span class="op">,</span> <span class="nam">BytesIO</span><span class="op">(</span><span class="nam">response</span><span class="op">.</span><span class="nam">content</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t"> <span class="key">if</span> <span class="nam">recipe_json</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"photo_data"</span><span class="op">,</span> <span class="key">None</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">import_recipe_image</span><span class="op">(</span><span class="nam">recipe</span><span class="op">,</span> <span class="nam">BytesIO</span><span class="op">(</span><span class="nam">base64</span><span class="op">.</span><span class="nam">b64decode</span><span class="op">(</span><span class="nam">recipe_json</span><span class="op">[</span><span class="str">'photo_data'</span><span class="op">]</span><span class="op">)</span><span class="op">)</span><span class="op">,</span> <span class="nam">filetype</span><span class="op">=</span><span class="str">'.jpeg'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
<p class="pln"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
<p class="mis show_mis"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t"> <span class="key">return</span> <span class="nam">recipe</span>&nbsp;</span><span class="r"></span></p>
</main>
<footer>
<div class="content">
<p>
<a id="prevFileLink" class="nav" href="d_37812bb4c19c71da_openeats_py.html">&#xab; prev</a> &nbsp; &nbsp;
<a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
<a id="nextFileLink" class="nav" href="d_37812bb4c19c71da_pdfexport_py.html">&#xbb; next</a>
&nbsp; &nbsp; &nbsp;
<a class="nav" href="https://coverage.readthedocs.io/en/7.4.0">coverage.py v7.4.0</a>,
created at 2023-12-28 15:03 +0100
</p>
</div>
</footer>
</body>
</html>

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