add current/next shift to menu
This commit is contained in:
parent
c8a4575c1b
commit
9601367f12
|
@ -3,6 +3,7 @@ import secrets
|
|||
from django.shortcuts import reverse
|
||||
from datetime import timedelta
|
||||
from django.utils import timezone
|
||||
from django.db.models import F, Count, Q, ExpressionWrapper
|
||||
|
||||
|
||||
class Room(models.Model):
|
||||
|
@ -22,6 +23,8 @@ class Shift(models.Model):
|
|||
return f"{self.room.name}: {self.start_at}"
|
||||
def has_ended(self):
|
||||
return (self.start_at + self.duration) < timezone.now()
|
||||
def is_running(self):
|
||||
return (self.start_at <=timezone.now()) and (not self.has_ended())
|
||||
|
||||
|
||||
class Helper(models.Model):
|
||||
|
@ -40,6 +43,17 @@ class Helper(models.Model):
|
|||
msg = Message(to=self, text=text)
|
||||
msg.save()
|
||||
return token
|
||||
|
||||
# current or next shift
|
||||
def important_shift(self):
|
||||
ret = ShiftRegistration.objects.annotate(
|
||||
shift_end=ExpressionWrapper(
|
||||
F("shift__start_at") + F("shift__duration"),
|
||||
output_field=models.DateTimeField(),
|
||||
)).filter(helper=self, shift_end__gte=timezone.now()).order_by("shift__start_at").first()
|
||||
if ret:
|
||||
return ret.shift
|
||||
|
||||
|
||||
|
||||
class ShiftRegistration(models.Model):
|
||||
|
|
|
@ -5,6 +5,20 @@
|
|||
{% block navbar %}
|
||||
{% if not helper%}
|
||||
<a class="navbar-item" href="{% url 'register' %}">Anmelden</a>
|
||||
{% else %}
|
||||
<a role="button" class="navbar-burger" aria-label="menu" aria-expanded="false" data-target="navbarfoo">
|
||||
<span aria-hidden="true"></span>
|
||||
<span aria-hidden="true"></span>
|
||||
<span aria-hidden="true"></span>
|
||||
</a>
|
||||
<div class="navbar-menu" id="navbarfoo">
|
||||
{% if not helper.number_validated %}
|
||||
<p class="navbar-item has-text-danger">Bestaige deien Telefonnummer ueber den Link in der SMS</p>
|
||||
{% endif %}
|
||||
{% if helper.important_shift %}
|
||||
<a class="navbar-item" href="{% url 'shift' helper.important_shift.pk %}">{%if helper.important_shift.is_running%}Laufende{% else %}Nächste{% endif %} Schicht</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
{% block content %}
|
||||
{% if current_shift %}
|
||||
<h2>Aktuelle Schicht</h2>
|
||||
{{ current_shift.shift.room.name }} {{ current_shift.shift.start_at }}<a href="{% url 'shift' current_shift.shift.id %}">Details</a>
|
||||
{{ current_shift.room.name }} {{ current_shift.start_at }}<a href="{% url 'shift' current_shift.id %}">Details</a>
|
||||
{% endif %}
|
||||
{% if my_shifts %}
|
||||
<h2>Meine Schichten</h2>
|
||||
|
|
|
@ -19,17 +19,11 @@ def index(request):
|
|||
context["my_shifts"] = request.helper.shiftregistration_set.filter(
|
||||
shift__start_at__gt=timezone.now()
|
||||
).order_by("shift__start_at")
|
||||
context["current_shift"] = (
|
||||
request.helper.shiftregistration_set.annotate(
|
||||
shift_end=ExpressionWrapper(
|
||||
F("shift__start_at") + F("shift__duration"),
|
||||
output_field=DateTimeField(),
|
||||
)
|
||||
)
|
||||
.filter(shift__start_at__lte=timezone.now(), shift_end__gte=timezone.now())
|
||||
.order_by("shift__start_at")
|
||||
.first()
|
||||
)
|
||||
|
||||
imp_shift = request.helper.important_shift()
|
||||
print(imp_shift)
|
||||
if imp_shift and imp_shift.is_running():
|
||||
context["current_shift"] = imp_shift
|
||||
|
||||
free_shifts = (
|
||||
Shift.objects.annotate(reg_count=Count("shiftregistration"))
|
||||
|
|
|
@ -21,6 +21,19 @@
|
|||
{% block body %}
|
||||
{% include 'notifications.html' %}
|
||||
{% endblock %}
|
||||
<script>document.querySelectorAll('.delete').forEach(btn => btn.addEventListener('click', event => event.target.parentElement.remove()));</script>
|
||||
<script>
|
||||
document.querySelectorAll('.delete').forEach(btn => btn.addEventListener('click', event => event.target.parentElement.remove()));
|
||||
const $navbarBurgers = Array.prototype.slice.call(document.querySelectorAll('.navbar-burger'), 0);
|
||||
if ($navbarBurgers.length > 0) {
|
||||
$navbarBurgers.forEach( el => {
|
||||
el.addEventListener('click', () => {
|
||||
const target = el.dataset.target;
|
||||
const $target = document.getElementById(target);
|
||||
el.classList.toggle('is-active');
|
||||
$target.classList.toggle('is-active');
|
||||
});
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
Loading…
Reference in New Issue