from django.shortcuts import render, redirect from django.http import HttpResponse from django.forms.models import ModelForm from django.forms import TextInput from .models import Event, EventParticipation from .serializers import ParticipationSerializer import datetime from rest_framework.decorators import api_view from rest_framework.response import Response from rest_framework import status from crispy_forms.helper import FormHelper from crispy_forms.layout import Submit # ---------------------------------------- API --------------------------------------------------------- @api_view(['GET', 'PUT']) def event_api(request, username=None, eventId=None): try: participationQs = EventParticipation.objects.filter(event__date__gte=datetime.date.today()) if username: participationQs = EventParticipation.objects.filter(user__username=username) if eventId: participationQs = participationQs.filter(event__pk=eventId) except EventParticipation.DoesNotExist: return HttpResponse(status=404) if request.method == 'GET': serializer = ParticipationSerializer(participationQs) return Response(serializer.data) elif request.method == 'PUT': serializer = ParticipationSerializer(participationQs, data=request.DATA, many=True) if serializer.is_valid(): for serializedObject in serializer.object: if not (EventParticipation.isMember(request.user) or EventParticipation.isAdmin(request.user)): return Response(status=status.HTTP_403_FORBIDDEN) if serializedObject.user != request.user: if not EventParticipation.isAdmin(request.user): return Response(status=status.HTTP_403_FORBIDDEN) serializer.save() return Response(serializer.data) else: return Response(status=status.HTTP_400_BAD_REQUEST) # ------------------------------------ Normal Views ---------------------------------------------------- def eventplanning(request): """ View for a specific user, to edit his events """ # non-members see the grid - but cannot edit anything if not EventParticipation.isMember(request.user): return events_grid(request) # All events in the future sorted by date all_future_events = list(Event.objects.filter(date__gte=datetime.date.today()).order_by('date')) for e in all_future_events: e.participation = EventParticipation.get_or_create(event=e, user=request.user) context = {'events': all_future_events} return render(request, 'eventplanner/eventplanning_view.html', context) def events_grid(request): usernames = [u.username for u in EventParticipation.members()] all_future_events = list(Event.objects.filter(date__gte=datetime.date.today()).order_by('date')) for e in all_future_events: e.participation = [EventParticipation.get_or_create(event=e, user=u) for u in EventParticipation.members()] context = {'events': all_future_events, 'usernames': usernames} return render(request, 'eventplanner/events_grid.html', context) def deleteEvent(request, pk): Event.objects.get(pk=pk).delete() return redirect(events_grid) # ------------------------------------ Detail Views ---------------------------------------------------- from django.views.generic.edit import UpdateView, CreateView from location_field.widgets import LocationWidget class EventForm(ModelForm): def __init__(self, *args, **kwargs): self.helper = FormHelper() self.helper.form_class = 'form-horizontal' self.helper.add_input(Submit('submit', 'Speichern')) return super(EventForm, self).__init__(*args, **kwargs) class Meta: model = Event fields = ['type', 'short_desc', 'date', 'end_date', 'time', 'meeting_time', 'location', 'map_location', 'desc', ] widgets = { 'location': TextInput(), 'map_location': LocationWidget(), } class EventUpdate(UpdateView): form_class = EventForm model = Event template_name_suffix = "_update_form" success_url = '.' def get_context_data(self, **kwargs): context = super(UpdateView, self).get_context_data(**kwargs) context['viewtype'] = "update" return context class EventCreate(CreateView): form_class = EventForm model = Event template_name_suffix = "_update_form" success_url = '.' def get_context_data(self, **kwargs): context = super(CreateView, self).get_context_data(**kwargs) context['viewtype'] = "create" return context