rrs: Add support for Release

Now Recipes and Maintainers page can be access by Release and Milestone,
to support this a url namespace was add also update views/templates
handle new URL's.

rrs/models.py: Add support model for store Release also foregin key in
Milestone.
rrs/admin.py: Add admin site for Release model.
rrs/fixtures/initial_data.json: Add initial data with Release/Milestone
relation.
rrs/{views, urls}.py: Add support for handle Release/Milestone.
templates/rrs: Update to handle new URL's.

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
This commit is contained in:
Aníbal Limón 2015-02-16 16:51:11 -06:00
parent 8c4d41b87b
commit a0053f426f
11 changed files with 440 additions and 184 deletions

View File

@ -7,12 +7,17 @@
from django.contrib import admin
from django.contrib.admin import DateFieldListFilter
from rrs.models import Milestone, Maintainer, RecipeMaintainerHistory, \
from rrs.models import Release, Milestone, Maintainer, RecipeMaintainerHistory, \
RecipeMaintainer, RecipeDistro, RecipeUpgrade, RecipeUpstream, \
RecipeUpstreamHistory
class ReleaseAdmin(admin.ModelAdmin):
search_fields = ['name']
model = Release
class MilestoneAdmin(admin.ModelAdmin):
search_fields = ['name']
list_filter = ['release__name']
model = Milestone
class MaintainerAdmin(admin.ModelAdmin):
@ -53,6 +58,7 @@ class RecipeUpstreamAdmin(admin.ModelAdmin):
'type', ('date', DateFieldListFilter), 'history']
model = RecipeUpstream
admin.site.register(Release, ReleaseAdmin)
admin.site.register(Milestone, MilestoneAdmin)
admin.site.register(Maintainer, MaintainerAdmin)
admin.site.register(RecipeMaintainerHistory, RecipeMaintainerHistoryAdmin)

View File

