from django.shortcuts import render, redirect from django.http import HttpResponse from django.contrib.auth.decorators import login_required from django.forms.models import ModelForm from django.forms import TextInput from models import Event, EventParticipation from django.contrib.auth.models import User 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 serializedObject.user != request.user: if not request.user.has_perm('change_others_participation') : 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 main_view( request ): if request.user.has_perm( 'eventplanner.change_others_participation'): return events_grid( request ) else: return eventplanning( request ) def eventplanning( request ): """ View for a specific user, to edit his events """ # All events in the future sorted by date all_future_events = list ( Event.objects.filter( date__gte = datetime.date.today() ) ) 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 User.objects.all() ] all_future_events = list ( Event.objects.filter( date__gte = datetime.date.today() ) ) for e in all_future_events: e.participation = [ EventParticipation.get_or_create( event = e, user = u ) for u in User.objects.all() ] 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