shiftregister/shiftregister/fallback/views.py

85 lines
2.8 KiB
Python

from base64 import urlsafe_b64decode
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.db.models import Count, Q
from django.http import HttpResponse
from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse
from shiftregister.fallback.models import FallbackAssignment, TeamMember
# Create your views here.
def my_fallback_shifts(request, team_member_id):
try:
team_member_id = int.from_bytes(
urlsafe_b64decode(team_member_id), byteorder="big"
)
except Exception:
team_member_id = None
team_member = get_object_or_404(TeamMember, pk=team_member_id)
is_draw = False
if request.method == "POST":
if "draw_shifts" in request.POST:
team_member.assign_random_shifts()
is_draw = True
elif "take_shift" in request.POST:
assignment_id = request.POST.get("assignment_id")
try:
assignment = FallbackAssignment.objects.get(pk=assignment_id)
if assignment.team_member == team_member:
assignment.traded_to = None
messages.success(request, f"Schicht erfolgreich zurückgenommen")
elif assignment.traded_to == team_member:
assignment.traded_to = None
messages.success(request, f"Schicht erfolgreich zurückgegeben")
else:
assignment.traded_to = team_member
messages.success(request, f"Schicht erfolgreich übernommen")
assignment.save()
return redirect(
reverse(
"my_fallback_shifts",
kwargs={"team_member_id": team_member.url_id()},
)
)
except FallbackAssignment.DoesNotExist:
messages.error(request, "Ungültige Schicht-ID")
assignments = (
FallbackAssignment.objects.filter(
Q(team_member=team_member, traded_to__isnull=True)
| Q(traded_to=team_member)
)
.prefetch_related("shift", "traded_to", "team_member")
.order_by("shift__start_at")
)
context = {
"team_member": team_member,
"assignments": assignments,
"is_draw": is_draw,
}
return render(request, "my_fallback_shifts.html", context)
@login_required
def team_members(request):
response = HttpResponse(
"".join(
f"{member.name} {member.url()}\n"
for member in TeamMember.objects.annotate(
shift_count=Count("fallback_shifts")
)
.filter(fallback_shifts__gt=0)
.order_by("name", "id")
)
)
response.headers["Content-Type"] = "text/plain; charset=utf-8"
return response