Merge lp:~cjohnston/summit/633515 into lp:summit

Proposed by Chris Johnston
Status: Merged
Merged at revision: 26
Proposed branch: lp:~cjohnston/summit/633515
Merge into: lp:summit
Diff against target: 243 lines (+188/-5)
5 files modified
summit/schedule/migrations/0003_add_slug_field.py (+182/-0)
summit/schedule/models/trackmodel.py (+2/-1)
summit/schedule/templates/schedule/schedule_list.html (+1/-1)
summit/schedule/views.py (+2/-2)
summit/urls.py (+1/-1)
To merge this branch: bzr merge lp:~cjohnston/summit/633515
Reviewer Review Type Date Requested Status
Dave Walker (community) Approve
Review via email: mp+36091@code.launchpad.net

Description of the change

Creates a track slug, allowing the track title to have spaces and requiring underscores in the slug.

Will fail when displaying old UDS events due the the event not having a slug. Known bug, however in the next release, only the next UDS is being displayed, so pushing now to get functionality available in next release.

To post a comment you must log in.
Revision history for this message
Dave Walker (davewalker) wrote :

Thanks for this branch Chris, you did a cracking job!

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/0003_add_slug_field.py'
2--- summit/schedule/migrations/0003_add_slug_field.py 1970-01-01 00:00:00 +0000
3+++ summit/schedule/migrations/0003_add_slug_field.py 2010-09-21 01:42:40 +0000
4@@ -0,0 +1,182 @@
5+
6+from south.db import db
7+from django.db import models
8+from summit.schedule.models import *
9+from summit.schedule.fields import NameField
10+
11+class Migration:
12+
13+ def forwards(self, orm):
14+
15+ # Adding field 'Track.slug'
16+ db.add_column('schedule_track', 'slug', orm['schedule.track:slug'])
17+
18+ # Changing field 'Meeting.name'
19+ # (to signature: NameField(max_length=50, blank=True))
20+ db.alter_column('schedule_meeting', 'name', orm['schedule.meeting:name'])
21+
22+ # Changing field 'Summit.name'
23+ # (to signature: NameField(max_length=50))
24+ db.alter_column('schedule_summit', 'name', orm['schedule.summit:name'])
25+
26+ # Changing field 'Room.name'
27+ # (to signature: NameField(max_length=50))
28+ db.alter_column('schedule_room', 'name', orm['schedule.room:name'])
29+
30+
31+
32+ def backwards(self, orm):
33+
34+ # Deleting field 'Track.slug'
35+ db.delete_column('schedule_track', 'slug')
36+
37+ # Changing field 'Meeting.name'
38+ # (to signature: summit.schedule.fields.NameField(max_length=50, blank=True))
39+ db.alter_column('schedule_meeting', 'name', orm['schedule.meeting:name'])
40+
41+ # Changing field 'Summit.name'
42+ # (to signature: summit.schedule.fields.NameField(max_length=50))
43+ db.alter_column('schedule_summit', 'name', orm['schedule.summit:name'])
44+
45+ # Changing field 'Room.name'
46+ # (to signature: summit.schedule.fields.NameField(max_length=50))
47+ db.alter_column('schedule_room', 'name', orm['schedule.room:name'])
48+
49+
50+
51+ models = {
52+ 'auth.group': {
53+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
54+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
55+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
56+ },
57+ 'auth.permission': {
58+ 'Meta': {'unique_together': "(('content_type', 'codename'),)"},
59+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
60+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
61+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
62+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
63+ },
64+ 'auth.user': {
65+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
66+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
67+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
68+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
69+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
70+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
71+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
72+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
73+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
74+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
75+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
76+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
77+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
78+ },
79+ 'contenttypes.contenttype': {
80+ 'Meta': {'unique_together': "(('app_label', 'model'),)", 'db_table': "'django_content_type'"},
81+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
82+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
83+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
84+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
85+ },
86+ 'schedule.agenda': {
87+ 'Meta': {'unique_together': "(('slot', 'room'),)"},
88+ 'auto': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
89+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
90+ 'meeting': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Meeting']"}),
91+ 'room': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Room']"}),
92+ 'slot': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Slot']"})
93+ },
94+ 'schedule.attendee': {
95+ 'end_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'end'"}),
96+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
97+ 'start_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'start'"}),
98+ 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}),
99+ 'topics': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['schedule.Topic']", 'symmetrical': 'False', 'blank': 'True'}),
100+ 'tracks': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['schedule.Track']", 'symmetrical': 'False', 'blank': 'True'}),
101+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
102+ },
103+ 'schedule.attendeebusy': {
104+ 'attendee': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'busy_set'", 'to': "orm['schedule.Attendee']"}),
105+ 'end_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'end'"}),
106+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
107+ 'start_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'start'"})
108+ },
109+ 'schedule.meeting': {
110+ 'approver': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'approver_set'", 'null': 'True', 'to': "orm['schedule.Attendee']"}),
111+ 'assignee': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'assignee_set'", 'null': 'True', 'to': "orm['schedule.Attendee']"}),
112+ 'description': ('django.db.models.fields.TextField', [], {'max_length': '2047', 'blank': 'True'}),
113+ 'drafter': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'drafter_set'", 'null': 'True', 'to': "orm['schedule.Attendee']"}),
114+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
115+ 'name': ('NameField', [], {'max_length': '50', 'blank': 'True'}),
116+ 'participants': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['schedule.Attendee']", 'symmetrical': 'False', 'blank': 'True'}),
117+ 'priority': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
118+ 'private': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
119+ 'scribe': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'scribe_set'", 'null': 'True', 'to': "orm['schedule.Attendee']"}),
120+ 'slots': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
121+ 'spec_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
122+ 'status': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}),
123+ 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}),
124+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
125+ 'topics': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['schedule.Topic']", 'symmetrical': 'False', 'blank': 'True'}),
126+ 'tracks': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['schedule.Track']", 'symmetrical': 'False', 'blank': 'True'}),
127+ 'type': ('django.db.models.fields.CharField', [], {'default': "u'blueprint'", 'max_length': '15'}),
128+ 'wiki_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'})
129+ },
130+ 'schedule.participant': {
131+ 'attendee': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Attendee']"}),
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', 'blank': 'True'})
135+ },
136+ 'schedule.room': {
137+ 'end_utc': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'db_column': "'end'", 'blank': 'True'}),
138+ 'icecast_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
139+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
140+ 'name': ('NameField', [], {'max_length': '50'}),
141+ 'size': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
142+ 'start_utc': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'db_column': "'start'", 'blank': 'True'}),
143+ 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}),
144+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
145+ 'tracks': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['schedule.Track']", 'symmetrical': 'False', 'blank': 'True'}),
146+ 'type': ('django.db.models.fields.CharField', [], {'default': "u'open'", 'max_length': '7'})
147+ },
148+ 'schedule.roombusy': {
149+ 'end_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'end'"}),
150+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
151+ 'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'busy_set'", 'to': "orm['schedule.Room']"}),
152+ 'start_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'start'"})
153+ },
154+ 'schedule.slot': {
155+ 'end_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'end'"}),
156+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
157+ 'start_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'start'"}),
158+ 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}),
159+ 'type': ('django.db.models.fields.CharField', [], {'default': "u'open'", 'max_length': '7'})
160+ },
161+ 'schedule.summit': {
162+ 'date_end': ('django.db.models.fields.DateField', [], {'null': 'True'}),
163+ 'date_start': ('django.db.models.fields.DateField', [], {'null': 'True'}),
164+ 'description': ('django.db.models.fields.TextField', [], {'max_length': '2047', 'blank': 'True'}),
165+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
166+ 'last_update': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
167+ 'location': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
168+ 'name': ('NameField', [], {'max_length': '50'}),
169+ 'state': ('django.db.models.fields.CharField', [], {'default': "u'sponsor'", 'max_length': '10'}),
170+ 'timezone': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
171+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'})
172+ },
173+ 'schedule.topic': {
174+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
175+ 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}),
176+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'})
177+ },
178+ 'schedule.track': {
179+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
180+ 'slug': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'}),
181+ 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}),
182+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'})
183+ }
184+ }
185+
186+ complete_apps = ['schedule']
187
188=== modified file 'summit/schedule/models/trackmodel.py'
189--- summit/schedule/models/trackmodel.py 2010-03-05 10:33:36 +0000
190+++ summit/schedule/models/trackmodel.py 2010-09-21 01:42:40 +0000
191@@ -26,10 +26,11 @@
192 class Track(models.Model):
193 summit = models.ForeignKey(Summit)
194 title = models.CharField(max_length=100)
195+ slug = models.CharField(max_length=100, null=True, blank=False)
196
197 class Meta:
198 app_label = 'schedule'
199- ordering = ('summit', 'title')
200+ ordering = ('summit', 'title', 'slug')
201
202 def __unicode__(self):
203 return "%s (%s)" % (self.title, self.summit.name)
204
205=== modified file 'summit/schedule/templates/schedule/schedule_list.html'
206--- summit/schedule/templates/schedule/schedule_list.html 2010-08-25 00:22:58 +0000
207+++ summit/schedule/templates/schedule/schedule_list.html 2010-09-21 01:42:40 +0000
208@@ -15,7 +15,7 @@
209 By track:
210 <ul>
211 {% for track in summit.track_set.all %}
212- <li><a href="/{{ summit.name }}/track/{{ track.title|lower }}">{{ track.title }}</a></li>
213+ <li><a href="/{{ summit.name }}/track/{{ track.slug|lower }}">{{ track.title }}</a></li>
214 {% endfor %}
215 </ul>
216 </td>
217
218=== modified file 'summit/schedule/views.py'
219--- summit/schedule/views.py 2010-08-29 16:31:56 +0000
220+++ summit/schedule/views.py 2010-09-21 01:42:40 +0000
221@@ -126,8 +126,8 @@
222
223
224 @summit_required
225-def by_track(request, summit, attendee, track_name):
226- track = get_object_or_404(summit.track_set, title__iexact=track_name)
227+def by_track(request, summit, attendee, track_slug):
228+ track = get_object_or_404(summit.track_set, slug__iexact=track_slug)
229
230 schedule = Schedule(request, summit, attendee, track=track)
231
232
233=== modified file 'summit/urls.py'
234--- summit/urls.py 2010-08-25 00:22:58 +0000
235+++ summit/urls.py 2010-09-21 01:42:40 +0000
236@@ -59,7 +59,7 @@
237
238 (r'^(?P<summit_name>[\w-]+)/(?P<date>[\d-]+)/$', 'by_date'),
239 (r'^(?P<summit_name>[\w-]+)/(?P<room_name>[\w-]+)/$', 'by_room'),
240- (r'^(?P<summit_name>[\w-]+)/track/(?P<track_name>[\w-]+)/$', 'by_track'),
241+ (r'^(?P<summit_name>[\w-]+)/track/(?P<track_slug>[\w-]+)/$', 'by_track'),
242 (r'^(?P<summit_name>[\w-]+)\.csv$', 'csv'),
243 )
244

Subscribers

People subscribed via source and target branches