← Back to team overview

harvest-dev team mailing list archive

[Merge] lp:~dylanmccall/harvest/package-details into lp:harvest

 

Dylan McCall has proposed merging lp:~dylanmccall/harvest/package-details into lp:harvest.

Requested reviews:
  harvest-dev (harvest-dev)


Improves layout and design of package details and tidies the templates slightly.

Adds a "permalink" feature to show all information attached to a particular package.

Here's a screenshot of that in action (although an extreme case):
http://people.ubuntu.com/~dylanmccall/harvest/media/gsoc-week11/package-details-august1.png

The opportunities are grouped into their specific opportunity sets, then sorted by difficulty (where available). The coloured dots also signify difficulty. (That's the "experience" field).

The single package view is a tad ugly looking, because I so far don't have anything in the way of base templates. In the future, hopefully it can inherit from a template that makes single columns of text look really pretty (and prevents them from filling 100% width).

The status field (that's the single line of text you see here, which is input by users) will undergo some internal changes as it evolves in the opportunity-edit branch.
-- 
https://code.launchpad.net/~dylanmccall/harvest/package-details/+merge/31510
Your team harvest-dev is requested to review the proposed merge of lp:~dylanmccall/harvest/package-details into lp:harvest.
=== added file 'harvest/media/css/opportunity-experience-1.png'
Binary files harvest/media/css/opportunity-experience-1.png	1970-01-01 00:00:00 +0000 and harvest/media/css/opportunity-experience-1.png	2010-08-02 04:53:41 +0000 differ
=== added file 'harvest/media/css/opportunity-experience-2.png'
Binary files harvest/media/css/opportunity-experience-2.png	1970-01-01 00:00:00 +0000 and harvest/media/css/opportunity-experience-2.png	2010-08-02 04:53:41 +0000 differ
=== added file 'harvest/media/css/opportunity-experience-3.png'
Binary files harvest/media/css/opportunity-experience-3.png	1970-01-01 00:00:00 +0000 and harvest/media/css/opportunity-experience-3.png	2010-08-02 04:53:41 +0000 differ
=== added file 'harvest/media/css/opportunity-normal.png'
Binary files harvest/media/css/opportunity-normal.png	1970-01-01 00:00:00 +0000 and harvest/media/css/opportunity-normal.png	2010-08-02 04:53:41 +0000 differ
=== modified file 'harvest/media/css/reset.css'
--- harvest/media/css/reset.css	2010-07-14 15:34:17 +0000
+++ harvest/media/css/reset.css	2010-08-02 04:53:41 +0000
@@ -12,6 +12,9 @@
 	border: 0;
 	outline: 0;
 	font-size: 100%;
+	font-style: normal;
+	text-decoration: none;
+	font-weight: normal;
 	vertical-align: baseline;
 	background: transparent;
 }

=== modified file 'harvest/media/css/style.css'
--- harvest/media/css/style.css	2010-07-21 20:59:34 +0000
+++ harvest/media/css/style.css	2010-08-02 04:53:41 +0000
@@ -7,11 +7,6 @@
 	line-height:1.2em;
 }
 
-h1,h2,h3,h4,h5,h6 {
-	color:rgb(0,0,0);
-	font-family:'Molengo', 'Bitstream Vera Sans', 'DejaVu Sans', sans-serif;
-}
-
 .bottom {
 	display:block;
 	clear:both;
@@ -43,11 +38,6 @@
 	text-decoration:underline;
 }
 
-#header a,
-#footer a {
-	color:rgb(0,0,0);
-}
-
 input.placeheld {
 	/* only used in browsers that don't already do placeholder text */
 	color:rgb(180,180,180);
@@ -73,6 +63,9 @@
 	padding-top:12px;
 	padding-bottom:12px;
 }
+#header a {
+	color:rgb(0,0,0);
+}
 #header #pagetitle {
 	display:inline;
 	position:static;
@@ -247,68 +240,163 @@
 	margin-bottom:10px;
 }
 
