Merge lp:~dylanmccall/harvest/visual-tweaks into lp:harvest

Proposed by Dylan McCall
Status: Merged
Merged at revision: 242
Proposed branch: lp:~dylanmccall/harvest/visual-tweaks
Merge into: lp:harvest
Diff against target: 559 lines (+134/-93)
11 files modified
harvest/common/utils.py (+1/-1)
harvest/media/css/style.css (+69/-51)
harvest/opportunities/filters.py (+3/-3)
harvest/opportunities/forms.py (+1/-1)
harvest/opportunities/models.py (+0/-19)
harvest/opportunities/views.py (+7/-3)
harvest/templates/base.html (+5/-7)
harvest/templates/one_column.html (+3/-2)
harvest/templates/opportunities/include/filter_results.html (+41/-5)
harvest/templates/opportunities/include/opportunity.html (+3/-1)
harvest/templates/opportunities/opportunity_edit.html (+1/-0)
To merge this branch: bzr merge lp:~dylanmccall/harvest/visual-tweaks
Reviewer Review Type Date Requested Status
Daniel Holbach Approve
Review via email: mp+32637@code.launchpad.net

Description of the change

This branch is essentially some fun adjustments related to presentation.

Most importantly, it adds helpful messages that go along with results for various queries.

The following messages are in place:

(Introduction) “To find opportunities, try changing some filters on the left”
“No matching opportunities in X selected packages”
“No packages match your query”

There are also some little style changes, which are described in the commit messages.

To post a comment you must log in.
Revision history for this message
Dylan McCall (dylanmccall) wrote :
240. By Dylan McCall

Font size for #content > #messages in px, same as page title.

241. By Dylan McCall

Changed .pagetitle to #pagetitle

Login and logout now always appear in the same place.

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

Great work!

review: Approve
242. By Dylan McCall

Adopting UbuntuBeta font family as preference

Some more layout tweaks.
Opportunities with notes attached fit similarly to those without.

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

Sorry, I forgot a bit. It's coming up in a second!

Brings in the UbuntuBeta font family, which looks better for some things here. (Particularly with numbers, it seems). The title inexplicably still looks better to me with Molengo, so I left it that way, though the text there should really be turned into an image some day ;)

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

If UbuntuBeta is not available locally, will it just be substituted by something else? If so, should we put "Ubuntu" already in there? I guess it'll be renamed once things are good with the font.

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

Apart from that it looks great.

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

I'm glad you like it :)

Yep, I'm using the font stack suggested in the Ubuntu web guidelines, over here: http://design.canonical.com/the-toolkit/guides-for-websites/

It goes for Ubuntu Beta first, then Deja Vu or Vera, then the default sans-serif font. I didn't put 'Ubuntu' in front of that, just because the web guidelines / ubuntu.com don't do it. It sounds like a fine idea to me, though! Should save us some trouble later on. Thank you!
(Although we should remember to remove 'UbuntuBeta' from the font stack at some point in the future).

I shouldn't change this particular branch (that way when I submit my code next week for the gsoc stuff it won't look like I passed the pencils down time), but I expect it won't cause any trouble. Line 5 just needs to be changed so it says:
font-family:'Ubuntu', 'UbuntuBeta', 'Bitstream Vera Sans', 'DejaVu Sans', Tahoma, sans-serif;

…and line 85 (for what it's worth) needs to be changed to:
font-family:'Molengo', 'Ubuntu', 'Ubuntu Beta', 'DejaVu Sans', 'Bitstream Vera Sans', Tahoma, sans-serif;

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

You know what, I'll merge it as is. Maybe the font will be called something else in the end. No need to worry about that now. I just wanted to make sure that the substitution process works alright. :)

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'harvest/common/utils.py'
2--- harvest/common/utils.py 2010-07-14 16:44:02 +0000
3+++ harvest/common/utils.py 2010-08-16 18:59:39 +0000
4@@ -21,7 +21,7 @@
5 except:
6 pass
7
8- return "version %s (rev %s)" % (version, bzr_revno)
9+ return "version %s (r%s)" % (version, bzr_revno)
10
11
12 def get_harvest_version_name(version_file, debug):
13
14=== modified file 'harvest/media/css/style.css'
15--- harvest/media/css/style.css 2010-08-13 02:03:18 +0000
16+++ harvest/media/css/style.css 2010-08-16 18:59:39 +0000
17@@ -2,7 +2,7 @@
18 background-color:rgb(255,255,255);
19 color:rgb(51,51,51);
20
21- font-family:'Bitstream Vera Sans', 'DejaVu Sans', sans-serif;
22+ font-family:'UbuntuBeta', 'Bitstream Vera Sans', 'DejaVu Sans', Tahoma, sans-serif;
23 font-size:14px;
24 line-height:1.2em;
25 }
26@@ -44,7 +44,6 @@
27 }
28
29 form label {
30- font-weight:bold;
31 }
32 form .error input, form .error textarea, form .error input#new_note {
33 border:solid 2px rgb(140,0,0);
34@@ -72,9 +71,7 @@
35 min-height:80px;
36 padding-top:12px;
37 }
38-#header a {
39- color:rgb(0,0,0);
40-}
41+
42 #header #sitetitle {
43 display:inline;
44 position:static;
45@@ -83,8 +80,9 @@
46 margin-bottom:10px;
47
48 text-transform:lowercase;
49+ text-decoration:none;
50 color:rgb(0,0,0);
51- font-family:'Molengo', 'Bitstream Vera Sans', 'DejaVu Sans', sans-serif;
52+ font-family:'Molengo', 'Ubuntu Beta', 'DejaVu Sans', 'Bitstream Vera Sans', sans-serif;
53 }
54 #header #sitetitle #sitelogo {
55 width:auto; /* line up with #sitename font-size */
56@@ -100,14 +98,15 @@
57 display:inline;
58 position:static;
59
60- font-size:14px;
61+ font-size:12px;
62 vertical-align:sub;
63 }
64+
65 #header #userdata {
66 float:right;
67 margin-top:12px;
68 margin-left:40px;
69- margin-right:80px;
70+ margin-right:40px;
71
72 text-align:right;
73 }
74@@ -126,18 +125,18 @@
75 display:block;
76 margin:10px 0px;
77 padding:5px 10px;
78- font-size:larger;
79+ font-size:18px;
80 background-color:rgb(242,151,93);
81 color:rgb(255,255,255);
82 }
83
84-#content > .pagetitle {
85+#content > #pagetitle {
86 margin:10px 0px;
87 max-width:30em;
88 padding:0px 10px;
89- letter-spacing:-1px;
90- font-size:18px;
91- line-height:1em;
92+ letter-spacing:-0.1em;
93+ font-size:24px;
94+ line-height:28px;
95 }
96
97 #content > .main {
98@@ -159,8 +158,18 @@
99 line-height:1.4em;
100 color:rgb(51,51,51);
101 }
102-#filters a {
103- /* these are self-explanatory; they should disappear */
104+#filters ul {
105+ display:block;
106+ margin-left:20px;
107+ width:100%;
108+}
109+#filters ul li {
110+ display:block;
111+ width:100%;
112+}
113+
114+
115+#filters a.item-toggle {
116 display:inline-block;
117 height:100%;
118
119@@ -169,17 +178,6 @@
120 font-style:inherit;
121 }
122
123-#filters ul {
124- display:block;
125- margin-left:20px;
126- width:100%;
127-}
128-#filters ul li {
129- display:block;
130- width:100%;
131-}
132-
133-
134 #filters .checkbox {
135 /* checkbox element should always be the same size */
136 display:inline-block;
137@@ -230,12 +228,12 @@
138 }
139 #filters > .filtergroup > .filter-value > ul > li {
140 padding-bottom:5px;
141- clear:both;
142 }
143
144 #filters > .filtergroup > .filter-value > ul > li a.help {
145- font-weight: bold;
146- text-color: rgb(110,64,84);
147+ vertical-align:top;
148+ margin-left:1em;
149+ font-weight:bold;
150 }
151
152 #filters .editfilter input {
153@@ -260,7 +258,6 @@
154 max-width:1000px;
155 padding:20px 20px 0px 20px;
156 overflow:auto;
157- line-height:1.6em;
158 }
159
160 #results-pane > #results-status {
161@@ -275,6 +272,17 @@
162 min-height:30px; /* lines up height of #results-status background-image */
163 }
164
165+#results > .results-message {
166+ margin:2em auto;
167+ padding-left:20px;
168+ max-width:30em;
169+
170+ text-align:justify;
171+ font-size:24px;
172+ line-height:1.5em;
173+ color:rgb(180,180,180);
174+}
175+
176 #results > ul {
177 margin-left:20px;
178 margin-bottom:10px;
179@@ -282,7 +290,8 @@
180
181 .sourcepackage {
182 display:block;
183-
184+ font-size:14px;
185+ line-height:21px;
186 }
187 li.sourcepackage {
188 margin-top:5px;
189@@ -352,7 +361,7 @@
190 margin-top:20px;
191 padding:2px 20px 2px 20px;
192 color:rgb(80,80,80);
193- font-size:smaller;
194+ font-size:12px;
195 border-top:1px solid rgb(250,250,250);
196 /*background-color:rgb(200,200,200);*/
197 }
198@@ -371,8 +380,8 @@
199 .opportunity-list > .opportunity-list-title {
200 display:block;
201 color:rgb(80, 80, 80);
202- font-size:smaller;
203- letter-spacing:-1px;
204+ font-size:12px;
205+ letter-spacing:-0.1em;
206 }
207 .opportunity-list > .opportunity-list-title > .opportunity-list-summary {
208 margin-left:5px;
209@@ -384,7 +393,7 @@
210 list-style-image:url('opportunity-normal.png');
211 }
212 li.opportunity {
213- padding:2px 20px 2px 5px;
214+ padding:2px 20px 8px 5px;
215 }
216 li.opportunity:hover {
217 background-color:rgb(250,250,250);
218@@ -401,6 +410,7 @@
219
220 .opportunity > .opportunity-header {
221 display:block;
222+ line-height:1em;
223 }
224 .opportunity[data-opportunity-irrelevant] > .opportunity-header > .opportunity-description,
225 .opportunity[data-opportunity-applied] > .opportunity-header > .opportunity-description {
226@@ -410,17 +420,23 @@
227 color:rgb(0,0,0);
228 font-size:16px;
229 }
230-.opportunity-header > a.opportunity-edit-button {
231- margin-left:5px;
232- vertical-align:super;
233- font-size:smaller;
234+.opportunity-header > .actions {
235+ float:right;
236+ text-align:right;
237+ font-size:12px;
238+ text-transform:lowercase;
239+}
240+li.opportunity > .opportunity-header > .actions {
241+ opacity:0.1; /* color:rgb(241,236,238) */
242+}
243+li.opportunity:hover > .opportunity-header > .actions {
244+ opacity:1;
245 }
246 .opportunity-header > .opportunity-summary {
247- display:inline-block;
248- float:right;
249+ margin-left:10px;
250+ color:rgb(180,180,180);
251+ font-size:12px;
252 text-transform:lowercase;
253- color:rgb(120,120,120);
254- font-size:smaller;
255 }
256
257 li.opportunity > .opportunity-details {
258@@ -436,8 +452,9 @@
259 width:100%;
260 max-width:35em;
261 border-left:dashed 1px rgb(180,180,180);
262- padding:0px 5px 0px 5px;
263+ padding:0px 5px;
264 font-size:12px;
265+ line-height:1em;
266 }
267 .opportunity-notes input#new_note {
268 width:100%;
269@@ -454,15 +471,18 @@
270 max-height:10em;
271 }
272 .opportunity-notes > ul > li {
273- line-height:1.2em;
274- margin-bottom:0.5em;
275+ margin-bottom:1em;
276+}
277+.opportunity-notes > ul > li:last-child {
278+ margin-bottom:0em;
279 }
280 .opportunity-notes > ul > li > .signature {
281+ display:inline-block;
282 margin-left:1em;
283 vertical-align:sub;
284- color:rgb(180,180,180);
285+ color:rgb(80,80,80);
286 font-style:italic;
287- font-size:smaller;
288+ font-size:10px;
289 }
290
291
292@@ -507,9 +527,6 @@
293 padding-left:32px;
294 padding-right:32px;
295 }
296-#footer a {
297- color:rgb(0,0,0);
298-}
299 #footnav {
300 display:block;
301 height:20px;
302@@ -522,6 +539,7 @@
303 #footnav a {
304 margin-left:1em;
305 margin-right:1em;
306+ color:rgb(0,0,0);
307 }
308 #footnav a:last-child {
309 }
310
311=== modified file 'harvest/opportunities/filters.py'
312--- harvest/opportunities/filters.py 2010-08-05 14:36:14 +0000
313+++ harvest/opportunities/filters.py 2010-08-16 18:59:39 +0000
314@@ -26,7 +26,8 @@
315 def default_choices_dict(self):
316 choices_dict = OrderedDict()
317 for l in models.OpportunityList.objects.all(): #TODO: find a way to sort these
318- choices_dict[l.name] = l
319+ if l.active:
320+ choices_dict[l.name] = l
321 return choices_dict
322
323 def process_queryset(self, queryset):
324@@ -42,7 +43,7 @@
325 title_attribute = 'title="%s"' % self.choices_dict[item_id].description
326 if hasattr(self.choices_dict[item_id], 'explanation') and \
327 self.choices_dict[item_id].explanation:
328- help_html = '<a class="help" href="%s">?</a>' % \
329+ help_html = '<a class="help" href="%s" target="_blank">?</a>' % \
330 self.choices_dict[item_id].explanation
331 return '<a class="item-toggle" href="%s" %s>%s</a> %s' % (item_href, title_attribute, item_id, help_html)
332
333@@ -65,6 +66,5 @@
334 'pkg.set' : ['ubuntu-desktop'],
335 'opp' : 'list',
336 'opp.list' : ['bitesize'] }
337- #TODO: change to no defaults, detect that case in view and templates and provide helpful instructions in the results pane.
338 )
339
340
341=== modified file 'harvest/opportunities/forms.py'
342--- harvest/opportunities/forms.py 2010-08-13 01:38:12 +0000
343+++ harvest/opportunities/forms.py 2010-08-16 18:59:39 +0000
344@@ -3,7 +3,7 @@
345 from django.utils.translation import ugettext as _
346
347 class OpportunityForm(forms.ModelForm):
348- new_note = forms.CharField(label=_("Enter a new note here"),
349+ new_note = forms.CharField(label=_("Enter a new note"),
350 required=False,
351 max_length=250) #from models.Note.text
352
353
354=== modified file 'harvest/opportunities/models.py'
355--- harvest/opportunities/models.py 2010-08-12 03:30:02 +0000
356+++ harvest/opportunities/models.py 2010-08-16 18:59:39 +0000
357@@ -31,19 +31,6 @@
358 def __unicode__(self):
359 return self.name
360
361- @property
362- def valid_opportunities(self):
363- return self.opportunity_set.filter(valid=True)
364-
365- @property
366- def opportunity_class(self):
367- if self.valid_opportunities.count() <= PACKAGE_GREEN_THRESHOLD:
368- return 'GREEN'
369- if self.valid_opportunities.count() >= PACKAGE_RED_THRESHOLD:
370- return 'RED'
371- else:
372- return 'YELLOW'
373-
374
375 class OpportunityList(models.Model):
376 name = models.SlugField(_("Name"), max_length=70)
377@@ -67,12 +54,6 @@
378 def __unicode__(self):
379 return self.name
380
381- @property
382- def opportunity_urgency(self):
383- if self.featured:
384- return 'YES'
385- return 'NO'
386-
387
388 class Opportunity(models.Model):
389 description = models.TextField(_("Description"), max_length=350)
390
391=== modified file 'harvest/opportunities/views.py'
392--- harvest/opportunities/views.py 2010-08-12 05:42:46 +0000
393+++ harvest/opportunities/views.py 2010-08-16 18:59:39 +0000
394@@ -45,14 +45,18 @@
395 filters_pkg = filters.find('pkg')
396 filters_opp = filters.find('opp')
397
398- pkg_list_wrapper = _create_packages_list(request, filters_pkg, filters_opp)
399+ pkg_list_wrapper = _create_packages_list(request, filters_pkg, filters_opp)
400
401 context = {
402- 'packages_list': pkg_list_wrapper,
403+ 'packages_list' : pkg_list_wrapper,
404 'filters_pkg' : filters_pkg,
405 'filters_opp' : filters_opp
406 }
407-
408+
409+ if len(request.GET) == 0:
410+ #an empty querystring indicates this has been opened for the first time
411+ context['show_intro_message'] = True
412+
413 return render(
414 'opportunities/filter.html',
415 context,
416
417=== modified file 'harvest/templates/base.html'
418--- harvest/templates/base.html 2010-08-06 03:52:07 +0000
419+++ harvest/templates/base.html 2010-08-16 18:59:39 +0000
420@@ -26,17 +26,18 @@
421 <div id="container">
422
423 <div id="header">
424- <span id="sitetitle">
425+ <a id="sitetitle" href="{% url home %}" class="quiet">
426 <img id="sitelogo" src="{{ MEDIA_URL }}img/logo_humanity-search-icon.png" />
427 <h1 id="sitename">{% trans "Harvest" %}</h1>
428 {% if harvest_version_name %}<span id="releasename">{{harvest_version_name}}</span>{% endif %}
429- </span>
430+ </a>
431
432 <span id="userdata">
433 {% if user.is_authenticated %}
434- <span class="username">{{ user.username }}</span>
435- <br /><a class="loginbutton" href="/logout" tabindex="1">Log out</a>
436+ <span class="username">{{ user.username }}</span><br />
437+ <a class="loginbutton" href="/logout" tabindex="1">Log out</a>
438 {% else %}
439+ <span class="username"></span><br />
440 <a class="loginbutton" href="/openid/login">Log in</a>
441 {% endif %}
442 </span>
443@@ -51,9 +52,6 @@
444 </ul></div>
445 {% endif %}
446 {% block content %}
447-
448-
449-
450 {% endblock %}
451 </div>
452
453
454=== modified file 'harvest/templates/one_column.html'
455--- harvest/templates/one_column.html 2010-08-06 03:34:17 +0000
456+++ harvest/templates/one_column.html 2010-08-16 18:59:39 +0000
457@@ -2,8 +2,9 @@
458 {% load i18n %}
459
460 {% block content %}
461-<h2 class="pagetitle">{% block pagetitle %}{% endblock %}</h2>
462+<h2 id="pagetitle">{% block pagetitle %}{% endblock %}</h2>
463 <div class="main">
464 {% block content_main %}{% endblock %}
465 </div>
466-{% endblock %}
467\ No newline at end of file
468+{% endblock %}
469+
470
471=== modified file 'harvest/templates/opportunities/include/filter_results.html'
472--- harvest/templates/opportunities/include/filter_results.html 2010-08-11 23:36:17 +0000
473+++ harvest/templates/opportunities/include/filter_results.html 2010-08-16 18:59:39 +0000
474@@ -1,6 +1,16 @@
475 {% load i18n %}
476
477-{% if packages_list %}
478+{% if show_intro_message %}
479+{# Quirky special case: the view function makes this happen when the user hasn't selected any filters #}
480+<div class="results-message">
481+ {% blocktrans %}
482+ To find opportunities, try changing some filters on the left
483+ {% endblocktrans %}
484+</div>
485+{% endif %}
486+
487+{% if packages_list.get_visible_packages %}
488+
489 <ul>
490 {% for package in packages_list.get_visible_packages %}
491 <li data-package-id="{{ package.real.id }}" class="sourcepackage {% if package.expanded %}expanded{% else %}collapsed{% endif %}">
492@@ -19,13 +29,39 @@
493 {% endfor %}
494
495 {% with packages_list.get_hidden_packages|length as hidden_count %}
496- {% ifnotequal hidden_count 0 %}
497- <li><small>{% blocktrans count hidden_count as counter %}{{ counter }} package has no matching opportunities{% plural %}{{ counter }} packages have no matching opportunities{% endblocktrans %}</small></li>
498- {% endifnotequal %}
499+ {% if hidden_count %}
500+ <li><small>
501+ {% blocktrans count hidden_count as counter %}
502+ {{ counter }} package has no matching opportunities
503+ {% plural %}
504+ {{ counter }} packages have no matching opportunities
505+ {% endblocktrans %}
506+ </small></li>
507+ {% endif %}
508 {% endwith %}
509 </ul>
510
511 {% else %}
512-<p>{% trans "There are currently no opportunities in Harvest. :(" %}</p>
513+
514+<div class="results-message">
515+ {% with packages_list.get_hidden_packages|length as hidden_count %}
516+ {% if hidden_count %}
517+
518+ {% blocktrans count hidden_count as counter %}
519+ No matching opportunities in the selected package
520+ {% plural %}
521+ No matching opportunities in {{ counter }} selected packages
522+ {% endblocktrans %}
523+
524+ {% else %}
525+
526+ {% blocktrans %}
527+ No packages match your query
528+ {% endblocktrans %}
529+
530+ {% endif %}
531+ {% endwith %}
532+</div>
533+
534 {% endif %}
535
536
537=== modified file 'harvest/templates/opportunities/include/opportunity.html'
538--- harvest/templates/opportunities/include/opportunity.html 2010-08-12 05:42:46 +0000
539+++ harvest/templates/opportunities/include/opportunity.html 2010-08-16 18:59:39 +0000
540@@ -3,7 +3,9 @@
541 <div class="opportunity-header">
542 <a href="{{opportunity.url}}" class="opportunity-description" target="_blank">{{ opportunity.description }}</a>
543 {% if user.is_authenticated %}
544- <a href="{% url opportunity_edit opportunity.id %}?next={{request.get_full_path}}" target="_blank" class="opportunity-edit-button">edit</a>
545+ <span class="actions">
546+ <a href="{% url opportunity_edit opportunity.id %}?next={{request.get_full_path}}" target="_blank" class="opportunity-edit-button">edit</a>
547+ </span>
548 {% endif %}
549 <span class="opportunity-summary">
550 {{ opportunity.summary|join:', ' }}
551
552=== modified file 'harvest/templates/opportunities/opportunity_edit.html'
553--- harvest/templates/opportunities/opportunity_edit.html 2010-08-06 03:52:07 +0000
554+++ harvest/templates/opportunities/opportunity_edit.html 2010-08-16 18:59:39 +0000
555@@ -12,3 +12,4 @@
556 {% include "opportunities/include/opportunity_details_edit.html" %}
557 </div>
558 {% endblock %}
559+

Subscribers

People subscribed via source and target branches

to all changes: