Compare commits

..

644 Commits

Author SHA1 Message Date
Hayden
3f49e80b9a fix: add permissions remove docs deploy (#2605) 2023-10-08 08:21:55 -08:00
Michael Genson
b153ddf858 feat: more shopping list enhancements (#2587)
* fix new position calculataion

* ensure consistent list item ordering

* fix recipe ref overflow on small screens

* added recipe ref elevation

* tweaked line height (for long notes)

* removed unused user dependency

* remove old shopping list items when there's >100

* 🤷

* cleaned up function generator

* fixed test

* fix potential type error

* made max position calc more efficient
2023-10-07 13:06:00 -08:00
Hayden
f35bc77a7d New Crowdin updates (#2600)
* New translations en-us.json (Romanian)

* New translations en-us.json (French)

* New translations en-us.json (Spanish)

* New translations en-us.json (Afrikaans)

* New translations en-us.json (Arabic)

* New translations en-us.json (Bulgarian)

* New translations en-us.json (Catalan)

* New translations en-us.json (Czech)

* New translations en-us.json (Danish)

* New translations en-us.json (German)

* New translations en-us.json (Greek)

* New translations en-us.json (Finnish)

* New translations en-us.json (Hebrew)

* New translations en-us.json (Hungarian)

* New translations en-us.json (Italian)

* New translations en-us.json (Japanese)

* New translations en-us.json (Korean)

* New translations en-us.json (Lithuanian)

* New translations en-us.json (Dutch)

* New translations en-us.json (Norwegian)

* New translations en-us.json (Polish)

* New translations en-us.json (Portuguese)

* New translations en-us.json (Russian)

* New translations en-us.json (Slovak)

* New translations en-us.json (Slovenian)

* New translations en-us.json (Serbian (Cyrillic))

* New translations en-us.json (Swedish)

* New translations en-us.json (Turkish)

* New translations en-us.json (Ukrainian)

* New translations en-us.json (Chinese Simplified)

* New translations en-us.json (Chinese Traditional)

* New translations en-us.json (Vietnamese)

* New translations en-us.json (Galician)

* New translations en-us.json (Portuguese, Brazilian)

* New translations en-us.json (Croatian)

* New translations en-us.json (Latvian)

* New translations en-us.json (English, United Kingdom)

* New translations en-us.json (French, Canada)

* New translations en-us.json (Arabic)

* New translations en-us.json (Danish)

* New translations en-us.json (Finnish)

* New translations en-us.json (Lithuanian)

* New translations en-us.json (Portuguese)

* New translations en-us.json (Russian)

* New translations en-us.json (Chinese Simplified)

* New translations en-us.json (French, Canada)

* New translations en-us.json (Finnish)

* New translations en-us.json (Hungarian)

* New translations en-us.json (Lithuanian)

* New translations en-us.json (Portuguese)

* New translations en-us.json (Russian)

* New translations en-us.json (Chinese Simplified)

* New translations en-us.json (Portuguese, Brazilian)

* New translations en-us.json (Romanian)

* New translations en-us.json (Arabic)

* New translations en-us.json (Danish)

* New translations en-us.json (Finnish)

* New translations en-us.json (Hungarian)

* New translations en-us.json (Lithuanian)

* New translations en-us.json (Portuguese)

* New translations en-us.json (Russian)

* New translations en-us.json (Chinese Simplified)

* New translations en-us.json (Romanian)

* New translations en-us.json (Hungarian)

* New translations en-us.json (Lithuanian)

* New translations en-us.json (Russian)

* New translations en-us.json (Chinese Simplified)

* New translations en-us.json (Portuguese, Brazilian)

* New translations en-us.json (German)
2023-10-07 13:05:39 -08:00
Hayden
db021023fb chore:bump dependencies and fix errors (#2601)
* bump dependencies and fix errors

* fix depreciated arg

* properly handle validation errors
2023-10-07 13:02:15 -08:00
Johan Lindell
954a2f5113 fix: "remember me" with long TOKEN_TIME (#2602)
* Fixed "remember me" with long TOKEN_TIME

* Reverted changes in create_access_token
2023-10-07 20:58:45 +00:00
Arsène Reymond
45022e1f1b fixes: PWA & interface on small screens (#2536)
* fix pwa icons

* fix spacing and layouts for small screens

* translate missing strings

* Revert "translate missing strings"

This reverts commit 150a961a08.

* fixes

---------

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2023-10-07 11:36:47 -08:00
Michael Genson
bd79c1db2f chore: Get Rid of Warnings (#2599)
* ignore unsafe html warnings

* remove unused import

* re-order attrs

* removed unused vars/imports

* removed unused import

* refactored v-html

* removed more unused things
2023-10-07 11:23:47 -08:00
Michael Genson
b86c4e5865 feat: Removed Cross-Version Disclaimer from Backup Page (#2597)
* removed cross-version disclaimer from backup text

* grammar tweak
2023-10-07 11:23:26 -08:00
Michael Genson
a98e863bca fix: database unique constraints (#2594)
* fixed missing migration name

* added unique constraints to all m2m tables

* fixed bug trying to create duplicate tags

* added more unique constraints

* fixed duplicate seeder data

* updated tests

* fixed seed rollback error
2023-10-07 11:23:13 -08:00
Michael Genson
247a4de283 docs: fix old mealplanner route ref (#2590) 2023-10-07 11:21:46 -08:00
Michael Genson
26ef351ae7 fix: Recipe Zip Export Can't Be Imported (#2585)
* clean recipe data when importing via zip

* added tests

* simplified recursive logic
2023-10-07 11:18:55 -08:00
Johan Lindell
84b477edf6 fix: removed unused node in docker image (#2572) 2023-10-07 11:17:26 -08:00
Simon Becker
a331042e6d build: optimize apt-get cleanup during image build (#2558) 2023-09-29 16:04:58 -08:00
Johan Lindell
40ab328bb9 fix: Make sure recipe state is updated correctly (#2566) 2023-09-29 15:59:27 -08:00
Michael Genson
b32e2f1bf7 fix: Recipe Card Section Infinite Loop (#2584)
* refactored recipe card section fetch

* minor optimization

* lint
2023-09-29 15:59:07 -08:00
Michael Genson
1074cad5dc feat: disable admin option when using LDAP auth (#2583)
* fix typo

* add override readonly/disable support for autoform

* made admin permission conditionally disabled
2023-09-29 15:58:34 -08:00
Matthew Hill
4bd7bda60d fix: Fix bugs with account locking (#2580)
* fix(security): reset login attempts after successful login

Enforce a maximum number of consecutive failed logins. Successfully logging in should reset the
count.

#2569

* fix(security): fix when user is unlocked

The user should be unlocked when locked_at is set, but the lock has expired.

#2569
2023-09-29 15:58:00 -08:00
Michael Genson
484c60c7ea docs: spelling, content updates for clarity (#2581) 2023-09-28 15:17:10 -08:00
Michael Genson
ef805c4b57 fix: replace default enter key behavior (#2582) 2023-09-28 15:16:22 -08:00
Hayden
222d583d6f docs: add note on migration(#2576) 2023-09-26 07:14:48 -08:00
Jacob Corn
b7a6bff5aa docs: add tag to postgres image (#2575) 2023-09-26 06:35:23 -08:00
Flightkick
bb9afd86c1 fix: Use reserved example.com as bogus instead of email.com domain. (#2551)
`email.com` is not a reserved domain, incorrect configuration could result in unintentional effects.
`example.com` is reserved by IANA for bogus purposes, see RFC 6761.
2023-09-23 07:56:34 -08:00
Michael Genson
a22d500603 fix: CSS rendering bug, again (#2555)
* idk man

* that wasn't supposed to be there
2023-09-19 09:07:08 -08:00
Michael Genson
3e5596f898 fix: Home Doesn't Load For Non-Admin Users (#2556)
* added non-admin route for fetching current group

* simplified frontend group slug fetching

* exposed public link even if user can't invite

* 🧹
2023-09-19 09:06:39 -08:00
Max Bachmann
15c6df88ab perf: use score_cutoff for fuzzy string matching (#2553) 2023-09-16 15:24:45 -05:00
Grygon
9a04b11ee5 fix: #2534 - Add clearable ratings (#2541)
* Add clearable to RecipeRating, Fix #2534

* Make rating nullable

---------

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2023-09-15 19:10:44 +00:00
Michael Genson
2dfbe9f08d feat: Improved Ingredient Matching (#2535)
* added normalization to foods and units

* changed search to reference new normalized fields

* fix tests

* added parsed food matching to backend

* prevent pagination from ordering when searching

* added extra fuzzy matching to sqlite ing matching

* added tests

* only apply search ordering when order_by is null

* enabled post-search fuzzy matching for postgres

* fixed postgres fuzzy search test

* idk why this is failing

* 🤦

* simplified frontend ing matching
and restored automatic unit creation

* tightened food fuzzy threshold

* change to rapidfuzz

* sped up fuzzy matching with process

* fixed units not matching by abbreviation

* fast return for exact matches

* replace db searching with pure fuzz

* added fuzzy normalization

* tightened unit fuzzy matching thresh

* cleaned up comments/var names

* ran matching logic through the dryer

* oops

* simplified order by application logic
2023-09-15 17:19:34 +00:00
Hayden
084ad4228b remove permissions from nested workflow 2023-09-14 09:42:46 -05:00
Hayden
86b0b6761d add permissions to build-release 2023-09-14 09:42:32 -05:00
Hayden
2ad6af2cce feat: consolidate deployment targets and publish to ghcr.io (#2539)
* WIP: proof of concept

* basic meta tag injection

* add support for scraping public/private links

* make tests go brrrrr

* cleanup initialization

* rewrite build config

* remove recipe meta on frontend

* make type checker happy

* remove other deployment methods

* fix issue with JSON response on un-authenticated request

* docs updates

* update tivy scanner

* fix linter stuff

* change registry tag

* build fixes

* fix same mistake I always make
2023-09-14 06:40:13 -08:00
Michael Genson
aec4cb4f31 feat: Advanced Query Filter Record Ordering (#2530)
* added support for multiple order_by strs

* refactored qf to expose nested attr logic

* added nested attr support to order_by

* added tests

* changed unique user to be function-level

* updated docs

* added support for null handling

* updated docs

* undid fixture changes

* fix leaky tests

* added advanced shopping list item test

---------

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2023-09-14 14:09:05 +00:00
Michael Genson
2c5e5a8421 feat: Public Recipe Browser (#2525)
* fixed incorrect var ref

* added public recipe pagination route

* refactored frontend public/explore API

* fixed broken public cards

* hid context menu from cards when public

* fixed public app header

* fixed random recipe

* added public food, category, tag, and tool routes

* not sure why I thought that would work

* added public organizer/foods stores

* disabled clicking on tags/categories

* added public link to profile page

* linting

* force a 404 if the group slug is missing or invalid

* oops

* refactored to fit sidebar into explore

* fixed invalid logic for app header

* removed most sidebar options from public

* added backend routes for public cookbooks

* added explore cookbook pages/apis

* codegen

* added backend tests

* lint

* fixes v-for keys

* I do not understand but sure why not

---------

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2023-09-14 06:01:24 -08:00
Hayden
e28b830cd4 hotfix: format 2023-09-06 23:20:59 -05:00
Matthew Macdonald-Wallace
71f1607b58 chore: switch to workflow actions and upload to GHCR (#2355)
* Switch to workflow actions and upload to GHCR

* cleanup yml file

---------

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2023-09-06 19:20:42 -08:00
Michael Genson
0a00a6ea0d fix: removed HTML tags when copying recipe ingredients (#2533) 2023-08-31 09:08:44 -08:00
Hugo van Rijswijk
408ca88cb2 fix: ingredient item should be single-line (#2521)
This is an issue on non-chromium browsers. I guess Chromium has some sort of support for nested CSS, whereas other browsers don't.
2023-08-25 08:32:26 -08:00
Michael Genson
30717e50d3 made parsed ingredient reactive (#2520) 2023-08-25 08:32:06 -08:00
Michael Genson
693608d59f feat: cook timer (#2508)
* updated base button group

* added kitchen timer

* added missing icon

* usability tweaks

* for for menu rendering over app bar

* clean up types

* fix for mp3 loading, maybe?

* spooky linter fixes

* for real this time

---------

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2023-08-23 09:31:23 -08:00
Michael Genson
5c5432304f fix: recipe timeline UI glitches (#2519)
* fix invalid undefined prop

* fixed weird rendering

* made items pop more against background

* fixed invalid v-if

* fixed indentation
2023-08-23 09:30:59 -08:00
Michael Genson
5213a61d9b fix: logic for disableAmount in shopping list items (#2518) 2023-08-22 14:03:24 -08:00
Michael Genson
ae502c5652 added missing recipe list import (#2516) 2023-08-21 17:30:31 -08:00
Michael Genson
c9cc7a93c8 fix: Tools Shouldn't Be Unique Across Groups (#2505)
* fixed type/abc errors in tests

* fixed false positive multitentant tests

* fix tools not allowing unique slugs across groups

* fixed alembic refs

---------

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2023-08-21 20:39:23 +00:00
Arsène Reymond
99e7717fec UI/UX improvements (#2423)
* disable autofocus and hide keyboard on enter

* improve a11y

* fix non-translated string

* improve recipeTimeline UI

* format

* fixes
2023-08-21 18:41:18 +00:00
Michael Genson
1e693fdca6 fix: refresh tag store when new tags are imported (#2504) 2023-08-21 09:18:55 -08:00
Michael Genson
d6e4829e6f feat: Display Shopping List Item Recipe Refs (#2501)
* added recipe ref display to shopping list items

* added backend support for recipe notes

* added recipe note to item recipe ref display

* fixed note merge bug with 3+ notes

* tweak display

* lint

* updated alembic refs

---------

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2023-08-21 09:18:37 -08:00
Hugo van Rijswijk
50a92c165c feat: improve readability of ingredients list (#2502)
* feat: improve readability of notes in ingredients list

Makes the notes in the ingredients list more readable by making them slightly opaque. This creates a better visual separation between the notes and the rest of the ingredient.

* Use server display if available

* Move note to newline and make quantity more distinct

* Use safeMarkdown for shopping list

* Use component

* Wrap unit in accent color

* Update RecipeIngredientListItem to set food in bold
2023-08-21 15:32:09 +00:00
Michael Genson
2151451634 feat: Timeline Image Uploader Improvements (#2494)
* improved UI responsiveness and added image preview

* added global image cropper component

* added image cropper to last made dialog

* style tweaks

* added more specific text for creating event

* mopped up some slop

* renamed height and width vars

---------

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2023-08-21 15:00:37 +00:00
Michael Genson
e24e28ae03 feat: Improved recipeYield Parsing For Fractions and Decimals (#2507)
* improved recipeYield parsing for fracs/decimals

* added fix for edgecase with weird fractions

* made typescript happy

* lint

* extracted yield calculation into composable

* fixed some gross edgecases

* added tests

* made bare return clearer

---------

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2023-08-21 06:54:02 -08:00
Hayden
c60c63852b chore: bump deps (#2513)
* bump dependencies

* run code-generator

* add direct dependency to text-unidecode

* fix dev dependencies group
2023-08-20 16:09:13 -08:00
Michael Genson
095edef95e feat: Improve Public URL Readability (#2482)
* added support for group slugs

* modified frontend to use links with group slug

* fixed test refs

* unused import

---------

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2023-08-20 10:38:46 -08:00
Michael Genson
99372aa2b6 feat: Generalize Search to Other Models (#2472)
* generalized search logic to SearchFilter

* added default search behavior for all models

* fix for schema overrides

* added search support to several models

* fix for label search

* tests and fixes

* add config for normalizing characters

* dramatically simplified search tests

* bark bark

* fix normalization bug

* tweaked tests

* maybe this time?

---------

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2023-08-20 10:30:21 -08:00
renovate[bot]
76ae0bafc7 fix(deps): update dependency pydantic to v1.10.12 (#2467)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2023-08-20 10:28:05 -08:00
renovate[bot]
1aa7344688 fix(deps): update dependency lxml to v4.9.3 (#2465)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2023-08-20 10:27:53 -08:00
renovate[bot]
da17f2a410 chore(deps): update dependency pytest-asyncio to v0.21.1 (#2462)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2023-08-20 10:27:16 -08:00
renovate[bot]
4169c3e743 chore(deps): update dependency pylint to v2.17.5 (#2421)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2023-08-20 10:27:04 -08:00
renovate[bot]
3ccae9e366 chore(deps): update actions/setup-node action to v3.7.0 (#2468)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2023-08-20 10:18:12 -08:00
renovate[bot]
26ab73a827 chore(deps): update dependency mkdocs-material to v9.1.21 (#2461)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-20 10:17:00 -08:00
Michael Genson
d8a6f900b4 docs: add windows instructions for the dev container (#2493) 2023-08-15 18:44:17 -08:00
Weetbix
f6e7eba6fc docs: fix typo in FAQ (#2495) 2023-08-15 18:43:43 -08:00
Michael Genson
e55258c5be fx: Nextcloud migration fails to parse null times (#2485)
* support null or custom strings

* made time parsing more robust using isodate

* bark bark
2023-08-09 18:52:49 -08:00
Michael Genson
dd947c316a fix: Tandoor doesn't import all images (#2487)
* use glob to find files for import

* bark bark

* add catch for invalid image files
2023-08-09 18:52:32 -08:00
Michael Genson
04c7e068d8 typo: have have (#2490) 2023-08-09 18:52:00 -08:00
Michael Genson
bdf6b1054e Chore: Rename Omni Build Action (#2483)
* fix omni action name

* added omni to Discord notification text
2023-08-06 19:58:38 -08:00
Michael Genson
dfe4942451 feat: Recipe Timeline Images (#2444)
* refactored recipe image paths/service

* added routes for updating/fetching timeline images

* make generate

* added event image upload and rendering

* switched update to patch to preserve timestamp

* added tests

* tweaked order of requests

* always reload events when opening the timeline

* re-arranged elements to make them look nicer

* delete files when timeline event is deleted
2023-08-06 09:49:30 -08:00
Hayden
06962cf865 New Crowdin updates (#2476)
* New translations en-US.json (Croatian)

* New translations en-US.json (Swedish)
2023-08-06 09:47:19 -08:00
Hayden
3fb60339a6 remove duplicate issues 2023-08-06 12:39:45 -05:00
Hayden
89a6b32a3f fix syntax errors 2023-08-06 12:39:02 -05:00
Hayden
6901747a26 chore: rework issue templates (#2481)
* rewrok issue templates

* fix feature request links

* feature-template
2023-08-06 09:35:38 -08:00
Michael Genson
e71155a55d fix: removed variable rendering on organizers page (#2477) 2023-07-31 08:22:54 -08:00
Hayden
b1eb156145 New Crowdin updates (#2463)
* New translations en-US.json (Spanish)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Korean)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Romanian)

* New translations en-US.json (French)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Catalan)

* New translations en-US.json (Czech)

* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (Greek)

* New translations en-US.json (Finnish)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Italian)

* New translations en-US.json (Japanese)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Russian)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Swedish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Galician)

* New translations en-US.json (Croatian)

* New translations en-US.json (Latvian)

* New translations en-US.json (English, United Kingdom)

* New translations en-US.json (French, Canada)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Dutch)

* New translations en-US.json (German)

* New translations en-US.json (Turkish)

* New translations en-US.json (French)

* New translations en-US.json (Swedish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Catalan)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Swedish)
2023-07-29 13:40:09 -08:00
Michael Genson
e434029bac feat: prevent all changes to the default user in demo (#2470) 2023-07-29 13:39:49 -08:00
TomArm
a75116bc62 docs: updated home assistant docs (#2459)
Co-authored-by: tomarm <a@a.com>
2023-07-23 09:54:49 -08:00
Michael Genson
c86406e027 fix: Omni Container /docs Proxy and PyYaml dependency (#2457)
* upgrade pyyaml to ^6.0.1

* add proxy routes for docs
2023-07-23 09:53:45 -08:00
Michael Genson
0f896107f9 feat: Migrate from Tandoor (#2438)
* added tandoor migration to backend

* added tandoor migration to frontend

* updated tests

* ignore 0 amounts

* refactored ingredient display calculation

* fix parsing tandoor recipes with optional data

* generated frontend types

* fixed inconsistent default handling and from_orm

* removed unused imports
2023-07-23 09:52:09 -08:00
Michael Genson
c25b58e404 fix: Missing Paprika and Nextcloud Migration Data (#2434)
* fixed paprika url key

* fixed paprika total and prep time aliases

* added nextcloud time parsing

* mapped paprika categories to tags

* cleaned up netcloud parsetime
2023-07-23 09:50:47 -08:00
Carter
c783d86a2a feat: LDAP attribute validation (#2400)
* validate user attributes on user creation

add logs for invalid or missing attributes

* only update admin flag when admin status changes

* move ldap functions into separate file

* fix linter issues

* actually use the search_user function

* fix types
2023-07-23 09:49:24 -08:00
Hayden
e64265615e New Crowdin updates (#2410)
* New translations en-US.json (Greek)

* New translations en-US.json (Greek)

* New translations en-US.json (Greek)

* New translations en-US.json (Slovak)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New translations en-US.json (Italian)

* New translations en-US.json (Italian)

* New translations en-US.json (Japanese)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Romanian)

* New translations en-US.json (Romanian)

* New translations en-US.json (Galician)

* New translations en-US.json (Galician)

* New translations en-US.json (Galician)

* New translations en-US.json (Galician)

* New translations en-US.json (Galician)

* New translations en-US.json (Croatian)

* New translations en-US.json (Croatian)

* New translations en-US.json (Croatian)

* New translations en-US.json (Croatian)

* New translations en-US.json (Croatian)

* New translations en-US.json (Latvian)

* New translations en-US.json (Latvian)

* New translations en-US.json (Latvian)

* New translations en-US.json (Latvian)

* New translations en-US.json (Latvian)

* New translations en-US.json (Japanese)

* New translations en-US.json (Japanese)

* New translations en-US.json (Japanese)

* New translations en-US.json (Japanese)

* New translations en-US.json (Croatian)

* New translations en-US.json (Croatian)

* New translations en-US.json (Croatian)

* New translations en-US.json (Croatian)

* New translations en-US.json (Croatian)

* New translations en-US.json (Croatian)

* New translations en-US.json (Croatian)

* New translations en-US.json (Croatian)

* New translations en-US.json (Croatian)

* New translations en-US.json (Croatian)

* New translations en-US.json (Croatian)

* New translations en-US.json (Croatian)

* New translations en-US.json (Croatian)

* New translations en-US.json (Croatian)

* New translations en-US.json (Croatian)

* New translations en-US.json (Croatian)

* New translations en-US.json (Croatian)

* New translations en-US.json (Croatian)

* New translations en-US.json (Croatian)

* New translations en-US.json (Croatian)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Spanish)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (French, Canada)

* New translations en-US.json (French, Canada)

* New translations en-US.json (Italian)

* New translations en-US.json (Italian)

* New translations en-US.json (Italian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Spanish)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Korean)

* New translations en-US.json (Korean)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Polish)

* New translations en-US.json (Polish)

* New translations en-US.json (Polish)
2023-07-23 09:48:35 -08:00
renovate[bot]
9f1f87bcd0 chore(deps): update dependency rich to v13.4.2 (#2382)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-07-23 09:47:47 -08:00
renovate[bot]
a7d8fc8d25 chore(deps): update dependency coverage to v7.2.7 (#2341)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-07-23 09:47:26 -08:00
renovate[bot]
8584ca666f fix(deps): update dependency pillow to v9.5.0 (#2339)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-07-23 09:47:12 -08:00
renovate[bot]
50a06f3553 fix(deps): update dependency core-js to v3.31.1 (#2338)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-07-23 09:46:54 -08:00
renovate[bot]
9f9bdec886 fix(deps): update dependency beautifulsoup4 to v4.12.2 (#2337)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-07-23 09:46:38 -08:00
renovate[bot]
e3652a0876 fix(deps): update dependency sqlalchemy to v2.0.19 (#2336)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-07-23 09:46:23 -08:00
Carter
4af9eec89d fix omni docker image (#2432) 2023-06-27 22:00:19 -08:00
Carter
d1b06e7339 fix: Change libldap-2.4-2 to libldap-common in docker (#2429) 2023-06-27 17:25:41 -08:00
Jacob Corn
9557b3f0b6 fix: log accurate IP (#2416)
* update dev docker poetry install

* Forward/Report IP through front and backend.

* Add fail2ban docs

* fix option name and iproute2 in omni entry

* Fix entry scripts -> gunicorn setting respected

* gunicorn off

* xfwd in nuxt proxy and handle multiple IPs
2023-06-25 10:22:21 -08:00
Carter
5e904d19b4 docs: re-add and fix the bookmarklet instructions to docs (#2419) 2023-06-20 22:09:20 -08:00
Carter
eea38a5b1e fix: url format in the recipe chip (#2420) 2023-06-20 22:08:47 -08:00
Hayden
674774d073 New Crowdin updates (#2387)
* New translations en-US.json (Norwegian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Portuguese)

* New translations en-US.json (French)
2023-05-29 16:56:38 -08:00
Jacob Corn
e1d3a247c7 feat: random sort option for front page (#2363)
* Add hook for random sorting

* Add random sorting to front page

* Add multiple tests for random sorting.

* Be extra sure that all recipes are returned.

* Too stable random. seed doesn't reach backend.

* add timestamp to useRecipeSearch

* Update randomization tests for timestamp seeding

* ruff cleanup

* pass timestamp separately in getAll

* remove debugging log items

* remove timestamp from address bar

* remove defaults from backend timestamps

* timestamp should be optional

* fix edge case: query without timestamp

* similar edge case: no timestamp in pagination

* ruff :/

* better edge case handling

* stabilize random search test w/more recipes

* better pagination seeding

* update pagination seed test

* remove redundant random/seed check

* Test for api routes to random sorting.

* please the typing gods

* hack to make query parameters throw correct exc

* ruff

* fix validator message typo

* black reformatting

---------

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2023-05-29 16:56:20 -08:00
Jacob Corn
7e0d29afc7 feat: search tokenization, handling of quoted literal search, and postgres fuzziness (#2351)
* Creating postgres migration script and starting to set up to detect database

* non-working placeholders for postgres pg_tgrm

* First draft of some indexes

* non-working commit of postgres indexing

* Further non-working edits to db-centric fuzzy search

* update alembic for extensions

* More non-working setup

* Move db type check to init_db

* fix typo in db name check

* Add sqlite token search and postgres full text search

* reorder search to hit exact matches faster

* Add settings and docs for POSTGRES_LANGUAGE (full text search)

* Use user-specified POSTGRES_LANGUAGE in search

* fix fuzzy search typo

* Remove full text search and instead order by trigram match

* cleaner adding of indices, remove fulltext

* Cleanup old import of getting app settings

* Fix typo in index

* Fix some alembic fuzzy typos

* Remove diagnostic printing from alembic migration

* Fix mixed up commutator for trigram operator and relax criteria

* forgot to remove query debug

* sort only on name

* token and fuzzy search tests

* Refactor recipe search test to avoid rare random string cross-matches.

* Add ability to quote parts of search for exact match

* Remove internal punctuation, unless it's quoted for literal search

* Add tests for special character removal and literal search

* Remove the outer double quotes from searches, but leave internal single quotes alone.

* Update tests to avoid intra-test name collisions

* Fixing leftovers highlighted by lint

* cleanup linting and mypy errors

* Fix test cross-matching on dirty db (leftovers from bulk import)

* forgot to cleanup something when debugging mypy errors

* re-order pg_trgm loading in postgres

* address comments
2023-05-28 09:46:53 -08:00
Jacob Corn
27ebb4c462 docs: update dev docs, fix broken links, improve clarity of key points (#2354)
* Dev docs: tests, postgres/psycog2

* Update pull request process.

* Add Food/Unit parsing instructions to the FAQ

* Update docker composes: mealie-data now local to docker-compose rather than hidden in docker volume dir! postgres points to 1.0.0b5

* sqlite docker-compose: mealie-data now local rather than hidden in docker volumes

* Merge Intro FAQ into main FAQ

* Progress on docs

* Add Advanced and v1b5 to docs index

* v1b5 changelog consistency with other changelogs

* Features: fix wrong link, name buttons for clarity

* Migration: link to github releases

* Updating: link to migration page, format docker cmds

* FAQ: update smart ingredient formatting

* Intro: fix typos

* API: update for newbie clarity

* Roadmap: update feature request & progress mechanism

* iOS shortcut: fix broken image links

* installation: add SMTP google app passwords

* Postgres: add header note on why.

* Update Groups doc per Discord discussion

* mealie-data back into docker default volume path
2023-05-13 10:50:22 -08:00
Michael Genson
8e2d50054c Fix: Query Filter Date Comparisons Are Off By One Date (#2389)
* fixed erroneous date -> datetime conversion

* added tests for date and datetime bounds
2023-05-11 22:28:14 -08:00
Michael Genson
5d87b7e411 feature: query filter support for common SQL keywords (#2366)
* added support for SQL keywords IS, IN, LIKE, NOT
deprecated datetime workaround for "<> null"
updated frontend reference for "<> null" to "IS NOT NULL"

* tests

* refactored query filtering to leverage orm

* added CONTAINS ALL keyword

* tests

* fixed bug where "and" or "or" was in an attr name

* more tests

* linter fixes

* TIL this works
2023-05-06 14:28:40 -08:00
renovate[bot]
9b726126ed chore(deps): update dependency pylint to v2.17.3 (#2381)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-05-06 10:03:04 -08:00
renovate[bot]
c6346ed2a5 chore(deps): update dependency mkdocs-material to v9.1.9 (#2379)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-05-06 10:02:50 -08:00
Michael Genson
20a78677ef fix: Potential Fix for Global Timeline Server Error (#2372)
* simplified group id logic

* moved onscroll listener to on-mounted
2023-05-06 10:01:38 -08:00
Hayden
23786c1f5e bump ruff and do fixes (#2375) 2023-05-05 14:43:23 -08:00
Michael Genson
f27bb00dc3 fix: remove old prop reference (#2367) 2023-05-05 14:17:29 -08:00
Jacob Corn
2e43b51882 Add failed login & IP to log (#2365)
* Add failed login & IP to log

* Small change for human readability/intuitiveness
2023-05-05 14:15:55 -08:00
Hayden
a2e69b5565 New Crowdin updates (#2340)
* New translations en-US.json (Danish)

* New translations en-US.json (French)

* New translations en-US.json (Danish)

* New translations en-US.json (Italian)

* New translations en-US.json (Italian)

* New translations en-US.json (Swedish)

* New translations en-US.json (Swedish)

* New translations en-US.json (German)

* New translations en-US.json (Swedish)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Japanese)

* New translations en-US.json (Japanese)

* New translations en-US.json (Japanese)

* New translations en-US.json (Japanese)

* New translations en-US.json (Japanese)

* New translations en-US.json (Japanese)

* New translations en-US.json (Japanese)

* New translations en-US.json (Japanese)

* New translations en-US.json (Japanese)

* New translations en-US.json (Japanese)

* New translations en-US.json (Finnish)

* New translations en-US.json (Finnish)

* New translations en-US.json (Italian)

* New translations en-US.json (Japanese)

* New translations en-US.json (Japanese)

* New translations en-US.json (Japanese)

* New translations en-US.json (Japanese)

* New translations en-US.json (Japanese)

* New translations en-US.json (Japanese)

* New translations en-US.json (Finnish)

* New translations en-US.json (Japanese)

* New translations en-US.json (Japanese)

* New translations en-US.json (Japanese)

* New translations en-US.json (Finnish)

* New translations en-US.json (Italian)

* New translations en-US.json (Swedish)

* New translations en-US.json (German)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Japanese)

* New translations en-US.json (Finnish)

* New translations en-US.json (Romanian)

* New translations en-US.json (French)

* New translations en-US.json (Spanish)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Catalan)

* New translations en-US.json (Czech)

* New translations en-US.json (Danish)

* New translations en-US.json (Greek)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Korean)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Turkish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (English, United Kingdom)

* New translations en-US.json (French, Canada)

* New translations en-US.json (German)

* New translations en-US.json (Czech)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Czech)

* New translations en-US.json (Dutch)

* New translations en-US.json (German)

* New translations en-US.json (Turkish)

* New translations en-US.json (Russian)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Czech)

* New translations en-US.json (Czech)

* New translations en-US.json (Czech)

* New translations en-US.json (Finnish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Czech)

* New translations en-US.json (Italian)
2023-05-05 14:11:53 -08:00
Michael Genson
75698c531a fix: Shopping List Label Dropdown Doesn't Save Correctly (#2361)
* only update items by label on refresh

* made changes more responsive

* fast re-order items when labels are re-ordered
2023-04-25 09:46:58 -08:00
Michael Genson
fe17922bb8 Feature: Global Timeline (#2265)
* extended query filter to accept nested tables

* decoupled timeline api from recipe slug

* modified frontend to use simplified events api

* fixed nested loop index ghosting

* updated existing tests

* gave mypy a snack

* added tests for nested queries

* fixed "last made" render error

* decoupled recipe timeline from dialog

* removed unused props

* tweaked recipe get_all to accept ids

* created group global timeline
added new timeline page to sidebar
reformatted the recipe timeline
added vertical option to recipe card mobile

* extracted timeline item into its own component

* fixed apploader centering

* added paginated scrolling to recipe timeline

* added sort direction config
fixed infinite scroll on dialog
fixed hasMore var not resetting during instantiation

* added sort direction to user preferences

* updated API docs with new query filter feature

* better error tracing

* fix for recipe not found response

* simplified recipe crud route for slug/id
added test for fetching by slug/id

* made query filter UUID validation clearer

* moved timeline menu option below shopping lists

---------

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2023-04-25 09:46:00 -08:00
Michael Genson
0e397b34fd fix: broken frontend development (#2357)
* dependency hell be like

* moved resolution to subdependency only
2023-04-25 09:44:48 -08:00
renovate[bot]
fa59c1eb0b fix(deps): update dependency apprise to v1.3.0 (#2334)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-05 18:07:13 -08:00
renovate[bot]
998029da6f fix(deps): update dependency alembic to v1.10.3 (#2333)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-05 18:06:55 -08:00
renovate[bot]
d117b4075b chore(deps): update dependency pylint to v2.17.2 (#2332)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-05 18:06:13 -08:00
Hayden
e8de70c894 New Crowdin updates (#2331)
* New translations en-US.json (Spanish)

* New translations en-US.json (Spanish)
2023-04-05 18:05:50 -08:00
renovate[bot]
16b47a3c10 chore(deps): update dependency pre-commit to v3.2.2 (#2330)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-05 18:05:22 -08:00
renovate[bot]
05a7047ae3 chore(deps): update dependency eslint to v8.37.0 (#2329)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-05 18:04:43 -08:00
renovate[bot]
de4debe749 fix(deps): update dependency psycopg2-binary to v2.9.6 (#2320)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-04 11:56:17 -08:00
renovate[bot]
fcdb11d8a1 chore(deps): update dependency black to v23.3.0 (#2327)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-04 11:56:05 -08:00
renovate[bot]
6c625e402c fix(deps): update dependency recipe-scrapers to v14.36.0 (#2326)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-04 11:55:37 -08:00
Hayden
750072344d New Crowdin updates (#2319)
* New translations en-US.json (French)

* New translations en-US.json (Slovak)

* New translations en-US.json (Swedish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Norwegian)
2023-04-04 11:29:29 -08:00
renovate[bot]
d735f1c0d8 fix(deps): update dependency sqlalchemy to v2.0.8 (#2322)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-04 11:29:02 -08:00
renovate[bot]
29956142e1 chore(deps): update dependency pytest-asyncio to ^0.21.0 (#2290)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-04 11:28:30 -08:00
renovate[bot]
0ff46cda92 chore(deps): update dependency eslint-plugin-vue to v9.10.0 (#2289)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-04 11:28:13 -08:00
renovate[bot]
4e251b3092 fix(deps): update dependency recipe-scrapers to v14.35.0 (#2318)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-04 11:26:44 -08:00
Carter
10730bfa77 [Fix] Filter out the LDAP entries which do not have a DN (#2288)
* use first returned ldap entry

* set OPT_REFERRALS to 0

* filter out ldap entries not having a dn
2023-04-04 09:22:47 -08:00
renovate[bot]
03b7d9e200 fix(deps): update dependency orjson to v3.8.9 (#2315)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-03 10:06:28 -08:00
renovate[bot]
8a683e7344 chore(deps): update dependency vitest to v0.29.8 (#2314)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-03 10:06:14 -08:00
renovate[bot]
f4dbbcc439 chore(deps): update dependency rich to v13.3.3 (#2313)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-03 10:06:04 -08:00
Hayden
4126681f8c New Crowdin updates (#2316)
* New translations en-US.json (Romanian)

* New translations en-US.json (French)

* New translations en-US.json (Spanish)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Catalan)

* New translations en-US.json (Czech)

* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (Greek)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Italian)

* New translations en-US.json (Japanese)

* New translations en-US.json (Korean)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Swedish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (English, United Kingdom)

* New translations en-US.json (French, Canada)

* New translations en-US.json (Danish)

* New translations en-US.json (Turkish)

* New translations en-US.json (German)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Spanish)

* New translations en-US.json (Catalan)

* New translations en-US.json (French)
2023-04-03 10:05:52 -08:00
rastacalavera
13aa57a3d2 updated iOS shortcut (#2317)
* Update ios.md

updated for version 1.X

* Update ios.md

fixing spaces

* Add files via upload

adding screenshots

* Update ios.md

fixed screen shot path and shrunk images down

* Add files via upload

added smaller screen shots
2023-04-03 10:04:51 -08:00
Michael Genson
73476c10f8 feat: Parser Workflow Improvements (#2249)
* ensure recipe settings are set after parsing

* added insert and delete functionality

* added errors recalculation to use the new index
2023-04-01 17:43:59 -08:00
renovate[bot]
8a0ee351c5 chore(deps): update dependency coverage to v7.2.2 (#2287)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-01 17:43:27 -08:00
renovate[bot]
5d61b3a822 chore(deps): update dependency mkdocs-material to v9.1.5 (#2295)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-01 17:43:11 -08:00
rastacalavera
721a1cdeae Update community guide (#2309)
* Update ios.md

updated for version 1.X

* Update ios.md

fixing spaces

* Add files via upload

adding screenshots
2023-04-01 17:42:49 -08:00
renovate[bot]
f7310bc7c3 chore(deps): update dependency mypy to v1.1.1 (#2296)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-01 17:42:31 -08:00
Hayden
b0b06200f8 New Crowdin updates (#2293)
* New translations en-US.json (German)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (Catalan)

* New translations en-US.json (Catalan)

* New translations en-US.json (Spanish)

* New translations en-US.json (Catalan)

* New translations en-US.json (Spanish)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (Romanian)

* New translations en-US.json (Romanian)

* New translations en-US.json (Romanian)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (Polish)

* New translations en-US.json (Polish)

* New translations en-US.json (Polish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Ukrainian)
2023-04-01 17:42:04 -08:00
renovate[bot]
027fcbdcef fix(deps): update dependency uvicorn to ^0.21.0 (#2233)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-24 08:32:24 -08:00
Hayden
ab04d1f595 New Crowdin updates (#2278)
* New translations en-US.json (German)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hebrew)

* New translations en-US.json (German)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hebrew)

* New translations en-US.json (German)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hebrew)
2023-03-24 08:31:44 -08:00
renovate[bot]
d56604d19b fix(deps): update dependency sqlalchemy to v2.0.7 (#2286)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-24 08:31:21 -08:00
renovate[bot]
8a0552c902 fix(deps): update dependency python-slugify to v8.0.1 (#2282)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-24 08:31:09 -08:00
renovate[bot]
4c0e27b849 fix(deps): update dependency pydantic to v1.10.7 (#2281)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-24 08:30:50 -08:00
renovate[bot]
04c7928963 fix(deps): update dependency orjson to v3.8.8 (#2280)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-24 08:30:23 -08:00
Sören
4b426ddf2f Remove all sqlalchemy lazy-loading from app (#2260)
* Remove some implicit lazy-loads from user serialization

* implement full backup restore across different database versions

* rework all custom getter dicts to not leak lazy loads

* remove some occurances of lazy-loading

* remove a lot of lazy loading from recipes

* add more eager loading
remove loading options from repository
remove raiseload for checking

* fix failing test

* do not apply loader options for paging counts

* try using selectinload a bit more instead of joinedload

* linter fixes
2023-03-24 08:27:26 -08:00
renovate[bot]
fae62ecb19 chore(deps): update dependency prettier to v2.8.7 (#2255)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-24 08:21:26 -08:00
Sören
82ce4b5e7a fix "no data" error on create meal plan modal (#2263) 2023-03-24 08:21:12 -08:00
renovate[bot]
905b2ad8a9 chore(deps): update dependency @nuxt/types to v2.16.3 (#2270)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-23 10:11:50 -08:00
renovate[bot]
7880735ee4 chore(deps): update dependency vitest to v0.29.7 (#2275)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-23 09:42:00 -08:00
renovate[bot]
73e584b59e chore(deps): update dependency rich to v13.3.2 (#2274)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-23 09:41:50 -08:00
Hayden
71ce2be17c New Crowdin updates (#2272)
* New translations en-US.json (Finnish)

* New translations en-US.json (Slovak)

* New translations en-US.json (French)

* New translations en-US.json (Spanish)

* New translations en-US.json (Czech)

* New translations en-US.json (Romanian)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Catalan)

* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (Greek)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Italian)

* New translations en-US.json (Japanese)

* New translations en-US.json (Korean)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Swedish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (English, United Kingdom)

* New translations en-US.json (French, Canada)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Dutch)

* New translations en-US.json (Polish)

* New translations en-US.json (German)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Dutch)

* New translations en-US.json (German)

* New translations en-US.json (Hebrew)

* New translations en-US.json (German)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (Turkish)

* New translations en-US.json (Turkish)

* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (Dutch)

* New translations en-US.json (German)

* New translations en-US.json (Dutch)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Dutch)

* New translations en-US.json (Hebrew)

* New translations en-US.json (German)
2023-03-23 09:26:40 -08:00
renovate[bot]
667a231f4e chore(deps): update dependency pytest to v7.2.2 (#2271)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-23 09:26:24 -08:00
renovate[bot]
4a08ae6517 chore(deps): update dependency @types/sortablejs to v1.15.1 (#2254)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-23 09:25:04 -08:00
renovate[bot]
6e8628de25 chore(deps): update dependency @nuxtjs/eslint-module to v4 (#2220)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-23 09:24:05 -08:00
Michael Genson
50f50b2b9a Chore: Dev Container Settings (#2253)
* add isort line length to match black

* format settings

* disable formatting for vue files
2023-03-23 09:22:06 -08:00
Hayden
329d2c020d fix: make parser compare lowercase (#2244)
* use case-insensitive matching

* conditionally render delete button
2023-03-23 09:21:22 -08:00
renovate[bot]
f206583150 fix(deps): update dependency python-multipart to ^0.0.6 (#2198)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-23 09:20:50 -08:00
Michael Genson
b52848595c feat: added max width for print setting dialog (#2252) 2023-03-21 11:52:18 -08:00
Michael Genson
b460ae9f25 feat: reduced ingredients to one column on mobile (#2251) 2023-03-21 11:51:52 -08:00
Michael Genson
9199ae4901 fix: update_at sort (#2250) 2023-03-21 11:51:19 -08:00
Michael Genson
a025996b94 feat: Expanded safe HTML tags and attributes (#2248)
* expanded safe html tags and attrs

* removed style attr

* add note on sources of safe elements

---------

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2023-03-21 11:49:41 -08:00
Michael Genson
d2134b27ba fix: Shopping List Mobile Usability (#2247)
* removed handle from edit button

* added dragging delay for touch screens
2023-03-21 11:48:00 -08:00
Michael Genson
f9acba34cc feat: Recipe Data Management UI Improvements (#2246)
* made recipe name clickable

* fixed placeholder user avatar link
2023-03-21 11:47:26 -08:00
Hayden
97d9d10b1f New Crowdin updates (#2243)
* New translations en-US.json (Finnish)

* New translations en-US.json (Slovak)

* New translations en-US.json (French)

* New translations en-US.json (Spanish)

* New translations en-US.json (Czech)

* New translations en-US.json (Romanian)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Catalan)

* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (Greek)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Italian)

* New translations en-US.json (Japanese)

* New translations en-US.json (Korean)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Swedish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (English, United Kingdom)

* New translations en-US.json (French, Canada)

* New translations en-US.json (German)

* New translations en-US.json (Dutch)

* New translations en-US.json (German)

* New translations en-US.json (Turkish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Italian)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Romanian)

* New translations en-US.json (Romanian)

* New translations en-US.json (Romanian)

* New translations en-US.json (Romanian)

* New translations en-US.json (Romanian)

* New translations en-US.json (Romanian)

* New translations en-US.json (Romanian)

* New translations en-US.json (Romanian)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hebrew)
2023-03-21 11:46:13 -08:00
renovate[bot]
37505d896c chore(deps): update actions/cache action to v3.3.1 (#2230)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-21 11:45:42 -08:00
sephrat
9fd1ba6e46 feat(lang): more localization(#2219)
* feat(lang): localize some views

* fix: typo

* fix: Localization broke bug report generation

* feat(lang): localize recipe page instructions
2023-03-21 11:45:27 -08:00
renovate[bot]
6b63c751b1 fix(deps): update dependency fastapi to ^0.95.0 (#2217)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-21 11:44:48 -08:00
Hayden
8d79773bf6 fix: ignore nightly and develop in version check (#2242) 2023-03-12 13:41:41 -08:00
Hayden
9650ba9b00 refator: reuse search page component (#2240)
* wip: fix recipe card section

* refactor basic search to share composable

* fix dialog results

* use search for cat/tag/tool pages

* update organizer to support name edits

* fix composable typing
2023-03-12 12:59:28 -08:00
Hayden
b06517fdf4 New Crowdin updates (#2239)
* New translations en-US.json (Finnish)

* New translations en-US.json (Slovak)

* New translations en-US.json (French)

* New translations en-US.json (Spanish)

* New translations en-US.json (Czech)

* New translations en-US.json (Romanian)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Catalan)

* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (Greek)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Italian)

* New translations en-US.json (Japanese)

* New translations en-US.json (Korean)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Swedish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (English, United Kingdom)

* New translations en-US.json (French, Canada)
2023-03-12 12:57:38 -08:00
Philipp Fischbeck
42d078ef02 fix: frontend register url (#2231) 2023-03-12 12:40:31 -08:00
Sören
ccb0b43cef feat: implement backup restoration from old db schemas (#2213)
* Remove some implicit lazy-loads from user serialization

* implement full backup restore across different database versions
2023-03-12 12:39:51 -08:00
Michael Genson
3118b0e423 feat: Migrate from Copy Me That (#2212)
* implemented copymethat migration

* added migration tree

* added translation support

* genericized example jpgs

* added test data

* fixed test archive

* switched recipe create to service
added test for timeline event creation

* linting

* lxml go brrr
2023-03-12 12:37:24 -08:00
Hayden
3ce8fa9492 New Crowdin updates (#2210)
* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (Italian)

* New translations en-US.json (Italian)

* New translations en-US.json (Italian)

* New translations en-US.json (Italian)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (French, Canada)

* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (Italian)

* New translations en-US.json (Italian)

* New translations en-US.json (Italian)

* New translations en-US.json (Italian)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Greek)

* New translations en-US.json (Greek)

* New translations en-US.json (Finnish)

* New translations en-US.json (Finnish)

* New translations en-US.json (Danish)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Spanish)
2023-03-12 12:36:48 -08:00
Carter
7d9be67432 feat: LDAP Improvements and E2E testing (#2199)
* add option to enable starttls for ldap

* add integration test for ldap service

* document new, optional environment variable

* fix: support anonymous bind

* id and mail attributes in LDAP_USER_FILTER should be implied

* remove print statement
2023-03-12 12:36:32 -08:00
Carter
93eb2af087 feature: add password reset token endpoint to the admin panel (#2171)
* add password reset token endpoint to the admin panel

* add None check on token

* add localization message for passowrd reset link button
2023-03-12 12:33:36 -08:00
Hayden
1b26ca0cb3 New Crowdin updates (#2196)
* New translations en-US.json (Turkish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Portuguese, Brazilian)
2023-03-04 10:26:02 -09:00
Hayden
11cd277975 ui: rework meal-planner (#2203)
* remove unused TS Ignores

* refactor planner into multiple pages

also includes some minor UI adjustments and some feature work to improve the date selector

* use mobile cards for meal-planner

* remove component
2023-03-02 09:45:06 -09:00
Hayden
5b487464ea New Crowdin updates (#2192)
* New translations en-US.json (Finnish)

* New translations en-US.json (Slovak)

* New translations en-US.json (French)

* New translations en-US.json (Spanish)

* New translations en-US.json (Czech)

* New translations en-US.json (Romanian)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Catalan)

* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (Greek)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Italian)

* New translations en-US.json (Japanese)

* New translations en-US.json (Korean)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Swedish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (English, United Kingdom)

* New translations en-US.json (French, Canada)

* New translations en-US.json (German)

* New translations en-US.json (Polish)

* New translations en-US.json (German)
2023-02-26 16:04:43 -09:00
Hayden
85bc3a9b15 New Crowdin updates (#2191)
* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (Dutch)

* New translations en-US.json (Polish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Dutch)

* New translations en-US.json (Polish)

* New translations en-US.json (Turkish)
2023-02-26 12:41:08 -09:00
Hayden
01e3bb04b9 feat: update inline docs on group page to clarify private/public settings (#2190) 2023-02-26 12:39:36 -09:00
Hayden
d3f893dec2 chore: auto-set-version-on-ci (#2188)
* setup __version__ on build

* make build clickable link

* fix else-if
2023-02-26 11:51:04 -09:00
Sören
ac0432d47a fix: cookbook ordering in frontend (#2180)
* fixes cookbook ordering in frontend

* Revert "fixes cookbook ordering in frontend"

This reverts commit 1b5b172911.

* Fix cookbook ordering the proper way
2023-02-26 11:48:32 -09:00
Hayden
8b181ec28a New Crowdin updates (#2187)
* New translations en-US.json (Finnish)

* New translations en-US.json (Slovak)

* New translations en-US.json (French)

* New translations en-US.json (Spanish)

* New translations en-US.json (Czech)

* New translations en-US.json (Romanian)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Catalan)

* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (Greek)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Italian)

* New translations en-US.json (Japanese)

* New translations en-US.json (Korean)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Swedish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (English, United Kingdom)

* New translations en-US.json (French, Canada)

* New translations en-US.json (Dutch)

* New translations en-US.json (Danish)

* New translations en-US.json (Romanian)

* New translations en-US.json (French)

* New translations en-US.json (Spanish)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Catalan)

* New translations en-US.json (Czech)

* New translations en-US.json (Greek)

* New translations en-US.json (Finnish)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Italian)

* New translations en-US.json (Japanese)

* New translations en-US.json (Korean)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Swedish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (English, United Kingdom)

* New translations en-US.json (French, Canada)
2023-02-26 10:34:09 -09:00
Sören
a28133ea5d fix: font loading in css (#2182) 2023-02-26 10:29:11 -09:00
Sören
8824aec066 fix: sequence numbers not updating after backup restore (#2179) 2023-02-26 10:28:09 -09:00
Sören
84d55eb920 fix: #2169 webhooks not firing (#2178)
* fix webhooks not firing due to missing session

* disable webhook test button because it doesnt do anything

* fix background task administration not working at all

* fix error in test
2023-02-26 10:27:22 -09:00
renovate[bot]
da791ec9c5 chore(deps): update dependency vitest to ^0.29.0 (#2177)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-26 10:21:34 -09:00
Sören
30d8e0b16d feat: use server-side search for mealplanner (#2174) 2023-02-26 10:21:15 -09:00
Sören
541cdc79aa fix: 2148 infinite scroll on search (#2173)
* refactor recipe card section to use unified query construct

* rework search page so it uses lazy-loading of RecipeCardSection

* remove RecipeQuery again

* prettier reformatting

* remove recipes/all page

* remove max results setting from search

* fix typing issues
2023-02-26 10:20:26 -09:00
Hayden
afbee3a078 New translations en-US.json (French) (#2172) 2023-02-26 10:15:47 -09:00
renovate[bot]
796dcd9995 fix(deps): update dependency python-dotenv to v1 (#2170)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-26 10:13:10 -09:00
Michael Genson
8ca0fe42de Feature: More Shopping List Improvements (#2164)
* added color back to labels

* improved mobile view
refactored layout to use grid
allowed text wrapping on item labels
removed label overflow
added completion date on checked items

* sort checked items by last updated

* made checking an item off more responsive

* optimized moving checked items
removed unnecessary updateAll call
removed jitter when shopping list refreshes
2023-02-26 10:12:53 -09:00
Carter
2e6ad5da8e Feature: Add "Authentication Method" to allow existing users to sign in with LDAP (#2143)
* adds authentication method for users

* fix db migration with postgres

* tests for auth method

* update migration ids

* hide auth method on user creation form

* (docs): Added documentation for the new authentication method

* update migration

* add  to auto-form instead of having hidden fields
2023-02-26 10:12:16 -09:00
Hayden
39012adcc1 chore: remove ignore with match statement support (#2175) 2023-02-24 19:13:16 -09:00
Michael Genson
6418a10428 fix: misused update over patch in last_update call (#2168)
* fixed mealplan timeline event task
fixed indentation to only look at one group at a time
changed grumpy update to happy patch

* updated pytest to catch this error

* I don't know how this got past the pre-commit
2023-02-23 13:10:47 -09:00
renovate[bot]
6a1503d1f6 chore(deps): update actions/cache action to v3.2.6 (#2160)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-23 09:30:14 -09:00
renovate[bot]
076410071c chore(deps): update dependency ruff to ^0.0.252 (#2155)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-23 09:30:02 -09:00
Sören
9d35b0923a fix performance issues on /api/foods (#2163)
* fix performance issues on /api/foods

* fix comment

* actually apply query-options
2023-02-21 19:01:27 -09:00
Michael Genson
666085b9ca Fix: Print Preferences Menu Missing (#2162)
* fixed console errors for missing recipe prop

* restored print preferences to action menu
2023-02-21 19:00:22 -09:00
Michael Genson
fd03d468d4 Fix: Allow Last Made to be Updated on Locked Recipes (#2140)
* allow certain props to be updated on locked recipe

* pytest

* added "last_made" to hardcoded datetime fields

* refactored last made to its own route

* codegen/types

* updated pytest
2023-02-21 18:59:22 -09:00
Michael Genson
a6c46a7420 Feature: Shopping List Label Section Improvements (#2090)
* added backend for shopping list label config

* updated codegen

* refactored shopping list ops to service
removed unique contraint
removed label settings from main route/schema
added new route for label settings

* codegen

* made sure label settings output in position order

* implemented submenu for label order drag and drop

* removed redundant label and tweaked formatting

* added view by label to user preferences

* made items draggable within each label section

* moved reorder labels to its own button

* made dialog scrollable

* fixed broken model

* refactored labels to use a service
moved shopping list label logic to service
modified label seeder to use service

* added tests

* fix for first label missing the tag icon

* fixed wrong mapped type

* added statement to create existing relationships

* fix restore test, maybe
2023-02-21 18:58:41 -09:00
Michael Genson
e14851531d fixed last made query value (#2157) 2023-02-20 21:52:16 -09:00
Michael Genson
fb830189d2 remembered how to count over 9 (#2156) 2023-02-20 21:51:58 -09:00
Michael Genson
eaa6ee57a9 Fix: Remove dead search link (#2158)
* removed old references to search page

* changed overflow from scroll to auto
2023-02-20 21:51:24 -09:00
Hayden
df8459a95c feat: use debounced search (optional) (#2150)
* use debounced search (optional)

* replace homepage with search page
2023-02-19 17:13:29 -09:00
Hayden
4f14058251 New Crowdin updates (#2149)
* New translations en-US.json (Finnish)

* New translations en-US.json (Slovak)

* New translations en-US.json (French)

* New translations en-US.json (Spanish)

* New translations en-US.json (Czech)

* New translations en-US.json (Romanian)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Catalan)

* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (Greek)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Italian)

* New translations en-US.json (Japanese)

* New translations en-US.json (Korean)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Swedish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (English, United Kingdom)

* New translations en-US.json (French, Canada)
2023-02-19 17:07:14 -09:00
Michael Genson
09e58b36af fix: added limited context menu for public users (#2138) 2023-02-19 16:28:57 -09:00
Michael Genson
5562effd66 feat: select ingredients to add to shopping List (#2136)
* added recipe ingredient override to backend

* pytest

* new dialog to filter recipe items added to list
2023-02-19 16:20:32 -09:00
Philipp Fischbeck
89b003589d chore(deps): update to Nuxt 2.16 (Vue 2.7) (#2144) 2023-02-19 16:11:52 -09:00
Hayden
6c0fae51b7 New Crowdin updates (#2147)
* New translations en-US.json (Finnish)

* New translations en-US.json (Slovak)

* New translations en-US.json (French)

* New translations en-US.json (Spanish)

* New translations en-US.json (Czech)

* New translations en-US.json (Romanian)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Catalan)

* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (Greek)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Italian)

* New translations en-US.json (Japanese)

* New translations en-US.json (Korean)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Swedish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (English, United Kingdom)

* New translations en-US.json (French, Canada)
2023-02-19 15:53:51 -09:00
renovate[bot]
0a54285674 fix(deps): update dependency fastapi to ^0.92.0 (#2128)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-19 15:48:33 -09:00
Michael Genson
35124ea875 feat: Shopping List Item Pagination Route (#2145)
* added pagination route for list items

* pytest
2023-02-19 15:48:19 -09:00
Michael Genson
c6d53fe8b1 added validator to trim base url trailing slash (#2142) 2023-02-19 15:46:52 -09:00
Michael Genson
d639bdcfe9 fix: check if the temp dir exists before deleting it (#2141) 2023-02-19 15:46:17 -09:00
Michael Genson
05e2566c35 fix: recipe scraper image cleaning (#2139)
* updated image cleaner
enabled image cleaner
added case for nested image dicts

* refactored image cleaner to return a list of urls
2023-02-19 15:43:52 -09:00
Michael Genson
53fe5921d2 chore: removed debug log (#2137) 2023-02-19 15:41:05 -09:00
Sören
6a5f9d7f6b feat: diacritic-insensitive search (#2132)
* add normalized columns and use them for search

* add migration to fill all normalized columns
2023-02-19 15:40:18 -09:00
Michael Genson
670907b563 feat: Print Preferences (#2131)
* added basic recipe print settings
added print settings dialog
refactored print view to live inside print container

* removed unwanted padding

* changed preferences layout
2023-02-19 15:37:18 -09:00
renovate[bot]
b25cc70963 fix(deps): update dependency isomorphic-dompurify to v1 (#2129)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-19 15:35:42 -09:00
Hayden
f241228b94 New Crowdin updates (#2127)
* New translations en-US.json (Ukrainian)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (German)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New translations en-US.json (Finnish)

* New translations en-US.json (Hungarian)

* New translations en-US.json (German)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Dutch)
2023-02-19 15:33:25 -09:00
renovate[bot]
8e43fc6848 chore(deps): update dependency ruff to ^0.0.247 (#2125)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-19 15:32:55 -09:00
Hayden
3a4c37e04f New Crowdin updates (#2122)
* New translations en-US.json (Slovak)

* New translations en-US.json (Dutch)
2023-02-12 15:12:03 -09:00
Hayden
4d8dc7a63c New Crowdin updates (#2120)
* New translations en-US.json (Finnish)

* New translations en-US.json (Slovak)

* New translations en-US.json (French)

* New translations en-US.json (Spanish)

* New translations en-US.json (Czech)

* New translations en-US.json (Romanian)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Catalan)

* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (Greek)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Italian)

* New translations en-US.json (Japanese)

* New translations en-US.json (Korean)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Swedish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (English, United Kingdom)

* New translations en-US.json (French, Canada)

* New translations en-US.json (Dutch)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (German)
2023-02-12 11:16:39 -09:00
Erwan Colin
94abd04d38 docs: postgres volume target is /var/lib/postgresql/data (#2121) 2023-02-12 11:16:11 -09:00
Hayden
71f8c1066a feat: server side search (#2112) (#2117)
* feat: server side search API (#2112)

* refactor repository_recipes filter building

* add food filter to recipe repository page_all

* fix query type annotations

* working search

* add tests and make sure title matches are ordered correctly

* remove instruction matching again

* fix formatting and small issues

* fix another linting error

* make search test no rely on actual words

* fix failing postgres compiled query

* revise incorrectly ordered migration

* automatically extract latest migration version

* test migration orderes

* run type generators

* new search function

* wip: new search page

* sortable field options

* fix virtual scroll issue

* fix search casing bug

* finalize search filters/sorts

* remove old composable

* fix type errors

---------

Co-authored-by: Sören <fleshgolem@gmx.net>
2023-02-11 21:26:10 -09:00
Jon
fc105dcebc Update docker-compose.yml (#2109)
* Update docker-compose.yml

ERROR: The Compose file './docker-compose.yml' is invalid because:
services.mealie.environment.WEB_GUNICORN contains true, which is an invalid type, it should be a string, number, or a null

* Update docker-compose.yml

Also fix SMTP settings, since they aren't in array format as in mealie-frontend.

* Once more, ironing out a few minor issues.

Server status reported this, I think this is the correct value, but I'm happy to revert and/or update the value as needed.

* Revert previous two commits

Per https://github.com/hay-kot/mealie/pull/2109#pullrequestreview-1294610637

* Stray newline

Missed a stray newline that was inadvertently added.
2023-02-11 21:08:39 -09:00
renovate[bot]
7fe74cf997 fix(deps): update dependency aiofiles to v23 (#2108)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-11 10:41:08 -09:00
Sören
7d4a379f0d feat: improve database indexing (#2104)
* add indices to all foreign keys and some fields that are used for ordering and filtering

* add missing migrations

* update migration orders

---------

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2023-02-11 10:40:53 -09:00
renovate[bot]
f9ba7711ec fix(deps): update dependency fastapi to ^0.91.0 (#2106)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-11 10:21:56 -09:00
Carter
da60e56982 fix: user login and creation with LDAP (#2107)
* Corrected if statement to check if a results was returned by the LDAP search. And decoded the user_attributes from binary data to string

* removed trailing spaces

* Revert asserts in LDAP unit test back

Since an empty tuple is still a result, an user is created and the result should not be false.

* Simplified code

* Extended the LDAP implementation

* fix ldap authentication and user creation

* modified docs to include new LDAP environment variables

* update tests and linting

* add libldap-2.4-2 as runtime dependency for the api

---------

Co-authored-by: Erik Landkroon <eriklandkroon@gmail.com>
2023-02-11 10:16:33 -09:00
renovate[bot]
2a929865e2 chore(deps): update actions/cache action to v3.2.5 (#2110)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-11 10:12:25 -09:00
renovate[bot]
1162021977 fix(deps): update dependency isomorphic-dompurify to ^0.27.0 (#2114)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-11 10:11:59 -09:00
renovate[bot]
92662b3780 chore(deps): update dependency mypy to v1 (#2101)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-11 10:11:25 -09:00
Hayden
2ec88fd010 New Crowdin updates (#2103)
* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (Dutch)
2023-02-11 10:10:40 -09:00
Michael Genson
5f7ac92c96 feat: timeline event for mealplans (#2050)
* added related user to mealplans

* made timeline event message actually optional

* added task to create events for mealplan recipes

* replaced fk constraint ops with bulk ops

* fixed event creation and adjusted query range

* indentation is hard

* added missing recipe id query filter

* added tests
2023-02-11 10:08:53 -09:00
Hayden
9e77a9f367 prs-fleshgolem-2070: feat: sqlalchemy 2.0 (#2096)
* upgrade sqlalchemy to 2.0

* rewrite all db models to sqla 2.0 mapping api

* fix some importing and typing weirdness

* fix types of a lot of nullable columns

* remove get_ref methods

* fix issues found by tests

* rewrite all queries in repository_recipe to 2.0 style

* rewrite all repository queries to 2.0 api

* rewrite all remaining queries to 2.0 api

* remove now-unneeded __allow_unmapped__ flag

* remove and fix some unneeded cases of "# type: ignore"

* fix formatting

* bump black version

* run black

* can this please be the last one. okay. just. okay.

* fix repository errors

* remove return

* drop open API validator

---------

Co-authored-by: Sören Busch <fleshgolem@gmx.net>
2023-02-06 18:43:12 -09:00
Hayden
91cd00976a New Crowdin updates (#2097)
* New translations en-US.json (Ukrainian)

* New translations en-US.json (Ukrainian)
2023-02-06 18:21:01 -09:00
Sören
a35bc71e53 Fix routes getting listed twice in API documentation (#2079)
* remove duplicate tags from all routes after mounting

* fix missing import
2023-02-05 09:53:19 -09:00
Sören
f4b819899d fix: duplicate network calls on index page (#2085)
* Prevent extra recipe load on index page

* Prevent loading recipes with food for all components but search ones

* add missing change in search page
2023-02-05 09:52:49 -09:00
Hayden
f3a26f864d chore: update linters (#2095)
* update deps

* ruff auto-fixes

* refactor match statements where possible
2023-02-05 09:51:44 -09:00
Hayden
d5efaad2c3 New Crowdin updates (#2075)
* New translations en-US.json (German)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New translations en-US.json (Turkish)

* New translations en-US.json (Turkish)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (Dutch)

* New translations en-US.json (German)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (French, Canada)

* New translations en-US.json (French)

* New translations en-US.json (German)

* New translations en-US.json (Slovak)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Italian)

* New translations en-US.json (Italian)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (French)

* New translations en-US.json (Russian)

* New translations en-US.json (Russian)

* New translations en-US.json (Russian)

* New translations en-US.json (Russian)

* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (German)
2023-02-05 09:42:55 -09:00
renovate[bot]
2b8cffd31d chore(deps): update actions/cache action to v3.2.4 (#2080)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-05 09:15:10 -09:00
Michael Genson
4fc4ba934d fix: remove network calls from tests (#2055)
* abstracted scraper get_html method

* applied mock to all scrapers

* fixed incorrect var reference
2023-02-05 09:14:57 -09:00
Michael Genson
20160346d7 fix: moved vuetify options from nuxt cfg to vuetify cfg (#2084) 2023-02-01 18:51:51 -09:00
Hayden
766267961c fix import error (#2082) 2023-01-30 12:01:00 -09:00
Hayden
5dc253799d fix: eslint errors and failing tests (#2078)
* fix eslint errors

* fix failing tests
2023-01-29 13:01:41 -09:00
Hayden
7c766af848 New Crowdin updates (#2074)
* New translations en-US.json (Finnish)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (French)

* New translations en-US.json (Spanish)

* New translations en-US.json (Czech)

* New translations en-US.json (Romanian)

* New translations en-US.json (Romanian)

* New translations en-US.json (French)

* New translations en-US.json (Spanish)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Arabic)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Catalan)

* New translations en-US.json (Catalan)

* New translations en-US.json (Czech)

* New translations en-US.json (Danish)

* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (Greek)

* New translations en-US.json (Greek)

* New translations en-US.json (Finnish)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Italian)

* New translations en-US.json (Italian)

* New translations en-US.json (Japanese)

* New translations en-US.json (Japanese)

* New translations en-US.json (Korean)

* New translations en-US.json (Korean)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Polish)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Russian)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Swedish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (English, United Kingdom)

* New translations en-US.json (English, United Kingdom)

* New translations en-US.json (French, Canada)

* New translations en-US.json (French, Canada)
2023-01-28 16:57:34 -09:00
Hayden
530f7c9d6b logging improvements (#2073)
* Scheduled tasks log to Debug, not Info

* Add LOG_LEVEL config to .env

* Update some other log levels and fix typos

* fix logger initializer

---------

Co-authored-by: Jakob Rubin <647846+Grygon@users.noreply.github.com>
2023-01-28 16:54:44 -09:00
Hayden
9ddb27b2e3 Promote i18n Ally for frontend localization (#2072)
Co-authored-by: sephrat <34862846+sephrat@users.noreply.github.com>
2023-01-28 16:41:01 -09:00
sephrat
f8b8680b45 Localize hard-coded texts (#2044)
* feat(lang): localize some views

* feat(lang): an attempt at localizing vuetify (WIP)

* feat(lang): localized some more screens

* feat(lang): localized some more screens again

* feat(lang): hack to localize vuetify

* feat(lang): localize data management pages

* fix linting errors

---------

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2023-01-28 16:39:51 -09:00
Hayden
754d4c3937 chore: disable PWA in development (#2071) 2023-01-28 16:28:09 -09:00
Philipp
59f43a58d3 Upload recipe step images from mobile devices (#2025)
* Upload recipe step images from mobile devices

This adds a button in the recipe step dropdown, as not all mobile
devices can drag and drop a file into the web page

See #885

* Add progress bar
2023-01-28 16:27:40 -09:00
RealFoxie
0acc260447 Improve the default search by focussing on title and description (#2053)
* ignore field norm + weights for basic search

* better search config for advanced search

* undo (wrong) automatic formatting
2023-01-28 16:07:49 -09:00
renovate[bot]
28d24875a3 fix(deps): update dependency python-slugify to v8 (#2069)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-28 16:06:27 -09:00
Hayden
9dbba60379 New Crowdin updates (#2064)
* New translations en-US.json (Spanish)

* New translations en-US.json (Spanish)

* New translations en-US.json (Czech)

* New translations en-US.json (Czech)

* New translations en-US.json (Czech)

* New translations en-US.json (Czech)

* New translations en-US.json (Czech)
2023-01-28 15:51:02 -09:00
Sören
49bd420c10 fix: all recipes performance regressions (#2062)
* Move recipe validations from RecipeSummary to Recipe

* fix RepositoryRecipes loading recipes with ingredients even when load_food is False

* Add eager loading of ingredient units

* fix trying to instantiate PaginationBase with concrete type not being valid for mypy

* fix linting issue
2023-01-28 15:50:26 -09:00
Michael Genson
2340ee5bfb Dev Improvements (#2058)
* added ruff cache to git ignore

* moved venv to project and added interpreter path

* added dummy method to LDAP test

* removed unused setting
2023-01-28 15:49:09 -09:00
renovate[bot]
ed797ef8b2 chore(deps): update dependency ruff to ^0.0.237 (#2035)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-28 15:47:22 -09:00
sephrat
8cac921272 fix: Support special characters in seed data (#2048) 2023-01-28 15:46:48 -09:00
Benjamin Schmid
91f0a92838 doc(single-container): add hint on the exposed ports (#2029) 2023-01-28 15:46:27 -09:00
Michael Genson
617cc1fdfb Refactor Shopping List API (#2021)
* tidied up shopping list item models
redefined recipe refs and updated models
added calculated display attribute to unify shopping list item rendering
added validation to use a food's label if an item's label is null

* fixed schema reference

* refactored shopping list item service
route all operations through one central method to account for edgecases
return item collections for all operations to account for merging
consolidate recipe items before sending them to the shopping list

* made fractions prettier

* replaced redundant display text util

* fixed edgecase for zero quantity items on a recipe

* fix for pre-merging recipe ingredients

* fixed edgecase for merging create_items together

* fixed bug with merged updated items creating dupes

* added test for self-removing recipe ref

* update items are now merged w/ existing items

* refactored service to make it easier to read

* added a lot of tests

* made it so checked items are never merged

* fixed bug with dragging + re-ordering

* fix for postgres cascade issue

* added prevalidator to recipe ref to avoid db error
2023-01-28 15:45:02 -09:00
Sören
3415a9c310 Convert scraper to use async (#1915)
* add httpx depedency for async http requests

* rework scraper strategies to download recipe html asynchronously

* rework recipe_data_service to download recipe images asynchronously

* fix recipe_parser test, so it can use async results

* fix bulk import so that it also works with async scraper

* fix broken recipe_parser tests

* Fix issues found by scanners

* Add additional checks for ingredient and instruction count in test_create_by_url

* Revert changes in test recipe_data
Since we are checking ingredients and instructions in test_create_url now, these would fail with the stored html of recipe data

* Add explicit type annotation in recipe_data_service.largest_content_len

* Fix typo in annotation
2023-01-28 15:43:27 -09:00
Hayden
7275dd2696 New Crowdin updates (#2038)
* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (Finnish)

* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (Portuguese)

* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (Finnish)

* New translations en-US.json (Finnish)
2023-01-24 13:16:42 -09:00
renovate[bot]
17f7df0747 chore(deps): update dependency vitest to ^0.28.0 (#2019)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-24 13:15:24 -09:00
renovate[bot]
518f9a8228 chore(deps): update actions/cache action to v3.2.3 (#2018)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-24 13:15:03 -09:00
Hayden
c8be922111 New Crowdin updates (#2016)
* New translations en-US.json (Lithuanian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Finnish)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Finnish)

* New translations en-US.json (Czech)

* New translations en-US.json (Czech)

* New translations en-US.json (Czech)

* New translations en-US.json (Czech)

* New translations en-US.json (Czech)

* New translations en-US.json (Italian)

* New translations en-US.json (Italian)

* New translations en-US.json (Finnish)

* New translations en-US.json (Finnish)

* New translations en-US.json (Italian)

* New translations en-US.json (Italian)

* New translations en-US.json (Finnish)

* New translations en-US.json (Italian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hungarian)
2023-01-14 09:33:14 -09:00
renovate[bot]
f1a31ce33d chore(deps): update dependency ruff to ^0.0.221 (#2022)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-14 09:32:56 -09:00
renovate[bot]
9b05d0dec0 chore(deps): update dependency eslint-plugin-vue to v9.9.0 (#2028)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-14 09:32:43 -09:00
Philipp Fischbeck
1e4230093e fix: fix maintenance page i18n (#2033) 2023-01-14 09:31:47 -09:00
William Brawner
611a105988 fix: devcontainer setup poetry venv setup (#2027)
Signed-off-by: William Brawner <me@wbrawner.com>

Signed-off-by: William Brawner <me@wbrawner.com>
2023-01-14 09:31:00 -09:00
Sören
0cd892059b Fix/issue#2003 - Unable to remove all instructions/ingredients from a recipe (#2008)
* Fix issue where recipes could not have all their ingredients/instructions removed

* Add test for removing all instructions and ingredients from a recipe
2023-01-08 10:46:51 -09:00
Hayden
a72f038247 fix: use markdown for description in cards (#2011) 2023-01-08 09:51:36 -09:00
Hayden
ae59f04b9f fix: allow-iframe-embeds (#2009)
* allow embedding iframes

* fix alignment issue for buttons
2023-01-08 09:50:26 -09:00
Hayden
61ccaded2c New translations en-US.json (Finnish) (#2007) 2023-01-08 09:14:06 -09:00
Michael Genson
856a009dd8 fix: for several Shopping List bugs (#1912)
* prevent list refresh while re-ordering items

* update position of new items to stay at the bottom

* prevent refresh while loading

* copy item while editing so it isn't refreshed

* added loading count to handle overlapping actions

* fixed recipe reference throttling

* prevent merging checked and unchecked items
2023-01-08 08:23:24 -09:00
renovate[bot]
7d94209f3e chore(deps): update dependency ruff to ^0.0.215 (#1996)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-08 08:04:58 -09:00
Hayden
d6e4fd424e New Crowdin updates (#2005)
* New translations en-US.json (Finnish)

* New translations en-US.json (Finnish)

* New translations en-US.json (Finnish)
2023-01-08 08:04:38 -09:00
William Edmisten
7fdab33368 docs: Update references to license as AGPL not MIT (#2006) 2023-01-08 08:04:27 -09:00
renovate[bot]
75a65cec95 fix(deps): update dependency isomorphic-dompurify to ^0.26.0 (#2004)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-08 08:04:04 -09:00
renovate[bot]
9774f17f64 fix(deps): update dependency fastapi to ^0.89.0 (#1997)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-07 18:22:08 -09:00
Sören
5e97c32e68 Fix example postgres docker-compose setup in docs (#1998)
* Fix example postgres docker-compose setup in docs
Add a local volume to postgres container so changes get persisted between restarts

* Fix linked volume in postgres doc
2023-01-07 18:21:42 -09:00
Hayden
da5b87950f New translations en-US.json (Portuguese) (#2001) 2023-01-07 18:21:26 -09:00
Hayden
ace1d2f9ee fix: force logout when deleting self - closes #1979 (#2000) 2023-01-07 10:30:45 -09:00
Hayden
fc92c39b7c feat: additional events dispatch (#1999)
* formatting

* add new user type

* add registration event

* publish events on new mealplan

* update UI for supported types + type updates
2023-01-07 10:18:08 -09:00
renovate[bot]
c33b14e3d2 fix(deps): update dependency isomorphic-dompurify to ^0.25.0 (#1990)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-06 21:47:47 -09:00
renovate[bot]
fd71352a1b chore(deps): update dependency mkdocs-material to v9 (#1974)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-06 21:47:29 -09:00
renovate[bot]
e1bc009faf chore(deps): update dependency ruff to ^0.0.212 (#1987)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-06 21:41:10 -09:00
Hayden
55378efe84 Fix/potential-pwa-fix-4 (#1993)
* 🤷‍♂️

* add shortname
2023-01-06 15:26:25 -09:00
Hayden
5dab70fe7e fix: potential-pwa-fix-3 (#1992)
* force redirect when authenticated

* set start_url to empty string per - https://stackoverflow.com/questions/64608408/workbox-is-precaching-urls-without-revision-info-standalone-true-this-is-gene
2023-01-06 10:51:38 -09:00
renovate[bot]
4d98d2174e chore(deps): update actions/setup-node action to v3.6.0 (#1989)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-05 11:15:10 -09:00
Hayden
d0b6c2f131 fix: potential-pwa-fix-2 - remove start_url (#1986) 2023-01-04 19:08:09 -09:00
Hayden
929c67b1a7 New Crowdin updates (#1984)
* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New translations en-US.json (Bulgarian)
2023-01-04 11:33:40 -09:00
renovate[bot]
3b8684265b chore(deps): update dependency ruff to ^0.0.210 (#1985)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-04 11:33:30 -09:00
Hayden
3e41bba8fb fix: potential pwa fix (#1982)
* set cookie params

* potential fix for pwa issue
2023-01-03 17:36:40 -09:00
renovate[bot]
fcf680fe0b chore(deps): update dependency ruff to ^0.0.209 (#1975)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-03 16:53:06 -09:00
Hayden
24f266c7ab fix: extend-cookie-expire (#1981)
potential fix for #1816
2023-01-03 16:51:33 -09:00
Hayden
3fadb82c75 New Crowdin updates (#1977)
* New translations en-US.json (Bulgarian)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Polish)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (German)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Bulgarian)
2023-01-03 13:11:55 -09:00
renovate[bot]
ab13e8e42e fix(deps): update dependency aniso8601 to v9 (#1971)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-01 15:44:19 -09:00
renovate[bot]
0700220418 fix(deps): update dependency python-slugify to v7 (#1972)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-01 14:07:01 -09:00
renovate[bot]
2fc3873bad chore(deps): update docker/login-action action to v2 (#1963)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-01 13:57:25 -09:00
Hayden
4d5550ad85 chore: mypy, ruff, extract, openapi, and recipes-scraper updates (#1968)
* bump ruff and mypy

* mypy fixes

* bump and fix openapi

* drop debug statement

* bump extruct

* bump recipes-scrapers
2023-01-01 13:47:27 -09:00
renovate[bot]
e329e1cd15 chore(deps): update docker/setup-qemu-action action to v2 (#1966)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-01 12:37:37 -09:00
renovate[bot]
013d67fa15 chore(deps): update docker/setup-buildx-action action to v2 (#1964)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-01 12:28:09 -09:00
renovate[bot]
51cc034ef9 chore(deps): update dependency coverage to v7 (#1959)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-01 11:53:51 -09:00
tomamplius
25ebe2d6fb bugfix : fix user_entry validation control (#1871)
* fix user_entry control

* code optimsation

* poetry syntaxe requirement

* poetry is really strict with python

* resolve linting error

* Update security.py

* fix user_entry = [()]

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2023-01-01 11:52:49 -09:00
renovate[bot]
a71067e3ec chore(deps): update dependency types-python-slugify to v6 (#1962)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-01 11:29:49 -09:00
renovate[bot]
540ac0a36a chore(deps): update dependency rich to v13 (#1960)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-01 09:21:01 -08:00
Hayden
b50f92420b hotfix: buildpath (#1958)
* fixes

* fix build script name
2022-12-31 09:12:45 -09:00
Hayden
be2399e993 New Crowdin updates (#1956)
* New translations en-US.json (Italian)

* New translations en-US.json (Italian)

* New translations en-US.json (Italian)
2022-12-31 09:02:45 -09:00
renovate[bot]
22024a7738 chore(deps): update actions/cache action to v3 (#1951)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-12-31 09:02:33 -09:00
renovate[bot]
745a7f481b chore(deps): update actions/checkout action to v3 (#1952)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-12-31 09:02:19 -09:00
renovate[bot]
cd45f09075 chore(deps): update actions/setup-node action to v3 (#1953)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-12-31 09:02:07 -09:00
renovate[bot]
05a092215e chore(deps): update actions/setup-python action to v4 (#1955)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-12-31 09:01:44 -09:00
Hayden
e281f53488 chore: refactor-docker-structure (#1948)
* move dockerfiles to dedicated folder

* consolidate docker related files to docker dir

* update CI references

* experimental omni style container

* update makefile commands

* update references

* fix whitespace

* single container docs

* update build paths

* adds omni style build

* set context
2022-12-31 09:01:15 -09:00
Michael Genson
c4eebaccca Fix for shopping list recipe delete route (#1954)
* fixed broken types

* changed remove recipe route from delete to post
2022-12-30 22:09:22 -09:00
Michael Genson
46cc3898ab feat: Improved Recipe Scaling Support and Shopping List Recipe Refactor (#1847)
* propogate scale changes to print view

* fixed incorrect variable reference

* refactored shopping list recipe routes
cleaned up existing logic
added support for recipe scaling

* updated current revision

* adding to shopping list respects UI recipe scale

* added field annotations

* added tests for recipe scaling

* made column nullable and set to 1 during migration
2022-12-30 13:47:35 -09:00
Hayden
d9c39cc1d0 chore: bump aiofiles, dotenv, fastapi, pydantic, uvicorn (#1944)
* update aiofiles and dotenv

* bump fastapi and pydantic

* update testclient

* bump ruff and uvicorn
2022-12-30 11:44:54 -09:00
renovate[bot]
28cdd485f3 chore(deps): update actions/setup-node action to v2.5.1 (#1935)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-12-30 11:38:43 -09:00
Hayden
e08cccb1f6 fix #1940 (#1942) 2022-12-30 11:27:44 -09:00
renovate[bot]
2e51a581f0 fix(deps): update dependency aiofiles to v0.8.0 (#1926)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-12-30 11:12:25 -09:00
Hayden
7b5f42f9c0 New Crowdin updates (#1939)
* New translations en-US.json (Danish)

* New translations en-US.json (Danish)

* New translations en-US.json (Dutch)

* New translations en-US.json (Turkish)

* New translations en-US.json (German)

* New translations en-US.json (Italian)

* New translations en-US.json (German)

* New translations en-US.json (Ukrainian)
2022-12-30 11:12:08 -09:00
Hayden
37d0283426 New Crowdin updates (#1934)
* New translations en-US.json (Dutch)

* New translations en-US.json (German)
2022-12-29 16:11:17 -09:00
renovate[bot]
dc6cb5a0c3 fix(deps): update dependency tzdata to v2022 (#1933)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-12-29 16:11:07 -09:00
renovate[bot]
befb922739 chore(deps): update dependency rich to v12 (#1931)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-12-29 15:16:43 -09:00
renovate[bot]
36b6f1eecd chore(deps): update dependency ruff to ^0.0.200 (#1924)
* chore(deps): update dependency ruff to ^0.0.200

* resolve ruff errors

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2022-12-29 14:48:32 -09:00
renovate[bot]
3ed7bc14d8 chore(deps): update actions/cache action to v2.1.7 (#1923)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-12-29 14:24:21 -09:00
renovate[bot]
9236c1c09a Add renovate.json (#1922)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-12-29 14:22:02 -09:00
Hayden
3ae72cfda1 chore: fix poetry breaking changes (#1921)
* poetry stop breaking my things

* bump poetry version

* drop dependabot
2022-12-29 14:21:48 -09:00
Hayden
81e0c56484 New Crowdin updates (#1920)
* New translations en-US.json (French)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Romanian)

* New translations en-US.json (Spanish)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Catalan)

* New translations en-US.json (Czech)

* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (Greek)

* New translations en-US.json (Finnish)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Italian)

* New translations en-US.json (Japanese)

* New translations en-US.json (Korean)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Russian)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Swedish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (English, United Kingdom)

* New translations en-US.json (French, Canada)
2022-12-29 13:27:49 -09:00
dependabot[bot]
741471c670 fix(deps): bump @vueuse/core from 9.6.0 to 9.9.0 in /frontend (#1917)
Bumps [@vueuse/core](https://github.com/vueuse/vueuse/tree/HEAD/packages/core) from 9.6.0 to 9.9.0.
- [Release notes](https://github.com/vueuse/vueuse/releases)
- [Commits](https://github.com/vueuse/vueuse/commits/v9.9.0/packages/core)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-29 13:27:36 -09:00
dependabot[bot]
8732dc546d chore(deps-dev): bump vitest from 0.25.3 to 0.26.2 in /frontend (#1913)
Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 0.25.3 to 0.26.2.
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v0.26.2/packages/vitest)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-29 13:27:28 -09:00
dependabot[bot]
5992bc843a chore(deps-dev): bump eslint from 8.28.0 to 8.30.0 in /frontend (#1906)
Bumps [eslint](https://github.com/eslint/eslint) from 8.28.0 to 8.30.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.28.0...v8.30.0)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-29 13:27:18 -09:00
dependabot[bot]
c712e108bd fix(deps): bump core-js from 3.26.1 to 3.27.0 in /frontend (#1916)
Bumps [core-js](https://github.com/zloirock/core-js/tree/HEAD/packages/core-js) from 3.26.1 to 3.27.0.
- [Release notes](https://github.com/zloirock/core-js/releases)
- [Changelog](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zloirock/core-js/commits/v3.27.0/packages/core-js)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-29 13:05:49 -09:00
dependabot[bot]
49e05801c1 fix(deps): bump vuetify from 2.6.12 to 2.6.13 in /frontend (#1898)
Bumps [vuetify](https://github.com/vuetifyjs/vuetify/tree/HEAD/packages/vuetify) from 2.6.12 to 2.6.13.
- [Release notes](https://github.com/vuetifyjs/vuetify/releases)
- [Commits](https://github.com/vuetifyjs/vuetify/commits/v2.6.13/packages/vuetify)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-29 13:05:33 -09:00
dependabot[bot]
c9b268041c fix(deps): bump @mdi/js from 7.0.96 to 7.1.96 in /frontend (#1893)
Bumps [@mdi/js](https://github.com/Templarian/MaterialDesign-JS) from 7.0.96 to 7.1.96.
- [Release notes](https://github.com/Templarian/MaterialDesign-JS/releases)
- [Commits](https://github.com/Templarian/MaterialDesign-JS/compare/v7.0.96...v7.1.96)

---
updated-dependencies:
- dependency-name: "@mdi/js"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-29 13:05:18 -09:00
dependabot[bot]
643f4f5af3 chore(deps-dev): bump prettier from 2.8.0 to 2.8.1 in /frontend (#1889)
Bumps [prettier](https://github.com/prettier/prettier) from 2.8.0 to 2.8.1.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/2.8.0...2.8.1)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-29 13:04:56 -09:00
dependabot[bot]
d3fb16b64a chore(deps-dev): bump lint-staged from 13.0.4 to 13.1.0 in /frontend (#1882)
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 13.0.4 to 13.1.0.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v13.0.4...v13.1.0)

---
updated-dependencies:
- dependency-name: lint-staged
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-29 13:04:44 -09:00
jenscalaerts
83b8ce659e feat: improve automatic ingredient linking (#1836)
* Filtering special characters during automatic linking of ingredients to instructions

Used a unicode group to have a set of all unicode punctuation marks

* allowing for linking of ingredients to instruction at the beginning of a newline in the instruction

* Extracted ingredient matching into a composable and added tests. Ignoring 2 letter words to avoid false matches.

While testing the code 2 letter matches were a large source of false positives.
2022-12-29 13:00:31 -09:00
Michael Genson
19ae89a195 fix: Fixed API Token "Created On" date (#1909)
* exposed created_at on token schema

* fixed token createdAt reference

* made created_at optional for compatibility
2022-12-29 12:49:19 -09:00
Philipp Fischbeck
bd2bad29a8 chore: make admin maintenance pages localizable (#1914) 2022-12-29 12:48:49 -09:00
Hayden
a58701a297 New Crowdin updates (#1907)
* New translations en-US.json (Polish)

* New translations en-US.json (Polish)

* New translations en-US.json (Polish)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New translations en-US.json (French)

* New translations en-US.json (Turkish)
2022-12-29 12:48:25 -09:00
Hayden
35e73eb530 New Crowdin updates (#1886)
* New translations en-US.json (Danish)

* New translations en-US.json (Danish)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Italian)

* New translations en-US.json (Czech)

* New translations en-US.json (Turkish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (German)

* New translations en-US.json (Romanian)

* New translations en-US.json (French)

* New translations en-US.json (Spanish)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Catalan)

* New translations en-US.json (Danish)

* New translations en-US.json (Greek)

* New translations en-US.json (Finnish)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Italian)

* New translations en-US.json (Japanese)

* New translations en-US.json (Korean)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Swedish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (English, United Kingdom)

* New translations en-US.json (French, Canada)

* New translations en-US.json (German)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Dutch)

* New translations en-US.json (German)

* New translations en-US.json (Dutch)

* New translations en-US.json (Turkish)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Danish)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Portuguese)
2022-12-18 09:44:21 -09:00
Michael Genson
4e8e2d7510 Feat/recipe timeline event UI (#1831)
* added new icons

* added timeline badge and dialog to action menu

* more icons

* implemented timeline dialog using temporary API

* added route for fetching all timeline events

* formalized API call and added mobile-friendly view

* cleaned tags

* improved last made UI for mobile

* added event context menu with placeholder methods

* adjusted default made this date
set time to 1 minute before midnight
adjusted display to properly interpret UTC

* fixed local date display

* implemented update/delete routes

* fixed formating for long subjects

* added api error handling

* made everything localizable

* fixed weird formatting

* removed unnecessary async

* combined mobile/desktop views w/ conditional attrs
2022-12-11 12:16:55 -09:00
Hayden
f5d401a6a6 New Crowdin updates (#1883)
* New translations en-US.json (Lithuanian)

* New translations en-US.json (Lithuanian)
2022-12-05 10:06:49 -09:00
Hayden
58e91dc62a New Crowdin updates (#1875)
* New translations en-US.json (Lithuanian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (German)
2022-12-04 10:30:12 -09:00
Michael Genson
0e1d778d3a fix: delay dark mode loading to bypass vuetify bug (#1877) 2022-12-04 10:30:02 -09:00
Hayden
6111f9c88c New Crowdin updates (#1872)
* New translations en-US.json (Czech)

* New translations en-US.json (French)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (English, United Kingdom)

* New translations en-US.json (French, Canada)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Romanian)

* New translations en-US.json (Spanish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Catalan)

* New translations en-US.json (Czech)

* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (Greek)

* New translations en-US.json (Finnish)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Swedish)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Greek)

* New translations en-US.json (Norwegian)

* New translations en-US.json (German)

* New translations en-US.json (Romanian)

* New translations en-US.json (French)

* New translations en-US.json (Spanish)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Catalan)

* New translations en-US.json (Danish)

* New translations en-US.json (Finnish)

* New translations en-US.json (Slovak)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Italian)

* New translations en-US.json (Japanese)

* New translations en-US.json (Korean)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Italian)

* New translations en-US.json (Swedish)

* New translations en-US.json (English, United Kingdom)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Japanese)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Slovak)

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (French, Canada)

* New translations en-US.json (Turkish)

* New translations en-US.json (German)

* New translations en-US.json (French)

* New translations en-US.json (Dutch)

* New translations en-US.json (French)

* New translations en-US.json (German)

* New translations en-US.json (Dutch)

* New translations en-US.json (Turkish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Portuguese, Brazilian)
2022-12-01 16:25:27 -09:00
Michael Genson
1b9ff454fb feat: additional recipe sort behavior (#1858)
* changed default sort direction for certain attrs

* added workaround for filtering out null datetimes

* filtered out null-valued results for certain sorts

* removed unecessary parse

* used minyear instead of 1900
2022-11-30 20:59:30 -09:00
Philipp
33dffccaa5 feat: duplicate recipes (#1750)
* feature/frontend: Add duplicate button to recipe

* feature/backend: Add recipe duplication endpoint

* feature/frontend: add duplication API call

* Regenerate API docs

* Fix linter errors

* Fix backend linter error

* Move recipe duplication logic to recipe service

* Add test for recipe duplication

* Improve recipe ingredients copy test

* generate types

* import type

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2022-11-30 20:57:26 -09:00
dependabot[bot]
e73a72959c chore(deps-dev): bump lint-staged from 13.0.3 to 13.0.4 in /frontend (#1869)
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 13.0.3 to 13.0.4.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v13.0.3...v13.0.4)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-11-30 20:32:50 -09:00
Jambaldorj Ochirpurev
05dfe38f19 feat: add the fuzzy search on Categories, Tags, and Tools pages (#1867) 2022-11-30 20:31:16 -09:00
Michael Genson
b7ab16a7df fix: shopping list frontend throttling on bulk actions (#1853)
* pause refresh when updating list

* throttle recipe +/- to one concurrent request
2022-11-30 20:29:27 -09:00
Jambaldorj Ochirpurev
1c87a87627 feat: warn use when deleting self (#1848)
* add the alert component on User Management

* refactored the warning text into the language file
2022-11-30 20:26:50 -09:00
Patrick
0801f0a908 ci: add trivy image scanning (#1663)
* add trivy image scanning

* implement as partial workflow

* support both the frontend and backend Dockerfiles for scanning

* fix docker build context location
2022-11-30 20:21:46 -09:00
Hayden
82dc586bac chores: updates-and-linters (#1868)
* switch to ruff

* add ruff

* run ruff --fix

* update ruff

* resolve ruff errors

* drop isort from CI

* fix decorator order
2022-11-30 20:20:28 -09:00
Hayden
fd0e02a5c6 New Crowdin updates (#1866)
* New translations en-US.json (German)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New translations en-US.json (German)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Lithuanian)
2022-11-30 20:18:06 -09:00
dependabot[bot]
5bbc65d610 fix(deps): bump @vueuse/core from 9.5.0 to 9.6.0 in /frontend (#1850)
Bumps [@vueuse/core](https://github.com/vueuse/vueuse/tree/HEAD/packages/core) from 9.5.0 to 9.6.0.
- [Release notes](https://github.com/vueuse/vueuse/releases)
- [Commits](https://github.com/vueuse/vueuse/commits/v9.6.0/packages/core)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-11-27 11:53:00 -09:00
dependabot[bot]
b93ea9c747 chore(deps-dev): bump eslint-plugin-vue from 9.7.0 to 9.8.0 in /frontend (#1857)
Bumps [eslint-plugin-vue](https://github.com/vuejs/eslint-plugin-vue) from 9.7.0 to 9.8.0.
- [Release notes](https://github.com/vuejs/eslint-plugin-vue/releases)
- [Commits](https://github.com/vuejs/eslint-plugin-vue/compare/v9.7.0...v9.8.0)

---
updated-dependencies:
- dependency-name: eslint-plugin-vue
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-11-27 11:52:49 -09:00
dependabot[bot]
d541870c39 chore(deps-dev): bump eslint from 8.27.0 to 8.28.0 in /frontend (#1843)
Bumps [eslint](https://github.com/eslint/eslint) from 8.27.0 to 8.28.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.27.0...v8.28.0)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-11-27 11:52:40 -09:00
dependabot[bot]
54f9d1df15 chore(deps-dev): bump prettier from 2.7.1 to 2.8.0 in /frontend (#1855)
Bumps [prettier](https://github.com/prettier/prettier) from 2.7.1 to 2.8.0.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/2.7.1...2.8.0)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-11-27 11:52:28 -09:00
Hayden
e968cca30a New Crowdin updates (#1856)
* New translations en-US.json (Norwegian)

* New translations en-US.json (German)

* New translations en-US.json (Catalan)

* New translations en-US.json (Romanian)

* New translations en-US.json (French)

* New translations en-US.json (Spanish)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Swedish)

* New translations en-US.json (Czech)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (English, United Kingdom)

* New translations en-US.json (Russian)

* New translations en-US.json (Japanese)

* New translations en-US.json (Polish)

* New translations en-US.json (Dutch)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Korean)

* New translations en-US.json (Turkish)

* New translations en-US.json (Italian)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (Norwegian)

* New translations en-US.json (French, Canada)
2022-11-27 11:41:42 -09:00
Michael Genson
ba8f021c14 chore: bump recipe-scraper to latest (#1835) 2022-11-27 11:39:43 -09:00
dependabot[bot]
782b2ee827 chore(deps-dev): bump vitest from 0.25.1 to 0.25.3 in /frontend (#1849)
Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 0.25.1 to 0.25.3.
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v0.25.3/packages/vitest)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-11-27 11:38:49 -09:00
dependabot[bot]
fcf785d3a3 chore(deps-dev): bump @vue/runtime-dom in /frontend (#1826)
Bumps [@vue/runtime-dom](https://github.com/vuejs/core/tree/HEAD/packages/runtime-dom) from 3.2.41 to 3.2.45.
- [Release notes](https://github.com/vuejs/core/releases)
- [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/core/commits/v3.2.45/packages/runtime-dom)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-11-27 11:38:31 -09:00
dependabot[bot]
8c04888476 fix(deps): bump isomorphic-dompurify from 0.23.0 to 0.24.0 in /frontend (#1825)
Bumps [isomorphic-dompurify](https://github.com/kkomelin/isomorphic-dompurify) from 0.23.0 to 0.24.0.
- [Release notes](https://github.com/kkomelin/isomorphic-dompurify/releases)
- [Commits](https://github.com/kkomelin/isomorphic-dompurify/compare/v0.23.0...v0.24.0)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-11-27 11:37:54 -09:00
dependabot[bot]
5fbd0a42fd fix(deps): bump core-js from 3.26.0 to 3.26.1 in /frontend (#1823)
Bumps [core-js](https://github.com/zloirock/core-js/tree/HEAD/packages/core-js) from 3.26.0 to 3.26.1.
- [Release notes](https://github.com/zloirock/core-js/releases)
- [Changelog](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zloirock/core-js/commits/v3.26.1/packages/core-js)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-11-27 11:37:38 -09:00
Hayden
4b7a1af10b docs: add diagram and notes on sharing recipes (#1865) 2022-11-27 11:29:36 -09:00
Hayden
32c4ce4536 fix: planner date picker local and starting day (#1864)
* fix type definitions

* use day of week setting + fix multiple type errors

* add locale for yyyy-mm-dd format
2022-11-27 11:01:56 -09:00
Hayden
3ad3d92e5f feat: allow password change via container CLI (#1863)
* add password change script

* rename file

* add note in FAQ
2022-11-27 10:35:21 -09:00
Jambaldorj Ochirpurev
ac6554efdd fix: text overflow on RecipeCard (#1830)
* fix the text overflow on RecipeCard

* add a wrapper class for description text for recipes
2022-11-27 10:33:03 -09:00
Hayden
01aac0ca5d docs: account-unlock (#1862)
* fix #1854

* generate spec

* add note about unlock script to FAQ
2022-11-27 10:17:43 -09:00
dependabot[bot]
8ec60668e6 chore(deps-dev): bump @nuxtjs/eslint-config-typescript in /frontend (#1837)
Bumps [@nuxtjs/eslint-config-typescript](https://github.com/nuxt/eslint-config) from 11.0.0 to 12.0.0.
- [Release notes](https://github.com/nuxt/eslint-config/releases)
- [Changelog](https://github.com/nuxt/eslint-config/blob/main/CHANGELOG.md)
- [Commits](https://github.com/nuxt/eslint-config/compare/v11.0.0...v12.0.0)

---
updated-dependencies:
- dependency-name: "@nuxtjs/eslint-config-typescript"
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-11-19 12:01:23 -09:00
Hayden
46f9ef19c8 New Crowdin updates (#1822)
* New translations en-US.json (Turkish)

* New translations en-US.json (Turkish)
2022-11-14 12:43:08 -09:00
Michael Genson
a2dcdc1adf feat: "I Made This" Dialog (#1801)
* added chef hat

* removed unnecessary log

* modified recipe and recipe timeline event schema
changed timeline event "message" -> "event_message"
added "last made" timestamp to recipe

* added "I made this" dialog to recipe action menu

* added missing field and re-ran code-gen

* moved dialog out of context menu and refactored
removed references in action menu and context menu
refactored dialog to be triggered by a button instead
added route to update recipe last made timestamp
added visual for last made timestamp to recipe header and title

* added sorting by last made

* switched event type to comment

* replaced alter column with pydantic alias

* added tests for event message alias
2022-11-13 14:12:53 -09:00
Hayden
f0e6496001 New Crowdin updates (#1817)
* New translations en-US.json (Czech)

* New translations en-US.json (Czech)

* New translations en-US.json (Czech)

* New translations en-US.json (Czech)
2022-11-13 14:11:36 -09:00
Felix
cb36258c0f Update example docker compose to beta5 (#1815) 2022-11-12 08:23:01 -09:00
Jambaldorj Ochirpurev
703cfd7da2 fix: auto-opening sidebar #1090 (#1787)
* updated the sidebar; on mobile devices, the sidebar will be closed by default

* updated the AppSideBar

* change variable name

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2022-11-10 15:41:16 -09:00
dependabot[bot]
2a797a210b fix(deps): bump @nuxtjs/auth-next in /frontend (#1799)
Bumps [@nuxtjs/auth-next](https://github.com/nuxt-community/auth-module) from 5.0.0-1624817847.21691f1 to 5.0.0-1667386184.dfbbb54.
- [Release notes](https://github.com/nuxt-community/auth-module/releases)
- [Changelog](https://github.com/nuxt-community/auth-module/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/nuxt-community/auth-module/commits)

---
updated-dependencies:
- dependency-name: "@nuxtjs/auth-next"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-11-10 15:34:53 -09:00
dependabot[bot]
00ab10b8a6 fix(deps): bump @vueuse/core from 9.3.1 to 9.5.0 in /frontend (#1809)
Bumps [@vueuse/core](https://github.com/vueuse/vueuse/tree/HEAD/packages/core) from 9.3.1 to 9.5.0.
- [Release notes](https://github.com/vueuse/vueuse/releases)
- [Commits](https://github.com/vueuse/vueuse/commits/v9.5.0/packages/core)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-11-10 15:26:49 -09:00
dependabot[bot]
d30c633928 chore(deps-dev): bump vitest from 0.24.3 to 0.25.1 in /frontend (#1808)
Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 0.24.3 to 0.25.1.
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v0.25.1/packages/vitest)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-11-10 15:26:37 -09:00
dependabot[bot]
ca47838920 chore(deps-dev): bump eslint from 8.26.0 to 8.27.0 in /frontend (#1807)
Bumps [eslint](https://github.com/eslint/eslint) from 8.26.0 to 8.27.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.26.0...v8.27.0)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-11-10 15:26:28 -09:00
dependabot[bot]
f8900531e5 chore(deps-dev): bump eslint-plugin-vue from 9.6.0 to 9.7.0 in /frontend (#1794)
Bumps [eslint-plugin-vue](https://github.com/vuejs/eslint-plugin-vue) from 9.6.0 to 9.7.0.
- [Release notes](https://github.com/vuejs/eslint-plugin-vue/releases)
- [Commits](https://github.com/vuejs/eslint-plugin-vue/compare/v9.6.0...v9.7.0)

---
updated-dependencies:
- dependency-name: eslint-plugin-vue
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-11-10 15:26:12 -09:00
1848
f0ed2ad115 feat: allow to overwrite data dir (#1703)
New env variable "DATA_DIR" to overwrite data dir.

Co-authored-by: e <e@e.e>
2022-11-10 15:18:40 -09:00
Michael Genson
e7de0c90a1 feature: live shopping list updates (#1730)
* added polling for changes every 5 seconds

* fixed demi import

* stop polling if the refresh fails too many times

* only poll for changes when the user is active
2022-11-10 15:17:49 -09:00
Hayden
89d0cae51d refactor: rewrite cleaner functions for parsing recipe dicts (#1743)
* rewrite cleaner functions

* unify verbage

* try importing dep during check

* fix syntax

* allow override defaults

* satisfy mypy
2022-11-10 15:16:51 -09:00
Hayden
77316d639b New Crowdin updates (#1795)
* New translations en-US.json (Norwegian)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)
2022-11-10 14:53:24 -09:00
Michael Genson
6ee64535df feat: recipe timeline backend api (#1685)
* added recipe_timeline_events table to db

* added schema and routes for recipe timeline events

* added missing mixin and fixed update schema

* added tests

* adjusted migration revision tree

* updated alembic revision test

* added initial timeline event for new recipes

* added additional tests

* added event bus support

* renamed event_dt to timestamp

* add timeline_events to ignore list

* run code-gen

* use new test routes implementation

* use doc string syntax

* moved event type enum from db to schema

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2022-11-01 00:12:26 -08:00
Hayden
714a080ecb New Crowdin updates (#1783)
* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New translations en-US.json (German)

* New translations en-US.json (Polish)
2022-11-01 00:11:40 -08:00
Michael Genson
0dfb3a84cb fix: properly format SMTP from address/name (#1782) 2022-10-27 10:46:53 -08:00
Michael Genson
1e3c0b0859 fix: recipe rating display (#1779)
* remove rating from recipe title

* fixed rating not rendering on landscape mode
2022-10-27 10:45:52 -08:00
dependabot[bot]
49e24140bb fix(deps): bump core-js from 3.25.5 to 3.26.0 in /frontend (#1764)
Bumps [core-js](https://github.com/zloirock/core-js/tree/HEAD/packages/core-js) from 3.25.5 to 3.26.0.
- [Release notes](https://github.com/zloirock/core-js/releases)
- [Changelog](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zloirock/core-js/commits/v3.26.0/packages/core-js)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-10-26 09:41:56 -08:00
dependabot[bot]
0978d8675d chore(deps-dev): bump eslint from 8.25.0 to 8.26.0 in /frontend (#1763)
Bumps [eslint](https://github.com/eslint/eslint) from 8.25.0 to 8.26.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.25.0...v8.26.0)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-10-26 09:41:48 -08:00
Hayden
c12ef60038 chore: shorten frontend build time (#1772) 2022-10-25 22:53:30 -08:00
Hayden
ee121a12f8 New Crowdin updates (#1769)
* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)
2022-10-25 09:28:46 -08:00
Hayden
5a41e1d02d update workflow to properly grab tag 2022-10-25 09:27:30 -08:00
Hayden
3f5aab6fae chore: bump version + change-log notice (#1766) 2022-10-24 18:13:27 -08:00
Hayden
84c23765cd fix: strict optional errors (#1759)
* fix strict optional errors

* fix typing in repository

* fix backup db files location

* update workspace settings
2022-10-23 13:04:04 -08:00
Hayden
97d9e2a109 chore: lint-and-fix-vue-demi-imports (#1762)
* lint for 'vue-demi' imports

* fix invalid imports
2022-10-23 13:02:56 -08:00
Akash Kundu
46161ef12b docs(update): Fixed grammatical errors and typos (#1748)
A few grammatical errors and typos were fixed. @hay-kot Please review.
2022-10-23 12:25:22 -08:00
Hayden
d6e8602db5 New Crowdin updates (#1760)
* New translations en-US.json (Norwegian)

* New translations en-US.json (Norwegian)
2022-10-23 11:31:02 -08:00
Hayden
83a076bd8b feat: improve idle memory usage (#1758)
* health check as python script

* install crfpp model via python

* drop curl from finale container

* use uvicorn by default w/ gunicorn as opt in

* recommend setting mem limit for container
2022-10-22 20:00:13 -08:00
Hayden
c5613694d9 fix: display food label if no label present (#1757)
The only label that was applied to the shopping list view was one that was manually assigned. Now we first check if the item has a label, if not we check if the food has a label, then if there really is no label we display nothing.
2022-10-22 13:00:10 -08:00
Hayden
2e11e57e0a feat: fix recipe rating overwriting (#1756)
Previously, the recipe-ratings component would not sync to the v-modeled value when doing it's own updating. This PR fixes that issue and ensures that the value is pushed up to the parent whether in emit only mode or not.
2022-10-22 12:54:47 -08:00
Hayden
ce4315f971 chore: drop legacy editor (#1755)
* drop legacy editor

* remove unused components
2022-10-22 12:49:59 -08:00
Hayden
fcc5d99d40 chore: frontend testing setup (#1739)
* add vitest

* initialize lib w/ tests

* move to dev dep

* run tests in CI

* update file names

* move api folder to lib

* move api and api types to same folder

* update generator outpath

* rm husky

* i guess i _did_ need those types

* reorg types

* extract validators into testable components

* (WIP) start composable testing

* fix import type

* fix linter complaint

* simplify icon type def

* fix linter errors (maybe?)

* rename client file for sorting
2022-10-22 11:51:07 -08:00
Hayden
9f6bcc83d5 fix: apply API_PORT in containers (#1754) 2022-10-22 11:43:03 -08:00
Hayden
0d953da5b0 fix: require python-dateutil in dependencies (#1752) 2022-10-22 10:44:32 -08:00
Hayden
a56bedb022 fix: mis-ordered shoppinglist after checking item (#1749) 2022-10-21 20:35:45 -08:00
Hayden
558789cd02 fix firefox drag and drop + add visual indicator (#1747) 2022-10-21 20:01:08 -08:00
dependabot[bot]
bc99884438 fix(deps): bump vuetify from 2.6.11 to 2.6.12 in /frontend (#1740)
Bumps [vuetify](https://github.com/vuetifyjs/vuetify/tree/HEAD/packages/vuetify) from 2.6.11 to 2.6.12.
- [Release notes](https://github.com/vuetifyjs/vuetify/releases)
- [Commits](https://github.com/vuetifyjs/vuetify/commits/v2.6.12/packages/vuetify)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-10-21 19:14:27 -08:00
Hayden
0bb1b6500f refactor: implement email with stdlib and drop email dependency (#1746)
* implement email with stdlib and drop dependency

* potentially provide in logs
2022-10-21 19:12:27 -08:00
Hayden
d53e78317d fix: advanced search now saved in URL (#1745)
* use query param for toggle state

* close #1678
2022-10-21 17:34:13 -08:00
Hayden
c9929745f8 fix: properly check recipe settings using database value (#1744)
* fix #1742

* bump depts to bust cache

* revert regression

* ensure permission checked on delete
2022-10-21 16:48:31 -08:00
Miroito
a59d1ae2f9 fix: min-original not saved (#1716) 2022-10-21 16:04:51 -08:00
Hayden
9ecef4c25f chore: file generation cleanup (#1736)
This PR does too many things :( 

1. Major refactoring of the dev/scripts and dev/code-generation folders. 

Primarily this was removing duplicate code and cleaning up some poorly written code snippets as well as making them more idempotent so then can be re-run over and over again but still maintain the same results. This is working on my machine, but I've been having problems in CI and comparing diffs so running generators in CI will have to wait. 

2. Re-Implement using the generated api routes for testing

This was a _huge_ refactor that touched damn near every test file but now we have auto-generated typed routes with inline hints and it's used for nearly every test excluding a few that use classes for better parameterization. This should greatly reduce errors when writing new tests. 

3. Minor Perf improvements for the All Recipes endpoint

  A. Removed redundant loops
  B. Uses orjson to do the encoding directly and returns a byte response instead of relying on the default 
       jsonable_encoder.

4. Fix some TS type errors that cropped up for seemingly no reason half way through the PR.

See this issue https://github.com/phillipdupuis/pydantic-to-typescript/issues/28

Basically, the generated TS type is not-correct since Pydantic will automatically fill in null fields. The resulting TS type is generated with a ? to indicate it can be null even though we _know_ that i can't be.
2022-10-18 14:49:41 -08:00
Hayden
a8f0fb14a7 chore: upgrade pre-commit hooks (#1735)
* change pep585 hook to pyupgrade

* run pyupgrade + cleanup lint errors
2022-10-17 14:37:06 -08:00
Hayden
e516a2e801 fix: unclosed sessions (#1734)
* resolve session leak

* cleanup session management functions
2022-10-17 14:11:40 -08:00
dependabot[bot]
a3904c45d8 fix(deps): bump @vueuse/core from 9.3.0 to 9.3.1 in /frontend (#1732)
Bumps [@vueuse/core](https://github.com/vueuse/vueuse/tree/HEAD/packages/core) from 9.3.0 to 9.3.1.
- [Release notes](https://github.com/vueuse/vueuse/releases)
- [Commits](https://github.com/vueuse/vueuse/commits/v9.3.1/packages/core)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-10-17 13:37:55 -08:00
dependabot[bot]
61ba16ad26 chore(deps-dev): bump @vue/runtime-dom in /frontend (#1731)
Bumps [@vue/runtime-dom](https://github.com/vuejs/core/tree/HEAD/packages/runtime-dom) from 3.2.40 to 3.2.41.
- [Release notes](https://github.com/vuejs/core/releases)
- [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/core/commits/v3.2.41/packages/runtime-dom)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-10-17 13:37:47 -08:00
Hayden
2914553084 New translations en-US.json (French) (#1717) 2022-10-15 12:36:51 -08:00
dependabot[bot]
1062ad9d97 chore(deps-dev): bump eslint from 8.24.0 to 8.25.0 in /frontend (#1718)
Bumps [eslint](https://github.com/eslint/eslint) from 8.24.0 to 8.25.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.24.0...v8.25.0)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-10-15 12:36:40 -08:00
dependabot[bot]
ed7849d92d fix(deps): bump isomorphic-dompurify from 0.22.0 to 0.23.0 in /frontend (#1708)
Bumps [isomorphic-dompurify](https://github.com/kkomelin/isomorphic-dompurify) from 0.22.0 to 0.23.0.
- [Release notes](https://github.com/kkomelin/isomorphic-dompurify/releases)
- [Commits](https://github.com/kkomelin/isomorphic-dompurify/compare/v0.22.0...v0.23.0)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-10-08 12:46:48 -08:00
dependabot[bot]
07b2692927 fix(deps): bump vuetify from 2.6.10 to 2.6.11 in /frontend (#1702)
Bumps [vuetify](https://github.com/vuetifyjs/vuetify/tree/HEAD/packages/vuetify) from 2.6.10 to 2.6.11.
- [Release notes](https://github.com/vuetifyjs/vuetify/releases)
- [Commits](https://github.com/vuetifyjs/vuetify/commits/v2.6.11/packages/vuetify)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-10-08 12:46:30 -08:00
dependabot[bot]
03be764ce7 chore(deps-dev): bump eslint-plugin-vue from 9.5.1 to 9.6.0 in /frontend (#1701)
Bumps [eslint-plugin-vue](https://github.com/vuejs/eslint-plugin-vue) from 9.5.1 to 9.6.0.
- [Release notes](https://github.com/vuejs/eslint-plugin-vue/releases)
- [Commits](https://github.com/vuejs/eslint-plugin-vue/compare/v9.5.1...v9.6.0)

---
updated-dependencies:
- dependency-name: eslint-plugin-vue
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-10-08 12:46:14 -08:00
Hayden
5cfa276475 New Crowdin updates (#1712)
* New translations en-US.json (French)

* New translations en-US.json (French)
2022-10-08 12:45:47 -08:00
dependabot[bot]
f5440652a8 fix(deps): bump core-js from 3.25.4 to 3.25.5 in /frontend (#1699)
Bumps [core-js](https://github.com/zloirock/core-js) from 3.25.4 to 3.25.5.
- [Release notes](https://github.com/zloirock/core-js/releases)
- [Changelog](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zloirock/core-js/compare/v3.25.4...v3.25.5)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-10-03 19:27:51 -08:00
Michael Genson
e088719ddc fix: default null recipe quantities to zero when adding to shopping list (#1677)
* default null recipe quantities to zero

* simplify validation

* remove unused import

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2022-10-03 08:23:01 -08:00
dependabot[bot]
332870f608 fix(deps): bump @vueuse/core from 9.2.0 to 9.3.0 in /frontend (#1679)
Bumps [@vueuse/core](https://github.com/vueuse/vueuse/tree/HEAD/packages/core) from 9.2.0 to 9.3.0.
- [Release notes](https://github.com/vueuse/vueuse/releases)
- [Commits](https://github.com/vueuse/vueuse/commits/v9.3.0/packages/core)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-10-03 08:13:52 -08:00
dependabot[bot]
8280099dc5 chore(deps-dev): bump @vue/runtime-dom in /frontend (#1686)
Bumps [@vue/runtime-dom](https://github.com/vuejs/core/tree/HEAD/packages/runtime-dom) from 3.2.39 to 3.2.40.
- [Release notes](https://github.com/vuejs/core/releases)
- [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/core/commits/v3.2.40/packages/runtime-dom)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-10-02 18:15:29 -08:00
dependabot[bot]
52e07e4f21 fix(deps): bump core-js from 3.25.3 to 3.25.4 in /frontend (#1696)
Bumps [core-js](https://github.com/zloirock/core-js) from 3.25.3 to 3.25.4.
- [Release notes](https://github.com/zloirock/core-js/releases)
- [Changelog](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zloirock/core-js/compare/v3.25.3...v3.25.4)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-10-02 18:15:16 -08:00
Hayden
a3a66055e0 chore: update poetry install to match current docs (#1695) 2022-10-02 16:47:10 -08:00
Patrick
eca54e6474 rev poetry version (#1664) 2022-10-02 16:33:49 -08:00
Hayden
6159b55be9 fix: image and CI errors (#1694)
* bump cache version

* bump version

* delete template file

* maybe fix invalid CI?

* chain status command

* fix add tesseract bin to container & bump poetry (#1676)

* Add tesseract bin to container

* Add tesseract bin

Co-authored-by: Miroito <88556823+Miroito@users.noreply.github.com>
2022-10-02 16:24:13 -08:00
Hayden
47e7783ef5 New Crowdin updates (#1683)
* New translations en-US.json (Czech)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Danish)
2022-10-02 16:18:09 -08:00
dependabot[bot]
2c04393501 fix(deps): bump core-js from 3.25.2 to 3.25.3 in /frontend (#1675)
Bumps [core-js](https://github.com/zloirock/core-js) from 3.25.2 to 3.25.3.
- [Release notes](https://github.com/zloirock/core-js/releases)
- [Changelog](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zloirock/core-js/compare/v3.25.2...v3.25.3)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-10-02 16:15:52 -08:00
dependabot[bot]
7aa7945647 chore(deps-dev): bump eslint from 8.23.1 to 8.24.0 in /frontend (#1673)
Bumps [eslint](https://github.com/eslint/eslint) from 8.23.1 to 8.24.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.23.1...v8.24.0)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-10-02 16:15:40 -08:00
Hayden
ef481a6a9c New Crowdin updates (#1672)
* New translations en-US.json (Turkish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Swedish)

* New translations en-US.json (Japanese)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (English, United Kingdom)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Romanian)

* New translations en-US.json (Spanish)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Catalan)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Czech)

* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (Greek)

* New translations en-US.json (Finnish)

* New translations en-US.json (Hebrew)

* New translations en-US.json (French, Canada)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (Turkish)

* New translations en-US.json (French, Canada)

* New translations en-US.json (French, Canada)

* New translations en-US.json (Danish)

* New translations en-US.json (Danish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Spanish)

* New translations en-US.json (Spanish)
2022-09-27 18:55:35 -08:00
Michael Genson
796e55b7d5 refactor: webhook events (#1661)
* refactored EventBusService to work outside FastAPI

* extended event models

* refactored webhooks to run through event bus

* added basic webhook test route

* changed get_all to page_all

* fixed incorrectly implemented Vue variables

* fixed broken webhook test

* changed factory from staticmethod to classmethod

* made query boundary definitions easier to read
2022-09-27 18:55:20 -08:00
Miroito
025f1bc603 feat: press enter to create a shopping list! (#1657)
* feat/press enter to create list

* Press enter to submit base dialogs
2022-09-27 18:54:28 -08:00
Michael Genson
8271c3001e feat: add support for API extras on shopping lists, shopping list items, and food data (#1619)
* added api extras to other tables
genericized api extras model from recipes
added extras column to ingredient foods
added extras column to shopping lists
added extras column to shopping list items

* updated alembic version test

* made mypy happy

* added TODO on test that does nothing

* added extras tests for lists, items, and foods

* added docs for new extras

* modified alembic versions to eliminate branching
2022-09-27 18:53:22 -08:00
Hayden
db70a210a2 fix concurrent builds 2022-09-25 16:10:18 -08:00
Hayden
1d204e9f48 backend: bump deps (#1671) 2022-09-25 16:01:25 -08:00
Michael Genson
d3da551dae feat: add profile update suggestion to members page (#1669) 2022-09-25 15:19:26 -08:00
Hayden
124ec3743a New Crowdin updates (#1667)
* New translations en-US.json (Norwegian)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)
2022-09-25 15:17:56 -08:00
Ben Boeckel
2e6b877ba9 docs: fix typos (#1665)
* docs: fix typos

* typos: fix typos found by `codespell` across the codebase

* docs: fix `macOS` spelling

* docs: fix `authentification` terminology

"Authentification" is not a thing.

* docs: fix `localhost` typo in example link

* typos: fix in-code typos

These are potentially higher risk, but no other mentions of these typos
show up in the codebase.
2022-09-25 15:17:27 -08:00
dependabot[bot]
33dad80eff chore(deps-dev): bump @types/sortablejs in /frontend (#1655)
Bumps [@types/sortablejs](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/sortablejs) from 1.13.0 to 1.15.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/sortablejs)

---
updated-dependencies:
- dependency-name: "@types/sortablejs"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-09-25 15:02:59 -08:00
dependabot[bot]
77622e0257 fix(deps): bump core-js from 3.25.1 to 3.25.2 in /frontend (#1654)
Bumps [core-js](https://github.com/zloirock/core-js) from 3.25.1 to 3.25.2.
- [Release notes](https://github.com/zloirock/core-js/releases)
- [Changelog](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zloirock/core-js/compare/v3.25.1...v3.25.2)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-09-25 15:02:35 -08:00
dependabot[bot]
6f301276a7 chore(deps-dev): bump eslint-plugin-vue from 9.4.0 to 9.5.1 in /frontend (#1653)
Bumps [eslint-plugin-vue](https://github.com/vuejs/eslint-plugin-vue) from 9.4.0 to 9.5.1.
- [Release notes](https://github.com/vuejs/eslint-plugin-vue/releases)
- [Commits](https://github.com/vuejs/eslint-plugin-vue/compare/v9.4.0...v9.5.1)

---
updated-dependencies:
- dependency-name: eslint-plugin-vue
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-09-25 15:02:23 -08:00
Hayden
39adea4ee3 feat (WIP): bring png OCR scanning support (#1670)
* Add pytesseract

* Add simple ocr endpoint

replace extension argument

* feat/ocr-editor gui

* fix frontend linting issues

* Add service unit tests

* Add split text modes & single ingredient/instruction editing

* make split mode really reactive

* Remove default step and ingredient

* make the linter haappy

* Accept only image uploads

* Add automatic recipe title suggestion

* Correct regex

* fix incorrect array.map method usage

* make the linter happy again

* Swap route to use asset name

* Rearange buttons

* fix test data

* feat: Allow making image the recipe image

* Add translation

* Make the linter happy

* Restrict function setPropertyValueByPath generic

* Restrict template literal type

* Add a more friendly icon to creation page

* update poetry lock file

* Correct sloppy ocr classes

* Make MyPy happy

* Rewrite safer tests

* Add tesseract to backend test CI container dependencies

* Make canvas element a component global

* Remove unwanted spaces in selected text

* Add way to know if recipe was created with ocr

* Access to ocr-editor for ocr recipes

* Update Alembic revision

* Make the frontend build

* Fix scrolling offset bug

* Allow creation of recipes with custom settings

* Fix rebasing mistakes

* Add format_tsv_output test

* Exclude the tests data directory only

* Enforce camelCase for frontend functions

* Remove import of unused component

* Fix type and class initialization

* Add multi-language support

* Highlight words in mount

* Fix image ratio bug

* Better ocr creation page

* Revert awkward feature to scroll in Selection mode

* Rebasing alembic migrations sux

* Remove obsolete getShared function

* Add function docstring

* Move down ocr creation option

* Make toolbar icons more generic

* Show help at the bottom of the page

* move ocr types to own file

* Use template ref for the canvas

* Use i18n.tc to get strings directly

* Correct naming mistake

* Move Ocr editor to own directory

* Create Ocr Editor parts

* Safeguard recipe properties access

* Add loading frontend animation due to longer request time

* minor cleanup chores

Co-authored-by: Miroito <alban.vachette@gmail.com>
2022-09-25 15:00:45 -08:00
Hayden
a8f3922907 New Crowdin updates (#1652)
* New translations en-US.json (Turkish)

* New translations en-US.json (Turkish)
2022-09-21 18:53:44 -08:00
dependabot[bot]
0dab4012d2 chore(deps-dev): bump @babel/eslint-parser in /frontend (#1651)
Bumps [@babel/eslint-parser](https://github.com/babel/babel/tree/HEAD/eslint/babel-eslint-parser) from 7.18.9 to 7.19.1.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.19.1/eslint/babel-eslint-parser)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-09-16 14:58:13 -08:00
Elegant
11eeab1b51 feat: LDAP improvements (#1487)
* Use Base DN for LDAP and fetch user attrs

Requires that a Base DN be set for LDAP
Set `full_name` and `email` based on LDAP attributes when creating user

* Add support for secure LDAP

Allow insecure LDAP connection (disabled by default)
Use CA when connecting to secure LDAP server

* Added missing quotes to example

* Update security.py

* Update security.py formatting

* Update security.py

Switched to f-String formatting

* formatting

* Update test_security.py

Added at attributes for testing

* Update test_security.py

Modified tests for base DN

* Update test_security.py

Set proper base DN for testing

* Update test_security.py

Corrected testing for LDAP

* Update test_security.py

Defined base_dn

* Authenticated user not in base DN

Add check for when user can authenticate but is not in base DN

* Update test_security.py

LDAP user cannot exist as it is searched before it is created and the list returns False

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2022-09-15 19:33:36 -08:00
dependabot[bot]
21161321e4 chore(deps-dev): bump eslint from 8.23.0 to 8.23.1 in /frontend (#1642)
Bumps [eslint](https://github.com/eslint/eslint) from 8.23.0 to 8.23.1.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.23.0...v8.23.1)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-09-15 15:55:00 -08:00
dependabot[bot]
38900e6773 fix(deps): bump date-fns from 2.29.2 to 2.29.3 in /frontend (#1648)
Bumps [date-fns](https://github.com/date-fns/date-fns) from 2.29.2 to 2.29.3.
- [Release notes](https://github.com/date-fns/date-fns/releases)
- [Changelog](https://github.com/date-fns/date-fns/blob/v2.29.3/CHANGELOG.md)
- [Commits](https://github.com/date-fns/date-fns/compare/v2.29.2...v2.29.3)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-09-15 15:54:42 -08:00
dependabot[bot]
fad02757d9 fix(deps): bump vuetify from 2.6.9 to 2.6.10 in /frontend (#1643)
Bumps [vuetify](https://github.com/vuetifyjs/vuetify/tree/HEAD/packages/vuetify) from 2.6.9 to 2.6.10.
- [Release notes](https://github.com/vuetifyjs/vuetify/releases)
- [Commits](https://github.com/vuetifyjs/vuetify/commits/v2.6.10/packages/vuetify)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-09-15 15:54:25 -08:00
Michael Genson
86d25691d2 fix: defaults recipe actions to sort by name, ascending (#1650) 2022-09-15 15:53:58 -08:00
Hayden
1488b75b65 New Crowdin updates (#1645)
* New translations en-US.json (French)

* New translations en-US.json (Turkish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Turkish)
2022-09-15 15:53:39 -08:00
Hayden
b56b987f5a chore: fix demo links (#1639)
* remove matrix builds

* replace beta.mealie.io w/ demo.mealie.io
2022-09-12 13:07:51 -08:00
Hayden
5337eaf1aa revert changes 2022-09-11 10:14:42 -08:00
Hayden
0e7dc75557 remove deps 2022-09-11 10:06:15 -08:00
Hayden
24cf21677c troubleshoot deploy-demo workflow 2022-09-11 10:05:50 -08:00
Philipp Fischbeck
c3459d540b fix: properly set "advanced features" during user registration (#1638)
Previously, "advanced features" was per group, not per user. With this change, this is now properly submitted on user registration. The "seed data" setting is also per group.
2022-09-11 09:56:23 -08:00
Hayden
5105b13219 publish docs on release 2022-09-10 16:22:35 -08:00
Hayden
ed1146f5fb add pip to dependabot 2022-09-10 16:19:17 -08:00
Hayden
9731317082 integrate demo deploy into CI 2022-09-10 15:56:46 -08:00
Hayden
80639d6968 split builders into to jobs 2022-09-10 13:45:06 -08:00
Hayden
a5472d7274 remove version 2022-09-10 11:14:11 -08:00
Hayden
6d818fe5bc add secrets 2022-09-10 11:13:40 -08:00
Hayden
7231c842c0 use relative refs 2022-09-10 11:10:28 -08:00
Hayden
e989651336 chore: cleanup actions and allow reuse + pr template (#1637)
* cleanup actions and allow reuse

* add PR template
2022-09-10 10:58:02 -08:00
Mirko Jeličić
2df791b80b feat: add option to stay in edit mode after loading from URL. (#1524)
* Add option to stay in edit mode after loading from URL.

* Stay in Edit mode now default behaviour after scraping recipe from URL.

* Fix missing param error.

* Fix incorrect read of boolean variable.

* Fix stupid error due to not understanding Vue.

* minor style and bug fixes

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2022-09-10 10:21:57 -08:00
dependabot[bot]
c65c00f3a8 chore(deps-dev): bump @vue/runtime-dom in /frontend (#1633)
Bumps [@vue/runtime-dom](https://github.com/vuejs/core/tree/HEAD/packages/runtime-dom) from 3.2.37 to 3.2.39.
- [Release notes](https://github.com/vuejs/core/releases)
- [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/core/commits/v3.2.39/packages/runtime-dom)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-09-10 10:21:20 -08:00
dependabot[bot]
87bd0dda6d fix(deps): bump core-js from 3.25.0 to 3.25.1 in /frontend (#1631)
Bumps [core-js](https://github.com/zloirock/core-js) from 3.25.0 to 3.25.1.
- [Release notes](https://github.com/zloirock/core-js/releases)
- [Changelog](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zloirock/core-js/compare/v3.25.0...v3.25.1)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-09-10 10:20:58 -08:00
dependabot[bot]
5399761dfd chore(deps-dev): bump @nuxtjs/eslint-config-typescript in /frontend (#1624)
Bumps [@nuxtjs/eslint-config-typescript](https://github.com/nuxt/eslint-config) from 10.0.0 to 11.0.0.
- [Release notes](https://github.com/nuxt/eslint-config/releases)
- [Changelog](https://github.com/nuxt/eslint-config/blob/main/CHANGELOG.md)
- [Commits](https://github.com/nuxt/eslint-config/compare/v10.0.0...v11.0.0)

---
updated-dependencies:
- dependency-name: "@nuxtjs/eslint-config-typescript"
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-09-10 10:20:41 -08:00
Philipp Fischbeck
1c938cb835 fix: set meta description and image for shared recipes (#1635) 2022-09-10 09:29:21 -08:00
gurudc
25c40b8abf docs: type in introduction.md (#1636)
Typo
2022-09-10 09:28:24 -08:00
dependabot[bot]
eacab576b4 fix(deps): bump @vueuse/core from 9.1.1 to 9.2.0 in /frontend (#1628)
Bumps [@vueuse/core](https://github.com/vueuse/vueuse/tree/HEAD/packages/core) from 9.1.1 to 9.2.0.
- [Release notes](https://github.com/vueuse/vueuse/releases)
- [Commits](https://github.com/vueuse/vueuse/commits/v9.2.0/packages/core)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-09-10 09:23:07 -08:00
dependabot[bot]
eb9975a392 chore(deps-dev): bump eslint-plugin-nuxt in /frontend (#1623)
Bumps [eslint-plugin-nuxt](https://github.com/nuxt/eslint-plugin-nuxt) from 3.2.0 to 4.0.0.
- [Release notes](https://github.com/nuxt/eslint-plugin-nuxt/releases)
- [Changelog](https://github.com/nuxt/eslint-plugin-nuxt/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nuxt/eslint-plugin-nuxt/compare/v3.2.0...v4.0.0)

---
updated-dependencies:
- dependency-name: eslint-plugin-nuxt
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-09-10 09:22:04 -08:00
Hayden
5829ebec91 New Crowdin updates (#1618)
* New translations en-US.json (Czech)

* New translations en-US.json (Swedish)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Turkish)

* New translations en-US.json (Dutch)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (English, United Kingdom)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Romanian)

* New translations en-US.json (Danish)

* New translations en-US.json (French)

* New translations en-US.json (Spanish)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Catalan)

* New translations en-US.json (German)

* New translations en-US.json (Korean)

* New translations en-US.json (Greek)

* New translations en-US.json (Finnish)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Italian)

* New translations en-US.json (Japanese)

* New translations en-US.json (French, Canada)

* New translations en-US.json (German)

* New translations en-US.json (Swedish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Catalan)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Catalan)

* New translations en-US.json (Catalan)

* New translations en-US.json (Czech)

* New translations en-US.json (Spanish)

* New translations en-US.json (Catalan)

* New translations en-US.json (Spanish)

* New translations en-US.json (Catalan)

* New translations en-US.json (Spanish)

* New translations en-US.json (Spanish)

* New translations en-US.json (Catalan)

* New translations en-US.json (Spanish)

* New translations en-US.json (Spanish)

* New translations en-US.json (Catalan)

* New translations en-US.json (Catalan)

* New translations en-US.json (Catalan)

* New translations en-US.json (Danish)

* New translations en-US.json (Catalan)

* New translations en-US.json (Spanish)

* New translations en-US.json (Spanish)

* New translations en-US.json (Spanish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Turkish)
2022-09-10 09:14:22 -08:00
Michael Genson
2007bcfe28 feat: added "cookbook" filter to recipe pagination to serve frontend (#1609)
* added cookbook filter to recipe pagination

* fixed wrong filter var

* restored cookbook sorting

* reverted unnecessary var change
2022-09-10 08:59:30 -08:00
dependabot[bot]
d26cb570ba chore(deps-dev): bump eslint from 8.22.0 to 8.23.0 in /frontend (#1617)
Bumps [eslint](https://github.com/eslint/eslint) from 8.22.0 to 8.23.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.22.0...v8.23.0)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-08-28 20:12:40 -08:00
Hayden
18b2c92a76 feat: public recipe access (#1610)
* initial public explorer API endpoint

* public API endpoint

* cleanup recipe page

* wip: init explorer page

* use public URLs for shared recipes

* refactor private share tokens to use shared page
2022-08-28 20:08:33 -08:00
Hayden
9ea5e6584f perf: use HEAD method to determine best image (#1614) 2022-08-28 14:14:02 -08:00
Hayden
4a0fb56d18 fix: unsafe window access on recipe assets (#1613)
resolves 500 error on new recipes page
2022-08-28 13:54:32 -08:00
Hayden
789ab27eef New Crowdin updates (#1611)
* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (Swedish)
2022-08-28 12:45:48 -08:00
Hayden
3d099ec7c6 chore: bump frontend dependencies (#1608) 2022-08-27 11:13:53 -08:00
Michael Genson
23c039b42d refactor: event bus refactor (#1574)
* refactored event dispatching
added EventDocumentType and EventOperation to Event
added event listeners to bulk recipe changes
overhauled shopping list item events to be more useful
modified shopping list item repo to return more information

* added internal documentation for event types

* renamed message_types.py to event_types.py

* added unique event id and fixed instantiation

* generalized event listeners and publishers
moved apprise publisher to new apprise event listener
fixed duplicate message bug with apprise publisher

* added JWT field for user-specified integration id

* removed obselete test notification route

* tuned up existing notification tests

* added dependency to get integration_id from jwt

* added base crud controller to facilitate events

* simplified event publishing

* temporarily fixed test notification
2022-08-27 10:52:45 -08:00
Hayden
caa9e03050 refactor: recipe-page (#1587)
Refactor recipe page to use break up the component and make it more usable across different pages. I've left the old route in as well in case there is some functional breaks, I plan to remove it before the official release once we've tested the new editor some more in production. For now there will just have to be some duplicate components and pages around.
2022-08-27 10:44:58 -08:00
Michael Genson
a8da1a7594 fix: removed sort menu from pages that don't support it (#1606) 2022-08-26 18:50:24 -08:00
Michael Genson
fd4776842e docs: fixed incorrectly-labeled env vars (#1604) 2022-08-26 18:48:10 -08:00
Hayden
31793693f2 New Crowdin updates (#1595)
* New translations en-US.json (Czech)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Swedish)

* New translations en-US.json (French, Canada)

* New translations en-US.json (French, Canada)
2022-08-26 14:21:45 -08:00
Hayden
98936e4ce2 New Crowdin updates (#1590)
* New translations en-US.json (Swedish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Czech)
2022-08-23 22:45:07 -08:00
dependabot[bot]
6859ba346c fix(deps): bump @vueuse/core from 9.1.0 to 9.1.1 in /frontend (#1591)
Bumps [@vueuse/core](https://github.com/vueuse/vueuse/tree/HEAD/packages/core) from 9.1.0 to 9.1.1.
- [Release notes](https://github.com/vueuse/vueuse/releases)
- [Commits](https://github.com/vueuse/vueuse/commits/v9.1.1/packages/core)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-08-23 22:44:43 -08:00
dependabot[bot]
e0b34457b5 chore(deps-dev): bump eslint-plugin-vue from 9.3.0 to 9.4.0 in /frontend (#1592)
Bumps [eslint-plugin-vue](https://github.com/vuejs/eslint-plugin-vue) from 9.3.0 to 9.4.0.
- [Release notes](https://github.com/vuejs/eslint-plugin-vue/releases)
- [Commits](https://github.com/vuejs/eslint-plugin-vue/compare/v9.3.0...v9.4.0)

---
updated-dependencies:
- dependency-name: eslint-plugin-vue
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-08-23 22:44:19 -08:00
Hayden
a25eb2e1bb New translations en-US.json (German) (#1589) 2022-08-21 18:15:47 -08:00
Hayden
2865bcbb04 fix: missing user agent for scraper (#1586)
* set user agent for requests.get

* bump scraper version
2022-08-20 17:54:06 -08:00
Hayden
007b861ad6 docs: add docs on restoring to PSQL server (#1584)
* docs: add docs on restoring to PSQL server

* prevent iframe in netlify site
2022-08-20 11:53:48 -08:00
Hayden
74548e9152 fix(frontend): proper null check for notes (#1583)
Adds a proper check for the mealplan.recipe property in multiple places to resolve the bug described in #1571. In development the page would fail to render.
2022-08-20 11:21:57 -08:00
Michael Genson
aaeb162dd5 feat: unify recipe card sections (#1560)
* removed unused import

* moved categories/tags to new recipe card section

* nuked old frontend sort code
minor refactoring

* bug fixes

* added backend recipes filter for tools

* removed debug log

* removed unusued props

* fixed sort for recipes by tool

* added tests for getting recipes by tool
2022-08-20 10:59:49 -08:00
Hayden
85448b8a18 New Crowdin updates (#1581)
* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)
2022-08-20 10:46:43 -08:00
Hayden
5c24949e19 New translations en-US.json (German) (#1579) 2022-08-19 23:02:05 -08:00
Michael Genson
f231109194 fix: print view for recipes with multiple ingredient sections (#1580)
* fix for recipes with multiple ingredient sections

* removed unused key
2022-08-19 23:01:55 -08:00
Hayden
692d91e338 New Crowdin updates (#1566)
* New translations en-US.json (Czech)

* New translations en-US.json (Swedish)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Turkish)

* New translations en-US.json (Dutch)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (English, United Kingdom)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Romanian)

* New translations en-US.json (Danish)

* New translations en-US.json (French)

* New translations en-US.json (Spanish)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Catalan)

* New translations en-US.json (German)

* New translations en-US.json (Korean)

* New translations en-US.json (Greek)

* New translations en-US.json (Finnish)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Italian)

* New translations en-US.json (Japanese)

* New translations en-US.json (French, Canada)

* New translations en-US.json (German)

* New translations en-US.json (Danish)

* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (Arabic)

* New translations en-US.json (German)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (German)

* New translations en-US.json (Spanish)

* New translations en-US.json (Spanish)

* New translations en-US.json (Spanish)

* New translations en-US.json (Spanish)

* New translations en-US.json (French)
2022-08-19 11:43:31 -08:00
Michael Genson
3c2497bccf dev: improve container setup and pre-configure linters (#1577)
* added more formatters/linters

* moved "make setup" to onCreateCommand
2022-08-19 11:43:06 -08:00
Michael Genson
f4278737fb ui: changed ingredient auto grid to be more natural (#1578) 2022-08-19 11:42:06 -08:00
dependabot[bot]
b092654b43 fix(deps): bump date-fns from 2.29.1 to 2.29.2 in /frontend (#1575)
Bumps [date-fns](https://github.com/date-fns/date-fns) from 2.29.1 to 2.29.2.
- [Release notes](https://github.com/date-fns/date-fns/releases)
- [Changelog](https://github.com/date-fns/date-fns/blob/v2.29.2/CHANGELOG.md)
- [Commits](https://github.com/date-fns/date-fns/compare/v2.29.1...v2.29.2)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-08-18 18:31:11 -08:00
Hayden
dc41da3c7f ui: improve UI for favorite link (#1567) 2022-08-15 14:30:55 -08:00
Hayden
6858152acb New Crowdin updates (#1562)
* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (Hebrew)

* New translations en-US.json (German)
2022-08-15 13:56:18 -08:00
Philipp Fischbeck
ba15006bb1 chore: make vue global components and layouts localizable (#1565) 2022-08-15 13:55:51 -08:00
dependabot[bot]
7af48d51be chore(deps-dev): bump eslint from 8.21.0 to 8.22.0 in /frontend (#1561)
Bumps [eslint](https://github.com/eslint/eslint) from 8.21.0 to 8.22.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.21.0...v8.22.0)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-08-14 17:08:12 -08:00
Hayden
ad9ede20a2 fix: remove Config.get_attr config and use defaults for tags (#1559) 2022-08-14 11:31:29 -08:00
Hayden
3985713cbd fix: user-feedback-on-schema-mismatch (#1558)
* validate schema version on restore

* show user error on backup failure
2022-08-14 11:06:35 -08:00
Hayden
7adcc86d03 feat: bulk recipe settings update (#1557)
* extract switches from menu component

* implement bulk updater for settings

* fix browser cache api calls issue

* add frontend for bulk settings modifications
2022-08-14 10:37:44 -08:00
Michael Genson
5cfff75dbe moved header out of "cook mode" conditional block (#1556) 2022-08-14 08:04:09 -08:00
Hayden
3b45da274c New Crowdin updates (#1553)
* New translations en-US.json (Ukrainian)

* New translations en-US.json (Ukrainian)
2022-08-13 21:44:27 -08:00
Michael Genson
238f555f5e fix: general bug fixes (#1547)
* grouped "instructions" header with first section

* fixed sort by last updated date

* somewhat-hacky bugfix for large screens

* modified page size to be divisible by 4

* fixed missing export for new data forms
2022-08-13 21:44:11 -08:00
Hayden
54c4f19a5c security: enforce min length for user password (#1555)
* fix typing on auth context

* extract user password strength meter

* fix broken useToggle method

* extend form to accept arguments for validators

* enforce password length on update

* fix user password change form
2022-08-13 21:38:26 -08:00
Hayden
b3c41a4bd0 security: implement user lockout (#1552)
* add data-types required for login security

* implement user lockout checking at login

* cleanup legacy patterns

* expose passwords in test_user

* test user lockout after bad attempts

* test user service

* bump alembic version

* save increment to database

* add locked_at to datetime transformer on import

* do proper test cleanup

* implement scheduled task

* spelling

* document env variables

* implement context manager for session

* use context manager

* implement reset script

* cleanup generator

* run generator

* implement API endpoint for resetting locked users

* add button to reset all locked users

* add info when account is locked

* use ignore instead of expect-error
2022-08-13 13:18:12 -08:00
Daniel Palstra
ca64584fd1 feat: add the RecipeCardMenu to the recipe in a mealplan (#1551)
* Add the RecipeCardMenu to the recipe in a mealplan

* fix parameter naming

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2022-08-12 09:02:08 -08:00
Bryce Willey
553325ed09 fix: use flex-basis, not width to fix min size bug (#1548)
On mobile screens when following a registration invite link, the page
would be too wide to interact with, extending well over the sides of the
phone.

This is because the minimum size of content is set to `auto` (by
default), and accord to the spec (https://www.w3.org/TR/css-flexbox-1/#specified-size-suggestion)
the minimum size of the element is the mimimum size of it's content. The
password strength element in the panel had a width of 500px, making the
entire component overflow the screen.

Changing the width to `flex-basis` instead, allows for the password
strength element to shrink if it overflows the screen.
2022-08-12 08:59:34 -08:00
Ryan Quinn
ff2334a489 fix: email typos (#1549)
* "your" -> "you're" in invitation email

* "below" -> "above" in all emails
2022-08-12 08:54:41 -08:00
Hayden
71d3db7aef refactor: move dependencies to controllers (#1550)
* Moves dependencies directly to controllers
* Reduces use of @cached_property - (I have a suspicion that this is a factor in memory usage)
* reduce duplicate ways to access the same property on a controller.
2022-08-11 20:13:22 -08:00
Hayden
8a98288248 New Crowdin updates (#1546)
* New translations en-US.json (Czech)

* New translations en-US.json (Swedish)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Turkish)

* New translations en-US.json (Dutch)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (English, United Kingdom)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Romanian)

* New translations en-US.json (Danish)

* New translations en-US.json (French)

* New translations en-US.json (Spanish)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Catalan)

* New translations en-US.json (German)

* New translations en-US.json (Korean)

* New translations en-US.json (Greek)

* New translations en-US.json (Finnish)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Italian)

* New translations en-US.json (Japanese)

* New translations en-US.json (French, Canada)

* New translations en-US.json (Dutch)
2022-08-10 16:03:01 -08:00
dependabot[bot]
03147c8723 fix(deps): bump vuetify from 2.6.8 to 2.6.9 in /frontend (#1543)
Bumps [vuetify](https://github.com/vuetifyjs/vuetify/tree/HEAD/packages/vuetify) from 2.6.8 to 2.6.9.
- [Release notes](https://github.com/vuetifyjs/vuetify/releases)
- [Commits](https://github.com/vuetifyjs/vuetify/commits/v2.6.9/packages/vuetify)

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

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-08-09 21:23:02 -08:00
Philipp Fischbeck
32244988d2 chore: make vue domain components localizable (#1532) 2022-08-09 21:12:45 -08:00
Hayden
e5bf7bce17 fix: case-sensitive-password-reset (#1545)
* make password reset case insensitive

* update test to check for case insensitive
2022-08-09 21:10:00 -08:00
Hayden
ef24705cfa fix: ignore-place-in-search (#1544)
* pin i18n since it breaks things

* set ignoreLocation to true

* revert composition api demotion

* bump slugify
2022-08-09 20:34:08 -08:00
Michael Genson
f45e2587a0 feat: category and tag filters to recipe pagination route (#1508)
* fixed incorrect response model

* added category and tag filters

* moved categories and tags params to route and
changed to query array param

* type fixes

* added category and tag tests
2022-08-09 14:01:59 -08:00
Hayden
e82e7d0fb3 New Crowdin updates (#1527)
* New translations en-US.json (Swedish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)
2022-08-08 18:42:09 -08:00
Maka0
a7c6e89dfa feat: added gosu & updated run.sh to switch to the dedicated user (#1395)
Co-authored-by: Maka0 <360614-Maka0@users.noreply.gitlab.com>
2022-08-08 18:39:59 -08:00
Hayden
7ce02c31d5 chore: bump build deps (#1541)
* bump build deps

* typescript nonsense

* bump prettier
2022-08-08 18:38:18 -08:00
dependabot[bot]
95b1b8bbdc fix(deps): bump @vueuse/core from 9.0.2 to 9.1.0 in /frontend (#1535)
Bumps [@vueuse/core](https://github.com/vueuse/vueuse/tree/HEAD/packages/core) from 9.0.2 to 9.1.0.
- [Release notes](https://github.com/vueuse/vueuse/releases)
- [Commits](https://github.com/vueuse/vueuse/commits/v9.1.0/packages/core)

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

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-08-08 18:11:17 -08:00
dependabot[bot]
f5040af8bb chore(deps-dev): bump @babel/eslint-parser in /frontend (#1538)
Bumps [@babel/eslint-parser](https://github.com/babel/babel/tree/HEAD/eslint/babel-eslint-parser) from 7.18.2 to 7.18.9.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.18.9/eslint/babel-eslint-parser)

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

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-08-08 18:11:03 -08:00
dependabot[bot]
5fd79457dd fix(deps): bump date-fns from 2.28.0 to 2.29.1 in /frontend (#1542)
Bumps [date-fns](https://github.com/date-fns/date-fns) from 2.28.0 to 2.29.1.
- [Release notes](https://github.com/date-fns/date-fns/releases)
- [Changelog](https://github.com/date-fns/date-fns/blob/main/CHANGELOG.md)
- [Commits](https://github.com/date-fns/date-fns/compare/v2.28.0...v2.29.1)

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

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-08-08 18:10:41 -08:00
dependabot[bot]
75d4d9658c fix(deps): bump vuetify from 2.6.6 to 2.6.8 in /frontend (#1540)
Bumps [vuetify](https://github.com/vuetifyjs/vuetify/tree/HEAD/packages/vuetify) from 2.6.6 to 2.6.8.
- [Release notes](https://github.com/vuetifyjs/vuetify/releases)
- [Commits](https://github.com/vuetifyjs/vuetify/commits/v2.6.8/packages/vuetify)

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

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-08-08 18:04:53 -08:00
dependabot[bot]
9907b9d625 fix(deps): bump @mdi/js from 6.7.96 to 7.0.96 in /frontend (#1539)
Bumps [@mdi/js](https://github.com/Templarian/MaterialDesign-JS) from 6.7.96 to 7.0.96.
- [Release notes](https://github.com/Templarian/MaterialDesign-JS/releases)
- [Commits](https://github.com/Templarian/MaterialDesign-JS/compare/v6.7.96...v7.0.96)

---
updated-dependencies:
- dependency-name: "@mdi/js"
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-08-08 18:04:44 -08:00
Hayden
60ecba2f92 chore: deps-dev-bump (#1533)
* bump dev dependencies

* fix/generate font sheets

* bump python deps to nuke cache
2022-08-08 17:58:10 -08:00
Philipp Fischbeck
34cd6eb687 fix: validate OpenAPI spec (#1528)
* init api check test

* Fix openAPI issues

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2022-08-06 16:54:29 -08:00
zierbeek
505e594758 fix (possible): PWA white screen (#1526)
Possible fix #1077 on iOS, as referenced in discussion. Should be enabled by default normally..

https://pwa.nuxtjs.org/workbox#skipwaiting
2022-08-04 10:42:41 -08:00
zierbeek
ea42350244 fix (possible): PWA blank screen (#1523)
Possible fix for blank screen on PWA. #1077

https://stackoverflow.com/questions/54928050/vue-pwa-blank-screen-after-closing-the-app
2022-08-02 14:06:26 -08:00
Hayden
11478134a1 security: restrict backup file upload (#1522) 2022-08-02 12:53:58 -08:00
Hayden
6649ccf224 lang: options updates + gen utils cleanup (#1520)
* generate new langs

* add to nuxt

* cleanup generator code

* additional cleanups
2022-08-02 10:41:44 -08:00
Hayden
5fca94dd45 New Crowdin updates (#1519)
* New translations en-US.json (French, Canada)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)

* New translations en-US.json (Slovak)
2022-08-02 10:29:45 -08:00
Hayden
13850cda1f security: multiple reported CVE fixes (#1515)
* update out of date license

* update typing / refactor

* fix arbitrarty path injection

* use markdown sanatizer to prevent XSS CWE-79

* fix CWE-918 SSRF by validating url and mime type

* add security docs

* update recipe-scrapers

* resolve DOS from arbitrary url

* update changelog

* bump version

* add ref to #1506

* add #1511 to changelog

* use requests decoder

* actually fix encoding issue
2022-07-31 13:10:20 -08:00
Michael Genson
483f789b8e feat: create new foods and units from their Data Management pages (#1511)
* added create dialogs to food and unit pages

* minor css tweaks

* properly reset create form

* added placeholder name attribute for type checking

* removed unnecessary value assignment

* type fixes

* corrected comment

* add autofocus and use ref<VForm> for form refs

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2022-07-31 12:31:20 -08:00
Michael Genson
1b83c82997 feat: implement local storage for sorting and dynamic sort icons on the new recipe sort card (#1506)
* added new sort icons

* added dynamic sort icons

* implemented local storage for sorting
and mobile card view

* fixed bug with local storage booleans

* added type hints

* bum vue use to use merge defaults

* use reactive localstorage

* add $vuetify type

* sort returns

* fix type error

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2022-07-31 11:39:35 -08:00
Philipp Fischbeck
34f52c06a6 fix: properly use pagination for group event notifiers (#1512) 2022-07-31 10:08:48 -08:00
Michael Genson
07fef8af9f feat: restore frontend sorting for all recipes (#1497)
* fixed typo

* merged "all recipes" pagination into recipe card
created custom sort card for all recipes
refactored backend calls for all recipes to sort/paginate

* frontend lint fixes

* restored recipes reference

* replaced "this" with reference

* fix linting errors

* re-order context menu

* add todo

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2022-07-26 18:08:56 -08:00
Michael Genson
703ee32653 docs: pagination and filtering, and fixed a few broken links (#1488)
* fixed broken links

* added docs for pagination and filtering

* small revision to pagination response example
2022-07-26 17:45:34 -08:00
Michael Genson
3d4e5441dd chore: backend page_all route cleanup (#1483)
* refactored to remove duplicate code

* refactored meal plan slice to use a query filter
2022-07-26 17:43:25 -08:00
Hayden
f00280e32b New Crowdin updates (#1480)
* New translations en-US.json (Dutch)

* New translations en-US.json (Czech)

* New translations en-US.json (German)
2022-07-26 17:41:33 -08:00
Hayden
9e6a720cf1 New Crowdin updates (#1455)
* New translations en-US.json (Swedish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Lithuanian)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Swedish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Slovenian)

* New translations en-US.json (Slovenian)

* New translations en-US.json (French, Canada)

* New translations en-US.json (French, Canada)

* New translations en-US.json (French, Canada)
2022-07-09 21:17:34 -08:00
Michael Genson
7f50071312 feat: advanced filtering API (#1468)
* created query filter classes

* extended pagination to include query filtering

* added filtering tests

* type improvements

* move type help to dev depedency

* minor type and perf fixes

* breakup test cases

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2022-07-09 20:57:09 -08:00
Miroito
c64da1fdb7 Feature: Toggle display of ingredient references in recipe instructions (#1268)
* Better cooking mode

* Fix wrong event sent

* feat/cookmode recipe page integration

* implement scaling in cook mode + minor padding

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2022-07-09 20:28:34 -08:00
Michael Genson
2809cef3b1 fix: mealplan pagination (#1464)
* added pagination to get_slice route

* updated mealplan tests

* renamed vars to match pagination query
2022-07-02 09:44:01 -08:00
Benjamin Pabst
2f7ff6d178 fix: use mtime instead of ctime for backup dates (#1461) 2022-06-27 07:57:09 -08:00
Hayden
c05e048b65 docs: fix old link 2022-06-26 19:39:35 -08:00
Hayden
157bad0e29 fix: use == operator instead of is_ for sql queries (#1453) 2022-06-26 12:42:13 -08:00
Hayden
f96a584a5d New Crowdin updates (#1452)
* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (Danish)

* New translations en-US.json (Italian)

* New translations en-US.json (Italian)

* New translations en-US.json (Italian)

* New translations en-US.json (Greek)

* New translations en-US.json (Greek)
2022-06-26 11:21:57 -08:00
Miroito
151e20489a ui: Improve parser ui text display (#1437)
move text display when open to be below the ingredient portion
2022-06-26 11:20:38 -08:00
Hayden
7dbb0858bd New Crowdin updates (#1439)
* New translations en-US.json (Dutch)

* New translations en-US.json (Czech)

* New translations en-US.json (Czech)

* New translations en-US.json (Czech)
2022-06-25 12:20:44 -08:00
Hayden
b921e95163 fix: entry nutrition checker (#1448) 2022-06-25 12:19:04 -08:00
Michael Genson
cb15db2d27 feat: re-write get all routes to use pagination (#1424)
rewrite get_all routes to use a pagination pattern to allow for better implementations of search, filter, and sorting on the frontend or by any client without fetching all the data. Additionally we added a CI check for running the Nuxt built to confirm that no TS errors were present. Finally, I had to remove the header support for the Shopping lists as the browser caching based off last_updated header was not allowing it to read recent updates due to how we're handling the updated_at property in the database with nested fields. This will have to be looked at in the future to reimplement. I'm unsure how many other routes have a similar issue. 

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2022-06-25 11:39:38 -08:00
Philipp Fischbeck
c158672d12 fix: add missing types for API token deletion (#1428) 2022-06-21 09:42:03 -08:00
Michael Genson
292bf7068a feat: added "last-modified" header to supported record types (#1379)
* fixed type error

* exposed created/updated timestamps to shopping list schema

* added custom route to mix in "last-modified" header when available in CRUD routes

* mixed in MealieCrudRoute to APIRouters

* added HEAD route for shopping lists/list-items

* replaced default serializer with FastAPI's
2022-06-21 09:41:14 -08:00
Hayden
5db4dedc3f hotfix: tame typescript beast 2022-06-20 16:48:39 -08:00
Hayden
f122c382e9 add recipe.image cache key to bush caches (#1427)
* add recipe.image cache key to bush caches

* hotfix: TS type error
2022-06-19 11:47:16 -08:00
Hayden
c865bc7769 fix: only show scaler when ingredients amounts enabled (#1426) 2022-06-19 10:27:32 -08:00
Michael Genson
efffe26a19 fix: sort recent recipes by created_at instead of date_added (#1417)
* added staticmethod decorators to avoid mypy error

* exposed created and updated timestamps to schema

* changed default sort from date_added to created_at

* explicitely sort recent recipes by created_at

* removed static method and replaced w/ type: ignore
2022-06-19 10:08:26 -08:00
Hayden
8b054fd945 New Crowdin updates (#1406)
* New translations en-US.json (Polish)

* New translations en-US.json (Polish)

* New translations en-US.json (Polish)

* New translations en-US.json (Polish)
2022-06-19 10:03:39 -08:00
Michael Genson
bb1fa52d10 fix: all-recipes page now sorts alphabetically (#1405)
* added sort params to backend call

* hardcoded alphabetical sort param

* removed trivial type annotation

* linters are friends, not food
2022-06-19 10:03:24 -08:00
Hayden
d4b92a8ade revert i18n version 2022-06-17 14:13:18 -08:00
dependabot[bot]
85d514eb1a chore(deps-dev): bump @vue/runtime-dom in /frontend (#1423)
Bumps [@vue/runtime-dom](https://github.com/vuejs/core/tree/HEAD/packages/runtime-dom) from 3.2.36 to 3.2.37.
- [Release notes](https://github.com/vuejs/core/releases)
- [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/core/commits/v3.2.37/packages/runtime-dom)

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

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-17 13:47:12 -08:00
dependabot[bot]
8878f78ab1 fix(deps): bump core-js from 3.17.2 to 3.23.1 in /frontend (#1383)
Bumps [core-js](https://github.com/zloirock/core-js) from 3.17.2 to 3.23.1.
- [Release notes](https://github.com/zloirock/core-js/releases)
- [Changelog](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zloirock/core-js/compare/v3.17.2...v3.23.1)

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

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-17 13:45:55 -08:00
dependabot[bot]
d315ad63d2 fix(deps): bump fuse.js from 6.5.3 to 6.6.2 in /frontend (#1325)
Bumps [fuse.js](https://github.com/krisk/Fuse) from 6.5.3 to 6.6.2.
- [Release notes](https://github.com/krisk/Fuse/releases)
- [Changelog](https://github.com/krisk/Fuse/blob/master/CHANGELOG.md)
- [Commits](https://github.com/krisk/Fuse/compare/v6.5.3...v6.6.2)

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

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-17 13:45:24 -08:00
dependabot[bot]
48053b55b9 fix(deps): bump date-fns from 2.23.0 to 2.28.0 in /frontend (#1293)
Bumps [date-fns](https://github.com/date-fns/date-fns) from 2.23.0 to 2.28.0.
- [Release notes](https://github.com/date-fns/date-fns/releases)
- [Changelog](https://github.com/date-fns/date-fns/blob/master/CHANGELOG.md)
- [Commits](https://github.com/date-fns/date-fns/compare/v2.23.0...v2.28.0)

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

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-17 13:36:33 -08:00
dependabot[bot]
78c7399ff7 fix(deps): bump @nuxtjs/i18n from 7.0.3 to 7.2.2 in /frontend (#1288)
Bumps [@nuxtjs/i18n](https://github.com/nuxt-community/i18n-module) from 7.0.3 to 7.2.2.
- [Release notes](https://github.com/nuxt-community/i18n-module/releases)
- [Changelog](https://github.com/nuxt-community/i18n-module/blob/main/CHANGELOG.md)
- [Commits](https://github.com/nuxt-community/i18n-module/compare/v7.0.3...v7.2.2)

---
updated-dependencies:
- dependency-name: "@nuxtjs/i18n"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-17 13:35:21 -08:00
dependabot[bot]
f70fc18222 fix(deps): bump @mdi/js from 5.9.55 to 6.7.96 in /frontend (#1279)
Bumps [@mdi/js](https://github.com/Templarian/MaterialDesign-JS) from 5.9.55 to 6.7.96.
- [Release notes](https://github.com/Templarian/MaterialDesign-JS/releases)
- [Commits](https://github.com/Templarian/MaterialDesign-JS/compare/v5.9.55...v6.7.96)

---
updated-dependencies:
- dependency-name: "@mdi/js"
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-17 13:35:08 -08:00
Hayden
6f83b0f522 chore: bump dev deps (#1418) 2022-06-17 13:34:22 -08:00
Hayden
5a053cdcd6 feat: mealplan-webhooks (#1403)
* fix type errors on event bus

* webhooks fields required for new implementation

* db migration

* wip: webhook query + tests and stub function

* ignore type checker error

* type and method cleanup

* datetime and time utc validator

* update testing code for utc scheduled time

* fix file cmp function call

* update version_number

* add support for translating "time" objects when restoring backup

* bump recipe-scrapers

* use specific import syntax

* generate frontend types

* utilize names exports

* use utc times

* add task to scheduler

* implement new scheduler functionality

* stub for type annotation

* implement meal-plan data getter

* add experimental banner
2022-06-17 13:25:47 -08:00
Hayden
b1256f4ad2 fix: fast fail of bulk importer (#1394)
* use continue instead of break

* catch additional error case

* spelling is hard
2022-06-15 18:19:52 -08:00
Hayden
525842e9a1 New Crowdin updates (#1392)
* New translations en-US.json (Ukrainian)

* New translations en-US.json (French)

* New translations en-US.json (Italian)

* New translations en-US.json (German)

* New translations en-US.json (Danish)

* New translations en-US.json (French, Canada)

* New translations en-US.json (Ukrainian)
2022-06-15 18:19:36 -08:00
Michael Genson
9e261f5235 fix: infinite scroll bug on all recipes page (#1393) 2022-06-15 12:56:56 -08:00
Jim Eagle
3f808f8f00 docs: add go bulk import example (#1388)
* Fix link
* Add go bulk import
2022-06-15 11:50:19 -08:00
Hayden
394df6c210 New Crowdin updates (#1375)
* New translations en-US.json (French)

* New translations en-US.json (French)
2022-06-15 11:50:01 -08:00
Michael Genson
754e77c9cb feat: extend Apprise JSON notification functionality with programmatic data (#1355)
* Fixed incorrect generic deleted notification text

* Added custom "event_source" header for json notifs

* Added internal reference data to event notifs

* Added event listeners to shopping list items

* Fixed type issues

* moved JSON event source k:v pairs to message body

* added hook for all supported custom endpoints
fixed bug that excluded non-custom notification types

* created event_source class to replace loosely-typed dict

* fixed silent error when dispatching a null task

* moved url updates to static function

* added unit tests for event_source url manipulation

* removed array from event bus (it's unsupported)
2022-06-15 11:49:42 -08:00
Hayden
3030e3e7f4 feat: implement user favorites page (#1376)
* fix geFavorites return

* add support for toggling to dense cards on desktop

* add favorites page link

* implement basic favorites page
2022-06-13 09:33:46 -08:00
Michael Genson
f6c18ec73d fix avoid page breaks in sections when printing recipes and other CSS tweaks (#1372)
* grouped ingredients and instructions into sections

* added missing import

* divided ingredient sections and instruction sections into their own containers

* tweaked css to prevent sections from getting split between pages

* replaced horizontal rule with a text underline

* removed leftover CSS

* implement computer properties as reducers

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2022-06-12 16:43:09 -08:00
Hayden
84dc60d7bf New translations en-US.json (Danish) (#1371) 2022-06-11 09:57:05 -08:00
Michael Genson
7541175b75 feat: implemented "order by" API parameters for recipe, food, and unit queries (#1356)
* Added API params to order by different properties

* fix for incorrect var name

* removed invalid default order_by

* implemented fallback for invalid user input
2022-06-11 09:56:55 -08:00
Hayden
932f4a72df refactor: remove depreciated repo call (#1370)
* ingredient parser hot fixes (float equality)

* remove `get` in favor of `get_one` & `multi_query`
2022-06-10 19:01:14 -08:00
Michael Genson
b904b161eb fix: increased float rounding precision for CRF parser (#1369)
* increased float rounding precision for crf parser

* limited fractions to a max denominator of 32 to prevent weirdly specific values

* add test cases for 1/8 and 1/32

* add rounding to avoid more digits than necessary

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2022-06-10 18:18:31 -08:00
Michael Genson
504bf41b9c fix: Ingredient sections lost after parsing (#1368)
* fixed bug where ingredient titles were lost after parsing

* added fallback in case of strange behavior during parsing

* removed unnecessary linebreak
2022-06-10 18:17:51 -08:00
Michael Genson
92ccbae657 fix: fixed text color on RecipeCard in RecipePrintView and implemented ingredient sections (#1351)
* Enhanced ingredients in RecipePrintView

* Resolved frontend lint tests

* switched lets to consts and simplified import

* implement with CSS grid

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2022-06-10 16:48:07 -08:00
Hayden
c0d59db83d New Crowdin updates (#1365)
* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (French)
2022-06-10 16:38:19 -08:00
Hayden
511ce91630 New Crowdin updates (#1364)
* New translations en-US.json (German)

* New translations en-US.json (Korean)

* New translations en-US.json (English, United Kingdom)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Slovak)

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Japanese)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Bulgarian)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Italian)

* New translations en-US.json (French, Canada)

* New translations en-US.json (Ukrainian)
2022-06-09 10:16:09 -08:00
Michael Genson
5f5eb2c46d fix: for erroneously-translated datetime config (#1362)
* Fix for erroneously-translated datetime config

* remove datetime formats from crowdin

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2022-06-09 08:54:41 -08:00
Michael Genson
4662253d0e Fixed alpha sort in RecipeOrganizerPage (#1354) 2022-06-09 08:50:03 -08:00
Benjamin Pabst
8836a258bd feat: add custom scaling option (#1345)
* Added custom scaling option

* Allow custom scaling with no yield set

* Made edit-scale translated

* fixed merge conflict

* Refactored scale editor to use menu

* replaced vslot with #

* linter issues

* fixed linter issues

* fixed one more linter issue

* format files + minor UI changes

* remove console.log

* move buttons into component and setup v-model

* drop servings text

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2022-06-09 08:01:25 -08:00
Hayden
56eb0bca71 release: prep beta 3 (#1349)
* docs: add tag documentation

* bump docker-compose tags

* minor language changes

* beta3 changelog

* auto-gen API docs

* bump version

* bump recipe-scrapers
2022-06-07 11:19:24 -08:00
Hayden
eca8a96509 fix image display - closes #1189 (#1348) 2022-06-05 11:44:00 -08:00
Hayden
7eb80d18d2 feat: attached images by drag and drop for recipe steps (#1341)
* add drag and drop support for recipe steps

* fix recipe assets dialog state

* add attr support for markdown editor

* add persistent hint for recipe text editor
2022-06-05 11:28:38 -08:00
Benjamin Pabst
37a673b34d Update postgres to use most recent version (#1347) 2022-06-05 10:56:01 -08:00
Benjamin Pabst
3e7b8d4b71 Update to use most recent version (#1346) 2022-06-05 10:55:33 -08:00
Jurjen de Jonge
abb114c375 security: delay server response whenever username is non existing (#1338)
* Delay server response whenever username is non existing

* utilize hasher to achieve constant timing

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2022-06-04 10:27:30 -08:00
Hayden
12f480eb75 refactor: unify recipe-organizer components (#1340)
* use generic context menu

* implement organizer stores

* add basic organizer types

* refactor selectors to apply for all organizers

* remove legacy organizer composables
2022-06-03 20:12:32 -08:00
Hayden
bc175d4ca9 New translations en-US.json (Ukrainian) (#1339) 2022-06-03 19:49:58 -08:00
Hayden
f78c5eb359 New Crowdin updates (#1329)
* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (Ukrainian)
2022-06-02 09:12:15 -08:00
Hayden
5a0c034391 fix: shopping list label editor (#1333)
* remove head props

* lazily compute itemsByLabel with watcher on fetch

* remove unused import
2022-06-02 09:12:05 -08:00
Hayden
52fbf6b833 feat: add unit abbreviation support (#1332)
* add 'use-abbreviation' db column

* type generation

* add view and edit elements

* check for use_abbreviation to display

* fix: alembic version check

* test: add use_abbreviation prop tests
2022-06-01 11:59:50 -08:00
dependabot[bot]
592b1de39d fix(deps): bump @vue/composition-api from 1.6.1 to 1.6.2 in /frontend (#1275)
Bumps [@vue/composition-api](https://github.com/vuejs/composition-api) from 1.6.1 to 1.6.2.
- [Release notes](https://github.com/vuejs/composition-api/releases)
- [Changelog](https://github.com/vuejs/composition-api/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/composition-api/compare/v1.6.1...v1.6.2)

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

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-31 08:48:57 -08:00
dependabot[bot]
f29d5f1dff chore(deps-dev): bump @babel/eslint-parser in /frontend (#1290)
Bumps [@babel/eslint-parser](https://github.com/babel/babel/tree/HEAD/eslint/babel-eslint-parser) from 7.15.4 to 7.18.2.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.18.2/eslint/babel-eslint-parser)

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

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-31 08:48:33 -08:00
dependabot[bot]
738ef0aaa7 chore(deps-dev): bump @types/sortablejs in /frontend (#1287)
Bumps [@types/sortablejs](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/sortablejs) from 1.10.7 to 1.13.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/sortablejs)

---
updated-dependencies:
- dependency-name: "@types/sortablejs"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-31 08:48:01 -08:00
Hayden
f1fdec5afe add security.md 2022-05-31 08:29:45 -08:00
Hayden
4c594a48dc wip: pagination-repository (#1316)
* bump mypy

* add pagination + refactor generic repo

* add pagination test

* remove all query object
2022-05-30 10:30:54 -08:00
Hayden
00f144a622 chore: init git-cliff config 2022-05-29 17:34:41 -08:00
Hayden
d2a9f7ca24 fix: consoldate stores to fix mismatched state 2022-05-29 17:34:41 -08:00
Hayden
f831791db2 feat: default unit fractions to True 2022-05-29 17:34:41 -08:00
Hayden
c3bdfe7b3b fix: printer page refs (#1314) 2022-05-29 09:15:38 -08:00
Hayden
3542bb0927 fix: bad import path (#1313)
* fix bad import

* add eslint rule for incorrect imports
2022-05-29 09:09:36 -08:00
Philipp Fischbeck
e898c80f59 fix: update issue links in v1.0.0beta-2 changelog (#1312) 2022-05-29 08:51:11 -08:00
James Addison
27c5cfc56b Fixup: render homepage social media link images at 32x32 size (#1310) 2022-05-29 08:50:44 -08:00
Hayden
369cda0a61 New Crowdin updates (#1308)
* New translations en-US.json (Italian)

* New translations en-US.json (Italian)
2022-05-29 08:50:18 -08:00
Hayden
b981cf62bf chore: bump version (#1307)
* bump version

* add release notes
2022-05-28 17:13:36 -08:00
Hayden
ee93d77ace Update stale.yml
exclude tasks
2022-05-28 17:04:40 -08:00
Hayden
3dcfcc1fa9 feat: rewrite print implementation to support new ing (#1305) 2022-05-28 17:00:37 -08:00
Hayden
80f1a9add8 New Crowdin updates (#1304)
* New translations en-US.json (French)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (German)
2022-05-28 16:38:59 -08:00
Hayden
137bf9de91 bump recipe scrapers version (#1303) 2022-05-28 16:38:47 -08:00
Drumstickx
1534f0df77 docs: docker-compose.dev.yml is currently not functional (#1300) 2022-05-27 16:17:47 -08:00
Drumstickx
d751e3b35b docs: add references for VSCode dev containers (#1299) 2022-05-27 16:17:39 -08:00
Hayden
07bf5be3ec improve touch support with icon and handle (#1302) 2022-05-27 16:17:25 -08:00
Hayden
a96f94a149 fix: add touch support for mealplanner delete (#1298)
* add touch support for mealplanner delete

* remove click.stop
2022-05-26 19:31:54 -08:00
Hayden
78a8204b58 New translations en-US.json (German) (#1296) 2022-05-26 09:01:17 -08:00
Hayden
649e34f66e add touch support for mealplanner (#1295) 2022-05-25 20:13:13 -08:00
Hayden
010aafa69b feat: add reports to bulk recipe import (url) (#1294)
* remove unused docker and caddy configs

* add experimental nested configs

* switch to nest under docker-compose

* remove v-card

* bulk parser backend re-implementation

* refactor UI for bulk importer

* remove migration specific report text
2022-05-25 19:33:58 -08:00
Hayden
d66d6c55ae fix recipe assets build (#1286) 2022-05-25 11:50:45 -08:00
Hayden
7609715d9e remove explicity typescript version (#1285)
* remove explicity typescript version

* i hate javascript
2022-05-25 10:14:24 -08:00
Hayden
921fceddea chore: update dev dependencies (#1282)
* update dev dependencies

* upgrade eslint

* resolve several errors

* resolve eslint errors
2022-05-25 09:38:21 -08:00
Hayden
01f3fef21f New Crowdin updates (#1284)
* New translations en-US.json (German)

* New translations en-US.json (German)
2022-05-25 09:08:41 -08:00
Philipp Fischbeck
8f7c7c39bb refactor: split up recipe create page (#1283)
* refactor: split up recipe create page

* add flat card

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2022-05-25 09:08:32 -08:00
Hayden
30d19c6503 fix: bad dev dependency (#1281)
* revert bad dev dependency

* fix concurrent builds
2022-05-24 21:19:50 -08:00
Hayden
ea503a0235 add conccureny config (#1280) 2022-05-24 20:24:33 -08:00
dependabot[bot]
c05c123880 fix(deps): bump @nuxtjs/auth-next in /frontend (#1265)
Bumps [@nuxtjs/auth-next](https://github.com/nuxt-community/auth-module) from 5.0.0-1624817847.21691f1 to 5.0.0-1648802546.c9880dc.
- [Release notes](https://github.com/nuxt-community/auth-module/releases)
- [Changelog](https://github.com/nuxt-community/auth-module/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/nuxt-community/auth-module/commits)

---
updated-dependencies:
- dependency-name: "@nuxtjs/auth-next"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-24 20:02:43 -08:00
dependabot[bot]
6f45de6167 chore(deps-dev): bump vue2-script-setup-transform in /frontend (#1263)
Bumps [vue2-script-setup-transform](https://github.com/antfu/vue2-script-setup-transform) from 0.2.6 to 0.3.5.
- [Release notes](https://github.com/antfu/vue2-script-setup-transform/releases)
- [Commits](https://github.com/antfu/vue2-script-setup-transform/compare/v0.2.6...v0.3.5)

---
updated-dependencies:
- dependency-name: vue2-script-setup-transform
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-24 20:02:00 -08:00
dependabot[bot]
d634e2fbe1 chore(deps-dev): bump nuxt-vite from 0.1.3 to 0.3.5 in /frontend (#1260)
Bumps [nuxt-vite](https://github.com/nuxt/vite) from 0.1.3 to 0.3.5.
- [Release notes](https://github.com/nuxt/vite/releases)
- [Changelog](https://github.com/nuxt/vite/blob/main/CHANGELOG.md)
- [Commits](https://github.com/nuxt/vite/compare/v0.1.3...v0.3.5)

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

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-24 20:00:50 -08:00
dependabot[bot]
43a566339a chore(deps-dev): bump @vue/runtime-dom in /frontend (#1259)
Bumps [@vue/runtime-dom](https://github.com/vuejs/core/tree/HEAD/packages/runtime-dom) from 3.2.35 to 3.2.36.
- [Release notes](https://github.com/vuejs/core/releases)
- [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/core/commits/v3.2.36/packages/runtime-dom)

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

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-24 20:00:16 -08:00
dependabot[bot]
cc284a0ceb chore(deps-dev): bump eslint-plugin-nuxt in /frontend (#1258)
Bumps [eslint-plugin-nuxt](https://github.com/nuxt/eslint-plugin-nuxt) from 2.0.0 to 3.2.0.
- [Release notes](https://github.com/nuxt/eslint-plugin-nuxt/releases)
- [Changelog](https://github.com/nuxt/eslint-plugin-nuxt/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nuxt/eslint-plugin-nuxt/compare/v2.0.0...v3.2.0)

---
updated-dependencies:
- dependency-name: eslint-plugin-nuxt
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-24 19:59:49 -08:00
dependabot[bot]
3c19105d8b fix(deps): bump isomorphic-dompurify from 0.18.0 to 0.19.0 in /frontend (#1257)
Bumps [isomorphic-dompurify](https://github.com/kkomelin/isomorphic-dompurify) from 0.18.0 to 0.19.0.
- [Release notes](https://github.com/kkomelin/isomorphic-dompurify/releases)
- [Commits](https://github.com/kkomelin/isomorphic-dompurify/compare/v0.18.0...v0.19.0)

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

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-24 19:58:14 -08:00
Hayden
b8ee1a4bd8 fix #1270 migration not capture settings (#1272) 2022-05-24 09:55:15 -08:00
Hayden
c30ffbc851 update readme 2022-05-24 09:51:39 -08:00
Hayden
3ddbc033b2 chore: github stalebot changes (#1271)
* add exempt labels

* update tags for docker-compose
2022-05-24 08:30:07 -08:00
999 changed files with 79076 additions and 27778 deletions

View File

@@ -21,12 +21,12 @@ ENV PYTHONUNBUFFERED=1 \
PIP_DISABLE_PIP_VERSION_CHECK=on \
PIP_DEFAULT_TIMEOUT=100 \
POETRY_HOME="/opt/poetry" \
POETRY_VIRTUALENVS_CREATE=false
POETRY_VIRTUALENVS_IN_PROJECT=true
# prepend poetry and venv to path
ENV PATH="$POETRY_HOME/bin:$PATH"
RUN curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/install-poetry.py | python -
RUN curl -sSL https://install.python-poetry.org | python3 -
# RUN poetry config virtualenvs.create false
RUN apt-get update \

View File

@@ -35,16 +35,22 @@
},
// Add the IDs of extensions you want installed when the container is created.
"extensions": [
"dbaeumer.vscode-eslint",
"matangover.mypy",
"ms-python.black-formatter",
"ms-python.isort",
"ms-python.python",
"ms-python.vscode-pylance"
"ms-python.vscode-pylance",
"Vue.volar"
],
// Use 'forwardPorts' to make a list of ports inside the container available locally.
"forwardPorts": [
3000,
9000
],
// Use 'onCreateCommand' to run commands at the end of container creation.
// Use 'postCreateCommand' to run commands after the container is created.
"postCreateCommand": "sudo chown -R vscode:vscode /workspaces/mealie/frontend/node_modules && make setup",
"onCreateCommand": "sudo chown -R vscode:vscode /workspaces/mealie/frontend/node_modules && make setup",
// Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
"remoteUser": "vscode",
// "features": {

10
.flake8
View File

@@ -1,10 +0,0 @@
[flake8]
extend-ignore = [
E501 # Line Length - See Black Config in pyproject.toml
E402 # Import Not at Top of File
]
exclude = _all_models.py
per-file-ignores =
__init__.py:F403,F401

View File

@@ -0,0 +1,41 @@
---
title: "YOUR TITLE"
body:
- type: checkboxes
id: checks
attributes:
label: First Check
description: |
Please confirm and check all the following prior to submission. If you do not do this, your
issue may be closed.
options:
- label: I used the GitHub search to find a similar requests and didn't find it.
required: true
- label: Checked the [tasks tagged](https://github.com/hay-kot/mealie/issues?q=is%3Aissue+is%3Aopen+label%3Atask+) issues and verified my feature is not covered
required: true
- type: textarea
id: problem
attributes:
label: Please provide a concise description of the problem that would be addressed by this feature.
validations:
required: true
- type: textarea
id: solution
attributes:
label: Please provide a concise description of the feature that would resolve your issue.
validations:
required: true
- type: textarea
id: considerations
attributes:
label: Please consider and list out some caveats or tradeoffs made in your design decision
validations:
required: true
- type: checkboxes
id: additional-information
attributes:
label: Additional Information
options:
- label: If this is accepted I'm willing to submit a PR to provide this feature
- label: If this is accepted I'm willing to help maintain this feature
- label: I'm willing to sponsor/pay a developer to do this work

View File

@@ -1,12 +1,16 @@
---
name: "[v0.5.x] Bug Report"
description: "submit a bug report for the current release"
name: Bug Report
description: "Submit a bug for the latest version of Mealie"
title: "[BUG] - YOUR TITLE"
labels: ["bug", "triage"]
body:
- type: checkboxes
id: checks
attributes:
label: First Check
description: Please confirm and check all the following options.
description: |
Please confirm and check all the following prior to submission. If you do not do this, your
issue may be closed.
options:
- label: This is not a feature request
required: true
@@ -18,8 +22,8 @@ body:
required: true
- label: I already read the docs and didn't find an answer.
required: true
- label: I have checked for existing issues that have been resolved in v1-beta
required: true
- label: This issue can be replicated on the demo site (https://demo.mealie.io/)
required: false
- type: textarea
id: description
attributes:
@@ -27,6 +31,23 @@ body:
placeholder: A clear and concise description of what the bug is.
validations:
required: true
- type: textarea
id: reproduction
attributes:
label: Steps to Reproduce
placeholder: 1) ... 2) ... 3) ...
validations:
required: true
- type: textarea
id: logs
attributes:
label: Please provide relevent logs
validations:
required: true
- type: textarea
id: version
attributes:
label: Mealie Version
- type: dropdown
id: os
attributes:
@@ -42,13 +63,6 @@ body:
validations:
required: true
- type: textarea
id: os-details
id: other
attributes:
label: Deployment Details
description: You can add more details about your operating system here, in particular if you chose "Other". If you are experiencing issues with deployment, please provide your docker-compose or docker commands
- type: input
id: mealie-version
attributes:
label: Mealie Version
validations:
required: true
label: Additional Deployment Details

View File

@@ -1,4 +1,4 @@
contact_links:
- name: Feature Requests
url: https://github.com/hay-kot/mealie/issues/122
about: Please add any Feature Requests here.
url: https://github.com/hay-kot/mealie/discussions/new?category=feature-request
about: Please add any Feature Requests as a Github Discussion using the for in this issue.

View File

@@ -0,0 +1,53 @@
---
name: Error Scraping Recipe
description: "Submit a bug or issues related to scraping recipes"
title: "[SCRAPER] - YOUR TITLE"
labels: ["bug", "triage", "scraper"]
body:
- type: checkboxes
id: checks
attributes:
label: First Check
description: |
Please confirm and check all the following prior to submission. If you do not do this, your
issue may be closed.
options:
- label: I used the GitHub search to find a similar issue and didn't find it.
required: true
- label: |
I have verified that this issue _is not_ related to the underlying library
[hhyrsev/recipe-scrapers](https://github.com/hhursev/recipe-scrapers) by **1)** checking
the [debugger](https://demo.mealie.io/recipe/create/debug) and data is returned, **2)**
verifying that there _are_ errors in the log related to application level code, or
**3)** verified that the site provides recipe data, or is otherwise supported by
[hhyrsev/recipe-scrapers](https://github.com/hhursev/recipe-scrapers)
required: true
- label: This issue can be replicated on the demo site (https://demo.mealie.io/)
required: false
- type: textarea
id: urls
attributes:
label: Please provide 1-5 example URLs that are having errors
validations:
required: true
- type: textarea
id: logs
attributes:
label: |
Please provide your logs for the Mealie container `docker logs <container-id> > mealie.logs`
validations:
required: true
- type: dropdown
id: os
attributes:
label: Deployment
description: What Deployment system are you using?
multiple: true
options:
- Docker (Linux)
- Docker (Windows)
- Docker (Synology)
- Unraid
- Other
validations:
required: true

View File

@@ -1,47 +0,0 @@
---
name: v1.0.0b Bug Report
description: "submit a bug report for the v1 beta"
title: "[v1.0.0b] - YOUR TITLE"
body:
- type: checkboxes
id: checks
attributes:
label: First Check
description: Please confirm and check all the following options.
options:
- label: This is not a feature request
required: true
- label: I added a very descriptive title to this issue.
required: true
- label: I used the GitHub search to find a similar issue and didn't find it.
required: true
- label: I searched the Mealie documentation, with the integrated search.
required: true
- label: I already read the docs and didn't find an answer.
required: true
- type: textarea
id: description
attributes:
label: What is the issue you are experiencing?
placeholder: A clear and concise description of what the bug is.
validations:
required: true
- type: dropdown
id: os
attributes:
label: Deployment
description: What Deployment system are you using?
multiple: true
options:
- Docker (Linux)
- Docker (Windows)
- Docker (Synology)
- Unraid
- Other
validations:
required: true
- type: textarea
id: os-details
attributes:
label: Deployment Details
description: You can add more details about your operating system here, in particular if you chose "Other". If you are experiencing issues with deployment, please provide your docker-compose or docker commands

View File

@@ -1,32 +0,0 @@
version: 2
updates:
# Fetch and update latest `npm` packages
- package-ecosystem: npm
directory: "/frontend"
schedule:
interval: daily
time: "00:00"
open-pull-requests-limit: 10
reviewers:
- hay-kot
assignees:
- hay-kot
commit-message:
prefix: fix
prefix-development: chore
include: scope
# Fetch and update latest `github-actions` pkgs
- package-ecosystem: github-actions
directory: "/frontend"
schedule:
interval: daily
time: "00:00"
open-pull-requests-limit: 10
reviewers:
- hay-kot
assignees:
- hay-kot
commit-message:
prefix: fix
prefix-development: chore
include: scope

72
.github/pull_request_template.md vendored Normal file
View File

@@ -0,0 +1,72 @@
<!--
This template provides some ideas of things to include in your PR description.
To start, try providing a short summary of your changes in the Title above.
If a section of the PR template does not apply to this PR, then delete that section.
-->
## What type of PR is this?
_(REQUIRED)_
<!--
Delete any of the following that do not apply:
-->
- bug
- cleanup
- documentation
- feature
## What this PR does / why we need it:
_(REQUIRED)_
<!--
What goal is this change working towards?
Provide a bullet pointed summary of how each file was changed.
Briefly explain any decisions you made with respect to the changes.
Include anything here that you didn't include in *Release Notes*
above, such as changes to CI or changes to internal methods.
-->
## Which issue(s) this PR fixes:
_(REQUIRED)_
<!--
If this PR fixes one of more issues, list them here.
One line each, like so:
Fixes #123
Fixes #39
-->
## Special notes for your reviewer:
_(fill-in or delete this section)_
<!--
Is there any particular feedback you would / wouldn't like?
Which parts of the code should reviewers focus on?
-->
## Testing
_(fill-in or delete this section)_
<!--
Describe how you tested this change.
-->
## Release Notes
_(REQUIRED)_
<!--
If this PR makes user facing changes, please describe them here. This
description will be copied into the release notes/changelog, whenever the
next version is released. Keep this section short, and focus on high level
changes.
Put your text between the block. To omit notes, use NONE within the block.
-->
```release-note
```

6
.github/stale.yml vendored
View File

@@ -6,8 +6,12 @@ daysUntilClose: 7
exemptLabels:
- pinned
- security
- early-stages
- "bug: confirmed"
- feedback
- task
# Label to use when marking an issue as stale
staleLabel: wontfix
staleLabel: stale
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had

View File

@@ -1,59 +0,0 @@
name: Backend - Nightly Build
on:
push:
branches:
- mealie-next
jobs:
build:
runs-on: ubuntu-latest
steps:
#
# Checkout
#
- name: checkout code
uses: actions/checkout@v2
#
# Setup QEMU
#
- name: Set up QEMU
id: qemu
uses: docker/setup-qemu-action@v1
with:
image: tonistiigi/binfmt:latest
platforms: all
#
# Setup Buildx
#
- name: install buildx
id: buildx
uses: docker/setup-buildx-action@v1
with:
install: true
#
# Login to Docker Hub
#
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
#
# Build
#
- name: build the image
run: |
docker build --push --no-cache \
--tag hkotel/mealie:api-nightly \
--build-arg COMMIT=$(git rev-parse HEAD) \
--platform linux/amd64,linux/arm64 .
#
# Build Discord Notification
#
- name: Discord notification
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_NIGHTLY_WEBHOOK }}
uses: Ilshidur/action-discord@0.3.2
with:
args: "🚀 A New build of mealie:api-nightly is available"

View File

@@ -1,75 +0,0 @@
name: Docker Build Production
on:
release:
types: [published]
jobs:
build:
runs-on: ubuntu-latest
steps:
#
# Get Release Version
#
- uses: oprypin/find-latest-tag@v1
with:
repository: hay-kot/mealie # The repository to scan.
releases-only: true # We know that all relevant tags have a GitHub release for them.
id: mealie_version # The step ID to refer to later.
#
# Checkout
#
- name: checkout code
uses: actions/checkout@v2
#
# Setup QEMU
#
- name: Set up QEMU
id: qemu
uses: docker/setup-qemu-action@v1
with:
image: tonistiigi/binfmt:latest
platforms: all
#
# Setup Buildx
#
- name: install buildx
id: buildx
uses: docker/setup-buildx-action@v1
with:
install: true
#
# Login to Docker Hub
#
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
#
# Build Backend
#
- name: build the image
run: |
docker build --push --no-cache \
--tag hkotel/mealie:api-${{ steps.mealie_version.outputs.tag }} \
--build-arg COMMIT=$(git rev-parse HEAD) \
--platform linux/amd64,linux/arm64 .
#
# Build Frontend
#
- name: build the image
working-directory: "frontend"
run: |
docker build --push --no-cache \
--tag hkotel/mealie:frontend-${{ steps.mealie_version.outputs.tag }} \
--platform linux/amd64,linux/arm64 .
#
# Release Discord Notification
#
- name: Discord notification
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_RELEASE_WEBHOOK }}
uses: Ilshidur/action-discord@0.3.2
with:
args: '🚀 Version {{ EVENT_PAYLOAD.release.tag_name }} of Mealie has been released. See the release notes https://github.com/hay-kot/mealie/releases/tag/{{ EVENT_PAYLOAD.release.tag_name }}'

View File

@@ -1,59 +0,0 @@
name: Frontend - Nightly Build
on:
push:
branches:
- mealie-next
jobs:
build:
runs-on: ubuntu-latest
steps:
#
# Checkout
#
- name: checkout code
uses: actions/checkout@v2
#
# Setup QEMU
#
- name: Set up QEMU
id: qemu
uses: docker/setup-qemu-action@v1
with:
image: tonistiigi/binfmt:latest
platforms: all
#
# Setup Buildx
#
- name: install buildx
id: buildx
uses: docker/setup-buildx-action@v1
with:
install: true
#
# Login to Docker Hub
#
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
#
# Build
#
- name: build the image
working-directory: "frontend"
run: |
docker build --push --no-cache \
--tag hkotel/mealie:frontend-nightly \
--platform linux/amd64,linux/arm64 .
#
# Build Discord Notification
#
- name: Discord notification
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_NIGHTLY_WEBHOOK }}
uses: Ilshidur/action-discord@0.3.2
with:
args: "🚀 A New build of mealie:frontend-nightly is available"

View File

@@ -1,49 +0,0 @@
name: Frontend Lint
on:
push:
branches:
- mealie-next
pull_request:
branches:
- mealie-next
jobs:
ci:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest]
node: [16]
steps:
- name: Checkout 🛎
uses: actions/checkout@master
- name: Setup node env 🏗
uses: actions/setup-node@v2.1.5
with:
node-version: ${{ matrix.node }}
check-latest: true
- name: Get yarn cache directory path 🛠
id: yarn-cache-dir-path
run: echo "::set-output name=dir::$(yarn cache dir)"
- name: Cache node_modules 📦
uses: actions/cache@v2.1.4
id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- name: Install dependencies 👨🏻‍💻
run: yarn
working-directory: "frontend"
- name: Run linter 👀
run: yarn lint
working-directory: "frontend"

47
.github/workflows/nightly.yml vendored Normal file
View File

@@ -0,0 +1,47 @@
name: Docker Nightly Production
on:
push:
branches:
- mealie-next
concurrency:
group: nightly-${{ github.ref }}
cancel-in-progress: true
jobs:
backend-tests:
name: "Backend Server Tests"
uses: ./.github/workflows/partial-backend.yml
frontend-tests:
name: "Frontend and End-to-End Tests"
uses: ./.github/workflows/partial-frontend.yml
build-release:
permissions:
contents: read
packages: write
name: Build Tagged Release
uses: ./.github/workflows/partial-builder.yml
needs:
- frontend-tests
- backend-tests
with:
tag: nightly
secrets:
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
notify-discord:
name: Notify Discord
needs:
- build-release
runs-on: ubuntu-latest
steps:
- name: Discord notification
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_NIGHTLY_WEBHOOK }}
uses: Ilshidur/action-discord@0.3.2
with:
args: "🚀 New builds of ghcr.io/mealie-recipes/mealie:nightly"

View File

@@ -1,12 +1,7 @@
name: Backend Tests
name: Backend Test/Lint
on:
push:
branches:
- mealie-next
pull_request:
branches:
- mealie-next
types: [synchronize, opened, reopened, ready_for_review]
workflow_call:
jobs:
tests:
@@ -18,7 +13,7 @@ jobs:
strategy:
fail-fast: true
matrix:
# Database ENV Variablse as Specified by Mealie
# Database ENV Variables as Specified by Mealie
Database: [sqlite, postgres]
# Services
@@ -32,61 +27,78 @@ jobs:
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
ports:
- 5432:5432
ldap:
image: rroemhild/test-openldap
ports:
- 10389:10389
- 10636:10636
# Steps
steps:
#----------------------------------------------
# check-out repo and set-up python
#----------------------------------------------
- name: Check out repository
uses: actions/checkout@v2
uses: actions/checkout@v3
- name: Set up python
uses: actions/setup-python@v2
uses: actions/setup-python@v4
with:
python-version: "3.10"
#----------------------------------------------
# ----- install & configure poetry -----
#----------------------------------------------
- name: Install Poetry
uses: snok/install-poetry@v1
with:
virtualenvs-create: true
virtualenvs-in-project: true
#----------------------------------------------
# load cached venv if cache exists
#----------------------------------------------
- name: Load cached venv
id: cached-poetry-dependencies
uses: actions/cache@v2
uses: actions/cache@v3
with:
path: .venv
key: venv-${{ runner.os }}-${{ hashFiles('**/poetry.lock') }}
#----------------------------------------------
# install dependencies if cache does not exist
#----------------------------------------------
- name: Check venv cache
id: cache-validate
if: steps.cached-poetry-dependencies.outputs.cache-hit == 'true'
run: |
echo "import black;print('venv good?')" > test.py && poetry run python test.py && echo ::set-output name=cache-hit-success::true
rm test.py
continue-on-error: true
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install libsasl2-dev libldap2-dev libssl-dev
sudo apt-get install libsasl2-dev libldap2-dev libssl-dev tesseract-ocr-all
poetry install
poetry add "psycopg2-binary==2.8.6"
if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'
if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' || steps.cache-validate.outputs.cache-hit-success != 'true'
#----------------------------------------------
# run test suite
#----------------------------------------------
- name: Formatting (Black & isort)
- name: Formatting (Black)
run: |
poetry run black . --check
poetry run isort . --check-only
- name: Lint (Flake8)
- name: Lint (Ruff)
run: |
make backend-lint
- name: Mypy Typecheck
run: |
make backend-typecheck
- name: Pytest
env:
DB_ENGINE: ${{ matrix.Database }}
POSTGRES_SERVER: localhost
LDAP_AUTH_ENABLED: True
LDAP_SERVER_URL: ldap://localhost:10389
LDAP_TLS_INSECURE: true
LDAP_ENABLE_STARTTLS: false
LDAP_BASE_DN: "ou=people,dc=planetexpress,dc=com"
LDAP_QUERY_BIND: "cn=admin,dc=planetexpress,dc=com"
LDAP_QUERY_PASSWORD: "GoodNewsEveryone"
LDAP_USER_FILTER: "(&(|({id_attribute}={input})({mail_attribute}={input}))(|(memberOf=cn=ship_crew,ou=people,dc=planetexpress,dc=com)(memberOf=cn=admin_staff,ou=people,dc=planetexpress,dc=com)))"
LDAP_ADMIN_FILTER: "memberOf=cn=admin_staff,ou=people,dc=planetexpress,dc=com"
LDAP_ID_ATTRIBUTE: uid
LDAP_NAME_ATTRIBUTE: cn
LDAP_MAIL_ATTRIBUTE: mail
run: |
make backend-test

46
.github/workflows/partial-builder.yml vendored Normal file
View File

@@ -0,0 +1,46 @@
name: Build Containers
on:
workflow_call:
inputs:
tag:
required: true
type: string
secrets:
DOCKERHUB_USERNAME:
required: true
DOCKERHUB_TOKEN:
required: true
jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Log in to the Container registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Override __init__.py
run: |
echo "__version__ = \"${{ inputs.tag }}\"" > ./mealie/__init__.py
- name: Build and push Docker image
uses: docker/build-push-action@v4
with:
file: ./docker/Dockerfile
context: .
platforms: linux/amd64,linux/arm64
push: true
tags: ghcr.io/${{ github.repository }}:${{ inputs.tag }}

77
.github/workflows/partial-frontend.yml vendored Normal file
View File

@@ -0,0 +1,77 @@
name: Frontend Build/Lin
on:
workflow_call:
jobs:
lint:
runs-on: ubuntu-latest
steps:
- name: Checkout 🛎
uses: actions/checkout@master
- name: Setup node env 🏗
uses: actions/setup-node@v3.7.0
with:
node-version: 16
check-latest: true
- name: Get yarn cache directory path 🛠
id: yarn-cache-dir-path
run: echo "::set-output name=dir::$(yarn cache dir)"
- name: Cache node_modules 📦
uses: actions/cache@v3.3.1
id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- name: Install dependencies 👨🏻‍💻
run: yarn
working-directory: "frontend"
- name: Run linter 👀
run: yarn lint
working-directory: "frontend"
- name: Run tests 🧪
run: yarn test:ci
working-directory: "frontend"
build:
runs-on: ubuntu-latest
steps:
- name: Checkout 🛎
uses: actions/checkout@master
- name: Setup node env 🏗
uses: actions/setup-node@v3.7.0
with:
node-version: 16
check-latest: true
- name: Get yarn cache directory path 🛠
id: yarn-cache-dir-path
run: echo "::set-output name=dir::$(yarn cache dir)"
- name: Cache node_modules 📦
uses: actions/cache@v3.3.1
id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- name: Install dependencies 👨🏻‍💻
run: yarn
working-directory: "frontend"
- name: Run Build 🚚
run: yarn build
working-directory: "frontend"

View File

@@ -0,0 +1,31 @@
name: Trivy Container Scanning
on:
workflow_call:
jobs:
build:
name: Build and Scan Container
runs-on: ubuntu-latest
strategy:
fail-fast: true
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Build Dockerfile
run: |
docker build -t mealie --file=./docker/Dockerfile .
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@master
with:
ignore-unfixed: true
image-ref: "mealie"
format: "sarif"
output: "trivy-results.sarif"
- name: Upload Trivy scan results to GitHub Security tab
uses: github/codeql-action/upload-sarif@v2
with:
sarif_file: "trivy-results.sarif"

19
.github/workflows/pull-requests.yml vendored Normal file
View File

@@ -0,0 +1,19 @@
name: PR CI
on:
pull_request:
branches:
- mealie-next
jobs:
backend-tests:
name: "Backend Server Tests"
uses: ./.github/workflows/partial-backend.yml
frontend-tests:
name: "Frontend and End-to-End Tests"
uses: ./.github/workflows/partial-frontend.yml
container-scanning:
name: "Trivy Container Scanning"
uses: ./.github/workflows/partial-trivy-container-scanning.yml

42
.github/workflows/release.yml vendored Normal file
View File

@@ -0,0 +1,42 @@
name: Docker Build Production
on:
release:
types: [published]
jobs:
backend-tests:
name: "Backend Server Tests"
uses: ./.github/workflows/partial-backend.yml
frontend-tests:
name: "Frontend and End-to-End Tests"
uses: ./.github/workflows/partial-frontend.yml
build-release:
permissions:
contents: read
packages: write
name: Build Tagged Release
uses: ./.github/workflows/partial-builder.yml
needs:
- backend-tests
- frontend-tests
with:
tag: ${{ github.event.release.tag_name }}
secrets:
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
notify-discord:
name: Notify Discord
needs:
- build-release
runs-on: ubuntu-latest
steps:
- name: Discord notification
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_RELEASE_WEBHOOK }}
uses: Ilshidur/action-discord@0.3.2
with:
args: "🚀 Version {{ EVENT_PAYLOAD.release.tag_name }} of Mealie has been released. See the release notes https://github.com/hay-kot/mealie/releases/tag/{{ EVENT_PAYLOAD.release.tag_name }}"

6
.gitignore vendored
View File

@@ -12,6 +12,7 @@ docs/site/
frontend/dist/
dev/code-generation/generated/*
dev/data/mealie.db-journal
dev/data/backups/*
dev/data/debug/*
dev/data/img/*
@@ -55,7 +56,6 @@ develop-eggs/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
!frontend/src/components/Recipe/Parts/
@@ -87,6 +87,7 @@ coverage.xml
*.cover
.hypothesis/
.pytest_cache/
.ruff_cache/
test.db
# Translations
@@ -158,3 +159,6 @@ dev/code-generation/generated/openapi.json
dev/code-generation/generated/test_routes.py
mealie/services/parser_services/crfpp/model.crfmodel
lcov.info
dev/code-generation/openapi.json
.run/

View File

@@ -9,22 +9,8 @@ repos:
- id: check-toml
- id: end-of-file-fixer
- id: trailing-whitespace
- repo: https://github.com/sondrelg/pep585-upgrade
rev: "v1.0.1" # Use the sha / tag you want to point at
hooks:
- id: upgrade-type-hints
- repo: https://github.com/pycqa/isort
rev: 5.10.1
hooks:
- id: isort
name: isort (python)
exclude: ^tests/data/
- repo: https://github.com/psf/black
rev: 22.3.0
rev: 23.1.0
hooks:
- id: black
- repo: https://github.com/pycqa/flake8
rev: "4.0.1"
hooks:
- id: flake8
additional_dependencies:
- "flake8-print==4.0.0"

3
.vscode/extensions.json vendored Normal file
View File

@@ -0,0 +1,3 @@
{
"recommendations": ["lokalise.i18n-ally"]
}

48
.vscode/settings.json vendored
View File

@@ -1,11 +1,9 @@
{
"conventionalCommits.scopes": [
"frontend",
"docs",
"backend",
"code-generation"
"cSpell.enableFiletypes": [
"!javascript",
"!python",
"!yaml"
],
"cSpell.enableFiletypes": ["!javascript", "!python", "!yaml"],
"cSpell.words": [
"chowdown",
"compression",
@@ -20,7 +18,9 @@
"source.organizeImports": false
},
"editor.formatOnSave": true,
"eslint.workingDirectories": ["./frontend"],
"eslint.workingDirectories": [
"./frontend"
],
"files.exclude": {
"**/__pycache__": true,
"**/.DS_Store": true,
@@ -29,22 +29,44 @@
"**/.svn": true,
"**/CVS": true
},
"i18n-ally.enabledFrameworks": ["vue"],
"i18n-ally.enabledFrameworks": [
"vue"
],
"i18n-ally.keystyle": "nested",
"i18n-ally.localesPaths": "frontend/lang/messages",
"i18n-ally.sourceLanguage": "en-US",
"python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python",
"python.formatting.provider": "black",
"python.linting.enabled": true,
"python.linting.flake8Enabled": true,
"python.linting.flake8Enabled": false,
"python.linting.pylintEnabled": false,
"python.linting.pylintArgs": ["--rcfile=${workspaceFolder}/.pylintrc"],
"python.linting.pylintArgs": [
"--rcfile=${workspaceFolder}/.pylintrc"
],
"python.testing.autoTestDiscoverOnSaveEnabled": false,
"python.testing.pytestArgs": ["tests"],
"python.testing.pytestArgs": [
"tests"
],
"python.testing.pytestEnabled": true,
"python.testing.unittestEnabled": false,
"python.analysis.typeCheckingMode": "off",
"python.linting.mypyEnabled": true,
"python.sortImports.path": "${workspaceFolder}/.venv/bin/isort",
"search.mode": "reuseEditor",
"python.testing.unittestArgs": ["-v", "-s", "./tests", "-p", "test_*.py"]
"python.testing.unittestArgs": [
"-v",
"-s",
"./tests",
"-p",
"test_*.py"
],
"explorer.fileNesting.enabled": true,
"explorer.fileNesting.patterns": {
"package.json": "package-lock.json, yarn.lock, .eslintrc.js, tsconfig.json, .prettierrc, .editorconfig",
"pyproject.toml": "poetry.lock, alembic.ini, .pylintrc",
"netlify.toml": "runtime.txt",
"README.md": "LICENSE, SECURITY.md"
},
"[vue]": {
"editor.formatOnSave": false
},
}

View File

@@ -2,15 +2,9 @@
[![Forks][forks-shield]][forks-url]
[![Stargazers][stars-shield]][stars-url]
[![Issues][issues-shield]][issues-url]
[![MIT License][license-shield]][license-url]
[![AGPL License][license-shield]][license-url]
[![Docker Pulls][docker-pull]][docker-pull]
[![CodeFactor](https://www.codefactor.io/repository/github/hay-kot/mealie/badge)](https://www.codefactor.io/repository/github/hay-kot/mealie)
[![Docker Build Production](https://github.com/hay-kot/mealie/actions/workflows/dockerbuild.release.yml/badge.svg)](https://github.com/hay-kot/mealie/actions/workflows/dockerbuild.release.yml)
[![Project Tests Production](https://github.com/hay-kot/mealie/actions/workflows/test-all.yml/badge.svg)](https://github.com/hay-kot/mealie/actions/workflows/test-all.yml)
[![Docker Build Dev](https://github.com/hay-kot/mealie/actions/workflows/dockerbuild.dev.yml/badge.svg?branch=dev)](https://github.com/hay-kot/mealie/actions/workflows/dockerbuild.dev.yml)
[![Project Tests Dev](https://github.com/hay-kot/mealie/actions/workflows/test-all.yml/badge.svg?branch=dev)](https://github.com/hay-kot/mealie/actions/workflows/test-all.yml)
<!-- PROJECT LOGO -->
<br />
@@ -26,20 +20,14 @@
<p align="center">
A Place for All Your Recipes
<br />
<a href="https://hay-kot.github.io/mealie/"><strong>Explore the docs »</strong></a>
<a href="https://nightly.mealie.io"><strong>Explore the docs »</strong></a>
<a href="https://github.com/hay-kot/mealie">
</a>
<br />
<a href="https://mealie-demo.hay-kot.dev/">View Demo</a>
<a href="https://demo.mealie.io/">View Demo</a>
·
<a href="https://github.com/hay-kot/mealie/issues">Report Bug</a>
·
<a href="https://hay-kot.github.io/mealie/api/redoc/">API</a>
·
<a href="https://github.com/hay-kot/mealie/issues">
Request Feature
</a>
·
<a href="https://hub.docker.com/r/hkotel/mealie"> Docker Hub
</a>
</p>
@@ -54,29 +42,29 @@
Mealie is a self hosted recipe manager and meal planner with a RestAPI backend and a reactive frontend application built in Vue for a pleasant user experience for the whole family. Easily add recipes into your database by providing the url and Mealie will automatically import the relevant data or add a family recipe with the UI editor. Mealie also provides an API for interactions from 3rd party applications.
- [Remember to join the Discord](https://discord.gg/QuStdQGSGK)!
- [Documentation](https://docs.mealie.io)
- [Documentation](https://nightly.mealie.io)
<!-- CONTRIBUTING -->
## Contributing
Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are **greatly appreciated**. If you're going to be working on the code-base you'll want to use the nightly documentation to ensure you get the latest information.
Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are **greatly appreciated**. If you're going to be working on the code-base, you'll want to use the nightly documentation to ensure you get the latest information.
- See the [Contributors Guide](https://nightly.mealie.io/contributors/developers-guide/code-contributions/) for help getting started.
- We use VSCode Dev Contains to make it easy for contributors to get started!
- We use [VSCode Dev Containers](https://code.visualstudio.com/docs/remote/containers) to make it easy for contributors to get started!
If you are not a coder, you can still contribute financially. financial contributions help me prioritize working on this project over others and helps me know that there is a real demand for project development.
If you are not a coder, you can still contribute financially. Financial contributions help me prioritize working on this project over others and helps me know that there is a real demand for project development.
<a href="https://www.buymeacoffee.com/haykot" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-green.png" alt="Buy Me A Coffee" style="height: 30px !important;width: 107px !important;" ></a>
<!-- LICENSE -->
## License
Distributed under the MIT License. See `LICENSE` for more information.
Distributed under the AGPL License. See `LICENSE` for more information.
## Sponsors
Huge thanks to all the sponsors of this project on [Github Sponsors](https://github.com/sponsors/hay-kot) and Buy Me a Coffee. Without you this project would surely not be possible.
Huge thanks to all the sponsors of this project on [Github Sponsors](https://github.com/sponsors/hay-kot) and Buy Me a Coffee. Without you, this project would surely not be possible.
Thanks to Linode for providing Hosting for the Demo, Beta, and Documentation sites! Another big thanks to JetBrains for providing their IDEs for development.
@@ -99,7 +87,7 @@ Thanks to Linode for providing Hosting for the Demo, Beta, and Documentation sit
[issues-shield]: https://img.shields.io/github/issues/hay-kot/mealie.svg?style=flat-square
[issues-url]: https://github.com/hay-kot/mealie/issues
[license-shield]: https://img.shields.io/github/license/hay-kot/mealie.svg?style=flat-square
[license-url]: https://github.com/hay-kot/mealie/blob/master/LICENSE.txt
[license-url]: https://github.com/hay-kot/mealie/blob/mealie-next/LICENSE
[linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=flat-square&logo=linkedin&colorB=555
[linkedin-url]: https://linkedin.com/in/hay-kot
[product-screenshot]: docs/docs/assets/img/home_screenshot.png

9
SECURITY.md Normal file
View File

@@ -0,0 +1,9 @@
# Security Policy
## Supported Versions
Since this software is still considered beta/WIP support is always only given for the latest version. Security patches are only available for the latest version and not back-ported to older versions.
## Reporting a Vulnerability
For general security vulnerabilities you're welcome to open a GitHub issues or contribute a fix. If you feel the vulnerability should not be disclosed you can open a generic issue on GitHub and email to the details to [ob92oy0sl@mozmail.com](mailto:ob92oy0sl@mozmail.com) which is monitored by the maintainer.

View File

@@ -23,8 +23,8 @@ def is_postgres():
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
# SQLite doesn't require migration as types are not inforced.
# Postgres Specifc Migration
# SQLite doesn't require migration as types are not enforced.
# Postgres Specific Migration
if is_postgres():
op.alter_column(
"recipes_ingredients",
@@ -38,8 +38,8 @@ def upgrade():
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
# SQLite doesn't require migration as types are not inforced.
# Postgres Specifc Migration
# SQLite doesn't require migration as types are not enforced.
# Postgres Specific Migration
if is_postgres():
op.alter_column(
"recipes_ingredients",

View File

@@ -0,0 +1,30 @@
"""Add use_abbreviation column to ingredients
Revision ID: ab0bae02578f
Revises: 09dfc897ad62
Create Date: 2022-06-01 11:12:06.748383
"""
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "ab0bae02578f"
down_revision = "09dfc897ad62"
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column("ingredient_units", sa.Column("use_abbreviation", sa.Boolean(), nullable=True))
op.execute("UPDATE ingredient_units SET use_abbreviation = FALSE WHERE use_abbreviation IS NULL")
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column("ingredient_units", "use_abbreviation")
# ### end Alembic commands ###

View File

@@ -0,0 +1,31 @@
"""add new webhook fields
Revision ID: f30cf048c228
Revises: ab0bae02578f
Create Date: 2022-06-15 21:05:34.851857
"""
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "f30cf048c228"
down_revision = "ab0bae02578f"
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column("webhook_urls", sa.Column("webhook_type", sa.String(), nullable=True))
op.add_column("webhook_urls", sa.Column("scheduled_time", sa.Time(), nullable=True))
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column("webhook_urls", "scheduled_time")
op.drop_column("webhook_urls", "webhook_type")
# ### end Alembic commands ###

View File

@@ -0,0 +1,26 @@
"""add login_attemps and locked_at field to user table
Revision ID: 188374910655
Revises: f30cf048c228
Create Date: 2022-08-12 19:05:59.776361
"""
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "188374910655"
down_revision = "f30cf048c228"
branch_labels = None
depends_on = None
def upgrade():
op.add_column("users", sa.Column("login_attemps", sa.Integer(), nullable=True))
op.add_column("users", sa.Column("locked_at", sa.DateTime(), nullable=True))
def downgrade():
op.drop_column("users", "locked_at")
op.drop_column("users", "login_attemps")

View File

@@ -0,0 +1,27 @@
"""Add is_ocr_recipe column to recipes
Revision ID: 089bfa50d0ed
Revises: 188374910655
Create Date: 2022-08-05 17:07:07.389271
"""
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "089bfa50d0ed"
down_revision = "188374910655"
branch_labels = None
depends_on = None
def upgrade():
op.add_column("recipes", sa.Column("is_ocr_recipe", sa.Boolean(), default=False, nullable=True))
op.execute("UPDATE recipes SET is_ocr_recipe = FALSE")
# SQLITE does not support ALTER COLUMN, so the column will stay nullable to prevent making this migration a mess
# The Recipe pydantic model and the SQL server use False as default value anyway for this column so Null should be a very rare sight
def downgrade():
op.drop_column("recipes", "is_ocr_recipe")

View File

@@ -0,0 +1,72 @@
"""add extras to shopping lists, list items, and ingredient foods
Revision ID: 44e8d670719d
Revises: 089bfa50d0ed
Create Date: 2022-08-29 13:57:40.452245
"""
import sqlalchemy as sa
import mealie.db.migration_types
from alembic import op
# revision identifiers, used by Alembic.
revision = "44e8d670719d"
down_revision = "089bfa50d0ed"
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table(
"shopping_list_extras",
sa.Column("created_at", sa.DateTime(), nullable=True),
sa.Column("update_at", sa.DateTime(), nullable=True),
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("key_name", sa.String(), nullable=True),
sa.Column("value", sa.String(), nullable=True),
sa.Column("shopping_list_id", mealie.db.migration_types.GUID(), nullable=True),
sa.ForeignKeyConstraint(
["shopping_list_id"],
["shopping_lists.id"],
),
sa.PrimaryKeyConstraint("id"),
)
op.create_table(
"ingredient_food_extras",
sa.Column("created_at", sa.DateTime(), nullable=True),
sa.Column("update_at", sa.DateTime(), nullable=True),
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("key_name", sa.String(), nullable=True),
sa.Column("value", sa.String(), nullable=True),
sa.Column("ingredient_food_id", mealie.db.migration_types.GUID(), nullable=True),
sa.ForeignKeyConstraint(
["ingredient_food_id"],
["ingredient_foods.id"],
),
sa.PrimaryKeyConstraint("id"),
)
op.create_table(
"shopping_list_item_extras",
sa.Column("created_at", sa.DateTime(), nullable=True),
sa.Column("update_at", sa.DateTime(), nullable=True),
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("key_name", sa.String(), nullable=True),
sa.Column("value", sa.String(), nullable=True),
sa.Column("shopping_list_item_id", mealie.db.migration_types.GUID(), nullable=True),
sa.ForeignKeyConstraint(
["shopping_list_item_id"],
["shopping_list_items.id"],
),
sa.PrimaryKeyConstraint("id"),
)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_table("shopping_list_item_extras")
op.drop_table("ingredient_food_extras")
op.drop_table("shopping_list_extras")
# ### end Alembic commands ###

View File

@@ -0,0 +1,50 @@
"""add recipe_timeline_events table
Revision ID: 2ea7a807915c
Revises: 44e8d670719d
Create Date: 2022-09-27 14:53:14.111054
"""
import sqlalchemy as sa
import mealie.db.migration_types
from alembic import op
# revision identifiers, used by Alembic.
revision = "2ea7a807915c"
down_revision = "44e8d670719d"
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table(
"recipe_timeline_events",
sa.Column("created_at", sa.DateTime(), nullable=True),
sa.Column("update_at", sa.DateTime(), nullable=True),
sa.Column("id", mealie.db.migration_types.GUID(), nullable=False),
sa.Column("recipe_id", mealie.db.migration_types.GUID(), nullable=False),
sa.Column("user_id", mealie.db.migration_types.GUID(), nullable=False),
sa.Column("subject", sa.String(), nullable=False),
sa.Column("message", sa.String(), nullable=True),
sa.Column("event_type", sa.String(), nullable=True),
sa.Column("image", sa.String(), nullable=True),
sa.Column("timestamp", sa.DateTime(), nullable=True),
sa.ForeignKeyConstraint(
["recipe_id"],
["recipes.id"],
),
sa.ForeignKeyConstraint(
["user_id"],
["users.id"],
),
sa.PrimaryKeyConstraint("id"),
)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_table("recipe_timeline_events")
# ### end Alembic commands ###

View File

@@ -0,0 +1,28 @@
"""added recipe last made timestamp
Revision ID: 1923519381ad
Revises: 2ea7a807915c
Create Date: 2022-11-03 13:10:24.811134
"""
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "1923519381ad"
down_revision = "2ea7a807915c"
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column("recipes", sa.Column("last_made", sa.DateTime(), nullable=True))
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column("recipes", "last_made")
# ### end Alembic commands ###

View File

@@ -0,0 +1,29 @@
"""add recipe_scale to shopping list item ref
Revision ID: 167eb69066ad
Revises: 1923519381ad
Create Date: 2022-11-22 03:42:45.494567
"""
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "167eb69066ad"
down_revision = "1923519381ad"
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column("shopping_list_item_recipe_reference", sa.Column("recipe_scale", sa.Float(), nullable=True))
op.execute("UPDATE shopping_list_item_recipe_reference SET recipe_scale = 1")
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column("shopping_list_item_recipe_reference", "recipe_scale")
# ### end Alembic commands ###

View File

@@ -0,0 +1,43 @@
"""add related user to mealplan
Revision ID: 165d943c64ee
Revises: 167eb69066ad
Create Date: 2023-01-21 16:54:44.368768
"""
import sqlalchemy as sa
import mealie.db.migration_types
from alembic import op
# revision identifiers, used by Alembic.
revision = "165d943c64ee"
down_revision = "167eb69066ad"
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table("group_meal_plans", schema=None) as batch_op:
batch_op.add_column(sa.Column("user_id", mealie.db.migration_types.GUID(), nullable=True))
batch_op.create_index(batch_op.f("ix_group_meal_plans_user_id"), ["user_id"], unique=False)
batch_op.create_foreign_key("fk_user_mealplans", "users", ["user_id"], ["id"])
with op.batch_alter_table("shopping_list_item_recipe_reference", schema=None) as batch_op:
batch_op.alter_column("recipe_scale", existing_type=sa.FLOAT(), nullable=False)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table("shopping_list_item_recipe_reference", schema=None) as batch_op:
batch_op.alter_column("recipe_scale", existing_type=sa.FLOAT(), nullable=True)
with op.batch_alter_table("group_meal_plans", schema=None) as batch_op:
batch_op.drop_constraint("fk_user_mealplans", type_="foreignkey")
batch_op.drop_index(batch_op.f("ix_group_meal_plans_user_id"))
batch_op.drop_column("user_id")
# ### end Alembic commands ###

View File

@@ -0,0 +1,280 @@
"""add missing foreign key and order indices
Revision ID: ff5f73b01a7a
Revises: 165d943c64ee
Create Date: 2023-02-07 20:57:21.066927
"""
from alembic import op
# revision identifiers, used by Alembic.
revision = "ff5f73b01a7a"
down_revision = "165d943c64ee"
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_index(op.f("ix_api_extras_created_at"), "api_extras", ["created_at"], unique=False)
op.create_index(op.f("ix_api_extras_recipee_id"), "api_extras", ["recipee_id"], unique=False)
op.create_index(op.f("ix_categories_created_at"), "categories", ["created_at"], unique=False)
op.create_index(op.f("ix_cookbooks_created_at"), "cookbooks", ["created_at"], unique=False)
op.create_index(op.f("ix_cookbooks_group_id"), "cookbooks", ["group_id"], unique=False)
op.create_index(op.f("ix_cookbooks_slug"), "cookbooks", ["slug"], unique=False)
op.create_index(
op.f("ix_cookbooks_to_categories_category_id"), "cookbooks_to_categories", ["category_id"], unique=False
)
op.create_index(
op.f("ix_cookbooks_to_categories_cookbook_id"), "cookbooks_to_categories", ["cookbook_id"], unique=False
)
op.create_index(op.f("ix_cookbooks_to_tags_cookbook_id"), "cookbooks_to_tags", ["cookbook_id"], unique=False)
op.create_index(op.f("ix_cookbooks_to_tags_tag_id"), "cookbooks_to_tags", ["tag_id"], unique=False)
op.create_index(op.f("ix_cookbooks_to_tools_cookbook_id"), "cookbooks_to_tools", ["cookbook_id"], unique=False)
op.create_index(op.f("ix_cookbooks_to_tools_tool_id"), "cookbooks_to_tools", ["tool_id"], unique=False)
op.create_index(op.f("ix_group_data_exports_created_at"), "group_data_exports", ["created_at"], unique=False)
op.create_index(
op.f("ix_group_events_notifier_options_created_at"),
"group_events_notifier_options",
["created_at"],
unique=False,
)
op.create_index(
op.f("ix_group_events_notifiers_created_at"), "group_events_notifiers", ["created_at"], unique=False
)
op.create_index(op.f("ix_group_meal_plan_rules_created_at"), "group_meal_plan_rules", ["created_at"], unique=False)
op.create_index(op.f("ix_group_meal_plan_rules_group_id"), "group_meal_plan_rules", ["group_id"], unique=False)
op.create_index(op.f("ix_group_meal_plans_created_at"), "group_meal_plans", ["created_at"], unique=False)
op.create_index(op.f("ix_group_preferences_created_at"), "group_preferences", ["created_at"], unique=False)
op.create_index(op.f("ix_group_reports_created_at"), "group_reports", ["created_at"], unique=False)
op.create_index(op.f("ix_group_to_categories_category_id"), "group_to_categories", ["category_id"], unique=False)
op.create_index(op.f("ix_group_to_categories_group_id"), "group_to_categories", ["group_id"], unique=False)
op.create_index(op.f("ix_groups_created_at"), "groups", ["created_at"], unique=False)
op.create_index(
op.f("ix_ingredient_food_extras_created_at"), "ingredient_food_extras", ["created_at"], unique=False
)
op.create_index(
op.f("ix_ingredient_food_extras_ingredient_food_id"),
"ingredient_food_extras",
["ingredient_food_id"],
unique=False,
)
op.create_index(op.f("ix_ingredient_foods_created_at"), "ingredient_foods", ["created_at"], unique=False)
op.create_index(op.f("ix_ingredient_foods_group_id"), "ingredient_foods", ["group_id"], unique=False)
op.create_index(op.f("ix_ingredient_foods_label_id"), "ingredient_foods", ["label_id"], unique=False)
op.create_index(op.f("ix_ingredient_units_created_at"), "ingredient_units", ["created_at"], unique=False)
op.create_index(op.f("ix_ingredient_units_group_id"), "ingredient_units", ["group_id"], unique=False)
op.create_index(op.f("ix_invite_tokens_created_at"), "invite_tokens", ["created_at"], unique=False)
op.create_index(op.f("ix_invite_tokens_group_id"), "invite_tokens", ["group_id"], unique=False)
op.create_index(op.f("ix_long_live_tokens_created_at"), "long_live_tokens", ["created_at"], unique=False)
op.create_index(op.f("ix_long_live_tokens_token"), "long_live_tokens", ["token"], unique=False)
op.create_index(op.f("ix_long_live_tokens_user_id"), "long_live_tokens", ["user_id"], unique=False)
op.create_index(op.f("ix_multi_purpose_labels_created_at"), "multi_purpose_labels", ["created_at"], unique=False)
op.create_index(op.f("ix_notes_created_at"), "notes", ["created_at"], unique=False)
op.create_index(op.f("ix_notes_recipe_id"), "notes", ["recipe_id"], unique=False)
op.create_index(op.f("ix_password_reset_tokens_created_at"), "password_reset_tokens", ["created_at"], unique=False)
op.create_index(op.f("ix_password_reset_tokens_user_id"), "password_reset_tokens", ["user_id"], unique=False)
op.create_index(
op.f("ix_plan_rules_to_categories_category_id"), "plan_rules_to_categories", ["category_id"], unique=False
)
op.create_index(
op.f("ix_plan_rules_to_categories_group_plan_rule_id"),
"plan_rules_to_categories",
["group_plan_rule_id"],
unique=False,
)
op.create_index(op.f("ix_plan_rules_to_tags_plan_rule_id"), "plan_rules_to_tags", ["plan_rule_id"], unique=False)
op.create_index(op.f("ix_plan_rules_to_tags_tag_id"), "plan_rules_to_tags", ["tag_id"], unique=False)
op.create_index(op.f("ix_recipe_assets_created_at"), "recipe_assets", ["created_at"], unique=False)
op.create_index(op.f("ix_recipe_assets_recipe_id"), "recipe_assets", ["recipe_id"], unique=False)
op.create_index(op.f("ix_recipe_comments_created_at"), "recipe_comments", ["created_at"], unique=False)
op.create_index(op.f("ix_recipe_comments_recipe_id"), "recipe_comments", ["recipe_id"], unique=False)
op.create_index(op.f("ix_recipe_comments_user_id"), "recipe_comments", ["user_id"], unique=False)
op.create_index(
op.f("ix_recipe_ingredient_ref_link_created_at"), "recipe_ingredient_ref_link", ["created_at"], unique=False
)
op.create_index(
op.f("ix_recipe_ingredient_ref_link_instruction_id"),
"recipe_ingredient_ref_link",
["instruction_id"],
unique=False,
)
op.create_index(
op.f("ix_recipe_ingredient_ref_link_reference_id"), "recipe_ingredient_ref_link", ["reference_id"], unique=False
)
op.create_index(op.f("ix_recipe_instructions_created_at"), "recipe_instructions", ["created_at"], unique=False)
op.create_index(op.f("ix_recipe_instructions_position"), "recipe_instructions", ["position"], unique=False)
op.create_index(op.f("ix_recipe_instructions_recipe_id"), "recipe_instructions", ["recipe_id"], unique=False)
op.create_index(op.f("ix_recipe_nutrition_created_at"), "recipe_nutrition", ["created_at"], unique=False)
op.create_index(op.f("ix_recipe_nutrition_recipe_id"), "recipe_nutrition", ["recipe_id"], unique=False)
op.create_index(op.f("ix_recipe_settings_created_at"), "recipe_settings", ["created_at"], unique=False)
op.create_index(op.f("ix_recipe_settings_recipe_id"), "recipe_settings", ["recipe_id"], unique=False)
op.create_index(op.f("ix_recipe_share_tokens_created_at"), "recipe_share_tokens", ["created_at"], unique=False)
op.create_index(op.f("ix_recipe_share_tokens_recipe_id"), "recipe_share_tokens", ["recipe_id"], unique=False)
op.create_index(
op.f("ix_recipe_timeline_events_created_at"), "recipe_timeline_events", ["created_at"], unique=False
)
op.create_index(op.f("ix_recipe_timeline_events_recipe_id"), "recipe_timeline_events", ["recipe_id"], unique=False)
op.create_index(op.f("ix_recipe_timeline_events_timestamp"), "recipe_timeline_events", ["timestamp"], unique=False)
op.create_index(op.f("ix_recipe_timeline_events_user_id"), "recipe_timeline_events", ["user_id"], unique=False)
op.create_index(op.f("ix_recipes_created_at"), "recipes", ["created_at"], unique=False)
op.create_index(op.f("ix_recipes_name"), "recipes", ["name"], unique=False)
op.create_index(op.f("ix_recipes_ingredients_created_at"), "recipes_ingredients", ["created_at"], unique=False)
op.create_index(op.f("ix_recipes_ingredients_food_id"), "recipes_ingredients", ["food_id"], unique=False)
op.create_index(op.f("ix_recipes_ingredients_position"), "recipes_ingredients", ["position"], unique=False)
op.create_index(op.f("ix_recipes_ingredients_unit_id"), "recipes_ingredients", ["unit_id"], unique=False)
op.create_index(
op.f("ix_recipes_to_categories_category_id"), "recipes_to_categories", ["category_id"], unique=False
)
op.create_index(op.f("ix_recipes_to_categories_recipe_id"), "recipes_to_categories", ["recipe_id"], unique=False)
op.create_index(op.f("ix_recipes_to_tags_recipe_id"), "recipes_to_tags", ["recipe_id"], unique=False)
op.create_index(op.f("ix_recipes_to_tags_tag_id"), "recipes_to_tags", ["tag_id"], unique=False)
op.create_index(op.f("ix_recipes_to_tools_recipe_id"), "recipes_to_tools", ["recipe_id"], unique=False)
op.create_index(op.f("ix_recipes_to_tools_tool_id"), "recipes_to_tools", ["tool_id"], unique=False)
op.create_index(op.f("ix_report_entries_created_at"), "report_entries", ["created_at"], unique=False)
op.create_index(op.f("ix_report_entries_report_id"), "report_entries", ["report_id"], unique=False)
op.create_index(op.f("ix_server_tasks_created_at"), "server_tasks", ["created_at"], unique=False)
op.create_index(op.f("ix_shopping_list_extras_created_at"), "shopping_list_extras", ["created_at"], unique=False)
op.create_index(
op.f("ix_shopping_list_extras_shopping_list_id"), "shopping_list_extras", ["shopping_list_id"], unique=False
)
op.create_index(
op.f("ix_shopping_list_item_extras_created_at"), "shopping_list_item_extras", ["created_at"], unique=False
)
op.create_index(
op.f("ix_shopping_list_item_extras_shopping_list_item_id"),
"shopping_list_item_extras",
["shopping_list_item_id"],
unique=False,
)
op.create_index(
op.f("ix_shopping_list_item_recipe_reference_created_at"),
"shopping_list_item_recipe_reference",
["created_at"],
unique=False,
)
op.create_index(op.f("ix_shopping_list_items_created_at"), "shopping_list_items", ["created_at"], unique=False)
op.create_index(op.f("ix_shopping_list_items_position"), "shopping_list_items", ["position"], unique=False)
op.create_index(
op.f("ix_shopping_list_items_shopping_list_id"), "shopping_list_items", ["shopping_list_id"], unique=False
)
op.create_index(
op.f("ix_shopping_list_recipe_reference_created_at"),
"shopping_list_recipe_reference",
["created_at"],
unique=False,
)
op.create_index(op.f("ix_shopping_lists_created_at"), "shopping_lists", ["created_at"], unique=False)
op.create_index(op.f("ix_tags_created_at"), "tags", ["created_at"], unique=False)
op.create_index(op.f("ix_tools_created_at"), "tools", ["created_at"], unique=False)
op.create_index(op.f("ix_tools_group_id"), "tools", ["group_id"], unique=False)
op.create_index(op.f("ix_users_created_at"), "users", ["created_at"], unique=False)
op.create_index(op.f("ix_users_to_favorites_recipe_id"), "users_to_favorites", ["recipe_id"], unique=False)
op.create_index(op.f("ix_users_to_favorites_user_id"), "users_to_favorites", ["user_id"], unique=False)
op.create_index(op.f("ix_webhook_urls_created_at"), "webhook_urls", ["created_at"], unique=False)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index(op.f("ix_webhook_urls_created_at"), table_name="webhook_urls")
op.drop_index(op.f("ix_users_to_favorites_user_id"), table_name="users_to_favorites")
op.drop_index(op.f("ix_users_to_favorites_recipe_id"), table_name="users_to_favorites")
op.drop_index(op.f("ix_users_created_at"), table_name="users")
op.drop_index(op.f("ix_tools_group_id"), table_name="tools")
op.drop_index(op.f("ix_tools_created_at"), table_name="tools")
op.drop_index(op.f("ix_tags_created_at"), table_name="tags")
op.drop_index(op.f("ix_shopping_lists_created_at"), table_name="shopping_lists")
op.drop_index(op.f("ix_shopping_list_recipe_reference_created_at"), table_name="shopping_list_recipe_reference")
op.drop_index(op.f("ix_shopping_list_items_shopping_list_id"), table_name="shopping_list_items")
op.drop_index(op.f("ix_shopping_list_items_position"), table_name="shopping_list_items")
op.drop_index(op.f("ix_shopping_list_items_created_at"), table_name="shopping_list_items")
op.drop_index(
op.f("ix_shopping_list_item_recipe_reference_created_at"), table_name="shopping_list_item_recipe_reference"
)
op.drop_index(op.f("ix_shopping_list_item_extras_shopping_list_item_id"), table_name="shopping_list_item_extras")
op.drop_index(op.f("ix_shopping_list_item_extras_created_at"), table_name="shopping_list_item_extras")
op.drop_index(op.f("ix_shopping_list_extras_shopping_list_id"), table_name="shopping_list_extras")
op.drop_index(op.f("ix_shopping_list_extras_created_at"), table_name="shopping_list_extras")
op.drop_index(op.f("ix_server_tasks_created_at"), table_name="server_tasks")
op.drop_index(op.f("ix_report_entries_report_id"), table_name="report_entries")
op.drop_index(op.f("ix_report_entries_created_at"), table_name="report_entries")
op.drop_index(op.f("ix_recipes_to_tools_tool_id"), table_name="recipes_to_tools")
op.drop_index(op.f("ix_recipes_to_tools_recipe_id"), table_name="recipes_to_tools")
op.drop_index(op.f("ix_recipes_to_tags_tag_id"), table_name="recipes_to_tags")
op.drop_index(op.f("ix_recipes_to_tags_recipe_id"), table_name="recipes_to_tags")
op.drop_index(op.f("ix_recipes_to_categories_recipe_id"), table_name="recipes_to_categories")
op.drop_index(op.f("ix_recipes_to_categories_category_id"), table_name="recipes_to_categories")
op.drop_index(op.f("ix_recipes_ingredients_unit_id"), table_name="recipes_ingredients")
op.drop_index(op.f("ix_recipes_ingredients_position"), table_name="recipes_ingredients")
op.drop_index(op.f("ix_recipes_ingredients_food_id"), table_name="recipes_ingredients")
op.drop_index(op.f("ix_recipes_ingredients_created_at"), table_name="recipes_ingredients")
op.drop_index(op.f("ix_recipes_name"), table_name="recipes")
op.drop_index(op.f("ix_recipes_created_at"), table_name="recipes")
op.drop_index(op.f("ix_recipe_timeline_events_user_id"), table_name="recipe_timeline_events")
op.drop_index(op.f("ix_recipe_timeline_events_timestamp"), table_name="recipe_timeline_events")
op.drop_index(op.f("ix_recipe_timeline_events_recipe_id"), table_name="recipe_timeline_events")
op.drop_index(op.f("ix_recipe_timeline_events_created_at"), table_name="recipe_timeline_events")
op.drop_index(op.f("ix_recipe_share_tokens_recipe_id"), table_name="recipe_share_tokens")
op.drop_index(op.f("ix_recipe_share_tokens_created_at"), table_name="recipe_share_tokens")
op.drop_index(op.f("ix_recipe_settings_recipe_id"), table_name="recipe_settings")
op.drop_index(op.f("ix_recipe_settings_created_at"), table_name="recipe_settings")
op.drop_index(op.f("ix_recipe_nutrition_recipe_id"), table_name="recipe_nutrition")
op.drop_index(op.f("ix_recipe_nutrition_created_at"), table_name="recipe_nutrition")
op.drop_index(op.f("ix_recipe_instructions_recipe_id"), table_name="recipe_instructions")
op.drop_index(op.f("ix_recipe_instructions_position"), table_name="recipe_instructions")
op.drop_index(op.f("ix_recipe_instructions_created_at"), table_name="recipe_instructions")
op.drop_index(op.f("ix_recipe_ingredient_ref_link_reference_id"), table_name="recipe_ingredient_ref_link")
op.drop_index(op.f("ix_recipe_ingredient_ref_link_instruction_id"), table_name="recipe_ingredient_ref_link")
op.drop_index(op.f("ix_recipe_ingredient_ref_link_created_at"), table_name="recipe_ingredient_ref_link")
op.drop_index(op.f("ix_recipe_comments_user_id"), table_name="recipe_comments")
op.drop_index(op.f("ix_recipe_comments_recipe_id"), table_name="recipe_comments")
op.drop_index(op.f("ix_recipe_comments_created_at"), table_name="recipe_comments")
op.drop_index(op.f("ix_recipe_assets_recipe_id"), table_name="recipe_assets")
op.drop_index(op.f("ix_recipe_assets_created_at"), table_name="recipe_assets")
op.drop_index(op.f("ix_plan_rules_to_tags_tag_id"), table_name="plan_rules_to_tags")
op.drop_index(op.f("ix_plan_rules_to_tags_plan_rule_id"), table_name="plan_rules_to_tags")
op.drop_index(op.f("ix_plan_rules_to_categories_group_plan_rule_id"), table_name="plan_rules_to_categories")
op.drop_index(op.f("ix_plan_rules_to_categories_category_id"), table_name="plan_rules_to_categories")
op.drop_index(op.f("ix_password_reset_tokens_user_id"), table_name="password_reset_tokens")
op.drop_index(op.f("ix_password_reset_tokens_created_at"), table_name="password_reset_tokens")
op.drop_index(op.f("ix_notes_recipe_id"), table_name="notes")
op.drop_index(op.f("ix_notes_created_at"), table_name="notes")
op.drop_index(op.f("ix_multi_purpose_labels_created_at"), table_name="multi_purpose_labels")
op.drop_index(op.f("ix_long_live_tokens_user_id"), table_name="long_live_tokens")
op.drop_index(op.f("ix_long_live_tokens_token"), table_name="long_live_tokens")
op.drop_index(op.f("ix_long_live_tokens_created_at"), table_name="long_live_tokens")
op.drop_index(op.f("ix_invite_tokens_group_id"), table_name="invite_tokens")
op.drop_index(op.f("ix_invite_tokens_created_at"), table_name="invite_tokens")
op.drop_index(op.f("ix_ingredient_units_group_id"), table_name="ingredient_units")
op.drop_index(op.f("ix_ingredient_units_created_at"), table_name="ingredient_units")
op.drop_index(op.f("ix_ingredient_foods_label_id"), table_name="ingredient_foods")
op.drop_index(op.f("ix_ingredient_foods_group_id"), table_name="ingredient_foods")
op.drop_index(op.f("ix_ingredient_foods_created_at"), table_name="ingredient_foods")
op.drop_index(op.f("ix_ingredient_food_extras_ingredient_food_id"), table_name="ingredient_food_extras")
op.drop_index(op.f("ix_ingredient_food_extras_created_at"), table_name="ingredient_food_extras")
op.drop_index(op.f("ix_groups_created_at"), table_name="groups")
op.drop_index(op.f("ix_group_to_categories_group_id"), table_name="group_to_categories")
op.drop_index(op.f("ix_group_to_categories_category_id"), table_name="group_to_categories")
op.drop_index(op.f("ix_group_reports_created_at"), table_name="group_reports")
op.drop_index(op.f("ix_group_preferences_created_at"), table_name="group_preferences")
op.drop_index(op.f("ix_group_meal_plans_created_at"), table_name="group_meal_plans")
op.drop_index(op.f("ix_group_meal_plan_rules_group_id"), table_name="group_meal_plan_rules")
op.drop_index(op.f("ix_group_meal_plan_rules_created_at"), table_name="group_meal_plan_rules")
op.drop_index(op.f("ix_group_events_notifiers_created_at"), table_name="group_events_notifiers")
op.drop_index(op.f("ix_group_events_notifier_options_created_at"), table_name="group_events_notifier_options")
op.drop_index(op.f("ix_group_data_exports_created_at"), table_name="group_data_exports")
op.drop_index(op.f("ix_cookbooks_to_tools_tool_id"), table_name="cookbooks_to_tools")
op.drop_index(op.f("ix_cookbooks_to_tools_cookbook_id"), table_name="cookbooks_to_tools")
op.drop_index(op.f("ix_cookbooks_to_tags_tag_id"), table_name="cookbooks_to_tags")
op.drop_index(op.f("ix_cookbooks_to_tags_cookbook_id"), table_name="cookbooks_to_tags")
op.drop_index(op.f("ix_cookbooks_to_categories_cookbook_id"), table_name="cookbooks_to_categories")
op.drop_index(op.f("ix_cookbooks_to_categories_category_id"), table_name="cookbooks_to_categories")
op.drop_index(op.f("ix_cookbooks_slug"), table_name="cookbooks")
op.drop_index(op.f("ix_cookbooks_group_id"), table_name="cookbooks")
op.drop_index(op.f("ix_cookbooks_created_at"), table_name="cookbooks")
op.drop_index(op.f("ix_categories_created_at"), table_name="categories")
op.drop_index(op.f("ix_api_extras_recipee_id"), table_name="api_extras")
op.drop_index(op.f("ix_api_extras_created_at"), table_name="api_extras")
# ### end Alembic commands ###

View File

@@ -0,0 +1,37 @@
"""add more indices necessary for search
Revision ID: 16160bf731a0
Revises: ff5f73b01a7a
Create Date: 2023-02-10 21:18:32.405130
"""
import sqlalchemy as sa
import mealie.db.migration_types
from alembic import op
# revision identifiers, used by Alembic.
revision = "16160bf731a0"
down_revision = "ff5f73b01a7a"
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_index(op.f("ix_recipe_instructions_text"), "recipe_instructions", ["text"], unique=False)
op.create_index(op.f("ix_recipes_description"), "recipes", ["description"], unique=False)
op.create_index(op.f("ix_recipes_ingredients_note"), "recipes_ingredients", ["note"], unique=False)
op.create_index(
op.f("ix_recipes_ingredients_original_text"), "recipes_ingredients", ["original_text"], unique=False
)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index(op.f("ix_recipes_ingredients_original_text"), table_name="recipes_ingredients")
op.drop_index(op.f("ix_recipes_ingredients_note"), table_name="recipes_ingredients")
op.drop_index(op.f("ix_recipes_description"), table_name="recipes")
op.drop_index(op.f("ix_recipe_instructions_text"), table_name="recipe_instructions")
# ### end Alembic commands ###

View File

@@ -0,0 +1,118 @@
"""add normalized search properties
Revision ID: 5ab195a474eb
Revises: 16160bf731a0
Create Date: 2023-02-14 20:45:41.102571
"""
import sqlalchemy as sa
from sqlalchemy import orm, select
from sqlalchemy.orm import Mapped, mapped_column, DeclarativeBase
from text_unidecode import unidecode
import mealie.db.migration_types
from alembic import op
from mealie.db.models._model_utils import GUID
# revision identifiers, used by Alembic.
revision = "5ab195a474eb"
down_revision = "16160bf731a0"
branch_labels = None
depends_on = None
class SqlAlchemyBase(DeclarativeBase):
pass
# Intermediate table definitions
class RecipeModel(SqlAlchemyBase):
__tablename__ = "recipes"
id: Mapped[GUID] = mapped_column(GUID, primary_key=True, default=GUID.generate)
name: Mapped[str] = mapped_column(sa.String, nullable=False)
description: Mapped[str | None] = mapped_column(sa.String)
name_normalized: Mapped[str] = mapped_column(sa.String, nullable=False, index=True)
description_normalized: Mapped[str | None] = mapped_column(sa.String, index=True)
class RecipeIngredient(SqlAlchemyBase):
__tablename__ = "recipes_ingredients"
id: Mapped[int] = mapped_column(sa.Integer, primary_key=True)
note: Mapped[str | None] = mapped_column(sa.String)
original_text: Mapped[str | None] = mapped_column(sa.String)
note_normalized: Mapped[str | None] = mapped_column(sa.String, index=True)
original_text_normalized: Mapped[str | None] = mapped_column(sa.String, index=True)
def do_data_migration():
bind = op.get_bind()
session = orm.Session(bind=bind)
recipes = session.execute(select(RecipeModel)).scalars().all()
ingredients = session.execute(select(RecipeIngredient)).scalars().all()
for recipe in recipes:
if recipe.name is not None:
recipe.name_normalized = unidecode(recipe.name).lower().strip()
if recipe.description is not None:
recipe.description_normalized = unidecode(recipe.description).lower().strip()
session.add(recipe)
for ingredient in ingredients:
if ingredient.note is not None:
ingredient.note_normalized = unidecode(ingredient.note).lower().strip()
if ingredient.original_text is not None:
ingredient.original_text_normalized = unidecode(ingredient.original_text).lower().strip()
session.add(ingredient)
session.commit()
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
# Set column to nullable first, since we do not have values here yet
op.add_column("recipes", sa.Column("name_normalized", sa.String(), nullable=True))
op.add_column("recipes", sa.Column("description_normalized", sa.String(), nullable=True))
op.drop_index("ix_recipes_description", table_name="recipes")
op.drop_index("ix_recipes_name", table_name="recipes")
op.create_index(op.f("ix_recipes_description_normalized"), "recipes", ["description_normalized"], unique=False)
op.create_index(op.f("ix_recipes_name_normalized"), "recipes", ["name_normalized"], unique=False)
op.add_column("recipes_ingredients", sa.Column("note_normalized", sa.String(), nullable=True))
op.add_column("recipes_ingredients", sa.Column("original_text_normalized", sa.String(), nullable=True))
op.drop_index("ix_recipes_ingredients_note", table_name="recipes_ingredients")
op.drop_index("ix_recipes_ingredients_original_text", table_name="recipes_ingredients")
op.create_index(
op.f("ix_recipes_ingredients_note_normalized"), "recipes_ingredients", ["note_normalized"], unique=False
)
op.create_index(
op.f("ix_recipes_ingredients_original_text_normalized"),
"recipes_ingredients",
["original_text_normalized"],
unique=False,
)
do_data_migration()
# Make recipes.name_normalized not nullable now that column should be filled for all rows
with op.batch_alter_table("recipes", schema=None) as batch_op:
batch_op.alter_column("name_normalized", nullable=False, existing_type=sa.String())
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index(op.f("ix_recipes_ingredients_original_text_normalized"), table_name="recipes_ingredients")
op.drop_index(op.f("ix_recipes_ingredients_note_normalized"), table_name="recipes_ingredients")
op.create_index("ix_recipes_ingredients_original_text", "recipes_ingredients", ["original_text"], unique=False)
op.create_index("ix_recipes_ingredients_note", "recipes_ingredients", ["note"], unique=False)
op.drop_column("recipes_ingredients", "original_text_normalized")
op.drop_column("recipes_ingredients", "note_normalized")
op.drop_index(op.f("ix_recipes_name_normalized"), table_name="recipes")
op.drop_index(op.f("ix_recipes_description_normalized"), table_name="recipes")
op.create_index("ix_recipes_name", "recipes", ["name"], unique=False)
op.create_index("ix_recipes_description", "recipes", ["description"], unique=False)
op.drop_column("recipes", "description_normalized")
op.drop_column("recipes", "name_normalized")
# ### end Alembic commands ###

View File

@@ -0,0 +1,69 @@
"""added shopping list label settings
Revision ID: b04a08da2108
Revises: 5ab195a474eb
Create Date: 2023-21-02 22:03:19.837244
"""
from uuid import uuid4
import sqlalchemy as sa
from sqlalchemy.orm.session import Session
import mealie.db.migration_types
from alembic import op
from mealie.db.models.group.shopping_list import ShoppingList
from mealie.db.models.labels import MultiPurposeLabel
# revision identifiers, used by Alembic.
revision = "b04a08da2108"
down_revision = "5ab195a474eb"
branch_labels = None
depends_on = None
def populate_shopping_lists_multi_purpose_labels(shopping_lists_multi_purpose_labels_table: sa.Table, session: Session):
shopping_lists = session.query(ShoppingList).all()
labels = session.query(MultiPurposeLabel).all()
shopping_lists_labels_data: list[dict] = []
for shopping_list in shopping_lists:
for i, label in enumerate(labels):
shopping_lists_labels_data.append(
{"id": uuid4(), "shopping_list_id": shopping_list.id, "label_id": label.id, "position": i}
)
op.bulk_insert(shopping_lists_multi_purpose_labels_table, shopping_lists_labels_data)
session.commit()
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
shopping_lists_multi_purpose_labels_table = op.create_table(
"shopping_lists_multi_purpose_labels",
sa.Column("created_at", sa.DateTime(), nullable=True),
sa.Column("update_at", sa.DateTime(), nullable=True),
sa.Column("id", mealie.db.migration_types.GUID(), nullable=False),
sa.Column("shopping_list_id", mealie.db.migration_types.GUID(), nullable=False),
sa.Column("label_id", mealie.db.migration_types.GUID(), nullable=False),
sa.Column("position", sa.Integer(), nullable=False),
sa.ForeignKeyConstraint(
["label_id"],
["multi_purpose_labels.id"],
),
sa.ForeignKeyConstraint(
["shopping_list_id"],
["shopping_lists.id"],
),
sa.PrimaryKeyConstraint("id", "shopping_list_id", "label_id"),
)
# ### end Alembic commands ###
session = Session(bind=op.get_bind())
populate_shopping_lists_multi_purpose_labels(shopping_lists_multi_purpose_labels_table, session)
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_table("shopping_lists_multi_purpose_labels")
# ### end Alembic commands ###

View File

@@ -0,0 +1,43 @@
"""add auth_method to user table
Revision ID: 38514b39a824
Revises: b04a08da2108
Create Date: 2023-02-22 21:45:52.900964
"""
import sqlalchemy as sa
import mealie.db.migration_types
from alembic import op
# revision identifiers, used by Alembic.
revision = "38514b39a824"
down_revision = "b04a08da2108"
branch_labels = None
depends_on = None
def is_postgres():
return op.get_context().dialect.name == "postgresql"
authMethod = sa.Enum("MEALIE", "LDAP", name="authmethod")
def upgrade():
if is_postgres():
authMethod.create(op.get_bind())
op.add_column(
"users",
sa.Column("auth_method", authMethod, nullable=False, server_default="MEALIE"),
)
op.execute("UPDATE users SET auth_method = 'LDAP' WHERE password = 'LDAP'")
def downgrade():
with op.batch_alter_table("users", schema=None) as batch_op:
batch_op.drop_column("auth_method")
if is_postgres():
authMethod.drop(op.get_bind())

View File

@@ -0,0 +1,89 @@
"""postgres fuzzy search
Revision ID: b3dbb554ba53
Revises: 38514b39a824
Create Date: 2023-04-13 06:47:04.617131
"""
import sqlalchemy as sa
import mealie.db.migration_types
from alembic import op
import alembic.context as context
from mealie.core.config import get_app_settings
# revision identifiers, used by Alembic.
revision = "b3dbb554ba53"
down_revision = "38514b39a824"
branch_labels = None
depends_on = None
def get_db_type():
return op.get_context().dialect.name
def setup_postgres_trigrams():
op.execute("CREATE EXTENSION IF NOT EXISTS pg_trgm;")
op.create_index(
"ix_recipes_name_normalized_gin",
table_name="recipes",
columns=["name_normalized"],
unique=False,
postgresql_using="gin",
postgresql_ops={
"name_normalized": "gin_trgm_ops",
},
)
op.create_index(
"ix_recipes_description_normalized_gin",
table_name="recipes",
columns=["description_normalized"],
unique=False,
postgresql_using="gin",
postgresql_ops={
"description_normalized": "gin_trgm_ops",
},
)
op.create_index(
"ix_recipes_ingredients_note_normalized_gin",
table_name="recipes_ingredients",
columns=["note_normalized"],
unique=False,
postgresql_using="gin",
postgresql_ops={
"note_normalized": "gin_trgm_ops",
},
)
op.create_index(
"ix_recipes_ingredients_original_text_normalized_gin",
table_name="recipes_ingredients",
columns=["original_text_normalized"],
unique=False,
postgresql_using="gin",
postgresql_ops={
"original_text_normalized": "gin_trgm_ops",
},
)
def remove_postgres_trigrams():
op.execute("DROP EXTENSION IF EXISTS pg_trgm;")
op.drop_index("ix_recipes_name_normalized_gin", table_name="recipe")
op.drop_index("ix_recipes_description_normalized_gin", table_name="recipe")
op.drop_index("ix_recipes_ingredients_note_normalized_gin", table_name="recipes_ingredients")
op.drop_index("ix_recipes_ingredients_original_text_normalized_gin", table_name="recipes_ingredients")
def upgrade():
if get_db_type() == "postgresql":
setup_postgres_trigrams()
else:
pass
def downgrade():
if get_db_type() == "postgres":
remove_postgres_trigrams()
else:
pass

View File

@@ -0,0 +1,56 @@
"""added group slug
Revision ID: 04ac51cbe9a4
Revises: b3dbb554ba53
Create Date: 2023-08-06 21:00:34.582905
"""
import sqlalchemy as sa
from slugify import slugify
from sqlalchemy.orm import Session
from alembic import op
from mealie.db.models.group.group import Group
# revision identifiers, used by Alembic.
revision = "04ac51cbe9a4"
down_revision = "b3dbb554ba53"
branch_labels = None
depends_on = None
def populate_group_slugs(session: Session):
groups: list[Group] = session.query(Group).all()
seen_slugs: set[str] = set()
for group in groups:
original_name = group.name
attempts = 0
while True:
slug = slugify(group.name)
if slug not in seen_slugs:
break
attempts += 1
group.name = f"{original_name} ({attempts})"
seen_slugs.add(slug)
group.slug = slug
session.commit()
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column("groups", sa.Column("slug", sa.String(), nullable=True))
op.create_index(op.f("ix_groups_slug"), "groups", ["slug"], unique=True)
# ### end Alembic commands ###
session = Session(bind=op.get_bind())
populate_group_slugs(session)
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index(op.f("ix_groups_slug"), table_name="groups")
op.drop_column("groups", "slug")
# ### end Alembic commands ###

View File

@@ -0,0 +1,28 @@
"""added recipe note to shopping list recipe ref
Revision ID: 1825b5225403
Revises: 04ac51cbe9a4
Create Date: 2023-08-14 19:30:49.103185
"""
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "1825b5225403"
down_revision = "04ac51cbe9a4"
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column("shopping_list_item_recipe_reference", sa.Column("recipe_note", sa.String(), nullable=True))
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column("shopping_list_item_recipe_reference", "recipe_note")
# ### end Alembic commands ###

View File

@@ -0,0 +1,32 @@
"""remove tool name and slug unique contraints
Revision ID: bcfdad6b7355
Revises: 1825b5225403
Create Date: 2023-08-15 16:25:07.058929
"""
from alembic import op
# revision identifiers, used by Alembic.
revision = "bcfdad6b7355"
down_revision = "1825b5225403"
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index("ix_tools_name", table_name="tools")
op.create_index(op.f("ix_tools_name"), "tools", ["name"], unique=False)
op.drop_index("ix_tools_slug", table_name="tools")
op.create_index(op.f("ix_tools_slug"), "tools", ["slug"], unique=False)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index(op.f("ix_tools_slug"), table_name="tools")
op.create_index("ix_tools_slug", "tools", ["slug"], unique=True)
op.drop_index(op.f("ix_tools_name"), table_name="tools")
op.create_index("ix_tools_name", "tools", ["name"], unique=True)
# ### end Alembic commands ###

View File

@@ -0,0 +1,71 @@
"""added normalized unit and food names
Revision ID: 0341b154f79a
Revises: bcfdad6b7355
Create Date: 2023-09-01 14:55:42.166766
"""
import sqlalchemy as sa
from sqlalchemy import orm, select
from alembic import op
from mealie.db.models.recipe.ingredient import IngredientFoodModel, IngredientUnitModel
# revision identifiers, used by Alembic.
revision = "0341b154f79a"
down_revision = "bcfdad6b7355"
branch_labels = None
depends_on = None
def populate_normalized_fields():
bind = op.get_bind()
session = orm.Session(bind=bind)
units = session.execute(select(IngredientUnitModel)).scalars().all()
for unit in units:
if unit.name is not None:
unit.name_normalized = IngredientUnitModel.normalize(unit.name)
if unit.abbreviation is not None:
unit.abbreviation_normalized = IngredientUnitModel.normalize(unit.abbreviation)
session.add(unit)
foods = session.execute(select(IngredientFoodModel)).scalars().all()
for food in foods:
if food.name is not None:
food.name_normalized = IngredientFoodModel.normalize(food.name)
session.add(food)
session.commit()
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column("ingredient_foods", sa.Column("name_normalized", sa.String(), nullable=True))
op.create_index(op.f("ix_ingredient_foods_name_normalized"), "ingredient_foods", ["name_normalized"], unique=False)
op.add_column("ingredient_units", sa.Column("name_normalized", sa.String(), nullable=True))
op.add_column("ingredient_units", sa.Column("abbreviation_normalized", sa.String(), nullable=True))
op.create_index(
op.f("ix_ingredient_units_abbreviation_normalized"),
"ingredient_units",
["abbreviation_normalized"],
unique=False,
)
op.create_index(op.f("ix_ingredient_units_name_normalized"), "ingredient_units", ["name_normalized"], unique=False)
# ### end Alembic commands ###
populate_normalized_fields()
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index(op.f("ix_ingredient_units_name_normalized"), table_name="ingredient_units")
op.drop_index(op.f("ix_ingredient_units_abbreviation_normalized"), table_name="ingredient_units")
op.drop_column("ingredient_units", "abbreviation_normalized")
op.drop_column("ingredient_units", "name_normalized")
op.drop_index(op.f("ix_ingredient_foods_name_normalized"), table_name="ingredient_foods")
op.drop_column("ingredient_foods", "name_normalized")
# ### end Alembic commands ###

View File

@@ -0,0 +1,172 @@
"""added unique constraints
Revision ID: dded3119c1fe
Revises: 0341b154f79a
Create Date: 2023-10-04 14:29:26.688065
"""
from dataclasses import dataclass
from typing import Any
import sqlalchemy as sa
from sqlalchemy.orm import Session
import mealie.db.migration_types
from alembic import op
from mealie.db.models._model_base import SqlAlchemyBase
# revision identifiers, used by Alembic.
revision = "dded3119c1fe"
down_revision = "0341b154f79a"
branch_labels = None
depends_on = None
@dataclass
class TableMeta:
tablename: str
pk_1: str
pk_2: str
@classmethod
def composite_pk(self, pk_1_val: Any, pk_2_val: Any) -> str:
return "$$".join([pk_1_val, pk_2_val])
def _is_postgres():
return op.get_context().dialect.name == "postgresql"
def _remove_duplicates_from_m2m_table(session: Session, table_meta: TableMeta):
if _is_postgres():
default_pk = "CTID"
else:
default_pk = "ROWID"
# some of these tables are missing defined unique pks, so we have to rely on the database default pk
query = sa.text(
f"""
DELETE FROM {table_meta.tablename}
WHERE EXISTS (
SELECT 1 FROM {table_meta.tablename} t2
WHERE {table_meta.tablename}.{table_meta.pk_1} = t2.{table_meta.pk_1}
AND {table_meta.tablename}.{table_meta.pk_2} = t2.{table_meta.pk_2}
AND {table_meta.tablename}.{default_pk} > t2.{default_pk}
)
"""
)
session.execute(query)
session.commit()
def _remove_duplicates_from_m2m_tables(table_metas: list[TableMeta]):
bind = op.get_bind()
session = Session(bind=bind)
for table_meta in table_metas:
_remove_duplicates_from_m2m_table(session, table_meta)
def upgrade():
_remove_duplicates_from_m2m_tables(
[
# M2M
TableMeta("cookbooks_to_categories", "cookbook_id", "category_id"),
TableMeta("cookbooks_to_tags", "cookbook_id", "tag_id"),
TableMeta("cookbooks_to_tools", "cookbook_id", "tool_id"),
TableMeta("group_to_categories", "group_id", "category_id"),
TableMeta("plan_rules_to_categories", "group_plan_rule_id", "category_id"),
TableMeta("plan_rules_to_tags", "plan_rule_id", "tag_id"),
TableMeta("recipes_to_categories", "recipe_id", "category_id"),
TableMeta("recipes_to_tags", "recipe_id", "tag_id"),
TableMeta("recipes_to_tools", "recipe_id", "tool_id"),
TableMeta("users_to_favorites", "user_id", "recipe_id"),
TableMeta("shopping_lists_multi_purpose_labels", "shopping_list_id", "label_id"),
# Foods/Units/Labels
TableMeta("ingredient_foods", "name", "group_id"),
TableMeta("ingredient_units", "name", "group_id"),
TableMeta("multi_purpose_labels", "name", "group_id"),
]
)
# ### commands auto generated by Alembic - please adjust! ###
# we use batch_alter_table here because otherwise this fails on sqlite
# M2M
with op.batch_alter_table("cookbooks_to_categories") as batch_op:
batch_op.create_unique_constraint("cookbook_id_category_id_key", ["cookbook_id", "category_id"])
with op.batch_alter_table("cookbooks_to_tags") as batch_op:
batch_op.create_unique_constraint("cookbook_id_tag_id_key", ["cookbook_id", "tag_id"])
with op.batch_alter_table("cookbooks_to_tools") as batch_op:
batch_op.create_unique_constraint("cookbook_id_tool_id_key", ["cookbook_id", "tool_id"])
with op.batch_alter_table("group_to_categories") as batch_op:
batch_op.create_unique_constraint("group_id_category_id_key", ["group_id", "category_id"])
with op.batch_alter_table("plan_rules_to_categories") as batch_op:
batch_op.create_unique_constraint("group_plan_rule_id_category_id_key", ["group_plan_rule_id", "category_id"])
with op.batch_alter_table("plan_rules_to_tags") as batch_op:
batch_op.create_unique_constraint("plan_rule_id_tag_id_key", ["plan_rule_id", "tag_id"])
with op.batch_alter_table("recipes_to_categories") as batch_op:
batch_op.create_unique_constraint("recipe_id_category_id_key", ["recipe_id", "category_id"])
with op.batch_alter_table("recipes_to_tags") as batch_op:
batch_op.create_unique_constraint("recipe_id_tag_id_key", ["recipe_id", "tag_id"])
with op.batch_alter_table("recipes_to_tools") as batch_op:
batch_op.create_unique_constraint("recipe_id_tool_id_key", ["recipe_id", "tool_id"])
with op.batch_alter_table("users_to_favorites") as batch_op:
batch_op.create_unique_constraint("user_id_recipe_id_key", ["user_id", "recipe_id"])
with op.batch_alter_table("shopping_lists_multi_purpose_labels") as batch_op:
batch_op.create_unique_constraint("shopping_list_id_label_id_key", ["shopping_list_id", "label_id"])
# Foods/Units/Labels
with op.batch_alter_table("ingredient_foods") as batch_op:
batch_op.create_unique_constraint("ingredient_foods_name_group_id_key", ["name", "group_id"])
with op.batch_alter_table("ingredient_units") as batch_op:
batch_op.create_unique_constraint("ingredient_units_name_group_id_key", ["name", "group_id"])
with op.batch_alter_table("multi_purpose_labels") as batch_op:
batch_op.create_unique_constraint("multi_purpose_labels_name_group_id_key", ["name", "group_id"])
op.create_index(
op.f("ix_shopping_lists_multi_purpose_labels_created_at"),
"shopping_lists_multi_purpose_labels",
["created_at"],
unique=False,
)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
# M2M
op.drop_constraint("user_id_recipe_id_key", "users_to_favorites", type_="unique")
op.drop_index(
op.f("ix_shopping_lists_multi_purpose_labels_created_at"), table_name="shopping_lists_multi_purpose_labels"
)
op.drop_constraint("recipe_id_tool_id_key", "recipes_to_tools", type_="unique")
op.drop_constraint("recipe_id_tag_id_key", "recipes_to_tags", type_="unique")
op.drop_constraint("recipe_id_category_id_key", "recipes_to_categories", type_="unique")
op.drop_constraint("plan_rule_id_tag_id_key", "plan_rules_to_tags", type_="unique")
op.drop_constraint("group_plan_rule_id_category_id_key", "plan_rules_to_categories", type_="unique")
op.drop_constraint("group_id_category_id_key", "group_to_categories", type_="unique")
op.drop_constraint("cookbook_id_tool_id_key", "cookbooks_to_tools", type_="unique")
op.drop_constraint("cookbook_id_tag_id_key", "cookbooks_to_tags", type_="unique")
op.drop_constraint("cookbook_id_category_id_key", "cookbooks_to_categories", type_="unique")
op.drop_constraint("shopping_list_id_label_id_key", "shopping_lists_multi_purpose_labels", type_="unique")
# Foods/Units/Labels
op.drop_constraint("multi_purpose_labels_name_group_id_key", "multi_purpose_labels", type_="unique")
op.drop_constraint("ingredient_units_name_group_id_key", "ingredient_units", type_="unique")
op.drop_constraint("ingredient_foods_name_group_id_key", "ingredient_foods", type_="unique")
# ### end Alembic commands ###

64
cliff.toml Normal file
View File

@@ -0,0 +1,64 @@
# configuration file for git-cliff (0.1.0)
[changelog]
# changelog header
header = """
# Changelog\n
All notable changes to this project will be documented in this file.\n
"""
# template for the changelog body
# https://tera.netlify.app/docs/#introduction
body = """
{% if version %}\
## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
### {{ group | upper_first }}
{% for commit in commits %}
- {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\
{% endfor %}
{% endfor %}\n
"""
# remove the leading and trailing whitespace from the template
trim = true
# changelog footer
footer = """
<!-- generated by git-cliff -->
"""
[git]
# parse the commits based on https://www.conventionalcommits.org
conventional_commits = true
# filter out the commits that are not conventional
filter_unconventional = true
# regex for preprocessing the commit messages
commit_preprocessors = [
{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](https://github.com/hay-kot/mealie/issues/${2}))"},
]
# regex for parsing and grouping commits
commit_parsers = [
{ message = "^feat", group = "Features"},
{ message = "^fix", group = "Bug Fixes"},
{ message = "^doc", group = "Documentation"},
{ message = "^perf", group = "Performance"},
{ message = "^refactor", group = "Refactor"},
{ message = "^style", group = "Styling"},
{ message = "^test", group = "Testing"},
{ message = "^chore\\(release\\): prepare for", skip = true},
{ message = "^chore", group = "Miscellaneous Tasks"},
{ body = ".*security", group = "Security"},
]
# filter out the commits that are not matched by commit parsers
filter_commits = false
# glob pattern for matching git tags
tag_pattern = "v[0-9]*"
# regex for skipping tags
skip_tags = "v0.1.0-beta.1"
# regex for ignoring tags
ignore_tags = ""
# sort the tags chronologically
date_order = false
# sort the commits inside sections by oldest/newest order
sort_commits = "oldest"

View File

@@ -2,8 +2,6 @@ preserve_hierarchy: false
files:
- source: /frontend/lang/messages/en-US.json
translation: /frontend/lang/messages/%locale%.json
- source: /frontend/lang/dateTimeFormats/en-US.json
translation: /frontend/lang/dateTimeFormats/%locale%.json
- source: /mealie/lang/messages/en-US.json
translation: /mealie/lang/messages/%locale%.json
- source: /mealie/repos/seed/resources/foods/locales/en-US.json

View File

@@ -1,26 +0,0 @@
from pathlib import Path
CWD = Path(__file__).parent
PROJECT_DIR = Path(__file__).parent.parent.parent
class Directories:
out_dir = CWD / "generated"
class CodeTemplates:
interface = CWD / "templates" / "interface.js"
pytest_routes = CWD / "templates" / "test_routes.py.j2"
class CodeDest:
interface = CWD / "generated" / "interface.js"
pytest_routes = CWD / "generated" / "test_routes.py"
use_locales = PROJECT_DIR / "frontend" / "composables" / "use-locales" / "available-locales.ts"
class CodeKeys:
"""Hard coded comment IDs that are used to generate code"""
nuxt_local_messages = "MESSAGE_LOCALES"
nuxt_local_dates = "DATE_LOCALES"

View File

@@ -1,39 +0,0 @@
from pathlib import Path
from _gen_utils import inject_inline
from _static import CodeKeys
PROJECT_DIR = Path(__file__).parent.parent.parent
datetime_dir = PROJECT_DIR / "frontend" / "lang" / "dateTimeFormats"
locales_dir = PROJECT_DIR / "frontend" / "lang" / "messages"
nuxt_config = PROJECT_DIR / "frontend" / "nuxt.config.js"
"""
This snippet walks the message and dat locales directories and generates the import information
for the nuxt.config.js file and automatically injects it into the nuxt.config.js file. Note that
the code generation ID is hardcoded into the script and required in the nuxt config.
"""
def main(): # sourcery skip: list-comprehension
print("Starting...")
all_date_locales = []
for match in datetime_dir.glob("*.json"):
all_date_locales.append(f'"{match.stem}": require("./lang/dateTimeFormats/{match.name}"),')
all_langs = []
for match in locales_dir.glob("*.json"):
lang_string = f'{{ code: "{match.stem}", file: "{match.name}" }},'
all_langs.append(lang_string)
inject_inline(nuxt_config, CodeKeys.nuxt_local_messages, all_langs)
inject_inline(nuxt_config, CodeKeys.nuxt_local_dates, all_date_locales)
print("Finished...")
if __name__ == "__main__":
main()

View File

@@ -1,15 +1,13 @@
from dataclasses import dataclass
from pathlib import Path
from _gen_utils import render_python_template
from slugify import slugify
from utils import render_python_template
CWD = Path(__file__).parent
TEMPLATE = CWD / "templates" / "test_data.py.j2"
TEST_DATA = CWD.parent.parent / "tests" / "data"
GENERATED = CWD / "generated"
@@ -27,9 +25,7 @@ class TestDataPath:
# Remove any file extension
var = var.split(".")[0]
var = var.replace("'", "")
var = slugify(var, separator="_")
return cls(var, rel_path)
@@ -99,8 +95,6 @@ def rename_non_compliant_paths():
def main():
print("Starting Template Generation")
rename_non_compliant_paths()
GENERATED.mkdir(exist_ok=True)
@@ -117,8 +111,6 @@ def main():
{"children": all_children},
)
print("Finished Template Generation")
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,82 @@
import json
from pathlib import Path
from fastapi import FastAPI
from jinja2 import Template
from pydantic import BaseModel
from utils import PROJECT_DIR, CodeTemplates, HTTPRequest, RouteObject
CWD = Path(__file__).parent
OUTFILE = PROJECT_DIR / "tests" / "utils" / "api_routes" / "__init__.py"
class PathObject(BaseModel):
route_object: RouteObject
http_verbs: list[HTTPRequest]
class Config:
arbitrary_types_allowed = True
def get_path_objects(app: FastAPI):
paths = []
for key, value in app.openapi().items():
if key == "paths":
for key, value in value.items():
paths.append(
PathObject(
route_object=RouteObject(key),
http_verbs=[HTTPRequest(request_type=k, **v) for k, v in value.items()],
)
)
return paths
def dump_open_api(app: FastAPI):
"""Writes the Open API as JSON to a json file"""
OPEN_API_FILE = CWD / "openapi.json"
with open(OPEN_API_FILE, "w") as f:
f.write(json.dumps(app.openapi()))
def read_template(file: Path):
with open(file) as f:
return f.read()
def generate_python_templates(static_paths: list[PathObject], function_paths: list[PathObject]):
template = Template(read_template(CodeTemplates.pytest_routes))
content = template.render(
paths={
"prefix": "/api",
"static_paths": static_paths,
"function_paths": function_paths,
}
)
with open(OUTFILE, "w") as f:
f.write(content)
return
def main():
from mealie.app import app
dump_open_api(app)
paths = get_path_objects(app)
static_paths = [x.route_object for x in paths if not x.route_object.is_function]
function_paths = [x.route_object for x in paths if x.route_object.is_function]
static_paths.sort(key=lambda x: x.router_slug)
function_paths.sort(key=lambda x: x.router_slug)
generate_python_templates(static_paths, function_paths)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,100 @@
import pathlib
import re
from dataclasses import dataclass, field
from utils import PROJECT_DIR, log, render_python_template
template = """# This file is auto-generated by gen_schema_exports.py
{% for file in data.module.files %}{{ file.import_str() }}
{% endfor %}
__all__ = [
{% for file in data.module.files %}
{%- for class in file.classes -%}
"{{ class }}",
{%- endfor -%}
{%- endfor %}
]
"""
SCHEMA_PATH = PROJECT_DIR / "mealie" / "schema"
SKIP = {"static", "__pycache__"}
class PyFile:
import_path: str
"""The import path of the file"""
classes: list[str]
"""A list of classes in the file"""
def __init__(self, path: pathlib.Path):
self.import_path = path.stem
self.classes = []
self.classes = PyFile.extract_classes(path)
self.classes.sort()
def import_str(self) -> str:
"""Returns a string that can be used to import the file"""
return f"from .{self.import_path} import {', '.join(self.classes)}"
@staticmethod
def extract_classes(file_path: pathlib.Path) -> list[str]:
name = file_path.stem
if name == "__init__" or name.startswith("_"):
return []
classes = re.findall(r"(?m)^class\s(\w+)", file_path.read_text())
return classes
@dataclass
class Modules:
directory: pathlib.Path
"""The directory to search for modules"""
files: list[PyFile] = field(default_factory=list)
"""A list of files in the directory"""
def __post_init__(self):
for file in self.directory.glob("*.py"):
if file.name.startswith("_"):
continue
pfile = PyFile(file)
if len(pfile.classes) > 0:
self.files.append(pfile)
else:
log.debug(f"Skipping {file.name} as it has no classes")
def find_modules(root: pathlib.Path) -> list[Modules]:
"""Finds all the top level modules in the provided folder"""
modules: list[Modules] = []
for file in root.iterdir():
if file.is_dir() and file.name not in SKIP:
modules.append(Modules(directory=file))
return modules
def main():
modules = find_modules(SCHEMA_PATH)
for module in modules:
log.debug(f"Module: {module.directory.name}")
for file in module.files:
log.debug(f" File: {file.import_path}")
log.debug(f" Classes: [{', '.join(file.classes)}]")
render_python_template(template, module.directory / "__init__.py", {"module": module})
if __name__ == "__main__":
main()

View File

@@ -1,53 +0,0 @@
import json
from typing import Any
from _gen_utils import render_python_template
from _open_api_parser import OpenAPIParser
from _static import CodeDest, CodeTemplates
from rich.console import Console
from mealie.app import app
"""
This code is used for generating route objects for each route in the OpenAPI Specification.
Currently, they are NOT automatically injected into the test suite. As such, you'll need to copy
the relavent contents of the generated file into the test suite where applicable. I am slowly
migrating the test suite to use this new generated file and this process will be "automated" in the
future.
"""
console = Console()
def write_dict_to_file(file_name: str, data: dict[str, Any]):
with open(file_name, "w") as f:
f.write(json.dumps(data, indent=4))
def main():
print("Starting...")
open_api = OpenAPIParser(app)
modules = open_api.get_by_module()
mods = []
for mod, value in modules.items():
routes = []
existings = set()
# Reduce routes by unique py_route attribute
for route in value:
if route.py_route not in existings:
existings.add(route.py_route)
routes.append(route)
module = {"name": mod, "routes": routes}
mods.append(module)
render_python_template(CodeTemplates.pytest_routes, CodeDest.pytest_routes, {"mods": mods})
print("Finished...")
if __name__ == "__main__":
main()

View File

@@ -1,35 +0,0 @@
from _gen_utils import render_python_template
from _static import PROJECT_DIR
template = """# GENERATED CODE - DO NOT MODIFY BY HAND
{% for file in data.files %}from .{{ file }} import *
{% endfor %}
"""
SCHEMA_PATH = PROJECT_DIR / "mealie" / "schema"
def generate_init_files() -> None:
for schema in SCHEMA_PATH.iterdir():
if not schema.is_dir():
print(f"Skipping {schema}")
continue
print(f"Generating {schema}")
init_file = schema.joinpath("__init__.py")
module_files = [
f.stem for f in schema.iterdir() if f.is_file() and f.suffix == ".py" and not f.stem.startswith("_")
]
render_python_template(template, init_file, {"files": module_files})
def main():
print("Starting...")
generate_init_files()
print("Finished...")
if __name__ == "__main__":
main()

View File

@@ -1,11 +1,12 @@
import pathlib
from pathlib import Path
import _static
import dotenv
import requests
from jinja2 import Template
from pydantic import Extra
from requests import Response
from rich import print
from utils import CodeDest, CodeKeys, inject_inline, log
from mealie.schema._mealie import MealieModel
@@ -13,6 +14,7 @@ BASE = pathlib.Path(__file__).parent.parent.parent
API_KEY = dotenv.get_key(BASE / ".env", "CROWDIN_API_KEY")
NAMES = {
"en-US": "American English",
"en-GB": "British English",
@@ -35,7 +37,7 @@ NAMES = {
"nl-NL": "Nederlands (Dutch)",
"pl-PL": "Polski (Polish)",
"pt-BR": "Português do Brasil (Brazilian Portuguese)",
"pt-PT": "Português (Portugese)",
"pt-PT": "Português (Portuguese)",
"ro-RO": "Română (Romanian)",
"ru-RU": "Pусский (Russian)",
"sr-SP": "српски (Serbian)",
@@ -55,6 +57,7 @@ export const LOCALES = [{% for locale in locales %}
progress: {{ locale.progress }},
},{% endfor %}
]
"""
@@ -66,6 +69,9 @@ class TargetLanguage(MealieModel):
twoLettersCode: str
progress: float = 0.0
class Config:
extra = Extra.allow
class CrowdinApi:
project_name = "Mealie"
@@ -122,22 +128,53 @@ class CrowdinApi:
return response.json()
def main():
print("Starting...") # noqa
PROJECT_DIR = Path(__file__).parent.parent.parent
if API_KEY is None:
print("CROWDIN_API_KEY is not set") # noqa
return
datetime_dir = PROJECT_DIR / "frontend" / "lang" / "dateTimeFormats"
locales_dir = PROJECT_DIR / "frontend" / "lang" / "messages"
nuxt_config = PROJECT_DIR / "frontend" / "nuxt.config.js"
"""
This snippet walks the message and dat locales directories and generates the import information
for the nuxt.config.js file and automatically injects it into the nuxt.config.js file. Note that
the code generation ID is hardcoded into the script and required in the nuxt config.
"""
def inject_nuxt_values():
all_date_locales = [
f'"{match.stem}": require("./lang/dateTimeFormats/{match.name}"),' for match in datetime_dir.glob("*.json")
]
all_langs = []
for match in locales_dir.glob("*.json"):
lang_string = f'{{ code: "{match.stem}", file: "{match.name}" }},'
all_langs.append(lang_string)
log.debug(f"injecting locales into nuxt config -> {nuxt_config}")
inject_inline(nuxt_config, CodeKeys.nuxt_local_messages, all_langs)
inject_inline(nuxt_config, CodeKeys.nuxt_local_dates, all_date_locales)
def generate_locales_ts_file():
api = CrowdinApi("")
models = api.get_languages()
tmpl = Template(LOCALE_TEMPLATE)
rendered = tmpl.render(locales=models)
with open(_static.CodeDest.use_locales, "w") as f:
log.debug(f"generating locales ts file -> {CodeDest.use_locales}")
with open(CodeDest.use_locales, "w") as f:
f.write(rendered) # type:ignore
print("Finished...") # noqa
def main():
if API_KEY is None or API_KEY == "":
log.error("CROWDIN_API_KEY is not set")
return
generate_locales_ts_file()
inject_nuxt_values()
if __name__ == "__main__":

View File

@@ -2,28 +2,28 @@ from pathlib import Path
from jinja2 import Template
from pydantic2ts import generate_typescript_defs
from rich import print
from utils import log
# ============================================================
# Global Compoenents Generator
template = """// This Code is auto generated by gen_global_components.py
{% for name in global %} import {{ name }} from "@/components/global/{{ name }}.vue";
{% for name in global %}import {{ name }} from "@/components/global/{{ name }}.vue";
{% endfor %}{% for name in layout %}import {{ name }} from "@/components/layout/{{ name }}.vue";
{% endfor %}
{% for name in layout %} import {{ name }} from "@/components/layout/{{ name }}.vue";
{% endfor %}
declare module "vue" {
export interface GlobalComponents {
// Global Components
{% for name in global %} {{ name }}: typeof {{ name }};
{% endfor %} // Layout Components
{% for name in layout %} {{ name }}: typeof {{ name }};
{% endfor %}
}
{% for name in global -%}
{{ " " }}{{ name }}: typeof {{ name }};
{% endfor -%}
{{ " " }}// Layout Components
{% for name in layout -%}
{{ " " }}{{ name }}: typeof {{ name }};
{% endfor -%}{{ " }"}}
}
export {};
"""
CWD = Path(__file__).parent
@@ -46,6 +46,7 @@ def generate_global_components_types() -> None:
data = {}
for name, path in component_paths.items():
components = [component.stem for component in path.glob("*.vue")]
components.sort()
data[name] = components
return data
@@ -74,7 +75,7 @@ def generate_typescript_types() -> None:
return str_path
schema_path = PROJECT_DIR / "mealie" / "schema"
types_dir = PROJECT_DIR / "frontend" / "types" / "api-types"
types_dir = PROJECT_DIR / "frontend" / "lib" / "api" / "types"
ignore_dirs = ["__pycache__", "static", "_mealie"]
@@ -99,26 +100,29 @@ def generate_typescript_types() -> None:
generate_typescript_defs(path_as_module, str(out_path), exclude=("MealieModel")) # type: ignore
except Exception as e:
failed_modules.append(module)
print("\nModule Errors:", module, "-----------------") # noqa
print(e) # noqa
print("Finished Module Errors:", module, "-----------------\n") # noqa
log.error(f"Module Error: {e}")
print("\n📁 Skipped Directories:") # noqa
log.debug("\n📁 Skipped Directories:")
for skipped_dir in skipped_dirs:
print(" 📁", skipped_dir.name) # noqa
log.debug(f" 📁 {skipped_dir.name}")
print("📄 Skipped Files:") # noqa
log.debug("📄 Skipped Files:")
for f in skipped_files:
print(" 📄", f.name) # noqa
log.debug(f" 📄 {f.name}")
print("❌ Failed Modules:") # noqa
for f in failed_modules:
print("", f.name) # noqa
if len(failed_modules) > 0:
log.error("❌ Failed Modules:")
for f in failed_modules:
log.error(f"{f.name}")
def main():
log.debug("\n-- Starting Global Components Generator --")
generate_global_components_types()
log.debug("\n-- Starting Pydantic To Typescript Generator --")
generate_typescript_types()
if __name__ == "__main__":
print("\n-- Starting Global Components Generator --") # noqa
generate_global_components_types()
print("\n-- Starting Pydantic To Typescript Generator --") # noqa
generate_typescript_types()
main()

View File

@@ -0,0 +1,28 @@
from pathlib import Path
import gen_py_pytest_data_paths
import gen_py_pytest_routes
import gen_py_schema_exports
import gen_ts_locales
import gen_ts_types
from utils import log
CWD = Path(__file__).parent
def main():
items = [
(gen_py_schema_exports.main, "schema exports"),
(gen_ts_types.main, "frontend types"),
(gen_ts_locales.main, "locales"),
(gen_py_pytest_data_paths.main, "test data paths"),
(gen_py_pytest_routes.main, "pytest routes"),
]
for func, name in items:
log.info(f"Generating {name}...")
func()
if __name__ == "__main__":
main()

View File

@@ -1,9 +1,11 @@
{% for mod in mods %}
class {{mod.name}}Routes:{% for route in mod.routes %}{% if not route.path_is_func %}
{{route.name_snake}} = "{{ route.py_route }}"{% endif %}{% endfor %}{% for route in mod.routes %}
{% if route.path_is_func %}
@staticmethod
def {{route.name_snake}}({{ route.path_vars|join(", ") }}):
return f"{{route.py_route}}"
{% endif %}{% endfor %}
{% endfor %}
# This Content is Auto Generated for Pytest
prefix = "{{paths.prefix}}"
{% for path in paths.static_paths %}
{{ path.router_slug }} = "{{path.prefix}}{{ path.route }}"
"""`{{path.prefix}}{{ path.route }}`"""{% endfor %}
{% for path in paths.function_paths %}
def {{path.router_slug}}({{path.var|join(", ")}}):
"""`{{ paths.prefix }}{{ path.route }}`"""
return f"{prefix}{{ path.route }}"
{% endfor %}

View File

@@ -0,0 +1,25 @@
from .open_api_parser import OpenAPIParser
from .route import HTTPRequest, ParameterIn, RequestBody, RequestType, RouteObject, RouterParameter
from .static import PROJECT_DIR, CodeDest, CodeKeys, CodeTemplates, Directories
from .template import CodeSlicer, find_start_end, get_indentation_of_string, inject_inline, log, render_python_template
__all__ = [
"CodeDest",
"CodeKeys",
"CodeSlicer",
"CodeTemplates",
"Directories",
"find_start_end",
"get_indentation_of_string",
"HTTPRequest",
"inject_inline",
"log",
"OpenAPIParser",
"ParameterIn",
"PROJECT_DIR",
"render_python_template",
"RequestBody",
"RequestType",
"RouteObject",
"RouterParameter",
]

View File

@@ -3,11 +3,12 @@ import re
from pathlib import Path
from typing import Any
from _static import Directories
from fastapi import FastAPI
from humps import camelize
from slugify import slugify
from .static import Directories
def get_openapi_spec_by_ref(app, type_reference: str) -> dict:
if not type_reference:

View File

@@ -3,7 +3,7 @@ from enum import Enum
from typing import Optional
from humps import camelize
from pydantic import BaseModel, Field
from pydantic import BaseModel, Extra, Field
from slugify import slugify
@@ -30,6 +30,7 @@ class RequestType(str, Enum):
class ParameterIn(str, Enum):
query = "query"
path = "path"
header = "header"
class RouterParameter(BaseModel):
@@ -37,10 +38,16 @@ class RouterParameter(BaseModel):
name: str
location: ParameterIn = Field(..., alias="in")
class Config:
extra = Extra.allow
class RequestBody(BaseModel):
required: bool = False
class Config:
extra = Extra.allow
class HTTPRequest(BaseModel):
request_type: RequestType
@@ -49,7 +56,10 @@ class HTTPRequest(BaseModel):
requestBody: Optional[RequestBody]
parameters: list[RouterParameter] = []
tags: list[str]
tags: list[str] | None = []
class Config:
extra = Extra.allow
def list_as_js_object_string(self, parameters, braces=True):
if len(parameters) == 0:

View File

@@ -0,0 +1,26 @@
from pathlib import Path
PARENT = Path(__file__).parent.parent
PROJECT_DIR = Path(__file__).parent.parent.parent.parent
class Directories:
out_dir = PARENT / "generated"
class CodeTemplates:
interface = PARENT / "templates" / "interface.js"
pytest_routes = PARENT / "templates" / "test_routes.py.j2"
class CodeDest:
interface = PARENT / "generated" / "interface.js"
pytest_routes = PARENT / "generated" / "test_routes.py"
use_locales = PROJECT_DIR / "frontend" / "composables" / "use-locales" / "available-locales.ts"
class CodeKeys:
"""Hard coded comment IDs that are used to generate code"""
nuxt_local_messages = "MESSAGE_LOCALES"
nuxt_local_dates = "DATE_LOCALES"

View File

@@ -1,3 +1,4 @@
import logging
import re
from dataclasses import dataclass
from pathlib import Path
@@ -5,9 +6,15 @@ from pathlib import Path
import black
import isort
from jinja2 import Template
from rich.logging import RichHandler
FORMAT = "%(message)s"
logging.basicConfig(level=logging.INFO, format=FORMAT, datefmt="[%X]", handlers=[RichHandler()])
log = logging.getLogger("rich")
def render_python_template(template_file: Path | str, dest: Path, data: dict) -> str:
def render_python_template(template_file: Path | str, dest: Path, data: dict):
"""Render and Format a Jinja2 Template for Python Code"""
if isinstance(template_file, Path):
tplt = Template(template_file.read_text())
@@ -15,7 +22,9 @@ def render_python_template(template_file: Path | str, dest: Path, data: dict) ->
tplt = Template(template_file)
text = tplt.render(data=data)
text = black.format_str(text, mode=black.FileMode())
dest.write_text(text)
isort.file(dest)
@@ -37,7 +46,6 @@ class CodeSlicer:
def push_line(self, string: str) -> None:
self._next_line = self._next_line or self.start + 1
print(self.indentation)
self.text.insert(self._next_line, self.indentation + string + "\n")
self._next_line += 1
@@ -46,7 +54,7 @@ def get_indentation_of_string(line: str, comment_char: str = "//") -> str:
return re.sub(rf"{comment_char}.*", "", line).removesuffix("\n")
def find_start_end(file_text: list[str], gen_id: str) -> tuple[int, int]:
def find_start_end(file_text: list[str], gen_id: str) -> tuple[int, int, str]:
start = None
end = None
indentation = None
@@ -84,7 +92,7 @@ def inject_inline(file_path: Path, key: str, code: list[str]) -> None:
"""
with open(file_path, "r") as f:
with open(file_path) as f:
file_text = f.readlines()
start, end, indentation = find_start_end(file_text, key)

View File

@@ -2,8 +2,13 @@ import json
import random
import string
import time
from dataclasses import dataclass
import requests
from rich.console import Console
from rich.table import Table
console = Console()
def random_string(length: int) -> str:
@@ -14,8 +19,219 @@ def payload_factory() -> dict:
return {"name": random_string(15)}
def login(username="changeme@email.com", password="MyPassword"):
def recipe_data(name: str, slug: str, id: str, userId: str, groupId: str) -> dict:
return {
"id": id,
"userId": userId,
"groupId": groupId,
"name": name,
"slug": slug,
"image": "tNRG",
"recipeYield": "9 servings",
"totalTime": "33 Minutes",
"prepTime": "20 Minutes",
"cookTime": None,
"performTime": "13 Minutes",
"description": "These Levain Bakery-Style Peanut Butter Cookies are the ULTIMATE for serious PB lovers! Supremely thick and chewy with gooey centers and a soft texture, they're packed with peanut butter flavor and Reese's Pieces for the most amazing cookie ever!",
"recipeCategory": [],
"tags": [],
"tools": [],
"rating": None,
"orgURL": "https://thedomesticrebel.com/2021/04/28/levain-bakery-style-ultimate-peanut-butter-cookies/",
"recipeIngredient": [
{
"title": None,
"note": "1 cup unsalted butter, cut into cubes",
"unit": None,
"food": None,
"disableAmount": True,
"quantity": 1,
"originalText": None,
"referenceId": "ea3b6702-9532-4fbc-a40b-f99917831c26",
},
{
"title": None,
"note": "1 cup light brown sugar",
"unit": None,
"food": None,
"disableAmount": True,
"quantity": 1,
"originalText": None,
"referenceId": "c5bbfefb-1e23-4ffd-af88-c0363a0fae82",
},
{
"title": None,
"note": "1/2 cup granulated white sugar",
"unit": None,
"food": None,
"disableAmount": True,
"quantity": 1,
"originalText": None,
"referenceId": "034f481b-c426-4a17-b983-5aea9be4974b",
},
{
"title": None,
"note": "2 large eggs",
"unit": None,
"food": None,
"disableAmount": True,
"quantity": 1,
"originalText": None,
"referenceId": "37c1f796-3bdb-4856-859f-dbec90bc27e4",
},
{
"title": None,
"note": "2 tsp vanilla extract",
"unit": None,
"food": None,
"disableAmount": True,
"quantity": 1,
"originalText": None,
"referenceId": "85561ace-f249-401d-834c-e600a2f6280e",
},
{
"title": None,
"note": "1/2 cup creamy peanut butter",
"unit": None,
"food": None,
"disableAmount": True,
"quantity": 1,
"originalText": None,
"referenceId": "ac91bda0-e8a8-491a-976a-ae4e72418cfd",
},
{
"title": None,
"note": "1 tsp cornstarch",
"unit": None,
"food": None,
"disableAmount": True,
"quantity": 1,
"originalText": None,
"referenceId": "4d1256b3-115e-4475-83cd-464fbc304cb0",
},
{
"title": None,
"note": "1 tsp baking soda",
"unit": None,
"food": None,
"disableAmount": True,
"quantity": 1,
"originalText": None,
"referenceId": "64627441-39f9-4ee3-8494-bafe36451d12",
},
{
"title": None,
"note": "1/2 tsp salt",
"unit": None,
"food": None,
"disableAmount": True,
"quantity": 1,
"originalText": None,
"referenceId": "7ae212d0-3cd1-44b0-899e-ec5bd91fd384",
},
{
"title": None,
"note": "1 cup cake flour",
"unit": None,
"food": None,
"disableAmount": True,
"quantity": 1,
"originalText": None,
"referenceId": "06967994-8548-4952-a8cc-16e8db228ebd",
},
{
"title": None,
"note": "2 cups all-purpose flour",
"unit": None,
"food": None,
"disableAmount": True,
"quantity": 1,
"originalText": None,
"referenceId": "bdb33b23-c767-4465-acf8-3b8e79eb5691",
},
{
"title": None,
"note": "2 cups peanut butter chips",
"unit": None,
"food": None,
"disableAmount": True,
"quantity": 1,
"originalText": None,
"referenceId": "12ba0af8-affd-4fb2-9cca-6f1b3e8d3aef",
},
{
"title": None,
"note": "1½ cups Reese's Pieces candies",
"unit": None,
"food": None,
"disableAmount": True,
"quantity": 1,
"originalText": None,
"referenceId": "4bdc0598-a3eb-41ee-8af0-4da9348fbfe2",
},
],
"dateAdded": "2022-09-03",
"dateUpdated": "2022-09-10T15:18:19.866085",
"createdAt": "2022-09-03T18:31:17.488118",
"updateAt": "2022-09-10T15:18:19.869630",
"recipeInstructions": [
{
"id": "60ae53a3-b3ff-40ee-bae3-89fea0b1c637",
"title": "",
"text": "Preheat oven to 410° degrees F. Line 2 baking sheets with parchment paper or silicone liners; set aside.",
"ingredientReferences": [],
},
{
"id": "4e1c30c2-2e96-4a0a-b750-23c9ea3640f8",
"title": "",
"text": "In the bowl of a stand mixer, cream together the cubed butter, brown sugar and granulated sugar with the paddle attachment for 30 seconds on low speed. Increase speed to medium and beat for another 30 seconds, then increase to medium-high speed and beat for another 30 seconds until mixture is creamy and smooth. Beat in the eggs, one at a time, followed by the vanilla extract and peanut butter, scraping down the sides and bottom of the bowl as needed.",
"ingredientReferences": [],
},
{
"id": "9fb8e2a2-d410-445c-bafc-c059203e6f4b",
"title": "",
"text": "Add in the cornstarch, baking soda, salt, cake flour, and all-purpose flour and mix on low speed until just combined. Fold in the peanut butter chips and Reese's Pieces candies by hand until fully incorporated. Chill the dough uncovered in the fridge for 15 minutes.",
"ingredientReferences": [],
},
{
"id": "1ceb9aa4-49f7-4d4a-996f-3c715eb74642",
"title": "",
"text": 'Using a digital kitchen scale for accuracy, weigh out 6 ounces of cookie dough in a loose, rough textured ball. I like to make my cookie dough balls kind of tall as well. You do not want the dough balls to be smooth and compacted. Place on the baking sheet. Repeat with remaining dough balls, staggering on the baking sheet at least 3" apart from one another, and only placing 4 dough balls per baking sheet.',
"ingredientReferences": [],
},
{
"id": "591993fc-72bb-4091-8a12-84640c523fc1",
"title": "",
"text": "Bake one baking sheet at a time in the center rack of the oven for 10-13 minutes or until the tops are light golden brown and the exterior is dry and dull looking. Centers will be slightly underdone and gooey; this is okay and the cookies will finish cooking some once removed from the oven. Let stand on the baking sheets for at least 30 minutes before serving; the cookies are very delicate and fragile once removed from the oven and need time to set before being moved. Keep remaining dough refrigerated while other cookies bake.",
"ingredientReferences": [],
},
],
"nutrition": {
"calories": None,
"fatContent": None,
"proteinContent": None,
"carbohydrateContent": None,
"fiberContent": None,
"sodiumContent": None,
"sugarContent": None,
},
"settings": {
"public": True,
"showNutrition": False,
"showAssets": False,
"landscapeView": False,
"disableComments": False,
"disableAmount": True,
"locked": False,
},
"assets": [],
"notes": [],
"extras": {},
"comments": [],
}
def login(username="changeme@example.com", password="MyPassword"):
payload = {"username": username, "password": password}
r = requests.post("http://localhost:9000/api/auth/token", payload)
@@ -30,32 +246,90 @@ def populate_data(token):
r = requests.post("http://localhost:9000/api/recipes", json=payload, headers=token)
if r.status_code != 201:
print(f"Error: {r.status_code}")
print(r.text)
console.print(f"Error: {r.status_code}")
console.print(r.text)
exit()
else:
print(f"Created recipe: {payload}")
recipe_json = requests.get(f"http://localhost:9000/api/recipes/{payload['name']}", headers=token)
if recipe_json.status_code != 200:
console.print(f"Error: {recipe_json.status_code}")
console.print(recipe_json.text)
exit()
recipe = json.loads(recipe_json.text)
update_data = recipe_data(recipe["name"], recipe["slug"], recipe["id"], recipe["userId"], recipe["groupId"])
r = requests.put(f"http://localhost:9000/api/recipes/{update_data['slug']}", json=update_data, headers=token)
if r.status_code != 200:
console.print(f"Error: {r.status_code}")
console.print(r.text)
exit()
def time_request(url, headers):
@dataclass(slots=True)
class Result:
recipes: int
time: float
def time_request(url, headers) -> Result:
start = time.time()
r = requests.get(url, headers=headers)
print(f"Total Recipes {len(r.json())}")
end = time.time()
print(end - start)
return Result(len(r.json()["items"]), end - start)
def main():
print("Starting...")
token = login()
# populate_data(token)
for _ in range(10):
time_request("http://localhost:9000/api/recipes", token)
results: list[Result] = []
print("Finished...")
for _ in range(10):
result = time_request("http://localhost:9000/api/recipes?perPage=-1&page=1&loadFood=true", token)
results.append(result)
min, max, average = 99, 0, 0
for result in results:
if result.time < min:
min = result.time
if result.time > max:
max = result.time
average += result.time
tbl1 = Table(title="Requests")
tbl1.add_column("Recipes", justify="right", style="cyan", no_wrap=True)
tbl1.add_column("Time", justify="right", style="magenta")
for result in results:
tbl1.add_row(
str(result.recipes),
str(result.time),
)
tbl2 = Table(title="Summary")
tbl2.add_column("Min", justify="right", style="green")
tbl2.add_column("Max", justify="right", style="green")
tbl2.add_column("Average", justify="right", style="green")
tbl2.add_row(
str(round(min * 1000)) + "ms",
str(round(max * 1000)) + "ms",
str(round((average / len(results)) * 1000)) + "ms",
)
console = Console()
console.print(tbl1)
console.print(tbl2)
# Best Time 289 / 405/ 247
if __name__ == "__main__":

View File

@@ -1,214 +0,0 @@
import json
import re
from enum import Enum
from itertools import groupby
from pathlib import Path
from typing import Optional
from fastapi import FastAPI
from humps import camelize
from jinja2 import Template
from pydantic import BaseModel, Field
from slugify import slugify
from mealie.app import app
CWD = Path(__file__).parent
OUT_DIR = CWD / "output"
TEMPLATES_DIR = CWD / "templates"
JS_DIR = OUT_DIR / "javascriptAPI"
JS_DIR.mkdir(exist_ok=True, parents=True)
class RouteObject:
def __init__(self, route_string) -> None:
self.prefix = "/" + route_string.split("/")[1]
self.route = "/" + route_string.split("/", 2)[2]
self.js_route = self.route.replace("{", "${")
self.parts = route_string.split("/")[1:]
self.var = re.findall(r"\{(.*?)\}", route_string)
self.is_function = "{" in self.route
self.router_slug = slugify("_".join(self.parts[1:]), separator="_")
self.router_camel = camelize(self.router_slug)
class RequestType(str, Enum):
get = "get"
put = "put"
post = "post"
patch = "patch"
delete = "delete"
class ParameterIn(str, Enum):
query = "query"
path = "path"
class RouterParameter(BaseModel):
required: bool = False
name: str
location: ParameterIn = Field(..., alias="in")
class RequestBody(BaseModel):
required: bool = False
class HTTPRequest(BaseModel):
request_type: RequestType
description: str = ""
summary: str
requestBody: Optional[RequestBody]
parameters: list[RouterParameter] = []
tags: list[str]
def list_as_js_object_string(self, parameters, braces=True):
if len(parameters) == 0:
return ""
if braces:
return "{" + ", ".join(parameters) + "}"
else:
return ", ".join(parameters)
def payload(self):
return "payload" if self.requestBody else ""
def function_args(self):
all_params = [p.name for p in self.parameters]
if self.requestBody:
all_params.append("payload")
return self.list_as_js_object_string(all_params)
def query_params(self):
params = [param.name for param in self.parameters if param.location == ParameterIn.query]
return self.list_as_js_object_string(params)
def path_params(self):
params = [param.name for param in self.parameters if param.location == ParameterIn.path]
return self.list_as_js_object_string(parameters=params, braces=False)
@property
def summary_camel(self):
return camelize(slugify(self.summary))
@property
def js_docs(self):
return self.description.replace("\n", " \n * ")
class PathObject(BaseModel):
route_object: RouteObject
http_verbs: list[HTTPRequest]
class Config:
arbitrary_types_allowed = True
def get_path_objects(app: FastAPI):
paths = []
for key, value in app.openapi().items():
if key == "paths":
for key, value in value.items():
paths.append(
PathObject(
route_object=RouteObject(key),
http_verbs=[HTTPRequest(request_type=k, **v) for k, v in value.items()],
)
)
return paths
def dump_open_api(app: FastAPI):
"""Writes the Open API as JSON to a json file"""
OPEN_API_FILE = CWD / "openapi.json"
with open(OPEN_API_FILE, "w") as f:
f.write(json.dumps(app.openapi()))
def read_template(file: Path):
with open(file, "r") as f:
return f.read()
def generate_python_templates(static_paths: list[PathObject], function_paths: list[PathObject]):
PYTEST_TEMPLATE = TEMPLATES_DIR / "pytest_routes.j2"
PYTHON_OUT_FILE = OUT_DIR / "app_routes.py"
template = Template(read_template(PYTEST_TEMPLATE))
content = template.render(
paths={
"prefix": "/api",
"static_paths": static_paths,
"function_paths": function_paths,
}
)
with open(PYTHON_OUT_FILE, "w") as f:
f.write(content)
return
def generate_js_templates(paths: list[PathObject]):
# Template Path
JS_API_INTERFACE = TEMPLATES_DIR / "js_api_interface.j2"
JS_INDEX = TEMPLATES_DIR / "js_index.j2"
INTERFACES_DIR = JS_DIR / "interfaces"
INTERFACES_DIR.mkdir(exist_ok=True, parents=True)
all_tags = []
for tag, tag_paths in groupby(paths, lambda x: x.http_verbs[0].tags[0]):
file_name = slugify(tag, separator="-")
tag = camelize(tag)
tag_paths: list[PathObject] = list(tag_paths)
template = Template(read_template(JS_API_INTERFACE))
content = template.render(
paths={
"prefix": "/api",
"static_paths": [x.route_object for x in tag_paths if not x.route_object.is_function],
"function_paths": [x.route_object for x in tag_paths if x.route_object.is_function],
"all_paths": tag_paths,
"export_name": tag,
}
)
tag: dict = {"camel": camelize(tag), "slug": file_name}
all_tags.append(tag)
with open(INTERFACES_DIR.joinpath(file_name + ".ts"), "w") as f:
f.write(content)
template = Template(read_template(JS_INDEX))
content = template.render(files={"files": all_tags})
with open(JS_DIR.joinpath("index.js"), "w") as f:
f.write(content)
def generate_template(app):
dump_open_api(app)
paths = get_path_objects(app)
static_paths = [x.route_object for x in paths if not x.route_object.is_function]
function_paths = [x.route_object for x in paths if x.route_object.is_function]
static_paths.sort(key=lambda x: x.router_slug)
function_paths.sort(key=lambda x: x.router_slug)
generate_python_templates(static_paths, function_paths)
generate_js_templates(paths)
if __name__ == "__main__":
generate_template(app)

View File

@@ -1,26 +0,0 @@
import json
from pathlib import Path
import requests
CWD = Path(__file__).parent
def login(username="changeme@email.com", password="MyPassword"):
payload = {"username": username, "password": password}
r = requests.post("http://localhost:9000/api/auth/token", payload)
# Bearer
token = json.loads(r.text).get("access_token")
return {"Authorization": f"Bearer {token}"}
def main():
print("Starting...")
print("Finished...")
if __name__ == "__main__":
main()

View File

@@ -1,159 +0,0 @@
import json
import re
from dataclasses import dataclass
from pathlib import Path
from slugify import slugify
CWD = Path(__file__).parent
PROJECT_BASE = CWD.parent.parent
server_side_msgs = PROJECT_BASE / "mealie" / "utils" / "error_messages.py"
en_us_msgs = PROJECT_BASE / "frontend" / "lang" / "errors" / "en-US.json"
client_side_msgs = PROJECT_BASE / "frontend" / "utils" / "error-messages.ts"
GENERATE_MESSAGES = [
# User Related
"user",
"webhook",
"token",
# Group Related
"group",
"cookbook",
"mealplan",
# Recipe Related
"scraper",
"recipe",
"ingredient",
"food",
"unit",
# Admin Related
"backup",
"migration",
"event",
]
class ErrorMessage:
def __init__(self, prefix, verb) -> None:
self.message = f"{prefix.title()} {verb.title()} Failed"
self.snake = slugify(self.message, separator="_")
self.kabab = slugify(self.message, separator="-")
def factory(prefix) -> list["ErrorMessage"]:
verbs = ["Create", "Update", "Delete"]
return [ErrorMessage(prefix, verb) for verb in verbs]
@dataclass
class CodeGenLines:
start: int
end: int
indentation: str
text: list[str]
_next_line = None
def purge_lines(self) -> None:
start = self.start + 1
end = self.end
del self.text[start:end]
def push_line(self, string: str) -> None:
self._next_line = self._next_line or self.start + 1
self.text.insert(self._next_line, self.indentation + string)
self._next_line += 1
def find_start(file_text: list[str], gen_id: str):
for x, line in enumerate(file_text):
if "CODE_GEN_ID:" in line and gen_id in line:
return x, line
return None
def find_end(file_text: list[str], gen_id: str):
for x, line in enumerate(file_text):
if f"END {gen_id}" in line:
return x, line
return None
def get_indentation_of_string(line: str):
return re.sub(r"#.*", "", line).removesuffix("\n")
def get_messages(message_prefix: str) -> str:
prefix = message_prefix.lower()
return [
f'{prefix}_create_failure = "{prefix}-create-failure"\n',
f'{prefix}_update_failure = "{prefix}-update-failure"\n',
f'{prefix}_delete_failure = "{prefix}-delete-failure"\n',
]
def code_gen_factory(file_path: Path) -> CodeGenLines:
with open(file_path, "r") as file:
text = file.readlines()
start_num, line = find_start(text, "ERROR_MESSAGE_ENUMS")
indentation = get_indentation_of_string(line)
end_num, line = find_end(text, "ERROR_MESSAGE_ENUMS")
return CodeGenLines(
start=start_num,
end=end_num,
indentation=indentation,
text=text,
)
def write_to_locals(messages: list[ErrorMessage]) -> None:
with open(en_us_msgs, "r") as f:
existing_msg = json.loads(f.read())
for msg in messages:
if msg.kabab in existing_msg:
continue
existing_msg[msg.kabab] = msg.message
print(f"Added Key {msg.kabab} to 'en-US.json'")
with open(en_us_msgs, "w") as f:
f.write(json.dumps(existing_msg, indent=4))
def main():
print("Starting...")
GENERATE_MESSAGES.sort()
code_gen = code_gen_factory(server_side_msgs)
code_gen.purge_lines()
messages = []
for msg_type in GENERATE_MESSAGES:
messages += get_messages(msg_type)
messages.append("\n")
for msg in messages:
code_gen.push_line(msg)
with open(server_side_msgs, "w") as file:
file.writelines(code_gen.text)
# Locals
local_msgs = []
for msg_type in GENERATE_MESSAGES:
local_msgs += ErrorMessage.factory(msg_type)
write_to_locals(local_msgs)
print("Done!")
if __name__ == "__main__":
main()

View File

@@ -1,32 +0,0 @@
import json
import requests
from pydantic import BaseModel
class GithubIssue(BaseModel):
url: str
number: int
title: str
def get_issues_by_label(label="fixed-pending-release") -> list[GithubIssue]:
issues_url = f"https://api.github.com/repos/hay-kot/mealie/issues?labels={label}"
response = requests.get(issues_url)
issues = json.loads(response.text)
return [GithubIssue(**issue) for issue in issues]
def format_markdown_list(issues: list[GithubIssue]) -> str:
return "\n".join(f"- [{issue.number}]({issue.url}) - {issue.title}" for issue in issues)
def main() -> None:
issues = get_issues_by_label()
print(format_markdown_list(issues))
if __name__ == "__main__":
main()

View File

@@ -1,156 +0,0 @@
# This Content is Auto Generated for Pytest
class AppRoutes:
def __init__(self) -> None:
self.prefix = '/api'
self.about_events = "/api/about/events"
self.about_events_notifications = "/api/about/events/notifications"
self.about_events_notifications_test = "/api/about/events/notifications/test"
self.about_recipes_defaults = "/api/about/recipes/defaults"
self.auth_refresh = "/api/auth/refresh"
self.auth_token = "/api/auth/token"
self.auth_token_long = "/api/auth/token/long"
self.backups_available = "/api/backups/available"
self.backups_export_database = "/api/backups/export/database"
self.backups_upload = "/api/backups/upload"
self.categories = "/api/categories"
self.categories_empty = "/api/categories/empty"
self.debug = "/api/debug"
self.debug_last_recipe_json = "/api/debug/last-recipe-json"
self.debug_log = "/api/debug/log"
self.debug_statistics = "/api/debug/statistics"
self.debug_version = "/api/debug/version"
self.groups = "/api/groups"
self.groups_self = "/api/groups/self"
self.meal_plans_all = "/api/meal-plans/all"
self.meal_plans_create = "/api/meal-plans/create"
self.meal_plans_this_week = "/api/meal-plans/this-week"
self.meal_plans_today = "/api/meal-plans/today"
self.meal_plans_today_image = "/api/meal-plans/today/image"
self.migrations = "/api/migrations"
self.recipes = "/api/recipes"
self.recipes_category = "/api/recipes/category"
self.recipes_create = "/api/recipes/create"
self.recipes_create_from_zip = "/api/recipes/create-from-zip"
self.recipes_create_url = "/api/recipes/create-url"
self.recipes_summary_uncategorized = "/api/recipes/summary/uncategorized"
self.recipes_summary_untagged = "/api/recipes/summary/untagged"
self.recipes_tag = "/api/recipes/tag"
self.recipes_test_scrape_url = "/api/recipes/test-scrape-url"
self.shopping_lists = "/api/shopping-lists"
self.site_settings = "/api/site-settings"
self.site_settings_custom_pages = "/api/site-settings/custom-pages"
self.site_settings_webhooks_test = "/api/site-settings/webhooks/test"
self.tags = "/api/tags"
self.tags_empty = "/api/tags/empty"
self.themes = "/api/themes"
self.themes_create = "/api/themes/create"
self.users = "/api/users"
self.users_api_tokens = "/api/users/api-tokens"
self.users_self = "/api/users/self"
self.users_sign_ups = "/api/users/sign-ups"
self.utils_download = "/api/utils/download"
def about_events_id(self, id):
return f"{self.prefix}/about/events/{id}"
def about_events_notifications_id(self, id):
return f"{self.prefix}/about/events/notifications/{id}"
def backups_file_name_delete(self, file_name):
return f"{self.prefix}/backups/{file_name}/delete"
def backups_file_name_download(self, file_name):
return f"{self.prefix}/backups/{file_name}/download"
def backups_file_name_import(self, file_name):
return f"{self.prefix}/backups/{file_name}/import"
def categories_category(self, category):
return f"{self.prefix}/categories/{category}"
def debug_log_num(self, num):
return f"{self.prefix}/debug/log/{num}"
def groups_id(self, id):
return f"{self.prefix}/groups/{id}"
def meal_plans_id(self, id):
return f"{self.prefix}/meal-plans/{id}"
def meal_plans_id_shopping_list(self, id):
return f"{self.prefix}/meal-plans/{id}/shopping-list"
def meal_plans_plan_id(self, plan_id):
return f"{self.prefix}/meal-plans/{plan_id}"
def media_recipes_recipe_slug_assets_file_name(self, recipe_slug, file_name):
return f"{self.prefix}/media/recipes/{recipe_slug}/assets/{file_name}"
def media_recipes_recipe_slug_images_file_name(self, recipe_slug, file_name):
return f"{self.prefix}/media/recipes/{recipe_slug}/images/{file_name}"
def migrations_import_type_file_name_delete(self, import_type, file_name):
return f"{self.prefix}/migrations/{import_type}/{file_name}/delete"
def migrations_import_type_file_name_import(self, import_type, file_name):
return f"{self.prefix}/migrations/{import_type}/{file_name}/import"
def migrations_import_type_upload(self, import_type):
return f"{self.prefix}/migrations/{import_type}/upload"
def recipes_recipe_slug(self, recipe_slug):
return f"{self.prefix}/recipes/{recipe_slug}"
def recipes_recipe_slug_assets(self, recipe_slug):
return f"{self.prefix}/recipes/{recipe_slug}/assets"
def recipes_recipe_slug_image(self, recipe_slug):
return f"{self.prefix}/recipes/{recipe_slug}/image"
def recipes_recipe_slug_zip(self, recipe_slug):
return f"{self.prefix}/recipes/{recipe_slug}/zip"
def recipes_slug_comments(self, slug):
return f"{self.prefix}/recipes/{slug}/comments"
def recipes_slug_comments_id(self, slug, id):
return f"{self.prefix}/recipes/{slug}/comments/{id}"
def shopping_lists_id(self, id):
return f"{self.prefix}/shopping-lists/{id}"
def site_settings_custom_pages_id(self, id):
return f"{self.prefix}/site-settings/custom-pages/{id}"
def tags_tag(self, tag):
return f"{self.prefix}/tags/{tag}"
def themes_id(self, id):
return f"{self.prefix}/themes/{id}"
def users_api_tokens_token_id(self, token_id):
return f"{self.prefix}/users/api-tokens/{token_id}"
def users_id(self, id):
return f"{self.prefix}/users/{id}"
def users_id_favorites(self, id):
return f"{self.prefix}/users/{id}/favorites"
def users_id_favorites_slug(self, id, slug):
return f"{self.prefix}/users/{id}/favorites/{slug}"
def users_id_image(self, id):
return f"{self.prefix}/users/{id}/image"
def users_id_password(self, id):
return f"{self.prefix}/users/{id}/password"
def users_id_reset_password(self, id):
return f"{self.prefix}/users/{id}/reset-password"
def users_sign_ups_token(self, token):
return f"{self.prefix}/users/sign-ups/{token}"

View File

@@ -1,11 +0,0 @@
git checkout dev
git merge --strategy=ours master # keep the content of this branch, but record a merge
git checkout master
git merge dev # fast-forward master up to the merge
## TODOs
# Create New Branch v0.x.x
# Push Branch Version to Github
# Create Pull Request

View File

@@ -1,17 +0,0 @@
import { requests } from "../requests";
const prefix = '{{paths.prefix}}'
const routes = { {% for path in paths.static_paths %}
{{ path.router_camel }}: `${prefix}{{ path.route }}`,{% endfor %}
{% for path in paths.function_paths %}
{{path.router_camel}}: ({{path.var|join(", ")}}) => `${prefix}{{ path.js_route }}`,{% endfor %}
}
export const {{paths.export_name}}API = { {% for path in paths.all_paths %} {% for verb in path.http_verbs %}
{% if verb.js_docs %}/** {{ verb.js_docs }}
*/ {% endif %}
async {{ verb.summary_camel }}({{ verb.function_args() }}) {
return await requests.{{ verb.request_type.value }}(routes.{{ path.route_object.router_camel }}{% if path.route_object.is_function %}({{verb.path_params()}}){% endif %}, {{ verb.query_params() }} {{ verb.payload() }})
}, {% endfor %} {% endfor %}
}

View File

@@ -1,7 +0,0 @@
{% for api in files.files %}
import { {{ api.camel }}API } from "./interfaces/{{ api.slug }}" {% endfor %}
export const api = {
{% for api in files.files %}
{{api.camel}}: {{api.camel}}API, {% endfor %}
}

View File

@@ -1,12 +0,0 @@
# This Content is Auto Generated for Pytest
class AppRoutes:
def __init__(self) -> None:
self.prefix = '{{paths.prefix}}'
{% for path in paths.static_paths %}
self.{{ path.router_slug }} = "{{path.prefix}}{{ path.route }}"{% endfor %}
{% for path in paths.function_paths %}
def {{path.router_slug}}(self, {{path.var|join(", ")}}):
return f"{self.prefix}{{ path.route }}"
{% endfor %}

View File

@@ -1,47 +0,0 @@
# Use root/example as user/password credentials
version: "3.4"
services:
# Vue Frontend
mealie-frontend:
container_name: mealie-frontend
image: mealie-frontend:dev
build:
context: ./frontend
dockerfile: Dockerfile.frontend
restart: always
ports:
- 9920:8080
environment:
- GLOBAL_MIDDLEWARE=null
- BASE_URL=""
- ALLOW_SIGNUP=true
volumes:
- ./frontend/:/app
- /app/node_modules
# Fast API
mealie-api:
container_name: mealie-api
image: mealie-api:dev
build:
context: ./
target: development
dockerfile: Dockerfile
restart: always
ports:
- 9921:9000
environment:
TZ: America/Anchorage # Specify Correct Timezone for Date/Time to line up correctly.
volumes:
- ./dev/data:/app/dev/data
- ./mealie:/app/mealie
# Mkdocs
mealie-docs:
container_name: mealie-docs
image: squidfunk/mkdocs-material
restart: always
ports:
- 9922:8000
volumes:
- ./docs:/docs

View File

@@ -1,84 +0,0 @@
version: "3.4"
services:
mealie-frontend:
container_name: mealie-frontend
image: mealie-frontend:dev
build:
context: ./frontend
dockerfile: Dockerfile
restart: always
volumes:
- mealie-data:/app/data/
ports:
- 9091:3000
environment:
- API_URL=http://mealie-api:9000
# =====================================
# Light Mode Config
- THEME_LIGHT_PRIMARY=#E58325
- THEME_LIGHT_ACCENT=#007A99
- THEME_LIGHT_SECONDARY=#973542
- THEME_LIGHT_SUCCESS=#43A047
- THEME_LIGHT_INFO=#1976D2
- THEME_LIGHT_WARNING=#FF6D00
- THEME_LIGHT_ERROR=#EF5350
# =====================================
# Dark Mode Config
- THEME_DARK_PRIMARY=#E58325
- THEME_DARK_ACCENT=#007A99
- THEME_DARK_SECONDARY=#973542
- THEME_DARK_SUCCESS=#43A047
- THEME_DARK_INFO=#1976D2
- THEME_DARK_WARNING=#FF6D00
- THEME_DARK_ERROR=#EF5350
mealie:
container_name: mealie-api
build:
context: ./
target: production
dockerfile: Dockerfile
restart: always
volumes:
- mealie-data:/app/data/
ports:
- 9092:9000
environment:
ALLOW_SIGNUP: "false"
DB_ENGINE: sqlite # Optional: 'sqlite', 'postgres'
# =====================================
# Postgres Config
POSTGRES_USER: mealie
POSTGRES_PASSWORD: mealie
POSTGRES_SERVER: postgres
POSTGRES_PORT: 5432
POSTGRES_DB: mealie
# =====================================
# Web Concurrency
WORKERS_PER_CORE: 0.5
MAX_WORKERS: 1
WEB_CONCURRENCY: 1
# =====================================
# Email Configuration
# SMTP_HOST=
# SMTP_PORT=587
# SMTP_FROM_NAME=Mealie
# SMTP_AUTH_STRATEGY=TLS # Options: 'TLS', 'SSL', 'NONE'
# SMTP_FROM_EMAIL=
# SMTP_USER=
# SMTP_PASSWORD=
# postgres:
# container_name: postgres
# image: postgres
# restart: always
# environment:
# POSTGRES_PASSWORD: mealie
# POSTGRES_USER: mealie
volumes:
mealie-data:
driver: local

View File

@@ -1,5 +1,21 @@
FROM node:16 as builder
WORKDIR /app
COPY ./frontend .
RUN yarn install \
--prefer-offline \
--frozen-lockfile \
--non-interactive \
--production=false \
# https://github.com/docker/build-push-action/issues/471
--network-timeout 1000000
RUN yarn generate
###############################################
# Base Image
# Base Image - Python
###############################################
FROM python:3.10-slim as python-base
@@ -34,48 +50,23 @@ RUN apt-get update \
build-essential \
libpq-dev \
libwebp-dev \
tesseract-ocr-all \
# LDAP Dependencies
libsasl2-dev libldap2-dev libssl-dev \
gnupg gnupg2 gnupg1 \
&& rm -rf /var/lib/apt/lists/* \
&& pip install -U --no-cache-dir pip
# install poetry - respects $POETRY_VERSION & $POETRY_HOME
ENV POETRY_VERSION=1.1.6
RUN curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/install-poetry.py | python -
ENV POETRY_VERSION=1.3.1
RUN curl -sSL https://install.python-poetry.org | python3 -
# copy project requirement files here to ensure they will be cached.
WORKDIR $PYSETUP_PATH
COPY ./poetry.lock ./pyproject.toml ./
# install runtime deps - uses $POETRY_VIRTUALENVS_IN_PROJECT internally
RUN poetry install -E pgsql --no-dev
###############################################
# Development Image
###############################################
FROM python-base as development
ENV PRODUCTION=false
ENV TESTING=false
# copying poetry and venv into image
COPY --from=builder-base $POETRY_HOME $POETRY_HOME
COPY --from=builder-base $PYSETUP_PATH $PYSETUP_PATH
# copy backend
COPY ./mealie $MEALIE_HOME/mealie
COPY ./poetry.lock ./pyproject.toml $MEALIE_HOME/
# Alembic
COPY ./alembic $MEALIE_HOME/alembic
COPY ./alembic.ini $MEALIE_HOME/
# venv already has runtime deps installed we get a quicker install
WORKDIR $MEALIE_HOME
RUN . $VENV_PATH/bin/activate && poetry install
WORKDIR /
RUN chmod +x $MEALIE_HOME/mealie/run.sh
ENTRYPOINT $MEALIE_HOME/mealie/run.sh "reload"
RUN poetry install -E pgsql --only main
###############################################
# CRFPP Image
@@ -94,20 +85,18 @@ ENV TESTING=false
ARG COMMIT
ENV GIT_COMMIT_HASH=$COMMIT
# curl for used by healthcheck
RUN apt-get update \
&& apt-get install --no-install-recommends -y \
curl \
&& apt-get autoremove \
gosu \
iproute2 \
tesseract-ocr-all \
libldap-common \
&& rm -rf /var/lib/apt/lists/*
# copying poetry and venv into image
COPY --from=builder-base $POETRY_HOME $POETRY_HOME
COPY --from=builder-base $PYSETUP_PATH $PYSETUP_PATH
# copy CRF++ Binary from crfpp
ENV CRF_MODEL_URL=https://github.com/mealie-recipes/nlp-model/releases/download/v1.0.0/model.crfmodel
ENV LD_LIBRARY_PATH=/usr/local/lib
COPY --from=crfpp /usr/local/lib/ /usr/local/lib
COPY --from=crfpp /usr/local/bin/crf_learn /usr/local/bin/crf_learn
@@ -124,18 +113,30 @@ COPY ./alembic.ini $MEALIE_HOME/
# venv already has runtime deps installed we get a quicker install
WORKDIR $MEALIE_HOME
RUN . $VENV_PATH/bin/activate && poetry install -E pgsql --no-dev
RUN . $VENV_PATH/bin/activate && poetry install -E pgsql --only main
WORKDIR /
# Grab CRF++ Model Release
RUN curl -L0 $CRF_MODEL_URL --output $MEALIE_HOME/mealie/services/parser_services/crfpp/model.crfmodel
RUN python $MEALIE_HOME/mealie/scripts/install_model.py
VOLUME [ "$MEALIE_HOME/data/" ]
ENV APP_PORT=9000
EXPOSE ${APP_PORT}
HEALTHCHECK CMD curl -f http://localhost:${APP_PORT}/docs || exit 1
HEALTHCHECK CMD python $MEALIE_HOME/mealie/scripts/healthcheck.py || exit 1
RUN chmod +x $MEALIE_HOME/mealie/run.sh
ENTRYPOINT $MEALIE_HOME/mealie/run.sh
# ----------------------------------
# Copy Frontend
# copying caddy into image
ENV STATIC_FILES=/spa/static
COPY --from=builder /app/dist ${STATIC_FILES}
ENV HOST 0.0.0.0
EXPOSE ${APP_PORT}
COPY ./docker/entry.sh $MEALIE_HOME/run.sh
RUN chmod +x $MEALIE_HOME/run.sh
ENTRYPOINT $MEALIE_HOME/run.sh

45
docker/docker-compose.yml Normal file
View File

@@ -0,0 +1,45 @@
version: "3.4"
services:
mealie:
container_name: mealie
image: mealie:dev
build:
context: ../
target: production
dockerfile: ./docker/Dockerfile
restart: always
volumes:
- mealie-data:/app/data/
ports:
- 9091:9000
environment:
ALLOW_SIGNUP: "false"
DB_ENGINE: sqlite # Optional: 'sqlite', 'postgres'
# =====================================
# Postgres Config
POSTGRES_USER: mealie
POSTGRES_PASSWORD: mealie
POSTGRES_SERVER: postgres
POSTGRES_PORT: 5432
POSTGRES_DB: mealie
# =====================================
# Web Concurrency
WEB_GUNICORN: "false"
WORKERS_PER_CORE: 0.5
MAX_WORKERS: 1
WEB_CONCURRENCY: 1
# =====================================
# Email Configuration
# SMTP_HOST=
# SMTP_PORT=587
# SMTP_FROM_NAME=Mealie
# SMTP_AUTH_STRATEGY=TLS # Options: 'TLS', 'SSL', 'NONE'
# SMTP_FROM_EMAIL=
# SMTP_USER=
# SMTP_PASSWORD=
volumes:
mealie-data:
driver: local

55
docker/entry.sh Normal file
View File

@@ -0,0 +1,55 @@
# Start Backend API
#!/bin/bash
# Strict Mode
# set -e
# IFS=$'\n\t'
# Get PUID/PGID
PUID=${PUID:-911}
PGID=${PGID:-911}
add_user() {
groupmod -o -g "$PGID" abc
usermod -o -u "$PUID" abc
}
change_user() {
# If container is started as root then create a new user and switch to it
if [ "$(id -u)" = "0" ]; then
add_user
chown -R $PUID:$PGID /app
echo "Switching to dedicated user"
exec gosu $PUID "$BASH_SOURCE" "$@"
elif [ "$(id -u)" = $PUID ]; then
echo "
User uid: $PUID
User gid: $PGID
"
fi
}
init() {
# $MEALIE_HOME directory
cd /app
# Activate our virtual environment here
. /opt/pysetup/.venv/bin/activate
# Initialize Database Prerun
poetry run python /app/mealie/db/init_db.py
}
# change_user
init
GUNICORN_PORT=${API_PORT:-9000}
# Start API
hostip=`/sbin/ip route|awk '/default/ { print $3 }'`
if [ "$WEB_GUNICORN" = 'true' ]; then
echo "Starting Gunicorn"
gunicorn mealie.app:app -b 0.0.0.0:$GUNICORN_PORT --forwarded-allow-ips=$hostip -k uvicorn.workers.UvicornWorker -c /app/gunicorn_conf.py --preload
else
uvicorn mealie.app:app --host 0.0.0.0 --forwarded-allow-ips=$hostip --port $GUNICORN_PORT
fi

View File

@@ -1,15 +0,0 @@
{
auto_https off
}
:80 {
root * /srv
encode gzip
uri strip_suffix /
handle {
try_files {path} {path}/ /index.html
file_server
}
}

View File

@@ -1,10 +0,0 @@
FROM python:3.8-slim as build-stage
WORKDIR /app
RUN pip install --no-cache-dir mkdocs mkdocs-material
COPY . .
RUN mkdocs build
FROM caddy:alpine
WORKDIR /app
COPY ./Caddyfile /etc/caddy/Caddyfile
COPY --from=build-stage /app/site /srv

View File

@@ -1,11 +0,0 @@
version: "3"
services:
wiki:
container_name: mealie-docs
image: mealie-docs
ports:
- 8888:80
build:
context: .
dockerfile: Dockerfile
restart: always

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

View File

@@ -1,30 +0,0 @@
# vx.x.x COOL TITLE GOES HERE
**App Version: vx.x.x**
**Database Version: vx.x.x**
## Breaking Changes
!!! error "Breaking Changes"
#### Database
#### ENV Variables
## Bug Fixes
- Fixed ...
## Features and Improvements
### General
- New Thing 1
### UI Improvements
-
### Behind the Scenes
- Refactoring...

View File

@@ -67,6 +67,6 @@ This is, what I think, is a big release! Tons of new features and some great qua
### Breaking Changes
!!! error "Breaking Changes"
- API endpoints have been refactored to adhear to a more consistent standard. This is a WIP and more changes are likely to occur.
- API endpoints have been refactored to adhere to a more consistent standard. This is a WIP and more changes are likely to occur.
- Officially Dropped MongoDB Support
- Database Breaks! We have not yet implemented a database migration service. As such, upgrades cannot be done by simply pulling the image. You must first export your recipes, update your deployment, and then import your recipes. This pattern is likely to be how upgrades take place prior to v1.0. After v1.0 migrations will be done automatically.

View File

@@ -73,7 +73,7 @@
- See what's for dinner
- Manage Long Live API Tokens (New)
- New Admin Dashboard! 🎉
- Now you can get some insight on your application with application statics and events.
- Now you can get some insight on your application with application statistics and events.
- See uncategorized/untagged recipes and organize them!
- Backup/Restore right from your dashboard
- See server side events. Now you can know who deleted your favorite recipe!

View File

@@ -73,7 +73,7 @@
- Site Settings has been completely revamped. All site-wide settings at defined on the server as ENV variables. The site settings page now only shows you the non-secret values for reference. It also has some helpers to let you know if something isn't configured correctly.
- Server Side Bare URL will let you know if the BASE_URL env variable has been set
- Secure Site let's you know if you're serving via HTTPS or accessing by localhost. accessing without a secure site will render some of the features unusable.
- Secure Site let's you know if you're serving via HTTPS or accessing by localhost. Accessing without a secure site will render some of the features unusable.
- Email Configuration Status will let you know if all the email settings have been provided and offer a way to send test emails.
#### 👨‍👩‍👧‍👦 Users and Groups

View File

@@ -0,0 +1,29 @@
### Bug Fixes
- Bump isomorphic-dompurify from 0.18.0 to 0.19.0 in /frontend ([#1257](https://github.com/hay-kot/mealie/issues/1257))
- Bump @nuxtjs/auth-next in /frontend ([#1265](https://github.com/hay-kot/mealie/issues/1265))
- Bad dev dependency ([#1281](https://github.com/hay-kot/mealie/issues/1281))
- Add touch support for mealplanner delete ([#1298](https://github.com/hay-kot/mealie/issues/1298))
### Documentation
- Add references for VSCode dev containers ([#1299](https://github.com/hay-kot/mealie/issues/1299))
- Docker-compose.dev.yml is currently not functional ([#1300](https://github.com/hay-kot/mealie/issues/1300))
### Features
- Add reports to bulk recipe import (url) ([#1294](https://github.com/hay-kot/mealie/issues/1294))
- Rewrite print implementation to support new ing ([#1305](https://github.com/hay-kot/mealie/issues/1305))
### Miscellaneous Tasks
- Github stalebot changes ([#1271](https://github.com/hay-kot/mealie/issues/1271))
- Bump eslint-plugin-nuxt in /frontend ([#1258](https://github.com/hay-kot/mealie/issues/1258))
- Bump @vue/runtime-dom in /frontend ([#1259](https://github.com/hay-kot/mealie/issues/1259))
- Bump nuxt-vite from 0.1.3 to 0.3.5 in /frontend ([#1260](https://github.com/hay-kot/mealie/issues/1260))
- Bump vue2-script-setup-transform in /frontend ([#1263](https://github.com/hay-kot/mealie/issues/1263))
- Update dev dependencies ([#1282](https://github.com/hay-kot/mealie/issues/1282))
### Refactor
- Split up recipe create page ([#1283](https://github.com/hay-kot/mealie/issues/1283))

View File

@@ -0,0 +1,36 @@
### Bug Fixes
- Update issue links in v1.0.0beta-2 changelog ([#1312](https://github.com/hay-kot/mealie/issues/1312))
- Bad import path ([#1313](https://github.com/hay-kot/mealie/issues/1313))
- Printer page refs ([#1314](https://github.com/hay-kot/mealie/issues/1314))
- Consolidate stores to fix mismatched state
- Bump @vue/composition-api from 1.6.1 to 1.6.2 in /frontend ([#1275](https://github.com/hay-kot/mealie/issues/1275))
- Shopping list label editor ([#1333](https://github.com/hay-kot/mealie/issues/1333))
### Features
- Default unit fractions to True
- Add unit abbreviation support ([#1332](https://github.com/hay-kot/mealie/issues/1332))
- Attached images by drag and drop for recipe steps ([#1341](https://github.com/hay-kot/mealie/issues/1341))
### Docs
- Render homepage social media link images at 32x32 size ([#1310](https://github.com/hay-kot/mealie/issues/1310))
### Miscellaneous Tasks
- Init git-cliff config
- Bump @types/sortablejs in /frontend ([#1287](https://github.com/hay-kot/mealie/issues/1287))
- Bump @babel/eslint-parser in /frontend ([#1290](https://github.com/hay-kot/mealie/issues/1290))
### Refactor
- Unify recipe-organizer components ([#1340](https://github.com/hay-kot/mealie/issues/1340))
### Security
- Delay server response whenever username is non existing ([#1338](https://github.com/hay-kot/mealie/issues/1338))
### Wip
- Pagination-repository ([#1316](https://github.com/hay-kot/mealie/issues/1316))

View File

@@ -0,0 +1,126 @@
### Security
#### v1.0.0beta-3 and Under - Recipe Scraper: Server Side Request Forgery Lead To Denial Of Service
!!! error "CWE-918: Server-Side Request Forgery (SSRF)"
In this case if a attacker try to load a huge file then server will try to load the file and eventually server use its all memory which will dos the server
##### Mitigation
HTML is now scraped via a Stream and canceled after a 15 second timeout to prevent arbitrary data from being loaded into the server.
#### v1.0.0beta-3 and Under - Recipe Assets: Remote Code Execution
!!! error "CWE-1336: Improper Neutralization of Special Elements Used in a Template Engine"
As a low privileged user, Create a new recipe and click on the "+" to add a New Asset.
Select a file, then proxy the request that will create the asset.
Since mealie/routes/recipe/recipe_crud_routes.py:306 is calling slugify on the name POST parameter, we use $ which slugify() will remove completely.
Since mealie/routes/recipe/recipe_crud_routes.py:306 is concatenating raw user input from the extension POST parameter into the variable file_name, which ultimately gets used when writing to disk, we can use a directory traversal attack in the extension (e.g. ./../../../tmp/pwn.txt) to write the file to arbitrary location on the server.
As an attacker, now that we have a strong attack primitive, we can start getting creative to get RCE. Since the files were being created by root, we could add an entry to /etc/passwd, create a crontab, etc. but since there was templating functionality in the application that peaked my interest. The PoC in the HTTP request above creates a Jinja2 template at /app/data/template/pwn.html. Since Jinja2 templates execute Python code when rendered, all we have to do now to get code execution is render the malicious template. This was easy enough.
##### Mitigation
We've added proper path sanitization to ensure that the user is not allowed to write to arbitrary locations on the server.
!!! warning "Breaking Change Incoming"
As this has shown a significant area of exposure in the templates that Mealie was provided for exporting recipes, we'll be removing this feature in the next Beta release and will instead rely on the community to provide tooling around transforming recipes using templates. This will significantly limit the possible exposure of users injecting malicious templates into the application. The template functionality will be completely removed in the next beta release v1.0.0beta-5
#### All version Markdown Editor: Cross Site Scripting
!!! error "CWE-79: Cross-site Scripting (XSS) - Stored"
A low privilege user can insert malicious JavaScript code into the Recipe Instructions which will execute in another person's browser that visits the recipe.
`<img src=x onerror=alert(document.domain)>`
##### Mitigation
This issues is present on all pages that allow markdown input. This error has been mitigated by wrapping the 3rd Party Markdown component and using the `domPurify` library to strip out the dangerous HTML.
#### v1.0.0beta-3 and Under - Image Scraper: Server-Side Request Forgery
!!! error "CWE-918: Server-Side Request Forgery (SSRF)"
In the recipe edit page, is possible to upload an image directly or via an URL provided by the user. The function that handles the fetching and saving of the image via the URL doesn't have any URL verification, which allows to fetch internal services.
Furthermore, after the resource is fetch, there is no MIME type validation, which would ensure that the resource is indeed an image. After this, because there is no extension in the provided URL, the application will fallback to jpg, and original for the image name.
Then the result is saved to disk with the original.jpg name, that can be retrieved from the following URL: http://<domain>/api/media/recipes/<recipe-uid>/images/original.jpg. This file will contain the full response of the provided URL.
**Impact**
An attacker can get sensitive information of any internal-only services running. For example, if the application is hosted on Amazon Web Services (AWS) platform, its possible to fetch the AWS API endpoint, https://169.254.169.254, which returns API keys and other sensitive metadata.
##### Mitigation
Two actions were taken to reduce exposure to SSRF in this case.
1. The application will not prevent requests being made to local resources by checking for localhost or 127.0.0.1 domain names.
2. The mime-type of the response is now checked prior to writing to disk.
If either of the above actions prevent the user from uploading images, the application will alert the user of what error occurred.
### Bug Fixes
- For erroneously-translated datetime config ([#1362](https://github.com/hay-kot/mealie/issues/1362))
- Fixed text color on RecipeCard in RecipePrintView and implemented ingredient sections ([#1351](https://github.com/hay-kot/mealie/issues/1351))
- Ingredient sections lost after parsing ([#1368](https://github.com/hay-kot/mealie/issues/1368))
- Increased float rounding precision for CRF parser ([#1369](https://github.com/hay-kot/mealie/issues/1369))
- Infinite scroll bug on all recipes page ([#1393](https://github.com/hay-kot/mealie/issues/1393))
- Fast fail of bulk importer ([#1394](https://github.com/hay-kot/mealie/issues/1394))
- Bump @mdi/js from 5.9.55 to 6.7.96 in /frontend ([#1279](https://github.com/hay-kot/mealie/issues/1279))
- Bump @nuxtjs/i18n from 7.0.3 to 7.2.2 in /frontend ([#1288](https://github.com/hay-kot/mealie/issues/1288))
- Bump date-fns from 2.23.0 to 2.28.0 in /frontend ([#1293](https://github.com/hay-kot/mealie/issues/1293))
- Bump fuse.js from 6.5.3 to 6.6.2 in /frontend ([#1325](https://github.com/hay-kot/mealie/issues/1325))
- Bump core-js from 3.17.2 to 3.23.1 in /frontend ([#1383](https://github.com/hay-kot/mealie/issues/1383))
- All-recipes page now sorts alphabetically ([#1405](https://github.com/hay-kot/mealie/issues/1405))
- Sort recent recipes by created_at instead of date_added ([#1417](https://github.com/hay-kot/mealie/issues/1417))
- Only show scaler when ingredients amounts enabled ([#1426](https://github.com/hay-kot/mealie/issues/1426))
- Add missing types for API token deletion ([#1428](https://github.com/hay-kot/mealie/issues/1428))
- Entry nutrition checker ([#1448](https://github.com/hay-kot/mealie/issues/1448))
- Use == operator instead of is_ for sql queries ([#1453](https://github.com/hay-kot/mealie/issues/1453))
- Use `mtime` instead of `ctime` for backup dates ([#1461](https://github.com/hay-kot/mealie/issues/1461))
- Mealplan pagination ([#1464](https://github.com/hay-kot/mealie/issues/1464))
- Properly use pagination for group event notifies ([#1512](https://github.com/hay-kot/mealie/pull/1512))
### Documentation
- Add go bulk import example ([#1388](https://github.com/hay-kot/mealie/issues/1388))
- Fix old link
- Pagination and filtering, and fixed a few broken links ([#1488](https://github.com/hay-kot/mealie/issues/1488))
### Features
- Toggle display of ingredient references in recipe instructions ([#1268](https://github.com/hay-kot/mealie/issues/1268))
- Add custom scaling option ([#1345](https://github.com/hay-kot/mealie/issues/1345))
- Implemented "order by" API parameters for recipe, food, and unit queries ([#1356](https://github.com/hay-kot/mealie/issues/1356))
- Implement user favorites page ([#1376](https://github.com/hay-kot/mealie/issues/1376))
- Extend Apprise JSON notification functionality with programmatic data ([#1355](https://github.com/hay-kot/mealie/issues/1355))
- Mealplan-webhooks ([#1403](https://github.com/hay-kot/mealie/issues/1403))
- Added "last-modified" header to supported record types ([#1379](https://github.com/hay-kot/mealie/issues/1379))
- Re-write get all routes to use pagination ([#1424](https://github.com/hay-kot/mealie/issues/1424))
- Advanced filtering API ([#1468](https://github.com/hay-kot/mealie/issues/1468))
- Restore frontend sorting for all recipes ([#1497](https://github.com/hay-kot/mealie/issues/1497))
- Implemented local storage for sorting and dynamic sort icons on the new recipe sort card ([1506](https://github.com/hay-kot/mealie/pull/1506))
- create new foods and units from their Data Management pages ([#1511](https://github.com/hay-kot/mealie/pull/1511))
### Miscellaneous Tasks
- Bump dev deps ([#1418](https://github.com/hay-kot/mealie/issues/1418))
- Bump @vue/runtime-dom in /frontend ([#1423](https://github.com/hay-kot/mealie/issues/1423))
- Backend page_all route cleanup ([#1483](https://github.com/hay-kot/mealie/issues/1483))
### Refactor
- Remove depreciated repo call ([#1370](https://github.com/hay-kot/mealie/issues/1370))
### Hotfix
- Tame typescript beast
### UI
- Improve parser ui text display ([#1437](https://github.com/hay-kot/mealie/issues/1437))
<!-- generated by git-cliff -->

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