Port to new django version - not yet fully working

- location field makes problems
This commit is contained in:
Martin Bauer
2019-01-05 11:27:15 +01:00
parent 72a9642a8e
commit 663185fd40
168 changed files with 797 additions and 5967 deletions

View File

@@ -1,20 +1,20 @@
from django.contrib import admin
from eventplanner.models import Event, EventParticipation
class EventParticipationInline(admin.TabularInline):
model = EventParticipation
extra = 1
readonly_fields = ('user',)
fields = ( 'user', 'status', 'comment', )
has_add_permission = lambda self, req : False
has_delete_permission = lambda self, req, obj : False
template = "eventplanner/admin_tabular.html"
class EventAdmin(admin.ModelAdmin):
inlines = ( EventParticipationInline, )
admin.site.register( Event, EventAdmin )
#from django.contrib import admin
#from eventplanner.models import Event, EventParticipation
#
#
#class EventParticipationInline(admin.TabularInline):
# model = EventParticipation
# extra = 1
# readonly_fields = ('user',)
# fields = ('user', 'status', 'comment',)
# has_add_permission = lambda self, req: False
# has_delete_permission = lambda self, req, obj: False
#
# template = "eventplanner/admin_tabular.html"
#
#
#class EventAdmin(admin.ModelAdmin):
# inlines = (EventParticipationInline,)
#
#
#admin.site.register(Event, EventAdmin)

View File

