Compare commits

..

2 commits

Author SHA1 Message Date
selfhoster1312 ACAB
4e7602f30b Merge branch 'feat-distribution-place' into 'develop'
Draft: feature: Add placekey relationship for distribution spots

See merge request la-chariotte/la-chariotte!129
2025-03-04 22:05:24 +00:00
selfhoster1312
bd5f538307 feature: Add place relationship for distribution spots 2025-03-04 23:05:20 +01:00
5 changed files with 29 additions and 156 deletions

View file

@ -101,31 +101,15 @@ class ItemCreateForm(forms.ModelForm):
class JoinGroupedOrderForm(forms.Form):
order_code = forms.CharField(
label="Code pour rejoindre la commande", max_length=6, required=False
)
place_code = forms.CharField(
label="Code pour rejoindre le lieu", max_length=20, required=False
)
code = forms.CharField(label="Code pour rejoindre la commande", max_length=6)
def clean_place_code(self):
form_place_code = self.cleaned_data["place_code"]
if form_place_code and not Place.objects.filter(code=form_place_code).exists():
raise forms.ValidationError(
"Désolé, nous ne trouvons aucun lieu avec ce code"
)
return form_place_code
def clean_order_code(self):
form_order_code = self.cleaned_data["order_code"]
if (
form_order_code
and not GroupedOrder.objects.filter(code=form_order_code).exists()
):
def clean_code(self):
form_code = self.cleaned_data["code"]
if not GroupedOrder.objects.filter(code=form_code).exists():
raise forms.ValidationError(
"Désolé, nous ne trouvons aucune commande avec ce code"
)
return form_order_code
return form_code
class PlaceForm(forms.ModelForm):

View file

