toaster: fix mysql migrations and add django test fixture
cover toaster: fix mysql migrations and add django test fixture
This series contains a clean up of the database migrations to fix the issue that was preventing Toaster from starting up when using mysql backend. See https://bugzilla.yoctoproject.org/show_bug.cgi?id=9116
After fixing these migrations and getting Toaster to start up properly using mysql backend a number of unittests failed due to differences in testing on sqlite.
To remove these differences I've changed the data that was in the setUp to be more agnostic and added .lower() where needed to make sure the orderby re-ordering in the same way. I also took this opportunitiy to convert the toastergui unit tests to use a django fixture making it easier to load the database state for testing.
Bugs fixed discovered by fixing the unit tests are:
- toaster: SoftwareRecipesTable apply default order_by
- toaster: toastergui Fix invalid char test and implementation
and one already reported
- toaster: PackagesTable show only installed packages
The following changes since commit eb71785922100bf0f52c3429e60568524d488fd3:
toaster: update the meta-yocto toaster configuration file (2016-02-16 17:37:47 -0800)
are available in the git repository at:
git://git.yoctoproject.org/poky-contrib bavery/test/michaelw/mysql-migration
http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=bavery/test/michaelw/mysql-migration
Michael Wood (5):
toaster: orm migrations Sort out migrations mess
toaster: SoftwareRecipesTable apply default order_by
toaster: toastergui unit tests convert to use fixtures
toaster: PackagesTable show only installed packages
toaster: toastergui Fix invalid char test and implementation
lib/toaster/orm/migrations/0001_initial.py | 26 --
.../orm/migrations/0002_auto_20151210_1209.py | 41 --
.../orm/migrations/0002_customimagerecipe.py | 24 ++
.../orm/migrations/0003_customimagepackage.py | 2 +-
lib/toaster/orm/migrations/0004_merge.py | 15 -
...0002_auto_20151223_1528.py => 0004_provides.py} | 2 +-
.../orm/migrations/0005_auto_20160118_1055.py | 19 -
.../0006_customimagerecipe_last_updated.py | 19 -
.../fixtures/toastergui-unittest-data.xml | 446 +++++++++++++++++++++
lib/toaster/toastergui/tables.py | 5 +-
lib/toaster/toastergui/tests.py | 257 ++----------
lib/toaster/toastergui/views.py | 7 +-
12 files changed, 524 insertions(+), 339 deletions(-)
delete mode 100644 bitbake/lib/toaster/orm/migrations/0002_auto_20151210_1209.py
create mode 100644 bitbake/lib/toaster/orm/migrations/0002_customimagerecipe.py
delete mode 100644 bitbake/lib/toaster/orm/migrations/0004_merge.py
rename bitbake/lib/toaster/orm/migrations/{0002_auto_20151223_1528.py => 0004_provides.py} (94%)
delete mode 100644 bitbake/lib/toaster/orm/migrations/0005_auto_20160118_1055.py
delete mode 100644 bitbake/lib/toaster/orm/migrations/0006_customimagerecipe_last_updated.py
create mode 100644 bitbake/lib/toaster/toastergui/fixtures/toastergui-unittest-data.xml--
1.9.1
PATCH 1/5 toaster: orm migrations Sort out migrations mess
From: Michael Wood <[email protected]>
We messed up the migrations by squashing some of the image customisation model definitions into the initial migration which has meant some irreversible operations on mysql took place. This deletes, re-orders and fixes the migrations.
If your schema is up to date you may want to use ./manage migrate with --fake or --fake-initial to avoid re-applying migrations.
[YOCTO #9116]
---
lib/toaster/orm/migrations/0001_initial.py | 26 --------------
.../orm/migrations/0002_auto_20151210_1209.py | 41 ----------------------
.../orm/migrations/0002_customimagerecipe.py | 24 +++++++++++++
.../orm/migrations/0003_customimagepackage.py | 2 +-
lib/toaster/orm/migrations/0004_merge.py | 15 --------
...0002_auto_20151223_1528.py => 0004_provides.py} | 2 +-
.../orm/migrations/0005_auto_20160118_1055.py | 19 ----------
.../0006_customimagerecipe_last_updated.py | 19 ----------
8 files changed, 26 insertions(+), 122 deletions(-)
delete mode 100644 bitbake/lib/toaster/orm/migrations/0002_auto_20151210_1209.py
create mode 100644 bitbake/lib/toaster/orm/migrations/0002_customimagerecipe.py
delete mode 100644 bitbake/lib/toaster/orm/migrations/0004_merge.py
rename bitbake/lib/toaster/orm/migrations/{0002_auto_20151223_1528.py => 0004_provides.py} (94%)
delete mode 100644 bitbake/lib/toaster/orm/migrations/0005_auto_20160118_1055.py
delete mode 100644 bitbake/lib/toaster/orm/migrations/0006_customimagerecipe_last_updated.pylib/toaster/orm/migrations/0001_initial.py +0 -26
@@ -58,13 +58,6 @@ class Migration(migrations.Migration): ], ), migrations.CreateModel( - name='CustomImageRecipe', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('name', models.CharField(max_length=100)), - ], - ), - migrations.CreateModel( name='HelpText', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
@@ -436,21 +429,6 @@ class Migration(migrations.Migration): field=models.ForeignKey(default=None, to='orm.LayerSource', null=True), ), migrations.AddField( - model_name='customimagerecipe', - name='base_recipe', - field=models.ForeignKey(to='orm.Recipe'), - ), - migrations.AddField( - model_name='customimagerecipe', - name='packages', - field=models.ManyToManyField(to='orm.Package'), - ), - migrations.AddField( - model_name='customimagerecipe', - name='project', - field=models.ForeignKey(to='orm.Project'), - ), - migrations.AddField( model_name='build', name='project', field=models.ForeignKey(to='orm.Project'),
@@ -520,10 +498,6 @@ class Migration(migrations.Migration): unique_together=set([('layer_source', 'up_id'), ('layer_source', 'name')]), ), migrations.AlterUniqueTogether( - name='customimagerecipe', - unique_together=set([('name', 'project')]), - ), - migrations.AlterUniqueTogether( name='branch', unique_together=set([('layer_source', 'up_id'), ('layer_source', 'name')]), ),
lib/toaster/orm/migrations/0002_auto_20151210_1209.py deleted +0 -41
41 lines not on this page · raw message
lib/toaster/orm/migrations/0002_customimagerecipe.py new file +24 -0
@@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('orm', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='CustomImageRecipe', + fields=[ + ('recipe_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='orm.Recipe')), + ('last_updated', models.DateTimeField(default=None, null=True)), + ('base_recipe', models.ForeignKey(related_name='based_on_recipe', to='orm.Recipe')), + ('project', models.ForeignKey(to='orm.Project')), + ], + bases=('orm.recipe',), + ), + ]
lib/toaster/orm/migrations/0003_customimagepackage.py +1 -1
@@ -7,7 +7,7 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('orm', '0002_auto_20151210_1209'), + ('orm', '0002_customimagerecipe'), ] operations = [
lib/toaster/orm/migrations/0004_merge.py deleted +0 -15
@@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orm', '0002_auto_20151223_1528'), - ('orm', '0003_customimagepackage'), - ] - - operations = [ - ]
lib/toaster/orm/migrations/0004_provides.py renamed from lib/toaster/orm/migrations/0002_auto_20151223_1528.py +1 -1
@@ -7,7 +7,7 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('orm', '0001_initial'), + ('orm', '0003_customimagepackage'), ] operations = [
lib/toaster/orm/migrations/0005_auto_20160118_1055.py deleted +0 -19
@@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orm', '0004_merge'), - ] - - operations = [ - migrations.AlterField( - model_name='customimagerecipe', - name='recipe_ptr', - field=models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='orm.Recipe'), - ), - ]
lib/toaster/orm/migrations/0006_customimagerecipe_last_updated.py deleted +0 -19
@@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orm', '0005_auto_20160118_1055'), - ] - - operations = [ - migrations.AddField( - model_name='customimagerecipe', - name='last_updated', - field=models.DateTimeField(default=None, null=True), - ), - ]
Signature · 1 line
1.9.1
PATCH 2/5 toaster: SoftwareRecipesTable apply default order_by
From: Michael Wood <[email protected]>
Make sure the default orderby for the SoftwareRecipesTable is applied
--- lib/toaster/toastergui/tables.py | 1 + 1 file changed, 1 insertion(+)
lib/toaster/toastergui/tables.py +1 -0
@@ -617,6 +617,7 @@ class SoftwareRecipesTable(RecipesTable): super(SoftwareRecipesTable, self).setup_queryset(*args, **kwargs) self.queryset = self.queryset.filter(is_image=False) + self.queryset = self.queryset.order_by(self.default_orderby) def setup_columns(self, *args, **kwargs):
Signature · 1 line
1.9.1
PATCH 3/5 toaster: toastergui unit tests convert to use fixtures
In reply to brian averyFrom: Michael Wood <[email protected]>
Instead of having to manually write up in the setUp function all the different objects to create in the database, just specifiy them in a fixture and load it. This has the advantage that it can be used on a live server by using the ./manage.py loaddata command and can then be inspected.
--- .../fixtures/toastergui-unittest-data.xml | 446 +++++++++++++++++++++ lib/toaster/toastergui/tests.py | 255 ++---------- 2 files changed, 488 insertions(+), 213 deletions(-) create mode 100644 bitbake/lib/toaster/toastergui/fixtures/toastergui-unittest-data.xml
lib/toaster/toastergui/fixtures/toastergui-unittest-data.xml new file +446 -0
@@ -0,0 +1,446 @@ +<?xml version="1.0" encoding="utf-8"?> +<django-objects version="1.0"> + <object pk="1" model="orm.project"> + <field type="CharField" name="name">a test project</field> + <field type="CharField" name="short_description"></field> + <field to="orm.bitbakeversion" name="bitbake_version" rel="ManyToOneRel">1</field> + <field to="orm.release" name="release" rel="ManyToOneRel">1</field> + <field type="DateTimeField" name="created">2016-02-15T18:46:20.098248+00:00</field> + <field type="DateTimeField" name="updated">2016-02-15T18:46:20.098392+00:00</field> + <field type="IntegerField" name="user_id"><None></None></field> + <field type="BooleanField" name="is_default">False</field> + </object> + <object pk="2" model="orm.project"> + <field type="CharField" name="name">z test project</field> + <field type="CharField" name="short_description"></field> + <field to="orm.bitbakeversion" name="bitbake_version" rel="ManyToOneRel">1</field> + <field to="orm.release" name="release" rel="ManyToOneRel">2</field> + <field type="DateTimeField" name="created">2016-02-15T18:46:20.107936+00:00</field> + <field type="DateTimeField" name="updated">2016-02-15T18:46:20.108066+00:00</field> + <field type="IntegerField" name="user_id"><None></None></field> + <field type="BooleanField" name="is_default">False</field> + </object> + <object pk="1" model="orm.ProjectVariable"> + <field to="orm.project" name="project" rel="ManyToOneRel">1</field> + <field type="CharField" name="name">machine</field> + <field type="TextField" name="value">qemux86</field> + </object> + <object pk="2" model="orm.ProjectVariable"> + <field to="orm.project" name="project" rel="ManyToOneRel">2</field> + <field type="CharField" name="name">machine</field> + <field type="TextField" name="value">qemux86</field> + </object> + <object pk="1" model="orm.build"> + <field to="orm.project" name="project" rel="ManyToOneRel">1</field> + <field type="CharField" name="machine">x12</field> + <field type="CharField" name="distro"></field> + <field type="CharField" name="distro_version"></field> + <field type="DateTimeField" name="started_on">2016-02-14T18:46:20.114530+00:00</field> + <field type="DateTimeField" name="completed_on">2016-02-14T18:46:20.114530+00:00</field> + <field type="IntegerField" name="outcome">0</field> + <field type="CharField" name="cooker_log_path"></field> + <field type="CharField" name="build_name">a</field> + <field type="CharField" name="bitbake_version"></field> + </object> + <object pk="2" model="orm.build"> + <field to="orm.project" name="project" rel="ManyToOneRel">1</field> + <field type="CharField" name="machine">raspberrypi2</field> + <field type="CharField" name="distro"></field> + <field type="CharField" name="distro_version"></field> + <field type="DateTimeField" name="started_on">2016-02-13T18:46:20.114530+00:00</field> + <field type="DateTimeField" name="completed_on">2016-02-13T18:46:20.114530+00:00</field> + <field type="IntegerField" name="outcome">0</field> + <field type="CharField" name="cooker_log_path"></field> + <field type="CharField" name="build_name">b</field> + <field type="CharField" name="bitbake_version"></field> + </object> + <object pk="3" model="orm.build"> + <field to="orm.project" name="project" rel="ManyToOneRel">1</field> + <field type="CharField" name="machine">qemux86</field> + <field type="CharField" name="distro"></field> + <field type="CharField" name="distro_version"></field> + <field type="DateTimeField" name="started_on">2016-02-12T18:46:20.114530+00:00</field> + <field type="DateTimeField" name="completed_on">2016-02-12T18:46:20.114530+00:00</field> + <field type="IntegerField" name="outcome">1</field> + <field type="CharField" name="cooker_log_path"></field> + <field type="CharField" name="build_name">c</field> + <field type="CharField" name="bitbake_version"></field> + </object> + <object pk="4" model="orm.build"> + <field to="orm.project" name="project" rel="ManyToOneRel">2</field> + <field type="CharField" name="machine">qemux86</field> + <field type="CharField" name="distro"></field> + <field type="CharField" name="distro_version"></field> + <field type="DateTimeField" name="started_on">2016-02-11T18:46:20.114530+00:00</field> + <field type="DateTimeField" name="completed_on">2016-02-11T18:46:20.114530+00:00</field> + <field type="IntegerField" name="outcome">0</field> + <field type="CharField" name="cooker_log_path"></field> + <field type="CharField" name="build_name">d</field> + <field type="CharField" name="bitbake_version"></field> + </object> + <object pk="1" model="orm.target"> + <field to="orm.build" name="build" rel="ManyToOneRel">1</field> + <field type="CharField" name="target">a image recipe</field> + <field type="CharField" name="task"><None></None></field> + <field type="BooleanField" name="is_image">False</field> + <field type="IntegerField" name="image_size">0</field> + <field type="CharField" name="license_manifest_path"><None></None></field> + </object> + <object pk="2" model="orm.target"> + <field to="orm.build" name="build" rel="ManyToOneRel">2</field> + <field type="CharField" name="target">z something</field> + <field type="CharField" name="task"><None></None></field> + <field type="BooleanField" name="is_image">False</field> + <field type="IntegerField" name="image_size">0</field> + <field type="CharField" name="license_manifest_path"><None></None></field> + </object> + <object pk="3" model="orm.target"> + <field to="orm.build" name="build" rel="ManyToOneRel">3</field> + <field type="CharField" name="target">h recipe</field> + <field type="CharField" name="task"><None></None></field> + <field type="BooleanField" name="is_image">False</field> + <field type="IntegerField" name="image_size">0</field> + <field type="CharField" name="license_manifest_path"><None></None></field> + </object> + <object pk="1" model="orm.package"> + <field to="orm.build" name="build" rel="ManyToOneRel">1</field> + <field to="orm.recipe" name="recipe" rel="ManyToOneRel">2</field> + <field type="CharField" name="name">b pkg</field> + <field type="CharField" name="installed_name"></field> + <field type="CharField" name="version"></field> + <field type="CharField" name="revision"></field> + <field type="TextField" name="summary"></field> + <field type="TextField" name="description"></field> + <field type="IntegerField" name="size">777</field> + <field type="IntegerField" name="installed_size">0</field> + <field type="CharField" name="section"></field> + <field type="CharField" name="license">a license</field> + </object> + <object pk="2" model="orm.package"> + <field to="orm.build" name="build" rel="ManyToOneRel">1</field> + <field to="orm.recipe" name="recipe" rel="ManyToOneRel">2</field> + <field type="CharField" name="name">f pkg</field> + <field type="CharField" name="installed_name"></field> + <field type="CharField" name="version"></field> + <field type="CharField" name="revision"></field> + <field type="TextField" name="summary"></field> + <field type="TextField" name="description"></field> + <field type="IntegerField" name="size">4</field> + <field type="IntegerField" name="installed_size">10</field> + <field type="CharField" name="section"></field> + <field type="CharField" name="license">z license</field> + </object> + <object pk="3" model="orm.package"> + <field to="orm.build" name="build" rel="ManyToOneRel"><None></None></field> + <field to="orm.recipe" name="recipe" rel="ManyToOneRel">1</field> + <field type="CharField" name="name">a custom image pkg</field> + <field type="CharField" name="installed_name"></field> + <field type="CharField" name="version"></field> + <field type="CharField" name="revision"></field> + <field type="TextField" name="summary"></field> + <field type="TextField" name="description"></field> + <field type="IntegerField" name="size">10</field> + <field type="IntegerField" name="installed_size">0</field> + <field type="CharField" name="section"></field> + <field type="CharField" name="license">h license</field> + </object> + <object pk="4" model="orm.package"> + <field to="orm.build" name="build" rel="ManyToOneRel"><None></None></field> + <field to="orm.recipe" name="recipe" rel="ManyToOneRel">2</field> + <field type="CharField" name="name">z custom image pkg</field> + <field type="CharField" name="installed_name"></field> + <field type="CharField" name="version"></field> + <field type="CharField" name="revision"></field> + <field type="TextField" name="summary"></field> + <field type="TextField" name="description"></field> + <field type="IntegerField" name="size">5</field> + <field type="IntegerField" name="installed_size">0</field> + <field type="CharField" name="section"></field> + <field type="CharField" name="license">z license</field> + </object> + <object pk="5" model="orm.package"> + <field to="orm.build" name="build" rel="ManyToOneRel">1</field> + <field to="orm.recipe" name="recipe" rel="ManyToOneRel">4</field> + <field type="CharField" name="name">a custom image pkg</field> + <field type="CharField" name="installed_name"></field> + <field type="CharField" name="version"></field> + <field type="CharField" name="revision"></field> + <field type="TextField" name="summary"></field> + <field type="TextField" name="description"></field> + <field type="IntegerField" name="size">2</field> + <field type="IntegerField" name="installed_size">0</field> + <field type="CharField" name="section"></field> + <field type="CharField" name="license">h licence</field> + </object> + <object pk="1" model="orm.target_installed_package"> + <field to="orm.target" name="target" rel="ManyToOneRel">1</field> + <field to="orm.package" name="package" rel="ManyToOneRel">1</field> + </object> + <object pk="2" model="orm.target_installed_package"> + <field to="orm.target" name="target" rel="ManyToOneRel">1</field> + <field to="orm.package" name="package" rel="ManyToOneRel">2</field> + </object> + <object pk="3" model="orm.target_installed_package"> + <field to="orm.target" name="target" rel="ManyToOneRel">1</field> + <field to="orm.package" name="package" rel="ManyToOneRel">3</field> + </object> + <!-- Note that these augment the existing orm.package of the same pk --> + <object pk="4" model="orm.customimagepackage"> + <field to="orm.customimagerecipe" name="recipe_includes" rel="ManyToManyRel"></field> + <field to="orm.customimagerecipe" name="recipe_excludes" rel="ManyToManyRel"></field> + <field to="orm.customimagerecipe" name="recipe_appends" rel="ManyToManyRel"><object pk="3"></object></field> + </object> + <object pk="5" model="orm.customimagepackage"> + <field to="orm.customimagerecipe" name="recipe_includes" rel="ManyToManyRel"></field> + <field to="orm.customimagerecipe" name="recipe_excludes" rel="ManyToManyRel"></field> + <field to="orm.customimagerecipe" name="recipe_appends" rel="ManyToManyRel"><object pk="3"></object></field> + </object> + <object pk="1" model="orm.recipe"> + <field to="orm.layersource" name="layer_source" rel="ManyToOneRel">1</field> + <field type="IntegerField" name="up_id"><None></None></field> + <field type="DateTimeField" name="up_date"><None></None></field> + <field type="CharField" name="name">z recipe</field> + <field type="CharField" name="version">5.2</field> + <field to="orm.layer_version" name="layer_version" rel="ManyToOneRel">2</field> + <field type="TextField" name="summary">z recipe</field> + <field type="TextField" name="description">z recipe</field> + <field type="CharField" name="section">z section</field> + <field type="CharField" name="license">z license</field> + <field type="CharField" name="homepage"></field> + <field type="CharField" name="bugtracker"></field> + <field type="FilePathField" name="file_path"></field> + <field type="CharField" name="pathflags"></field> + <field type="BooleanField" name="is_image">False</field> + </object> + <object pk="2" model="orm.recipe"> + <field to="orm.layersource" name="layer_source" rel="ManyToOneRel">1</field> + <field type="IntegerField" name="up_id"><None></None></field> + <field type="DateTimeField" name="up_date"><None></None></field> + <field type="CharField" name="name">a recipe</field> + <field type="CharField" name="version">1.2</field> + <field to="orm.layer_version" name="layer_version" rel="ManyToOneRel">1</field> + <field type="TextField" name="summary">a recipe</field> + <field type="TextField" name="description">a recipe</field> + <field type="CharField" name="section">a section</field> + <field type="CharField" name="license">a license</field> + <field type="CharField" name="homepage"></field> + <field type="CharField" name="bugtracker"></field> + <field type="FilePathField" name="file_path">a_recipe.bb</field> + <field type="CharField" name="pathflags"></field> + <field type="BooleanField" name="is_image">False</field> + </object> + <object pk="3" model="orm.recipe"> + <field to="orm.layersource" name="layer_source" rel="ManyToOneRel"><None></None></field> + <field type="IntegerField" name="up_id"><None></None></field> + <field type="DateTimeField" name="up_date"><None></None></field> + <field type="CharField" name="name">a custom recipe</field> + <field type="CharField" name="version"></field> + <field to="orm.layer_version" name="layer_version" rel="ManyToOneRel">2</field> + <field type="TextField" name="summary"></field> + <field type="TextField" name="description"></field> + <field type="CharField" name="section"></field> + <field type="CharField" name="license"></field> + <field type="CharField" name="homepage"></field> + <field type="CharField" name="bugtracker"></field> + <field type="FilePathField" name="file_path">custr</field> + <field type="CharField" name="pathflags"></field> + <field type="BooleanField" name="is_image">False</field> + </object> + <object pk="4" model="orm.recipe"> + <field to="orm.layersource" name="layer_source" rel="ManyToOneRel">1</field> + <field type="IntegerField" name="up_id"><None></None></field> + <field type="DateTimeField" name="up_date"><None></None></field> + <field type="CharField" name="name">a image recipe</field> + <field type="CharField" name="version">1.2</field> + <field to="orm.layer_version" name="layer_version" rel="ManyToOneRel">1</field> + <field type="TextField" name="summary">one recipe</field> + <field type="TextField" name="description">recipe</field> + <field type="CharField" name="section">A</field> + <field type="CharField" name="license">A</field> + <field type="CharField" name="homepage"></field> + <field type="CharField" name="bugtracker"></field> + <field type="FilePathField" name="file_path">/one/</field> + <field type="CharField" name="pathflags"></field> + <field type="BooleanField" name="is_image">True</field> + </object> + <object pk="5" model="orm.recipe"> + <field to="orm.layersource" name="layer_source" rel="ManyToOneRel">1</field> + <field type="IntegerField" name="up_id"><None></None></field> + <field type="DateTimeField" name="up_date"><None></None></field> + <field type="CharField" name="name">z image recipe</field> + <field type="CharField" name="version">1.3</field> + <field to="orm.layer_version" name="layer_version" rel="ManyToOneRel">2</field> + <field type="TextField" name="summary">two image recipe</field> + <field type="TextField" name="description">recipe two</field> + <field type="CharField" name="section">B</field> + <field type="CharField" name="license">Z</field> + <field type="CharField" name="homepage"></field> + <field type="CharField" name="bugtracker"></field> + <field type="FilePathField" name="file_path">/two/</field> + <field type="CharField" name="pathflags"></field> + <field type="BooleanField" name="is_image">True</field> + </object> + <object pk="6" model="orm.recipe"> + <field to="orm.layersource" name="layer_source" rel="ManyToOneRel"><None></None></field> + <field type="IntegerField" name="up_id"><None></None></field> + <field type="DateTimeField" name="up_date"><None></None></field> + <field type="CharField" name="name">z custom recipe</field> + <field type="CharField" name="version"></field> + <field to="orm.layer_version" name="layer_version" rel="ManyToOneRel">2</field> + <field type="TextField" name="summary"></field> + <field type="TextField" name="description"></field> + <field type="CharField" name="section"></field> + <field type="CharField" name="license"></field> + <field type="CharField" name="homepage"></field> + <field type="CharField" name="bugtracker"></field> + <field type="FilePathField" name="file_path">zzzz</field> + <field type="CharField" name="pathflags"></field> + <field type="BooleanField" name="is_image">False</field> + </object> + <object pk="1" model="orm.machine"> + <field to="orm.layersource" name="layer_source" rel="ManyToOneRel"><None></None></field> + <field type="IntegerField" name="up_id"><None></None></field> + <field type="DateTimeField" name="up_date"><None></None></field> + <field to="orm.layer_version" name="layer_version" rel="ManyToOneRel">1</field> + <field type="CharField" name="name">a machine</field> + <field type="CharField" name="description">a machine</field> + </object> + <object pk="2" model="orm.machine"> + <field to="orm.layersource" name="layer_source" rel="ManyToOneRel"><None></None></field> + <field type="IntegerField" name="up_id"><None></None></field> + <field type="DateTimeField" name="up_date"><None></None></field> + <field to="orm.layer_version" name="layer_version" rel="ManyToOneRel">2</field> + <field type="CharField" name="name">z machine</field> + <field type="CharField" name="description">z machine</field> + </object> + <object pk="3" model="orm.machine"> + <field to="orm.layersource" name="layer_source" rel="ManyToOneRel"><None></None></field> + <field type="IntegerField" name="up_id"><None></None></field> + <field type="DateTimeField" name="up_date"><None></None></field> + <field to="orm.layer_version" name="layer_version" rel="ManyToOneRel">1</field> + <field type="CharField" name="name">g machine</field> + <field type="CharField" name="description">g machine</field> + </object> + <object pk="1" model="orm.layersource"> + <field type="CharField" name="name">local</field> + <field type="IntegerField" name="sourcetype">1</field> + <field type="CharField" name="apiurl"></field> + </object> + <object pk="1" model="orm.bitbakeversion"> + <field type="CharField" name="name">test bbv</field> + <field type="CharField" name="giturl">/tmp/</field> + <field type="CharField" name="branch">master</field> + <field type="CharField" name="dirpath"></field> + </object> + <object pk="1" model="orm.release"> + <field type="CharField" name="name">test release</field> + <field type="CharField" name="description"></field> + <field to="orm.bitbakeversion" name="bitbake_version" rel="ManyToOneRel">1</field> + <field type="CharField" name="branch_name">master</field> + <field type="TextField" name="helptext"><None></None></field> + </object> + <object pk="2" model="orm.release"> + <field type="CharField" name="name">test release 2</field> + <field type="CharField" name="description"></field> + <field to="orm.bitbakeversion" name="bitbake_version" rel="ManyToOneRel">1</field> + <field type="CharField" name="branch_name">master</field> + <field type="TextField" name="helptext"><None></None></field> + </object> + <object pk="1" model="orm.releaselayersourcepriority"> + <field to="orm.release" name="release" rel="ManyToOneRel">1</field> + <field to="orm.layersource" name="layer_source" rel="ManyToOneRel">1</field> + <field type="IntegerField" name="priority">0</field> + </object> + <object pk="1" model="orm.branch"> + <field to="orm.layersource" name="layer_source" rel="ManyToOneRel">1</field> + <field type="IntegerField" name="up_id"><None></None></field> + <field type="DateTimeField" name="up_date"><None></None></field> + <field type="CharField" name="name">master</field> + <field type="CharField" name="short_description"></field> + </object> + <object pk="1" model="orm.layer"> + <field to="orm.layersource" name="layer_source" rel="ManyToOneRel"><None></None></field> + <field type="IntegerField" name="up_id"><None></None></field> + <field type="DateTimeField" name="up_date"><None></None></field> + <field type="CharField" name="name">a layer</field> + <field type="CharField" name="layer_index_url"></field> + <field type="CharField" name="vcs_url">/tmp/</field> + <field type="CharField" name="vcs_web_url"><None></None></field> + <field type="CharField" name="vcs_web_tree_base_url"><None></None></field> + <field type="CharField" name="vcs_web_file_base_url"><None></None></field> + <field type="TextField" name="summary"><None></None></field> + <field type="TextField" name="description"><None></None></field> + </object> + <object pk="2" model="orm.layer"> + <field to="orm.layersource" name="layer_source" rel="ManyToOneRel">1</field> + <field type="IntegerField" name="up_id"><None></None></field> + <field type="DateTimeField" name="up_date"><None></None></field> + <field type="CharField" name="name">z layer</field> + <field type="CharField" name="layer_index_url"></field> + <field type="CharField" name="vcs_url">git://two/</field> + <field type="CharField" name="vcs_web_url"><None></None></field> + <field type="CharField" name="vcs_web_tree_base_url"><None></None></field> + <field type="CharField" name="vcs_web_file_base_url"><None></None></field> + <field type="TextField" name="summary"><None></None></field> + <field type="TextField" name="description"><None></None></field> + </object> + <object pk="1" model="orm.layer_version"> + <field to="orm.build" name="build" rel="ManyToOneRel"><None></None></field> + <field to="orm.layer" name="layer" rel="ManyToOneRel">1</field> + <field to="orm.layersource" name="layer_source" rel="ManyToOneRel">1</field> + <field type="IntegerField" name="up_id"><None></None></field> + <field type="DateTimeField" name="up_date"><None></None></field> + <field to="orm.branch" name="up_branch" rel="ManyToOneRel">1</field> + <field type="CharField" name="branch"></field> + <field type="CharField" name="commit">master</field> + <field type="CharField" name="dirpath">/tmp/</field> + <field type="IntegerField" name="priority">0</field> + <field type="FilePathField" name="local_path">/</field> + <field to="orm.project" name="project" rel="ManyToOneRel">1</field> + </object> + <object pk="2" model="orm.layer_version"> + <field to="orm.build" name="build" rel="ManyToOneRel"><None></None></field> + <field to="orm.layer" name="layer" rel="ManyToOneRel">2</field> + <field to="orm.layersource" name="layer_source" rel="ManyToOneRel">1</field> + <field type="IntegerField" name="up_id"><None></None></field> + <field type="DateTimeField" name="up_date"><None></None></field> + <field to="orm.branch" name="up_branch" rel="ManyToOneRel">1</field> + <field type="CharField" name="branch"></field> + <field type="CharField" name="commit">master</field> + <field type="CharField" name="dirpath"><None></None></field> + <field type="IntegerField" name="priority">0</field> + <field type="FilePathField" name="local_path">/</field> + <field to="orm.project" name="project" rel="ManyToOneRel"><None></None></field> + </object> + <object pk="1" model="orm.projectlayer"> + <field to="orm.project" name="project" rel="ManyToOneRel">1</field> + <field to="orm.layer_version" name="layercommit" rel="ManyToOneRel">1</field> + <field type="BooleanField" name="optional">True</field> + </object> + <object pk="3" model="orm.customimagerecipe"> + <field to="orm.recipe" name="base_recipe" rel="ManyToOneRel">2</field> + <field to="orm.project" name="project" rel="ManyToOneRel">1</field> + <field type="DateTimeField" name="last_updated"><None></None></field> + </object> + <object pk="6" model="orm.customimagerecipe"> + <field to="orm.recipe" name="base_recipe" rel="ManyToOneRel">4</field> + <field to="orm.project" name="project" rel="ManyToOneRel">1</field> + <field type="DateTimeField" name="last_updated"><None></None></field> + </object> + <object pk="1" model="orm.logmessage"> + <field to="orm.build" name="build" rel="ManyToOneRel">2</field> + <field to="orm.task" name="task" rel="ManyToOneRel"><None></None></field> + <field type="IntegerField" name="level">1</field> + <field type="TextField" name="message"><None></None></field> + <field type="FilePathField" name="pathname"></field> + <field type="IntegerField" name="lineno"><None></None></field> + </object> + <object pk="2" model="orm.logmessage"> + <field to="orm.build" name="build" rel="ManyToOneRel">2</field> + <field to="orm.task" name="task" rel="ManyToOneRel"><None></None></field> + <field type="IntegerField" name="level">2</field> + <field type="TextField" name="message"><None></None></field> + <field type="FilePathField" name="pathname"></field> + <field type="IntegerField" name="lineno"><None></None></field> + </object> +</django-objects>
lib/toaster/toastergui/tests.py +42 -213
329 lines not on this page · raw message
Signature · 1 line
1.9.1
PATCH 4/5 toaster: PackagesTable show only installed packages
In reply to brian averyFrom: Michael Wood <[email protected]>
When showing the package list for the image recipe details only show the packages which are installed in the image rather than all the packages which are produced.
[YOCTO #9108]
--- lib/toaster/toastergui/tables.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
lib/toaster/toastergui/tables.py +3 -1
@@ -654,7 +654,9 @@ class PackagesTable(ToasterTable): ).last() if target: - return target.build.package_set.all() + pkgs = target.target_installed_package_set.values_list('package', + flat=True) + return Package.objects.filter(pk__in=pkgs) # Target/recipe never successfully built so empty queryset return Package.objects.none()
Signature · 1 line
1.9.1
PATCH 5/5 toaster: toastergui Fix invalid char test and implementation
In reply to brian averyFrom: Michael Wood <[email protected]>
This test was passing but because the assertion was the wrong way round and should have expected the first one to pass and second one to fail, in reality both were failing as the method for checking the invalid char was incorrect.
--- lib/toaster/toastergui/tests.py | 2 +- lib/toaster/toastergui/views.py | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-)
lib/toaster/toastergui/tests.py +1 -1
@@ -155,7 +155,7 @@ class ViewTests(TestCase): response = self.client.post(reverse('xhr_importlayer'), args) data = json.loads(response.content) self.assertEqual(response.status_code, 200) - self.assertNotEqual(data["error"], "ok") + self.assertEqual(data["error"], "ok") #Test to verify import of a layer successful args['name'] = "meta-oe"
lib/toaster/toastergui/views.py +5 -2
@@ -2185,8 +2185,11 @@ if True: layers_added = []; # Rudimentary check for any possible html tags - if "<" in request.POST: - return HttpResponse(jsonfilter({"error": "Invalid character <"}), content_type = "application/json") + for val in request.POST.values(): + if "<" in val: + return HttpResponse(jsonfilter( + {"error": "Invalid character <"}), + content_type="application/json") prj = Project.objects.get(pk=request.POST['project_id'])
Signature · 1 line
1.9.1