Deal with from/to time

This commit is contained in:
Yohan Boniface 2019-03-23 23:22:45 +01:00
parent ab1710d1e4
commit 4c34c2bacd
9 changed files with 67 additions and 20 deletions

View file

@ -56,6 +56,17 @@ env = Environment(
) )
def date_filter(value):
return value.strftime("%d/%m/%Y")
def time_filter(value):
return value.strftime("%H:%M")
env.filters["date"] = date_filter
env.filters["time"] = time_filter
app = Roll() app = Roll()
cors(app, methods="*", headers="*") cors(app, methods="*", headers="*")
options(app) options(app)
@ -142,17 +153,19 @@ async def home(request, response):
response.html("home.html", deliveries=Delivery.all()) response.html("home.html", deliveries=Delivery.all())
@app.route("/livraison/new", methods=["GET"]) @app.route("/livraison", methods=["GET"])
@auth_required @auth_required
async def new_delivery(request, response): async def new_delivery(request, response):
response.html("edit_delivery.html", delivery={}) response.html("edit_delivery.html", delivery={})
@app.route("/livraison/new", methods=["POST"]) @app.route("/livraison", methods=["POST"])
@auth_required @auth_required
async def create_delivery(request, response): async def create_delivery(request, response):
form = request.form form = request.form
data = {} data = {}
data["from_date"] = f"{form.get('date')} {form.get('from_time')}"
data["to_date"] = f"{form.get('date')} {form.get('to_time')}"
for name, field in Delivery.__dataclass_fields__.items(): for name, field in Delivery.__dataclass_fields__.items():
if name in form: if name in form:
data[name] = form.get(name) data[name] = form.get(name)
@ -189,6 +202,8 @@ async def edit_delivery(request, response, id):
async def post_delivery(request, response, id): async def post_delivery(request, response, id):
delivery = Delivery.load(id) delivery = Delivery.load(id)
form = request.form form = request.form
delivery.from_date = f"{form.get('date')} {form.get('from_time')}"
delivery.to_date = f"{form.get('date')} {form.get('to_time')}"
for name, field in Delivery.__dataclass_fields__.items(): for name, field in Delivery.__dataclass_fields__.items():
if name in form: if name in form:
setattr(delivery, name, form.get(name)) setattr(delivery, name, form.get(name))

View file

@ -122,7 +122,8 @@ class Delivery(Base):
__lock__ = threading.Lock() __lock__ = threading.Lock()
producer: str producer: str
when: datetime_field from_date: datetime_field
to_date: datetime_field
order_before: datetime_field order_before: datetime_field
description: str = "" description: str = ""
where: str = "Marché de la Briche" where: str = "Marché de la Briche"

View file

