mirror of
				https://gitlab.crans.org/bde/nk20
				synced 2025-11-04 09:12:11 +01:00 
			
		
		
		
	Add waiting lists interfaces
Signed-off-by: Emmy D'ANELLO <ynerant@crans.org>
This commit is contained in:
		
							
								
								
									
										88
									
								
								apps/note/templates/sheets/waiting_list.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								apps/note/templates/sheets/waiting_list.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,88 @@
 | 
			
		||||
{% extends "base.html" %}
 | 
			
		||||
 | 
			
		||||
{% load i18n %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
<div class="card">
 | 
			
		||||
<div class="card-header text-center">
 | 
			
		||||
    <h1>{{ food.name }}</h1>
 | 
			
		||||
</div>
 | 
			
		||||
<div class="card-body">
 | 
			
		||||
    <div class="row">
 | 
			
		||||
        <div class="card col-xl-6">
 | 
			
		||||
            <div class="card-header text-center">
 | 
			
		||||
                <h2>{% trans "queued"|capfirst %}{% if queue %} ({{ queue|length }}){% endif %}</h2>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="card-body">
 | 
			
		||||
                <ul>
 | 
			
		||||
                    {% for ordered_food in queue %}
 | 
			
		||||
                        <li>
 | 
			
		||||
                            {{ ordered_food.order.note }}
 | 
			
		||||
                            {% if ordered_food.priority %}
 | 
			
		||||
                                <span class="badge badge-secondary">{{ ordered_food.priority }}</span>
 | 
			
		||||
                            {% endif %}
 | 
			
		||||
                        </li>
 | 
			
		||||
                    {% empty %}
 | 
			
		||||
                        <div class="alert alert-warning">
 | 
			
		||||
                            {% trans "There is no queued order." %}
 | 
			
		||||
                        </div>
 | 
			
		||||
                    {% endfor %}
 | 
			
		||||
                </ul>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="card col-xl-6">
 | 
			
		||||
            <div class="card-header text-center">
 | 
			
		||||
                <h2>{% trans "ready"|capfirst %}</h2>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="card-body">
 | 
			
		||||
                <ul>
 | 
			
		||||
                    {% for ordered_food in ready %}
 | 
			
		||||
                        <li>{{ ordered_food.order.note }}</li>
 | 
			
		||||
                    {% empty %}
 | 
			
		||||
                        <div class="alert alert-warning">
 | 
			
		||||
                            {% trans "There is no ready order." %}
 | 
			
		||||
                        </div>
 | 
			
		||||
                    {% endfor %}
 | 
			
		||||
                </ul>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <hr>
 | 
			
		||||
 | 
			
		||||
    <h3>{% trans "Other waiting lists:" %}</h3>
 | 
			
		||||
    <ul>
 | 
			
		||||
        {% for other_food in food.sheet.food_set.all %}
 | 
			
		||||
            {% if other_food != food %}
 | 
			
		||||
                <li>
 | 
			
		||||
                    <a href="{% url 'sheets:waiting_list' pk=other_food.pk %}">{{ other_food }}</a>
 | 
			
		||||
                </li>
 | 
			
		||||
            {% endif %}
 | 
			
		||||
        {% endfor %}
 | 
			
		||||
    </ul>
 | 
			
		||||
</div>
 | 
			
		||||
<div class="card-footer text-center">
 | 
			
		||||
    <a href="{% url 'sheets:queued_list' pk=food.pk %}" class="btn btn-primary">
 | 
			
		||||
        {% trans "Queued orders" %}
 | 
			
		||||
    </a>
 | 
			
		||||
    <a href="{% url 'sheets:ready_list' pk=food.pk %}" class="btn btn-primary">
 | 
			
		||||
        {% trans "Ready orders" %}
 | 
			
		||||
    </a>
 | 
			
		||||
    <a href="{% url 'sheets:sheet_detail' pk=food.sheet_id %}" class="btn btn-secondary">
 | 
			
		||||
        {% trans "Back to note sheet detail" %}
 | 
			
		||||
    </a>
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block extrajavascript %}
 | 
			
		||||
    <script>
 | 
			
		||||
        function reload() {
 | 
			
		||||
            reloadWithTurbolinks()
 | 
			
		||||
            timeout = setTimeout(reload, 15000)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (timeout === undefined)
 | 
			
		||||
            var timeout = setTimeout(reload, 15000)
 | 
			
		||||
    </script>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
							
								
								
									
										152
									
								
								apps/note/templates/sheets/waiting_list_detail.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										152
									
								
								apps/note/templates/sheets/waiting_list_detail.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,152 @@
 | 
			
		||||
{% extends "base.html" %}
 | 
			
		||||
 | 
			
		||||
{% load i18n %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
<div class="card">
 | 
			
		||||
<div class="card-header text-center">
 | 
			
		||||
    <h1>{{ title }}</h1>
 | 
			
		||||
</div>
 | 
			
		||||
<div class="card-body">
 | 
			
		||||
    {% for of in orders %}
 | 
			
		||||
        <div class="card mb-4">
 | 
			
		||||
            <div class="card-header text-center">
 | 
			
		||||
                <h3>{{ of.order.note }}</h3>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="card-body">
 | 
			
		||||
                <dl class="row">
 | 
			
		||||
                    <dt class="col-xl-3">{% trans 'date'|capfirst %}</dt>
 | 
			
		||||
                    <dd class="col-xl-9">{{ of.order.date }}</dd>
 | 
			
		||||
 | 
			
		||||
                    {% if of.number > 1 %}
 | 
			
		||||
                        <dt class="col-xl-3">{% trans 'order number'|capfirst %}</dt>
 | 
			
		||||
                        <dd class="col-xl-9">{{ of.number }}</dd>
 | 
			
		||||
                    {% endif %}
 | 
			
		||||
 | 
			
		||||
                    {% if of.priority %}
 | 
			
		||||
                        <dt class="col-xl-3">{% trans 'priority request'|capfirst %}</dt>
 | 
			
		||||
                        <dd class="col-xl-9">{{ of.priority }}</dd>
 | 
			
		||||
                    {% endif %}
 | 
			
		||||
 | 
			
		||||
                    {% if of.remark %}
 | 
			
		||||
                        <dt class="col-xl-3">{% trans 'remark'|capfirst %}</dt>
 | 
			
		||||
                        <dd class="col-xl-9">{{ of.remark }}</dd>
 | 
			
		||||
                    {% endif %}
 | 
			
		||||
 | 
			
		||||
                    {% if of.options.count %}
 | 
			
		||||
                        <dt class="col-xl-3">{% trans 'options'|capfirst %}</dt>
 | 
			
		||||
                        <dd class="col-xl-9">{{ of.options.all|join:', ' }}</dd>
 | 
			
		||||
                    {% endif %}
 | 
			
		||||
                </dl>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="card-footer text-center">
 | 
			
		||||
                {% if list_type != 'READY' %}
 | 
			
		||||
                    <a href="#" class="btn btn-success" onclick="setOrderStatus({{ of.pk }}, 'READY')">
 | 
			
		||||
                        {% trans "Mark as ready" %}
 | 
			
		||||
                    </a>
 | 
			
		||||
                {% endif %}
 | 
			
		||||
                {% if list_type != 'SERVED' %}
 | 
			
		||||
                    <a href="#" class="btn btn-primary" onclick="setOrderStatus({{ of.pk }}, 'SERVED')">
 | 
			
		||||
                        {% trans "Mark as served" %}
 | 
			
		||||
                    </a>
 | 
			
		||||
                {% endif %}
 | 
			
		||||
                {% if list_type != 'QUEUED' %}
 | 
			
		||||
                    <a href="#" class="btn btn-warning" onclick="setOrderStatus({{ of.pk }}, 'QUEUED')">
 | 
			
		||||
                        {% trans "Re-queue" %}
 | 
			
		||||
                    </a>
 | 
			
		||||
                {% endif %}
 | 
			
		||||
                {% if list_type != 'CANCELED' %}
 | 
			
		||||
                    <a href="#" class="btn btn-danger" onclick="setOrderStatus({{ of.pk }}, 'CANCELED')">
 | 
			
		||||
                        {% trans "Cancel" %}
 | 
			
		||||
                    </a>
 | 
			
		||||
                {% endif %}
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    {% empty %}
 | 
			
		||||
        <div class="alert alert-warning">
 | 
			
		||||
            {% trans "There is no queued order." %}
 | 
			
		||||
        </div>
 | 
			
		||||
    {% endfor %}
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div class="card mt-5">
 | 
			
		||||
<div class="card-body">
 | 
			
		||||
    <h3>{% trans "Other waiting lists:" %}</h3>
 | 
			
		||||
    <ul>
 | 
			
		||||
        {% for other_food in food.sheet.food_set.all %}
 | 
			
		||||
            {% if other_food != food %}
 | 
			
		||||
                <li>
 | 
			
		||||
                    {% if list_type == 'QUEUED' %}
 | 
			
		||||
                        <a href="{% url 'sheets:queued_list' pk=other_food.pk %}">{{ other_food }}</a>
 | 
			
		||||
                    {% else %}
 | 
			
		||||
                        <a href="{% url 'sheets:ready_list' pk=other_food.pk %}">{{ other_food }}</a>
 | 
			
		||||
                    {% endif %}
 | 
			
		||||
                </li>
 | 
			
		||||
            {% endif %}
 | 
			
		||||
        {% endfor %}
 | 
			
		||||
    </ul>
 | 
			
		||||
</div>
 | 
			
		||||
<div class="card-footer text-center">
 | 
			
		||||
    {% if list_type != 'QUEUED' %}
 | 
			
		||||
        <a href="{% url 'sheets:queued_list' pk=food.pk %}" class="btn btn-primary">
 | 
			
		||||
            {% trans "Queued orders" %}
 | 
			
		||||
        </a>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
    {% if list_type != 'READY' %}
 | 
			
		||||
        <a href="{% url 'sheets:ready_list' pk=food.pk %}" class="btn btn-success">
 | 
			
		||||
            {% trans "Ready orders" %}
 | 
			
		||||
        </a>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
    {% if list_type != 'SERVED' %}
 | 
			
		||||
        <a href="{% url 'sheets:served_list' pk=food.pk %}" class="btn btn-secondary">
 | 
			
		||||
            {% trans "Served orders" %}
 | 
			
		||||
        </a>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
    {% if list_type != 'CANCELED' %}
 | 
			
		||||
        <a href="{% url 'sheets:canceled_list' pk=food.pk %}" class="btn btn-danger">
 | 
			
		||||
            {% trans "Canceled orders" %}
 | 
			
		||||
        </a>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
    <a href="{% url 'sheets:waiting_list' pk=food.pk %}" class="btn btn-primary">
 | 
			
		||||
        {% trans "Waiting list" %}
 | 
			
		||||
    </a>
 | 
			
		||||
    <a href="{% url 'sheets:sheet_detail' pk=food.sheet_id %}" class="btn btn-secondary">
 | 
			
		||||
        {% trans "Back to note sheet detail" %}
 | 
			
		||||
    </a>
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block extrajavascript %}
 | 
			
		||||
    <script>
 | 
			
		||||
        function reload() {
 | 
			
		||||
            reloadWithTurbolinks()
 | 
			
		||||
            timeout = setTimeout(reload, 15000)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (timeout === undefined)
 | 
			
		||||
            var timeout = setTimeout(reload, 15000)
 | 
			
		||||
 | 
			
		||||
        function setOrderStatus(ordered_food_id, status) {
 | 
			
		||||
            fetch('/api/sheets/orderedfood/' + ordered_food_id + '/', {
 | 
			
		||||
                method: 'PATCH',
 | 
			
		||||
                body: JSON.stringify({
 | 
			
		||||
                    status: status,
 | 
			
		||||
                    served_date: status === 'QUEUED' ? null : new Date().toISOString(),
 | 
			
		||||
                }),
 | 
			
		||||
                headers: {
 | 
			
		||||
                    'Content-Type': "application/json; charset=UTF-8",
 | 
			
		||||
                    'X-CSRFTOKEN': "{{ csrf_token }}"
 | 
			
		||||
                }
 | 
			
		||||
            }).then(response => response.json()).then(response => {
 | 
			
		||||
                if ('detail' in response)
 | 
			
		||||
                    addMsg("{% trans "An error occurred" %}" + " : " + response['detail'], "danger")
 | 
			
		||||
                else {
 | 
			
		||||
                    clearTimeout(timeout)
 | 
			
		||||
                    reload()
 | 
			
		||||
                }
 | 
			
		||||
            })
 | 
			
		||||
        }
 | 
			
		||||
    </script>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
@@ -42,6 +42,10 @@
 | 
			
		||||
        {% for food in sheet.food_set.all %}
 | 
			
		||||
            <li{% if not food.available %} class="text-danger" style="text-decoration: line-through !important;" title="{% trans "This product is unavailable." %}"{% endif %}>
 | 
			
		||||
                {{ food }} ({{ food.price|pretty_money }})
 | 
			
		||||
                <a href="{% url 'sheets:waiting_list' pk=food.pk %}" class="badge badge-primary">
 | 
			
		||||
                    <i class="fa fa-list"></i>
 | 
			
		||||
                    {% trans "Waiting list" %}
 | 
			
		||||
                </a>
 | 
			
		||||
                {% if can_change_sheet %}
 | 
			
		||||
                    <a href="{% url 'sheets:food_update' pk=food.pk %}" class="badge badge-primary">
 | 
			
		||||
                        <i class="fa fa-edit"></i>
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
from django.urls import path
 | 
			
		||||
 | 
			
		||||
from sheets.views import FoodCreateView, FoodUpdateView, MealCreateView, MealUpdateView, OrderView, \
 | 
			
		||||
    SheetCreateView, SheetDetailView, SheetListView, SheetUpdateView
 | 
			
		||||
    SheetCreateView, SheetDetailView, SheetListView, SheetUpdateView, WaitingListDetailView, WaitingListView
 | 
			
		||||
 | 
			
		||||
app_name = 'sheets'
 | 
			
		||||
 | 
			
		||||
@@ -18,4 +18,9 @@ urlpatterns = [
 | 
			
		||||
    path('meal/create/<int:pk>/', MealCreateView.as_view(), name="meal_create"),
 | 
			
		||||
    path('meal/<int:pk>/update/', MealUpdateView.as_view(), name="meal_update"),
 | 
			
		||||
    path('order/<int:pk>/', OrderView.as_view(), name="sheet_order"),
 | 
			
		||||
    path('waiting-list/<int:pk>/', WaitingListView.as_view(), name="waiting_list"),
 | 
			
		||||
    path('waiting-list/<int:pk>/queued/', WaitingListDetailView.as_view(), name="queued_list"),
 | 
			
		||||
    path('waiting-list/<int:pk>/ready/', WaitingListDetailView.as_view(), name="ready_list"),
 | 
			
		||||
    path('waiting-list/<int:pk>/served/', WaitingListDetailView.as_view(), name="served_list"),
 | 
			
		||||
    path('waiting-list/<int:pk>/canceled/', WaitingListDetailView.as_view(), name="canceled_list"),
 | 
			
		||||
]
 | 
			
		||||
 
 | 
			
		||||
@@ -235,6 +235,7 @@ class OrderView(LoginRequiredMixin, FormView, DetailView):
 | 
			
		||||
                label=_("gift").capitalize(),
 | 
			
		||||
                initial=0,
 | 
			
		||||
                widget=AmountInput(),
 | 
			
		||||
                help_text=_("Be careful: this gift will be multiplied for each order."),
 | 
			
		||||
            )
 | 
			
		||||
            form.fields[f'meal_{meal.id}_remark'] = forms.CharField(
 | 
			
		||||
                max_length=255,
 | 
			
		||||
@@ -280,6 +281,7 @@ class OrderView(LoginRequiredMixin, FormView, DetailView):
 | 
			
		||||
                label=_("gift").capitalize(),
 | 
			
		||||
                initial=0,
 | 
			
		||||
                widget=AmountInput(),
 | 
			
		||||
                help_text=_("Be careful: this gift will be multiplied for each order."),
 | 
			
		||||
            )
 | 
			
		||||
            form.fields[f'food_{food.id}_remark'] = forms.CharField(
 | 
			
		||||
                max_length=255,
 | 
			
		||||
@@ -406,3 +408,37 @@ class OrderView(LoginRequiredMixin, FormView, DetailView):
 | 
			
		||||
 | 
			
		||||
    def get_success_url(self):
 | 
			
		||||
        return reverse_lazy('sheets:sheet_detail', args=(self.kwargs['pk'],))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class WaitingListView(ProtectQuerysetMixin, DetailView):
 | 
			
		||||
    model = Food
 | 
			
		||||
    template_name = 'sheets/waiting_list.html'
 | 
			
		||||
    extra_context = {'title': _("Waiting list")}
 | 
			
		||||
 | 
			
		||||
    def get_context_data(self, **kwargs):
 | 
			
		||||
        content = super().get_context_data(**kwargs)
 | 
			
		||||
 | 
			
		||||
        content['queue'] = OrderedFood.objects.filter(food_id=self.kwargs['pk'], status='QUEUED')\
 | 
			
		||||
            .order_by('-priority', 'number', 'order__date').all()
 | 
			
		||||
        content['ready'] = OrderedFood.objects.filter(food_id=self.kwargs['pk'], status='READY')\
 | 
			
		||||
            .order_by('served_date').all()
 | 
			
		||||
 | 
			
		||||
        return content
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class WaitingListDetailView(ProtectQuerysetMixin, DetailView):
 | 
			
		||||
    model = Food
 | 
			
		||||
    template_name = 'sheets/waiting_list_detail.html'
 | 
			
		||||
 | 
			
		||||
    def get_context_data(self, **kwargs):
 | 
			
		||||
        context = super().get_context_data(**kwargs)
 | 
			
		||||
 | 
			
		||||
        list_type = 'CANCELED' if 'canceled' in self.request.path else \
 | 
			
		||||
            'SERVED' if 'served' in self.request.path else \
 | 
			
		||||
            'READY' if 'ready' in self.request.path else 'QUEUED'
 | 
			
		||||
        context['list_type'] = list_type
 | 
			
		||||
        context['orders'] = OrderedFood.objects.filter(food_id=self.kwargs['pk'], status=list_type)\
 | 
			
		||||
            .order_by('served_date', '-priority', 'number', 'order__date').all()
 | 
			
		||||
        context['title'] = self.object.name + " - " + _(list_type.lower()).capitalize()
 | 
			
		||||
 | 
			
		||||
        return context
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user