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()
cors(app, methods="*", headers="*")
options(app)
@ -142,17 +153,19 @@ async def home(request, response):
response.html("home.html", deliveries=Delivery.all())
@app.route("/livraison/new", methods=["GET"])
@app.route("/livraison", methods=["GET"])
@auth_required
async def new_delivery(request, response):
response.html("edit_delivery.html", delivery={})
@app.route("/livraison/new", methods=["POST"])
@app.route("/livraison", methods=["POST"])
@auth_required
async def create_delivery(request, response):
form = request.form
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():
if name in form:
data[name] = form.get(name)
@ -189,6 +202,8 @@ async def edit_delivery(request, response, id):
async def post_delivery(request, response, id):
delivery = Delivery.load(id)
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():
if name in form:
setattr(delivery, name, form.get(name))

View file

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

View file

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

View file

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

View file

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

View file

@ -1,6 +1,6 @@
<ul class="delivery-head">
<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-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>
</ul>

View file

@ -23,6 +23,7 @@ def pytest_runtest_setup(item):
class Client(BaseClient):
content_type = 'application/x-www-form-urlencoded; charset=utf-8'
headers = {}
async def request(
@ -65,7 +66,8 @@ def app(): # Requested by Roll testing utilities.
def delivery():
return Delivery(
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),
)

View file

@ -9,16 +9,20 @@ now = datetime.now
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.where == "Marché de la Briche"
assert delivery.when.year == now().year
assert delivery.from_date.year == now().year
assert delivery.id
def test_wrong_datetime_raise_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):
@ -37,7 +41,8 @@ def test_can_create_product():
def test_can_create_delivery_with_products():
delivery = Delivery(
producer="Andines",
when=now(),
from_date=now(),
to_date=now(),
order_before=now(),
products=[Product(name="Lait", ref="123", price=1.5)],
)

View file

@ -1,22 +1,47 @@
import pytest
from kaba.models import Delivery
pytestmark = pytest.mark.asyncio
async def test_empty_home(client):
resp = await client.get('/')
resp = await client.get("/")
assert resp.status == 200
async def test_home_should_list_active_delivery(client, delivery):
delivery.persist()
resp = await client.get('/')
resp = await client.get("/")
assert resp.status == 200
assert delivery.producer in resp.body.decode()
async def test_home_should_redirect_to_login_if_not_logged(client):
client.logout()
resp = await client.get('/')
resp = await client.get("/")
assert resp.status == 302
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