def addDishData(request): new_ingredients_response = [] new_categories_response = [] data = json.loads(request.body.decode("utf-8")) # print(json.dumps(data, indent=4, sort_keys=True)) ### TO BE REMOVED general_data = data["general"] ingredients_data = data["ingredients"] recipe_data = data["recipe"] categories_data = data["categories"] # check if password is correct if general_data["password"] != password: return JsonResponse({"result": "invalid pssword"}) # validate data if not general_data["name"]: return JsonResponse({"result": "missing dish name"}) if not ingredients_data["selected"]: return JsonResponse({"result": "ingredients weren't defined"}) # create new dish dish = Dish( name=general_data["name"], type=general_data["type"], recipe=json.dumps(recipe_data), last_done_date=date(2000, 1, 1), ) dish.save() # process new ingredients definitions if ingredients_data["added"]: all_ingredients = Ingredient.objects.values_list("name", flat=True) all_ingredient_names_set = set(all_ingredients) new_ingredients = ingredients_data["added"] new_ingredient_names_set = {i[0] for i in new_ingredients} new_ingredient_names_set -= all_ingredient_names_set if new_ingredient_names_set: for i in new_ingredients: if i[0] not in new_ingredient_names_set: continue # find ingredient type try: ingredient_type = IngredientType.objects.get(pk=i[1]) except ObjectDoesNotExist: continue # find ingredient unit try: ingredient_unit = IngredientUnit.objects.get(pk=i[3]) except ObjectDoesNotExist: continue ingredient = Ingredient( name=i[0], category_type=ingredient_type, default_quantity=i[2], default_unit=ingredient_unit ) ingredient.save() new_ingredients_response.append({"id": ingredient.id, "name": ingredient.name}) # add all dish ingredients order_index = 0 for i in ingredients_data["selected"]: # find ingredient record try: ingredient = Ingredient.objects.get(name__iexact=i[0]) except ObjectDoesNotExist: message = "missing {0} dish ingredient".format(i[0]) return JsonResponse({"result": message}) # find ingredient unit record try: ingredient_unit = IngredientUnit.objects.get(pk__iexact=i[2]) except ObjectDoesNotExist: message = "missing {0} ingredient unit".format(i[2]) return JsonResponse({"result": message}) # add dish ingredient dish_ingredient = DishIngredient( dish=dish, ingredient=ingredient, quantity=i[1], unit=ingredient_unit, sequential_number=chr(order_index) ) order_index += 1 dish_ingredient.save() # process new category definitions if categories_data["added"]: all_categories = Category.objects.values_list("name", flat=True) all_categories_names_set = set(all_categories) new_categories_names_set = set(categories_data["added"]) new_categories_names_set -= all_categories_names_set for category_name in new_categories_names_set: category = Category(name=category_name) category.save() new_categories_response.append({"id": category.id, "name": category.name}) # add all dish categories if categories_data["selected"]: order_index = 0 for category_name in categories_data["selected"]: # find category record try: category = Category.objects.get(name__iexact=category_name) except ObjectDoesNotExist: continue dish_category = DishCategory(dish=dish, category=category, sequential_number=chr(order_index)) order_index += 1 return JsonResponse( {"result": "ok", "new_ingredients": new_ingredients_response, "new_categories": new_categories_response} )