Merge lp:~dholbach/harvest/734746 into lp:harvest

Proposed by Daniel Holbach
Status: Merged
Merged at revision: 310
Proposed branch: lp:~dholbach/harvest/734746
Merge into: lp:harvest
Diff against target: 447 lines (+350/-4)
9 files modified
INSTALL (+2/-1)
harvest/media/css/opportunities.css (+4/-1)
harvest/opportunities/management/commands/updateopportunities.py (+4/-0)
harvest/opportunities/migrations/0001_initial.py (+202/-0)
harvest/opportunities/migrations/0002_add_severity_and_long_desc.py (+122/-0)
harvest/opportunities/models.py (+2/-0)
harvest/settings.py (+1/-0)
harvest/templates/opportunities/include/opportunity.html (+5/-1)
harvest/templates/opportunities/opportunity_edit.html (+8/-1)
To merge this branch: bzr merge lp:~dholbach/harvest/734746
Reviewer Review Type Date Requested Status
Dylan McCall Approve
Review via email: mp+66154@code.launchpad.net
To post a comment you must log in.
lp:~dholbach/harvest/734746 updated
313. By Daniel Holbach

install python-django-south

Revision history for this message
Dylan McCall (dylanmccall) wrote :

Oooh, nice. This appears to be working for me. I'm assuming that Harvest's update script isn't grabbing long descriptions yet, so I added some manually and they're showing up :)

Revision history for this message
Dylan McCall (dylanmccall) :
review: Approve
Revision history for this message
Daniel Holbach (dholbach) wrote :

These should be working already:
http://daniel.holba.ch/merges.json,"Outstanding merges from Debian"
http://people.canonical.com/~ubuntu-security/d2u/debian-security.json,"Debian security update merges and syncs"
http://people.ubuntuwire.org/~ajmitch/missing-fixes-rc.oneiric.json,"Debian release critical bugs"
http://reports.qa.ubuntu.com/reports/sponsoring/sponsoring.json,"needs sponsoring"

Revision history for this message
Daniel Holbach (dholbach) wrote :

