Merge lp:~dylanmccall/harvest/bug-627601 into lp:harvest

Proposed by Dylan McCall
Status: Merged
Merged at revision: 301
Proposed branch: lp:~dylanmccall/harvest/bug-627601
Merge into: lp:harvest
Diff against target: 1885 lines (+799/-705)
16 files modified
harvest/media/css/base.css (+194/-577)
harvest/media/css/opportunities.css (+381/-0)
harvest/media/css/welcome.css (+67/-0)
harvest/media/js/harvest.js (+38/-14)
harvest/templates/404.html (+6/-3)
harvest/templates/500.html (+5/-3)
harvest/templates/base.html (+53/-32)
harvest/templates/index.html (+14/-18)
harvest/templates/one_column.html (+0/-10)
harvest/templates/opportunities/filter.html (+3/-1)
harvest/templates/opportunities/include/filter_results.html (+12/-12)
harvest/templates/opportunities/include/opportunity.html (+2/-0)
harvest/templates/opportunities/include/package.html (+0/-14)
harvest/templates/opportunities/include/package_details.html (+12/-7)
harvest/templates/opportunities/opportunity_edit.html (+6/-8)
harvest/templates/opportunities/single_package.html (+6/-6)
To merge this branch: bzr merge lp:~dylanmccall/harvest/bug-627601
Reviewer Review Type Date Requested Status
Daniel Holbach Approve
Review via email: mp+59876@code.launchpad.net

Description of the change

First, sorry about the now missing merge referring to bug #722947. I ended up using the wrong bug report in the commit, the branch name and the merge request. Decided that was just a little too much wrongness so I started fresh.

This fixes a slightly simpler problem: harvest.js now acts on error messages while doing XHR stuff, fixing bug #627601. This branch depends on the branding change because there was a nearby change in base.html and I didn't want to subject anyone to the merge conflict. If that isn't merged, we can change this fairly quickly.

Since this adds a string people might read, I moved it and another string from harvest.js to base.html so they can be localized neatly with everything else.

Since the server code is invincible (:b), the quickest way to make it fail for testing this is to edit harvest/opportunities/filters.py and add under process_queryset (line 9) something like this:

raise Exception("Disaster!", "Panic!")

This way you'll get a server error when you enable the package name filter. It should look something like this:
http://people.ubuntu.com/~dylanmccall/harvest/bugs/lp627601/Fix-HarvestJsError.png

To post a comment you must log in.
Revision history for this message
Daniel Holbach (dholbach) wrote :

