views.py 9.6 KB

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