views.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  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('current_week_shifts') # 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. cvd = form.cleaned_data['cvd']
  48. cvt = form.cleaned_data['cvt']
  49. Event.objects.create(
  50. name=name,
  51. date=date,
  52. event_type=event_type,
  53. location=location,
  54. cvd=cvd,
  55. cvt=cvt
  56. )
  57. return redirect('current_week_shifts') # Annahme, dass Sie eine Erfolgsmeldung anzeigen möchten
  58. else:
  59. form = EventForm(initial=initial_data)
  60. return render(request, 'main/create_event.html', {'form': form})
  61. # Test function to check if the user is an admin
  62. def is_admin(user):
  63. return user.is_authenticated and user.is_staff
  64. @user_passes_test(is_admin, login_url='/public')
  65. def current_week_shifts(request):
  66. # Standardmäßig die aktuelle Woche anzeigen
  67. today = timezone.now().date()
  68. # Überprüfen, ob ein Startdatum in der URL angegeben ist
  69. start_date_str = request.GET.get('start_date')
  70. if start_date_str:
  71. try:
  72. start_of_week = datetime.strptime(start_date_str, '%Y-%m-%d').date()
  73. except ValueError:
  74. start_of_week = today - timedelta(days=today.weekday()) # Fallback auf die aktuelle Woche bei Fehler
  75. else:
  76. start_of_week = today - timedelta(days=today.weekday()) # Montag der aktuellen Woche
  77. end_of_week = start_of_week + timedelta(days=6) # Sonntag der aktuellen Woche
  78. # Berechnung für die nächste und vorherige Woche
  79. previous_week = start_of_week - timedelta(days=7)
  80. next_week = start_of_week + timedelta(days=7)
  81. # Berechnung der Kalenderwoche
  82. calendar_week = start_of_week.isocalendar()[1]
  83. # Initialisiere ein Dictionary für die Schichten der Mitarbeiter
  84. shifts_by_employee = {}
  85. events_by_location = {}
  86. helpers_by_date = {}
  87. reinigungs_by_date = {}
  88. employees = Employee.objects.all()
  89. locations = Location.objects.all()
  90. helpers = Helper.objects.all()
  91. reinigungs = Reinigung.objects.all()
  92. for employee in employees:
  93. shifts_by_employee[employee] = {day: None for day in range(7)}
  94. for location in locations:
  95. events_by_location[location] = {day: None for day in range(7)}
  96. for helper in helpers:
  97. helpers_by_date = {day: None for day in range(7)}
  98. for reinigung in reinigungs:
  99. reinigungs_by_date = {day: None for day in range(7)}
  100. # Hole alle Schichten für die aktuelle Woche
  101. shifts = Shift.objects.filter(date__range=[start_of_week, end_of_week])
  102. events = Event.objects.filter(date__range=[start_of_week, end_of_week])
  103. helpers = Helper.objects.filter(date__range=[start_of_week, end_of_week])
  104. reinigungs = Reinigung.objects.filter(date__range=[start_of_week, end_of_week])
  105. # Fülle das Dictionary mit den Schichtdaten
  106. for shift in shifts:
  107. employee = shift.employee
  108. day_of_week = (shift.date - start_of_week).days
  109. shifts_by_employee[employee][day_of_week] = shift
  110. for event in events:
  111. location = event.location
  112. day_of_week = (event.date - start_of_week).days
  113. events_by_location[location][day_of_week] = event
  114. for helper in helpers:
  115. day_of_week = (helper.date - start_of_week).days
  116. helpers_by_date[day_of_week] = helper
  117. for reinigung in reinigungs:
  118. day_of_week = (reinigung.date - start_of_week).days
  119. reinigungs_by_date[day_of_week] = reinigung
  120. # Bereite die Daten der Woche für das Template vor
  121. week_dates = [(start_of_week + timedelta(days=i)).strftime("%d.%m.%Y") for i in range(7)]
  122. days_of_week = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So']
  123. days_with_dates = list(zip(days_of_week, week_dates))
  124. context = {
  125. 'shifts_by_employee': shifts_by_employee,
  126. 'events_by_location': events_by_location,
  127. 'helpers_by_date': helpers_by_date,
  128. 'reinigungs_by_date': reinigungs_by_date,
  129. 'start_of_week': start_of_week,
  130. 'end_of_week': end_of_week,
  131. 'days_with_dates': days_with_dates,
  132. 'range_days': range(7),
  133. 'previous_week': previous_week.strftime('%Y-%m-%d'),
  134. 'next_week': next_week.strftime('%Y-%m-%d'),
  135. 'calendar_week': calendar_week,
  136. }
  137. #print(shifts_by_employee)
  138. print(events_by_location)
  139. print(helpers_by_date)
  140. print(reinigungs_by_date)
  141. return render(request, 'main/current_week_shifts.html', context)
  142. def public(request):
  143. # Standardmäßig die aktuelle Woche anzeigen
  144. today = timezone.now().date()
  145. # Überprüfen, ob ein Startdatum in der URL angegeben ist
  146. start_date_str = request.GET.get('start_date')
  147. if start_date_str:
  148. try:
  149. start_of_week = datetime.strptime(start_date_str, '%Y-%m-%d').date()
  150. except ValueError:
  151. start_of_week = today - timedelta(days=today.weekday()) # Fallback auf die aktuelle Woche bei Fehler
  152. else:
  153. start_of_week = today - timedelta(days=today.weekday()) # Montag der aktuellen Woche
  154. end_of_week = start_of_week + timedelta(days=6) # Sonntag der aktuellen Woche
  155. # Berechnung für die nächste und vorherige Woche
  156. previous_week = start_of_week - timedelta(days=7)
  157. next_week = start_of_week + timedelta(days=7)
  158. # Berechnung der Kalenderwoche
  159. calendar_week = start_of_week.isocalendar()[1]
  160. # Initialisiere ein Dictionary für die Schichten der Mitarbeiter
  161. shifts_by_employee = {}
  162. events_by_location = {}
  163. helpers_by_date = {}
  164. employees = Employee.objects.all()
  165. locations = Location.objects.all()
  166. helpers = Helper.objects.all()
  167. for employee in employees:
  168. shifts_by_employee[employee] = {day: None for day in range(7)}
  169. for location in locations:
  170. events_by_location[location] = {day: None for day in range(7)}
  171. for helper in helpers:
  172. helpers_by_date = {day: None for day in range(7)}
  173. # Hole alle Schichten für die aktuelle Woche
  174. shifts = Shift.objects.filter(date__range=[start_of_week, end_of_week])
  175. events = Event.objects.filter(date__range=[start_of_week, end_of_week])
  176. helpers = Helper.objects.filter(date__range=[start_of_week, end_of_week])
  177. # Fülle das Dictionary mit den Schichtdaten
  178. for shift in shifts:
  179. employee = shift.employee
  180. day_of_week = (shift.date - start_of_week).days
  181. shifts_by_employee[employee][day_of_week] = shift
  182. for event in events:
  183. location = event.location
  184. day_of_week = (event.date - start_of_week).days
  185. events_by_location[location][day_of_week] = event
  186. for helper in helpers:
  187. day_of_week = (helper.date - start_of_week).days
  188. helpers_by_date[day_of_week] = helper
  189. # Bereite die Daten der Woche für das Template vor
  190. week_dates = [(start_of_week + timedelta(days=i)).strftime("%d.%m.%Y") for i in range(7)]
  191. days_of_week = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So']
  192. days_with_dates = list(zip(days_of_week, week_dates))
  193. context = {
  194. 'shifts_by_employee': shifts_by_employee,
  195. 'events_by_location': events_by_location,
  196. 'helpers_by_date': helpers_by_date,
  197. 'start_of_week': start_of_week,
  198. 'end_of_week': end_of_week,
  199. 'days_with_dates': days_with_dates,
  200. 'range_days': range(7),
  201. 'previous_week': previous_week.strftime('%Y-%m-%d'),
  202. 'next_week': next_week.strftime('%Y-%m-%d'),
  203. 'calendar_week': calendar_week,
  204. }
  205. return render(request, 'main/public.html', context)
  206. def create_reinigung(request):
  207. date_str = request.GET.get('date')
  208. initial_data = {}
  209. if date_str:
  210. initial_data['date'] = date_str
  211. if request.method == 'POST':
  212. form = ReinigungForm(request.POST)
  213. if form.is_valid():
  214. form.save()
  215. return redirect('current_week_shifts') # Redirect to a relevant page after saving
  216. else:
  217. form = ReinigungForm()
  218. return render(request, 'main/create_reinigung.html', {'form': form})
  219. def create_helper(request):
  220. date_str = request.GET.get('date')
  221. initial_data = {}
  222. if date_str:
  223. initial_data['date'] = date_str
  224. if request.method == 'POST':
  225. form = HelperForm(request.POST)
  226. if form.is_valid():
  227. form.save()
  228. return redirect('current_week_shifts') # Redirect to a relevant page after saving
  229. else:
  230. form = HelperForm()
  231. return render(request, 'main/create_helper.html', {'form': form})
  232. def edit_reinigung(request, pk):
  233. reinigung = get_object_or_404(Reinigung, pk=pk)
  234. if request.method == 'POST':
  235. form = ReinigungForm(request.POST, instance=reinigung)
  236. if form.is_valid():
  237. form.save()
  238. return redirect('current_week_shifts')
  239. else:
  240. form = ReinigungForm(instance=reinigung)
  241. return render(request, 'main/edit_reinigung.html', {'form': form, 'reinigung': reinigung})
  242. def edit_helper(request, pk):
  243. helper = get_object_or_404(Helper, pk=pk)
  244. if request.method == 'POST':
  245. form = HelperForm(request.POST, instance=helper)
  246. if form.is_valid():
  247. form.save()
  248. return redirect('current_week_shifts')
  249. else:
  250. form = HelperForm(instance=helper)
  251. return render(request, 'main/edit_helper.html', {'form': form, 'helper': helper})
  252. def edit_shift(request, pk):
  253. shift = get_object_or_404(Shift, pk=pk)
  254. if request.method == 'POST':
  255. form = ShiftForm(request.POST, instance=shift)
  256. if form.is_valid():
  257. form.save()
  258. return redirect('current_week_shifts')
  259. else:
  260. form = ShiftForm(instance=shift)
  261. return render(request, 'main/edit_shift.html', {'form': form, 'shift': shift})
  262. def edit_event(request, pk):
  263. event = get_object_or_404(Event, pk=pk)
  264. if request.method == 'POST':
  265. form = EventForm(request.POST, instance=event)
  266. if form.is_valid():
  267. form.save()
  268. return redirect('current_week_shifts')
  269. else:
  270. form = EventForm(instance=event)
  271. return render(request, 'main/edit_event.html', {'form': form, 'event': event})
  272. def delete_shift(request, pk):
  273. shift = get_object_or_404(Shift, pk=pk)
  274. if request.method == 'POST':
  275. shift.delete()
  276. return redirect('current_week_shifts')
  277. return render(request, 'main/delete_shift.html', {'shift': shift})
  278. def delete_reinigung(request, pk):
  279. reinigung = get_object_or_404(Reinigung, pk=pk)
  280. if request.method == 'POST':
  281. reinigung.delete()
  282. return redirect('current_week_shifts')
  283. return render(request, 'main/delete_reinigung.html', {'reinigung': reinigung})
  284. def delete_helper(request, pk):
  285. helper = get_object_or_404(Helper, pk=pk)
  286. if request.method == 'POST':
  287. helper.delete()
  288. return redirect('current_week_shifts')
  289. return render(request, 'main/delete_helper.html', {'helper': helper})
  290. def delete_event(request, pk):
  291. event = get_object_or_404(Event, pk=pk)
  292. if request.method == 'POST':
  293. event.delete()
  294. return redirect('current_week_shifts')
  295. return render(request, 'main/delete_event.html', {'event': event})