views.py 13 KB

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