@ -219,15 +219,12 @@ fieldset {
} }
legend { legend {
width: 100%; width: 100%;
/* margin-top: 2rem;
margin-bottom: 1rem; */
font-size: 1.2rem; font-size: 1.2rem;
font-weight: bold; font-weight: bold;
} }
input, input,
textarea { textarea {
display: block;
position: relative; position: relative;
height: 2rem; height: 2rem;
padding: .4rem .8rem; padding: .4rem .8rem;

View file

@ -19,7 +19,7 @@
<section class="menu"> <section class="menu">
<h1><a href="/">Panio</a> <small>Les paniers piano d'Épinamap</small></h1> <h1><a href="/">Panio</a> <small>Les paniers piano d'Épinamap</small></h1>
<nav> <nav>
<a href="/livraison/new">Nouvelle livraison</a> <a href="/livraison">Nouvelle livraison</a>
{% if request["user"] %} {% if request["user"] %}
&nbsp;&nbsp;{{ request["user"].email }}</span> &nbsp;&nbsp;{{ request["user"].email }}</span>
{% endif %} {% endif %}

View file

@ -1,8 +1,11 @@
{% extends "base.html" %} {% extends "base.html" %}
{% block body %} {% block body %}
<p><a href="/">&lt; Revenir aux livraisons</a></p> {% if delivery.id %}
<h1>Nouvelle livraison</h1> <h1>Modifier la livraison</h1>
{% else %}
<h1>Nouvelle livraison</h1>
{% endif %}
<form method="post"> <form method="post">
<label> <label>
<h5>Producteur</h5> <h5>Producteur</h5>
@ -18,8 +21,7 @@
</label> </label>
<label> <label>
<h5>Date de livraison</h5> <h5>Date de livraison</h5>
<input type="date" name="when" value="{{ delivery.when.date() if delivery.when else '' }}" required> <input type="date" name="date" value="{{ delivery.from_date.date() if delivery.from_date else '' }}" required> de <input type="time" name="from_time" value="{{ delivery.from_date.time() if delivery.from_date else '' }}" required> à <input type="time" name="to_time" value="{{ delivery.to_date.time() if delivery.to_date else '' }}" required>
<input type="time" name="when_time" value="{{ delivery.when.time() if delivery.when else '' }}" required>
</label> </label>
<label> <label>
<h5>Date de limite de commande</h5> <h5>Date de limite de commande</h5>

View file

@ -1,6 +1,6 @@
<ul class="delivery-head"> <ul class="delivery-head">
<li><i class="icon-basket"></i> <strong>Produits</strong> {{ delivery.description }}</li> <li><i class="icon-basket"></i> <strong>Produits</strong> {{ delivery.description }}</li>
<li><i class="icon-map-pin"></i> <strong>Lieu</strong> {{ delivery.where }}</li> <li><i class="icon-map-pin"></i> <strong>Lieu</strong> {{ delivery.where }}</li>
<li><i class="icon-clock"></i> <strong>Date de livraison</strong> <time datetime="{{ delivery.when }}">{{ delivery.when }}</time></li> <li><i class="icon-clock"></i> <strong>Date de livraison</strong> <time datetime="{{ delivery.from_date }}">{{ delivery.from_date|date }} de {{ delivery.from_date|time }} à {{ delivery.to_date|time }}</time></li>
<li><i class="icon-hourglass"></i> {% if delivery.is_open %}<strong>Date limite de commande</strong> <time datetime="{{ delivery.order_before.date() }}">{{ delivery.order_before.date() }}</time>{% else %}<strong>Fermée</strong>{% endif %}</li> <li><i class="icon-hourglass"></i> {% if delivery.is_open %}<strong>Date limite de commande</strong> <time datetime="{{ delivery.order_before.date() }}">{{ delivery.order_before.date() }}</time>{% else %}<strong>Fermée</strong>{% endif %}</li>
</ul> </ul>

View file

@ -23,6 +23,7 @@ def pytest_runtest_setup(item):
class Client(BaseClient): class Client(BaseClient):
content_type = 'application/x-www-form-urlencoded; charset=utf-8'
headers = {} headers = {}
async def request( async def request(
@ -65,7 +66,8 @@ def app(): # Requested by Roll testing utilities.
def delivery(): def delivery():
return Delivery( return Delivery(
producer="Andines", producer="Andines",
when=datetime.now() + timedelta(days=10), from_date=datetime.now() + timedelta(days=10),
to_date=datetime.now() + timedelta(days=10),
order_before=datetime.now() + timedelta(days=7), order_before=datetime.now() + timedelta(days=7),
) )

View file

@ -9,16 +9,20 @@ now = datetime.now
def test_can_create_delivery(): def test_can_create_delivery():
delivery = Delivery(producer="Andines", when=now(), order_before=now()) delivery = Delivery(
producer="Andines", from_date=now(), to_date=now(), order_before=now()
)
assert delivery.producer == "Andines" assert delivery.producer == "Andines"
assert delivery.where == "Marché de la Briche" assert delivery.where == "Marché de la Briche"
assert delivery.when.year == now().year assert delivery.from_date.year == now().year
assert delivery.id assert delivery.id
def test_wrong_datetime_raise_valueerror(): def test_wrong_datetime_raise_valueerror():
with pytest.raises(ValueError): with pytest.raises(ValueError):
Delivery(producer="Andines", order_before=now(), when="pouet") Delivery(
producer="Andines", order_before=now(), to_date=now(), from_date="pouet"
)
def test_delivery_is_open_when_order_before_is_in_the_future(delivery): def test_delivery_is_open_when_order_before_is_in_the_future(delivery):
@ -37,7 +41,8 @@ def test_can_create_product():
def test_can_create_delivery_with_products(): def test_can_create_delivery_with_products():
delivery = Delivery( delivery = Delivery(
producer="Andines", producer="Andines",
when=now(), from_date=now(),
to_date=now(),
order_before=now(), order_before=now(),
products=[Product(name="Lait", ref="123", price=1.5)], products=[Product(name="Lait", ref="123", price=1.5)],
) )

View file

@ -1,22 +1,47 @@
import pytest import pytest
from kaba.models import Delivery
pytestmark = pytest.mark.asyncio pytestmark = pytest.mark.asyncio
async def test_empty_home(client): async def test_empty_home(client):
resp = await client.get('/') resp = await client.get("/")
assert resp.status == 200 assert resp.status == 200
async def test_home_should_list_active_delivery(client, delivery): async def test_home_should_list_active_delivery(client, delivery):
delivery.persist() delivery.persist()
resp = await client.get('/') resp = await client.get("/")
assert resp.status == 200 assert resp.status == 200
assert delivery.producer in resp.body.decode() assert delivery.producer in resp.body.decode()
async def test_home_should_redirect_to_login_if_not_logged(client): async def test_home_should_redirect_to_login_if_not_logged(client):
client.logout() client.logout()
resp = await client.get('/') resp = await client.get("/")
assert resp.status == 302 assert resp.status == 302
assert resp.headers["Location"] == "/sésame?next=/" assert resp.headers["Location"] == "/sésame?next=/"
async def test_create_delivery(client):
assert not list(Delivery.all())
body = {
"producer": "Andines",
"where": "Marché de la Briche",
"date": "2019-02-23",
"from_time": "18:30:00",
"to_time": "20:00:00",
"order_before": "2019-02-12"
}
resp = await client.post("/livraison", body=body)
assert resp.status == 302
assert len(list(Delivery.all())) == 1
delivery = list(Delivery.all())[0]
assert delivery.producer == "Andines"
assert delivery.from_date.year == 2019
assert delivery.from_date.hour == 18
assert delivery.from_date.minute == 30
assert delivery.to_date.year == 2019
assert delivery.to_date.hour == 20
assert delivery.to_date.minute == 0