From 24f0617e257fef82e66adb0b89ceeb07984758bf Mon Sep 17 00:00:00 2001 From: Alexandru DAMIAN Date: Thu, 20 Feb 2014 12:47:55 +0000 Subject: bitbake: toaster: update database schema This patch updates the database schema to resolve a number of issues discovered while implementing the UI interface. We do not expect that all the data will come in valid at this point. [YOCTO #5453] [YOCTO #5833] [YOCTO #5836] [YOCTO #5811] [YOCTO #5812] [YOCTO #5820] (Bitbake rev: f8ad96d10a095e21fd2ce424c45e17f54642fb54) Signed-off-by: Alexandru DAMIAN Signed-off-by: Richard Purdie --- bitbake/lib/bb/ui/buildinfohelper.py | 8 +- .../toaster/bldviewer/templates/simple_build.html | 2 +- .../toaster/bldviewer/templates/simple_recipe.html | 2 - ...e__add_target_file__add_field_variablehistor.py | 301 +++++++++++++++++++++ bitbake/lib/toaster/orm/models.py | 45 ++- .../lib/toaster/toastergui/templates/build.html | 2 +- bitbake/lib/toaster/toastergui/views.py | 2 +- 7 files changed, 342 insertions(+), 20 deletions(-) create mode 100644 bitbake/lib/toaster/orm/migrations/0005_auto__add_target_image_file__add_target_file__add_field_variablehistor.py diff --git a/bitbake/lib/bb/ui/buildinfohelper.py b/bitbake/lib/bb/ui/buildinfohelper.py index b1a418bca9..846465c971 100644 --- a/bitbake/lib/bb/ui/buildinfohelper.py +++ b/bitbake/lib/bb/ui/buildinfohelper.py @@ -44,7 +44,6 @@ class ORMWrapper(object): def create_build_object(self, build_info): assert 'machine' in build_info - assert 'image_fstypes' in build_info assert 'distro' in build_info assert 'distro_version' in build_info assert 'started_on' in build_info @@ -54,7 +53,6 @@ class ORMWrapper(object): build = Build.objects.create( machine=build_info['machine'], - image_fstypes=build_info['image_fstypes'], distro=build_info['distro'], distro_version=build_info['distro_version'], started_on=build_info['started_on'], @@ -74,8 +72,7 @@ class ORMWrapper(object): tgt_object = Target.objects.create( build = target_info['build'], target = tgt_name, is_image = False, - file_name = "", - file_size = 0); + ); targets.append(tgt_object) return targets @@ -375,7 +372,6 @@ class BuildInfoHelper(object): build_info['distro_version'] = self.server.runCommand(["getVariable", "DISTRO_VERSION"])[0] build_info['started_on'] = datetime.datetime.now() build_info['completed_on'] = datetime.datetime.now() - build_info['image_fstypes'] = self._remove_redundant(self.server.runCommand(["getVariable", "IMAGE_FSTYPES"])[0] or "") build_info['cooker_log_path'] = self.server.runCommand(["getVariable", "BB_CONSOLELOG"])[0] build_info['build_name'] = self.server.runCommand(["getVariable", "BUILDNAME"])[0] build_info['bitbake_version'] = self.server.runCommand(["getVariable", "BB_VERSION"])[0] @@ -633,7 +629,6 @@ class BuildInfoHelper(object): recipe_info['license'] = event._depgraph['pn'][pn]['license'] recipe_info['description'] = event._depgraph['pn'][pn]['description'] recipe_info['section'] = event._depgraph['pn'][pn]['section'] - recipe_info['licensing_info'] = 'Not Available' recipe_info['homepage'] = event._depgraph['pn'][pn]['homepage'] recipe_info['bugtracker'] = event._depgraph['pn'][pn]['bugtracker'] recipe_info['file_path'] = file_name @@ -728,7 +723,6 @@ class BuildInfoHelper(object): m = re.match("([^:]*): md5 checksum matched for ([^;]*)", event.msg) if m: (pn, fn) = m.groups() - self.internal_state['recipes'][pn].licensing_info = fn self.internal_state['recipes'][pn].save() if event.levelno < format.WARNING: diff --git a/bitbake/lib/toaster/bldviewer/templates/simple_build.html b/bitbake/lib/toaster/bldviewer/templates/simple_build.html index ecd19df94c..a6983f5804 100644 --- a/bitbake/lib/toaster/bldviewer/templates/simple_build.html +++ b/bitbake/lib/toaster/bldviewer/templates/simple_build.html @@ -31,7 +31,7 @@ {% time_difference build.started_on build.completed_on %} {{build.errors_no}}:{% if build.errors_no %}{% for error in logs %}{% if error.build == build %}{% if error.level == 2 %}

{{error.message}}

{% endif %}{% endif %}{% endfor %}{% else %}None{% endif %} {{build.warnings_no}}:{% if build.warnings_no %}{% for warning in logs %}{% if warning.build == build %}{% if warning.level == 1 %}

{{warning.message}}

{% endif %}{% endif %}{% endfor %}{% else %}None{% endif %} - {% if build.outcome == 0 %}{% for t in build.target_set.all %}{% if t.is_image %}{{build.image_fstypes}}{% endif %}{% endfor %}{% endif %} + TBD: determine image file list {{build.cooker_log_path}} {{build.bitbake_version}} {{build.build_name}} diff --git a/bitbake/lib/toaster/bldviewer/templates/simple_recipe.html b/bitbake/lib/toaster/bldviewer/templates/simple_recipe.html index 4c7030e48a..77b9de2525 100644 --- a/bitbake/lib/toaster/bldviewer/templates/simple_recipe.html +++ b/bitbake/lib/toaster/bldviewer/templates/simple_recipe.html @@ -18,7 +18,6 @@ Description Section License - License file Homepage Bugtracker File_path @@ -34,7 +33,6 @@ {{recipe.description}} {{recipe.section}} {{recipe.license}} - {{recipe.licensing_info}} {{recipe.homepage}} {{recipe.bugtracker}} {{recipe.file_path}} diff --git a/bitbake/lib/toaster/orm/migrations/0005_auto__add_target_image_file__add_target_file__add_field_variablehistor.py b/bitbake/lib/toaster/orm/migrations/0005_auto__add_target_image_file__add_target_file__add_field_variablehistor.py new file mode 100644 index 0000000000..a55451c6da --- /dev/null +++ b/bitbake/lib/toaster/orm/migrations/0005_auto__add_target_image_file__add_target_file__add_field_variablehistor.py @@ -0,0 +1,301 @@ +# -*- 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 'Target_Image_File' + db.create_table(u'orm_target_image_file', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('target', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['orm.Target'])), + ('file_name', self.gf('django.db.models.fields.FilePathField')(max_length=100)), + ('file_size', self.gf('django.db.models.fields.IntegerField')()), + )) + db.send_create_signal(u'orm', ['Target_Image_File']) + + # Adding model 'Target_File' + db.create_table(u'orm_target_file', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('target', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['orm.Target'])), + ('path', self.gf('django.db.models.fields.FilePathField')(max_length=100)), + ('size', self.gf('django.db.models.fields.IntegerField')()), + ('inodetype', self.gf('django.db.models.fields.IntegerField')()), + ('permission', self.gf('django.db.models.fields.IntegerField')()), + ('owner', self.gf('django.db.models.fields.CharField')(max_length=128)), + ('group', self.gf('django.db.models.fields.CharField')(max_length=128)), + ('directory', self.gf('django.db.models.fields.related.ForeignKey')(related_name='directory_set', to=orm['orm.Target_File'])), + ('sym_target', self.gf('django.db.models.fields.related.ForeignKey')(related_name='symlink_set', blank=True, to=orm['orm.Target_File'])), + )) + db.send_create_signal(u'orm', ['Target_File']) + + # Adding field 'VariableHistory.value' + db.add_column(u'orm_variablehistory', 'value', + self.gf('django.db.models.fields.TextField')(default='', blank=True), + keep_default=False) + + # Deleting field 'Recipe.licensing_info' + db.delete_column(u'orm_recipe', 'licensing_info') + + # Deleting field 'Target.file_name' + db.delete_column(u'orm_target', 'file_name') + + # Deleting field 'Target.file_size' + db.delete_column(u'orm_target', 'file_size') + + # Deleting field 'Build.image_fstypes' + db.delete_column(u'orm_build', 'image_fstypes') + + # Adding field 'Build.timespent' + db.add_column(u'orm_build', 'timespent', + self.gf('django.db.models.fields.IntegerField')(default=0), + keep_default=False) + + # Adding field 'LogMessage.task' + db.add_column(u'orm_logmessage', 'task', + self.gf('django.db.models.fields.related.ForeignKey')(to=orm['orm.Task'], null=True, blank=True), + keep_default=False) + + + # Changing field 'Task.elapsed_time' + db.alter_column(u'orm_task', 'elapsed_time', self.gf('django.db.models.fields.DecimalField')(null=True, max_digits=6, decimal_places=2)) + # Adding unique constraint on 'Task', fields ['build', 'recipe', 'task_name'] + db.create_unique(u'orm_task', ['build_id', 'recipe_id', 'task_name']) + + + def backwards(self, orm): + # Removing unique constraint on 'Task', fields ['build', 'recipe', 'task_name'] + db.delete_unique(u'orm_task', ['build_id', 'recipe_id', 'task_name']) + + # Deleting model 'Target_Image_File' + db.delete_table(u'orm_target_image_file') + + # Deleting model 'Target_File' + db.delete_table(u'orm_target_file') + + # Deleting field 'VariableHistory.value' + db.delete_column(u'orm_variablehistory', 'value') + + # Adding field 'Recipe.licensing_info' + db.add_column(u'orm_recipe', 'licensing_info', + self.gf('django.db.models.fields.TextField')(default='', blank=True), + keep_default=False) + + + # User chose to not deal with backwards NULL issues for 'Target.file_name' + raise RuntimeError("Cannot reverse this migration. 'Target.file_name' and its values cannot be restored.") + + # The following code is provided here to aid in writing a correct migration # Adding field 'Target.file_name' + db.add_column(u'orm_target', 'file_name', + self.gf('django.db.models.fields.CharField')(max_length=100), + keep_default=False) + + + # User chose to not deal with backwards NULL issues for 'Target.file_size' + raise RuntimeError("Cannot reverse this migration. 'Target.file_size' and its values cannot be restored.") + + # The following code is provided here to aid in writing a correct migration # Adding field 'Target.file_size' + db.add_column(u'orm_target', 'file_size', + self.gf('django.db.models.fields.IntegerField')(), + keep_default=False) + + + # User chose to not deal with backwards NULL issues for 'Build.image_fstypes' + raise RuntimeError("Cannot reverse this migration. 'Build.image_fstypes' and its values cannot be restored.") + + # The following code is provided here to aid in writing a correct migration # Adding field 'Build.image_fstypes' + db.add_column(u'orm_build', 'image_fstypes', + self.gf('django.db.models.fields.CharField')(max_length=100), + keep_default=False) + + # Deleting field 'Build.timespent' + db.delete_column(u'orm_build', 'timespent') + + # Deleting field 'LogMessage.task' + db.delete_column(u'orm_logmessage', 'task_id') + + + # Changing field 'Task.elapsed_time' + db.alter_column(u'orm_task', 'elapsed_time', self.gf('django.db.models.fields.CharField')(max_length=50)) + + models = { + u'orm.build': { + 'Meta': {'object_name': 'Build'}, + 'bitbake_version': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'build_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'completed_on': ('django.db.models.fields.DateTimeField', [], {}), + 'cooker_log_path': ('django.db.models.fields.CharField', [], {'max_length': '500'}), + 'distro': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'distro_version': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'errors_no': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'machine': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'outcome': ('django.db.models.fields.IntegerField', [], {'default': '2'}), + 'started_on': ('django.db.models.fields.DateTimeField', [], {}), + 'timespent': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'warnings_no': ('django.db.models.fields.IntegerField', [], {'default': '0'}) + }, + u'orm.layer': { + 'Meta': {'object_name': 'Layer'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'layer_index_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}), + 'local_path': ('django.db.models.fields.FilePathField', [], {'max_length': '255'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'orm.layer_version': { + 'Meta': {'object_name': 'Layer_Version'}, + 'branch': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'build': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'layer_version_build'", 'to': u"orm['orm.Build']"}), + 'commit': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'layer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'layer_version_layer'", 'to': u"orm['orm.Layer']"}), + 'priority': ('django.db.models.fields.IntegerField', [], {}) + }, + u'orm.logmessage': { + 'Meta': {'object_name': 'LogMessage'}, + 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Build']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'level': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'lineno': ('django.db.models.fields.IntegerField', [], {'null': 'True'}), + 'message': ('django.db.models.fields.CharField', [], {'max_length': '240'}), + 'pathname': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'}), + 'task': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Task']", 'null': 'True', 'blank': 'True'}) + }, + u'orm.package': { + 'Meta': {'object_name': 'Package'}, + 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Build']"}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'installed_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100'}), + 'installed_size': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'license': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'recipe': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Recipe']", 'null': 'True'}), + 'revision': ('django.db.models.fields.CharField', [], {'max_length': '32', 'blank': 'True'}), + 'section': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}), + 'size': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}), + 'version': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}) + }, + u'orm.package_dependency': { + 'Meta': {'object_name': 'Package_Dependency'}, + 'dep_type': ('django.db.models.fields.IntegerField', [], {}), + 'depends_on': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'package_dependencies_target'", 'to': u"orm['orm.Package']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'package': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'package_dependencies_source'", 'to': u"orm['orm.Package']"}), + 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Target']", 'null': 'True'}) + }, + u'orm.package_file': { + 'Meta': {'object_name': 'Package_File'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'package': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'buildfilelist_package'", 'to': u"orm['orm.Package']"}), + 'path': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'}), + 'size': ('django.db.models.fields.IntegerField', [], {}) + }, + u'orm.recipe': { + 'Meta': {'object_name': 'Recipe'}, + 'bugtracker': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'file_path': ('django.db.models.fields.FilePathField', [], {'max_length': '255'}), + 'homepage': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'layer_version': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'recipe_layer_version'", 'to': u"orm['orm.Layer_Version']"}), + 'license': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'section': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'version': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}) + }, + u'orm.recipe_dependency': { + 'Meta': {'object_name': 'Recipe_Dependency'}, + 'dep_type': ('django.db.models.fields.IntegerField', [], {}), + 'depends_on': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'r_dependencies_depends'", 'to': u"orm['orm.Recipe']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'recipe': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'r_dependencies_recipe'", 'to': u"orm['orm.Recipe']"}) + }, + u'orm.target': { + 'Meta': {'object_name': 'Target'}, + 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Build']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_image': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'target': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'orm.target_file': { + 'Meta': {'object_name': 'Target_File'}, + 'directory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'directory_set'", 'to': u"orm['orm.Target_File']"}), + 'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inodetype': ('django.db.models.fields.IntegerField', [], {}), + 'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'path': ('django.db.models.fields.FilePathField', [], {'max_length': '100'}), + 'permission': ('django.db.models.fields.IntegerField', [], {}), + 'size': ('django.db.models.fields.IntegerField', [], {}), + 'sym_target': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'symlink_set'", 'blank': 'True', 'to': u"orm['orm.Target_File']"}), + 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Target']"}) + }, + u'orm.target_image_file': { + 'Meta': {'object_name': 'Target_Image_File'}, + 'file_name': ('django.db.models.fields.FilePathField', [], {'max_length': '100'}), + 'file_size': ('django.db.models.fields.IntegerField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Target']"}) + }, + u'orm.target_installed_package': { + 'Meta': {'object_name': 'Target_Installed_Package'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'package': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'buildtargetlist_package'", 'to': u"orm['orm.Package']"}), + 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Target']"}) + }, + u'orm.task': { + 'Meta': {'ordering': "('order', 'recipe')", 'unique_together': "(('build', 'recipe', 'task_name'),)", 'object_name': 'Task'}, + 'build': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'task_build'", 'to': u"orm['orm.Build']"}), + 'cpu_usage': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '6', 'decimal_places': '2'}), + 'disk_io': ('django.db.models.fields.IntegerField', [], {'null': 'True'}), + 'elapsed_time': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '6', 'decimal_places': '2'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'line_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'logfile': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'}), + 'message': ('django.db.models.fields.CharField', [], {'max_length': '240'}), + 'order': ('django.db.models.fields.IntegerField', [], {'null': 'True'}), + 'outcome': ('django.db.models.fields.IntegerField', [], {'default': '-1'}), + 'path_to_sstate_obj': ('django.db.models.fields.FilePathField', [], {'max_length': '500', 'blank': 'True'}), + 'recipe': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'build_recipe'", 'to': u"orm['orm.Recipe']"}), + 'script_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'source_url': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'}), + 'sstate_checksum': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'sstate_result': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'task_executed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'task_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'work_directory': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'}) + }, + u'orm.task_dependency': { + 'Meta': {'object_name': 'Task_Dependency'}, + 'depends_on': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'task_dependencies_depends'", 'to': u"orm['orm.Task']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'task': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'task_dependencies_task'", 'to': u"orm['orm.Task']"}) + }, + u'orm.variable': { + 'Meta': {'object_name': 'Variable'}, + 'build': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'variable_build'", 'to': u"orm['orm.Build']"}), + 'changed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'human_readable_name': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'variable_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'variable_value': ('django.db.models.fields.TextField', [], {'blank': 'True'}) + }, + u'orm.variablehistory': { + 'Meta': {'object_name': 'VariableHistory'}, + 'file_name': ('django.db.models.fields.FilePathField', [], {'max_length': '255'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'line_number': ('django.db.models.fields.IntegerField', [], {'null': 'True'}), + 'operation': ('django.db.models.fields.CharField', [], {'max_length': '16'}), + 'value': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'variable': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'vhistory'", 'to': u"orm['orm.Variable']"}) + } + } + + complete_apps = ['orm'] \ No newline at end of file diff --git a/bitbake/lib/toaster/orm/models.py b/bitbake/lib/toaster/orm/models.py index abc16d9b88..ba3ade06f1 100644 --- a/bitbake/lib/toaster/orm/models.py +++ b/bitbake/lib/toaster/orm/models.py @@ -34,11 +34,9 @@ class Build(models.Model): (IN_PROGRESS, 'In Progress'), ) - search_allowed_fields = ['machine', 'image_fstypes', - 'cooker_log_path', "target__target"] + search_allowed_fields = ['machine', 'cooker_log_path', "target__target", "target__target_image_file__file_name"] machine = models.CharField(max_length=100) - image_fstypes = models.CharField(max_length=100) distro = models.CharField(max_length=100) distro_version = models.CharField(max_length=100) started_on = models.DateTimeField() @@ -53,16 +51,46 @@ class Build(models.Model): @python_2_unicode_compatible class Target(models.Model): - search_allowed_fields = ['target', 'image_fstypes', 'file_name'] + search_allowed_fields = ['target', 'file_name'] build = models.ForeignKey(Build) target = models.CharField(max_length=100) is_image = models.BooleanField(default = False) - file_name = models.CharField(max_length=100) - file_size = models.IntegerField() def __str__(self): return self.target +class Target_Image_File(models.Model): + target = models.ForeignKey(Target) + file_name = models.FilePathField(max_length=100) + file_size = models.IntegerField() + +class Target_File(models.Model): + ITYPE_REGULAR = 1 + ITYPE_DIRECTORY = 2 + ITYPE_SYMLINK = 3 + ITYPE_SOCKET = 4 + ITYPE_FIFO = 5 + ITYPE_CHARACTER = 6 + ITYPE_BLOCK = 7 + ITYPE_SYMBLINK = 8 + ITYPES = ( (ITYPE_REGULAR ,'regular'), + ( ITYPE_DIRECTORY ,'directory'), + ( ITYPE_SYMLINK ,'symlink'), + ( ITYPE_SOCKET ,'socket'), + ( ITYPE_FIFO ,'fifo'), + ( ITYPE_CHARACTER ,'character'), + ( ITYPE_BLOCK ,'block'), + ( ITYPE_SYMLINK ,'symblink')) + + target = models.ForeignKey(Target) + path = models.FilePathField() + size = models.IntegerField() + inodetype = models.IntegerField(choices = ITYPES) + permission = models.IntegerField() + owner = models.CharField(max_length=128) + group = models.CharField(max_length=128) + directory = models.ForeignKey('Target_File', related_name="directory_set") + sym_target = models.ForeignKey('Target_File', related_name="symlink_set", blank=True) class TaskManager(models.Manager): @@ -149,7 +177,7 @@ class Task(models.Model): line_number = models.IntegerField(default=0) disk_io = models.IntegerField(null=True) cpu_usage = models.DecimalField(max_digits=6, decimal_places=2, null=True) - elapsed_time = models.CharField(max_length=50, default=0) + elapsed_time = models.DecimalField(max_digits=6, decimal_places=2, null=True) sstate_result = models.IntegerField(choices=SSTATE_RESULT, default=SSTATE_NA) message = models.CharField(max_length=240) logfile = models.FilePathField(max_length=255, blank=True) @@ -236,7 +264,6 @@ class Recipe(models.Model): description = models.CharField(max_length=100, blank=True) section = models.CharField(max_length=100, blank=True) license = models.CharField(max_length=200, blank=True) - licensing_info = models.TextField(blank=True) homepage = models.URLField(blank=True) bugtracker = models.URLField(blank=True) file_path = models.FilePathField(max_length=255) @@ -280,6 +307,7 @@ class Variable(models.Model): class VariableHistory(models.Model): variable = models.ForeignKey(Variable, related_name='vhistory') + value = models.TextField(blank=True) file_name = models.FilePathField(max_length=255) line_number = models.IntegerField(null=True) operation = models.CharField(max_length=16) @@ -294,6 +322,7 @@ class LogMessage(models.Model): (ERROR, "error") ) build = models.ForeignKey(Build) + task = models.ForeignKey(Task, blank = True, null=True) level = models.IntegerField(choices=LOG_LEVEL, default=INFO) message=models.CharField(max_length=240) pathname = models.FilePathField(max_length=255, blank=True) diff --git a/bitbake/lib/toaster/toastergui/templates/build.html b/bitbake/lib/toaster/toastergui/templates/build.html index bdfa5c20e3..3b0c614502 100644 --- a/bitbake/lib/toaster/toastergui/templates/build.html +++ b/bitbake/lib/toaster/toastergui/templates/build.html @@ -94,7 +94,7 @@ {% if build.warnings_no %}{{build.warnings_no}} warning{{build.warnings_no|pluralize}}{%endif%} {{build.timespent|sectohms}} {{build.cooker_log_path}} - {% if build.outcome == 0 %}{% for t in build.target_set.all %}{% if t.is_image %}{{build.image_fstypes}}{% endif %}{% endfor %}{% endif %} + {% if build.outcome == 0 %}{% for t in build.target_set.all %}{% if t.is_image %}TODO: compute image output fstypes{% endif %}{% endfor %}{% endif %} {% endfor %} diff --git a/bitbake/lib/toaster/toastergui/views.py b/bitbake/lib/toaster/toastergui/views.py index 3a362e6fe6..8383e73434 100644 --- a/bitbake/lib/toaster/toastergui/views.py +++ b/bitbake/lib/toaster/toastergui/views.py @@ -329,7 +329,7 @@ def builds(request): }, {'name': 'Output', 'clclass': 'output', 'qhelp': "The root file system types produced by the build. You can find them in your /build/tmp/deploy/images/ directory", - 'orderfield': _get_toggle_order(request, "image_fstypes") + # TODO: compute image fstypes from Target_Image_File }, ] } -- cgit v1.2.3-54-g00ecf