123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- import datetime
- from django.db import IntegrityError
- from django.http import HttpResponseNotFound, HttpResponseRedirect, JsonResponse, HttpResponseNotAllowed
- from django.shortcuts import render
- from django.contrib.auth import authenticate, login as auth_login, logout as auth_logout
- from django.views.decorators.csrf import csrf_exempt
- from django.contrib.auth.models import User
- from .forms import CreateEventForm, LoginForm, UpdateSlotsForm
- from .models import Event, Participant, Date
- from .helpers import slots2string, string2slots, get_slot_count, slots2grid
- def index(request):
- return render(request, 'zitap/index.html')
- def about(request):
- return render(request, 'zitap/about.html')
- def create_event(request):
- if request.method == 'POST':
- form = CreateEventForm(request.POST)
- if form.is_valid():
- data = form.cleaned_data
- # Try to create the event. If the url is already taken, try again.
- n = 0
- while n<10:
- try:
- event = Event.objects.create(
- name=data['event_name'],
- start_time=datetime.time(int(data['start_time']), 0),
- end_time=datetime.time(int(data['end_time']), 0),
- slot_interval=datetime.timedelta(minutes=int(data['slot_interval'])),
- )
- for date in data['event_date']:
- event.date_set.create(date=date)
- event.save()
- return HttpResponseRedirect(f'/{event.url}')
- except IntegrityError:
- n += 1
- form.add_error(None, 'Could not create event. Please try again.')
- else:
- form = CreateEventForm()
- return render(request, 'zitap/create-event.html', {'form': form})
- def event(request, url):
- try:
- event = Event.objects.get(url=url)
- except Event.DoesNotExist:
- return render(request, 'zitap/event-not-found.html')
-
- # Check if the user is logged in
- if 'user_id' in request.session:
- participant, created = Participant.objects.get_or_create(user_id=request.session['user_id'], event=event)
- login_form = None
- update_form = UpdateSlotsForm(initial={'slots': slots2string(participant, get_slot_count(event))}, participant=participant)
- else:
- login_form = LoginForm()
- update_form = None
- return render(
- request,
- 'zitap/event.html',
- {'event': event, 'grid': slots2grid(event, event.participant_set.all()), 'login_form': login_form, 'update_form': update_form}
- )
- def login(request, url):
- try:
- event = Event.objects.get(url=url)
- except Event.DoesNotExist:
- return render(request, 'zitap/event-not-found.html')
- if request.method != 'POST':
- return HttpResponseNotAllowed(['POST'])
- form = LoginForm(request.POST)
- if form.is_valid():
- data = form.cleaned_data
- user = authenticate(request, username=data['username'], password=data.get('password'))
- if user is None:
- try:
- user = User.objects.create_user(data['username'], password=data.get('password'))
- except IntegrityError:
- form.add_error('username', 'Username already exists')
- return render(
- request,
- 'zitap/event.html',
- {'event': event, 'grid': slots2grid(event, event.participant_set.all()), 'login_form': form, 'update_form': None}
- )
- auth_login(request, user)
- participant, created = Participant.objects.get_or_create(event=event, user=user)
- participant.save()
- request.session['user_id'] = user.id
- return HttpResponseRedirect(f'/{event.url}')
- def logout(request, url):
- try:
- event = Event.objects.get(url=url)
- except Event.DoesNotExist:
- return render(request, 'zitap/event-not-found.html')
- if 'user_id' in request.session:
- del request.session['user_id']
- return HttpResponseRedirect(f'/{event.url}')
- def update_slots(request, url):
- try:
- event = Event.objects.get(url=url)
- except Event.DoesNotExist:
- return render(request, 'zitap/event-not-found.html')
- if request.method != 'POST':
- return HttpResponseNotAllowed(['POST'])
- participant = Participant.objects.get(user_id=request.session['user_id'], event=event)
- form = UpdateSlotsForm(request.POST, participant=participant)
- if form.is_valid():
- data = form.cleaned_data
- participant.slots = string2slots(data['slots'], get_slot_count(event))
- participant.save()
- return HttpResponseRedirect(f'/{event.url}')
- @csrf_exempt
- def slots_api(request, url):
- """
- REST JSON API for slots of all participants of an event
- Slots are represented as a string of 0s and 1s where 0 means the slot is available and 1 means the slot is taken.
- The string begins with the first slot of the first day of the event and ends with the last slot of the last day of the event.
- """
- try:
- event = Event.objects.get(url=url)
- slot_count = get_slot_count(event)
- # Check if the user is logged in and wants to update their slots
- if 'user_id' in request.session and request.method == 'POST':
- participant = Participant.objects.get(user_id=request.session['user_id'], event=event)
- form = UpdateSlotsForm(request.POST, participant=participant)
- if form.is_valid():
- data = form.cleaned_data
- print(data['slots'])
- participant.slots = string2slots(data['slots'], slot_count)
- participant.save()
- # Get the slots of each participant
- data = {}
- participants = event.participant_set.all()
- for participant in participants:
- data[participant.user.username] = slots2string(participant, slot_count)
-
- return JsonResponse(data)
- except Event.DoesNotExist:
- return HttpResponseNotFound()
|