-#results .sourcepackage {
+.sourcepackage {
 	display:block;
+	
+}
+li.sourcepackage {
 	margin-top:5px;
-	margin-bottom:5px;
-	border:1px solid rgb(250,250,250);
-	-moz-border-radius:3px 3px 0px 0px;
-	border-radius:3px 3px 0px 0px;
+	margin-bottom:10px;
+	border:1px solid rgb(200,200,200);
+	-moz-border-radius:3px;
+	border-radius:3px; /* round border on bottom as well */
 }
-
-#results .sourcepackage > .sourcepackage-header {
+.sourcepackage > .sourcepackage-header {
 	display:block;
 	padding:8px 20px 8px 20px;
+}
+li.sourcepackage > .sourcepackage-header {
 	-moz-border-radius:3px 3px 0px 0px;
-	border-radius:3px 3px 0px 0px; /* to line up with .sourcepackage's border */
+	border-radius:3px 3px 0px 0px; /* lines up with li.sourcepackage's border */
 }
-#results .sourcepackage > a.sourcepackage-header {
+.sourcepackage > a.sourcepackage-header {
 	color:inherit;
 	text-decoration:none;
 }
-#results .sourcepackage > .sourcepackage-header > .sourcepackage-name {
+.sourcepackage > .sourcepackage-header > .sourcepackage-name {
+	display:inline;
 	margin-right:10px;
 	color:rgb(0,0,0);
 	font-size:16px;
 }
-#results .sourcepackage > .sourcepackage-header > .sourcepackage-summary {
+.sourcepackage > .sourcepackage-header > .status {
+	display:none; /* harvest.js will override this where necessary */
+}
+.sourcepackage > .sourcepackage-header > .status img {
+	width:16px;
+	height:16px;
+}
+.sourcepackage > .sourcepackage-header > .sourcepackage-summary {
+	display:inline;
 	float:right;
 	text-align:right;
 	font-size:10px;
 }
-#results .sourcepackage > .sourcepackage-details {
-	display:block;
-	padding:0px 10px 5px 50px;
-}
-
 /* prelights */
-#results .sourcepackage > a.sourcepackage-header:hover,
-#results .sourcepackage > a.sourcepackage-header:focus {
+.sourcepackage > a.sourcepackage-header:hover,
+.sourcepackage > a.sourcepackage-header:focus {
 	/* use the opportunity count or experience measure here */
 	background-color:rgb(240,255,243);
 }
-#results .sourcepackage > a.sourcepackage-header:hover .sourcepackage-name,
-#results .sourcepackage > a.sourcepackage-header:focus .sourcepackage-name {
+.sourcepackage > a.sourcepackage-header:hover .sourcepackage-name,
+.sourcepackage > a.sourcepackage-header:focus .sourcepackage-name {
 	text-decoration:underline;
 }
 
