|
|
@@ -1,9 +1,17 @@
|
|
|
-from django.shortcuts import render, redirect
|
|
|
-from .forms import MultipleShiftForm
|
|
|
+from django.shortcuts import render, redirect, get_object_or_404
|
|
|
+from .forms import MultipleShiftForm, ShiftForm
|
|
|
from .models import Shift, Employee
|
|
|
+from django.utils.timezone import datetime, timedelta
|
|
|
+from django.utils import timezone
|
|
|
+import calendar
|
|
|
|
|
|
|
|
|
def create_multiple_shifts(request):
|
|
|
+ date_str = request.GET.get('date')
|
|
|
+ initial_data = {}
|
|
|
+ if date_str:
|
|
|
+ initial_data['date'] = date_str
|
|
|
+
|
|
|
if request.method == 'POST':
|
|
|
form = MultipleShiftForm(request.POST)
|
|
|
if form.is_valid():
|
|
|
@@ -21,8 +29,83 @@ def create_multiple_shifts(request):
|
|
|
end=end,
|
|
|
shifttype=shifttype
|
|
|
)
|
|
|
- return redirect('shift_success') # Annahme, dass Sie eine Erfolgsmeldung anzeigen möchten
|
|
|
+ return redirect('current_week_shifts') # Annahme, dass Sie eine Erfolgsmeldung anzeigen möchten
|
|
|
else:
|
|
|
- form = MultipleShiftForm()
|
|
|
+ form = MultipleShiftForm(initial=initial_data)
|
|
|
|
|
|
return render(request, 'main/create_multiple_shifts.html', {'form': form})
|
|
|
+
|
|
|
+
|
|
|
+def current_week_shifts(request):
|
|
|
+ # Standardmäßig die aktuelle Woche anzeigen
|
|
|
+ today = timezone.now().date()
|
|
|
+
|
|
|
+ # Überprüfen, ob ein Startdatum in der URL angegeben ist
|
|
|
+ start_date_str = request.GET.get('start_date')
|
|
|
+ if start_date_str:
|
|
|
+ try:
|
|
|
+ start_of_week = datetime.strptime(start_date_str, '%Y-%m-%d').date()
|
|
|
+ except ValueError:
|
|
|
+ start_of_week = today - timedelta(days=today.weekday()) # Fallback auf die aktuelle Woche bei Fehler
|
|
|
+ else:
|
|
|
+ start_of_week = today - timedelta(days=today.weekday()) # Montag der aktuellen Woche
|
|
|
+
|
|
|
+ end_of_week = start_of_week + timedelta(days=6) # Sonntag der aktuellen Woche
|
|
|
+
|
|
|
+ # Berechnung für die nächste und vorherige Woche
|
|
|
+ previous_week = start_of_week - timedelta(days=7)
|
|
|
+ next_week = start_of_week + timedelta(days=7)
|
|
|
+
|
|
|
+ # Berechnung der Kalenderwoche
|
|
|
+ calendar_week = start_of_week.isocalendar()[1]
|
|
|
+
|
|
|
+ # Initialisiere ein Dictionary für die Schichten der Mitarbeiter
|
|
|
+ shifts_by_employee = {}
|
|
|
+ employees = Employee.objects.all()
|
|
|
+ for employee in employees:
|
|
|
+ shifts_by_employee[employee] = {day: None for day in range(7)}
|
|
|
+
|
|
|
+ # Hole alle Schichten für die aktuelle Woche
|
|
|
+ shifts = Shift.objects.filter(date__range=[start_of_week, end_of_week])
|
|
|
+
|
|
|
+ # Fülle das Dictionary mit den Schichtdaten
|
|
|
+ for shift in shifts:
|
|
|
+ employee = shift.employee
|
|
|
+ day_of_week = (shift.date - start_of_week).days
|
|
|
+ shifts_by_employee[employee][day_of_week] = shift
|
|
|
+
|
|
|
+ # Bereite die Daten der Woche für das Template vor
|
|
|
+ week_dates = [(start_of_week + timedelta(days=i)).strftime("%d.%m.%Y") for i in range(7)]
|
|
|
+ days_of_week = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So']
|
|
|
+ days_with_dates = list(zip(days_of_week, week_dates))
|
|
|
+
|
|
|
+ context = {
|
|
|
+ 'shifts_by_employee': shifts_by_employee,
|
|
|
+ 'start_of_week': start_of_week,
|
|
|
+ 'end_of_week': end_of_week,
|
|
|
+ 'days_with_dates': days_with_dates,
|
|
|
+ 'range_days': range(7),
|
|
|
+ 'previous_week': previous_week.strftime('%Y-%m-%d'),
|
|
|
+ 'next_week': next_week.strftime('%Y-%m-%d'),
|
|
|
+ 'calendar_week': calendar_week,
|
|
|
+ }
|
|
|
+
|
|
|
+ return render(request, 'main/current_week_shifts.html', context)
|
|
|
+
|
|
|
+def edit_shift(request, pk):
|
|
|
+ shift = get_object_or_404(Shift, pk=pk)
|
|
|
+ if request.method == 'POST':
|
|
|
+ form = ShiftForm(request.POST, instance=shift)
|
|
|
+ if form.is_valid():
|
|
|
+ form.save()
|
|
|
+ return redirect('current_week_shifts')
|
|
|
+ else:
|
|
|
+ form = ShiftForm(instance=shift)
|
|
|
+ return render(request, 'main/edit_shift.html', {'form': form, 'shift': shift})
|
|
|
+
|
|
|
+def delete_shift(request, pk):
|
|
|
+ shift = get_object_or_404(Shift, pk=pk)
|
|
|
+ if request.method == 'POST':
|
|
|
+ shift.delete()
|
|
|
+ return redirect('current_week_shifts')
|
|
|
+ return render(request, 'main/delete_shift.html', {'shift': shift})
|