Merge lp:~cjohnston/summit/clean-up-test-stuff into lp:summit

Proposed by Chris Johnston
Status: Merged
Approved by: Michael Hall
Approved revision: 483
Merged at revision: 481
Proposed branch: lp:~cjohnston/summit/clean-up-test-stuff
Merge into: lp:summit
Diff against target: 4036 lines (+2340/-524)
7 files modified
requirements.txt (+1/-1)
summit/schedule/admin/meetingadmin.py (+52/-7)
summit/schedule/migrations/0026_add_virtual_sprint_checkbox.py (+215/-0)
summit/schedule/migrations/0027_add_hangout_urls.py (+217/-0)
summit/schedule/models/meetingmodel.py (+30/-10)
summit/schedule/models/summitmodel.py (+28/-16)
summit/schedule/tests.py (+1797/-490)
To merge this branch: bzr merge lp:~cjohnston/summit/clean-up-test-stuff
Reviewer Review Type Date Requested Status
Michael Hall (community) Approve
Review via email: mp+149572@code.launchpad.net

Commit message

Adds URL/virt fields, cleans up some tests, pep8 fixes

To post a comment you must log in.
482. By Chris Johnston

more cleanup

483. By Chris Johnston

fixes some tests

Revision history for this message
Michael Hall (mhall119) wrote :

