annotate gpp/gcalendar/forms.py @ 339:b871892264f2

Adding the sg101 IRC bot code to SVN. This code is pretty rough and needs love, but it gets the job done (one of my first Python apps). This fixes #150.
author Brian Neal <bgneal@gmail.com>
date Sat, 26 Feb 2011 21:27:49 +0000
parents 88b2b9cb8c1f
children 9a4bffdf37c3
rev   line source
gremmie@1 1 """
gremmie@1 2 Forms for the gcalendar application.
gremmie@1 3 """
gremmie@1 4 import datetime
gremmie@1 5 import pytz
gremmie@1 6 from django import forms
bgneal@6 7 from django.conf import settings
gremmie@1 8
gremmie@1 9 from gcalendar.models import Event
gremmie@1 10
gremmie@1 11
gremmie@1 12 TIME_CHOICES = (
gremmie@1 13 ('00:00', '12:00 am (00:00)'),
gremmie@1 14 ('00:30', '12:30 am (00:30)'),
gremmie@1 15 ('01:00', '1:00 am (01:00)'),
gremmie@1 16 ('01:30', '1:30 am (01:30)'),
gremmie@1 17 ('02:00', '2:00 am (02:00)'),
gremmie@1 18 ('02:30', '2:30 am (02:30)'),
gremmie@1 19 ('03:00', '3:00 am (03:00)'),
gremmie@1 20 ('03:30', '3:30 am (03:30)'),
gremmie@1 21 ('04:00', '4:00 am (04:00)'),
gremmie@1 22 ('04:30', '4:30 am (04:30)'),
gremmie@1 23 ('05:00', '5:00 am (05:00)'),
gremmie@1 24 ('05:30', '5:30 am (05:30)'),
gremmie@1 25 ('06:00', '6:00 am (06:00)'),
gremmie@1 26 ('06:30', '6:30 am (06:30)'),
gremmie@1 27 ('07:00', '7:00 am (07:00)'),
gremmie@1 28 ('07:30', '7:30 am (07:30)'),
gremmie@1 29 ('08:00', '8:00 am (08:00)'),
gremmie@1 30 ('08:30', '8:30 am (08:30)'),
gremmie@1 31 ('09:00', '9:00 am (09:00)'),
gremmie@1 32 ('09:30', '9:30 am (09:30)'),
gremmie@1 33 ('10:00', '10:00 am (10:00)'),
gremmie@1 34 ('10:30', '10:30 am (10:30)'),
gremmie@1 35 ('11:00', '11:00 am (11:00)'),
gremmie@1 36 ('11:30', '11:30 am (11:30)'),
gremmie@1 37 ('12:00', '12:00 am (12:00)'),
gremmie@1 38 ('12:30', '12:30 am (12:30)'),
gremmie@1 39 ('13:00', '1:00 pm (13:00)'),
gremmie@1 40 ('13:30', '1:30 pm (13:30)'),
gremmie@1 41 ('14:00', '2:00 pm (14:00)'),
gremmie@1 42 ('14:30', '2:30 pm (14:30)'),
gremmie@1 43 ('15:00', '3:00 pm (15:00)'),
gremmie@1 44 ('15:30', '3:30 pm (15:30)'),
gremmie@1 45 ('16:00', '4:00 pm (16:00)'),
gremmie@1 46 ('16:30', '4:30 pm (16:30)'),
gremmie@1 47 ('17:00', '5:00 pm (17:00)'),
gremmie@1 48 ('17:30', '5:30 pm (17:30)'),
gremmie@1 49 ('18:00', '6:00 pm (18:00)'),
gremmie@1 50 ('18:30', '6:30 pm (18:30)'),
gremmie@1 51 ('19:00', '7:00 pm (19:00)'),
gremmie@1 52 ('19:30', '7:30 pm (19:30)'),
gremmie@1 53 ('20:00', '8:00 pm (20:00)'),
gremmie@1 54 ('20:30', '8:30 pm (20:30)'),
gremmie@1 55 ('21:00', '9:00 pm (21:00)'),
gremmie@1 56 ('21:30', '9:30 pm (21:30)'),
gremmie@1 57 ('22:00', '10:00 pm (22:00)'),
gremmie@1 58 ('22:30', '10:30 pm (22:30)'),
gremmie@1 59 ('23:00', '11:00 pm (23:00)'),
gremmie@1 60 ('23:30', '11:30 pm (23:30)'),
gremmie@1 61 )
gremmie@1 62
gremmie@1 63
gremmie@1 64 class EventEntryForm(forms.ModelForm):
gremmie@1 65 what = forms.CharField(widget=forms.TextInput(attrs={'size': 60}))
gremmie@1 66 start_date = forms.DateField(widget=forms.TextInput(attrs={'size': 10}))
gremmie@1 67 start_time = forms.TimeField(required=False, widget=forms.Select(choices=TIME_CHOICES))
gremmie@1 68 end_date = forms.DateField(widget=forms.TextInput(attrs={'size': 10}))
gremmie@1 69 end_time = forms.TimeField(required=False, widget=forms.Select(choices=TIME_CHOICES))
gremmie@1 70 time_zone = forms.CharField(required=False, widget=forms.HiddenInput())
gremmie@1 71 where = forms.CharField(required=False, widget=forms.TextInput(attrs={'size': 60}))
bgneal@312 72 description = forms.CharField(required=False,
bgneal@131 73 widget=forms.Textarea(attrs={'class': 'markItUp smileyTarget'}))
gremmie@1 74
bgneal@198 75 DATE_FORMAT = '%m/%d/%Y' # must match the jQuery UI datepicker config
gremmie@1 76 TIME_FORMAT = '%H:%M'
gremmie@1 77 DEFAULT_START_TIME = '19:00'
gremmie@1 78 DEFAULT_END_TIME = '20:00'
gremmie@1 79
gremmie@1 80 class Meta:
gremmie@1 81 model = Event
gremmie@1 82 fields = ('what', 'start_date', 'start_time', 'end_date', 'end_time',
bgneal@228 83 'all_day', 'time_zone', 'where', 'description', 'create_forum_thread')
gremmie@1 84
gremmie@1 85 class Media:
gremmie@1 86 css = {
bgneal@131 87 'all': (settings.GPP_THIRD_PARTY_CSS['markitup'] +
bgneal@131 88 settings.GPP_THIRD_PARTY_CSS['jquery-ui'] +
bgneal@131 89 ('css/gcalendar.css', ))
gremmie@1 90 }
bgneal@131 91 js = (settings.GPP_THIRD_PARTY_JS['markitup'] +
bgneal@131 92 settings.GPP_THIRD_PARTY_JS['jquery-ui'] +
bgneal@131 93 ('js/timezone.js', 'js/gcalendar.js', ))
gremmie@1 94
gremmie@1 95 def __init__(self, *args, **kwargs):
gremmie@1 96 initial = kwargs.get('initial', {})
gremmie@1 97 instance = kwargs.get('instance', None)
gremmie@1 98
gremmie@1 99 if len(args) == 0: # no POST arguments
gremmie@1 100 if instance is None:
bgneal@198 101 init_day = datetime.date.today().strftime(self.DATE_FORMAT)
gremmie@1 102 if 'start_date' not in initial:
gremmie@1 103 initial['start_date'] = init_day
gremmie@1 104 if 'end_date' not in initial:
gremmie@1 105 initial['end_date'] = init_day
gremmie@1 106 if 'start_time' not in initial:
gremmie@1 107 initial['start_time'] = self.DEFAULT_START_TIME
gremmie@1 108 if 'end_time' not in initial:
gremmie@1 109 initial['end_time'] = self.DEFAULT_END_TIME
gremmie@1 110 else:
bgneal@198 111 initial['start_date'] = instance.start_date.strftime(self.DATE_FORMAT)
bgneal@198 112 initial['end_date'] = instance.end_date.strftime(self.DATE_FORMAT)
gremmie@1 113 if instance.all_day:
gremmie@1 114 initial['start_time'] = self.DEFAULT_START_TIME
gremmie@1 115 initial['end_time'] = self.DEFAULT_END_TIME
gremmie@1 116 else:
gremmie@1 117 if 'start_time' not in initial:
gremmie@1 118 initial['start_time'] = instance.start_time.strftime(self.TIME_FORMAT)
gremmie@1 119 if 'end_time' not in initial:
gremmie@1 120 initial['end_time'] = instance.end_time.strftime(self.TIME_FORMAT)
gremmie@1 121
gremmie@1 122 kwargs['initial'] = initial
gremmie@1 123
gremmie@1 124 super(EventEntryForm, self).__init__(*args, **kwargs)
gremmie@1 125
bgneal@228 126 # We don't want the user to create a forum thread on an existing event
bgneal@228 127 if instance is not None:
bgneal@228 128 del self.fields['create_forum_thread']
bgneal@228 129
gremmie@1 130 def clean(self):
gremmie@1 131 start_date = self.cleaned_data.get('start_date')
gremmie@1 132 start_time = self.cleaned_data.get('start_time')
gremmie@1 133 all_day = self.cleaned_data.get('all_day')
gremmie@1 134 end_date = self.cleaned_data.get('end_date')
gremmie@1 135 end_time = self.cleaned_data.get('end_time')
gremmie@1 136
gremmie@1 137 if start_date and start_time and (all_day or (end_date and end_time)):
gremmie@1 138 if all_day:
gremmie@1 139 start = start_date
gremmie@1 140 end = end_date
gremmie@1 141 else:
gremmie@1 142 start = datetime.datetime.combine(start_date, start_time)
gremmie@1 143 end = datetime.datetime.combine(end_date, end_time)
gremmie@1 144 if start > end:
gremmie@1 145 raise forms.ValidationError("The start date of the event "
gremmie@1 146 "is after the ending time!")
gremmie@1 147
gremmie@1 148 return self.cleaned_data
gremmie@1 149
gremmie@1 150 def clean_time_zone(self):
gremmie@1 151 tz = self.cleaned_data['time_zone']
gremmie@1 152 try:
gremmie@1 153 pytz.timezone(tz)
gremmie@1 154 except pytz.UnknownTimeZoneError:
gremmie@1 155 raise forms.ValidationError("Invalid timezone.")
gremmie@1 156 return tz
gremmie@1 157
gremmie@1 158
gremmie@1 159 class PasswordForm(forms.Form):
gremmie@1 160 password = forms.CharField(widget=forms.PasswordInput())
gremmie@1 161