Merge lp:~cjohnston/summit/define-etherpad-url into lp:summit

Proposed by Chris Johnston
Status: Merged
Approved by: Chris Johnston
Approved revision: 278
Merge reported by: Chris Johnston
Merged at revision: not available
Proposed branch: lp:~cjohnston/summit/define-etherpad-url
Merge into: lp:summit
Diff against target: 277 lines (+207/-8)
5 files modified
summit/schedule/migrations/0015_add_etherpad_url_field.py (+202/-0)
summit/schedule/models/meetingmodel.py (+3/-3)
summit/schedule/models/summitmodel.py (+1/-0)
summit/schedule/views.py (+1/-1)
summit/settings.py (+0/-4)
To merge this branch: bzr merge lp:~cjohnston/summit/define-etherpad-url
Reviewer Review Type Date Requested Status
Данило Шеган (community) Approve
Michael Hall (community) Needs Fixing
Review via email: mp+90215@code.launchpad.net
To post a comment you must log in.
274. By Chris Johnston

[r=chrisjohnston,danilo] Removes the requirement to set participants for a private meeting, adds help text.

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

We should just get rid of ETHERPAD_HOST in the settings all together, and stop checking for it. Make the field required in the Summit object.

review: Needs Fixing
275. By Chris Johnston

Version 1.0.2 release

276. By Chris Johnston

Removes ETHERPAD_HOST from settings.py

277. By Chris Johnston

Removes references to settings

Revision history for this message
Данило Шеган (danilo) wrote :

I don't think you need null=True when blank=False (you might need to recreate the migration when you change that). Migration should also set all the existing Summits.etherpad value to the pad.ubuntu.com (so it all keeps working): perhaps you can set the default value to it, and South will take care of that.

Otherwise, looks good.

review: Needs Fixing
278. By Chris Johnston

Assigns default URL

Revision history for this message
Данило Шеган (danilo) wrote :

Looks good, thanks.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added file 'summit/schedule/migrations/0015_add_etherpad_url_field.py'
2--- summit/schedule/migrations/0015_add_etherpad_url_field.py 1970-01-01 00:00:00 +0000
3+++ summit/schedule/migrations/0015_add_etherpad_url_field.py 2012-01-27 15:47:31 +0000
4@@ -0,0 +1,202 @@
5+# encoding: utf-8
6+import datetime
7+from south.db import db
8+from south.v2 import SchemaMigration
9+from django.db import models
10+
11+class Migration(SchemaMigration):
12+
13+ def forwards(self, orm):
14+
15+ # Adding field 'Summit.etherpad'
16+ db.add_column('schedule_summit', 'etherpad', self.gf('django.db.models.fields.URLField')(default='http://pad.ubuntu.com/', max_length=75), keep_default=False)
17+
18+
19+ def backwards(self, orm):
20+
21+ # Deleting field 'Summit.etherpad'
22+ db.delete_column('schedule_summit', 'etherpad')
23+
24+
25+ models = {
26+ 'auth.group': {
27+ 'Meta': {'object_name': 'Group'},
28+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
29+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
30+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
31+ },
32+ 'auth.permission': {
33+ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
34+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
35+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
36+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
37+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
38+ },
39+ 'auth.user': {
40+ 'Meta': {'object_name': 'User'},
41+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
42+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
43+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
44+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
45+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
46+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
47+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
48+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
49+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
50+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
51+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
52+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
53+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
54+ },
55+ 'contenttypes.contenttype': {
56+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
57+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
58+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
59+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
60+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
61+ },
62+ 'schedule.agenda': {
63+ 'Meta': {'ordering': "('slot', 'room')", 'unique_together': "(('slot', 'room'),)", 'object_name': 'Agenda'},
64+ 'auto': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
65+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
66+ 'meeting': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Meeting']"}),
67+ 'room': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Room']"}),
68+ 'slot': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Slot']"})
69+ },
70+ 'schedule.attendee': {
71+ 'Meta': {'ordering': "('user__username', 'summit')", 'object_name': 'Attendee'},
72+ 'crew': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_column': "'crew'"}),
73+ 'end_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'end'"}),
74+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
75+ 'secret_key_id': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
76+ 'start_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'start'"}),
77+ 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}),
78+ 'topics': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['schedule.Topic']", 'symmetrical': 'False', 'blank': 'True'}),
79+ 'tracks': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['schedule.Track']", 'symmetrical': 'False', 'blank': 'True'}),
80+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
81+ },
82+ 'schedule.attendeebusy': {
83+ 'Meta': {'ordering': "('attendee', 'start_utc', 'end_utc')", 'object_name': 'AttendeeBusy'},
84+ 'attendee': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'busy_set'", 'to': "orm['schedule.Attendee']"}),
85+ 'end_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'end'"}),
86+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
87+ 'start_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'start'"})
88+ },
89+ 'schedule.crew': {
90+ 'Meta': {'ordering': "('date_utc', 'attendee')", 'object_name': 'Crew'},
91+ 'attendee': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'crew_schedule'", 'to': "orm['schedule.Attendee']"}),
92+ 'date_utc': ('django.db.models.fields.DateField', [], {'db_column': "'date'"}),
93+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
94+ },
95+ 'schedule.lead': {
96+ 'Meta': {'ordering': "('summit', 'track')", 'object_name': 'Lead'},
97+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
98+ 'lead': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'lead'", 'to': "orm['schedule.Attendee']"}),
99+ 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}),
100+ 'track': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Track']"})
101+ },
102+ 'schedule.meeting': {
103+ 'Meta': {'object_name': 'Meeting'},
104+ 'approver': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'approver_set'", 'null': 'True', 'to': "orm['schedule.Attendee']"}),
105+ 'assignee': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'assignee_set'", 'null': 'True', 'to': "orm['schedule.Attendee']"}),
106+ 'description': ('django.db.models.fields.TextField', [], {'max_length': '2047', 'blank': 'True'}),
107+ 'drafter': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'drafter_set'", 'null': 'True', 'to': "orm['schedule.Attendee']"}),
108+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
109+ 'name': ('summit.schedule.fields.NameField', [], {'max_length': '100'}),
110+ 'pad_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
111+ 'participants': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['schedule.Attendee']", 'symmetrical': 'False', 'through': "orm['schedule.Participant']", 'blank': 'True'}),
112+ 'priority': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
113+ 'private': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
114+ 'private_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
115+ 'requires_dial_in': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
116+ 'scribe': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'scribe_set'", 'null': 'True', 'to': "orm['schedule.Attendee']"}),
117+ 'slots': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
118+ 'spec_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
119+ 'status': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}),
120+ 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}),
121+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
122+ 'topics': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['schedule.Topic']", 'symmetrical': 'False', 'blank': 'True'}),
123+ 'tracks': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['schedule.Track']", 'symmetrical': 'False', 'blank': 'True'}),
124+ 'type': ('django.db.models.fields.CharField', [], {'default': "u'blueprint'", 'max_length': '15'}),
125+ 'video': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
126+ 'wiki_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'})
127+ },
128+ 'schedule.participant': {
129+ 'Meta': {'ordering': "('meeting', 'attendee', 'required')", 'object_name': 'Participant'},
130+ 'attendee': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Attendee']"}),
131+ 'from_launchpad': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
132+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
133+ 'meeting': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Meeting']"}),
134+ 'required': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
135+ },
136+ 'schedule.room': {
137+ 'Meta': {'ordering': "('summit', 'name')", 'object_name': 'Room'},
138+ 'end_utc': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'db_column': "'end'", 'blank': 'True'}),
139+ 'has_dial_in': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
140+ 'icecast_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
141+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
142+ 'name': ('summit.schedule.fields.NameField', [], {'max_length': '50'}),
143+ 'size': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
144+ 'start_utc': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'db_column': "'start'", 'blank': 'True'}),
145+ 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}),
146+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
147+ 'tracks': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['schedule.Track']", 'symmetrical': 'False', 'blank': 'True'}),
148+ 'type': ('django.db.models.fields.CharField', [], {'default': "u'open'", 'max_length': '7'})
149+ },
150+ 'schedule.roombusy': {
151+ 'Meta': {'ordering': "('room', 'start_utc', 'end_utc')", 'object_name': 'RoomBusy'},
152+ 'end_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'end'"}),
153+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
154+ 'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'busy_set'", 'to': "orm['schedule.Room']"}),
155+ 'start_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'start'"})
156+ },
157+ 'schedule.slot': {
158+ 'Meta': {'ordering': "('summit', 'start_utc', 'end_utc')", 'object_name': 'Slot'},
159+ 'end_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'end'"}),
160+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
161+ 'start_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'start'"}),
162+ 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}),
163+ 'type': ('django.db.models.fields.CharField', [], {'default': "u'open'", 'max_length': '7'})
164+ },
165+ 'schedule.summit': {
166+ 'Meta': {'ordering': "('name',)", 'object_name': 'Summit'},
167+ 'date_end': ('django.db.models.fields.DateField', [], {'null': 'True'}),
168+ 'date_start': ('django.db.models.fields.DateField', [], {'null': 'True'}),
169+ 'description': ('django.db.models.fields.TextField', [], {'max_length': '2047', 'blank': 'True'}),
170+ 'etherpad': ('django.db.models.fields.URLField', [], {'default': "'http://pad.ubuntu.com/'", 'max_length': '75'}),
171+ 'hashtag': ('django.db.models.fields.CharField', [], {'max_length': '25', 'blank': 'True'}),
172+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
173+ 'last_update': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
174+ 'location': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
175+ 'managers': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'managers'", 'blank': 'True', 'to': "orm['auth.User']"}),
176+ 'name': ('summit.schedule.fields.NameField', [], {'max_length': '50'}),
177+ 'schedulers': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'schedulers'", 'blank': 'True', 'to': "orm['auth.User']"}),
178+ 'state': ('django.db.models.fields.CharField', [], {'default': "u'sponsor'", 'max_length': '10'}),
179+ 'timezone': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
180+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'})
181+ },
182+ 'schedule.summitsprint': {
183+ 'Meta': {'ordering': "('summit', 'import_url')", 'object_name': 'SummitSprint'},
184+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
185+ 'import_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
186+ 'summit': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'sprint_set'", 'to': "orm['schedule.Summit']"})
187+ },
188+ 'schedule.topic': {
189+ 'Meta': {'ordering': "('summit', 'title')", 'object_name': 'Topic'},
190+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
191+ 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}),
192+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'})
193+ },
194+ 'schedule.track': {
195+ 'Meta': {'ordering': "('summit', 'title', 'slug')", 'object_name': 'Track'},
196+ 'allow_adjacent_sessions': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
197+ 'color': ('django.db.models.fields.CharField', [], {'default': "'FFFFFF'", 'max_length': '6'}),
198+ 'description': ('django.db.models.fields.TextField', [], {'max_length': '1000', 'null': 'True'}),
199+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
200+ 'slug': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'}),
201+ 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}),
202+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'})
203+ }
204+ }
205+
206+ complete_apps = ['schedule']
207
208=== modified file 'summit/schedule/models/meetingmodel.py'
209--- summit/schedule/models/meetingmodel.py 2012-01-25 19:47:36 +0000
210+++ summit/schedule/models/meetingmodel.py 2012-01-27 15:47:31 +0000
211@@ -138,7 +138,7 @@
212 meeting_hash.update(str(self.pk))
213 meeting_hash.update(self.name)
214 meeting_hash.update(str(random.random()))
215- pad_host = getattr(settings, 'ETHERPAD_HOST', 'http://pad.ubuntu.com/')
216+ pad_host = self.summit.etherpad
217 self.pad_url = '%(host)s%(summit)s-%(meeting)s' % {
218 'host': pad_host,
219 'summit': self.summit.name,
220@@ -147,7 +147,7 @@
221 self.save()
222 return self.pad_url
223 else:
224- pad_host = getattr(settings, 'ETHERPAD_HOST', 'http://pad.ubuntu.com/')
225+ pad_host = self.summit.etherpad
226 name = self._etherpadise_string(self.name)
227 return '%(host)s%(summit)s-%(meeting)s' % {
228 'host': pad_host,
229@@ -160,7 +160,7 @@
230 if self.pad_url is not None and self.pad_url != '':
231 return self.pad_url
232 else:
233- pad_host = getattr(settings, 'ETHERPAD_HOST', 'pad.ubuntu.com')
234+ pad_host = self.summit.etherpad
235 name = self._etherpadise_string(self.name)
236 return '%(host)sep/pad/view/%(summit)s-%(meeting)s/latest' % {
237 'host': pad_host,
238
239=== modified file 'summit/schedule/models/summitmodel.py'
240--- summit/schedule/models/summitmodel.py 2012-01-27 02:03:43 +0000
241+++ summit/schedule/models/summitmodel.py 2012-01-27 15:47:31 +0000
242@@ -75,6 +75,7 @@
243 title = models.CharField(max_length=100)
244 location = models.CharField(max_length=100, blank=True)
245 description = models.TextField(max_length=2047, blank=True)
246+ etherpad = models.URLField(max_length=75, blank=False, default='http://pad.ubuntu.com/', help_text="Enter the URL of the etherpad server you would like to use")
247 hashtag = models.CharField(max_length=25, blank=True)
248 timezone = models.CharField(max_length=50,
249 choices=[(x, x) for x in pytz.common_timezones])
250
251=== modified file 'summit/schedule/views.py'
252--- summit/schedule/views.py 2012-01-25 18:40:27 +0000
253+++ summit/schedule/views.py 2012-01-27 15:47:31 +0000
254@@ -259,7 +259,7 @@
255 'user_is_attending': user_is_attending,
256 'user_is_participating': user_is_participating,
257 'tracks':tracks,
258- 'ETHERPAD_HOST':settings.ETHERPAD_HOST
259+ 'ETHERPAD_HOST': summit.etherpad
260 }
261 return render_to_response("schedule/meeting.html", context,
262 context_instance=RequestContext(request))
263
264=== modified file 'summit/settings.py'
265--- summit/settings.py 2012-01-23 01:18:55 +0000
266+++ summit/settings.py 2012-01-27 15:47:31 +0000
267@@ -182,10 +182,6 @@
268
269 CACHE_BACKEND = 'locmem:///'
270
271-# base URL of an etherpad server for the notes pages on meetings
272-# could include a port and prefix if required
273-ETHERPAD_HOST = 'http://pad.ubuntu.com/'
274-
275 # Manage apps from bzr branches
276 try:
277 import bzr_apps

Subscribers

People subscribed via source and target branches