summaryrefslogtreecommitdiff
path: root/web/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'web/views.py')
-rw-r--r--web/views.py137
1 files changed, 137 insertions, 0 deletions
diff --git a/web/views.py b/web/views.py
new file mode 100644
index 0000000..cc537c4
--- /dev/null
+++ b/web/views.py
@@ -0,0 +1,137 @@
+from django.shortcuts import render
+from web.models import Event, Availability
+from django.shortcuts import get_object_or_404, redirect
+from datetime import timedelta
+from django.contrib.auth.decorators import login_required
+
+
+@login_required()
+def index(request):
+ parsed_events = []
+
+ for active_event in Event.objects.filter(active=True).order_by('start_date'):
+ data = {
+ 'id': active_event.id,
+ 'name': active_event.name,
+ 'start_date': active_event.start_date,
+ 'end_date': active_event.end_date,
+ 'responses': ', '.join([x.user.username for x in active_event.availability_set.all()])
+ }
+
+ parsed_events.append(data)
+
+ context = {
+ 'events': parsed_events
+ }
+
+ return render(request, "index.html", context)
+
+
+@login_required()
+def event(request, event_id):
+
+ event = get_object_or_404(Event, pk=event_id)
+
+ if request.method == 'POST':
+ handle_availability_update(event, request)
+ return redirect('event', event_id=event_id)
+
+ elif request.method == 'GET':
+ day_count = (event.end_date - event.start_date).days + 1
+ morning = {}
+ noon = {}
+ night = {}
+ all_availabilities = {}
+ requesting_user_submitted = False
+
+ context = {
+ 'event': event,
+ 'morning': morning,
+ 'noon': noon,
+ 'night': night,
+ 'user_availability': None,
+ 'active_dates': None,
+ 'user_responses': 0,
+ 'best_days': {},
+ 'no_overlap_message': ''
+ }
+
+ user_availability = Availability.objects.filter(event_id=event)
+ if user_availability:
+ for user_avail in user_availability:
+ context['user_responses'] += 1
+
+ for time in user_avail.time_table.get('active', []):
+ if time not in all_availabilities:
+ all_availabilities[time] = []
+
+ all_availabilities[time].append(user_avail.user.username)
+
+ if request.user == user_avail.user:
+ requesting_user_submitted = True
+ context['active_dates'] = user_avail.time_table['active']
+
+ context['all_availabilities'] = all_availabilities
+
+ for i in range(day_count):
+ date = event.start_date + timedelta(days=i)
+
+ human_readable_date = date.strftime('%m/%d/%Y %A')
+ for idx, time_period_array in enumerate([morning, noon, night]):
+ date_id = date.strftime(f'%m/%d/%Y %A-{idx}')
+ users = ', '.join(all_availabilities.get(date_id, []))
+
+ if not requesting_user_submitted:
+ users = ''
+
+ time_period_array[human_readable_date] = (date_id, users)
+
+ if all_availabilities:
+ most_avail = None
+ for day in sorted(all_availabilities, key=lambda k: len(all_availabilities[k]), reverse=True):
+ if not most_avail:
+ most_avail = len(all_availabilities[day])
+
+ if len(all_availabilities[day]) >= most_avail - 1 and len(all_availabilities[day]) != 1:
+
+ day_arr = day.split('-')
+ if day_arr[-1] == '0':
+ hday = day_arr[0] + ' Morning'
+
+ if day_arr[-1] == '1':
+ hday = day_arr[0] + ' Noon'
+
+ if day_arr[-1] == '2':
+ hday = day_arr[0] + ' Night'
+
+ context['best_days'][hday] = ', '.join(all_availabilities[day])
+
+ if not requesting_user_submitted:
+ all_availabilities = {}
+
+ if context['best_days'] == {}:
+ context['no_overlap_message'] = 'There are currently no overlapping times or dates!'
+
+ return render(request, "event.html", context)
+
+def handle_availability_update(event, request):
+ availability_data = {
+ 'active': []
+ }
+
+ for date, value in request.POST.items():
+ if date != 'csrfmiddlewaretoken':
+ availability_data['active'].append(date)
+
+ user_availability = Availability.objects.filter(event_id=event).filter(user=request.user)
+ if not user_availability:
+ a = Availability(
+ event_id=event,
+ user=request.user,
+ time_table=availability_data
+ )
+ a.save()
+ else:
+ avail = user_availability[0]
+ avail.time_table = availability_data
+ avail.save()