Port to new django version - not yet fully working
- location field makes problems
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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']
|
||||
@@ -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")),
|
||||
)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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')
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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(){
|
||||
|
||||
@@ -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&language=de"></script>{% endaddtoblock %}
|
||||
{% addtoblock "js" strip %}<script type="text/javascript" src="//maps.google.com/maps/api/js?key={GOOGLE_MAPS_API_KEY}&sensor=false&language=de"></script>{% endaddtoblock %}
|
||||
|
||||
|
||||
{% addtoblock "js" %}
|
||||
|
||||
@@ -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"),
|
||||
]
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user