@ -7,7 +7,6 @@
"email": ""
}
},
{
"pk": 1,
"model": "rrs.maintainer",
@ -17,9 +16,10 @@
}
},
{
"pk": 1,
"model": "rrs.milestone",
"model": "rrs.release",
"fields": {
"name": "1.0",
"end_date": "2011-04-15",
@ -27,44 +27,60 @@
}
},
{
"pk": 2,
"pk": 41,
"model": "rrs.milestone",
"fields": {
"release" : 1,
"name": "1.0All",
"end_date": "2011-04-15",
"start_date": "2010-06-20"
}
},
{
"pk": 1,
"model": "rrs.milestone",
"fields": {
"release" : 1,
"name": "1.0M1",
"end_date": "2010-11-08",
"start_date": "2010-06-20"
}
},
{
"pk": 3,
"pk": 2,
"model": "rrs.milestone",
"fields": {
"release" : 1,
"name": "1.0M2",
"end_date": "2010-12-24",
"start_date": "2010-11-08"
}
},
{
"pk": 4,
"pk": 3,
"model": "rrs.milestone",
"fields": {
"release" : 1,
"name": "1.0M3",
"end_date": "2011-02-08",
"start_date": "2010-12-20"
}
},
{
"pk": 5,
"pk": 4,
"model": "rrs.milestone",
"fields": {
"release" : 1,
"name": "1.0M4",
"end_date": "2011-04-15",
"start_date": "2011-02-07"
}
},
{
"pk": 6,
"model": "rrs.milestone",
"pk": 2,
"model": "rrs.release",
"fields": {
"name": "1.1",
"end_date": "2011-10-06",
@ -72,44 +88,60 @@
}
},
{
"pk": 7,
"pk": 42,
"model": "rrs.milestone",
"fields": {
"release" : 2,
"name": "1.1All",
"end_date": "2011-10-06",
"start_date": "2011-04-18"
}
},
{
"pk": 5,
"model": "rrs.milestone",
"fields": {
"release" : 2,
"name": "1.1M1",
"end_date": "2011-06-13",
"start_date": "2011-04-18"
}
},
{
"pk": 8,
"pk": 6,
"model": "rrs.milestone",
"fields": {
"release" : 2,
"name": "1.1M2",
"end_date": "2011-07-25",
"start_date": "2011-05-30"
}
},
{
"pk": 9,
"pk": 7,
"model": "rrs.milestone",
"fields": {
"release" : 2,
"name": "1.1M3",
"end_date": "2011-08-15",
"start_date": "2011-07-11"
}
},
{
"pk": 10,
"pk": 8,
"model": "rrs.milestone",
"fields": {
"release" : 2,
"name": "1.1M4",
"end_date": "2011-10-06",
"start_date": "2011-08-15"
}
},
{
"pk": 11,
"model": "rrs.milestone",
"pk": 3,
"model": "rrs.release",
"fields": {
"name": "1.2",
"end_date": "2012-04-27",
@ -117,44 +149,60 @@
}
},
{
"pk": 12,
"pk": 43,
"model": "rrs.milestone",
"fields": {
"release" : 3,
"name": "1.2All",
"end_date": "2012-04-27",
"start_date": "2011-10-31"
}
},
{
"pk": 9,
"model": "rrs.milestone",
"fields": {
"release" : 3,
"name": "1.2M1",
"end_date": "2011-12-23",
"start_date": "2011-10-31"
}
},
{
"pk": 13,
"pk": 10,
"model": "rrs.milestone",
"fields": {
"release" : 3,
"name": "1.2M2",
"end_date": "2012-02-03",
"start_date": "2011-12-12"
}
},
{
"pk": 14,
"pk": 11,
"model": "rrs.milestone",
"fields": {
"release" : 3,
"name": "1.2M3",
"end_date": "2012-03-16",
"start_date": "2012-01-23"
}
},
{
"pk": 15,
"pk": 12,
"model": "rrs.milestone",
"fields": {
"release" : 3,
"name": "1.2M4",
"end_date": "2012-04-27",
"start_date": "2012-03-05"
}
},
{
"pk": 16,
"model": "rrs.milestone",
"pk": 4,
"model": "rrs.release",
"fields": {
"name": "1.3",
"end_date": "2012-10-26",
@ -162,53 +210,70 @@
}
},
{
"pk": 17,
"pk": 44,
"model": "rrs.milestone",
"fields": {
"release" : 4,
"name": "1.3All",
"end_date": "2012-10-26",
"start_date": "2012-05-14"
}
},
{
"pk": 13,
"model": "rrs.milestone",
"fields": {
"release" : 4,
"name": "1.3M1",
"end_date": "2012-06-29",
"start_date": "2012-05-14"
}
},
{
"pk": 18,
"pk": 14,
"model": "rrs.milestone",
"fields": {
"release" : 4,
"name": "1.3M2",
"end_date": "2012-07-27",
"start_date": "2012-06-11"
}
},
{
"pk": 19,
"pk": 15,
"model": "rrs.milestone",
"fields": {
"release" : 4,
"name": "1.3M3",
"end_date": "2012-08-24",
"start_date": "2012-07-08"
}
},
{
"pk": 20,
"pk": 16,
"model": "rrs.milestone",
"fields": {
"release" : 4,
"name": "1.3M4",
"end_date": "2012-09-21",
"start_date": "2012-08-06"
}
},
{
"pk": 21,
"pk": 17,
"model": "rrs.milestone",
"fields": {
"release" : 4,
"name": "1.3M5",
"end_date": "2012-10-26",
"start_date": "2012-09-19"
}
},
{
"pk": 22,
"model": "rrs.milestone",
"pk": 5,
"model": "rrs.release",
"fields": {
"name": "1.4",
"end_date": "2013-04-26",
@ -216,62 +281,80 @@
}
},
{
"pk": 23,
"pk": 45,
"model": "rrs.milestone",
"fields": {
"release" : 5,
"name": "1.4All",
"end_date": "2013-04-26",
"start_date": "2012-10-29"
}
},
{
"pk": 18,
"model": "rrs.milestone",
"fields": {
"release" : 5,
"name": "1.4M1",
"end_date": "2012-12-14",
"start_date": "2012-10-29"
}
},
{
"pk": 24,
"pk": 19,
"model": "rrs.milestone",
"fields": {
"release" : 5,
"name": "1.4M2",
"end_date": "2013-01-11",
"start_date": "2012-11-26"
}
},
{
"pk": 25,
"pk": 20,
"model": "rrs.milestone",
"fields": {
"release" : 5,
"name": "1.4M3",
"end_date": "2013-02-08",
"start_date": "2012-12-24"
}
},
{
"pk": 26,
"pk": 21,
"model": "rrs.milestone",
"fields": {
"release" : 5,
"name": "1.4M4",
"end_date": "2013-03-08",
"start_date": "2013-01-21"
}
},
{
"pk": 27,
"pk": 22,
"model": "rrs.milestone",
"fields": {
"release" : 5,
"name": "1.4M5",
"end_date": "2013-04-05",
"start_date": "2013-02-18"
}
},
{
"pk": 28,
"pk": 23,
"model": "rrs.milestone",
"fields": {
"release" : 5,
"name": "1.4M6",
"end_date": "2013-04-26",
"start_date": "2013-03-18"
}
},
{
"pk": 29,
"model": "rrs.milestone",
"pk": 6,
"model": "rrs.release",
"fields": {
"name": "1.5",
"end_date": "2013-10-18",
@ -279,53 +362,70 @@
}
},
{
"pk": 30,
"pk": 46,
"model": "rrs.milestone",
"fields": {
"release" : 6,
"name": "1.5All",
"end_date": "2013-10-18",
"start_date": "2013-05-06"
}
},
{
"pk": 23,
"model": "rrs.milestone",
"fields": {
"release" : 6,
"name": "1.5M1",
"end_date": "2013-06-21",
"start_date": "2013-05-06"
}
},
{
"pk": 31,
"pk": 24,
"model": "rrs.milestone",
"fields": {
"release" : 6,
"name": "1.5M2",
"end_date": "2013-07-19",
"start_date": "2013-06-03"
}
},
{
"pk": 32,
"pk": 25,
"model": "rrs.milestone",
"fields": {
"release" : 6,
"name": "1.5M3",
"end_date": "2013-08-16",
"start_date": "2013-07-01"
}
},
{
"pk": 33,
"pk": 26,
"model": "rrs.milestone",
"fields": {
"release" : 6,
"name": "1.5M4",
"end_date": "2013-09-13",
"start_date": "2013-07-29"
}
},
{
"pk": 34,
"pk": 27,
"model": "rrs.milestone",
"fields": {
"release" : 6,
"name": "1.5M5",
"end_date": "2013-10-18",
"start_date": "2013-08-26"
}
},
{
"pk": 35,
"model": "rrs.milestone",
"pk": 7,
"model": "rrs.release",
"fields": {
"name": "1.6",
"end_date": "2014-05-25",
@ -333,53 +433,70 @@
}
},
{
"pk": 36,
"pk": 47,
"model": "rrs.milestone",
"fields": {
"release" : 7,
"name": "1.6All",
"end_date": "2014-05-25",
"start_date": "2013-11-11"
}
},
{
"pk": 28,
"model": "rrs.milestone",
"fields": {
"release" : 7,
"name": "1.6M1",
"end_date": "2013-12-20",
"start_date": "2013-11-11"
}
},
{
"pk": 37,
"pk": 29,
"model": "rrs.milestone",
"fields": {
"release" : 7,
"name": "1.6M2",
"end_date": "2014-01-31",
"start_date": "2013-12-09"
}
},
{
"pk": 38,
"pk": 30,
"model": "rrs.milestone",
"fields": {
"release" : 7,
"name": "1.6M3",
"end_date": "2014-02-28",
"start_date": "2014-01-13"
}
},
{
"pk": 39,
"pk": 31,
"model": "rrs.milestone",
"fields": {
"release" : 7,
"name": "1.6M4",
"end_date": "2014-03-28",
"start_date": "2014-02-10"
}
},
{
"pk": 40,
"pk": 32,
"model": "rrs.milestone",
"fields": {
"release" : 7,
"name": "1.6M5",
"end_date": "2014-05-25",
"start_date": "2014-03-25"
}
},
{
"pk": 41,
"model": "rrs.milestone",
"pk": 8,
"model": "rrs.release",
"fields": {
"name": "1.7",
"end_date": "2014-10-31",
@ -387,44 +504,60 @@
}
},
{
"pk": 42,
"pk": 48,
"model": "rrs.milestone",
"fields": {
"release" : 8,
"name": "1.7All",
"end_date": "2014-10-31",
"start_date": "2014-05-19"
}
},
{
"pk": 33,
"model": "rrs.milestone",
"fields": {
"release" : 8,
"name": "1.7M1",
"end_date": "2014-07-11",
"start_date": "2014-05-19"
}
},
{
"pk": 43,
"pk": 34,
"model": "rrs.milestone",
"fields": {
"release" : 8,
"name": "1.7M2",
"end_date": "2014-08-15",
"start_date": "2014-06-30"
}
},
{
"pk": 44,
"pk": 35,
"model": "rrs.milestone",
"fields": {
"release" : 8,
"name": "1.7M3",
"end_date": "2014-09-19",
"start_date": "2014-08-04"
}
},
{
"pk": 45,
"pk": 36,
"model": "rrs.milestone",
"fields": {
"release" : 8,
"name": "1.7M4",
"end_date": "2014-10-31",
"start_date": "2014-09-08"
}
},
{
"pk": 46,
"model": "rrs.milestone",
"pk": 9,
"model": "rrs.release",
"fields": {
"name": "1.8",
"end_date": "2015-04-24",
@ -432,36 +565,50 @@
}
},
{
"pk": 47,
"pk": 49,
"model": "rrs.milestone",
"fields": {
"release" : 9,
"name": "1.8All",
"end_date": "2014-12-19",
"start_date": "2014-11-03"
}
},
{
"pk": 37,
"model": "rrs.milestone",
"fields": {
"release" : 9,
"name": "1.8M1",
"end_date": "2014-12-19",
"start_date": "2014-11-03"
}
},
{
"pk": 48,
"pk": 38,
"model": "rrs.milestone",
"fields": {
"release" : 9,
"name": "1.8M2",
"end_date": "2015-01-30",
"start_date": "2014-12-03"
}
},
{
"pk": 49,
"pk": 39,
"model": "rrs.milestone",
"fields": {
"release" : 9,
"name": "1.8M3",
"end_date": "2015-03-06",
"start_date": "2015-01-14"
}
},
{
"pk": 50,
"pk": 40,
"model": "rrs.milestone",
"fields": {
"release" : 9,
"name": "1.8M4",
"end_date": "2015-04-24",
"start_date": "2015-02-19"

View File

@ -8,9 +8,19 @@ from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding model 'Release'
db.create_table('rrs_release', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)),
('start_date', self.gf('django.db.models.fields.DateField')()),
('end_date', self.gf('django.db.models.fields.DateField')()),
))
db.send_create_signal('rrs', ['Release'])
# Adding model 'Milestone'
db.create_table('rrs_milestone', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('release', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['rrs.Release'])),
('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)),
('start_date', self.gf('django.db.models.fields.DateField')()),
('end_date', self.gf('django.db.models.fields.DateField')()),
@ -89,6 +99,9 @@ class Migration(SchemaMigration):
def backwards(self, orm):
# Deleting model 'Release'
db.delete_table('rrs_release')
# Deleting model 'Milestone'
db.delete_table('rrs_milestone')
@ -167,7 +180,7 @@ class Migration(SchemaMigration):
'layerbranch': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.LayerBranch']"}),
'license': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
'pn': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
'provides': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'provides': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'blank': 'True'}),
'pv': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
'section': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
'src_uri': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
@ -185,6 +198,7 @@ class Migration(SchemaMigration):
'end_date': ('django.db.models.fields.DateField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}),
'release': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rrs.Release']"}),
'start_date': ('django.db.models.fields.DateField', [], {})
},
'rrs.recipedistro': {
@ -236,6 +250,13 @@ class Migration(SchemaMigration):
'end_date': ('django.db.models.fields.DateTimeField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'start_date': ('django.db.models.fields.DateTimeField', [], {})
},
'rrs.release': {
'Meta': {'object_name': 'Release'},
'end_date': ('django.db.models.fields.DateField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}),
'start_date': ('django.db.models.fields.DateField', [], {})
}
}

View File

@ -15,29 +15,55 @@ from django.db import models
from django.db.models.query import Q
from layerindex.models import Recipe
class Milestone(models.Model):
class Release(models.Model):
name = models.CharField(max_length=100, unique=True)
start_date = models.DateField()
end_date = models.DateField()
""" Get current milestone """
@staticmethod
def get_by_date(date):
release_qry = Release.objects.filter(start_date__lte = date,
end_date__gte = date).order_by('-end_date')
if release_qry:
return release_qry[0]
else:
return None
@staticmethod
def get_current():
current = date.today()
current_milestone = Milestone.get_by_date(current)
return current_milestone or Milestone.objects.filter().order_by('-id')[0]
current_release = Release.get_by_date(current)
""" Get milestone by date """
return current_release or Release.objects.filter().order_by('-end_date')[0]
def __unicode__(self):
return '%s: %s - %s' % (self.name, self.start_date, self.end_date)
class Milestone(models.Model):
release = models.ForeignKey(Release)
name = models.CharField(max_length=100, unique=True)
start_date = models.DateField()
end_date = models.DateField()
""" Get milestone by release and date """
@staticmethod
def get_by_date(date):
milestone_set = Milestone.objects.filter(start_date__lte = date,
end_date__gte = date).order_by('-id')
def get_by_release_and_date(release, date):
milestone_set = Milestone.objects.filter(release = release,
start_date__lte = date, end_date__gte = date).order_by('-end_date')
if milestone_set:
return milestone_set[0]
else:
return None
""" Get current milestone """
@staticmethod
def get_current(release):
current = date.today()
current_milestone = Milestone.get_by_release_and_date(release, current)
return current_milestone or Milestone.objects.filter().order_by('-end_date')[0]
""" Get week intervals from start and end of Milestone """
def get_week_intervals(self):
from datetime import timedelta
@ -60,7 +86,7 @@ class Milestone(models.Model):
return weeks
def __unicode__(self):
return '%s' % (self.name)
return '%s: %s - %s' % (self.name, self.start_date, self.end_date)
class Maintainer(models.Model):
name = models.CharField(max_length=255, unique=True)
@ -256,14 +282,10 @@ class RecipeUpgrade(models.Model):
commit_date = models.DateTimeField()
@staticmethod
def get_by_recipe_and_date(recipe, current_date):
rup_qry = RecipeUpgrade.objects.filter(recipe = recipe,
commit_date__lte = current_date).order_by('commit_date')
if rup_qry:
return rup_qry[0]
else:
return None
def get_by_recipe_and_date(recipe, end_date):
ru = RecipeUpgrade.objects.filter(recipe = recipe,
commit_date__lte = end_date)
return ru[0] if ru else None
def short_sha1(self):
return self.sha1[0:6]

View File

@ -6,13 +6,21 @@ from django.conf.urls import patterns, url
from layerindex.views import EditProfileFormView
from rrs.models import Milestone
from rrs.models import Release, Milestone
from rrs.views import RecipeListView, RecipeDetailView, MaintainerListView
urlpatterns = patterns('',
url(r'^$', redirect_to, {'url' : reverse_lazy('recipes', args=(Milestone.get_current().name,))},
url(r'^$', redirect_to,
{'url' :
reverse_lazy('recipes',
args = (
Release.get_current().name,
Milestone.get_current(Release.get_current()).name,
)
)
},
name='frontpage'),
url(r'^recipes/(?P<milestone_name>.*)/$',
url(r'^recipes/(?P<release_name>.*)/(?P<milestone_name>.*)/$',
RecipeListView.as_view(
template_name='rrs/recipes.html'),
name='recipes'),
@ -20,7 +28,7 @@ urlpatterns = patterns('',
RecipeDetailView.as_view(
template_name='rrs/recipedetail.html'),
name='recipedetail'),
url(r'^maintainers/(?P<milestone_name>.*)/$',
url(r'^maintainers/(?P<release_name>.*)/(?P<milestone_name>.*)/$',
MaintainerListView.as_view(
template_name='rrs/maintainers.html'),
name="maintainers"),

View File

@ -7,7 +7,7 @@ from django.views.generic import ListView, DetailView
from django.core.urlresolvers import resolve
from layerindex.models import Recipe
from rrs.models import Milestone, Maintainer, RecipeMaintainerHistory, \
from rrs.models import Release, Milestone, Maintainer, RecipeMaintainerHistory, \
RecipeMaintainer, RecipeUpstreamHistory, RecipeUpstream, \
RecipeDistro, RecipeUpgrade
@ -49,9 +49,6 @@ def _get_milestone_statistics(milestone, maintainer_name=None):
RecipeUpstream.get_recipes_cant_be_updated(recipe_upstream_history).count()
milestone_statistics['unknown'] = \
RecipeUpstream.get_recipes_unknown(recipe_upstream_history).count()
milestone_statistics['percentage'] = "%.0f" % \
((float(milestone_statistics['up_to_date']) /
float(milestone_statistics['all'])) * 100)
else:
recipe_maintainer_history = RecipeMaintainerHistory.get_by_end_date(
milestone.end_date)
@ -81,6 +78,9 @@ def _get_milestone_statistics(milestone, maintainer_name=None):
else:
milestone_statistics['unknown'] += 1
if milestone_statistics['all'] == 0:
milestone_statistics['percentage'] = 0
else:
milestone_statistics['percentage'] = "%.0f" % \
((float(milestone_statistics['up_to_date']) /
float(milestone_statistics['all'])) * 100)
@ -105,8 +105,11 @@ class RecipeListView(ListView):
context_object_name = 'recipe_list'
def get_queryset(self):
self.release_name = self.kwargs['release_name']
release = get_object_or_404(Release, name=self.release_name)
self.milestone_name = self.kwargs['milestone_name']
milestone = get_object_or_404(Milestone, name=self.milestone_name)
milestone = get_object_or_404(Milestone, release = release, name=self.milestone_name)
if 'upstream_status' in self.request.GET.keys():
self.upstream_status = self.request.GET['upstream_status']
@ -185,8 +188,11 @@ class RecipeListView(ListView):
context['this_url_name'] = resolve(self.request.path_info).url_name
context['release_name'] = self.release_name
context['all_releases'] = Release.objects.filter().order_by('-end_date')
context['milestone_name'] = self.milestone_name
context['all_milestones'] = Milestone.objects.filter().order_by('-end_date')
context['all_milestones'] = Milestone.objects.filter(release__name =
self.release_name).order_by('-end_date')
context['recipes_percentage'] = self.milestone_statistics['percentage']
context['recipes_up_to_date'] = self.milestone_statistics['up_to_date']
@ -223,6 +229,7 @@ class RecipeListView(ListView):
class RecipeUpgradeDetail():
title = None
version = None
release_name = None
milestone_name = None
date = None
maintainer_name = None
@ -230,10 +237,11 @@ class RecipeUpgradeDetail():
commit = None
commit_url = None
def __init__(self, title, version, milestone_name, date,
def __init__(self, title, version, release_name, milestone_name, date,
maintainer_name, is_recipe_maintainer, commit, commit_url):
self.title = title
self.version = version
self.release_name = release_name
self.milestone_name = milestone_name
self.date = date
self.maintainer_name = maintainer_name
@ -242,14 +250,19 @@ class RecipeUpgradeDetail():
self.commit_url = commit_url
def _get_recipe_upgrade_detail(recipe_upgrade):
milestone = Milestone.get_by_date(recipe_upgrade.commit_date)
if milestone is None:
milestone_name = ''
recipe_maintainer_history = None
else:
milestone_name = milestone.name
recipe_maintainer_history = RecipeMaintainerHistory.get_by_end_date(
milestone.end_date)
release_name = ''
milestone_name = ''
recipe_maintainer_history = None
release = Release.get_by_date(recipe_upgrade.commit_date)
if release:
release_name = release.name
milestone = Milestone.get_by_release_and_date(release,
recipe_upgrade.commit_date)
if milestone:
milestone_name = milestone.name
recipe_maintainer_history = RecipeMaintainerHistory.get_by_end_date(
milestone.end_date)
is_recipe_maintainer = False
maintainer_name = ''
@ -267,8 +280,8 @@ def _get_recipe_upgrade_detail(recipe_upgrade):
'/commit/?id=' + recipe_upgrade.sha1
rud = RecipeUpgradeDetail(recipe_upgrade.title, recipe_upgrade.version, \
milestone_name, recipe_upgrade.commit_date, maintainer_name, \
is_recipe_maintainer, commit, commit_url)
release_name, milestone_name, recipe_upgrade.commit_date, \
maintainer_name, is_recipe_maintainer, commit, commit_url)
return rud
@ -279,22 +292,28 @@ class RecipeDetailView(DetailView):
context = super(RecipeDetailView, self).get_context_data(**kwargs)
recipe = self.get_object()
milestone = Milestone.get_current()
release = Release.get_current()
context['release_name'] = release.name
milestone = Milestone.get_current(release)
context['milestone_name'] = milestone.name
context['upstream_status'] = ''
context['upstream_version'] = ''
context['upstream_no_update_reason'] = ''
recipe_upstream_history = RecipeUpstreamHistory.get_last_by_date_range(
milestone.start_date,
milestone.end_date
)
recipe_upstream = RecipeUpstream.get_by_recipe_and_history(
recipe, recipe_upstream_history)
if recipe_upstream.status == 'N' and recipe_upstream.no_update_reason:
recipe_upstream.status = 'C'
context['upstream_status'] = \
RecipeUpstream.RECIPE_UPSTREAM_STATUS_CHOICES_DICT[recipe_upstream.status]
context['upstream_version'] = recipe_upstream.version
context['upstream_no_update_reason'] = recipe_upstream.no_update_reason
if recipe_upstream_history:
recipe_upstream = RecipeUpstream.get_by_recipe_and_history(
recipe, recipe_upstream_history)
if recipe_upstream:
if recipe_upstream.status == 'N' and recipe_upstream.no_update_reason:
recipe_upstream.status = 'C'
context['upstream_status'] = \
RecipeUpstream.RECIPE_UPSTREAM_STATUS_CHOICES_DICT[recipe_upstream.status]
context['upstream_version'] = recipe_upstream.version
context['upstream_no_update_reason'] = recipe_upstream.no_update_reason
self.recipe_maintainer_history = RecipeMaintainerHistory.get_last()
recipe_maintainer = RecipeMaintainer.objects.filter(recipe = recipe,
@ -345,8 +364,12 @@ class MaintainerListView(ListView):
maintainer_list = []
self.maintainer_count = 0
self.release_name = self.kwargs['release_name']
release = get_object_or_404(Release, name=self.release_name)
self.milestone_name = self.kwargs['milestone_name']
milestone = get_object_or_404(Milestone, name=self.milestone_name)
milestone = get_object_or_404(Milestone, release = release,
name=self.milestone_name)
milestone_week_intervals = milestone.get_week_intervals()
self.milestone_statistics = _get_milestone_statistics(milestone)
@ -394,8 +417,11 @@ class MaintainerListView(ListView):
context['this_url_name'] = resolve(self.request.path_info).url_name
context['release_name'] = self.release_name
context['all_releases'] = Release.objects.filter().order_by('-end_date')
context['milestone_name'] = self.milestone_name
context['all_milestones'] = Milestone.objects.filter().order_by('-id')
context['all_milestones'] = Milestone.objects.filter(release__name =
self.release_name).order_by('-end_date')
context['recipes_percentage'] = self.milestone_statistics['percentage']
context['recipes_up_to_date'] = self.milestone_statistics['up_to_date']

View File

@ -14,6 +14,43 @@
{% endcomment %}
{% block topfunctions %}
<ul class="nav">
<li class="divider-vertical" style="display; list-item;"/>
{% block release_selector %}
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
Release: <b>{{ release_name }}</b>
<b class="caret"></b>
</a>
<ul class="dropdown-menu">
{% for r in all_releases %}
<li><a href="{% url this_url_name r.name r.name|add:"All" %}{{ extra_url_param }}">
{% if r.name = release_name %}<b>{% endif %}
{{ r.name }}
{% if r.name = release_name %}</b>{% endif %}
</a></li>
{% endfor %}
</ul>
</li>
{% endblock %}
{% block milestone_selector %}
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
Milestone: <b>{{ milestone_name }}</b>
<b class="caret"></b>
</a>
<ul class="dropdown-menu">
{% for m in all_milestones %}
<li><a href="{% url this_url_name release_name m.name %}{{ extra_url_param }}">
{% if m.name = milestone_name %}<b>{% endif %}
{{ m.name }}
{% if m.name = milestone_name %}</b>{% endif %}
</a></li>
{% endfor %}
</ul>
</li>
{% endblock %}
</ul>
{% endblock %}
{% block content %}
@ -21,24 +58,8 @@
<div class="navbar">
<div class="navbar-inner">
<span class="brand">{{ milestone_name }}</span>
<ul class="nav">
{% block milestone_selector %}
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
Milestone: <b>{{ milestone_name }}</b>
<b class="caret"></b>
</a>
<ul class="dropdown-menu">
{% for m in all_milestones %}
<li><a href="{% url this_url_name m.name %}{{ extra_url_param }}">
{% if m.name = milestone_name %}<b>{% endif %}
{{ m.name }}
{% if m.name = milestone_name %}</b>{% endif %}
</a></li>
{% endfor %}
</ul>
</li>
{% endblock %}
<li class="divider-vertical"></li>
<li class="lead" id="percentage"><strong>{{ recipes_percentage }}%</strong> done</li>
<li class="divider-vertical"></li>
@ -64,7 +85,7 @@
<a href="#">
{% else %}
<li>
<a href="{% url 'recipes' milestone_name %}{{ extra_url_param }}">
<a href="{% url 'recipes' release_name milestone_name %}{{ extra_url_param }}">
{% endif %}
Recipes status</a>
</li>
@ -74,7 +95,7 @@
<a href="#">
{% else %}
<li>
<a href="{% url 'maintainers' milestone_name %}">
<a href="{% url 'maintainers' release_name milestone_name %}">
{% endif %}
Maintainer statistics</a>
</li>

View File

@ -24,8 +24,9 @@
<span class="badge" style="margin-top:11px;"></span>
</li>
</ul>
<form class="navbar-form pull-right">
<input type="text" class="input-xxlarge pull-right" placeholder="Search maintainers" id="filter">
<form id="form-search" class="navbar-form pull-right">
<input type="text" class="input-xxlarge" placeholder="Search maintainers" id="filter">
<button type="submit" value="Search" class="btn btn-info" id="btn-search">Search</button>
</form>
</div>
</div>
@ -33,27 +34,27 @@
<div id="no_maintainers_alert" class="alert">
No maintainers found <a href="#" id="view-all-maintainers" style="margin-left:10px;">View all maintainers</a>
</div>
<table class="table table-bordered table-hovere" id="statistics-table">
<thead>
<tr>
<th class="sorted">Maintainer<b class="caret"/></th>
<th class="muted">Assigned recipes</th>
<th class="muted">Up-to-date</th>
<th>Not updated</th>
<th class="muted">Can't be updated</th>
<th class="muted">Unknown</th>
<th>% done</th>
<table class="table table-bordered table-hover" id="statistics-table">
<thead>
<tr>
<th class="sorted">Maintainer<b class="caret"/></th>
<th class="muted">Assigned recipes</th>
<th class="muted">Up-to-date</th>
<th>Not updated</th>
<th class="muted">Can't be updated</th>
<th class="muted">Unknown</th>
<th>% done</th>
{% for w in milestone_weeks %}
{% if current_week == forloop.counter0 %}
<th class="current-wk">
{% else %}
<th class="muted">
{% endif %}
wk{{ w }}
</th>
{% endfor %}
</tr>
{% for w in milestone_weeks %}
{% if current_week == forloop.counter0 %}
<th class="current-wk">
{% else %}
<th class="muted">
{% endif %}
wk{{ w }}
</th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for ml in maintainer_list %}
@ -62,27 +63,27 @@
{{ ml.name }}
</td>
<td>
<a href="{% url 'recipes' milestone_name %}?maintainer_name={{ ml.name|urlencode }}">
<a href="{% url 'recipes' release_name milestone_name %}?maintainer_name={{ ml.name|urlencode }}">
{{ ml.recipes_all }}
</a>
</td>
<td>
<a href="{% url 'recipes' milestone_name %}?upstream_status={{ "Up-to-date"|urlencode }}&maintainer_name={{ ml.name|urlencode }}">
<a href="{% url 'recipes' release_name milestone_name %}?upstream_status={{ "Up-to-date"|urlencode }}&maintainer_name={{ ml.name|urlencode }}">
{{ ml.recipes_up_to_date }}
</a>
</td>
<td>
<a href="{% url 'recipes' milestone_name %}?upstream_status={{ "Not updated"|urlencode }}&maintainer_name={{ ml.name|urlencode }}">
<a href="{% url 'recipes' release_name milestone_name %}?upstream_status={{ "Not updated"|urlencode }}&maintainer_name={{ ml.name|urlencode }}">
{{ ml.recipes_not_updated }}
</a>
</td>
<td>
<a href="{% url 'recipes' milestone_name %}?upstream_status={{ "Can't be updated"|urlencode }}&maintainer_name={{ ml.name|urlencode }}">
<a href="{% url 'recipes' release_name milestone_name %}?upstream_status={{ "Can't be updated"|urlencode }}&maintainer_name={{ ml.name|urlencode }}">
{{ ml.recipes_cant_be_updated }}
</a>
</td>
<td>
<a href="{% url 'recipes' milestone_name %}?upstream_status={{ "Unknown"|urlencode }}&maintainer_name={{ ml.name|urlencode }}">
<a href="{% url 'recipes' release_name milestone_name %}?upstream_status={{ "Unknown"|urlencode }}&maintainer_name={{ ml.name|urlencode }}">
{{ ml.recipes_unknown }}
</a>
</td>
@ -103,7 +104,6 @@
{% endblock %}
{% block scripts %}
{% if maintainer_count > 0 %}
<script src="{% static "js/uitablefilter.js" %}"></script>
<script src="{% static "js/jquery.tablesorter.js" %}"></script>
<script>
@ -131,6 +131,20 @@ $(document).ready(function() {
}
}
$("#form-search").submit(function( event ) {
search_text = $("#filter").val()
$.uiTableFilter(statisticsTable, search_text);
updateMaintainerCount()
event.preventDefault();
});
$("#view-all-maintainers").click(function() {
$.uiTableFilter(statisticsTable, '');
$("#filter").val('')
updateMaintainerCount()
});
{% if maintainer_count > 0 %}
$(statisticsTable).tablesorter({
sortList: [[0,0]],
headers: {
@ -150,20 +164,9 @@ $(document).ready(function() {
14: { sorter: false },
}
});
$("#filter").keyup(function() {
$.uiTableFilter(statisticsTable, this.value);
updateMaintainerCount()
});
$("#view-all-maintainers").click(function() {
$.uiTableFilter(statisticsTable, '');
$("#filter").val('')
updateMaintainerCount()
});
{% endif %}
updateMaintainerCount()
});
</script>
{% endif %}
{% endblock %}

View File

@ -45,7 +45,7 @@
<li class="lead">Upstream version: <strong>{{ upstream_version }}</strong></li>
{% endif %}
<li class="divider-vertical"></li>
<li class="lead">Maintainer: <strong><a href="{% url recipes milestone_name %}?maintainer_name={{ maintainer_name|urlencode }}">{{ maintainer_name }}</a></strong></li>
<li class="lead">Maintainer: <strong><a href="{% url recipes release_name milestone_name %}?maintainer_name={{ maintainer_name|urlencode }}">{{ maintainer_name }}</a></strong></li>
<li class="divider-vertical"></li>
</ul>
</div>
@ -79,14 +79,14 @@
<td>{{ rud.title }}</td>
<td>{{ rud.version }}</td>
{% if rud.milestone_name %}
<td><a href="{% url recipes rud.milestone_name %}">{{ rud.milestone_name }}</a></td>
<td><a href="{% url recipes rud.release_name rud.milestone_name %}">{{ rud.milestone_name }}</a></td>
{% else %}
<td>{{ rud.milestone_name }}</td>
{% endif %}
<td>{{ rud.date }}</td>
{% if rud.is_recipe_maintainer %}
<td><a href="{% url recipes rud.milestone_name %}?maintainer_name={{ rud.maintainer_name|urlencode }}">{{ rud.maintainer_name }}</a></td>
<td><a href="{% url recipes rud.release_name rud.milestone_name %}?maintainer_name={{ rud.maintainer_name|urlencode }}">{{ rud.maintainer_name }}</a></td>
{% else %}
<td>{{ rud.maintainer_name }}</a></td>
{% endif %}

View File

@ -212,17 +212,6 @@ $(document).ready(function() {
updateMaintainerSelected()
}
$(recipesTable).tablesorter({
sortList: [[0,0]],
headers: {
1: { sorter: false },
2: { sorter: false },
3: { sorter: false },
4: { sorter: false },
5: { sorter: false },
}
});
$("#form-search").submit(function( event ) {
upstreamStatus = 'All'
maintainer = 'All'
@ -253,6 +242,19 @@ $(document).ready(function() {
updateRecipeCount()
});
{% if recipe_list_count > 0 %}
$(recipesTable).tablesorter({
sortList: [[0,0]],
headers: {
1: { sorter: false },
2: { sorter: false },
3: { sorter: false },
4: { sorter: false },
5: { sorter: false },
}
});
{% endif %}
applyFilters()
updateRecipeCount()
});