From be5275053b787484261a65797c7b9ee7a09cf1c7 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sat, 6 Apr 2019 18:28:12 +0200 Subject: [PATCH] Add products export endpoint --- copanier/__init__.py | 9 +++++++++ copanier/reports.py | 15 +++++++++++++++ copanier/templates/delivery.html | 3 +++ tests/test_views.py | 24 ++++++++++++++++-------- 4 files changed, 43 insertions(+), 8 deletions(-) diff --git a/copanier/__init__.py b/copanier/__init__.py index 9c68a37..63e48e5 100644 --- a/copanier/__init__.py +++ b/copanier/__init__.py @@ -181,6 +181,15 @@ async def import_products(request, response, id): response.redirect = f"/livraison/{delivery.id}" +@app.route("/livraison/{id}/exporter/produits", methods=["GET"]) +async def export_products(request, response, id): + delivery = Delivery.load(id) + response.body = reports.products(delivery) + mimetype = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" + response.headers["Content-Disposition"] = f'attachment; filename="epinamap.xlsx"' + response.headers["Content-Type"] = f"{mimetype}; charset=utf-8" + + @app.route("/livraison/{id}/edit", methods=["GET"]) async def edit_delivery(request, response, id): delivery = Delivery.load(id) diff --git a/copanier/reports.py b/copanier/reports.py index afb6daa..f4a38b1 100644 --- a/copanier/reports.py +++ b/copanier/reports.py @@ -1,6 +1,10 @@ +from dataclasses import fields as get_fields + from openpyxl import Workbook from openpyxl.writer.excel import save_virtual_workbook +from .models import Product + def summary(delivery): wb = Workbook() @@ -40,3 +44,14 @@ def full(delivery): ] + [delivery.total] ws.append(footer) return save_virtual_workbook(wb) + + +def products(delivery): + wb = Workbook() + ws = wb.active + ws.title = f"{delivery.producer} produits" + fields = [f.name for f in get_fields(Product)] + ws.append(fields) + for product in delivery.products: + ws.append([getattr(product, field) for field in fields]) + return save_virtual_workbook(wb) diff --git a/copanier/templates/delivery.html b/copanier/templates/delivery.html index 833c961..c4dca4e 100644 --- a/copanier/templates/delivery.html +++ b/copanier/templates/delivery.html @@ -57,6 +57,9 @@ Liste d'émargement {% if request.user and request.user.is_staff %} +
  • + Télécharger les produits +
  • Modifier la livraison (admin)
  • diff --git a/tests/test_views.py b/tests/test_views.py index cb19be0..6192eb4 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -1,4 +1,7 @@ +from io import BytesIO + import pytest +from openpyxl import load_workbook from copanier.models import Delivery, Order, ProductOrder @@ -32,7 +35,7 @@ async def test_create_delivery(client): "date": "2019-02-23", "from_time": "18:30:00", "to_time": "20:00:00", - "order_before": "2019-02-12" + "order_before": "2019-02-12", } resp = await client.post("/livraison", body=body) assert resp.status == 302 @@ -49,9 +52,7 @@ async def test_create_delivery(client): async def test_place_order_with_session(client, delivery): delivery.persist() - body = { - "123": "3", - } + body = {"123": "3"} resp = await client.post(f"/livraison/{delivery.id}/commander", body=body) assert resp.status == 302 delivery = Delivery.load(id=delivery.id) @@ -87,12 +88,19 @@ async def test_place_order_with_empty_string(client, delivery): async def test_change_paid_status_when_placing_order(client, delivery): delivery.persist() - body = { - "123": "3", - "paid": 1 - } + body = {"123": "3", "paid": 1} resp = await client.post(f"/livraison/{delivery.id}/commander", body=body) assert resp.status == 302 delivery = Delivery.load(id=delivery.id) assert delivery.orders["foo@bar.org"] assert delivery.orders["foo@bar.org"].paid is True + + +async def test_export_products(client, delivery): + delivery.persist() + resp = await client.get(f"/livraison/{delivery.id}/exporter/produits") + wb = load_workbook(filename=BytesIO(resp.body)) + assert list(wb.active.values) == [ + ("name", "ref", "price", "weight", "description", "url", "img"), + ("Lait", "123", 1.5, None, None, None, None), + ]