From 4f67d06302f7f33c9f95828dc3d5d38abf582a6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?An=C3=ADbal=20Lim=C3=B3n?= Date: Wed, 28 Jan 2015 17:38:04 -0600 Subject: [PATCH] rrs: Add support for Recipe maintainership history MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Now can you get maintainers based on Milestones. Feature changes, rrs/models.py: Add RecipeMaintainerHistory to store maintainer updates. rrs/admin.py: Add admin site for RecipeMaintainerHistory. Adapt changes, Now you need to specify RecipeMaintainerHistory to get RecipeMaintainer, changes into rrs/view.py. These set of changes are incompatible with the previous version you need to do initial setup described in README.rrs. Signed-off-by: Aníbal Limón --- README.rrs | 8 +- rrs/admin.py | 13 +- rrs/migrations/0001_initial.py | 46 +++++- ...story__add_field_recipeupstream_history.py | 149 ------------------ rrs/models.py | 66 ++++++-- rrs/views.py | 27 +++- 6 files changed, 138 insertions(+), 171 deletions(-) delete mode 100644 rrs/migrations/0002_auto__add_recipeupstreamhistory__add_field_recipeupstream_history.py diff --git a/README.rrs b/README.rrs index 144afa1..68fb253 100644 --- a/README.rrs +++ b/README.rrs @@ -33,4 +33,10 @@ $ ./scripts/tools/import_layer.py -s meta git://git.openembedded.org/openembedd 8. In the first run should regenerate Recipe upgrade information, $ ./scripts/update.py --only-layerindex -$ ./scripts/tools/rrs_upgrade_history.py # This can take a lot of time +$ ./scripts/tools/rrs_maintainer_history.py # can take a lot of time +$ ./scripts/tools/rrs_upgrade_history.py # can take a lot of time + +9. Then you can run update and rrs_maintainer_history scripts. + +$ ./scripts/tools/rrs_maintainer_history.py +$ ./scripts/update.py diff --git a/rrs/admin.py b/rrs/admin.py index 04b04c0..264f02a 100644 --- a/rrs/admin.py +++ b/rrs/admin.py @@ -7,8 +7,9 @@ from django.contrib import admin from django.contrib.admin import DateFieldListFilter -from rrs.models import Milestone, Maintainer, RecipeMaintainer, RecipeDistro, \ - RecipeUpgrade, RecipeUpstream, RecipeUpstreamHistory +from rrs.models import Milestone, Maintainer, RecipeMaintainerHistory, \ + RecipeMaintainer, RecipeDistro, RecipeUpgrade, RecipeUpstream, \ + RecipeUpstreamHistory class MilestoneAdmin(admin.ModelAdmin): search_fields = ['name'] @@ -18,9 +19,14 @@ class MaintainerAdmin(admin.ModelAdmin): search_fields = ['name'] model = Maintainer +class RecipeMaintainerHistoryAdmin(admin.ModelAdmin): + search_fields = ['title', 'author__name', 'sha1'] + list_filter = ['author__name', ('date', DateFieldListFilter)] + model = RecipeMaintainerHistory + class RecipeMaintainerAdmin(admin.ModelAdmin): search_fields = ['recipe__pn'] - list_filter = ['recipe__layerbranch__layer__name', 'maintainer__name'] + list_filter = ['recipe__layerbranch__layer__name', 'history', 'maintainer__name'] model = RecipeMaintainer class RecipeDistroAdmin(admin.ModelAdmin): @@ -49,6 +55,7 @@ class RecipeUpstreamAdmin(admin.ModelAdmin): admin.site.register(Milestone, MilestoneAdmin) admin.site.register(Maintainer, MaintainerAdmin) +admin.site.register(RecipeMaintainerHistory, RecipeMaintainerHistoryAdmin) admin.site.register(RecipeMaintainer, RecipeMaintainerAdmin) admin.site.register(RecipeDistro, RecipeDistroAdmin) admin.site.register(RecipeUpgrade, RecipeUpgradeAdmin) diff --git a/rrs/migrations/0001_initial.py b/rrs/migrations/0001_initial.py index 8834c4d..b46ebef 100644 --- a/rrs/migrations/0001_initial.py +++ b/rrs/migrations/0001_initial.py @@ -25,18 +25,38 @@ class Migration(SchemaMigration): )) db.send_create_signal('rrs', ['Maintainer']) + # Adding model 'RecipeMaintainerHistory' + db.create_table('rrs_recipemaintainerhistory', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('title', self.gf('django.db.models.fields.CharField')(max_length=255, blank=True)), + ('date', self.gf('django.db.models.fields.DateTimeField')()), + ('author', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['rrs.Maintainer'])), + ('sha1', self.gf('django.db.models.fields.CharField')(unique=True, max_length=64)), + )) + db.send_create_signal('rrs', ['RecipeMaintainerHistory']) + # Adding model 'RecipeMaintainer' db.create_table('rrs_recipemaintainer', ( ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), ('recipe', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['layerindex.Recipe'])), ('maintainer', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['rrs.Maintainer'])), + ('history', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['rrs.RecipeMaintainerHistory'])), )) db.send_create_signal('rrs', ['RecipeMaintainer']) + # Adding model 'RecipeUpstreamHistory' + db.create_table('rrs_recipeupstreamhistory', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('start_date', self.gf('django.db.models.fields.DateTimeField')()), + ('end_date', self.gf('django.db.models.fields.DateTimeField')()), + )) + db.send_create_signal('rrs', ['RecipeUpstreamHistory']) + # Adding model 'RecipeUpstream' db.create_table('rrs_recipeupstream', ( ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), ('recipe', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['layerindex.Recipe'])), + ('history', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['rrs.RecipeUpstreamHistory'])), ('version', self.gf('django.db.models.fields.CharField')(max_length=100, blank=True)), ('type', self.gf('django.db.models.fields.CharField')(max_length=1, blank=True)), ('status', self.gf('django.db.models.fields.CharField')(max_length=1, blank=True)), @@ -58,7 +78,7 @@ class Migration(SchemaMigration): db.create_table('rrs_recipeupgrade', ( ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), ('recipe', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['layerindex.Recipe'])), - ('maintainer', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['rrs.Maintainer'], null=True, blank=True)), + ('maintainer', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['rrs.Maintainer'], blank=True)), ('sha1', self.gf('django.db.models.fields.CharField')(max_length=40, blank=True)), ('title', self.gf('django.db.models.fields.CharField')(max_length=1024, blank=True)), ('version', self.gf('django.db.models.fields.CharField')(max_length=100, blank=True)), @@ -75,9 +95,15 @@ class Migration(SchemaMigration): # Deleting model 'Maintainer' db.delete_table('rrs_maintainer') + # Deleting model 'RecipeMaintainerHistory' + db.delete_table('rrs_recipemaintainerhistory') + # Deleting model 'RecipeMaintainer' db.delete_table('rrs_recipemaintainer') + # Deleting model 'RecipeUpstreamHistory' + db.delete_table('rrs_recipeupstreamhistory') + # Deleting model 'RecipeUpstream' db.delete_table('rrs_recipeupstream') @@ -170,16 +196,25 @@ class Migration(SchemaMigration): }, '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']", 'null': 'True', 'blank': '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'}), @@ -188,12 +223,19 @@ class Migration(SchemaMigration): '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', [], {}) } } diff --git a/rrs/migrations/0002_auto__add_recipeupstreamhistory__add_field_recipeupstream_history.py b/rrs/migrations/0002_auto__add_recipeupstreamhistory__add_field_recipeupstream_history.py deleted file mode 100644 index 17ad0ce..0000000 --- a/rrs/migrations/0002_auto__add_recipeupstreamhistory__add_field_recipeupstream_history.py +++ /dev/null @@ -1,149 +0,0 @@ -# -*- 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): - # Adding model 'RecipeUpstreamHistory' - db.create_table('rrs_recipeupstreamhistory', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('start_date', self.gf('django.db.models.fields.DateTimeField')()), - ('end_date', self.gf('django.db.models.fields.DateTimeField')()), - )) - db.send_create_signal('rrs', ['RecipeUpstreamHistory']) - - # Adding field 'RecipeUpstream.history' - db.add_column('rrs_recipeupstream', 'history', - self.gf('django.db.models.fields.related.ForeignKey')(to=orm['rrs.RecipeUpstreamHistory'], null=True), - keep_default=False) - - - def backwards(self, orm): - # Deleting model 'RecipeUpstreamHistory' - db.delete_table('rrs_recipeupstreamhistory') - - # Deleting field 'RecipeUpstream.history' - db.delete_column('rrs_recipeupstream', 'history_id') - - - 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': '255', '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': {'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', [], {'unique': 'True', 'max_length': '100'}), - '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'}, - '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.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']", 'null': 'True', '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']", 'null': 'True'}), - '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', [], {}) - } - } - - complete_apps = ['rrs'] \ No newline at end of file diff --git a/rrs/models.py b/rrs/models.py index abeaccb..5c9bcc0 100644 --- a/rrs/models.py +++ b/rrs/models.py @@ -59,19 +59,67 @@ class Maintainer(models.Model): name = models.CharField(max_length=255, unique=True) email = models.CharField(max_length=255, blank=True) + """ + Create maintainer if no exist else update email. + Return Maintainer. + """ + @staticmethod + def create_or_update(name, email): + try: + m = Maintainer.objects.get(name = name) + m.email = email + except Maintainer.DoesNotExist: + m = Maintainer() + m.name = name + m.email = email + + m.save() + + return m + class Meta: ordering = ["name"] def __unicode__(self): return "%s <%s>" % (self.name, self.email) -class RecipeMaintainer(models.Model): - recipe = models.ForeignKey(Recipe) - maintainer = models.ForeignKey(Maintainer) +class RecipeMaintainerHistory(models.Model): + title = models.CharField(max_length=255, blank=True) + date = models.DateTimeField() + author = models.ForeignKey(Maintainer) + sha1 = models.CharField(max_length=64, unique=True) @staticmethod - def get_maintainer_by_recipe(recipe): - recipe_maintainer = RecipeMaintainer.objects.filter(recipe = recipe)[0] + def get_last(): + rmh_qry = RecipeMaintainerHistory.objects.filter().order_by('-date') + + if rmh_qry: + return rmh_qry[0] + else: + return None + + @staticmethod + def get_by_end_date(end_date): + rmh_qry = RecipeMaintainerHistory.objects.filter( + date__lte = end_date).order_by('-date') + + if rmh_qry: + return rmh_qry[0] + else: + return RecipeMaintainerHistory.objects.filter().order_by('date')[0] + + def __unicode__(self): + return "%s: %s, %s" % (self.date, self.author.name, self.sha1[:10]) + +class RecipeMaintainer(models.Model): + recipe = models.ForeignKey(Recipe) + maintainer = models.ForeignKey(Maintainer) + history = models.ForeignKey(RecipeMaintainerHistory) + + @staticmethod + def get_maintainer_by_recipe_and_history(recipe, history): + recipe_maintainer = RecipeMaintainer.objects.filter(recipe = recipe, + history = history)[0] return recipe_maintainer.maintainer def __unicode__(self): @@ -85,7 +133,7 @@ class RecipeUpstreamHistory(models.Model): @staticmethod def get_last_by_date_range(start, end): history = RecipeUpstreamHistory.objects.filter(start_date__gte = start, - start_date__lte = end).order_by('-id') + start_date__lte = end).order_by('-start_date') if history: return history[0] @@ -94,7 +142,7 @@ class RecipeUpstreamHistory(models.Model): @staticmethod def get_last(): - history = RecipeUpstreamHistory.objects.filter().order_by('-id') + history = RecipeUpstreamHistory.objects.filter().order_by('-start_date') if history: return history[0] @@ -121,7 +169,7 @@ class RecipeUpstream(models.Model): RECIPE_UPSTREAM_TYPE_CHOICES_DICT = dict(RECIPE_UPSTREAM_TYPE_CHOICES) recipe = models.ForeignKey(Recipe) - history = models.ForeignKey(RecipeUpstreamHistory, null=True) + history = models.ForeignKey(RecipeUpstreamHistory) version = models.CharField(max_length=100, blank=True) type = models.CharField(max_length=1, choices=RECIPE_UPSTREAM_TYPE_CHOICES, blank=True) status = models.CharField(max_length=1, choices=RECIPE_UPSTREAM_STATUS_CHOICES, blank=True) @@ -165,7 +213,7 @@ class RecipeDistro(models.Model): class RecipeUpgrade(models.Model): recipe = models.ForeignKey(Recipe) - maintainer = models.ForeignKey(Maintainer, blank=True, null=True) + maintainer = models.ForeignKey(Maintainer, blank=True) sha1 = models.CharField(max_length=40, blank=True) title = models.CharField(max_length=1024, blank=True) version = models.CharField(max_length=100, blank=True) diff --git a/rrs/views.py b/rrs/views.py index 74c01ab..de870f7 100644 --- a/rrs/views.py +++ b/rrs/views.py @@ -6,8 +6,9 @@ from django.views.generic import ListView, DetailView from django.core.urlresolvers import resolve from layerindex.models import Recipe -from rrs.models import Milestone, Maintainer, RecipeMaintainer, RecipeUpstream, \ - RecipeUpstreamHistory, RecipeDistro, RecipeUpgrade +from rrs.models import Milestone, Maintainer, RecipeMaintainerHistory, \ + RecipeMaintainer, RecipeUpstreamHistory, RecipeUpstream, \ + RecipeDistro, RecipeUpgrade def _check_url_params(upstream_status, maintainer_name): get_object_or_404(Maintainer, name=maintainer_name) @@ -68,6 +69,9 @@ class RecipeListView(ListView): milestone.end_date ) + self.recipe_maintainer_history = RecipeMaintainerHistory.get_by_end_date( + milestone.end_date) + recipe_list = [] self.recipe_list_count = 0 @@ -100,7 +104,8 @@ class RecipeListView(ListView): if self.upstream_status != 'All' and self.upstream_status != recipe_upstream_status: continue - maintainer = RecipeMaintainer.get_maintainer_by_recipe(recipe) + maintainer = RecipeMaintainer.get_maintainer_by_recipe_and_history( + recipe, self.recipe_maintainer_history) if self.maintainer_name != 'All' and self.maintainer_name != maintainer.name: continue @@ -135,7 +140,8 @@ class RecipeListView(ListView): context['maintainer_name'] = self.maintainer_name all_maintainers = ['All'] - for rm in RecipeMaintainer.objects.filter().values( + for rm in RecipeMaintainer.objects.filter(history = + self.recipe_maintainer_history).values( 'maintainer__name').distinct().order_by('maintainer__name'): all_maintainers.append(rm['maintainer__name']) context['all_maintainers'] = all_maintainers @@ -170,16 +176,21 @@ class RecipeUpgradeDetail(): self.commit_url = commit_url def _get_recipe_upgrade_detail(recipe_upgrade): - milestone_name = Milestone.get_by_date(recipe_upgrade.commit_date) + milestone = Milestone.get_by_date(recipe_upgrade.commit_date) + milestone_name = milestone.name if milestone_name is None: milestone_name = '' + recipe_maintainer_history = RecipeMaintainerHistory.get_by_end_date( + milestone.end_date) + is_recipe_maintainer = False maintainer_name = '' if not recipe_upgrade.maintainer is None: maintainer_name = recipe_upgrade.maintainer.name if RecipeMaintainer.objects.filter(maintainer__name - = maintainer_name).count() > 0: + = maintainer_name, history = recipe_maintainer_history + ).count() > 0: is_recipe_maintainer = True commit = recipe_upgrade.sha1[:10] @@ -213,7 +224,9 @@ class RecipeDetailView(DetailView): context['upstream_version'] = recipe_upstream.version context['upstream_no_update_reason'] = recipe_upstream.no_update_reason - recipe_maintainer = RecipeMaintainer.objects.filter(recipe = recipe)[0] + self.recipe_maintainer_history = RecipeMaintainerHistory.get_last() + recipe_maintainer = RecipeMaintainer.objects.filter(recipe = recipe, + history = self.recipe_maintainer_history)[0] maintainer = recipe_maintainer.maintainer context['maintainer_name'] = maintainer.name