Does it generally look OK for you? Or do you feel we should change things UI wise?

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'INSTALL'
2--- INSTALL 2010-07-05 15:49:39 +0000
3+++ INSTALL 2011-06-28 14:19:27 +0000
4@@ -1,4 +1,4 @@
5-1. sudo apt-get install python-django python-launchpadlib python-django-openid-auth bzr
6+1. sudo apt-get install python-django python-launchpadlib python-django-openid-auth bzr python-django-south
7
8 ---
9 Optional for Harvest hackers:
10@@ -21,6 +21,7 @@
11 - cd harvest
12 - cp -i local_settings.py.sample local_settings.py
13 - ./manage.py syncdb
14+ - ./manage.py migrate
15 - ./manage.py init-harvest
16 - ./manage.py update
17 - ./manage.py runserver
18
19=== modified file 'harvest/media/css/opportunities.css'
20--- harvest/media/css/opportunities.css 2011-05-05 18:44:51 +0000
21+++ harvest/media/css/opportunities.css 2011-06-28 14:19:27 +0000
22@@ -268,9 +268,12 @@
23 line-height:1em;
24 }
25 .opportunity[data-opportunity-irrelevant] > .opportunity-header > .opportunity-description,
26-.opportunity[data-opportunity-applied] > .opportunity-header > .opportunity-description {
27+.opportunity[data-opportunity-irrelevant] > .opportunity-header > .opportunity-long-description,
28+.opportunity[data-opportunity-applied] > .opportunity-header > .opportunity-description,
29+.opportunity[data-opportunity-applied] > .opportunity-header > .opportunity-long-description {
30 text-decoration:line-through;
31 }
32+.opportunity-header > a.opportunity-long-description,
33 .opportunity-header > a.opportunity-description {
34 color:#000000;
35 font-size:16px;
36
37=== modified file 'harvest/opportunities/management/commands/updateopportunities.py'
38--- harvest/opportunities/management/commands/updateopportunities.py 2010-12-08 08:15:50 +0000
39+++ harvest/opportunities/management/commands/updateopportunities.py 2011-06-28 14:19:27 +0000
40@@ -35,6 +35,10 @@
41 opportunitylist=op_list,
42 experience=op_list.experience)
43 opportunity.last_updated = op_list.last_updated
44+ if entry.has_key("description"):
45+ opportunity.long_description = entry["description"]
46+ if entry.has_key("severity"):
47+ opportunity.severity = entry["severity"]
48 opportunity.valid = True
49 opportunity.save()
50 else:
51
52=== added directory 'harvest/opportunities/migrations'
53=== added file 'harvest/opportunities/migrations/0001_initial.py'
54--- harvest/opportunities/migrations/0001_initial.py 1970-01-01 00:00:00 +0000
55+++ harvest/opportunities/migrations/0001_initial.py 2011-06-28 14:19:27 +0000
56@@ -0,0 +1,202 @@
57+# encoding: utf-8
58+import datetime
59+from south.db import db
60+from south.v2 import SchemaMigration
61+from django.db import models
62+
63+class Migration(SchemaMigration):
64+
65+ def forwards(self, orm):
66+
67+ # Adding model 'PackageSet'
68+ db.create_table('opportunities_packageset', (
69+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
70+ ('name', self.gf('django.db.models.fields.SlugField')(max_length=40, db_index=True)),
71+ ))
72+ db.send_create_signal('opportunities', ['PackageSet'])
73+
74+ # Adding model 'SourcePackage'
75+ db.create_table('opportunities_sourcepackage', (
76+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
77+ ('name', self.gf('django.db.models.fields.SlugField')(max_length=70, db_index=True)),
78+ ))
79+ db.send_create_signal('opportunities', ['SourcePackage'])
80+
81+ # Adding M2M table for field packagesets on 'SourcePackage'
82+ db.create_table('opportunities_sourcepackage_packagesets', (
83+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
84+ ('sourcepackage', models.ForeignKey(orm['opportunities.sourcepackage'], null=False)),
85+ ('packageset', models.ForeignKey(orm['opportunities.packageset'], null=False))
86+ ))
87+ db.create_unique('opportunities_sourcepackage_packagesets', ['sourcepackage_id', 'packageset_id'])
88+
89+ # Adding model 'OpportunityList'
90+ db.create_table('opportunities_opportunitylist', (
91+ ('last_updated', self.gf('django.db.models.fields.DateTimeField')(null=True)),
92+ ('description', self.gf('django.db.models.fields.TextField')(max_length=350)),
93+ ('url', self.gf('django.db.models.fields.URLField')(max_length=200)),
94+ ('explanation', self.gf('django.db.models.fields.URLField')(max_length=500, null=True)),
95+ ('commentable', self.gf('django.db.models.fields.BooleanField')(default=True, blank=True)),
96+ ('experience', self.gf('django.db.models.fields.IntegerField')(default=0)),
97+ ('featured', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)),
98+ ('active', self.gf('django.db.models.fields.BooleanField')(default=True, blank=True)),
99+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
100+ ('name', self.gf('django.db.models.fields.SlugField')(max_length=70, db_index=True)),
101+ ))
102+ db.send_create_signal('opportunities', ['OpportunityList'])
103+
104+ # Adding model 'Opportunity'
105+ db.create_table('opportunities_opportunity', (
106+ ('applied', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)),
107+ ('last_updated', self.gf('django.db.models.fields.DateTimeField')(null=True)),
108+ ('description', self.gf('django.db.models.fields.TextField')(max_length=350)),
109+ ('url', self.gf('django.db.models.fields.URLField')(max_length=350)),
110+ ('since', self.gf('django.db.models.fields.DateTimeField')(null=True)),
111+ ('experience', self.gf('django.db.models.fields.IntegerField')(default=0)),
112+ ('reviewed', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)),
113+ ('valid', self.gf('django.db.models.fields.BooleanField')(default=True, blank=True)),
114+ ('opportunitylist', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['opportunities.OpportunityList'])),
115+ ('sourcepackage', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['opportunities.SourcePackage'])),
116+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
117+ ))
118+ db.send_create_signal('opportunities', ['Opportunity'])
119+
120+ # Adding model 'Note'
121+ db.create_table('opportunities_note', (
122+ ('date', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
123+ ('text', self.gf('django.db.models.fields.CharField')(max_length=250)),
124+ ('opportunity', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['opportunities.Opportunity'])),
125+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
126+ ('author', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])),
127+ ))
128+ db.send_create_signal('opportunities', ['Note'])
129+
130+ # Adding model 'ActionLogEntry'
131+ db.create_table('opportunities_actionlogentry', (
132+ ('action', self.gf('django.db.models.fields.TextField')(max_length=200)),
133+ ('timestamp', self.gf('django.db.models.fields.DateTimeField')()),
134+ ('who', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])),
135+ ('opportunity', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['opportunities.Opportunity'], blank=True)),
136+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
137+ ))
138+ db.send_create_signal('opportunities', ['ActionLogEntry'])
139+
140+
141+ def backwards(self, orm):
142+
143+ # Deleting model 'PackageSet'
144+ db.delete_table('opportunities_packageset')
145+
146+ # Deleting model 'SourcePackage'
147+ db.delete_table('opportunities_sourcepackage')
148+
149+ # Removing M2M table for field packagesets on 'SourcePackage'
150+ db.delete_table('opportunities_sourcepackage_packagesets')
151+
152+ # Deleting model 'OpportunityList'
153+ db.delete_table('opportunities_opportunitylist')
154+
155+ # Deleting model 'Opportunity'
156+ db.delete_table('opportunities_opportunity')
157+
158+ # Deleting model 'Note'
159+ db.delete_table('opportunities_note')
160+
161+ # Deleting model 'ActionLogEntry'
162+ db.delete_table('opportunities_actionlogentry')
163+
164+
165+ models = {
166+ 'auth.group': {
167+ 'Meta': {'object_name': 'Group'},
168+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
169+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
170+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
171+ },
172+ 'auth.permission': {
173+ 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
174+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
175+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
176+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
177+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
178+ },
179+ 'auth.user': {
180+ 'Meta': {'object_name': 'User'},
181+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
182+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
183+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
184+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
185+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
186+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
187+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
188+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
189+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
190+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
191+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
192+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
193+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
194+ },
195+ 'contenttypes.contenttype': {
196+ 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
197+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
198+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
199+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
200+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
201+ },
202+ 'opportunities.actionlogentry': {
203+ 'Meta': {'object_name': 'ActionLogEntry'},
204+ 'action': ('django.db.models.fields.TextField', [], {'max_length': '200'}),
205+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
206+ 'opportunity': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['opportunities.Opportunity']", 'blank': 'True'}),
207+ 'timestamp': ('django.db.models.fields.DateTimeField', [], {}),
208+ 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
209+ },
210+ 'opportunities.note': {
211+ 'Meta': {'object_name': 'Note'},
212+ 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
213+ 'date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
214+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
215+ 'opportunity': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['opportunities.Opportunity']"}),
216+ 'text': ('django.db.models.fields.CharField', [], {'max_length': '250'})
217+ },
218+ 'opportunities.opportunity': {
219+ 'Meta': {'object_name': 'Opportunity'},
220+ 'applied': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
221+ 'description': ('django.db.models.fields.TextField', [], {'max_length': '350'}),
222+ 'experience': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
223+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
224+ 'last_updated': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
225+ 'opportunitylist': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['opportunities.OpportunityList']"}),
226+ 'reviewed': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
227+ 'since': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
228+ 'sourcepackage': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['opportunities.SourcePackage']"}),
229+ 'url': ('django.db.models.fields.URLField', [], {'max_length': '350'}),
230+ 'valid': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'})
231+ },
232+ 'opportunities.opportunitylist': {
233+ 'Meta': {'object_name': 'OpportunityList'},
234+ 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
235+ 'commentable': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
236+ 'description': ('django.db.models.fields.TextField', [], {'max_length': '350'}),
237+ 'experience': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
238+ 'explanation': ('django.db.models.fields.URLField', [], {'max_length': '500', 'null': 'True'}),
239+ 'featured': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
240+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
241+ 'last_updated': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
242+ 'name': ('django.db.models.fields.SlugField', [], {'max_length': '70', 'db_index': 'True'}),
243+ 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'})
244+ },
245+ 'opportunities.packageset': {
246+ 'Meta': {'object_name': 'PackageSet'},
247+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
248+ 'name': ('django.db.models.fields.SlugField', [], {'max_length': '40', 'db_index': 'True'})
249+ },
250+ 'opportunities.sourcepackage': {
251+ 'Meta': {'object_name': 'SourcePackage'},
252+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
253+ 'name': ('django.db.models.fields.SlugField', [], {'max_length': '70', 'db_index': 'True'}),
254+ 'packagesets': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['opportunities.PackageSet']", 'null': 'True', 'symmetrical': 'False'})
255+ }
256+ }
257+
258+ complete_apps = ['opportunities']
259
260=== added file 'harvest/opportunities/migrations/0002_add_severity_and_long_desc.py'
261--- harvest/opportunities/migrations/0002_add_severity_and_long_desc.py 1970-01-01 00:00:00 +0000
262+++ harvest/opportunities/migrations/0002_add_severity_and_long_desc.py 2011-06-28 14:19:27 +0000
263@@ -0,0 +1,122 @@
264+# encoding: utf-8
265+import datetime
266+from south.db import db
267+from south.v2 import SchemaMigration
268+from django.db import models
269+
270+class Migration(SchemaMigration):
271+
272+ def forwards(self, orm):
273+
274+ # Adding field 'Opportunity.long_description'
275+ db.add_column('opportunities_opportunity', 'long_description', self.gf('django.db.models.fields.TextField')(max_length=350, null=True), keep_default=False)
276+
277+ # Adding field 'Opportunity.severity'
278+ db.add_column('opportunities_opportunity', 'severity', self.gf('django.db.models.fields.TextField')(max_length=20, null=True), keep_default=False)
279+
280+
281+ def backwards(self, orm):
282+
283+ # Deleting field 'Opportunity.long_description'
284+ db.delete_column('opportunities_opportunity', 'long_description')
285+
286+ # Deleting field 'Opportunity.severity'
287+ db.delete_column('opportunities_opportunity', 'severity')
288+
289+
290+ models = {
291+ 'auth.group': {
292+ 'Meta': {'object_name': 'Group'},
293+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
294+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
295+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
296+ },
297+ 'auth.permission': {
298+ 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
299+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
300+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
301+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
302+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
303+ },
304+ 'auth.user': {
305+ 'Meta': {'object_name': 'User'},
306+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
307+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
308+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
309+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
310+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
311+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
312+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
313+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
314+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
315+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
316+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
317+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
318+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
319+ },
320+ 'contenttypes.contenttype': {
321+ 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
322+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
323+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
324+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
325+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
326+ },
327+ 'opportunities.actionlogentry': {
328+ 'Meta': {'object_name': 'ActionLogEntry'},
329+ 'action': ('django.db.models.fields.TextField', [], {'max_length': '200'}),
330+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
331+ 'opportunity': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['opportunities.Opportunity']", 'blank': 'True'}),
332+ 'timestamp': ('django.db.models.fields.DateTimeField', [], {}),
333+ 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
334+ },
335+ 'opportunities.note': {
336+ 'Meta': {'object_name': 'Note'},
337+ 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
338+ 'date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
339+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
340+ 'opportunity': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['opportunities.Opportunity']"}),
341+ 'text': ('django.db.models.fields.CharField', [], {'max_length': '250'})
342+ },
343+ 'opportunities.opportunity': {
344+ 'Meta': {'object_name': 'Opportunity'},
345+ 'applied': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
346+ 'description': ('django.db.models.fields.TextField', [], {'max_length': '350'}),
347+ 'experience': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
348+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
349+ 'last_updated': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
350+ 'long_description': ('django.db.models.fields.TextField', [], {'max_length': '350', 'null': 'True'}),
351+ 'opportunitylist': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['opportunities.OpportunityList']"}),
352+ 'reviewed': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
353+ 'severity': ('django.db.models.fields.TextField', [], {'max_length': '20', 'null': 'True'}),
354+ 'since': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
355+ 'sourcepackage': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['opportunities.SourcePackage']"}),
356+ 'url': ('django.db.models.fields.URLField', [], {'max_length': '350'}),
357+ 'valid': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'})
358+ },
359+ 'opportunities.opportunitylist': {
360+ 'Meta': {'object_name': 'OpportunityList'},
361+ 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
362+ 'commentable': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
363+ 'description': ('django.db.models.fields.TextField', [], {'max_length': '350'}),
364+ 'experience': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
365+ 'explanation': ('django.db.models.fields.URLField', [], {'max_length': '500', 'null': 'True'}),
366+ 'featured': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
367+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
368+ 'last_updated': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
369+ 'name': ('django.db.models.fields.SlugField', [], {'max_length': '70', 'db_index': 'True'}),
370+ 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'})
371+ },
372+ 'opportunities.packageset': {
373+ 'Meta': {'object_name': 'PackageSet'},
374+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
375+ 'name': ('django.db.models.fields.SlugField', [], {'max_length': '40', 'db_index': 'True'})
376+ },
377+ 'opportunities.sourcepackage': {
378+ 'Meta': {'object_name': 'SourcePackage'},
379+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
380+ 'name': ('django.db.models.fields.SlugField', [], {'max_length': '70', 'db_index': 'True'}),
381+ 'packagesets': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['opportunities.PackageSet']", 'null': 'True', 'symmetrical': 'False'})
382+ }
383+ }
384+
385+ complete_apps = ['opportunities']
386
387=== modified file 'harvest/opportunities/models.py'
388--- harvest/opportunities/models.py 2011-05-02 20:59:38 +0000
389+++ harvest/opportunities/models.py 2011-06-28 14:19:27 +0000
390@@ -85,6 +85,8 @@
391 valid = models.BooleanField(_("Valid"), default=True)
392 experience = models.IntegerField(_("Difficulty"), choices=EXPERIENCE_CHOICES, default=0,
393 help_text=_("Level of experience required for this specific opportunity."))
394+ long_description = models.TextField(_("Long Description"), max_length=350, null=True)
395+ severity = models.TextField(_("Severity"), max_length=20, null=True)
396
397 class Meta:
398 ordering = ['-last_updated']
399
400=== modified file 'harvest/settings.py'
401--- harvest/settings.py 2010-12-22 14:34:12 +0000
402+++ harvest/settings.py 2011-06-28 14:19:27 +0000
403@@ -113,6 +113,7 @@
404 'filters',
405 'services',
406 'common',
407+ 'south',
408 )
409
410 if toolbar_available:
411
412=== modified file 'harvest/templates/opportunities/include/opportunity.html'
413--- harvest/templates/opportunities/include/opportunity.html 2011-05-04 04:14:35 +0000
414+++ harvest/templates/opportunities/include/opportunity.html 2011-06-28 14:19:27 +0000
415@@ -1,7 +1,11 @@
416 {% load i18n %}
417
418 <div class="opportunity-header">
419- <a href="{{opportunity.url}}" class="opportunity-description" target="_blank">{{ opportunity.description }}</a>
420+ {% if opportunity.long_description %}
421+ <a href="{{opportunity.url}}" class="opportunity-long-description" target="_blank">{{ opportunity.long_description }}</a>
422+ {% else %}
423+ <a href="{{opportunity.url}}" class="opportunity-description" target="_blank">{{ opportunity.description }}</a>
424+ {% endif %}
425 <span class="actions">
426 {% if user.is_authenticated %}
427 <a href="{% url opportunity_edit opportunity.id %}?next={{request.get_full_path}}" target="_blank" class="opportunity-edit-button">{% trans 'edit' %}</a>
428
429=== modified file 'harvest/templates/opportunities/opportunity_edit.html'
430--- harvest/templates/opportunities/opportunity_edit.html 2011-05-04 03:22:59 +0000
431+++ harvest/templates/opportunities/opportunity_edit.html 2011-06-28 14:19:27 +0000
432@@ -3,7 +3,14 @@
433
434 {% block extracss %}<link rel="stylesheet" href="{{ MEDIA_URL }}css/opportunities.css" />{% endblock %}
435
436-{% block title %}{{ block.super }}: {{ opportunity.description }}{% endblock %}
437+{% block title %}
438+ {{ block.super }}:
439+ {% if opportunity.long_description %}
440+ {{ opportunity.long_description }}
441+ {% else %}
442+ {{ opportunity.description }}
443+ {% endif %]
444+{% endblock %}
445
446 {% block content %}
447 <h1>Opportunity <a href="{{opportunity.url}}" class="opportunity-description" target="_blank">{{ opportunity.description }}</a> in {% with opportunity.sourcepackage.name as pkgname %}<a href="{% url single_package pkgname %}">{{ pkgname }}</a>{% endwith %}</h1>

Subscribers

People subscribed via source and target branches

to all changes: