def create(self, validated_data): validated_data['drink'].save() if validated_data['drink'].price<=0: raise api_utils.BadRequest("CANT NOT ORDER DRINK UNDER $0!") if validated_data['drink'].status==Drink.CONST_STATUS_BLOCKED: raise api_utils.BadRequest("THIS DRINK HAS BEEN BLOCKED AT THE MOMENT, PLEASE RELOAD") ret = Tab(**validated_data) tab = Tab.objects.filter(drink=ret.drink, user=ret.user, order__isnull=True) if not tab: if not check_available(ret): raise api_utils.BadRequest("NOT ENOUGH INGREDIENT FOR {} QUANTITY,PLEASE RELOAD!".format(ret)) garnishes = self.initial_data.get('garnishes') if garnishes: garnishes = DrinkGarnish.objects.filter(drink=ret.drink,garnish__in=ast.literal_eval(garnishes)) garnishes = list(garnishes) ret.garnishes.add(*garnishes) else: temp = ret ret = tab.first() if not check_available(temp): raise api_utils.BadRequest("NOT ENOUGH INGREDIENT FOR ADD MORE {} QUANTITY,PLEASE RELOAD".format(ret)) ret.quantity +=temp.quantity ret.save() return ret
def update(self, instance, validated_data): ret = super(DrinkSerializer, self).update(instance, validated_data) if self.initial_data.has_key('category'): ret.category.clear() categories = self.initial_data.get('category') categories = categories.split(",") for category in categories: try: ret.category.add(DrinkCategory.objects.get(id=category)) except Exception as e: raise api_utils.BadRequest(e[0]) if self.initial_data.has_key('ingredients'): ingredients = self.initial_data.getlist('ingredients') total_percent = 0 for ingredient in ingredients: ingredient = ast.literal_eval(ingredient) if ingredient['unit'] < 1: total_percent += ingredient['ratio'] if total_percent > 100: raise api_utils.BadRequest("OVER 100%") # Save new data ret.ingredients.all().delete() for ingredient in ingredients: ingredient = ast.literal_eval(ingredient) ingre = DrinkIngredient(drink=ret, ingredient=Ingredient.objects.get( id=ingredient['ingredient']), ratio=ingredient['ratio'], unit=ingredient['unit']) ingre.save() # Direct unit ingredients = ret.ingredients.exclude(unit__in=[ DrinkIngredient.CONST_UNIT_PART, DrinkIngredient.CONST_UNIT_PERCENT ]) total_ml = 0 for ingredient in ingredients: ingredient.ratio_ml = ingredient.change_to_ml() ingredient.save() total_ml += ingredient.ratio_ml glass = ret.glass.change_to_ml - total_ml # Percent unit ingredients = ret.ingredients.filter( unit=DrinkIngredient.CONST_UNIT_PERCENT) if glass > 0: for ingredient in ingredients: ingredient.ratio_ml = ingredient.change_to_ml(glass=glass) ingredient.save() else: ingredients = ret.ingredients.filter( unit=DrinkIngredient.CONST_UNIT_PERCENT).update(ratio_ml=0) # Part unit glass = glass * (100 - total_percent) / 100 ingredients = ret.ingredients.filter( unit=DrinkIngredient.CONST_UNIT_PART) total_part = ret.total_part if glass > 0 and total_part > 0: for ingredient in ingredients: ingredient.ratio_ml = ingredient.change_to_ml( total_part=total_part, glass=glass) ingredient.save() else: ingredients = ret.ingredients.filter( unit=DrinkIngredient.CONST_UNIT_PART).update(ratio_ml=0) # Garnish if self.initial_data.has_key('garnishes'): ret.garnishes.all().delete() garnishes = self.initial_data.getlist('garnishes') if garnishes: for garnish in garnishes: garnish = ast.literal_eval(garnish) try: garn = DrinkGarnish( drink=ret, garnish=Garnish.objects.get(id=garnish['garnish']), ratio=garnish['ratio'], ) garn.save() except Exception as e: raise api_utils.BadRequest(e[0]) ret.save() return ret
def drink_add_on(self, ret=None): categories = self.initial_data.get('category', None) if categories: categories = categories.split(",") for category in categories: try: ret.category.add(DrinkCategory.objects.get(id=category)) except Exception as e: ret.delete() raise e if (self._context['request'].user.is_superuser and self.initial_data.has_key('image_background')): # data is array ingredients = self.initial_data.getlist('ingredients', None) else: # data is string array ingredients = ast.literal_eval(self.initial_data['ingredients']) tempdict = dict() if ingredients: total_percent = 0 for ingredient in ingredients: if not type(ingredient) == type(tempdict): ingredient = ast.literal_eval(ingredient) if ingredient['unit'] < 1: total_percent += ingredient['ratio'] if total_percent > 100: ret.delete() raise api_utils.BadRequest("OVER 100%") for ingredient in ingredients: if not type(ingredient) == type(tempdict): ingredient = ast.literal_eval(ingredient) try: ingre = DrinkIngredient(drink=ret, ingredient=Ingredient.objects.get( id=ingredient['ingredient']), ratio=ingredient['ratio'], unit=ingredient['unit']) ingre.save() except Exception as e: DrinkIngredient.objects.filter(drink=ret).delete() ret.delete() raise e # Direct unit ingredients = ret.ingredients.exclude(unit__in=[ DrinkIngredient.CONST_UNIT_PART, DrinkIngredient.CONST_UNIT_PERCENT ]) total_ml = 0 for ingredient in ingredients: ingredient.ratio_ml = ingredient.change_to_ml() ingredient.save() total_ml += ingredient.ratio_ml glass = ret.glass.change_to_ml - total_ml # Percent unit ingredients = ret.ingredients.filter( unit=DrinkIngredient.CONST_UNIT_PERCENT) if glass > 0: for ingredient in ingredients: ingredient.ratio_ml = ingredient.change_to_ml(glass=glass) ingredient.save() else: ingredients = ret.ingredients.filter( unit=DrinkIngredient.CONST_UNIT_PERCENT).update(ratio_ml=0) # Part unit glass = glass * (100 - total_percent) / 100 ingredients = ret.ingredients.filter( unit=DrinkIngredient.CONST_UNIT_PART) total_part = ret.total_part if glass > 0 and total_part > 0: for ingredient in ingredients: ingredient.ratio_ml = ingredient.change_to_ml( total_part=total_part, glass=glass) ingredient.save() else: ingredients = ret.ingredients.filter( unit=DrinkIngredient.CONST_UNIT_PART).update(ratio_ml=0) else: ret.delete() raise api_utils.BadRequest("NOT INCLUDE ANY INGREDIENT, ADD ONE!") garnishes = self.initial_data.getlist('garnishes', None) if garnishes: for garnish in garnishes: garnish = ast.literal_eval(garnish) try: garn = DrinkGarnish( drink=ret, garnish=Garnish.objects.get(id=garnish['garnish']), ratio=garnish['ratio'], ) garn.save() except Exception as e: DrinkIngredient.objects.filter(drink=ret).delete() DrinkGarnish.objects.filter(drink=ret).delete() ret.delete() raise e return ret