-#results .sourcepackage > .sourcepackage-header > .status {
-	display:none; /* harvest.js will override this where necessary */
-}
-#results .sourcepackage > .sourcepackage-header > .status img {
-	width:16px;
-	height:16px;
-}
-
-/* expanded / collapsed state */
-#results .sourcepackage.expanded {
+.sourcepackage > .sourcepackage-details {
+	display:block;
+	padding-top:20px;
+	/* inner padding should be left:20px, right:20px and bottom:5px */
+}
+li.sourcepackage > .sourcepackage-details {
+	padding-top:0px;
+}
+
+/* collapsed state. (expanded is the default) */
+li.sourcepackage.collapsed {
+	margin-bottom:5px;
+	border-color:rgb(250,250,250);
+	-moz-border-radius:3px 3px 0px 0px;
+	border-radius:3px 3px 0px 0px;
+}
+.sourcepackage.collapsed > .sourcepackage-details {
+	display:none;
+}
+
+.sourcepackage-details > .extra {
+	margin-top:20px;
+	padding:2px 20px 2px 20px;
+	color:rgb(80,80,80);
+	font-size:smaller;
+	border-top:1px solid rgb(250,250,250);
+	/*background-color:rgb(200,200,200);*/
+}
+.sourcepackage-details > .extra > .actions {
+	float:right;
+	text-transform:lowercase;
+}
+
+
+.sourcepackage-details > .opportunity-list {
+	padding-left:20px;
+	margin-bottom:5px;
+}
+
+.opportunity-list > .opportunity-list-title {
+	display:block;
+	color:rgb(80, 80, 80);
+	font-size:smaller;
+	letter-spacing:-1px;
+}
+.opportunity-list > .opportunity-list-title > .opportunity-list-summary {
+	margin-left:5px;
+}
+
+.opportunity-list > ul {
 	margin-bottom:10px;
-	border-color:rgb(200,200,200);
-	-moz-border-radius:3px;
-	border-radius:3px; /* round border on bottom as well */
-}
-#results .sourcepackage.collapsed > .sourcepackage-details {
-	display:none;
+	padding-left:20px;
+	list-style-image:url('opportunity-normal.png');
+}
+li.opportunity {
+	padding:2px 20px 2px 5px;
+}
+li.opportunity:hover {
+	background-color:rgb(250,250,250);
+}
+li.opportunity[data-opportunity-experience='1'] {
+	list-style-image:url('opportunity-experience-1.png');
+}
+li.opportunity[data-opportunity-experience='2'] {
+	list-style-image:url('opportunity-experience-2.png');
+}
+li.opportunity[data-opportunity-experience='3'] {
+	list-style-image:url('opportunity-experience-3.png');
+}
+
+.opportunity > .opportunity-header {
+	display:block;
+}
+.opportunity[data-opportunity-irrelevant] > .opportunity-header > .opportunity-description,
+.opportunity[data-opportunity-applied] > .opportunity-header > .opportunity-description {
+	text-decoration:line-through;
+}
+.opportunity-header > a.opportunity-description {
+	color:rgb(0,0,0);
+	font-size:16px;
+}
+.opportunity-header > a.opportunity-edit-button {
+	margin-left:5px;
+	vertical-align:super;
+	font-size:smaller;
+}
+.opportunity-header > .opportunity-summary {
+	display:inline-block;
+	float:right;
+	text-transform:lowercase;
+	color:rgb(120,120,120);
+	font-size:smaller;
+}
+
+.opportunity > .opportunity-details {
+	display:block;
+	margin-left:10px;
+}
+.opportunity-details > .opportunity-status {
+	display:block;
+	max-width:30em;
+	border-left:dashed 1px rgb(180,180,180);
+	padding-left:5px;
+	font-size:12px;
 }
 
 
@@ -329,6 +417,9 @@
 	padding-left:32px;
 	padding-right:32px;
 }
+#footer a {
+	color:rgb(0,0,0);
+}
 #footnav {
 	display:block;
 	height:20px;

=== added file 'harvest/media/img/opplist-featured.png'
Binary files harvest/media/img/opplist-featured.png	1970-01-01 00:00:00 +0000 and harvest/media/img/opplist-featured.png	2010-08-02 04:53:41 +0000 differ
=== modified file 'harvest/opportunities/models.py'
--- harvest/opportunities/models.py	2010-06-15 08:48:01 +0000
+++ harvest/opportunities/models.py	2010-08-02 04:53:41 +0000
@@ -92,10 +92,19 @@
 
     def __unicode__(self):
         return self.description
-
-    @models.permalink
-    def get_absolute_url(self):
-        return ('opportunity_detail', [self.id])
+    
+    @property
+    def summary(self):
+        summary_list = []
+        if self.experience > 0:
+            summary_list.append(EXPERIENCE_CHOICES[self.experience][1])
+        if self.reviewed:
+            summary_list.append(_("Irrelevant"))
+        if self.applied:
+            summary_list.append(_("Applied"))
+        if not self.valid:
+            summary_list.append(_("Invalid"))
+        return summary_list
 
 class ActionLogEntry(models.Model):
     timestamp = models.DateTimeField(_("Timestamp"))