Awesome work!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added file 'harvest/media/css/background-dotted.png'
2Binary files harvest/media/css/background-dotted.png 1970-01-01 00:00:00 +0000 and harvest/media/css/background-dotted.png 2011-05-04 05:59:23 +0000 differ
3=== renamed file 'harvest/media/css/style.css' => 'harvest/media/css/base.css'
4--- harvest/media/css/style.css 2011-05-02 00:20:31 +0000
5+++ harvest/media/css/base.css 2011-05-04 05:59:23 +0000
6@@ -1,10 +1,12 @@
7 body {
8- background-color:rgb(255,255,255);
9- color:rgb(51,51,51);
10-
11- font-family:'Ubuntu', 'UbuntuBeta', 'Bitstream Vera Sans', 'DejaVu Sans', Tahoma, sans-serif;
12- font-size:14px;
13- line-height:1.2em;
14+ background-color:#FFFFFF;
15+ background-image:url('background-dotted.png');
16+ font-family:'Ubuntu', 'Bitstream Vera Sans', 'DejaVu Sans', Tahoma, sans-serif;
17+ font-size:13px;
18+ line-height:1.5em;
19+ color:#333333;
20+ padding:0px 30px;
21+ min-width:600px; /* this is mainly for #results, but applied across the site for consistency */
22 }
23
24 .bottom {
25@@ -12,12 +14,16 @@
26 clear:both;
27 }
28
29+p {
30+ margin-bottom:8px;
31+}
32+
33 strong, b {
34- color:rgb(0,0,0);
35+ color:#000000;
36 font-weight:bold;
37 }
38 small, .small {
39- color:rgb(80,80,80);
40+ color:#505050;
41 font-size:smaller;
42 }
43 em, i {
44@@ -26,97 +32,144 @@
45
46 /* outline selected item for keyboard navigation */
47 *:focus {
48- outline:rgb(244,116,33) dashed 1px;
49+ outline:#dd4814 dashed 1px;
50 }
51 a:active {
52 outline:none;
53 }
54
55 a {
56- color:rgb(110,64,84);
57- text-decoration:inherit;
58+ color:#DD4814;
59 }
60 a:hover,
61 a:focus {
62- /*color:rgb(162,129,143);*/
63 text-decoration:underline;
64 }
65
66 input.placeheld {
67 /* only used in browsers that don't already do placeholder text */
68- color:rgb(180,180,180);
69+ color:#B4B4B4;
70 }
71
72 form label {
73 }
74 form .error input, form .error textarea, form .error input#new_note {
75- border:solid 2px rgb(140,0,0);
76+ border:solid 2px #8C0000;
77 }
78 form ul.errorlist {
79 font-size:smaller;
80- color:rgb(140,0,0);
81+ color:#8C0000;
82 }
83
84
85
86-#container {
87+#wrapper {
88 display:block;
89- position:absolute;
90- width:100%;
91- min-width:600px;
92- min-height:100%;
93+ position:relative;
94+ background-color:#F7F6F5;
95+ z-index:2;
96+
97+ -moz-box-shadow:0px 0px 2px #BBB;
98+ -webkit-box-shadow:0px 0px 2px #BBB;
99+ box-shadow:0px 0px 2px #BBB;
100+ -moz-border-radius:0px 0px 4px 4px;
101+ border-radius:0px 0px 4px 4px;
102 }
103
104
105
106 #header {
107 display:block;
108- width:100%;
109- min-height:80px;
110- padding-top:12px;
111-}
112-
113-#header #sitetitle {
114- display:inline;
115- position:static;
116- margin-left:40px;
117- margin-right:40px;
118- margin-bottom:10px;
119-
120- text-transform:lowercase;
121- text-decoration:none;
122- color:rgb(0,0,0);
123- font-family:'Molengo', 'Ubuntu', 'UbuntuBeta', 'DejaVu Sans', 'Bitstream Vera Sans', sans-serif;
124-}
125-#header #sitetitle #sitelogo {
126- width:auto; /* line up with #sitename font-size */
127+}
128+
129+#extheader {
130+ display:block;
131+ background-color:#FFFFFF;
132+}
133+#extheader > ul {
134+ margin:0px;
135+ padding:0px;
136+ height:20px;
137+ list-style-type:none;
138+ text-align:right;
139+}
140+#extheader > ul > li {
141+ display:inline;
142+ padding:3px 0px;
143+ margin-right:14px;
144+ font-size:10px;
145+ line-height:14px;
146+}
147+#extheader a {
148+ color:#333333;
149+ text-decoration:none;
150+}
151+#extheader a:hover,
152+#extheader a:focus {
153+ text-decoration:underline;
154+}
155+
156+#mainheader {
157+ height:72px;
158+
159+ background-color:#D05630;
160+ background-image:url('orangeheader-stripes.png');
161+ background-repeat:repeat-x;
162+ background-position:top left;
163+ -moz-border-radius:0px 0px 4px 4px;
164+ border-radius:0px 0px 4px 4px;
165+ color:#FFFFFF;
166+
167+ padding:0px 20px;
168+}
169+
170+#mainheader #sitetitle {
171+ display:block;
172+ float:left;
173+ margin-top:24px;
174+
175+ text-transform:lowercase;
176+ text-decoration:none;
177+ color:#FFFFFF;
178+}
179+#mainheader #sitetitle #sitename {
180+ display:inline;
181+ font-size:36px;
182+}
183+#mainheader #sitetitle #releasename {
184+ display:inline;
185+ font-size:12px;
186+ vertical-align:sub;
187+}
188+
189+#mainheader #userdata {
190+ display:block;
191+ float:right;
192+ margin-top:24px;
193+
194+ text-align:right;
195+ font-size:16px;
196+ line-height:24px;
197+}
198+#header #userdata .username {
199+ font-style:italic;
200+}
201+#header #userdata .useraction {
202+}
203+.useraction a {
204+ color:inherit;
205+ text-transform:lowercase;
206+}
207+.useraction > ul {
208+ display:inline;
209+ margin:0px;
210+ padding:0px;
211 height:36px;
212-}
213-#header #sitetitle #sitename {
214- display:inline;
215- position:static;
216-
217- font-size:36px;
218-}
219-#header #sitetitle #releasename {
220- display:inline;
221- position:static;
222-
223- font-size:12px;
224- vertical-align:sub;
225-}
226-
227-#header #userdata {
228- float:right;
229- margin-top:12px;
230- margin-left:40px;
231- margin-right:40px;
232-
233- text-align:right;
234-}
235-#header #userdata .username {
236-}
237-#header #userdata .loginbutton {
238+ list-style-type:none;
239+}
240+.useraction > ul > li {
241+ display:inline;
242+ margin-left:6px;
243 }
244
245 #header > #messages {
246@@ -124,537 +177,101 @@
247 margin:10px 0px;
248 padding:5px 10px;
249 font-size:18px;
250- background-color:rgb(242,151,93);
251- color:rgb(255,255,255);
252+ background-color:#F2975D;
253+ color:#FFFFFF;
254 }
255
256
257-#content {
258+#container {
259 clear:both;
260- padding:0px 20px 140px 20px;
261- padding-bottom:140px;
262-}
263-
264-.sectiontitle {
265- max-width:30em;
266- letter-spacing:-0.1em;
267+ padding:32px 16px 64px 16px;
268+}
269+
270+h1 {
271+ font-size:36px;
272+ line-height:40px;
273+ color:#333333;
274+}
275+#content > h1 {
276+ /* header at top of page */
277+ margin-bottom:32px;
278+ padding:0px 8px;
279+}
280+
281+h1 .subsection {
282+ color:#AEA79F;
283+}
284+
285+h2 {
286 font-size:24px;
287- margin-bottom:12px;
288- color:rgb(80,80,80);
289-}
290-
291-#content > .one_column {
292- max-width:60em;
293-}
294-
295-
296-
297-
298-#content_welcome > #start {
299- display:table-cell;
300- padding-right:60px;
301- padding-bottom:60px;
302- width:400px;
303- min-width:300px;
304-}
305-
306-#content_welcome #introduction {
307+ line-height:28px;
308+ margin-bottom:32px;
309+ padding:0px 8px;
310+ color:#333333;
311+}
312+
313+h3 {
314 font-size:16px;
315- line-height:1.2em;
316+ line-height:20px;
317+ font-weight:normal;
318+ color:#333333;
319+ margin-top:16px;
320+ margin-bottom:8px;
321 }
322
323-#content_welcome #start_links {
324- margin:20px 0px 10px 0px;
325-}
326-#content_welcome #start_links a {
327- display:inline-block;
328- padding:8px 10px;
329- background-color:rgb(221,72,20);
330- border:rgb(229,116,77) solid 2px;
331+#content .main {
332+ display:block;
333+ padding:8px 16px;
334+ background-color:#FFFFFF;
335+ -moz-box-shadow:0px 1px 2px #CCC;
336+ -webkit-box-shadow:0px 1px 2px #CCC;
337+ box-shadow:0px 1px 2px #CCC;
338 -moz-border-radius:4px;
339- border-radius:4px; /* round border on bottom as well */
340-
341- font-size:20px;
342- color:rgb(255,255,255);
343-}
344-#content_welcome #start_links a:hover,
345-#content_welcome #start_links a:focus {
346- background-color:rgb(184,58,15);
347- border-color:rgb(173,83,52);
348-}
349-
350-#content_welcome #statistics {
351- font-size:10px;
352- color:rgb(180,180,180);
353-}
354-#content_welcome #statistics * {
355- font-style:italic;
356-}
357-
358-#content_welcome #faq {
359- display:table-cell;
360- width:430px;
361- min-width:430px;
362- color:rgb(80,80,80);
363-}
364-
365-#faq > div {
366- display:table-cell;
367- width:200px;
368- padding-right:15px;
369-}
370-
371-#faq li {
372- margin-bottom:2em;
373-}
374-#faq .question {
375- font-weight:bold;
376- font-style:italic;
377-}
378-
379-
380-
381-#filters {
382- display:block;
383- position:relative;
384- float:left;
385- min-width:160px;
386-
387- padding-right:20px;
388- font-size:12px;
389- line-height:1.4em;
390- color:rgb(51,51,51);
391-}
392-#filters ul {
393- display:block;
394- margin-left:20px;
395- width:100%;
396-}
397-#filters ul li {
398- display:block;
399- width:100%;
400-}
401-
402-
403-#filters a.item-toggle {
404- display:inline-block;
405- height:100%;
406-
407- color:inherit;
408- text-decoration:inherit;
409- font-style:inherit;
410-}
411-
412-#filters .checkbox {
413- /* checkbox element should always be the same size */
414- display:inline-block;
415- width:12px;
416- color:inherit;
417-}
418-
419-#filters .setfilter > .filter-value > ul > li:not([data-selected]) > .filter > .filter-value {
420- /* parent filter is turned off */
421- color:rgb(140,140,140);
422-}
423-
424-#filters .setfilter > .filter-value > ul > li.prelight-off > .checkbox {
425- /* prelight for an item about to be deselected */
426- color:rgb(140,140,140);
427- text-decoration:line-through;
428-}
429-#filters .setfilter > .filter-value > ul > li.prelight-on > .checkbox {
430- /* prelight for an item about to be selected */
431- color:inherit;
432-}
433-
434-#filters .setfilter > .filter-value > ul > li.prelight-off > .filter > .filter-value {
435- /* parent filter is about to be turned off */
436- color:rgb(140,140,140);
437-}
438-#filters .setfilter > .filter-value > ul > li.prelight-on > .filter > .filter-value {
439- /* parent filter is about to be turned on */
440- color:inherit;
441-}
442-
443-
444-
445-#filters > .filtergroup {
446- /* a top-level filter group */
447- display:block;
448- margin-bottom:4em;
449-}
450-#filters > .filtergroup > .filter-label {
451- /* titles for groups of filters ("Packages" and "Opportunities") */
452- display:block;
453- margin-bottom:8px;
454- letter-spacing:-0.1em;
455- color:rgb(80,80,80);
456- font-size:16px;
457-}
458-#filters > .filtergroup > .filter-value > ul {
459- margin-left:0px;
460-}
461-#filters > .filtergroup > .filter-value > ul > li {
462- margin-bottom:5px;
463-}
464-
465-#filters > .filtergroup > .filter-value > ul > li a.help {
466- vertical-align:top;
467- margin-left:1em;
468- font-weight:bold;
469-}
470-
471-#filters .editfilter input {
472- width:8em;
473- border:none;
474- border-bottom:1px solid rgb(180,180,180);
475-
476- padding:0px 2px 0px 2px;
477- background-color:inherit;
478- color:inherit;
479- font:inherit;
480-}
481-#filters .editfilter input.placeheld {
482- color:rgb(180,180,180);
483-}
484-
485-
486-
487-#results-pane {
488- display:block;
489- min-width:250px;
490- max-width:1000px;
491- overflow:auto;
492-}
493-
494-#results-pane > #results-status {
495- position:relative;
496- display:none;
497- z-index:10;
498- text-align:center;
499- background-image:url('results-status-shadow.png');
500- background-repeat:repeat-x;
501-}
502-#results-pane > #results-status > div {
503- min-height:30px; /* lines up height of #results-status background-image */
504-}
505-
506-#results > .results-message {
507- margin:2em auto;
508- padding-left:20px;
509- max-width:30em;
510-
511- text-align:justify;
512- font-size:24px;
513- line-height:1.5em;
514- color:rgb(180,180,180);
515-}
516-
517-#results > ul {
518- margin-left:20px;
519- margin-bottom:10px;
520-}
521-
522-.sourcepackage {
523- display:block;
524- font-size:14px;
525- line-height:21px;
526-}
527-li.sourcepackage {
528- margin-top:5px;
529- margin-bottom:10px;
530- border:1px solid rgb(200,200,200);
531- -moz-border-radius:3px;
532- border-radius:3px; /* round border on bottom as well */
533-}
534-.sourcepackage > .sourcepackage-header {
535- display:block;
536- padding:8px 20px 8px 20px;
537-}
538-li.sourcepackage > .sourcepackage-header {
539- -moz-border-radius:3px 3px 0px 0px;
540- border-radius:3px 3px 0px 0px; /* lines up with li.sourcepackage's border */
541-}
542-a.sourcepackage-header {
543- color:inherit;
544- text-decoration:none;
545-}
546-.sourcepackage-header > .sourcepackage-name {
547- display:inline;
548- margin-right:10px;
549- color:rgb(0,0,0);
550- font-size:16px;
551-}
552-.sourcepackage-header > .status {
553- display:none; /* harvest.js will override this where necessary */
554-}
555-.sourcepackage-header > .status img {
556- width:16px;
557- height:16px;
558-}
559-.sourcepackage-header > .sourcepackage-summary {
560- display:inline;
561- float:right;
562- text-align:right;
563- font-size:10px;
564-}
565-/* prelights */
566-a.sourcepackage-header:hover,
567-a.sourcepackage-header:focus {
568- background-color:rgb(240,255,243);
569-}
570-a.sourcepackage-header:hover .sourcepackage-name,
571-a.sourcepackage-header:focus .sourcepackage-name {
572- text-decoration:underline;
573-}
574-
575-.sourcepackage-details {
576- display:block;
577- /* inner padding should be left:20px, right:20px and bottom:5px */
578-}
579-
580-/* collapsed state. (expanded is the default) */
581-li.sourcepackage.collapsed {
582- margin-bottom:5px;
583- border-color:rgb(250,250,250);
584- -moz-border-radius:3px 3px 0px 0px;
585- border-radius:3px 3px 0px 0px;
586-}
587-.sourcepackage.collapsed > .sourcepackage-details {
588- display:none;
589-}
590-
591-.sourcepackage-details > .extra {
592- margin-top:20px;
593- padding:2px 20px 2px 20px;
594- color:rgb(80,80,80);
595- font-size:12px;
596- border-top:1px solid rgb(250,250,250);
597- /*background-color:rgb(200,200,200);*/
598-}
599-.sourcepackage-details > .extra > .actions {
600- float:right;
601- text-align:right;
602- text-transform:lowercase;
603-}
604-.sourcepackage-details > .extra > .actions > a {
605- margin:0px 0.25em;
606-}
607-
608-
609-li.sourcepackage > .sourcepackage-details > .opportunity-list {
610- padding-left:20px;
611- margin-bottom:5px;
612-}
613-
614-.opportunity-list > .opportunity-list-title {
615- display:block;
616- color:rgb(80,80,80);
617- font-size:12px;
618- letter-spacing:-0.1em;
619-}
620-.opportunity-list > .opportunity-list-title > .opportunity-list-summary {
621- margin-left:5px;
622-}
623-
624-.opportunity-list > ul {
625- margin-bottom:10px;
626- padding-left:20px;
627- list-style-image:url('opportunity-normal.png');
628-}
629-li.opportunity {
630- padding:2px 20px 8px 5px;
631-}
632-li.opportunity:hover {
633- background-color:rgb(250,250,250);
634-}
635-li.opportunity[data-opportunity-experience='1'] {
636- list-style-image:url('opportunity-experience-1.png');
637-}
638-li.opportunity[data-opportunity-experience='2'] {
639- list-style-image:url('opportunity-experience-2.png');
640-}
641-li.opportunity[data-opportunity-experience='3'] {
642- list-style-image:url('opportunity-experience-3.png');
643-}
644-
645-.opportunity > .opportunity-header {
646- display:block;
647- line-height:1em;
648-}
649-.opportunity[data-opportunity-irrelevant] > .opportunity-header > .opportunity-description,
650-.opportunity[data-opportunity-applied] > .opportunity-header > .opportunity-description {
651- text-decoration:line-through;
652-}
653-.opportunity-header > a.opportunity-description {
654- color:rgb(0,0,0);
655- font-size:16px;
656-}
657-.opportunity-header > .actions {
658- float:right;
659- text-align:right;
660- font-size:12px;
661- text-transform:lowercase;
662-}
663-li.opportunity > .opportunity-header > .actions {
664- opacity:0.1; /* color:rgb(241,236,238) */
665-}
666-li.opportunity:hover > .opportunity-header > .actions {
667- opacity:1;
668-}
669-.opportunity-goaway-button {
670- font-size:10px;
671-}
672-.opportunity-header > .opportunity-summary {
673- margin-left:10px;
674- color:rgb(180,180,180);
675- font-size:12px;
676- text-transform:lowercase;
677-}
678-
679-li.opportunity > .opportunity-details {
680- display:block;
681- margin-left:10px;
682-}
683-li.opportunity > .opportunity-details.edit {
684- background-color:rgb(255,255,240);
685-}
686-
687-.opportunity-notes {
688- display:block;
689- width:100%;
690- max-width:35em;
691- font-size:12px;
692- line-height:1em;
693-}
694-.opportunity-notes input#new_note {
695- width:100%;
696- border:none;
697- border-bottom:1px solid rgb(180,180,180);
698-
699- padding:2px 5px;
700- background-color:inherit;
701- color:inherit;
702- font:inherit;
703-}
704-.opportunity-notes > ul {
705- margin:10px 5px;
706- max-height:10em;
707-}
708-.opportunity-notes > ul > li {
709- margin-bottom:1em;
710-}
711-.opportunity-notes > ul > li:last-child {
712- margin-bottom:0em;
713-}
714-.opportunity-notes > ul > li > .signature {
715- display:inline-block;
716- margin-left:1em;
717- vertical-align:sub;
718- color:rgb(80,80,80);
719- font-style:italic;
720- font-size:10px;
721-}
722-
723-
724-
725-.opportunity-details.edit > form > div.opportunity-notes {
726- float:left;
727- margin-right:4em;
728- margin-bottom:2em;
729-}
730-
731-.opportunity-details.edit > form > ul.opportunity-switches {
732- float:left;
733-}
734-.opportunity-details.edit > form > ul.opportunity-switches > li {
735- white-space:nowrap;
736- margin-bottom:0.5em;
737-}
738-.opportunity-details.edit > form > ul.opportunity-switches > li.separate-top {
739- margin-bottom:2em;
740-}
741-
742-.opportunity-details.edit > form > .actions {
743- clear:both;
744- padding-top:1em;
745-}
746-
747-
748+ border-radius:4px;
749+}
750
751 #footer {
752 display:block;
753- position:absolute;
754- left:0px;
755- right:0px;
756- bottom:0px;
757- min-height:100px;
758-
759- overflow:visible;
760- background-image:url('footer-pattern.png');
761- background-position:left bottom;
762- background-repeat:repeat-x;
763-
764- padding-left:32px;
765- padding-right:32px;
766+ position:relative;
767+ z-index:1;
768+ padding:16px;
769+ background-color:#F7F6F5;
770 }
771+
772 #footnav {
773 display:block;
774- height:20px;
775-
776- padding:2px;
777- white-space:nowrap;
778- background-color:rgb(255,255,255);
779- font-size:16px;
780+ font-size:14px;
781+ line-height:16px;
782+ padding-bottom:40px;
783+}
784+#footnav > ul {
785+ display:block;
786+ margin-bottom:16px;
787+ padding:0px;
788+ list-style-type:none;
789+}
790+#footnav > ul > li {
791+ display:inline;
792+ padding:0px;
793+ margin-right:14px;
794+}
795+#footnav > ul > li.toplevel {
796+ font-weight:bold;
797 }
798 #footnav a {
799- margin-left:1em;
800- margin-right:1em;
801- color:rgb(0,0,0);
802-}
803-#footnav a:last-child {
804-}
805-#footnav .title {
806- margin-left:0em;
807- margin-right:4em;
808+ color:#333333;
809 text-decoration:none;
810+ font-weight:inherit;
811+}
812+#footnav a:hover,
813+#footnav a:focus {
814+ text-decoration:underline;
815 }
816
817-#smallprint {
818- margin-top:40px;
819- bottom:3px;
820- left:8px;
821- right:8px;
822-
823- color:rgb(120,120,120);
824+#footer #copyright,
825+#footer #techdetails {
826+ margin:8px 0px;
827 font-size:10px;
828- line-height:1.2em;
829-}
830-#smallprint #techdetails,
831-#smallprint #copyright {
832- max-width:200px;
833-
834- padding:5px;
835- overflow:hidden;
836- white-space:nowrap;
837- text-overflow:ellipsis;
838- background-color:rgb(255,255,255);
839-}
840-#smallprint:hover #techdetails,
841-#smallprint:hover #copyright,
842-#smallprint:focus #techdetails,
843-#smallprint:focus #copyright {
844- max-width:none;
845- overflow:visible;
846-}
847-#smallprint #copyright {
848- float:left;
849-
850- text-align:left;
851-}
852-#smallprint #techdetails {
853- float:right;
854-
855- text-align:right;
856- text-transform:lowercase;
857+ line-height:14px;
858+ color:#AEA79F;
859 }
860
861=== added file 'harvest/media/css/opportunities.css'
862--- harvest/media/css/opportunities.css 1970-01-01 00:00:00 +0000
863+++ harvest/media/css/opportunities.css 2011-05-04 05:59:23 +0000
864@@ -0,0 +1,381 @@
865+#filters {
866+ display:block;
867+ position:relative;
868+ float:left;
869+ min-width:160px;
870+
871+ padding-right:16px;
872+ font-size:12px;
873+ line-height:1.4em;
874+ color:#333333;
875+}
876+#filters ul {
877+ display:block;
878+ margin-left:16px;
879+ width:100%;
880+}
881+#filters ul li {
882+ display:block;
883+ width:100%;
884+}
885+
886+
887+#filters a.item-toggle {
888+ display:inline-block;
889+ height:100%;
890+
891+ color:inherit;
892+ text-decoration:inherit;
893+ font-style:inherit;
894+}
895+
896+#filters .checkbox {
897+ /* checkbox element should always be the same size */
898+ display:inline-block;
899+ width:12px;
900+ color:inherit;
901+}
902+
903+#filters .setfilter > .filter-value > ul > li:not([data-selected]) > .filter > .filter-value {
904+ /* parent filter is turned off */
905+ color:#8C8C8C;
906+}
907+
908+#filters .setfilter > .filter-value > ul > li.prelight-off > .checkbox {
909+ /* prelight for an item about to be deselected */
910+ color:#8C8C8C;
911+ text-decoration:line-through;
912+}
913+#filters .setfilter > .filter-value > ul > li.prelight-on > .checkbox {
914+ /* prelight for an item about to be selected */
915+ color:inherit;
916+}
917+
918+#filters .setfilter > .filter-value > ul > li.prelight-off > .filter > .filter-value {
919+ /* parent filter is about to be turned off */
920+ color:#8C8C8C;
921+}
922+#filters .setfilter > .filter-value > ul > li.prelight-on > .filter > .filter-value {
923+ /* parent filter is about to be turned on */
924+ color:inherit;
925+}
926+
927+
928+
929+#filters > .filtergroup {
930+ /* a top-level filter group */
931+ display:block;
932+ margin-bottom:32px;
933+}
934+#filters > .filtergroup > .filter-label {
935+ /* titles for groups of filters ("Packages" and "Opportunities") */
936+ display:block;
937+ margin-bottom:8px;
938+ letter-spacing:-0.1em;
939+ color:#505050;
940+ font-size:16px;
941+}
942+#filters > .filtergroup > .filter-value > ul {
943+ margin-left:0px;
944+}
945+#filters > .filtergroup > .filter-value > ul > li {
946+ margin-bottom:5px;
947+}
948+
949+#filters > .filtergroup > .filter-value > ul > li a.help {
950+ vertical-align:top;
951+ margin-left:8px;
952+ font-weight:bold;
953+}
954+
955+#filters .editfilter input {
956+ width:8em;
957+ border:none;
958+ border-bottom:1px solid #ccc1c1;
959+ padding:0px 2px 0px 2px;
960+ background-color:inherit;
961+ color:#333333;
962+ font:inherit;
963+}
964+#filters .editfilter input:focus {
965+ outline:2px solid #dd4814;
966+}
967+#filters .editfilter input.placeheld {
968+ color:#B4B4B4;
969+}
970+
971+
972+
973+#results-wrapper {
974+ position:relative;
975+ display:block;
976+ overflow:auto;
977+}
978+
979+#results-status {
980+ position:relative;
981+ width:100%;
982+ display:none;
983+ margin-top:8px;
984+ z-index:10;
985+ text-align:center;
986+ background-image:url('results-status-shadow.png');
987+ background-repeat:repeat-x;
988+}
989+#results-status > div {
990+ min-height:19px; /* lines up height of #results-status background-image */
991+}
992+
993+#results {
994+ padding:8px;
995+}
996+
997+#results > .results-message {
998+ display:block;
999+ margin-bottom:12px;
1000+ text-align:center;
1001+ font-size:16px;
1002+ line-height:24px;
1003+ color:#AEA79F;
1004+}
1005+
1006+#results > ul {
1007+ margin-left:0px;
1008+ margin-bottom:10px;
1009+}
1010+
1011+#results > .results-footnote {
1012+ display:block;
1013+ font-style:italic;
1014+ padding:8px 16px;
1015+}
1016+
1017+
1018+.sourcepackage {
1019+ display:block;
1020+ font-size:14px;
1021+ line-height:21px;
1022+}
1023+li.sourcepackage {
1024+ margin-top:5px;
1025+ margin-bottom:10px;
1026+ border-bottom:1px dotted #CCC;
1027+}
1028+.sourcepackage > .sourcepackage-header {
1029+ display:block;
1030+ padding:8px 16px;
1031+}
1032+li.sourcepackage > .sourcepackage-header {
1033+ -moz-border-radius:3px 3px 0px 0px;
1034+ border-radius:3px 3px 0px 0px; /* lines up with li.sourcepackage's border */
1035+}
1036+a.sourcepackage-header {
1037+ color:inherit;
1038+ text-decoration:none;
1039+}
1040+.sourcepackage-header > .sourcepackage-name {
1041+ display:inline;
1042+ margin-right:10px;
1043+ color:#000000;
1044+ font-size:16px;
1045+}
1046+.sourcepackage-header > .status {
1047+ display:none; /* harvest.js will override this where necessary */
1048+}
1049+.sourcepackage-header > .status img {
1050+ width:16px;
1051+ height:16px;
1052+}
1053+.sourcepackage-header > .sourcepackage-summary {
1054+ display:inline;
1055+ float:right;
1056+ text-align:right;
1057+ font-size:10px;
1058+}
1059+
1060+.sourcepackage-details {
1061+ display:block;
1062+ padding:0px 16px 4px 16px;
1063+}
1064+
1065+/* collapsed state. (expanded is the default) */
1066+li.sourcepackage.collapsed {
1067+ margin-bottom:5px;
1068+ border-color:#FAFAFA;
1069+ box-shadow:none;
1070+ -moz-border-radius:3px 3px 0px 0px;
1071+ border-radius:3px 3px 0px 0px;
1072+}
1073+.sourcepackage.collapsed > .sourcepackage-details {
1074+ display:none;
1075+}
1076+
1077+/* prelights */
1078+.sourcepackage.expanded > a.sourcepackage-header,
1079+.sourcepackage > a.sourcepackage-header:hover,
1080+.sourcepackage > a.sourcepackage-header:focus {
1081+ background-image:url('sourcepackage-header-stripes.png');
1082+ background-color:#DDDDDD;
1083+}
1084+a.sourcepackage-header:hover .sourcepackage-name,
1085+a.sourcepackage-header:focus .sourcepackage-name {
1086+ text-decoration:underline;
1087+}
1088+
1089+.sourcepackage-details > .extra {
1090+}
1091+.sourcepackage-details > .extra > .actions {
1092+ float:right;
1093+ text-align:right;
1094+ text-transform:lowercase;
1095+ color:#000000;
1096+ font-size:12px;
1097+}
1098+.sourcepackage-details > .extra > .actions > a {
1099+ margin:0px 16px;
1100+}
1101+
1102+.opportunity-list > .opportunity-list-title {
1103+ display:block;
1104+ color:#505050;
1105+ font-size:12px;
1106+ letter-spacing:-0.1em;
1107+}
1108+.opportunity-list > .opportunity-list-title > .opportunity-list-summary {
1109+ margin-left:5px;
1110+}
1111+
1112+.opportunity-list > ul {
1113+ margin-bottom:8px;
1114+ padding-left:16px;
1115+ list-style-image:url('opportunity-normal.png');
1116+}
1117+li.opportunity {
1118+ padding:4px 16px 4px 4px;
1119+}
1120+li.opportunity:hover {
1121+ background-color:#FAFAFA;
1122+}
1123+li.opportunity[data-opportunity-experience='1'] {
1124+ list-style-image:url('opportunity-experience-1.png');
1125+}
1126+li.opportunity[data-opportunity-experience='2'] {
1127+ list-style-image:url('opportunity-experience-2.png');
1128+}
1129+li.opportunity[data-opportunity-experience='3'] {
1130+ list-style-image:url('opportunity-experience-3.png');
1131+}
1132+
1133+.opportunity > .opportunity-header {
1134+ display:block;
1135+ line-height:1em;
1136+}
1137+.opportunity[data-opportunity-irrelevant] > .opportunity-header > .opportunity-description,
1138+.opportunity[data-opportunity-applied] > .opportunity-header > .opportunity-description {
1139+ text-decoration:line-through;
1140+}
1141+.opportunity-header > a.opportunity-description {
1142+ color:#000000;
1143+ font-size:16px;
1144+}
1145+.opportunity-header > .actions {
1146+ float:right;
1147+ text-align:right;
1148+ font-size:12px;
1149+ text-transform:lowercase;
1150+}
1151+li.opportunity > .opportunity-header > .actions {
1152+ opacity:0.4; /* color:#F1ECEE */
1153+}
1154+li.opportunity:hover > .opportunity-header > .actions {
1155+ opacity:1;
1156+}
1157+.opportunity-goaway-button {
1158+ font-size:10px;
1159+}
1160+.opportunity-header > .opportunity-summary {
1161+ margin-left:10px;
1162+ color:#707070;
1163+ font-size:12px;
1164+ text-transform:lowercase;
1165+}
1166+
1167+li.opportunity > .opportunity-details {
1168+ display:block;
1169+ margin-left:10px;
1170+}
1171+li.opportunity > .opportunity-details.edit {
1172+ background-color:#FFFFF0;
1173+}
1174+
1175+.opportunity-notes {
1176+ display:block;
1177+ width:100%;
1178+ max-width:35em;
1179+ font-size:12px;
1180+ line-height:1em;
1181+}
1182+.opportunity-notes input#new_note {
1183+ width:100%;
1184+ border:none;
1185+ border-bottom:1px solid #B4B4B4;
1186+
1187+ padding:2px 5px;
1188+ background-color:inherit;
1189+ color:inherit;
1190+ font:inherit;
1191+}
1192+.opportunity-notes > ul {
1193+ margin:10px 5px;
1194+ max-height:10em;
1195+}
1196+.opportunity-notes > ul > li {
1197+ margin-bottom:1em;
1198+}
1199+.opportunity-notes > ul > li:last-child {
1200+ margin-bottom:0em;
1201+}
1202+.opportunity-notes > ul > li > .signature {
1203+ display:inline-block;
1204+ margin-left:1em;
1205+ vertical-align:sub;
1206+ color:#505050;
1207+ font-style:italic;
1208+ font-size:10px;
1209+}
1210+
1211+
1212+
1213+.opportunity-details.edit > form > div.opportunity-notes {
1214+ float:left;
1215+ margin-right:4em;
1216+ margin-bottom:2em;
1217+}
1218+
1219+.opportunity-details.edit > form > ul.opportunity-switches {
1220+ float:left;
1221+}
1222+.opportunity-details.edit > form > ul.opportunity-switches > li {
1223+ white-space:nowrap;
1224+ margin-bottom:0.5em;
1225+}
1226+.opportunity-details.edit > form > ul.opportunity-switches > li.separate-top {
1227+ margin-bottom:2em;
1228+}
1229+
1230+.opportunity-details.edit > form > .actions {
1231+ clear:both;
1232+ padding-top:1em;
1233+}
1234+
1235+
1236+
1237+.main#results-wrapper {
1238+ max-width:1000px;
1239+}
1240+.main.sourcepackage-details {
1241+ max-width:1000px;
1242+}
1243+.main.opportunity-details {
1244+ max-width:1000px;
1245+}
1246
1247=== added file 'harvest/media/css/orangeheader-stripes.png'
1248Binary files harvest/media/css/orangeheader-stripes.png 1970-01-01 00:00:00 +0000 and harvest/media/css/orangeheader-stripes.png 2011-05-04 05:59:23 +0000 differ
1249=== added file 'harvest/media/css/sourcepackage-header-stripes.png'
1250Binary files harvest/media/css/sourcepackage-header-stripes.png 1970-01-01 00:00:00 +0000 and harvest/media/css/sourcepackage-header-stripes.png 2011-05-04 05:59:23 +0000 differ
1251=== added file 'harvest/media/css/welcome.css'
1252--- harvest/media/css/welcome.css 1970-01-01 00:00:00 +0000
1253+++ harvest/media/css/welcome.css 2011-05-04 05:59:23 +0000
1254@@ -0,0 +1,67 @@
1255+#welcome {
1256+ padding:16px;
1257+ max-width:1000px;
1258+}
1259+
1260+#welcome #start {
1261+ display:table;
1262+}
1263+
1264+#welcome #introduction {
1265+ display:table-cell;
1266+ width:100%;
1267+ font-size:16px;
1268+ line-height:1.2em;
1269+ padding:8px;
1270+}
1271+#welcome #introduction p {
1272+ max-width:400px;
1273+}
1274+
1275+#welcome #statistics {
1276+ display:table-cell;
1277+ text-align:right;
1278+ min-width:250px;
1279+ padding:8px 8px 32px 8px;
1280+ font-size:10px;
1281+ color:#B4B4B4;
1282+}
1283+
1284+#start_links {
1285+ margin:20px 0px 10px 0px;
1286+}
1287+#start_links a {
1288+ display:inline-block;
1289+ padding:8px 10px;
1290+ background-color:#DD4814;
1291+ border:#E5744D solid 2px;
1292+ -moz-border-radius:4px;
1293+ border-radius:4px; /* round border on bottom as well */
1294+
1295+ font-size:20px;
1296+ color:#FFFFFF;
1297+}
1298+#start_links a:hover,
1299+#start_links a:focus {
1300+ background-color:#B83A0F;
1301+ border-color:#AD5334;
1302+}
1303+
1304+#welcome #faq {
1305+ display:table;
1306+ margin:16px 0px;
1307+ color:#505050;
1308+}
1309+
1310+#welcome #faq ul {
1311+ display:table-row;
1312+}
1313+
1314+#welcome #faq li {
1315+ display:table-cell;
1316+ margin:16px;
1317+ padding:8px 8px 32px 8px;
1318+}
1319+#welcome #faq .question {
1320+ font-weight:bold;
1321+}
1322
1323=== modified file 'harvest/media/js/harvest.js'
1324--- harvest/media/js/harvest.js 2010-08-12 05:42:46 +0000
1325+++ harvest/media/js/harvest.js 2011-05-04 05:59:23 +0000
1326@@ -158,6 +158,14 @@
1327 }
1328 }
1329
1330+ this.force_disable = function () {
1331+ /* Tells the parent (if there is one) to disable this item. */
1332+ parent_filter = this.get_parent_filtergroup();
1333+ if ( parent_filter && parent_filter.item_is_selected(this.container) ) {
1334+ parent_filter.disable_item(this.container);
1335+ }
1336+ }
1337+
1338
1339 /* Callback functions */
1340 this.enabled = function() {} /* called when this filter is enabled */
1341@@ -290,9 +298,15 @@
1342 var edit_field = this.value_node.children('input');
1343
1344
1345- this.edit_field_changed = function() {
1346- this.force_enable();
1347- this.value_changed();
1348+ this.edit_field_changed = function(event) {
1349+ if (event.target.value == "") {
1350+ /* Automatically disable when input is cleared. */
1351+ /* This may cause a problem with some filters in the future */
1352+ filter.force_disable();
1353+ } else {
1354+ filter.force_enable();
1355+ }
1356+ filter.value_changed();
1357 }
1358
1359 this.get_value_serialized = function () {
1360@@ -304,7 +318,7 @@
1361 }
1362
1363 /* we could handle 'change' instead of 'input' to only check value when typing has stopped */
1364- edit_field.bind('input', function () { filter.edit_field_changed(); } );
1365+ edit_field.bind('input', filter.edit_field_changed);
1366 }
1367
1368
1369@@ -436,7 +450,7 @@
1370
1371
1372 function Results (dom_node) {
1373- /* Attached to the single #results-pane in the document. Receives
1374+ /* Attached to the single #results-wrapper in the document. Receives
1375 new query parameters from Filter objects, grabs and displays new
1376 results in the contained #results element. */
1377
1378@@ -456,8 +470,8 @@
1379 this.future_query = {};
1380
1381 this.container = $(dom_node);
1382- this.output = $(dom_node).children('#results');
1383- this.status_bubble = $(dom_node).children('#results-status');
1384+ this.output = $('#results');
1385+ this.status_bubble = $('#results-status');
1386
1387 this.packages = {};
1388 this.expanded_pkgs = [];
1389@@ -552,6 +566,13 @@
1390 complete: function (xhr, status) {
1391 results.hide_status('loading');
1392 results.loading_xhr = null;
1393+
1394+ /* display statistics in the footer */
1395+ time_header = xhr.getResponseHeader('X-Django-Request-Time')
1396+ if (time_header) {
1397+ var time = parseFloat(time_header).toFixed(2);
1398+ $('#requeststats').html(HARVEST_REQUEST_RESULTS_TIME.replace("%d", time));
1399+ }
1400 },
1401 success: function (data, status, xhr) {
1402 /* We have to work around this jquery bug: http://dev.jquery.com/ticket/6173
1403@@ -562,14 +583,17 @@
1404 results.current_query = load_query;
1405 results.future_query = {};
1406 results.update_packages();
1407-
1408- /* display statistics in the footer */
1409- time_header = xhr.getResponseHeader('X-Django-Request-Time')
1410- if (time_header) {
1411- $('#requeststats').html('Results generated in '+parseFloat(time_header).toFixed(2) + ' seconds');
1412- }
1413 }
1414 },
1415+ error: function (xhr, status, error) {
1416+ /* Whatever the error was, tell the user */
1417+ /* FIXME: we need to translate this string */
1418+ var results_message = $(document.createElement('div'));
1419+ results_message.addClass('results-message');
1420+ results_message.text(HARVEST_REQUEST_ERROR_MESSAGE);
1421+ results.output.html("");
1422+ results.output.append(results_message);
1423+ },
1424 });
1425 }
1426
1427@@ -656,7 +680,7 @@
1428 }
1429
1430 function create_results () {
1431- return new Results($('#results-pane'));
1432+ return new Results($('#results-wrapper'));
1433 }
1434
1435
1436
1437=== modified file 'harvest/templates/404.html'
1438--- harvest/templates/404.html 2009-09-13 15:20:17 +0000
1439+++ harvest/templates/404.html 2011-05-04 05:59:23 +0000
1440@@ -2,9 +2,12 @@
1441
1442 {% load i18n %}
1443
1444-{% block title %}{% trans "Page Not Found" %} - {{ block.super }}{% endblock %}
1445+{% block title %}{{ block.super }}: {% trans "Page Not Found" %}{% endblock %}
1446
1447 {% block content %}
1448- <h2>{% trans "Page Not Found" %}</h2>
1449- <p>{% trans "The requested page could not be found." %}</p>
1450+<h1>{% trans "Page Not Found" %}</h1>
1451+<div class="main">
1452+ <p>{% blocktrans %}The page you requested could not be found.</p>
1453+ <p>If you were linked here from somewhere else, chances are you're looking for the <a href="/opportunities">opportunities browser</a>.{% endblocktrans %}</p>
1454+</div>
1455 {% endblock %}
1456
1457=== modified file 'harvest/templates/500.html'
1458--- harvest/templates/500.html 2009-09-13 15:20:17 +0000
1459+++ harvest/templates/500.html 2011-05-04 05:59:23 +0000
1460@@ -2,9 +2,11 @@
1461
1462 {% load i18n %}
1463
1464-{% block title %}{% trans "Server Error" %} - {{ block.super }}{% endblock %}
1465+{% block title %}{{ block.super }}: {% trans "Server Error" %}{% endblock %}
1466
1467 {% block content %}
1468- <h2>{% trans "Server Error" %}</h2>
1469- <p>{% trans "A server error has occurred." %}</p>
1470+<h1>{% trans "Server Error" %}</h1>
1471+<div class="main">
1472+ <p>{% blocktrans %}A server error has occurred.{% endblocktrans %}</p>
1473+</div>
1474 {% endblock %}
1475
1476=== modified file 'harvest/templates/base.html'
1477--- harvest/templates/base.html 2010-10-18 10:01:45 +0000
1478+++ harvest/templates/base.html 2011-05-04 05:59:23 +0000
1479@@ -8,10 +8,15 @@
1480
1481 <link rel="stortcut icon" href="{{ MEDIA_URL }}img/favicon.ico" type="image/x-icon" />
1482
1483- <link href='http://fonts.googleapis.com/css?family=Molengo' rel='stylesheet' type='text/css' />
1484-
1485 <link rel="stylesheet" href="{{ MEDIA_URL }}css/reset.css" />
1486- <link rel="stylesheet" href="{{ MEDIA_URL }}css/style.css" />
1487+ <link rel="stylesheet" href="{{ MEDIA_URL }}css/base.css" />
1488+ {% block extracss %}{% endblock %}
1489+
1490+ <script type="text/javascript">
1491+ /* Localized strings for harvest.js */
1492+ var HARVEST_REQUEST_RESULTS_TIME = "{% trans 'Results generated in %d seconds' %}";
1493+ var HARVEST_REQUEST_ERROR_MESSAGE = "{% trans 'An error has occurred getting new results' %}";
1494+ </script>
1495
1496 <script type="text/javascript" src="{{ MEDIA_URL }}js/jquery-1.4.2.min.js"></script>
1497 <script type="text/javascript" src="{{ MEDIA_URL }}js/jquery-ui-effects-1.8.2.min.js"></script>
1498@@ -23,24 +28,36 @@
1499 </head>
1500
1501 <body>
1502-<div id="container">
1503+
1504+<div id="wrapper">
1505
1506 <div id="header">
1507- <a id="sitetitle" href="{% url home %}" class="quiet">
1508- <img id="sitelogo" src="{{ MEDIA_URL }}img/logo_humanity-search-icon.png" />
1509- <h1 id="sitename">{% trans "Harvest" %}</h1>
1510- {% if harvest_version_name %}<span id="releasename">{{harvest_version_name}}</span>{% endif %}
1511- </a>
1512-
1513- <span id="userdata">
1514- {% if user.is_authenticated %}
1515- <span class="username">{{ user.username }}</span><br />
1516- <a class="loginbutton" href="/logout" tabindex="1">Log out</a>
1517- {% else %}
1518- <span class="username"></span><br />
1519- <a class="loginbutton" href="/openid/login">Log in</a>
1520- {% endif %}
1521- </span>
1522+ <div id="extheader">
1523+ <ul>
1524+ <li><a href="http://www.ubuntu.com">Ubuntu.com</a></li>
1525+ <li><a href="http://www.ubuntu.com/community">Community</a></li>
1526+ <li><a href="http://www.ubuntu.com/support">Support</a></li>
1527+ <li><a href="http://www.ubuntu.com/partners">Partners</a></li>
1528+ </ul>
1529+ </div>
1530+
1531+ <div id="mainheader">
1532+ <a id="sitetitle" href="{% url home %}" class="quiet">
1533+ <span id="sitename">{% trans "Harvest" %}</span>
1534+ {% if harvest_version_name %}<span id="releasename">{{harvest_version_name}}</span>{% endif %}
1535+ </a>
1536+
1537+ <span id="userdata">
1538+ <span class="username">{{ user.username }}</span>
1539+ <span class="useraction"><ul>
1540+ {% if user.is_authenticated %}
1541+ <li><a href="/logout">{% trans "Log out" %}</a></li>
1542+ {% else %}
1543+ <li><a href="/openid/login">{% trans "Log in" %}</a></li>
1544+ {% endif %}
1545+ </ul></span>
1546+ </span>
1547+ </div>
1548
1549 {% if messages %}
1550 <div id="messages"><ul>
1551@@ -51,32 +68,36 @@
1552 {% endif %}
1553 </div>
1554
1555-<div id="content">
1556+<div id="container">
1557+ <div id="content">
1558 {% block content %}{% endblock %}
1559+ </div>
1560 <div class="bottom"></div>
1561 </div>
1562
1563+</div>
1564+
1565 <div id="footer">
1566- <div id="footnav"><nav>
1567- <a class="title" href="{% url home %}" tabindex="2">{% trans "Harvest" %}</a> <a href="http://answers.launchpad.net/harvest" target="_blank" tabindex="2">{% trans "Help" %}</a> <a href="http://bugs.launchpad.net/harvest" target="_blank" tabindex="2">{% trans "Bugs" %}</a> <a href="http://code.launchpad.net/harvest" target="_blank" tabindex="2">{% trans "Code" %}</a>
1568- </nav></div>
1569+ <div id="footnav">
1570+ <ul>
1571+ <li class="toplevel"><a href="{% url home %}">{% trans "Harvest" %}</a></li>
1572+ <li><a href="http://answers.launchpad.net/harvest" target="_blank">{% trans "Help" %}</a></li>
1573+ <li><a href="http://bugs.launchpad.net/harvest" target="_blank">{% trans "Bugs" %}</a></li>
1574+ <li><a href="http://code.launchpad.net/harvest" target="_blank">{% trans "Code" %}</a></li>
1575+ </ul>
1576+ </div>
1577
1578- <div id="smallprint" tabindex="3">
1579- <span id="copyright">
1580+ <div id="copyright">
1581 &copy; 2008-2010 Canonical Ltd., Ubuntu Community
1582 <br />Ubuntu and Canonical are registered trademarks of Canonical Ltd.
1583- </span>
1584-
1585- <span id="techdetails">
1586+ </div>
1587+
1588+ <div id="techdetails">
1589 {% trans "Harvest" %} {{ harvest_version }}
1590 <br /><span id="requeststats"></span>
1591- </span>
1592-
1593- <div class="bottom"></div>
1594 </div>
1595 </div>
1596
1597-</div>
1598 </body>
1599
1600 </html>
1601
1602=== modified file 'harvest/templates/index.html'
1603--- harvest/templates/index.html 2010-10-12 02:55:53 +0000
1604+++ harvest/templates/index.html 2011-05-04 05:59:23 +0000
1605@@ -2,33 +2,33 @@
1606
1607 {% load i18n %}
1608
1609+{% block extracss %}<link rel="stylesheet" href="{{ MEDIA_URL }}css/welcome.css" />{% endblock %}
1610+
1611 {% block content %}
1612
1613-<div id="content_welcome">
1614+<h1>{% trans "Welcome to Harvest" %}</h1>
1615
1616+<div id="welcome" class="main">
1617
1618 <div id="start">
1619 <div id="introduction">
1620- <h2 class="sectiontitle">{% trans "Welcome to Harvest" %}</h2>
1621 <p>{% blocktrans %}Harvest makes it easy to find low-hanging opportunities in Ubuntu. It aggregates the mass of todo lists we use every day so it's simple to find and coordinate work.{% endblocktrans %}</p>
1622+ <div id="start_links"><nav>
1623+ <a href="{% url opportunities.views.filter %}">{% trans "Find opportunities" %}</a>
1624+ </nav></div>
1625 </div>
1626
1627- <div id="start_links"><nav>
1628- <a href="{% url opportunities.views.filter %}">{% trans "Find opportunities" %}</a>
1629- </nav></div>
1630-
1631 <div id="statistics">
1632- <ul>
1633- <li>{% blocktrans count opportunities as counter %}{{ counter }} opportunity{% plural %}{{ counter }} opportunities{% endblocktrans %} {% blocktrans count sourcepackages as counter %}in {{ counter }} source package{% plural %}in {{ counter }} source packages{% endblocktrans %}</li>
1634- <li>{% blocktrans count opportunitylists as counter %}{{ counter }} opportunity list{% plural %}{{ counter }} opportunity lists{% endblocktrans %}</li>
1635- <li>{% blocktrans count notes as counter %}{{ counter }} note{% plural %}{{ counter }} notes{% endblocktrans %}</li>
1636- <li>{% blocktrans count users as counter %}{{ counter }} user{% plural %}{{ counter }} users{% endblocktrans %}</li>
1637- </ul>
1638+ <ul>
1639+ <li>{% blocktrans count opportunities as counter %}{{ counter }} opportunity{% plural %}{{ counter }} opportunities{% endblocktrans %} {% blocktrans count sourcepackages as counter %}in {{ counter }} source package{% plural %}in {{ counter }} source packages{% endblocktrans %}</li>
1640+ <li>{% blocktrans count opportunitylists as counter %}{{ counter }} opportunity list{% plural %}{{ counter }} opportunity lists{% endblocktrans %}</li>
1641+ <li>{% blocktrans count notes as counter %}{{ counter }} note{% plural %}{{ counter }} notes{% endblocktrans %}</li>
1642+ <li>{% blocktrans count users as counter %}{{ counter }} user{% plural %}{{ counter }} users{% endblocktrans %}</li>
1643+ </ul>
1644 </div>
1645 </div>
1646
1647 <div id="faq">
1648- <div>
1649 <ul>
1650 <li>
1651 <span class="question">{% trans "What can I do with Harvest?" %}</span>
1652@@ -37,7 +37,7 @@
1653
1654 <li>
1655 <span class="question">{% trans "Why should I log in?" %}</span>
1656- <p>{% blocktrans %}You can log in with your Launchpad account to help us organise opportunities in Harvest. Click an opportunity's Edit button to review it, then mark it Irrelevant if it doesn't apply to us or Applied if it's been handled.{% endblocktrans %}</p>
1657+ <p>{% blocktrans %}You can log in with your Launchpad account to help us organise opportunities in Harvest. Click an opportunity's Edit button to review it, then mark it Applied if it has been handled or Irrelevant if it doesn't relate to us.{% endblocktrans %}</p>
1658 <li>
1659 </li>
1660
1661@@ -46,9 +46,6 @@
1662 <p>{% blocktrans %}Notes are short messages you can stick to opportunities for other Harvest users to see. They don't use much space, so just add them whenever they might help. For example, if you mark an opportunity Irrelevant, you can add a note explaining why.{% endblocktrans %}</p>
1663 </li>
1664 </ul>
1665- </div>
1666-
1667- <div>
1668 <ul>
1669 <li>
1670 <span class="question">{% trans "Why is Harvest the way it is?" %}</span>
1671@@ -60,7 +57,6 @@
1672 <p>{% blocktrans %}If it's about the UI or the functionality of the site, please file a bug on <a href="http://bugs.launchpad.net/harvest/+filebug">harvest</a> in Launchpad. If it's about some piece of data in Harvest, it's likely a script that fetches it. In that case, please file your bug on <a href="http://bugs.launchpad.net/harvest-data/+filebug">harvest-data</a> instead. The <a href="http://bazaar.launchpad.net/~harvest-dev/harvest/trunk/annotate/head:/HACKING">hacking guide</a> explains more.{% endblocktrans %}</p>
1673 </li>
1674 </ul>
1675- </div>
1676 </div>
1677
1678 </div>
1679
1680=== removed file 'harvest/templates/one_column.html'
1681--- harvest/templates/one_column.html 2010-08-31 06:29:10 +0000
1682+++ harvest/templates/one_column.html 1970-01-01 00:00:00 +0000
1683@@ -1,10 +0,0 @@
1684-{% extends "base.html" %}
1685-{% load i18n %}
1686-
1687-{% block content %}
1688-<div class="one_column">
1689- <h2 class="sectiontitle">{% block pagetitle %}{% endblock %}</h2>
1690- {% block content_main %}{% endblock %}
1691-</div>
1692-{% endblock %}
1693-
1694
1695=== modified file 'harvest/templates/opportunities/filter.html'
1696--- harvest/templates/opportunities/filter.html 2011-05-02 02:39:20 +0000
1697+++ harvest/templates/opportunities/filter.html 2011-05-04 05:59:23 +0000
1698@@ -1,6 +1,8 @@
1699 {% extends "base.html" %}
1700 {% load i18n %}
1701
1702+{% block extracss %}<link rel="stylesheet" href="{{ MEDIA_URL }}css/opportunities.css" />{% endblock %}
1703+
1704 {% block extrahead %}
1705 <link rel="alternate" type="application/rss+xml" title="{% blocktrans %}25 newest opportunities{% endblocktrans %}" href="{% url rss_newest_opportunities %}" />
1706 {% endblock %}
1707@@ -14,7 +16,7 @@
1708 {{filters_opp.render}}
1709 </div>
1710
1711-<div id="results-pane">
1712+<div id="results-wrapper" class="main">
1713 <div id="results-status"></div>
1714 <div id="results">
1715 {% include "opportunities/include/filter_results.html" %}
1716
1717=== modified file 'harvest/templates/opportunities/include/filter_results.html'
1718--- harvest/templates/opportunities/include/filter_results.html 2010-08-13 22:09:49 +0000
1719+++ harvest/templates/opportunities/include/filter_results.html 2011-05-04 05:59:23 +0000
1720@@ -27,20 +27,20 @@
1721 </div>
1722 </li>
1723 {% endfor %}
1724-
1725- {% with packages_list.get_hidden_packages|length as hidden_count %}
1726- {% if hidden_count %}
1727- <li><small>
1728- {% blocktrans count hidden_count as counter %}
1729- {{ counter }} package has no matching opportunities
1730- {% plural %}
1731- {{ counter }} packages have no matching opportunities
1732- {% endblocktrans %}
1733- </small></li>
1734- {% endif %}
1735- {% endwith %}
1736 </ul>
1737
1738+<div class="results-footnote">
1739+{% with packages_list.get_hidden_packages|length as hidden_count %}
1740+{% if hidden_count %}
1741+ {% blocktrans count hidden_count as counter %}
1742+ {{ counter }} selected package has no matching opportunities
1743+ {% plural %}
1744+ {{ counter }} selected packages have no matching opportunities
1745+ {% endblocktrans %}
1746+{% endif %}
1747+{% endwith %}
1748+</div>
1749+
1750 {% else %}
1751
1752 <div class="results-message">
1753
1754=== modified file 'harvest/templates/opportunities/include/opportunity.html'
1755--- harvest/templates/opportunities/include/opportunity.html 2010-10-05 13:31:20 +0000
1756+++ harvest/templates/opportunities/include/opportunity.html 2011-05-04 05:59:23 +0000
1757@@ -3,9 +3,11 @@
1758 <div class="opportunity-header">
1759 <a href="{{opportunity.url}}" class="opportunity-description" target="_blank">{{ opportunity.description }}</a>
1760 <span class="actions">
1761+ {% if user.is_authenticated %}
1762 <a href="{% url opportunity_edit opportunity.id %}?next={{request.get_full_path}}" target="_blank" class="opportunity-edit-button">{% trans 'edit' %}</a>
1763 (<a href="{% url opportunity_applied opportunity.id %}?next={{request.get_full_path}}" class="opportunity-goaway-button" title="{% trans 'mark opportunity as applied' %}">{% trans 'applied' %}</a>
1764 <a href="{% url opportunity_irrelevant opportunity.id %}?next={{request.get_full_path}}" class="opportunity-goaway-button" title="{% trans 'mark opportunity as irrelevant' %}">{% trans 'irrelevant' %}</a>)
1765+ {% endif %}
1766 </span>
1767 <span class="opportunity-summary">
1768 {{ opportunity.summary|join:', ' }}
1769
1770=== removed file 'harvest/templates/opportunities/include/package.html'
1771--- harvest/templates/opportunities/include/package.html 2010-07-30 21:45:23 +0000
1772+++ harvest/templates/opportunities/include/package.html 1970-01-01 00:00:00 +0000
1773@@ -1,14 +0,0 @@
1774-{% load i18n %}
1775-
1776-<a class="sourcepackage-header" href="{{ package.get_expand_toggle_url }}">
1777- <h2 class="sourcepackage-name">{{ package.real.name }}</h2>
1778- <span class="status"></span>
1779- {% comment %}<span class="sourcepackage-summary"></span>{% endcomment %}
1780- <div class="bottom"></div>
1781-</a>
1782-<div class="sourcepackage-details">
1783- {% if package.expanded %}
1784- {% include "opportunities/include/package_details.html" %}
1785- {% endif %}
1786-</div>
1787-
1788
1789=== modified file 'harvest/templates/opportunities/include/package_details.html'
1790--- harvest/templates/opportunities/include/package_details.html 2011-05-02 00:20:31 +0000
1791+++ harvest/templates/opportunities/include/package_details.html 2011-05-04 05:59:23 +0000
1792@@ -3,11 +3,11 @@
1793 {% regroup package.get_visible_opportunities by opportunitylist as opportunities %}
1794 {% for opplist in opportunities %}
1795 <div class="opportunity-list {% if opplist.grouper.featured %}featured{% endif %}">
1796-<h3 class="opportunity-list-title">{{ opplist.grouper }}
1797+<h4 class="opportunity-list-title">{{ opplist.grouper }}
1798 <span class="opportunity-list-summary">
1799 {% if opplist.grouper.featured %}<img src="/media/img/opplist-featured.png" alt="{% trans 'featured' %}" title="{% trans 'featured' %}" />{% endif %}
1800 </span>
1801-</h3>
1802+</h4>
1803 <ul>
1804 {# FIXME: use |dictsort:'experience'|dictsort:'description' here (see comment in wrappers.py) #}
1805 {% for opportunity in opplist.list %}
1806@@ -17,15 +17,20 @@
1807 </div>
1808 {% endfor %}
1809
1810+{% with package.get_hidden_opportunities.count as hidden_count %}
1811+{% ifnotequal hidden_count 0 %}{% ifnotequal hidden_count '' %}
1812+<div class="opportunity-list">
1813+<h4 class="opportunity-list-title">
1814+{% blocktrans count hidden_count as counter %}{{ counter }} hidden opportunity{% plural %}{{ counter }} hidden opportunities{% endblocktrans %}
1815+</h4>
1816+</div>
1817+{% endifnotequal %}{% endifnotequal %}
1818+{% endwith %}
1819+
1820 <div class="extra">
1821 <div class="actions">
1822 <a href="{% url single_package package.real.name %}" target="_blank">{% trans "Permalink" %}</a>
1823 <a href="{% url rss_single_package package.real.name %}" target="_blank">{% trans "RSS" %}</a>
1824 </div>
1825- {% with package.get_hidden_opportunities.count as hidden_count %}
1826- {% ifnotequal hidden_count 0 %}
1827- {% blocktrans count hidden_count as counter %}{{ counter }} opportunity hidden{% plural %}{{ counter }} opportunities hidden{% endblocktrans %}
1828- {% endifnotequal %}
1829- {% endwith %}
1830 <div class="bottom"></div>
1831 </div>
1832
1833=== modified file 'harvest/templates/opportunities/opportunity_edit.html'
1834--- harvest/templates/opportunities/opportunity_edit.html 2010-08-14 18:09:31 +0000
1835+++ harvest/templates/opportunities/opportunity_edit.html 2011-05-04 05:59:23 +0000
1836@@ -1,15 +1,13 @@
1837-{% extends "one_column.html" %}
1838+{% extends "base.html" %}
1839 {% load i18n %}
1840
1841+{% block extracss %}<link rel="stylesheet" href="{{ MEDIA_URL }}css/opportunities.css" />{% endblock %}
1842+
1843 {% block title %}{{ block.super }}: {{ opportunity.description }}{% endblock %}
1844
1845-{% block pagetitle %}
1846-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 %}
1847-{% endblock %}
1848-
1849-{% block content_main %}
1850-<div class="opportunity-details edit">
1851+{% block content %}
1852+<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>
1853+<div class="main opportunity-details edit">
1854 {% include "opportunities/include/opportunity_details_edit.html" %}
1855 </div>
1856 {% endblock %}
1857-
1858
1859=== modified file 'harvest/templates/opportunities/single_package.html'
1860--- harvest/templates/opportunities/single_package.html 2011-05-02 01:22:44 +0000
1861+++ harvest/templates/opportunities/single_package.html 2011-05-04 05:59:23 +0000
1862@@ -1,17 +1,17 @@
1863-{% extends "one_column.html" %}
1864+{% extends "base.html" %}
1865 {% load i18n %}
1866
1867+{% block extracss %}<link rel="stylesheet" href="{{ MEDIA_URL }}css/opportunities.css" />{% endblock %}
1868+
1869 {% block extrahead %}
1870 <link rel="alternate" type="application/rss+xml" title="{% blocktrans with package.real.name as name %}Opportunities for {{name}}{% endblocktrans %}" href="{% url rss_single_package package.real.name %}" />
1871 {% endblock %}
1872
1873 {% block title %}{{ block.super }}: {{ package.real.name }}{% endblock %}
1874
1875-{% block pagetitle %}{{ package.real.name }}{% endblock %}
1876-
1877-{% block content_main %}
1878-<div class="sourcepackage-details">
1879+{% block content %}
1880+<h1>{{ package.real.name }}</h1>
1881+<div class="main sourcepackage-details">
1882 {% include "opportunities/include/package_details.html" %}
1883 </div>
1884 {% endblock %}
1885-

Subscribers

People subscribed via source and target branches

to all changes: