Merge lp:~cjohnston/summit/add-hangout-display into lp:summit
- add-hangout-display
- Merge into trunk
Proposed by
Chris Johnston
Status: | Merged |
---|---|
Approved by: | Michael Hall |
Approved revision: | 486 |
Merged at revision: | 482 |
Proposed branch: | lp:~cjohnston/summit/add-hangout-display |
Merge into: | lp:summit |
Diff against target: |
1864 lines (+893/-186) 8 files modified
summit/media/css/virt.css (+43/-0) summit/schedule/forms.py (+71/-14) summit/schedule/models/attendeemodel.py (+9/-2) summit/schedule/models/summitmodel.py (+125/-37) summit/schedule/templates/schedule/edit_hangout.html (+45/-0) summit/schedule/templates/schedule/virtual_meeting.html (+146/-0) summit/schedule/views.py (+400/-103) summit/urls.py (+54/-30) |
To merge this branch: | bzr merge lp:~cjohnston/summit/add-hangout-display |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Michael Hall (community) | Approve | ||
Review via email: mp+149952@code.launchpad.net |
Commit message
A bunch of pep8 fixes and a virt display
Description of the change
To post a comment you must log in.
- 486. By Chris Johnston
-
oops
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === added file 'summit/media/css/virt.css' | |||
2 | --- summit/media/css/virt.css 1970-01-01 00:00:00 +0000 | |||
3 | +++ summit/media/css/virt.css 2013-02-22 02:06:23 +0000 | |||
4 | @@ -0,0 +1,43 @@ | |||
5 | 1 | div.wrapper { | ||
6 | 2 | width: 98%; | ||
7 | 3 | max-width: 98%; | ||
8 | 4 | min-width: 98%; | ||
9 | 5 | } | ||
10 | 6 | |||
11 | 7 | #top-nav, header { | ||
12 | 8 | width: auto; | ||
13 | 9 | } | ||
14 | 10 | |||
15 | 11 | .span-3, .span-4, .span-6, .span-5, .span-7, .span-8, .span-9, .span-12 { | ||
16 | 12 | clear: none; | ||
17 | 13 | display: inline; /* HACK_IE_LTE_6: To fix IE 6 double margin bug. */ | ||
18 | 14 | float: left; | ||
19 | 15 | margin: 0; | ||
20 | 16 | padding: 0; | ||
21 | 17 | position: relative; | ||
22 | 18 | } | ||
23 | 19 | .span-3 { | ||
24 | 20 | width: 25%; | ||
25 | 21 | } | ||
26 | 22 | .span-4 { | ||
27 | 23 | width: 39%; /* 300px / 15px */ | ||
28 | 24 | } | ||
29 | 25 | .span-5 { | ||
30 | 26 | width: 49%; /* 300px / 15px */ | ||
31 | 27 | } | ||
32 | 28 | .span-6 { | ||
33 | 29 | width: 50%; /* 460px / 15px */ | ||
34 | 30 | } | ||
35 | 31 | .span-7 { | ||
36 | 32 | width: 59%; /* 300px / 15px */ | ||
37 | 33 | } | ||
38 | 34 | .span-8 { | ||
39 | 35 | width: 77%; /* 620px / 15px */ | ||
40 | 36 | } | ||
41 | 37 | .span-9 { | ||
42 | 38 | width: 74%; /* 700px / 15px */ | ||
43 | 39 | } | ||
44 | 40 | .span-12 { /** Full width. */ | ||
45 | 41 | width: 100%; /* 940px / 15px */ | ||
46 | 42 | margin-right: 0; | ||
47 | 43 | } | ||
48 | 0 | 44 | ||
49 | === modified file 'summit/schedule/forms.py' | |||
50 | --- summit/schedule/forms.py 2012-08-12 22:32:46 +0000 | |||
51 | +++ summit/schedule/forms.py 2013-02-22 02:06:23 +0000 | |||
52 | @@ -22,6 +22,7 @@ | |||
53 | 22 | 22 | ||
54 | 23 | from common.forms import RenderableMixin | 23 | from common.forms import RenderableMixin |
55 | 24 | 24 | ||
56 | 25 | |||
57 | 25 | class MultipleAttendeeField(forms.ModelMultipleChoiceField): | 26 | class MultipleAttendeeField(forms.ModelMultipleChoiceField): |
58 | 26 | def label_from_instance(self, obj): | 27 | def label_from_instance(self, obj): |
59 | 27 | return u"%s %s (%s)" % ( | 28 | return u"%s %s (%s)" % ( |
60 | @@ -36,12 +37,8 @@ | |||
61 | 36 | required=False) | 37 | required=False) |
62 | 37 | 38 | ||
63 | 38 | class Media: | 39 | class Media: |
70 | 39 | css = {'all': ( | 40 | css = {'all': ('/media/css/colortip-1.0-jquery.css',)} |
71 | 40 | '/media/css/colortip-1.0-jquery.css', | 41 | js = ('/media/js/colortip-1.0-jquery.js',) |
66 | 41 | )} | ||
67 | 42 | js = ( | ||
68 | 43 | '/media/js/colortip-1.0-jquery.js', | ||
69 | 44 | ) | ||
72 | 45 | 42 | ||
73 | 46 | def __init__(self, *args, **kwargs): | 43 | def __init__(self, *args, **kwargs): |
74 | 47 | if 'instance' in kwargs: | 44 | if 'instance' in kwargs: |
75 | @@ -72,6 +69,7 @@ | |||
76 | 72 | old_save_m2m = self.save_m2m | 69 | old_save_m2m = self.save_m2m |
77 | 73 | else: | 70 | else: |
78 | 74 | old_save_m2m = None | 71 | old_save_m2m = None |
79 | 72 | |||
80 | 75 | def save_m2m(): | 73 | def save_m2m(): |
81 | 76 | if old_save_m2m is not None: | 74 | if old_save_m2m is not None: |
82 | 77 | old_save_m2m() | 75 | old_save_m2m() |
83 | @@ -94,43 +92,102 @@ | |||
84 | 94 | class CreateMeeting(MeetingFormBase, RenderableMixin): | 92 | class CreateMeeting(MeetingFormBase, RenderableMixin): |
85 | 95 | class Meta: | 93 | class Meta: |
86 | 96 | model = Meeting | 94 | model = Meeting |
89 | 97 | fields = ('title', 'description', 'tracks', 'type', 'private', 'spec_url', 'wiki_url', | 95 | fields = ( |
90 | 98 | 'pad_url', 'requires_dial_in', 'slots', 'approved', 'video', 'override_break') | 96 | 'title', |
91 | 97 | 'description', | ||
92 | 98 | 'tracks', | ||
93 | 99 | 'type', | ||
94 | 100 | 'private', | ||
95 | 101 | 'spec_url', | ||
96 | 102 | 'wiki_url', | ||
97 | 103 | 'pad_url', | ||
98 | 104 | 'requires_dial_in', | ||
99 | 105 | 'slots', | ||
100 | 106 | 'approved', | ||
101 | 107 | 'video', | ||
102 | 108 | 'override_break' | ||
103 | 109 | ) | ||
104 | 110 | |||
105 | 99 | 111 | ||
106 | 100 | class OrganizerEditMeeting(MeetingFormBase, RenderableMixin): | 112 | class OrganizerEditMeeting(MeetingFormBase, RenderableMixin): |
107 | 101 | class Meta: | 113 | class Meta: |
108 | 102 | model = Meeting | 114 | model = Meeting |
111 | 103 | fields = ('title', 'description', 'tracks', 'type', 'private', 'spec_url', 'wiki_url', | 115 | fields = ( |
112 | 104 | 'pad_url', 'requires_dial_in', 'slots', 'approved', 'video', 'override_break') | 116 | 'title', |
113 | 117 | 'description', | ||
114 | 118 | 'tracks', | ||
115 | 119 | 'type', | ||
116 | 120 | 'private', | ||
117 | 121 | 'spec_url', | ||
118 | 122 | 'wiki_url', | ||
119 | 123 | 'pad_url', | ||
120 | 124 | 'requires_dial_in', | ||
121 | 125 | 'slots', | ||
122 | 126 | 'approved', | ||
123 | 127 | 'video', | ||
124 | 128 | 'override_break' | ||
125 | 129 | ) | ||
126 | 130 | |||
127 | 105 | 131 | ||
128 | 106 | class ProposeMeeting(MeetingFormBase, RenderableMixin): | 132 | class ProposeMeeting(MeetingFormBase, RenderableMixin): |
129 | 107 | class Meta: | 133 | class Meta: |
130 | 108 | model = Meeting | 134 | model = Meeting |
132 | 109 | fields = ('title', 'description', 'tracks', 'spec_url', 'wiki_url', 'pad_url') | 135 | fields = ( |
133 | 136 | 'title', | ||
134 | 137 | 'description', | ||
135 | 138 | 'tracks', | ||
136 | 139 | 'spec_url', | ||
137 | 140 | 'wiki_url', | ||
138 | 141 | 'pad_url' | ||
139 | 142 | ) | ||
140 | 110 | 143 | ||
141 | 111 | 144 | ||
142 | 112 | class EditMeeting(MeetingFormBase, RenderableMixin): | 145 | class EditMeeting(MeetingFormBase, RenderableMixin): |
143 | 113 | class Meta: | 146 | class Meta: |
144 | 114 | model = Meeting | 147 | model = Meeting |
146 | 115 | fields = ('title', 'description', 'tracks', 'spec_url', 'wiki_url', 'pad_url') | 148 | fields = ( |
147 | 149 | 'title', | ||
148 | 150 | 'description', | ||
149 | 151 | 'tracks', | ||
150 | 152 | 'spec_url', | ||
151 | 153 | 'wiki_url', | ||
152 | 154 | 'pad_url' | ||
153 | 155 | ) | ||
154 | 156 | |||
155 | 116 | 157 | ||
156 | 117 | class MeetingReview(forms.ModelForm, RenderableMixin): | 158 | class MeetingReview(forms.ModelForm, RenderableMixin): |
157 | 118 | class Meta: | 159 | class Meta: |
158 | 119 | model = Meeting | 160 | model = Meeting |
159 | 120 | fields = ('approved',) | 161 | fields = ('approved',) |
160 | 121 | 162 | ||
161 | 163 | |||
162 | 122 | class AttendMeeting(forms.ModelForm, RenderableMixin): | 164 | class AttendMeeting(forms.ModelForm, RenderableMixin): |
163 | 123 | class Meta: | 165 | class Meta: |
164 | 124 | model = Participant | 166 | model = Participant |
165 | 125 | fields = ('participation',) | 167 | fields = ('participation',) |
166 | 168 | |||
167 | 126 | def __init__(self, *args, **kwargs): | 169 | def __init__(self, *args, **kwargs): |
168 | 127 | super(AttendMeeting, self).__init__(*args, **kwargs) | 170 | super(AttendMeeting, self).__init__(*args, **kwargs) |
170 | 128 | self.fields['participation'].choices = ((u'ATTENDING', u'Attending'), (u'INTERESTED', u'Very interested in attending')) | 171 | self.fields['participation'].choices = ( |
171 | 172 | (u'ATTENDING', u'Attending'), | ||
172 | 173 | (u'INTERESTED', u'Very interested in attending') | ||
173 | 174 | ) | ||
174 | 175 | |||
175 | 129 | 176 | ||
176 | 130 | class OrganizerChangeAttend(forms.ModelForm, RenderableMixin): | 177 | class OrganizerChangeAttend(forms.ModelForm, RenderableMixin): |
177 | 131 | class Meta: | 178 | class Meta: |
178 | 132 | model = Participant | 179 | model = Participant |
179 | 133 | fields = ('participation',) | 180 | fields = ('participation',) |
180 | 181 | |||
181 | 134 | def __init__(self, *args, **kwargs): | 182 | def __init__(self, *args, **kwargs): |
182 | 135 | super(OrganizerChangeAttend, self).__init__(*args, **kwargs) | 183 | super(OrganizerChangeAttend, self).__init__(*args, **kwargs) |
184 | 136 | self.fields['participation'].choices = ((u'INTERESTED', u'Should Attend'), (u'REQUIRED', u'Required to Attend')) | 184 | self.fields['participation'].choices = ( |
185 | 185 | (u'INTERESTED', u'Should Attend'), | ||
186 | 186 | (u'REQUIRED', u'Required to Attend') | ||
187 | 187 | ) | ||
188 | 188 | |||
189 | 189 | |||
190 | 190 | class EditMeetingHangout(forms.ModelForm, RenderableMixin): | ||
191 | 191 | class Meta: | ||
192 | 192 | model = Meeting | ||
193 | 193 | fields = ('hangout_url', 'broadcast_url') | ||
194 | 137 | 194 | ||
195 | === modified file 'summit/schedule/models/attendeemodel.py' | |||
196 | --- summit/schedule/models/attendeemodel.py 2012-04-30 16:48:43 +0000 | |||
197 | +++ summit/schedule/models/attendeemodel.py 2013-02-22 02:06:23 +0000 | |||
198 | @@ -45,7 +45,7 @@ | |||
199 | 45 | verbose_name='Willing to be Crew', | 45 | verbose_name='Willing to be Crew', |
200 | 46 | default=False) | 46 | default=False) |
201 | 47 | secret_key_id = models.CharField(max_length=32, blank=True, null=True) | 47 | secret_key_id = models.CharField(max_length=32, blank=True, null=True) |
203 | 48 | 48 | ||
204 | 49 | class Meta: | 49 | class Meta: |
205 | 50 | app_label = 'schedule' | 50 | app_label = 'schedule' |
206 | 51 | ordering = ('user__username', 'summit') | 51 | ordering = ('user__username', 'summit') |
207 | @@ -86,7 +86,14 @@ | |||
208 | 86 | secret_key = property(get_secret_key, set_secret_key) | 86 | secret_key = property(get_secret_key, set_secret_key) |
209 | 87 | 87 | ||
210 | 88 | def ical_url(self): | 88 | def ical_url(self): |
212 | 89 | return getattr(settings, 'SITE_ROOT', 'http://summit.ubuntu.com') + reverse('summit.schedule.views.user_private_ical', args=(self.summit.name,self.secret_key)) | 89 | return getattr( |
213 | 90 | settings, | ||
214 | 91 | 'SITE_ROOT', | ||
215 | 92 | 'http://summit.ubuntu.com' | ||
216 | 93 | ) + reverse( | ||
217 | 94 | 'summit.schedule.views.user_private_ical', | ||
218 | 95 | args=(self.summit.name, self.secret_key) | ||
219 | 96 | ) | ||
220 | 90 | 97 | ||
221 | 91 | def update_from_launchpad(self, elem): | 98 | def update_from_launchpad(self, elem): |
222 | 92 | """Update from Launchpad data.""" | 99 | """Update from Launchpad data.""" |
223 | 93 | 100 | ||
224 | === modified file 'summit/schedule/models/summitmodel.py' | |||
225 | --- summit/schedule/models/summitmodel.py 2013-02-20 17:33:14 +0000 | |||
226 | +++ summit/schedule/models/summitmodel.py 2013-02-22 02:06:23 +0000 | |||
227 | @@ -47,6 +47,8 @@ | |||
228 | 47 | 47 | ||
229 | 48 | #Monkey patch for better use in the admin | 48 | #Monkey patch for better use in the admin |
230 | 49 | User._meta.ordering = ['username'] | 49 | User._meta.ordering = ['username'] |
231 | 50 | |||
232 | 51 | |||
233 | 50 | def unicode_user(user): | 52 | def unicode_user(user): |
234 | 51 | display = [] | 53 | display = [] |
235 | 52 | if user.first_name: | 54 | if user.first_name: |
236 | @@ -56,9 +58,10 @@ | |||
237 | 56 | if len(display) == 0: | 58 | if len(display) == 0: |
238 | 57 | return user.username | 59 | return user.username |
239 | 58 | else: | 60 | else: |
241 | 59 | return user.username + ' (' +' '.join(display) + ')' | 61 | return user.username + ' (' + ' '.join(display) + ')' |
242 | 60 | User.__unicode__ = unicode_user | 62 | User.__unicode__ = unicode_user |
243 | 61 | 63 | ||
244 | 64 | |||
245 | 62 | class SummitManager(CurrentSiteManager): | 65 | class SummitManager(CurrentSiteManager): |
246 | 63 | 66 | ||
247 | 64 | def next(self): | 67 | def next(self): |
248 | @@ -68,6 +71,7 @@ | |||
249 | 68 | # No summits have been defined in the database yet | 71 | # No summits have been defined in the database yet |
250 | 69 | return Summit(name="no_summits", title="No Summits Defined") | 72 | return Summit(name="no_summits", title="No Summits Defined") |
251 | 70 | 73 | ||
252 | 74 | |||
253 | 71 | class Summit(models.Model): | 75 | class Summit(models.Model): |
254 | 72 | STATE_CHOICES = ( | 76 | STATE_CHOICES = ( |
255 | 73 | (u'sponsor', u'Sponsorship Requests'), | 77 | (u'sponsor', u'Sponsorship Requests'), |
256 | @@ -81,22 +85,51 @@ | |||
257 | 81 | sites = models.ManyToManyField(Site) | 85 | sites = models.ManyToManyField(Site) |
258 | 82 | location = models.CharField(max_length=100, blank=True) | 86 | location = models.CharField(max_length=100, blank=True) |
259 | 83 | description = models.TextField(max_length=2047, blank=True) | 87 | description = models.TextField(max_length=2047, blank=True) |
262 | 84 | etherpad = models.URLField(verify_exists=False, max_length=75, blank=False, default='http://pad.ubuntu.com/', help_text="Enter the URL of the etherpad server you would like to use") | 88 | etherpad = models.URLField( |
263 | 85 | qr = models.URLField(verify_exists=False, max_length=100, blank=True, default='', help_text="Enter the URL of the QR code for mobile device application") | 89 | verify_exists=False, |
264 | 90 | max_length=75, | ||
265 | 91 | blank=False, | ||
266 | 92 | default='http://pad.ubuntu.com/', | ||
267 | 93 | help_text="Enter the URL of the etherpad server you would like to use" | ||
268 | 94 | ) | ||
269 | 95 | qr = models.URLField( | ||
270 | 96 | verify_exists=False, | ||
271 | 97 | max_length=100, | ||
272 | 98 | blank=True, | ||
273 | 99 | default='', | ||
274 | 100 | help_text="Enter the URL of the QR code for mobile device application" | ||
275 | 101 | ) | ||
276 | 86 | hashtag = models.CharField(max_length=25, blank=True) | 102 | hashtag = models.CharField(max_length=25, blank=True) |
279 | 87 | timezone = models.CharField(max_length=50, | 103 | timezone = models.CharField( |
280 | 88 | choices=[(x, x) for x in pytz.common_timezones]) | 104 | max_length=50, |
281 | 105 | choices=[(x, x) for x in pytz.common_timezones] | ||
282 | 106 | ) | ||
283 | 89 | last_update = models.DateTimeField(null=True, blank=True) | 107 | last_update = models.DateTimeField(null=True, blank=True) |
286 | 90 | state = models.CharField(max_length=10, choices=STATE_CHOICES, | 108 | state = models.CharField( |
287 | 91 | default=STATE_CHOICES[0][0]) | 109 | max_length=10, |
288 | 110 | choices=STATE_CHOICES, | ||
289 | 111 | default=STATE_CHOICES[0][0] | ||
290 | 112 | ) | ||
291 | 92 | date_start = models.DateField(blank=False, null=True) | 113 | date_start = models.DateField(blank=False, null=True) |
292 | 93 | date_end = models.DateField(blank=False, null=True) | 114 | date_end = models.DateField(blank=False, null=True) |
295 | 94 | managers = models.ManyToManyField(User, blank=True, related_name='managers') | 115 | managers = models.ManyToManyField( |
296 | 95 | schedulers = models.ManyToManyField(User, blank=True, related_name='schedulers') | 116 | User, |
297 | 117 | blank=True, | ||
298 | 118 | related_name='managers' | ||
299 | 119 | ) | ||
300 | 120 | schedulers = models.ManyToManyField( | ||
301 | 121 | User, | ||
302 | 122 | blank=True, | ||
303 | 123 | related_name='schedulers' | ||
304 | 124 | ) | ||
305 | 96 | virtual_summit = models.BooleanField( | 125 | virtual_summit = models.BooleanField( |
306 | 97 | help_text="Check this if the entire sprint is virtual" | 126 | help_text="Check this if the entire sprint is virtual" |
307 | 98 | ) | 127 | ) |
309 | 99 | help_text = models.TextField(null=True, blank=True, help_text='Summit specific instructions and links for getting help during the event') | 128 | help_text = models.TextField( |
310 | 129 | null=True, | ||
311 | 130 | blank=True, | ||
312 | 131 | help_text='Instructions and links for getting help during the event' | ||
313 | 132 | ) | ||
314 | 100 | 133 | ||
315 | 101 | objects = models.Manager() | 134 | objects = models.Manager() |
316 | 102 | on_site = SummitManager() | 135 | on_site = SummitManager() |
317 | @@ -109,7 +142,14 @@ | |||
318 | 109 | return self.name | 142 | return self.name |
319 | 110 | 143 | ||
320 | 111 | def get_absolute_url(self): | 144 | def get_absolute_url(self): |
322 | 112 | return getattr(settings, 'SITE_ROOT', 'http://summit.ubuntu.com') + reverse('summit.schedule.views.summit', args=(self.name,)) | 145 | return getattr( |
323 | 146 | settings, | ||
324 | 147 | 'SITE_ROOT', | ||
325 | 148 | 'http://summit.ubuntu.com' | ||
326 | 149 | ) + reverse( | ||
327 | 150 | 'summit.schedule.views.summit', | ||
328 | 151 | args=(self.name,) | ||
329 | 152 | ) | ||
330 | 113 | 153 | ||
331 | 114 | def localize(self, datetime): | 154 | def localize(self, datetime): |
332 | 115 | """Convert a datetime to the summit-local timezone. | 155 | """Convert a datetime to the summit-local timezone. |
333 | @@ -172,7 +212,14 @@ | |||
334 | 172 | return sorted(dates) | 212 | return sorted(dates) |
335 | 173 | 213 | ||
336 | 174 | def ical_url(self): | 214 | def ical_url(self): |
338 | 175 | return getattr(settings, 'SITE_ROOT', 'http://summit.ubuntu.com') + reverse('summit.schedule.views.ical', args=(self.name,)) | 215 | return getattr( |
339 | 216 | settings, | ||
340 | 217 | 'SITE_ROOT', | ||
341 | 218 | 'http://summit.ubuntu.com' | ||
342 | 219 | ) + reverse( | ||
343 | 220 | 'summit.schedule.views.ical', | ||
344 | 221 | args=(self.name,) | ||
345 | 222 | ) | ||
346 | 176 | 223 | ||
347 | 177 | def public_rooms(self): | 224 | def public_rooms(self): |
348 | 178 | """List of public rooms for this summit. | 225 | """List of public rooms for this summit. |
349 | @@ -192,7 +239,9 @@ | |||
350 | 192 | else: | 239 | else: |
351 | 193 | return cmp(a.track.title, b.track.title) | 240 | return cmp(a.track.title, b.track.title) |
352 | 194 | 241 | ||
354 | 195 | rooms = self.room_set.exclude(Q(type__exact='closed') | Q(type__exact='private')) | 242 | rooms = self.room_set.exclude( |
355 | 243 | Q(type__exact='closed') | Q(type__exact='private') | ||
356 | 244 | ) | ||
357 | 196 | return sorted(rooms, cmp=by_title) | 245 | return sorted(rooms, cmp=by_title) |
358 | 197 | 246 | ||
359 | 198 | def open_rooms(self): | 247 | def open_rooms(self): |
360 | @@ -231,8 +280,12 @@ | |||
361 | 231 | if sprints.count() > 0: | 280 | if sprints.count() > 0: |
362 | 232 | urls = [sprint.import_url for sprint in sprints] | 281 | urls = [sprint.import_url for sprint in sprints] |
363 | 233 | else: | 282 | else: |
366 | 234 | urls = [("https://launchpad.net/sprints/%s/+temp-meeting-export" | 283 | urls = [ |
367 | 235 | % self.name)] | 284 | ( |
368 | 285 | "https://launchpad.net/sprints/%s/+temp-meeting-export" | ||
369 | 286 | % self.name | ||
370 | 287 | ) | ||
371 | 288 | ] | ||
372 | 236 | return urls | 289 | return urls |
373 | 237 | 290 | ||
374 | 238 | def update_from_launchpad_response(self, response, options={}): | 291 | def update_from_launchpad_response(self, response, options={}): |
375 | @@ -253,9 +306,16 @@ | |||
376 | 253 | while trycounter <= retrytotal: | 306 | while trycounter <= retrytotal: |
377 | 254 | req = urllib2.Request(url) | 307 | req = urllib2.Request(url) |
378 | 255 | req.add_header("Cache-Control", "no-cache") | 308 | req.add_header("Cache-Control", "no-cache") |
380 | 256 | req.add_header("Cookie", "lp=%s" % getattr(settings, "LP_AUTH_COOKIE", "please-don't-cache-me")) | 309 | req.add_header( |
381 | 310 | "Cookie", | ||
382 | 311 | "lp=%s" % getattr( | ||
383 | 312 | settings, | ||
384 | 313 | "LP_AUTH_COOKIE", | ||
385 | 314 | "please-don't-cache-me" | ||
386 | 315 | ) | ||
387 | 316 | ) | ||
388 | 257 | try: | 317 | try: |
390 | 258 | export = urllib2.urlopen(req) | 318 | export = urllib2.urlopen(req) |
391 | 259 | except urllib2.HTTPError, e: | 319 | except urllib2.HTTPError, e: |
392 | 260 | trycounter += 1 | 320 | trycounter += 1 |
393 | 261 | if trycounter >= retrytotal: | 321 | if trycounter >= retrytotal: |
394 | @@ -278,12 +338,16 @@ | |||
395 | 278 | in_lp |= self.update_from_launchpad_response(sprint_info, options) | 338 | in_lp |= self.update_from_launchpad_response(sprint_info, options) |
396 | 279 | 339 | ||
397 | 280 | if not options.get('skip_meetings', False): | 340 | if not options.get('skip_meetings', False): |
399 | 281 | in_db = set(m for m in self.meeting_set.exclude(launchpad_blueprint_id__isnull=True)) | 341 | in_db = set( |
400 | 342 | m for m in self.meeting_set.exclude( | ||
401 | 343 | launchpad_blueprint_id__isnull=True | ||
402 | 344 | ) | ||
403 | 345 | ) | ||
404 | 282 | 346 | ||
405 | 283 | for extra in in_db.difference(in_lp): | 347 | for extra in in_db.difference(in_lp): |
406 | 284 | print "Marking %s as removed" % extra.name | 348 | print "Marking %s as removed" % extra.name |
407 | 285 | extra.agenda_set.all().delete() | 349 | extra.agenda_set.all().delete() |
409 | 286 | extra.approved='REMOVED' | 350 | extra.approved = 'REMOVED' |
410 | 287 | extra.save() | 351 | extra.save() |
411 | 288 | 352 | ||
412 | 289 | self.last_update = datetime.utcnow() | 353 | self.last_update = datetime.utcnow() |
413 | @@ -298,19 +362,26 @@ | |||
414 | 298 | 362 | ||
415 | 299 | print "user %s" % username | 363 | print "user %s" % username |
416 | 300 | try: | 364 | try: |
418 | 301 | attendee = self.attendee_set.get(user__username__exact=username[:30]) | 365 | attendee = self.attendee_set.get( |
419 | 366 | user__username__exact=username[:30] | ||
420 | 367 | ) | ||
421 | 302 | except ObjectDoesNotExist: | 368 | except ObjectDoesNotExist: |
422 | 303 | try: | 369 | try: |
423 | 304 | user = User.objects.get(username__exact=username[:30]) | 370 | user = User.objects.get(username__exact=username[:30]) |
424 | 305 | except ObjectDoesNotExist: | 371 | except ObjectDoesNotExist: |
426 | 306 | user = User.objects.create_user(username[:30], '', password=None) | 372 | user = User.objects.create_user( |
427 | 373 | username[:30], | ||
428 | 374 | '', | ||
429 | 375 | password=None | ||
430 | 376 | ) | ||
431 | 307 | launchpad.set_user_openid(user) | 377 | launchpad.set_user_openid(user) |
432 | 308 | 378 | ||
433 | 309 | # Create with any start/end time since we overwrite shortly | 379 | # Create with any start/end time since we overwrite shortly |
438 | 310 | attendee = self.attendee_set.create(user=user, | 380 | attendee = self.attendee_set.create( |
439 | 311 | start=datetime.utcnow(), | 381 | user=user, |
440 | 312 | end=datetime.utcnow()) | 382 | start=datetime.utcnow(), |
441 | 313 | 383 | end=datetime.utcnow() | |
442 | 384 | ) | ||
443 | 314 | 385 | ||
444 | 315 | attendee.update_from_launchpad(elem) | 386 | attendee.update_from_launchpad(elem) |
445 | 316 | 387 | ||
446 | @@ -333,7 +404,12 @@ | |||
447 | 333 | try: | 404 | try: |
448 | 334 | meeting = self.meeting_set.get(launchpad_blueprint_id=bp_id) | 405 | meeting = self.meeting_set.get(launchpad_blueprint_id=bp_id) |
449 | 335 | except ObjectDoesNotExist: | 406 | except ObjectDoesNotExist: |
451 | 336 | meeting = self.meeting_set.create(name=name, title=full_name[:100], slots=slot_length, launchpad_blueprint_id=bp_id) | 407 | meeting = self.meeting_set.create( |
452 | 408 | name=name, | ||
453 | 409 | title=full_name[:100], | ||
454 | 410 | slots=slot_length, | ||
455 | 411 | launchpad_blueprint_id=bp_id | ||
456 | 412 | ) | ||
457 | 337 | except: | 413 | except: |
458 | 338 | pass | 414 | pass |
459 | 339 | 415 | ||
460 | @@ -347,13 +423,18 @@ | |||
461 | 347 | This is a pretty simple best-fit/first-come-first-served scheduler, | 423 | This is a pretty simple best-fit/first-come-first-served scheduler, |
462 | 348 | but it suffices. | 424 | but it suffices. |
463 | 349 | """ | 425 | """ |
466 | 350 | for meeting in self.meeting_set.filter(approved='APPROVED', agenda__isnull=True).order_by('id'): | 426 | for meeting in self.meeting_set.filter( |
467 | 351 | meeting.try_schedule(with_interested = True) | 427 | approved='APPROVED', |
468 | 428 | agenda__isnull=True | ||
469 | 429 | ).order_by('id'): | ||
470 | 430 | meeting.try_schedule(with_interested=True) | ||
471 | 352 | 431 | ||
473 | 353 | for meeting in self.meeting_set.filter(approved='APPROVED', agenda__isnull=True).order_by('id'): | 432 | for meeting in self.meeting_set.filter( |
474 | 433 | approved='APPROVED', | ||
475 | 434 | agenda__isnull=True | ||
476 | 435 | ).order_by('id'): | ||
477 | 354 | meeting.try_schedule() | 436 | meeting.try_schedule() |
478 | 355 | 437 | ||
479 | 356 | |||
480 | 357 | def check_schedule(self): | 438 | def check_schedule(self): |
481 | 358 | """Check the schedule for existant errors.""" | 439 | """Check the schedule for existant errors.""" |
482 | 359 | for meeting in self.meeting_set.all(): | 440 | for meeting in self.meeting_set.all(): |
483 | @@ -361,14 +442,20 @@ | |||
484 | 361 | try: | 442 | try: |
485 | 362 | missing = meeting.check_schedule(agenda.slot, agenda.room) | 443 | missing = meeting.check_schedule(agenda.slot, agenda.room) |
486 | 363 | if len(missing): | 444 | if len(missing): |
490 | 364 | print "Warning: required people not available: %s at %s in %s: %s" % ( | 445 | print "Warning: required people not available:" |
491 | 365 | meeting, agenda.slot, agenda.room, | 446 | "%s at %s in %s: %s" % ( |
492 | 366 | ', '.join(m.user.username for m in missing)) | 447 | meeting, |
493 | 448 | agenda.slot, | ||
494 | 449 | agenda.room, | ||
495 | 450 | ', '.join(m.user.username for m in missing) | ||
496 | 451 | ) | ||
497 | 367 | except meeting.SchedulingError, e: | 452 | except meeting.SchedulingError, e: |
502 | 368 | print "Error: %s at %s in %s: %s" % (meeting, | 453 | print "Error: %s at %s in %s: %s" % ( |
503 | 369 | agenda.slot, | 454 | meeting, |
504 | 370 | agenda.room, | 455 | agenda.slot, |
505 | 371 | e) | 456 | agenda.room, |
506 | 457 | e | ||
507 | 458 | ) | ||
508 | 372 | 459 | ||
509 | 373 | def reschedule(self): | 460 | def reschedule(self): |
510 | 374 | """Delete any automatically created agenda items that have problems.""" | 461 | """Delete any automatically created agenda items that have problems.""" |
511 | @@ -426,6 +513,7 @@ | |||
512 | 426 | return self.lead_set.filter(lead=attendee).exists() | 513 | return self.lead_set.filter(lead=attendee).exists() |
513 | 427 | return False | 514 | return False |
514 | 428 | 515 | ||
515 | 516 | |||
516 | 429 | class SummitSprint(models.Model): | 517 | class SummitSprint(models.Model): |
517 | 430 | 518 | ||
518 | 431 | summit = models.ForeignKey(Summit, related_name='sprint_set') | 519 | summit = models.ForeignKey(Summit, related_name='sprint_set') |
519 | 432 | 520 | ||
520 | === added file 'summit/schedule/templates/schedule/edit_hangout.html' | |||
521 | --- summit/schedule/templates/schedule/edit_hangout.html 1970-01-01 00:00:00 +0000 | |||
522 | +++ summit/schedule/templates/schedule/edit_hangout.html 2013-02-22 02:06:23 +0000 | |||
523 | @@ -0,0 +1,45 @@ | |||
524 | 1 | {% extends "base.html" %} | ||
525 | 2 | |||
526 | 3 | {% block page_name %}Edit Hangout - {{ summit.title }}{%endblock %} | ||
527 | 4 | {% block sub_nav %}{% endblock %} | ||
528 | 5 | |||
529 | 6 | {% block extrahead %}{{ block.super }} | ||
530 | 7 | <script type="text/javascript" src="{{MEDIA_URL}}js/colortip-1.0-jquery.js"></script> | ||
531 | 8 | <link rel="stylesheet" type="text/css" href="{{MEDIA_URL}}css/colortip-1.0-jquery.css"/> | ||
532 | 9 | {% endblock %} | ||
533 | 10 | |||
534 | 11 | {% block closure %} | ||
535 | 12 | <script type="text/javascript"><!-- | ||
536 | 13 | $(document).ready(function(){ | ||
537 | 14 | $('span[rel*=help]').colorTip({color:'orange'}); | ||
538 | 15 | }); | ||
539 | 16 | --></script> | ||
540 | 17 | <style> | ||
541 | 18 | form ul { | ||
542 | 19 | height: 12em; | ||
543 | 20 | overflow-y: scroll; | ||
544 | 21 | overflow-x: hidden; | ||
545 | 22 | } | ||
546 | 23 | </style> | ||
547 | 24 | {% endblock %} | ||
548 | 25 | |||
549 | 26 | |||
550 | 27 | {% block content %} | ||
551 | 28 | <div class="row"> | ||
552 | 29 | <article id="form" class="span-8"> | ||
553 | 30 | {% if form.errors %} | ||
554 | 31 | <p style="color: red;"> | ||
555 | 32 | Please correct the error{{ form.errors|pluralize }} below. | ||
556 | 33 | </p> | ||
557 | 34 | {% endif %} | ||
558 | 35 | |||
559 | 36 | <form action="{{ request.path_info }}" method="POST"> | ||
560 | 37 | <fieldset> | ||
561 | 38 | <h3>Edit Hangout</h3> | ||
562 | 39 | {{ form.as_template }} | ||
563 | 40 | {% if is_popup %}<input type="hidden" name="_popup" value="1">{% endif %} | ||
564 | 41 | <input type="submit" name="submit" value="Save" class="submit-button" /> | ||
565 | 42 | </fieldset> | ||
566 | 43 | </form> | ||
567 | 44 | </article> | ||
568 | 45 | {% endblock %} | ||
569 | 0 | 46 | ||
570 | === added file 'summit/schedule/templates/schedule/virtual_meeting.html' | |||
571 | --- summit/schedule/templates/schedule/virtual_meeting.html 1970-01-01 00:00:00 +0000 | |||
572 | +++ summit/schedule/templates/schedule/virtual_meeting.html 2013-02-22 02:06:23 +0000 | |||
573 | @@ -0,0 +1,146 @@ | |||
574 | 1 | {% extends "base.html" %} | ||
575 | 2 | {% load schedule_perms datetime markup %} | ||
576 | 3 | |||
577 | 4 | {% block page_name %} | ||
578 | 5 | {{ meeting.title }} - | ||
579 | 6 | {% if schedule.date %}{{ schedule.date|strftime:"%Y-%m-%d" }}{% endif %} | ||
580 | 7 | {% if schedule.room %}{{ schedule.room.title }} - {{ summit.title }}{% endif %} | ||
581 | 8 | {% endblock %} | ||
582 | 9 | |||
583 | 10 | {% block extrahead %}{{ block.super }} | ||
584 | 11 | <link rel="stylesheet" type="text/css" media="screen" href="/media/css/virt.css" /> | ||
585 | 12 | <meta property="fb:app_id" content="310260202349342" /> | ||
586 | 13 | <meta property="og:title" content="{{ meeting.title }}{% if schedule.date %} - {{ schedule.date|strftime:"%Y-%m-%d" }}{% endif %}{% if schedule.room %}{{ schedule.room.title }}{% endif %}" /> | ||
587 | 14 | {% if meeting.description %} | ||
588 | 15 | <meta property="og:description" content="{{ meeting.description|linebreaks|striptags }}" /> | ||
589 | 16 | {% endif %} | ||
590 | 17 | <meta property="og:url" content="http://summit.ubuntu.com{% url summit.schedule.views.meeting meeting.summit.name, meeting.id, meeting.name|default:'-' %}" /> | ||
591 | 18 | <meta property="og:image" content="http://summit.ubuntu.com/media/images/cof_orange_hex1.png" /> | ||
592 | 19 | <meta property="og:site_name" content="The Summit Scheduler" /> | ||
593 | 20 | <meta property="og:type" content="article" /> | ||
594 | 21 | <meta itemprop="name" content="{{ meeting.title }}{% if schedule.date %} - {{ schedule.date|strftime:"%Y-%m-%d" }}{% endif %}{% if schedule.room %}{{ schedule.room.title }}{% endif %}" /> | ||
595 | 22 | <meta itemprop="description" content="{{ meeting.description|linebreaks|striptags }}" /> | ||
596 | 23 | {% endblock %} | ||
597 | 24 | |||
598 | 25 | {% block sub_nav_links %} | ||
599 | 26 | {% if meeting.private %} | ||
600 | 27 | {% if meeting.private_key and meeting.private_key != '' %} | ||
601 | 28 | <li><a class="sub-nav-item" href="{% url summit.schedule.views.private_meeting meeting.summit.name, meeting.private_key, meeting.name|default:'-' %}">Shared URL</a></li> | ||
602 | 29 | {% else %} | ||
603 | 30 | <li><a class="sub-nav-item" href="{% url summit.schedule.views.meeting meeting.summit.name, meeting.id, meeting.name|default:'-' %}+share">Share meeting</a></li> | ||
604 | 31 | {% endif %} | ||
605 | 32 | {% endif %} | ||
606 | 33 | |||
607 | 34 | {% if meeting.spec_url %} | ||
608 | 35 | {% if summit_organizer or drafter %} | ||
609 | 36 | <li><a class="sub-nav-item" href="{% url summit.schedule.views.attendee_review summit.name, meeting.id, meeting.name|default:'-' %}">Review attendees</a></li> | ||
610 | 37 | <li><a class="sub-nav-item" href="{% url summit.schedule.views.edit_meeting_hangout summit.name, meeting.id, meeting.name|default:'-' %}">Edit Hangout Details</a></li> | ||
611 | 38 | {% endif %} | ||
612 | 39 | <li><a class="sub-nav-item" href="{{ meeting.spec_url }}">Blueprint</a></li> | ||
613 | 40 | {% else %} | ||
614 | 41 | {% if summit_organizer or drafter %} | ||
615 | 42 | {% if not drafter %} | ||
616 | 43 | <li><a class="sub-nav-item" href="{% url summit.schedule.views.organizer_edit_meeting summit.name, meeting.id, meeting.name|default:'-' %}">Edit meeting</a></li> | ||
617 | 44 | {% endif %} | ||
618 | 45 | {% if not summit_organizer %} | ||
619 | 46 | <li><a class="sub-nav-item" href="{% url summit.schedule.views.edit_meeting summit.name, meeting.id, meeting.name|default:'-' %}">Edit meeting</a></li> | ||
620 | 47 | {% endif %} | ||
621 | 48 | <li><a class="sub-nav-item" href="{% url summit.schedule.views.attendee_review summit.name, meeting.id, meeting.name|default:'-' %}">Review attendees</a></li> | ||
622 | 49 | <li><a class="sub-nav-item" href="{% url summit.schedule.views.edit_meeting_hangout summit.name, meeting.id, meeting.name|default:'-' %}">Edit Hangout Details</a></li> | ||
623 | 50 | {% endif %} | ||
624 | 51 | {% endif %} | ||
625 | 52 | |||
626 | 53 | {% if user_is_attending %} | ||
627 | 54 | {% if user_is_participating %} | ||
628 | 55 | <li><a class="sub-nav-item" href="{% url summit.schedule.views.unregister meeting.summit.name, meeting.id, meeting.name|default:'-' %}">Skip this meeting</a></li> | ||
629 | 56 | {% endif %} | ||
630 | 57 | {% else %} | ||
631 | 58 | {% if meeting.spec_url %} | ||
632 | 59 | <li><a class="sub-nav-item" href="{{ meeting.spec_url }}/+subscribe">Subscribe to blueprint</a></li> | ||
633 | 60 | {% endif %} | ||
634 | 61 | <li><a class="sub-nav-item" href="{% url summit.schedule.views.attend_meeting meeting.summit.name, meeting.id %}">Attend this meeting</a></li> | ||
635 | 62 | {% endif %} | ||
636 | 63 | |||
637 | 64 | {% if scheduler %} | ||
638 | 65 | <li><a class="sub-nav-item" href="{% url summit.schedule.views.meeting_copy meeting.summit.name, meeting.id, meeting.name|default:'-' %}">Copy meeting</a></li> | ||
639 | 66 | {% endif %} | ||
640 | 67 | {% endblock %} | ||
641 | 68 | |||
642 | 69 | {% block content %} | ||
643 | 70 | <div class="row"> | ||
644 | 71 | <section class="span-9"> | ||
645 | 72 | <h2>{{ meeting.title }}</h2> | ||
646 | 73 | <div id="description"> | ||
647 | 74 | {{ meeting.description|markdown:'safe' }} | ||
648 | 75 | <h3><a href="{{ meeting.hangout_url }}">Join the Hangout on Air</a></h3> | ||
649 | 76 | </div> | ||
650 | 77 | |||
651 | 78 | </section> | ||
652 | 79 | <article class="span-3 last"> | ||
653 | 80 | {% if meeting.private %} | ||
654 | 81 | {% else %} | ||
655 | 82 | <div class="share"> | ||
656 | 83 | <a href="http://www.reddit.com/submit" onclick="window.location = 'http://www.reddit.com/submit?url=' + encodeURIComponent(window.location); return false"> <img style="padding-bottom: 4px;"src="http://www.reddit.com/static/spreddit7.gif" alt="submit to reddit" border="0" /></a><br /> | ||
657 | 84 | <div id="fb-root"></div> | ||
658 | 85 | <script>(function(d, s, id) { | ||
659 | 86 | var js, fjs = d.getElementsByTagName(s)[0]; | ||
660 | 87 | if (d.getElementById(id)) {return;} | ||
661 | 88 | js = d.createElement(s); js.id = id; | ||
662 | 89 | js.src = "//connect.facebook.net/en_US/all.js#xfbml=1&appId=310260202349342"; | ||
663 | 90 | fjs.parentNode.insertBefore(js, fjs); | ||
664 | 91 | }(document, 'script', 'facebook-jssdk'));</script> | ||
665 | 92 | <div class="fb-like" data-href="" data-send="false" data-layout="box_count" data-width="40" data-show-faces="false" data-font="arial"></div> | ||
666 | 93 | <script type="text/javascript" src="https://apis.google.com/js/plusone.js"></script> | ||
667 | 94 | <g:plusone size="tall"></g:plusone> | ||
668 | 95 | <a href="http://twitter.com/share" class="twitter-share-button" data-count="vertical" data-lang="en">Tweet</a> | ||
669 | 96 | <script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> | ||
670 | 97 | <script src="http://www.stumbleupon.com/hostedbadge.php?s=5"></script> | ||
671 | 98 | </div> | ||
672 | 99 | |||
673 | 100 | {% endif %} | ||
674 | 101 | </article> | ||
675 | 102 | </div> | ||
676 | 103 | <div class="row"> | ||
677 | 104 | <div class="span-4"> | ||
678 | 105 | <div align="center"><iframe width="420" height="295" src="{{ meeting.broadcast_url }}" frameborder="0" allowfullscreen></iframe></div> | ||
679 | 106 | <iframe src="http://webchat.freenode.net?channels={% for ai in agenda_items %}{{ ai.room.irc_channel }}{% endfor %}&uio=Mj10cnVlJjQ9dHJ1ZSY5PXRydWUmMTA9dHJ1ZSYxMz1mYWxzZSYxND1mYWxzZQbf" width="100%" height="395"></iframe> | ||
680 | 107 | </div> | ||
681 | 108 | <div class="span-7 last"> | ||
682 | 109 | {% if meeting.private %} | ||
683 | 110 | <h3>WARNING: Contents of this pad may not be private, and may be searcheable by non-attendees!</h3> | ||
684 | 111 | {% endif %} | ||
685 | 112 | |||
686 | 113 | <iframe width=100% height=700 src="{{ meeting.link_to_pad }}"></iframe> | ||
687 | 114 | </div> | ||
688 | 115 | </div> | ||
689 | 116 | <div class="row"> | ||
690 | 117 | {% ifnotequal meeting.type 'plenary' %} | ||
691 | 118 | <div id="Attendees" class="span-4"> | ||
692 | 119 | <h3>Attendees</h3> | ||
693 | 120 | {% for attendee in attendees %} | ||
694 | 121 | <a href="http://launchpad.net/~{{ attendee.user.username }}">{% if attendee.participation = 'REQUIRED' %}<strong>{% endif %}{{ attendee.name }}{% if attendee.required %}</strong>{% endif %}</a>{% if not forloop.last %}, {% endif %} | ||
695 | 122 | {% endfor %} | ||
696 | 123 | </div> | ||
697 | 124 | {% endifnotequal %} | ||
698 | 125 | <div class="span-3"> | ||
699 | 126 | {% if summit_organizer %} | ||
700 | 127 | {% include "schedule/admin.html" %} | ||
701 | 128 | {% endif %} | ||
702 | 129 | </div> | ||
703 | 130 | <div id="Links" class="span-3 last"> | ||
704 | 131 | <h3>Links</h3> | ||
705 | 132 | <ul> | ||
706 | 133 | <li><a href="{{meeting.link_to_pad}}" target="_new">Notes in a separate window</a></li> | ||
707 | 134 | <li><a href="{{meeting.edit_link_to_pad}}" target="_new">Edit notes window</a></li> | ||
708 | 135 | {% if meeting.spec_url %}<li><a href="{{ meeting.spec_url }}">Blueprint</a></li>{% endif %} | ||
709 | 136 | {% if meeting.wiki_url %}<li><a href="{{ meeting.wiki_url }}">Wiki page</a></li>{% endif %} | ||
710 | 137 | {% for ai in agenda_items %} | ||
711 | 138 | {% if ai.room.irc_channel %}<li><a href="https://webchat.freenode.net/?channels={{ai.room.irc_channel}}">IRC Channel: #{{ai.room.irc_channel}}</a></li>{% endif %} | ||
712 | 139 | {% endfor %} | ||
713 | 140 | |||
714 | 141 | </ul> | ||
715 | 142 | </div> | ||
716 | 143 | |||
717 | 144 | </article> | ||
718 | 145 | </div> | ||
719 | 146 | {% endblock %} | ||
720 | 0 | 147 | ||
721 | === modified file 'summit/schedule/views.py' | |||
722 | --- summit/schedule/views.py 2012-10-26 10:23:28 +0000 | |||
723 | +++ summit/schedule/views.py 2013-02-22 02:06:23 +0000 | |||
724 | @@ -49,7 +49,8 @@ | |||
725 | 49 | EditMeeting, | 49 | EditMeeting, |
726 | 50 | MeetingReview, | 50 | MeetingReview, |
727 | 51 | AttendMeeting, | 51 | AttendMeeting, |
729 | 52 | OrganizerChangeAttend | 52 | OrganizerChangeAttend, |
730 | 53 | EditMeetingHangout | ||
731 | 53 | ) | 54 | ) |
732 | 54 | 55 | ||
733 | 55 | __all__ = ( | 56 | __all__ = ( |
734 | @@ -60,6 +61,7 @@ | |||
735 | 60 | 'today_view', | 61 | 'today_view', |
736 | 61 | ) | 62 | ) |
737 | 62 | 63 | ||
738 | 64 | |||
739 | 63 | @summit_required | 65 | @summit_required |
740 | 64 | def summit(request, summit, attendee): | 66 | def summit(request, summit, attendee): |
741 | 65 | edit = False | 67 | edit = False |
742 | @@ -81,14 +83,17 @@ | |||
743 | 81 | return render_to_response("schedule/summit.html", context, | 83 | return render_to_response("schedule/summit.html", context, |
744 | 82 | context_instance=RequestContext(request)) | 84 | context_instance=RequestContext(request)) |
745 | 83 | 85 | ||
746 | 86 | |||
747 | 84 | @summit_only_required | 87 | @summit_only_required |
748 | 85 | def search(request, summit): | 88 | def search(request, summit): |
749 | 86 | query = request.GET.get('q', None) | 89 | query = request.GET.get('q', None) |
750 | 87 | if query: | 90 | if query: |
752 | 88 | meetings = summit.meeting_set.filter(Q(name__icontains=query) | Q(title__icontains=query)) | 91 | meetings = summit.meeting_set.filter( |
753 | 92 | Q(name__icontains=query) | Q(title__icontains=query) | ||
754 | 93 | ) | ||
755 | 89 | else: | 94 | else: |
756 | 90 | meetings = [] | 95 | meetings = [] |
758 | 91 | 96 | ||
759 | 92 | context = { | 97 | context = { |
760 | 93 | 'summit': summit, | 98 | 'summit': summit, |
761 | 94 | 'query': query, | 99 | 'query': query, |
762 | @@ -96,17 +101,28 @@ | |||
763 | 96 | } | 101 | } |
764 | 97 | return render_to_response("schedule/search.html", context, | 102 | return render_to_response("schedule/search.html", context, |
765 | 98 | context_instance=RequestContext(request)) | 103 | context_instance=RequestContext(request)) |
766 | 104 | |||
767 | 105 | |||
768 | 99 | @summit_required | 106 | @summit_required |
769 | 100 | def daily_schedule(request, summit, attendee, date): | 107 | def daily_schedule(request, summit, attendee, date): |
771 | 101 | viewdate = summit.as_localtime(datetime.datetime.strptime(date, "%Y-%m-%d")) | 108 | viewdate = summit.as_localtime( |
772 | 109 | datetime.datetime.strptime(date, "%Y-%m-%d") | ||
773 | 110 | ) | ||
774 | 102 | utc_date = summit.delocalize(viewdate) | 111 | utc_date = summit.delocalize(viewdate) |
775 | 103 | day = datetime.timedelta(days=1) | 112 | day = datetime.timedelta(days=1) |
776 | 104 | 113 | ||
777 | 105 | schedule = SortedDict() | 114 | schedule = SortedDict() |
778 | 106 | multislot_meetings = SortedDict() | 115 | multislot_meetings = SortedDict() |
779 | 107 | 116 | ||
782 | 108 | for slot in summit.slot_set.filter(start_utc__gte=utc_date, end_utc__lte=(utc_date+day)).order_by('start_utc'): | 117 | for slot in summit.slot_set.filter( |
783 | 109 | if not (slot.type == 'open' or slot.type == 'plenary' or slot.type == 'lunch'): | 118 | start_utc__gte=utc_date, |
784 | 119 | end_utc__lte=(utc_date+day) | ||
785 | 120 | ).order_by('start_utc'): | ||
786 | 121 | if not ( | ||
787 | 122 | slot.type == 'open' or | ||
788 | 123 | slot.type == 'plenary' or | ||
789 | 124 | slot.type == 'lunch' | ||
790 | 125 | ): | ||
791 | 110 | continue | 126 | continue |
792 | 111 | if not slot in schedule: | 127 | if not slot in schedule: |
793 | 112 | schedule[slot] = SortedDict() | 128 | schedule[slot] = SortedDict() |
794 | @@ -117,7 +133,7 @@ | |||
795 | 117 | if count == 1: | 133 | if count == 1: |
796 | 118 | del multislot_meetings[agenda] | 134 | del multislot_meetings[agenda] |
797 | 119 | else: | 135 | else: |
799 | 120 | multislot_meetings[agenda] = count -1 | 136 | multislot_meetings[agenda] = count - 1 |
800 | 121 | 137 | ||
801 | 122 | # Add meetings from this slot | 138 | # Add meetings from this slot |
802 | 123 | for agenda in slot.agenda_set.select_related().order_by('room__name'): | 139 | for agenda in slot.agenda_set.select_related().order_by('room__name'): |
803 | @@ -125,7 +141,7 @@ | |||
804 | 125 | schedule[slot][agenda.room] = agenda | 141 | schedule[slot][agenda.room] = agenda |
805 | 126 | if agenda.meeting.slots > 1: | 142 | if agenda.meeting.slots > 1: |
806 | 127 | multislot_meetings[agenda] = agenda.meeting.slots - 1 | 143 | multislot_meetings[agenda] = agenda.meeting.slots - 1 |
808 | 128 | 144 | ||
809 | 129 | if '_popup' in request.GET: | 145 | if '_popup' in request.GET: |
810 | 130 | is_popup = True | 146 | is_popup = True |
811 | 131 | 147 | ||
812 | @@ -141,29 +157,49 @@ | |||
813 | 141 | } | 157 | } |
814 | 142 | return render_to_response("schedule/daily.html", context, | 158 | return render_to_response("schedule/daily.html", context, |
815 | 143 | context_instance=RequestContext(request)) | 159 | context_instance=RequestContext(request)) |
817 | 144 | 160 | ||
818 | 161 | |||
819 | 145 | @summit_attendee_required | 162 | @summit_attendee_required |
820 | 146 | def attendee_schedule(request, summit, attendee): | 163 | def attendee_schedule(request, summit, attendee): |
821 | 147 | pass | 164 | pass |
823 | 148 | 165 | ||
824 | 166 | |||
825 | 149 | @summit_required | 167 | @summit_required |
826 | 150 | def by_date(request, summit, attendee, date): | 168 | def by_date(request, summit, attendee, date): |
827 | 151 | return _process_date_view(request, summit, attendee, date) | 169 | return _process_date_view(request, summit, attendee, date) |
828 | 152 | 170 | ||
829 | 171 | |||
830 | 153 | @summit_required | 172 | @summit_required |
831 | 154 | def today_view(request, summit, attendee): | 173 | def today_view(request, summit, attendee): |
832 | 155 | today = summit.localize(datetime.datetime.now()).date() | 174 | today = summit.localize(datetime.datetime.now()).date() |
834 | 156 | return _process_date_view(request, summit, attendee, today.strftime("%Y-%m-%d")) | 175 | return _process_date_view( |
835 | 176 | request, | ||
836 | 177 | summit, | ||
837 | 178 | attendee, | ||
838 | 179 | today.strftime("%Y-%m-%d") | ||
839 | 180 | ) | ||
840 | 181 | |||
841 | 157 | 182 | ||
842 | 158 | def _process_date_view(request, summit, attendee, date): | 183 | def _process_date_view(request, summit, attendee, date): |
843 | 159 | if 'rooms' in request.GET: | 184 | if 'rooms' in request.GET: |
844 | 160 | roomnames = request.GET.get('rooms', '').split(',') | 185 | roomnames = request.GET.get('rooms', '').split(',') |
845 | 161 | rooms = list(summit.room_set.filter(name__in=roomnames, type='open')) | 186 | rooms = list(summit.room_set.filter(name__in=roomnames, type='open')) |
846 | 162 | if request.user.is_authenticated() and request.user.is_staff: | 187 | if request.user.is_authenticated() and request.user.is_staff: |
848 | 163 | rooms += list(summit.room_set.filter(name__in=roomnames, type='private')) | 188 | rooms += list( |
849 | 189 | summit.room_set.filter( | ||
850 | 190 | name__in=roomnames, | ||
851 | 191 | type='private' | ||
852 | 192 | ) | ||
853 | 193 | ) | ||
854 | 164 | else: | 194 | else: |
855 | 165 | rooms = None | 195 | rooms = None |
857 | 166 | schedule = schedule_factory(request, summit, attendee, room=rooms, date=date) | 196 | schedule = schedule_factory( |
858 | 197 | request, | ||
859 | 198 | summit, | ||
860 | 199 | attendee, | ||
861 | 200 | room=rooms, | ||
862 | 201 | date=date | ||
863 | 202 | ) | ||
864 | 167 | 203 | ||
865 | 168 | if request.method == 'POST': | 204 | if request.method == 'POST': |
866 | 169 | return schedule.save_change() | 205 | return schedule.save_change() |
867 | @@ -183,25 +219,42 @@ | |||
868 | 183 | 'previousday': viewdate - day, | 219 | 'previousday': viewdate - day, |
869 | 184 | 'can_change_agenda': summit.can_change_agenda(attendee), | 220 | 'can_change_agenda': summit.can_change_agenda(attendee), |
870 | 185 | } | 221 | } |
873 | 186 | converted_date = summit.delocalize(datetime.datetime.strptime(date, "%Y-%m-%d")) | 222 | converted_date = summit.delocalize( |
874 | 187 | if 'edit' in request.GET or Slot.objects.filter(summit=summit, start_utc__gte=converted_date, end_utc__lte=converted_date+datetime.timedelta(days=1)).count() > 0: | 223 | datetime.datetime.strptime(date, "%Y-%m-%d") |
875 | 224 | ) | ||
876 | 225 | if 'edit' in request.GET or Slot.objects.filter( | ||
877 | 226 | summit=summit, | ||
878 | 227 | start_utc__gte=converted_date, | ||
879 | 228 | end_utc__lte=converted_date+datetime.timedelta(days=1) | ||
880 | 229 | ).count() > 0: | ||
881 | 188 | schedule.calculate() | 230 | schedule.calculate() |
882 | 189 | else: | 231 | else: |
883 | 190 | return render_to_response("schedule/nosession.html", context, | 232 | return render_to_response("schedule/nosession.html", context, |
885 | 191 | context_instance=RequestContext(request)) | 233 | context_instance=RequestContext(request)) |
886 | 192 | return render_to_response("schedule/schedule.html", context, | 234 | return render_to_response("schedule/schedule.html", context, |
887 | 193 | context_instance=RequestContext(request)) | 235 | context_instance=RequestContext(request)) |
888 | 194 | 236 | ||
889 | 237 | |||
890 | 195 | @summit_required | 238 | @summit_required |
891 | 196 | def next_table(request, summit, attendee): | 239 | def next_table(request, summit, attendee): |
892 | 197 | if 'rooms' in request.GET: | 240 | if 'rooms' in request.GET: |
893 | 198 | roomnames = request.GET.get('rooms', '').split(',') | 241 | roomnames = request.GET.get('rooms', '').split(',') |
894 | 199 | rooms = list(summit.room_set.filter(name__in=roomnames, type='open')) | 242 | rooms = list(summit.room_set.filter(name__in=roomnames, type='open')) |
895 | 200 | if request.user.is_authenticated() and request.user.is_staff: | 243 | if request.user.is_authenticated() and request.user.is_staff: |
897 | 201 | rooms += list(summit.room_set.filter(name__in=roomnames, type='private')) | 244 | rooms += list( |
898 | 245 | summit.room_set.filter( | ||
899 | 246 | name__in=roomnames, type='private' | ||
900 | 247 | ) | ||
901 | 248 | ) | ||
902 | 202 | else: | 249 | else: |
903 | 203 | rooms = None | 250 | rooms = None |
905 | 204 | schedule = Schedule.from_request(request, summit, attendee, room=rooms, nextonly=True) | 251 | schedule = Schedule.from_request( |
906 | 252 | request, | ||
907 | 253 | summit, | ||
908 | 254 | attendee, | ||
909 | 255 | room=rooms, | ||
910 | 256 | nextonly=True | ||
911 | 257 | ) | ||
912 | 205 | 258 | ||
913 | 206 | schedule.calculate() | 259 | schedule.calculate() |
914 | 207 | 260 | ||
915 | @@ -214,6 +267,7 @@ | |||
916 | 214 | return render_to_response("schedule/nextsession_table.html", context, | 267 | return render_to_response("schedule/nextsession_table.html", context, |
917 | 215 | context_instance=RequestContext(request)) | 268 | context_instance=RequestContext(request)) |
918 | 216 | 269 | ||
919 | 270 | |||
920 | 217 | @summit_required | 271 | @summit_required |
921 | 218 | def next_session(request, summit, attendee): | 272 | def next_session(request, summit, attendee): |
922 | 219 | url_content = request.GET.urlencode(safe='_:') | 273 | url_content = request.GET.urlencode(safe='_:') |
923 | @@ -226,16 +280,21 @@ | |||
924 | 226 | return render_to_response("schedule/nextsession.html", context, | 280 | return render_to_response("schedule/nextsession.html", context, |
925 | 227 | context_instance=RequestContext(request)) | 281 | context_instance=RequestContext(request)) |
926 | 228 | 282 | ||
927 | 283 | |||
928 | 229 | @summit_required | 284 | @summit_required |
929 | 230 | def by_room(request, summit, attendee, room_name): | 285 | def by_room(request, summit, attendee, room_name): |
930 | 231 | schedule = SortedDict() | 286 | schedule = SortedDict() |
931 | 232 | multislot_meetings = SortedDict() | 287 | multislot_meetings = SortedDict() |
932 | 233 | 288 | ||
933 | 234 | room = get_object_or_404(Room, name=room_name, summit=summit) | 289 | room = get_object_or_404(Room, name=room_name, summit=summit) |
935 | 235 | 290 | ||
936 | 236 | for slot in summit.slot_set.all().order_by('start_utc'): | 291 | for slot in summit.slot_set.all().order_by('start_utc'): |
937 | 237 | 292 | ||
939 | 238 | if not (slot.type == 'open' or slot.type == 'plenary' or slot.type == 'lunch'): | 293 | if not ( |
940 | 294 | slot.type == 'open' or | ||
941 | 295 | slot.type == 'plenary' or | ||
942 | 296 | slot.type == 'lunch' | ||
943 | 297 | ): | ||
944 | 239 | continue | 298 | continue |
945 | 240 | if not slot in schedule: | 299 | if not slot in schedule: |
946 | 241 | schedule[slot] = SortedDict() | 300 | schedule[slot] = SortedDict() |
947 | @@ -246,7 +305,7 @@ | |||
948 | 246 | if count == 1: | 305 | if count == 1: |
949 | 247 | del multislot_meetings[agenda] | 306 | del multislot_meetings[agenda] |
950 | 248 | else: | 307 | else: |
952 | 249 | multislot_meetings[agenda] = count -1 | 308 | multislot_meetings[agenda] = count - 1 |
953 | 250 | 309 | ||
954 | 251 | # Add meetings from this slot | 310 | # Add meetings from this slot |
955 | 252 | for agenda in slot.agenda_set.filter(room=room).select_related(): | 311 | for agenda in slot.agenda_set.filter(room=room).select_related(): |
956 | @@ -277,7 +336,11 @@ | |||
957 | 277 | 336 | ||
958 | 278 | for slot in summit.slot_set.all().order_by('start_utc'): | 337 | for slot in summit.slot_set.all().order_by('start_utc'): |
959 | 279 | 338 | ||
961 | 280 | if not (slot.type == 'open' or slot.type == 'plenary' or slot.type == 'lunch'): | 339 | if not ( |
962 | 340 | slot.type == 'open' or | ||
963 | 341 | slot.type == 'plenary' or | ||
964 | 342 | slot.type == 'lunch' | ||
965 | 343 | ): | ||
966 | 281 | continue | 344 | continue |
967 | 282 | if not slot in schedule: | 345 | if not slot in schedule: |
968 | 283 | schedule[slot] = SortedDict() | 346 | schedule[slot] = SortedDict() |
969 | @@ -288,10 +351,12 @@ | |||
970 | 288 | if count == 1: | 351 | if count == 1: |
971 | 289 | del multislot_meetings[agenda] | 352 | del multislot_meetings[agenda] |
972 | 290 | else: | 353 | else: |
974 | 291 | multislot_meetings[agenda] = count -1 | 354 | multislot_meetings[agenda] = count - 1 |
975 | 292 | 355 | ||
976 | 293 | # Add meetings from this slot | 356 | # Add meetings from this slot |
978 | 294 | for agenda in slot.agenda_set.filter(meeting__tracks=track).select_related().order_by('room__name'): | 357 | for agenda in slot.agenda_set.filter( |
979 | 358 | meeting__tracks=track | ||
980 | 359 | ).select_related().order_by('room__name'): | ||
981 | 295 | if not agenda.meeting.private or attendee in agenda.meeting.attendees: | 360 | if not agenda.meeting.private or attendee in agenda.meeting.attendees: |
982 | 296 | schedule[slot][agenda.room] = agenda | 361 | schedule[slot][agenda.room] = agenda |
983 | 297 | if agenda.meeting.slots > 1: | 362 | if agenda.meeting.slots > 1: |
984 | @@ -309,16 +374,25 @@ | |||
985 | 309 | return render_to_response("schedule/by_track.html", context, | 374 | return render_to_response("schedule/by_track.html", context, |
986 | 310 | context_instance=RequestContext(request)) | 375 | context_instance=RequestContext(request)) |
987 | 311 | 376 | ||
988 | 377 | |||
989 | 312 | @summit_required | 378 | @summit_required |
990 | 313 | def by_participant(request, summit, attendee, username): | 379 | def by_participant(request, summit, attendee, username): |
991 | 314 | schedule = SortedDict() | 380 | schedule = SortedDict() |
992 | 315 | multislot_meetings = SortedDict() | 381 | multislot_meetings = SortedDict() |
993 | 316 | 382 | ||
995 | 317 | participant = get_object_or_404(Attendee, user__username=username, summit=summit) | 383 | participant = get_object_or_404( |
996 | 384 | Attendee, | ||
997 | 385 | user__username=username, | ||
998 | 386 | summit=summit | ||
999 | 387 | ) | ||
1000 | 318 | 388 | ||
1001 | 319 | for slot in summit.slot_set.all().order_by('start_utc'): | 389 | for slot in summit.slot_set.all().order_by('start_utc'): |
1002 | 320 | 390 | ||
1004 | 321 | if not (slot.type == 'open' or slot.type == 'plenary' or slot.type == 'lunch'): | 391 | if not ( |
1005 | 392 | slot.type == 'open' or | ||
1006 | 393 | slot.type == 'plenary' or | ||
1007 | 394 | slot.type == 'lunch' | ||
1008 | 395 | ): | ||
1009 | 322 | continue | 396 | continue |
1010 | 323 | if not slot in schedule: | 397 | if not slot in schedule: |
1011 | 324 | schedule[slot] = SortedDict() | 398 | schedule[slot] = SortedDict() |
1012 | @@ -329,10 +403,18 @@ | |||
1013 | 329 | if count == 1: | 403 | if count == 1: |
1014 | 330 | del multislot_meetings[agenda] | 404 | del multislot_meetings[agenda] |
1015 | 331 | else: | 405 | else: |
1017 | 332 | multislot_meetings[agenda] = count -1 | 406 | multislot_meetings[agenda] = count - 1 |
1018 | 333 | 407 | ||
1019 | 334 | # Add meetings from this slot | 408 | # Add meetings from this slot |
1021 | 335 | for agenda in slot.agenda_set.filter(Q(meeting__participant__attendee=participant) | Q(meeting__drafter=participant) | Q(meeting__assignee=participant)).select_related().order_by('room__name'): | 409 | for agenda in slot.agenda_set.filter( |
1022 | 410 | Q( | ||
1023 | 411 | meeting__participant__attendee=participant | ||
1024 | 412 | ) | Q( | ||
1025 | 413 | meeting__drafter=participant | ||
1026 | 414 | ) | Q( | ||
1027 | 415 | meeting__assignee=participant | ||
1028 | 416 | ) | ||
1029 | 417 | ).select_related().order_by('room__name'): | ||
1030 | 336 | if not agenda.meeting.private or attendee in agenda.meeting.attendees: | 418 | if not agenda.meeting.private or attendee in agenda.meeting.attendees: |
1031 | 337 | schedule[slot][agenda.room] = agenda | 419 | schedule[slot][agenda.room] = agenda |
1032 | 338 | if agenda.meeting.slots > 1: | 420 | if agenda.meeting.slots > 1: |
1033 | @@ -350,6 +432,7 @@ | |||
1034 | 350 | return render_to_response("schedule/by_participant.html", context, | 432 | return render_to_response("schedule/by_participant.html", context, |
1035 | 351 | context_instance=RequestContext(request)) | 433 | context_instance=RequestContext(request)) |
1036 | 352 | 434 | ||
1037 | 435 | |||
1038 | 353 | @summit_only_required | 436 | @summit_only_required |
1039 | 354 | def tracks(request, summit): | 437 | def tracks(request, summit): |
1040 | 355 | 438 | ||
1041 | @@ -359,6 +442,7 @@ | |||
1042 | 359 | return render_to_response("schedule/tracks.html", context, | 442 | return render_to_response("schedule/tracks.html", context, |
1043 | 360 | context_instance=RequestContext(request)) | 443 | context_instance=RequestContext(request)) |
1044 | 361 | 444 | ||
1045 | 445 | |||
1046 | 362 | @summit_required | 446 | @summit_required |
1047 | 363 | def meeting(request, summit, attendee, meeting_id, meeting_slug): | 447 | def meeting(request, summit, attendee, meeting_id, meeting_slug): |
1048 | 364 | meeting = get_object_or_404(summit.meeting_set, id=meeting_id) | 448 | meeting = get_object_or_404(summit.meeting_set, id=meeting_id) |
1049 | @@ -366,11 +450,13 @@ | |||
1050 | 366 | raise Http404 | 450 | raise Http404 |
1051 | 367 | return _show_meeting(request, summit, meeting, attendee) | 451 | return _show_meeting(request, summit, meeting, attendee) |
1052 | 368 | 452 | ||
1053 | 453 | |||
1054 | 369 | @summit_required | 454 | @summit_required |
1055 | 370 | def private_meeting(request, summit, attendee, private_key, meeting_slug): | 455 | def private_meeting(request, summit, attendee, private_key, meeting_slug): |
1056 | 371 | meeting = get_object_or_404(summit.meeting_set, private_key=private_key) | 456 | meeting = get_object_or_404(summit.meeting_set, private_key=private_key) |
1057 | 372 | return _show_meeting(request, summit, meeting, attendee) | 457 | return _show_meeting(request, summit, meeting, attendee) |
1058 | 373 | 458 | ||
1059 | 459 | |||
1060 | 374 | def _show_meeting(request, summit, meeting, attendee): | 460 | def _show_meeting(request, summit, meeting, attendee): |
1061 | 375 | agendaitems = meeting.agenda_set.all() | 461 | agendaitems = meeting.agenda_set.all() |
1062 | 376 | participants = meeting.participant_set.all() | 462 | participants = meeting.participant_set.all() |
1063 | @@ -378,29 +464,40 @@ | |||
1064 | 378 | tracks = meeting.tracks.all() | 464 | tracks = meeting.tracks.all() |
1065 | 379 | user_is_attending = attendee is not None and attendee in meeting.attendees | 465 | user_is_attending = attendee is not None and attendee in meeting.attendees |
1066 | 380 | user_is_participating = attendee is not None and attendee in [p.attendee for p in participants if not p.from_launchpad] | 466 | user_is_participating = attendee is not None and attendee in [p.attendee for p in participants if not p.from_launchpad] |
1068 | 381 | 467 | ||
1069 | 382 | if attendee == meeting.drafter: | 468 | if attendee == meeting.drafter: |
1070 | 383 | drafter = True | 469 | drafter = True |
1071 | 384 | else: | 470 | else: |
1072 | 385 | drafter = False | 471 | drafter = False |
1074 | 386 | 472 | ||
1075 | 387 | context = { | 473 | context = { |
1076 | 388 | 'summit': summit, | 474 | 'summit': summit, |
1080 | 389 | 'meeting':meeting, | 475 | 'meeting': meeting, |
1081 | 390 | 'agenda_items':agendaitems, | 476 | 'agenda_items': agendaitems, |
1082 | 391 | 'participants':participants, | 477 | 'participants': participants, |
1083 | 392 | 'attendees': attendees, | 478 | 'attendees': attendees, |
1084 | 393 | 'user_is_attending': user_is_attending, | 479 | 'user_is_attending': user_is_attending, |
1085 | 394 | 'user_is_participating': user_is_participating, | 480 | 'user_is_participating': user_is_participating, |
1087 | 395 | 'tracks':tracks, | 481 | 'tracks': tracks, |
1088 | 396 | 'ETHERPAD_HOST': summit.etherpad, | 482 | 'ETHERPAD_HOST': summit.etherpad, |
1089 | 397 | 'summit_organizer': summit.is_organizer(attendee), | 483 | 'summit_organizer': summit.is_organizer(attendee), |
1090 | 398 | 'scheduler': summit.can_change_agenda(attendee), | 484 | 'scheduler': summit.can_change_agenda(attendee), |
1091 | 399 | 'is_scheduler': summit.is_scheduler(attendee), | 485 | 'is_scheduler': summit.is_scheduler(attendee), |
1092 | 400 | 'drafter': drafter, | 486 | 'drafter': drafter, |
1093 | 401 | } | 487 | } |
1096 | 402 | return render_to_response("schedule/meeting.html", context, | 488 | if summit.virtual_summit or meeting.virtual_meeting: |
1097 | 403 | context_instance=RequestContext(request)) | 489 | return render_to_response( |
1098 | 490 | "schedule/virtual_meeting.html", | ||
1099 | 491 | context, | ||
1100 | 492 | context_instance=RequestContext(request) | ||
1101 | 493 | ) | ||
1102 | 494 | else: | ||
1103 | 495 | return render_to_response( | ||
1104 | 496 | "schedule/meeting.html", | ||
1105 | 497 | context, | ||
1106 | 498 | context_instance=RequestContext(request) | ||
1107 | 499 | ) | ||
1108 | 500 | |||
1109 | 404 | 501 | ||
1110 | 405 | @summit_required | 502 | @summit_required |
1111 | 406 | def share_meeting(request, summit, attendee, meeting_id, meeting_slug): | 503 | def share_meeting(request, summit, attendee, meeting_id, meeting_slug): |
1112 | @@ -409,30 +506,62 @@ | |||
1113 | 409 | # check if the user should be able to see this private meeting | 506 | # check if the user should be able to see this private meeting |
1114 | 410 | if attendee is None: | 507 | if attendee is None: |
1115 | 411 | raise Http404 | 508 | raise Http404 |
1117 | 412 | 509 | ||
1118 | 413 | attendee_allowed = False | 510 | attendee_allowed = False |
1119 | 414 | for a in meeting.attendees: | 511 | for a in meeting.attendees: |
1120 | 415 | if a.user.pk == attendee.user.pk: | 512 | if a.user.pk == attendee.user.pk: |
1121 | 416 | meeting.share() | 513 | meeting.share() |
1123 | 417 | return HttpResponseRedirect(reverse(private_meeting, args=[summit.name, meeting.private_key, meeting_slug])) | 514 | return HttpResponseRedirect( |
1124 | 515 | reverse( | ||
1125 | 516 | private_meeting, | ||
1126 | 517 | args=[summit.name, meeting.private_key, meeting_slug] | ||
1127 | 518 | ) | ||
1128 | 519 | ) | ||
1129 | 418 | raise Http404 | 520 | raise Http404 |
1132 | 419 | return HttpResponseRedirect(reverse(meeting, summit.name, meeting.id, meeting_slug)) | 521 | return HttpResponseRedirect( |
1133 | 420 | 522 | reverse( | |
1134 | 523 | meeting, | ||
1135 | 524 | summit.name, | ||
1136 | 525 | meeting.id, | ||
1137 | 526 | meeting_slug | ||
1138 | 527 | ) | ||
1139 | 528 | ) | ||
1140 | 529 | |||
1141 | 530 | |||
1142 | 421 | @summit_attendee_required | 531 | @summit_attendee_required |
1143 | 422 | def register(request, summit, attendee, meeting_id, meeting_slug): | 532 | def register(request, summit, attendee, meeting_id, meeting_slug): |
1144 | 423 | meeting = get_object_or_404(summit.meeting_set, id=meeting_id) | 533 | meeting = get_object_or_404(summit.meeting_set, id=meeting_id) |
1145 | 424 | user_is_attending = attendee is not None and attendee in meeting.attendees | 534 | user_is_attending = attendee is not None and attendee in meeting.attendees |
1146 | 425 | if not user_is_attending: | 535 | if not user_is_attending: |
1150 | 426 | meeting.participant_set.create(attendee=attendee, participation = 'ATTENDING', from_launchpad=False) | 536 | meeting.participant_set.create( |
1151 | 427 | 537 | attendee=attendee, | |
1152 | 428 | return HttpResponseRedirect(reverse('summit.schedule.views.meeting', args=(summit.name, meeting.id, meeting_slug))) | 538 | participation='ATTENDING', |
1153 | 539 | from_launchpad=False | ||
1154 | 540 | ) | ||
1155 | 541 | |||
1156 | 542 | return HttpResponseRedirect( | ||
1157 | 543 | reverse( | ||
1158 | 544 | 'summit.schedule.views.meeting', | ||
1159 | 545 | args=(summit.name, meeting.id, meeting_slug) | ||
1160 | 546 | ) | ||
1161 | 547 | ) | ||
1162 | 548 | |||
1163 | 429 | 549 | ||
1164 | 430 | @summit_attendee_required | 550 | @summit_attendee_required |
1165 | 431 | def unregister(request, summit, attendee, meeting_id, meeting_slug): | 551 | def unregister(request, summit, attendee, meeting_id, meeting_slug): |
1166 | 432 | meeting = get_object_or_404(summit.meeting_set, id=meeting_id) | 552 | meeting = get_object_or_404(summit.meeting_set, id=meeting_id) |
1170 | 433 | meeting.participant_set.filter(attendee=attendee, from_launchpad=False).delete() | 553 | meeting.participant_set.filter( |
1171 | 434 | 554 | attendee=attendee, | |
1172 | 435 | return HttpResponseRedirect(reverse('summit.schedule.views.meeting', args=(summit.name, meeting.id, meeting_slug))) | 555 | from_launchpad=False |
1173 | 556 | ).delete() | ||
1174 | 557 | |||
1175 | 558 | return HttpResponseRedirect( | ||
1176 | 559 | reverse( | ||
1177 | 560 | 'summit.schedule.views.meeting', | ||
1178 | 561 | args=(summit.name, meeting.id, meeting_slug) | ||
1179 | 562 | ) | ||
1180 | 563 | ) | ||
1181 | 564 | |||
1182 | 436 | 565 | ||
1183 | 437 | @summit_only_required | 566 | @summit_only_required |
1184 | 438 | def csv(request, summit): | 567 | def csv(request, summit): |
1185 | @@ -442,70 +571,82 @@ | |||
1186 | 442 | return HttpResponse(schedule.as_csv(), | 571 | return HttpResponse(schedule.as_csv(), |
1187 | 443 | mimetype='text/csv') | 572 | mimetype='text/csv') |
1188 | 444 | 573 | ||
1189 | 574 | |||
1190 | 445 | @summit_only_required | 575 | @summit_only_required |
1191 | 446 | def ical(request, summit): | 576 | def ical(request, summit): |
1192 | 447 | """Return any list events as an ical""" | 577 | """Return any list events as an ical""" |
1193 | 448 | schedule = Schedule.from_request(request, summit) | 578 | schedule = Schedule.from_request(request, summit) |
1194 | 449 | schedule.calculate() | 579 | schedule.calculate() |
1196 | 450 | 580 | ||
1197 | 451 | filename = "%s.ical" % summit.name.replace(' ', '-').lower() | 581 | filename = "%s.ical" % summit.name.replace(' ', '-').lower() |
1198 | 452 | response = HttpResponse(mimetype='text/calendar') | 582 | response = HttpResponse(mimetype='text/calendar') |
1199 | 453 | response['Content-Disposition'] = 'attachment; filename=%s' % filename.encode('ascii', 'replace') | 583 | response['Content-Disposition'] = 'attachment; filename=%s' % filename.encode('ascii', 'replace') |
1200 | 454 | response.write(schedule.as_ical()) | 584 | response.write(schedule.as_ical()) |
1201 | 455 | return response | 585 | return response |
1202 | 456 | 586 | ||
1203 | 587 | |||
1204 | 457 | @summit_only_required | 588 | @summit_only_required |
1205 | 458 | def user_ical(request, summit, username): | 589 | def user_ical(request, summit, username): |
1206 | 459 | """Returns a user's registered events as an ical""" | 590 | """Returns a user's registered events as an ical""" |
1207 | 460 | schedule = Schedule.from_request(request, summit) | 591 | schedule = Schedule.from_request(request, summit) |
1208 | 461 | schedule.calculate() | 592 | schedule.calculate() |
1210 | 462 | 593 | ||
1211 | 463 | filename = "%s_%s.ical" % (summit.name, username) | 594 | filename = "%s_%s.ical" % (summit.name, username) |
1212 | 464 | response = HttpResponse(mimetype='text/calendar') | 595 | response = HttpResponse(mimetype='text/calendar') |
1213 | 465 | response['Content-Disposition'] = 'attachment; filename=%s' % filename.replace(' ', '-').lower().encode('ascii', 'replace') | 596 | response['Content-Disposition'] = 'attachment; filename=%s' % filename.replace(' ', '-').lower().encode('ascii', 'replace') |
1214 | 466 | response.write(schedule.as_ical(only_username=username)) | 597 | response.write(schedule.as_ical(only_username=username)) |
1215 | 467 | return response | 598 | return response |
1217 | 468 | 599 | ||
1218 | 600 | |||
1219 | 469 | @summit_only_required | 601 | @summit_only_required |
1220 | 470 | def user_private_ical(request, summit, secret_key): | 602 | def user_private_ical(request, summit, secret_key): |
1221 | 471 | """Returns a user's registered events as an ical""" | 603 | """Returns a user's registered events as an ical""" |
1222 | 472 | attendee = get_object_or_404(Attendee, secret_key_id=secret_key) | 604 | attendee = get_object_or_404(Attendee, secret_key_id=secret_key) |
1223 | 473 | schedule = Schedule.from_request(request, summit, show_private=True) | 605 | schedule = Schedule.from_request(request, summit, show_private=True) |
1224 | 474 | schedule.calculate() | 606 | schedule.calculate() |
1226 | 475 | 607 | ||
1227 | 476 | response = HttpResponse(mimetype='text/calendar') | 608 | response = HttpResponse(mimetype='text/calendar') |
1228 | 477 | response['Content-Disposition'] = 'attachment; filename=my_schedule_%s.ical' % attendee.secret_key | 609 | response['Content-Disposition'] = 'attachment; filename=my_schedule_%s.ical' % attendee.secret_key |
1230 | 478 | response.write(schedule.as_ical(only_username=attendee.user.username, show_private=True)) | 610 | response.write( |
1231 | 611 | schedule.as_ical( | ||
1232 | 612 | only_username=attendee.user.username, | ||
1233 | 613 | show_private=True | ||
1234 | 614 | ) | ||
1235 | 615 | ) | ||
1236 | 479 | return response | 616 | return response |
1238 | 480 | 617 | ||
1239 | 618 | |||
1240 | 481 | @summit_only_required | 619 | @summit_only_required |
1241 | 482 | def room_ical(request, summit, room_name): | 620 | def room_ical(request, summit, room_name): |
1242 | 483 | """Returns a room's events as an ical""" | 621 | """Returns a room's events as an ical""" |
1243 | 484 | schedule = Schedule.from_request(request, summit) | 622 | schedule = Schedule.from_request(request, summit) |
1244 | 485 | schedule.calculate() | 623 | schedule.calculate() |
1246 | 486 | 624 | ||
1247 | 487 | filename = "%s_%s.ical" % (summit.name, room_name) | 625 | filename = "%s_%s.ical" % (summit.name, room_name) |
1248 | 488 | response = HttpResponse(mimetype='text/calendar') | 626 | response = HttpResponse(mimetype='text/calendar') |
1249 | 489 | response['Content-Disposition'] = 'attachment; filename=%s' % filename.replace(' ', '-').lower().encode('ascii', 'replace') | 627 | response['Content-Disposition'] = 'attachment; filename=%s' % filename.replace(' ', '-').lower().encode('ascii', 'replace') |
1250 | 490 | response.write(schedule.as_ical(only_room=room_name)) | 628 | response.write(schedule.as_ical(only_room=room_name)) |
1251 | 491 | return response | 629 | return response |
1253 | 492 | 630 | ||
1254 | 631 | |||
1255 | 493 | @summit_only_required | 632 | @summit_only_required |
1256 | 494 | def track_ical(request, summit, track_slug): | 633 | def track_ical(request, summit, track_slug): |
1257 | 495 | """Returns a track's events as an ical""" | 634 | """Returns a track's events as an ical""" |
1258 | 496 | schedule = Schedule.from_request(request, summit) | 635 | schedule = Schedule.from_request(request, summit) |
1259 | 497 | schedule.calculate() | 636 | schedule.calculate() |
1261 | 498 | 637 | ||
1262 | 499 | filename = "%s_%s.ical" % (summit.name, track_slug) | 638 | filename = "%s_%s.ical" % (summit.name, track_slug) |
1263 | 500 | response = HttpResponse(mimetype='text/calendar') | 639 | response = HttpResponse(mimetype='text/calendar') |
1264 | 501 | response['Content-Disposition'] = 'attachment; filename=%s' % filename.replace(' ', '-').lower().encode('ascii', 'replace') | 640 | response['Content-Disposition'] = 'attachment; filename=%s' % filename.replace(' ', '-').lower().encode('ascii', 'replace') |
1265 | 502 | response.write(schedule.as_ical(only_track=track_slug)) | 641 | response.write(schedule.as_ical(only_track=track_slug)) |
1266 | 503 | return response | 642 | return response |
1268 | 504 | 643 | ||
1269 | 644 | |||
1270 | 505 | def logout_view(request): | 645 | def logout_view(request): |
1271 | 506 | logout(request) | 646 | logout(request) |
1272 | 507 | return HttpResponseRedirect('/') | 647 | return HttpResponseRedirect('/') |
1273 | 508 | 648 | ||
1274 | 649 | |||
1275 | 509 | @summit_required | 650 | @summit_required |
1276 | 510 | def mobile(request, summit, attendee): | 651 | def mobile(request, summit, attendee): |
1277 | 511 | context = { | 652 | context = { |
1278 | @@ -514,6 +655,7 @@ | |||
1279 | 514 | } | 655 | } |
1280 | 515 | return render_to_response("schedule/mobile.html", context, RequestContext(request)) | 656 | return render_to_response("schedule/mobile.html", context, RequestContext(request)) |
1281 | 516 | 657 | ||
1282 | 658 | |||
1283 | 517 | def past(request): | 659 | def past(request): |
1284 | 518 | pastsummit = Summit.on_site.filter(date_end__lte=datetime.date.today()) | 660 | pastsummit = Summit.on_site.filter(date_end__lte=datetime.date.today()) |
1285 | 519 | context = { | 661 | context = { |
1286 | @@ -522,15 +664,26 @@ | |||
1287 | 522 | return render_to_response("schedule/past_summit.html", context, | 664 | return render_to_response("schedule/past_summit.html", context, |
1288 | 523 | context_instance=RequestContext(request)) | 665 | context_instance=RequestContext(request)) |
1289 | 524 | 666 | ||
1290 | 667 | |||
1291 | 525 | @summit_attendee_required | 668 | @summit_attendee_required |
1292 | 526 | def create_meeting(request, summit, attendee): | 669 | def create_meeting(request, summit, attendee): |
1293 | 527 | 670 | ||
1294 | 528 | if not summit.is_organizer(attendee): | 671 | if not summit.is_organizer(attendee): |
1296 | 529 | return HttpResponseRedirect(reverse('summit.schedule.views.summit', args=(summit.name,))) | 672 | return HttpResponseRedirect( |
1297 | 673 | reverse( | ||
1298 | 674 | 'summit.schedule.views.summit', | ||
1299 | 675 | args=(summit.name,) | ||
1300 | 676 | ) | ||
1301 | 677 | ) | ||
1302 | 530 | else: | 678 | else: |
1306 | 531 | meeting = Meeting(summit=summit, approver=attendee, drafter=attendee, approved='APPROVED') | 679 | meeting = Meeting( |
1307 | 532 | 680 | summit=summit, | |
1308 | 533 | if request.method == 'POST': | 681 | approver=attendee, |
1309 | 682 | drafter=attendee, | ||
1310 | 683 | approved='APPROVED' | ||
1311 | 684 | ) | ||
1312 | 685 | |||
1313 | 686 | if request.method == 'POST': | ||
1314 | 534 | form = CreateMeeting(data=request.POST, instance=meeting) | 687 | form = CreateMeeting(data=request.POST, instance=meeting) |
1315 | 535 | if form.is_valid(): | 688 | if form.is_valid(): |
1316 | 536 | form.save() | 689 | form.save() |
1317 | @@ -542,15 +695,21 @@ | |||
1318 | 542 | 'summit': summit, | 695 | 'summit': summit, |
1319 | 543 | 'form': form, | 696 | 'form': form, |
1320 | 544 | } | 697 | } |
1322 | 545 | return render_to_response('schedule/create_meeting.html', | 698 | return render_to_response('schedule/create_meeting.html', |
1323 | 546 | context, RequestContext(request)) | 699 | context, RequestContext(request)) |
1324 | 547 | 700 | ||
1325 | 701 | |||
1326 | 548 | @summit_attendee_required | 702 | @summit_attendee_required |
1327 | 549 | def propose_meeting(request, summit, attendee): | 703 | def propose_meeting(request, summit, attendee): |
1328 | 550 | 704 | ||
1330 | 551 | meeting = Meeting(summit=summit, drafter=attendee, private=False, approved='PENDING') | 705 | meeting = Meeting( |
1331 | 706 | summit=summit, | ||
1332 | 707 | drafter=attendee, | ||
1333 | 708 | private=False, | ||
1334 | 709 | approved='PENDING' | ||
1335 | 710 | ) | ||
1336 | 552 | 711 | ||
1338 | 553 | if request.method == 'POST': | 712 | if request.method == 'POST': |
1339 | 554 | form = ProposeMeeting(data=request.POST, instance=meeting) | 713 | form = ProposeMeeting(data=request.POST, instance=meeting) |
1340 | 555 | if form.is_valid(): | 714 | if form.is_valid(): |
1341 | 556 | form.save() | 715 | form.save() |
1342 | @@ -562,17 +721,29 @@ | |||
1343 | 562 | 'summit': summit, | 721 | 'summit': summit, |
1344 | 563 | 'form': form, | 722 | 'form': form, |
1345 | 564 | } | 723 | } |
1347 | 565 | return render_to_response('schedule/propose_meeting.html', | 724 | return render_to_response('schedule/propose_meeting.html', |
1348 | 566 | context, RequestContext(request)) | 725 | context, RequestContext(request)) |
1350 | 567 | 726 | ||
1351 | 727 | |||
1352 | 568 | @summit_attendee_required | 728 | @summit_attendee_required |
1354 | 569 | def organizer_edit_meeting(request, summit, attendee, meeting_id, meeting_slug): | 729 | def organizer_edit_meeting( |
1355 | 730 | request, | ||
1356 | 731 | summit, | ||
1357 | 732 | attendee, | ||
1358 | 733 | meeting_id, | ||
1359 | 734 | meeting_slug | ||
1360 | 735 | ): | ||
1361 | 570 | meeting = get_object_or_404(summit.meeting_set, id=meeting_id) | 736 | meeting = get_object_or_404(summit.meeting_set, id=meeting_id) |
1363 | 571 | 737 | ||
1364 | 572 | if not summit.is_organizer(attendee): | 738 | if not summit.is_organizer(attendee): |
1366 | 573 | return HttpResponseRedirect(reverse('summit.schedule.views.summit', args=(summit.name,))) | 739 | return HttpResponseRedirect( |
1367 | 740 | reverse( | ||
1368 | 741 | 'summit.schedule.views.summit', | ||
1369 | 742 | args=(summit.name,) | ||
1370 | 743 | ) | ||
1371 | 744 | ) | ||
1372 | 574 | else: | 745 | else: |
1374 | 575 | if request.method == 'POST': | 746 | if request.method == 'POST': |
1375 | 576 | form = OrganizerEditMeeting(data=request.POST, instance=meeting) | 747 | form = OrganizerEditMeeting(data=request.POST, instance=meeting) |
1376 | 577 | if form.is_valid(): | 748 | if form.is_valid(): |
1377 | 578 | form.save() | 749 | form.save() |
1378 | @@ -584,17 +755,23 @@ | |||
1379 | 584 | 'summit': summit, | 755 | 'summit': summit, |
1380 | 585 | 'form': form, | 756 | 'form': form, |
1381 | 586 | } | 757 | } |
1383 | 587 | return render_to_response('schedule/org_edit_meeting.html', | 758 | return render_to_response('schedule/org_edit_meeting.html', |
1384 | 588 | context, RequestContext(request)) | 759 | context, RequestContext(request)) |
1385 | 589 | 760 | ||
1386 | 761 | |||
1387 | 590 | @summit_attendee_required | 762 | @summit_attendee_required |
1388 | 591 | def edit_meeting(request, summit, attendee, meeting_id, meeting_slug): | 763 | def edit_meeting(request, summit, attendee, meeting_id, meeting_slug): |
1389 | 592 | meeting = get_object_or_404(summit.meeting_set, id=meeting_id) | 764 | meeting = get_object_or_404(summit.meeting_set, id=meeting_id) |
1391 | 593 | 765 | ||
1392 | 594 | if attendee != meeting.drafter: | 766 | if attendee != meeting.drafter: |
1394 | 595 | return HttpResponseRedirect(reverse('summit.schedule.views.summit', args=(summit.name,))) | 767 | return HttpResponseRedirect( |
1395 | 768 | reverse( | ||
1396 | 769 | 'summit.schedule.views.summit', | ||
1397 | 770 | args=(summit.name,) | ||
1398 | 771 | ) | ||
1399 | 772 | ) | ||
1400 | 596 | else: | 773 | else: |
1402 | 597 | if request.method == 'POST': | 774 | if request.method == 'POST': |
1403 | 598 | form = EditMeeting(data=request.POST, instance=meeting) | 775 | form = EditMeeting(data=request.POST, instance=meeting) |
1404 | 599 | if form.is_valid(): | 776 | if form.is_valid(): |
1405 | 600 | form.save() | 777 | form.save() |
1406 | @@ -606,14 +783,55 @@ | |||
1407 | 606 | 'summit': summit, | 783 | 'summit': summit, |
1408 | 607 | 'form': form, | 784 | 'form': form, |
1409 | 608 | } | 785 | } |
1412 | 609 | return render_to_response('schedule/edit_meeting.html', | 786 | return render_to_response('schedule/edit_meeting.html', |
1413 | 610 | context, RequestContext(request)) | 787 | context, RequestContext(request)) |
1414 | 788 | |||
1415 | 789 | |||
1416 | 790 | @summit_attendee_required | ||
1417 | 791 | def edit_meeting_hangout( | ||
1418 | 792 | request, | ||
1419 | 793 | summit, | ||
1420 | 794 | attendee, | ||
1421 | 795 | meeting_id, | ||
1422 | 796 | meeting_slug | ||
1423 | 797 | ): | ||
1424 | 798 | meeting = get_object_or_404(summit.meeting_set, id=meeting_id) | ||
1425 | 799 | # TODO: Add logic that prevents this view from being accessed if the | ||
1426 | 800 | # Summit or meeting is not virtual | ||
1427 | 801 | if not summit.is_organizer(attendee) and attendee != meeting.drafter: | ||
1428 | 802 | return HttpResponseRedirect( | ||
1429 | 803 | reverse( | ||
1430 | 804 | 'summit.schedule.views.summit', | ||
1431 | 805 | args=(summit.name,) | ||
1432 | 806 | ) | ||
1433 | 807 | ) | ||
1434 | 808 | else: | ||
1435 | 809 | if request.method == 'POST': | ||
1436 | 810 | form = EditMeetingHangout(data=request.POST, instance=meeting) | ||
1437 | 811 | if form.is_valid(): | ||
1438 | 812 | form.save() | ||
1439 | 813 | return HttpResponseRedirect(meeting.meeting_page_url) | ||
1440 | 814 | else: | ||
1441 | 815 | form = EditMeetingHangout(instance=meeting) | ||
1442 | 816 | |||
1443 | 817 | context = { | ||
1444 | 818 | 'summit': summit, | ||
1445 | 819 | 'form': form, | ||
1446 | 820 | } | ||
1447 | 821 | return render_to_response('schedule/edit_hangout.html', | ||
1448 | 822 | context, RequestContext(request)) | ||
1449 | 823 | |||
1450 | 611 | 824 | ||
1451 | 612 | @summit_required | 825 | @summit_required |
1452 | 613 | def review_pending(request, summit, attendee): | 826 | def review_pending(request, summit, attendee): |
1453 | 614 | 827 | ||
1454 | 615 | if not summit.is_organizer(attendee): | 828 | if not summit.is_organizer(attendee): |
1456 | 616 | return HttpResponseRedirect(reverse('summit.schedule.views.summit', args=(summit.name,))) | 829 | return HttpResponseRedirect( |
1457 | 830 | reverse( | ||
1458 | 831 | 'summit.schedule.views.summit', | ||
1459 | 832 | args=(summit.name,) | ||
1460 | 833 | ) | ||
1461 | 834 | ) | ||
1462 | 617 | else: | 835 | else: |
1463 | 618 | schedule = SortedDict() | 836 | schedule = SortedDict() |
1464 | 619 | 837 | ||
1465 | @@ -632,12 +850,18 @@ | |||
1466 | 632 | return render_to_response("schedule/review.html", context, | 850 | return render_to_response("schedule/review.html", context, |
1467 | 633 | context_instance=RequestContext(request)) | 851 | context_instance=RequestContext(request)) |
1468 | 634 | 852 | ||
1469 | 853 | |||
1470 | 635 | @summit_required | 854 | @summit_required |
1471 | 636 | def meeting_review(request, summit, attendee, meeting_id): | 855 | def meeting_review(request, summit, attendee, meeting_id): |
1472 | 637 | meeting = get_object_or_404(summit.meeting_set, id=meeting_id) | 856 | meeting = get_object_or_404(summit.meeting_set, id=meeting_id) |
1473 | 638 | 857 | ||
1474 | 639 | if not summit.is_organizer(attendee): | 858 | if not summit.is_organizer(attendee): |
1476 | 640 | return HttpResponseRedirect(reverse('summit.schedule.views.summit', args=(summit.name,))) | 859 | return HttpResponseRedirect( |
1477 | 860 | reverse( | ||
1478 | 861 | 'summit.schedule.views.summit', | ||
1479 | 862 | args=(summit.name,) | ||
1480 | 863 | ) | ||
1481 | 864 | ) | ||
1482 | 641 | else: | 865 | else: |
1483 | 642 | if request.method == 'POST': | 866 | if request.method == 'POST': |
1484 | 643 | form = MeetingReview(data=request.POST, instance=meeting) | 867 | form = MeetingReview(data=request.POST, instance=meeting) |
1485 | @@ -656,12 +880,19 @@ | |||
1486 | 656 | return render_to_response('schedule/meeting_review.html', | 880 | return render_to_response('schedule/meeting_review.html', |
1487 | 657 | context, RequestContext(request)) | 881 | context, RequestContext(request)) |
1488 | 658 | 882 | ||
1489 | 883 | |||
1490 | 659 | @summit_required | 884 | @summit_required |
1491 | 660 | def created_meetings(request, summit, attendee, username): | 885 | def created_meetings(request, summit, attendee, username): |
1492 | 661 | 886 | ||
1494 | 662 | drafter = get_object_or_404(Attendee, summit=summit, user__username=username) | 887 | drafter = get_object_or_404( |
1495 | 888 | Attendee, | ||
1496 | 889 | summit=summit, | ||
1497 | 890 | user__username=username | ||
1498 | 891 | ) | ||
1499 | 663 | if attendee is None or attendee.id != drafter.id: | 892 | if attendee is None or attendee.id != drafter.id: |
1501 | 664 | meetings = summit.meeting_set.filter(drafter=drafter).exclude(private=True) | 893 | meetings = summit.meeting_set.filter( |
1502 | 894 | drafter=drafter | ||
1503 | 895 | ).exclude(private=True) | ||
1504 | 665 | else: | 896 | else: |
1505 | 666 | meetings = summit.meeting_set.filter(drafter=drafter) | 897 | meetings = summit.meeting_set.filter(drafter=drafter) |
1506 | 667 | 898 | ||
1507 | @@ -674,12 +905,18 @@ | |||
1508 | 674 | return render_to_response("schedule/mine.html", context, | 905 | return render_to_response("schedule/mine.html", context, |
1509 | 675 | context_instance=RequestContext(request)) | 906 | context_instance=RequestContext(request)) |
1510 | 676 | 907 | ||
1511 | 908 | |||
1512 | 677 | @summit_required | 909 | @summit_required |
1513 | 678 | def meeting_copy(request, summit, attendee, meeting_id, meeting_slug): | 910 | def meeting_copy(request, summit, attendee, meeting_id, meeting_slug): |
1514 | 679 | meeting = get_object_or_404(summit.meeting_set, id=meeting_id) | 911 | meeting = get_object_or_404(summit.meeting_set, id=meeting_id) |
1515 | 680 | 912 | ||
1516 | 681 | if not summit.can_change_agenda(attendee): | 913 | if not summit.can_change_agenda(attendee): |
1518 | 682 | return HttpResponseRedirect(reverse('summit.schedule.views.summit', args=(summit.name,))) | 914 | return HttpResponseRedirect( |
1519 | 915 | reverse( | ||
1520 | 916 | 'summit.schedule.views.summit', | ||
1521 | 917 | args=(summit.name,) | ||
1522 | 918 | ) | ||
1523 | 919 | ) | ||
1524 | 683 | else: | 920 | else: |
1525 | 684 | if request.method == 'POST': | 921 | if request.method == 'POST': |
1526 | 685 | form = CreateMeeting(instance=meeting, data=request.POST) | 922 | form = CreateMeeting(instance=meeting, data=request.POST) |
1527 | @@ -692,7 +929,6 @@ | |||
1528 | 692 | meeting = form.save() | 929 | meeting = form.save() |
1529 | 693 | meeting_id = meeting.id | 930 | meeting_id = meeting.id |
1530 | 694 | return HttpResponseRedirect(meeting.meeting_page_url) | 931 | return HttpResponseRedirect(meeting.meeting_page_url) |
1531 | 695 | |||
1532 | 696 | else: | 932 | else: |
1533 | 697 | form = CreateMeeting(instance=meeting) | 933 | form = CreateMeeting(instance=meeting) |
1534 | 698 | 934 | ||
1535 | @@ -700,19 +936,23 @@ | |||
1536 | 700 | 'summit': summit, | 936 | 'summit': summit, |
1537 | 701 | 'form': form, | 937 | 'form': form, |
1538 | 702 | } | 938 | } |
1541 | 703 | 939 | ||
1542 | 704 | return render_to_response('schedule/create_meeting.html', | 940 | return render_to_response('schedule/create_meeting.html', |
1543 | 705 | context, RequestContext(request)) | 941 | context, RequestContext(request)) |
1544 | 706 | 942 | ||
1545 | 943 | |||
1546 | 707 | @summit_attendee_required | 944 | @summit_attendee_required |
1547 | 708 | def attend_meeting(request, summit, attendee, meeting_id): | 945 | def attend_meeting(request, summit, attendee, meeting_id): |
1548 | 709 | meeting = get_object_or_404(summit.meeting_set, id=meeting_id) | 946 | meeting = get_object_or_404(summit.meeting_set, id=meeting_id) |
1549 | 710 | 947 | ||
1550 | 711 | try: | 948 | try: |
1552 | 712 | participant = Participant.objects.get(attendee=attendee, meeting=meeting) | 949 | participant = Participant.objects.get( |
1553 | 950 | attendee=attendee, | ||
1554 | 951 | meeting=meeting | ||
1555 | 952 | ) | ||
1556 | 713 | except Participant.DoesNotExist: | 953 | except Participant.DoesNotExist: |
1557 | 714 | participant = Participant(attendee=attendee, meeting=meeting) | 954 | participant = Participant(attendee=attendee, meeting=meeting) |
1559 | 715 | 955 | ||
1560 | 716 | if request.method == 'POST': | 956 | if request.method == 'POST': |
1561 | 717 | form = AttendMeeting(data=request.POST, instance=participant) | 957 | form = AttendMeeting(data=request.POST, instance=participant) |
1562 | 718 | if form.is_valid(): | 958 | if form.is_valid(): |
1563 | @@ -731,44 +971,79 @@ | |||
1564 | 731 | return render_to_response('schedule/attend.html', | 971 | return render_to_response('schedule/attend.html', |
1565 | 732 | context, RequestContext(request)) | 972 | context, RequestContext(request)) |
1566 | 733 | 973 | ||
1567 | 974 | |||
1568 | 734 | @summit_required | 975 | @summit_required |
1569 | 735 | def attendee_review(request, summit, attendee, meeting_slug, meeting_id): | 976 | def attendee_review(request, summit, attendee, meeting_slug, meeting_id): |
1570 | 736 | meeting = get_object_or_404(summit.meeting_set, id=meeting_id) | 977 | meeting = get_object_or_404(summit.meeting_set, id=meeting_id) |
1571 | 737 | 978 | ||
1572 | 738 | if not summit.is_organizer(attendee) and attendee != meeting.drafter: | 979 | if not summit.is_organizer(attendee) and attendee != meeting.drafter: |
1574 | 739 | return HttpResponseRedirect(reverse('summit.schedule.views.summit', args=(summit.name,))) | 980 | return HttpResponseRedirect( |
1575 | 981 | reverse( | ||
1576 | 982 | 'summit.schedule.views.summit', | ||
1577 | 983 | args=(summit.name,) | ||
1578 | 984 | ) | ||
1579 | 985 | ) | ||
1580 | 740 | else: | 986 | else: |
1581 | 741 | participants = meeting.participant_set.all() | 987 | participants = meeting.participant_set.all() |
1582 | 742 | 988 | ||
1583 | 743 | context = { | 989 | context = { |
1584 | 744 | 'summit': summit, | 990 | 'summit': summit, |
1587 | 745 | 'meeting':meeting, | 991 | 'meeting': meeting, |
1588 | 746 | 'participants':participants, | 992 | 'participants': participants, |
1589 | 747 | 'summit_organizer': summit.is_organizer(attendee), | 993 | 'summit_organizer': summit.is_organizer(attendee), |
1590 | 748 | 994 | ||
1591 | 749 | } | 995 | } |
1592 | 750 | return render_to_response("schedule/attendees.html", context, | 996 | return render_to_response("schedule/attendees.html", context, |
1593 | 751 | context_instance=RequestContext(request)) | 997 | context_instance=RequestContext(request)) |
1594 | 752 | 998 | ||
1595 | 999 | |||
1596 | 753 | @summit_attendee_required | 1000 | @summit_attendee_required |
1598 | 754 | def organizer_edit_attendees(request, summit, logged_in_user, username, meeting_id): | 1001 | def organizer_edit_attendees( |
1599 | 1002 | request, | ||
1600 | 1003 | summit, | ||
1601 | 1004 | logged_in_user, | ||
1602 | 1005 | username, | ||
1603 | 1006 | meeting_id | ||
1604 | 1007 | ): | ||
1605 | 755 | meeting = get_object_or_404(summit.meeting_set, id=meeting_id) | 1008 | meeting = get_object_or_404(summit.meeting_set, id=meeting_id) |
1607 | 756 | attendee = get_object_or_404(Attendee, summit=summit, user__username=username) | 1009 | attendee = get_object_or_404( |
1608 | 1010 | Attendee, | ||
1609 | 1011 | summit=summit, | ||
1610 | 1012 | user__username=username | ||
1611 | 1013 | ) | ||
1612 | 757 | meeting_slug = get_object_or_404(Meeting, summit=summit, id=meeting_id) | 1014 | meeting_slug = get_object_or_404(Meeting, summit=summit, id=meeting_id) |
1613 | 758 | 1015 | ||
1616 | 759 | if not summit.is_organizer(logged_in_user) and logged_in_user != meeting.drafter: | 1016 | if not summit.is_organizer( |
1617 | 760 | return HttpResponseRedirect(reverse('summit.schedule.views.summit', args=(summit.name,))) | 1017 | logged_in_user |
1618 | 1018 | ) and logged_in_user != meeting.drafter: | ||
1619 | 1019 | return HttpResponseRedirect( | ||
1620 | 1020 | reverse( | ||
1621 | 1021 | 'summit.schedule.views.summit', | ||
1622 | 1022 | args=(summit.name,) | ||
1623 | 1023 | ) | ||
1624 | 1024 | ) | ||
1625 | 761 | else: | 1025 | else: |
1626 | 762 | try: | 1026 | try: |
1628 | 763 | participant = Participant.objects.get(attendee=attendee, meeting=meeting) | 1027 | participant = Participant.objects.get( |
1629 | 1028 | attendee=attendee, | ||
1630 | 1029 | meeting=meeting | ||
1631 | 1030 | ) | ||
1632 | 764 | except Participant.DoesNotExist: | 1031 | except Participant.DoesNotExist: |
1633 | 765 | participant = Participant(attendee=attendee, meeting=meeting) | 1032 | participant = Participant(attendee=attendee, meeting=meeting) |
1635 | 766 | 1033 | ||
1636 | 767 | if request.method == 'POST': | 1034 | if request.method == 'POST': |
1638 | 768 | form = OrganizerChangeAttend(data=request.POST, instance=participant) | 1035 | form = OrganizerChangeAttend( |
1639 | 1036 | data=request.POST, | ||
1640 | 1037 | instance=participant | ||
1641 | 1038 | ) | ||
1642 | 769 | if form.is_valid(): | 1039 | if form.is_valid(): |
1643 | 770 | form.save() | 1040 | form.save() |
1645 | 771 | return HttpResponseRedirect(reverse('summit.schedule.views.attendee_review', args=(summit.name, meeting.id, meeting.name))) | 1041 | return HttpResponseRedirect( |
1646 | 1042 | reverse( | ||
1647 | 1043 | 'summit.schedule.views.attendee_review', | ||
1648 | 1044 | args=(summit.name, meeting.id, meeting.name) | ||
1649 | 1045 | ) | ||
1650 | 1046 | ) | ||
1651 | 772 | else: | 1047 | else: |
1652 | 773 | form = OrganizerChangeAttend(instance=participant) | 1048 | form = OrganizerChangeAttend(instance=participant) |
1653 | 774 | 1049 | ||
1654 | @@ -784,11 +1059,22 @@ | |||
1655 | 784 | 1059 | ||
1656 | 785 | 1060 | ||
1657 | 786 | @summit_attendee_required | 1061 | @summit_attendee_required |
1659 | 787 | def delete_meeting_confirm(request, summit, attendee, meeting_id, meeting_slug): | 1062 | def delete_meeting_confirm( |
1660 | 1063 | request, | ||
1661 | 1064 | summit, | ||
1662 | 1065 | attendee, | ||
1663 | 1066 | meeting_id, | ||
1664 | 1067 | meeting_slug | ||
1665 | 1068 | ): | ||
1666 | 788 | meeting = get_object_or_404(summit.meeting_set, id=meeting_id) | 1069 | meeting = get_object_or_404(summit.meeting_set, id=meeting_id) |
1668 | 789 | 1070 | ||
1669 | 790 | if not attendee.user in summit.schedulers.all() and not attendee.user.has_perm('schedule.change_agenda'): | 1071 | if not attendee.user in summit.schedulers.all() and not attendee.user.has_perm('schedule.change_agenda'): |
1671 | 791 | return HttpResponseRedirect(reverse('summit.schedule.views.summit', args=(summit.name,))) | 1072 | return HttpResponseRedirect( |
1672 | 1073 | reverse( | ||
1673 | 1074 | 'summit.schedule.views.summit', | ||
1674 | 1075 | args=(summit.name,) | ||
1675 | 1076 | ) | ||
1676 | 1077 | ) | ||
1677 | 792 | 1078 | ||
1678 | 793 | context = { | 1079 | context = { |
1679 | 794 | 'summit': summit, | 1080 | 'summit': summit, |
1680 | @@ -801,18 +1087,29 @@ | |||
1681 | 801 | 1087 | ||
1682 | 802 | @summit_attendee_required | 1088 | @summit_attendee_required |
1683 | 803 | def delete_meeting(request, summit, attendee, meeting_id, meeting_slug): | 1089 | def delete_meeting(request, summit, attendee, meeting_id, meeting_slug): |
1685 | 804 | meeting = get_object_or_404(summit.meeting_set, pk = meeting_id) | 1090 | meeting = get_object_or_404(summit.meeting_set, pk=meeting_id) |
1686 | 805 | if not attendee.user in summit.schedulers.all() and not attendee.user.has_perm('schedule.change_agenda'): | 1091 | if not attendee.user in summit.schedulers.all() and not attendee.user.has_perm('schedule.change_agenda'): |
1688 | 806 | return HttpResponseRedirect(reverse('summit.schedule.views.summit', args=(summit.name,))) | 1092 | return HttpResponseRedirect( |
1689 | 1093 | reverse( | ||
1690 | 1094 | 'summit.schedule.views.summit', | ||
1691 | 1095 | args=(summit.name,) | ||
1692 | 1096 | ) | ||
1693 | 1097 | ) | ||
1694 | 807 | else: | 1098 | else: |
1695 | 808 | meeting.approved = 'REMOVED' | 1099 | meeting.approved = 'REMOVED' |
1696 | 809 | meeting.save() | 1100 | meeting.save() |
1697 | 810 | meeting.agenda_set.all().delete() | 1101 | meeting.agenda_set.all().delete() |
1699 | 811 | return HttpResponseRedirect(reverse('summit.schedule.views.delete_confirmed', args=(summit.name,))) | 1102 | return HttpResponseRedirect( |
1700 | 1103 | reverse( | ||
1701 | 1104 | 'summit.schedule.views.delete_confirmed', | ||
1702 | 1105 | args=(summit.name,) | ||
1703 | 1106 | ) | ||
1704 | 1107 | ) | ||
1705 | 1108 | |||
1706 | 812 | 1109 | ||
1707 | 813 | def delete_confirmed(request, summit_name): | 1110 | def delete_confirmed(request, summit_name): |
1708 | 814 | summit = get_object_or_404(Summit, name=summit_name) | 1111 | summit = get_object_or_404(Summit, name=summit_name) |
1710 | 815 | 1112 | ||
1711 | 816 | context = { | 1113 | context = { |
1712 | 817 | 'summit': summit | 1114 | 'summit': summit |
1713 | 818 | } | 1115 | } |
1714 | 819 | 1116 | ||
1715 | === modified file 'summit/urls.py' | |||
1716 | --- summit/urls.py 2012-10-26 09:32:11 +0000 | |||
1717 | +++ summit/urls.py 2013-02-22 02:06:23 +0000 | |||
1718 | @@ -16,7 +16,6 @@ | |||
1719 | 16 | 16 | ||
1720 | 17 | from django.conf.urls.defaults import * | 17 | from django.conf.urls.defaults import * |
1721 | 18 | from django.conf import settings | 18 | from django.conf import settings |
1722 | 19 | import ubuntu_website | ||
1723 | 20 | 19 | ||
1724 | 21 | from common.views import login_failure | 20 | from common.views import login_failure |
1725 | 22 | 21 | ||
1726 | @@ -24,13 +23,15 @@ | |||
1727 | 24 | admin.autodiscover() | 23 | admin.autodiscover() |
1728 | 25 | 24 | ||
1729 | 26 | 25 | ||
1731 | 27 | urlpatterns = patterns('', | 26 | urlpatterns = patterns( |
1732 | 27 | '', | ||
1733 | 28 | (r'^$', 'summit.common.views.index'), | 28 | (r'^$', 'summit.common.views.index'), |
1734 | 29 | (r'^admin/', admin.site.urls), | 29 | (r'^admin/', admin.site.urls), |
1735 | 30 | (r'^api/', include('services.urls')), | 30 | (r'^api/', include('services.urls')), |
1736 | 31 | ) | 31 | ) |
1737 | 32 | 32 | ||
1739 | 33 | urlpatterns += patterns('django_openid_auth.views', | 33 | urlpatterns += patterns( |
1740 | 34 | 'django_openid_auth.views', | ||
1741 | 34 | url(r'^openid/login/$', 'login_begin', name='openid-login', | 35 | url(r'^openid/login/$', 'login_begin', name='openid-login', |
1742 | 35 | kwargs={'render_failure': login_failure}), | 36 | kwargs={'render_failure': login_failure}), |
1743 | 36 | url(r'^openid/complete/$', 'login_complete', name='openid-complete', | 37 | url(r'^openid/complete/$', 'login_complete', name='openid-complete', |
1744 | @@ -38,19 +39,17 @@ | |||
1745 | 38 | url(r'^openid/logo.gif$', 'logo', name='openid-logo'), | 39 | url(r'^openid/logo.gif$', 'logo', name='openid-logo'), |
1746 | 39 | ) | 40 | ) |
1747 | 40 | 41 | ||
1749 | 41 | urlpatterns += patterns('summit.sponsor.views', | 42 | urlpatterns += patterns( |
1750 | 43 | 'summit.sponsor.views', | ||
1751 | 42 | (r'^(?P<summit_name>[\w-]+)/sponsorship/$', 'sponsorship'), | 44 | (r'^(?P<summit_name>[\w-]+)/sponsorship/$', 'sponsorship'), |
1752 | 43 | (r'^(?P<summit_name>[\w-]+)/sponsorship/done/$', 'done'), | 45 | (r'^(?P<summit_name>[\w-]+)/sponsorship/done/$', 'done'), |
1753 | 44 | (r'^(?P<summit_name>[\w-]+)/sponsorship/review/$', 'review_list'), | 46 | (r'^(?P<summit_name>[\w-]+)/sponsorship/review/$', 'review_list'), |
1754 | 45 | |||
1755 | 46 | (r'^(?P<summit_name>[\w-]+)/suggestsponsorship/$', 'suggestsponsorship'), | 47 | (r'^(?P<summit_name>[\w-]+)/suggestsponsorship/$', 'suggestsponsorship'), |
1756 | 47 | (r'^(?P<summit_name>[\w-]+)/suggestsponsorship/done/$', 'suggestiondone'), | 48 | (r'^(?P<summit_name>[\w-]+)/suggestsponsorship/done/$', 'suggestiondone'), |
1757 | 48 | |||
1758 | 49 | (r'^(?P<summit_name>[\w-]+)/nonlaunchpadsponsorship/$', | 49 | (r'^(?P<summit_name>[\w-]+)/nonlaunchpadsponsorship/$', |
1759 | 50 | 'nonlaunchpadsponsorship'), | 50 | 'nonlaunchpadsponsorship'), |
1760 | 51 | (r'^(?P<summit_name>[\w-]+)/nonlaunchpadsponsorship/done/$', | 51 | (r'^(?P<summit_name>[\w-]+)/nonlaunchpadsponsorship/done/$', |
1761 | 52 | 'nonlaunchpaddone'), | 52 | 'nonlaunchpaddone'), |
1762 | 53 | |||
1763 | 54 | (r'^(?P<summit_name>[\w-]+)/sponsorship/review/(?P<sponsorship_id>[0-9]+)$', | 53 | (r'^(?P<summit_name>[\w-]+)/sponsorship/review/(?P<sponsorship_id>[0-9]+)$', |
1764 | 55 | 'review'), | 54 | 'review'), |
1765 | 56 | (r'^(?P<summit_name>[\w-]+)/suggestedsponsorship/review/(?P<sponsorship_id>[0-9]+)$', | 55 | (r'^(?P<summit_name>[\w-]+)/suggestedsponsorship/review/(?P<sponsorship_id>[0-9]+)$', |
1766 | @@ -61,7 +60,8 @@ | |||
1767 | 61 | (r'^(?P<summit_name>[\w-]+)/sponsorship/export/$', 'export'), | 60 | (r'^(?P<summit_name>[\w-]+)/sponsorship/export/$', 'export'), |
1768 | 62 | ) | 61 | ) |
1769 | 63 | 62 | ||
1771 | 64 | urlpatterns += patterns('summit.schedule.views', | 63 | urlpatterns += patterns( |
1772 | 64 | 'summit.schedule.views', | ||
1773 | 65 | url(r'^today/(?P<summit_name>[\w-]+)/$', 'today_view', name='today'), | 65 | url(r'^today/(?P<summit_name>[\w-]+)/$', 'today_view', name='today'), |
1774 | 66 | url(r'^past/', 'past', name='past'), | 66 | url(r'^past/', 'past', name='past'), |
1775 | 67 | url(r'^logout$', 'logout_view', name='logout'), | 67 | url(r'^logout$', 'logout_view', name='logout'), |
1776 | @@ -69,42 +69,66 @@ | |||
1777 | 69 | (r'^(?P<summit_name>[\w-]+)/mobile/$', 'mobile'), | 69 | (r'^(?P<summit_name>[\w-]+)/mobile/$', 'mobile'), |
1778 | 70 | (r'^(?P<summit_name>[\w-]+)/search/$', 'search'), | 70 | (r'^(?P<summit_name>[\w-]+)/search/$', 'search'), |
1779 | 71 | (r'^(?P<summit_name>[\w-]+)/propose_meeting/$', 'propose_meeting'), | 71 | (r'^(?P<summit_name>[\w-]+)/propose_meeting/$', 'propose_meeting'), |
1781 | 72 | (r'^(?P<summit_name>[\w-]+)/edit_meeting/(?P<meeting_id>\d+)/(?P<meeting_slug>[%+\.\w-]+)/$', 'edit_meeting'), | 72 | (r'^(?P<summit_name>[\w-]+)/edit_meeting/(?P<meeting_id>\d+)/(?P<meeting_slug>[%+\.\w-]+)/$', |
1782 | 73 | 'edit_meeting'), | ||
1783 | 73 | (r'^(?P<summit_name>[\w-]+)/review/$', 'review_pending'), | 74 | (r'^(?P<summit_name>[\w-]+)/review/$', 'review_pending'), |
1787 | 74 | (r'^(?P<summit_name>[\w-]+)/review_meeting/(?P<meeting_id>\d+)/$', 'meeting_review'), | 75 | (r'^(?P<summit_name>[\w-]+)/review_meeting/(?P<meeting_id>\d+)/$', |
1788 | 75 | (r'^(?P<summit_name>[\w-]+)/attend_meeting/(?P<meeting_id>\d+)/$', 'attend_meeting'), | 76 | 'meeting_review'), |
1789 | 76 | (r'^(?P<summit_name>[\w-]+)/edit_attendee/(?P<meeting_id>\d+)/(?P<username>[%+\.\w-]+)/$', 'organizer_edit_attendees'), | 77 | (r'^(?P<summit_name>[\w-]+)/attend_meeting/(?P<meeting_id>\d+)/$', |
1790 | 78 | 'attend_meeting'), | ||
1791 | 79 | (r'^(?P<summit_name>[\w-]+)/edit_attendee/(?P<meeting_id>\d+)/(?P<username>[%+\.\w-]+)/$', | ||
1792 | 80 | 'organizer_edit_attendees'), | ||
1793 | 77 | (r'^(?P<summit_name>[\w-]+)/create_meeting/$', 'create_meeting'), | 81 | (r'^(?P<summit_name>[\w-]+)/create_meeting/$', 'create_meeting'), |
1797 | 78 | (r'^(?P<summit_name>[\w-]+)/edit_mtg/(?P<meeting_id>\d+)/(?P<meeting_slug>[%+\.\w-]+)/$', 'organizer_edit_meeting'), | 82 | (r'^(?P<summit_name>[\w-]+)/edit_mtg/(?P<meeting_id>\d+)/(?P<meeting_slug>[%+\.\w-]+)/$', |
1798 | 79 | (r'^(?P<summit_name>[\w-]+)/confirm_del_mtg/(?P<meeting_id>\d+)/(?P<meeting_slug>[%+\.\w-]+)/$', 'delete_meeting_confirm'), | 83 | 'organizer_edit_meeting'), |
1799 | 80 | (r'^(?P<summit_name>[\w-]+)/del_mtg/(?P<meeting_id>\d+)/(?P<meeting_slug>[%+\.\w-]+)/$', 'delete_meeting'), | 84 | (r'^(?P<summit_name>[\w-]+)/hangout/(?P<meeting_id>\d+)/(?P<meeting_slug>[%+\.\w-]+)/$', |
1800 | 85 | 'edit_meeting_hangout'), | ||
1801 | 86 | (r'^(?P<summit_name>[\w-]+)/confirm_del_mtg/(?P<meeting_id>\d+)/(?P<meeting_slug>[%+\.\w-]+)/$', | ||
1802 | 87 | 'delete_meeting_confirm'), | ||
1803 | 88 | (r'^(?P<summit_name>[\w-]+)/del_mtg/(?P<meeting_id>\d+)/(?P<meeting_slug>[%+\.\w-]+)/$', | ||
1804 | 89 | 'delete_meeting'), | ||
1805 | 81 | (r'^(?P<summit_name>[\w-]+)/deleted/$', 'delete_confirmed'), | 90 | (r'^(?P<summit_name>[\w-]+)/deleted/$', 'delete_confirmed'), |
1807 | 82 | (r'^(?P<summit_name>[\w-]+)/attendee_review/(?P<meeting_id>\d+)/(?P<meeting_slug>[%+\.\w-]+)/$', 'attendee_review'), | 91 | (r'^(?P<summit_name>[\w-]+)/attendee_review/(?P<meeting_id>\d+)/(?P<meeting_slug>[%+\.\w-]+)/$', |
1808 | 92 | 'attendee_review'), | ||
1809 | 83 | (r'^(?P<summit_name>[\w-]+)/tracks$', 'tracks'), | 93 | (r'^(?P<summit_name>[\w-]+)/tracks$', 'tracks'), |
1810 | 84 | (r'^(?P<summit_name>[\w-]+)/next$', 'next_session'), | 94 | (r'^(?P<summit_name>[\w-]+)/next$', 'next_session'), |
1811 | 85 | (r'^(?P<summit_name>[\w-]+)/next_table$', 'next_table'), | 95 | (r'^(?P<summit_name>[\w-]+)/next_table$', 'next_table'), |
1813 | 86 | (r'^(?P<summit_name>[\w-]+)/(?P<username>[%+\.\w-]+)/meetings$', 'created_meetings'), | 96 | (r'^(?P<summit_name>[\w-]+)/(?P<username>[%+\.\w-]+)/meetings$', |
1814 | 97 | 'created_meetings'), | ||
1815 | 87 | (r'^(?P<summit_name>[\w-]+)/(?P<date>[\d-]+)/$', 'daily_schedule'), | 98 | (r'^(?P<summit_name>[\w-]+)/(?P<date>[\d-]+)/$', 'daily_schedule'), |
1816 | 88 | (r'^(?P<summit_name>[\w-]+)/(?P<date>[\d-]+)/display$', 'by_date'), | 99 | (r'^(?P<summit_name>[\w-]+)/(?P<date>[\d-]+)/display$', 'by_date'), |
1817 | 89 | (r'^(?P<summit_name>[\w-]+)/(?P<room_name>[%+\.\w-]+)/$', 'by_room'), | 100 | (r'^(?P<summit_name>[\w-]+)/(?P<room_name>[%+\.\w-]+)/$', 'by_room'), |
1825 | 90 | (r'^(?P<summit_name>[\w-]+)/track/(?P<track_slug>[%+\.\w-]+)/$', 'by_track'), | 101 | (r'^(?P<summit_name>[\w-]+)/track/(?P<track_slug>[%+\.\w-]+)/$', |
1826 | 91 | (r'^(?P<summit_name>[\w-]+)/meeting/(?P<meeting_id>\d+)/(?P<meeting_slug>[%+\.\w-]+)/\+share$', 'share_meeting'), | 102 | 'by_track'), |
1827 | 92 | (r'^(?P<summit_name>[\w-]+)/meeting/(?P<meeting_id>\d+)/(?P<meeting_slug>[%+\.\w-]+)/\+register', 'register'), | 103 | (r'^(?P<summit_name>[\w-]+)/meeting/(?P<meeting_id>\d+)/(?P<meeting_slug>[%+\.\w-]+)/\+share$', |
1828 | 93 | (r'^(?P<summit_name>[\w-]+)/meeting/(?P<meeting_id>\d+)/(?P<meeting_slug>[%+\.\w-]+)/\+unregister', 'unregister'), | 104 | 'share_meeting'), |
1829 | 94 | (r'^(?P<summit_name>[\w-]+)/meeting/(?P<meeting_id>\d+)/(?P<meeting_slug>[%+\.\w-]+)/$', 'meeting'), | 105 | (r'^(?P<summit_name>[\w-]+)/meeting/(?P<meeting_id>\d+)/(?P<meeting_slug>[%+\.\w-]+)/\+register', |
1830 | 95 | (r'^(?P<summit_name>[\w-]+)/private/(?P<private_key>[0-9a-f]{32})/(?P<meeting_slug>[%+\.\w-]+)/$', 'private_meeting'), | 106 | 'register'), |
1831 | 96 | (r'^(?P<summit_name>[\w-]+)/meeting/(?P<meeting_id>\d+)/(?P<meeting_slug>[%+\.\w-]+)/copy/$', 'meeting_copy'), | 107 | (r'^(?P<summit_name>[\w-]+)/meeting/(?P<meeting_id>\d+)/(?P<meeting_slug>[%+\.\w-]+)/\+unregister', |
1832 | 108 | 'unregister'), | ||
1833 | 109 | (r'^(?P<summit_name>[\w-]+)/meeting/(?P<meeting_id>\d+)/(?P<meeting_slug>[%+\.\w-]+)/$', | ||
1834 | 110 | 'meeting'), | ||
1835 | 111 | (r'^(?P<summit_name>[\w-]+)/private/(?P<private_key>[0-9a-f]{32})/(?P<meeting_slug>[%+\.\w-]+)/$', | ||
1836 | 112 | 'private_meeting'), | ||
1837 | 113 | (r'^(?P<summit_name>[\w-]+)/meeting/(?P<meeting_id>\d+)/(?P<meeting_slug>[%+\.\w-]+)/copy/$', | ||
1838 | 114 | 'meeting_copy'), | ||
1839 | 97 | (r'^(?P<summit_name>[\w-]+)\.csv$', 'csv'), | 115 | (r'^(?P<summit_name>[\w-]+)\.csv$', 'csv'), |
1840 | 98 | (r'^(?P<summit_name>[\w-]+)\.ical$', 'ical'), | 116 | (r'^(?P<summit_name>[\w-]+)\.ical$', 'ical'), |
1846 | 99 | (r'^(?P<summit_name>[\w-]+)/participant/(?P<username>[%+\.\w-]+)/$', 'by_participant'), | 117 | (r'^(?P<summit_name>[\w-]+)/participant/(?P<username>[%+\.\w-]+)/$', |
1847 | 100 | (r'^(?P<summit_name>[\w-]+)/participant/my_schedule_(?P<secret_key>[0-9a-f]{32})\.ical$', 'user_private_ical'), | 118 | 'by_participant'), |
1848 | 101 | (r'^(?P<summit_name>[\w-]+)/participant/(?P<username>[%+\.\w-]+)\.ical$', 'user_ical'), | 119 | (r'^(?P<summit_name>[\w-]+)/participant/my_schedule_(?P<secret_key>[0-9a-f]{32})\.ical$', |
1849 | 102 | (r'^(?P<summit_name>[\w-]+)/room/(?P<room_name>[%+\.\w-]+).ical$', 'room_ical'), | 120 | 'user_private_ical'), |
1850 | 103 | (r'^(?P<summit_name>[\w-]+)/track/(?P<track_slug>[%+\.\w-]+).ical$', 'track_ical'), | 121 | (r'^(?P<summit_name>[\w-]+)/participant/(?P<username>[%+\.\w-]+)\.ical$', |
1851 | 122 | 'user_ical'), | ||
1852 | 123 | (r'^(?P<summit_name>[\w-]+)/room/(?P<room_name>[%+\.\w-]+).ical$', | ||
1853 | 124 | 'room_ical'), | ||
1854 | 125 | (r'^(?P<summit_name>[\w-]+)/track/(?P<track_slug>[%+\.\w-]+).ical$', | ||
1855 | 126 | 'track_ical'), | ||
1856 | 104 | ) | 127 | ) |
1857 | 105 | 128 | ||
1858 | 106 | if settings.DEBUG or settings.SERVE_STATIC: | 129 | if settings.DEBUG or settings.SERVE_STATIC: |
1860 | 107 | urlpatterns += patterns('', | 130 | urlpatterns += patterns( |
1861 | 131 | '', | ||
1862 | 108 | (r'^media/(?P<path>.*)$', 'django.views.static.serve', | 132 | (r'^media/(?P<path>.*)$', 'django.views.static.serve', |
1863 | 109 | {'document_root': settings.MEDIA_ROOT}), | 133 | {'document_root': settings.MEDIA_ROOT}), |
1864 | 110 | (r'^(robots.txt)$', 'django.views.static.serve', | 134 | (r'^(robots.txt)$', 'django.views.static.serve', |
Looks great