Browse Source

toaster: migrate to Django-2.2

Toaster migration to Django-2.2. Django-1.x has been deprecated.

[YOCTO #13207]

Signed-off-by: David Reyna <David.Reyna@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
David Reyna 4 years ago
parent
commit
9730f95686
40 changed files with 197 additions and 174 deletions
  1. 1 1
      lib/toaster/bldcollector/views.py
  2. 9 9
      lib/toaster/bldcontrol/migrations/0001_initial.py
  3. 9 9
      lib/toaster/bldcontrol/models.py
  4. 50 50
      lib/toaster/orm/migrations/0001_initial.py
  5. 3 3
      lib/toaster/orm/migrations/0002_customimagerecipe.py
  6. 1 1
      lib/toaster/orm/migrations/0003_customimagepackage.py
  7. 2 2
      lib/toaster/orm/migrations/0004_provides.py
  8. 2 2
      lib/toaster/orm/migrations/0008_refactor_artifact_models.py
  9. 1 1
      lib/toaster/orm/migrations/0012_use_release_instead_of_up_branch.py
  10. 1 1
      lib/toaster/orm/migrations/0017_distro_clone.py
  11. 23 0
      lib/toaster/orm/migrations/0019_django_2_2.py
  12. 49 49
      lib/toaster/orm/models.py
  13. 1 1
      lib/toaster/tests/browser/test_all_builds_page.py
  14. 1 1
      lib/toaster/tests/browser/test_all_projects_page.py
  15. 1 1
      lib/toaster/tests/browser/test_builddashboard_page.py
  16. 1 1
      lib/toaster/tests/browser/test_builddashboard_page_artifacts.py
  17. 1 1
      lib/toaster/tests/browser/test_builddashboard_page_recipes.py
  18. 1 1
      lib/toaster/tests/browser/test_builddashboard_page_tasks.py
  19. 1 1
      lib/toaster/tests/browser/test_js_unit_tests.py
  20. 1 1
      lib/toaster/tests/browser/test_landing_page.py
  21. 1 1
      lib/toaster/tests/browser/test_layerdetails_page.py
  22. 1 1
      lib/toaster/tests/browser/test_most_recent_builds_states.py
  23. 1 1
      lib/toaster/tests/browser/test_new_custom_image_page.py
  24. 1 1
      lib/toaster/tests/browser/test_new_project_page.py
  25. 1 1
      lib/toaster/tests/browser/test_project_builds_page.py
  26. 3 2
      lib/toaster/tests/browser/test_project_config_page.py
  27. 1 1
      lib/toaster/tests/browser/test_project_page.py
  28. 1 1
      lib/toaster/tests/browser/test_sample.py
  29. 1 1
      lib/toaster/tests/browser/test_task_page.py
  30. 1 1
      lib/toaster/tests/browser/test_toastertable_ui.py
  31. 1 1
      lib/toaster/tests/views/test_views.py
  32. 1 1
      lib/toaster/toastergui/api.py
  33. 1 1
      lib/toaster/toastergui/templatetags/project_url_tag.py
  34. 2 2
      lib/toaster/toastergui/templatetags/projecttags.py
  35. 1 1
      lib/toaster/toastergui/typeaheads.py
  36. 8 8
      lib/toaster/toastergui/views.py
  37. 1 1
      lib/toaster/toastergui/widgets.py
  38. 1 1
      lib/toaster/toastermain/management/commands/buildimport.py
  39. 8 9
      lib/toaster/toastermain/settings.py
  40. 2 2
      lib/toaster/toastermain/urls.py

+ 1 - 1
lib/toaster/bldcollector/views.py

@@ -6,7 +6,7 @@
 # SPDX-License-Identifier: GPL-2.0-only
 # SPDX-License-Identifier: GPL-2.0-only
 #
 #
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.http import HttpResponseBadRequest, HttpResponse
 from django.http import HttpResponseBadRequest, HttpResponse
 import os
 import os
 import tempfile
 import tempfile

+ 9 - 9
lib/toaster/bldcontrol/migrations/0001_initial.py

@@ -37,7 +37,7 @@ class Migration(migrations.Migration):
                 ('giturl', models.CharField(max_length=254)),
                 ('giturl', models.CharField(max_length=254)),
                 ('commit', models.CharField(max_length=254)),
                 ('commit', models.CharField(max_length=254)),
                 ('dirpath', models.CharField(max_length=254)),
                 ('dirpath', models.CharField(max_length=254)),
-                ('layer_version', models.ForeignKey(to='orm.Layer_Version', null=True)),
+                ('layer_version', models.ForeignKey(to='orm.Layer_Version', null=True, on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.CreateModel(
         migrations.CreateModel(
@@ -80,34 +80,34 @@ class Migration(migrations.Migration):
                 ('state', models.IntegerField(default=0, choices=[(0, b'created'), (1, b'queued'), (2, b'in progress'), (3, b'completed'), (4, b'failed'), (5, b'deleted'), (6, b'archive')])),
                 ('state', models.IntegerField(default=0, choices=[(0, b'created'), (1, b'queued'), (2, b'in progress'), (3, b'completed'), (4, b'failed'), (5, b'deleted'), (6, b'archive')])),
                 ('created', models.DateTimeField(auto_now_add=True)),
                 ('created', models.DateTimeField(auto_now_add=True)),
                 ('updated', models.DateTimeField(auto_now=True)),
                 ('updated', models.DateTimeField(auto_now=True)),
-                ('build', models.OneToOneField(null=True, to='orm.Build')),
-                ('environment', models.ForeignKey(to='bldcontrol.BuildEnvironment', null=True)),
-                ('project', models.ForeignKey(to='orm.Project')),
+                ('build', models.OneToOneField(null=True, to='orm.Build', on_delete=models.CASCADE)),
+                ('environment', models.ForeignKey(to='bldcontrol.BuildEnvironment', null=True, on_delete=models.CASCADE)),
+                ('project', models.ForeignKey(to='orm.Project', on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.AddField(
         migrations.AddField(
             model_name='brvariable',
             model_name='brvariable',
             name='req',
             name='req',
-            field=models.ForeignKey(to='bldcontrol.BuildRequest'),
+            field=models.ForeignKey(to='bldcontrol.BuildRequest', on_delete=models.CASCADE),
         ),
         ),
         migrations.AddField(
         migrations.AddField(
             model_name='brtarget',
             model_name='brtarget',
             name='req',
             name='req',
-            field=models.ForeignKey(to='bldcontrol.BuildRequest'),
+            field=models.ForeignKey(to='bldcontrol.BuildRequest', on_delete=models.CASCADE),
         ),
         ),
         migrations.AddField(
         migrations.AddField(
             model_name='brlayer',
             model_name='brlayer',
             name='req',
             name='req',
-            field=models.ForeignKey(to='bldcontrol.BuildRequest'),
+            field=models.ForeignKey(to='bldcontrol.BuildRequest', on_delete=models.CASCADE),
         ),
         ),
         migrations.AddField(
         migrations.AddField(
             model_name='brerror',
             model_name='brerror',
             name='req',
             name='req',
-            field=models.ForeignKey(to='bldcontrol.BuildRequest'),
+            field=models.ForeignKey(to='bldcontrol.BuildRequest', on_delete=models.CASCADE),
         ),
         ),
         migrations.AddField(
         migrations.AddField(
             model_name='brbitbake',
             model_name='brbitbake',
             name='req',
             name='req',
-            field=models.OneToOneField(to='bldcontrol.BuildRequest'),
+            field=models.OneToOneField(to='bldcontrol.BuildRequest', on_delete=models.CASCADE),
         ),
         ),
     ]
     ]

+ 9 - 9
lib/toaster/bldcontrol/models.py

@@ -85,9 +85,9 @@ class BuildRequest(models.Model):
 
 
     search_allowed_fields = ("brtarget__target", "build__project__name")
     search_allowed_fields = ("brtarget__target", "build__project__name")
 
 
-    project     = models.ForeignKey(Project)
-    build       = models.OneToOneField(Build, null = True)     # TODO: toasterui should set this when Build is created
-    environment = models.ForeignKey(BuildEnvironment, null = True)
+    project     = models.ForeignKey(Project, on_delete=models.CASCADE)
+    build       = models.OneToOneField(Build, on_delete=models.CASCADE, null = True)     # TODO: toasterui should set this when Build is created
+    environment = models.ForeignKey(BuildEnvironment, on_delete=models.CASCADE, null = True)
     state       = models.IntegerField(choices = REQUEST_STATE, default = REQ_CREATED)
     state       = models.IntegerField(choices = REQUEST_STATE, default = REQ_CREATED)
     created     = models.DateTimeField(auto_now_add = True)
     created     = models.DateTimeField(auto_now_add = True)
     updated     = models.DateTimeField(auto_now = True)
     updated     = models.DateTimeField(auto_now = True)
@@ -131,32 +131,32 @@ class BuildRequest(models.Model):
 
 
 
 
 class BRLayer(models.Model):
 class BRLayer(models.Model):
-    req = models.ForeignKey(BuildRequest)
+    req = models.ForeignKey(BuildRequest, on_delete=models.CASCADE)
     name = models.CharField(max_length=100)
     name = models.CharField(max_length=100)
     giturl = models.CharField(max_length=254, null=True)
     giturl = models.CharField(max_length=254, null=True)
     local_source_dir = models.CharField(max_length=254, null=True)
     local_source_dir = models.CharField(max_length=254, null=True)
     commit = models.CharField(max_length=254, null=True)
     commit = models.CharField(max_length=254, null=True)
     dirpath = models.CharField(max_length=254, null=True)
     dirpath = models.CharField(max_length=254, null=True)
-    layer_version = models.ForeignKey(Layer_Version, null=True)
+    layer_version = models.ForeignKey(Layer_Version, on_delete=models.CASCADE, null=True)
 
 
 class BRBitbake(models.Model):
 class BRBitbake(models.Model):
-    req         = models.OneToOneField(BuildRequest)    # only one bitbake for a request
+    req         = models.OneToOneField(BuildRequest, on_delete=models.CASCADE)    # only one bitbake for a request
     giturl      = models.CharField(max_length =254)
     giturl      = models.CharField(max_length =254)
     commit      = models.CharField(max_length = 254)
     commit      = models.CharField(max_length = 254)
     dirpath     = models.CharField(max_length = 254)
     dirpath     = models.CharField(max_length = 254)
 
 
 class BRVariable(models.Model):
 class BRVariable(models.Model):
-    req         = models.ForeignKey(BuildRequest)
+    req         = models.ForeignKey(BuildRequest, on_delete=models.CASCADE)
     name        = models.CharField(max_length=100)
     name        = models.CharField(max_length=100)
     value       = models.TextField(blank = True)
     value       = models.TextField(blank = True)
 
 
 class BRTarget(models.Model):
 class BRTarget(models.Model):
-    req         = models.ForeignKey(BuildRequest)
+    req         = models.ForeignKey(BuildRequest, on_delete=models.CASCADE)
     target      = models.CharField(max_length=100)
     target      = models.CharField(max_length=100)
     task        = models.CharField(max_length=100, null=True)
     task        = models.CharField(max_length=100, null=True)
 
 
 class BRError(models.Model):
 class BRError(models.Model):
-    req         = models.ForeignKey(BuildRequest)
+    req         = models.ForeignKey(BuildRequest, on_delete=models.CASCADE)
     errtype     = models.CharField(max_length=100)
     errtype     = models.CharField(max_length=100)
     errmsg      = models.TextField()
     errmsg      = models.TextField()
     traceback   = models.TextField()
     traceback   = models.TextField()

+ 50 - 50
lib/toaster/orm/migrations/0001_initial.py

@@ -54,7 +54,7 @@ class Migration(migrations.Migration):
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('file_name', models.FilePathField()),
                 ('file_name', models.FilePathField()),
                 ('file_size', models.IntegerField()),
                 ('file_size', models.IntegerField()),
-                ('build', models.ForeignKey(to='orm.Build')),
+                ('build', models.ForeignKey(to='orm.Build', on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.CreateModel(
         migrations.CreateModel(
@@ -64,7 +64,7 @@ class Migration(migrations.Migration):
                 ('area', models.IntegerField(choices=[(0, b'variable')])),
                 ('area', models.IntegerField(choices=[(0, b'variable')])),
                 ('key', models.CharField(max_length=100)),
                 ('key', models.CharField(max_length=100)),
                 ('text', models.TextField()),
                 ('text', models.TextField()),
-                ('build', models.ForeignKey(related_name='helptext_build', to='orm.Build')),
+                ('build', models.ForeignKey(related_name='helptext_build', to='orm.Build', on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.CreateModel(
         migrations.CreateModel(
@@ -94,8 +94,8 @@ class Migration(migrations.Migration):
                 ('dirpath', models.CharField(default=None, max_length=255, null=True)),
                 ('dirpath', models.CharField(default=None, max_length=255, null=True)),
                 ('priority', models.IntegerField(default=0)),
                 ('priority', models.IntegerField(default=0)),
                 ('local_path', models.FilePathField(default=b'/', max_length=1024)),
                 ('local_path', models.FilePathField(default=b'/', max_length=1024)),
-                ('build', models.ForeignKey(related_name='layer_version_build', default=None, to='orm.Build', null=True)),
-                ('layer', models.ForeignKey(related_name='layer_version_layer', to='orm.Layer')),
+                ('build', models.ForeignKey(related_name='layer_version_build', default=None, to='orm.Build', null=True, on_delete=models.CASCADE)),
+                ('layer', models.ForeignKey(related_name='layer_version_layer', to='orm.Layer', on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.CreateModel(
         migrations.CreateModel(
@@ -112,9 +112,9 @@ class Migration(migrations.Migration):
             fields=[
             fields=[
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('up_id', models.IntegerField(default=None, null=True)),
                 ('up_id', models.IntegerField(default=None, null=True)),
-                ('depends_on', models.ForeignKey(related_name='dependees', to='orm.Layer_Version')),
-                ('layer_source', models.ForeignKey(default=None, to='orm.LayerSource', null=True)),
-                ('layer_version', models.ForeignKey(related_name='dependencies', to='orm.Layer_Version')),
+                ('depends_on', models.ForeignKey(related_name='dependees', to='orm.Layer_Version', on_delete=models.CASCADE)),
+                ('layer_source', models.ForeignKey(default=None, to='orm.LayerSource', null=True, on_delete=models.CASCADE)),
+                ('layer_version', models.ForeignKey(related_name='dependencies', to='orm.Layer_Version', on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.CreateModel(
         migrations.CreateModel(
@@ -125,7 +125,7 @@ class Migration(migrations.Migration):
                 ('message', models.TextField(null=True, blank=True)),
                 ('message', models.TextField(null=True, blank=True)),
                 ('pathname', models.FilePathField(max_length=255, blank=True)),
                 ('pathname', models.FilePathField(max_length=255, blank=True)),
                 ('lineno', models.IntegerField(null=True)),
                 ('lineno', models.IntegerField(null=True)),
-                ('build', models.ForeignKey(to='orm.Build')),
+                ('build', models.ForeignKey(to='orm.Build', on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.CreateModel(
         migrations.CreateModel(
@@ -136,8 +136,8 @@ class Migration(migrations.Migration):
                 ('up_date', models.DateTimeField(default=None, null=True)),
                 ('up_date', models.DateTimeField(default=None, null=True)),
                 ('name', models.CharField(max_length=255)),
                 ('name', models.CharField(max_length=255)),
                 ('description', models.CharField(max_length=255)),
                 ('description', models.CharField(max_length=255)),
-                ('layer_source', models.ForeignKey(default=None, to='orm.LayerSource', null=True)),
-                ('layer_version', models.ForeignKey(to='orm.Layer_Version')),
+                ('layer_source', models.ForeignKey(default=None, to='orm.LayerSource', null=True, on_delete=models.CASCADE)),
+                ('layer_version', models.ForeignKey(to='orm.Layer_Version', on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.CreateModel(
         migrations.CreateModel(
@@ -154,7 +154,7 @@ class Migration(migrations.Migration):
                 ('installed_size', models.IntegerField(default=0)),
                 ('installed_size', models.IntegerField(default=0)),
                 ('section', models.CharField(max_length=80, blank=True)),
                 ('section', models.CharField(max_length=80, blank=True)),
                 ('license', models.CharField(max_length=80, blank=True)),
                 ('license', models.CharField(max_length=80, blank=True)),
-                ('build', models.ForeignKey(to='orm.Build', null=True)),
+                ('build', models.ForeignKey(to='orm.Build', null=True, on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.CreateModel(
         migrations.CreateModel(
@@ -162,8 +162,8 @@ class Migration(migrations.Migration):
             fields=[
             fields=[
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('dep_type', models.IntegerField(choices=[(0, b'depends'), (1, b'depends'), (3, b'recommends'), (2, b'recommends'), (4, b'suggests'), (5, b'provides'), (6, b'replaces'), (7, b'conflicts')])),
                 ('dep_type', models.IntegerField(choices=[(0, b'depends'), (1, b'depends'), (3, b'recommends'), (2, b'recommends'), (4, b'suggests'), (5, b'provides'), (6, b'replaces'), (7, b'conflicts')])),
-                ('depends_on', models.ForeignKey(related_name='package_dependencies_target', to='orm.Package')),
-                ('package', models.ForeignKey(related_name='package_dependencies_source', to='orm.Package')),
+                ('depends_on', models.ForeignKey(related_name='package_dependencies_target', to='orm.Package', on_delete=models.CASCADE)),
+                ('package', models.ForeignKey(related_name='package_dependencies_source', to='orm.Package', on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.CreateModel(
         migrations.CreateModel(
@@ -172,7 +172,7 @@ class Migration(migrations.Migration):
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('path', models.FilePathField(max_length=255, blank=True)),
                 ('path', models.FilePathField(max_length=255, blank=True)),
                 ('size', models.IntegerField()),
                 ('size', models.IntegerField()),
-                ('package', models.ForeignKey(related_name='buildfilelist_package', to='orm.Package')),
+                ('package', models.ForeignKey(related_name='buildfilelist_package', to='orm.Package', on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.CreateModel(
         migrations.CreateModel(
@@ -185,7 +185,7 @@ class Migration(migrations.Migration):
                 ('updated', models.DateTimeField(auto_now=True)),
                 ('updated', models.DateTimeField(auto_now=True)),
                 ('user_id', models.IntegerField(null=True)),
                 ('user_id', models.IntegerField(null=True)),
                 ('is_default', models.BooleanField(default=False)),
                 ('is_default', models.BooleanField(default=False)),
-                ('bitbake_version', models.ForeignKey(to='orm.BitbakeVersion', null=True)),
+                ('bitbake_version', models.ForeignKey(to='orm.BitbakeVersion', null=True, on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.CreateModel(
         migrations.CreateModel(
@@ -193,8 +193,8 @@ class Migration(migrations.Migration):
             fields=[
             fields=[
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('optional', models.BooleanField(default=True)),
                 ('optional', models.BooleanField(default=True)),
-                ('layercommit', models.ForeignKey(to='orm.Layer_Version', null=True)),
-                ('project', models.ForeignKey(to='orm.Project')),
+                ('layercommit', models.ForeignKey(to='orm.Layer_Version', null=True, on_delete=models.CASCADE)),
+                ('project', models.ForeignKey(to='orm.Project', on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.CreateModel(
         migrations.CreateModel(
@@ -203,7 +203,7 @@ class Migration(migrations.Migration):
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('target', models.CharField(max_length=100)),
                 ('target', models.CharField(max_length=100)),
                 ('task', models.CharField(max_length=100, null=True)),
                 ('task', models.CharField(max_length=100, null=True)),
-                ('project', models.ForeignKey(to='orm.Project')),
+                ('project', models.ForeignKey(to='orm.Project', on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.CreateModel(
         migrations.CreateModel(
@@ -212,7 +212,7 @@ class Migration(migrations.Migration):
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('name', models.CharField(max_length=100)),
                 ('name', models.CharField(max_length=100)),
                 ('value', models.TextField(blank=True)),
                 ('value', models.TextField(blank=True)),
-                ('project', models.ForeignKey(to='orm.Project')),
+                ('project', models.ForeignKey(to='orm.Project', on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.CreateModel(
         migrations.CreateModel(
@@ -232,8 +232,8 @@ class Migration(migrations.Migration):
                 ('file_path', models.FilePathField(max_length=255)),
                 ('file_path', models.FilePathField(max_length=255)),
                 ('pathflags', models.CharField(max_length=200, blank=True)),
                 ('pathflags', models.CharField(max_length=200, blank=True)),
                 ('is_image', models.BooleanField(default=False)),
                 ('is_image', models.BooleanField(default=False)),
-                ('layer_source', models.ForeignKey(default=None, to='orm.LayerSource', null=True)),
-                ('layer_version', models.ForeignKey(related_name='recipe_layer_version', to='orm.Layer_Version')),
+                ('layer_source', models.ForeignKey(default=None, to='orm.LayerSource', null=True, on_delete=models.CASCADE)),
+                ('layer_version', models.ForeignKey(related_name='recipe_layer_version', to='orm.Layer_Version', on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.CreateModel(
         migrations.CreateModel(
@@ -241,8 +241,8 @@ class Migration(migrations.Migration):
             fields=[
             fields=[
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('dep_type', models.IntegerField(choices=[(0, b'depends'), (1, b'rdepends')])),
                 ('dep_type', models.IntegerField(choices=[(0, b'depends'), (1, b'rdepends')])),
-                ('depends_on', models.ForeignKey(related_name='r_dependencies_depends', to='orm.Recipe')),
-                ('recipe', models.ForeignKey(related_name='r_dependencies_recipe', to='orm.Recipe')),
+                ('depends_on', models.ForeignKey(related_name='r_dependencies_depends', to='orm.Recipe', on_delete=models.CASCADE)),
+                ('recipe', models.ForeignKey(related_name='r_dependencies_recipe', to='orm.Recipe', on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.CreateModel(
         migrations.CreateModel(
@@ -253,7 +253,7 @@ class Migration(migrations.Migration):
                 ('description', models.CharField(max_length=255)),
                 ('description', models.CharField(max_length=255)),
                 ('branch_name', models.CharField(default=b'', max_length=50)),
                 ('branch_name', models.CharField(default=b'', max_length=50)),
                 ('helptext', models.TextField(null=True)),
                 ('helptext', models.TextField(null=True)),
-                ('bitbake_version', models.ForeignKey(to='orm.BitbakeVersion')),
+                ('bitbake_version', models.ForeignKey(to='orm.BitbakeVersion', on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.CreateModel(
         migrations.CreateModel(
@@ -261,7 +261,7 @@ class Migration(migrations.Migration):
             fields=[
             fields=[
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('layer_name', models.CharField(default=b'', max_length=100)),
                 ('layer_name', models.CharField(default=b'', max_length=100)),
-                ('release', models.ForeignKey(to='orm.Release')),
+                ('release', models.ForeignKey(to='orm.Release', on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.CreateModel(
         migrations.CreateModel(
@@ -269,8 +269,8 @@ class Migration(migrations.Migration):
             fields=[
             fields=[
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('priority', models.IntegerField(default=0)),
                 ('priority', models.IntegerField(default=0)),
-                ('layer_source', models.ForeignKey(to='orm.LayerSource')),
-                ('release', models.ForeignKey(to='orm.Release')),
+                ('layer_source', models.ForeignKey(to='orm.LayerSource', on_delete=models.CASCADE)),
+                ('release', models.ForeignKey(to='orm.Release', on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.CreateModel(
         migrations.CreateModel(
@@ -282,7 +282,7 @@ class Migration(migrations.Migration):
                 ('is_image', models.BooleanField(default=False)),
                 ('is_image', models.BooleanField(default=False)),
                 ('image_size', models.IntegerField(default=0)),
                 ('image_size', models.IntegerField(default=0)),
                 ('license_manifest_path', models.CharField(max_length=500, null=True)),
                 ('license_manifest_path', models.CharField(max_length=500, null=True)),
-                ('build', models.ForeignKey(to='orm.Build')),
+                ('build', models.ForeignKey(to='orm.Build', on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.CreateModel(
         migrations.CreateModel(
@@ -295,9 +295,9 @@ class Migration(migrations.Migration):
                 ('permission', models.CharField(max_length=16)),
                 ('permission', models.CharField(max_length=16)),
                 ('owner', models.CharField(max_length=128)),
                 ('owner', models.CharField(max_length=128)),
                 ('group', models.CharField(max_length=128)),
                 ('group', models.CharField(max_length=128)),
-                ('directory', models.ForeignKey(related_name='directory_set', to='orm.Target_File', null=True)),
-                ('sym_target', models.ForeignKey(related_name='symlink_set', to='orm.Target_File', null=True)),
-                ('target', models.ForeignKey(to='orm.Target')),
+                ('directory', models.ForeignKey(related_name='directory_set', to='orm.Target_File', null=True, on_delete=models.CASCADE)),
+                ('sym_target', models.ForeignKey(related_name='symlink_set', to='orm.Target_File', null=True, on_delete=models.CASCADE)),
+                ('target', models.ForeignKey(to='orm.Target', on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.CreateModel(
         migrations.CreateModel(
@@ -306,15 +306,15 @@ class Migration(migrations.Migration):
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('file_name', models.FilePathField(max_length=254)),
                 ('file_name', models.FilePathField(max_length=254)),
                 ('file_size', models.IntegerField()),
                 ('file_size', models.IntegerField()),
-                ('target', models.ForeignKey(to='orm.Target')),
+                ('target', models.ForeignKey(to='orm.Target', on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.CreateModel(
         migrations.CreateModel(
             name='Target_Installed_Package',
             name='Target_Installed_Package',
             fields=[
             fields=[
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
-                ('package', models.ForeignKey(related_name='buildtargetlist_package', to='orm.Package')),
-                ('target', models.ForeignKey(to='orm.Target')),
+                ('package', models.ForeignKey(related_name='buildtargetlist_package', to='orm.Package', on_delete=models.CASCADE)),
+                ('target', models.ForeignKey(to='orm.Target', on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.CreateModel(
         migrations.CreateModel(
@@ -337,8 +337,8 @@ class Migration(migrations.Migration):
                 ('sstate_result', models.IntegerField(default=0, choices=[(0, b'Not Applicable'), (1, b'File not in cache'), (2, b'Failed'), (3, b'Succeeded')])),
                 ('sstate_result', models.IntegerField(default=0, choices=[(0, b'Not Applicable'), (1, b'File not in cache'), (2, b'Failed'), (3, b'Succeeded')])),
                 ('message', models.CharField(max_length=240)),
                 ('message', models.CharField(max_length=240)),
                 ('logfile', models.FilePathField(max_length=255, blank=True)),
                 ('logfile', models.FilePathField(max_length=255, blank=True)),
-                ('build', models.ForeignKey(related_name='task_build', to='orm.Build')),
-                ('recipe', models.ForeignKey(related_name='tasks', to='orm.Recipe')),
+                ('build', models.ForeignKey(related_name='task_build', to='orm.Build', on_delete=models.CASCADE)),
+                ('recipe', models.ForeignKey(related_name='tasks', to='orm.Recipe', on_delete=models.CASCADE)),
             ],
             ],
             options={
             options={
                 'ordering': ('order', 'recipe'),
                 'ordering': ('order', 'recipe'),
@@ -348,8 +348,8 @@ class Migration(migrations.Migration):
             name='Task_Dependency',
             name='Task_Dependency',
             fields=[
             fields=[
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
-                ('depends_on', models.ForeignKey(related_name='task_dependencies_depends', to='orm.Task')),
-                ('task', models.ForeignKey(related_name='task_dependencies_task', to='orm.Task')),
+                ('depends_on', models.ForeignKey(related_name='task_dependencies_depends', to='orm.Task', on_delete=models.CASCADE)),
+                ('task', models.ForeignKey(related_name='task_dependencies_task', to='orm.Task', on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.CreateModel(
         migrations.CreateModel(
@@ -370,7 +370,7 @@ class Migration(migrations.Migration):
                 ('changed', models.BooleanField(default=False)),
                 ('changed', models.BooleanField(default=False)),
                 ('human_readable_name', models.CharField(max_length=200)),
                 ('human_readable_name', models.CharField(max_length=200)),
                 ('description', models.TextField(blank=True)),
                 ('description', models.TextField(blank=True)),
-                ('build', models.ForeignKey(related_name='variable_build', to='orm.Build')),
+                ('build', models.ForeignKey(related_name='variable_build', to='orm.Build', on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.CreateModel(
         migrations.CreateModel(
@@ -381,28 +381,28 @@ class Migration(migrations.Migration):
                 ('file_name', models.FilePathField(max_length=255)),
                 ('file_name', models.FilePathField(max_length=255)),
                 ('line_number', models.IntegerField(null=True)),
                 ('line_number', models.IntegerField(null=True)),
                 ('operation', models.CharField(max_length=64)),
                 ('operation', models.CharField(max_length=64)),
-                ('variable', models.ForeignKey(related_name='vhistory', to='orm.Variable')),
+                ('variable', models.ForeignKey(related_name='vhistory', to='orm.Variable', on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.AddField(
         migrations.AddField(
             model_name='project',
             model_name='project',
             name='release',
             name='release',
-            field=models.ForeignKey(to='orm.Release', null=True),
+            field=models.ForeignKey(to='orm.Release', null=True, on_delete=models.CASCADE),
         ),
         ),
         migrations.AddField(
         migrations.AddField(
             model_name='package_dependency',
             model_name='package_dependency',
             name='target',
             name='target',
-            field=models.ForeignKey(to='orm.Target', null=True),
+            field=models.ForeignKey(to='orm.Target', null=True, on_delete=models.CASCADE),
         ),
         ),
         migrations.AddField(
         migrations.AddField(
             model_name='package',
             model_name='package',
             name='recipe',
             name='recipe',
-            field=models.ForeignKey(to='orm.Recipe', null=True),
+            field=models.ForeignKey(to='orm.Recipe', null=True, on_delete=models.CASCADE),
         ),
         ),
         migrations.AddField(
         migrations.AddField(
             model_name='logmessage',
             model_name='logmessage',
             name='task',
             name='task',
-            field=models.ForeignKey(blank=True, to='orm.Task', null=True),
+            field=models.ForeignKey(blank=True, to='orm.Task', null=True, on_delete=models.CASCADE),
         ),
         ),
         migrations.AlterUniqueTogether(
         migrations.AlterUniqueTogether(
             name='layersource',
             name='layersource',
@@ -411,32 +411,32 @@ class Migration(migrations.Migration):
         migrations.AddField(
         migrations.AddField(
             model_name='layer_version',
             model_name='layer_version',
             name='layer_source',
             name='layer_source',
-            field=models.ForeignKey(default=None, to='orm.LayerSource', null=True),
+            field=models.ForeignKey(default=None, to='orm.LayerSource', null=True, on_delete=models.CASCADE),
         ),
         ),
         migrations.AddField(
         migrations.AddField(
             model_name='layer_version',
             model_name='layer_version',
             name='project',
             name='project',
-            field=models.ForeignKey(default=None, to='orm.Project', null=True),
+            field=models.ForeignKey(default=None, to='orm.Project', null=True, on_delete=models.CASCADE),
         ),
         ),
         migrations.AddField(
         migrations.AddField(
             model_name='layer_version',
             model_name='layer_version',
             name='up_branch',
             name='up_branch',
-            field=models.ForeignKey(default=None, to='orm.Branch', null=True),
+            field=models.ForeignKey(default=None, to='orm.Branch', null=True, on_delete=models.CASCADE),
         ),
         ),
         migrations.AddField(
         migrations.AddField(
             model_name='layer',
             model_name='layer',
             name='layer_source',
             name='layer_source',
-            field=models.ForeignKey(default=None, to='orm.LayerSource', null=True),
+            field=models.ForeignKey(default=None, to='orm.LayerSource', null=True, on_delete=models.CASCADE),
         ),
         ),
         migrations.AddField(
         migrations.AddField(
             model_name='build',
             model_name='build',
             name='project',
             name='project',
-            field=models.ForeignKey(to='orm.Project'),
+            field=models.ForeignKey(to='orm.Project', on_delete=models.CASCADE),
         ),
         ),
         migrations.AddField(
         migrations.AddField(
             model_name='branch',
             model_name='branch',
             name='layer_source',
             name='layer_source',
-            field=models.ForeignKey(default=True, to='orm.LayerSource', null=True),
+            field=models.ForeignKey(default=True, to='orm.LayerSource', null=True, on_delete=models.CASCADE),
         ),
         ),
         migrations.CreateModel(
         migrations.CreateModel(
             name='ImportedLayerSource',
             name='ImportedLayerSource',

+ 3 - 3
lib/toaster/orm/migrations/0002_customimagerecipe.py

@@ -14,10 +14,10 @@ class Migration(migrations.Migration):
         migrations.CreateModel(
         migrations.CreateModel(
             name='CustomImageRecipe',
             name='CustomImageRecipe',
             fields=[
             fields=[
-                ('recipe_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='orm.Recipe')),
+                ('recipe_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='orm.Recipe', on_delete=models.CASCADE)),
                 ('last_updated', models.DateTimeField(default=None, null=True)),
                 ('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')),
+                ('base_recipe', models.ForeignKey(related_name='based_on_recipe', to='orm.Recipe', on_delete=models.CASCADE)),
+                ('project', models.ForeignKey(to='orm.Project', on_delete=models.CASCADE)),
             ],
             ],
             bases=('orm.recipe',),
             bases=('orm.recipe',),
         ),
         ),

+ 1 - 1
lib/toaster/orm/migrations/0003_customimagepackage.py

@@ -14,7 +14,7 @@ class Migration(migrations.Migration):
         migrations.CreateModel(
         migrations.CreateModel(
             name='CustomImagePackage',
             name='CustomImagePackage',
             fields=[
             fields=[
-                ('package_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='orm.Package')),
+                ('package_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='orm.Package', on_delete=models.CASCADE)),
                 ('recipe_appends', models.ManyToManyField(related_name='appends_set', to='orm.CustomImageRecipe')),
                 ('recipe_appends', models.ManyToManyField(related_name='appends_set', to='orm.CustomImageRecipe')),
                 ('recipe_excludes', models.ManyToManyField(related_name='excludes_set', to='orm.CustomImageRecipe')),
                 ('recipe_excludes', models.ManyToManyField(related_name='excludes_set', to='orm.CustomImageRecipe')),
                 ('recipe_includes', models.ManyToManyField(related_name='includes_set', to='orm.CustomImageRecipe')),
                 ('recipe_includes', models.ManyToManyField(related_name='includes_set', to='orm.CustomImageRecipe')),

+ 2 - 2
lib/toaster/orm/migrations/0004_provides.py

@@ -16,12 +16,12 @@ class Migration(migrations.Migration):
             fields=[
             fields=[
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('name', models.CharField(max_length=100)),
                 ('name', models.CharField(max_length=100)),
-                ('recipe', models.ForeignKey(to='orm.Recipe')),
+                ('recipe', models.ForeignKey(to='orm.Recipe', on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.AddField(
         migrations.AddField(
             model_name='recipe_dependency',
             model_name='recipe_dependency',
             name='via',
             name='via',
-            field=models.ForeignKey(null=True, default=None, to='orm.Provides'),
+            field=models.ForeignKey(null=True, default=None, to='orm.Provides', on_delete=models.CASCADE),
         ),
         ),
     ]
     ]

+ 2 - 2
lib/toaster/orm/migrations/0008_refactor_artifact_models.py

@@ -17,7 +17,7 @@ class Migration(migrations.Migration):
                 ('id', models.AutoField(auto_created=True, primary_key=True, verbose_name='ID', serialize=False)),
                 ('id', models.AutoField(auto_created=True, primary_key=True, verbose_name='ID', serialize=False)),
                 ('file_name', models.FilePathField()),
                 ('file_name', models.FilePathField()),
                 ('file_size', models.IntegerField()),
                 ('file_size', models.IntegerField()),
-                ('target', models.ForeignKey(to='orm.Target')),
+                ('target', models.ForeignKey(to='orm.Target', on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.CreateModel(
         migrations.CreateModel(
@@ -26,7 +26,7 @@ class Migration(migrations.Migration):
                 ('id', models.AutoField(auto_created=True, primary_key=True, verbose_name='ID', serialize=False)),
                 ('id', models.AutoField(auto_created=True, primary_key=True, verbose_name='ID', serialize=False)),
                 ('file_name', models.FilePathField()),
                 ('file_name', models.FilePathField()),
                 ('file_size', models.IntegerField()),
                 ('file_size', models.IntegerField()),
-                ('target', models.ForeignKey(to='orm.Target')),
+                ('target', models.ForeignKey(to='orm.Target', on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
         migrations.RemoveField(
         migrations.RemoveField(

+ 1 - 1
lib/toaster/orm/migrations/0012_use_release_instead_of_up_branch.py

@@ -46,7 +46,7 @@ class Migration(migrations.Migration):
         migrations.AddField(
         migrations.AddField(
             model_name='layer_version',
             model_name='layer_version',
             name='release',
             name='release',
-            field=models.ForeignKey(to='orm.Release', default=None, null=True),
+            field=models.ForeignKey(to='orm.Release', default=None, null=True, on_delete=models.CASCADE),
         ),
         ),
         migrations.RunPython(branch_to_release,
         migrations.RunPython(branch_to_release,
                              reverse_code=migrations.RunPython.noop),
                              reverse_code=migrations.RunPython.noop),

+ 1 - 1
lib/toaster/orm/migrations/0017_distro_clone.py

@@ -18,7 +18,7 @@ class Migration(migrations.Migration):
                 ('up_date', models.DateTimeField(default=None, null=True)),
                 ('up_date', models.DateTimeField(default=None, null=True)),
                 ('name', models.CharField(max_length=255)),
                 ('name', models.CharField(max_length=255)),
                 ('description', models.CharField(max_length=255)),
                 ('description', models.CharField(max_length=255)),
-                ('layer_version', models.ForeignKey(to='orm.Layer_Version')),
+                ('layer_version', models.ForeignKey(to='orm.Layer_Version', on_delete=models.CASCADE)),
             ],
             ],
         ),
         ),
     ]
     ]

+ 23 - 0
lib/toaster/orm/migrations/0019_django_2_2.py

@@ -0,0 +1,23 @@
+# Generated by Django 2.2.7 on 2019-11-19 03:38
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('orm', '0018_project_specific'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='distro',
+            name='up_id',
+        ),
+        migrations.AlterField(
+            model_name='build',
+            name='recipes_parsed',
+            field=models.IntegerField(default=1),
+        ),
+    ]

+ 49 - 49
lib/toaster/orm/models.py

@@ -13,7 +13,7 @@ from django.db.models import F, Q, Sum, Count
 from django.utils import timezone
 from django.utils import timezone
 from django.utils.encoding import force_bytes
 from django.utils.encoding import force_bytes
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 
 
 from django.core import validators
 from django.core import validators
 from django.conf import settings
 from django.conf import settings
@@ -178,8 +178,8 @@ class Project(models.Model):
                              'release__branch_name']
                              'release__branch_name']
     name = models.CharField(max_length=100)
     name = models.CharField(max_length=100)
     short_description = models.CharField(max_length=50, blank=True)
     short_description = models.CharField(max_length=50, blank=True)
-    bitbake_version = models.ForeignKey('BitbakeVersion', null=True)
-    release = models.ForeignKey("Release", null=True)
+    bitbake_version = models.ForeignKey('BitbakeVersion', on_delete=models.CASCADE, null=True)
+    release = models.ForeignKey("Release", on_delete=models.CASCADE, null=True)
     created = models.DateTimeField(auto_now_add=True)
     created = models.DateTimeField(auto_now_add=True)
     updated = models.DateTimeField(auto_now=True)
     updated = models.DateTimeField(auto_now=True)
     # This is a horrible hack; since Toaster has no "User" model available when
     # This is a horrible hack; since Toaster has no "User" model available when
@@ -469,7 +469,7 @@ class Build(models.Model):
 
 
     search_allowed_fields = ['machine', 'cooker_log_path', "target__target", "target__target_image_file__file_name"]
     search_allowed_fields = ['machine', 'cooker_log_path', "target__target", "target__target_image_file__file_name"]
 
 
-    project = models.ForeignKey(Project)            # must have a project
+    project = models.ForeignKey(Project, on_delete=models.CASCADE)            # must have a project
     machine = models.CharField(max_length=100)
     machine = models.CharField(max_length=100)
     distro = models.CharField(max_length=100)
     distro = models.CharField(max_length=100)
     distro_version = models.CharField(max_length=100)
     distro_version = models.CharField(max_length=100)
@@ -777,13 +777,13 @@ class Build(models.Model):
         return "%d %s %s" % (self.id, self.project, ",".join([t.target for t in self.target_set.all()]))
         return "%d %s %s" % (self.id, self.project, ",".join([t.target for t in self.target_set.all()]))
 
 
 class ProjectTarget(models.Model):
 class ProjectTarget(models.Model):
-    project = models.ForeignKey(Project)
+    project = models.ForeignKey(Project, on_delete=models.CASCADE)
     target = models.CharField(max_length=100)
     target = models.CharField(max_length=100)
     task = models.CharField(max_length=100, null=True)
     task = models.CharField(max_length=100, null=True)
 
 
 class Target(models.Model):
 class Target(models.Model):
     search_allowed_fields = ['target', 'file_name']
     search_allowed_fields = ['target', 'file_name']
-    build = models.ForeignKey(Build)
+    build = models.ForeignKey(Build, on_delete=models.CASCADE)
     target = models.CharField(max_length=100)
     target = models.CharField(max_length=100)
     task = models.CharField(max_length=100, null=True)
     task = models.CharField(max_length=100, null=True)
     is_image = models.BooleanField(default = False)
     is_image = models.BooleanField(default = False)
@@ -944,7 +944,7 @@ class Target(models.Model):
 
 
 # kernel artifacts for a target: bzImage and modules*
 # kernel artifacts for a target: bzImage and modules*
 class TargetKernelFile(models.Model):
 class TargetKernelFile(models.Model):
-    target = models.ForeignKey(Target)
+    target = models.ForeignKey(Target, on_delete=models.CASCADE)
     file_name = models.FilePathField()
     file_name = models.FilePathField()
     file_size = models.IntegerField()
     file_size = models.IntegerField()
 
 
@@ -954,7 +954,7 @@ class TargetKernelFile(models.Model):
 
 
 # SDK artifacts for a target: sh and manifest files
 # SDK artifacts for a target: sh and manifest files
 class TargetSDKFile(models.Model):
 class TargetSDKFile(models.Model):
-    target = models.ForeignKey(Target)
+    target = models.ForeignKey(Target, on_delete=models.CASCADE)
     file_name = models.FilePathField()
     file_name = models.FilePathField()
     file_size = models.IntegerField()
     file_size = models.IntegerField()
 
 
@@ -973,7 +973,7 @@ class Target_Image_File(models.Model):
         'ubifs', 'wic', 'wic.bz2', 'wic.gz', 'wic.lzma'
         'ubifs', 'wic', 'wic.bz2', 'wic.gz', 'wic.lzma'
     }
     }
 
 
-    target = models.ForeignKey(Target)
+    target = models.ForeignKey(Target, on_delete=models.CASCADE)
     file_name = models.FilePathField(max_length=254)
     file_name = models.FilePathField(max_length=254)
     file_size = models.IntegerField()
     file_size = models.IntegerField()
 
 
@@ -1007,15 +1007,15 @@ class Target_File(models.Model):
         ( ITYPE_BLOCK ,'block'),
         ( ITYPE_BLOCK ,'block'),
         )
         )
 
 
-    target = models.ForeignKey(Target)
+    target = models.ForeignKey(Target, on_delete=models.CASCADE)
     path = models.FilePathField()
     path = models.FilePathField()
     size = models.IntegerField()
     size = models.IntegerField()
     inodetype = models.IntegerField(choices = ITYPES)
     inodetype = models.IntegerField(choices = ITYPES)
     permission = models.CharField(max_length=16)
     permission = models.CharField(max_length=16)
     owner = models.CharField(max_length=128)
     owner = models.CharField(max_length=128)
     group = models.CharField(max_length=128)
     group = models.CharField(max_length=128)
-    directory = models.ForeignKey('Target_File', related_name="directory_set", null=True)
-    sym_target = models.ForeignKey('Target_File', related_name="symlink_set", null=True)
+    directory = models.ForeignKey('Target_File', on_delete=models.CASCADE, related_name="directory_set", null=True)
+    sym_target = models.ForeignKey('Target_File', on_delete=models.CASCADE, related_name="symlink_set", null=True)
 
 
 
 
 class Task(models.Model):
 class Task(models.Model):
@@ -1102,13 +1102,13 @@ class Task(models.Model):
     def get_description(self):
     def get_description(self):
         return self._helptext
         return self._helptext
 
 
-    build = models.ForeignKey(Build, related_name='task_build')
+    build = models.ForeignKey(Build, on_delete=models.CASCADE, related_name='task_build')
     order = models.IntegerField(null=True)
     order = models.IntegerField(null=True)
     task_executed = models.BooleanField(default=False) # True means Executed, False means Not/Executed
     task_executed = models.BooleanField(default=False) # True means Executed, False means Not/Executed
     outcome = models.IntegerField(choices=TASK_OUTCOME, default=OUTCOME_NA)
     outcome = models.IntegerField(choices=TASK_OUTCOME, default=OUTCOME_NA)
     sstate_checksum = models.CharField(max_length=100, blank=True)
     sstate_checksum = models.CharField(max_length=100, blank=True)
     path_to_sstate_obj = models.FilePathField(max_length=500, blank=True)
     path_to_sstate_obj = models.FilePathField(max_length=500, blank=True)
-    recipe = models.ForeignKey('Recipe', related_name='tasks')
+    recipe = models.ForeignKey('Recipe', on_delete=models.CASCADE, related_name='tasks')
     task_name = models.CharField(max_length=100)
     task_name = models.CharField(max_length=100)
     source_url = models.FilePathField(max_length=255, blank=True)
     source_url = models.FilePathField(max_length=255, blank=True)
     work_directory = models.FilePathField(max_length=255, blank=True)
     work_directory = models.FilePathField(max_length=255, blank=True)
@@ -1147,13 +1147,13 @@ class Task(models.Model):
 
 
 
 
 class Task_Dependency(models.Model):
 class Task_Dependency(models.Model):
-    task = models.ForeignKey(Task, related_name='task_dependencies_task')
-    depends_on = models.ForeignKey(Task, related_name='task_dependencies_depends')
+    task = models.ForeignKey(Task, on_delete=models.CASCADE, related_name='task_dependencies_task')
+    depends_on = models.ForeignKey(Task, on_delete=models.CASCADE, related_name='task_dependencies_depends')
 
 
 class Package(models.Model):
 class Package(models.Model):
     search_allowed_fields = ['name', 'version', 'revision', 'recipe__name', 'recipe__version', 'recipe__license', 'recipe__layer_version__layer__name', 'recipe__layer_version__branch', 'recipe__layer_version__commit', 'recipe__layer_version__local_path', 'installed_name']
     search_allowed_fields = ['name', 'version', 'revision', 'recipe__name', 'recipe__version', 'recipe__license', 'recipe__layer_version__layer__name', 'recipe__layer_version__branch', 'recipe__layer_version__commit', 'recipe__layer_version__local_path', 'installed_name']
-    build = models.ForeignKey('Build', null=True)
-    recipe = models.ForeignKey('Recipe', null=True)
+    build = models.ForeignKey('Build', on_delete=models.CASCADE, null=True)
+    recipe = models.ForeignKey('Recipe', on_delete=models.CASCADE, null=True)
     name = models.CharField(max_length=100)
     name = models.CharField(max_length=100)
     installed_name = models.CharField(max_length=100, default='')
     installed_name = models.CharField(max_length=100, default='')
     version = models.CharField(max_length=100, blank=True)
     version = models.CharField(max_length=100, blank=True)
@@ -1289,19 +1289,19 @@ class Package_Dependency(models.Model):
         TYPE_RCONFLICTS :   ("conflicts", "%s conflicts with %s, which will not be installed if this package is not first removed"),
         TYPE_RCONFLICTS :   ("conflicts", "%s conflicts with %s, which will not be installed if this package is not first removed"),
     }
     }
 
 
-    package = models.ForeignKey(Package, related_name='package_dependencies_source')
-    depends_on = models.ForeignKey(Package, related_name='package_dependencies_target')   # soft dependency
+    package = models.ForeignKey(Package, on_delete=models.CASCADE, related_name='package_dependencies_source')
+    depends_on = models.ForeignKey(Package, on_delete=models.CASCADE, related_name='package_dependencies_target')   # soft dependency
     dep_type = models.IntegerField(choices=DEPENDS_TYPE)
     dep_type = models.IntegerField(choices=DEPENDS_TYPE)
-    target = models.ForeignKey(Target, null=True)
+    target = models.ForeignKey(Target, on_delete=models.CASCADE, null=True)
     objects = Package_DependencyManager()
     objects = Package_DependencyManager()
 
 
 class Target_Installed_Package(models.Model):
 class Target_Installed_Package(models.Model):
-    target = models.ForeignKey(Target)
-    package = models.ForeignKey(Package, related_name='buildtargetlist_package')
+    target = models.ForeignKey(Target, on_delete=models.CASCADE)
+    package = models.ForeignKey(Package, on_delete=models.CASCADE, related_name='buildtargetlist_package')
 
 
 
 
 class Package_File(models.Model):
 class Package_File(models.Model):
-    package = models.ForeignKey(Package, related_name='buildfilelist_package')
+    package = models.ForeignKey(Package, on_delete=models.CASCADE, related_name='buildfilelist_package')
     path = models.FilePathField(max_length=255, blank=True)
     path = models.FilePathField(max_length=255, blank=True)
     size = models.IntegerField()
     size = models.IntegerField()
 
 
@@ -1318,7 +1318,7 @@ class Recipe(models.Model):
 
 
     name = models.CharField(max_length=100, blank=True)
     name = models.CharField(max_length=100, blank=True)
     version = models.CharField(max_length=100, blank=True)
     version = models.CharField(max_length=100, blank=True)
-    layer_version = models.ForeignKey('Layer_Version',
+    layer_version = models.ForeignKey('Layer_Version', on_delete=models.CASCADE,
                                       related_name='recipe_layer_version')
                                       related_name='recipe_layer_version')
     summary = models.TextField(blank=True)
     summary = models.TextField(blank=True)
     description = models.TextField(blank=True)
     description = models.TextField(blank=True)
@@ -1356,7 +1356,7 @@ class Recipe_DependencyManager(models.Manager):
 
 
 class Provides(models.Model):
 class Provides(models.Model):
     name = models.CharField(max_length=100)
     name = models.CharField(max_length=100)
-    recipe = models.ForeignKey(Recipe)
+    recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE)
 
 
 class Recipe_Dependency(models.Model):
 class Recipe_Dependency(models.Model):
     TYPE_DEPENDS = 0
     TYPE_DEPENDS = 0
@@ -1366,9 +1366,9 @@ class Recipe_Dependency(models.Model):
         (TYPE_DEPENDS, "depends"),
         (TYPE_DEPENDS, "depends"),
         (TYPE_RDEPENDS, "rdepends"),
         (TYPE_RDEPENDS, "rdepends"),
     )
     )
-    recipe = models.ForeignKey(Recipe, related_name='r_dependencies_recipe')
-    depends_on = models.ForeignKey(Recipe, related_name='r_dependencies_depends')
-    via = models.ForeignKey(Provides, null=True, default=None)
+    recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE, related_name='r_dependencies_recipe')
+    depends_on = models.ForeignKey(Recipe, on_delete=models.CASCADE, related_name='r_dependencies_depends')
+    via = models.ForeignKey(Provides, on_delete=models.CASCADE, null=True, default=None)
     dep_type = models.IntegerField(choices=DEPENDS_TYPE)
     dep_type = models.IntegerField(choices=DEPENDS_TYPE)
     objects = Recipe_DependencyManager()
     objects = Recipe_DependencyManager()
 
 
@@ -1377,7 +1377,7 @@ class Machine(models.Model):
     search_allowed_fields = ["name", "description", "layer_version__layer__name"]
     search_allowed_fields = ["name", "description", "layer_version__layer__name"]
     up_date = models.DateTimeField(null = True, default = None)
     up_date = models.DateTimeField(null = True, default = None)
 
 
-    layer_version = models.ForeignKey('Layer_Version')
+    layer_version = models.ForeignKey('Layer_Version', on_delete=models.CASCADE)
     name = models.CharField(max_length=255)
     name = models.CharField(max_length=255)
     description = models.CharField(max_length=255)
     description = models.CharField(max_length=255)
 
 
@@ -1408,7 +1408,7 @@ class Release(models.Model):
     """ A release is a project template, used to pre-populate Project settings with a configuration set """
     """ A release is a project template, used to pre-populate Project settings with a configuration set """
     name = models.CharField(max_length=32, unique = True)
     name = models.CharField(max_length=32, unique = True)
     description = models.CharField(max_length=255)
     description = models.CharField(max_length=255)
-    bitbake_version = models.ForeignKey(BitbakeVersion)
+    bitbake_version = models.ForeignKey(BitbakeVersion, on_delete=models.CASCADE)
     branch_name = models.CharField(max_length=50, default = "")
     branch_name = models.CharField(max_length=50, default = "")
     helptext = models.TextField(null=True)
     helptext = models.TextField(null=True)
 
 
@@ -1419,7 +1419,7 @@ class Release(models.Model):
         return self.name
         return self.name
 
 
 class ReleaseDefaultLayer(models.Model):
 class ReleaseDefaultLayer(models.Model):
-    release = models.ForeignKey(Release)
+    release = models.ForeignKey(Release, on_delete=models.CASCADE)
     layer_name = models.CharField(max_length=100, default="")
     layer_name = models.CharField(max_length=100, default="")
 
 
 
 
@@ -1474,10 +1474,10 @@ class Layer_Version(models.Model):
                              "layer__description", "layer__vcs_url",
                              "layer__description", "layer__vcs_url",
                              "dirpath", "release__name", "commit", "branch"]
                              "dirpath", "release__name", "commit", "branch"]
 
 
-    build = models.ForeignKey(Build, related_name='layer_version_build',
+    build = models.ForeignKey(Build, on_delete=models.CASCADE, related_name='layer_version_build',
                               default=None, null=True)
                               default=None, null=True)
 
 
-    layer = models.ForeignKey(Layer, related_name='layer_version_layer')
+    layer = models.ForeignKey(Layer, on_delete=models.CASCADE, related_name='layer_version_layer')
 
 
     layer_source = models.IntegerField(choices=LayerSource.SOURCE_TYPE,
     layer_source = models.IntegerField(choices=LayerSource.SOURCE_TYPE,
                                        default=0)
                                        default=0)
@@ -1485,7 +1485,7 @@ class Layer_Version(models.Model):
     up_date = models.DateTimeField(null=True, default=timezone.now)
     up_date = models.DateTimeField(null=True, default=timezone.now)
 
 
     # To which metadata release does this layer version belong to
     # To which metadata release does this layer version belong to
-    release = models.ForeignKey(Release, null=True, default=None)
+    release = models.ForeignKey(Release, on_delete=models.CASCADE, null=True, default=None)
 
 
     branch = models.CharField(max_length=80)
     branch = models.CharField(max_length=80)
     commit = models.CharField(max_length=100)
     commit = models.CharField(max_length=100)
@@ -1499,7 +1499,7 @@ class Layer_Version(models.Model):
     local_path = models.FilePathField(max_length=1024, default="/")
     local_path = models.FilePathField(max_length=1024, default="/")
 
 
     # Set if this layer is restricted to a particular project
     # Set if this layer is restricted to a particular project
-    project = models.ForeignKey('Project', null=True, default=None)
+    project = models.ForeignKey('Project', on_delete=models.CASCADE, null=True, default=None)
 
 
     # code lifted, with adaptations, from the layerindex-web application
     # code lifted, with adaptations, from the layerindex-web application
     # https://git.yoctoproject.org/cgit/cgit.cgi/layerindex-web/
     # https://git.yoctoproject.org/cgit/cgit.cgi/layerindex-web/
@@ -1608,14 +1608,14 @@ class Layer_Version(models.Model):
 
 
 class LayerVersionDependency(models.Model):
 class LayerVersionDependency(models.Model):
 
 
-    layer_version = models.ForeignKey(Layer_Version,
+    layer_version = models.ForeignKey(Layer_Version, on_delete=models.CASCADE,
                                       related_name="dependencies")
                                       related_name="dependencies")
-    depends_on = models.ForeignKey(Layer_Version,
+    depends_on = models.ForeignKey(Layer_Version, on_delete=models.CASCADE,
                                    related_name="dependees")
                                    related_name="dependees")
 
 
 class ProjectLayer(models.Model):
 class ProjectLayer(models.Model):
-    project = models.ForeignKey(Project)
-    layercommit = models.ForeignKey(Layer_Version, null=True)
+    project = models.ForeignKey(Project, on_delete=models.CASCADE)
+    layercommit = models.ForeignKey(Layer_Version, on_delete=models.CASCADE, null=True)
     optional = models.BooleanField(default = True)
     optional = models.BooleanField(default = True)
 
 
     def __unicode__(self):
     def __unicode__(self):
@@ -1630,8 +1630,8 @@ class CustomImageRecipe(Recipe):
     LAYER_NAME = "toaster-custom-images"
     LAYER_NAME = "toaster-custom-images"
 
 
     search_allowed_fields = ['name']
     search_allowed_fields = ['name']
-    base_recipe = models.ForeignKey(Recipe, related_name='based_on_recipe')
-    project = models.ForeignKey(Project)
+    base_recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE, related_name='based_on_recipe')
+    project = models.ForeignKey(Project, on_delete=models.CASCADE)
     last_updated = models.DateTimeField(null=True, default=None)
     last_updated = models.DateTimeField(null=True, default=None)
 
 
     def get_last_successful_built_target(self):
     def get_last_successful_built_target(self):
@@ -1784,14 +1784,14 @@ class CustomImageRecipe(Recipe):
         return recipe_contents
         return recipe_contents
 
 
 class ProjectVariable(models.Model):
 class ProjectVariable(models.Model):
-    project = models.ForeignKey(Project)
+    project = models.ForeignKey(Project, on_delete=models.CASCADE)
     name = models.CharField(max_length=100)
     name = models.CharField(max_length=100)
     value = models.TextField(blank = True)
     value = models.TextField(blank = True)
 
 
 class Variable(models.Model):
 class Variable(models.Model):
     search_allowed_fields = ['variable_name', 'variable_value',
     search_allowed_fields = ['variable_name', 'variable_value',
                              'vhistory__file_name', "description"]
                              'vhistory__file_name', "description"]
-    build = models.ForeignKey(Build, related_name='variable_build')
+    build = models.ForeignKey(Build, on_delete=models.CASCADE, related_name='variable_build')
     variable_name = models.CharField(max_length=100)
     variable_name = models.CharField(max_length=100)
     variable_value = models.TextField(blank=True)
     variable_value = models.TextField(blank=True)
     changed = models.BooleanField(default=False)
     changed = models.BooleanField(default=False)
@@ -1799,7 +1799,7 @@ class Variable(models.Model):
     description = models.TextField(blank=True)
     description = models.TextField(blank=True)
 
 
 class VariableHistory(models.Model):
 class VariableHistory(models.Model):
-    variable = models.ForeignKey(Variable, related_name='vhistory')
+    variable = models.ForeignKey(Variable, on_delete=models.CASCADE, related_name='vhistory')
     value   = models.TextField(blank=True)
     value   = models.TextField(blank=True)
     file_name = models.FilePathField(max_length=255)
     file_name = models.FilePathField(max_length=255)
     line_number = models.IntegerField(null=True)
     line_number = models.IntegerField(null=True)
@@ -1809,7 +1809,7 @@ class HelpText(models.Model):
     VARIABLE = 0
     VARIABLE = 0
     HELPTEXT_AREA = ((VARIABLE, 'variable'), )
     HELPTEXT_AREA = ((VARIABLE, 'variable'), )
 
 
-    build = models.ForeignKey(Build, related_name='helptext_build')
+    build = models.ForeignKey(Build, on_delete=models.CASCADE, related_name='helptext_build')
     area = models.IntegerField(choices=HELPTEXT_AREA)
     area = models.IntegerField(choices=HELPTEXT_AREA)
     key = models.CharField(max_length=100)
     key = models.CharField(max_length=100)
     text = models.TextField()
     text = models.TextField()
@@ -1829,8 +1829,8 @@ class LogMessage(models.Model):
         (EXCEPTION, "toaster exception")
         (EXCEPTION, "toaster exception")
     )
     )
 
 
-    build = models.ForeignKey(Build)
-    task  = models.ForeignKey(Task, blank = True, null=True)
+    build = models.ForeignKey(Build, on_delete=models.CASCADE)
+    task  = models.ForeignKey(Task, on_delete=models.CASCADE, blank = True, null=True)
     level = models.IntegerField(choices=LOG_LEVEL, default=INFO)
     level = models.IntegerField(choices=LOG_LEVEL, default=INFO)
     message = models.TextField(blank=True, null=True)
     message = models.TextField(blank=True, null=True)
     pathname = models.FilePathField(max_length=255, blank=True)
     pathname = models.FilePathField(max_length=255, blank=True)
@@ -1859,7 +1859,7 @@ class Distro(models.Model):
     search_allowed_fields = ["name", "description", "layer_version__layer__name"]
     search_allowed_fields = ["name", "description", "layer_version__layer__name"]
     up_date = models.DateTimeField(null = True, default = None)
     up_date = models.DateTimeField(null = True, default = None)
 
 
-    layer_version = models.ForeignKey('Layer_Version')
+    layer_version = models.ForeignKey('Layer_Version', on_delete=models.CASCADE)
     name = models.CharField(max_length=255)
     name = models.CharField(max_length=255)
     description = models.CharField(max_length=255)
     description = models.CharField(max_length=255)
 
 

+ 1 - 1
lib/toaster/tests/browser/test_all_builds_page.py

@@ -9,7 +9,7 @@
 
 
 import re
 import re
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.utils import timezone
 from django.utils import timezone
 from tests.browser.selenium_helpers import SeleniumTestCase
 from tests.browser.selenium_helpers import SeleniumTestCase
 
 

+ 1 - 1
lib/toaster/tests/browser/test_all_projects_page.py

@@ -9,7 +9,7 @@
 
 
 import re
 import re
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.utils import timezone
 from django.utils import timezone
 from tests.browser.selenium_helpers import SeleniumTestCase
 from tests.browser.selenium_helpers import SeleniumTestCase
 
 

+ 1 - 1
lib/toaster/tests/browser/test_builddashboard_page.py

@@ -7,7 +7,7 @@
 # SPDX-License-Identifier: GPL-2.0-only
 # SPDX-License-Identifier: GPL-2.0-only
 #
 #
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.utils import timezone
 from django.utils import timezone
 
 
 from tests.browser.selenium_helpers import SeleniumTestCase
 from tests.browser.selenium_helpers import SeleniumTestCase

+ 1 - 1
lib/toaster/tests/browser/test_builddashboard_page_artifacts.py

@@ -7,7 +7,7 @@
 # SPDX-License-Identifier: GPL-2.0-only
 # SPDX-License-Identifier: GPL-2.0-only
 #
 #
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.utils import timezone
 from django.utils import timezone
 
 
 from tests.browser.selenium_helpers import SeleniumTestCase
 from tests.browser.selenium_helpers import SeleniumTestCase

+ 1 - 1
lib/toaster/tests/browser/test_builddashboard_page_recipes.py

@@ -7,7 +7,7 @@
 # SPDX-License-Identifier: GPL-2.0-only
 # SPDX-License-Identifier: GPL-2.0-only
 #
 #
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.utils import timezone
 from django.utils import timezone
 from tests.browser.selenium_helpers import SeleniumTestCase
 from tests.browser.selenium_helpers import SeleniumTestCase
 from orm.models import Project, Build, Recipe, Task, Layer, Layer_Version
 from orm.models import Project, Build, Recipe, Task, Layer, Layer_Version

+ 1 - 1
lib/toaster/tests/browser/test_builddashboard_page_tasks.py

@@ -7,7 +7,7 @@
 # SPDX-License-Identifier: GPL-2.0-only
 # SPDX-License-Identifier: GPL-2.0-only
 #
 #
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.utils import timezone
 from django.utils import timezone
 from tests.browser.selenium_helpers import SeleniumTestCase
 from tests.browser.selenium_helpers import SeleniumTestCase
 from orm.models import Project, Build, Recipe, Task, Layer, Layer_Version
 from orm.models import Project, Build, Recipe, Task, Layer, Layer_Version

+ 1 - 1
lib/toaster/tests/browser/test_js_unit_tests.py

@@ -11,7 +11,7 @@
 Run the js unit tests
 Run the js unit tests
 """
 """
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from tests.browser.selenium_helpers import SeleniumTestCase
 from tests.browser.selenium_helpers import SeleniumTestCase
 import logging
 import logging
 
 

+ 1 - 1
lib/toaster/tests/browser/test_landing_page.py

@@ -7,7 +7,7 @@
 # Copyright (C) 2013-2016 Intel Corporation
 # Copyright (C) 2013-2016 Intel Corporation
 #
 #
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.utils import timezone
 from django.utils import timezone
 from tests.browser.selenium_helpers import SeleniumTestCase
 from tests.browser.selenium_helpers import SeleniumTestCase
 
 

+ 1 - 1
lib/toaster/tests/browser/test_layerdetails_page.py

@@ -7,7 +7,7 @@
 # Copyright (C) 2013-2016 Intel Corporation
 # Copyright (C) 2013-2016 Intel Corporation
 #
 #
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from tests.browser.selenium_helpers import SeleniumTestCase
 from tests.browser.selenium_helpers import SeleniumTestCase
 
 
 from orm.models import Layer, Layer_Version, Project, LayerSource, Release
 from orm.models import Layer, Layer_Version, Project, LayerSource, Release

+ 1 - 1
lib/toaster/tests/browser/test_most_recent_builds_states.py

@@ -7,7 +7,7 @@
 # Copyright (C) 2013-2016 Intel Corporation
 # Copyright (C) 2013-2016 Intel Corporation
 #
 #
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.utils import timezone
 from django.utils import timezone
 from tests.browser.selenium_helpers import SeleniumTestCase
 from tests.browser.selenium_helpers import SeleniumTestCase
 from tests.browser.selenium_helpers_base import Wait
 from tests.browser.selenium_helpers_base import Wait

+ 1 - 1
lib/toaster/tests/browser/test_new_custom_image_page.py

@@ -7,7 +7,7 @@
 # SPDX-License-Identifier: GPL-2.0-only
 # SPDX-License-Identifier: GPL-2.0-only
 #
 #
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from tests.browser.selenium_helpers import SeleniumTestCase
 from tests.browser.selenium_helpers import SeleniumTestCase
 
 
 from orm.models import BitbakeVersion, Release, Project, ProjectLayer, Layer
 from orm.models import BitbakeVersion, Release, Project, ProjectLayer, Layer

+ 1 - 1
lib/toaster/tests/browser/test_new_project_page.py

@@ -7,7 +7,7 @@
 # SPDX-License-Identifier: GPL-2.0-only
 # SPDX-License-Identifier: GPL-2.0-only
 #
 #
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from tests.browser.selenium_helpers import SeleniumTestCase
 from tests.browser.selenium_helpers import SeleniumTestCase
 from selenium.webdriver.support.ui import Select
 from selenium.webdriver.support.ui import Select
 from selenium.common.exceptions import InvalidElementStateException
 from selenium.common.exceptions import InvalidElementStateException

+ 1 - 1
lib/toaster/tests/browser/test_project_builds_page.py

@@ -9,7 +9,7 @@
 
 
 import re
 import re
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.utils import timezone
 from django.utils import timezone
 from tests.browser.selenium_helpers import SeleniumTestCase
 from tests.browser.selenium_helpers import SeleniumTestCase
 
 

+ 3 - 2
lib/toaster/tests/browser/test_project_config_page.py

@@ -7,7 +7,7 @@
 # SPDX-License-Identifier: GPL-2.0-only
 # SPDX-License-Identifier: GPL-2.0-only
 #
 #
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from tests.browser.selenium_helpers import SeleniumTestCase
 from tests.browser.selenium_helpers import SeleniumTestCase
 
 
 from orm.models import BitbakeVersion, Release, Project, ProjectVariable
 from orm.models import BitbakeVersion, Release, Project, ProjectVariable
@@ -213,4 +213,5 @@ class TestProjectConfigsPage(SeleniumTestCase):
 
 
         hidden_element = self.driver.find_element_by_id('hintError-sstate_dir')
         hidden_element = self.driver.find_element_by_id('hintError-sstate_dir')
         self.assertEqual(hidden_element.is_displayed(), False,
         self.assertEqual(hidden_element.is_displayed(), False,
-            'sstate directory path valid but treated as invalid')
+            'sstate directory path valid but treated as invalid')
+

+ 1 - 1
lib/toaster/tests/browser/test_project_page.py

@@ -7,7 +7,7 @@
 # SPDX-License-Identifier: GPL-2.0-only
 # SPDX-License-Identifier: GPL-2.0-only
 #
 #
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.utils import timezone
 from django.utils import timezone
 from tests.browser.selenium_helpers import SeleniumTestCase
 from tests.browser.selenium_helpers import SeleniumTestCase
 
 

+ 1 - 1
lib/toaster/tests/browser/test_sample.py

@@ -16,7 +16,7 @@ New test files should follow this structure, should be named "test_*.py",
 and should be in the same directory as this sample.
 and should be in the same directory as this sample.
 """
 """
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from tests.browser.selenium_helpers import SeleniumTestCase
 from tests.browser.selenium_helpers import SeleniumTestCase
 
 
 class TestSample(SeleniumTestCase):
 class TestSample(SeleniumTestCase):

+ 1 - 1
lib/toaster/tests/browser/test_task_page.py

@@ -7,7 +7,7 @@
 # SPDX-License-Identifier: GPL-2.0-only
 # SPDX-License-Identifier: GPL-2.0-only
 #
 #
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.utils import timezone
 from django.utils import timezone
 from tests.browser.selenium_helpers import SeleniumTestCase
 from tests.browser.selenium_helpers import SeleniumTestCase
 from orm.models import Project, Build, Layer, Layer_Version, Recipe, Target
 from orm.models import Project, Build, Layer, Layer_Version, Recipe, Target

+ 1 - 1
lib/toaster/tests/browser/test_toastertable_ui.py

@@ -9,7 +9,7 @@
 
 
 from datetime import datetime
 from datetime import datetime
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.utils import timezone
 from django.utils import timezone
 from tests.browser.selenium_helpers import SeleniumTestCase
 from tests.browser.selenium_helpers import SeleniumTestCase
 from orm.models import BitbakeVersion, Release, Project, Build
 from orm.models import BitbakeVersion, Release, Project, Build

+ 1 - 1
lib/toaster/tests/views/test_views.py

@@ -11,7 +11,7 @@
 
 
 from django.test import TestCase
 from django.test import TestCase
 from django.test.client import RequestFactory
 from django.test.client import RequestFactory
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.db.models import Q
 from django.db.models import Q
 
 
 from orm.models import Project, Package
 from orm.models import Project, Package

+ 1 - 1
lib/toaster/toastergui/api.py

@@ -24,7 +24,7 @@ from bldcontrol import bbcontroller
 
 
 from django.http import HttpResponse, JsonResponse
 from django.http import HttpResponse, JsonResponse
 from django.views.generic import View
 from django.views.generic import View
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.db.models import Q, F
 from django.db.models import Q, F
 from django.db import Error
 from django.db import Error
 from toastergui.templatetags.projecttags import filtered_filesizeformat
 from toastergui.templatetags.projecttags import filtered_filesizeformat

+ 1 - 1
lib/toaster/toastergui/templatetags/project_url_tag.py

@@ -3,7 +3,7 @@
 #
 #
 
 
 from django import template
 from django import template
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 
 
 register = template.Library()
 register = template.Library()
 
 

+ 2 - 2
lib/toaster/toastergui/templatetags/projecttags.py

@@ -44,7 +44,7 @@ def json(value, default = None):
     # it manually here
     # it manually here
     return mark_safe(JsonLib.dumps(value, indent=2, default = default, ensure_ascii=False).replace('</', '<\\/'))
     return mark_safe(JsonLib.dumps(value, indent=2, default = default, ensure_ascii=False).replace('</', '<\\/'))
 
 
-@register.assignment_tag
+@register.simple_tag
 def query(qs, **kwargs):
 def query(qs, **kwargs):
     """ template tag which allows queryset filtering. Usage:
     """ template tag which allows queryset filtering. Usage:
           {% query books author=author as mybooks %}
           {% query books author=author as mybooks %}
@@ -83,7 +83,7 @@ def divide(value, arg):
 def multiply(value, arg):
 def multiply(value, arg):
     return int(value) * int(arg)
     return int(value) * int(arg)
 
 
-@register.assignment_tag
+@register.simple_tag
 def datecompute(delta, start = timezone.now()):
 def datecompute(delta, start = timezone.now()):
     return start + timedelta(delta)
     return start + timedelta(delta)
 
 

+ 1 - 1
lib/toaster/toastergui/typeaheads.py

@@ -10,7 +10,7 @@ import subprocess
 
 
 from toastergui.widgets import ToasterTypeAhead
 from toastergui.widgets import ToasterTypeAhead
 from orm.models import Project
 from orm.models import Project
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.core.cache import cache
 from django.core.cache import cache
 
 
 
 

+ 8 - 8
lib/toaster/toastergui/views.py

@@ -19,7 +19,7 @@ from orm.models import Target_Installed_Package, Target_File
 from orm.models import TargetKernelFile, TargetSDKFile, Target_Image_File
 from orm.models import TargetKernelFile, TargetSDKFile, Target_Image_File
 from orm.models import BitbakeVersion, CustomImageRecipe
 from orm.models import BitbakeVersion, CustomImageRecipe
 
 
-from django.core.urlresolvers import reverse, resolve
+from django.urls import reverse, resolve
 from django.core.exceptions import ObjectDoesNotExist
 from django.core.exceptions import ObjectDoesNotExist
 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
 from django.http import HttpResponseNotFound, JsonResponse
 from django.http import HttpResponseNotFound, JsonResponse
@@ -352,7 +352,7 @@ def _get_parameters_values(request, default_count, default_order):
 # set cookies for parameters. this is usefull in case parameters are set
 # set cookies for parameters. this is usefull in case parameters are set
 # manually from the GET values of the link
 # manually from the GET values of the link
 def _set_parameters_values(pagesize, orderby, request):
 def _set_parameters_values(pagesize, orderby, request):
-    from django.core.urlresolvers import resolve
+    from django.urls import resolve
     current_url = resolve(request.path_info).url_name
     current_url = resolve(request.path_info).url_name
     request.session['%s_count' % current_url] = pagesize
     request.session['%s_count' % current_url] = pagesize
     request.session['%s_orderby' % current_url] =orderby
     request.session['%s_orderby' % current_url] =orderby
@@ -1364,8 +1364,8 @@ if True:
 
 
         template = "newproject.html"
         template = "newproject.html"
         context = {
         context = {
-            'email': request.user.email if request.user.is_authenticated() else '',
-            'username': request.user.username if request.user.is_authenticated() else '',
+            'email': request.user.email if request.user.is_authenticated else '',
+            'username': request.user.username if request.user.is_authenticated else '',
             'releases': Release.objects.order_by("description"),
             'releases': Release.objects.order_by("description"),
         }
         }
 
 
@@ -1391,7 +1391,7 @@ if True:
                     # set alert for missing fields
                     # set alert for missing fields
                     raise BadParameterException("Fields missing: %s" % ", ".join(missing))
                     raise BadParameterException("Fields missing: %s" % ", ".join(missing))
 
 
-                if not request.user.is_authenticated():
+                if not request.user.is_authenticated:
                     user = authenticate(username = request.POST.get('username', '_anonuser'), password = 'nopass')
                     user = authenticate(username = request.POST.get('username', '_anonuser'), password = 'nopass')
                     if user is None:
                     if user is None:
                         user = User.objects.create_user(username = request.POST.get('username', '_anonuser'), email = request.POST.get('email', ''), password = "nopass")
                         user = User.objects.create_user(username = request.POST.get('username', '_anonuser'), email = request.POST.get('email', ''), password = "nopass")
@@ -1438,8 +1438,8 @@ if True:
         project = Project.objects.get(pk=pid)
         project = Project.objects.get(pk=pid)
         template = "newproject_specific.html"
         template = "newproject_specific.html"
         context = {
         context = {
-            'email': request.user.email if request.user.is_authenticated() else '',
-            'username': request.user.username if request.user.is_authenticated() else '',
+            'email': request.user.email if request.user.is_authenticated else '',
+            'username': request.user.username if request.user.is_authenticated else '',
             'releases': Release.objects.order_by("description"),
             'releases': Release.objects.order_by("description"),
             'projectname': project.name,
             'projectname': project.name,
             'project_pk': project.pk,
             'project_pk': project.pk,
@@ -1469,7 +1469,7 @@ if True:
                     # set alert for missing fields
                     # set alert for missing fields
                     raise BadParameterException("Fields missing: %s" % ", ".join(missing))
                     raise BadParameterException("Fields missing: %s" % ", ".join(missing))
 
 
-                if not request.user.is_authenticated():
+                if not request.user.is_authenticated:
                     user = authenticate(username = request.POST.get('username', '_anonuser'), password = 'nopass')
                     user = authenticate(username = request.POST.get('username', '_anonuser'), password = 'nopass')
                     if user is None:
                     if user is None:
                         user = User.objects.create_user(username = request.POST.get('username', '_anonuser'), email = request.POST.get('email', ''), password = "nopass")
                         user = User.objects.create_user(username = request.POST.get('username', '_anonuser'), email = request.POST.get('email', ''), password = "nopass")

+ 1 - 1
lib/toaster/toastergui/widgets.py

@@ -22,7 +22,7 @@ from django.utils import timezone
 from toastergui.templatetags.projecttags import sectohms, get_tasks
 from toastergui.templatetags.projecttags import sectohms, get_tasks
 from toastergui.templatetags.projecttags import json as template_json
 from toastergui.templatetags.projecttags import json as template_json
 from django.http import JsonResponse
 from django.http import JsonResponse
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 
 
 import types
 import types
 import json
 import json

+ 1 - 1
lib/toaster/toastermain/management/commands/buildimport.py

@@ -466,7 +466,6 @@ class Command(BaseCommand):
                     release_name = 'None' if not pl.layercommit.release else pl.layercommit.release.name
                     release_name = 'None' if not pl.layercommit.release else pl.layercommit.release.name
                     print(" AFTER :ProjectLayer=%s,%s,%s,%s" % (pl.layercommit.layer.name,release_name,pl.layercommit.branch,pl.layercommit.commit))
                     print(" AFTER :ProjectLayer=%s,%s,%s,%s" % (pl.layercommit.layer.name,release_name,pl.layercommit.branch,pl.layercommit.commit))
 
 
-
     def handle(self, *args, **options):
     def handle(self, *args, **options):
         project_name = options['name']
         project_name = options['name']
         project_path = options['path']
         project_path = options['path']
@@ -551,6 +550,7 @@ class Command(BaseCommand):
             # preset the mode and default image recipe
             # preset the mode and default image recipe
             project.set_variable(Project.PROJECT_SPECIFIC_ISNEW,Project.PROJECT_SPECIFIC_NEW)
             project.set_variable(Project.PROJECT_SPECIFIC_ISNEW,Project.PROJECT_SPECIFIC_NEW)
             project.set_variable(Project.PROJECT_SPECIFIC_DEFAULTIMAGE,"core-image-minimal")
             project.set_variable(Project.PROJECT_SPECIFIC_DEFAULTIMAGE,"core-image-minimal")
+
             # Assert any extended/custom actions or variables for new non-Toaster projects
             # Assert any extended/custom actions or variables for new non-Toaster projects
             if not len(self.toaster_vars):
             if not len(self.toaster_vars):
                 pass
                 pass

+ 8 - 9
lib/toaster/toastermain/settings.py

@@ -189,15 +189,16 @@ TEMPLATES = [
     },
     },
 ]
 ]
 
 
-MIDDLEWARE_CLASSES = (
+MIDDLEWARE = [
     'django.middleware.common.CommonMiddleware',
     'django.middleware.common.CommonMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
     'django.middleware.csrf.CsrfViewMiddleware',
     'django.middleware.csrf.CsrfViewMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
-    # Uncomment the next line for simple clickjacking protection:
-    # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
-)
+    'django.contrib.auth.middleware.AuthenticationMiddleware',
+    'django.contrib.messages.middleware.MessageMiddleware',
+    'django.contrib.sessions.middleware.SessionMiddleware',
+]
 
 
 CACHES = {
 CACHES = {
     #        'default': {
     #        'default': {
@@ -248,7 +249,7 @@ FRESH_ENABLED = False
 if os.environ.get('TOASTER_DEVEL', None) is not None:
 if os.environ.get('TOASTER_DEVEL', None) is not None:
     try:
     try:
         import fresh
         import fresh
-        MIDDLEWARE_CLASSES = ("fresh.middleware.FreshMiddleware",) + MIDDLEWARE_CLASSES
+        MIDDLEWARE = ["fresh.middleware.FreshMiddleware",] + MIDDLEWARE
         INSTALLED_APPS = INSTALLED_APPS + ('fresh',)
         INSTALLED_APPS = INSTALLED_APPS + ('fresh',)
         FRESH_ENABLED = True
         FRESH_ENABLED = True
     except:
     except:
@@ -258,8 +259,8 @@ DEBUG_PANEL_ENABLED = False
 if os.environ.get('TOASTER_DEVEL', None) is not None:
 if os.environ.get('TOASTER_DEVEL', None) is not None:
     try:
     try:
         import debug_toolbar, debug_panel
         import debug_toolbar, debug_panel
-        MIDDLEWARE_CLASSES = ('debug_panel.middleware.DebugPanelMiddleware',) + MIDDLEWARE_CLASSES
-        #MIDDLEWARE_CLASSES = MIDDLEWARE_CLASSES + ('debug_toolbar.middleware.DebugToolbarMiddleware',)
+        MIDDLEWARE = ['debug_panel.middleware.DebugPanelMiddleware',] + MIDDLEWARE
+        #MIDDLEWARE = MIDDLEWARE + ['debug_toolbar.middleware.DebugToolbarMiddleware',]
         INSTALLED_APPS = INSTALLED_APPS + ('debug_toolbar','debug_panel',)
         INSTALLED_APPS = INSTALLED_APPS + ('debug_toolbar','debug_panel',)
         DEBUG_PANEL_ENABLED = True
         DEBUG_PANEL_ENABLED = True
 
 
@@ -352,5 +353,3 @@ def activate_synchronous_off(sender, connection, **kwargs):
 connection_created.connect(activate_synchronous_off)
 connection_created.connect(activate_synchronous_off)
 #
 #
 
 
-
-

+ 2 - 2
lib/toaster/toastermain/urls.py

@@ -51,7 +51,7 @@ if toastermain.settings.DEBUG_PANEL_ENABLED:
 
 
 urlpatterns = [
 urlpatterns = [
     # Uncomment the next line to enable the admin:
     # Uncomment the next line to enable the admin:
-    url(r'^admin/', include(admin.site.urls)),
+    url(r'^admin/', admin.site.urls),
 ] + urlpatterns
 ] + urlpatterns
 
 
 # Automatically discover urls.py in various apps, beside our own
 # Automatically discover urls.py in various apps, beside our own
@@ -69,7 +69,7 @@ for t in os.walk(os.path.dirname(currentdir)):
         # make sure we don't have this module name in
         # make sure we don't have this module name in
         conflict = False
         conflict = False
         for p in urlpatterns:
         for p in urlpatterns:
-            if p.regex.pattern == '^' + modulename + '/':
+            if p.pattern.regex.pattern == '^' + modulename + '/':
                 conflict = True
                 conflict = True
         if not conflict:
         if not conflict:
             urlpatterns.insert(0, url(r'^' + modulename + '/', include ( modulename + '.urls')))
             urlpatterns.insert(0, url(r'^' + modulename + '/', include ( modulename + '.urls')))