views.py 9.9 KB

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