diff options
| author | Alexandru DAMIAN <alexandru.damian@intel.com> | 2015-05-14 16:44:27 +0100 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2015-05-29 11:59:44 +0100 |
| commit | 56c5ff920c93a627f6bd473383ab4bbca912fc41 (patch) | |
| tree | 7a193c508fe8e74786a0d21c6877aef1fd88bbae | |
| parent | e3e85bdf7100cc5619d7f184dc8d9e2a77a03364 (diff) | |
| download | poky-56c5ff920c93a627f6bd473383ab4bbca912fc41.tar.gz | |
bitbake: toaster logger: assign projects to all builds
Bitbake logger now sets a default project if the TOASTER_BRBE
or TOASTER_PROJECT Bitbake variables are not set.
This a necessary step in getting all builds under a project,
as to unify the MANAGED and interactive modes.
Other small fixes are included, related to the size of the
fields in the database.
(Bitbake rev: 5e0bf388f4e5c1cc493ac8264785e631bad2f672)
Signed-off-by: Alexandru DAMIAN <alexandru.damian@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
4 files changed, 405 insertions, 17 deletions
diff --git a/bitbake/lib/bb/ui/buildinfohelper.py b/bitbake/lib/bb/ui/buildinfohelper.py index 6812a52b7b..3ea842cd4b 100644 --- a/bitbake/lib/bb/ui/buildinfohelper.py +++ b/bitbake/lib/bb/ui/buildinfohelper.py | |||
| @@ -31,6 +31,9 @@ from toaster.orm.models import Variable, VariableHistory | |||
| 31 | from toaster.orm.models import Package, Package_File, Target_Installed_Package, Target_File | 31 | from toaster.orm.models import Package, Package_File, Target_Installed_Package, Target_File |
| 32 | from toaster.orm.models import Task_Dependency, Package_Dependency | 32 | from toaster.orm.models import Task_Dependency, Package_Dependency |
| 33 | from toaster.orm.models import Recipe_Dependency | 33 | from toaster.orm.models import Recipe_Dependency |
| 34 | |||
| 35 | from toaster.orm.models import Project | ||
| 36 | |||
| 34 | from bb.msg import BBLogFormatter as format | 37 | from bb.msg import BBLogFormatter as format |
| 35 | from django.db import models | 38 | from django.db import models |
| 36 | from pprint import pformat | 39 | from pprint import pformat |
| @@ -103,7 +106,7 @@ class ORMWrapper(object): | |||
| 103 | 106 | ||
| 104 | return vars(self)[dictname][key] | 107 | return vars(self)[dictname][key] |
| 105 | 108 | ||
| 106 | def create_build_object(self, build_info, brbe): | 109 | def create_build_object(self, build_info, brbe, project_id): |
| 107 | assert 'machine' in build_info | 110 | assert 'machine' in build_info |
| 108 | assert 'distro' in build_info | 111 | assert 'distro' in build_info |
| 109 | assert 'distro_version' in build_info | 112 | assert 'distro_version' in build_info |
| @@ -112,7 +115,26 @@ class ORMWrapper(object): | |||
| 112 | assert 'build_name' in build_info | 115 | assert 'build_name' in build_info |
| 113 | assert 'bitbake_version' in build_info | 116 | assert 'bitbake_version' in build_info |
| 114 | 117 | ||
| 118 | prj = None | ||
| 119 | buildrequest = None | ||
| 120 | if brbe is not None: # this build was triggered by a request from a user | ||
| 121 | logger.debug(1, "buildinfohelper: brbe is %s" % brbe) | ||
| 122 | from bldcontrol.models import BuildEnvironment, BuildRequest | ||
| 123 | br, be = brbe.split(":") | ||
| 124 | buildrequest = BuildRequest.objects.get(pk = br) | ||
| 125 | prj = buildrequest.project | ||
| 126 | |||
| 127 | elif project_id is not None: # this build was triggered by an external system for a specific project | ||
| 128 | logger.debug(1, "buildinfohelper: project is %s" % prj) | ||
| 129 | prj = Project.objects.get(pk = project_id) | ||
| 130 | |||
| 131 | else: # this build was triggered by a legacy system, or command line interactive mode | ||
| 132 | prj, created = Project.objects.get_or_create(pk=0, name="Default Project") | ||
| 133 | logger.debug(1, "buildinfohelper: project is not specified, defaulting to %s" % prj) | ||
| 134 | |||
| 135 | |||
| 115 | build = Build.objects.create( | 136 | build = Build.objects.create( |
| 137 | project = prj, | ||
| 116 | machine=build_info['machine'], | 138 | machine=build_info['machine'], |
| 117 | distro=build_info['distro'], | 139 | distro=build_info['distro'], |
| 118 | distro_version=build_info['distro_version'], | 140 | distro_version=build_info['distro_version'], |
| @@ -123,17 +145,11 @@ class ORMWrapper(object): | |||
| 123 | bitbake_version=build_info['bitbake_version']) | 145 | bitbake_version=build_info['bitbake_version']) |
| 124 | 146 | ||
| 125 | logger.debug(1, "buildinfohelper: build is created %s" % build) | 147 | logger.debug(1, "buildinfohelper: build is created %s" % build) |
| 126 | if brbe is not None: | ||
| 127 | logger.debug(1, "buildinfohelper: brbe is %s" % brbe) | ||
| 128 | from bldcontrol.models import BuildEnvironment, BuildRequest | ||
| 129 | br, be = brbe.split(":") | ||
| 130 | 148 | ||
| 131 | buildrequest = BuildRequest.objects.get(pk = br) | 149 | if buildrequest is not None: |
| 132 | buildrequest.build = build | 150 | buildrequest.build = build |
| 133 | buildrequest.save() | 151 | buildrequest.save() |
| 134 | 152 | ||
| 135 | build.project_id = buildrequest.project_id | ||
| 136 | build.save() | ||
| 137 | return build | 153 | return build |
| 138 | 154 | ||
| 139 | def create_target_objects(self, target_info): | 155 | def create_target_objects(self, target_info): |
| @@ -638,6 +654,7 @@ class BuildInfoHelper(object): | |||
| 638 | self.has_build_history = has_build_history | 654 | self.has_build_history = has_build_history |
| 639 | self.tmp_dir = self.server.runCommand(["getVariable", "TMPDIR"])[0] | 655 | self.tmp_dir = self.server.runCommand(["getVariable", "TMPDIR"])[0] |
| 640 | self.brbe = self.server.runCommand(["getVariable", "TOASTER_BRBE"])[0] | 656 | self.brbe = self.server.runCommand(["getVariable", "TOASTER_BRBE"])[0] |
| 657 | self.project = self.server.runCommand(["getVariable", "TOASTER_PROJECT"])[0] | ||
| 641 | logger.debug(1, "buildinfohelper: Build info helper inited %s" % vars(self)) | 658 | logger.debug(1, "buildinfohelper: Build info helper inited %s" % vars(self)) |
| 642 | 659 | ||
| 643 | 660 | ||
| @@ -804,7 +821,7 @@ class BuildInfoHelper(object): | |||
| 804 | assert '_pkgs' in vars(event) | 821 | assert '_pkgs' in vars(event) |
| 805 | build_information = self._get_build_information() | 822 | build_information = self._get_build_information() |
| 806 | 823 | ||
| 807 | build_obj = self.orm_wrapper.create_build_object(build_information, self.brbe) | 824 | build_obj = self.orm_wrapper.create_build_object(build_information, self.brbe, self.project) |
| 808 | 825 | ||
| 809 | self.internal_state['build'] = build_obj | 826 | self.internal_state['build'] = build_obj |
| 810 | 827 | ||
| @@ -1233,7 +1250,7 @@ class BuildInfoHelper(object): | |||
| 1233 | logger.debug(1, "buildinfohelper: Saving stored event %s " % tempevent) | 1250 | logger.debug(1, "buildinfohelper: Saving stored event %s " % tempevent) |
| 1234 | self.store_log_event(tempevent) | 1251 | self.store_log_event(tempevent) |
| 1235 | else: | 1252 | else: |
| 1236 | logger.error("buildinfohelper: Events not saved: %s" % self.internal_state['backlog']) | 1253 | logger.info("buildinfohelper: All events saved") |
| 1237 | del self.internal_state['backlog'] | 1254 | del self.internal_state['backlog'] |
| 1238 | 1255 | ||
| 1239 | log_information = {} | 1256 | log_information = {} |
diff --git a/bitbake/lib/toaster/orm/migrations/0021_auto__chg_field_build_project__chg_field_project_bitbake_version__chg_.py b/bitbake/lib/toaster/orm/migrations/0021_auto__chg_field_build_project__chg_field_project_bitbake_version__chg_.py new file mode 100644 index 0000000000..b82cc8d21b --- /dev/null +++ b/bitbake/lib/toaster/orm/migrations/0021_auto__chg_field_build_project__chg_field_project_bitbake_version__chg_.py | |||
| @@ -0,0 +1,368 @@ | |||
| 1 | # -*- coding: utf-8 -*- | ||
| 2 | from south.utils import datetime_utils as datetime | ||
| 3 | from south.db import db | ||
| 4 | from south.v2 import SchemaMigration | ||
| 5 | from django.db import models | ||
| 6 | |||
| 7 | |||
| 8 | class Migration(SchemaMigration): | ||
| 9 | |||
| 10 | def forwards(self, orm): | ||
| 11 | |||
| 12 | # Changing field 'Build.project' | ||
| 13 | db.alter_column(u'orm_build', 'project_id', self.gf('django.db.models.fields.related.ForeignKey')(default=0, to=orm['orm.Project'])) | ||
| 14 | |||
| 15 | # Changing field 'Project.bitbake_version' | ||
| 16 | db.alter_column(u'orm_project', 'bitbake_version_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['orm.BitbakeVersion'], null=True)) | ||
| 17 | |||
| 18 | # Changing field 'Project.release' | ||
| 19 | db.alter_column(u'orm_project', 'release_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['orm.Release'], null=True)) | ||
| 20 | |||
| 21 | # Changing field 'Task.cpu_usage' | ||
| 22 | db.alter_column(u'orm_task', 'cpu_usage', self.gf('django.db.models.fields.DecimalField')(null=True, max_digits=8, decimal_places=2)) | ||
| 23 | |||
| 24 | # Changing field 'Task.elapsed_time' | ||
| 25 | db.alter_column(u'orm_task', 'elapsed_time', self.gf('django.db.models.fields.DecimalField')(null=True, max_digits=8, decimal_places=2)) | ||
| 26 | |||
| 27 | def backwards(self, orm): | ||
| 28 | |||
| 29 | # Changing field 'Build.project' | ||
| 30 | db.alter_column(u'orm_build', 'project_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['orm.Project'], null=True)) | ||
| 31 | |||
| 32 | # User chose to not deal with backwards NULL issues for 'Project.bitbake_version' | ||
| 33 | raise RuntimeError("Cannot reverse this migration. 'Project.bitbake_version' and its values cannot be restored.") | ||
| 34 | |||
| 35 | # The following code is provided here to aid in writing a correct migration | ||
| 36 | # Changing field 'Project.bitbake_version' | ||
| 37 | db.alter_column(u'orm_project', 'bitbake_version_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['orm.BitbakeVersion'])) | ||
| 38 | |||
| 39 | # User chose to not deal with backwards NULL issues for 'Project.release' | ||
| 40 | raise RuntimeError("Cannot reverse this migration. 'Project.release' and its values cannot be restored.") | ||
| 41 | |||
| 42 | # The following code is provided here to aid in writing a correct migration | ||
| 43 | # Changing field 'Project.release' | ||
| 44 | db.alter_column(u'orm_project', 'release_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['orm.Release'])) | ||
| 45 | |||
| 46 | # Changing field 'Task.cpu_usage' | ||
| 47 | db.alter_column(u'orm_task', 'cpu_usage', self.gf('django.db.models.fields.DecimalField')(null=True, max_digits=6, decimal_places=2)) | ||
| 48 | |||
| 49 | # Changing field 'Task.elapsed_time' | ||
| 50 | db.alter_column(u'orm_task', 'elapsed_time', self.gf('django.db.models.fields.DecimalField')(null=True, max_digits=6, decimal_places=2)) | ||
| 51 | |||
| 52 | models = { | ||
| 53 | u'orm.bitbakeversion': { | ||
| 54 | 'Meta': {'object_name': 'BitbakeVersion'}, | ||
| 55 | 'branch': ('django.db.models.fields.CharField', [], {'max_length': '32'}), | ||
| 56 | 'dirpath': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
| 57 | 'giturl': ('django.db.models.fields.URLField', [], {'max_length': '200'}), | ||
| 58 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 59 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '32'}) | ||
| 60 | }, | ||
| 61 | u'orm.branch': { | ||
| 62 | 'Meta': {'unique_together': "(('layer_source', 'name'), ('layer_source', 'up_id'))", 'object_name': 'Branch'}, | ||
| 63 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 64 | 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'default': 'True', 'to': u"orm['orm.LayerSource']", 'null': 'True'}), | ||
| 65 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), | ||
| 66 | 'short_description': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), | ||
| 67 | 'up_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), | ||
| 68 | 'up_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True'}) | ||
| 69 | }, | ||
| 70 | u'orm.build': { | ||
| 71 | 'Meta': {'object_name': 'Build'}, | ||
| 72 | 'bitbake_version': ('django.db.models.fields.CharField', [], {'max_length': '50'}), | ||
| 73 | 'build_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
| 74 | 'completed_on': ('django.db.models.fields.DateTimeField', [], {}), | ||
| 75 | 'cooker_log_path': ('django.db.models.fields.CharField', [], {'max_length': '500'}), | ||
| 76 | 'distro': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
| 77 | 'distro_version': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
| 78 | 'errors_no': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
| 79 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 80 | 'machine': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
| 81 | 'outcome': ('django.db.models.fields.IntegerField', [], {'default': '2'}), | ||
| 82 | 'project': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Project']"}), | ||
| 83 | 'started_on': ('django.db.models.fields.DateTimeField', [], {}), | ||
| 84 | 'timespent': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
| 85 | 'warnings_no': ('django.db.models.fields.IntegerField', [], {'default': '0'}) | ||
| 86 | }, | ||
| 87 | u'orm.buildartifact': { | ||
| 88 | 'Meta': {'object_name': 'BuildArtifact'}, | ||
| 89 | 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Build']"}), | ||
| 90 | 'file_name': ('django.db.models.fields.FilePathField', [], {'max_length': '100'}), | ||
| 91 | 'file_size': ('django.db.models.fields.IntegerField', [], {}), | ||
| 92 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) | ||
| 93 | }, | ||
| 94 | u'orm.helptext': { | ||
| 95 | 'Meta': {'object_name': 'HelpText'}, | ||
| 96 | 'area': ('django.db.models.fields.IntegerField', [], {}), | ||
| 97 | 'build': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'helptext_build'", 'to': u"orm['orm.Build']"}), | ||
| 98 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 99 | 'key': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
| 100 | 'text': ('django.db.models.fields.TextField', [], {}) | ||
| 101 | }, | ||
| 102 | u'orm.layer': { | ||
| 103 | 'Meta': {'unique_together': "(('layer_source', 'up_id'), ('layer_source', 'name'))", 'object_name': 'Layer'}, | ||
| 104 | 'description': ('django.db.models.fields.TextField', [], {'default': 'None', 'null': 'True'}), | ||
| 105 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 106 | 'layer_index_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}), | ||
| 107 | 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.LayerSource']", 'null': 'True'}), | ||
| 108 | 'local_path': ('django.db.models.fields.FilePathField', [], {'default': 'None', 'max_length': '255', 'null': 'True'}), | ||
| 109 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
| 110 | 'summary': ('django.db.models.fields.TextField', [], {'default': 'None', 'null': 'True'}), | ||
| 111 | 'up_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), | ||
| 112 | 'up_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True'}), | ||
| 113 | 'vcs_url': ('django.db.models.fields.URLField', [], {'default': 'None', 'max_length': '200', 'null': 'True'}), | ||
| 114 | 'vcs_web_file_base_url': ('django.db.models.fields.URLField', [], {'default': 'None', 'max_length': '200', 'null': 'True'}), | ||
| 115 | 'vcs_web_tree_base_url': ('django.db.models.fields.URLField', [], {'default': 'None', 'max_length': '200', 'null': 'True'}), | ||
| 116 | 'vcs_web_url': ('django.db.models.fields.URLField', [], {'default': 'None', 'max_length': '200', 'null': 'True'}) | ||
| 117 | }, | ||
| 118 | u'orm.layer_version': { | ||
| 119 | 'Meta': {'unique_together': "(('layer_source', 'up_id'),)", 'object_name': 'Layer_Version'}, | ||
| 120 | 'branch': ('django.db.models.fields.CharField', [], {'max_length': '80'}), | ||
| 121 | 'build': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'layer_version_build'", 'null': 'True', 'to': u"orm['orm.Build']"}), | ||
| 122 | 'commit': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
| 123 | 'dirpath': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '255', 'null': 'True'}), | ||
| 124 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 125 | 'layer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'layer_version_layer'", 'to': u"orm['orm.Layer']"}), | ||
| 126 | 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.LayerSource']", 'null': 'True'}), | ||
| 127 | 'priority': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
| 128 | 'project': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.Project']", 'null': 'True'}), | ||
| 129 | 'up_branch': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.Branch']", 'null': 'True'}), | ||
| 130 | 'up_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), | ||
| 131 | 'up_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True'}) | ||
| 132 | }, | ||
| 133 | u'orm.layersource': { | ||
| 134 | 'Meta': {'unique_together': "(('sourcetype', 'apiurl'),)", 'object_name': 'LayerSource'}, | ||
| 135 | 'apiurl': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '255', 'null': 'True'}), | ||
| 136 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 137 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '63'}), | ||
| 138 | 'sourcetype': ('django.db.models.fields.IntegerField', [], {}) | ||
| 139 | }, | ||
| 140 | u'orm.layerversiondependency': { | ||
| 141 | 'Meta': {'unique_together': "(('layer_source', 'up_id'),)", 'object_name': 'LayerVersionDependency'}, | ||
| 142 | 'depends_on': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'dependees'", 'to': u"orm['orm.Layer_Version']"}), | ||
| 143 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 144 | 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.LayerSource']", 'null': 'True'}), | ||
| 145 | 'layer_version': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'dependencies'", 'to': u"orm['orm.Layer_Version']"}), | ||
| 146 | 'up_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True'}) | ||
| 147 | }, | ||
| 148 | u'orm.logmessage': { | ||
| 149 | 'Meta': {'object_name': 'LogMessage'}, | ||
| 150 | 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Build']"}), | ||
| 151 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 152 | 'level': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
| 153 | 'lineno': ('django.db.models.fields.IntegerField', [], {'null': 'True'}), | ||
| 154 | 'message': ('django.db.models.fields.CharField', [], {'max_length': '240'}), | ||
| 155 | 'pathname': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'}), | ||
| 156 | 'task': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Task']", 'null': 'True', 'blank': 'True'}) | ||
| 157 | }, | ||
| 158 | u'orm.machine': { | ||
| 159 | 'Meta': {'unique_together': "(('layer_source', 'up_id'),)", 'object_name': 'Machine'}, | ||
| 160 | 'description': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
| 161 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 162 | 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.LayerSource']", 'null': 'True'}), | ||
| 163 | 'layer_version': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Layer_Version']"}), | ||
| 164 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
| 165 | 'up_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), | ||
| 166 | 'up_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True'}) | ||
| 167 | }, | ||
| 168 | u'orm.package': { | ||
| 169 | 'Meta': {'object_name': 'Package'}, | ||
| 170 | 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Build']"}), | ||
| 171 | 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), | ||
| 172 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 173 | 'installed_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100'}), | ||
| 174 | 'installed_size': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
| 175 | 'license': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}), | ||
| 176 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
| 177 | 'recipe': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Recipe']", 'null': 'True'}), | ||
| 178 | 'revision': ('django.db.models.fields.CharField', [], {'max_length': '32', 'blank': 'True'}), | ||
| 179 | 'section': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}), | ||
| 180 | 'size': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
| 181 | 'summary': ('django.db.models.fields.TextField', [], {'blank': 'True'}), | ||
| 182 | 'version': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}) | ||
| 183 | }, | ||
| 184 | u'orm.package_dependency': { | ||
| 185 | 'Meta': {'object_name': 'Package_Dependency'}, | ||
| 186 | 'dep_type': ('django.db.models.fields.IntegerField', [], {}), | ||
| 187 | 'depends_on': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'package_dependencies_target'", 'to': u"orm['orm.Package']"}), | ||
| 188 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 189 | 'package': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'package_dependencies_source'", 'to': u"orm['orm.Package']"}), | ||
| 190 | 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Target']", 'null': 'True'}) | ||
| 191 | }, | ||
| 192 | u'orm.package_file': { | ||
| 193 | 'Meta': {'object_name': 'Package_File'}, | ||
| 194 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 195 | 'package': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'buildfilelist_package'", 'to': u"orm['orm.Package']"}), | ||
| 196 | 'path': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'}), | ||
| 197 | 'size': ('django.db.models.fields.IntegerField', [], {}) | ||
| 198 | }, | ||
| 199 | u'orm.project': { | ||
| 200 | 'Meta': {'object_name': 'Project'}, | ||
| 201 | 'bitbake_version': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.BitbakeVersion']", 'null': 'True'}), | ||
| 202 | 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), | ||
| 203 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 204 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
| 205 | 'release': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Release']", 'null': 'True'}), | ||
| 206 | 'short_description': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), | ||
| 207 | 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), | ||
| 208 | 'user_id': ('django.db.models.fields.IntegerField', [], {'null': 'True'}) | ||
| 209 | }, | ||
| 210 | u'orm.projectlayer': { | ||
| 211 | 'Meta': {'unique_together': "(('project', 'layercommit'),)", 'object_name': 'ProjectLayer'}, | ||
| 212 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 213 | 'layercommit': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Layer_Version']", 'null': 'True'}), | ||
| 214 | 'optional': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), | ||
| 215 | 'project': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Project']"}) | ||
| 216 | }, | ||
| 217 | u'orm.projecttarget': { | ||
| 218 | 'Meta': {'object_name': 'ProjectTarget'}, | ||
| 219 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 220 | 'project': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Project']"}), | ||
| 221 | 'target': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
| 222 | 'task': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'}) | ||
| 223 | }, | ||
| 224 | u'orm.projectvariable': { | ||
| 225 | 'Meta': {'object_name': 'ProjectVariable'}, | ||
| 226 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 227 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
| 228 | 'project': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Project']"}), | ||
| 229 | 'value': ('django.db.models.fields.TextField', [], {'blank': 'True'}) | ||
| 230 | }, | ||
| 231 | u'orm.recipe': { | ||
| 232 | 'Meta': {'unique_together': "(('layer_version', 'file_path'),)", 'object_name': 'Recipe'}, | ||
| 233 | 'bugtracker': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), | ||
| 234 | 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), | ||
| 235 | 'file_path': ('django.db.models.fields.FilePathField', [], {'max_length': '255'}), | ||
| 236 | 'homepage': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), | ||
| 237 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 238 | 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.LayerSource']", 'null': 'True'}), | ||
| 239 | 'layer_version': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'recipe_layer_version'", 'to': u"orm['orm.Layer_Version']"}), | ||
| 240 | 'license': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}), | ||
| 241 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), | ||
| 242 | 'section': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), | ||
| 243 | 'summary': ('django.db.models.fields.TextField', [], {'blank': 'True'}), | ||
| 244 | 'up_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), | ||
| 245 | 'up_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True'}), | ||
| 246 | 'version': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}) | ||
| 247 | }, | ||
| 248 | u'orm.recipe_dependency': { | ||
| 249 | 'Meta': {'object_name': 'Recipe_Dependency'}, | ||
| 250 | 'dep_type': ('django.db.models.fields.IntegerField', [], {}), | ||
| 251 | 'depends_on': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'r_dependencies_depends'", 'to': u"orm['orm.Recipe']"}), | ||
| 252 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 253 | 'recipe': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'r_dependencies_recipe'", 'to': u"orm['orm.Recipe']"}) | ||
| 254 | }, | ||
| 255 | u'orm.release': { | ||
| 256 | 'Meta': {'object_name': 'Release'}, | ||
| 257 | 'bitbake_version': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.BitbakeVersion']"}), | ||
| 258 | 'branch_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '50'}), | ||
| 259 | 'description': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
| 260 | 'helptext': ('django.db.models.fields.TextField', [], {'null': 'True'}), | ||
| 261 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 262 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '32'}) | ||
| 263 | }, | ||
| 264 | u'orm.releasedefaultlayer': { | ||
| 265 | 'Meta': {'object_name': 'ReleaseDefaultLayer'}, | ||
| 266 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 267 | 'layer_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100'}), | ||
| 268 | 'release': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Release']"}) | ||
| 269 | }, | ||
| 270 | u'orm.releaselayersourcepriority': { | ||
| 271 | 'Meta': {'unique_together': "(('release', 'layer_source'),)", 'object_name': 'ReleaseLayerSourcePriority'}, | ||
| 272 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 273 | 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.LayerSource']"}), | ||
| 274 | 'priority': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
| 275 | 'release': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Release']"}) | ||
| 276 | }, | ||
| 277 | u'orm.target': { | ||
| 278 | 'Meta': {'object_name': 'Target'}, | ||
| 279 | 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Build']"}), | ||
| 280 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 281 | 'image_size': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
| 282 | 'is_image': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
| 283 | 'license_manifest_path': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True'}), | ||
| 284 | 'target': ('django.db.models.fields.CharField', [], {'max_length': '100'}) | ||
| 285 | }, | ||
| 286 | u'orm.target_file': { | ||
| 287 | 'Meta': {'object_name': 'Target_File'}, | ||
| 288 | 'directory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'directory_set'", 'null': 'True', 'to': u"orm['orm.Target_File']"}), | ||
| 289 | 'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}), | ||
| 290 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 291 | 'inodetype': ('django.db.models.fields.IntegerField', [], {}), | ||
| 292 | 'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'}), | ||
| 293 | 'path': ('django.db.models.fields.FilePathField', [], {'max_length': '100'}), | ||
| 294 | 'permission': ('django.db.models.fields.CharField', [], {'max_length': '16'}), | ||
| 295 | 'size': ('django.db.models.fields.IntegerField', [], {}), | ||
| 296 | 'sym_target': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'symlink_set'", 'null': 'True', 'to': u"orm['orm.Target_File']"}), | ||
| 297 | 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Target']"}) | ||
| 298 | }, | ||
| 299 | u'orm.target_image_file': { | ||
| 300 | 'Meta': {'object_name': 'Target_Image_File'}, | ||
| 301 | 'file_name': ('django.db.models.fields.FilePathField', [], {'max_length': '254'}), | ||
| 302 | 'file_size': ('django.db.models.fields.IntegerField', [], {}), | ||
| 303 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 304 | 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Target']"}) | ||
| 305 | }, | ||
| 306 | u'orm.target_installed_package': { | ||
| 307 | 'Meta': {'object_name': 'Target_Installed_Package'}, | ||
| 308 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 309 | 'package': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'buildtargetlist_package'", 'to': u"orm['orm.Package']"}), | ||
| 310 | 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Target']"}) | ||
| 311 | }, | ||
| 312 | u'orm.task': { | ||
| 313 | 'Meta': {'ordering': "('order', 'recipe')", 'unique_together': "(('build', 'recipe', 'task_name'),)", 'object_name': 'Task'}, | ||
| 314 | 'build': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'task_build'", 'to': u"orm['orm.Build']"}), | ||
| 315 | 'cpu_usage': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '8', 'decimal_places': '2'}), | ||
| 316 | 'disk_io': ('django.db.models.fields.IntegerField', [], {'null': 'True'}), | ||
| 317 | 'elapsed_time': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '8', 'decimal_places': '2'}), | ||
| 318 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 319 | 'line_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
| 320 | 'logfile': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'}), | ||
| 321 | 'message': ('django.db.models.fields.CharField', [], {'max_length': '240'}), | ||
| 322 | 'order': ('django.db.models.fields.IntegerField', [], {'null': 'True'}), | ||
| 323 | 'outcome': ('django.db.models.fields.IntegerField', [], {'default': '-1'}), | ||
| 324 | 'path_to_sstate_obj': ('django.db.models.fields.FilePathField', [], {'max_length': '500', 'blank': 'True'}), | ||
| 325 | 'recipe': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tasks'", 'to': u"orm['orm.Recipe']"}), | ||
| 326 | 'script_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
| 327 | 'source_url': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'}), | ||
| 328 | 'sstate_checksum': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), | ||
| 329 | 'sstate_result': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
| 330 | 'task_executed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
| 331 | 'task_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
| 332 | 'work_directory': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'}) | ||
| 333 | }, | ||
| 334 | u'orm.task_dependency': { | ||
| 335 | 'Meta': {'object_name': 'Task_Dependency'}, | ||
| 336 | 'depends_on': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'task_dependencies_depends'", 'to': u"orm['orm.Task']"}), | ||
| 337 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 338 | 'task': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'task_dependencies_task'", 'to': u"orm['orm.Task']"}) | ||
| 339 | }, | ||
| 340 | u'orm.toastersetting': { | ||
| 341 | 'Meta': {'object_name': 'ToasterSetting'}, | ||
| 342 | 'helptext': ('django.db.models.fields.TextField', [], {}), | ||
| 343 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 344 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '63'}), | ||
| 345 | 'value': ('django.db.models.fields.CharField', [], {'max_length': '255'}) | ||
| 346 | }, | ||
| 347 | u'orm.variable': { | ||
| 348 | 'Meta': {'object_name': 'Variable'}, | ||
| 349 | 'build': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'variable_build'", 'to': u"orm['orm.Build']"}), | ||
| 350 | 'changed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
| 351 | 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), | ||
| 352 | 'human_readable_name': ('django.db.models.fields.CharField', [], {'max_length': '200'}), | ||
| 353 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 354 | 'variable_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
| 355 | 'variable_value': ('django.db.models.fields.TextField', [], {'blank': 'True'}) | ||
| 356 | }, | ||
| 357 | u'orm.variablehistory': { | ||
| 358 | 'Meta': {'object_name': 'VariableHistory'}, | ||
| 359 | 'file_name': ('django.db.models.fields.FilePathField', [], {'max_length': '255'}), | ||
| 360 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
| 361 | 'line_number': ('django.db.models.fields.IntegerField', [], {'null': 'True'}), | ||
| 362 | 'operation': ('django.db.models.fields.CharField', [], {'max_length': '64'}), | ||
| 363 | 'value': ('django.db.models.fields.TextField', [], {'blank': 'True'}), | ||
| 364 | 'variable': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'vhistory'", 'to': u"orm['orm.Variable']"}) | ||
| 365 | } | ||
| 366 | } | ||
| 367 | |||
| 368 | 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 29ede657c8..0f725764d5 100644 --- a/bitbake/lib/toaster/orm/models.py +++ b/bitbake/lib/toaster/orm/models.py | |||
| @@ -81,15 +81,18 @@ class ProjectManager(models.Manager): | |||
| 81 | def create(self, *args, **kwargs): | 81 | def create(self, *args, **kwargs): |
| 82 | raise Exception("Invalid call to Project.objects.create. Use Project.objects.create_project() to create a project") | 82 | raise Exception("Invalid call to Project.objects.create. Use Project.objects.create_project() to create a project") |
| 83 | 83 | ||
| 84 | def get_or_create(self, *args, **kwargs): | 84 | def get_or_create(self, **kwargs): |
| 85 | # allow project creation for default data | ||
| 86 | if 'pk' in kwargs and kwargs['pk'] == 0: | ||
| 87 | return super(ProjectManager, self).get_or_create(**kwargs) | ||
| 85 | raise Exception("Invalid call to Project.objects.get_or_create. Use Project.objects.create_project() to create a project") | 88 | raise Exception("Invalid call to Project.objects.get_or_create. Use Project.objects.create_project() to create a project") |
| 86 | 89 | ||
| 87 | class Project(models.Model): | 90 | class Project(models.Model): |
| 88 | search_allowed_fields = ['name', 'short_description', 'release__name', 'release__branch_name'] | 91 | search_allowed_fields = ['name', 'short_description', 'release__name', 'release__branch_name'] |
| 89 | name = models.CharField(max_length=100) | 92 | name = models.CharField(max_length=100) |
| 90 | short_description = models.CharField(max_length=50, blank=True) | 93 | short_description = models.CharField(max_length=50, blank=True) |
| 91 | bitbake_version = models.ForeignKey('BitbakeVersion') | 94 | bitbake_version = models.ForeignKey('BitbakeVersion', null=True) |
| 92 | release = models.ForeignKey("Release") | 95 | release = models.ForeignKey("Release", null=True) |
| 93 | created = models.DateTimeField(auto_now_add = True) | 96 | created = models.DateTimeField(auto_now_add = True) |
| 94 | updated = models.DateTimeField(auto_now = True) | 97 | updated = models.DateTimeField(auto_now = True) |
| 95 | # This is a horrible hack; since Toaster has no "User" model available when | 98 | # This is a horrible hack; since Toaster has no "User" model available when |
| @@ -223,7 +226,7 @@ class Build(models.Model): | |||
| 223 | 226 | ||
| 224 | search_allowed_fields = ['machine', 'cooker_log_path', "target__target", "target__target_image_file__file_name"] | 227 | search_allowed_fields = ['machine', 'cooker_log_path', "target__target", "target__target_image_file__file_name"] |
| 225 | 228 | ||
| 226 | project = models.ForeignKey(Project, null = True) | 229 | project = models.ForeignKey(Project) # must have a project |
| 227 | machine = models.CharField(max_length=100) | 230 | machine = models.CharField(max_length=100) |
| 228 | distro = models.CharField(max_length=100) | 231 | distro = models.CharField(max_length=100) |
| 229 | distro_version = models.CharField(max_length=100) | 232 | distro_version = models.CharField(max_length=100) |
| @@ -435,8 +438,8 @@ class Task(models.Model): | |||
| 435 | script_type = models.IntegerField(choices=TASK_CODING, default=CODING_NA) | 438 | script_type = models.IntegerField(choices=TASK_CODING, default=CODING_NA) |
| 436 | line_number = models.IntegerField(default=0) | 439 | line_number = models.IntegerField(default=0) |
| 437 | disk_io = models.IntegerField(null=True) | 440 | disk_io = models.IntegerField(null=True) |
| 438 | cpu_usage = models.DecimalField(max_digits=6, decimal_places=2, null=True) | 441 | cpu_usage = models.DecimalField(max_digits=8, decimal_places=2, null=True) |
| 439 | elapsed_time = models.DecimalField(max_digits=6, decimal_places=2, null=True) | 442 | elapsed_time = models.DecimalField(max_digits=8, decimal_places=2, null=True) |
| 440 | sstate_result = models.IntegerField(choices=SSTATE_RESULT, default=SSTATE_NA) | 443 | sstate_result = models.IntegerField(choices=SSTATE_RESULT, default=SSTATE_NA) |
| 441 | message = models.CharField(max_length=240) | 444 | message = models.CharField(max_length=240) |
| 442 | logfile = models.FilePathField(max_length=255, blank=True) | 445 | logfile = models.FilePathField(max_length=255, blank=True) |
diff --git a/bitbake/lib/toaster/orm/views.py b/bitbake/lib/toaster/orm/views.py index 61d14f9375..f32fa4d225 100644 --- a/bitbake/lib/toaster/orm/views.py +++ b/bitbake/lib/toaster/orm/views.py | |||
| @@ -37,7 +37,7 @@ from django.views.decorators.csrf import csrf_exempt | |||
| 37 | def eventfile(request): | 37 | def eventfile(request): |
| 38 | """ Receives a file by POST, and runs toaster-eventreply on this file """ | 38 | """ Receives a file by POST, and runs toaster-eventreply on this file """ |
| 39 | if request.method != "POST": | 39 | if request.method != "POST": |
| 40 | return HttpResponseBadRequest("This API only accepts POST requests. Post a file with:\n\ncurl -F eventlog=@bitbake_eventlog.json http[s]://[server-address]/orm/eventfile\n", content_type="text/plain;utf8") | 40 | return HttpResponseBadRequest("This API only accepts POST requests. Post a file with:\n\ncurl -F eventlog=@bitbake_eventlog.json %s\n" % request.build_absolute_uri(reverse('eventfile')), content_type="text/plain;utf8") |
| 41 | 41 | ||
| 42 | # write temporary file | 42 | # write temporary file |
| 43 | (handle, abstemppath) = tempfile.mkstemp(dir="/tmp/") | 43 | (handle, abstemppath) = tempfile.mkstemp(dir="/tmp/") |
