From 3cf142f3f19bc58ef82a0dc03c200b54799c74d6 Mon Sep 17 00:00:00 2001 From: imperosol Date: Sat, 30 May 2026 12:35:26 +0200 Subject: [PATCH] show barmen logged on current device in counter --- counter/forms.py | 22 ++++++++++--- counter/templates/counter/counter_main.jinja | 33 +++++++++++++++++--- counter/views/home.py | 15 ++++++--- 3 files changed, 56 insertions(+), 14 deletions(-) diff --git a/counter/forms.py b/counter/forms.py index 993e8885..6641a80e 100644 --- a/counter/forms.py +++ b/counter/forms.py @@ -9,6 +9,7 @@ from django import forms from django.core.exceptions import ValidationError from django.db.models import Exists, OuterRef, Q from django.forms import BaseModelFormSet +from django.http import HttpRequest from django.utils.timezone import now from django.utils.translation import gettext_lazy as _ from django_celery_beat.models import ClockedSchedule @@ -131,9 +132,18 @@ class GetUserForm(forms.Form): class CounterLoginForm(LoginForm): - def __init__(self, *args, counter: Counter, **kwargs): + """LoginForm to log a barman in a counter. + + To be able to log in a counter, a user must : + + - be part of the sellers of the given counter + - not being already logged in any counter + """ + + def __init__(self, *args, request: HttpRequest, counter: Counter, **kwargs): super().__init__(*args, **kwargs) self.counter = counter + self.request = request def confirm_login_allowed(self, user: User): super().confirm_login_allowed(user) @@ -141,11 +151,13 @@ class CounterLoginForm(LoginForm): raise ValidationError( message=_("You are not a barman of this counter."), code="not_barman" ) - if user in self.counter.barmen_list: - raise ValidationError( - message=_("You are already logged in this counter."), - code="not_logged_in", + if user in self.request.barmen: + message = ( + _("You are already logged in this counter.") + if user in self.counter.barmen_list + else _("You are already logged in another counter.") ) + raise ValidationError(message=message, code="already_logged_in") class RefillForm(forms.ModelForm): diff --git a/counter/templates/counter/counter_main.jinja b/counter/templates/counter/counter_main.jinja index 95fbb8e2..d4a14088 100644 --- a/counter/templates/counter/counter_main.jinja +++ b/counter/templates/counter/counter_main.jinja @@ -44,10 +44,35 @@ {% endif %} {% if counter.type == 'BAR' %} -

{% trans %}Barman: {% endtrans %}

- {% for b in barmen %} -

{{ barman_logout_link(b) }}

- {% endfor %} +

{% trans %}Barmen:{% endtrans %}

+ + {% if barmen_here %} +
+
+

{% trans %}On this device{% endtrans %}

+ {% for b in barmen_here %} +

{{ barman_logout_link(b) }}

+ {% endfor %} +
+
+

{% trans %}Elsewhere{% endtrans %}

+ {% if barmen_here|length == barmen|length %} + {# all logged barmen are logged in this session #} +

{% trans %}No barman logged elsewhere{% endtrans %}

+ {% else %} + {% for b in barmen %} + {%- if b not in barmen_here -%} +

{{ barman_logout_link(b) }}

+ {%- endif -%} + {% endfor %} + {% endif %} +
+
+ {% else %} + {% for b in barmen %} +

{{ barman_logout_link(b) }}

+ {% endfor %} + {% endif %} {{ login_fragment }} {% endif %} {% endblock %} diff --git a/counter/views/home.py b/counter/views/home.py index c89bd29f..8da84b66 100644 --- a/counter/views/home.py +++ b/counter/views/home.py @@ -46,9 +46,12 @@ class CounterLoginFragment(FragmentMixin, SingleObjectMixin, FormView): return super().dispatch(request, *args, **kwargs) def get_form_kwargs(self): - return super().get_form_kwargs() | {"counter": self.object} + return super().get_form_kwargs() | { + "request": self.request, + "counter": self.object, + } - def form_valid(self, form: CounterLoginForm): + def form_valid(self, form: GetUserForm): user = form.get_user() self.object.permanencies.create(user=user, start=timezone.now()) self.request.barmen.add(user) @@ -82,7 +85,7 @@ class CounterMain( """The public (barman) view.""" model = Counter - queryset = Counter.objects.annotate_is_open().exclude(type="EBOUTIC") + queryset = Counter.objects.exclude(type="EBOUTIC") template_name = "counter/counter_main.jinja" pk_url_kwarg = "counter_id" form_class = GetUserForm @@ -111,9 +114,11 @@ class CounterMain( kwargs = super().get_context_data(**kwargs) if self.object.type == "BAR": kwargs["barmen"] = self.object.barmen_list + kwargs["barmen_here"] = list( + self.request.barmen.intersection(self.object.barmen_list) + ) kwargs["can_click"] = ( self.object.type == "BAR" - and self.object.is_open and self.request.barmen and self.request.barmen.issubset(set(self.object.barmen_list)) ) or ( @@ -132,7 +137,7 @@ class CounterMain( ) return kwargs - def form_valid(self, form: CounterLoginForm): + def form_valid(self, form: GetUserForm): """We handle here the redirection, passing the user id of the asked customer.""" self.success_url = reverse( "counter:click",