aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAníbal Limón <anibal.limon@linux.intel.com>2015-02-19 15:01:08 +0000
committerPaul Eggleton <paul.eggleton@linux.intel.com>2018-05-04 23:57:51 +1200
commit665dfae57735149cb60d40b6f2a6bf6db1577831 (patch)
treed2c8551d6c360f42709315f187db77eb01e662be
parentd61f95164b8a57b5053c6ea3b324bd2ae74757fb (diff)
downloadopenembedded-core-contrib-665dfae57735149cb60d40b6f2a6bf6db1577831.tar.gz
rrs: Release/Milestone improvments
rrs/models.py: Milestone now have unique in Release and Name fields instead of only field. When try to get current milestone give priority to Mn instead of All. templates/rrs/base_toplevel.html: Display only release name when milestone is All. Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
-rw-r--r--rrs/migrations/0002_auto__del_unique_milestone_name__add_unique_milestone_release_name.py159
-rw-r--r--rrs/models.py46
-rw-r--r--rrs/views.py6
-rw-r--r--templates/rrs/base_toplevel.html9
4 files changed, 208 insertions, 12 deletions
diff --git a/rrs/migrations/0002_auto__del_unique_milestone_name__add_unique_milestone_release_name.py b/rrs/migrations/0002_auto__del_unique_milestone_name__add_unique_milestone_release_name.py
new file mode 100644
index 0000000000..cab8b42f3e
--- /dev/null
+++ b/rrs/migrations/0002_auto__del_unique_milestone_name__add_unique_milestone_release_name.py
@@ -0,0 +1,159 @@
+# -*- coding: utf-8 -*-
+from south.utils import datetime_utils as datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+ # Removing unique constraint on 'Milestone', fields ['name']
+ db.delete_unique('rrs_milestone', ['name'])
+
+ # Adding unique constraint on 'Milestone', fields ['release', 'name']
+ db.create_unique('rrs_milestone', ['release_id', 'name'])
+
+
+ def backwards(self, orm):
+ # Removing unique constraint on 'Milestone', fields ['release', 'name']
+ db.delete_unique('rrs_milestone', ['release_id', 'name'])
+
+ # Adding unique constraint on 'Milestone', fields ['name']
+ db.create_unique('rrs_milestone', ['name'])
+
+
+ models = {
+ 'layerindex.branch': {
+ 'Meta': {'object_name': 'Branch'},
+ 'bitbake_branch': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
+ 'short_description': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
+ 'sort_priority': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'auto_now': 'True', 'blank': 'True'})
+ },
+ 'layerindex.layerbranch': {
+ 'Meta': {'object_name': 'LayerBranch'},
+ 'actual_branch': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}),
+ 'branch': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.Branch']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'layer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.LayerItem']"}),
+ 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+ 'vcs_last_commit': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'vcs_last_fetch': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'vcs_last_rev': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}),
+ 'vcs_subdir': ('django.db.models.fields.CharField', [], {'max_length': '40', 'blank': 'True'})
+ },
+ 'layerindex.layeritem': {
+ 'Meta': {'object_name': 'LayerItem'},
+ 'classic': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'description': ('django.db.models.fields.TextField', [], {}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'index_preference': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'layer_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+ 'mailing_list_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}),
+ 'status': ('django.db.models.fields.CharField', [], {'default': "'N'", 'max_length': '1'}),
+ 'summary': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+ 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+ 'usage_url': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'vcs_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'vcs_web_file_base_url': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'vcs_web_tree_base_url': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'vcs_web_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'})
+ },
+ 'layerindex.recipe': {
+ 'Meta': {'object_name': 'Recipe'},
+ 'bbclassextend': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+ 'bugtracker': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
+ 'depends': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'filepath': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'homepage': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ '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': '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'}),
+ 'summary': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
+ 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
+ },
+ 'rrs.maintainer': {
+ 'Meta': {'ordering': "['name']", 'object_name': 'Maintainer'},
+ 'email': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
+ },
+ 'rrs.milestone': {
+ 'Meta': {'unique_together': "(('release', 'name'),)", 'object_name': 'Milestone'},
+ 'end_date': ('django.db.models.fields.DateField', [], {}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'release': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rrs.Release']"}),
+ 'start_date': ('django.db.models.fields.DateField', [], {})
+ },
+ 'rrs.recipedistro': {
+ 'Meta': {'object_name': 'RecipeDistro'},
+ 'alias': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+ 'distro': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'recipe': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.Recipe']"})
+ },
+ 'rrs.recipemaintainer': {
+ 'Meta': {'object_name': 'RecipeMaintainer'},
+ 'history': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rrs.RecipeMaintainerHistory']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'maintainer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rrs.Maintainer']"}),
+ 'recipe': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.Recipe']"})
+ },
+ 'rrs.recipemaintainerhistory': {
+ 'Meta': {'object_name': 'RecipeMaintainerHistory'},
+ 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rrs.Maintainer']"}),
+ 'date': ('django.db.models.fields.DateTimeField', [], {}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'sha1': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '64'}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
+ },
+ 'rrs.recipeupgrade': {
+ 'Meta': {'object_name': 'RecipeUpgrade'},
+ 'author_date': ('django.db.models.fields.DateTimeField', [], {}),
+ 'commit_date': ('django.db.models.fields.DateTimeField', [], {}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'maintainer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rrs.Maintainer']", 'blank': 'True'}),
+ 'recipe': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.Recipe']"}),
+ 'sha1': ('django.db.models.fields.CharField', [], {'max_length': '40', 'blank': 'True'}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
+ 'version': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'})
+ },
+ 'rrs.recipeupstream': {
+ 'Meta': {'object_name': 'RecipeUpstream'},
+ 'date': ('django.db.models.fields.DateTimeField', [], {}),
+ 'history': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rrs.RecipeUpstreamHistory']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'no_update_reason': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'recipe': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.Recipe']"}),
+ 'status': ('django.db.models.fields.CharField', [], {'max_length': '1', 'blank': 'True'}),
+ 'type': ('django.db.models.fields.CharField', [], {'max_length': '1', 'blank': 'True'}),
+ 'version': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'})
+ },
+ 'rrs.recipeupstreamhistory': {
+ 'Meta': {'object_name': 'RecipeUpstreamHistory'},
+ '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', [], {})
+ }
+ }
+
+ complete_apps = ['rrs'] \ No newline at end of file
diff --git a/rrs/models.py b/rrs/models.py
index cb1b67bd1d..9ed74a1dca 100644
--- a/rrs/models.py
+++ b/rrs/models.py
@@ -38,14 +38,39 @@ class Release(models.Model):
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)
+ return '%s' % (self.name)
class Milestone(models.Model):
release = models.ForeignKey(Release)
- name = models.CharField(max_length=100, unique=True)
+ name = models.CharField(max_length=100)
start_date = models.DateField()
end_date = models.DateField()
+ class Meta:
+ unique_together = ('release', 'name',)
+
+ """ Get milestones, filtering don't exist yet and ordering """
+ @staticmethod
+ def get_by_release_name(release_name):
+ milestones = []
+ today = date.today()
+
+ mall = Milestone.objects.get(release__name = release_name, name = 'All')
+ if mall:
+ milestones.append(mall)
+
+ mqry = Milestone.objects.filter(release__name = release_name).order_by('-end_date')
+ for m in mqry:
+ if m.name == 'All':
+ continue
+
+ if m.start_date > today:
+ continue
+
+ milestones.append(m)
+
+ return milestones
+
""" Get milestone by release and date """
@staticmethod
def get_by_release_and_date(release, date):
@@ -60,9 +85,18 @@ class Milestone(models.Model):
""" 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]
+ current_milestone = None
+ current_date = date.today()
+
+ mqry = Milestone.objects.filter(release = release, start_date__lte = current_date,
+ end_date__gte = current_date).exclude(name = 'All').order_by('-end_date')
+ if mqry:
+ current_milestone = mqry[0]
+ else:
+ current_milestone = Milestone.objects.filter(release = release). \
+ order_by('-end_date')[0]
+
+ return current_milestone
""" Get milestone intervals by release """
@staticmethod
@@ -102,7 +136,7 @@ class Milestone(models.Model):
return weeks
def __unicode__(self):
- return '%s: %s - %s' % (self.name, self.start_date, self.end_date)
+ return '%s%s' % (self.release.name, self.name)
class Maintainer(models.Model):
name = models.CharField(max_length=255, unique=True)
diff --git a/rrs/views.py b/rrs/views.py
index 820810262a..bcc505399c 100644
--- a/rrs/views.py
+++ b/rrs/views.py
@@ -214,8 +214,7 @@ class RecipeListView(ListView):
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(release__name =
- self.release_name).order_by('-end_date')
+ context['all_milestones'] = Milestone.get_by_release_name(self.release_name)
context['recipes_percentage'] = self.milestone_statistics['percentage']
context['recipes_up_to_date'] = self.milestone_statistics['up_to_date']
@@ -476,8 +475,7 @@ class MaintainerListView(ListView):
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(release__name =
- self.release_name).order_by('-end_date')
+ context['all_milestones'] = Milestone.get_by_release_name(self.release_name)
context['recipes_percentage'] = self.milestone_statistics['percentage']
context['recipes_up_to_date'] = self.milestone_statistics['up_to_date']
diff --git a/templates/rrs/base_toplevel.html b/templates/rrs/base_toplevel.html
index 3339000b9d..9804c03817 100644
--- a/templates/rrs/base_toplevel.html
+++ b/templates/rrs/base_toplevel.html
@@ -24,7 +24,7 @@
</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 }}">
+ <li><a href="{% url this_url_name r.name "All" %}{{ extra_url_param }}">
{% if r.name = release_name %}<b>{% endif %}
{{ r.name }}
{% if r.name = release_name %}</b>{% endif %}
@@ -58,7 +58,12 @@
<div class="navbar">
<div class="navbar-inner">
- <span class="brand">{{ milestone_name }}</span>
+ <span class="brand">
+ {{ release_name }}
+ {% if milestone_name != "All" %}
+ {{ milestone_name }}
+ {% endif %}
+ </span>
<ul class="nav">
<li class="divider-vertical"></li>
<li class="lead" id="percentage"><strong>{{ recipes_percentage }}%</strong> done</li>