=== modified file 'harvest/opportunities/urls.py'
--- harvest/opportunities/urls.py	2010-07-14 05:51:21 +0000
+++ harvest/opportunities/urls.py	2010-08-02 04:53:41 +0000
@@ -2,10 +2,11 @@
 
 urlpatterns = patterns('',
     url(r'^opportunity/(?P<opportunity_id>[\d]+)/edit$', 'opportunities.views.opportunity_edit', name='opportunity_edit'),
-    url(r'^opportunity/(?P<opportunity_id>[\d]+)/$', 'opportunities.views.opportunity_detail', name='opportunity_detail'),
     
     url(r'^filter$', 'opportunities.views.opportunities_filter', name='opportunities_filter'),
     
-    url(r'^query/results$', 'opportunities.views.opportunities_filter_results', name='opportunities_filter_results'),
-    url(r'^query/results/(?P<package_id>[\d]+)$', 'opportunities.views.opportunities_package_details', name='opportunities_package_details'),
+    url(r'^package/(?P<package_name>.+)', 'opportunities.views.single_package', name='single_package'),
+    
+    url(r'^xhr/results$', 'opportunities.views.opportunities_xhr_filter_results', name='opportunities_xhr_filter_results'),
+    url(r'^xhr/results/(?P<package_id>[\d]+)$', 'opportunities.views.opportunities_xhr_package_details', name='opportunities_xhr_package_details'),
 )

=== modified file 'harvest/opportunities/views.py'
--- harvest/opportunities/views.py	2010-07-14 05:51:21 +0000
+++ harvest/opportunities/views.py	2010-08-02 04:53:41 +0000
@@ -16,14 +16,6 @@
 from filters import HarvestFilters
 from wrappers import PackageWrapper, PackageListWrapper
 
-def opportunity_detail(request, opportunity_id):
-    return list_detail.object_detail(
-        request,
-        queryset = models.Opportunity.objects.filter(last_updated=opportunitylist__last_updated),
-        object_id = opportunity_id,
-        template_object_name = 'opportunity',
-    )
-
 @login_required
 def opportunity_edit(request, opportunity_id):
     opportunity = get_object_or_404(models.Opportunity, id=opportunity_id)
@@ -90,7 +82,6 @@
     pkg_list_wrapper = _create_packages_list(request, filters_pkg, filters_opp) 
     
     context = {
-        'grouping': 'package',
         'packages_list': pkg_list_wrapper,
         'filters_pkg' : filters_pkg,
         'filters_opp' : filters_opp
@@ -102,24 +93,23 @@
         context_instance=RequestContext(request))
 
 
-def opportunities_filter_results(request):
+def opportunities_xhr_filter_results(request):
     filters = HarvestFilters()
     filters.update_from_http(request)
     
     packages_list = _create_packages_list(request, filters.find('pkg'), filters.find('opp')) 
     
     context = {
-        'grouping': 'package',
         'packages_list': packages_list
     }
 
     return render(
-        'opportunities/filter_results.html',
+        'opportunities/xhr/filter_results.html',
         context,
         context_instance=RequestContext(request))
 
 
-def opportunities_package_details(request, package_id):
+def opportunities_xhr_package_details(request, package_id):
     filters = HarvestFilters()
     filters.update_from_http(request)
     
@@ -130,11 +120,26 @@
     package_wrapper = PackageWrapper(request, package, visible_opportunities = opportunities_list, expanded = True)
     
     context = {
-        'grouping': 'package',
-        'package': package_wrapper
-    }
-    
-    return render(
-        'opportunities/package_details.html',
-        context,
-        context_instance=RequestContext(request))
+        'package': package_wrapper
+    }
+    
+    return render(
+        'opportunities/xhr/package_details.html',
+        context,
+        context_instance=RequestContext(request))
+
+def single_package(request, package_name):
+    package = models.SourcePackage.objects.get(name=package_name)
+    
+    package_wrapper = PackageWrapper(request, package, visible_opportunities = package.opportunity_set)
+    
+    context = {
+        'package': package_wrapper
+    }
+    
+    return render(
+        'opportunities/single_package.html',
+        context,
+        context_instance=RequestContext(request))
+
+

