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 @@
+
+
+
+
+
+
+
+
+
+
+ {{ $t('Cancel') }}
+ {{ $t('Update') }}
+
+
+
+
+
+
+
+
+
\ 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 @@
- Form
-
-
-
+ Load
+
+
+ Recipe 1 - {{ recipe1.name }}
+
+
+
+ Recipe 2 - {{ recipe2.name }}
+
+
+
- Non Form
-
+
-
-
-
-
-
-
-
-
+ Add to recipes
+ Remove to recipes