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

422 lines
14 KiB
Python

# This Content is Auto Generated for Pytest
prefix = "/api"
admin_about = "/api/admin/about"
"""`/api/admin/about`"""
admin_about_check = "/api/admin/about/check"
"""`/api/admin/about/check`"""
admin_about_docker_validate = "/api/admin/about/docker/validate"
"""`/api/admin/about/docker/validate`"""
admin_about_statistics = "/api/admin/about/statistics"
"""`/api/admin/about/statistics`"""
admin_analytics = "/api/admin/analytics"
"""`/api/admin/analytics`"""
admin_backups = "/api/admin/backups"
"""`/api/admin/backups`"""
admin_backups_upload = "/api/admin/backups/upload"
"""`/api/admin/backups/upload`"""
admin_email = "/api/admin/email"
"""`/api/admin/email`"""
admin_groups = "/api/admin/groups"
"""`/api/admin/groups`"""
admin_logs = "/api/admin/logs"
"""`/api/admin/logs`"""
admin_maintenance = "/api/admin/maintenance"
"""`/api/admin/maintenance`"""
admin_maintenance_clean_images = "/api/admin/maintenance/clean/images"
"""`/api/admin/maintenance/clean/images`"""
admin_maintenance_clean_logs = "/api/admin/maintenance/clean/logs"
"""`/api/admin/maintenance/clean/logs`"""
admin_maintenance_clean_recipe_folders = "/api/admin/maintenance/clean/recipe-folders"
"""`/api/admin/maintenance/clean/recipe-folders`"""
admin_maintenance_clean_temp = "/api/admin/maintenance/clean/temp"
"""`/api/admin/maintenance/clean/temp`"""
admin_maintenance_logs = "/api/admin/maintenance/logs"
"""`/api/admin/maintenance/logs`"""
admin_maintenance_storage = "/api/admin/maintenance/storage"
"""`/api/admin/maintenance/storage`"""
admin_server_tasks = "/api/admin/server-tasks"
"""`/api/admin/server-tasks`"""
admin_users = "/api/admin/users"
"""`/api/admin/users`"""
admin_users_unlock = "/api/admin/users/unlock"
"""`/api/admin/users/unlock`"""
app_about = "/api/app/about"
"""`/api/app/about`"""
auth_refresh = "/api/auth/refresh"
"""`/api/auth/refresh`"""
auth_token = "/api/auth/token"
"""`/api/auth/token`"""
comments = "/api/comments"
"""`/api/comments`"""
foods = "/api/foods"
"""`/api/foods`"""
foods_merge = "/api/foods/merge"
"""`/api/foods/merge`"""
groups_categories = "/api/groups/categories"
"""`/api/groups/categories`"""
groups_cookbooks = "/api/groups/cookbooks"
"""`/api/groups/cookbooks`"""
groups_events_notifications = "/api/groups/events/notifications"
"""`/api/groups/events/notifications`"""
groups_invitations = "/api/groups/invitations"
"""`/api/groups/invitations`"""
groups_invitations_email = "/api/groups/invitations/email"
"""`/api/groups/invitations/email`"""
groups_labels = "/api/groups/labels"
"""`/api/groups/labels`"""
groups_mealplans = "/api/groups/mealplans"
"""`/api/groups/mealplans`"""
groups_mealplans_random = "/api/groups/mealplans/random"
"""`/api/groups/mealplans/random`"""
groups_mealplans_rules = "/api/groups/mealplans/rules"
"""`/api/groups/mealplans/rules`"""
groups_mealplans_today = "/api/groups/mealplans/today"
"""`/api/groups/mealplans/today`"""
groups_members = "/api/groups/members"
"""`/api/groups/members`"""
groups_migrations = "/api/groups/migrations"
"""`/api/groups/migrations`"""
groups_permissions = "/api/groups/permissions"
"""`/api/groups/permissions`"""
groups_preferences = "/api/groups/preferences"
"""`/api/groups/preferences`"""
groups_reports = "/api/groups/reports"
"""`/api/groups/reports`"""
groups_seeders_foods = "/api/groups/seeders/foods"
"""`/api/groups/seeders/foods`"""
groups_seeders_labels = "/api/groups/seeders/labels"
"""`/api/groups/seeders/labels`"""
groups_seeders_units = "/api/groups/seeders/units"
"""`/api/groups/seeders/units`"""
groups_self = "/api/groups/self"
"""`/api/groups/self`"""
groups_shopping_items = "/api/groups/shopping/items"
"""`/api/groups/shopping/items`"""
groups_shopping_items_create_bulk = "/api/groups/shopping/items/create-bulk"
"""`/api/groups/shopping/items/create-bulk`"""
groups_shopping_lists = "/api/groups/shopping/lists"
"""`/api/groups/shopping/lists`"""
groups_statistics = "/api/groups/statistics"
"""`/api/groups/statistics`"""
groups_storage = "/api/groups/storage"
"""`/api/groups/storage`"""
groups_webhooks = "/api/groups/webhooks"
"""`/api/groups/webhooks`"""
groups_webhooks_rerun = "/api/groups/webhooks/rerun"
"""`/api/groups/webhooks/rerun`"""
media_docker_validate_txt = "/api/media/docker/validate.txt"
"""`/api/media/docker/validate.txt`"""
ocr = "/api/ocr/"
"""`/api/ocr/`"""
ocr_asset_to_tsv = "/api/ocr/asset-to-tsv"
"""`/api/ocr/asset-to-tsv`"""
ocr_file_to_tsv = "/api/ocr/file-to-tsv"
"""`/api/ocr/file-to-tsv`"""
organizers_categories = "/api/organizers/categories"
"""`/api/organizers/categories`"""
organizers_categories_empty = "/api/organizers/categories/empty"
"""`/api/organizers/categories/empty`"""
organizers_tags = "/api/organizers/tags"
"""`/api/organizers/tags`"""
organizers_tags_empty = "/api/organizers/tags/empty"
"""`/api/organizers/tags/empty`"""
organizers_tools = "/api/organizers/tools"
"""`/api/organizers/tools`"""
parser_ingredient = "/api/parser/ingredient"
"""`/api/parser/ingredient`"""
parser_ingredients = "/api/parser/ingredients"
"""`/api/parser/ingredients`"""
recipes = "/api/recipes"
"""`/api/recipes`"""
recipes_bulk_actions_categorize = "/api/recipes/bulk-actions/categorize"
"""`/api/recipes/bulk-actions/categorize`"""
recipes_bulk_actions_delete = "/api/recipes/bulk-actions/delete"
"""`/api/recipes/bulk-actions/delete`"""
recipes_bulk_actions_export = "/api/recipes/bulk-actions/export"
"""`/api/recipes/bulk-actions/export`"""
recipes_bulk_actions_export_download = "/api/recipes/bulk-actions/export/download"
"""`/api/recipes/bulk-actions/export/download`"""
recipes_bulk_actions_export_purge = "/api/recipes/bulk-actions/export/purge"
"""`/api/recipes/bulk-actions/export/purge`"""
recipes_bulk_actions_settings = "/api/recipes/bulk-actions/settings"
"""`/api/recipes/bulk-actions/settings`"""
recipes_bulk_actions_tag = "/api/recipes/bulk-actions/tag"
"""`/api/recipes/bulk-actions/tag`"""
recipes_create_from_zip = "/api/recipes/create-from-zip"
"""`/api/recipes/create-from-zip`"""
recipes_create_ocr = "/api/recipes/create-ocr"
"""`/api/recipes/create-ocr`"""
recipes_create_url = "/api/recipes/create-url"
"""`/api/recipes/create-url`"""
recipes_create_url_bulk = "/api/recipes/create-url/bulk"
"""`/api/recipes/create-url/bulk`"""
recipes_exports = "/api/recipes/exports"
"""`/api/recipes/exports`"""
recipes_summary_uncategorized = "/api/recipes/summary/uncategorized"
"""`/api/recipes/summary/uncategorized`"""
recipes_summary_untagged = "/api/recipes/summary/untagged"
"""`/api/recipes/summary/untagged`"""
recipes_test_scrape_url = "/api/recipes/test-scrape-url"
"""`/api/recipes/test-scrape-url`"""
shared_recipes = "/api/shared/recipes"
"""`/api/shared/recipes`"""
units = "/api/units"
"""`/api/units`"""
units_merge = "/api/units/merge"
"""`/api/units/merge`"""
users = "/api/users"
"""`/api/users`"""
users_api_tokens = "/api/users/api-tokens"
"""`/api/users/api-tokens`"""
users_forgot_password = "/api/users/forgot-password"
"""`/api/users/forgot-password`"""
users_password = "/api/users/password"
"""`/api/users/password`"""
users_register = "/api/users/register"
"""`/api/users/register`"""
users_reset_password = "/api/users/reset-password"
"""`/api/users/reset-password`"""
users_self = "/api/users/self"
"""`/api/users/self`"""
utils_download = "/api/utils/download"
"""`/api/utils/download`"""
validators_group = "/api/validators/group"
"""`/api/validators/group`"""
validators_recipe = "/api/validators/recipe"
"""`/api/validators/recipe`"""
validators_user_email = "/api/validators/user/email"
"""`/api/validators/user/email`"""
validators_user_name = "/api/validators/user/name"
"""`/api/validators/user/name`"""
def admin_backups_file_name(file_name):
"""`/api/admin/backups/{file_name}`"""
return f"{prefix}/admin/backups/{file_name}"
def admin_backups_file_name_restore(file_name):
"""`/api/admin/backups/{file_name}/restore`"""
return f"{prefix}/admin/backups/{file_name}/restore"
def admin_groups_item_id(item_id):
"""`/api/admin/groups/{item_id}`"""
return f"{prefix}/admin/groups/{item_id}"
def admin_logs_num(num):
"""`/api/admin/logs/{num}`"""
return f"{prefix}/admin/logs/{num}"
def admin_users_item_id(item_id):
"""`/api/admin/users/{item_id}`"""
return f"{prefix}/admin/users/{item_id}"
def comments_item_id(item_id):
"""`/api/comments/{item_id}`"""
return f"{prefix}/comments/{item_id}"
def explore_recipes_group_id_recipe_slug(group_id, recipe_slug):
"""`/api/explore/recipes/{group_id}/{recipe_slug}`"""
return f"{prefix}/explore/recipes/{group_id}/{recipe_slug}"
def foods_item_id(item_id):
"""`/api/foods/{item_id}`"""
return f"{prefix}/foods/{item_id}"
def groups_cookbooks_item_id(item_id):
"""`/api/groups/cookbooks/{item_id}`"""
return f"{prefix}/groups/cookbooks/{item_id}"
def groups_events_notifications_item_id(item_id):
"""`/api/groups/events/notifications/{item_id}`"""
return f"{prefix}/groups/events/notifications/{item_id}"
def groups_events_notifications_item_id_test(item_id):
"""`/api/groups/events/notifications/{item_id}/test`"""
return f"{prefix}/groups/events/notifications/{item_id}/test"
def groups_labels_item_id(item_id):
"""`/api/groups/labels/{item_id}`"""
return f"{prefix}/groups/labels/{item_id}"
def groups_mealplans_item_id(item_id):
"""`/api/groups/mealplans/{item_id}`"""
return f"{prefix}/groups/mealplans/{item_id}"
def groups_mealplans_rules_item_id(item_id):
"""`/api/groups/mealplans/rules/{item_id}`"""
return f"{prefix}/groups/mealplans/rules/{item_id}"
def groups_reports_item_id(item_id):
"""`/api/groups/reports/{item_id}`"""
return f"{prefix}/groups/reports/{item_id}"
def groups_shopping_items_item_id(item_id):
"""`/api/groups/shopping/items/{item_id}`"""
return f"{prefix}/groups/shopping/items/{item_id}"
def groups_shopping_lists_item_id(item_id):
"""`/api/groups/shopping/lists/{item_id}`"""
return f"{prefix}/groups/shopping/lists/{item_id}"
def groups_shopping_lists_item_id_recipe_recipe_id(item_id, recipe_id):
"""`/api/groups/shopping/lists/{item_id}/recipe/{recipe_id}`"""
return f"{prefix}/groups/shopping/lists/{item_id}/recipe/{recipe_id}"
def groups_shopping_lists_item_id_recipe_recipe_id_delete(item_id, recipe_id):
"""`/api/groups/shopping/lists/{item_id}/recipe/{recipe_id}/delete`"""
return f"{prefix}/groups/shopping/lists/{item_id}/recipe/{recipe_id}/delete"
def groups_webhooks_item_id(item_id):
"""`/api/groups/webhooks/{item_id}`"""
return f"{prefix}/groups/webhooks/{item_id}"
def media_recipes_recipe_id_assets_file_name(recipe_id, file_name):
"""`/api/media/recipes/{recipe_id}/assets/{file_name}`"""
return f"{prefix}/media/recipes/{recipe_id}/assets/{file_name}"
def media_recipes_recipe_id_images_file_name(recipe_id, file_name):
"""`/api/media/recipes/{recipe_id}/images/{file_name}`"""
return f"{prefix}/media/recipes/{recipe_id}/images/{file_name}"
def media_users_user_id_file_name(user_id, file_name):
"""`/api/media/users/{user_id}/{file_name}`"""
return f"{prefix}/media/users/{user_id}/{file_name}"
def organizers_categories_item_id(item_id):
"""`/api/organizers/categories/{item_id}`"""
return f"{prefix}/organizers/categories/{item_id}"
def organizers_categories_slug_category_slug(category_slug):
"""`/api/organizers/categories/slug/{category_slug}`"""
return f"{prefix}/organizers/categories/slug/{category_slug}"
def organizers_tags_item_id(item_id):
"""`/api/organizers/tags/{item_id}`"""
return f"{prefix}/organizers/tags/{item_id}"
def organizers_tags_slug_tag_slug(tag_slug):
"""`/api/organizers/tags/slug/{tag_slug}`"""
return f"{prefix}/organizers/tags/slug/{tag_slug}"
def organizers_tools_item_id(item_id):
"""`/api/organizers/tools/{item_id}`"""
return f"{prefix}/organizers/tools/{item_id}"
def organizers_tools_slug_tool_slug(tool_slug):
"""`/api/organizers/tools/slug/{tool_slug}`"""
return f"{prefix}/organizers/tools/slug/{tool_slug}"
def recipes_shared_token_id(token_id):
"""`/api/recipes/shared/{token_id}`"""
return f"{prefix}/recipes/shared/{token_id}"
def recipes_slug(slug):
"""`/api/recipes/{slug}`"""
return f"{prefix}/recipes/{slug}"
def recipes_slug_assets(slug):
"""`/api/recipes/{slug}/assets`"""
return f"{prefix}/recipes/{slug}/assets"
def recipes_slug_comments(slug):
"""`/api/recipes/{slug}/comments`"""
return f"{prefix}/recipes/{slug}/comments"
def recipes_slug_duplicate(slug):
"""`/api/recipes/{slug}/duplicate`"""
return f"{prefix}/recipes/{slug}/duplicate"
def recipes_slug_exports(slug):
"""`/api/recipes/{slug}/exports`"""
return f"{prefix}/recipes/{slug}/exports"
def recipes_slug_exports_zip(slug):
"""`/api/recipes/{slug}/exports/zip`"""
return f"{prefix}/recipes/{slug}/exports/zip"
def recipes_slug_image(slug):
"""`/api/recipes/{slug}/image`"""
return f"{prefix}/recipes/{slug}/image"
def recipes_slug_timeline_events(slug):
"""`/api/recipes/{slug}/timeline/events`"""
return f"{prefix}/recipes/{slug}/timeline/events"
def recipes_slug_timeline_events_item_id(slug, item_id):
"""`/api/recipes/{slug}/timeline/events/{item_id}`"""
return f"{prefix}/recipes/{slug}/timeline/events/{item_id}"
def shared_recipes_item_id(item_id):
"""`/api/shared/recipes/{item_id}`"""
return f"{prefix}/shared/recipes/{item_id}"
def units_item_id(item_id):
"""`/api/units/{item_id}`"""
return f"{prefix}/units/{item_id}"
def users_api_tokens_token_id(token_id):
"""`/api/users/api-tokens/{token_id}`"""
return f"{prefix}/users/api-tokens/{token_id}"
def users_id_favorites(id):
"""`/api/users/{id}/favorites`"""
return f"{prefix}/users/{id}/favorites"
def users_id_favorites_slug(id, slug):
"""`/api/users/{id}/favorites/{slug}`"""
return f"{prefix}/users/{id}/favorites/{slug}"
def users_id_image(id):
"""`/api/users/{id}/image`"""
return f"{prefix}/users/{id}/image"
def users_item_id(item_id):
"""`/api/users/{item_id}`"""
return f"{prefix}/users/{item_id}"