=== modified file 'harvest/opportunities/wrappers.py'
--- harvest/opportunities/wrappers.py	2010-07-16 05:21:21 +0000
+++ harvest/opportunities/wrappers.py	2010-08-02 04:53:41 +0000
@@ -30,8 +30,10 @@
         Returns opportunities that belong to the given package and are
         in opportunities_list.
         """
-        #also check if valid?
-        return self.visible_opportunities
+        #order_by should really happen in the template, but the template
+        #language's dictsort is unstable pending a fix to Django bug
+        #11008: <http://code.djangoproject.com/ticket/11008>
+        return self.visible_opportunities.order_by('-since', 'opportunitylist', 'experience')
     
     def get_hidden_opportunities(self):
         """

=== modified file 'harvest/templates/opportunities/filter.html'
--- harvest/templates/opportunities/filter.html	2010-07-14 05:51:21 +0000
+++ harvest/templates/opportunities/filter.html	2010-08-02 04:53:41 +0000
@@ -1,7 +1,7 @@
 {% extends "base.html" %}
 {% load i18n %}
 
-{% block title %}{% trans "Opportunity Index" %} - {{ block.super }}{% endblock %}
+{% block title %}{{ block.super }}{% endblock %}
 
 {% block content %}
 
@@ -10,13 +10,14 @@
 	{{filters_opp.render}}
 </div>
 
-<div id="results-pane" data-results-url="{% url opportunities_filter_results %}">
+<div id="results-pane" data-results-url="{% url opportunities_xhr_filter_results %}">
 	<div id="results-status"></div>
 	<div id="results">
-	{% include "opportunities/filter_results.html" %}
+	{% include "opportunities/include/filter_results.html" %}
 	</div>
 </div>
 
 <div class="bottom"></div>
 
 {% endblock %}
+

=== added directory 'harvest/templates/opportunities/include'
=== renamed file 'harvest/templates/opportunities/filter_results.html' => 'harvest/templates/opportunities/include/filter_results.html'
--- harvest/templates/opportunities/filter_results.html	2010-07-14 05:51:21 +0000
+++ harvest/templates/opportunities/include/filter_results.html	2010-08-02 04:53:41 +0000
@@ -5,16 +5,14 @@
 	{% for package in packages_list.get_visible_packages %}
 	<li data-results-packageid="{{ package.real.id }}" class="sourcepackage {% if package.expanded %}expanded{% else %}collapsed{% endif %}">
 		<a class="sourcepackage-header" href="{{ package.get_expand_toggle_url }}">
-			<span class="sourcepackage-name">{{ package.real.name }}</span>
+			<h2 class="sourcepackage-name">{{ package.real.name }}</h2>
 			<span class="status"></span>
-			<span class="sourcepackage-summary">
-				X issues (TODO)
-			</span>
+			{% comment %}<span class="sourcepackage-summary"></span>{% endcomment %}
 			<div class="bottom"></div>
 		</a>
 		<div class="sourcepackage-details">
 			{% if package.expanded %}
-			{% include "opportunities/package_details.html" %}
+			{% include "opportunities/include/package_details.html" %}
 			{% endif %}
 		</div>
 	</li>

=== added file 'harvest/templates/opportunities/include/opportunity.html'
--- harvest/templates/opportunities/include/opportunity.html	1970-01-01 00:00:00 +0000
+++ harvest/templates/opportunities/include/opportunity.html	2010-08-02 04:53:41 +0000
@@ -0,0 +1,18 @@
+{% load i18n %}
+
+<div class="opportunity-header">
+	<a href="{{opportunity.url}}" class="opportunity-description" target="_blank">{{ opportunity.description }}</a>
+	{% if user.is_authenticated %}
+	<a href="{% url opportunity_edit opportunity.id %}?next={{request.get_full_path}}" class="opportunity-edit-button">edit</a>
+	{% endif %}
+	<span class="opportunity-summary">
+		{{ opportunity.summary|join:', ' }}
+	</span>
+</div>
+<div class="opportunity-details">
+	{% if opportunity.comment %}
+	<span class="opportunity-status">{{ opportunity.comment }}</span>
+	{% endif %}
+</div>
+<div class="bottom"></div>
+

