views.py 14 KB

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