Merge lp:~mhall119/loco-team-portal/meeting-feature into lp:loco-team-portal

Proposed by Michael Hall on 2010-12-07
Status: Merged
Approved by: Chris Johnston on 2010-12-09
Approved revision: 357
Merged at revision: 341
Proposed branch: lp:~mhall119/loco-team-portal/meeting-feature
Merge into: lp:loco-team-portal
Prerequisite: lp:~cjohnston/loco-team-portal/meeting-feature
Diff against target: 425 lines (+369/-0)
7 files modified
loco_directory/media/css/newstyle.css (+4/-0)
loco_directory/meetings/admin.py (+2/-0)
loco_directory/meetings/migrations/0003_add_chair.py (+130/-0)
loco_directory/meetings/migrations/0004_add_agenda.py (+152/-0)
loco_directory/meetings/models.py (+67/-0)
loco_directory/templates/meetings/team_meeting_detail.inc.html (+6/-0)
loco_directory/templates/meetings/team_meeting_detail_agenda.inc.html (+8/-0)
To merge this branch: bzr merge lp:~mhall119/loco-team-portal/meeting-feature
Reviewer Review Type Date Requested Status
Chris Johnston 2010-12-07 Approve on 2010-12-09
Review via email: mp+43014@code.launchpad.net

Description of the Change

Adds agenda to the meetings app

To post a comment you must log in.
Chris Johnston (cjohnston) wrote :

Looks like a good start

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'loco_directory/media/css/newstyle.css'
2--- loco_directory/media/css/newstyle.css 2010-10-08 21:43:14 +0000
3+++ loco_directory/media/css/newstyle.css 2010-12-07 21:40:48 +0000
4@@ -66,6 +66,10 @@
5 list-style-image: url(../img/unapproved.png); /* Grey Ubuntu Logo */
6 }
7
8+ol.agenda-list, .agenda-list ol, .agenda-list li {
9+ padding: 2px 10px !important;
10+}
11+
12 br.clear {
13 clear: left;
14 }
15
16=== modified file 'loco_directory/meetings/admin.py'
17--- loco_directory/meetings/admin.py 2010-12-07 21:40:48 +0000
18+++ loco_directory/meetings/admin.py 2010-12-07 21:40:48 +0000
19@@ -2,3 +2,5 @@
20 from meetings.models import *
21
22 admin.site.register(TeamMeeting)
23+admin.site.register(AgendaItem)
24+
25
26=== added file 'loco_directory/meetings/migrations/0003_add_chair.py'
27--- loco_directory/meetings/migrations/0003_add_chair.py 1970-01-01 00:00:00 +0000
28+++ loco_directory/meetings/migrations/0003_add_chair.py 2010-12-07 21:40:48 +0000
29@@ -0,0 +1,130 @@
30+
31+from south.db import db
32+from django.db import models
33+from meetings.models import *
34+
35+class Migration:
36+
37+ def forwards(self, orm):
38+
39+ # Adding field 'BaseMeeting.chair'
40+ db.add_column('meetings_basemeeting', 'chair', orm['meetings.basemeeting:chair'])
41+
42+
43+
44+ def backwards(self, orm):
45+
46+ # Deleting field 'BaseMeeting.chair'
47+ db.delete_column('meetings_basemeeting', 'chair_id')
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+ 'meetings.basemeeting': {
87+ 'chair': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['userprofiles.UserProfile']", 'null': 'True', 'blank': 'True'}),
88+ 'channel': ('django.db.models.fields.CharField', [], {'max_length': '150', 'null': 'True'}),
89+ 'date_begin': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
90+ 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 12, 7, 20, 0, 18, 626730)', 'db_index': 'True'}),
91+ 'date_end': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
92+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
93+ 'logs': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
94+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'})
95+ },
96+ 'meetings.teammeeting': {
97+ 'basemeeting_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['meetings.BaseMeeting']", 'unique': 'True', 'primary_key': 'True'}),
98+ 'teams': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['teams.Team']", 'db_index': 'True', 'symmetrical': 'False'})
99+ },
100+ 'teams.continent': {
101+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
102+ 'name': ('django.db.models.fields.TextField', [], {'max_length': '50'})
103+ },
104+ 'teams.country': {
105+ 'continents': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['teams.Continent']", 'symmetrical': 'False'}),
106+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
107+ 'name': ('django.db.models.fields.TextField', [], {'max_length': '100'})
108+ },
109+ 'teams.language': {
110+ 'code': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True'}),
111+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
112+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '150', 'null': 'True'})
113+ },
114+ 'teams.team': {
115+ 'Meta': {'db_table': "'teams'"},
116+ 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
117+ 'admin_profiles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['userprofiles.UserProfile']", 'symmetrical': 'False'}),
118+ 'approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
119+ 'approved_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
120+ 'city': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}),
121+ 'contact_profiles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['userprofiles.UserProfile']", 'symmetrical': 'False'}),
122+ 'countries': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['teams.Country']", 'symmetrical': 'False'}),
123+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
124+ 'expires_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
125+ 'flickr_id': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}),
126+ 'forum_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
127+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
128+ 'irc_chan': ('django.db.models.fields.CharField', [], {'max_length': '25', 'null': 'True', 'blank': 'True'}),
129+ 'languages': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['teams.Language']", 'symmetrical': 'False'}),
130+ 'lp_name': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True'}),
131+ 'ml_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
132+ 'mugshot_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
133+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '80', 'null': 'True'}),
134+ 'owner_profile': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'owner'", 'null': 'True', 'to': "orm['userprofiles.UserProfile']"}),
135+ 'picasa_id': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}),
136+ 'pixie_id': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}),
137+ 'provides_support': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
138+ 'spr': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}),
139+ 'web_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
140+ 'wiki_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'})
141+ },
142+ 'userprofiles.userprofile': {
143+ 'aim': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
144+ 'blog': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
145+ 'facebook': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
146+ 'flickr': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
147+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
148+ 'identica': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
149+ 'irc': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
150+ 'picasa': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
151+ 'realname': ('django.db.models.fields.CharField', [], {'max_length': '150', 'blank': 'True'}),
152+ 'twitter': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
153+ 'tz': ('django.db.models.fields.CharField', [], {'default': "'UTC'", 'max_length': '32'}),
154+ 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'}),
155+ 'xmpp': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'})
156+ }
157+ }
158+
159+ complete_apps = ['meetings']
160
161=== added file 'loco_directory/meetings/migrations/0004_add_agenda.py'
162--- loco_directory/meetings/migrations/0004_add_agenda.py 1970-01-01 00:00:00 +0000
163+++ loco_directory/meetings/migrations/0004_add_agenda.py 2010-12-07 21:40:48 +0000
164@@ -0,0 +1,152 @@
165+
166+from south.db import db
167+from django.db import models
168+from meetings.models import *
169+
170+class Migration:
171+
172+ def forwards(self, orm):
173+
174+ # Adding model 'AgendaItem'
175+ db.create_table('meetings_agendaitem', (
176+ ('id', orm['meetings.agendaitem:id']),
177+ ('meeting', orm['meetings.agendaitem:meeting']),
178+ ('parent', orm['meetings.agendaitem:parent']),
179+ ('order', orm['meetings.agendaitem:order']),
180+ ('owner', orm['meetings.agendaitem:owner']),
181+ ('created_date', orm['meetings.agendaitem:created_date']),
182+ ('title', orm['meetings.agendaitem:title']),
183+ ('description', orm['meetings.agendaitem:description']),
184+ ('log', orm['meetings.agendaitem:log']),
185+ ))
186+ db.send_create_signal('meetings', ['AgendaItem'])
187+
188+
189+
190+ def backwards(self, orm):
191+
192+ # Deleting model 'AgendaItem'
193+ db.delete_table('meetings_agendaitem')
194+
195+
196+
197+ models = {
198+ 'auth.group': {
199+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
200+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
201+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
202+ },
203+ 'auth.permission': {
204+ 'Meta': {'unique_together': "(('content_type', 'codename'),)"},
205+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
206+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
207+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
208+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
209+ },
210+ 'auth.user': {
211+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
212+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
213+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
214+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
215+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
216+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
217+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
218+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
219+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
220+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
221+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
222+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
223+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
224+ },
225+ 'contenttypes.contenttype': {
226+ 'Meta': {'unique_together': "(('app_label', 'model'),)", 'db_table': "'django_content_type'"},
227+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
228+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
229+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
230+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
231+ },
232+ 'meetings.agendaitem': {
233+ 'created_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
234+ 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
235+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
236+ 'log': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
237+ 'meeting': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['meetings.BaseMeeting']"}),
238+ 'order': ('django.db.models.fields.PositiveIntegerField', [], {}),
239+ 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['userprofiles.UserProfile']"}),
240+ 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['meetings.AgendaItem']"}),
241+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'})
242+ },
243+ 'meetings.basemeeting': {
244+ 'chair': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['userprofiles.UserProfile']", 'null': 'True', 'blank': 'True'}),
245+ 'channel': ('django.db.models.fields.CharField', [], {'max_length': '150', 'null': 'True'}),
246+ 'date_begin': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
247+ 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 12, 7, 20, 37, 42, 549244)', 'db_index': 'True'}),
248+ 'date_end': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
249+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
250+ 'logs': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
251+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'})
252+ },
253+ 'meetings.teammeeting': {
254+ 'basemeeting_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['meetings.BaseMeeting']", 'unique': 'True', 'primary_key': 'True'}),
255+ 'teams': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['teams.Team']", 'db_index': 'True', 'symmetrical': 'False'})
256+ },
257+ 'teams.continent': {
258+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
259+ 'name': ('django.db.models.fields.TextField', [], {'max_length': '50'})
260+ },
261+ 'teams.country': {
262+ 'continents': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['teams.Continent']", 'symmetrical': 'False'}),
263+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
264+ 'name': ('django.db.models.fields.TextField', [], {'max_length': '100'})
265+ },
266+ 'teams.language': {
267+ 'code': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True'}),
268+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
269+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '150', 'null': 'True'})
270+ },
271+ 'teams.team': {
272+ 'Meta': {'db_table': "'teams'"},
273+ 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
274+ 'admin_profiles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['userprofiles.UserProfile']", 'symmetrical': 'False'}),
275+ 'approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
276+ 'approved_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
277+ 'city': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}),
278+ 'contact_profiles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['userprofiles.UserProfile']", 'symmetrical': 'False'}),
279+ 'countries': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['teams.Country']", 'symmetrical': 'False'}),
280+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
281+ 'expires_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
282+ 'flickr_id': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}),
283+ 'forum_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
284+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
285+ 'irc_chan': ('django.db.models.fields.CharField', [], {'max_length': '25', 'null': 'True', 'blank': 'True'}),
286+ 'languages': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['teams.Language']", 'symmetrical': 'False'}),
287+ 'lp_name': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True'}),
288+ 'ml_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
289+ 'mugshot_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
290+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '80', 'null': 'True'}),
291+ 'owner_profile': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'owner'", 'null': 'True', 'to': "orm['userprofiles.UserProfile']"}),
292+ 'picasa_id': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}),
293+ 'pixie_id': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}),
294+ 'provides_support': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
295+ 'spr': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}),
296+ 'web_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
297+ 'wiki_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'})
298+ },
299+ 'userprofiles.userprofile': {
300+ 'aim': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
301+ 'blog': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
302+ 'facebook': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
303+ 'flickr': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
304+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
305+ 'identica': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
306+ 'irc': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
307+ 'picasa': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
308+ 'realname': ('django.db.models.fields.CharField', [], {'max_length': '150', 'blank': 'True'}),
309+ 'twitter': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
310+ 'tz': ('django.db.models.fields.CharField', [], {'default': "'UTC'", 'max_length': '32'}),
311+ 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'}),
312+ 'xmpp': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'})
313+ }
314+ }
315+
316+ complete_apps = ['meetings']
317
318=== modified file 'loco_directory/meetings/models.py'
319--- loco_directory/meetings/models.py 2010-12-07 21:40:48 +0000
320+++ loco_directory/meetings/models.py 2010-12-07 21:40:48 +0000
321@@ -16,6 +16,7 @@
322 channel = models.CharField(max_length=150, verbose_name=_('Meeting Channel'), help_text=_('Channel that the meeting will be held in. Include #'), null=True)
323 logs = models.URLField(verbose_name=_('Meeting Log'), help_text=_('After the meeting, add a link to the meeting log'), max_length=200, verify_exists=False, blank=True, null=True)
324 date_created = models.DateTimeField(help_text=_('the date and time when the event was created'), default=datetime.datetime.now(), db_index=True)
325+ chair = models.ForeignKey(UserProfile, blank=True, null=True)
326
327 def __unicode__(self):
328 return self.name
329@@ -64,3 +65,69 @@
330
331 #add manager
332 objects = TeamMeetingManager()
333+
334+class AgendaItemNode(object):
335+
336+ def __init__(self, item):
337+ self.item = item
338+ self.parent = None
339+ self.children = []
340+
341+ def as_ol(self):
342+ if len(self.children) > 0:
343+ return '<li>%s - %s</li>\n<ol>\n%s</ol>\n' % (self.item.title, self.item.sig, '\n'.join([c.as_ol() for c in self.children]))
344+ else:
345+ return '<li>%s - %s</li>\n' % (self.item.title, self.item.sig)
346+
347+ def as_ul(self):
348+ if len(self.children) > 0:
349+ return '<li>%s - %s</li>\n<ul>\n%s</ul>\n' % (self.item.title, self.item.sig, '\n'.join([c.as_ul() for c in self.children]))
350+ else:
351+ return '<li>%s - %s</li>\n' % (self.item.title, self.item.sig)
352+
353+ def __unicode__(self):
354+ return self.item.title
355+
356+class AgendaItemManager(models.Manager):
357+
358+ def as_tree(self):
359+ cache = {}
360+ tree = []
361+ all_items = self.order_by('parent__id', 'order')
362+ for i in all_items:
363+ node = AgendaItemNode(i)
364+ cache[i.pk] = node
365+ if i.parent is None or i.parent.pk == 0:
366+ tree.append(node)
367+ else:
368+ node.parent = cache[i.parent.pk]
369+ node.parent.children.append(node)
370+ return tree
371+
372+class AgendaItem(models.Model):
373+
374+ class Meta:
375+ ordering = ('parent__id', 'order')
376+
377+ meeting = models.ForeignKey(BaseMeeting, verbose_name=_('Meeting'), related_name='agenda', help_text=_('meeting during which this agenda item is to be discussed'))
378+ parent = models.ForeignKey('self', verbose_name=_('Parent Agenda Item'), related_name='children', help_text=_('agenda item that contains this item'), blank=True, null=True)
379+ order = models.PositiveIntegerField(verbose_name=_('Order'), help_text=_('index number of where this item falls in the agenda'))
380+ owner = models.ForeignKey(UserProfile, verbose_name=_('Owner'), help_text=_('person proposing or responsible for this item'))
381+ created_date = models.DateTimeField(verbose_name=_('Created Date'), auto_now_add=True, help_text=_('timestamp of when this item was created'))
382+ title = models.CharField(verbose_name=_('Title'), max_length = 150, help_text=_('descriptive name for this item'))
383+ description = models.TextField(verbose_name=_('Description'), help_text=_('detailed description of this item'), blank=True, null=True)
384+ log = models.URLField(verbose_name=_('Log URL'), max_length=200, verify_exists=False, help_text=_('URL to this item\'s discussion'), blank=True, null=True)
385+
386+ objects = AgendaItemManager()
387+
388+ def get_sig(self):
389+ return '<a href="http://launchpad.net/~%s">%s</a> %s' % (self.owner.user.username, self.owner.realname, self.created_date)
390+
391+ sig = property(get_sig)
392+
393+ def __unicode__(self):
394+ if self.parent is None:
395+ return '%s: %s' % (self.meeting, self.title)
396+ else:
397+ return '%s->%s' % (self.parent, self.title)
398+
399
400=== modified file 'loco_directory/templates/meetings/team_meeting_detail.inc.html'
401--- loco_directory/templates/meetings/team_meeting_detail.inc.html 2010-12-07 21:40:48 +0000
402+++ loco_directory/templates/meetings/team_meeting_detail.inc.html 2010-12-07 21:40:48 +0000
403@@ -7,3 +7,9 @@
404 <h3>{% trans "Details" %}</h3>
405 {% include "meetings/team_meeting_detail_basic.inc.html" %}
406 </article>
407+
408+<article class="main-content">
409+ <h3>{% trans "Agenda" %}</h3>
410+ {% include "meetings/team_meeting_detail_agenda.inc.html" %}
411+</article>
412+
413
414=== added file 'loco_directory/templates/meetings/team_meeting_detail_agenda.inc.html'
415--- loco_directory/templates/meetings/team_meeting_detail_agenda.inc.html 1970-01-01 00:00:00 +0000
416+++ loco_directory/templates/meetings/team_meeting_detail_agenda.inc.html 2010-12-07 21:40:48 +0000
417@@ -0,0 +1,8 @@
418+{% load i18n %}
419+{% if team_meeting_object %}
420+<ol class="agenda-list">
421+{% for item in team_meeting_object.agenda.as_tree %}
422+{{item.as_ol|safe}}
423+{% endfor %}
424+</ol>
425+{% endif %}

Subscribers

People subscribed via source and target branches