@ -55,31 +55,11 @@ class JoinGroupedOrderView(generic.FormView, generic.RedirectView, LoginRequired
template_name = "dashboard.html"
def form_valid(self, form):
# Give priority to order code, for arbitrary reasons
if form.cleaned_data["order_code"]:
return redirect(
reverse_lazy(
"order:grouped_order_detail",
kwargs={"code": form.cleaned_data["order_code"]},
)
return redirect(
reverse_lazy(
"order:grouped_order_detail", kwargs={"code": form.cleaned_data["code"]}
)
elif form.cleaned_data["place_code"]:
return redirect(
reverse_lazy(
"order:place_overview",
kwargs={"code": form.cleaned_data["place_code"]},
)
)
else:
# No valid data found. Either no data was supplied, or they failed validation.
if (
"order_code" not in form.data
or not form.data["order_code"]
or "place_code" not in form.data
or not form.data["place_code"]
):
# No data supplied, redirect to dashboard
return redirect(reverse_lazy("dashboard"))
)
class GroupedOrderEventView(generic.DetailView):

View file

@ -86,9 +86,6 @@
<a class="navbar-item" href="{% url 'order:index' %}">
<i class="fa fa-shopping-basket mr-3" aria-hidden="true"></i>Mes commandes groupées
</a>
<a class="navbar-item" href="{% url 'order:place_index' %}">
<i class="fa fa-home mr-3" aria-hidden="true"></i>Mes lieux de distribution
</a>
{% endif %}
<a class="navbar-item" href="{% url 'about_chariotte' %}">
<i class="fa fa-info-circle mr-3" aria-hidden="true"></i>La Chariotte, c'est quoi&nbsp;?

View file

@ -5,17 +5,6 @@
{% block content %}
{% load static %}
{% if user.is_authenticated %}
<div class="buttons is-centered mt-3">
<a class="button is-primary" href="{% url 'order:index' %}">
<i class="fa fa-shopping-basket mr-3" aria-hidden="true"></i>Mes commandes groupées
</a>
<a class="button is-primary" href="{% url 'order:place_index' %}">
<i class="fa fa-home mr-3" aria-hidden="true"></i>Mes lieux de distribution
</a>
</div>
{% endif %}
<p class="desktop-hidden mobile-content-title">
{% block content_title %}Bienvenue{% if user.is_authenticated %}, {{ user.first_name }}{% else %} sur la Chariotte !{% endif %}{% endblock %}
</p>
@ -26,15 +15,15 @@
<p>Si vous avez un code à 6 caractères, entrez-le ici :</p>
<form method="post">
{% csrf_token %}
{% for error in form.order_code.errors %}
{% for error in form.code.errors %}
<p class="help is-danger">{{ error }}</p>
{% endfor %}
<div class="field has-addons">
<div class="control">
<input name="order_code" class="input {% if form.order_code.errors %}is-danger{% endif %}" type="text">
<input name="code" class="input {% if form.code.errors %}is-danger{% endif %}" type="text">
</div>
<div class="control">
<input class="button is-primary" type="submit" value="Rejoindre une commande">
<input class="button is-primary" type="submit" value="Rejoindre">
</div>
</div>
</form>
@ -42,42 +31,23 @@
</div>
<div class="column is-half">
<div class="box full-height">
<p class="subtitle">Rejoindre un lieu de distribution</p>
<p>Si vous avez un code de lieu, entrez-le ici :</p>
<form method="post">
{% csrf_token %}
{% for error in form.place_code.errors %}
<p class="help is-danger">{{ error }}</p>
{% endfor %}
<div class="field has-addons">
<div class="control">
<input name="place_code" class="input {% if form.place_code.errors %}is-danger{% endif %}" type="text">
</div>
<div class="control">
<input class="button is-primary" type="submit" value="Rejoindre un lieu">
</div>
</div>
</form>
</div>
</div>
</div>
{% if not user.is_authenticated %}
<div class="columns is-centered">
<div class="column is-centered is-half">
<div class="box">
{% if user.is_authenticated %}
<p class="subtitle">... Ou accédez à vos commandes groupées</p>
<a class="button is-primary" href="{% url 'order:index' %}">
<i class="fa fa-shopping-basket mr-3" aria-hidden="true"></i>Mes commandes groupées
</a>
{% else %}
<p class="subtitle">... Ou connectez-vous pour organiser une commande groupée</p>
<div class="buttons is-centered mt-3">
<a class="button is-primary" href="{% url 'accounts:login' %}">
<i class="fa fa-sign-in mr-3" aria-hidden="true"></i>Se connecter
</a>
<a class="button is-light" href="{% url 'accounts:signup' %}">
<strong>Créer un compte</strong>
</a>
</div>
<a class="button is-primary" href="{% url 'accounts:login' %}">
<i class="fa fa-sign-in mr-3" aria-hidden="true"></i>Se connecter
</a>
<a class="button is-light" href="{% url 'accounts:signup' %}">
<strong>Créer un compte</strong>
</a>
{% endif %}
</div>
</div>
</div>
{% endif %}
<div class="columns is-centered">
<div class="column is-10">
<div class="box">

View file

@ -191,7 +191,7 @@ class TestGroupedOrderIndexView:
class TestJoinGroupedOrderView:
def test_correct_order_code_redirects_properly(self, client, client_log):
def test_correct_code_redirects_properly(self, client, client_log):
logged_user = auth.get_user(client_log)
grouped_order = create_grouped_order(
days_before_delivery_date=5,
@ -200,7 +200,7 @@ class TestJoinGroupedOrderView:
orga_user=logged_user,
)
join_url = reverse("dashboard")
response = client.post(join_url, {"order_code": grouped_order.code})
response = client.post(join_url, {"code": grouped_order.code})
expected_url = reverse(
"order:grouped_order_detail", kwargs={"code": grouped_order.code}
@ -208,75 +208,17 @@ class TestJoinGroupedOrderView:
assert response.status_code == 302
assert response.url == expected_url
def test_incorrect_order_code_errors_out(self, client):
def test_incorrect_code_errors_out(self, client):
assert len(models.GroupedOrder.objects.all()) == 0
join_url = reverse("dashboard")
response = client.post(join_url, {"order_code": "123456"})
response = client.post(join_url, {"code": "123456"})
assert (
"Désolé, nous ne trouvons aucune commande avec ce code"
in response.content.decode()
)
def test_correct_place_code_redirects_properly(self, client, client_log):
place = models.Place.objects.create(
name="foo",
orga=auth.get_user(client_log),
code="foo",
)
join_url = reverse("dashboard")
response = client.post(join_url, {"place_code": place.code})
expected_url = reverse("order:place_overview", kwargs={"code": place.code})
assert response.status_code == 302
assert response.url == expected_url
def test_incorrect_place_code_errors_out(self, client):
assert len(models.Place.objects.all()) == 0
join_url = reverse("dashboard")
response = client.post(join_url, {"place_code": "123456"})
assert (
"Désolé, nous ne trouvons aucun lieu avec ce code"
in response.content.decode()
)
def test_correct_order_code_has_precedence(self, client, client_log):
logged_user = auth.get_user(client_log)
place = models.Place.objects.create(
name="foo",
orga=logged_user,
code="foo",
)
grouped_order = create_grouped_order(
days_before_delivery_date=5,
days_before_deadline=2,
name="test",
orga_user=logged_user,
)
join_url = reverse("dashboard")
response = client.post(
join_url, {"place_code": place.code, "order_code": grouped_order.code}
)
expected_url = reverse(
"order:grouped_order_detail", kwargs={"code": grouped_order.code}
)
assert response.status_code == 302
assert response.url == expected_url
def test_no_code_redirects_to_dashboard(self, client_log):
join_url = reverse("dashboard")
response = client_log.post(join_url, {})
assert response.status_code == 302
assert response.url == join_url
class TestGroupedOrderDetailView:
def test_order_item_with_authenticated_user(self, client, connected_grouped_order):