=== added file 'harvest/templates/opportunities/include/package.html'
--- harvest/templates/opportunities/include/package.html	1970-01-01 00:00:00 +0000
+++ harvest/templates/opportunities/include/package.html	2010-08-02 04:53:41 +0000
@@ -0,0 +1,14 @@
+{% load i18n %}
+
+<a class="sourcepackage-header" href="{{ package.get_expand_toggle_url }}">
+	<h2 class="sourcepackage-name">{{ package.real.name }}</h2>
+	<span class="status"></span>
+	{% comment %}<span class="sourcepackage-summary"></span>{% endcomment %}
+	<div class="bottom"></div>
+</a>
+<div class="sourcepackage-details">
+	{% if package.expanded %}
+	{% include "opportunities/include/package_details.html" %}
+	{% endif %}
+</div>
+

=== renamed file 'harvest/templates/opportunities/package_details.html' => 'harvest/templates/opportunities/include/package_details.html'
--- harvest/templates/opportunities/package_details.html	2010-07-14 16:44:02 +0000
+++ harvest/templates/opportunities/include/package_details.html	2010-08-02 04:53:41 +0000
@@ -1,13 +1,32 @@
 {% load i18n %}
 
+{% regroup package.get_visible_opportunities by opportunitylist as opportunities %}
+{% for opplist in opportunities %}
+<div class="opportunity-list {% if opplist.grouper.featured %}featured{% endif %}">
+<h3 class="opportunity-list-title">{{ opplist.grouper }}
+<span class="opportunity-list-summary">
+	{% if opplist.grouper.featured %}<img src="/media/img/opplist-featured.png" alt="{% trans 'featured' %}" title="{% trans 'featured' %}" />{% endif %}
+</span>
+</h3>
 <ul>