@@ -1,112 +0,0 @@
# -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding model 'Event'
db.create_table(u'eventplanner_event', (
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('type', self.gf('django.db.models.fields.CharField')(default='Reh', max_length=6)),
('short_desc', self.gf('django.db.models.fields.CharField')(max_length=100, null=True, blank=True)),
('location', self.gf('django.db.models.fields.TextField')()),
('map_location', self.gf('location_field.models.PlainLocationField')(max_length=63)),
('desc', self.gf('django.db.models.fields.TextField')(blank=True)),
('date', self.gf('django.db.models.fields.DateField')()),
('time', self.gf('django.db.models.fields.TimeField')(null=True, blank=True)),
('meeting_time', self.gf('django.db.models.fields.TimeField')(null=True, blank=True)),
('end_date', self.gf('django.db.models.fields.DateField')(null=True)),
))
db.send_create_signal(u'eventplanner', ['Event'])
# Adding model 'EventParticipation'
db.create_table(u'eventplanner_eventparticipation', (
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('event', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['eventplanner.Event'])),
('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])),
('status', self.gf('django.db.models.fields.CharField')(default='?', max_length=3)),
('comment', self.gf('django.db.models.fields.CharField')(max_length=64, blank=True)),
))
db.send_create_signal(u'eventplanner', ['EventParticipation'])
# Adding unique constraint on 'EventParticipation', fields ['event', 'user']
db.create_unique(u'eventplanner_eventparticipation', ['event_id', 'user_id'])
def backwards(self, orm):
# Removing unique constraint on 'EventParticipation', fields ['event', 'user']
db.delete_unique(u'eventplanner_eventparticipation', ['event_id', 'user_id'])
# Deleting model 'Event'
db.delete_table(u'eventplanner_event')
# Deleting model 'EventParticipation'
db.delete_table(u'eventplanner_eventparticipation')
models = {
u'auth.group': {
'Meta': {'object_name': 'Group'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
u'auth.permission': {
'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
u'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
u'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
u'eventplanner.event': {
'Meta': {'object_name': 'Event'},
'date': ('django.db.models.fields.DateField', [], {}),
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'end_date': ('django.db.models.fields.DateField', [], {'null': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'location': ('django.db.models.fields.TextField', [], {}),
'map_location': ('location_field.models.PlainLocationField', [], {'max_length': '63'}),
'meeting_time': ('django.db.models.fields.TimeField', [], {'null': 'True', 'blank': 'True'}),
'participants': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.User']", 'through': u"orm['eventplanner.EventParticipation']", 'symmetrical': 'False'}),
'short_desc': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
'time': ('django.db.models.fields.TimeField', [], {'null': 'True', 'blank': 'True'}),
'type': ('django.db.models.fields.CharField', [], {'default': "'Reh'", 'max_length': '6'})
},
u'eventplanner.eventparticipation': {
'Meta': {'unique_together': "(('event', 'user'),)", 'object_name': 'EventParticipation'},
'comment': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}),
'event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['eventplanner.Event']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'status': ('django.db.models.fields.CharField', [], {'default': "'?'", 'max_length': '3'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"})
}
}
complete_apps = ['eventplanner']

View File

@@ -1,191 +1,179 @@
from django.db import models
from django.utils.translation import ugettext as _
from django.contrib.auth.models import User, Permission
from django.db.models import Q
from datetime import datetime
from location_field.models import PlainLocationField
from django.db.models import Q
from django.dispatch import Signal
class NoNextEventException( Exception ):
class NoNextEventException(Exception):
def __str__(self):
return ("No event scheduled for the future")
class Event ( models.Model ):
EVENT_TYPES = (
( 'Reh', _('Rehearsal') ),
( 'Conc', _('Concert') ),
( 'Party', _('Party') ),
( 'Travel', _('Travel') ),
( 'Option', _('Option') ),
)
type = models.CharField( max_length=6, choices=EVENT_TYPES, default='Reh', verbose_name= _("type") )
short_desc = models.CharField( null=True, max_length=100, blank = True, verbose_name= _("Short Description") )
location = models.TextField( blank=True, verbose_name=_("location") )
map_location = PlainLocationField(blank=True, based_field = location, zoom=7, verbose_name=_("Location on map") )
desc = models.TextField( blank=True, verbose_name=_("description") )
date = models.DateField( verbose_name= _("date") )
time = models.TimeField( null=True, blank=True, verbose_name = _("time") )
meeting_time = models.TimeField( null=True, blank=True, verbose_name = _("meeting_time") )
end_date = models.DateField( null=True, blank = True, verbose_name = _("End Date") )
participants = models.ManyToManyField( User, through='EventParticipation', verbose_name=_("participants") )
def __unicode__(self):
return self.title
return "No event scheduled for the future"
class Event(models.Model):
EVENT_TYPES = (
('Reh', _('Rehearsal')),
('Conc', _('Concert')),
('Party', _('Party')),
('Travel', _('Travel')),
('Option', _('Option')),
)
type = models.CharField(max_length=6, choices=EVENT_TYPES, default='Reh', verbose_name=_("type"))
short_desc = models.CharField(null=True, max_length=100, blank=True, verbose_name=_("Short Description"))
location = models.TextField(blank=True, verbose_name=_("location"))
map_location = PlainLocationField(blank=True, based_field=location, zoom=7, verbose_name=_("Location on map"))
desc = models.TextField(blank=True, verbose_name=_("description"))
date = models.DateField(verbose_name=_("date"))
time = models.TimeField(null=True, blank=True, verbose_name=_("time"))
meeting_time = models.TimeField(null=True, blank=True, verbose_name=_("meeting_time"))
end_date = models.DateField(null=True, blank=True, verbose_name=_("End Date"))
participants = models.ManyToManyField(User, through='EventParticipation', verbose_name=_("participants"))
def __unicode__(self):
return self.title
def save(self, *args, **kwargs):
# Call the "real" save() method
super(Event, self).save(*args, **kwargs)
# Create a "Don't Know" participation for each Musician
for u in User.objects.all():
for u in User.objects.all():
if not u in self.participants.all():
EventParticipation.objects.create( event=self, user = u, status='-', comment = '' )
EventParticipation.objects.create(event=self, user=u, status='-', comment='')
@property
def title(self):
res = self.get_type_display()
if self.short_desc:
res += " (" + self.short_desc + ") "
return res
@property
def displaytime(self):
if self.meeting_time is None or self.meeting_time == "":
return self.time
else:
return self.meeting_time
return self.meeting_time
@property
def displaydatetime(self):
if not self.displaytime == None:
return datetime.combine( self.date, self.displaytime )
return datetime.combine(self.date, self.displaytime)
else:
return datetime.combine( self.date, datetime.min.time() )
return datetime.combine(self.date, datetime.min.time())
@staticmethod
def getNextEvent( eventType = "", includePreviousFromToday = True ):
def getNextEvent(eventType="", includePreviousFromToday=True):
"""Return the next event, of the given type. If type is the empty string the next event is returned
regardless of its type.
if includePreviousFromToday the nextEvent returned could also have been today with a startime < now """
if includePreviousFromToday:
if eventType == "":
nextEvents = Event.objects.filter( date__gte = datetime.now() ).order_by('date')[:1]
nextEvents = Event.objects.filter(date__gte=datetime.now()).order_by('date')[:1]
else:
nextEvents = Event.objects.filter( date__gte = datetime.now(), type = eventType ).order_by('date')[:1]
if len( nextEvents ) == 0:
nextEvents = Event.objects.filter(date__gte=datetime.now(), type=eventType).order_by('date')[:1]
if len(nextEvents) == 0:
raise NoNextEventException()
return nextEvents[0]
else:
maximalNumberOfEventsOnSameDay = 4
nextEvents = []
if eventType =="":
nextEvents = Event.objects.filter( date__gte = datetime.now() ).order_by('date')[:maximalNumberOfEventsOnSameDay]
if eventType == "":
nextEvents = Event.objects.filter(date__gte=datetime.now()).order_by('date')[
:maximalNumberOfEventsOnSameDay]
else:
nextEvents = Event.objects.filter( date__gte = datetime.now(), type = eventType ).order_by('date')[:maximalNumberOfEventsOnSameDay]
nextEvents = Event.objects.filter(date__gte=datetime.now(), type=eventType).order_by('date')[
:maximalNumberOfEventsOnSameDay]
if len(nextEvents) == 0:
raise NoNextEventException()
i = 0
nextEvent = nextEvents[0]
# nextEvent is not necessarily events[0] since events[0] may have been previously today
while nextEvent.displaydatetime < datetime.now():
if len(nextEvents ) <= i:
if len(nextEvents) <= i:
raise NoNextEventException()
else:
i += 1
nextEvent = nextEvents[i]
return nextEvent
class EventParticipation(models.Model):
OPTIONS = (('?', _('?')),
('Yes', _('Yes')),
('No', _('No')),
('-', _('-'))
)
class EventParticipation( models.Model ):
OPTIONS = ( ('?' , _('?' )),
('Yes', _('Yes')),
('No' , _('No' )),
('-' , _( '-' ))
)
event = models.ForeignKey( Event, verbose_name=_("event") )
user = models.ForeignKey( User, verbose_name=_("user") )
status = models.CharField ( max_length=3, choices = OPTIONS, default='?', verbose_name=_("status") )
comment = models.CharField ( max_length=64, blank=True, verbose_name=_("comment") )
event = models.ForeignKey(Event, verbose_name=_("event"), on_delete=models.PROTECT)
user = models.ForeignKey(User, verbose_name=_("user"), on_delete=models.PROTECT)
status = models.CharField(max_length=3, choices=OPTIONS, default='?', verbose_name=_("status"))
comment = models.CharField(max_length=64, blank=True, verbose_name=_("comment"))
def get_username(self):
return self.user.username
def save( self, *args, **kwargs ):
prev = EventParticipation.objects.filter( event = self.event, user = self.user )
def save(self, *args, **kwargs):
prev = EventParticipation.objects.filter(event=self.event, user=self.user)
if len(prev) == 0:
super(EventParticipation,self).save( *args,**kwargs)
super(EventParticipation, self).save(*args, **kwargs)
else:
prev = prev[0]
if prev.status != self.status or prev.comment != self.comment:
super(EventParticipation,self).save( *args,**kwargs)
super(EventParticipation, self).save(*args, **kwargs)
@staticmethod
def hasUserSetParticipationForAllEvents( user ):
def hasUserSetParticipationForAllEvents(user):
if not EventParticipation.isMember(user):
return True
futurePart = EventParticipation.objects.filter( event__date__gte = datetime.now() )
notYetEntered = futurePart.filter( user = user ).filter( status = '-' )
if len( notYetEntered ) > 0:
futurePart = EventParticipation.objects.filter(event__date__gte=datetime.now())
notYetEntered = futurePart.filter(user=user).filter(status='-')
if len(notYetEntered) > 0:
return False
else:
return True
@staticmethod
def isMember( user ):
def isMember(user):
return user.has_perm('eventplanner.member')
@staticmethod
def isAdmin( user ):
def isAdmin(user):
return user.has_perm('eventplanner.admin')
@staticmethod
def members():
perm = Permission.objects.get( codename='member' )
f = User.objects.filter(Q(groups__permissions=perm) | Q(user_permissions=perm) ).distinct()
perm = Permission.objects.get(codename='member')
f = User.objects.filter(Q(groups__permissions=perm) | Q(user_permissions=perm)).distinct()
return f.order_by('musician__position')
@staticmethod
def get_or_create( user , event ):
def get_or_create(user, event):
try:
result = EventParticipation.objects.get( event = event, user = user )
result = EventParticipation.objects.get(event=event, user=user)
except EventParticipation.DoesNotExist:
result = EventParticipation.objects.create( event = event, user = user, status='-', comment = '' )
result = EventParticipation.objects.create(event=event, user=user, status='-', comment='')
return result
class Meta:
unique_together = ("event", "user")
permissions = (
("admin", _("Admin") ),
("member", _("Member") ),
("admin", _("Admin")),
("member", _("Member")),
)

View File

@@ -1,14 +1,12 @@
from rest_framework import serializers
from models import EventParticipation
from .models import EventParticipation, Event
class ParticipationSerializer(serializers.ModelSerializer):
event = serializers.PrimaryKeyRelatedField( many=False, read_only = False )
user = serializers.Field( source='get_username' )
status = serializers.CharField( source='status', required=False )
event = serializers.PrimaryKeyRelatedField(many=False, read_only=False, queryset=Event.objects.all())
user = serializers.Field(source='get_username')
status = serializers.CharField(source='status', required=False)
def get_identity(self, data):
""" This hook is required for bulk update. """
try:
@@ -19,6 +17,3 @@ class ParticipationSerializer(serializers.ModelSerializer):
class Meta:
model = EventParticipation
fields = ('event', 'user', 'status', 'comment')

View File

@@ -1,38 +1,36 @@
from datetime import datetime
from models import Event, EventParticipation, NoNextEventException
from .models import Event, EventParticipation, NoNextEventException
from musicians.models import Musician
def addEventCountdownForNextEventToContext( context, username, eventType = "" ):
def addEventCountdownForNextEventToContext(context, username, eventType=""):
"""Returns an object that has to be added to the render context on the page where the countdown
should be displayed . The username is required to also supply participation information."""
try:
nextEvent = Event.getNextEvent( eventType, False )
try:
nextEvent = Event.getNextEvent(eventType, False)
except NoNextEventException:
return
countdown = dict()
if EventParticipation.isMember( username ):
part = EventParticipation.objects.filter( user = username ).filter( event = nextEvent )
if EventParticipation.isMember(username):
part = EventParticipation.objects.filter(user=username).filter(event=nextEvent)
countdown['participation'] = part[0].status
eventTime = nextEvent.displaydatetime
countdown['event'] = nextEvent
countdown['epoch'] = int( (eventTime - datetime.now() ).total_seconds() * 1000 )
countdown['epoch'] = int((eventTime - datetime.now()).total_seconds() * 1000)
context["countdown"] = countdown
def addEventRouteForNextEventToContext( context, username, eventType = ""):
def addEventRouteForNextEventToContext(context, username, eventType=""):
"""Returns an object that has to be added to the render context on the page where the route
should be displayed . The starting address of the route will be the home of the specified user"""
try:
nextEvent = Event.getNextEvent( eventType, True )
try:
nextEvent = Event.getNextEvent(eventType, True)
except NoNextEventException:
return
@@ -40,16 +38,13 @@ def addEventRouteForNextEventToContext( context, username, eventType = ""):
routeInfo['event'] = nextEvent
musician = Musician.objects.get( user = username );
routeInfo['origin'] = musician.street + ", " + str( musician.zip_code ) + " " + musician.city
musician = Musician.objects.get(user=username);
routeInfo['origin'] = musician.street + ", " + str(musician.zip_code) + " " + musician.city
if nextEvent.map_location:
# map_location has format "lat,longitute,zoomlevel"
routeInfo['destination'] = ",".join( nextEvent.map_location.split(",")[:2] )
routeInfo['destination'] = ",".join(nextEvent.map_location.split(",")[:2])
else:
routeInfo['destination'] = nextEvent.location
context["route"] = routeInfo

View File

@@ -27,16 +27,16 @@
<!-- Datepicker -->
{% addtoblock "css" strip %}<link rel="stylesheet" href="{{STATIC_URL}}/css/datepicker.css" type="text/css" media="screen" /> {% endaddtoblock %}
{% addtoblock "css" strip %}<link rel="stylesheet" href="{{STATIC_URL}}/css/timepicker.css" type="text/css" media="screen" /> {% endaddtoblock %}
{% addtoblock "css" strip %}<link rel="stylesheet" href="{{STATIC_URL}}/css/jquery-ui-1.8.21.custom.css" type="text/css" media="screen" /> {% endaddtoblock %}
{% addtoblock "css" strip %}<link rel="stylesheet" href="{{STATIC_URL}}/css/datepicker.css" type="text/css" media="screen" /> {% endaddtoblock %}
{% addtoblock "css" strip %}<link rel="stylesheet" href="{{STATIC_URL}}/css/timepicker.css" type="text/css" media="screen" /> {% endaddtoblock %}
{% addtoblock "css" strip %}<link rel="stylesheet" href="{{STATIC_URL}}/css/jquery-ui-1.8.21.custom.css" type="text/css" media="screen" /> {% endaddtoblock %}
{% addtoblock "js" %}
<script src="{{STATIC_URL}}/js/bootstrap-timepicker.js"></script>
<script src="{{STATIC_URL}}/js/bootstrap-datepicker.js"></script>
<script src="{{STATIC_URL}}/js/bootstrap-datepicker.de.js"></script>
<script src="{{STATIC_URL}}/js/jquery-ui-1.10.0.custom.min.js"></script>
<script>
$(document).ready(function(){

View File

@@ -18,7 +18,7 @@
{% if route %}
{% addtoblock "css" strip %}<link rel="stylesheet" href="{{STATIC_URL}}/css/concert_route.css" type="text/css" media="screen" />{% endaddtoblock %}
{% addtoblock "js" strip %}<script type="text/javascript" src="//maps.google.com/maps/api/js?sensor=false&amp;language=de"></script>{% endaddtoblock %}
{% addtoblock "js" strip %}<script type="text/javascript" src="//maps.google.com/maps/api/js?key={GOOGLE_MAPS_API_KEY}&amp;sensor=false&amp;language=de"></script>{% endaddtoblock %}
{% addtoblock "js" %}

View File

@@ -1,18 +1,15 @@
from django.conf.urls import patterns, url
from django.conf.urls import url
from django.contrib.auth.decorators import permission_required
from eventplanner.views import events_grid, eventplanning, event_api, EventUpdate, EventCreate, deleteEvent
from eventplanner.views import events_grid, eventplanning,event_api,EventUpdate,EventCreate,deleteEvent
urlpatterns = patterns('',
url(r'^$', eventplanning ),
url(r'^grid$', events_grid ),
url(r'^planning$', eventplanning ),
url(r'^(?P<pk>\d+)$', permission_required('eventplanner.change_event')( EventUpdate.as_view() ) ),
url(r'^add$', permission_required('eventplanner.add_event' )( EventCreate.as_view() ) ),
url(r'^(?P<pk>\d+)/delete$', permission_required('eventplanner.delete_event')( deleteEvent ) ),
url(r'^api/', event_api, name="event_api" ),
url(r'^api/(\w+)/$', event_api, name="event_api_per_user" ),
url(r'^api/(\w+)/(\d+)$', event_api, name="event_api_per_user_event" ),
)
urlpatterns = [
url(r'^$', eventplanning),
url(r'^grid$', events_grid),
url(r'^planning$', eventplanning),
url(r'^(?P<pk>\d+)$', permission_required('eventplanner.change_event')(EventUpdate.as_view())),
url(r'^add$', permission_required('eventplanner.add_event')(EventCreate.as_view())),
url(r'^(?P<pk>\d+)/delete$', permission_required('eventplanner.delete_event')(deleteEvent)),
url(r'^api/', event_api, name="event_api"),
url(r'^api/(\w+)/$', event_api, name="event_api_per_user"),
url(r'^api/(\w+)/(\d+)$', event_api, name="event_api_per_user_event"),
]

View File

@@ -1,12 +1,11 @@
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 .models import Event, EventParticipation
from serializers import ParticipationSerializer
from .serializers import ParticipationSerializer
import datetime
@@ -14,7 +13,6 @@ 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
@@ -22,78 +20,75 @@ from crispy_forms.layout import Submit
# ---------------------------------------- API ---------------------------------------------------------
@api_view( ['GET', 'PUT'] )
def event_api( request, username = None, eventId = None ):
@api_view(['GET', 'PUT'])
def event_api(request, username=None, eventId=None):
try:
participationQs = EventParticipation.objects.filter( event__date__gte = datetime.date.today() )
participationQs = EventParticipation.objects.filter(event__date__gte=datetime.date.today())
if username:
participationQs = EventParticipation.objects.filter( user__username = username )
participationQs = EventParticipation.objects.filter(user__username=username)
if eventId:
participationQs = participationQs.filter( event__pk = eventId )
participationQs = participationQs.filter(event__pk=eventId)
except EventParticipation.DoesNotExist:
return HttpResponse( status=404 )
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 )
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 ):
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 ):
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') )
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 )
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)
def deleteEvent( request, pk ):
Event.objects.get( pk = pk ).delete()
return redirect( events_grid )
# ------------------------------------ Detail Views ----------------------------------------------------
@@ -102,7 +97,8 @@ from django.views.generic.edit import UpdateView, CreateView
from location_field.widgets import LocationWidget
class EventForm( ModelForm ):
class EventForm(ModelForm):
def __init__(self, *args, **kwargs):
self.helper = FormHelper()
self.helper.form_class = 'form-horizontal'
@@ -111,38 +107,34 @@ class EventForm( ModelForm ):
class Meta:
model = Event
fields= [ 'type', 'short_desc', 'date', 'end_date', 'time', 'meeting_time', 'location', 'map_location', 'desc', ]
widgets = {
'location' : TextInput(),
'map_location' : LocationWidget(),
}
fields = ['type', 'short_desc', 'date', 'end_date', 'time', 'meeting_time', 'location', 'map_location',
'desc', ]
class EventUpdate( UpdateView ):
widgets = {
'location': TextInput(),
'map_location': LocationWidget(),
}
class EventUpdate(UpdateView):
form_class = EventForm
model = Event
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 ):
class EventCreate(CreateView):
form_class = EventForm
model = Event
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