views.py 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. from django.shortcuts import render, redirect, get_object_or_404
  2. from .forms import MultipleShiftForm, ShiftForm, EventForm, HelperForm, ReinigungForm
  3. from .models import Shift, Employee, Location, Event, Helper, Reinigung
  4. from django.utils.timezone import datetime, timedelta
  5. from django.utils import timezone
  6. from django.contrib.auth.decorators import user_passes_test
  7. import calendar
  8. def create_multiple_shifts(request):
  9. date_str = request.GET.get('date')
  10. initial_data = {}
  11. if date_str:
  12. initial_data['date'] = date_str
  13. if request.method == 'POST':
  14. form = MultipleShiftForm(request.POST)
  15. if form.is_valid():
  16. employees = form.cleaned_data['employees']
  17. date = form.cleaned_data['date']
  18. start = form.cleaned_data['start']
  19. end = form.cleaned_data['end']
  20. shifttype = form.cleaned_data['shifttype']
  21. info = form.cleaned_data['info']
  22. for employee in employees:
  23. Shift.objects.create(
  24. employee=employee,
  25. date=date,
  26. start=start,
  27. end=end,
  28. shifttype=shifttype,
  29. info=info
  30. )
  31. return redirect('public') # Annahme, dass Sie eine Erfolgsmeldung anzeigen möchten
  32. else:
  33. form = MultipleShiftForm(initial=initial_data)
  34. return render(request, 'main/create_multiple_shifts.html', {'form': form})
  35. def create_event(request):
  36. date_str = request.GET.get('date')
  37. initial_data = {}
  38. if date_str:
  39. initial_data['date'] = date_str
  40. if request.method == 'POST':
  41. form = EventForm(request.POST)
  42. if form.is_valid():
  43. name = form.cleaned_data['name']
  44. date = form.cleaned_data['date']
  45. event_type = form.cleaned_data['event_type']
  46. location = form.cleaned_data['location']
  47. belegung = form.cleaned_data['belegung']
  48. pax = form.cleaned_data['pax']
  49. cvd = form.cleaned_data['cvd']
  50. cvt = form.cleaned_data['cvt']
  51. Event.objects.create(
  52. name=name,
  53. date=date,
  54. event_type=event_type,
  55. location=location,
  56. belegung=belegung,
  57. pax = pax,
  58. cvd=cvd,
  59. cvt=cvt
  60. )
  61. return redirect('public') # Annahme, dass Sie eine Erfolgsmeldung anzeigen möchten
  62. else:
  63. form = EventForm(initial=initial_data)
  64. return render(request, 'main/create_event.html', {'form': form})
  65. # Test function to check if the user is an admin
  66. def is_admin(user):
  67. return user.is_authenticated and user.is_staff
  68. def public(request):
  69. # Standardmäßig die aktuelle Woche anzeigen
  70. today = timezone.now().date()
  71. # Überprüfen, ob ein Startdatum in der URL angegeben ist
  72. start_date_str = request.GET.get('start_date')
  73. if start_date_str:
  74. try:
  75. start_of_week = datetime.strptime(start_date_str, '%Y-%m-%d').date()
  76. except ValueError:
  77. start_of_week = today - timedelta(days=today.weekday()) # Fallback auf die aktuelle Woche bei Fehler
  78. else:
  79. start_of_week = today - timedelta(days=today.weekday()) # Montag der aktuellen Woche
  80. end_of_week = start_of_week + timedelta(days=6) # Sonntag der aktuellen Woche
  81. # Berechnung für die nächste und vorherige Woche
  82. previous_week = start_of_week - timedelta(days=7)
  83. next_week = start_of_week + timedelta(days=7)
  84. # Berechnung der Kalenderwoche
  85. calendar_week = start_of_week.isocalendar()[1]
  86. # Initialisiere ein Dictionary für die Schichten der Mitarbeiter
  87. shifts_by_employee = {}
  88. events_by_location = {}
  89. helpers_by_date = {}
  90. employees = Employee.objects.all()
  91. locations = Location.objects.all()
  92. helpers = Helper.objects.all()
  93. for employee in employees:
  94. shifts_by_employee[employee] = {day: None for day in range(7)}
  95. for location in locations:
  96. events_by_location[location] = {day: None for day in range(7)}
  97. for helper in helpers:
  98. helpers_by_date = {day: None for day in range(7)}
  99. # Hole alle Schichten für die aktuelle Woche
  100. shifts = Shift.objects.filter(date__range=[start_of_week, end_of_week])
  101. events = Event.objects.filter(date__range=[start_of_week, end_of_week])
  102. helpers = Helper.objects.filter(date__range=[start_of_week, end_of_week])
  103. # Fülle das Dictionary mit den Schichtdaten
  104. for shift in shifts:
  105. employee = shift.employee
  106. day_of_week = (shift.date - start_of_week).days
  107. shifts_by_employee[employee][day_of_week] = shift
  108. for event in events:
  109. location = event.location
  110. day_of_week = (event.date - start_of_week).days
  111. events_by_location[location][day_of_week] = event
  112. for helper in helpers:
  113. day_of_week = (helper.date - start_of_week).days
  114. helpers_by_date[day_of_week] = helper
  115. # Bereite die Daten der Woche für das Template vor
  116. week_dates = [(start_of_week + timedelta(days=i)).strftime("%d.%m.%Y") for i in range(7)]
  117. days_of_week = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So']
  118. days_with_dates = list(zip(days_of_week, week_dates))
  119. context = {
  120. 'shifts_by_employee': shifts_by_employee,
  121. 'events_by_location': events_by_location,
  122. 'helpers_by_date': helpers_by_date,
  123. 'start_of_week': start_of_week,
  124. 'end_of_week': end_of_week,
  125. 'days_with_dates': days_with_dates,
  126. 'range_days': range(7),
  127. 'previous_week': previous_week.strftime('%Y-%m-%d'),
  128. 'next_week': next_week.strftime('%Y-%m-%d'),
  129. 'calendar_week': calendar_week,
  130. }
  131. return render(request, 'main/public.html', context)
  132. def create_reinigung(request):
  133. date_str = request.GET.get('date')
  134. initial_data = {}
  135. if date_str:
  136. initial_data['date'] = date_str
  137. if request.method == 'POST':
  138. form = ReinigungForm(request.POST)
  139. if form.is_valid():
  140. form.save()
  141. return redirect('public') # Redirect to a relevant page after saving
  142. else:
  143. form = ReinigungForm()
  144. return render(request, 'main/create_reinigung.html', {'form': form})
  145. def create_helper(request):
  146. date_str = request.GET.get('date')
  147. initial_data = {}
  148. if date_str:
  149. initial_data['date'] = date_str
  150. if request.method == 'POST':
  151. form = HelperForm(request.POST)
  152. if form.is_valid():
  153. form.save()
  154. return redirect('public') # Redirect to a relevant page after saving
  155. else:
  156. form = HelperForm()
  157. return render(request, 'main/create_helper.html', {'form': form})
  158. def edit_reinigung(request, pk):
  159. reinigung = get_object_or_404(Reinigung, pk=pk)
  160. if request.method == 'POST':
  161. form = ReinigungForm(request.POST, instance=reinigung)
  162. if form.is_valid():
  163. form.save()
  164. return redirect('public')
  165. else:
  166. form = ReinigungForm(instance=reinigung)
  167. return render(request, 'main/edit_reinigung.html', {'form': form, 'reinigung': reinigung})
  168. def edit_helper(request, pk):
  169. helper = get_object_or_404(Helper, pk=pk)
  170. if request.method == 'POST':
  171. form = HelperForm(request.POST, instance=helper)
  172. if form.is_valid():
  173. form.save()
  174. return redirect('public')
  175. else:
  176. form = HelperForm(instance=helper)
  177. return render(request, 'main/edit_helper.html', {'form': form, 'helper': helper})
  178. def edit_shift(request, pk):
  179. shift = get_object_or_404(Shift, pk=pk)
  180. if request.method == 'POST':
  181. form = ShiftForm(request.POST, instance=shift)
  182. if form.is_valid():
  183. form.save()
  184. return redirect('public')
  185. else:
  186. form = ShiftForm(instance=shift)
  187. return render(request, 'main/edit_shift.html', {'form': form, 'shift': shift})
  188. def edit_event(request, pk):
  189. event = get_object_or_404(Event, pk=pk)
  190. if request.method == 'POST':
  191. form = EventForm(request.POST, instance=event)
  192. if form.is_valid():
  193. form.save()
  194. return redirect('public')
  195. else:
  196. form = EventForm(instance=event)
  197. return render(request, 'main/edit_event.html', {'form': form, 'event': event})
  198. def delete_shift(request, pk):
  199. shift = get_object_or_404(Shift, pk=pk)
  200. if request.method == 'POST':
  201. shift.delete()
  202. return redirect('public')
  203. return render(request, 'main/delete_shift.html', {'shift': shift})
  204. def delete_reinigung(request, pk):
  205. reinigung = get_object_or_404(Reinigung, pk=pk)
  206. if request.method == 'POST':
  207. reinigung.delete()
  208. return redirect('public')
  209. return render(request, 'main/delete_reinigung.html', {'reinigung': reinigung})
  210. def delete_helper(request, pk):
  211. helper = get_object_or_404(Helper, pk=pk)
  212. if request.method == 'POST':
  213. helper.delete()
  214. return redirect('public')
  215. return render(request, 'main/delete_helper.html', {'helper': helper})
  216. def delete_event(request, pk):
  217. event = get_object_or_404(Event, pk=pk)
  218. if request.method == 'POST':
  219. event.delete()
  220. return redirect('public')
  221. return render(request, 'main/delete_event.html', {'event': event})