sortowanie_w_mass_add

This commit is contained in:
Mateusz Gruszczyński
2025-08-16 12:32:09 +02:00
parent 529130a622
commit e3b180fba7

63
app.py
View File

@@ -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})