Add products export endpoint

This commit is contained in:
Yohan Boniface 2019-04-06 18:28:12 +02:00
parent d73386a58a
commit be5275053b
4 changed files with 43 additions and 8 deletions

View file

@ -181,6 +181,15 @@ async def import_products(request, response, id):
response.redirect = f"/livraison/{delivery.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"]) @app.route("/livraison/{id}/edit", methods=["GET"])
async def edit_delivery(request, response, id): async def edit_delivery(request, response, id):
delivery = Delivery.load(id) delivery = Delivery.load(id)

View file

@ -1,6 +1,10 @@
from dataclasses import fields as get_fields
from openpyxl import Workbook from openpyxl import Workbook
from openpyxl.writer.excel import save_virtual_workbook from openpyxl.writer.excel import save_virtual_workbook
from .models import Product
def summary(delivery): def summary(delivery):
wb = Workbook() wb = Workbook()
@ -40,3 +44,14 @@ def full(delivery):
] + [delivery.total] ] + [delivery.total]
ws.append(footer) ws.append(footer)
return save_virtual_workbook(wb) 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)

View file

@ -57,6 +57,9 @@
<a href="/livraison/{{ delivery.id }}/émargement" target="_blank"><i class="icon-document"></i> Liste d'émargement</a> <a href="/livraison/{{ delivery.id }}/émargement" target="_blank"><i class="icon-document"></i> Liste d'émargement</a>
</li> </li>
{% if request.user and request.user.is_staff %} {% if request.user and request.user.is_staff %}
<li>
<a href="/livraison/{{ delivery.id }}/exporter/produits"><i class="icon-layers"></i> Télécharger les produits</a>
</li>
<li> <li>
<a href="/livraison/{{ delivery.id }}/edit"><i class="icon-adjustments"></i> Modifier la livraison (admin)</a> <a href="/livraison/{{ delivery.id }}/edit"><i class="icon-adjustments"></i> Modifier la livraison (admin)</a>
</li> </li>

View file

@ -1,4 +1,7 @@
from io import BytesIO
import pytest import pytest
from openpyxl import load_workbook
from copanier.models import Delivery, Order, ProductOrder from copanier.models import Delivery, Order, ProductOrder
@ -32,7 +35,7 @@ async def test_create_delivery(client):
"date": "2019-02-23", "date": "2019-02-23",
"from_time": "18:30:00", "from_time": "18:30:00",
"to_time": "20:00:00", "to_time": "20:00:00",
"order_before": "2019-02-12" "order_before": "2019-02-12",
} }
resp = await client.post("/livraison", body=body) resp = await client.post("/livraison", body=body)
assert resp.status == 302 assert resp.status == 302
@ -49,9 +52,7 @@ async def test_create_delivery(client):
async def test_place_order_with_session(client, delivery): async def test_place_order_with_session(client, delivery):
delivery.persist() delivery.persist()
body = { body = {"123": "3"}
"123": "3",
}
resp = await client.post(f"/livraison/{delivery.id}/commander", body=body) resp = await client.post(f"/livraison/{delivery.id}/commander", body=body)
assert resp.status == 302 assert resp.status == 302
delivery = Delivery.load(id=delivery.id) 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): async def test_change_paid_status_when_placing_order(client, delivery):
delivery.persist() delivery.persist()
body = { body = {"123": "3", "paid": 1}
"123": "3",
"paid": 1
}
resp = await client.post(f"/livraison/{delivery.id}/commander", body=body) resp = await client.post(f"/livraison/{delivery.id}/commander", body=body)
assert resp.status == 302 assert resp.status == 302
delivery = Delivery.load(id=delivery.id) delivery = Delivery.load(id=delivery.id)
assert delivery.orders["foo@bar.org"] assert delivery.orders["foo@bar.org"]
assert delivery.orders["foo@bar.org"].paid is True 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),
]