mirror of
https://github.com/almet/copanier.git
synced 2025-04-28 11:32:38 +02:00
Add products export endpoint
This commit is contained in:
parent
d73386a58a
commit
be5275053b
4 changed files with 43 additions and 8 deletions
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -57,6 +57,9 @@
|
|||
<a href="/livraison/{{ delivery.id }}/émargement" target="_blank"><i class="icon-document"></i> Liste d'émargement</a>
|
||||
</li>
|
||||
{% 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>
|
||||
<a href="/livraison/{{ delivery.id }}/edit"><i class="icon-adjustments"></i> Modifier la livraison (admin)</a>
|
||||
</li>
|
||||
|
|
|
@ -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),
|
||||
]
|
||||
|
|
Loading…
Reference in a new issue