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 | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Dave Walker (community) | Approve | ||
Review via email: mp+36091@code.launchpad.net |
Commit message
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.
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 |
Thanks for this branch Chris, you did a cracking job!