show barmen logged on current device in counter

This commit is contained in:
imperosol
2026-05-30 12:35:26 +02:00
parent 222b0d16a7
commit 3cf142f3f1
3 changed files with 56 additions and 14 deletions
+17 -5
View File
@@ -9,6 +9,7 @@ from django import forms
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.db.models import Exists, OuterRef, Q from django.db.models import Exists, OuterRef, Q
from django.forms import BaseModelFormSet from django.forms import BaseModelFormSet
from django.http import HttpRequest
from django.utils.timezone import now from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django_celery_beat.models import ClockedSchedule from django_celery_beat.models import ClockedSchedule
@@ -131,9 +132,18 @@ class GetUserForm(forms.Form):
class CounterLoginForm(LoginForm): 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) super().__init__(*args, **kwargs)
self.counter = counter self.counter = counter
self.request = request
def confirm_login_allowed(self, user: User): def confirm_login_allowed(self, user: User):
super().confirm_login_allowed(user) super().confirm_login_allowed(user)
@@ -141,11 +151,13 @@ class CounterLoginForm(LoginForm):
raise ValidationError( raise ValidationError(
message=_("You are not a barman of this counter."), code="not_barman" message=_("You are not a barman of this counter."), code="not_barman"
) )
if user in self.counter.barmen_list: if user in self.request.barmen:
raise ValidationError( message = (
message=_("You are already logged in this counter."), _("You are already logged in this counter.")
code="not_logged_in", 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): class RefillForm(forms.ModelForm):
+26 -1
View File
@@ -44,10 +44,35 @@
{% endif %} {% endif %}
</div> </div>
{% if counter.type == 'BAR' %} {% if counter.type == 'BAR' %}
<h3>{% trans %}Barman: {% endtrans %}</h3> <h3>{% trans %}Barmen:{% endtrans %}</h3>
{% if barmen_here %}
<div class="row gap-2x">
<div>
<h4>{% trans %}On this device{% endtrans %}</h4>
{% for b in barmen_here %}
<p>{{ barman_logout_link(b) }}</p>
{% endfor %}
</div>
<div>
<h4>{% trans %}Elsewhere{% endtrans %}</h4>
{% if barmen_here|length == barmen|length %}
{# all logged barmen are logged in this session #}
<p><em>{% trans %}No barman logged elsewhere{% endtrans %}</em></p>
{% else %}
{% for b in barmen %}
{%- if b not in barmen_here -%}
<p>{{ barman_logout_link(b) }}</p>
{%- endif -%}
{% endfor %}
{% endif %}
</div>
</div>
{% else %}
{% for b in barmen %} {% for b in barmen %}
<p>{{ barman_logout_link(b) }}</p> <p>{{ barman_logout_link(b) }}</p>
{% endfor %} {% endfor %}
{% endif %}
{{ login_fragment }} {{ login_fragment }}
{% endif %} {% endif %}
{% endblock %} {% endblock %}
+10 -5
View File
@@ -46,9 +46,12 @@ class CounterLoginFragment(FragmentMixin, SingleObjectMixin, FormView):
return super().dispatch(request, *args, **kwargs) return super().dispatch(request, *args, **kwargs)
def get_form_kwargs(self): 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() user = form.get_user()
self.object.permanencies.create(user=user, start=timezone.now()) self.object.permanencies.create(user=user, start=timezone.now())
self.request.barmen.add(user) self.request.barmen.add(user)
@@ -82,7 +85,7 @@ class CounterMain(
"""The public (barman) view.""" """The public (barman) view."""
model = Counter model = Counter
queryset = Counter.objects.annotate_is_open().exclude(type="EBOUTIC") queryset = Counter.objects.exclude(type="EBOUTIC")
template_name = "counter/counter_main.jinja" template_name = "counter/counter_main.jinja"
pk_url_kwarg = "counter_id" pk_url_kwarg = "counter_id"
form_class = GetUserForm form_class = GetUserForm
@@ -111,9 +114,11 @@ class CounterMain(
kwargs = super().get_context_data(**kwargs) kwargs = super().get_context_data(**kwargs)
if self.object.type == "BAR": if self.object.type == "BAR":
kwargs["barmen"] = self.object.barmen_list kwargs["barmen"] = self.object.barmen_list
kwargs["barmen_here"] = list(
self.request.barmen.intersection(self.object.barmen_list)
)
kwargs["can_click"] = ( kwargs["can_click"] = (
self.object.type == "BAR" self.object.type == "BAR"
and self.object.is_open
and self.request.barmen and self.request.barmen
and self.request.barmen.issubset(set(self.object.barmen_list)) and self.request.barmen.issubset(set(self.object.barmen_list))
) or ( ) or (
@@ -132,7 +137,7 @@ class CounterMain(
) )
return kwargs 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.""" """We handle here the redirection, passing the user id of the asked customer."""
self.success_url = reverse( self.success_url = reverse(
"counter:click", "counter:click",