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

Subscribers

People subscribed via source and target branches