85 lines
2.8 KiB
Python
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
|