some fixes and changes

This commit is contained in:
vabene1111
2025-05-13 16:24:23 +02:00
parent 36352ae6fb
commit 9a7a05e8a9
45 changed files with 398 additions and 135 deletions

View File

@@ -658,7 +658,7 @@ class RecipeSimpleSerializer(WritableNestedModelSerializer):
def update(self, instance, validated_data):
# don't allow writing to Recipe via this API
return Recipe.objects.get(**validated_data)
return instance
class Meta:
model = Recipe
@@ -1702,3 +1702,56 @@ class RecipeFromSourceResponseSerializer(serializers.Serializer):
class AiImportSerializer(serializers.Serializer):
file = serializers.FileField(allow_null=True)
text = serializers.CharField(allow_null=True, allow_blank=True)
class ImportOpenDataSerializer(serializers.Serializer):
selected_version = serializers.CharField()
selected_datatypes = serializers.ListField(child=serializers.CharField())
update_existing = serializers.BooleanField(default=True)
use_metric = serializers.BooleanField(default=True)
class ImportOpenDataResponseDetailSerializer(serializers.Serializer):
total_created = serializers.IntegerField(default=0)
total_updated = serializers.IntegerField(default=0)
total_untouched = serializers.IntegerField(default=0)
total_errored = serializers.IntegerField(default=0)
class ImportOpenDataResponseSerializer(serializers.Serializer):
food = ImportOpenDataResponseDetailSerializer(required=False)
unit = ImportOpenDataResponseDetailSerializer(required=False)
category = ImportOpenDataResponseDetailSerializer(required=False)
property = ImportOpenDataResponseDetailSerializer(required=False)
store = ImportOpenDataResponseDetailSerializer(required=False)
conversion = ImportOpenDataResponseDetailSerializer(required=False)
class ImportOpenDataVersionMetaDataSerializer(serializers.Serializer):
food = serializers.IntegerField()
unit = serializers.IntegerField()
category = serializers.IntegerField()
property = serializers.IntegerField()
store = serializers.IntegerField()
conversion = serializers.IntegerField()
class ImportOpenDataMetaDataSerializer(serializers.Serializer):
versions = serializers.ListField(child=serializers.CharField())
datatypes = serializers.ListField(child=serializers.CharField())
base = ImportOpenDataVersionMetaDataSerializer()
cs = ImportOpenDataVersionMetaDataSerializer()
da = ImportOpenDataVersionMetaDataSerializer()
de = ImportOpenDataVersionMetaDataSerializer()
el = ImportOpenDataVersionMetaDataSerializer()
en = ImportOpenDataVersionMetaDataSerializer()
es = ImportOpenDataVersionMetaDataSerializer()
fr = ImportOpenDataVersionMetaDataSerializer()
hu = ImportOpenDataVersionMetaDataSerializer()
it = ImportOpenDataVersionMetaDataSerializer()
nb_NO = ImportOpenDataVersionMetaDataSerializer()
nl = ImportOpenDataVersionMetaDataSerializer()
pl = ImportOpenDataVersionMetaDataSerializer()
pt = ImportOpenDataVersionMetaDataSerializer()
pt_BR = ImportOpenDataVersionMetaDataSerializer()
sk = ImportOpenDataVersionMetaDataSerializer()
sl = ImportOpenDataVersionMetaDataSerializer()
zh_Hans = ImportOpenDataVersionMetaDataSerializer()

View File

