Merge lp:~dholbach/harvest/734746 into lp:harvest
- 734746
- Merge into trunk
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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Dylan McCall | Approve | ||
Review via email: mp+66154@code.launchpad.net |
Commit message
Description of the change
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 : | # |
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://
http://
http://
http://
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> |
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 :)