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