@@ -108,7 +108,7 @@ from cookbook.serializer import (AccessTokenSerializer, AutomationSerializer, Au
UnitConversionSerializer, UnitSerializer, UserFileSerializer, UserPreferenceSerializer,
UserSerializer, UserSpaceSerializer, ViewLogSerializer,
LocalizationSerializer, ServerSettingsSerializer, RecipeFromSourceResponseSerializer, ShoppingListEntryBulkCreateSerializer, FdcQuerySerializer,
AiImportSerializer
AiImportSerializer, ImportOpenDataSerializer, ImportOpenDataMetaDataSerializer, ImportOpenDataResponseSerializer
)
from cookbook.version_info import TANDOOR_VERSION
from cookbook.views.import_export import get_integration
@@ -2081,46 +2081,44 @@ def import_files(request):
return Response({'error': True, 'msg': form.errors}, status=status.HTTP_400_BAD_REQUEST)
# TODO implement schema https://drf-spectacular.readthedocs.io/en/latest/customization.html#replace-views-with-openapiviewextension
class ImportOpenData(APIView):
permission_classes = [CustomIsAdmin & CustomTokenHasReadWriteScope]
@extend_schema(responses=ImportOpenDataMetaDataSerializer(many=False))
@decorators.action(detail=True, pagination_class=None, methods=['GET'])
def get(self, request, format=None):
response = requests.get(
'https://raw.githubusercontent.com/TandoorRecipes/open-tandoor-data/main/build/meta.json')
metadata = json.loads(response.content)
return Response(metadata)
@extend_schema(request=ImportOpenDataSerializer(many=False), responses=ImportOpenDataResponseSerializer(many=False))
@decorators.action(detail=True, pagination_class=None, methods=['POST'])
def post(self, request, *args, **kwargs):
# TODO validate data
print(request.data)
selected_version = request.data['selected_version']
selected_datatypes = request.data['selected_datatypes']
update_existing = str2bool(request.data['update_existing'])
use_metric = str2bool(request.data['use_metric'])
serializer = ImportOpenDataSerializer(data=request.data, partial=True)
if serializer.is_valid():
response = requests.get(
f'https://raw.githubusercontent.com/TandoorRecipes/open-tandoor-data/main/build/{serializer.validated_data["selected_version"]}.json') # TODO catch 404, timeout, ...
data = json.loads(response.content)
response = requests.get(
f'https://raw.githubusercontent.com/TandoorRecipes/open-tandoor-data/main/build/{selected_version}.json') # TODO catch 404, timeout, ...
data = json.loads(response.content)
response_obj = {}
response_obj = {}
data_importer = OpenDataImporter(request, data, update_existing=serializer.validated_data["update_existing"], use_metric=serializer.validated_data["use_metric"])
data_importer = OpenDataImporter(request, data, update_existing=update_existing, use_metric=use_metric)
if 'unit' in serializer.validated_data['selected_datatypes']:
response_obj['unit'] = data_importer.import_units().to_dict()
if 'category' in serializer.validated_data['selected_datatypes']:
response_obj['category'] = data_importer.import_category().to_dict()
if 'property' in serializer.validated_data['selected_datatypes']:
response_obj['property'] = data_importer.import_property().to_dict()
if 'store' in serializer.validated_data['selected_datatypes']:
response_obj['store'] = data_importer.import_supermarket().to_dict()
if 'food' in serializer.validated_data['selected_datatypes']:
response_obj['food'] = data_importer.import_food().to_dict()
if 'conversion' in serializer.validated_data['selected_datatypes']:
response_obj['conversion'] = data_importer.import_conversion().to_dict()
if selected_datatypes['unit']['selected']:
response_obj['unit'] = data_importer.import_units().to_dict()
if selected_datatypes['category']['selected']:
response_obj['category'] = data_importer.import_category().to_dict()
if selected_datatypes['property']['selected']:
response_obj['property'] = data_importer.import_property().to_dict()
if selected_datatypes['store']['selected']:
response_obj['store'] = data_importer.import_supermarket().to_dict()
if selected_datatypes['food']['selected']:
response_obj['food'] = data_importer.import_food().to_dict()
if selected_datatypes['conversion']['selected']:
response_obj['conversion'] = data_importer.import_conversion().to_dict()
return Response(response_obj)
return Response(ImportOpenDataResponseSerializer(context={'request': request}).to_representation(response_obj))
# TODO implement schema