mirror of
https://github.com/ae-utbm/sith.git
synced 2024-12-23 08:11:19 +00:00
redirect directly on counter if user is barman
This commit is contained in:
parent
26c94c9ec6
commit
31e8ad8a3e
@ -65,20 +65,26 @@
|
|||||||
<div id="header_bar">
|
<div id="header_bar">
|
||||||
<ul id="header_bars_infos">
|
<ul id="header_bars_infos">
|
||||||
{% cache 100 "counters_activity" %}
|
{% cache 100 "counters_activity" %}
|
||||||
{% for bar in Counter.objects.filter(type="BAR").all() %}
|
{% for bar in Counter.objects.annotate_has_barman(user).filter(type="BAR") %}
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ url('counter:activity', counter_id=bar.id) }}" style="padding: 0px">
|
{# If the user is a barman, we redirect him directly to the barman page
|
||||||
{% if bar.is_inactive(): %}
|
else we redirect him to the activity page #}
|
||||||
<i class="fa fa-question" style="color: #f39c12"></i>
|
{% if bar.has_annotated_barman %}
|
||||||
{% elif bar.is_open(): %}
|
<a href="{{ url('counter:details', counter_id=bar.id) }}" style="padding: 0">
|
||||||
<i class="fa fa-check" style="color: #2ecc71"></i>
|
{% else %}
|
||||||
{% else %}
|
<a href="{{ url('counter:activity', counter_id=bar.id) }}" style="padding: 0">
|
||||||
<i class="fa fa-times" style="color: #eb2f06"></i>
|
{% endif %}
|
||||||
{% endif %}
|
{% if bar.is_inactive(): %}
|
||||||
{{ bar }}
|
<i class="fa fa-question" style="color: #f39c12"></i>
|
||||||
</a>
|
{% elif bar.is_open(): %}
|
||||||
</li>
|
<i class="fa fa-check" style="color: #2ecc71"></i>
|
||||||
{% endfor %}
|
{% else %}
|
||||||
|
<i class="fa fa-times" style="color: #eb2f06"></i>
|
||||||
|
{% endif %}
|
||||||
|
{{ bar }}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
{% endcache %}
|
{% endcache %}
|
||||||
<form action="{{ url('core:search') }}" method="GET" id="header_search">
|
<form action="{{ url('core:search') }}" method="GET" id="header_search">
|
||||||
|
@ -22,7 +22,9 @@
|
|||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.db.models import OuterRef, Exists, QuerySet
|
||||||
from django.db.models.functions import Length
|
from django.db.models.functions import Length
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
@ -309,6 +311,32 @@ class Product(models.Model):
|
|||||||
return "%s (%s)" % (self.name, self.code)
|
return "%s (%s)" % (self.name, self.code)
|
||||||
|
|
||||||
|
|
||||||
|
class CounterQuerySet(models.QuerySet):
|
||||||
|
def annotate_has_barman(self, user: User) -> CounterQuerySet:
|
||||||
|
"""
|
||||||
|
Annotate the queryset with the `user_is_barman` field.
|
||||||
|
For each counter, this field has value True if the user
|
||||||
|
is a barman of this counter, else False.
|
||||||
|
|
||||||
|
:param user: the user we want to check if he is a barman
|
||||||
|
|
||||||
|
Example::
|
||||||
|
|
||||||
|
sli = User.objects.get(username="sli")
|
||||||
|
counters = (
|
||||||
|
Counter.objects
|
||||||
|
.annotate_has_barman(sli) # add the user_has_barman boolean field
|
||||||
|
.filter(has_annotated_barman=True) # keep only counters where this user is barman
|
||||||
|
)
|
||||||
|
print("Sli est barman dans les comptoirs suivants :")
|
||||||
|
for counter in counters:
|
||||||
|
print(f"- {counter.name}")
|
||||||
|
"""
|
||||||
|
subquery = user.counters.filter(pk=OuterRef("pk"))
|
||||||
|
# noinspection PyTypeChecker
|
||||||
|
return self.annotate(has_annotated_barman=Exists(subquery))
|
||||||
|
|
||||||
|
|
||||||
class Counter(models.Model):
|
class Counter(models.Model):
|
||||||
name = models.CharField(_("name"), max_length=30)
|
name = models.CharField(_("name"), max_length=30)
|
||||||
club = models.ForeignKey(
|
club = models.ForeignKey(
|
||||||
@ -333,6 +361,8 @@ class Counter(models.Model):
|
|||||||
)
|
)
|
||||||
token = models.CharField(_("token"), max_length=30, null=True, blank=True)
|
token = models.CharField(_("token"), max_length=30, null=True, blank=True)
|
||||||
|
|
||||||
|
objects = CounterQuerySet.as_manager()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = _("counter")
|
verbose_name = _("counter")
|
||||||
|
|
||||||
|
@ -138,6 +138,20 @@ class CounterTest(TestCase):
|
|||||||
)
|
)
|
||||||
self.assertTrue(response.status_code == 200)
|
self.assertTrue(response.status_code == 200)
|
||||||
|
|
||||||
|
def test_annotate_has_barman_queryset(self):
|
||||||
|
"""
|
||||||
|
Test if the custom queryset method ``annotate_has_barman``
|
||||||
|
works as intended
|
||||||
|
"""
|
||||||
|
self.sli.counters.clear()
|
||||||
|
self.sli.counters.add(self.foyer, self.mde)
|
||||||
|
counters = Counter.objects.annotate_has_barman(self.sli)
|
||||||
|
for counter in counters:
|
||||||
|
if counter.name in ("Foyer", "MDE"):
|
||||||
|
self.assertTrue(counter.has_annotated_barman)
|
||||||
|
else:
|
||||||
|
self.assertFalse(counter.has_annotated_barman)
|
||||||
|
|
||||||
|
|
||||||
class CounterStatsTest(TestCase):
|
class CounterStatsTest(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
Loading…
Reference in New Issue
Block a user