Beispiel #1
0
    def load_recipe(cls, recipe_id, current_user):
        attributes = [
            "id",
            "name",
            "servings",
            "preparation_time",
            "photo_file",
            "created_at",
            "creator_id",
            "nutritional_info",
            "avg_ratings.avg_rating",
            "my_ratings.rating",
            "saved_counts.saved_count",
            "saved.saved_at",
            "avg_ratings.rating_count",
        ]

        join_list = []
        join_list.append(
            "LEFT OUTER JOIN (SELECT recipe_id, AVG(rating) AS avg_rating, COUNT(rating) AS rating_count FROM ratings GROUP BY recipe_id) AS avg_ratings ON recipes.id=avg_ratings.recipe_id"
        )
        join_list.append(
            "LEFT OUTER JOIN ratings AS my_ratings ON recipes.id=my_ratings.recipe_id AND my_ratings.user_id=%s"
            % adapt(str(current_user.id)).getquoted()
        )
        join_list.append(
            "LEFT OUTER JOIN (SELECT recipe_id, COUNT(user_id) AS saved_count FROM saved GROUP BY recipe_id) AS saved_counts ON recipes.id=saved_counts.recipe_id"
        )
        join_list.append(
            "LEFT OUTER JOIN saved ON recipes.id=saved.recipe_id AND saved.user_id=%s"
            % adapt(str(current_user.id)).getquoted()
        )
        join_sql = " ".join(join_list)

        where_sql = "WHERE recipes.id=%s" % adapt(str(recipe_id)).getquoted()

        results = engine.execute("SELECT %s FROM recipes %s %s" % (",".join(attributes), join_sql, where_sql))

        recipe = None
        for result in results:
            recipe = Recipe()
            recipe.id = result[0]
            recipe.name = result[1]
            recipe.servings = result[2]
            recipe.preparation_time = result[3]
            recipe.photo_file = result[4]
            recipe.created_at = result[5]
            recipe.creator_id = result[6]
            recipe.nutritional_info = result[7]
            recipe.avg_rating = result[8]
            recipe.rating = result[9]
            recipe.favorite_count = result[10]
            recipe.is_favorite = result[11] != None
            recipe.rating_count = result[12]

            if not recipe.favorite_count:
                recipe.favorite_count = 0

            if not recipe.rating_count:
                recipe.rating_count = 0

            if not recipe.avg_rating:
                recipe.avg_rating = 0.0
            else:
                recipe.avg_rating = round(recipe.avg_rating, 1)

            user = models.user.User.load_user_by_id(recipe.creator_id)
            recipe.creator = user

            recipe.steps = Step.load_steps(recipe.id)
            recipe.ingredients_recipes = IngredientRecipe.load_ingredients(recipe.id)
            recipe.categories = Category.load_categories(recipe.id)
            recipe.category_count = len(recipe.categories)
            recipe.comments = Comment.load_comments(recipe.id)

        return recipe