* added more test data
* added missing pytest id
* add fk validation to backup restore
* removed bad type imports
* actually apply the invalid fk filter and clean up types
* fix key name
* added log when removing bad rows
* removed unused import
* bumped info to warning
* refactor normalized search migration to use dummy default
* changed group slug migration to use raw SQL
* updated comment
* added tests with anonymized backups (currently failing)
* typo
* fixed LDAP enum in test data
* fix for adding label settings across groups
* add migration data fixes
* fix shopping list label settings test
* re-run db init instead of just running alembic migration, to include fixes
* intentionally broke SQLAlchemy GUID handling
* safely convert between GUID types in different databases
* restore original test data after testing backup restores
* added missing group name update to migration
* 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
* 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
`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.
* 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>
* 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
* 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
* 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
* 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>
* 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>
* 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
* 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>
* 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
* 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
* 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>
* 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