From e3b180fba70b40a9df8b272c27f4a0f8610a0abe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Sat, 16 Aug 2025 12:32:09 +0200 Subject: [PATCH] sortowanie_w_mass_add --- app.py | 63 ++++++++++++++++++++++++++-------------------------------- 1 file changed, 28 insertions(+), 35 deletions(-) diff --git a/app.py b/app.py index 109d675..c7d3582 100644 --- a/app.py +++ b/app.py @@ -1951,46 +1951,39 @@ def suggest_products(): @app.route("/all_products") def all_products(): - query = request.args.get("q", "") + # Parametry sort = request.args.get("sort", "popularity") - limit = request.args.get("limit", type=int) or 50 + limit = request.args.get("limit", type=int) or 100 offset = request.args.get("offset", type=int) or 0 - top_products_query = SuggestedProduct.query - if query: - top_products_query = top_products_query.filter( - SuggestedProduct.name.ilike(f"%{query}%") - ) - - # Liczenie popularności - popularity_subquery = ( - db.session.query( - func.lower(Item.name).label("name"), - func.sum(Item.quantity).label("count") - ) - .group_by(func.lower(Item.name)) - .subquery() - ) + # Wyciągnięcie wszystkich użyć produktów z Item + agregacja (uniwersalność z polskimi znakami i wielkością liter!) + item_usage = db.session.query( + func.lower(Item.name).label("name"), + func.sum(Item.quantity).label("count") + ).group_by(func.lower(Item.name)).all() - query_base = db.session.query( - SuggestedProduct.name, - popularity_subquery.c.count - ).outerjoin( - popularity_subquery, func.lower(SuggestedProduct.name) == popularity_subquery.c.name - ) + usage_map = {row.name: row.count for row in item_usage} + + # Unikalne nazwy + all_names = sorted(usage_map.keys()) + + # Sortowanie + if sort == "popularity": + sorted_names = sorted(all_names, key=lambda name: (-usage_map[name], name)) + else: # alphabetical + sorted_names = sorted(all_names) + + # Paginacja + paged_names = sorted_names[offset:offset+limit] + + # Dla każdego produktu zwróć dict: nazwa i liczba użyć (możesz użyć tylko nazw jeśli chcesz jak dawniej) + products = [{"name": name, "count": usage_map[name]} for name in paged_names] + + # Ilość wszystkich dostępnych produktów + product_count = len(all_names) + + return jsonify({"products": products, "total_count": product_count}) - if sort == "alphabetical": - query_base = query_base.order_by(func.lower(SuggestedProduct.name).asc(), popularity_subquery.c.count.desc()) - else: # popularity - query_base = query_base.order_by(popularity_subquery.c.count.desc().nullslast(), func.lower(SuggestedProduct.name).asc()) - - products = query_base.offset(offset).limit(limit).all() - products_list = [ - {"name": name, "count": count or 0} - for name, count in products - ] - - return jsonify({"products": products_list, "limit": limit})