Skip to content

Commit

Permalink
Fixed #376 Fixed #378 Fixed #379: switch to confirm-only order
Browse files Browse the repository at this point in the history
  • Loading branch information
rgaudin committed Feb 6, 2024
1 parent 08ff0f8 commit cedc8f9
Show file tree
Hide file tree
Showing 6 changed files with 123 additions and 6 deletions.
1 change: 0 additions & 1 deletion manager/manager/templates/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,6 @@ <h5 class="my-0 mr-md-auto font-weight-normal"><img class="logo-sq" src="{% stat
<nav class="my-2 my-md-0 mr-md-3">
<a class="p-2 text-dark" href="{% url 'home' %}">{% blocktrans %}Home{% endblocktrans %}</a>
<a class="p-2 text-dark" href="{% url 'configuration_list' %}">{% blocktrans %}Configurations{% endblocktrans %}</a>
<a class="p-2 text-dark" href="{% url 'address_list' %}">{% blocktrans %}Addresses{% endblocktrans %}</a>
<a class="p-2 text-dark" href="{% url 'order_list' %}">{% blocktrans %}Orders{% endblocktrans %}</a>
</nav>
{% if user.is_staff %}
Expand Down
9 changes: 5 additions & 4 deletions manager/manager/templates/configuration_edit.html
Original file line number Diff line number Diff line change
Expand Up @@ -56,14 +56,15 @@

<p></p>

<form method="POST" enctype="multipart/form-data" class="edit-config">
{% csrf_token %}
<form method="POST" enctype="multipart/form-data" class="edit-config" id="edit-config">
{% csrf_token %}

<div class="tab-content" id="configMenuTabHolderContent">

<div class="form-row visual-group">
<div class="col-md-9"></div>
<div class="col-md-3"><button type="submit" class="btn btn-primary btn-sm form-control" style="margin-bottom: .5em;">{% blocktrans %}Update Configuration{% endblocktrans %}</button></div>
<div class="col-md-6"></div>
<div class="col-md-3">{% if config_id %}<a href="{% url 'configuration_order' config_id %}">{% endif %}<button form="none" class="btn btn-dark btn-sm form-control" {% if not config_id %}disabled="disabled"{% endif %}>{% blocktrans %}Place Order{% endblocktrans %} <i class="fas fa-cart-arrow-down"></i></button></a></div>
<div class="col-md-3"><button form="edit-config" class="btn btn-primary btn-sm form-control" style="margin-bottom: .5em;">{% blocktrans %}Update Configuration{% endblocktrans %}</button></div>
</div>

<div class="tab-pane fade show active" id="general" role="tabpanel" aria-labelledby="general-tab">
Expand Down
30 changes: 30 additions & 0 deletions manager/manager/templates/order_config.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{% extends "base.html" %}
{% load i18n %}
{% load manager %}

{% block content %}
<h2>{% blocktrans %}Confirm Order{% endblocktrans %}</h2>

<form method="POST">
{% csrf_token %}
<div class="form-row visual-group">
<div class="col-md-2"></div>
<div class="col-md-6"></div>
<table class="table table-striped">
<tbody>
<tr><th>Configuration</th><td><a href="{% url 'configuration_edit' config_id=config.id %}">{{ config.project_name }}</a></td></tr>
<tr><th>Hotspot WiFi SSID</th><td>{{ config.name }}</td></tr>
<tr><th>Image Size</th><td>{{ config.size|human_size }}</td></tr>
<tr><th>Send Download Link to</th><td>{{ request.user.profile.name }} <code>{{ request.user.profile.email }}</code></td></tr>
</tbody>
</table>
<div class="col-md-2"></div>
</div>
<div class="form-row visual-group">
<div class="col-md-4"></div>
<div class="col-md-4"><button type="submit" class="btn btn-primary btn-sm form-control">Confirm Image Order</button></div>
<div class="col-md-4"></div>
</div>
</form>
{% endblock %}

8 changes: 7 additions & 1 deletion manager/manager/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@
config.configuration_export,
name="configuration_export",
),
path(
"configurations/<int:config_id>/order",
ui.order_config,
name="configuration_order",
),
path("configurations/", config.configuration_list, name="configuration_list"),
# addresses
path(
Expand All @@ -71,7 +76,8 @@
name="order_add_shipping",
),
# orders
path("orders/new", ui.order_new, name="order_new"),
# path("orders/new", ui.order_new, name="order_new"),
path("orders/new", ui.order_config, name="order_new"),
path("orders/<str:order_min_id>/cancel", ui.order_cancel, name="order_cancel"),
path("orders/<str:order_min_id>", ui.order_detail, name="order_detail"),
path("orders/", ui.order_list, name="order_list"),
Expand Down
1 change: 1 addition & 0 deletions manager/manager/views/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@ def configuration_edit(request, config_id=None):
context["app_catalog"] = app_catalog
context["form"] = form
context["missing_zims"] = config.retrieve_missing_zims()
context["config_id"] = config.id

return render(request, "configuration_edit.html", context)

Expand Down
80 changes: 80 additions & 0 deletions manager/manager/views/ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import logging

from django import forms
from django import conf
from django.conf import settings
from django.contrib import messages
from django.contrib.auth import logout, update_session_auth_hash
Expand Down Expand Up @@ -591,6 +592,85 @@ def order_new(request, kind=Media.VIRTUAL): # noqa: ARG001
return render(request, "order_new.html", context)


@login_required
def order_config(request, config_id: int | None = None):
context = {}

organization = request.user.profile.organization
if config_id:
config = Configuration.get_or_none(config_id)
if not config or config.organization != organization:
messages.error(
request,
_("Configuration #%(id)s is not a valid configuration for you")
% {"id": config_id},
)
return redirect("configuration_list")
else:
# we need at least one config to pursue
if not organization.configurations.count():
messages.error(
request, _("You need at least one saved Configuration to order")
)
return redirect("configuration_list")
# select latest (already updated_by sorted) if not specified
config = organization.configurations.last()

# update config size?
if config.size_value_changed():
config.save()

if not config.min_media:
messages.error(
request, _("Configuration size it too large and cannot be ordered")
)
return redirect("configuration_edit", config_id=config.id)

# staff and admin are allowed to place multiple orders at once
if request.user.is_staff or request.user.is_superuser:
can_order = True
previous_order_id = None
else:
previous_order_id = Order.profile_has_active(request.user.profile)
can_order = not previous_order_id
context.update({"can_order": can_order, "previous_order_id": previous_order_id})

# display an alert informing user he cannot order at the moment
# if he had just clicked on Order, using an error message and blocking the process
# otherwise a warning is enough
if not context["can_order"]:
func = getattr(messages, "error" if request.method == "POST" else "warning")
func(
request,
_(
"Your previous Order (#%(order_id)s) must complete "
+ "before you're allowed to request a new one."
)
% {"order_id": previous_order_id},
)

if request.method == "POST" and can_order:
try:
order = Order.create_from(
client=request.user.profile,
config=config,
media=config.min_media,
quantity=1,
address=None,
request_lang=get_language_from_request(request),
)
except Exception as exc:
logger.error(exc)
messages.error(request, _("Error placing Order… %(err)s") % {"err": exc})
else:
messages.success(request, OrderForm.success_message(order.min_id))
return redirect("order_list")

context["config"] = config

return render(request, "order_config.html", context)


@login_required
def order_detail(request, order_min_id):
order = Order.get_or_none(order_min_id)
Expand Down

0 comments on commit cedc8f9

Please sign in to comment.