Merge lp:~mhall119/summit/videographer into lp:summit

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
Reviewer Review Type Date Requested Status
Chris Johnston Approve
Review via email: mp+56023@code.launchpad.net

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 :

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.

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'
2Binary 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:

Subscribers

People subscribed via source and target branches