Looks good, schedule and common tests all pass

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'requirements.txt'
2--- requirements.txt 2012-08-12 22:32:46 +0000
3+++ requirements.txt 2013-02-20 17:36:21 +0000
4@@ -6,7 +6,7 @@
5 # include patches applied by the package maintainers.
6 #
7
8-Django==1.3.1
9+Django==1.3.2
10 South==0.7.3
11 bzr>=2.4b4
12 distribute==0.6.10
13
14=== modified file 'summit/schedule/admin/meetingadmin.py'
15--- summit/schedule/admin/meetingadmin.py 2012-10-09 19:01:06 +0000
16+++ summit/schedule/admin/meetingadmin.py 2013-02-20 17:36:21 +0000
17@@ -132,23 +132,68 @@
18 share.short_description = "Share Meetings (Private only)"
19
20 class MeetingAdmin(admin.ModelAdmin):
21- list_display = ('summit', 'name', 'title', 'slots', 'override_break', 'private', 'requires_dial_in', 'video', 'type', 'approved')
22+ list_display = (
23+ 'summit',
24+ 'name',
25+ 'title',
26+ 'slots',
27+ 'override_break',
28+ 'private',
29+ 'requires_dial_in',
30+ 'video',
31+ 'type',
32+ 'approved',
33+ 'virtual_meeting',
34+ )
35 list_display_links = ('name', 'title')
36- list_filter = ('summit', 'type', 'approved', 'tracks', 'slots', 'private',
37- 'status', 'priority')
38+ list_filter = (
39+ 'summit',
40+ 'type',
41+ 'approved',
42+ 'tracks',
43+ 'slots',
44+ 'private',
45+ 'status',
46+ 'priority',
47+ 'virtual_meeting',
48+ )
49 search_fields = ('name', 'title')
50
51 fieldsets = (
52 (None, {
53- 'fields': ('summit', 'name', 'title', 'description', 'approved',
54- 'type', 'tracks', 'requires_dial_in', 'video'),
55+ 'fields': (
56+ 'summit',
57+ 'name',
58+ 'title',
59+ 'description',
60+ 'virtual_meeting',
61+ 'approved',
62+ 'type',
63+ 'tracks',
64+ 'requires_dial_in',
65+ 'video',
66+ ),
67+ }),
68+ ("Hangout details", {
69+ 'fields': ('hangout_url', 'broadcast_url',)
70 }),
71 ("References", {
72- 'fields': ('spec_url', 'launchpad_blueprint_id', 'wiki_url', 'pad_url'),
73+ 'fields': (
74+ 'spec_url',
75+ 'launchpad_blueprint_id',
76+ 'wiki_url',
77+ 'pad_url'),
78 }),
79 ("Scheduling details", {
80 'classes': ('collapse', ),
81- 'fields': ('slots', 'override_break', 'private', 'private_key', 'status', 'priority')
82+ 'fields': (
83+ 'slots',
84+ 'override_break',
85+ 'private',
86+ 'private_key',
87+ 'status',
88+ 'priority'
89+ )
90 }),
91 ("Key people", {
92 'classes': ('collapse', ),
93
94=== added file 'summit/schedule/migrations/0026_add_virtual_sprint_checkbox.py'
95--- summit/schedule/migrations/0026_add_virtual_sprint_checkbox.py 1970-01-01 00:00:00 +0000
96+++ summit/schedule/migrations/0026_add_virtual_sprint_checkbox.py 2013-02-20 17:36:21 +0000
97@@ -0,0 +1,215 @@
98+# encoding: utf-8
99+import datetime
100+from south.db import db
101+from south.v2 import SchemaMigration
102+from django.db import models
103+
104+class Migration(SchemaMigration):
105+
106+ def forwards(self, orm):
107+
108+ # Adding field 'Meeting.virtual_meeting'
109+ db.add_column('schedule_meeting', 'virtual_meeting', self.gf('django.db.models.fields.BooleanField')(default=False), keep_default=False)
110+
111+ # Adding field 'Summit.virtual_summit'
112+ db.add_column('schedule_summit', 'virtual_summit', self.gf('django.db.models.fields.BooleanField')(default=False), keep_default=False)
113+
114+
115+ def backwards(self, orm):
116+
117+ # Deleting field 'Meeting.virtual_meeting'
118+ db.delete_column('schedule_meeting', 'virtual_meeting')
119+
120+ # Deleting field 'Summit.virtual_summit'
121+ db.delete_column('schedule_summit', 'virtual_summit')
122+
123+
124+ models = {
125+ 'auth.group': {
126+ 'Meta': {'object_name': 'Group'},
127+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
128+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
129+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
130+ },
131+ 'auth.permission': {
132+ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
133+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
134+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
135+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
136+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
137+ },
138+ 'auth.user': {
139+ 'Meta': {'ordering': "['username']", 'object_name': 'User'},
140+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
141+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
142+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
143+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
144+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
145+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
146+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
147+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
148+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
149+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
150+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
151+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
152+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
153+ },
154+ 'contenttypes.contenttype': {
155+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
156+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
157+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
158+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
159+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
160+ },
161+ 'schedule.agenda': {
162+ 'Meta': {'ordering': "('slot', 'room')", 'unique_together': "(('slot', 'room'),)", 'object_name': 'Agenda'},
163+ 'auto': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
164+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
165+ 'meeting': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Meeting']"}),
166+ 'room': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Room']"}),
167+ 'slot': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Slot']"})
168+ },
169+ 'schedule.attendee': {
170+ 'Meta': {'ordering': "('user__username', 'summit')", 'object_name': 'Attendee'},
171+ 'crew': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_column': "'crew'"}),
172+ 'end_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'end'"}),
173+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
174+ 'secret_key_id': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
175+ 'start_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'start'"}),
176+ 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}),
177+ 'tracks': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['schedule.Track']", 'symmetrical': 'False', 'blank': 'True'}),
178+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
179+ },
180+ 'schedule.attendeebusy': {
181+ 'Meta': {'ordering': "('attendee', 'start_utc', 'end_utc')", 'object_name': 'AttendeeBusy'},
182+ 'attendee': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'busy_set'", 'to': "orm['schedule.Attendee']"}),
183+ 'end_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'end'"}),
184+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
185+ 'start_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'start'"})
186+ },
187+ 'schedule.crew': {
188+ 'Meta': {'ordering': "('date_utc', 'attendee')", 'object_name': 'Crew'},
189+ 'attendee': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'crew_schedule'", 'to': "orm['schedule.Attendee']"}),
190+ 'date_utc': ('django.db.models.fields.DateField', [], {'db_column': "'date'"}),
191+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
192+ },
193+ 'schedule.lead': {
194+ 'Meta': {'ordering': "('summit', 'track')", 'object_name': 'Lead'},
195+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
196+ 'lead': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'lead'", 'to': "orm['schedule.Attendee']"}),
197+ 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}),
198+ 'track': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Track']"})
199+ },
200+ 'schedule.meeting': {
201+ 'Meta': {'object_name': 'Meeting'},
202+ 'approved': ('django.db.models.fields.CharField', [], {'default': "'PENDING'", 'max_length': '10', 'null': 'True'}),
203+ 'approver': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'approver_set'", 'null': 'True', 'to': "orm['schedule.Attendee']"}),
204+ 'assignee': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'assignee_set'", 'null': 'True', 'to': "orm['schedule.Attendee']"}),
205+ 'description': ('django.db.models.fields.TextField', [], {'max_length': '2047', 'blank': 'True'}),
206+ 'drafter': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'drafter_set'", 'null': 'True', 'to': "orm['schedule.Attendee']"}),
207+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
208+ 'launchpad_blueprint_id': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
209+ 'name': ('summit.schedule.fields.NameField', [], {'max_length': '100'}),
210+ 'override_break': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
211+ 'pad_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
212+ 'participants': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['schedule.Attendee']", 'symmetrical': 'False', 'through': "orm['schedule.Participant']", 'blank': 'True'}),
213+ 'priority': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
214+ 'private': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
215+ 'private_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
216+ 'requires_dial_in': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
217+ 'scribe': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'scribe_set'", 'null': 'True', 'to': "orm['schedule.Attendee']"}),
218+ 'slots': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
219+ 'spec_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
220+ 'status': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}),
221+ 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}),
222+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
223+ 'tracks': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['schedule.Track']", 'symmetrical': 'False', 'blank': 'True'}),
224+ 'type': ('django.db.models.fields.CharField', [], {'default': "u'discussion'", 'max_length': '15'}),
225+ 'video': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
226+ 'virtual_meeting': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
227+ 'wiki_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'})
228+ },
229+ 'schedule.participant': {
230+ 'Meta': {'ordering': "('meeting', 'attendee', 'participation')", 'object_name': 'Participant'},
231+ 'attendee': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Attendee']"}),
232+ 'from_launchpad': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
233+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
234+ 'meeting': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Meeting']"}),
235+ 'participation': ('django.db.models.fields.CharField', [], {'default': "'ATTENDING'", 'max_length': '32', 'null': 'True'})
236+ },
237+ 'schedule.room': {
238+ 'Meta': {'ordering': "('summit', 'name')", 'object_name': 'Room'},
239+ 'end_utc': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'db_column': "'end'", 'blank': 'True'}),
240+ 'has_dial_in': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
241+ 'icecast_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
242+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
243+ 'irc_channel': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
244+ 'name': ('summit.schedule.fields.NameField', [], {'max_length': '50'}),
245+ 'size': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
246+ 'start_utc': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'db_column': "'start'", 'blank': 'True'}),
247+ 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}),
248+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
249+ 'tracks': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['schedule.Track']", 'symmetrical': 'False', 'blank': 'True'}),
250+ 'type': ('django.db.models.fields.CharField', [], {'default': "u'open'", 'max_length': '7'})
251+ },
252+ 'schedule.roombusy': {
253+ 'Meta': {'ordering': "('room', 'start_utc', 'end_utc')", 'object_name': 'RoomBusy'},
254+ 'end_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'end'"}),
255+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
256+ 'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'busy_set'", 'to': "orm['schedule.Room']"}),
257+ 'start_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'start'"})
258+ },
259+ 'schedule.slot': {
260+ 'Meta': {'ordering': "('summit', 'start_utc', 'end_utc')", 'object_name': 'Slot'},
261+ 'end_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'end'"}),
262+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
263+ 'start_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'start'"}),
264+ 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}),
265+ 'type': ('django.db.models.fields.CharField', [], {'default': "u'open'", 'max_length': '7'})
266+ },
267+ 'schedule.summit': {
268+ 'Meta': {'ordering': "('name',)", 'object_name': 'Summit'},
269+ 'date_end': ('django.db.models.fields.DateField', [], {'null': 'True'}),
270+ 'date_start': ('django.db.models.fields.DateField', [], {'null': 'True'}),
271+ 'description': ('django.db.models.fields.TextField', [], {'max_length': '2047', 'blank': 'True'}),
272+ 'etherpad': ('django.db.models.fields.URLField', [], {'default': "'http://pad.ubuntu.com/'", 'max_length': '75'}),
273+ 'hashtag': ('django.db.models.fields.CharField', [], {'max_length': '25', 'blank': 'True'}),
274+ 'help_text': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
275+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
276+ 'last_update': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
277+ 'location': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
278+ 'managers': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'managers'", 'blank': 'True', 'to': "orm['auth.User']"}),
279+ 'name': ('summit.schedule.fields.NameField', [], {'max_length': '50'}),
280+ 'qr': ('django.db.models.fields.URLField', [], {'default': "''", 'max_length': '100', 'blank': 'True'}),
281+ 'schedulers': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'schedulers'", 'blank': 'True', 'to': "orm['auth.User']"}),
282+ 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['sites.Site']", 'symmetrical': 'False'}),
283+ 'state': ('django.db.models.fields.CharField', [], {'default': "u'sponsor'", 'max_length': '10'}),
284+ 'timezone': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
285+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
286+ 'virtual_summit': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
287+ },
288+ 'schedule.summitsprint': {
289+ 'Meta': {'ordering': "('summit', 'import_url')", 'object_name': 'SummitSprint'},
290+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
291+ 'import_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
292+ 'summit': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'sprint_set'", 'to': "orm['schedule.Summit']"})
293+ },
294+ 'schedule.track': {
295+ 'Meta': {'ordering': "('summit', 'title', 'slug')", 'object_name': 'Track'},
296+ 'allow_adjacent_sessions': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
297+ 'color': ('django.db.models.fields.CharField', [], {'default': "'FFFFFF'", 'max_length': '6'}),
298+ 'description': ('django.db.models.fields.TextField', [], {'max_length': '1000', 'null': 'True'}),
299+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
300+ 'slug': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'}),
301+ 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}),
302+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'})
303+ },
304+ 'sites.site': {
305+ 'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"},
306+ 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
307+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
308+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
309+ }
310+ }
311+
312+ complete_apps = ['schedule']
313
314=== added file 'summit/schedule/migrations/0027_add_hangout_urls.py'
315--- summit/schedule/migrations/0027_add_hangout_urls.py 1970-01-01 00:00:00 +0000
316+++ summit/schedule/migrations/0027_add_hangout_urls.py 2013-02-20 17:36:21 +0000
317@@ -0,0 +1,217 @@
318+# encoding: utf-8
319+import datetime
320+from south.db import db
321+from south.v2 import SchemaMigration
322+from django.db import models
323+
324+class Migration(SchemaMigration):
325+
326+ def forwards(self, orm):
327+
328+ # Adding field 'Meeting.hangout_url'
329+ db.add_column('schedule_meeting', 'hangout_url', self.gf('django.db.models.fields.URLField')(max_length=200, null=True, blank=True), keep_default=False)
330+
331+ # Adding field 'Meeting.broadcast_url'
332+ db.add_column('schedule_meeting', 'broadcast_url', self.gf('django.db.models.fields.URLField')(max_length=200, null=True, blank=True), keep_default=False)
333+
334+
335+ def backwards(self, orm):
336+
337+ # Deleting field 'Meeting.hangout_url'
338+ db.delete_column('schedule_meeting', 'hangout_url')
339+
340+ # Deleting field 'Meeting.broadcast_url'
341+ db.delete_column('schedule_meeting', 'broadcast_url')
342+
343+
344+ models = {
345+ 'auth.group': {
346+ 'Meta': {'object_name': 'Group'},
347+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
348+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
349+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
350+ },
351+ 'auth.permission': {
352+ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
353+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
354+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
355+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
356+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
357+ },
358+ 'auth.user': {
359+ 'Meta': {'ordering': "['username']", 'object_name': 'User'},
360+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
361+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
362+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
363+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
364+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
365+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
366+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
367+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
368+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
369+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
370+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
371+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
372+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
373+ },
374+ 'contenttypes.contenttype': {
375+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
376+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
377+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
378+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
379+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
380+ },
381+ 'schedule.agenda': {
382+ 'Meta': {'ordering': "('slot', 'room')", 'unique_together': "(('slot', 'room'),)", 'object_name': 'Agenda'},
383+ 'auto': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
384+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
385+ 'meeting': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Meeting']"}),
386+ 'room': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Room']"}),
387+ 'slot': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Slot']"})
388+ },
389+ 'schedule.attendee': {
390+ 'Meta': {'ordering': "('user__username', 'summit')", 'object_name': 'Attendee'},
391+ 'crew': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_column': "'crew'"}),
392+ 'end_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'end'"}),
393+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
394+ 'secret_key_id': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
395+ 'start_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'start'"}),
396+ 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}),
397+ 'tracks': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['schedule.Track']", 'symmetrical': 'False', 'blank': 'True'}),
398+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
399+ },
400+ 'schedule.attendeebusy': {
401+ 'Meta': {'ordering': "('attendee', 'start_utc', 'end_utc')", 'object_name': 'AttendeeBusy'},
402+ 'attendee': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'busy_set'", 'to': "orm['schedule.Attendee']"}),
403+ 'end_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'end'"}),
404+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
405+ 'start_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'start'"})
406+ },
407+ 'schedule.crew': {
408+ 'Meta': {'ordering': "('date_utc', 'attendee')", 'object_name': 'Crew'},
409+ 'attendee': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'crew_schedule'", 'to': "orm['schedule.Attendee']"}),
410+ 'date_utc': ('django.db.models.fields.DateField', [], {'db_column': "'date'"}),
411+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
412+ },
413+ 'schedule.lead': {
414+ 'Meta': {'ordering': "('summit', 'track')", 'object_name': 'Lead'},
415+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
416+ 'lead': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'lead'", 'to': "orm['schedule.Attendee']"}),
417+ 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}),
418+ 'track': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Track']"})
419+ },
420+ 'schedule.meeting': {
421+ 'Meta': {'object_name': 'Meeting'},
422+ 'approved': ('django.db.models.fields.CharField', [], {'default': "'PENDING'", 'max_length': '10', 'null': 'True'}),
423+ 'approver': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'approver_set'", 'null': 'True', 'to': "orm['schedule.Attendee']"}),
424+ 'assignee': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'assignee_set'", 'null': 'True', 'to': "orm['schedule.Attendee']"}),
425+ 'broadcast_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
426+ 'description': ('django.db.models.fields.TextField', [], {'max_length': '2047', 'blank': 'True'}),
427+ 'drafter': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'drafter_set'", 'null': 'True', 'to': "orm['schedule.Attendee']"}),
428+ 'hangout_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
429+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
430+ 'launchpad_blueprint_id': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
431+ 'name': ('summit.schedule.fields.NameField', [], {'max_length': '100'}),
432+ 'override_break': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
433+ 'pad_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
434+ 'participants': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['schedule.Attendee']", 'symmetrical': 'False', 'through': "orm['schedule.Participant']", 'blank': 'True'}),
435+ 'priority': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
436+ 'private': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
437+ 'private_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
438+ 'requires_dial_in': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
439+ 'scribe': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'scribe_set'", 'null': 'True', 'to': "orm['schedule.Attendee']"}),
440+ 'slots': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
441+ 'spec_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
442+ 'status': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}),
443+ 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}),
444+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
445+ 'tracks': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['schedule.Track']", 'symmetrical': 'False', 'blank': 'True'}),
446+ 'type': ('django.db.models.fields.CharField', [], {'default': "u'discussion'", 'max_length': '15'}),
447+ 'video': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
448+ 'virtual_meeting': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
449+ 'wiki_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'})
450+ },
451+ 'schedule.participant': {
452+ 'Meta': {'ordering': "('meeting', 'attendee', 'participation')", 'object_name': 'Participant'},
453+ 'attendee': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Attendee']"}),
454+ 'from_launchpad': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
455+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
456+ 'meeting': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Meeting']"}),
457+ 'participation': ('django.db.models.fields.CharField', [], {'default': "'ATTENDING'", 'max_length': '32', 'null': 'True'})
458+ },
459+ 'schedule.room': {
460+ 'Meta': {'ordering': "('summit', 'name')", 'object_name': 'Room'},
461+ 'end_utc': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'db_column': "'end'", 'blank': 'True'}),
462+ 'has_dial_in': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
463+ 'icecast_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
464+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
465+ 'irc_channel': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
466+ 'name': ('summit.schedule.fields.NameField', [], {'max_length': '50'}),
467+ 'size': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
468+ 'start_utc': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'db_column': "'start'", 'blank': 'True'}),
469+ 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}),
470+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
471+ 'tracks': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['schedule.Track']", 'symmetrical': 'False', 'blank': 'True'}),
472+ 'type': ('django.db.models.fields.CharField', [], {'default': "u'open'", 'max_length': '7'})
473+ },
474+ 'schedule.roombusy': {
475+ 'Meta': {'ordering': "('room', 'start_utc', 'end_utc')", 'object_name': 'RoomBusy'},
476+ 'end_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'end'"}),
477+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
478+ 'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'busy_set'", 'to': "orm['schedule.Room']"}),
479+ 'start_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'start'"})
480+ },
481+ 'schedule.slot': {
482+ 'Meta': {'ordering': "('summit', 'start_utc', 'end_utc')", 'object_name': 'Slot'},
483+ 'end_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'end'"}),
484+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
485+ 'start_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'start'"}),
486+ 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}),
487+ 'type': ('django.db.models.fields.CharField', [], {'default': "u'open'", 'max_length': '7'})
488+ },
489+ 'schedule.summit': {
490+ 'Meta': {'ordering': "('name',)", 'object_name': 'Summit'},
491+ 'date_end': ('django.db.models.fields.DateField', [], {'null': 'True'}),
492+ 'date_start': ('django.db.models.fields.DateField', [], {'null': 'True'}),
493+ 'description': ('django.db.models.fields.TextField', [], {'max_length': '2047', 'blank': 'True'}),
494+ 'etherpad': ('django.db.models.fields.URLField', [], {'default': "'http://pad.ubuntu.com/'", 'max_length': '75'}),
495+ 'hashtag': ('django.db.models.fields.CharField', [], {'max_length': '25', 'blank': 'True'}),
496+ 'help_text': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
497+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
498+ 'last_update': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
499+ 'location': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
500+ 'managers': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'managers'", 'blank': 'True', 'to': "orm['auth.User']"}),
501+ 'name': ('summit.schedule.fields.NameField', [], {'max_length': '50'}),
502+ 'qr': ('django.db.models.fields.URLField', [], {'default': "''", 'max_length': '100', 'blank': 'True'}),
503+ 'schedulers': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'schedulers'", 'blank': 'True', 'to': "orm['auth.User']"}),
504+ 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['sites.Site']", 'symmetrical': 'False'}),
505+ 'state': ('django.db.models.fields.CharField', [], {'default': "u'sponsor'", 'max_length': '10'}),
506+ 'timezone': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
507+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
508+ 'virtual_summit': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
509+ },
510+ 'schedule.summitsprint': {
511+ 'Meta': {'ordering': "('summit', 'import_url')", 'object_name': 'SummitSprint'},
512+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
513+ 'import_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
514+ 'summit': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'sprint_set'", 'to': "orm['schedule.Summit']"})
515+ },
516+ 'schedule.track': {
517+ 'Meta': {'ordering': "('summit', 'title', 'slug')", 'object_name': 'Track'},
518+ 'allow_adjacent_sessions': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
519+ 'color': ('django.db.models.fields.CharField', [], {'default': "'FFFFFF'", 'max_length': '6'}),
520+ 'description': ('django.db.models.fields.TextField', [], {'max_length': '1000', 'null': 'True'}),
521+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
522+ 'slug': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'}),
523+ 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}),
524+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'})
525+ },
526+ 'sites.site': {
527+ 'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"},
528+ 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
529+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
530+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
531+ }
532+ }
533+
534+ complete_apps = ['schedule']
535
536=== modified file 'summit/schedule/models/meetingmodel.py'
537--- summit/schedule/models/meetingmodel.py 2012-10-09 21:00:53 +0000
538+++ summit/schedule/models/meetingmodel.py 2013-02-20 17:36:21 +0000
539@@ -100,6 +100,16 @@
540 null=True, blank=True)
541 priority = models.IntegerField(choices=PRIORITY_CHOICES,
542 null=True, blank=True)
543+ hangout_url = models.URLField(
544+ blank=True,
545+ null=True,
546+ help_text="URL for participation essential users to join the hangout",
547+ )
548+ broadcast_url = models.URLField(
549+ blank=True,
550+ null=True,
551+ help_text="URL for all other participants to watch the hangout",
552+ )
553 # FIXME tracks must be for the same summit
554 # (will require js magic in admin to refresh the boxes)
555 tracks = models.ManyToManyField(Track, blank=True)
556@@ -112,14 +122,24 @@
557 slots = models.IntegerField(default=1)
558 override_break = models.BooleanField(default=False, verbose_name="Override Break",
559 help_text="If this is a multi-slot meeting, should it be allowed to take place during a break")
560+ virtual_meeting = models.BooleanField(
561+ help_text="If virtual summit is true, this will not override it"
562+ )
563 approved = models.CharField(max_length=10, choices=REVIEW_CHOICES,
564 null=True, default='PENDING')
565 private = models.BooleanField(default=False)
566 private_key = models.CharField(max_length=32, null=True, blank=True)
567
568- requires_dial_in = models.BooleanField(verbose_name="This session requires dial in capabilities", default=False)
569- video = models.BooleanField(verbose_name="This session is to be videotaped", default=False)
570-
571+ requires_dial_in = models.BooleanField(
572+ verbose_name="Dial in",
573+ help_text="This session requires dial in availability"
574+ )
575+ video = models.BooleanField(
576+ verbose_name="Video recording",
577+ help_text="This session is to be videotaped",
578+ default=False
579+ )
580+
581 # FIXME attendees must be for the same summit
582 # (will require js magic in admin to refresh the boxes)
583 drafter = models.ForeignKey(Attendee, null=True, blank=True,
584@@ -214,7 +234,7 @@
585 if self.type in self.TYPE_ICONS:
586 return self.TYPE_ICONS[self.type]
587 icon = property(get_meeting_type_icon)
588-
589+
590 def __unicode__(self):
591 if self.name:
592 return self.name
593@@ -232,7 +252,7 @@
594 def spec_priority(self):
595 label = dict(self.PRIORITY_CHOICES)[self.priority]
596 icon = label.lower()
597-
598+
599 def can_edit_pm(self, attendee):
600 if attendee is not None:
601 if attendee.user == self.approver or attendee.user == self.drafter or attendee.user == self.assignee or self.summit.is_scheduler(attendee):
602@@ -260,12 +280,12 @@
603 return False
604 else:
605 return False
606-
607+
608 def is_tracklead(self, attendee):
609 if attendee is not None:
610 return self.tracks.filter(lead__lead=attendee).exists()
611 return False
612-
613+
614 @property
615 def attendees(self):
616 attendees = []
617@@ -308,7 +328,7 @@
618 attendees = set()
619 for participant in self.participant_set.all():
620 if participant.participation == level:
621- attendees.add(participant.attendee)
622+ attendees.add(participant.attendee)
623 return attendees
624
625 def update_from_launchpad(self, elem):
626@@ -316,7 +336,7 @@
627
628 if not self.approved == 'REMOVED':
629 self.approved = 'APPROVED'
630-
631+
632 name = elem.get("name")
633 if name:
634 self.name = name[:100]
635@@ -453,7 +473,7 @@
636 if this_slot.type == 'plenary' and self.type not in ('plenary', 'talk', 'special'):
637 raise Meeting.SchedulingError(
638 "Not a plenary event, talk or special event")
639-
640+
641 # Check that the room is not already in use
642 try:
643 existing = room.agenda_set.get(slot=this_slot)
644
645=== modified file 'summit/schedule/models/summitmodel.py'
646--- summit/schedule/models/summitmodel.py 2013-01-18 23:06:46 +0000
647+++ summit/schedule/models/summitmodel.py 2013-02-20 17:36:21 +0000
648@@ -60,7 +60,7 @@
649 User.__unicode__ = unicode_user
650
651 class SummitManager(CurrentSiteManager):
652-
653+
654 def next(self):
655 try:
656 return self.order_by('-date_start')[0]
657@@ -93,12 +93,14 @@
658 date_end = models.DateField(blank=False, null=True)
659 managers = models.ManyToManyField(User, blank=True, related_name='managers')
660 schedulers = models.ManyToManyField(User, blank=True, related_name='schedulers')
661-
662+ virtual_summit = models.BooleanField(
663+ help_text="Check this if the entire sprint is virtual"
664+ )
665 help_text = models.TextField(null=True, blank=True, help_text='Summit specific instructions and links for getting help during the event')
666-
667+
668 objects = models.Manager()
669 on_site = SummitManager()
670-
671+
672 class Meta:
673 app_label = 'schedule'
674 ordering = ('name', )
675@@ -108,7 +110,7 @@
676
677 def get_absolute_url(self):
678 return getattr(settings, 'SITE_ROOT', 'http://summit.ubuntu.com') + reverse('summit.schedule.views.summit', args=(self.name,))
679-
680+
681 def localize(self, datetime):
682 """Convert a datetime to the summit-local timezone.
683
684@@ -171,7 +173,7 @@
685
686 def ical_url(self):
687 return getattr(settings, 'SITE_ROOT', 'http://summit.ubuntu.com') + reverse('summit.schedule.views.ical', args=(self.name,))
688-
689+
690 def public_rooms(self):
691 """List of public rooms for this summit.
692
693@@ -212,7 +214,7 @@
694
695 def private_rooms(self):
696 """List fo private rooms for this summit."""
697-
698+
699 def by_title(a, b):
700 if a.track is None:
701 return 1
702@@ -289,7 +291,7 @@
703
704 def update_attendee_from_launchpad(self, elem, options={}):
705 """Update or create single attendee from Launchpad data."""
706-
707+
708 username = elem.get("name", "")
709 if not username:
710 return
711@@ -372,19 +374,29 @@
712 """Delete any automatically created agenda items that have problems."""
713 today = datetime.now()
714 for meeting in self.meeting_set.all():
715- for agenda in meeting.agenda_set.filter(auto=True, slot__start_utc__gt=today):
716+ for agenda in meeting.agenda_set.filter(
717+ auto=True,
718+ slot__start_utc__gt=today
719+ ):
720 try:
721 missing = meeting.check_schedule(agenda.slot, agenda.room)
722 if len(missing):
723- print "Warning: required people not available: %s (%s) at %s in %s: %s" % (
724- meeting, meeting.drafter, agenda.slot, agenda.room,
725- ', '.join(m.user.username for m in missing))
726+ print "Warning: required people not available:"
727+ print "%s (%s) at %s in %s: %s" % (
728+ meeting,
729+ meeting.drafter,
730+ agenda.slot,
731+ agenda.room,
732+ ', '.join(m.user.username for m in missing)
733+ )
734 agenda.delete()
735 except meeting.SchedulingError, e:
736- print "Error: %s at %s in %s: %s" % (meeting,
737- agenda.slot,
738- agenda.room,
739- e)
740+ print "Error: %s at %s in %s: %s" % (
741+ meeting,
742+ agenda.slot,
743+ agenda.room,
744+ e
745+ )
746 agenda.delete()
747
748 def can_change_agenda(self, attendee):
749
750=== modified file 'summit/schedule/tests.py'
751--- summit/schedule/tests.py 2012-10-27 14:59:34 +0000
752+++ summit/schedule/tests.py 2013-02-20 17:36:21 +0000
753@@ -34,17 +34,19 @@
754 from model_mommy import mommy as factory
755 from summit.schedule.fields import NameField
756
757-from summit.schedule.models import (Summit,
758- Slot,
759- Attendee,
760- Meeting,
761- Track,
762- Room,
763- Agenda,
764- Participant,
765- SummitSprint,
766- Lead)
767-
768+from summit.schedule.models import (
769+ Summit,
770+ Slot,
771+ Attendee,
772+ Meeting,
773+ Track,
774+ Room,
775+ Agenda,
776+ Participant,
777+ SummitSprint,
778+ Lead,
779+)
780+
781 from summit.schedule.render import Schedule
782 from summit.common import launchpad
783
784@@ -56,6 +58,7 @@
785 site_root = getattr(settings, 'SITE_ROOT', 'http://summit.ubuntu.com')
786 theme_media = getattr(settings, 'THEME_MEDIA', 'ubuntu_website.MEDIA_ROOT')
787
788+
789 class RequestFactory(djangotest.Client):
790 """
791 Class that lets you create mock Request objects for use in testing.
792@@ -69,7 +72,7 @@
793 This class re-uses the django.test.client.Client interface, docs here:
794 http://www.djangoproject.com/documentation/testing/#the-test-client
795
796- Once you have a request object you can pass it to any view function,
797+ Once you have a request object you can pass it to any view function,
798 just as if that view had been hooked up using a URLconf.
799
800 """
801@@ -96,8 +99,11 @@
802 handler.load_middleware()
803 for middleware_method in handler._request_middleware:
804 if middleware_method(request):
805- raise Exception("Couldn't create request mock object - "
806- "request middleware %s returned a response" % middleware_method)
807+ raise Exception(
808+ "Couldn't create request mock object - "
809+ "request middleware %s returned a response"
810+ % middleware_method
811+ )
812 return request
813
814
815@@ -122,7 +128,11 @@
816 type='closed')
817
818 agenda = factory.make_one(Agenda, slot=slot)
819- meeting = factory.make_one(Meeting, requires_dial_in=False, private=False)
820+ meeting = factory.make_one(
821+ Meeting,
822+ requires_dial_in=False,
823+ private=False
824+ )
825
826 # XXX check_schedule should only be checking the schedule, not
827 # checking and modifying the schedule.
828@@ -142,20 +152,44 @@
829 room1 = factory.make_one(Room)
830 room2 = factory.make_one(Room)
831
832- meeting1 = factory.make_one(Meeting, summit=slot.summit, requires_dial_in=False, private=False)
833- meeting2 = factory.make_one(Meeting, summit=slot.summit, requires_dial_in=False, private=False)
834+ meeting1 = factory.make_one(
835+ Meeting,
836+ summit=slot.summit,
837+ requires_dial_in=False,
838+ private=False
839+ )
840+ meeting2 = factory.make_one(
841+ Meeting,
842+ summit=slot.summit,
843+ requires_dial_in=False,
844+ private=False
845+ )
846
847 attendee = factory.make_one(Attendee)
848- factory.make_one(Participant, meeting=meeting1, attendee=attendee, participation = 'REQUIRED')
849- factory.make_one(Participant, meeting=meeting2, attendee=attendee, participation = 'REQUIRED')
850+ factory.make_one(
851+ Participant,
852+ meeting=meeting1,
853+ attendee=attendee,
854+ participation='REQUIRED'
855+ )
856+ factory.make_one(
857+ Participant,
858+ meeting=meeting2,
859+ attendee=attendee,
860+ participation='REQUIRED'
861+ )
862
863 factory.make_one(Agenda, meeting=meeting1, slot=slot, room=room1)
864- agenda = factory.make_one(Agenda, meeting=meeting2, slot=slot, room=room2)
865+ agenda = factory.make_one(
866+ Agenda,
867+ meeting=meeting2,
868+ slot=slot,
869+ room=room2
870+ )
871
872 missing = meeting2.check_schedule(agenda.slot, agenda.room)
873 self.assertEqual([attendee.name], [a.name for a in missing])
874
875-
876 def make_open_slot(self):
877 now = datetime.datetime.utcnow()
878 one_hour = datetime.timedelta(0, 3600)
879@@ -168,8 +202,19 @@
880
881 def test_check_schedule_errors_on_no_dial_in(self):
882 slot = self.make_open_slot()
883- room = factory.make_one(Room, has_dial_in=False, summit=slot.summit, name="testroom")
884- meeting = factory.make_one(Meeting, requires_dial_in=True, summit=slot.summit, name="testmeeting", private=False)
885+ room = factory.make_one(
886+ Room,
887+ has_dial_in=False,
888+ summit=slot.summit,
889+ name="testroom"
890+ )
891+ meeting = factory.make_one(
892+ Meeting,
893+ requires_dial_in=True,
894+ summit=slot.summit,
895+ name="testmeeting",
896+ private=False
897+ )
898 try:
899 meeting.check_schedule(slot, room)
900 except meeting.SchedulingError, e:
901@@ -185,26 +230,51 @@
902 Slot,
903 start_utc=now+one_hour,
904 end_utc=now+one_hour+one_hour,
905- type='open', summit=summit)
906+ type='open', summit=summit
907+ )
908 slot2 = factory.make_one(
909 Slot,
910 start_utc=now+one_hour+one_hour,
911 end_utc=now+one_hour+one_hour+one_hour,
912- type='open', summit=summit)
913+ type='open', summit=summit
914+ )
915 return slot1, slot2
916
917 def test_check_schedule_errors_on_same_track_in_previous_slot(self):
918 slot1, slot2 = self.make_two_adjacent_slots()
919- room = factory.make_one(Room, summit=slot1.summit,
920- name="testroom")
921- track = factory.make_one(Track, summit=slot1.summit,
922- title="testtrack", allow_adjacent_sessions=False)
923- track2 = factory.make_one(Track, summit=slot1.summit,
924- title="adjacenttrack", allow_adjacent_sessions=True)
925- meeting1 = factory.make_one(Meeting, requires_dial_in=False,
926- summit=slot1.summit, name="testmeeting1", type='blueprint', private=False)
927- meeting2 = factory.make_one(Meeting, requires_dial_in=False,
928- summit=slot1.summit, name="testmeeting2", type='blueprint', private=False)
929+ room = factory.make_one(
930+ Room,
931+ summit=slot1.summit,
932+ name="testroom"
933+ )
934+ track = factory.make_one(
935+ Track,
936+ summit=slot1.summit,
937+ title="testtrack",
938+ allow_adjacent_sessions=False
939+ )
940+ track2 = factory.make_one(
941+ Track,
942+ summit=slot1.summit,
943+ title="adjacenttrack",
944+ allow_adjacent_sessions=True
945+ )
946+ meeting1 = factory.make_one(
947+ Meeting,
948+ requires_dial_in=False,
949+ summit=slot1.summit,
950+ name="testmeeting1",
951+ type='blueprint',
952+ private=False
953+ )
954+ meeting2 = factory.make_one(
955+ Meeting,
956+ requires_dial_in=False,
957+ summit=slot1.summit,
958+ name="testmeeting2",
959+ type='blueprint',
960+ private=False
961+ )
962 meeting1.tracks = [track, track2]
963 meeting2.tracks = [track]
964 meeting1.agenda_set.create(room=room, slot=slot1)
965@@ -217,14 +287,29 @@
966
967 def test_check_schedule_errors_on_same_track_in_next_slot(self):
968 slot1, slot2 = self.make_two_adjacent_slots()
969- room = factory.make_one(Room, summit=slot1.summit,
970- name="testroom")
971- track = factory.make_one(Track, summit=slot1.summit,
972- title="testtrack", allow_adjacent_sessions=False)
973- meeting1 = factory.make_one(Meeting, requires_dial_in=False,
974- summit=slot1.summit, name="testmeeting1", type='blueprint', private=False)
975- meeting2 = factory.make_one(Meeting, requires_dial_in=False,
976- summit=slot1.summit, name="testmeeting2", type='blueprint', private=False)
977+ room = factory.make_one(Room, summit=slot1.summit, name="testroom")
978+ track = factory.make_one(
979+ Track,
980+ summit=slot1.summit,
981+ title="testtrack",
982+ allow_adjacent_sessions=False
983+ )
984+ meeting1 = factory.make_one(
985+ Meeting,
986+ requires_dial_in=False,
987+ summit=slot1.summit,
988+ name="testmeeting1",
989+ type='blueprint',
990+ private=False
991+ )
992+ meeting2 = factory.make_one(
993+ Meeting,
994+ requires_dial_in=False,
995+ summit=slot1.summit,
996+ name="testmeeting2",
997+ type='blueprint',
998+ private=False
999+ )
1000 meeting1.tracks = [track]
1001 meeting2.tracks = [track]
1002 meeting1.agenda_set.create(room=room, slot=slot2)
1003@@ -237,16 +322,35 @@
1004
1005 def test_check_schedule_no_error_on_different_track(self):
1006 slot1, slot2 = self.make_two_adjacent_slots()
1007- room = factory.make_one(Room, summit=slot1.summit,
1008- name="testroom")
1009- track = factory.make_one(Track, summit=slot1.summit,
1010- title="testtrack", allow_adjacent_sessions=False)
1011- other_track = factory.make_one(Track, summit=slot1.summit,
1012- title="othertesttrack", allow_adjacent_sessions=False)
1013- meeting1 = factory.make_one(Meeting, requires_dial_in=False,
1014- summit=slot1.summit, name="testmeeting1", type='blueprint', private=False)
1015- meeting2 = factory.make_one(Meeting, requires_dial_in=False,
1016- summit=slot1.summit, name="testmeeting2", type='blueprint', private=False)
1017+ room = factory.make_one(Room, summit=slot1.summit, name="testroom")
1018+ track = factory.make_one(
1019+ Track,
1020+ summit=slot1.summit,
1021+ title="testtrack",
1022+ allow_adjacent_sessions=False
1023+ )
1024+ other_track = factory.make_one(
1025+ Track,
1026+ summit=slot1.summit,
1027+ title="othertesttrack",
1028+ allow_adjacent_sessions=False
1029+ )
1030+ meeting1 = factory.make_one(
1031+ Meeting,
1032+ requires_dial_in=False,
1033+ summit=slot1.summit,
1034+ name="testmeeting1",
1035+ type='blueprint',
1036+ private=False
1037+ )
1038+ meeting2 = factory.make_one(
1039+ Meeting,
1040+ requires_dial_in=False,
1041+ summit=slot1.summit,
1042+ name="testmeeting2",
1043+ type='blueprint',
1044+ private=False
1045+ )
1046 meeting1.tracks = [track]
1047 meeting2.tracks = [other_track]
1048 meeting1.agenda_set.create(room=room, slot=slot2)
1049@@ -254,14 +358,29 @@
1050
1051 def test_check_schedule_no_error_on_same_track_for_plenaries(self):
1052 slot1, slot2 = self.make_two_adjacent_slots()
1053- room = factory.make_one(Room, summit=slot1.summit,
1054- name="testroom")
1055- track = factory.make_one(Track, summit=slot1.summit,
1056- title="testtrack", allow_adjacent_sessions=False)
1057- meeting1 = factory.make_one(Meeting, requires_dial_in=False,
1058- summit=slot1.summit, name="testmeeting1", type='blueprint', private=False)
1059- meeting2 = factory.make_one(Meeting, requires_dial_in=False,
1060- summit=slot1.summit, name="testmeeting2", type='plenary', private=False)
1061+ room = factory.make_one(Room, summit=slot1.summit, name="testroom")
1062+ track = factory.make_one(
1063+ Track,
1064+ summit=slot1.summit,
1065+ title="testtrack",
1066+ allow_adjacent_sessions=False
1067+ )
1068+ meeting1 = factory.make_one(
1069+ Meeting,
1070+ requires_dial_in=False,
1071+ summit=slot1.summit,
1072+ name="testmeeting1",
1073+ type='blueprint',
1074+ private=False
1075+ )
1076+ meeting2 = factory.make_one(
1077+ Meeting,
1078+ requires_dial_in=False,
1079+ summit=slot1.summit,
1080+ name="testmeeting2",
1081+ type='plenary',
1082+ private=False
1083+ )
1084 meeting1.tracks = [track]
1085 meeting2.tracks = [track]
1086 meeting1.agenda_set.create(room=room, slot=slot2)
1087@@ -269,14 +388,29 @@
1088
1089 def test_check_schedule_no_error_on_same_track_for_ajdacent_sessions_allowed(self):
1090 slot1, slot2 = self.make_two_adjacent_slots()
1091- room = factory.make_one(Room, summit=slot1.summit,
1092- name="testroom")
1093- track = factory.make_one(Track, summit=slot1.summit,
1094- title="adjacenttrack", allow_adjacent_sessions=True)
1095- meeting1 = factory.make_one(Meeting, requires_dial_in=False,
1096- summit=slot1.summit, name="testmeeting1", type='blueprint', private=False)
1097- meeting2 = factory.make_one(Meeting, requires_dial_in=False,
1098- summit=slot1.summit, name="testmeeting2", type='blueprint', private=False)
1099+ room = factory.make_one(Room, summit=slot1.summit, name="testroom")
1100+ track = factory.make_one(
1101+ Track,
1102+ summit=slot1.summit,
1103+ title="adjacenttrack",
1104+ allow_adjacent_sessions=True
1105+ )
1106+ meeting1 = factory.make_one(
1107+ Meeting,
1108+ requires_dial_in=False,
1109+ summit=slot1.summit,
1110+ name="testmeeting1",
1111+ type='blueprint',
1112+ private=False
1113+ )
1114+ meeting2 = factory.make_one(
1115+ Meeting,
1116+ requires_dial_in=False,
1117+ summit=slot1.summit,
1118+ name="testmeeting2",
1119+ type='blueprint',
1120+ private=False
1121+ )
1122 meeting1.tracks = [track]
1123 meeting2.tracks = [track]
1124 meeting1.agenda_set.create(room=room, slot=slot2)
1125@@ -284,16 +418,38 @@
1126
1127 def test_try_schedule_into_refuses_room_without_dial_in(self):
1128 slot = self.make_open_slot()
1129- room = factory.make_one(Room, has_dial_in=False, summit=slot.summit, name="testroom")
1130- meeting = factory.make_one(Meeting, requires_dial_in=True, summit=slot.summit, name="testmeeting", private=False)
1131+ room = factory.make_one(
1132+ Room,
1133+ has_dial_in=False,
1134+ summit=slot.summit,
1135+ name="testroom"
1136+ )
1137+ meeting = factory.make_one(
1138+ Meeting,
1139+ requires_dial_in=True,
1140+ summit=slot.summit,
1141+ name="testmeeting",
1142+ private=False
1143+ )
1144
1145 self.assertEqual(False, meeting.try_schedule_into([room]))
1146 self.assertEqual(0, meeting.agenda_set.all().count())
1147
1148 def test_try_schedule_into_allows_room_with_dial_in(self):
1149 slot = self.make_open_slot()
1150- room = factory.make_one(Room, has_dial_in=True, summit=slot.summit, name="testroom")
1151- meeting = factory.make_one(Meeting, requires_dial_in=True, summit=slot.summit, name="testmeeting", private=False)
1152+ room = factory.make_one(
1153+ Room,
1154+ has_dial_in=True,
1155+ summit=slot.summit,
1156+ name="testroom"
1157+ )
1158+ meeting = factory.make_one(
1159+ Meeting,
1160+ requires_dial_in=True,
1161+ summit=slot.summit,
1162+ name="testmeeting",
1163+ private=False
1164+ )
1165
1166 self.assertEqual(True, meeting.try_schedule_into([room]))
1167 self.assertEqual(1, meeting.agenda_set.all().count())
1168@@ -312,8 +468,13 @@
1169 summit_name = 'testsummit'
1170 summit = factory.make_one(Summit, name=summit_name)
1171 name = 'testmeeting'
1172- meeting = factory.make_one(Meeting, pad_url=None, name=name,
1173- summit=summit, private=False)
1174+ meeting = factory.make_one(
1175+ Meeting,
1176+ pad_url=None,
1177+ name=name,
1178+ summit=summit,
1179+ private=False
1180+ )
1181 pad_host = self.get_pad_host()
1182 url = pad_host + summit_name + '-' + name
1183 self.assertEqual(url, meeting.link_to_pad)
1184@@ -322,8 +483,13 @@
1185 summit_name = 'testsummit'
1186 summit = factory.make_one(Summit, name=summit_name)
1187 name = 'test+meeting'
1188- meeting = factory.make_one(Meeting, pad_url=None, name=name,
1189- summit=summit, private=False)
1190+ meeting = factory.make_one(
1191+ Meeting,
1192+ pad_url=None,
1193+ name=name,
1194+ summit=summit,
1195+ private=False
1196+ )
1197 pad_host = self.get_pad_host()
1198 url = pad_host + summit_name + '-' + name.replace("+", "-")
1199 self.assertEqual(url, meeting.link_to_pad)
1200@@ -337,8 +503,13 @@
1201 summit_name = 'testsummit'
1202 summit = factory.make_one(Summit, name=summit_name)
1203 name = 'testmeeting'
1204- meeting = factory.make_one(Meeting, pad_url=None, name=name,
1205- summit=summit, private=False)
1206+ meeting = factory.make_one(
1207+ Meeting,
1208+ pad_url=None,
1209+ name=name,
1210+ summit=summit,
1211+ private=False
1212+ )
1213 pad_host = self.get_pad_host()
1214 url = pad_host + "ep/pad/view/" + summit_name + '-' + name + "/latest"
1215 self.assertEqual(url, meeting.edit_link_to_pad)
1216@@ -347,53 +518,120 @@
1217 summit_name = 'testsummit'
1218 summit = factory.make_one(Summit, name=summit_name)
1219 name = 'test+meeting'
1220- meeting = factory.make_one(Meeting, pad_url=None, name=name,
1221- summit=summit, private=False)
1222+ meeting = factory.make_one(
1223+ Meeting,
1224+ pad_url=None,
1225+ name=name,
1226+ summit=summit,
1227+ private=False
1228+ )
1229 pad_host = self.get_pad_host()
1230- url = (pad_host + "ep/pad/view/" + summit_name
1231- + '-' + name.replace("+", "-") + "/latest")
1232+ url = (
1233+ pad_host
1234+ + "ep/pad/view/"
1235+ + summit_name
1236+ + '-'
1237+ + name.replace("+", "-")
1238+ + "/latest"
1239+ )
1240 self.assertEqual(url, meeting.edit_link_to_pad)
1241
1242 def test_update_from_launchpad_sets_status(self):
1243- meeting = Meeting()
1244+ summit = factory.make_one(Summit, timezone='utc', name='test-summit')
1245+ meeting = factory.make_one(
1246+ Meeting,
1247+ pad_url=None,
1248+ name='test-meeting',
1249+ summit=summit,
1250+ private=False
1251+ )
1252 status = "Discussion"
1253- elem = LaunchpadExportNode(status=status)
1254+ name = meeting.name
1255+ elem = LaunchpadExportNode(status=status, name=name)
1256 meeting.update_from_launchpad(elem)
1257 self.assertEqual(status, meeting.status)
1258
1259 def test_update_from_launchpad_sets_priority(self):
1260- meeting = Meeting()
1261+ summit = factory.make_one(Summit, timezone='utc', name='test-summit')
1262+ meeting = factory.make_one(
1263+ Meeting,
1264+ pad_url=None,
1265+ name='test-meeting',
1266+ summit=summit,
1267+ private=False
1268+ )
1269 priority = 70
1270- elem = LaunchpadExportNode(priority=priority)
1271+ name = meeting.name
1272+ elem = LaunchpadExportNode(priority=priority, name=name)
1273 meeting.update_from_launchpad(elem)
1274 self.assertEqual(priority, meeting.priority)
1275
1276 def test_update_from_launchpad_sets_wiki_url(self):
1277- meeting = Meeting()
1278+ summit = factory.make_one(Summit, timezone='utc', name='test-summit')
1279+ meeting = factory.make_one(
1280+ Meeting,
1281+ pad_url=None,
1282+ name='test-meeting',
1283+ summit=summit,
1284+ private=False
1285+ )
1286 wiki_url = "http://example.com/somespec"
1287- elem = LaunchpadExportNode(specurl=wiki_url)
1288+ name = meeting.name
1289+ elem = LaunchpadExportNode(specurl=wiki_url, name=name)
1290 meeting.update_from_launchpad(elem)
1291 self.assertEqual(wiki_url, meeting.wiki_url)
1292
1293 def get_person_node(self, username, required=False):
1294 elem = LaunchpadExportNode()
1295 required_map = {True: "True", False: "False"}
1296- elem.add_child("person",
1297- LaunchpadExportNode(name=username,
1298- required=required_map[required]))
1299+ elem.add_child(
1300+ "person",
1301+ LaunchpadExportNode(
1302+ name=username,
1303+ required=required_map[required]
1304+ )
1305+ )
1306 return elem
1307
1308+ def make_one_future_slot(self, summit=None):
1309+ if summit is None:
1310+ summit = factory.make_one(Summit)
1311+ now = datetime.datetime.utcnow()
1312+ one_hour = datetime.timedelta(hours=1)
1313+ return factory.make_one(
1314+ Slot,
1315+ summit=summit,
1316+ start=now+one_hour,
1317+ end=now+one_hour+one_hour,
1318+ type='open'
1319+ )
1320+
1321 def make_summit_and_attendee(self):
1322 username = "username"
1323 user = factory.make_one(User, username=username)
1324 summit = factory.make_one(Summit)
1325- attendee = summit.attendee_set.create(user=user)
1326+ slot = self.make_one_future_slot(summit=summit)
1327+ attendee = summit.attendee_set.create(
1328+ user=user,
1329+ start_utc=slot.start_utc,
1330+ end_utc=slot.end_utc
1331+ )
1332 return summit, attendee
1333
1334 def test_update_from_launchpad_adds_participant(self):
1335 summit, attendee = self.make_summit_and_attendee()
1336- meeting = summit.meeting_set.create()
1337- elem = self.get_person_node(attendee.user.username, required=False)
1338+ meeting = factory.make_one(
1339+ Meeting,
1340+ pad_url=None,
1341+ name='test-meeting',
1342+ summit=summit,
1343+ private=False
1344+ )
1345+ name = meeting.name
1346+ elem = self.get_person_node(
1347+ attendee.user.username,
1348+ required=False,
1349+ )
1350 meeting.update_from_launchpad(elem)
1351 participant = meeting.participant_set.get()
1352 self.assertEqual(attendee, participant.attendee)
1353@@ -401,8 +639,18 @@
1354
1355 def test_update_from_launchpad_sets_participant_essential(self):
1356 summit, attendee = self.make_summit_and_attendee()
1357- meeting = summit.meeting_set.create()
1358- elem = self.get_person_node(attendee.user.username, required=True)
1359+ meeting = factory.make_one(
1360+ Meeting,
1361+ pad_url=None,
1362+ name='test-meeting',
1363+ summit=summit,
1364+ private=False
1365+ )
1366+ name = meeting.name
1367+ elem = self.get_person_node(
1368+ attendee.user.username,
1369+ required=True,
1370+ )
1371 meeting.update_from_launchpad(elem)
1372 participant = meeting.participant_set.get()
1373 self.assertEqual('INTERESTED', participant.participation)
1374@@ -421,9 +669,14 @@
1375 elem = self.get_person_node(attendee.user.username)
1376 otheruser = factory.make_one(User, username="otheruser")
1377 otherattendee = summit.attendee_set.create(user=otheruser)
1378- meeting.participant_set.create(attendee=otherattendee, from_launchpad=True)
1379+ meeting.participant_set.create(
1380+ attendee=otherattendee,
1381+ from_launchpad=True
1382+ )
1383 meeting.update_from_launchpad(elem)
1384- usernames = [p.attendee.user.username for p in meeting.participant_set.all()]
1385+ usernames = [
1386+ p.attendee.user.username for p in meeting.participant_set.all()
1387+ ]
1388 self.assertEqual(["username"], usernames)
1389
1390
1391@@ -440,20 +693,38 @@
1392 start_utc=now,
1393 end_utc=now+one_hour,
1394 type='open',
1395- summit=summit)
1396+ summit=summit
1397+ )
1398 slot.save()
1399-
1400+
1401 room = factory.make_one(Room, summit=summit)
1402- meeting = factory.make_one(Meeting, summit=summit, name='', private=False)
1403+ meeting = factory.make_one(
1404+ Meeting,
1405+ summit=summit,
1406+ name='',
1407+ private=False
1408+ )
1409 meeting.name = ''
1410 models.Model.save(meeting)
1411- agenda = factory.make_one(Agenda, slot=slot, meeting=meeting, room=room)
1412-
1413- self.assertEquals(meeting.meeting_page_url, '/uds-test/meeting/%s/-/' % meeting.id)
1414-
1415+ agenda = factory.make_one(
1416+ Agenda,
1417+ slot=slot,
1418+ meeting=meeting,
1419+ room=room
1420+ )
1421+
1422+ self.assertEquals(
1423+ meeting.meeting_page_url,
1424+ '/uds-test/meeting/%s/-/' % meeting.id
1425+ )
1426+
1427 response = self.client.get('/uds-test.ical')
1428 self.assertEquals(response.status_code, 200)
1429- self.assertContains(response, 'URL:%s/uds-test/meeting/%s/-/\n' % (site_root, meeting.id), 1)
1430+ self.assertContains(
1431+ response,
1432+ 'URL:%s/uds-test/meeting/%s/-/\n' % (site_root, meeting.id),
1433+ 1
1434+ )
1435
1436 def test_ical_meeting_name_with_period(self):
1437 """ Tests that ical doesn't break for nameless meetings"""
1438@@ -466,19 +737,37 @@
1439 start_utc=now,
1440 end_utc=now+one_hour,
1441 type='open',
1442- summit=summit)
1443+ summit=summit
1444+ )
1445 slot.save()
1446-
1447+
1448 room = factory.make_one(Room, summit=summit)
1449- meeting = factory.make_one(Meeting, summit=summit, name='test.name', private=False)
1450- agenda = factory.make_one(Agenda, slot=slot, meeting=meeting, room=room)
1451-
1452- self.assertEquals(meeting.meeting_page_url, '/uds-test/meeting/%s/test.name/' % meeting.id)
1453-
1454+ meeting = factory.make_one(
1455+ Meeting,
1456+ summit=summit,
1457+ name='test.name',
1458+ private=False
1459+ )
1460+ agenda = factory.make_one(
1461+ Agenda,
1462+ slot=slot,
1463+ meeting=meeting,
1464+ room=room
1465+ )
1466+
1467+ self.assertEquals(
1468+ meeting.meeting_page_url,
1469+ '/uds-test/meeting/%s/test.name/' % meeting.id
1470+ )
1471+
1472 response = self.client.get('/uds-test.ical')
1473 self.assertEquals(response.status_code, 200)
1474- self.assertContains(response, 'URL:%s/uds-test/meeting/%s/test.name/' % (site_root, meeting.id), 1)
1475-
1476+ self.assertContains(
1477+ response,
1478+ 'URL:%s/uds-test/meeting/%s/test.name/' % (site_root, meeting.id),
1479+ 1
1480+ )
1481+
1482 def test_ical_meeting_multiline_description(self):
1483 """ Tests that ical put spaces before multi-line descriptions"""
1484 now = datetime.datetime.utcnow()
1485@@ -490,19 +779,34 @@
1486 start_utc=now,
1487 end_utc=now+one_hour,
1488 type='open',
1489- summit=summit)
1490+ summit=summit
1491+ )
1492 slot.save()
1493-
1494+
1495 room = factory.make_one(Room, summit=summit)
1496- meeting = factory.make_one(Meeting, summit=summit, name='test.name', description="Test\r\nDescription", private=False)
1497- agenda = factory.make_one(Agenda, slot=slot, meeting=meeting, room=room)
1498-
1499- self.assertEquals(meeting.meeting_page_url, '/uds-test/meeting/%s/test.name/' % meeting.id)
1500-
1501+ meeting = factory.make_one(
1502+ Meeting,
1503+ summit=summit,
1504+ name='test.name',
1505+ description="Test\r\nDescription",
1506+ private=False
1507+ )
1508+ agenda = factory.make_one(
1509+ Agenda,
1510+ slot=slot,
1511+ meeting=meeting,
1512+ room=room
1513+ )
1514+
1515+ self.assertEquals(
1516+ meeting.meeting_page_url,
1517+ '/uds-test/meeting/%s/test.name/' % meeting.id
1518+ )
1519+
1520 response = self.client.get('/uds-test.ical')
1521 self.assertEquals(response.status_code, 200)
1522 self.assertContains(response, 'DESCRIPTION:Test\NDescription', 1)
1523-
1524+
1525 def test_private_ical(self):
1526 """ Tests that private icals contain private meetings """
1527 now = datetime.datetime.utcnow()
1528@@ -514,21 +818,57 @@
1529 start_utc=now,
1530 end_utc=now+one_hour,
1531 type='open',
1532- summit=summit)
1533-
1534+ summit=summit
1535+ )
1536+
1537 room = factory.make_one(Room, summit=summit)
1538- meeting = factory.make_one(Meeting, summit=summit, name='test.name', private=True)
1539- agenda = factory.make_one(Agenda, slot=slot, meeting=meeting, room=room)
1540-
1541- self.assertEquals(meeting.meeting_page_url, '/uds-test/meeting/%s/test.name/' % meeting.id)
1542-
1543- user = factory.make_one(User, username='testuser', first_name='Test', last_name='User')
1544- attendee = factory.make_one(Attendee, summit=summit, user=user, start_utc=now, end_utc=now+week)
1545- participant = factory.make_one(Participant, attendee=attendee, meeting=meeting)
1546-
1547- response = self.client.get('/uds-test/participant/my_schedule_%s.ical' % attendee.secret_key)
1548+ meeting = factory.make_one(
1549+ Meeting,
1550+ summit=summit,
1551+ name='test.name',
1552+ private=True
1553+ )
1554+ agenda = factory.make_one(
1555+ Agenda,
1556+ slot=slot,
1557+ meeting=meeting,
1558+ room=room
1559+ )
1560+
1561+ self.assertEquals(
1562+ meeting.meeting_page_url,
1563+ '/uds-test/meeting/%s/test.name/' % meeting.id
1564+ )
1565+
1566+ user = factory.make_one(
1567+ User,
1568+ username='testuser',
1569+ first_name='Test',
1570+ last_name='User'
1571+ )
1572+ attendee = factory.make_one(
1573+ Attendee,
1574+ summit=summit,
1575+ user=user,
1576+ start_utc=now,
1577+ end_utc=now+week
1578+ )
1579+ participant = factory.make_one(
1580+ Participant,
1581+ attendee=attendee,
1582+ meeting=meeting
1583+ )
1584+
1585+ response = self.client.get(
1586+ '/uds-test/participant/my_schedule_%s.ical' % attendee.secret_key
1587+ )
1588 self.assertEquals(response.status_code, 200)
1589- self.assertContains(response, 'URL:%s/uds-test/meeting/%s/test.name/' % (site_root, meeting.id), 1)
1590+ self.assertContains(
1591+ response,
1592+ 'URL:%s/uds-test/meeting/%s/test.name/' % (site_root, meeting.id),
1593+ 1
1594+ )
1595+
1596
1597 class MeetingPageTestCase(djangotest.TestCase):
1598
1599@@ -543,21 +883,38 @@
1600 start_utc=now,
1601 end_utc=now+one_hour,
1602 type='open',
1603- summit=summit)
1604+ summit=summit
1605+ )
1606 slot.save()
1607-
1608+
1609 room = factory.make_one(Room, summit=summit)
1610- meeting = factory.make_one(Meeting, summit=summit, name='test-meeting', private=False)
1611- agenda = factory.make_one(Agenda, slot=slot, meeting=meeting, room=room)
1612+ meeting = factory.make_one(
1613+ Meeting,
1614+ summit=summit,
1615+ name='test-meeting',
1616+ private=False
1617+ )
1618+ agenda = factory.make_one(
1619+ Agenda,
1620+ slot=slot,
1621+ meeting=meeting,
1622+ room=room
1623+ )
1624
1625 # check meeting page url generation
1626- self.assertEquals(meeting.meeting_page_url, '/uds-test/meeting/%s/test-meeting/' % meeting.id)
1627-
1628+ self.assertEquals(
1629+ meeting.meeting_page_url,
1630+ '/uds-test/meeting/%s/test-meeting/' % meeting.id
1631+ )
1632+
1633 # check meeting page url reverse lookup
1634- rev_args = ['uds-test', 1, 'test-meeting']
1635+ rev_args = ['uds-test', meeting.id, 'test-meeting']
1636 reverse_url = reverse('summit.schedule.views.meeting', args=rev_args)
1637- self.assertEquals(reverse_url, '/uds-test/meeting/%s/test-meeting/' % meeting.id)
1638-
1639+ self.assertEquals(
1640+ reverse_url,
1641+ '/uds-test/meeting/%s/test-meeting/' % meeting.id
1642+ )
1643+
1644 # check meeting details page
1645 response = self.client.get(reverse_url)
1646 self.assertEquals(response.status_code, 200)
1647@@ -565,7 +922,14 @@
1648 # check meeting in ical
1649 response = self.client.get('/uds-test.ical')
1650 self.assertEquals(response.status_code, 200)
1651- self.assertContains(response, 'URL:%s/uds-test/meeting/%s/test-meeting/' % (site_root, meeting.id), 1)
1652+ self.assertContains(
1653+ response,
1654+ 'URL:%s/uds-test/meeting/%s/test-meeting/' % (
1655+ site_root,
1656+ meeting.id
1657+ ),
1658+ 1
1659+ )
1660
1661
1662 class ParticipationRegistrationTestCase(djangotest.TestCase):
1663@@ -580,61 +944,157 @@
1664 start_utc=now+one_hour,
1665 end_utc=now+(2*one_hour),
1666 type='open',
1667- summit=self.summit)
1668-
1669+ summit=self.summit
1670+ )
1671+
1672 self.room = factory.make_one(Room, summit=self.summit, type='open')
1673- self.meeting = factory.make_one(Meeting, summit=self.summit, name='meeting1', private=False, requires_dial_in=False, spec_url=None)
1674+ self.meeting = factory.make_one(
1675+ Meeting,
1676+ summit=self.summit,
1677+ name='meeting1',
1678+ private=False,
1679+ requires_dial_in=False,
1680+ spec_url=''
1681+ )
1682
1683- self.user = factory.make_one(User, username='testuser', first_name='Test', last_name='User', is_active=True)
1684+ self.user = factory.make_one(
1685+ User,
1686+ username='testuser',
1687+ first_name='Test',
1688+ last_name='User',
1689+ is_active=True
1690+ )
1691 self.user.set_password('password')
1692 self.user.save()
1693
1694- self.attendee = factory.make_one(Attendee, summit=self.summit, user=self.user, start_utc=now, end_utc=now+week)
1695-
1696+ self.attendee = factory.make_one(
1697+ Attendee,
1698+ summit=self.summit,
1699+ user=self.user,
1700+ start_utc=now,
1701+ end_utc=now+week
1702+ )
1703+
1704+ def tearDown(self):
1705+ pass
1706+
1707 def login(self):
1708 logged_in = self.client.login(username='testuser', password='password')
1709 self.assertTrue(logged_in)
1710-
1711+
1712 def test_attend_link(self):
1713- self.assertEquals(0, Participant.objects.filter(attendee=self.attendee).count())
1714+ self.assertEquals(
1715+ 0,
1716+ Participant.objects.filter(
1717+ attendee=self.attendee
1718+ ).count()
1719+ )
1720 self.login()
1721- response = self.client.get(reverse('summit.schedule.views.meeting', args=('uds-test', self.meeting.id, 'meeting1')))
1722+ response = self.client.get(
1723+ reverse(
1724+ 'summit.schedule.views.meeting',
1725+ args=('uds-test', self.meeting.id, 'meeting1')
1726+ )
1727+ )
1728 self.assertContains(response, 'Attend this meeting', 1)
1729 self.assertContains(response, 'Subscribe to this meeting', 0)
1730 self.assertContains(response, 'Skip this meeting', 0)
1731
1732 def test_subscribe_link(self):
1733- self.assertEquals(0, Participant.objects.filter(attendee=self.attendee).count())
1734+ self.assertEquals(
1735+ 0,
1736+ Participant.objects.filter(
1737+ attendee=self.attendee
1738+ ).count()
1739+ )
1740 self.login()
1741 self.meeting.spec_url = 'http://examplespec.com/test'
1742 self.meeting.save()
1743- response = self.client.get(reverse('summit.schedule.views.meeting', args=('uds-test', self.meeting.id, 'meeting1')))
1744+ response = self.client.get(
1745+ reverse(
1746+ 'summit.schedule.views.meeting',
1747+ args=('uds-test', self.meeting.id, 'meeting1')
1748+ )
1749+ )
1750 self.assertContains(response, 'Subscribe to blueprint', 1)
1751- self.assertContains(response, 'http://examplespec.com/test/+subscribe', 1)
1752+ self.assertContains(
1753+ response,
1754+ 'http://examplespec.com/test/+subscribe',
1755+ 1
1756+ )
1757 self.assertContains(response, 'Attend this meeting', 1)
1758 self.assertContains(response, 'Skip this meeting', 0)
1759
1760 def test_skip_link(self):
1761- self.meeting.participant_set.create(attendee=self.attendee, participation = 'ATTENDING', from_launchpad=False)
1762- self.assertEquals(1, Participant.objects.filter(attendee=self.attendee).count())
1763+ self.meeting.participant_set.create(
1764+ attendee=self.attendee,
1765+ participation='ATTENDING',
1766+ from_launchpad=False
1767+ )
1768+ self.assertEquals(
1769+ 1,
1770+ Participant.objects.filter(
1771+ attendee=self.attendee
1772+ ).count()
1773+ )
1774 self.login()
1775- response = self.client.get(reverse('summit.schedule.views.meeting', args=('uds-test', self.meeting.id, 'meeting1')))
1776+ response = self.client.get(
1777+ reverse(
1778+ 'summit.schedule.views.meeting',
1779+ args=('uds-test', self.meeting.id, 'meeting1')
1780+ )
1781+ )
1782 self.assertContains(response, 'Skip this meeting', 1)
1783 self.assertContains(response, 'Subscribe to this meeting', 0)
1784 self.assertContains(response, 'Attend this meeting', 0)
1785
1786 def test_add_participation(self):
1787- self.assertEquals(0, Participant.objects.filter(attendee=self.attendee).count())
1788+ self.assertEquals(
1789+ 0,
1790+ Participant.objects.filter(
1791+ attendee=self.attendee
1792+ ).count()
1793+ )
1794 self.login()
1795- response = self.client.get(reverse('summit.schedule.views.register', args=('uds-test', self.meeting.id, 'meeting1')))
1796- self.assertEquals(1, Participant.objects.filter(attendee=self.attendee).count())
1797+ response = self.client.get(
1798+ reverse(
1799+ 'summit.schedule.views.register',
1800+ args=('uds-test', self.meeting.id, 'meeting1')
1801+ )
1802+ )
1803+ self.assertEquals(
1804+ 1,
1805+ Participant.objects.filter(
1806+ attendee=self.attendee
1807+ ).count()
1808+ )
1809
1810 def test_delete_participation(self):
1811- self.meeting.participant_set.create(attendee=self.attendee, participation = 'ATTENDING', from_launchpad=False)
1812- self.assertEquals(1, Participant.objects.filter(attendee=self.attendee).count())
1813+ self.meeting.participant_set.create(
1814+ attendee=self.attendee,
1815+ participation='ATTENDING',
1816+ from_launchpad=False
1817+ )
1818+ self.assertEquals(
1819+ 1,
1820+ Participant.objects.filter(
1821+ attendee=self.attendee
1822+ ).count()
1823+ )
1824 self.login()
1825- response = self.client.get(reverse('summit.schedule.views.unregister', args=('uds-test', self.meeting.id, 'meeting1')))
1826- self.assertEquals(0, Participant.objects.filter(attendee=self.attendee).count())
1827+ response = self.client.get(
1828+ reverse(
1829+ 'summit.schedule.views.unregister',
1830+ args=('uds-test', self.meeting.id, 'meeting1')
1831+ )
1832+ )
1833+ self.assertEquals(
1834+ 0,
1835+ Participant.objects.filter(
1836+ attendee=self.attendee
1837+ ).count()
1838+ )
1839+
1840
1841 class ReverseUrlLookupTestCase(djangotest.TestCase):
1842
1843@@ -648,19 +1108,30 @@
1844 start_utc=now,
1845 end_utc=now+one_hour,
1846 type='open',
1847- summit=self.summit)
1848+ summit=self.summit
1849+ )
1850 self.slot.save()
1851-
1852+
1853+ def tearDown(self):
1854+ pass
1855+
1856 def test_meeting_name_with_period(self):
1857 ''' Test the following Meeting urlconf
1858 (r'^(?P<summit_name>[\w-]+)/meeting/(?P<meeting_id>\d+)/(?P<meeting_slug>[\.\w-]+)/$', 'meeting'),
1859 '''
1860- meeting = factory.make_one(Meeting, summit=self.summit, name='test.meeting', private=False)
1861-
1862+ meeting = factory.make_one(
1863+ Meeting,
1864+ summit=self.summit,
1865+ name='test.meeting',
1866+ private=False
1867+ )
1868+
1869 rev_args = ['uds-test', meeting.id, 'test.meeting']
1870 reverse_url = reverse('summit.schedule.views.meeting', args=rev_args)
1871- self.assertEquals(reverse_url, '/uds-test/meeting/%s/test.meeting/' % meeting.id)
1872-
1873+ self.assertEquals(
1874+ reverse_url,
1875+ '/uds-test/meeting/%s/test.meeting/' % meeting.id
1876+ )
1877
1878 def test_room_name_with_period(self):
1879 ''' Test the following Room urlconfs
1880@@ -687,9 +1158,12 @@
1881 reverse_url = reverse('summit.schedule.views.by_track', args=rev_args)
1882 self.assertEquals(reverse_url, '/uds-test/track/test.track/')
1883
1884- reverse_url = reverse('summit.schedule.views.track_ical', args=rev_args)
1885+ reverse_url = reverse(
1886+ 'summit.schedule.views.track_ical',
1887+ args=rev_args
1888+ )
1889 self.assertEquals(reverse_url, '/uds-test/track/test.track.ical')
1890-
1891+
1892 def test_participant_name_with_period(self):
1893 ''' Test the following User urlconf
1894 (r'^(?P<summit_name>[\w-]+)/participant/(?P<username>[\w-]+)\.ical$', 'user_ical'),
1895@@ -699,22 +1173,38 @@
1896 rev_args = ['uds-test', 'test.user']
1897 reverse_url = reverse('summit.schedule.views.user_ical', args=rev_args)
1898 self.assertEquals(reverse_url, '/uds-test/participant/test.user.ical')
1899-
1900+
1901 def test_meeting_name_with_percent(self):
1902 ''' Test the following Meeting urlconf
1903 (r'^(?P<summit_name>[\w-]+)/meeting/(?P<meeting_id>\d+)/(?P<meeting_slug>[\.\w-]+)/$', 'meeting'),
1904 '''
1905- meeting = factory.make_one(Meeting, summit=self.summit, name='test.meeting', private=False)
1906-
1907+ meeting = factory.make_one(
1908+ Meeting,
1909+ summit=self.summit,
1910+ name='test.meeting',
1911+ private=False
1912+ )
1913+
1914 rev_args = ['uds-test', meeting.id, 'test%meeting']
1915 reverse_url = reverse('summit.schedule.views.meeting', args=rev_args)
1916- self.assertEquals(reverse_url, '/uds-test/meeting/%s/test%%meeting/' % meeting.id)
1917+ self.assertEquals(
1918+ reverse_url,
1919+ '/uds-test/meeting/%s/test%%meeting/' % meeting.id
1920+ )
1921
1922 def test_meeting_name_with_plus_sign(self):
1923- meeting = factory.make_one(Meeting, summit=self.summit, name='test.meeting', private=False)
1924+ meeting = factory.make_one(
1925+ Meeting,
1926+ summit=self.summit,
1927+ name='test.meeting',
1928+ private=False
1929+ )
1930 rev_args = ['uds-test', meeting.id, 'test+meeting']
1931 reverse_url = reverse('summit.schedule.views.meeting', args=rev_args)
1932- self.assertEquals(reverse_url, '/uds-test/meeting/%s/test+meeting/' % meeting.id)
1933+ self.assertEquals(
1934+ reverse_url,
1935+ '/uds-test/meeting/%s/test+meeting/' % meeting.id
1936+ )
1937
1938 def test_room_name_with_percent(self):
1939 ''' Test the following Room urlconfs
1940@@ -751,7 +1241,10 @@
1941 reverse_url = reverse('summit.schedule.views.by_track', args=rev_args)
1942 self.assertEquals(reverse_url, '/uds-test/track/test%track/')
1943
1944- reverse_url = reverse('summit.schedule.views.track_ical', args=rev_args)
1945+ reverse_url = reverse(
1946+ 'summit.schedule.views.track_ical',
1947+ args=rev_args
1948+ )
1949 self.assertEquals(reverse_url, '/uds-test/track/test%track.ical')
1950
1951 def test_track_name_with_plus_sign(self):
1952@@ -761,7 +1254,10 @@
1953 reverse_url = reverse('summit.schedule.views.by_track', args=rev_args)
1954 self.assertEquals(reverse_url, '/uds-test/track/test+track/')
1955
1956- reverse_url = reverse('summit.schedule.views.track_ical', args=rev_args)
1957+ reverse_url = reverse(
1958+ 'summit.schedule.views.track_ical',
1959+ args=rev_args
1960+ )
1961 self.assertEquals(reverse_url, '/uds-test/track/test+track.ical')
1962
1963 def test_participant_name_with_percent(self):
1964@@ -781,6 +1277,7 @@
1965 reverse_url = reverse('summit.schedule.views.user_ical', args=rev_args)
1966 self.assertEquals(reverse_url, '/uds-test/participant/test+user.ical')
1967
1968+
1969 class EtherpadEditUrl(djangotest.TestCase):
1970
1971 def setUp(self):
1972@@ -799,12 +1296,29 @@
1973 slot.save()
1974
1975 room = factory.make_one(Room, summit=self.summit)
1976- meeting = factory.make_one(Meeting, summit=self.summit, name='test-meeting', private=False)
1977- agenda = factory.make_one(Agenda, slot=slot, meeting=meeting, room=room)
1978+ meeting = factory.make_one(
1979+ Meeting,
1980+ summit=self.summit,
1981+ name='test-meeting',
1982+ private=False
1983+ )
1984+ agenda = factory.make_one(
1985+ Agenda,
1986+ slot=slot,
1987+ meeting=meeting,
1988+ room=room
1989+ )
1990
1991- response = self.client.get('/uds-test/meeting/%s/test-meeting/' % meeting.id)
1992+ response = self.client.get(
1993+ '/uds-test/meeting/%s/test-meeting/' % meeting.id
1994+ )
1995 self.assertEquals(response.status_code, 200)
1996- self.assertContains(response, 'http://pad.ubuntu.com/ep/pad/view/uds-test-test-meeting/latest', 1)
1997+ self.assertContains(
1998+ response,
1999+ 'http://pad.ubuntu.com/ep/pad/view/uds-test-test-meeting/latest',
2000+ 1
2001+ )
2002+
2003
2004 class SchedulingConflictsTestCase(djangotest.TestCase):
2005
2006@@ -819,24 +1333,52 @@
2007 end_utc=now+one_hour,
2008 type='open',
2009 summit=self.summit)
2010-
2011+
2012 self.room1 = factory.make_one(Room, summit=self.summit)
2013- self.meeting1 = factory.make_one(Meeting, summit=self.summit, name='meeting1', requires_dial_in=False)
2014- self.agenda1 = factory.make_one(Agenda, slot=self.slot, meeting=self.meeting1, room=self.room1)
2015+ self.meeting1 = factory.make_one(
2016+ Meeting,
2017+ summit=self.summit,
2018+ name='meeting1',
2019+ requires_dial_in=False
2020+ )
2021+ self.agenda1 = factory.make_one(
2022+ Agenda,
2023+ slot=self.slot,
2024+ meeting=self.meeting1,
2025+ room=self.room1
2026+ )
2027
2028 self.room2 = factory.make_one(Room, summit=self.summit)
2029- self.meeting2 = factory.make_one(Meeting, summit=self.summit, name='meeting2', requires_dial_in=False)
2030-
2031- self.user = factory.make_one(User, username='testuser', first_name='Test', last_name='User')
2032- self.attendee = factory.make_one(Attendee, summit=self.summit, user=self.user, start_utc=now, end_utc=now+week)
2033-
2034+ self.meeting2 = factory.make_one(
2035+ Meeting,
2036+ summit=self.summit,
2037+ name='meeting2',
2038+ requires_dial_in=False
2039+ )
2040+
2041+ self.user = factory.make_one(
2042+ User,
2043+ username='testuser',
2044+ first_name='Test',
2045+ last_name='User'
2046+ )
2047+ self.attendee = factory.make_one(
2048+ Attendee,
2049+ summit=self.summit,
2050+ user=self.user,
2051+ start_utc=now,
2052+ end_utc=now+week
2053+ )
2054+
2055 def tearDown(self):
2056 pass
2057-
2058+
2059 def assertRaises(self, exception_type, function, args):
2060 try:
2061 function(*args)
2062- raise AssertionError('Callable failed to raise exception %s' % exception_type)
2063+ raise AssertionError(
2064+ 'Callable failed to raise exception %s' % exception_type
2065+ )
2066 except exception_type, e:
2067 return True
2068
2069@@ -844,21 +1386,25 @@
2070 '''Checks the Meeting model's check_schedule'''
2071 missing = self.meeting1.check_schedule(self.slot, self.room1)
2072 self.assertEquals(len(missing), 0)
2073-
2074+
2075 missing = self.meeting2.check_schedule(self.slot, self.room2)
2076 self.assertEquals(len(missing), 0)
2077-
2078+
2079 def test_meeting_check_room_conflict(self):
2080- '''Checks that two meetings will not be scheduled in the same room
2081+ '''Checks that two meetings will not be scheduled in the same room
2082 at the same time
2083 '''
2084 missing = self.meeting1.check_schedule(self.slot, self.room1)
2085 self.assertEquals(len(missing), 0)
2086-
2087- self.assertRaises(Meeting.SchedulingError,
2088- Meeting.check_schedule,
2089- (self.meeting2, self.slot, self.room1))
2090-
2091+
2092+ self.assertRaises(
2093+ Meeting.SchedulingError,
2094+ Meeting.check_schedule,
2095+ (self.meeting2,
2096+ self.slot,
2097+ self.room1)
2098+ )
2099+
2100 def test_meeting_check_schedule_participant_conflict(self):
2101 '''Checks that a two meetings requiring the same attendee will mark that
2102 user as missing.
2103@@ -866,19 +1412,20 @@
2104 participant1 = Participant.objects.create(
2105 meeting=self.meeting1,
2106 attendee=self.attendee,
2107- participation = 'REQUIRED'
2108+ participation='REQUIRED'
2109 )
2110 missing = self.meeting1.check_schedule(self.slot, self.room1)
2111 self.assertEquals(len(missing), 0)
2112-
2113+
2114 participant1 = Participant.objects.create(
2115 meeting=self.meeting2,
2116 attendee=self.attendee,
2117- participation = 'REQUIRED'
2118+ participation='REQUIRED'
2119 )
2120 missing = self.meeting2.check_schedule(self.slot, self.room2)
2121 self.assertEquals(len(missing), 1)
2122
2123+
2124 class AutoSchedulerTestCase(djangotest.TestCase):
2125 def setUp(self):
2126 now = datetime.datetime.utcnow()
2127@@ -890,40 +1437,75 @@
2128 start_utc=now+week,
2129 end_utc=now+week+one_hour,
2130 type='open',
2131- summit=self.summit)
2132-
2133+ summit=self.summit
2134+ )
2135+
2136 self.room1 = factory.make_one(Room, summit=self.summit, type='open')
2137- self.meeting1 = factory.make_one(Meeting, summit=self.summit, name='meeting1', requires_dial_in=False, approved='APPROVED', private=False)
2138- self.agenda1 = factory.make_one(Agenda, slot=self.slot, meeting=self.meeting1, room=self.room1)
2139+ self.meeting1 = factory.make_one(
2140+ Meeting,
2141+ summit=self.summit,
2142+ name='meeting1',
2143+ requires_dial_in=False,
2144+ approved='APPROVED',
2145+ private=False
2146+ )
2147+ self.agenda1 = factory.make_one(
2148+ Agenda,
2149+ slot=self.slot,
2150+ meeting=self.meeting1,
2151+ room=self.room1
2152+ )
2153
2154 self.room2 = factory.make_one(Room, summit=self.summit, type='open')
2155- self.meeting2 = factory.make_one(Meeting, summit=self.summit, name='meeting2', requires_dial_in=False, approved='APPROVED', private=False)
2156-
2157- self.user = factory.make_one(User, username='testuser', first_name='Test', last_name='User')
2158- self.attendee = factory.make_one(Attendee, summit=self.summit, user=self.user, start_utc=now, end_utc=now+week)
2159-
2160+ self.meeting2 = factory.make_one(
2161+ Meeting,
2162+ summit=self.summit,
2163+ name='meeting2',
2164+ requires_dial_in=False,
2165+ approved='APPROVED',
2166+ private=False
2167+ )
2168+
2169+ self.user = factory.make_one(
2170+ User,
2171+ username='testuser',
2172+ first_name='Test',
2173+ last_name='User'
2174+ )
2175+ self.attendee = factory.make_one(
2176+ Attendee,
2177+ summit=self.summit,
2178+ user=self.user,
2179+ start_utc=now,
2180+ end_utc=now+week
2181+ )
2182+
2183 def tearDown(self):
2184 pass
2185
2186 def run_autoschedule(self):
2187 from django.core.management import execute_from_command_line
2188- execute_from_command_line(argv=['manage.py', 'autoschedule', 'uds-test', '-v', '2'])
2189+ execute_from_command_line(
2190+ argv=['manage.py', 'autoschedule', 'uds-test', '-v', '2']
2191+ )
2192
2193 def run_reschedule(self):
2194 from django.core.management import execute_from_command_line
2195- execute_from_command_line(argv=['manage.py', 'reschedule', 'uds-test', '-v', '2'])
2196+ execute_from_command_line(
2197+ argv=['manage.py', 'reschedule', 'uds-test', '-v', '2']
2198+ )
2199
2200 def test_required_conflict(self):
2201 participant1 = Participant.objects.create(
2202 meeting=self.meeting1,
2203 attendee=self.attendee,
2204- participation = 'REQUIRED'
2205+ participation='REQUIRED'
2206 )
2207
2208 participant2 = Participant.objects.create(
2209 meeting=self.meeting2,
2210 attendee=self.attendee,
2211- participation = 'REQUIRED'
2212+ participation='REQUIRED'
2213 )
2214
2215 self.run_autoschedule()
2216@@ -935,13 +1517,13 @@
2217 participant1 = Participant.objects.create(
2218 meeting=self.meeting1,
2219 attendee=self.attendee,
2220- participation = 'REQUIRED'
2221+ participation='REQUIRED'
2222 )
2223
2224 participant2 = Participant.objects.create(
2225 meeting=self.meeting2,
2226 attendee=self.attendee,
2227- participation = 'INTERESTED'
2228+ participation='INTERESTED'
2229 )
2230
2231 self.run_autoschedule()
2232@@ -953,13 +1535,13 @@
2233 participant1 = Participant.objects.create(
2234 meeting=self.meeting1,
2235 attendee=self.attendee,
2236- participation = 'REQUIRED'
2237+ participation='REQUIRED'
2238 )
2239
2240 participant2 = Participant.objects.create(
2241 meeting=self.meeting2,
2242 attendee=self.attendee,
2243- participation = 'INTERESTED'
2244+ participation='INTERESTED'
2245 )
2246
2247 self.run_autoschedule()
2248@@ -969,32 +1551,50 @@
2249
2250 participant2.participation = 'REQUIRED'
2251 participant2.save()
2252-
2253+
2254 self.run_reschedule()
2255
2256- self.assertEquals(1, self.meeting1.agenda_set.all().count())
2257- self.assertEquals(0, self.meeting2.agenda_set.all().count())
2258+ self.assertEquals(0, self.meeting1.agenda_set.all().count())
2259+ self.assertEquals(0, self.meeting2.agenda_set.all().count())
2260
2261 def test_get_participants_by_level(self):
2262 participant1 = Participant.objects.create(
2263 meeting=self.meeting1,
2264 attendee=self.attendee,
2265- participation = 'REQUIRED'
2266+ participation='REQUIRED'
2267 )
2268
2269 participant2 = Participant.objects.create(
2270 meeting=self.meeting2,
2271 attendee=self.attendee,
2272- participation = 'INTERESTED'
2273- )
2274-
2275- self.assertEquals(1, len(self.meeting1.get_participants_by_level('REQUIRED')))
2276- self.assertEquals(0, len(self.meeting1.get_participants_by_level('INTERESTED')))
2277- self.assertEquals(0, len(self.meeting1.get_participants_by_level('ATTENDING')))
2278-
2279- self.assertEquals(0, len(self.meeting2.get_participants_by_level('REQUIRED')))
2280- self.assertEquals(1, len(self.meeting2.get_participants_by_level('INTERESTED')))
2281- self.assertEquals(0, len(self.meeting2.get_participants_by_level('ATTENDING')))
2282+ participation='INTERESTED'
2283+ )
2284+
2285+ self.assertEquals(
2286+ 1,
2287+ len(self.meeting1.get_participants_by_level('REQUIRED'))
2288+ )
2289+ self.assertEquals(
2290+ 0, len(self.meeting1.get_participants_by_level('INTERESTED'))
2291+ )
2292+ self.assertEquals(
2293+ 0,
2294+ len(self.meeting1.get_participants_by_level('ATTENDING'))
2295+ )
2296+
2297+ self.assertEquals(
2298+ 0,
2299+ len(self.meeting2.get_participants_by_level('REQUIRED'))
2300+ )
2301+ self.assertEquals(
2302+ 1,
2303+ len(self.meeting2.get_participants_by_level('INTERESTED'))
2304+ )
2305+ self.assertEquals(
2306+ 0,
2307+ len(self.meeting2.get_participants_by_level('ATTENDING'))
2308+ )
2309+
2310
2311 class PrivateSchedulingTestCase(djangotest.TestCase):
2312
2313@@ -1008,49 +1608,117 @@
2314 start_utc=now+one_hour,
2315 end_utc=now+(2*one_hour),
2316 type='open',
2317- summit=self.summit)
2318-
2319- self.open_room = factory.make_one(Room, summit=self.summit, type='open')
2320- self.public_meeting = factory.make_one(Meeting, summit=self.summit, name='meeting1', private=False, requires_dial_in=False, approved='APPROVED')
2321-
2322- self.private_room = factory.make_one(Room, summit=self.summit, type='private')
2323- self.private_meeting = factory.make_one(Meeting, summit=self.summit, name='meeting2', private=True, requires_dial_in=False, approved='APPROVED')
2324-
2325- self.user = factory.make_one(User, username='testuser', first_name='Test', last_name='User')
2326- self.attendee = factory.make_one(Attendee, summit=self.summit, user=self.user, start_utc=now, end_utc=now+week)
2327-
2328+ summit=self.summit
2329+ )
2330+
2331+ self.open_room = factory.make_one(
2332+ Room,
2333+ summit=self.summit,
2334+ type='open'
2335+ )
2336+ self.public_meeting = factory.make_one(
2337+ Meeting,
2338+ summit=self.summit,
2339+ name='meeting1',
2340+ private=False,
2341+ requires_dial_in=False,
2342+ approved='APPROVED'
2343+ )
2344+
2345+ self.private_room = factory.make_one(
2346+ Room,
2347+ summit=self.summit,
2348+ type='private'
2349+ )
2350+ self.private_meeting = factory.make_one(
2351+ Meeting,
2352+ summit=self.summit,
2353+ name='meeting2',
2354+ private=True,
2355+ requires_dial_in=False,
2356+ approved='APPROVED'
2357+ )
2358+
2359+ self.user = factory.make_one(
2360+ User,
2361+ username='testuser',
2362+ first_name='Test',
2363+ last_name='User'
2364+ )
2365+ self.attendee = factory.make_one(
2366+ Attendee,
2367+ summit=self.summit,
2368+ user=self.user,
2369+ start_utc=now,
2370+ end_utc=now+week
2371+ )
2372+
2373 def tearDown(self):
2374 pass
2375-
2376+
2377 def assertRaises(self, exception_type, function, args):
2378 try:
2379 function(*args)
2380- raise AssertionError('Callable failed to raise exception %s' % exception_type)
2381+ raise AssertionError(
2382+ 'Callable failed to raise exception %s' % exception_type
2383+ )
2384 except exception_type, e:
2385 return True
2386
2387 def run_autoschedule(self):
2388 from django.core.management import execute_from_command_line
2389- execute_from_command_line(argv=['manage.py', 'autoschedule', 'uds-test', '-v', '2'])
2390+ execute_from_command_line(
2391+ argv=['manage.py', 'autoschedule', 'uds-test', '-v', '2']
2392+ )
2393
2394 def test_private_meeting_schedule(self):
2395 ''' General run of the autoschedule, no gurantee of what ends up where'''
2396 self.run_autoschedule()
2397
2398 # Private meetings should not ever be autoscheduled
2399- self.assertEquals(0, Agenda.objects.filter(slot__summit=self.summit, meeting__private=True, room__type='open').count())
2400- self.assertEquals(0, Agenda.objects.filter(slot__summit=self.summit, meeting__private=False, room__type='private').count())
2401+ self.assertEquals(
2402+ 0,
2403+ Agenda.objects.filter(
2404+ slot__summit=self.summit,
2405+ meeting__private=True,
2406+ room__type='open'
2407+ ).count()
2408+ )
2409+ self.assertEquals(
2410+ 0,
2411+ Agenda.objects.filter(
2412+ slot__summit=self.summit,
2413+ meeting__private=False,
2414+ room__type='private'
2415+ ).count()
2416+ )
2417 # Private rooms should not ever be autoscheduled
2418- self.assertEquals(0, Agenda.objects.filter(slot__summit=self.summit, meeting__private=True, room__type='private').count())
2419+ self.assertEquals(
2420+ 0,
2421+ Agenda.objects.filter(
2422+ slot__summit=self.summit,
2423+ meeting__private=True,
2424+ room__type='private'
2425+ ).count()
2426+ )
2427
2428 # Public meetings in open rooms should be autoscheduled
2429- self.assertEquals(1, Agenda.objects.filter(slot__summit=self.summit, meeting__private=False, room__type='open').count())
2430+ self.assertEquals(
2431+ 1,
2432+ Agenda.objects.filter(
2433+ slot__summit=self.summit,
2434+ meeting__private=False,
2435+ room__type='open'
2436+ ).count()
2437+ )
2438
2439 def test_no_available_public_room(self):
2440- '''Make sure public meetings will not be autoscheduled into private rooms'''
2441+ '''
2442+ Make sure public meetings will not be autoscheduled into private rooms
2443+ '''
2444 self.open_room.type = 'private'
2445 self.open_room.save()
2446-
2447+
2448 self.run_autoschedule()
2449
2450 # Without an open room, public meetings should not be autoscheduled
2451@@ -1058,17 +1726,19 @@
2452
2453 # Private meetings should not ever be autoscheduled
2454 self.assertEquals(0, self.private_meeting.agenda_set.count())
2455-
2456+
2457 # Private rooms should not ever be autoscheduled
2458 self.assertEquals(0, Agenda.objects.filter(room__type='private').count())
2459-
2460+
2461 def test_no_available_private_room(self):
2462- '''Make sure private meetings will not be autoscheduled into open rooms'''
2463+ '''
2464+ Make sure private meetings will not be autoscheduled into open rooms
2465+ '''
2466 self.private_room.type = 'open'
2467 self.private_room.save()
2468-
2469+
2470 self.run_autoschedule()
2471-
2472+
2473 # Private meetings should not ever be autoscheduled
2474 self.assertEquals(0, self.private_meeting.agenda_set.count())
2475
2476@@ -1077,17 +1747,32 @@
2477 self.assertEquals(1, Agenda.objects.filter(room__type='open').count())
2478
2479 def test_required_participant_in_private_meeting(self):
2480- '''Make sure meetings aren't scheduled when someone is in a private meeting.'''
2481+ '''
2482+ Make sure meetings aren't scheduled when
2483+ someone is in a private meeting.
2484+ '''
2485 # Make the same person required for both meetings
2486- self.public_meeting.participant_set.create(attendee=self.attendee, participation = 'REQUIRED')
2487- self.private_meeting.participant_set.create(attendee=self.attendee, participation = 'REQUIRED')
2488+ self.public_meeting.participant_set.create(
2489+ attendee=self.attendee,
2490+ participation='REQUIRED'
2491+ )
2492+ self.private_meeting.participant_set.create(
2493+ attendee=self.attendee,
2494+ participation='REQUIRED'
2495+ )
2496 # Schedule the private meeting in the one available slot
2497- self.private_room.agenda_set.create(slot=self.slot, meeting=self.private_meeting)
2498+ self.private_room.agenda_set.create(
2499+ slot=self.slot,
2500+ meeting=self.private_meeting
2501+ )
2502
2503 self.run_autoschedule()
2504
2505 # Check that the private meeting is still scheduled
2506- self.assertEquals(1, self.private_meeting.agenda_set.count())
2507+ self.assertEquals(
2508+ 1,
2509+ self.private_meeting.agenda_set.count()
2510+ )
2511 # Check that the public meeting is not scheduled
2512 self.assertEquals(0, self.public_meeting.agenda_set.count())
2513
2514@@ -1104,15 +1789,46 @@
2515 start_utc=now+one_hour,
2516 end_utc=now+(2*one_hour),
2517 type='open',
2518- summit=self.summit)
2519-
2520- self.track1 = factory.make_one(Track, slug='test_slug', summit=self.summit)
2521- self.room1 = factory.make_one(Room, summit=self.summit, name='room1')
2522- self.meeting1 = factory.make_one(Meeting, summit=self.summit, name='meeting1', private=False, requires_dial_in=False)
2523- self.agenda1 = factory.make_one(Agenda, slot=self.slot, meeting=self.meeting1, room=self.room1)
2524-
2525- self.user = factory.make_one(User, username='testuser', first_name='Test', last_name='User')
2526- self.attendee = factory.make_one(Attendee, summit=self.summit, user=self.user, start_utc=now, end_utc=now+week)
2527+ summit=self.summit
2528+ )
2529+
2530+ self.track1 = factory.make_one(
2531+ Track,
2532+ slug='test_slug',
2533+ summit=self.summit
2534+ )
2535+ self.room1 = factory.make_one(
2536+ Room,
2537+ summit=self.summit,
2538+ name='room1'
2539+ )
2540+ self.meeting1 = factory.make_one(
2541+ Meeting,
2542+ summit=self.summit,
2543+ name='meeting1',
2544+ private=False,
2545+ requires_dial_in=False
2546+ )
2547+ self.agenda1 = factory.make_one(
2548+ Agenda,
2549+ slot=self.slot,
2550+ meeting=self.meeting1,
2551+ room=self.room1
2552+ )
2553+
2554+ self.user = factory.make_one(
2555+ User,
2556+ username='testuser',
2557+ first_name='Test',
2558+ last_name='User'
2559+ )
2560+ self.attendee = factory.make_one(
2561+ Attendee,
2562+ summit=self.summit,
2563+ user=self.user,
2564+ start_utc=now,
2565+ end_utc=now+week
2566+ )
2567
2568 def tearDown(self):
2569 # Cached requests cause render.py to return old data, so clear the cache
2570@@ -1124,7 +1840,10 @@
2571
2572 def request_schedule(self):
2573 schedule_args = [self.summit.name, self.agenda1.slot.start_utc.date()]
2574- schedule_url = reverse('summit.schedule.views.by_date', args=schedule_args)
2575+ schedule_url = reverse(
2576+ 'summit.schedule.views.by_date',
2577+ args=schedule_args
2578+ )
2579 response = self.client.get(schedule_url)
2580 return response
2581
2582@@ -1175,13 +1894,21 @@
2583 self.assertContains(response, 'test%track', 1)
2584
2585 def test_specify_rooms_in_schedule(self):
2586- room2 = factory.make_one(Room, summit=self.summit, name='room2', title='Room 2')
2587+ room2 = factory.make_one(
2588+ Room,
2589+ summit=self.summit,
2590+ name='room2',
2591+ title='Room 2'
2592+ )
2593 self.room1.title = 'Room 1'
2594 self.room1.save()
2595 self.agenda1.delete()
2596-
2597+
2598 schedule_args = [self.summit.name, self.agenda1.slot.start_utc.date()]
2599- schedule_url = reverse('summit.schedule.views.by_date', args=schedule_args)
2600+ schedule_url = reverse(
2601+ 'summit.schedule.views.by_date',
2602+ args=schedule_args
2603+ )
2604
2605 response = self.client.get(schedule_url)
2606 self.assertContains(response, self.room1.title, 2)
2607@@ -1190,15 +1917,15 @@
2608 response = self.client.get(schedule_url + '?rooms=room1')
2609 self.assertContains(response, self.room1.title, 2)
2610 self.assertContains(response, room2.title, 0)
2611-
2612+
2613 response = self.client.get(schedule_url + '?rooms=room2')
2614 self.assertContains(response, self.room1.title, 0)
2615 self.assertContains(response, room2.title, 2)
2616-
2617+
2618 response = self.client.get(schedule_url + '?rooms=room1,room2')
2619 self.assertContains(response, self.room1.title, 2)
2620 self.assertContains(response, room2.title, 2)
2621-
2622+
2623 response = self.client.get(schedule_url + '?rooms=unknown1,unknown2')
2624 self.assertContains(response, self.room1.title, 0)
2625 self.assertContains(response, room2.title, 0)
2626@@ -1216,17 +1943,50 @@
2627 start_utc=now+one_hour,
2628 end_utc=now+(2*one_hour),
2629 type='open',
2630- summit=self.summit)
2631+ summit=self.summit
2632+ )
2633
2634- self.track = factory.make_one(Track, slug='test.track', summit=self.summit)
2635- self.room = factory.make_one(Room, name='test.room', title='Test Room', summit=self.summit)
2636+ self.track = factory.make_one(
2637+ Track,
2638+ slug='test.track',
2639+ summit=self.summit
2640+ )
2641+ self.room = factory.make_one(
2642+ Room,
2643+ name='test.room',
2644+ title='Test Room',
2645+ summit=self.summit
2646+ )
2647 self.room.tracks = [self.track]
2648- self.meeting = factory.make_one(Meeting, summit=self.summit, title='Test Meeting', name='meeting', private=False, requires_dial_in=False)
2649+ self.meeting = factory.make_one(
2650+ Meeting,
2651+ summit=self.summit,
2652+ title='Test Meeting',
2653+ name='meeting',
2654+ private=False,
2655+ requires_dial_in=False
2656+ )
2657 self.meeting.tracks = [self.track]
2658- self.agenda = factory.make_one(Agenda, slot=self.slot, meeting=self.meeting, room=self.room)
2659+ self.agenda = factory.make_one(
2660+ Agenda,
2661+ slot=self.slot,
2662+ meeting=self.meeting,
2663+ room=self.room
2664+ )
2665
2666- self.user = factory.make_one(User, username='testuser', first_name='Test', last_name='User')
2667- self.attendee = factory.make_one(Attendee, summit=self.summit, user=self.user, start_utc=now, end_utc=now+week)
2668+ self.user = factory.make_one(
2669+ User,
2670+ username='testuser',
2671+ first_name='Test',
2672+ last_name='User'
2673+ )
2674+ self.attendee = factory.make_one(
2675+ Attendee,
2676+ summit=self.summit,
2677+ user=self.user,
2678+ start_utc=now,
2679+ end_utc=now+week
2680+ )
2681
2682 def tearDown(self):
2683 # Cached requests cause render.py to return old data, so clear the cache
2684@@ -1238,37 +1998,63 @@
2685
2686 def request_schedule_by_date(self):
2687 schedule_args = [self.summit.name, self.agenda.slot.start_utc.date()]
2688- schedule_url = reverse('summit.schedule.views.by_date', args=schedule_args)
2689+ schedule_url = reverse(
2690+ 'summit.schedule.views.by_date',
2691+ args=schedule_args
2692+ )
2693 response = self.client.get(schedule_url)
2694 return response
2695
2696 def request_schedule_by_track(self):
2697 schedule_args = [self.summit.name, self.track.slug]
2698- schedule_url = reverse('summit.schedule.views.by_track', args=schedule_args)
2699+ schedule_url = reverse(
2700+ 'summit.schedule.views.by_track',
2701+ args=schedule_args
2702+ )
2703 response = self.client.get(schedule_url)
2704 return response
2705
2706 def test_cache_cleared_on_meeting_change(self):
2707 self.assertEqual(None, cache.get('meeting-html-%s' % self.meeting.id))
2708 response = self.request_schedule_by_date()
2709- self.assertTrue('Test Meeting' in cache.get('meeting-html-%s' % self.meeting.id, ''))
2710-
2711+ self.assertTrue(
2712+ 'Test Meeting' in cache.get(
2713+ 'meeting-html-%s' % self.meeting.id,
2714+ ''
2715+ )
2716+ )
2717+
2718 self.meeting.save()
2719-
2720+
2721 self.assertEqual(None, cache.get('meeting-html-%s' % self.meeting.id))
2722 response = self.request_schedule_by_date()
2723- self.assertTrue('Test Meeting' in cache.get('meeting-html-%s' % self.meeting.id, ''))
2724+ self.assertTrue(
2725+ 'Test Meeting' in cache.get(
2726+ 'meeting-html-%s' % self.meeting.id,
2727+ ''
2728+ )
2729+ )
2730
2731 def test_cache_cleared_on_agenda_change(self):
2732 self.assertEqual(None, cache.get('meeting-html-%s' % self.meeting.id))
2733 response = self.request_schedule_by_date()
2734- self.assertTrue('Test Meeting' in cache.get('meeting-html-%s' % self.meeting.id, ''))
2735-
2736+ self.assertTrue(
2737+ 'Test Meeting' in cache.get(
2738+ 'meeting-html-%s' % self.meeting.id,
2739+ ''
2740+ )
2741+ )
2742+
2743 self.agenda.save()
2744-
2745+
2746 self.assertEqual(None, cache.get('meeting-html-%s' % self.meeting.id))
2747 response = self.request_schedule_by_date()
2748- self.assertTrue('Test Meeting' in cache.get('meeting-html-%s' % self.meeting.id, ''))
2749+ self.assertTrue(
2750+ 'Test Meeting' in cache.get(
2751+ 'meeting-html-%s' % self.meeting.id,
2752+ ''
2753+ )
2754+ )
2755
2756
2757 class ScheduleTestCase(djangotest.TestCase):
2758@@ -1286,11 +2072,16 @@
2759 self.assertEqual(False, schedule.edit)
2760
2761 def get_user_with_schedule_permission(self):
2762- user = factory.make_one(User, is_active=True, is_staff=False,
2763- is_superuser=False)
2764+ user = factory.make_one(
2765+ User,
2766+ is_active=True,
2767+ is_staff=False,
2768+ is_superuser=False
2769+ )
2770 user.user_permissions.create(
2771 codename='change_agenda',
2772- content_type=factory.make_one(ContentType, app_label='schedule'))
2773+ content_type=factory.make_one(ContentType, app_label='schedule')
2774+ )
2775 return user
2776
2777 def get_get_request(self, **kwargs):
2778@@ -1388,49 +2179,91 @@
2779 def test_room_set_from_summit_if_not_passed(self):
2780 request = self.get_request()
2781 summit = factory.make_one(Summit)
2782- room1 = factory.make_one(Room, summit=summit, type='open',
2783- name="room1")
2784- room2 = factory.make_one(Room, summit=summit, type='open',
2785- name="room2")
2786+ room1 = factory.make_one(
2787+ Room,
2788+ summit=summit,
2789+ type='open',
2790+ name="room1"
2791+ )
2792+ room2 = factory.make_one(
2793+ Room,
2794+ summit=summit,
2795+ type='open',
2796+ name="room2"
2797+ )
2798 factory.make_one(Room, summit=summit, type='closed')
2799 factory.make_one(Room, summit=summit, type='private')
2800 schedule = Schedule.from_request(request, summit)
2801 self.assertEqual(None, schedule.room)
2802- self.assertEqual(["room1", "room2"],
2803- sorted([r.name for r in schedule.rooms]))
2804+ self.assertEqual(
2805+ ["room1", "room2"],
2806+ sorted([r.name for r in schedule.rooms])
2807+ )
2808
2809 def test_rooms_include_private_if_user_is_staff(self):
2810- user = factory.make_one(User, is_active=True, is_staff=True,
2811- is_superuser=False)
2812+ user = factory.make_one(
2813+ User,
2814+ is_active=True,
2815+ is_staff=True,
2816+ is_superuser=False
2817+ )
2818 request = self.get_request()
2819 request.user = user
2820 summit = factory.make_one(Summit)
2821- room1 = factory.make_one(Room, summit=summit, type='open',
2822- name="room1")
2823- room2 = factory.make_one(Room, summit=summit, type='open',
2824- name="room2")
2825+ room1 = factory.make_one(
2826+ Room,
2827+ summit=summit,
2828+ type='open',
2829+ name="room1"
2830+ )
2831+ room2 = factory.make_one(
2832+ Room,
2833+ summit=summit,
2834+ type='open',
2835+ name="room2"
2836+ )
2837 factory.make_one(Room, summit=summit, type='closed')
2838- factory.make_one(Room, summit=summit, type='private',
2839- name="privateroom")
2840+ factory.make_one(
2841+ Room,
2842+ summit=summit,
2843+ type='private',
2844+ name="privateroom"
2845+ )
2846 schedule = Schedule.from_request(request, summit)
2847 self.assertEqual(None, schedule.room)
2848- self.assertEqual(["privateroom", "room1", "room2"],
2849- sorted([r.name for r in schedule.rooms]))
2850+ self.assertEqual(
2851+ ["privateroom", "room1", "room2"],
2852+ sorted([r.name for r in schedule.rooms])
2853+ )
2854
2855 def test_rooms_include_private_if_show_private(self):
2856 request = self.get_request()
2857 summit = factory.make_one(Summit)
2858- room1 = factory.make_one(Room, summit=summit, type='open',
2859- name="room1")
2860- room2 = factory.make_one(Room, summit=summit, type='open',
2861- name="room2")
2862+ room1 = factory.make_one(
2863+ Room,
2864+ summit=summit,
2865+ type='open',
2866+ name="room1"
2867+ )
2868+ room2 = factory.make_one(
2869+ Room,
2870+ summit=summit,
2871+ type='open',
2872+ name="room2"
2873+ )
2874 factory.make_one(Room, summit=summit, type='closed')
2875- factory.make_one(Room, summit=summit, type='private',
2876- name="privateroom")
2877+ factory.make_one(
2878+ Room,
2879+ summit=summit,
2880+ type='private',
2881+ name="privateroom"
2882+ )
2883 schedule = Schedule.from_request(request, summit, show_private=True)
2884 self.assertEqual(None, schedule.room)
2885- self.assertEqual(["privateroom", "room1", "room2"],
2886- sorted([r.name for r in schedule.rooms]))
2887+ self.assertEqual(
2888+ ["privateroom", "room1", "room2"],
2889+ sorted([r.name for r in schedule.rooms])
2890+ )
2891
2892 def test_track_is_none_by_default(self):
2893 schedule = self.get_schedule_from_request()
2894@@ -1471,13 +2304,25 @@
2895 schedule = Schedule.from_request(request, summit)
2896 self.assertEqual(None, schedule.fakenow)
2897
2898- def get_schedule(self, edit=False, room=None, summit=None, dates=None,
2899- rooms=None):
2900+ def get_schedule(
2901+ self,
2902+ edit=False,
2903+ room=None,
2904+ summit=None,
2905+ dates=None,
2906+ rooms=None
2907+ ):
2908 request = self.get_request()
2909 if summit is None:
2910 summit = factory.make_one(Summit)
2911- schedule = Schedule(request, summit, edit=edit, room=room,
2912- dates=dates, rooms=rooms)
2913+ schedule = Schedule(
2914+ request,
2915+ summit,
2916+ edit=edit,
2917+ room=room,
2918+ dates=dates,
2919+ rooms=rooms
2920+ )
2921 return schedule
2922
2923 def test_calculate_unscheduled_does_nothing_when_read_only(self):
2924@@ -1487,25 +2332,40 @@
2925
2926 def test_calculate_unscheduled_includes_unscheduled(self):
2927 schedule = self.get_schedule(edit=True)
2928- meeting = factory.make_one(Meeting, summit=schedule.summit, private=False, approved='APPROVED')
2929+ meeting = factory.make_one(
2930+ Meeting,
2931+ summit=schedule.summit,
2932+ private=False,
2933+ approved='APPROVED'
2934+ )
2935 schedule.calculate_unscheduled()
2936 self.assertEqual([meeting], schedule.unscheduled)
2937
2938 def test_calculate_unscheduled_ignores_scheduled_meetings(self):
2939 schedule = self.get_schedule(edit=True)
2940- meeting = factory.make_one(Meeting, summit=schedule.summit, private=False)
2941+ meeting = factory.make_one(
2942+ Meeting,
2943+ summit=schedule.summit,
2944+ private=False
2945+ )
2946 room = factory.make_one(Room, summit=schedule.summit)
2947 slot = factory.make_one(Slot, summit=schedule.summit)
2948 meeting.agenda_set.create(room=room, slot=slot)
2949 schedule.calculate_unscheduled()
2950 self.assertEqual([], schedule.unscheduled)
2951
2952- def test_calculate_unscheduled_ignores_meetings_in_tracks_not_in_this_room(self):
2953+ def test_calculate_unscheduled_ignores_meetings_in_tracks_not_in_this_room(
2954+ self
2955+ ):
2956 summit = factory.make_one(Summit)
2957 room = factory.make_one(Room, summit=summit, type='open')
2958 schedule = self.get_schedule(edit=True, room=room, summit=summit)
2959- meeting = factory.make_one(Meeting, summit=schedule.summit,
2960- type='blueprint', private=False)
2961+ meeting = factory.make_one(
2962+ Meeting,
2963+ summit=schedule.summit,
2964+ type='blueprint',
2965+ private=False
2966+ )
2967 track = factory.make_one(Track, summit=summit)
2968 other_track = factory.make_one(Track, summit=summit)
2969 room.tracks = [track]
2970@@ -1517,8 +2377,13 @@
2971 summit = factory.make_one(Summit)
2972 room = factory.make_one(Room, summit=summit, type='open')
2973 schedule = self.get_schedule(edit=True, room=room, summit=summit)
2974- meeting = factory.make_one(Meeting, summit=schedule.summit,
2975- type='blueprint', private=False, approved='APPROVED')
2976+ meeting = factory.make_one(
2977+ Meeting,
2978+ summit=schedule.summit,
2979+ type='blueprint',
2980+ private=False,
2981+ approved='APPROVED'
2982+ )
2983 track = factory.make_one(Track, summit=summit)
2984 room.tracks = [track]
2985 schedule.calculate_unscheduled()
2986@@ -1528,8 +2393,13 @@
2987 summit = factory.make_one(Summit)
2988 room = factory.make_one(Room, summit=summit, type='open')
2989 schedule = self.get_schedule(edit=True, room=room, summit=summit)
2990- meeting = factory.make_one(Meeting, summit=schedule.summit,
2991- type='blueprint', private=False, approved='APPROVED')
2992+ meeting = factory.make_one(
2993+ Meeting,
2994+ summit=schedule.summit,
2995+ type='blueprint',
2996+ private=False,
2997+ approved='APPROVED'
2998+ )
2999 track = factory.make_one(Track, summit=summit)
3000 meeting.tracks = [track]
3001 schedule.calculate_unscheduled()
3002@@ -1539,8 +2409,13 @@
3003 summit = factory.make_one(Summit)
3004 room = factory.make_one(Room, summit=summit, type='open')
3005 schedule = self.get_schedule(edit=True, room=room, summit=summit)
3006- meeting = factory.make_one(Meeting, summit=schedule.summit,
3007- type='blueprint', private=False, approved='APPROVED')
3008+ meeting = factory.make_one(
3009+ Meeting,
3010+ summit=schedule.summit,
3011+ type='blueprint',
3012+ private=False,
3013+ approved='APPROVED'
3014+ )
3015 track = factory.make_one(Track, summit=summit)
3016 meeting.tracks = [track]
3017 room.tracks = [track]
3018@@ -1551,8 +2426,13 @@
3019 summit = factory.make_one(Summit)
3020 room = factory.make_one(Room, summit=summit, type='open')
3021 schedule = self.get_schedule(edit=True, room=room, summit=summit)
3022- meeting = factory.make_one(Meeting, summit=schedule.summit,
3023- type='blueprint', private=False, approved='APPROVED')
3024+ meeting = factory.make_one(
3025+ Meeting,
3026+ summit=schedule.summit,
3027+ type='blueprint',
3028+ private=False,
3029+ approved='APPROVED'
3030+ )
3031 track = factory.make_one(Track, summit=summit)
3032 other_track = factory.make_one(Track, summit=summit)
3033 meeting.tracks = [track, other_track]
3034@@ -1564,8 +2444,12 @@
3035 summit = factory.make_one(Summit)
3036 room = factory.make_one(Room, summit=summit, type='open')
3037 schedule = self.get_schedule(edit=True, room=room, summit=summit)
3038- meeting = factory.make_one(Meeting, summit=schedule.summit,
3039- type='plenary', private=False)
3040+ meeting = factory.make_one(
3041+ Meeting,
3042+ summit=schedule.summit,
3043+ type='plenary',
3044+ private=False
3045+ )
3046 schedule.calculate_unscheduled()
3047 self.assertEqual([], schedule.unscheduled)
3048
3049@@ -1573,8 +2457,12 @@
3050 summit = factory.make_one(Summit)
3051 room = factory.make_one(Room, summit=summit, type='open')
3052 schedule = self.get_schedule(edit=True, room=room, summit=summit)
3053- meeting = factory.make_one(Meeting, summit=schedule.summit,
3054- type='talk', private=False)
3055+ meeting = factory.make_one(
3056+ Meeting,
3057+ summit=schedule.summit,
3058+ type='talk',
3059+ private=False
3060+ )
3061 schedule.calculate_unscheduled()
3062 self.assertEqual([], schedule.unscheduled)
3063
3064@@ -1582,8 +2470,12 @@
3065 summit = factory.make_one(Summit)
3066 room = factory.make_one(Room, summit=summit, type='open')
3067 schedule = self.get_schedule(edit=True, room=room, summit=summit)
3068- meeting = factory.make_one(Meeting, summit=schedule.summit,
3069- type='special', private=False)
3070+ meeting = factory.make_one(
3071+ Meeting,
3072+ summit=schedule.summit,
3073+ type='special',
3074+ private=False
3075+ )
3076 schedule.calculate_unscheduled()
3077 self.assertEqual([], schedule.unscheduled)
3078
3079@@ -1591,8 +2483,13 @@
3080 summit = factory.make_one(Summit)
3081 room = factory.make_one(Room, summit=summit, type='plenary')
3082 schedule = self.get_schedule(edit=True, room=room, summit=summit)
3083- meeting = factory.make_one(Meeting, summit=schedule.summit,
3084- type='plenary', private=False, approved='APPROVED')
3085+ meeting = factory.make_one(
3086+ Meeting,
3087+ summit=schedule.summit,
3088+ type='plenary',
3089+ private=False,
3090+ approved='APPROVED'
3091+ )
3092 schedule.calculate_unscheduled()
3093 self.assertEqual([meeting], schedule.unscheduled)
3094
3095@@ -1600,8 +2497,12 @@
3096 summit = factory.make_one(Summit)
3097 room = factory.make_one(Room, summit=summit, type='plenary')
3098 schedule = self.get_schedule(edit=True, room=room, summit=summit)
3099- meeting = factory.make_one(Meeting, summit=schedule.summit,
3100- type='blueprint', private=False)
3101+ meeting = factory.make_one(
3102+ Meeting,
3103+ summit=schedule.summit,
3104+ type='blueprint',
3105+ private=False
3106+ )
3107 schedule.calculate_unscheduled()
3108 self.assertEqual([], schedule.unscheduled)
3109
3110@@ -1609,16 +2510,38 @@
3111 now = datetime.datetime.utcnow()
3112 one_hour = datetime.timedelta(hours=1)
3113 summit = factory.make_one(
3114- Summit, date_start=now.date(), date_end=now.date(),
3115- timezone='UTC')
3116+ Summit,
3117+ date_start=now.date(),
3118+ date_end=now.date(),
3119+ timezone='UTC'
3120+ )
3121 slot = factory.make_one(
3122- Slot, summit=summit, type='plenary',
3123- start_utc=now-(2*one_hour), end_utc=now-(1*one_hour))
3124- room1 = factory.make_one(Room, summit=summit, type='plenary', start_utc=now-(2*one_hour), end_utc=now-(1*one_hour))
3125- room2 = factory.make_one(Room, summit=summit, type='plenary', start_utc=now-(2*one_hour), end_utc=now-(1*one_hour))
3126+ Slot,
3127+ summit=summit,
3128+ type='plenary',
3129+ start_utc=now-(2*one_hour),
3130+ end_utc=now-(1*one_hour)
3131+ )
3132+ room1 = factory.make_one(
3133+ Room,
3134+ summit=summit,
3135+ type='plenary',
3136+ start_utc=now-(2*one_hour),
3137+ end_utc=now-(1*one_hour)
3138+ )
3139+ room2 = factory.make_one(
3140+ Room,
3141+ summit=summit,
3142+ type='plenary',
3143+ start_utc=now-(2*one_hour),
3144+ end_utc=now-(1*one_hour)
3145+ )
3146 schedule = self.get_schedule(
3147- edit=True, rooms=[room1, room2], summit=summit,
3148- dates=[now.date()])
3149+ edit=True,
3150+ rooms=[room1, room2],
3151+ summit=summit,
3152+ dates=[now.date()]
3153+ )
3154 schedule.calculate()
3155 # To avoid test being fragile and arbitrarily dependent on the
3156 # room order, we check the returned schedule.meetings bit-by-bit.
3157@@ -1656,8 +2579,13 @@
3158 summit = factory.make_one(Summit)
3159 now = datetime.datetime.utcnow()
3160 one_hour = datetime.timedelta(hours=1)
3161- return factory.make_one(Slot, summit=summit, start=now+one_hour,
3162- end=now+one_hour+one_hour, type='open')
3163+ return factory.make_one(
3164+ Slot,
3165+ summit=summit,
3166+ start=now+one_hour,
3167+ end=now+one_hour+one_hour,
3168+ type='open'
3169+ )
3170
3171 def test_update_meeting_skips_no_name(self):
3172 summit = factory.make_one(Summit)
3173@@ -1673,7 +2601,12 @@
3174 # Names are truncated at 100 chars.
3175 expected_name = "very " * 20
3176 self.assertEqual(expected_name, meeting.name)
3177- self.assertEqual(1, summit.meeting_set.filter(name__exact=expected_name).count())
3178+ self.assertEqual(
3179+ 1,
3180+ summit.meeting_set.filter(
3181+ name__exact=expected_name
3182+ ).count()
3183+ )
3184
3185 def test_update_meeting_accepts_existing_meeting(self):
3186 summit = factory.make_one(Summit)
3187@@ -1683,7 +2616,13 @@
3188 summit.meeting_set.create(name=name, title=title)
3189 meeting = summit.update_meeting_from_launchpad(elem)
3190 self.assertEqual(name, meeting.name)
3191- self.assertEqual(1, summit.meeting_set.filter(name__exact=name, title__exact=title).count())
3192+ self.assertEqual(
3193+ 1,
3194+ summit.meeting_set.filter(
3195+ name__exact=name,
3196+ title__exact=title
3197+ ).count()
3198+ )
3199
3200 def test_update_from_launchpad_response_empty(self):
3201 summit = factory.make_one(Summit)
3202@@ -1705,7 +2644,8 @@
3203 summit = factory.make_one(Summit, name='test-sprint')
3204 self.assertEqual(
3205 ['https://launchpad.net/sprints/test-sprint/+temp-meeting-export'],
3206- summit.launchpad_sprint_import_urls())
3207+ summit.launchpad_sprint_import_urls()
3208+ )
3209
3210 def test_launchpad_sprint_import_url_uses_one_summit_sprint(self):
3211 import_url = 'http://example.com/test'
3212@@ -1719,7 +2659,14 @@
3213 summit = factory.make_one(Summit)
3214 factory.make_one(SummitSprint, summit=summit, import_url=import_url1)
3215 factory.make_one(SummitSprint, summit=summit, import_url=import_url2)
3216- self.assertEqual(sorted([import_url1, import_url2]), sorted(summit.launchpad_sprint_import_urls()))
3217+ self.assertEqual(
3218+ sorted(
3219+ [import_url1, import_url2]
3220+ ),
3221+ sorted(
3222+ summit.launchpad_sprint_import_urls()
3223+ )
3224+ )
3225
3226 def test_update_from_launchpad_gets_info_for_all_import_urls(self):
3227 import_url1 = 'http://example.com/test1'
3228@@ -1728,57 +2675,105 @@
3229 factory.make_one(SummitSprint, summit=summit, import_url=import_url1)
3230 factory.make_one(SummitSprint, summit=summit, import_url=import_url2)
3231 called_urls = []
3232+
3233 def get_sprint_info(url):
3234 called_urls.append(url)
3235 return self.get_basic_launchpad_response()
3236+
3237 summit._get_sprint_info_from_launchpad = get_sprint_info
3238 summit.update_from_launchpad()
3239- self.assertEqual(sorted([import_url1, import_url2]), sorted(called_urls))
3240+ self.assertEqual(
3241+ sorted(
3242+ [import_url1, import_url2]
3243+ ),
3244+ sorted(called_urls)
3245+ )
3246
3247 def test_update_from_launchpad_does_the_update(self):
3248 summit = factory.make_one(Summit)
3249+
3250 def get_sprint_info(url):
3251 elem = self.get_basic_launchpad_response()
3252 meeting_node = LaunchpadExportNode(name="foo", id="42")
3253 elem.find("unscheduled").add_child("meeting", meeting_node)
3254 return elem
3255+
3256 summit._get_sprint_info_from_launchpad = get_sprint_info
3257 summit.update_from_launchpad()
3258 self.assertEqual(1, summit.meeting_set.all().count())
3259
3260 def test_update_from_launchpad_does_renames(self):
3261 summit = factory.make_one(Summit)
3262- meeting = summit.meeting_set.create(name="name", launchpad_blueprint_id="42")
3263+ meeting = summit.meeting_set.create(
3264+ name="name",
3265+ launchpad_blueprint_id="42"
3266+ )
3267+
3268 def get_sprint_info(url):
3269 elem = self.get_basic_launchpad_response()
3270 meeting_node = LaunchpadExportNode(name="other", id="42")
3271 elem.find("unscheduled").add_child("meeting", meeting_node)
3272 return elem
3273+
3274 summit._get_sprint_info_from_launchpad = get_sprint_info
3275 summit.update_from_launchpad()
3276- # Since both had blueprint id 42, it should just update the existing meeting
3277- self.assertEqual(0, summit.meeting_set.filter(name__exact="name").count())
3278- self.assertEqual(1, summit.meeting_set.filter(name__exact="other").count())
3279+ # Since both had blueprint id 42, it should just update
3280+ # the existing meeting
3281+ self.assertEqual(
3282+ 0,
3283+ summit.meeting_set.filter(
3284+ name__exact="name"
3285+ ).count()
3286+ )
3287+ self.assertEqual(
3288+ 1,
3289+ summit.meeting_set.filter(
3290+ name__exact="other"
3291+ ).count()
3292+ )
3293
3294 def test_update_from_launchpad_deletes_missing_unscheduled_meetings(self):
3295 summit = factory.make_one(Summit)
3296- meeting = summit.meeting_set.create(spec_url='test_url', name="name", launchpad_blueprint_id="42")
3297+ meeting = summit.meeting_set.create(
3298+ spec_url='test_url',
3299+ name="name",
3300+ launchpad_blueprint_id="42"
3301+ )
3302+
3303 def get_sprint_info(url):
3304 elem = self.get_basic_launchpad_response()
3305 meeting_node = LaunchpadExportNode(name="other")
3306 elem.find("unscheduled").add_child("meeting", meeting_node)
3307 return elem
3308+
3309 summit._get_sprint_info_from_launchpad = get_sprint_info
3310 summit.update_from_launchpad()
3311- self.assertEqual(1, summit.meeting_set.filter(name__exact="name").count())
3312- self.assertEqual(0, summit.meeting_set.filter(name__exact="name").exclude(approved='REMOVED').count())
3313+ self.assertEqual(
3314+ 1,
3315+ summit.meeting_set.filter(
3316+ name__exact="name"
3317+ ).count()
3318+ )
3319+ self.assertEqual(
3320+ 0,
3321+ summit.meeting_set.filter(
3322+ name__exact="name"
3323+ ).exclude(
3324+ approved='REMOVED'
3325+ ).count()
3326+ )
3327
3328 def test_update_from_launchpad_deletes_missing_scheduled_meetings(self):
3329 summit = factory.make_one(Summit)
3330- meeting = summit.meeting_set.create(spec_url='test_url', name="name", launchpad_blueprint_id="42")
3331+ meeting = summit.meeting_set.create(
3332+ spec_url='test_url',
3333+ name="name",
3334+ launchpad_blueprint_id="42"
3335+ )
3336 room = factory.make_one(Room, summit=summit)
3337 slot = factory.make_one(Slot)
3338 agenda = meeting.agenda_set.create(room=room, slot=slot, auto=True)
3339+
3340 def get_sprint_info(url):
3341 elem = self.get_basic_launchpad_response()
3342 meeting_node = LaunchpadExportNode(name="other")
3343@@ -1786,12 +2781,29 @@
3344 return elem
3345 summit._get_sprint_info_from_launchpad = get_sprint_info
3346 summit.update_from_launchpad()
3347- self.assertEqual(1, summit.meeting_set.filter(name__exact="name").count())
3348- self.assertEqual(0, summit.meeting_set.filter(name__exact="name").exclude(approved='REMOVED').count())
3349+ self.assertEqual(
3350+ 1,
3351+ summit.meeting_set.filter(
3352+ name__exact="name"
3353+ ).count()
3354+ )
3355+ self.assertEqual(
3356+ 0,
3357+ summit.meeting_set.filter(
3358+ name__exact="name"
3359+ ).exclude(
3360+ approved='REMOVED'
3361+ ).count()
3362+ )
3363
3364 def test_update_from_launchpad_doesnt_delete_meetings_with_spec_url(self):
3365 summit = factory.make_one(Summit)
3366- meeting = summit.meeting_set.create(spec_url='http://example.com/foo', name="name", launchpad_blueprint_id="42")
3367+ meeting = summit.meeting_set.create(
3368+ spec_url='http://example.com/foo',
3369+ name="name",
3370+ launchpad_blueprint_id="42"
3371+ )
3372+
3373 def get_sprint_info(url):
3374 elem = self.get_basic_launchpad_response()
3375 meeting_node = LaunchpadExportNode(name="other", id="43")
3376@@ -1799,25 +2811,43 @@
3377 return elem
3378 summit._get_sprint_info_from_launchpad = get_sprint_info
3379 summit.update_from_launchpad()
3380- self.assertEqual(1, summit.meeting_set.filter(name__exact="name").count())
3381+ self.assertEqual(
3382+ 1,
3383+ summit.meeting_set.filter(
3384+ name__exact="name"
3385+ ).count()
3386+ )
3387
3388- def test_update_from_launchpad_doesnt_delete_meetings_with_no_spec_url(self):
3389+ def test_update_from_launchpad_wont_delete_meetings_without_spec_url(self):
3390 summit = factory.make_one(Summit)
3391- meeting = summit.meeting_set.create(spec_url='', name="name", launchpad_blueprint_id="42")
3392+ meeting = summit.meeting_set.create(
3393+ spec_url='',
3394+ name="name",
3395+ launchpad_blueprint_id="42"
3396+ )
3397+
3398 def get_sprint_info(url):
3399 elem = self.get_basic_launchpad_response()
3400 meeting_node = LaunchpadExportNode(name="other", id="43")
3401 elem.find("unscheduled").add_child("meeting", meeting_node)
3402 return elem
3403+
3404 summit._get_sprint_info_from_launchpad = get_sprint_info
3405 summit.update_from_launchpad()
3406- self.assertEqual(1, summit.meeting_set.filter(name__exact="name").count())
3407+ self.assertEqual(
3408+ 1,
3409+ summit.meeting_set.filter(
3410+ name__exact="name"
3411+ ).count()
3412+ )
3413
3414 def test_update_from_launchpad_updates_last_update(self):
3415 old_now = datetime.datetime.utcnow() - datetime.timedelta(days=1)
3416 summit = factory.make_one(Summit, last_update=old_now)
3417+
3418 def get_sprint_info(url):
3419 return self.get_basic_launchpad_response()
3420+
3421 summit._get_sprint_info_from_launchpad = get_sprint_info
3422 summit.update_from_launchpad()
3423 self.assertTrue(old_now < summit.last_update)
3424@@ -1828,72 +2858,150 @@
3425
3426 def test_reschedule_removes_missing_participants(self):
3427 summit = factory.make_one(Summit)
3428- meeting1 = factory.make_one(Meeting, summit=summit,
3429- requires_dial_in=False, private=False)
3430- meeting2 = factory.make_one(Meeting, summit=summit,
3431- requires_dial_in=False, private=False)
3432+ meeting1 = factory.make_one(
3433+ Meeting,
3434+ summit=summit,
3435+ requires_dial_in=False,
3436+ private=False
3437+ )
3438+ meeting2 = factory.make_one(
3439+ Meeting,
3440+ summit=summit,
3441+ requires_dial_in=False,
3442+ private=False
3443+ )
3444 room1 = factory.make_one(Room, summit=summit)
3445 room2 = factory.make_one(Room, summit=summit)
3446 slot = self.make_one_future_slot(summit=summit)
3447- attendee = factory.make_one(Attendee, summit=summit,
3448- start_utc=slot.start_utc, end_utc=slot.end_utc)
3449- meeting1.participant_set.create(attendee=attendee, participation = 'REQUIRED')
3450- meeting2.participant_set.create(attendee=attendee, participation = 'REQUIRED')
3451- factory.make_one(Agenda, meeting=meeting1, room=room1, slot=slot,
3452- auto=True)
3453- factory.make_one(Agenda, meeting=meeting2, room=room2, slot=slot,
3454- auto=True)
3455+ attendee = factory.make_one(
3456+ Attendee,
3457+ summit=summit,
3458+ start_utc=slot.start_utc,
3459+ end_utc=slot.end_utc
3460+ )
3461+ meeting1.participant_set.create(
3462+ attendee=attendee,
3463+ participation='REQUIRED'
3464+ )
3465+ meeting2.participant_set.create(
3466+ attendee=attendee,
3467+ participation='REQUIRED'
3468+ )
3469+ factory.make_one(
3470+ Agenda,
3471+ meeting=meeting1,
3472+ room=room1,
3473+ slot=slot,
3474+ auto=True
3475+ )
3476+ factory.make_one(
3477+ Agenda,
3478+ meeting=meeting2,
3479+ room=room2,
3480+ slot=slot,
3481+ auto=True
3482+ )
3483 summit.reschedule()
3484 self.assertEqual(1, slot.agenda_set.all().count())
3485
3486 def test_reschedule_removes_unavailable_participants(self):
3487 summit = factory.make_one(Summit)
3488- meeting = factory.make_one(Meeting, summit=summit,
3489- requires_dial_in=False, private=False)
3490+ meeting = factory.make_one(
3491+ Meeting,
3492+ summit=summit,
3493+ requires_dial_in=False,
3494+ private=False
3495+ )
3496 room = factory.make_one(Room, summit=summit)
3497 slot = self.make_one_future_slot(summit=summit)
3498- attendee = factory.make_one(Attendee, summit=summit,
3499- start_utc=slot.end_utc,
3500- end_utc=slot.end_utc+datetime.timedelta(hours=1))
3501- meeting.participant_set.create(attendee=attendee, participation = 'REQUIRED')
3502- factory.make_one(Agenda, meeting=meeting, room=room, slot=slot,
3503- auto=True)
3504+ attendee = factory.make_one(
3505+ Attendee,
3506+ summit=summit,
3507+ start_utc=slot.end_utc,
3508+ end_utc=slot.end_utc+datetime.timedelta(hours=1)
3509+ )
3510+ meeting.participant_set.create(
3511+ attendee=attendee,
3512+ participation='REQUIRED'
3513+ )
3514+ factory.make_one(
3515+ Agenda,
3516+ meeting=meeting,
3517+ room=room,
3518+ slot=slot,
3519+ auto=True
3520+ )
3521 summit.reschedule()
3522 self.assertEqual(0, slot.agenda_set.all().count())
3523
3524 def test_reschedule_removes_insufficient_slots(self):
3525 summit = factory.make_one(Summit)
3526- meeting = factory.make_one(Meeting, summit=summit, slots=2,
3527- requires_dial_in=False, private=False)
3528+ meeting = factory.make_one(
3529+ Meeting,
3530+ summit=summit,
3531+ slots=2,
3532+ requires_dial_in=False,
3533+ private=False
3534+ )
3535 room = factory.make_one(Room, summit=summit)
3536 slot = self.make_one_future_slot(summit=summit)
3537- factory.make_one(Agenda, meeting=meeting, room=room, slot=slot,
3538- auto=True)
3539+ factory.make_one(
3540+ Agenda,
3541+ meeting=meeting,
3542+ room=room,
3543+ slot=slot,
3544+ auto=True
3545+ )
3546 summit.reschedule()
3547 self.assertEqual(0, slot.agenda_set.all().count())
3548
3549 def test_reschedule_leaves_old_slots(self):
3550 summit = factory.make_one(Summit)
3551- meeting = factory.make_one(Meeting, summit=summit, slots=2,
3552- requires_dial_in=False, private=False)
3553+ meeting = factory.make_one(
3554+ Meeting,
3555+ summit=summit,
3556+ slots=2,
3557+ requires_dial_in=False,
3558+ private=False
3559+ )
3560 room = factory.make_one(Room, summit=summit)
3561 now = datetime.datetime.utcnow()
3562 one_hour = datetime.timedelta(hours=1)
3563- slot = factory.make_one(Slot, summit=summit, start=now-one_hour,
3564- end=now, type='open')
3565- factory.make_one(Agenda, meeting=meeting, room=room, slot=slot,
3566- auto=True)
3567+ slot = factory.make_one(
3568+ Slot,
3569+ summit=summit,
3570+ start=now-one_hour,
3571+ end=now,
3572+ type='open'
3573+ )
3574+ factory.make_one(
3575+ Agenda,
3576+ meeting=meeting,
3577+ room=room,
3578+ slot=slot,
3579+ auto=True
3580+ )
3581 summit.reschedule()
3582 self.assertEqual(1, slot.agenda_set.all().count())
3583
3584 def test_reschedule_leaves_manually_scheduled(self):
3585 summit = factory.make_one(Summit)
3586- meeting = factory.make_one(Meeting, summit=summit, slots=2,
3587- requires_dial_in=False, private=False)
3588+ meeting = factory.make_one(
3589+ Meeting,
3590+ summit=summit,
3591+ slots=2,
3592+ requires_dial_in=False,
3593+ private=False
3594+ )
3595 room = factory.make_one(Room, summit=summit)
3596 slot = self.make_one_future_slot(summit=summit)
3597- factory.make_one(Agenda, meeting=meeting, room=room, slot=slot,
3598- auto=False)
3599+ factory.make_one(
3600+ Agenda,
3601+ meeting=meeting,
3602+ room=room,
3603+ slot=slot,
3604+ auto=False
3605+ )
3606 summit.reschedule()
3607 self.assertEqual(1, slot.agenda_set.all().count())
3608
3609@@ -1909,40 +3017,66 @@
3610 attendee_node = LaunchpadExportNode(name='testuser')
3611 summit.update_attendee_from_launchpad(attendee_node)
3612
3613- self.assertEqual(1, summit.attendee_set.filter(user__username__exact="testuser").count())
3614+ self.assertEqual(
3615+ 1,
3616+ summit.attendee_set.filter(
3617+ user__username__exact="testuser"
3618+ ).count()
3619+ )
3620 self.assertTrue(mock_set_openid.called)
3621
3622+
3623 class DeleteMeetingTestCase(djangotest.TestCase):
3624 """
3625 This will test different options for deleting a meeting from
3626 the front end UI.
3627 """
3628-
3629+
3630 def setUp(self):
3631 now = datetime.datetime.utcnow()
3632 one_hour = datetime.timedelta(0, 3600)
3633- self.summit = factory.make_one(Summit, name='uds-test', date_start=now, date_end=now+one_hour)
3634+ self.summit = factory.make_one(
3635+ Summit,
3636+ name='uds-test',
3637+ date_start=now,
3638+ date_end=now+one_hour
3639+ )
3640 self.summit.save()
3641 slot = factory.make_one(
3642 Slot,
3643 summit=self.summit,
3644 start_utc=now,
3645- end_utc=now+one_hour)
3646+ end_utc=now+one_hour
3647+ )
3648 room = factory.make_one(Room)
3649-
3650- self.meeting = factory.make_one(Meeting, summit=self.summit, requires_dial_in=False, private=False)
3651-
3652+
3653+ self.meeting = factory.make_one(
3654+ Meeting,
3655+ summit=self.summit,
3656+ requires_dial_in=False,
3657+ private=False
3658+ )
3659+
3660 attendee1 = factory.make_one(Attendee)
3661 factory.make_one(Participant, meeting=self.meeting, attendee=attendee1)
3662-
3663+
3664 factory.make_one(Agenda, meeting=self.meeting, slot=slot, room=room)
3665-
3666- self.user = factory.make_one(User, username='testuser', is_active=True, is_superuser=False)
3667+
3668+ self.user = factory.make_one(
3669+ User,
3670+ username='testuser',
3671+ is_active=True,
3672+ is_superuser=False
3673+ )
3674 self.user.set_password('password')
3675 self.user.save()
3676-
3677- self.attendee = factory.make_one(Attendee, user=self.user, summit=self.summit)
3678-
3679+
3680+ self.attendee = factory.make_one(
3681+ Attendee,
3682+ user=self.user,
3683+ summit=self.summit
3684+ )
3685+
3686 def tearDown(self):
3687 self.client.logout()
3688 self.user.user_permissions.all().delete()
3689@@ -1950,39 +3084,109 @@
3690 def login(self):
3691 logged_in = self.client.login(username='testuser', password='password')
3692 self.assertTrue(logged_in)
3693-
3694+
3695 def test_track_lead_cant_delete_meeting(self):
3696- self.lead = factory.make_one(Lead, lead=self.attendee, summit=self.summit)
3697+ self.lead = factory.make_one(
3698+ Lead,
3699+ lead=self.attendee,
3700+ summit=self.summit
3701+ )
3702 self.login()
3703- response = self.client.get(reverse('summit.schedule.views.delete_meeting', args=(self.summit, self.meeting.id, self.meeting.name)))
3704- self.assertRedirects(response, reverse('summit.schedule.views.summit', args=(self.summit.name,)), status_code=302, target_status_code=200)
3705+ response = self.client.get(
3706+ reverse(
3707+ 'summit.schedule.views.delete_meeting',
3708+ args=(self.summit, self.meeting.id, self.meeting.name)
3709+ )
3710+ )
3711+ self.assertRedirects(
3712+ response,
3713+ reverse(
3714+ 'summit.schedule.views.summit',
3715+ args=(self.summit.name,)
3716+ ),
3717+ status_code=302,
3718+ target_status_code=200
3719+ )
3720
3721 def test_user_cant_delete_meeting(self):
3722 self.login()
3723- response = self.client.get(reverse('summit.schedule.views.delete_meeting', args=(self.summit, self.meeting.id, self.meeting.name)))
3724- self.assertRedirects(response, reverse('summit.schedule.views.summit', args=(self.summit.name,)), status_code=302, target_status_code=200)
3725+ response = self.client.get(
3726+ reverse(
3727+ 'summit.schedule.views.delete_meeting',
3728+ args=(self.summit, self.meeting.id, self.meeting.name)
3729+ )
3730+ )
3731+ self.assertRedirects(
3732+ response,
3733+ reverse(
3734+ 'summit.schedule.views.summit',
3735+ args=(self.summit.name,)
3736+ ),
3737+ status_code=302,
3738+ target_status_code=200
3739+ )
3740
3741 def test_managers_cant_delete_meeting(self):
3742 self.summit.managers.add(self.user)
3743 self.login()
3744- response = self.client.get(reverse('summit.schedule.views.delete_meeting', args=(self.summit, self.meeting.id, self.meeting.name)))
3745- self.assertRedirects(response, reverse('summit.schedule.views.summit', args=(self.summit.name,)), status_code=302, target_status_code=200)
3746+ response = self.client.get(
3747+ reverse(
3748+ 'summit.schedule.views.delete_meeting',
3749+ args=(self.summit, self.meeting.id, self.meeting.name)
3750+ )
3751+ )
3752+ self.assertRedirects(
3753+ response,
3754+ reverse(
3755+ 'summit.schedule.views.summit',
3756+ args=(self.summit.name,)
3757+ ),
3758+ status_code=302,
3759+ target_status_code=200
3760+ )
3761
3762 def test_schedulers_can_delete_meeting(self):
3763 self.summit.schedulers.add(self.user)
3764 self.login()
3765- response = self.client.get(reverse('summit.schedule.views.delete_meeting', args=(self.summit, self.meeting.id, self.meeting.name)))
3766- self.assertRedirects(response, reverse('summit.schedule.views.delete_confirmed', args=(self.summit.name,)), status_code=302, target_status_code=200)
3767+ response = self.client.get(
3768+ reverse(
3769+ 'summit.schedule.views.delete_meeting',
3770+ args=(self.summit, self.meeting.id, self.meeting.name)
3771+ )
3772+ )
3773+ self.assertRedirects(
3774+ response,
3775+ reverse(
3776+ 'summit.schedule.views.delete_confirmed',
3777+ args=(self.summit.name,)
3778+ ),
3779+ status_code=302,
3780+ target_status_code=200
3781+ )
3782
3783 def test_change_agenda_can_delete_meeting(self):
3784 """
3785- Testing if a user who is assigned can_change_agenda in django admin can delete a meeting
3786+ Testing if a user who is assigned can_change_agenda
3787+ in django admin can delete a meeting
3788 """
3789 change_agenda = Permission.objects.get(codename='change_agenda')
3790 self.user.user_permissions.add(change_agenda)
3791 self.login()
3792- response = self.client.get(reverse('summit.schedule.views.delete_meeting', args=(self.summit, self.meeting.id, self.meeting.name)))
3793- self.assertRedirects(response, reverse('summit.schedule.views.delete_confirmed', args=(self.summit.name,)), status_code=302, target_status_code=200)
3794+ response = self.client.get(
3795+ reverse(
3796+ 'summit.schedule.views.delete_meeting',
3797+ args=(self.summit, self.meeting.id, self.meeting.name)
3798+ )
3799+ )
3800+ self.assertRedirects(
3801+ response,
3802+ reverse(
3803+ 'summit.schedule.views.delete_confirmed',
3804+ args=(self.summit.name,)
3805+ ),
3806+ status_code=302,
3807+ target_status_code=200
3808+ )
3809
3810
3811 class MeetingSearchTestCase(djangotest.TestCase):
3812@@ -1990,79 +3194,182 @@
3813 This will test different options for deleting a meeting from
3814 the front end UI.
3815 """
3816-
3817+
3818 form_html = '<form id="site_search_form"'
3819-
3820+
3821 def setUp(self):
3822 now = datetime.datetime.utcnow()
3823 one_hour = datetime.timedelta(0, 3600)
3824- self.summit = factory.make_one(Summit, name='uds-test', date_start=now, date_end=now+one_hour)
3825+ self.summit = factory.make_one(
3826+ Summit,
3827+ name='uds-test',
3828+ date_start=now,
3829+ date_end=now+one_hour
3830+ )
3831 self.slot = factory.make_one(
3832 Slot,
3833 summit=self.summit,
3834 start_utc=now,
3835- end_utc=now+one_hour)
3836+ end_utc=now+one_hour
3837+ )
3838 self.room = factory.make_one(Room)
3839-
3840+
3841+ def tearDown(self):
3842+ pass
3843+
3844 def test_searchform_exists_on_summit_view(self):
3845 ''' Search form should appear on the summit view page '''
3846- response = self.client.get(reverse('summit.schedule.views.summit', args=[self.summit.name]))
3847+ response = self.client.get(
3848+ reverse(
3849+ 'summit.schedule.views.summit',
3850+ args=[self.summit.name]
3851+ )
3852+ )
3853 self.assertContains(response, self.form_html, 1)
3854-
3855+
3856 def test_searchform_exists_on_daily_view(self):
3857 ''' Search form should appear on the list view page '''
3858- response = self.client.get(reverse('summit.schedule.views.daily_schedule', args=[self.summit.name, '2012-10-10']))
3859+ response = self.client.get(
3860+ reverse(
3861+ 'summit.schedule.views.daily_schedule',
3862+ args=[self.summit.name, '2012-10-10']
3863+ )
3864+ )
3865 self.assertContains(response, self.form_html, 1)
3866-
3867+
3868 def test_searchform_exists_on_today_view(self):
3869 ''' Search form should appear on the today view page '''
3870- response = self.client.get(reverse('summit.schedule.views.today_view', args=[self.summit.name]))
3871+ response = self.client.get(
3872+ reverse(
3873+ 'summit.schedule.views.today_view',
3874+ args=[self.summit.name]
3875+ )
3876+ )
3877 self.assertContains(response, self.form_html, 1)
3878-
3879+
3880 def test_searchform_exists_on_meeting_view(self):
3881 ''' Search form should appear on the meeting view page '''
3882- meeting = factory.make_one(Meeting, summit=self.summit, requires_dial_in=False, private=False)
3883-
3884- response = self.client.get(reverse('summit.schedule.views.meeting', args=[self.summit.name, meeting.id, meeting.name]))
3885+ meeting = factory.make_one(
3886+ Meeting,
3887+ summit=self.summit,
3888+ requires_dial_in=False,
3889+ private=False
3890+ )
3891+
3892+ response = self.client.get(
3893+ reverse(
3894+ 'summit.schedule.views.meeting',
3895+ args=[self.summit.name, meeting.id, meeting.name]
3896+ )
3897+ )
3898 self.assertContains(response, self.form_html, 1)
3899-
3900+
3901 def test_searchform_not_exists_on_index(self):
3902- ''' Search form should NOT appear on the index page because there isn't a summit selected '''
3903+ '''
3904+ Search form should NOT appear on the index page because
3905+ there isn't a summit selected
3906+ '''
3907 response = self.client.get(reverse('summit.common.views.index'))
3908 self.assertContains(response, self.form_html, 0)
3909-
3910+
3911 def test_meeting_in_search_results(self):
3912- ''' Meeting should appear in search results page if the query matches the name or title '''
3913- meeting = factory.make_one(Meeting, summit=self.summit, name='test-name', title='Test Title', requires_dial_in=False, private=False)
3914+ '''
3915+ Meeting should appear in search results page if the query
3916+ matches the name or title
3917+ '''
3918+ meeting = factory.make_one(
3919+ Meeting,
3920+ summit=self.summit,
3921+ name='test-name',
3922+ title='Test Title',
3923+ requires_dial_in=False,
3924+ private=False
3925+ )
3926
3927 # Attempt to match 'name' against 'test-name' in Meeting.name
3928- response = self.client.get(reverse('summit.schedule.views.search', args=[self.summit.name]), {'q': 'name'})
3929+ response = self.client.get(
3930+ reverse(
3931+ 'summit.schedule.views.search',
3932+ args=[self.summit.name]
3933+ ),
3934+ {'q': 'name'}
3935+ )
3936 self.assertContains(response, self.form_html, 1)
3937- self.assertContains(response, '<a href="%s">Test Title</a>' % meeting.get_meeting_page_url(), 1)
3938-
3939+ self.assertContains(
3940+ response,
3941+ '<a href="%s">Test Title</a>' % meeting.get_meeting_page_url(),
3942+ 1
3943+ )
3944+
3945 # Attempt to match 'title' against 'Test Title' in Meeting.title
3946- response = self.client.get(reverse('summit.schedule.views.search', args=[self.summit.name]), {'q': 'title'})
3947+ response = self.client.get(
3948+ reverse(
3949+ 'summit.schedule.views.search',
3950+ args=[self.summit.name]
3951+ ),
3952+ {'q': 'title'}
3953+ )
3954 self.assertContains(response, self.form_html, 1)
3955- self.assertContains(response, '<a href="%s">Test Title</a>' % meeting.get_meeting_page_url(), 1)
3956-
3957+ self.assertContains(
3958+ response,
3959+ '<a href="%s">Test Title</a>' % meeting.get_meeting_page_url(),
3960+ 1
3961+ )
3962+
3963 def test_meeting_not_in_search_results(self):
3964- ''' Meetings for one summit should NOT appear when searching a different summit '''
3965+ '''
3966+ Meetings for one summit should NOT appear when searching
3967+ a different summit
3968+ '''
3969 now = datetime.datetime.utcnow()
3970 one_hour = datetime.timedelta(0, 3600)
3971-
3972+
3973 # Create a second summit
3974- other_summit = factory.make_one(Summit, name='uds-other', date_start=now, date_end=now+one_hour)
3975-
3976- meeting = factory.make_one(Meeting, summit=other_summit, name='test-name', title='Test Title', requires_dial_in=False, private=False)
3977-
3978- # Attempt to match 'test' against 'test-name' or 'Test Title', should return 0 results
3979- # because the the meeting is in other_summit, not self.summit
3980- response = self.client.get(reverse('summit.schedule.views.search', args=[self.summit.name]), {'q': 'test'})
3981- self.assertContains(response, self.form_html, 1)
3982- self.assertContains(response, '<a href="%s">Test Title</a>' % meeting.get_meeting_page_url(), 0)
3983-
3984- # Same test, but searching the correct other_summit should return 1 result
3985- response = self.client.get(reverse('summit.schedule.views.search', args=[other_summit.name]), {'q': 'test'})
3986- self.assertContains(response, self.form_html, 1)
3987- self.assertContains(response, '<a href="%s">Test Title</a>' % meeting.get_meeting_page_url(), 1)
3988-
3989+ other_summit = factory.make_one(
3990+ Summit,
3991+ name='uds-other',
3992+ date_start=now,
3993+ date_end=now+one_hour
3994+ )
3995+
3996+ meeting = factory.make_one(
3997+ Meeting,
3998+ summit=other_summit,
3999+ name='test-name',
4000+ title='Test Title',
4001+ requires_dial_in=False,
4002+ private=False
4003+ )
4004+
4005+ # Attempt to match 'test' against 'test-name' or 'Test Title'
4006+ # should return 0 results because the the meeting is in
4007+ # other_summit, not self.summit
4008+ response = self.client.get(
4009+ reverse(
4010+ 'summit.schedule.views.search',
4011+ args=[self.summit.name]
4012+ ),
4013+ {'q': 'test'}
4014+ )
4015+ self.assertContains(response, self.form_html, 1)
4016+ self.assertContains(
4017+ response,
4018+ '<a href="%s">Test Title</a>' % meeting.get_meeting_page_url(),
4019+ 0
4020+ )
4021+
4022+ # Same test, but searching the correct other_summit should return
4023+ # 1 result
4024+ response = self.client.get(
4025+ reverse(
4026+ 'summit.schedule.views.search',
4027+ args=[other_summit.name]
4028+ ),
4029+ {'q': 'test'}
4030+ )
4031+ self.assertContains(response, self.form_html, 1)
4032+ self.assertContains(
4033+ response,
4034+ '<a href="%s">Test Title</a>' % meeting.get_meeting_page_url(),
4035+ 1
4036+ )

Subscribers

People subscribed via source and target branches