views.py 14 KB

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