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