views.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. from django.shortcuts import render, redirect, get_object_or_404
  2. from .forms import MultipleShiftForm, ShiftForm
  3. from .models import Shift, Employee
  4. from django.utils.timezone import datetime, timedelta
  5. from django.utils import timezone
  6. import calendar
  7. def create_multiple_shifts(request):
  8. date_str = request.GET.get('date')
  9. initial_data = {}
  10. if date_str:
  11. initial_data['date'] = date_str
  12. if request.method == 'POST':
  13. form = MultipleShiftForm(request.POST)
  14. if form.is_valid():
  15. employees = form.cleaned_data['employees']
  16. date = form.cleaned_data['date']
  17. start = form.cleaned_data['start']
  18. end = form.cleaned_data['end']
  19. shifttype = form.cleaned_data['shifttype']
  20. for employee in employees:
  21. Shift.objects.create(
  22. employee=employee,
  23. date=date,
  24. start=start,
  25. end=end,
  26. shifttype=shifttype
  27. )
  28. return redirect('current_week_shifts') # Annahme, dass Sie eine Erfolgsmeldung anzeigen möchten
  29. else:
  30. form = MultipleShiftForm(initial=initial_data)
  31. return render(request, 'main/create_multiple_shifts.html', {'form': form})
  32. def current_week_shifts(request):
  33. # Standardmäßig die aktuelle Woche anzeigen
  34. today = timezone.now().date()
  35. # Überprüfen, ob ein Startdatum in der URL angegeben ist
  36. start_date_str = request.GET.get('start_date')
  37. if start_date_str:
  38. try:
  39. start_of_week = datetime.strptime(start_date_str, '%Y-%m-%d').date()
  40. except ValueError:
  41. start_of_week = today - timedelta(days=today.weekday()) # Fallback auf die aktuelle Woche bei Fehler
  42. else:
  43. start_of_week = today - timedelta(days=today.weekday()) # Montag der aktuellen Woche
  44. end_of_week = start_of_week + timedelta(days=6) # Sonntag der aktuellen Woche
  45. # Berechnung für die nächste und vorherige Woche
  46. previous_week = start_of_week - timedelta(days=7)
  47. next_week = start_of_week + timedelta(days=7)
  48. # Berechnung der Kalenderwoche
  49. calendar_week = start_of_week.isocalendar()[1]
  50. # Initialisiere ein Dictionary für die Schichten der Mitarbeiter
  51. shifts_by_employee = {}
  52. employees = Employee.objects.all()
  53. for employee in employees:
  54. shifts_by_employee[employee] = {day: None for day in range(7)}
  55. # Hole alle Schichten für die aktuelle Woche
  56. shifts = Shift.objects.filter(date__range=[start_of_week, end_of_week])
  57. # Fülle das Dictionary mit den Schichtdaten
  58. for shift in shifts:
  59. employee = shift.employee
  60. day_of_week = (shift.date - start_of_week).days
  61. shifts_by_employee[employee][day_of_week] = shift
  62. # Bereite die Daten der Woche für das Template vor
  63. week_dates = [(start_of_week + timedelta(days=i)).strftime("%d.%m.%Y") for i in range(7)]
  64. days_of_week = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So']
  65. days_with_dates = list(zip(days_of_week, week_dates))
  66. context = {
  67. 'shifts_by_employee': shifts_by_employee,
  68. 'start_of_week': start_of_week,
  69. 'end_of_week': end_of_week,
  70. 'days_with_dates': days_with_dates,
  71. 'range_days': range(7),
  72. 'previous_week': previous_week.strftime('%Y-%m-%d'),
  73. 'next_week': next_week.strftime('%Y-%m-%d'),
  74. 'calendar_week': calendar_week,
  75. }
  76. return render(request, 'main/current_week_shifts.html', context)
  77. def edit_shift(request, pk):
  78. shift = get_object_or_404(Shift, pk=pk)
  79. if request.method == 'POST':
  80. form = ShiftForm(request.POST, instance=shift)
  81. if form.is_valid():
  82. form.save()
  83. return redirect('current_week_shifts')
  84. else:
  85. form = ShiftForm(instance=shift)
  86. return render(request, 'main/edit_shift.html', {'form': form, 'shift': shift})
  87. def delete_shift(request, pk):
  88. shift = get_object_or_404(Shift, pk=pk)
  89. if request.method == 'POST':
  90. shift.delete()
  91. return redirect('current_week_shifts')
  92. return render(request, 'main/delete_shift.html', {'shift': shift})