Merge lp:~mhall119/summit/videographer into lp:summit
- videographer
- Merge into trunk
Proposed by
Michael Hall
Status: | Merged | ||||
---|---|---|---|---|---|
Approved by: | Chris Johnston | ||||
Approved revision: | 73 | ||||
Merged at revision: | 75 | ||||
Proposed branch: | lp:~mhall119/summit/videographer | ||||
Merge into: | lp:summit | ||||
Diff against target: |
304 lines (+228/-1) 5 files modified
summit/schedule/admin/meetingadmin.py (+31/-1) summit/schedule/fields.py (+4/-0) summit/schedule/migrations/0005_add_videographers.py (+176/-0) summit/schedule/models/meetingmodel.py (+8/-0) summit/schedule/render.py (+9/-0) |
||||
To merge this branch: | bzr merge lp:~mhall119/summit/videographer | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Chris Johnston | Approve | ||
Review via email: mp+56023@code.launchpad.net |
Commit message
Description of the change
This comes from Daviey's older branch, with added South migration script
To post a comment you must log in.
Revision history for this message
Chris Johnston (cjohnston) wrote : | # |
Revision history for this message
Chris Johnston (cjohnston) : | # |
review:
Approve
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === added file 'summit/media/img/videographer.png' |
2 | Binary files summit/media/img/videographer.png 1970-01-01 00:00:00 +0000 and summit/media/img/videographer.png 2011-04-02 01:05:50 +0000 differ |
3 | === modified file 'summit/schedule/admin/meetingadmin.py' |
4 | --- summit/schedule/admin/meetingadmin.py 2010-03-05 10:33:36 +0000 |
5 | +++ summit/schedule/admin/meetingadmin.py 2011-04-02 01:05:50 +0000 |
6 | @@ -61,10 +61,13 @@ |
7 | assignee = forms.CharField(required=False, widget=AttendeeInput) |
8 | approver = forms.CharField(required=False, widget=AttendeeInput) |
9 | scribe = forms.CharField(required=False, widget=AttendeeInput) |
10 | + videographer1 = forms.CharField(required=False, widget=AttendeeInput) |
11 | + videographer2 = forms.CharField(required=False, widget=AttendeeInput) |
12 | |
13 | class Meta: |
14 | model = Meeting |
15 | |
16 | + ### FIXME: Should really remove this duplication |
17 | def clean_drafter(self): |
18 | if 'drafter' in self.cleaned_data: |
19 | data = self.cleaned_data['drafter'] |
20 | @@ -114,6 +117,33 @@ |
21 | raise forms.ValidationError("Username is invalid (doesn't exist or not an attendee).") |
22 | |
23 | |
24 | + |
25 | + def clean_videographer1(self): |
26 | + if 'videographer1' in self.cleaned_data: |
27 | + data = self.cleaned_data['videographer1'] |
28 | + if len(data) == 0: |
29 | + return None |
30 | + try: |
31 | + return Attendee.objects.get( |
32 | + summit=self.cleaned_data['summit'], |
33 | + user__username=data) |
34 | + except Attendee.DoesNotExist: |
35 | + raise forms.ValidationError("Username is invalid (doesn't exist or not an attendee).") |
36 | + |
37 | + |
38 | + def clean_videographer2(self): |
39 | + if 'videographer2' in self.cleaned_data: |
40 | + data = self.cleaned_data['videographer2'] |
41 | + if len(data) == 0: |
42 | + return None |
43 | + try: |
44 | + return Attendee.objects.get( |
45 | + summit=self.cleaned_data['summit'], |
46 | + user__username=data) |
47 | + except Attendee.DoesNotExist: |
48 | + raise forms.ValidationError("Username is invalid (doesn't exist or not an attendee).") |
49 | + |
50 | + |
51 | class MeetingAdmin(admin.ModelAdmin): |
52 | list_display = ('summit', 'name', 'title', 'type') |
53 | list_display_links = ('name', 'title') |
54 | @@ -136,7 +166,7 @@ |
55 | }), |
56 | ("Key people", { |
57 | 'classes': ('collapse', ), |
58 | - 'fields': ('drafter', 'assignee', 'approver', 'scribe'), |
59 | + 'fields': ('drafter', 'assignee', 'approver', 'scribe', 'videographer1' , 'videographer2'), |
60 | }), |
61 | ) |
62 | |
63 | |
64 | === modified file 'summit/schedule/fields.py' |
65 | --- summit/schedule/fields.py 2010-03-05 10:33:36 +0000 |
66 | +++ summit/schedule/fields.py 2011-04-02 01:05:50 +0000 |
67 | @@ -22,6 +22,10 @@ |
68 | 'NameField', |
69 | ) |
70 | |
71 | +# Let South 0.7 know abou this new field type |
72 | +from south.modelsinspector import add_introspection_rules |
73 | +add_introspection_rules([], ["^summit\.schedule\.fields\.NameField"]) |
74 | +print "Added south field rule" |
75 | |
76 | class NameField(models.CharField): |
77 | |
78 | |
79 | === added file 'summit/schedule/migrations/0005_add_videographers.py' |
80 | --- summit/schedule/migrations/0005_add_videographers.py 1970-01-01 00:00:00 +0000 |
81 | +++ summit/schedule/migrations/0005_add_videographers.py 2011-04-02 01:05:50 +0000 |
82 | @@ -0,0 +1,176 @@ |
83 | +# encoding: utf-8 |
84 | +import datetime |
85 | +from south.db import db |
86 | +from south.v2 import SchemaMigration |
87 | +from django.db import models |
88 | + |
89 | +class Migration(SchemaMigration): |
90 | + |
91 | + def forwards(self, orm): |
92 | + |
93 | + # Adding field 'Meeting.videographer2' |
94 | + db.add_column('schedule_meeting', 'videographer2', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='videographer2_set', null=True, to=orm['schedule.Attendee']), keep_default=False) |
95 | + |
96 | + # Adding field 'Meeting.videographer1' |
97 | + db.add_column('schedule_meeting', 'videographer1', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='videographer1_set', null=True, to=orm['schedule.Attendee']), keep_default=False) |
98 | + |
99 | + |
100 | + def backwards(self, orm): |
101 | + |
102 | + # Deleting field 'Meeting.videographer2' |
103 | + db.delete_column('schedule_meeting', 'videographer2_id') |
104 | + |
105 | + # Deleting field 'Meeting.videographer1' |
106 | + db.delete_column('schedule_meeting', 'videographer1_id') |
107 | + |
108 | + |
109 | + models = { |
110 | + 'auth.group': { |
111 | + 'Meta': {'object_name': 'Group'}, |
112 | + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
113 | + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), |
114 | + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) |
115 | + }, |
116 | + 'auth.permission': { |
117 | + 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, |
118 | + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), |
119 | + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), |
120 | + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
121 | + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) |
122 | + }, |
123 | + 'auth.user': { |
124 | + 'Meta': {'object_name': 'User'}, |
125 | + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), |
126 | + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), |
127 | + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), |
128 | + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), |
129 | + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
130 | + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), |
131 | + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), |
132 | + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), |
133 | + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), |
134 | + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), |
135 | + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), |
136 | + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), |
137 | + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) |
138 | + }, |
139 | + 'contenttypes.contenttype': { |
140 | + 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, |
141 | + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), |
142 | + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
143 | + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), |
144 | + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) |
145 | + }, |
146 | + 'schedule.agenda': { |
147 | + 'Meta': {'unique_together': "(('slot', 'room'),)", 'object_name': 'Agenda'}, |
148 | + 'auto': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), |
149 | + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
150 | + 'meeting': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Meeting']"}), |
151 | + 'room': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Room']"}), |
152 | + 'slot': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Slot']"}) |
153 | + }, |
154 | + 'schedule.attendee': { |
155 | + 'Meta': {'object_name': 'Attendee'}, |
156 | + 'end_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'end'"}), |
157 | + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
158 | + 'start_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'start'"}), |
159 | + 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}), |
160 | + 'topics': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['schedule.Topic']", 'symmetrical': 'False', 'blank': 'True'}), |
161 | + 'tracks': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['schedule.Track']", 'symmetrical': 'False', 'blank': 'True'}), |
162 | + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) |
163 | + }, |
164 | + 'schedule.attendeebusy': { |
165 | + 'Meta': {'object_name': 'AttendeeBusy'}, |
166 | + 'attendee': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'busy_set'", 'to': "orm['schedule.Attendee']"}), |
167 | + 'end_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'end'"}), |
168 | + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
169 | + 'start_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'start'"}) |
170 | + }, |
171 | + 'schedule.meeting': { |
172 | + 'Meta': {'object_name': 'Meeting'}, |
173 | + 'approver': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'approver_set'", 'null': 'True', 'to': "orm['schedule.Attendee']"}), |
174 | + 'assignee': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'assignee_set'", 'null': 'True', 'to': "orm['schedule.Attendee']"}), |
175 | + 'description': ('django.db.models.fields.TextField', [], {'max_length': '2047', 'blank': 'True'}), |
176 | + 'drafter': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'drafter_set'", 'null': 'True', 'to': "orm['schedule.Attendee']"}), |
177 | + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
178 | + 'name': ('summit.schedule.fields.NameField', [], {'max_length': '50', 'blank': 'True'}), |
179 | + 'participants': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['schedule.Attendee']", 'symmetrical': 'False', 'through': "orm['schedule.Participant']", 'blank': 'True'}), |
180 | + 'priority': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), |
181 | + 'private': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), |
182 | + 'scribe': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'scribe_set'", 'null': 'True', 'to': "orm['schedule.Attendee']"}), |
183 | + 'slots': ('django.db.models.fields.IntegerField', [], {'default': '1'}), |
184 | + 'spec_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), |
185 | + 'status': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), |
186 | + 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}), |
187 | + 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}), |
188 | + 'topics': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['schedule.Topic']", 'symmetrical': 'False', 'blank': 'True'}), |
189 | + 'tracks': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['schedule.Track']", 'symmetrical': 'False', 'blank': 'True'}), |
190 | + 'type': ('django.db.models.fields.CharField', [], {'default': "u'blueprint'", 'max_length': '15'}), |
191 | + 'videographer1': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'videographer1_set'", 'null': 'True', 'to': "orm['schedule.Attendee']"}), |
192 | + 'videographer2': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'videographer2_set'", 'null': 'True', 'to': "orm['schedule.Attendee']"}), |
193 | + 'wiki_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}) |
194 | + }, |
195 | + 'schedule.participant': { |
196 | + 'Meta': {'object_name': 'Participant'}, |
197 | + 'attendee': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Attendee']"}), |
198 | + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
199 | + 'meeting': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Meeting']"}), |
200 | + 'required': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}) |
201 | + }, |
202 | + 'schedule.room': { |
203 | + 'Meta': {'object_name': 'Room'}, |
204 | + 'end_utc': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'db_column': "'end'", 'blank': 'True'}), |
205 | + 'icecast_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), |
206 | + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
207 | + 'name': ('summit.schedule.fields.NameField', [], {'max_length': '50'}), |
208 | + 'size': ('django.db.models.fields.IntegerField', [], {'default': '0'}), |
209 | + 'start_utc': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'db_column': "'start'", 'blank': 'True'}), |
210 | + 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}), |
211 | + 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}), |
212 | + 'tracks': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['schedule.Track']", 'symmetrical': 'False', 'blank': 'True'}), |
213 | + 'type': ('django.db.models.fields.CharField', [], {'default': "u'open'", 'max_length': '7'}) |
214 | + }, |
215 | + 'schedule.roombusy': { |
216 | + 'Meta': {'object_name': 'RoomBusy'}, |
217 | + 'end_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'end'"}), |
218 | + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
219 | + 'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'busy_set'", 'to': "orm['schedule.Room']"}), |
220 | + 'start_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'start'"}) |
221 | + }, |
222 | + 'schedule.slot': { |
223 | + 'Meta': {'object_name': 'Slot'}, |
224 | + 'end_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'end'"}), |
225 | + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
226 | + 'start_utc': ('django.db.models.fields.DateTimeField', [], {'db_column': "'start'"}), |
227 | + 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}), |
228 | + 'type': ('django.db.models.fields.CharField', [], {'default': "u'open'", 'max_length': '7'}) |
229 | + }, |
230 | + 'schedule.summit': { |
231 | + 'Meta': {'object_name': 'Summit'}, |
232 | + 'date_end': ('django.db.models.fields.DateField', [], {'null': 'True'}), |
233 | + 'date_start': ('django.db.models.fields.DateField', [], {'null': 'True'}), |
234 | + 'description': ('django.db.models.fields.TextField', [], {'max_length': '2047', 'blank': 'True'}), |
235 | + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
236 | + 'last_update': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), |
237 | + 'location': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), |
238 | + 'name': ('summit.schedule.fields.NameField', [], {'max_length': '50'}), |
239 | + 'state': ('django.db.models.fields.CharField', [], {'default': "u'sponsor'", 'max_length': '10'}), |
240 | + 'timezone': ('django.db.models.fields.CharField', [], {'max_length': '50'}), |
241 | + 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}) |
242 | + }, |
243 | + 'schedule.topic': { |
244 | + 'Meta': {'object_name': 'Topic'}, |
245 | + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
246 | + 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}), |
247 | + 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}) |
248 | + }, |
249 | + 'schedule.track': { |
250 | + 'Meta': {'object_name': 'Track'}, |
251 | + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
252 | + 'slug': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'}), |
253 | + 'summit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Summit']"}), |
254 | + 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}) |
255 | + } |
256 | + } |
257 | + |
258 | + complete_apps = ['schedule'] |
259 | |
260 | === modified file 'summit/schedule/models/meetingmodel.py' |
261 | --- summit/schedule/models/meetingmodel.py 2010-10-13 13:10:42 +0000 |
262 | +++ summit/schedule/models/meetingmodel.py 2011-04-02 01:05:50 +0000 |
263 | @@ -99,6 +99,10 @@ |
264 | related_name='approver_set') |
265 | scribe = models.ForeignKey(Attendee, null=True, blank=True, |
266 | related_name='scribe_set') |
267 | + videographer1 = models.ForeignKey(Attendee, null=True, blank=True, |
268 | + related_name='videographer1_set') |
269 | + videographer2 = models.ForeignKey(Attendee, null=True, blank=True, |
270 | + related_name='videographer2_set') |
271 | participants = models.ManyToManyField(Attendee, blank=True, |
272 | through='Participant') |
273 | |
274 | @@ -123,6 +127,10 @@ |
275 | attendees = [] |
276 | if self.scribe and self.scribe not in attendees: |
277 | attendees.append(self.scribe) |
278 | + if self.videographer1 and self.videographer1 not in attendees: |
279 | + attendees.append(self.videographer1) |
280 | + if self.videographer2 and self.videographer2 not in attendees: |
281 | + attendees.append(self.videographer2) |
282 | if self.drafter: |
283 | attendees.append(self.drafter) |
284 | if self.assignee and self.assignee not in attendees: |
285 | |
286 | === modified file 'summit/schedule/render.py' |
287 | --- summit/schedule/render.py 2010-10-25 15:16:54 +0000 |
288 | +++ summit/schedule/render.py 2011-04-02 01:05:50 +0000 |
289 | @@ -761,6 +761,15 @@ |
290 | html += (('<img src="%simg/scribe.png" title="Scribe" ' + |
291 | 'alt="(scribe)" height="7" width="7"/>') |
292 | % settings.MEDIA_URL) |
293 | + if attendee == meeting.videographer1: |
294 | + html += (('<img src="%simg/videographer.png" title="Videographer" ' + |
295 | + 'alt="(videographer)" height="7" width="7"/>') |
296 | + % settings.MEDIA_URL) |
297 | + if attendee == meeting.videographer2: |
298 | + html += (('<img src="%simg/videographer.png" title="Videographer" ' + |
299 | + 'alt="(videographer)" height="7" width="7"/>') |
300 | + % settings.MEDIA_URL) |
301 | + |
302 | try: |
303 | participant = meeting.participant_set.get(attendee=attendee) |
304 | except: |
I think it would be easier to have a dropdown instead of having to manually type in the LP name, however I do see that this has the same style as the rest of the fields.