rrs: Add support for export Recipes reports by Release/Milestone

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
This commit is contained in:
Aníbal Limón 2015-02-16 23:26:55 -06:00 committed by Paul Eggleton
parent 73a90437c3
commit e1e3b37243
3 changed files with 85 additions and 53 deletions

View File

@ -1,7 +1,7 @@
from django.conf.urls import patterns, include, url from django.conf.urls import patterns, include, url
from rrs.models import Release, Milestone from rrs.models import Release, Milestone
from rrs.views import RecipeListView, RecipeDetailView, MaintainerListView from rrs.views import RecipeListView, recipes_report, RecipeDetailView, MaintainerListView
urlpatterns = patterns('', urlpatterns = patterns('',
url(r'^$', redirect_to, url(r'^$', redirect_to,
@ -18,6 +18,9 @@ urlpatterns = patterns('',
RecipeListView.as_view( RecipeListView.as_view(
template_name='rrs/recipes.html'), template_name='rrs/recipes.html'),
name='recipes'), name='recipes'),
url(r'^recipesreport/(?P<release_name>.*)/(?P<milestone_name>.*)/$',
recipes_report,
name="recipesreport"),
url(r'^recipedetail/(?P<pk>\d+)/$', url(r'^recipedetail/(?P<pk>\d+)/$',
RecipeDetailView.as_view( RecipeDetailView.as_view(
template_name='rrs/recipedetail.html'), template_name='rrs/recipedetail.html'),

View File

@ -1,5 +1,8 @@
import urllib import urllib
import csv
from django.http import HttpResponse
from datetime import date from datetime import date
from django.http import Http404 from django.http import Http404
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
@ -101,6 +104,63 @@ class RecipeList():
self.name = name self.name = name
self.summary = summary self.summary = summary
def _get_recipe_list(milestone):
recipe_maintainer_history = RecipeMaintainerHistory.get_by_end_date(
milestone.end_date)
recipe_upstream_history = RecipeUpstreamHistory.get_last_by_date_range(
milestone.start_date,
milestone.end_date
)
recipe_list = []
current_date = date.today()
for recipe in Recipe.objects.filter().order_by('pn'):
if current_date >= milestone.start_date and \
current_date <= milestone.end_date:
version = recipe.pv
else:
rup = RecipeUpgrade.get_by_recipe_and_date(recipe,
milestone.end_date)
if rup is None: # Recipe don't exit in this Milestone
continue
version = rup.version
recipe_upstream = RecipeUpstream.get_by_recipe_and_history(
recipe, recipe_upstream_history)
if recipe_upstream is None:
upstream_status = ''
upstream_version = ''
else:
if recipe_upstream.status == 'N' and recipe_upstream.no_update_reason:
recipe_upstream.status = 'C'
upstream_status = \
RecipeUpstream.RECIPE_UPSTREAM_STATUS_CHOICES_DICT[
recipe_upstream.status]
if upstream_status == 'Downgrade':
upstream_status = 'Unknown' # Downgrade is displayed as Unknown
upstream_version = recipe_upstream.version
maintainer = RecipeMaintainer.get_maintainer_by_recipe_and_history(
recipe, recipe_maintainer_history)
if maintainer is None:
maintainer_name = ''
else:
maintainer_name = maintainer.name
recipe_list_item = RecipeList(recipe.id, recipe.pn, recipe.summary)
recipe_list_item.version = version
recipe_list_item.upstream_status = upstream_status
recipe_list_item.upstream_version = upstream_version
recipe_list_item.maintainer_name = maintainer_name
recipe_list.append(recipe_list_item)
return recipe_list
class RecipeListView(ListView): class RecipeListView(ListView):
context_object_name = 'recipe_list' context_object_name = 'recipe_list'
@ -127,58 +187,8 @@ class RecipeListView(ListView):
self.recipe_maintainer_history = RecipeMaintainerHistory.get_by_end_date( self.recipe_maintainer_history = RecipeMaintainerHistory.get_by_end_date(
milestone.end_date) milestone.end_date)
recipe_upstream_history = RecipeUpstreamHistory.get_last_by_date_range(
milestone.start_date,
milestone.end_date
)
recipe_list = []
self.recipe_list_count = 0
current_date = date.today()
for recipe in Recipe.objects.filter().order_by('pn'):
if current_date >= milestone.start_date and \
current_date <= milestone.end_date:
version = recipe.pv
else:
rup = RecipeUpgrade.get_by_recipe_and_date(recipe,
milestone.end_date)
if rup is None: # Recipe don't exit in this Milestone
continue
version = rup.version
recipe_upstream = RecipeUpstream.get_by_recipe_and_history(
recipe, recipe_upstream_history)
if recipe_upstream is None:
upstream_status = ''
upstream_version = ''
else:
if recipe_upstream.status == 'N' and recipe_upstream.no_update_reason:
recipe_upstream.status = 'C'
upstream_status = \
RecipeUpstream.RECIPE_UPSTREAM_STATUS_CHOICES_DICT[
recipe_upstream.status]
if upstream_status == 'Downgrade':
upstream_status = 'Unknown' # Downgrade is displayed as Unknown
upstream_version = recipe_upstream.version
maintainer = RecipeMaintainer.get_maintainer_by_recipe_and_history(
recipe, self.recipe_maintainer_history)
if maintainer is None:
maintainer_name = ''
else:
maintainer_name = maintainer.name
recipe_list_item = RecipeList(recipe.id, recipe.pn, recipe.summary)
recipe_list_item.version = version
recipe_list_item.upstream_status = upstream_status
recipe_list_item.upstream_version = upstream_version
recipe_list_item.maintainer_name = maintainer_name
recipe_list.append(recipe_list_item)
recipe_list = _get_recipe_list(milestone)
self.recipe_list_count = len(recipe_list) self.recipe_list_count = len(recipe_list)
return recipe_list return recipe_list
@ -226,6 +236,24 @@ class RecipeListView(ListView):
return context return context
def recipes_report(request, release_name, milestone_name):
release = get_object_or_404(Release, name=release_name)
milestone = get_object_or_404(Milestone, release = release, name=milestone_name)
recipe_list = _get_recipe_list(milestone)
response = HttpResponse(mimetype='text/csv')
response['Content-Disposition'] = 'attachment; filename="%s.csv"' % (milestone_name)
writer = csv.writer(response)
writer.writerow(['Upstream status', 'Name', 'Version',
'Upstream version', 'Maintainer', 'Summary'])
for r in recipe_list:
writer.writerow([r.upstream_status, r.name, r.version,
r.upstream_version, r.maintainer_name.encode('utf-8'), r.summary])
return response
class RecipeUpgradeDetail(): class RecipeUpgradeDetail():
title = None title = None
version = None version = None
@ -434,3 +462,4 @@ class MaintainerListView(ListView):
context['current_week'] = self.current_week context['current_week'] = self.current_week
return context return context

View File

@ -71,7 +71,7 @@
<li class="divider-vertical"></li> <li class="divider-vertical"></li>
<li class="lead" id="unknown-recipes">Unknown: <span class="text-warning">{{ recipes_unknown }}</strong></li> <li class="lead" id="unknown-recipes">Unknown: <span class="text-warning">{{ recipes_unknown }}</strong></li>
</ul> </ul>
<a href="#" class="btn pull-right">Export recipe list</a> <a href="{% url 'recipesreport' release_name milestone_name %}" class="btn pull-right">Export recipe list</a>
<ul class="nav"> <ul class="nav">
{% block navs %}{% endblock %} {% block navs %}{% endblock %}
</ul> </ul>