Control: tag -1 + patch On Mon, 08 Sep 2014, Raphael Hertzog wrote: > We need thus to create an equivalent Django 1.7 migrations, but I failed > to do so since "lava_server/manage.py makemigrations" fails trying to > create migration that increases the username from 30 to 255 in length.
I did that after having disabled "longerusername" which is no longer maintained upstream. So here's a full set of patches that gets the test suite to pass. The rest is up to you now. Cheers, -- Raphaël Hertzog ◈ Debian Developer Discover the Debian Administrator's Handbook: → http://debian-handbook.info/get/
>From 087921c8066d3f4d19084020fbd50c4b427070bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Hertzog?= <hert...@debian.org> Date: Mon, 8 Sep 2014 14:25:25 +0000 Subject: [PATCH 1/9] Don't add django_tables2 to INSTALLED_APPS if it's already there This is required to work with Django 1.7. --- lava_scheduler_app/extension.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lava_scheduler_app/extension.py b/lava_scheduler_app/extension.py index 49fbeef..df00338 100644 --- a/lava_scheduler_app/extension.py +++ b/lava_scheduler_app/extension.py @@ -68,7 +68,8 @@ class SchedulerExtension(LavaServerExtension): def contribute_to_settings(self, settings_module): super(SchedulerExtension, self).contribute_to_settings(settings_module) - settings_module['INSTALLED_APPS'].append('django_tables2') + if 'django_tables2' not in settings_module['INSTALLED_APPS']: + settings_module['INSTALLED_APPS'].append('django_tables2') from_module = settings_module.get('SCHEDULER_DAEMON_OPTIONS', {}) settings_module['SCHEDULER_DAEMON_OPTIONS'] = { 'LOG_FILE_PATH': None, -- 2.1.0
>From 0fdb885fb4e56f6d657ee618d04d44af61cf4c6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Hertzog?= <hert...@debian.org> Date: Mon, 8 Sep 2014 16:35:13 +0200 Subject: [PATCH 2/9] Move admin related definitions to admin.py Loading django.contrib.admin from a models.py lead to failure in Django 1.7 because it expects models to be already ready which they aren't at the time models.py are loaded by django.setup(). --- lava_scheduler_app/admin.py | 19 ++++++++++++++++++- lava_scheduler_app/models.py | 18 ------------------ 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/lava_scheduler_app/admin.py b/lava_scheduler_app/admin.py index d3b75b8..681c9d1 100644 --- a/lava_scheduler_app/admin.py +++ b/lava_scheduler_app/admin.py @@ -1,9 +1,26 @@ from django.contrib import admin +from django.contrib.auth.admin import UserAdmin from lava_scheduler_app.models import ( Device, DeviceStateTransition, DeviceType, TestJob, Tag, JobFailureTag, - UserAdmin, User, Worker + User, Worker, DefaultDeviceOwner ) +class DefaultOwnerInline(admin.StackedInline): + """ + Exposes the default owner override class + in the Django admin interface + """ + model = DefaultDeviceOwner + can_delete = False + + +class UserAdmin(UserAdmin): + """ + Defines the override class for DefaultOwnerInline + """ + inlines = (DefaultOwnerInline, ) + + # Setup the override in the django admin interface at startup. admin.site.unregister(User) admin.site.register(User, UserAdmin) diff --git a/lava_scheduler_app/models.py b/lava_scheduler_app/models.py index abeae7a..186e855 100644 --- a/lava_scheduler_app/models.py +++ b/lava_scheduler_app/models.py @@ -8,8 +8,6 @@ import smtplib import socket from django.conf import settings -from django.contrib import admin -from django.contrib.auth.admin import UserAdmin from django.contrib.auth.models import User, Group from django.contrib.sites.models import Site from django.utils.safestring import mark_safe @@ -118,22 +116,6 @@ class DefaultDeviceOwner(models.Model): ) -class DefaultOwnerInline(admin.StackedInline): - """ - Exposes the default owner override class - in the Django admin interface - """ - model = DefaultDeviceOwner - can_delete = False - - -class UserAdmin(UserAdmin): - """ - Defines the override class for DefaultOwnerInline - """ - inlines = (DefaultOwnerInline, ) - - class Worker(models.Model): """ A worker node to which devices are attached. -- 2.1.0
>From ba401fa901ceb244ad982893cc51fc0fc3dd098b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Hertzog?= <hert...@debian.org> Date: Mon, 8 Sep 2014 14:44:00 +0000 Subject: [PATCH 3/9] Do not load "south" if we use Django 1.7 or newer Django 1.7 is incompatible with South. --- lava_server/settings/common.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lava_server/settings/common.py b/lava_server/settings/common.py index 041aaa2..d5dcce5 100644 --- a/lava_server/settings/common.py +++ b/lava_server/settings/common.py @@ -24,7 +24,7 @@ # should happen strictly to etc/settings.conf, etc. files. # All comments below are strictly for development usage and # reference. - +import django # Administrator contact, used for sending # emergency email when something breaks @@ -127,10 +127,13 @@ INSTALLED_APPS = [ 'longerusername', 'linaro_django_xmlrpc', 'lava_markitup', # Support app for MarkItUp in LAVA - 'south', 'google_analytics', ] +if django.VERSION < (1, 7): + # Django 1.7 has built-in migration suppport + INSTALLED_APPS += ['south'] + try: import devserver INSTALLED_APPS += ['devserver'] -- 2.1.0
>From 95404638799965bb2c4e06cf9d6cb1d2a16ec695 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Hertzog?= <hert...@debian.org> Date: Mon, 8 Sep 2014 16:19:09 +0000 Subject: [PATCH 4/9] dashboard_app/models: drop an unused and non-working get_absolute_url() It's actually harmful with Django 1.7 as it leads to weird errors like this one: ERROR: test_test_result_permalink (dashboard_app.tests.views.test_redirects.RedirectTests) test_test_result_permalink (dashboard_app.tests.views.test_redirects.RedirectTests) ---------------------------------------------------------------------- _StringException: Traceback (most recent call last): File "/home/rhertzog/tmp/django17/lava-server/lava_server/../dashboard_app/tests/views/test_redirects.py", line 109, in test_test_result_permalink self.assertRedirects(response, test_result.get_absolute_url()) File "/usr/lib/python2.7/dist-packages/django/test/testcases.py", line 295, in assertRedirects secure=(scheme == 'https')) File "/usr/lib/python2.7/dist-packages/django/test/client.py", line 467, in get **extra) File "/usr/lib/python2.7/dist-packages/django/test/client.py", line 285, in get return self.generic('GET', path, secure=secure, **r) File "/usr/lib/python2.7/dist-packages/django/test/client.py", line 355, in generic return self.request(**r) File "/usr/lib/python2.7/dist-packages/django/test/client.py", line 419, in request response = self.handler(environ) File "/usr/lib/python2.7/dist-packages/django/test/client.py", line 110, in __call__ response = self.get_response(request) File "/usr/lib/python2.7/dist-packages/django/core/handlers/base.py", line 199, in get_response response = self.handle_uncaught_exception(request, resolver, sys.exc_info()) File "/usr/lib/python2.7/dist-packages/django/core/handlers/base.py", line 111, in get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/home/rhertzog/tmp/django17/lava-server/lava_server/../dashboard_app/views/__init__.py", line 742, in test_result_detail }, RequestContext(request)) File "/usr/lib/python2.7/dist-packages/django/shortcuts.py", line 23, in render_to_response return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs) File "/usr/lib/python2.7/dist-packages/django/template/loader.py", line 178, in render_to_string return t.render(context_instance) File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 148, in render return self._render(context) File "/usr/lib/python2.7/dist-packages/django/test/utils.py", line 88, in instrumented_test_render return self.nodelist.render(context) File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 844, in render bit = self.render_node(node, context) File "/usr/lib/python2.7/dist-packages/django/template/debug.py", line 80, in render_node return node.render(context) File "/usr/lib/python2.7/dist-packages/django/template/loader_tags.py", line 126, in render return compiled_parent._render(context) File "/usr/lib/python2.7/dist-packages/django/test/utils.py", line 88, in instrumented_test_render return self.nodelist.render(context) File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 844, in render bit = self.render_node(node, context) File "/usr/lib/python2.7/dist-packages/django/template/debug.py", line 80, in render_node return node.render(context) File "/usr/lib/python2.7/dist-packages/django/template/loader_tags.py", line 126, in render return compiled_parent._render(context) File "/usr/lib/python2.7/dist-packages/django/test/utils.py", line 88, in instrumented_test_render return self.nodelist.render(context) File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 844, in render bit = self.render_node(node, context) File "/usr/lib/python2.7/dist-packages/django/template/debug.py", line 80, in render_node return node.render(context) File "/usr/lib/python2.7/dist-packages/django/template/loader_tags.py", line 65, in render result = block.nodelist.render(context) File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 844, in render bit = self.render_node(node, context) File "/usr/lib/python2.7/dist-packages/django/template/debug.py", line 80, in render_node return node.render(context) File "/usr/lib/python2.7/dist-packages/django/template/loader_tags.py", line 65, in render result = block.nodelist.render(context) File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 844, in render bit = self.render_node(node, context) File "/usr/lib/python2.7/dist-packages/django/template/debug.py", line 80, in render_node return node.render(context) File "/usr/lib/python2.7/dist-packages/django/template/debug.py", line 90, in render output = self.filter_expression.resolve(context) File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 596, in resolve obj = self.var.resolve(context) File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 734, in resolve value = self._resolve_lookup(context) File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 788, in _resolve_lookup current = current() File "/usr/lib/python2.7/dist-packages/django/utils/functional.py", line 17, in _curried return _curried_func(*(args + moreargs), **dict(kwargs, **morekwargs)) File "/usr/lib/python2.7/dist-packages/django/db/models/base.py", line 1451, in get_absolute_url return settings.ABSOLUTE_URL_OVERRIDES.get('%s.%s' % (opts.app_label, opts.model_name), func)(self, *args, **kwargs) File "/usr/lib/python2.7/dist-packages/django/db/models/__init__.py", line 40, in inner return reverse(bits[0], None, *bits[1:3]) File "/usr/lib/python2.7/dist-packages/django/core/urlresolvers.py", line 546, in reverse return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs)) TypeError: _reverse_with_prefix() argument after ** must be a mapping, not unicode --- dashboard_app/models.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/dashboard_app/models.py b/dashboard_app/models.py index 68e3e2d..146f733 100644 --- a/dashboard_app/models.py +++ b/dashboard_app/models.py @@ -714,10 +714,6 @@ class Test(models.Model): def __unicode__(self): return self.name or self.test_id - @models.permalink - def get_absolute_url(self): - return self.test_id - def count_results_without_test_case(self): return TestResult.objects.filter( test_run__test=self, -- 2.1.0
0005-Rename-migrations-directories-in-south_migrations.patch.xz
Description: Binary data
>From b421e5731f74eac984767b4bb067654409f6b906 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Hertzog?= <hert...@debian.org> Date: Tue, 9 Sep 2014 07:19:36 +0000 Subject: [PATCH 6/9] Disable 'longerusername' as it's not compatible with Django 1.7 It should really be replaced by a custom User if this feature is important. --- lava_server/settings/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lava_server/settings/common.py b/lava_server/settings/common.py index d5dcce5..a70246d 100644 --- a/lava_server/settings/common.py +++ b/lava_server/settings/common.py @@ -124,7 +124,7 @@ INSTALLED_APPS = [ # Uncomment the next line to enable admin documentation: # 'django.contrib.admindocs', # Admin docs disabled due to: https://code.djangoproject.com/ticket/6681 - 'longerusername', + #'longerusername', 'linaro_django_xmlrpc', 'lava_markitup', # Support app for MarkItUp in LAVA 'google_analytics', -- 2.1.0
>From a25d49c6c96217011fead69b675e281b6e5b8fc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Hertzog?= <hert...@debian.org> Date: Tue, 9 Sep 2014 07:20:56 +0000 Subject: [PATCH 7/9] Add initial Django migrations --- dashboard_app/migrations/0001_initial.py | 645 ++++++++++++++++++++++++++ dashboard_app/migrations/__init__.py | 0 google_analytics/migrations/0001_initial.py | 25 + google_analytics/migrations/__init__.py | 0 lava_scheduler_app/migrations/0001_initial.py | 246 ++++++++++ lava_scheduler_app/migrations/__init__.py | 0 6 files changed, 916 insertions(+) create mode 100644 dashboard_app/migrations/0001_initial.py create mode 100644 dashboard_app/migrations/__init__.py create mode 100644 google_analytics/migrations/0001_initial.py create mode 100644 google_analytics/migrations/__init__.py create mode 100644 lava_scheduler_app/migrations/0001_initial.py create mode 100644 lava_scheduler_app/migrations/__init__.py diff --git a/dashboard_app/migrations/0001_initial.py b/dashboard_app/migrations/0001_initial.py new file mode 100644 index 0000000..1445f36 --- /dev/null +++ b/dashboard_app/migrations/0001_initial.py @@ -0,0 +1,645 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import datetime +import dashboard_app.models +import django.db.models.deletion +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + ('auth', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('contenttypes', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Attachment', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('content', models.FileField(help_text='Attachment content', upload_to=b'attachments', null=True, verbose_name='Content')), + ('content_filename', models.CharField(help_text='Name of the original attachment', max_length=256, verbose_name='Content file name')), + ('mime_type', models.CharField(max_length=64, verbose_name='MIME type')), + ('public_url', models.URLField(max_length=512, verbose_name='Public URL', blank=True)), + ('object_id', models.PositiveIntegerField()), + ('content_type', models.ForeignKey(to='contenttypes.ContentType')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='BugLink', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('bug_link', models.CharField(help_text='Maximum length: 1024 characters', max_length=1024, verbose_name='Bug Link', blank=True)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Bundle', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('uploaded_on', models.DateTimeField(default=datetime.datetime.utcnow, verbose_name='Uploaded on', editable=False)), + ('is_deserialized', models.BooleanField(help_text='Set when document has been analyzed and loaded into the database', verbose_name='Is deserialized', editable=False)), + ('_raw_content', models.FileField(help_text='Document in Dashboard Bundle Format 1.0', upload_to=b'bundles', null=True, verbose_name='Content', db_column=b'content')), + ('_gz_content', models.FileField(db_column=b'gz_content', storage=dashboard_app.models.GzipFileSystemStorage(), upload_to=b'compressed-bundles', help_text='Compressed document in Dashboard Bundle Format 1.0', null=True, verbose_name='Compressed content')), + ('content_sha1', models.CharField(max_length=40, unique=True, null=True, editable=False)), + ('content_filename', models.CharField(help_text='Name of the originally uploaded bundle', max_length=256, verbose_name='Content file name')), + ], + options={ + 'ordering': ['-uploaded_on'], + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='BundleDeserializationError', + fields=[ + ('bundle', models.OneToOneField(related_name=b'deserialization_error', primary_key=True, serialize=False, to='dashboard_app.Bundle')), + ('error_message', models.CharField(max_length=1024)), + ('traceback', models.TextField(max_length=32768)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='BundleStream', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('is_public', models.BooleanField(default=False)), + ('slug', models.CharField(help_text='Name that you will use when uploading bundles. Maximum length: 64 characters', max_length=64, verbose_name='Slug', blank=True)), + ('name', models.CharField(help_text='Maximum length: 64 characters', max_length=64, verbose_name='Name', blank=True)), + ('pathname', models.CharField(unique=True, max_length=128, editable=False)), + ('is_anonymous', models.BooleanField()), + ('group', models.ForeignKey(blank=True, to='auth.Group', null=True)), + ('user', models.ForeignKey(blank=True, to=settings.AUTH_USER_MODEL, null=True)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='HardwareDevice', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('device_type', models.CharField(help_text='One of pre-defined device types', max_length=32, verbose_name='Device Type', choices=[('device.cpu', 'CPU'), ('device.mem', 'Memory'), ('device.usb', 'USB device'), ('device.pci', 'PCI device'), ('device.board', 'Board/Motherboard')])), + ('description', models.CharField(help_text='Human readable device summary. Maximum length: 256 characters', max_length=256, verbose_name='Description')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Image', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.SlugField(unique=True, max_length=1024)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ImageChartFilter', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('representation', models.CharField(default=b'lines', max_length=20, verbose_name=b'Representation', choices=[(b'lines', b'Lines'), (b'bars', b'Bars')])), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ImageChartTest', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField(max_length=200)), + ('image_chart_filter', models.ForeignKey(to='dashboard_app.ImageChartFilter')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ImageChartTestAttribute', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.TextField()), + ('image_chart_test', models.ForeignKey(to='dashboard_app.ImageChartTest')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ImageChartTestCase', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField(max_length=200)), + ('image_chart_filter', models.ForeignKey(to='dashboard_app.ImageChartFilter')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ImageChartTestCaseAttribute', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.TextField()), + ('image_chart_test_case', models.ForeignKey(to='dashboard_app.ImageChartTestCase')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ImageChartTestCaseUser', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('is_visible', models.BooleanField(default=True, verbose_name=b'Visible')), + ('image_chart_test_case', models.ForeignKey(to='dashboard_app.ImageChartTestCase')), + ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ImageChartTestUser', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('is_visible', models.BooleanField(default=True, verbose_name=b'Visible')), + ('image_chart_test', models.ForeignKey(to='dashboard_app.ImageChartTest')), + ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ImageChartUser', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('start_date', models.CharField(max_length=20)), + ('is_legend_visible', models.BooleanField(default=True, verbose_name=b'Toggle legend')), + ('has_subscription', models.BooleanField(default=False, verbose_name=b'Subscribed to target goal')), + ('toggle_percentage', models.BooleanField(default=False, verbose_name=b'Toggle percentage')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ImageReport', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.SlugField(unique=True, max_length=1024)), + ('description', models.TextField(null=True, blank=True)), + ('is_published', models.BooleanField(default=False, verbose_name=b'Published')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ImageReportChart', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField(max_length=100)), + ('description', models.TextField(null=True, blank=True)), + ('chart_type', models.CharField(default=b'pass/fail', max_length=20, verbose_name=b'Chart type', choices=[(b'pass/fail', b'Pass/Fail'), (b'measurement', b'Measurement')])), + ('target_goal', models.DecimalField(null=True, verbose_name=b'Target goal', max_digits=10, decimal_places=5, blank=True)), + ('is_interactive', models.BooleanField(default=False, verbose_name=b'Interactive')), + ('is_data_table_visible', models.BooleanField(default=False, verbose_name=b'Data table visible')), + ('image_report', models.ForeignKey(default=None, to='dashboard_app.ImageReport')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ImageReportGroup', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.SlugField(unique=True, max_length=1024)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ImageSet', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField(unique=True, max_length=1024)), + ('images', models.ManyToManyField(to='dashboard_app.Image')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='NamedAttribute', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.TextField()), + ('value', models.TextField()), + ('object_id', models.PositiveIntegerField()), + ('content_type', models.ForeignKey(to='contenttypes.ContentType')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='PMQABundleStream', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('bundle_stream', models.ForeignKey(related_name=b'+', to='dashboard_app.BundleStream')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='SoftwarePackage', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField(help_text='Maximum length: 128 characters', max_length=128, verbose_name='Package name')), + ('version', models.CharField(help_text='Maximum length: 128 characters', max_length=128, verbose_name='Package version')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='SoftwarePackageScratch', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField(max_length=128)), + ('version', models.CharField(max_length=128)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='SoftwareSource', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('project_name', models.CharField(help_text='Maximum length: 32 characters', max_length=32, verbose_name='Project Name')), + ('branch_url', models.CharField(help_text='Maximum length: 256 characters', max_length=256, verbose_name='Branch URL')), + ('branch_vcs', models.CharField(help_text='Maximum length: 10 characters', max_length=10, verbose_name='Branch VCS')), + ('branch_revision', models.CharField(help_text='Maximum length: 128 characters', max_length=128, verbose_name='Branch Revision')), + ('commit_timestamp', models.DateTimeField(help_text='Date and time of the commit (optional)', null=True, verbose_name='Commit Timestamp', blank=True)), + ('default_params', models.CharField(help_text=b'Default parameters for lava-test-shell.', max_length=1024, null=True, verbose_name='Default parameters', blank=True)), + ('test_params', models.CharField(help_text=b'Runtime test parameters for lava-test-shell.', max_length=1024, null=True, verbose_name='Test parameters', blank=True)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Tag', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.SlugField(unique=True, max_length=256, verbose_name='Tag')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Test', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('test_id', models.CharField(unique=True, max_length=1024, verbose_name='Test ID')), + ('name', models.CharField(max_length=1024, verbose_name='Name', blank=True)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='TestCase', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('test_case_id', models.TextField(verbose_name='Test case ID')), + ('name', models.TextField(help_text='Maximum length: 100 characters', verbose_name='Name', blank=True)), + ('units', models.TextField(help_text='Units in which measurement value should be\n interpreted in, for example <q>ms</q>, <q>MB/s</q> etc.\n There is no semantical meaning inferred from the value of\n this field, free form text is allowed. <br/>Maximum length: 100 characters', verbose_name='Units', blank=True)), + ('test', models.ForeignKey(related_name=b'test_cases', to='dashboard_app.Test')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='TestDefinition', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField(help_text='Maximum length: 512 characters', unique=True, max_length=512, verbose_name='Name')), + ('version', models.CharField(help_text='Maximum length: 256 characters', max_length=256, verbose_name='Version')), + ('description', models.TextField(verbose_name='Description')), + ('format', models.CharField(help_text='Maximum length: 128 characters', max_length=128, verbose_name='Format')), + ('location', models.CharField(default=b'LOCAL', max_length=64, verbose_name='Location', choices=[(b'LOCAL', b'Local'), (b'URL', b'URL'), (b'GIT', b'GIT Repo'), (b'BZR', b'BZR Repo')])), + ('url', models.CharField(help_text='Maximum length: 1024 characters', max_length=1024, verbose_name='URL')), + ('environment', models.CharField(help_text='Maximum length: 256 characters', max_length=256, verbose_name='Environment')), + ('target_os', models.CharField(help_text='Maximum length: 512 characters', max_length=512, verbose_name='Operating Systems')), + ('target_dev_types', models.CharField(help_text='Maximum length: 512 characters', max_length=512, verbose_name='Device types')), + ('content', models.FileField(help_text='Test definition file', upload_to=b'testdef', null=True, verbose_name='Upload Test Definition', blank=True)), + ('mime_type', models.CharField(default=b'text/plain', help_text='Maximum length: 64 characters', max_length=64, verbose_name='MIME type')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='TestResult', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('result', models.PositiveSmallIntegerField(help_text='Result classification to pass/fail group', verbose_name='Result', choices=[(0, 'Test passed'), (1, 'Test failed'), (2, 'Test skipped'), (3, 'Unknown outcome')])), + ('measurement', models.DecimalField(decimal_places=10, max_digits=20, blank=True, help_text='Arbitrary value that was measured as a part of this test.', null=True, verbose_name='Measurement')), + ('filename', models.CharField(max_length=1024, null=True, blank=True)), + ('lineno', models.PositiveIntegerField(null=True, blank=True)), + ('message', models.TextField(max_length=1024, null=True, blank=True)), + ('microseconds', models.BigIntegerField(null=True, blank=True)), + ('timestamp', models.DateTimeField(null=True, blank=True)), + ('relative_index', models.PositiveIntegerField(help_text='The relative order of test results in one test run')), + ('comments', models.TextField(null=True, blank=True)), + ('test_case', models.ForeignKey(related_name=b'test_results', blank=True, to='dashboard_app.TestCase', null=True)), + ], + options={ + 'ordering': ['relative_index'], + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='TestRun', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('analyzer_assigned_uuid', models.CharField(help_text='You can use uuid.uuid1() to generate a value', unique=True, max_length=36, verbose_name='Analyzer assigned UUID')), + ('analyzer_assigned_date', models.DateTimeField(help_text='Time stamp when the log was processed by the log analyzer', verbose_name='Analyzer assigned date')), + ('import_assigned_date', models.DateTimeField(help_text='Time stamp when the bundle was imported', verbose_name='Import assigned date', auto_now_add=True)), + ('time_check_performed', models.BooleanField(help_text="Indicator on wether timestamps in the log file (and any data derived from them) should be trusted.<br/>Many pre-production or development devices do not have a battery-powered RTC and it's not common for development images not to synchronize time with internet time servers.<br/>This field allows us to track tests results that <em>certainly</em> have correct time if we ever end up with lots of tests results from 1972", verbose_name='Time check performed')), + ('microseconds', models.BigIntegerField(null=True, blank=True)), + ('sw_image_desc', models.CharField(max_length=100, verbose_name='Operating System Image', blank=True)), + ], + options={ + 'ordering': ['-import_assigned_date'], + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='TestRunDenormalization', + fields=[ + ('test_run', models.OneToOneField(related_name=b'denormalization', primary_key=True, serialize=False, to='dashboard_app.TestRun')), + ('count_pass', models.PositiveIntegerField()), + ('count_fail', models.PositiveIntegerField()), + ('count_skip', models.PositiveIntegerField()), + ('count_unknown', models.PositiveIntegerField()), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='TestRunFilter', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.SlugField(help_text=b'The <b>name</b> of a filter is used to refer to it in the web UI and in email notifications triggered by this filter.', max_length=1024)), + ('public', models.BooleanField(default=False, help_text=b'Whether other users can see this filter.')), + ('build_number_attribute', models.CharField(help_text=b'For some filters, there is a natural <b>build number</b>. If you specify the name of the attribute that contains the build number here, the results of the filter will be grouped and ordered by this build number.', max_length=1024, null=True, blank=True)), + ('bundle_streams', models.ManyToManyField(help_text=b'A filter only matches tests within the given <b>bundle streams</b>.', to='dashboard_app.BundleStream')), + ('owner', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ('uploaded_by', models.ForeignKey(related_name=b'+', blank=True, to=settings.AUTH_USER_MODEL, help_text=b'Only consider bundles uploaded by this user', null=True)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='TestRunFilterAttribute', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField(max_length=1024)), + ('value', models.CharField(max_length=1024)), + ('filter', models.ForeignKey(related_name=b'attributes', to='dashboard_app.TestRunFilter')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='TestRunFilterSubscription', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('level', models.IntegerField(default=0, help_text=b'You can choose to be <b>notified by email</b>:<ul><li>whenever a test that matches the criteria of this filter is executed</li><li>only when a test that matches the criteria of this filter fails</ul>', choices=[(0, b'Only when failed'), (1, b'Always')])), + ('filter', models.ForeignKey(to='dashboard_app.TestRunFilter')), + ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='TestRunFilterTest', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('index', models.PositiveIntegerField(help_text='The index of this test in the filter')), + ('filter', models.ForeignKey(related_name=b'tests', to='dashboard_app.TestRunFilter')), + ('test', models.ForeignKey(related_name=b'+', to='dashboard_app.Test')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='TestRunFilterTestCase', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('index', models.PositiveIntegerField(help_text='The index of this case in the test')), + ('test', models.ForeignKey(related_name=b'cases', to='dashboard_app.TestRunFilterTest')), + ('test_case', models.ForeignKey(related_name=b'+', to='dashboard_app.TestCase')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.AlterUniqueTogether( + name='testrunfiltersubscription', + unique_together=set([('user', 'filter')]), + ), + migrations.AlterUniqueTogether( + name='testrunfilter', + unique_together=set([('owner', 'name')]), + ), + migrations.AddField( + model_name='testrun', + name='bundle', + field=models.ForeignKey(related_name=b'test_runs', to='dashboard_app.Bundle'), + preserve_default=True, + ), + migrations.AddField( + model_name='testrun', + name='devices', + field=models.ManyToManyField(related_name=b'test_runs', verbose_name='Hardware devices', to='dashboard_app.HardwareDevice', blank=True), + preserve_default=True, + ), + migrations.AddField( + model_name='testrun', + name='packages', + field=models.ManyToManyField(related_name=b'test_runs', verbose_name='Software packages', to='dashboard_app.SoftwarePackage', blank=True), + preserve_default=True, + ), + migrations.AddField( + model_name='testrun', + name='sources', + field=models.ManyToManyField(related_name=b'test_runs', verbose_name='Software sources', to='dashboard_app.SoftwareSource', blank=True), + preserve_default=True, + ), + migrations.AddField( + model_name='testrun', + name='tags', + field=models.ManyToManyField(related_name=b'test_runs', verbose_name='Tags', to='dashboard_app.Tag', blank=True), + preserve_default=True, + ), + migrations.AddField( + model_name='testrun', + name='test', + field=models.ForeignKey(related_name=b'test_runs', to='dashboard_app.Test'), + preserve_default=True, + ), + migrations.AddField( + model_name='testresult', + name='test_run', + field=models.ForeignKey(related_name=b'test_results', to='dashboard_app.TestRun'), + preserve_default=True, + ), + migrations.AlterOrderWithRespectTo( + name='testresult', + order_with_respect_to='test_run', + ), + migrations.AlterUniqueTogether( + name='testcase', + unique_together=set([('test', 'test_case_id')]), + ), + migrations.AlterUniqueTogether( + name='softwarepackage', + unique_together=set([('name', 'version')]), + ), + migrations.AlterUniqueTogether( + name='namedattribute', + unique_together=set([('object_id', 'name')]), + ), + migrations.AlterUniqueTogether( + name='imagereportchart', + unique_together=set([('image_report', 'name')]), + ), + migrations.AddField( + model_name='imagereport', + name='image_report_group', + field=models.ForeignKey(default=None, to='dashboard_app.ImageReportGroup', null=True), + preserve_default=True, + ), + migrations.AddField( + model_name='imagereport', + name='user', + field=models.ForeignKey(default=None, to=settings.AUTH_USER_MODEL), + preserve_default=True, + ), + migrations.AddField( + model_name='imagechartuser', + name='image_chart', + field=models.ForeignKey(to='dashboard_app.ImageReportChart'), + preserve_default=True, + ), + migrations.AddField( + model_name='imagechartuser', + name='user', + field=models.ForeignKey(to=settings.AUTH_USER_MODEL), + preserve_default=True, + ), + migrations.AlterUniqueTogether( + name='imagechartuser', + unique_together=set([('image_chart', 'user')]), + ), + migrations.AlterUniqueTogether( + name='imagecharttestuser', + unique_together=set([('image_chart_test', 'user')]), + ), + migrations.AlterUniqueTogether( + name='imagecharttestcaseuser', + unique_together=set([('image_chart_test_case', 'user')]), + ), + migrations.AddField( + model_name='imagecharttestcase', + name='test_case', + field=models.ForeignKey(to='dashboard_app.TestCase'), + preserve_default=True, + ), + migrations.AlterUniqueTogether( + name='imagecharttestcase', + unique_together=set([('image_chart_filter', 'test_case')]), + ), + migrations.AddField( + model_name='imagecharttest', + name='test', + field=models.ForeignKey(to='dashboard_app.Test'), + preserve_default=True, + ), + migrations.AlterUniqueTogether( + name='imagecharttest', + unique_together=set([('image_chart_filter', 'test')]), + ), + migrations.AddField( + model_name='imagechartfilter', + name='filter', + field=models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, to='dashboard_app.TestRunFilter', null=True), + preserve_default=True, + ), + migrations.AddField( + model_name='imagechartfilter', + name='image_chart', + field=models.ForeignKey(to='dashboard_app.ImageReportChart'), + preserve_default=True, + ), + migrations.AddField( + model_name='image', + name='filter', + field=models.ForeignKey(related_name=b'+', to='dashboard_app.TestRunFilter', null=True), + preserve_default=True, + ), + migrations.AddField( + model_name='bundle', + name='bundle_stream', + field=models.ForeignKey(related_name=b'bundles', verbose_name='Stream', to='dashboard_app.BundleStream'), + preserve_default=True, + ), + migrations.AddField( + model_name='bundle', + name='uploaded_by', + field=models.ForeignKey(related_name=b'uploaded_bundles', blank=True, to=settings.AUTH_USER_MODEL, help_text='The user who submitted this bundle', null=True, verbose_name='Uploaded by'), + preserve_default=True, + ), + migrations.AddField( + model_name='buglink', + name='test_result', + field=models.ManyToManyField(related_name=b'bug_links', to='dashboard_app.TestResult', blank=True), + preserve_default=True, + ), + migrations.AddField( + model_name='buglink', + name='test_runs', + field=models.ManyToManyField(related_name=b'bug_links', to='dashboard_app.TestRun', blank=True), + preserve_default=True, + ), + ] diff --git a/dashboard_app/migrations/__init__.py b/dashboard_app/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/google_analytics/migrations/0001_initial.py b/google_analytics/migrations/0001_initial.py new file mode 100644 index 0000000..5257d0f --- /dev/null +++ b/google_analytics/migrations/0001_initial.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('sites', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Analytic', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('analytics_code', models.CharField(max_length=100, blank=True)), + ('site', models.ForeignKey(to='sites.Site', unique=True)), + ], + options={ + }, + bases=(models.Model,), + ), + ] diff --git a/google_analytics/migrations/__init__.py b/google_analytics/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lava_scheduler_app/migrations/0001_initial.py b/lava_scheduler_app/migrations/0001_initial.py new file mode 100644 index 0000000..e321682 --- /dev/null +++ b/lava_scheduler_app/migrations/0001_initial.py @@ -0,0 +1,246 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import django.db.models.deletion +from django.conf import settings +import lava_scheduler_app.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('auth', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('linaro_django_xmlrpc', '__first__'), + ('dashboard_app', '__first__'), + ] + + operations = [ + migrations.CreateModel( + name='DefaultDeviceOwner', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('default_owner', models.BooleanField(default=False, unique=True, verbose_name=b'Default owner of unrestricted devices')), + ('user', models.OneToOneField(to=settings.AUTH_USER_MODEL)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Device', + fields=[ + ('is_public', models.BooleanField(default=False)), + ('hostname', models.CharField(max_length=200, serialize=False, verbose_name='Hostname', primary_key=True)), + ('device_version', models.CharField(default=None, max_length=200, null=True, verbose_name='Device Version', blank=True)), + ('description', models.TextField(default=None, max_length=200, null=True, verbose_name='Device Description', blank=True)), + ('status', models.IntegerField(default=1, verbose_name='Device status', choices=[(0, b'Offline'), (1, b'Idle'), (2, b'Running'), (3, b'Going offline'), (4, b'Retired'), (5, b'Reserved')])), + ('health_status', models.IntegerField(default=0, verbose_name='Device Health', choices=[(0, b'Unknown'), (1, b'Pass'), (2, b'Fail'), (3, b'Looping')])), + ], + options={ + 'abstract': False, + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='DeviceStateTransition', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('created_on', models.DateTimeField(auto_now_add=True)), + ('old_state', models.IntegerField(choices=[(0, b'Offline'), (1, b'Idle'), (2, b'Running'), (3, b'Going offline'), (4, b'Retired'), (5, b'Reserved')])), + ('new_state', models.IntegerField(choices=[(0, b'Offline'), (1, b'Idle'), (2, b'Running'), (3, b'Going offline'), (4, b'Retired'), (5, b'Reserved')])), + ('message', models.TextField(null=True, blank=True)), + ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, blank=True, to=settings.AUTH_USER_MODEL, null=True)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='DeviceType', + fields=[ + ('name', models.SlugField(serialize=False, primary_key=True)), + ('health_check_job', models.TextField(default=None, null=True, blank=True, validators=[lava_scheduler_app.models.validate_job_json])), + ('display', models.BooleanField(default=True, help_text=b"Should this be displayed in the GUI or not. This can be useful if you are removing all devices of this type but don't want to loose the test results generated by the devices.")), + ('owners_only', models.BooleanField(default=False, help_text=b'Hide this device type for all users except owners of devices of this type.')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='JobFailureTag', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField(unique=True, max_length=256)), + ('description', models.TextField(null=True, blank=True)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Tag', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.SlugField(unique=True)), + ('description', models.TextField(null=True, blank=True)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='TemporaryDevice', + fields=[ + ('device_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='lava_scheduler_app.Device')), + ('vm_group', models.CharField(default=None, max_length=64, null=True, verbose_name='VM Group', blank=True)), + ], + options={ + }, + bases=('lava_scheduler_app.device',), + ), + migrations.CreateModel( + name='TestJob', + fields=[ + ('is_public', models.BooleanField(default=False)), + ('id', models.AutoField(serialize=False, primary_key=True)), + ('sub_id', models.CharField(max_length=200, verbose_name='Sub ID', blank=True)), + ('target_group', models.CharField(default=None, max_length=64, null=True, verbose_name='Target Group', blank=True)), + ('vm_group', models.CharField(default=None, max_length=64, null=True, verbose_name='VM Group', blank=True)), + ('description', models.CharField(default=None, max_length=200, null=True, verbose_name='Description', blank=True)), + ('health_check', models.BooleanField(default=False)), + ('submit_time', models.DateTimeField(auto_now_add=True, verbose_name='Submit time')), + ('start_time', models.DateTimeField(verbose_name='Start time', null=True, editable=False, blank=True)), + ('end_time', models.DateTimeField(verbose_name='End time', null=True, editable=False, blank=True)), + ('status', models.IntegerField(default=0, verbose_name='Status', choices=[(0, b'Submitted'), (1, b'Running'), (2, b'Complete'), (3, b'Incomplete'), (4, b'Canceled'), (5, b'Canceling')])), + ('priority', models.IntegerField(default=50, verbose_name='Priority', choices=[(0, b'Low'), (50, b'Medium'), (100, b'High')])), + ('definition', models.TextField(editable=False)), + ('original_definition', models.TextField(editable=False, blank=True)), + ('multinode_definition', models.TextField(editable=False, blank=True)), + ('vmgroup_definition', models.TextField(editable=False, blank=True)), + ('admin_notifications', models.TextField(editable=False, blank=True)), + ('log_file', models.FileField(default=None, null=True, upload_to=b'lava-logs', blank=True)), + ('failure_comment', models.TextField(null=True, blank=True)), + ('_results_link', models.CharField(default=None, max_length=400, null=True, db_column=b'results_link', blank=True)), + ('_results_bundle', models.OneToOneField(null=True, on_delete=django.db.models.deletion.SET_NULL, db_column=b'results_bundle_id', blank=True, to='dashboard_app.Bundle')), + ('actual_device', models.ForeignKey(related_name=b'+', default=None, blank=True, to='lava_scheduler_app.Device', null=True)), + ('failure_tags', models.ManyToManyField(related_name=b'failure_tags', to='lava_scheduler_app.JobFailureTag', blank=True)), + ('group', models.ForeignKey(blank=True, to='auth.Group', null=True)), + ('requested_device', models.ForeignKey(related_name=b'+', default=None, blank=True, to='lava_scheduler_app.Device', null=True)), + ('requested_device_type', models.ForeignKey(related_name=b'+', default=None, blank=True, to='lava_scheduler_app.DeviceType', null=True)), + ('submit_token', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, blank=True, to='linaro_django_xmlrpc.AuthToken', null=True)), + ('submitter', models.ForeignKey(related_name=b'+', verbose_name='Submitter', to=settings.AUTH_USER_MODEL)), + ('tags', models.ManyToManyField(to='lava_scheduler_app.Tag', blank=True)), + ('user', models.ForeignKey(blank=True, to=settings.AUTH_USER_MODEL, null=True)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='TestJobUser', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('is_favorite', models.BooleanField(default=False, verbose_name=b'Favorite job')), + ('test_job', models.ForeignKey(to='lava_scheduler_app.TestJob')), + ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Worker', + fields=[ + ('hostname', models.CharField(primary_key=True, default=None, serialize=False, editable=False, max_length=200, verbose_name='Hostname')), + ('rpc2_url', models.CharField(default=None, max_length=200, blank=True, help_text=b"Corresponds to the master node's RPC2 url. Does not have any impact when set on a worker node.", null=True, verbose_name='Master RPC2 URL')), + ('display', models.BooleanField(default=True, help_text=b'Should this be displayed in the GUI or not. This will be useful when a worker needs to be removed but still linked device status transitions and devices should be intact.')), + ('ip_address', models.CharField(default=None, editable=False, max_length=20, blank=True, null=True, verbose_name='IP Address')), + ('is_master', models.BooleanField(default=False, verbose_name='Is Master?')), + ('description', models.TextField(default=None, max_length=200, null=True, verbose_name='Worker Description', blank=True)), + ('uptime', models.CharField(default=None, editable=False, max_length=200, blank=True, null=True, verbose_name='Host Uptime')), + ('arch', models.CharField(default=None, editable=False, max_length=200, blank=True, null=True, verbose_name='Architecture')), + ('platform', models.CharField(default=None, editable=False, max_length=200, blank=True, null=True, verbose_name='Platform')), + ('hardware_info', models.TextField(verbose_name='Complete Hardware Information', editable=False, blank=True)), + ('software_info', models.TextField(verbose_name='Complete Software Information', editable=False, blank=True)), + ('last_heartbeat', models.DateTimeField(verbose_name='Last Heartbeat', null=True, editable=False, blank=True)), + ('last_master_scheduler_tick', models.DateTimeField(help_text=b"Corresponds to the master node's last scheduler tick. Does not have any impact when set on a worker node.", verbose_name='Last Master Scheduler Tick', null=True, editable=False, blank=True)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.AlterUniqueTogether( + name='testjobuser', + unique_together=set([('test_job', 'user')]), + ), + migrations.AddField( + model_name='devicestatetransition', + name='device', + field=models.ForeignKey(related_name=b'transitions', to='lava_scheduler_app.Device'), + preserve_default=True, + ), + migrations.AddField( + model_name='devicestatetransition', + name='job', + field=models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, blank=True, to='lava_scheduler_app.TestJob', null=True), + preserve_default=True, + ), + migrations.AddField( + model_name='device', + name='current_job', + field=models.ForeignKey(related_name=b'+', null=True, on_delete=django.db.models.deletion.SET_NULL, blank=True, to='lava_scheduler_app.TestJob', unique=True), + preserve_default=True, + ), + migrations.AddField( + model_name='device', + name='device_type', + field=models.ForeignKey(verbose_name='Device type', to='lava_scheduler_app.DeviceType'), + preserve_default=True, + ), + migrations.AddField( + model_name='device', + name='group', + field=models.ForeignKey(blank=True, to='auth.Group', null=True), + preserve_default=True, + ), + migrations.AddField( + model_name='device', + name='last_health_report_job', + field=models.ForeignKey(related_name=b'+', null=True, on_delete=django.db.models.deletion.SET_NULL, blank=True, to='lava_scheduler_app.TestJob', unique=True), + preserve_default=True, + ), + migrations.AddField( + model_name='device', + name='physical_group', + field=models.ForeignKey(related_name=b'physical-group', default=None, blank=True, to='auth.Group', null=True, verbose_name='Group with physical access'), + preserve_default=True, + ), + migrations.AddField( + model_name='device', + name='physical_owner', + field=models.ForeignKey(related_name=b'physical-owner', default=None, blank=True, to=settings.AUTH_USER_MODEL, null=True, verbose_name='User with physical access'), + preserve_default=True, + ), + migrations.AddField( + model_name='device', + name='tags', + field=models.ManyToManyField(to='lava_scheduler_app.Tag', blank=True), + preserve_default=True, + ), + migrations.AddField( + model_name='device', + name='user', + field=models.ForeignKey(blank=True, to=settings.AUTH_USER_MODEL, null=True), + preserve_default=True, + ), + migrations.AddField( + model_name='device', + name='worker_host', + field=models.ForeignKey(default=None, blank=True, to='lava_scheduler_app.Worker', null=True, verbose_name='Worker Host'), + preserve_default=True, + ), + ] diff --git a/lava_scheduler_app/migrations/__init__.py b/lava_scheduler_app/migrations/__init__.py new file mode 100644 index 0000000..e69de29 -- 2.1.0
>From cfe1cf499638f91e3589b461f8aa51a1022753fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Hertzog?= <hert...@debian.org> Date: Tue, 9 Sep 2014 07:41:50 +0000 Subject: [PATCH 8/9] Add a Django migration creating the lava-health user --- .../migrations/0002_add_lava-health_user.py | 36 ++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 lava_scheduler_app/migrations/0002_add_lava-health_user.py diff --git a/lava_scheduler_app/migrations/0002_add_lava-health_user.py b/lava_scheduler_app/migrations/0002_add_lava-health_user.py new file mode 100644 index 0000000..a2e781e --- /dev/null +++ b/lava_scheduler_app/migrations/0002_add_lava-health_user.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + +import datetime + +def forwards_func(apps, schema_editor): + User = apps.get_model("auth", "User") + db_alias = schema_editor.connection.alias + now = datetime.datetime.now() + new_user = User.objects.using(db_alias).create( + username='lava-health', email='lava@lava.invalid', is_staff=False, + is_active=True, is_superuser=False, last_login=now, + date_joined=now) + new_user.password = '!' + new_user.save() + +def backwards_func(apps, schema_editor): + User = apps.get_model("auth", "User") + db_alias = schema_editor.connection.alias + lava_health = User.objects.using(db_alias).filter(username='lava-health') + lava_health.delete() + +class Migration(migrations.Migration): + + dependencies = [ + ('lava_scheduler_app', '0001_initial'), + ] + + operations = [ + migrations.RunPython( + forwards_func, + backwards_func, + ), + ] -- 2.1.0
>From da74fc7bf9c59f0fa9c1939f2cd979f2f36152cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Hertzog?= <hert...@debian.org> Date: Tue, 9 Sep 2014 08:39:14 +0000 Subject: [PATCH 9/9] Update test_attachement to not rely on the presence of south --- dashboard_app/tests/models/test_attachment.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dashboard_app/tests/models/test_attachment.py b/dashboard_app/tests/models/test_attachment.py index 6eb6ecc..fee4f97 100644 --- a/dashboard_app/tests/models/test_attachment.py +++ b/dashboard_app/tests/models/test_attachment.py @@ -44,12 +44,12 @@ class ModelWithAttachments(models.Model): # such as any tests that depended on the existence of this model. # As a workaround we artificially "stick" this model into the only - # application that we can count on to exist _and_ not use south as well - # -- that is south itself. + # application that we can count on to exist _and_ that does not use + # database migration. - # This way the test model gets synchronized when south is synchronized + # This way the test model gets synchronized when the app is synchronized # and all the test code below works as expected. - app_label = "south" + app_label = "linaro_django_xmlrpc" class AttachmentTestCase(TestCase): -- 2.1.0