-	{% for opportunity in package.get_visible_opportunities %}
-		{% include "opportunities/opportunity_detail.inc.html" %}
+	{# FIXME: use |dictsort:'experience'|dictsort:'description' here (see comment in wrappers.py) #}
+	{% for opportunity in opplist.list %}
+	<li class="opportunity" data-opportunity-experience="{{opportunity.experience}}" {% if opportunity.reviewed %}data-opportunity-irrelevant{% endif %} {% if opportunity.applied %}data-opportunity-applied{% endif %}>
+		{% include "opportunities/include/opportunity.html" %}
+	</li>
 	{% endfor %}
-	
+</ul>
+</div>
+{% endfor %}
+
+<div class="extra">
 	{% with package.get_hidden_opportunities.count as hidden_count %}
-		{% ifnotequal hidden_count 0 %}
-			<li><small>{% blocktrans count hidden_count as counter %}{{ counter }} opportunity hidden{% plural %}{{ counter }} opportunities hidden{% endblocktrans %}</small></li>
-		{% endifnotequal %}
+	{% ifnotequal hidden_count 0 %}
+	{% blocktrans count hidden_count as counter %}{{ counter }} opportunity hidden{% plural %}{{ counter }} opportunities hidden{% endblocktrans %}
+	{% endifnotequal %}
 	{% endwith %}
-</ul>
+	<div class="actions">
+		<a href="{% url single_package package.real.name %}" target="_blank">{% trans "Permalink" %}</a>
+	</div>
+	<div class="bottom"></div>
+</div>

=== removed file 'harvest/templates/opportunities/opportunity_detail.html'
--- harvest/templates/opportunities/opportunity_detail.html	2010-02-22 15:43:51 +0000
+++ harvest/templates/opportunities/opportunity_detail.html	1970-01-01 00:00:00 +0000
@@ -1,10 +0,0 @@
-{% extends "base.html" %}
-
-{% block title %}{{ opportunity.description }} - {{ block.super }}{% endblock %}
-
-{% block content %}
-    <h2>{{ opportunity.description }}</h2>
-    <ul>
-        {% include "opportunities/opportunity_detail.inc.html" %}
-    </ul>
-{% endblock %}

=== removed file 'harvest/templates/opportunities/opportunity_detail.inc.html'
--- harvest/templates/opportunities/opportunity_detail.inc.html	2010-07-14 20:01:48 +0000
+++ harvest/templates/opportunities/opportunity_detail.inc.html	1970-01-01 00:00:00 +0000
@@ -1,21 +0,0 @@
-	<li>
-	    <span class="feature{{ opportunity.opportunitylist.opportunity_urgency }}">
-                <a href="{{opportunity.url}}">{{ opportunity.description }}</a>
-		{% if grouping %}
-		    {% ifequal grouping "type" %}
-                        <a href="{% url sourcepackage_detail opportunity.sourcepackage.name %}">({{ opportunity.sourcepackage }})</a>
-		    {% endifequal %}
-		    {% ifequal grouping "package" %}
-                        ({{ opportunity.opportunitylist }})
-                    {% endifequal %}
-		{% else %}
-                    (<a href="{% url opportunities_package_details opportunity.sourcepackage.id %}">({{ opportunity.sourcepackage }})</a> - {{ opportunity.opportunitylist }})
-		{% endif %}
-		{% if opportunity.experience %}
-		    <span class="experience{{ opportunity.experience }}"></span>
-		{% endif %}
-		{% if user.is_authenticated %}
-		    (<a href="{% url opportunity_edit opportunity.id %}?next={{request.get_full_path}}">edit</a>)
-                {% endif %}
-            </span>
-	</li>

=== modified file 'harvest/templates/opportunities/opportunity_edit.html'
--- harvest/templates/opportunities/opportunity_edit.html	2010-03-08 16:53:44 +0000
+++ harvest/templates/opportunities/opportunity_edit.html	2010-08-02 04:53:41 +0000
@@ -2,9 +2,9 @@
 {% load i18n %}
 
 {% block content %}
-    <ul>
-        {% include "opportunities/opportunity_detail.inc.html" %}
-    </ul>
+    <div class="opportunity">
+        {% include "opportunities/include/opportunity.html" %}
+    </div>
     <div id="form"><form action="{{ request.path_info }}" method="POST">
         {% if form.errors %}
              <p style="color: red;">{% trans  "Please correct the error" %} {{ form.errors|pluralize }} below.</p>

=== added file 'harvest/templates/opportunities/single_package.html'
--- harvest/templates/opportunities/single_package.html	1970-01-01 00:00:00 +0000
+++ harvest/templates/opportunities/single_package.html	2010-08-02 04:53:41 +0000
@@ -0,0 +1,20 @@
+{% extends "base.html" %}
+{% load i18n %}
+
+{% block title %}{{ block.super }}: {{ package.real.name }}{% endblock %}
+
+{% block content %}
+
+<div class="sourcepackage">
+	<div class="sourcepackage-header">
+		<h2 class="sourcepackage-name">{{ package.real.name }}</h2>
+		{% comment %}<span class="sourcepackage-summary"></span>{% endcomment %}
+		<div class="bottom"></div>
+	</div>
+	<div class="sourcepackage-details">
+		{% include "opportunities/include/package_details.html" %}
+	</div>
+</div>
+
+{% endblock %}
+

=== added directory 'harvest/templates/opportunities/xhr'
=== added file 'harvest/templates/opportunities/xhr/filter_results.html'
--- harvest/templates/opportunities/xhr/filter_results.html	1970-01-01 00:00:00 +0000
+++ harvest/templates/opportunities/xhr/filter_results.html	2010-08-02 04:53:41 +0000
@@ -0,0 +1,3 @@
+{% load i18n %}
+{% include "opportunities/include/filter_results.html" %}
+

=== added file 'harvest/templates/opportunities/xhr/package_details.html'
--- harvest/templates/opportunities/xhr/package_details.html	1970-01-01 00:00:00 +0000
+++ harvest/templates/opportunities/xhr/package_details.html	2010-08-02 04:53:41 +0000
@@ -0,0 +1,3 @@
+{% load i18n %}
+{% include "opportunities/include/package_details.html" %}
+