diff --git a/cookbook/serializer.py b/cookbook/serializer.py index 5f38f0fde..b57b12223 100644 --- a/cookbook/serializer.py +++ b/cookbook/serializer.py @@ -1112,6 +1112,12 @@ class RecipeImportSerializer(SpacedModelSerializer): fields = '__all__' +class RecipeBatchUpdateSerializer(serializers.Serializer): + recipes = serializers.ListField(child=serializers.IntegerField()) + keywords_add = serializers.ListField(child=serializers.IntegerField()) + keywords_remove = serializers.ListField(child=serializers.IntegerField()) + + class CustomFilterSerializer(SpacedModelSerializer, WritableNestedModelSerializer): shared = UserSerializer(many=True, required=False) @@ -1480,7 +1486,7 @@ class InviteLinkSerializer(WritableNestedModelSerializer): fields = ( 'id', 'uuid', 'email', 'group', 'valid_until', 'used_by', 'reusable', 'internal_note', 'created_by', 'created_at',) - read_only_fields = ('id', 'uuid', 'used_by' ,'created_by', 'created_at',) + read_only_fields = ('id', 'uuid', 'used_by', 'created_by', 'created_at',) # CORS, REST and Scopes aren't currently working @@ -1770,6 +1776,7 @@ class AiImportSerializer(serializers.Serializer): text = serializers.CharField(allow_null=True, allow_blank=True) recipe_id = serializers.CharField(allow_null=True, allow_blank=True) + class ExportRequestSerializer(serializers.Serializer): type = serializers.CharField() all = serializers.BooleanField(default=False) diff --git a/cookbook/urls.py b/cookbook/urls.py index 9412ba4a6..d91bfecfa 100644 --- a/cookbook/urls.py +++ b/cookbook/urls.py @@ -125,10 +125,6 @@ urlpatterns = [ ] -if DEBUG: - urlpatterns.append(path('test/', views.test, name='view_test')) - urlpatterns.append(path('test2/', views.test2, name='view_test2')) - # catchall view for new frontend urlpatterns += [ path('', views.index, name='index'), diff --git a/cookbook/views/api.py b/cookbook/views/api.py index ecee879af..f9fa4a453 100644 --- a/cookbook/views/api.py +++ b/cookbook/views/api.py @@ -110,7 +110,7 @@ from cookbook.serializer import (AccessTokenSerializer, AutomationSerializer, Au UserSerializer, UserSpaceSerializer, ViewLogSerializer, LocalizationSerializer, ServerSettingsSerializer, RecipeFromSourceResponseSerializer, ShoppingListEntryBulkCreateSerializer, FdcQuerySerializer, AiImportSerializer, ImportOpenDataSerializer, ImportOpenDataMetaDataSerializer, ImportOpenDataResponseSerializer, ExportRequestSerializer, - RecipeImportSerializer, ConnectorConfigSerializer, SearchPreferenceSerializer, SearchFieldsSerializer + RecipeImportSerializer, ConnectorConfigSerializer, SearchPreferenceSerializer, SearchFieldsSerializer, RecipeBatchUpdateSerializer ) from cookbook.version_info import TANDOOR_VERSION from cookbook.views.import_export import get_integration @@ -1359,6 +1359,29 @@ class RecipeViewSet(LoggingMixin, viewsets.ModelViewSet): return Response(self.serializer_class(qs, many=True).data) + @decorators.action(detail=False, methods=['PUT'], serializer_class=RecipeBatchUpdateSerializer) + def batch_update(self, request): + serializer = self.serializer_class(data=request.data, partial=True) + + if serializer.is_valid(): + recipes = Recipe.objects.filter(id__in=serializer.validated_data['recipes'], space=self.request.space) + safe_recipe_ids = Recipe.objects.filter(id__in=serializer.validated_data['recipes'], space=self.request.space).values_list('id', flat=True) + + if 'keywords_add' in serializer.validated_data: + keyword_relations = [] + for r in recipes: + for k in serializer.validated_data['keywords_add']: + keyword_relations.append(Recipe.keywords.through(recipe_id=r.pk, keyword_id=k)) + Recipe.keywords.through.objects.bulk_create(keyword_relations, ignore_conflicts=True, unique_fields=('recipe_id', 'keyword_id',)) + + if 'keywords_remove' in serializer.validated_data: + for k in serializer.validated_data['keywords_remove']: + Recipe.keywords.through.objects.filter(recipe_id__in=safe_recipe_ids,keyword_id=k).delete() + + return Response({}, 200) + + return Response(serializer.errors, 400) + @extend_schema_view(list=extend_schema( parameters=[OpenApiParameter(name='food_id', description='ID of food to filter for', type=int), ])) diff --git a/vue3/src/components/dialogs/BatchEditRecipeDialog.vue b/vue3/src/components/dialogs/BatchEditRecipeDialog.vue new file mode 100644 index 000000000..ad8c8c691 --- /dev/null +++ b/vue3/src/components/dialogs/BatchEditRecipeDialog.vue @@ -0,0 +1,85 @@ + + + + + + \ No newline at end of file diff --git a/vue3/src/openapi/.openapi-generator/FILES b/vue3/src/openapi/.openapi-generator/FILES index f7730ffea..1ba20fdda 100644 --- a/vue3/src/openapi/.openapi-generator/FILES +++ b/vue3/src/openapi/.openapi-generator/FILES @@ -71,13 +71,6 @@ models/PaginatedInviteLinkList.ts models/PaginatedKeywordList.ts models/PaginatedMealPlanList.ts models/PaginatedMealTypeList.ts -models/PaginatedOpenDataCategoryList.ts -models/PaginatedOpenDataConversionList.ts -models/PaginatedOpenDataFoodList.ts -models/PaginatedOpenDataPropertyList.ts -models/PaginatedOpenDataStoreList.ts -models/PaginatedOpenDataUnitList.ts -models/PaginatedOpenDataVersionList.ts models/PaginatedPropertyList.ts models/PaginatedPropertyTypeList.ts models/PaginatedRecipeBookEntryList.ts @@ -147,6 +140,7 @@ models/PatchedViewLog.ts models/Property.ts models/PropertyType.ts models/Recipe.ts +models/RecipeBatchUpdate.ts models/RecipeBook.ts models/RecipeBookEntry.ts models/RecipeFlat.ts diff --git a/vue3/src/openapi/apis/ApiApi.ts b/vue3/src/openapi/apis/ApiApi.ts index cc4910fa0..da82870b9 100644 --- a/vue3/src/openapi/apis/ApiApi.ts +++ b/vue3/src/openapi/apis/ApiApi.ts @@ -63,13 +63,6 @@ import type { PaginatedKeywordList, PaginatedMealPlanList, PaginatedMealTypeList, - PaginatedOpenDataCategoryList, - PaginatedOpenDataConversionList, - PaginatedOpenDataFoodList, - PaginatedOpenDataPropertyList, - PaginatedOpenDataStoreList, - PaginatedOpenDataUnitList, - PaginatedOpenDataVersionList, PaginatedPropertyList, PaginatedPropertyTypeList, PaginatedRecipeBookEntryList, @@ -139,6 +132,7 @@ import type { Property, PropertyType, Recipe, + RecipeBatchUpdate, RecipeBook, RecipeBookEntry, RecipeFlat, @@ -269,20 +263,6 @@ import { PaginatedMealPlanListToJSON, PaginatedMealTypeListFromJSON, PaginatedMealTypeListToJSON, - PaginatedOpenDataCategoryListFromJSON, - PaginatedOpenDataCategoryListToJSON, - PaginatedOpenDataConversionListFromJSON, - PaginatedOpenDataConversionListToJSON, - PaginatedOpenDataFoodListFromJSON, - PaginatedOpenDataFoodListToJSON, - PaginatedOpenDataPropertyListFromJSON, - PaginatedOpenDataPropertyListToJSON, - PaginatedOpenDataStoreListFromJSON, - PaginatedOpenDataStoreListToJSON, - PaginatedOpenDataUnitListFromJSON, - PaginatedOpenDataUnitListToJSON, - PaginatedOpenDataVersionListFromJSON, - PaginatedOpenDataVersionListToJSON, PaginatedPropertyListFromJSON, PaginatedPropertyListToJSON, PaginatedPropertyTypeListFromJSON, @@ -421,6 +401,8 @@ import { PropertyTypeToJSON, RecipeFromJSON, RecipeToJSON, + RecipeBatchUpdateFromJSON, + RecipeBatchUpdateToJSON, RecipeBookFromJSON, RecipeBookToJSON, RecipeBookEntryFromJSON, @@ -738,6 +720,10 @@ export interface ApiEnterpriseSocialKeywordUpdateRequest { keyword: Omit; } +export interface ApiEnterpriseSocialRecipeBatchUpdateUpdateRequest { + recipeBatchUpdate: RecipeBatchUpdate; +} + export interface ApiEnterpriseSocialRecipeCreateRequest { recipe: Omit; } @@ -1151,11 +1137,6 @@ export interface ApiOpenDataCategoryDestroyRequest { id: number; } -export interface ApiOpenDataCategoryListRequest { - page?: number; - pageSize?: number; -} - export interface ApiOpenDataCategoryPartialUpdateRequest { id: number; patchedOpenDataCategory?: Omit; @@ -1178,11 +1159,6 @@ export interface ApiOpenDataConversionDestroyRequest { id: number; } -export interface ApiOpenDataConversionListRequest { - page?: number; - pageSize?: number; -} - export interface ApiOpenDataConversionPartialUpdateRequest { id: number; patchedOpenDataConversion?: Omit; @@ -1209,16 +1185,6 @@ export interface ApiOpenDataFoodDestroyRequest { id: number; } -export interface ApiOpenDataFoodFdcCreateRequest { - id: number; - openDataFood: Omit; -} - -export interface ApiOpenDataFoodListRequest { - page?: number; - pageSize?: number; -} - export interface ApiOpenDataFoodPartialUpdateRequest { id: number; patchedOpenDataFood?: Omit; @@ -1241,11 +1207,6 @@ export interface ApiOpenDataPropertyDestroyRequest { id: number; } -export interface ApiOpenDataPropertyListRequest { - page?: number; - pageSize?: number; -} - export interface ApiOpenDataPropertyPartialUpdateRequest { id: number; patchedOpenDataProperty?: Omit; @@ -1268,11 +1229,6 @@ export interface ApiOpenDataStoreDestroyRequest { id: number; } -export interface ApiOpenDataStoreListRequest { - page?: number; - pageSize?: number; -} - export interface ApiOpenDataStorePartialUpdateRequest { id: number; patchedOpenDataStore?: Omit; @@ -1295,11 +1251,6 @@ export interface ApiOpenDataUnitDestroyRequest { id: number; } -export interface ApiOpenDataUnitListRequest { - page?: number; - pageSize?: number; -} - export interface ApiOpenDataUnitPartialUpdateRequest { id: number; patchedOpenDataUnit?: Omit; @@ -1322,11 +1273,6 @@ export interface ApiOpenDataVersionDestroyRequest { id: number; } -export interface ApiOpenDataVersionListRequest { - page?: number; - pageSize?: number; -} - export interface ApiOpenDataVersionPartialUpdateRequest { id: number; patchedOpenDataVersion?: PatchedOpenDataVersion; @@ -1396,6 +1342,10 @@ export interface ApiPropertyUpdateRequest { property: Property; } +export interface ApiRecipeBatchUpdateUpdateRequest { + recipeBatchUpdate: RecipeBatchUpdate; +} + export interface ApiRecipeBookCreateRequest { recipeBook: Omit; } @@ -4276,6 +4226,46 @@ export class ApiApi extends runtime.BaseAPI { return await response.value(); } + /** + * logs request counts to redis cache total/per user/ + */ + async apiEnterpriseSocialRecipeBatchUpdateUpdateRaw(requestParameters: ApiEnterpriseSocialRecipeBatchUpdateUpdateRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + if (requestParameters['recipeBatchUpdate'] == null) { + throw new runtime.RequiredError( + 'recipeBatchUpdate', + 'Required parameter "recipeBatchUpdate" was null or undefined when calling apiEnterpriseSocialRecipeBatchUpdateUpdate().' + ); + } + + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + headerParameters['Content-Type'] = 'application/json'; + + if (this.configuration && this.configuration.apiKey) { + headerParameters["Authorization"] = await this.configuration.apiKey("Authorization"); // ApiKeyAuth authentication + } + + const response = await this.request({ + path: `/api/enterprise-social-recipe/batch_update/`, + method: 'PUT', + headers: headerParameters, + query: queryParameters, + body: RecipeBatchUpdateToJSON(requestParameters['recipeBatchUpdate']), + }, initOverrides); + + return new runtime.JSONApiResponse(response, (jsonValue) => RecipeBatchUpdateFromJSON(jsonValue)); + } + + /** + * logs request counts to redis cache total/per user/ + */ + async apiEnterpriseSocialRecipeBatchUpdateUpdate(requestParameters: ApiEnterpriseSocialRecipeBatchUpdateUpdateRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + const response = await this.apiEnterpriseSocialRecipeBatchUpdateUpdateRaw(requestParameters, initOverrides); + return await response.value(); + } + /** * logs request counts to redis cache total/per user/ */ @@ -7778,17 +7768,9 @@ export class ApiApi extends runtime.BaseAPI { /** */ - async apiOpenDataCategoryListRaw(requestParameters: ApiOpenDataCategoryListRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + async apiOpenDataCategoryListRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>> { const queryParameters: any = {}; - if (requestParameters['page'] != null) { - queryParameters['page'] = requestParameters['page']; - } - - if (requestParameters['pageSize'] != null) { - queryParameters['page_size'] = requestParameters['pageSize']; - } - const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { @@ -7802,13 +7784,13 @@ export class ApiApi extends runtime.BaseAPI { query: queryParameters, }, initOverrides); - return new runtime.JSONApiResponse(response, (jsonValue) => PaginatedOpenDataCategoryListFromJSON(jsonValue)); + return new runtime.JSONApiResponse(response, (jsonValue) => jsonValue.map(OpenDataCategoryFromJSON)); } /** */ - async apiOpenDataCategoryList(requestParameters: ApiOpenDataCategoryListRequest = {}, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { - const response = await this.apiOpenDataCategoryListRaw(requestParameters, initOverrides); + async apiOpenDataCategoryList(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + const response = await this.apiOpenDataCategoryListRaw(initOverrides); return await response.value(); } @@ -8004,17 +7986,9 @@ export class ApiApi extends runtime.BaseAPI { /** */ - async apiOpenDataConversionListRaw(requestParameters: ApiOpenDataConversionListRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + async apiOpenDataConversionListRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>> { const queryParameters: any = {}; - if (requestParameters['page'] != null) { - queryParameters['page'] = requestParameters['page']; - } - - if (requestParameters['pageSize'] != null) { - queryParameters['page_size'] = requestParameters['pageSize']; - } - const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { @@ -8028,13 +8002,13 @@ export class ApiApi extends runtime.BaseAPI { query: queryParameters, }, initOverrides); - return new runtime.JSONApiResponse(response, (jsonValue) => PaginatedOpenDataConversionListFromJSON(jsonValue)); + return new runtime.JSONApiResponse(response, (jsonValue) => jsonValue.map(OpenDataConversionFromJSON)); } /** */ - async apiOpenDataConversionList(requestParameters: ApiOpenDataConversionListRequest = {}, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { - const response = await this.apiOpenDataConversionListRaw(requestParameters, initOverrides); + async apiOpenDataConversionList(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + const response = await this.apiOpenDataConversionListRaw(initOverrides); return await response.value(); } @@ -8263,67 +8237,12 @@ export class ApiApi extends runtime.BaseAPI { } /** - * updates the food with all possible data from the FDC Api if properties with a fdc_id already exist they will be overridden, if existing properties don\'t have a fdc_id they won\'t be changed */ - async apiOpenDataFoodFdcCreateRaw(requestParameters: ApiOpenDataFoodFdcCreateRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { - if (requestParameters['id'] == null) { - throw new runtime.RequiredError( - 'id', - 'Required parameter "id" was null or undefined when calling apiOpenDataFoodFdcCreate().' - ); - } - - if (requestParameters['openDataFood'] == null) { - throw new runtime.RequiredError( - 'openDataFood', - 'Required parameter "openDataFood" was null or undefined when calling apiOpenDataFoodFdcCreate().' - ); - } - + async apiOpenDataFoodListRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>> { const queryParameters: any = {}; const headerParameters: runtime.HTTPHeaders = {}; - headerParameters['Content-Type'] = 'application/json'; - - if (this.configuration && this.configuration.apiKey) { - headerParameters["Authorization"] = await this.configuration.apiKey("Authorization"); // ApiKeyAuth authentication - } - - const response = await this.request({ - path: `/api/open-data-food/{id}/fdc/`.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters['id']))), - method: 'POST', - headers: headerParameters, - query: queryParameters, - body: OpenDataFoodToJSON(requestParameters['openDataFood']), - }, initOverrides); - - return new runtime.JSONApiResponse(response, (jsonValue) => OpenDataFoodFromJSON(jsonValue)); - } - - /** - * updates the food with all possible data from the FDC Api if properties with a fdc_id already exist they will be overridden, if existing properties don\'t have a fdc_id they won\'t be changed - */ - async apiOpenDataFoodFdcCreate(requestParameters: ApiOpenDataFoodFdcCreateRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { - const response = await this.apiOpenDataFoodFdcCreateRaw(requestParameters, initOverrides); - return await response.value(); - } - - /** - */ - async apiOpenDataFoodListRaw(requestParameters: ApiOpenDataFoodListRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { - const queryParameters: any = {}; - - if (requestParameters['page'] != null) { - queryParameters['page'] = requestParameters['page']; - } - - if (requestParameters['pageSize'] != null) { - queryParameters['page_size'] = requestParameters['pageSize']; - } - - const headerParameters: runtime.HTTPHeaders = {}; - if (this.configuration && this.configuration.apiKey) { headerParameters["Authorization"] = await this.configuration.apiKey("Authorization"); // ApiKeyAuth authentication } @@ -8335,13 +8254,13 @@ export class ApiApi extends runtime.BaseAPI { query: queryParameters, }, initOverrides); - return new runtime.JSONApiResponse(response, (jsonValue) => PaginatedOpenDataFoodListFromJSON(jsonValue)); + return new runtime.JSONApiResponse(response, (jsonValue) => jsonValue.map(OpenDataFoodFromJSON)); } /** */ - async apiOpenDataFoodList(requestParameters: ApiOpenDataFoodListRequest = {}, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { - const response = await this.apiOpenDataFoodListRaw(requestParameters, initOverrides); + async apiOpenDataFoodList(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + const response = await this.apiOpenDataFoodListRaw(initOverrides); return await response.value(); } @@ -8537,17 +8456,9 @@ export class ApiApi extends runtime.BaseAPI { /** */ - async apiOpenDataPropertyListRaw(requestParameters: ApiOpenDataPropertyListRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + async apiOpenDataPropertyListRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>> { const queryParameters: any = {}; - if (requestParameters['page'] != null) { - queryParameters['page'] = requestParameters['page']; - } - - if (requestParameters['pageSize'] != null) { - queryParameters['page_size'] = requestParameters['pageSize']; - } - const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { @@ -8561,13 +8472,13 @@ export class ApiApi extends runtime.BaseAPI { query: queryParameters, }, initOverrides); - return new runtime.JSONApiResponse(response, (jsonValue) => PaginatedOpenDataPropertyListFromJSON(jsonValue)); + return new runtime.JSONApiResponse(response, (jsonValue) => jsonValue.map(OpenDataPropertyFromJSON)); } /** */ - async apiOpenDataPropertyList(requestParameters: ApiOpenDataPropertyListRequest = {}, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { - const response = await this.apiOpenDataPropertyListRaw(requestParameters, initOverrides); + async apiOpenDataPropertyList(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + const response = await this.apiOpenDataPropertyListRaw(initOverrides); return await response.value(); } @@ -8790,17 +8701,9 @@ export class ApiApi extends runtime.BaseAPI { /** */ - async apiOpenDataStoreListRaw(requestParameters: ApiOpenDataStoreListRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + async apiOpenDataStoreListRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>> { const queryParameters: any = {}; - if (requestParameters['page'] != null) { - queryParameters['page'] = requestParameters['page']; - } - - if (requestParameters['pageSize'] != null) { - queryParameters['page_size'] = requestParameters['pageSize']; - } - const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { @@ -8814,13 +8717,13 @@ export class ApiApi extends runtime.BaseAPI { query: queryParameters, }, initOverrides); - return new runtime.JSONApiResponse(response, (jsonValue) => PaginatedOpenDataStoreListFromJSON(jsonValue)); + return new runtime.JSONApiResponse(response, (jsonValue) => jsonValue.map(OpenDataStoreFromJSON)); } /** */ - async apiOpenDataStoreList(requestParameters: ApiOpenDataStoreListRequest = {}, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { - const response = await this.apiOpenDataStoreListRaw(requestParameters, initOverrides); + async apiOpenDataStoreList(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + const response = await this.apiOpenDataStoreListRaw(initOverrides); return await response.value(); } @@ -9016,17 +8919,9 @@ export class ApiApi extends runtime.BaseAPI { /** */ - async apiOpenDataUnitListRaw(requestParameters: ApiOpenDataUnitListRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + async apiOpenDataUnitListRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>> { const queryParameters: any = {}; - if (requestParameters['page'] != null) { - queryParameters['page'] = requestParameters['page']; - } - - if (requestParameters['pageSize'] != null) { - queryParameters['page_size'] = requestParameters['pageSize']; - } - const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { @@ -9040,13 +8935,13 @@ export class ApiApi extends runtime.BaseAPI { query: queryParameters, }, initOverrides); - return new runtime.JSONApiResponse(response, (jsonValue) => PaginatedOpenDataUnitListFromJSON(jsonValue)); + return new runtime.JSONApiResponse(response, (jsonValue) => jsonValue.map(OpenDataUnitFromJSON)); } /** */ - async apiOpenDataUnitList(requestParameters: ApiOpenDataUnitListRequest = {}, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { - const response = await this.apiOpenDataUnitListRaw(requestParameters, initOverrides); + async apiOpenDataUnitList(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + const response = await this.apiOpenDataUnitListRaw(initOverrides); return await response.value(); } @@ -9242,17 +9137,9 @@ export class ApiApi extends runtime.BaseAPI { /** */ - async apiOpenDataVersionListRaw(requestParameters: ApiOpenDataVersionListRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + async apiOpenDataVersionListRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>> { const queryParameters: any = {}; - if (requestParameters['page'] != null) { - queryParameters['page'] = requestParameters['page']; - } - - if (requestParameters['pageSize'] != null) { - queryParameters['page_size'] = requestParameters['pageSize']; - } - const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { @@ -9266,13 +9153,13 @@ export class ApiApi extends runtime.BaseAPI { query: queryParameters, }, initOverrides); - return new runtime.JSONApiResponse(response, (jsonValue) => PaginatedOpenDataVersionListFromJSON(jsonValue)); + return new runtime.JSONApiResponse(response, (jsonValue) => jsonValue.map(OpenDataVersionFromJSON)); } /** */ - async apiOpenDataVersionList(requestParameters: ApiOpenDataVersionListRequest = {}, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { - const response = await this.apiOpenDataVersionListRaw(requestParameters, initOverrides); + async apiOpenDataVersionList(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + const response = await this.apiOpenDataVersionListRaw(initOverrides); return await response.value(); } @@ -9874,6 +9761,46 @@ export class ApiApi extends runtime.BaseAPI { return await response.value(); } + /** + * logs request counts to redis cache total/per user/ + */ + async apiRecipeBatchUpdateUpdateRaw(requestParameters: ApiRecipeBatchUpdateUpdateRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + if (requestParameters['recipeBatchUpdate'] == null) { + throw new runtime.RequiredError( + 'recipeBatchUpdate', + 'Required parameter "recipeBatchUpdate" was null or undefined when calling apiRecipeBatchUpdateUpdate().' + ); + } + + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + headerParameters['Content-Type'] = 'application/json'; + + if (this.configuration && this.configuration.apiKey) { + headerParameters["Authorization"] = await this.configuration.apiKey("Authorization"); // ApiKeyAuth authentication + } + + const response = await this.request({ + path: `/api/recipe/batch_update/`, + method: 'PUT', + headers: headerParameters, + query: queryParameters, + body: RecipeBatchUpdateToJSON(requestParameters['recipeBatchUpdate']), + }, initOverrides); + + return new runtime.JSONApiResponse(response, (jsonValue) => RecipeBatchUpdateFromJSON(jsonValue)); + } + + /** + * logs request counts to redis cache total/per user/ + */ + async apiRecipeBatchUpdateUpdate(requestParameters: ApiRecipeBatchUpdateUpdateRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + const response = await this.apiRecipeBatchUpdateUpdateRaw(requestParameters, initOverrides); + return await response.value(); + } + /** * logs request counts to redis cache total/per user/ */ diff --git a/vue3/src/openapi/models/BaseUnitEnum.ts b/vue3/src/openapi/models/BaseUnitEnum.ts index a269ab200..6688a9bfc 100644 --- a/vue3/src/openapi/models/BaseUnitEnum.ts +++ b/vue3/src/openapi/models/BaseUnitEnum.ts @@ -14,47 +14,43 @@ /** - * * `g` - g - * * `kg` - kg - * * `ounce` - ounce - * * `pound` - pound - * * `ml` - ml - * * `l` - l - * * `fluid_ounce` - fluid_ounce - * * `pint` - pint - * * `quart` - quart - * * `gallon` - gallon - * * `tbsp` - tbsp - * * `tsp` - tsp - * * `us_cup` - US Cup - * * `imperial_fluid_ounce` - imperial fluid ounce - * * `imperial_pint` - imperial pint - * * `imperial_quart` - imperial quart - * * `imperial_gallon` - imperial gallon - * * `imperial_tbsp` - imperial tbsp - * * `imperial_tsp` - imperial tsp + * * `G` - g + * * `KG` - kg + * * `ML` - ml + * * `L` - l + * * `OUNCE` - ounce + * * `POUND` - pound + * * `FLUID_OUNCE` - fluid_ounce + * * `TSP` - tsp + * * `TBSP` - tbsp + * * `CUP` - cup + * * `PINT` - pint + * * `QUART` - quart + * * `GALLON` - gallon + * * `IMPERIAL_FLUID_OUNCE` - imperial fluid ounce + * * `IMPERIAL_PINT` - imperial pint + * * `IMPERIAL_QUART` - imperial quart + * * `IMPERIAL_GALLON` - imperial gallon * @export */ export const BaseUnitEnum = { - G: 'g', - Kg: 'kg', - Ounce: 'ounce', - Pound: 'pound', - Ml: 'ml', - L: 'l', - FluidOunce: 'fluid_ounce', - Pint: 'pint', - Quart: 'quart', - Gallon: 'gallon', - Tbsp: 'tbsp', - Tsp: 'tsp', - UsCup: 'us_cup', - ImperialFluidOunce: 'imperial_fluid_ounce', - ImperialPint: 'imperial_pint', - ImperialQuart: 'imperial_quart', - ImperialGallon: 'imperial_gallon', - ImperialTbsp: 'imperial_tbsp', - ImperialTsp: 'imperial_tsp' + G: 'G', + Kg: 'KG', + Ml: 'ML', + L: 'L', + Ounce: 'OUNCE', + Pound: 'POUND', + FluidOunce: 'FLUID_OUNCE', + Tsp: 'TSP', + Tbsp: 'TBSP', + Cup: 'CUP', + Pint: 'PINT', + Quart: 'QUART', + Gallon: 'GALLON', + ImperialFluidOunce: 'IMPERIAL_FLUID_OUNCE', + ImperialPint: 'IMPERIAL_PINT', + ImperialQuart: 'IMPERIAL_QUART', + ImperialGallon: 'IMPERIAL_GALLON' } as const; export type BaseUnitEnum = typeof BaseUnitEnum[keyof typeof BaseUnitEnum]; diff --git a/vue3/src/openapi/models/OpenDataFood.ts b/vue3/src/openapi/models/OpenDataFood.ts index d9780f860..d11a147e9 100644 --- a/vue3/src/openapi/models/OpenDataFood.ts +++ b/vue3/src/openapi/models/OpenDataFood.ts @@ -164,10 +164,10 @@ export interface OpenDataFood { propertiesSource?: string; /** * - * @type {number} + * @type {string} * @memberof OpenDataFood */ - fdcId?: number; + fdcId: string; /** * * @type {string} @@ -193,6 +193,7 @@ export function instanceOfOpenDataFood(value: object): value is OpenDataFood { if (!('storeCategory' in value) || value['storeCategory'] === undefined) return false; if (!('properties' in value) || value['properties'] === undefined) return false; if (!('propertiesFoodUnit' in value) || value['propertiesFoodUnit'] === undefined) return false; + if (!('fdcId' in value) || value['fdcId'] === undefined) return false; if (!('createdBy' in value) || value['createdBy'] === undefined) return false; return true; } @@ -221,7 +222,7 @@ export function OpenDataFoodFromJSONTyped(json: any, ignoreDiscriminator: boolea 'propertiesFoodAmount': json['properties_food_amount'] == null ? undefined : json['properties_food_amount'], 'propertiesFoodUnit': OpenDataUnitFromJSON(json['properties_food_unit']), 'propertiesSource': json['properties_source'] == null ? undefined : json['properties_source'], - 'fdcId': json['fdc_id'] == null ? undefined : json['fdc_id'], + 'fdcId': json['fdc_id'], 'comment': json['comment'] == null ? undefined : json['comment'], 'createdBy': json['created_by'], }; diff --git a/vue3/src/openapi/models/PatchedOpenDataFood.ts b/vue3/src/openapi/models/PatchedOpenDataFood.ts index a84b70e39..127bf5a05 100644 --- a/vue3/src/openapi/models/PatchedOpenDataFood.ts +++ b/vue3/src/openapi/models/PatchedOpenDataFood.ts @@ -164,10 +164,10 @@ export interface PatchedOpenDataFood { propertiesSource?: string; /** * - * @type {number} + * @type {string} * @memberof PatchedOpenDataFood */ - fdcId?: number; + fdcId?: string; /** * * @type {string} diff --git a/vue3/src/openapi/models/RecipeBatchUpdate.ts b/vue3/src/openapi/models/RecipeBatchUpdate.ts new file mode 100644 index 000000000..8c58a5247 --- /dev/null +++ b/vue3/src/openapi/models/RecipeBatchUpdate.ts @@ -0,0 +1,79 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Tandoor + * Tandoor API Docs + * + * The version of the OpenAPI document: 0.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +/** + * + * @export + * @interface RecipeBatchUpdate + */ +export interface RecipeBatchUpdate { + /** + * + * @type {Array} + * @memberof RecipeBatchUpdate + */ + recipes: Array; + /** + * + * @type {Array} + * @memberof RecipeBatchUpdate + */ + keywordsAdd: Array; + /** + * + * @type {Array} + * @memberof RecipeBatchUpdate + */ + keywordsRemove: Array; +} + +/** + * Check if a given object implements the RecipeBatchUpdate interface. + */ +export function instanceOfRecipeBatchUpdate(value: object): value is RecipeBatchUpdate { + if (!('recipes' in value) || value['recipes'] === undefined) return false; + if (!('keywordsAdd' in value) || value['keywordsAdd'] === undefined) return false; + if (!('keywordsRemove' in value) || value['keywordsRemove'] === undefined) return false; + return true; +} + +export function RecipeBatchUpdateFromJSON(json: any): RecipeBatchUpdate { + return RecipeBatchUpdateFromJSONTyped(json, false); +} + +export function RecipeBatchUpdateFromJSONTyped(json: any, ignoreDiscriminator: boolean): RecipeBatchUpdate { + if (json == null) { + return json; + } + return { + + 'recipes': json['recipes'], + 'keywordsAdd': json['keywords_add'], + 'keywordsRemove': json['keywords_remove'], + }; +} + +export function RecipeBatchUpdateToJSON(value?: RecipeBatchUpdate | null): any { + if (value == null) { + return value; + } + return { + + 'recipes': value['recipes'], + 'keywords_add': value['keywordsAdd'], + 'keywords_remove': value['keywordsRemove'], + }; +} + diff --git a/vue3/src/openapi/models/index.ts b/vue3/src/openapi/models/index.ts index e0955cce8..b57e9b979 100644 --- a/vue3/src/openapi/models/index.ts +++ b/vue3/src/openapi/models/index.ts @@ -69,13 +69,6 @@ export * from './PaginatedInviteLinkList'; export * from './PaginatedKeywordList'; export * from './PaginatedMealPlanList'; export * from './PaginatedMealTypeList'; -export * from './PaginatedOpenDataCategoryList'; -export * from './PaginatedOpenDataConversionList'; -export * from './PaginatedOpenDataFoodList'; -export * from './PaginatedOpenDataPropertyList'; -export * from './PaginatedOpenDataStoreList'; -export * from './PaginatedOpenDataUnitList'; -export * from './PaginatedOpenDataVersionList'; export * from './PaginatedPropertyList'; export * from './PaginatedPropertyTypeList'; export * from './PaginatedRecipeBookEntryList'; @@ -145,6 +138,7 @@ export * from './PatchedViewLog'; export * from './Property'; export * from './PropertyType'; export * from './Recipe'; +export * from './RecipeBatchUpdate'; export * from './RecipeBook'; export * from './RecipeBookEntry'; export * from './RecipeFlat'; diff --git a/vue3/src/pages/TestPage.vue b/vue3/src/pages/TestPage.vue index d5fb83fc7..defdf1bbb 100644 --- a/vue3/src/pages/TestPage.vue +++ b/vue3/src/pages/TestPage.vue @@ -1,27 +1,80 @@