From 0ee5c07738ea1829991b05eca290cb259b61e2fe Mon Sep 17 00:00:00 2001 From: Chris Church Date: Wed, 19 Mar 2014 16:37:01 -0400 Subject: [PATCH] AC-1040 Update jobs models and migrations (work in progress). --- awx/main/migrations/0034_v148_changes.py | 986 +++++++++++++++++++++-- awx/main/migrations/0035_v148_changes.py | 785 ++++++++++++++++++ awx/main/migrations/0036_v148_changes.py | 787 ++++++++++++++++++ awx/main/migrations/0037_v148_changes.py | 475 +++++++++++ awx/main/models/__init__.py | 77 +- awx/main/models/activity_stream.py | 77 +- awx/main/models/base.py | 458 ++++++----- awx/main/models/inventory.py | 453 ++++++++--- awx/main/models/jobs.py | 470 +++++++---- awx/main/models/organization.py | 183 ++++- awx/main/models/projects.py | 218 +++-- awx/main/models/schedules.py | 42 + awx/main/models/unified_jobs.py | 232 ++++++ awx/settings/defaults.py | 4 + 14 files changed, 4602 insertions(+), 645 deletions(-) create mode 100644 awx/main/migrations/0035_v148_changes.py create mode 100644 awx/main/migrations/0036_v148_changes.py create mode 100644 awx/main/migrations/0037_v148_changes.py create mode 100644 awx/main/models/schedules.py create mode 100644 awx/main/models/unified_jobs.py diff --git a/awx/main/migrations/0034_v148_changes.py b/awx/main/migrations/0034_v148_changes.py index be0d8f88ed..a9234cbbc5 100644 --- a/awx/main/migrations/0034_v148_changes.py +++ b/awx/main/migrations/0034_v148_changes.py @@ -8,31 +8,726 @@ from django.db import models class Migration(SchemaMigration): def forwards(self, orm): - # Adding field 'ProjectUpdate.start_args' - db.add_column(u'main_projectupdate', 'start_args', + # Adding model 'InventoryUpdateNew' + db.create_table(u'main_inventoryupdatenew', ( + (u'unifiedjob_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['main.UnifiedJob'], unique=True, primary_key=True)), + ('source', self.gf('django.db.models.fields.CharField')(default='', max_length=32, blank=True)), + ('source_path', self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True)), + ('source_vars', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('credential', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='inventoryupdatenews', null=True, blank=True, to=orm['main.Credential'])), + ('source_regions', self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True)), + ('overwrite', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('overwrite_vars', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('license_error', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('inventory_source', self.gf('django.db.models.fields.related.ForeignKey')(related_name='inventory_updates', to=orm['main.InventorySourceNew'])), + )) + db.send_create_signal('main', ['InventoryUpdateNew']) + + # Adding model 'JobNew' + db.create_table(u'main_jobnew', ( + (u'unifiedjob_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['main.UnifiedJob'], unique=True, primary_key=True)), + ('job_type', self.gf('django.db.models.fields.CharField')(max_length=64)), + ('inventory', self.gf('django.db.models.fields.related.ForeignKey')(related_name='jobnews', null=True, on_delete=models.SET_NULL, to=orm['main.Inventory'])), + ('playbook', self.gf('django.db.models.fields.CharField')(default='', max_length=1024)), + ('credential', self.gf('django.db.models.fields.related.ForeignKey')(related_name='jobnews', on_delete=models.SET_NULL, default=None, to=orm['main.Credential'], blank=True, null=True)), + ('cloud_credential', self.gf('django.db.models.fields.related.ForeignKey')(related_name='jobnews_as_cloud_credential+', on_delete=models.SET_NULL, default=None, to=orm['main.Credential'], blank=True, null=True)), + ('forks', self.gf('django.db.models.fields.PositiveIntegerField')(default=0, blank=True)), + ('limit', self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True)), + ('verbosity', self.gf('django.db.models.fields.PositiveIntegerField')(default=0, blank=True)), + ('extra_vars', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('job_tags', self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True)), + ('job_template', self.gf('django.db.models.fields.related.ForeignKey')(related_name='jobs', on_delete=models.SET_NULL, default=None, to=orm['main.JobTemplateNew'], blank=True, null=True)), + ('project', self.gf('django.db.models.fields.related.ForeignKey')(related_name='jobs', null=True, on_delete=models.SET_NULL, to=orm['main.ProjectNew'])), + )) + db.send_create_signal('main', ['JobNew']) + + # Adding model 'UnifiedJob' + db.create_table(u'main_unifiedjob', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('polymorphic_ctype', self.gf('django.db.models.fields.related.ForeignKey')(related_name='polymorphic_main.unifiedjob_set', null=True, to=orm['contenttypes.ContentType'])), + ('created', self.gf('django.db.models.fields.DateTimeField')(default=None)), + ('modified', self.gf('django.db.models.fields.DateTimeField')(default=None)), + ('description', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('created_by', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name="{'class': 'unifiedjob', 'app_label': 'main'}(class)s_created+", null=True, on_delete=models.SET_NULL, to=orm['auth.User'])), + ('modified_by', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name="{'class': 'unifiedjob', 'app_label': 'main'}(class)s_modified+", null=True, on_delete=models.SET_NULL, to=orm['auth.User'])), + ('active', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('old_pk', self.gf('django.db.models.fields.PositiveIntegerField')(default=None, null=True)), + ('unified_job_template', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='unifiedjob_unified_jobs', null=True, to=orm['main.UnifiedJobTemplate'])), + ('launch_type', self.gf('django.db.models.fields.CharField')(default='manual', max_length=20)), + ('schedule', self.gf('django.db.models.fields.related.ForeignKey')(default=None, to=orm['main.Schedule'], null=True)), + ('cancel_flag', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('status', self.gf('django.db.models.fields.CharField')(default='new', max_length=20)), + ('failed', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('started', self.gf('django.db.models.fields.DateTimeField')(default=None, null=True)), + ('finished', self.gf('django.db.models.fields.DateTimeField')(default=None, null=True)), + ('elapsed', self.gf('django.db.models.fields.DecimalField')(max_digits=12, decimal_places=3)), + ('job_args', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('job_cwd', self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True)), + ('job_env', self.gf('jsonfield.fields.JSONField')(default={}, blank=True)), + ('start_args', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('result_stdout_text', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('result_stdout_file', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('result_traceback', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('celery_task_id', self.gf('django.db.models.fields.CharField')(default='', max_length=100, blank=True)), + )) + db.send_create_signal('main', ['UnifiedJob']) + + # Adding M2M table for field depends_on on 'UnifiedJob' + m2m_table_name = db.shorten_name(u'main_unifiedjob_depends_on') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('from_unifiedjob', models.ForeignKey(orm['main.unifiedjob'], null=False)), + ('to_unifiedjob', models.ForeignKey(orm['main.unifiedjob'], null=False)) + )) + db.create_unique(m2m_table_name, ['from_unifiedjob_id', 'to_unifiedjob_id']) + + # Adding model 'Schedule' + db.create_table(u'main_schedule', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('created', self.gf('django.db.models.fields.DateTimeField')(default=None)), + ('modified', self.gf('django.db.models.fields.DateTimeField')(default=None)), + ('description', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('created_by', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name="{'class': 'schedule', 'app_label': 'main'}(class)s_created+", null=True, on_delete=models.SET_NULL, to=orm['auth.User'])), + ('modified_by', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name="{'class': 'schedule', 'app_label': 'main'}(class)s_modified+", null=True, on_delete=models.SET_NULL, to=orm['auth.User'])), + ('active', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=512)), + ('job_template', self.gf('django.db.models.fields.related.ForeignKey')(related_name='schedules', to=orm['main.UnifiedJobTemplate'])), + ('dtstart', self.gf('django.db.models.fields.DateTimeField')()), + ('dtend', self.gf('django.db.models.fields.DateTimeField')(default=None, null=True)), + ('rrule', self.gf('django.db.models.fields.CharField')(max_length=255)), + )) + db.send_create_signal('main', ['Schedule']) + + # Adding model 'InventorySourceNew' + db.create_table(u'main_inventorysourcenew', ( + (u'unifiedjobtemplate_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['main.UnifiedJobTemplate'], unique=True, primary_key=True)), + ('source', self.gf('django.db.models.fields.CharField')(default='', max_length=32, blank=True)), + ('source_path', self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True)), + ('source_vars', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('credential', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='inventorysourcenews', null=True, blank=True, to=orm['main.Credential'])), + ('source_regions', self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True)), + ('overwrite', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('overwrite_vars', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('update_on_launch', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('update_cache_timeout', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)), + ('inventory', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='new_inventory_sources', null=True, to=orm['main.Inventory'])), + ('group', self.gf('awx.main.fields.AutoOneToOneField')(related_name='new_inventory_source', null=True, default=None, to=orm['main.Group'], blank=True, unique=True)), + )) + db.send_create_signal('main', ['InventorySourceNew']) + + # Adding model 'JobTemplateNew' + db.create_table('main_jobtemplatenew', ( + (u'unifiedjobtemplate_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['main.UnifiedJobTemplate'], unique=True, primary_key=True)), + ('job_type', self.gf('django.db.models.fields.CharField')(max_length=64)), + ('inventory', self.gf('django.db.models.fields.related.ForeignKey')(related_name='jobtemplatenews', null=True, on_delete=models.SET_NULL, to=orm['main.Inventory'])), + ('playbook', self.gf('django.db.models.fields.CharField')(default='', max_length=1024)), + ('credential', self.gf('django.db.models.fields.related.ForeignKey')(related_name='jobtemplatenews', on_delete=models.SET_NULL, default=None, to=orm['main.Credential'], blank=True, null=True)), + ('cloud_credential', self.gf('django.db.models.fields.related.ForeignKey')(related_name='jobtemplatenews_as_cloud_credential+', on_delete=models.SET_NULL, default=None, to=orm['main.Credential'], blank=True, null=True)), + ('forks', self.gf('django.db.models.fields.PositiveIntegerField')(default=0, blank=True)), + ('limit', self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True)), + ('verbosity', self.gf('django.db.models.fields.PositiveIntegerField')(default=0, blank=True)), + ('extra_vars', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('job_tags', self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True)), + ('host_config_key', self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True)), + ('project', self.gf('django.db.models.fields.related.ForeignKey')(related_name='job_templates', null=True, on_delete=models.SET_NULL, to=orm['main.ProjectNew'])), + )) + db.send_create_signal('main', ['JobTemplateNew']) + + # Adding model 'ProjectNew' + db.create_table(u'main_projectnew', ( + (u'unifiedjobtemplate_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['main.UnifiedJobTemplate'], unique=True, primary_key=True)), + ('local_path', self.gf('django.db.models.fields.CharField')(max_length=1024, blank=True)), + ('scm_type', self.gf('django.db.models.fields.CharField')(default='', max_length=8, blank=True)), + ('scm_url', self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True)), + ('scm_branch', self.gf('django.db.models.fields.CharField')(default='', max_length=256, blank=True)), + ('scm_clean', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('scm_delete_on_update', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('credential', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='projectnews', null=True, blank=True, to=orm['main.Credential'])), + ('scm_delete_on_next_update', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('scm_update_on_launch', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('scm_update_cache_timeout', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)), + )) + db.send_create_signal('main', ['ProjectNew']) + + # Adding model 'ProjectUpdateNew' + db.create_table(u'main_projectupdatenew', ( + (u'unifiedjob_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['main.UnifiedJob'], unique=True, primary_key=True)), + ('local_path', self.gf('django.db.models.fields.CharField')(max_length=1024, blank=True)), + ('scm_type', self.gf('django.db.models.fields.CharField')(default='', max_length=8, blank=True)), + ('scm_url', self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True)), + ('scm_branch', self.gf('django.db.models.fields.CharField')(default='', max_length=256, blank=True)), + ('scm_clean', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('scm_delete_on_update', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('credential', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='projectupdatenews', null=True, blank=True, to=orm['main.Credential'])), + ('project', self.gf('django.db.models.fields.related.ForeignKey')(related_name='project_updates', to=orm['main.ProjectNew'])), + )) + db.send_create_signal('main', ['ProjectUpdateNew']) + + # Adding model 'UnifiedJobTemplate' + db.create_table(u'main_unifiedjobtemplate', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('polymorphic_ctype', self.gf('django.db.models.fields.related.ForeignKey')(related_name='polymorphic_main.unifiedjobtemplate_set', null=True, to=orm['contenttypes.ContentType'])), + ('created', self.gf('django.db.models.fields.DateTimeField')(default=None)), + ('modified', self.gf('django.db.models.fields.DateTimeField')(default=None)), + ('description', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('created_by', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name="{'class': 'unifiedjobtemplate', 'app_label': 'main'}(class)s_created+", null=True, on_delete=models.SET_NULL, to=orm['auth.User'])), + ('modified_by', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name="{'class': 'unifiedjobtemplate', 'app_label': 'main'}(class)s_modified+", null=True, on_delete=models.SET_NULL, to=orm['auth.User'])), + ('active', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('name', self.gf('django.db.models.fields.CharField')(max_length=512)), + ('old_pk', self.gf('django.db.models.fields.PositiveIntegerField')(default=None, null=True)), + ('current_job', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='unifiedjobtemplate_as_current_job+', null=True, to=orm['main.UnifiedJob'])), + ('last_job', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='unifiedjobtemplate_as_last_job+', null=True, to=orm['main.UnifiedJob'])), + ('last_job_failed', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('last_job_run', self.gf('django.db.models.fields.DateTimeField')(default=None, null=True)), + ('has_schedules', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('next_job_run', self.gf('django.db.models.fields.DateTimeField')(default=None, null=True)), + ('status', self.gf('django.db.models.fields.CharField')(default='ok', max_length=32)), + )) + db.send_create_signal('main', ['UnifiedJobTemplate']) + + # Adding unique constraint on 'UnifiedJobTemplate', fields ['polymorphic_ctype', 'name'] + db.create_unique(u'main_unifiedjobtemplate', ['polymorphic_ctype_id', 'name']) + + + # Changing field 'Profile.created' + db.alter_column(u'main_profile', 'created', self.gf('django.db.models.fields.DateTimeField')()) + + # Changing field 'Profile.modified' + db.alter_column(u'main_profile', 'modified', self.gf('django.db.models.fields.DateTimeField')()) + # Adding field 'ProjectUpdate.local_path' + db.add_column(u'main_projectupdate', 'local_path', + self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True), + keep_default=False) + + # Adding field 'ProjectUpdate.scm_type' + db.add_column(u'main_projectupdate', 'scm_type', + self.gf('django.db.models.fields.CharField')(default='', max_length=8, blank=True), + keep_default=False) + + # Adding field 'ProjectUpdate.scm_url' + db.add_column(u'main_projectupdate', 'scm_url', + self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True), + keep_default=False) + + # Adding field 'ProjectUpdate.scm_branch' + db.add_column(u'main_projectupdate', 'scm_branch', + self.gf('django.db.models.fields.CharField')(default='', max_length=256, blank=True), + keep_default=False) + + # Adding field 'ProjectUpdate.scm_clean' + db.add_column(u'main_projectupdate', 'scm_clean', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + # Adding field 'ProjectUpdate.scm_delete_on_update' + db.add_column(u'main_projectupdate', 'scm_delete_on_update', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + # Adding field 'ProjectUpdate.credential' + db.add_column(u'main_projectupdate', 'credential', + self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='projectupdates', null=True, blank=True, to=orm['main.Credential']), + keep_default=False) + + + # Changing field 'ProjectUpdate.created' + db.alter_column(u'main_projectupdate', 'created', self.gf('django.db.models.fields.DateTimeField')()) + + # Changing field 'ProjectUpdate.modified' + db.alter_column(u'main_projectupdate', 'modified', self.gf('django.db.models.fields.DateTimeField')()) + # Adding M2M table for field new_inventory_sources on 'Group' + m2m_table_name = db.shorten_name(u'main_group_new_inventory_sources') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('group', models.ForeignKey(orm['main.group'], null=False)), + ('inventorysourcenew', models.ForeignKey(orm['main.inventorysourcenew'], null=False)) + )) + db.create_unique(m2m_table_name, ['group_id', 'inventorysourcenew_id']) + + + # Changing field 'Group.created' + db.alter_column(u'main_group', 'created', self.gf('django.db.models.fields.DateTimeField')()) + + # Changing field 'Group.modified' + db.alter_column(u'main_group', 'modified', self.gf('django.db.models.fields.DateTimeField')()) + + # Changing field 'Job.created' + db.alter_column(u'main_job', 'created', self.gf('django.db.models.fields.DateTimeField')()) + + # Changing field 'Job.modified' + db.alter_column(u'main_job', 'modified', self.gf('django.db.models.fields.DateTimeField')()) + + # Changing field 'Inventory.created' + db.alter_column(u'main_inventory', 'created', self.gf('django.db.models.fields.DateTimeField')()) + + # Changing field 'Inventory.modified' + db.alter_column(u'main_inventory', 'modified', self.gf('django.db.models.fields.DateTimeField')()) + # Adding field 'Host.new_last_job' + db.add_column(u'main_host', 'new_last_job', + self.gf('django.db.models.fields.related.ForeignKey')(related_name='hosts_as_last_job+', on_delete=models.SET_NULL, default=None, to=orm['main.JobNew'], blank=True, null=True), + keep_default=False) + + # Adding M2M table for field new_inventory_sources on 'Host' + m2m_table_name = db.shorten_name(u'main_host_new_inventory_sources') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('host', models.ForeignKey(orm['main.host'], null=False)), + ('inventorysourcenew', models.ForeignKey(orm['main.inventorysourcenew'], null=False)) + )) + db.create_unique(m2m_table_name, ['host_id', 'inventorysourcenew_id']) + + + # Changing field 'Host.created' + db.alter_column(u'main_host', 'created', self.gf('django.db.models.fields.DateTimeField')()) + + # Changing field 'Host.modified' + db.alter_column(u'main_host', 'modified', self.gf('django.db.models.fields.DateTimeField')()) + # Adding field 'JobHostSummary.new_job' + db.add_column(u'main_jobhostsummary', 'new_job', + self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='new_job_host_summaries', null=True, to=orm['main.JobNew']), + keep_default=False) + + + # Changing field 'JobHostSummary.created' + db.alter_column(u'main_jobhostsummary', 'created', self.gf('django.db.models.fields.DateTimeField')()) + + # Changing field 'JobHostSummary.modified' + db.alter_column(u'main_jobhostsummary', 'modified', self.gf('django.db.models.fields.DateTimeField')()) + # Adding unique constraint on 'JobHostSummary', fields ['new_job', 'host'] + db.create_unique(u'main_jobhostsummary', ['new_job_id', 'host_id']) + + # Adding field 'InventoryUpdate.source' + db.add_column(u'main_inventoryupdate', 'source', + self.gf('django.db.models.fields.CharField')(default='', max_length=32, blank=True), + keep_default=False) + + # Adding field 'InventoryUpdate.source_path' + db.add_column(u'main_inventoryupdate', 'source_path', + self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True), + keep_default=False) + + # Adding field 'InventoryUpdate.source_vars' + db.add_column(u'main_inventoryupdate', 'source_vars', self.gf('django.db.models.fields.TextField')(default='', blank=True), keep_default=False) - # Adding field 'Job.start_args' - db.add_column(u'main_job', 'start_args', - self.gf('django.db.models.fields.TextField')(default='', blank=True), + # Adding field 'InventoryUpdate.credential' + db.add_column(u'main_inventoryupdate', 'credential', + self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='inventoryupdates', null=True, blank=True, to=orm['main.Credential']), keep_default=False) - # Adding field 'InventoryUpdate.start_args' - db.add_column(u'main_inventoryupdate', 'start_args', - self.gf('django.db.models.fields.TextField')(default='', blank=True), + # Adding field 'InventoryUpdate.source_regions' + db.add_column(u'main_inventoryupdate', 'source_regions', + self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True), + keep_default=False) + + # Adding field 'InventoryUpdate.overwrite' + db.add_column(u'main_inventoryupdate', 'overwrite', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + # Adding field 'InventoryUpdate.overwrite_vars' + db.add_column(u'main_inventoryupdate', 'overwrite_vars', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + + # Changing field 'InventoryUpdate.created' + db.alter_column(u'main_inventoryupdate', 'created', self.gf('django.db.models.fields.DateTimeField')()) + + # Changing field 'InventoryUpdate.modified' + db.alter_column(u'main_inventoryupdate', 'modified', self.gf('django.db.models.fields.DateTimeField')()) + + # Changing field 'Credential.created' + db.alter_column(u'main_credential', 'created', self.gf('django.db.models.fields.DateTimeField')()) + + # Changing field 'Credential.modified' + db.alter_column(u'main_credential', 'modified', self.gf('django.db.models.fields.DateTimeField')()) + + # Changing field 'JobTemplate.created' + db.alter_column(u'main_jobtemplate', 'created', self.gf('django.db.models.fields.DateTimeField')()) + + # Changing field 'JobTemplate.modified' + db.alter_column(u'main_jobtemplate', 'modified', self.gf('django.db.models.fields.DateTimeField')()) + # Adding M2M table for field unified_job_template on 'ActivityStream' + m2m_table_name = db.shorten_name(u'main_activitystream_unified_job_template') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('activitystream', models.ForeignKey(orm['main.activitystream'], null=False)), + ('unifiedjobtemplate', models.ForeignKey(orm['main.unifiedjobtemplate'], null=False)) + )) + db.create_unique(m2m_table_name, ['activitystream_id', 'unifiedjobtemplate_id']) + + # Adding M2M table for field unified_job on 'ActivityStream' + m2m_table_name = db.shorten_name(u'main_activitystream_unified_job') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('activitystream', models.ForeignKey(orm['main.activitystream'], null=False)), + ('unifiedjob', models.ForeignKey(orm['main.unifiedjob'], null=False)) + )) + db.create_unique(m2m_table_name, ['activitystream_id', 'unifiedjob_id']) + + # Adding M2M table for field new_inventory_source on 'ActivityStream' + m2m_table_name = db.shorten_name(u'main_activitystream_new_inventory_source') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('activitystream', models.ForeignKey(orm['main.activitystream'], null=False)), + ('inventorysourcenew', models.ForeignKey(orm['main.inventorysourcenew'], null=False)) + )) + db.create_unique(m2m_table_name, ['activitystream_id', 'inventorysourcenew_id']) + + # Adding M2M table for field new_inventory_update on 'ActivityStream' + m2m_table_name = db.shorten_name(u'main_activitystream_new_inventory_update') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('activitystream', models.ForeignKey(orm['main.activitystream'], null=False)), + ('inventoryupdatenew', models.ForeignKey(orm['main.inventoryupdatenew'], null=False)) + )) + db.create_unique(m2m_table_name, ['activitystream_id', 'inventoryupdatenew_id']) + + # Adding M2M table for field new_project on 'ActivityStream' + m2m_table_name = db.shorten_name(u'main_activitystream_new_project') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('activitystream', models.ForeignKey(orm['main.activitystream'], null=False)), + ('projectnew', models.ForeignKey(orm['main.projectnew'], null=False)) + )) + db.create_unique(m2m_table_name, ['activitystream_id', 'projectnew_id']) + + # Adding M2M table for field new_project_update on 'ActivityStream' + m2m_table_name = db.shorten_name(u'main_activitystream_new_project_update') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('activitystream', models.ForeignKey(orm['main.activitystream'], null=False)), + ('projectupdatenew', models.ForeignKey(orm['main.projectupdatenew'], null=False)) + )) + db.create_unique(m2m_table_name, ['activitystream_id', 'projectupdatenew_id']) + + # Adding M2M table for field new_job_template on 'ActivityStream' + m2m_table_name = db.shorten_name(u'main_activitystream_new_job_template') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('activitystream', models.ForeignKey(orm['main.activitystream'], null=False)), + ('jobtemplatenew', models.ForeignKey(orm['main.jobtemplatenew'], null=False)) + )) + db.create_unique(m2m_table_name, ['activitystream_id', 'jobtemplatenew_id']) + + # Adding M2M table for field new_job on 'ActivityStream' + m2m_table_name = db.shorten_name(u'main_activitystream_new_job') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('activitystream', models.ForeignKey(orm['main.activitystream'], null=False)), + ('jobnew', models.ForeignKey(orm['main.jobnew'], null=False)) + )) + db.create_unique(m2m_table_name, ['activitystream_id', 'jobnew_id']) + + # Adding M2M table for field new_projects on 'Team' + m2m_table_name = db.shorten_name(u'main_team_new_projects') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('team', models.ForeignKey(orm['main.team'], null=False)), + ('projectnew', models.ForeignKey(orm['main.projectnew'], null=False)) + )) + db.create_unique(m2m_table_name, ['team_id', 'projectnew_id']) + + + # Changing field 'Team.created' + db.alter_column(u'main_team', 'created', self.gf('django.db.models.fields.DateTimeField')()) + + # Changing field 'Team.modified' + db.alter_column(u'main_team', 'modified', self.gf('django.db.models.fields.DateTimeField')()) + # Adding field 'Project.scm_update_cache_timeout' + db.add_column(u'main_project', 'scm_update_cache_timeout', + self.gf('django.db.models.fields.PositiveIntegerField')(default=0), + keep_default=False) + + + # Changing field 'Project.created' + db.alter_column(u'main_project', 'created', self.gf('django.db.models.fields.DateTimeField')()) + + # Changing field 'Project.modified' + db.alter_column(u'main_project', 'modified', self.gf('django.db.models.fields.DateTimeField')()) + # Adding M2M table for field new_projects on 'Organization' + m2m_table_name = db.shorten_name(u'main_organization_new_projects') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('organization', models.ForeignKey(orm['main.organization'], null=False)), + ('projectnew', models.ForeignKey(orm['main.projectnew'], null=False)) + )) + db.create_unique(m2m_table_name, ['organization_id', 'projectnew_id']) + + + # Changing field 'Organization.created' + db.alter_column(u'main_organization', 'created', self.gf('django.db.models.fields.DateTimeField')()) + + # Changing field 'Organization.modified' + db.alter_column(u'main_organization', 'modified', self.gf('django.db.models.fields.DateTimeField')()) + # Adding field 'Permission.new_project' + db.add_column(u'main_permission', 'new_project', + self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='permissions', null=True, on_delete=models.SET_NULL, to=orm['main.ProjectNew']), + keep_default=False) + + + # Changing field 'Permission.created' + db.alter_column(u'main_permission', 'created', self.gf('django.db.models.fields.DateTimeField')()) + + # Changing field 'Permission.modified' + db.alter_column(u'main_permission', 'modified', self.gf('django.db.models.fields.DateTimeField')()) + # Deleting field 'InventorySource.update_interval' + db.delete_column(u'main_inventorysource', 'update_interval') + + # Adding field 'InventorySource.update_cache_timeout' + db.add_column(u'main_inventorysource', 'update_cache_timeout', + self.gf('django.db.models.fields.PositiveIntegerField')(default=0), + keep_default=False) + + + # Changing field 'InventorySource.created' + db.alter_column(u'main_inventorysource', 'created', self.gf('django.db.models.fields.DateTimeField')()) + + # Changing field 'InventorySource.modified' + db.alter_column(u'main_inventorysource', 'modified', self.gf('django.db.models.fields.DateTimeField')()) + # Adding field 'JobEvent.role' + db.add_column(u'main_jobevent', 'role', + self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True), + keep_default=False) + + # Adding field 'JobEvent.new_job' + db.add_column(u'main_jobevent', 'new_job', + self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='new_job_events', null=True, to=orm['main.JobNew']), keep_default=False) def backwards(self, orm): - # Deleting field 'ProjectUpdate.start_args' - db.delete_column(u'main_projectupdate', 'start_args') + # Removing unique constraint on 'JobHostSummary', fields ['new_job', 'host'] + db.delete_unique(u'main_jobhostsummary', ['new_job_id', 'host_id']) - # Deleting field 'Job.start_args' - db.delete_column(u'main_job', 'start_args') + # Removing unique constraint on 'UnifiedJobTemplate', fields ['polymorphic_ctype', 'name'] + db.delete_unique(u'main_unifiedjobtemplate', ['polymorphic_ctype_id', 'name']) - # Deleting field 'InventoryUpdate.start_args' - db.delete_column(u'main_inventoryupdate', 'start_args') + # Deleting model 'InventoryUpdateNew' + db.delete_table(u'main_inventoryupdatenew') + + # Deleting model 'JobNew' + db.delete_table(u'main_jobnew') + + # Deleting model 'UnifiedJob' + db.delete_table(u'main_unifiedjob') + + # Removing M2M table for field depends_on on 'UnifiedJob' + db.delete_table(db.shorten_name(u'main_unifiedjob_depends_on')) + + # Deleting model 'Schedule' + db.delete_table(u'main_schedule') + + # Deleting model 'InventorySourceNew' + db.delete_table(u'main_inventorysourcenew') + + # Deleting model 'JobTemplateNew' + db.delete_table('main_jobtemplatenew') + + # Deleting model 'ProjectNew' + db.delete_table(u'main_projectnew') + + # Deleting model 'ProjectUpdateNew' + db.delete_table(u'main_projectupdatenew') + + # Deleting model 'UnifiedJobTemplate' + db.delete_table(u'main_unifiedjobtemplate') + + + # Changing field 'Profile.created' + db.alter_column(u'main_profile', 'created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True)) + + # Changing field 'Profile.modified' + db.alter_column(u'main_profile', 'modified', self.gf('django.db.models.fields.DateTimeField')(auto_now=True)) + # Deleting field 'ProjectUpdate.local_path' + db.delete_column(u'main_projectupdate', 'local_path') + + # Deleting field 'ProjectUpdate.scm_type' + db.delete_column(u'main_projectupdate', 'scm_type') + + # Deleting field 'ProjectUpdate.scm_url' + db.delete_column(u'main_projectupdate', 'scm_url') + + # Deleting field 'ProjectUpdate.scm_branch' + db.delete_column(u'main_projectupdate', 'scm_branch') + + # Deleting field 'ProjectUpdate.scm_clean' + db.delete_column(u'main_projectupdate', 'scm_clean') + + # Deleting field 'ProjectUpdate.scm_delete_on_update' + db.delete_column(u'main_projectupdate', 'scm_delete_on_update') + + # Deleting field 'ProjectUpdate.credential' + db.delete_column(u'main_projectupdate', 'credential_id') + + + # Changing field 'ProjectUpdate.created' + db.alter_column(u'main_projectupdate', 'created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True)) + + # Changing field 'ProjectUpdate.modified' + db.alter_column(u'main_projectupdate', 'modified', self.gf('django.db.models.fields.DateTimeField')(auto_now=True)) + # Removing M2M table for field new_inventory_sources on 'Group' + db.delete_table(db.shorten_name(u'main_group_new_inventory_sources')) + + + # Changing field 'Group.created' + db.alter_column(u'main_group', 'created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True)) + + # Changing field 'Group.modified' + db.alter_column(u'main_group', 'modified', self.gf('django.db.models.fields.DateTimeField')(auto_now=True)) + + # Changing field 'Job.created' + db.alter_column(u'main_job', 'created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True)) + + # Changing field 'Job.modified' + db.alter_column(u'main_job', 'modified', self.gf('django.db.models.fields.DateTimeField')(auto_now=True)) + + # Changing field 'Inventory.created' + db.alter_column(u'main_inventory', 'created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True)) + + # Changing field 'Inventory.modified' + db.alter_column(u'main_inventory', 'modified', self.gf('django.db.models.fields.DateTimeField')(auto_now=True)) + # Deleting field 'Host.new_last_job' + db.delete_column(u'main_host', 'new_last_job_id') + + # Removing M2M table for field new_inventory_sources on 'Host' + db.delete_table(db.shorten_name(u'main_host_new_inventory_sources')) + + + # Changing field 'Host.created' + db.alter_column(u'main_host', 'created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True)) + + # Changing field 'Host.modified' + db.alter_column(u'main_host', 'modified', self.gf('django.db.models.fields.DateTimeField')(auto_now=True)) + # Deleting field 'JobHostSummary.new_job' + db.delete_column(u'main_jobhostsummary', 'new_job_id') + + + # Changing field 'JobHostSummary.created' + db.alter_column(u'main_jobhostsummary', 'created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True)) + + # Changing field 'JobHostSummary.modified' + db.alter_column(u'main_jobhostsummary', 'modified', self.gf('django.db.models.fields.DateTimeField')(auto_now=True)) + # Deleting field 'InventoryUpdate.source' + db.delete_column(u'main_inventoryupdate', 'source') + + # Deleting field 'InventoryUpdate.source_path' + db.delete_column(u'main_inventoryupdate', 'source_path') + + # Deleting field 'InventoryUpdate.source_vars' + db.delete_column(u'main_inventoryupdate', 'source_vars') + + # Deleting field 'InventoryUpdate.credential' + db.delete_column(u'main_inventoryupdate', 'credential_id') + + # Deleting field 'InventoryUpdate.source_regions' + db.delete_column(u'main_inventoryupdate', 'source_regions') + + # Deleting field 'InventoryUpdate.overwrite' + db.delete_column(u'main_inventoryupdate', 'overwrite') + + # Deleting field 'InventoryUpdate.overwrite_vars' + db.delete_column(u'main_inventoryupdate', 'overwrite_vars') + + + # Changing field 'InventoryUpdate.created' + db.alter_column(u'main_inventoryupdate', 'created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True)) + + # Changing field 'InventoryUpdate.modified' + db.alter_column(u'main_inventoryupdate', 'modified', self.gf('django.db.models.fields.DateTimeField')(auto_now=True)) + + # Changing field 'Credential.created' + db.alter_column(u'main_credential', 'created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True)) + + # Changing field 'Credential.modified' + db.alter_column(u'main_credential', 'modified', self.gf('django.db.models.fields.DateTimeField')(auto_now=True)) + + # Changing field 'JobTemplate.created' + db.alter_column(u'main_jobtemplate', 'created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True)) + + # Changing field 'JobTemplate.modified' + db.alter_column(u'main_jobtemplate', 'modified', self.gf('django.db.models.fields.DateTimeField')(auto_now=True)) + # Removing M2M table for field unified_job_template on 'ActivityStream' + db.delete_table(db.shorten_name(u'main_activitystream_unified_job_template')) + + # Removing M2M table for field unified_job on 'ActivityStream' + db.delete_table(db.shorten_name(u'main_activitystream_unified_job')) + + # Removing M2M table for field new_inventory_source on 'ActivityStream' + db.delete_table(db.shorten_name(u'main_activitystream_new_inventory_source')) + + # Removing M2M table for field new_inventory_update on 'ActivityStream' + db.delete_table(db.shorten_name(u'main_activitystream_new_inventory_update')) + + # Removing M2M table for field new_project on 'ActivityStream' + db.delete_table(db.shorten_name(u'main_activitystream_new_project')) + + # Removing M2M table for field new_project_update on 'ActivityStream' + db.delete_table(db.shorten_name(u'main_activitystream_new_project_update')) + + # Removing M2M table for field new_job_template on 'ActivityStream' + db.delete_table(db.shorten_name(u'main_activitystream_new_job_template')) + + # Removing M2M table for field new_job on 'ActivityStream' + db.delete_table(db.shorten_name(u'main_activitystream_new_job')) + + # Removing M2M table for field new_projects on 'Team' + db.delete_table(db.shorten_name(u'main_team_new_projects')) + + + # Changing field 'Team.created' + db.alter_column(u'main_team', 'created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True)) + + # Changing field 'Team.modified' + db.alter_column(u'main_team', 'modified', self.gf('django.db.models.fields.DateTimeField')(auto_now=True)) + # Deleting field 'Project.scm_update_cache_timeout' + db.delete_column(u'main_project', 'scm_update_cache_timeout') + + + # Changing field 'Project.created' + db.alter_column(u'main_project', 'created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True)) + + # Changing field 'Project.modified' + db.alter_column(u'main_project', 'modified', self.gf('django.db.models.fields.DateTimeField')(auto_now=True)) + # Removing M2M table for field new_projects on 'Organization' + db.delete_table(db.shorten_name(u'main_organization_new_projects')) + + + # Changing field 'Organization.created' + db.alter_column(u'main_organization', 'created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True)) + + # Changing field 'Organization.modified' + db.alter_column(u'main_organization', 'modified', self.gf('django.db.models.fields.DateTimeField')(auto_now=True)) + # Deleting field 'Permission.new_project' + db.delete_column(u'main_permission', 'new_project_id') + + + # Changing field 'Permission.created' + db.alter_column(u'main_permission', 'created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True)) + + # Changing field 'Permission.modified' + db.alter_column(u'main_permission', 'modified', self.gf('django.db.models.fields.DateTimeField')(auto_now=True)) + # Adding field 'InventorySource.update_interval' + db.add_column(u'main_inventorysource', 'update_interval', + self.gf('django.db.models.fields.PositiveIntegerField')(default=0), + keep_default=False) + + # Deleting field 'InventorySource.update_cache_timeout' + db.delete_column(u'main_inventorysource', 'update_cache_timeout') + + + # Changing field 'InventorySource.created' + db.alter_column(u'main_inventorysource', 'created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True)) + + # Changing field 'InventorySource.modified' + db.alter_column(u'main_inventorysource', 'modified', self.gf('django.db.models.fields.DateTimeField')(auto_now=True)) + # Deleting field 'JobEvent.role' + db.delete_column(u'main_jobevent', 'role') + + # Deleting field 'JobEvent.new_job' + db.delete_column(u'main_jobevent', 'new_job_id') models = { @@ -85,6 +780,12 @@ class Migration(SchemaMigration): 'inventory_update': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.InventoryUpdate']", 'symmetrical': 'False', 'blank': 'True'}), 'job': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.Job']", 'symmetrical': 'False', 'blank': 'True'}), 'job_template': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.JobTemplate']", 'symmetrical': 'False', 'blank': 'True'}), + 'new_inventory_source': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.InventorySourceNew']", 'symmetrical': 'False', 'blank': 'True'}), + 'new_inventory_update': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.InventoryUpdateNew']", 'symmetrical': 'False', 'blank': 'True'}), + 'new_job': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.JobNew']", 'symmetrical': 'False', 'blank': 'True'}), + 'new_job_template': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.JobTemplateNew']", 'symmetrical': 'False', 'blank': 'True'}), + 'new_project': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.ProjectNew']", 'symmetrical': 'False', 'blank': 'True'}), + 'new_project_update': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.ProjectUpdateNew']", 'symmetrical': 'False', 'blank': 'True'}), 'object1': ('django.db.models.fields.TextField', [], {}), 'object2': ('django.db.models.fields.TextField', [], {}), 'object_relationship_type': ('django.db.models.fields.TextField', [], {'blank': 'True'}), @@ -95,6 +796,8 @@ class Migration(SchemaMigration): 'project_update': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.ProjectUpdate']", 'symmetrical': 'False', 'blank': 'True'}), 'team': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.Team']", 'symmetrical': 'False', 'blank': 'True'}), 'timestamp': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'unified_job': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'activity_stream_as_unified_job+'", 'blank': 'True', 'to': "orm['main.UnifiedJob']"}), + 'unified_job_template': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'activity_stream_as_unified_job_template+'", 'blank': 'True', 'to': "orm['main.UnifiedJobTemplate']"}), 'user': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.User']", 'symmetrical': 'False', 'blank': 'True'}) }, 'main.authtoken': { @@ -110,12 +813,12 @@ class Migration(SchemaMigration): 'Meta': {'unique_together': "[('user', 'team', 'kind', 'name')]", 'object_name': 'Credential'}, 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 'cloud': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'credential\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'kind': ('django.db.models.fields.CharField', [], {'default': "'ssh'", 'max_length': '32'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'auto_now': 'True', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'credential\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '512'}), 'password': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), @@ -130,7 +833,7 @@ class Migration(SchemaMigration): 'main.group': { 'Meta': {'unique_together': "(('name', 'inventory'),)", 'object_name': 'Group'}, 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'group\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), 'groups_with_active_failures': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), @@ -141,9 +844,10 @@ class Migration(SchemaMigration): u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'groups'", 'to': "orm['main.Inventory']"}), 'inventory_sources': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'groups'", 'blank': 'True', 'to': "orm['main.InventorySource']"}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'auto_now': 'True', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'group\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + 'new_inventory_sources': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'groups'", 'blank': 'True', 'to': "orm['main.InventorySourceNew']"}), 'parents': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'children'", 'blank': 'True', 'to': "orm['main.Group']"}), 'total_groups': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), 'total_hosts': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), @@ -152,7 +856,7 @@ class Migration(SchemaMigration): 'main.host': { 'Meta': {'unique_together': "(('name', 'inventory'),)", 'object_name': 'Host'}, 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'host\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), @@ -164,15 +868,17 @@ class Migration(SchemaMigration): 'inventory_sources': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'hosts'", 'blank': 'True', 'to': "orm['main.InventorySource']"}), 'last_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hosts_as_last_job+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Job']", 'blank': 'True', 'null': 'True'}), 'last_job_host_summary': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hosts_as_last_job_summary+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.JobHostSummary']", 'blank': 'True', 'null': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'auto_now': 'True', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'host\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + 'new_inventory_sources': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'hosts'", 'blank': 'True', 'to': "orm['main.InventorySourceNew']"}), + 'new_last_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hosts_as_last_job+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.JobNew']", 'blank': 'True', 'null': 'True'}), 'variables': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}) }, 'main.inventory': { 'Meta': {'unique_together': "[('name', 'organization')]", 'object_name': 'Inventory'}, 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'inventory\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), 'groups_with_active_failures': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), @@ -181,7 +887,7 @@ class Migration(SchemaMigration): 'hosts_with_active_failures': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'inventory_sources_with_failures': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'auto_now': 'True', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'inventory\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512'}), 'organization': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'inventories'", 'to': "orm['main.Organization']"}), @@ -193,9 +899,9 @@ class Migration(SchemaMigration): 'main.inventorysource': { 'Meta': {'object_name': 'InventorySource'}, 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'inventorysource\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), - 'credential': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'inventory_sources'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Credential']"}), + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'inventorysources'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Credential']"}), 'current_update': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'inventory_source_as_current_update+'", 'null': 'True', 'to': "orm['main.InventoryUpdate']"}), 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), 'group': ('awx.main.fields.AutoOneToOneField', [], {'related_name': "'inventory_source'", 'null': 'True', 'default': 'None', 'to': "orm['main.Group']", 'blank': 'True', 'unique': 'True'}), @@ -204,7 +910,7 @@ class Migration(SchemaMigration): 'last_update': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'inventory_source_as_last_update+'", 'null': 'True', 'to': "orm['main.InventoryUpdate']"}), 'last_update_failed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'last_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'auto_now': 'True', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'inventorysource\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), 'overwrite': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'overwrite_vars': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), @@ -213,7 +919,22 @@ class Migration(SchemaMigration): 'source_regions': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), 'source_vars': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), 'status': ('django.db.models.fields.CharField', [], {'default': "'none'", 'max_length': '32'}), - 'update_interval': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'update_cache_timeout': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'update_on_launch': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + 'main.inventorysourcenew': { + 'Meta': {'object_name': 'InventorySourceNew', '_ormbases': ['main.UnifiedJobTemplate']}, + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'inventorysourcenews'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Credential']"}), + 'group': ('awx.main.fields.AutoOneToOneField', [], {'related_name': "'new_inventory_source'", 'null': 'True', 'default': 'None', 'to': "orm['main.Group']", 'blank': 'True', 'unique': 'True'}), + 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'new_inventory_sources'", 'null': 'True', 'to': "orm['main.Inventory']"}), + 'overwrite': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'overwrite_vars': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'source': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '32', 'blank': 'True'}), + 'source_path': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'source_regions': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'source_vars': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + u'unifiedjobtemplate_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['main.UnifiedJobTemplate']", 'unique': 'True', 'primary_key': 'True'}), + 'update_cache_timeout': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), 'update_on_launch': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) }, 'main.inventoryupdate': { @@ -222,8 +943,9 @@ class Migration(SchemaMigration): 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 'cancel_flag': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'celery_task_id': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100', 'blank': 'True'}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'inventoryupdate\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'inventoryupdates'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Credential']"}), 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), 'failed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), @@ -232,13 +954,31 @@ class Migration(SchemaMigration): 'job_cwd': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), 'job_env': ('jsonfield.fields.JSONField', [], {'default': '{}', 'blank': 'True'}), 'license_error': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'auto_now': 'True', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'inventoryupdate\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'overwrite': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'overwrite_vars': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'result_stdout_file': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), 'result_traceback': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), - 'start_args': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'source': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '32', 'blank': 'True'}), + 'source_path': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'source_regions': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'source_vars': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), 'status': ('django.db.models.fields.CharField', [], {'default': "'new'", 'max_length': '20'}) }, + 'main.inventoryupdatenew': { + 'Meta': {'object_name': 'InventoryUpdateNew', '_ormbases': ['main.UnifiedJob']}, + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'inventoryupdatenews'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Credential']"}), + 'inventory_source': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'inventory_updates'", 'to': "orm['main.InventorySourceNew']"}), + 'license_error': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'overwrite': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'overwrite_vars': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'source': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '32', 'blank': 'True'}), + 'source_path': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'source_regions': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'source_vars': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + u'unifiedjob_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['main.UnifiedJob']", 'unique': 'True', 'primary_key': 'True'}) + }, 'main.job': { 'Meta': {'object_name': 'Job'}, '_result_stdout': ('django.db.models.fields.TextField', [], {'default': "''", 'db_column': "'result_stdout'", 'blank': 'True'}), @@ -246,9 +986,9 @@ class Migration(SchemaMigration): 'cancel_flag': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'celery_task_id': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100', 'blank': 'True'}), 'cloud_credential': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobs_as_cloud_credential+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Credential']", 'blank': 'True', 'null': 'True'}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'job\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), - 'credential': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobs'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Credential']"}), + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobs'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Credential']", 'blank': 'True', 'null': 'True'}), 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), 'extra_vars': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), 'failed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), @@ -264,13 +1004,12 @@ class Migration(SchemaMigration): 'job_type': ('django.db.models.fields.CharField', [], {'max_length': '64'}), 'launch_type': ('django.db.models.fields.CharField', [], {'default': "'manual'", 'max_length': '20'}), 'limit': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'auto_now': 'True', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'job\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), - 'playbook': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'playbook': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}), 'project': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobs'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Project']"}), 'result_stdout_file': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), 'result_traceback': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), - 'start_args': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), 'status': ('django.db.models.fields.CharField', [], {'default': "'new'", 'max_length': '20'}), 'verbosity': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'}) }, @@ -286,73 +1025,111 @@ class Migration(SchemaMigration): u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'job_events'", 'to': "orm['main.Job']"}), 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'new_job': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'new_job_events'", 'null': 'True', 'to': "orm['main.JobNew']"}), 'parent': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'children'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.JobEvent']", 'blank': 'True', 'null': 'True'}), 'play': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'role': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), 'task': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}) }, 'main.jobhostsummary': { - 'Meta': {'ordering': "('-pk',)", 'unique_together': "[('job', 'host')]", 'object_name': 'JobHostSummary'}, + 'Meta': {'ordering': "('-pk',)", 'unique_together': "[('job', 'host'), ('new_job', 'host')]", 'object_name': 'JobHostSummary'}, 'changed': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'auto_now_add': 'True', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), 'dark': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), 'failed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'failures': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), 'host': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'job_host_summaries'", 'to': "orm['main.Host']"}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'job_host_summaries'", 'to': "orm['main.Job']"}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'auto_now': 'True', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'new_job': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'new_job_host_summaries'", 'null': 'True', 'to': "orm['main.JobNew']"}), 'ok': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), 'processed': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), 'skipped': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) }, + 'main.jobnew': { + 'Meta': {'object_name': 'JobNew', '_ormbases': ['main.UnifiedJob']}, + 'cloud_credential': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobnews_as_cloud_credential+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Credential']", 'blank': 'True', 'null': 'True'}), + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobnews'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Credential']", 'blank': 'True', 'null': 'True'}), + 'extra_vars': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'forks': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'}), + 'hosts': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'jobnews'", 'blank': 'True', 'through': "orm['main.JobHostSummary']", 'to': "orm['main.Host']"}), + 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobnews'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Inventory']"}), + 'job_tags': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'job_template': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobs'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.JobTemplateNew']", 'blank': 'True', 'null': 'True'}), + 'job_type': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'limit': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'playbook': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}), + 'project': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobs'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.ProjectNew']"}), + u'unifiedjob_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['main.UnifiedJob']", 'unique': 'True', 'primary_key': 'True'}), + 'verbosity': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'}) + }, 'main.jobtemplate': { 'Meta': {'object_name': 'JobTemplate'}, 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'cloud_credential': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'job_templates_as_cloud_credential+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Credential']", 'blank': 'True', 'null': 'True'}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'cloud_credential': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobtemplates_as_cloud_credential+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Credential']", 'blank': 'True', 'null': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'jobtemplate\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), - 'credential': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'job_templates'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Credential']", 'blank': 'True', 'null': 'True'}), + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobtemplates'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Credential']", 'blank': 'True', 'null': 'True'}), 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), 'extra_vars': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), 'forks': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'}), 'host_config_key': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'job_templates'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Inventory']"}), + 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobtemplates'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Inventory']"}), 'job_tags': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), 'job_type': ('django.db.models.fields.CharField', [], {'max_length': '64'}), 'limit': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'auto_now': 'True', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'jobtemplate\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512'}), 'playbook': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}), 'project': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'job_templates'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Project']"}), 'verbosity': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'}) }, + 'main.jobtemplatenew': { + 'Meta': {'object_name': 'JobTemplateNew', '_ormbases': ['main.UnifiedJobTemplate']}, + 'cloud_credential': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobtemplatenews_as_cloud_credential+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Credential']", 'blank': 'True', 'null': 'True'}), + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobtemplatenews'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Credential']", 'blank': 'True', 'null': 'True'}), + 'extra_vars': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'forks': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'}), + 'host_config_key': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobtemplatenews'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Inventory']"}), + 'job_tags': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'job_type': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'limit': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'playbook': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}), + 'project': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'job_templates'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.ProjectNew']"}), + u'unifiedjobtemplate_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['main.UnifiedJobTemplate']", 'unique': 'True', 'primary_key': 'True'}), + 'verbosity': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'}) + }, 'main.organization': { 'Meta': {'object_name': 'Organization'}, 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 'admins': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'admin_of_organizations'", 'blank': 'True', 'to': u"orm['auth.User']"}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'organization\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'auto_now': 'True', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'organization\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512'}), + 'new_projects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'organizations'", 'blank': 'True', 'to': "orm['main.ProjectNew']"}), 'projects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'organizations'", 'blank': 'True', 'to': "orm['main.Project']"}), 'users': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'organizations'", 'blank': 'True', 'to': u"orm['auth.User']"}) }, 'main.permission': { 'Meta': {'object_name': 'Permission'}, 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'permission\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'permissions'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Inventory']"}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'auto_now': 'True', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'permission\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + 'new_project': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'permissions'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.ProjectNew']"}), 'permission_type': ('django.db.models.fields.CharField', [], {'max_length': '64'}), 'project': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'permissions'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Project']"}), 'team': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'permissions'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Team']"}), @@ -360,16 +1137,16 @@ class Migration(SchemaMigration): }, 'main.profile': { 'Meta': {'object_name': 'Profile'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'ldap_dn': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), 'user': ('awx.main.fields.AutoOneToOneField', [], {'related_name': "'profile'", 'unique': 'True', 'to': u"orm['auth.User']"}) }, 'main.project': { 'Meta': {'object_name': 'Project'}, 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'project\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), 'credential': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'projects'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Credential']"}), 'current_update': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'project_as_current_update+'", 'null': 'True', 'to': "orm['main.ProjectUpdate']"}), @@ -379,7 +1156,7 @@ class Migration(SchemaMigration): 'last_update_failed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'last_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), 'local_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'auto_now': 'True', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'project\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512'}), 'scm_branch': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), @@ -387,46 +1164,145 @@ class Migration(SchemaMigration): 'scm_delete_on_next_update': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'scm_delete_on_update': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'scm_type': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '8', 'blank': 'True'}), + 'scm_update_cache_timeout': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), 'scm_update_on_launch': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'scm_url': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), 'status': ('django.db.models.fields.CharField', [], {'default': "'ok'", 'max_length': '32', 'null': 'True'}) }, + 'main.projectnew': { + 'Meta': {'object_name': 'ProjectNew', '_ormbases': ['main.UnifiedJobTemplate']}, + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'projectnews'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Credential']"}), + 'local_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}), + 'scm_branch': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), + 'scm_clean': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_delete_on_next_update': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_delete_on_update': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_type': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '8', 'blank': 'True'}), + 'scm_update_cache_timeout': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'scm_update_on_launch': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_url': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + u'unifiedjobtemplate_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['main.UnifiedJobTemplate']", 'unique': 'True', 'primary_key': 'True'}) + }, 'main.projectupdate': { 'Meta': {'object_name': 'ProjectUpdate'}, '_result_stdout': ('django.db.models.fields.TextField', [], {'default': "''", 'db_column': "'result_stdout'", 'blank': 'True'}), 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 'cancel_flag': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'celery_task_id': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100', 'blank': 'True'}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'projectupdate\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'projectupdates'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Credential']"}), 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), 'failed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'job_args': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), 'job_cwd': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), 'job_env': ('jsonfield.fields.JSONField', [], {'default': '{}', 'blank': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'auto_now': 'True', 'blank': 'True'}), + 'local_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'projectupdate\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), 'project': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'project_updates'", 'to': "orm['main.Project']"}), 'result_stdout_file': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), 'result_traceback': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), - 'start_args': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'scm_branch': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), + 'scm_clean': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_delete_on_update': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_type': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '8', 'blank': 'True'}), + 'scm_url': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), 'status': ('django.db.models.fields.CharField', [], {'default': "'new'", 'max_length': '20'}) }, + 'main.projectupdatenew': { + 'Meta': {'object_name': 'ProjectUpdateNew', '_ormbases': ['main.UnifiedJob']}, + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'projectupdatenews'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Credential']"}), + 'local_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}), + 'project': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'project_updates'", 'to': "orm['main.ProjectNew']"}), + 'scm_branch': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), + 'scm_clean': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_delete_on_update': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_type': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '8', 'blank': 'True'}), + 'scm_url': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + u'unifiedjob_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['main.UnifiedJob']", 'unique': 'True', 'primary_key': 'True'}) + }, + 'main.schedule': { + 'Meta': {'object_name': 'Schedule'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'schedule\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'dtend': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), + 'dtstart': ('django.db.models.fields.DateTimeField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'job_template': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'schedules'", 'to': "orm['main.UnifiedJobTemplate']"}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'schedule\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512'}), + 'rrule': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, 'main.team': { 'Meta': {'unique_together': "[('organization', 'name')]", 'object_name': 'Team'}, 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'team\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'auto_now': 'True', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'team\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + 'new_projects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'teams'", 'blank': 'True', 'to': "orm['main.ProjectNew']"}), 'organization': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'teams'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Organization']"}), 'projects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'teams'", 'blank': 'True', 'to': "orm['main.Project']"}), 'users': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'teams'", 'blank': 'True', 'to': u"orm['auth.User']"}) }, + 'main.unifiedjob': { + 'Meta': {'object_name': 'UnifiedJob'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'cancel_flag': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'celery_task_id': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'unifiedjob\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'depends_on': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'depends_on_rel_+'", 'to': "orm['main.UnifiedJob']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'elapsed': ('django.db.models.fields.DecimalField', [], {'max_digits': '12', 'decimal_places': '3'}), + 'failed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'finished': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'job_args': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'job_cwd': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'job_env': ('jsonfield.fields.JSONField', [], {'default': '{}', 'blank': 'True'}), + 'launch_type': ('django.db.models.fields.CharField', [], {'default': "'manual'", 'max_length': '20'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'unifiedjob\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'old_pk': ('django.db.models.fields.PositiveIntegerField', [], {'default': 'None', 'null': 'True'}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'polymorphic_main.unifiedjob_set'", 'null': 'True', 'to': u"orm['contenttypes.ContentType']"}), + 'result_stdout_file': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'result_stdout_text': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'result_traceback': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'schedule': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['main.Schedule']", 'null': 'True'}), + 'start_args': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'started': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'new'", 'max_length': '20'}), + 'unified_job_template': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'unifiedjob_unified_jobs'", 'null': 'True', 'to': "orm['main.UnifiedJobTemplate']"}) + }, + 'main.unifiedjobtemplate': { + 'Meta': {'unique_together': "[('polymorphic_ctype', 'name')]", 'object_name': 'UnifiedJobTemplate'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'unifiedjobtemplate\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'current_job': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'unifiedjobtemplate_as_current_job+'", 'null': 'True', 'to': "orm['main.UnifiedJob']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'has_schedules': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_job': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'unifiedjobtemplate_as_last_job+'", 'null': 'True', 'to': "orm['main.UnifiedJob']"}), + 'last_job_failed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_job_run': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'unifiedjobtemplate\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + 'next_job_run': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), + 'old_pk': ('django.db.models.fields.PositiveIntegerField', [], {'default': 'None', 'null': 'True'}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'polymorphic_main.unifiedjobtemplate_set'", 'null': 'True', 'to': u"orm['contenttypes.ContentType']"}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'ok'", 'max_length': '32'}) + }, u'taggit.tag': { 'Meta': {'object_name': 'Tag'}, u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), diff --git a/awx/main/migrations/0035_v148_changes.py b/awx/main/migrations/0035_v148_changes.py new file mode 100644 index 0000000000..9629ae38d0 --- /dev/null +++ b/awx/main/migrations/0035_v148_changes.py @@ -0,0 +1,785 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import DataMigration +from django.db import models + +class Migration(DataMigration): + + def _get_dict_from_primordial_model(self, instance): + return { + 'description': instance.description, + 'created': instance.created, + 'modified': instance.modified, + 'created_by': instance.created_by, + 'modified_by': instance.modified_by, + 'active': instance.active, + 'old_pk': instance.pk, + } + + def _get_dict_from_common_model(self, instance): + d = self._get_dict_from_primordial_model(instance) + if hasattr(instance, 'name'): + d['name'] = instance.name + else: + d['name'] = u'%s-%s' % (instance._meta.verbose_name, instance.pk) + return d + + def _get_dict_from_common_task_model(self, instance): + d = self._get_dict_from_primordial_model(instance) + td = instance.modified - instance.created + elapsed = (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / (10**6 * 1.0) + d.update({ + 'launch_type': getattr(instance, 'launch_type', 'manual'), + 'cancel_flag': instance.cancel_flag, + 'status': instance.status, + 'failed': instance.failed, + 'started': instance.created, + 'finished': instance.modified, + 'elapsed': elapsed, + 'job_args': instance.job_args, + 'job_env': instance.job_env, + 'result_stdout_text': instance._result_stdout, + 'result_stdout_file': instance.result_stdout_file, + 'result_traceback': instance.result_traceback, + 'celery_task_id': instance.celery_task_id, + }) + return d + + def forwards(self, orm): + "Write your forwards methods here." + + # Copy Project old to new. + new_ctype = orm['contenttypes.ContentType'].objects.get(app_label=orm.Project._meta.app_label, model=orm.Project._meta.module_name) + for project in orm.Project.objects.order_by('pk'): + d = self._get_dict_from_common_model(project) + d['polymorphic_ctype_id'] = new_ctype.pk + new_project, created = orm.ProjectNew.objects.get_or_create(old_pk=project.pk, defaults=d) + + # Copy ProjectUpdate old to new. + new_ctype = orm['contenttypes.ContentType'].objects.get(app_label=orm.ProjectUpdate._meta.app_label, model=orm.ProjectUpdate._meta.module_name) + for project_update in orm.ProjectUpdate.objects.order_by('pk'): + d = self._get_dict_from_common_task_model(project_update) + d['project_id'] = orm.ProjectNew.objects.get(old_pk=project_update.project_id).pk + d['polymorphic_ctype_id'] = new_ctype.pk + new_project_update, created = orm.ProjectUpdateNew.objects.get_or_create(old_pk=project_update.pk, defaults=d) + + # Update Project last run. + for project in orm.Project.objects.order_by('pk'): + new_project = orm.ProjectNew.objects.get(old_pk=project.pk) + if project.current_update: + new_project.current_job = orm.ProjectUpdateNew.objects.get(old_pk=project.current_update_id) + if project.last_update: + new_project.last_job = orm.ProjectUpdateNew.objects.get(old_pk=project.last_update_id) + new_project.save() + + # Update Organization projects. + for organization in orm.Organization.objects.order_by('pk'): + for project in organization.projects.order_by('pk'): + new_project = orm.ProjectNew.objects.get(old_pk=project.pk) + organization.new_projects.add(new_project) + + # Update Team projects. + for team in orm.Team.objects.order_by('pk'): + for project in team.projects.order_by('pk'): + new_project = orm.ProjectNew.objects.get(old_pk=project.pk) + team.new_projects.add(new_project) + + # Update Permission project. + for permission in orm.Permission.objects.order_by('pk'): + if not permission.project_id: + continue + new_project = orm.ProjectNew.objects.get(old_pk=permission.project_id) + permission.new_project = new_project + permission.save() + + # Copy InventorySource old to new. + new_ctype = orm['contenttypes.ContentType'].objects.get(app_label=orm.InventorySource._meta.app_label, model=orm.InventorySource._meta.module_name) + for inventory_source in orm.InventorySource.objects.order_by('pk'): + d = self._get_dict_from_common_model(inventory_source) + d['polymorphic_ctype_id'] = new_ctype.pk + new_inventory_source, created = orm.InventorySourceNew.objects.get_or_create(old_pk=inventory_source.pk, defaults=d) + + # Copy InventoryUpdate old to new. + new_ctype = orm['contenttypes.ContentType'].objects.get(app_label=orm.InventoryUpdate._meta.app_label, model=orm.InventoryUpdate._meta.module_name) + for inventory_update in orm.InventoryUpdate.objects.order_by('pk'): + d = self._get_dict_from_common_task_model(inventory_update) + d['inventory_source_id'] = orm.InventorySourceNew.objects.get(old_pk=inventory_update.inventory_source_id).pk + d['polymorphic_ctype_id'] = new_ctype.pk + new_inventory_update, created = orm.InventoryUpdateNew.objects.get_or_create(old_pk=inventory_update.pk, defaults=d) + + # Update InventorySource last run. + for inventory_source in orm.InventorySource.objects.order_by('pk'): + new_inventory_source = orm.InventorySourceNew.objects.get(old_pk=inventory_source.pk) + if inventory_source.current_update: + new_inventory_source.current_job = orm.InventoryUpdateNew.objects.get(old_pk=inventory_source.current_update_id) + if inventory_source.last_update: + new_inventory_source.last_job = orm.InventoryUpdateNew.objects.get(old_pk=inventory_source.last_update_id) + new_inventory_source.save() + + # Update Group inventory_sources. + for group in orm.Group.objects.order_by('pk'): + for inventory_source in group.inventory_sources.order_by('pk'): + new_inventory_source = orm.InventorySourceNew.objects.get(old_pk=inventory_source.pk) + group.new_inventory_sources.add(new_inventory_source) + + # Update Host inventory_sources. + for host in orm.Host.objects.order_by('pk'): + for inventory_source in host.inventory_sources.order_by('pk'): + new_inventory_source = orm.InventorySourceNew.objects.get(old_pk=inventory_source.pk) + host.new_inventory_sources.add(new_inventory_source) + + # Copy JobTemplate old to new. + new_ctype = orm['contenttypes.ContentType'].objects.get(app_label=orm.JobTemplate._meta.app_label, model=orm.JobTemplate._meta.module_name) + for job_template in orm.JobTemplate.objects.order_by('pk'): + d = self._get_dict_from_common_model(job_template) + if job_template.project: + d['project_id'] = orm.ProjectNew.objects.get(old_pk=job_template.project_id).pk + d['polymorphic_ctype_id'] = new_ctype.pk + new_job_template, created = orm.JobTemplateNew.objects.get_or_create(old_pk=job_template.pk, defaults=d) + + # Copy Job old to new. + new_ctype = orm['contenttypes.ContentType'].objects.get(app_label=orm.Job._meta.app_label, model=orm.Job._meta.module_name) + for job in orm.Job.objects.order_by('pk'): + d = self._get_dict_from_common_task_model(job) + if job.project: + d['project_id'] = orm.ProjectNew.objects.get(old_pk=job.project_id).pk + d['polymorphic_ctype_id'] = new_ctype.pk + new_job, created = orm.JobNew.objects.get_or_create(old_pk=job.pk, defaults=d) + + # Update JobHostSummary job. + for job_host_summary in orm.JobHostSummary.objects.order_by('pk'): + new_job = orm.JobNew.objects.get(old_pk=job_host_summary.job_id) + job_host_summary.new_job = new_job + job_host_summary.save() + + # Update JobEvent job. + for job_event in orm.JobEvent.objects.order_by('pk'): + new_job = orm.JobNew.objects.get(old_pk=job_event.job_id) + job_event.new_job = new_job + job_event.save() + + # Update Host last_job. + for host in orm.Host.objects.order_by('pk'): + if not host.last_job: + continue + new_job = orm.JobNew.objects.get(old_pk=host.last_job_id) + host.new_last_job = new_job + host.save() + + # Update ActivityStream + for a_s in orm.ActivityStream.objects.order_by('pk'): + for project in a_s.project.all(): + new_project = orm.ProjectNew.objects.get(old_pk=project.pk) + a_s.new_project.add(new_project) + for project_update in a_s.project_update.all(): + new_project_update = orm.ProjectUpdateNew.objects.get(old_pk=project_update.pk) + a_s.new_project_update.add(new_project_update) + for inventory_source in a_s.inventory_source.all(): + new_inventory_source = orm.InventorySourceNew.objects.get(old_pk=inventory_source.pk) + a_s.new_inventory_source.add(new_inventory_source) + for inventory_update in a_s.inventory_update.all(): + new_inventory_update = orm.InventoryUpdateNew.objects.get(old_pk=inventory_update.pk) + a_s.new_inventory_update.add(new_inventory_update) + for job_template in a_s.job_template.all(): + new_job_template = orm.JobTemplateNew.objects.get(old_pk=job_template.pk) + a_s.new_job_template.add(new_job_template) + for job in a_s.job.all(): + new_job = orm.JobNew.objects.get(old_pk=job.pk) + a_s.new_job.add(new_job) + + def backwards(self, orm): + "Write your backwards methods here." + + # FIXME: Would like to have this, but not required. + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'main.activitystream': { + 'Meta': {'object_name': 'ActivityStream'}, + 'actor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_stream'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'changes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'credential': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.Credential']", 'symmetrical': 'False', 'blank': 'True'}), + 'group': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'host': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.Host']", 'symmetrical': 'False', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inventory': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.Inventory']", 'symmetrical': 'False', 'blank': 'True'}), + 'inventory_source': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.InventorySource']", 'symmetrical': 'False', 'blank': 'True'}), + 'inventory_update': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.InventoryUpdate']", 'symmetrical': 'False', 'blank': 'True'}), + 'job': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.Job']", 'symmetrical': 'False', 'blank': 'True'}), + 'job_template': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.JobTemplate']", 'symmetrical': 'False', 'blank': 'True'}), + 'new_inventory_source': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.InventorySourceNew']", 'symmetrical': 'False', 'blank': 'True'}), + 'new_inventory_update': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.InventoryUpdateNew']", 'symmetrical': 'False', 'blank': 'True'}), + 'new_job': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.JobNew']", 'symmetrical': 'False', 'blank': 'True'}), + 'new_job_template': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.JobTemplateNew']", 'symmetrical': 'False', 'blank': 'True'}), + 'new_project': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.ProjectNew']", 'symmetrical': 'False', 'blank': 'True'}), + 'new_project_update': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.ProjectUpdateNew']", 'symmetrical': 'False', 'blank': 'True'}), + 'object1': ('django.db.models.fields.TextField', [], {}), + 'object2': ('django.db.models.fields.TextField', [], {}), + 'object_relationship_type': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'operation': ('django.db.models.fields.CharField', [], {'max_length': '13'}), + 'organization': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.Organization']", 'symmetrical': 'False', 'blank': 'True'}), + 'permission': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'project': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.Project']", 'symmetrical': 'False', 'blank': 'True'}), + 'project_update': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.ProjectUpdate']", 'symmetrical': 'False', 'blank': 'True'}), + 'team': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.Team']", 'symmetrical': 'False', 'blank': 'True'}), + 'timestamp': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'unified_job': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'activity_stream_as_unified_job+'", 'blank': 'True', 'to': "orm['main.UnifiedJob']"}), + 'unified_job_template': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'activity_stream_as_unified_job_template+'", 'blank': 'True', 'to': "orm['main.UnifiedJobTemplate']"}), + 'user': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.User']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'main.authtoken': { + 'Meta': {'object_name': 'AuthToken'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'expires': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'key': ('django.db.models.fields.CharField', [], {'max_length': '40', 'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'request_hash': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '40', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'auth_tokens'", 'to': u"orm['auth.User']"}) + }, + 'main.credential': { + 'Meta': {'unique_together': "[('user', 'team', 'kind', 'name')]", 'object_name': 'Credential'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'cloud': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'credential\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'kind': ('django.db.models.fields.CharField', [], {'default': "'ssh'", 'max_length': '32'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'credential\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + 'password': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'ssh_key_data': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'ssh_key_unlock': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'sudo_password': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'sudo_username': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'team': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'credentials'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Team']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'credentials'", 'null': 'True', 'blank': 'True', 'to': u"orm['auth.User']"}), + 'username': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}) + }, + 'main.group': { + 'Meta': {'unique_together': "(('name', 'inventory'),)", 'object_name': 'Group'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'group\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'groups_with_active_failures': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'has_active_failures': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'has_inventory_sources': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'hosts': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'groups'", 'blank': 'True', 'to': "orm['main.Host']"}), + 'hosts_with_active_failures': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'groups'", 'to': "orm['main.Inventory']"}), + 'inventory_sources': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'groups'", 'blank': 'True', 'to': "orm['main.InventorySource']"}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'group\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + 'new_inventory_sources': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'groups'", 'blank': 'True', 'to': "orm['main.InventorySourceNew']"}), + 'parents': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'children'", 'blank': 'True', 'to': "orm['main.Group']"}), + 'total_groups': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'total_hosts': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'variables': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}) + }, + 'main.host': { + 'Meta': {'unique_together': "(('name', 'inventory'),)", 'object_name': 'Host'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'host\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'has_active_failures': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'has_inventory_sources': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'instance_id': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100', 'blank': 'True'}), + 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hosts'", 'to': "orm['main.Inventory']"}), + 'inventory_sources': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'hosts'", 'blank': 'True', 'to': "orm['main.InventorySource']"}), + 'last_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hosts_as_last_job+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Job']", 'blank': 'True', 'null': 'True'}), + 'last_job_host_summary': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hosts_as_last_job_summary+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.JobHostSummary']", 'blank': 'True', 'null': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'host\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + 'new_inventory_sources': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'hosts'", 'blank': 'True', 'to': "orm['main.InventorySourceNew']"}), + 'new_last_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hosts_as_last_job+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.JobNew']", 'blank': 'True', 'null': 'True'}), + 'variables': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}) + }, + 'main.inventory': { + 'Meta': {'unique_together': "[('name', 'organization')]", 'object_name': 'Inventory'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'inventory\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'groups_with_active_failures': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'has_active_failures': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'has_inventory_sources': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'hosts_with_active_failures': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inventory_sources_with_failures': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'inventory\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512'}), + 'organization': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'inventories'", 'to': "orm['main.Organization']"}), + 'total_groups': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'total_hosts': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'total_inventory_sources': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'variables': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}) + }, + 'main.inventorysource': { + 'Meta': {'object_name': 'InventorySource'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'inventorysource\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'inventorysources'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Credential']"}), + 'current_update': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'inventory_source_as_current_update+'", 'null': 'True', 'to': "orm['main.InventoryUpdate']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'group': ('awx.main.fields.AutoOneToOneField', [], {'related_name': "'inventory_source'", 'null': 'True', 'default': 'None', 'to': "orm['main.Group']", 'blank': 'True', 'unique': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'inventory_sources'", 'null': 'True', 'to': "orm['main.Inventory']"}), + 'last_update': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'inventory_source_as_last_update+'", 'null': 'True', 'to': "orm['main.InventoryUpdate']"}), + 'last_update_failed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'inventorysource\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'overwrite': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'overwrite_vars': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'source': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '32', 'blank': 'True'}), + 'source_path': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'source_regions': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'source_vars': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'none'", 'max_length': '32'}), + 'update_cache_timeout': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'update_on_launch': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + 'main.inventorysourcenew': { + 'Meta': {'object_name': 'InventorySourceNew', '_ormbases': ['main.UnifiedJobTemplate']}, + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'inventorysourcenews'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Credential']"}), + 'group': ('awx.main.fields.AutoOneToOneField', [], {'related_name': "'new_inventory_source'", 'null': 'True', 'default': 'None', 'to': "orm['main.Group']", 'blank': 'True', 'unique': 'True'}), + 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'new_inventory_sources'", 'null': 'True', 'to': "orm['main.Inventory']"}), + 'overwrite': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'overwrite_vars': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'source': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '32', 'blank': 'True'}), + 'source_path': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'source_regions': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'source_vars': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + u'unifiedjobtemplate_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['main.UnifiedJobTemplate']", 'unique': 'True', 'primary_key': 'True'}), + 'update_cache_timeout': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'update_on_launch': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + 'main.inventoryupdate': { + 'Meta': {'object_name': 'InventoryUpdate'}, + '_result_stdout': ('django.db.models.fields.TextField', [], {'default': "''", 'db_column': "'result_stdout'", 'blank': 'True'}), + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'cancel_flag': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'celery_task_id': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'inventoryupdate\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'inventoryupdates'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Credential']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'failed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inventory_source': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'inventory_updates'", 'to': "orm['main.InventorySource']"}), + 'job_args': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'job_cwd': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'job_env': ('jsonfield.fields.JSONField', [], {'default': '{}', 'blank': 'True'}), + 'license_error': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'inventoryupdate\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'overwrite': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'overwrite_vars': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'result_stdout_file': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'result_traceback': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'source': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '32', 'blank': 'True'}), + 'source_path': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'source_regions': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'source_vars': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'new'", 'max_length': '20'}) + }, + 'main.inventoryupdatenew': { + 'Meta': {'object_name': 'InventoryUpdateNew', '_ormbases': ['main.UnifiedJob']}, + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'inventoryupdatenews'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Credential']"}), + 'inventory_source': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'inventory_updates'", 'to': "orm['main.InventorySourceNew']"}), + 'license_error': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'overwrite': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'overwrite_vars': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'source': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '32', 'blank': 'True'}), + 'source_path': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'source_regions': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'source_vars': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + u'unifiedjob_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['main.UnifiedJob']", 'unique': 'True', 'primary_key': 'True'}) + }, + 'main.job': { + 'Meta': {'object_name': 'Job'}, + '_result_stdout': ('django.db.models.fields.TextField', [], {'default': "''", 'db_column': "'result_stdout'", 'blank': 'True'}), + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'cancel_flag': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'celery_task_id': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100', 'blank': 'True'}), + 'cloud_credential': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobs_as_cloud_credential+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Credential']", 'blank': 'True', 'null': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'job\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobs'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Credential']", 'blank': 'True', 'null': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'extra_vars': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'failed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'forks': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'}), + 'hosts': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'jobs'", 'blank': 'True', 'through': "orm['main.JobHostSummary']", 'to': "orm['main.Host']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobs'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Inventory']"}), + 'job_args': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'job_cwd': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'job_env': ('jsonfield.fields.JSONField', [], {'default': '{}', 'blank': 'True'}), + 'job_tags': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'job_template': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobs'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.JobTemplate']", 'blank': 'True', 'null': 'True'}), + 'job_type': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'launch_type': ('django.db.models.fields.CharField', [], {'default': "'manual'", 'max_length': '20'}), + 'limit': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'job\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'playbook': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}), + 'project': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobs'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Project']"}), + 'result_stdout_file': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'result_traceback': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'new'", 'max_length': '20'}), + 'verbosity': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'}) + }, + 'main.jobevent': { + 'Meta': {'ordering': "('pk',)", 'object_name': 'JobEvent'}, + 'changed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'event': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'event_data': ('jsonfield.fields.JSONField', [], {'default': '{}', 'blank': 'True'}), + 'failed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'host': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'job_events_as_primary_host'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Host']", 'blank': 'True', 'null': 'True'}), + 'hosts': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'job_events'", 'blank': 'True', 'to': "orm['main.Host']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'job_events'", 'to': "orm['main.Job']"}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'new_job': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'new_job_events'", 'null': 'True', 'to': "orm['main.JobNew']"}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'children'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.JobEvent']", 'blank': 'True', 'null': 'True'}), + 'play': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'role': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'task': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}) + }, + 'main.jobhostsummary': { + 'Meta': {'ordering': "('-pk',)", 'unique_together': "[('job', 'host'), ('new_job', 'host')]", 'object_name': 'JobHostSummary'}, + 'changed': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'dark': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'failed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'failures': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'host': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'job_host_summaries'", 'to': "orm['main.Host']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'job_host_summaries'", 'to': "orm['main.Job']"}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'new_job': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'new_job_host_summaries'", 'null': 'True', 'to': "orm['main.JobNew']"}), + 'ok': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'processed': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'skipped': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) + }, + 'main.jobnew': { + 'Meta': {'object_name': 'JobNew', '_ormbases': ['main.UnifiedJob']}, + 'cloud_credential': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobnews_as_cloud_credential+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Credential']", 'blank': 'True', 'null': 'True'}), + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobnews'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Credential']", 'blank': 'True', 'null': 'True'}), + 'extra_vars': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'forks': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'}), + 'hosts': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'jobnews'", 'blank': 'True', 'through': "orm['main.JobHostSummary']", 'to': "orm['main.Host']"}), + 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobnews'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Inventory']"}), + 'job_tags': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'job_template': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobs'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.JobTemplateNew']", 'blank': 'True', 'null': 'True'}), + 'job_type': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'limit': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'playbook': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}), + 'project': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobs'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.ProjectNew']"}), + u'unifiedjob_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['main.UnifiedJob']", 'unique': 'True', 'primary_key': 'True'}), + 'verbosity': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'}) + }, + 'main.jobtemplate': { + 'Meta': {'object_name': 'JobTemplate'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'cloud_credential': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobtemplates_as_cloud_credential+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Credential']", 'blank': 'True', 'null': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'jobtemplate\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobtemplates'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Credential']", 'blank': 'True', 'null': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'extra_vars': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'forks': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'}), + 'host_config_key': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobtemplates'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Inventory']"}), + 'job_tags': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'job_type': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'limit': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'jobtemplate\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512'}), + 'playbook': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}), + 'project': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'job_templates'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Project']"}), + 'verbosity': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'}) + }, + 'main.jobtemplatenew': { + 'Meta': {'object_name': 'JobTemplateNew', '_ormbases': ['main.UnifiedJobTemplate']}, + 'cloud_credential': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobtemplatenews_as_cloud_credential+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Credential']", 'blank': 'True', 'null': 'True'}), + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobtemplatenews'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Credential']", 'blank': 'True', 'null': 'True'}), + 'extra_vars': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'forks': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'}), + 'host_config_key': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobtemplatenews'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Inventory']"}), + 'job_tags': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'job_type': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'limit': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'playbook': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}), + 'project': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'job_templates'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.ProjectNew']"}), + u'unifiedjobtemplate_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['main.UnifiedJobTemplate']", 'unique': 'True', 'primary_key': 'True'}), + 'verbosity': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'}) + }, + 'main.organization': { + 'Meta': {'object_name': 'Organization'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'admins': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'admin_of_organizations'", 'blank': 'True', 'to': u"orm['auth.User']"}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'organization\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'organization\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512'}), + 'new_projects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'organizations'", 'blank': 'True', 'to': "orm['main.ProjectNew']"}), + 'projects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'organizations'", 'blank': 'True', 'to': "orm['main.Project']"}), + 'users': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'organizations'", 'blank': 'True', 'to': u"orm['auth.User']"}) + }, + 'main.permission': { + 'Meta': {'object_name': 'Permission'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'permission\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'permissions'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Inventory']"}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'permission\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + 'new_project': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'permissions'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.ProjectNew']"}), + 'permission_type': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'project': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'permissions'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Project']"}), + 'team': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'permissions'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Team']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'permissions'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}) + }, + 'main.profile': { + 'Meta': {'object_name': 'Profile'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ldap_dn': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'user': ('awx.main.fields.AutoOneToOneField', [], {'related_name': "'profile'", 'unique': 'True', 'to': u"orm['auth.User']"}) + }, + 'main.project': { + 'Meta': {'object_name': 'Project'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'project\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'projects'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Credential']"}), + 'current_update': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'project_as_current_update+'", 'null': 'True', 'to': "orm['main.ProjectUpdate']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_update': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'project_as_last_update+'", 'null': 'True', 'to': "orm['main.ProjectUpdate']"}), + 'last_update_failed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), + 'local_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'project\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512'}), + 'scm_branch': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), + 'scm_clean': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_delete_on_next_update': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_delete_on_update': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_type': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '8', 'blank': 'True'}), + 'scm_update_cache_timeout': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'scm_update_on_launch': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_url': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'ok'", 'max_length': '32', 'null': 'True'}) + }, + 'main.projectnew': { + 'Meta': {'object_name': 'ProjectNew', '_ormbases': ['main.UnifiedJobTemplate']}, + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'projectnews'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Credential']"}), + 'local_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}), + 'scm_branch': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), + 'scm_clean': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_delete_on_next_update': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_delete_on_update': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_type': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '8', 'blank': 'True'}), + 'scm_update_cache_timeout': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'scm_update_on_launch': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_url': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + u'unifiedjobtemplate_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['main.UnifiedJobTemplate']", 'unique': 'True', 'primary_key': 'True'}) + }, + 'main.projectupdate': { + 'Meta': {'object_name': 'ProjectUpdate'}, + '_result_stdout': ('django.db.models.fields.TextField', [], {'default': "''", 'db_column': "'result_stdout'", 'blank': 'True'}), + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'cancel_flag': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'celery_task_id': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'projectupdate\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'projectupdates'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Credential']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'failed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'job_args': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'job_cwd': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'job_env': ('jsonfield.fields.JSONField', [], {'default': '{}', 'blank': 'True'}), + 'local_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'projectupdate\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'project': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'project_updates'", 'to': "orm['main.Project']"}), + 'result_stdout_file': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'result_traceback': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'scm_branch': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), + 'scm_clean': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_delete_on_update': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_type': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '8', 'blank': 'True'}), + 'scm_url': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'new'", 'max_length': '20'}) + }, + 'main.projectupdatenew': { + 'Meta': {'object_name': 'ProjectUpdateNew', '_ormbases': ['main.UnifiedJob']}, + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'projectupdatenews'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Credential']"}), + 'local_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}), + 'project': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'project_updates'", 'to': "orm['main.ProjectNew']"}), + 'scm_branch': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), + 'scm_clean': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_delete_on_update': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_type': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '8', 'blank': 'True'}), + 'scm_url': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + u'unifiedjob_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['main.UnifiedJob']", 'unique': 'True', 'primary_key': 'True'}) + }, + 'main.schedule': { + 'Meta': {'object_name': 'Schedule'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'schedule\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'dtend': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), + 'dtstart': ('django.db.models.fields.DateTimeField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'job_template': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'schedules'", 'to': "orm['main.UnifiedJobTemplate']"}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'schedule\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512'}), + 'rrule': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + 'main.team': { + 'Meta': {'unique_together': "[('organization', 'name')]", 'object_name': 'Team'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'team\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'team\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + 'new_projects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'teams'", 'blank': 'True', 'to': "orm['main.ProjectNew']"}), + 'organization': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'teams'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Organization']"}), + 'projects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'teams'", 'blank': 'True', 'to': "orm['main.Project']"}), + 'users': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'teams'", 'blank': 'True', 'to': u"orm['auth.User']"}) + }, + 'main.unifiedjob': { + 'Meta': {'object_name': 'UnifiedJob'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'cancel_flag': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'celery_task_id': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'unifiedjob\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'depends_on': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'depends_on_rel_+'", 'to': "orm['main.UnifiedJob']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'elapsed': ('django.db.models.fields.DecimalField', [], {'max_digits': '12', 'decimal_places': '3'}), + 'failed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'finished': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'job_args': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'job_cwd': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'job_env': ('jsonfield.fields.JSONField', [], {'default': '{}', 'blank': 'True'}), + 'launch_type': ('django.db.models.fields.CharField', [], {'default': "'manual'", 'max_length': '20'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'unifiedjob\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'old_pk': ('django.db.models.fields.PositiveIntegerField', [], {'default': 'None', 'null': 'True'}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'polymorphic_main.unifiedjob_set'", 'null': 'True', 'to': u"orm['contenttypes.ContentType']"}), + 'result_stdout_file': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'result_stdout_text': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'result_traceback': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'schedule': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['main.Schedule']", 'null': 'True'}), + 'start_args': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'started': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'new'", 'max_length': '20'}), + 'unified_job_template': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'unifiedjob_unified_jobs'", 'null': 'True', 'to': "orm['main.UnifiedJobTemplate']"}) + }, + 'main.unifiedjobtemplate': { + 'Meta': {'unique_together': "[('polymorphic_ctype', 'name')]", 'object_name': 'UnifiedJobTemplate'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'unifiedjobtemplate\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'current_job': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'unifiedjobtemplate_as_current_job+'", 'null': 'True', 'to': "orm['main.UnifiedJob']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'has_schedules': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_job': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'unifiedjobtemplate_as_last_job+'", 'null': 'True', 'to': "orm['main.UnifiedJob']"}), + 'last_job_failed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_job_run': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'unifiedjobtemplate\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + 'next_job_run': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), + 'old_pk': ('django.db.models.fields.PositiveIntegerField', [], {'default': 'None', 'null': 'True'}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'polymorphic_main.unifiedjobtemplate_set'", 'null': 'True', 'to': u"orm['contenttypes.ContentType']"}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'ok'", 'max_length': '32'}) + }, + u'taggit.tag': { + 'Meta': {'object_name': 'Tag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100'}) + }, + u'taggit.taggeditem': { + 'Meta': {'object_name': 'TaggedItem'}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'taggit_taggeditem_tagged_items'", 'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}), + 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'taggit_taggeditem_items'", 'to': u"orm['taggit.Tag']"}) + } + } + + complete_apps = ['main'] + symmetrical = True diff --git a/awx/main/migrations/0036_v148_changes.py b/awx/main/migrations/0036_v148_changes.py new file mode 100644 index 0000000000..2947003bea --- /dev/null +++ b/awx/main/migrations/0036_v148_changes.py @@ -0,0 +1,787 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Removing unique constraint on 'JobHostSummary', fields ['job', 'host'] + db.delete_unique(u'main_jobhostsummary', ['job_id', 'host_id']) + + # Deleting model 'JobTemplate' + db.delete_table(u'main_jobtemplate') + + # Deleting model 'InventorySource' + db.delete_table(u'main_inventorysource') + + # Deleting model 'Project' + db.delete_table(u'main_project') + + # Deleting model 'ProjectUpdate' + db.delete_table(u'main_projectupdate') + + # Deleting model 'InventoryUpdate' + db.delete_table(u'main_inventoryupdate') + + # Deleting model 'Job' + db.delete_table(u'main_job') + + # Deleting field 'Host.last_job' + db.delete_column(u'main_host', 'last_job_id') + + # Removing M2M table for field inventory_sources on 'Host' + db.delete_table(db.shorten_name(u'main_host_inventory_sources')) + + # Removing M2M table for field projects on 'Organization' + db.delete_table(db.shorten_name(u'main_organization_projects')) + + # Removing M2M table for field projects on 'Team' + db.delete_table(db.shorten_name(u'main_team_projects')) + + # Deleting field 'Permission.project' + db.delete_column(u'main_permission', 'project_id') + + # Deleting field 'JobHostSummary.job' + db.delete_column(u'main_jobhostsummary', 'job_id') + + # Changing field 'JobHostSummary.new_job' + db.alter_column(u'main_jobhostsummary', 'new_job_id', self.gf('django.db.models.fields.related.ForeignKey')(default=None, to=orm['main.JobNew'])) + + # Removing M2M table for field inventory_sources on 'Group' + db.delete_table(db.shorten_name(u'main_group_inventory_sources')) + + # Deleting field 'JobEvent.job' + db.delete_column(u'main_jobevent', 'job_id') + + # Changing field 'JobEvent.new_job' + db.alter_column(u'main_jobevent', 'new_job_id', self.gf('django.db.models.fields.related.ForeignKey')(default=None, to=orm['main.JobNew'])) + + # Removing M2M table for field job_template on 'ActivityStream' + db.delete_table(db.shorten_name(u'main_activitystream_job_template')) + + # Removing M2M table for field inventory_update on 'ActivityStream' + db.delete_table(db.shorten_name(u'main_activitystream_inventory_update')) + + # Removing M2M table for field job on 'ActivityStream' + db.delete_table(db.shorten_name(u'main_activitystream_job')) + + # Removing M2M table for field project_update on 'ActivityStream' + db.delete_table(db.shorten_name(u'main_activitystream_project_update')) + + # Removing M2M table for field inventory_source on 'ActivityStream' + db.delete_table(db.shorten_name(u'main_activitystream_inventory_source')) + + # Removing M2M table for field project on 'ActivityStream' + db.delete_table(db.shorten_name(u'main_activitystream_project')) + + + def backwards(self, orm): + # Adding model 'JobTemplate' + db.create_table(u'main_jobtemplate', ( + ('credential', self.gf('django.db.models.fields.related.ForeignKey')(related_name='jobtemplates', on_delete=models.SET_NULL, default=None, to=orm['main.Credential'], blank=True, null=True)), + ('modified_by', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name="{'class': 'jobtemplate', 'app_label': 'main'}(class)s_modified+", null=True, on_delete=models.SET_NULL, to=orm['auth.User'])), + ('description', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('created', self.gf('django.db.models.fields.DateTimeField')(default=None)), + ('extra_vars', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('verbosity', self.gf('django.db.models.fields.PositiveIntegerField')(default=0, blank=True)), + ('job_tags', self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True)), + ('job_type', self.gf('django.db.models.fields.CharField')(max_length=64)), + ('modified', self.gf('django.db.models.fields.DateTimeField')(default=None)), + ('created_by', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name="{'class': 'jobtemplate', 'app_label': 'main'}(class)s_created+", null=True, on_delete=models.SET_NULL, to=orm['auth.User'])), + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('project', self.gf('django.db.models.fields.related.ForeignKey')(related_name='job_templates', null=True, on_delete=models.SET_NULL, to=orm['main.Project'])), + ('host_config_key', self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True)), + ('limit', self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True)), + ('inventory', self.gf('django.db.models.fields.related.ForeignKey')(related_name='jobtemplates', null=True, on_delete=models.SET_NULL, to=orm['main.Inventory'])), + ('active', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('forks', self.gf('django.db.models.fields.PositiveIntegerField')(default=0, blank=True)), + ('playbook', self.gf('django.db.models.fields.CharField')(default='', max_length=1024)), + ('cloud_credential', self.gf('django.db.models.fields.related.ForeignKey')(related_name='jobtemplates_as_cloud_credential+', on_delete=models.SET_NULL, default=None, to=orm['main.Credential'], blank=True, null=True)), + ('name', self.gf('django.db.models.fields.CharField')(max_length=512, unique=True)), + )) + db.send_create_signal('main', ['JobTemplate']) + + # Adding model 'InventorySource' + db.create_table(u'main_inventorysource', ( + ('last_updated', self.gf('django.db.models.fields.DateTimeField')(default=None, null=True)), + ('source_regions', self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True)), + ('current_update', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='inventory_source_as_current_update+', null=True, to=orm['main.InventoryUpdate'])), + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('overwrite', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('source_vars', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('group', self.gf('awx.main.fields.AutoOneToOneField')(related_name='inventory_source', null=True, default=None, to=orm['main.Group'], blank=True, unique=True)), + ('last_update_failed', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('created_by', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name="{'class': 'inventorysource', 'app_label': 'main'}(class)s_created+", null=True, on_delete=models.SET_NULL, to=orm['auth.User'])), + ('last_update', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='inventory_source_as_last_update+', null=True, to=orm['main.InventoryUpdate'])), + ('source', self.gf('django.db.models.fields.CharField')(default='', max_length=32, blank=True)), + ('inventory', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='inventory_sources', null=True, to=orm['main.Inventory'])), + ('update_cache_timeout', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)), + ('status', self.gf('django.db.models.fields.CharField')(default='none', max_length=32)), + ('credential', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='inventorysources', null=True, to=orm['main.Credential'], blank=True)), + ('description', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('overwrite_vars', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('active', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('modified_by', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name="{'class': 'inventorysource', 'app_label': 'main'}(class)s_modified+", null=True, on_delete=models.SET_NULL, to=orm['auth.User'])), + ('update_on_launch', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('created', self.gf('django.db.models.fields.DateTimeField')(default=None)), + ('source_path', self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True)), + ('modified', self.gf('django.db.models.fields.DateTimeField')(default=None)), + )) + db.send_create_signal('main', ['InventorySource']) + + # Adding model 'Project' + db.create_table(u'main_project', ( + ('scm_branch', self.gf('django.db.models.fields.CharField')(default='', max_length=256, blank=True)), + ('scm_update_cache_timeout', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)), + ('scm_clean', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('scm_delete_on_update', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('current_update', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='project_as_current_update+', null=True, to=orm['main.ProjectUpdate'])), + ('last_updated', self.gf('django.db.models.fields.DateTimeField')(default=None, null=True)), + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('modified_by', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name="{'class': 'project', 'app_label': 'main'}(class)s_modified+", null=True, on_delete=models.SET_NULL, to=orm['auth.User'])), + ('last_update_failed', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('created_by', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name="{'class': 'project', 'app_label': 'main'}(class)s_created+", null=True, on_delete=models.SET_NULL, to=orm['auth.User'])), + ('last_update', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='project_as_last_update+', null=True, to=orm['main.ProjectUpdate'])), + ('local_path', self.gf('django.db.models.fields.CharField')(max_length=1024, blank=True)), + ('scm_delete_on_next_update', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('status', self.gf('django.db.models.fields.CharField')(default='ok', max_length=32, null=True)), + ('credential', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='projects', null=True, to=orm['main.Credential'], blank=True)), + ('description', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('scm_type', self.gf('django.db.models.fields.CharField')(default='', max_length=8, blank=True)), + ('scm_update_on_launch', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('active', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('name', self.gf('django.db.models.fields.CharField')(max_length=512, unique=True)), + ('created', self.gf('django.db.models.fields.DateTimeField')(default=None)), + ('modified', self.gf('django.db.models.fields.DateTimeField')(default=None)), + ('scm_url', self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True)), + )) + db.send_create_signal('main', ['Project']) + + # Adding model 'ProjectUpdate' + db.create_table(u'main_projectupdate', ( + ('cancel_flag', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('scm_branch', self.gf('django.db.models.fields.CharField')(default='', max_length=256, blank=True)), + ('scm_clean', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('scm_delete_on_update', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('celery_task_id', self.gf('django.db.models.fields.CharField')(default='', max_length=100, blank=True)), + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('modified_by', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name="{'class': 'projectupdate', 'app_label': 'main'}(class)s_modified+", null=True, on_delete=models.SET_NULL, to=orm['auth.User'])), + ('job_cwd', self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True)), + ('created_by', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name="{'class': 'projectupdate', 'app_label': 'main'}(class)s_created+", null=True, on_delete=models.SET_NULL, to=orm['auth.User'])), + ('failed', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('local_path', self.gf('django.db.models.fields.CharField')(max_length=1024, blank=True)), + ('status', self.gf('django.db.models.fields.CharField')(default='new', max_length=20)), + ('credential', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='projectupdates', null=True, to=orm['main.Credential'], blank=True)), + ('description', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('result_traceback', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('scm_type', self.gf('django.db.models.fields.CharField')(default='', max_length=8, blank=True)), + ('job_env', self.gf('jsonfield.fields.JSONField')(default={}, blank=True)), + ('active', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('result_stdout_file', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('created', self.gf('django.db.models.fields.DateTimeField')(default=None)), + ('job_args', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('modified', self.gf('django.db.models.fields.DateTimeField')(default=None)), + ('scm_url', self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True)), + ('project', self.gf('django.db.models.fields.related.ForeignKey')(related_name='project_updates', to=orm['main.Project'])), + ('_result_stdout', self.gf('django.db.models.fields.TextField')(default='', db_column='result_stdout', blank=True)), + )) + db.send_create_signal('main', ['ProjectUpdate']) + + # Adding model 'InventoryUpdate' + db.create_table(u'main_inventoryupdate', ( + ('cancel_flag', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('source_regions', self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True)), + ('license_error', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('celery_task_id', self.gf('django.db.models.fields.CharField')(default='', max_length=100, blank=True)), + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('overwrite', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('source_vars', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('modified_by', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name="{'class': 'inventoryupdate', 'app_label': 'main'}(class)s_modified+", null=True, on_delete=models.SET_NULL, to=orm['auth.User'])), + ('job_cwd', self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True)), + ('source', self.gf('django.db.models.fields.CharField')(default='', max_length=32, blank=True)), + ('created_by', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name="{'class': 'inventoryupdate', 'app_label': 'main'}(class)s_created+", null=True, on_delete=models.SET_NULL, to=orm['auth.User'])), + ('failed', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('status', self.gf('django.db.models.fields.CharField')(default='new', max_length=20)), + ('credential', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='inventoryupdates', null=True, to=orm['main.Credential'], blank=True)), + ('description', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('overwrite_vars', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('result_traceback', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('job_env', self.gf('jsonfield.fields.JSONField')(default={}, blank=True)), + ('active', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('result_stdout_file', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('inventory_source', self.gf('django.db.models.fields.related.ForeignKey')(related_name='inventory_updates', to=orm['main.InventorySource'])), + ('created', self.gf('django.db.models.fields.DateTimeField')(default=None)), + ('job_args', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('source_path', self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True)), + ('modified', self.gf('django.db.models.fields.DateTimeField')(default=None)), + ('_result_stdout', self.gf('django.db.models.fields.TextField')(default='', db_column='result_stdout', blank=True)), + )) + db.send_create_signal('main', ['InventoryUpdate']) + + # Adding model 'Job' + db.create_table(u'main_job', ( + ('cancel_flag', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('credential', self.gf('django.db.models.fields.related.ForeignKey')(related_name='jobs', on_delete=models.SET_NULL, default=None, to=orm['main.Credential'], blank=True, null=True)), + ('description', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('result_traceback', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('job_type', self.gf('django.db.models.fields.CharField')(max_length=64)), + ('job_tags', self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True)), + ('celery_task_id', self.gf('django.db.models.fields.CharField')(default='', max_length=100, blank=True)), + ('playbook', self.gf('django.db.models.fields.CharField')(default='', max_length=1024)), + ('job_env', self.gf('jsonfield.fields.JSONField')(default={}, blank=True)), + ('active', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('result_stdout_file', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('status', self.gf('django.db.models.fields.CharField')(default='new', max_length=20)), + ('modified_by', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name="{'class': 'job', 'app_label': 'main'}(class)s_modified+", null=True, on_delete=models.SET_NULL, to=orm['auth.User'])), + ('job_cwd', self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True)), + ('job_template', self.gf('django.db.models.fields.related.ForeignKey')(related_name='jobs', on_delete=models.SET_NULL, default=None, to=orm['main.JobTemplate'], blank=True, null=True)), + ('created', self.gf('django.db.models.fields.DateTimeField')(default=None)), + ('extra_vars', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('verbosity', self.gf('django.db.models.fields.PositiveIntegerField')(default=0, blank=True)), + ('job_args', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('modified', self.gf('django.db.models.fields.DateTimeField')(default=None)), + ('created_by', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name="{'class': 'job', 'app_label': 'main'}(class)s_created+", null=True, on_delete=models.SET_NULL, to=orm['auth.User'])), + ('project', self.gf('django.db.models.fields.related.ForeignKey')(related_name='jobs', null=True, on_delete=models.SET_NULL, to=orm['main.Project'])), + ('failed', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('inventory', self.gf('django.db.models.fields.related.ForeignKey')(related_name='jobs', null=True, on_delete=models.SET_NULL, to=orm['main.Inventory'])), + ('_result_stdout', self.gf('django.db.models.fields.TextField')(default='', db_column='result_stdout', blank=True)), + ('limit', self.gf('django.db.models.fields.CharField')(default='', max_length=1024, blank=True)), + ('forks', self.gf('django.db.models.fields.PositiveIntegerField')(default=0, blank=True)), + ('cloud_credential', self.gf('django.db.models.fields.related.ForeignKey')(related_name='jobs_as_cloud_credential+', on_delete=models.SET_NULL, default=None, to=orm['main.Credential'], blank=True, null=True)), + ('launch_type', self.gf('django.db.models.fields.CharField')(default='manual', max_length=20)), + )) + db.send_create_signal('main', ['Job']) + + # Adding field 'Host.last_job' + db.add_column(u'main_host', 'last_job', + self.gf('django.db.models.fields.related.ForeignKey')(related_name='hosts_as_last_job+', on_delete=models.SET_NULL, default=None, to=orm['main.Job'], blank=True, null=True), + keep_default=False) + + # Adding M2M table for field inventory_sources on 'Host' + m2m_table_name = db.shorten_name(u'main_host_inventory_sources') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('host', models.ForeignKey(orm['main.host'], null=False)), + ('inventorysource', models.ForeignKey(orm['main.inventorysource'], null=False)) + )) + db.create_unique(m2m_table_name, ['host_id', 'inventorysource_id']) + + # Adding M2M table for field projects on 'Organization' + m2m_table_name = db.shorten_name(u'main_organization_projects') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('organization', models.ForeignKey(orm['main.organization'], null=False)), + ('project', models.ForeignKey(orm['main.project'], null=False)) + )) + db.create_unique(m2m_table_name, ['organization_id', 'project_id']) + + # Adding M2M table for field projects on 'Team' + m2m_table_name = db.shorten_name(u'main_team_projects') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('team', models.ForeignKey(orm['main.team'], null=False)), + ('project', models.ForeignKey(orm['main.project'], null=False)) + )) + db.create_unique(m2m_table_name, ['team_id', 'project_id']) + + # Adding field 'Permission.project' + db.add_column(u'main_permission', 'project', + self.gf('django.db.models.fields.related.ForeignKey')(related_name='permissions', null=True, to=orm['main.Project'], on_delete=models.SET_NULL, blank=True), + keep_default=False) + + # Adding field 'JobHostSummary.job' + db.add_column(u'main_jobhostsummary', 'job', + self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='job_host_summaries', to=orm['main.Job']), + keep_default=False) + + + # Changing field 'JobHostSummary.new_job' + db.alter_column(u'main_jobhostsummary', 'new_job_id', self.gf('django.db.models.fields.related.ForeignKey')(null=True, to=orm['main.JobNew'])) + # Adding unique constraint on 'JobHostSummary', fields ['job', 'host'] + db.create_unique(u'main_jobhostsummary', ['job_id', 'host_id']) + + # Adding M2M table for field inventory_sources on 'Group' + m2m_table_name = db.shorten_name(u'main_group_inventory_sources') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('group', models.ForeignKey(orm['main.group'], null=False)), + ('inventorysource', models.ForeignKey(orm['main.inventorysource'], null=False)) + )) + db.create_unique(m2m_table_name, ['group_id', 'inventorysource_id']) + + # Adding field 'JobEvent.job' + db.add_column(u'main_jobevent', 'job', + self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='job_events', to=orm['main.Job']), + keep_default=False) + + + # Changing field 'JobEvent.new_job' + db.alter_column(u'main_jobevent', 'new_job_id', self.gf('django.db.models.fields.related.ForeignKey')(null=True, to=orm['main.JobNew'])) + # Adding M2M table for field job_template on 'ActivityStream' + m2m_table_name = db.shorten_name(u'main_activitystream_job_template') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('activitystream', models.ForeignKey(orm['main.activitystream'], null=False)), + ('jobtemplate', models.ForeignKey(orm['main.jobtemplate'], null=False)) + )) + db.create_unique(m2m_table_name, ['activitystream_id', 'jobtemplate_id']) + + # Adding M2M table for field inventory_update on 'ActivityStream' + m2m_table_name = db.shorten_name(u'main_activitystream_inventory_update') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('activitystream', models.ForeignKey(orm['main.activitystream'], null=False)), + ('inventoryupdate', models.ForeignKey(orm['main.inventoryupdate'], null=False)) + )) + db.create_unique(m2m_table_name, ['activitystream_id', 'inventoryupdate_id']) + + # Adding M2M table for field job on 'ActivityStream' + m2m_table_name = db.shorten_name(u'main_activitystream_job') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('activitystream', models.ForeignKey(orm['main.activitystream'], null=False)), + ('job', models.ForeignKey(orm['main.job'], null=False)) + )) + db.create_unique(m2m_table_name, ['activitystream_id', 'job_id']) + + # Adding M2M table for field project_update on 'ActivityStream' + m2m_table_name = db.shorten_name(u'main_activitystream_project_update') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('activitystream', models.ForeignKey(orm['main.activitystream'], null=False)), + ('projectupdate', models.ForeignKey(orm['main.projectupdate'], null=False)) + )) + db.create_unique(m2m_table_name, ['activitystream_id', 'projectupdate_id']) + + # Adding M2M table for field inventory_source on 'ActivityStream' + m2m_table_name = db.shorten_name(u'main_activitystream_inventory_source') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('activitystream', models.ForeignKey(orm['main.activitystream'], null=False)), + ('inventorysource', models.ForeignKey(orm['main.inventorysource'], null=False)) + )) + db.create_unique(m2m_table_name, ['activitystream_id', 'inventorysource_id']) + + # Adding M2M table for field project on 'ActivityStream' + m2m_table_name = db.shorten_name(u'main_activitystream_project') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('activitystream', models.ForeignKey(orm['main.activitystream'], null=False)), + ('project', models.ForeignKey(orm['main.project'], null=False)) + )) + db.create_unique(m2m_table_name, ['activitystream_id', 'project_id']) + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'main.activitystream': { + 'Meta': {'object_name': 'ActivityStream'}, + 'actor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_stream'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'changes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'credential': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.Credential']", 'symmetrical': 'False', 'blank': 'True'}), + 'group': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'host': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.Host']", 'symmetrical': 'False', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inventory': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.Inventory']", 'symmetrical': 'False', 'blank': 'True'}), + 'new_inventory_source': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.InventorySourceNew']", 'symmetrical': 'False', 'blank': 'True'}), + 'new_inventory_update': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.InventoryUpdateNew']", 'symmetrical': 'False', 'blank': 'True'}), + 'new_job': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.JobNew']", 'symmetrical': 'False', 'blank': 'True'}), + 'new_job_template': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.JobTemplateNew']", 'symmetrical': 'False', 'blank': 'True'}), + 'new_project': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.ProjectNew']", 'symmetrical': 'False', 'blank': 'True'}), + 'new_project_update': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.ProjectUpdateNew']", 'symmetrical': 'False', 'blank': 'True'}), + 'object1': ('django.db.models.fields.TextField', [], {}), + 'object2': ('django.db.models.fields.TextField', [], {}), + 'object_relationship_type': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'operation': ('django.db.models.fields.CharField', [], {'max_length': '13'}), + 'organization': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.Organization']", 'symmetrical': 'False', 'blank': 'True'}), + 'permission': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'team': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.Team']", 'symmetrical': 'False', 'blank': 'True'}), + 'timestamp': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'unified_job': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'activity_stream_as_unified_job+'", 'blank': 'True', 'to': "orm['main.UnifiedJob']"}), + 'unified_job_template': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'activity_stream_as_unified_job_template+'", 'blank': 'True', 'to': "orm['main.UnifiedJobTemplate']"}), + 'user': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.User']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'main.authtoken': { + 'Meta': {'object_name': 'AuthToken'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'expires': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'key': ('django.db.models.fields.CharField', [], {'max_length': '40', 'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'request_hash': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '40', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'auth_tokens'", 'to': u"orm['auth.User']"}) + }, + 'main.credential': { + 'Meta': {'unique_together': "[('user', 'team', 'kind', 'name')]", 'object_name': 'Credential'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'cloud': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'credential\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'kind': ('django.db.models.fields.CharField', [], {'default': "'ssh'", 'max_length': '32'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'credential\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + 'password': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'ssh_key_data': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'ssh_key_unlock': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'sudo_password': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'sudo_username': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'team': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'credentials'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Team']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'credentials'", 'null': 'True', 'blank': 'True', 'to': u"orm['auth.User']"}), + 'username': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}) + }, + 'main.group': { + 'Meta': {'unique_together': "(('name', 'inventory'),)", 'object_name': 'Group'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'group\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'groups_with_active_failures': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'has_active_failures': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'has_inventory_sources': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'hosts': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'groups'", 'blank': 'True', 'to': "orm['main.Host']"}), + 'hosts_with_active_failures': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'groups'", 'to': "orm['main.Inventory']"}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'group\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + 'new_inventory_sources': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'groups'", 'blank': 'True', 'to': "orm['main.InventorySourceNew']"}), + 'parents': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'children'", 'blank': 'True', 'to': "orm['main.Group']"}), + 'total_groups': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'total_hosts': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'variables': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}) + }, + 'main.host': { + 'Meta': {'unique_together': "(('name', 'inventory'),)", 'object_name': 'Host'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'host\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'has_active_failures': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'has_inventory_sources': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'instance_id': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100', 'blank': 'True'}), + 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hosts'", 'to': "orm['main.Inventory']"}), + 'last_job_host_summary': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hosts_as_last_job_summary+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.JobHostSummary']", 'blank': 'True', 'null': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'host\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + 'new_inventory_sources': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'hosts'", 'blank': 'True', 'to': "orm['main.InventorySourceNew']"}), + 'new_last_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hosts_as_last_job+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.JobNew']", 'blank': 'True', 'null': 'True'}), + 'variables': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}) + }, + 'main.inventory': { + 'Meta': {'unique_together': "[('name', 'organization')]", 'object_name': 'Inventory'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'inventory\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'groups_with_active_failures': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'has_active_failures': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'has_inventory_sources': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'hosts_with_active_failures': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inventory_sources_with_failures': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'inventory\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512'}), + 'organization': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'inventories'", 'to': "orm['main.Organization']"}), + 'total_groups': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'total_hosts': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'total_inventory_sources': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'variables': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}) + }, + 'main.inventorysourcenew': { + 'Meta': {'object_name': 'InventorySourceNew', '_ormbases': ['main.UnifiedJobTemplate']}, + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'inventorysourcenews'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Credential']"}), + 'group': ('awx.main.fields.AutoOneToOneField', [], {'related_name': "'new_inventory_source'", 'null': 'True', 'default': 'None', 'to': "orm['main.Group']", 'blank': 'True', 'unique': 'True'}), + 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'new_inventory_sources'", 'null': 'True', 'to': "orm['main.Inventory']"}), + 'overwrite': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'overwrite_vars': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'source': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '32', 'blank': 'True'}), + 'source_path': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'source_regions': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'source_vars': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + u'unifiedjobtemplate_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['main.UnifiedJobTemplate']", 'unique': 'True', 'primary_key': 'True'}), + 'update_cache_timeout': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'update_on_launch': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + 'main.inventoryupdatenew': { + 'Meta': {'object_name': 'InventoryUpdateNew', '_ormbases': ['main.UnifiedJob']}, + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'inventoryupdatenews'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Credential']"}), + 'inventory_source': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'inventory_updates'", 'to': "orm['main.InventorySourceNew']"}), + 'license_error': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'overwrite': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'overwrite_vars': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'source': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '32', 'blank': 'True'}), + 'source_path': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'source_regions': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'source_vars': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + u'unifiedjob_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['main.UnifiedJob']", 'unique': 'True', 'primary_key': 'True'}) + }, + 'main.jobevent': { + 'Meta': {'ordering': "('pk',)", 'object_name': 'JobEvent'}, + 'changed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'event': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'event_data': ('jsonfield.fields.JSONField', [], {'default': '{}', 'blank': 'True'}), + 'failed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'host': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'job_events_as_primary_host'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Host']", 'blank': 'True', 'null': 'True'}), + 'hosts': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'job_events'", 'blank': 'True', 'to': "orm['main.Host']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'new_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'new_job_events'", 'to': "orm['main.JobNew']"}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'children'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.JobEvent']", 'blank': 'True', 'null': 'True'}), + 'play': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'role': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'task': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}) + }, + 'main.jobhostsummary': { + 'Meta': {'ordering': "('-pk',)", 'unique_together': "[('new_job', 'host')]", 'object_name': 'JobHostSummary'}, + 'changed': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'dark': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'failed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'failures': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'host': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'job_host_summaries'", 'to': "orm['main.Host']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'new_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'new_job_host_summaries'", 'to': "orm['main.JobNew']"}), + 'ok': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'processed': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'skipped': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) + }, + 'main.jobnew': { + 'Meta': {'object_name': 'JobNew', '_ormbases': ['main.UnifiedJob']}, + 'cloud_credential': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobnews_as_cloud_credential+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Credential']", 'blank': 'True', 'null': 'True'}), + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobnews'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Credential']", 'blank': 'True', 'null': 'True'}), + 'extra_vars': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'forks': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'}), + 'hosts': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'jobnews'", 'blank': 'True', 'through': "orm['main.JobHostSummary']", 'to': "orm['main.Host']"}), + 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobnews'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Inventory']"}), + 'job_tags': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'job_template': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobs'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.JobTemplateNew']", 'blank': 'True', 'null': 'True'}), + 'job_type': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'limit': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'playbook': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}), + 'project': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobs'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.ProjectNew']"}), + u'unifiedjob_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['main.UnifiedJob']", 'unique': 'True', 'primary_key': 'True'}), + 'verbosity': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'}) + }, + 'main.jobtemplatenew': { + 'Meta': {'object_name': 'JobTemplateNew', '_ormbases': ['main.UnifiedJobTemplate']}, + 'cloud_credential': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobtemplatenews_as_cloud_credential+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Credential']", 'blank': 'True', 'null': 'True'}), + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobtemplatenews'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Credential']", 'blank': 'True', 'null': 'True'}), + 'extra_vars': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'forks': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'}), + 'host_config_key': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobtemplatenews'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Inventory']"}), + 'job_tags': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'job_type': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'limit': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'playbook': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}), + 'project': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'job_templates'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.ProjectNew']"}), + u'unifiedjobtemplate_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['main.UnifiedJobTemplate']", 'unique': 'True', 'primary_key': 'True'}), + 'verbosity': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'}) + }, + 'main.organization': { + 'Meta': {'object_name': 'Organization'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'admins': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'admin_of_organizations'", 'blank': 'True', 'to': u"orm['auth.User']"}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'organization\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'organization\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512'}), + 'new_projects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'organizations'", 'blank': 'True', 'to': "orm['main.ProjectNew']"}), + 'users': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'organizations'", 'blank': 'True', 'to': u"orm['auth.User']"}) + }, + 'main.permission': { + 'Meta': {'object_name': 'Permission'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'permission\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'permissions'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Inventory']"}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'permission\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + 'new_project': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'permissions'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.ProjectNew']"}), + 'permission_type': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'team': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'permissions'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Team']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'permissions'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}) + }, + 'main.profile': { + 'Meta': {'object_name': 'Profile'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ldap_dn': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'user': ('awx.main.fields.AutoOneToOneField', [], {'related_name': "'profile'", 'unique': 'True', 'to': u"orm['auth.User']"}) + }, + 'main.projectnew': { + 'Meta': {'object_name': 'ProjectNew', '_ormbases': ['main.UnifiedJobTemplate']}, + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'projectnews'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Credential']"}), + 'local_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}), + 'scm_branch': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), + 'scm_clean': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_delete_on_next_update': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_delete_on_update': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_type': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '8', 'blank': 'True'}), + 'scm_update_cache_timeout': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'scm_update_on_launch': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_url': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + u'unifiedjobtemplate_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['main.UnifiedJobTemplate']", 'unique': 'True', 'primary_key': 'True'}) + }, + 'main.projectupdatenew': { + 'Meta': {'object_name': 'ProjectUpdateNew', '_ormbases': ['main.UnifiedJob']}, + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'projectupdatenews'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Credential']"}), + 'local_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}), + 'project': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'project_updates'", 'to': "orm['main.ProjectNew']"}), + 'scm_branch': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), + 'scm_clean': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_delete_on_update': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_type': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '8', 'blank': 'True'}), + 'scm_url': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + u'unifiedjob_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['main.UnifiedJob']", 'unique': 'True', 'primary_key': 'True'}) + }, + 'main.schedule': { + 'Meta': {'object_name': 'Schedule'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'schedule\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'dtend': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), + 'dtstart': ('django.db.models.fields.DateTimeField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'job_template': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'schedules'", 'to': "orm['main.UnifiedJobTemplate']"}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'schedule\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512'}), + 'rrule': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + 'main.team': { + 'Meta': {'unique_together': "[('organization', 'name')]", 'object_name': 'Team'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'team\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'team\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + 'new_projects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'teams'", 'blank': 'True', 'to': "orm['main.ProjectNew']"}), + 'organization': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'teams'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Organization']"}), + 'users': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'teams'", 'blank': 'True', 'to': u"orm['auth.User']"}) + }, + 'main.unifiedjob': { + 'Meta': {'object_name': 'UnifiedJob'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'cancel_flag': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'celery_task_id': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'unifiedjob\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'depends_on': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'depends_on_rel_+'", 'to': "orm['main.UnifiedJob']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'elapsed': ('django.db.models.fields.DecimalField', [], {'max_digits': '12', 'decimal_places': '3'}), + 'failed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'finished': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'job_args': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'job_cwd': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'job_env': ('jsonfield.fields.JSONField', [], {'default': '{}', 'blank': 'True'}), + 'launch_type': ('django.db.models.fields.CharField', [], {'default': "'manual'", 'max_length': '20'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'unifiedjob\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'old_pk': ('django.db.models.fields.PositiveIntegerField', [], {'default': 'None', 'null': 'True'}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'polymorphic_main.unifiedjob_set'", 'null': 'True', 'to': u"orm['contenttypes.ContentType']"}), + 'result_stdout_file': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'result_stdout_text': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'result_traceback': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'schedule': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['main.Schedule']", 'null': 'True'}), + 'start_args': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'started': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'new'", 'max_length': '20'}), + 'unified_job_template': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'unifiedjob_unified_jobs'", 'null': 'True', 'to': "orm['main.UnifiedJobTemplate']"}) + }, + 'main.unifiedjobtemplate': { + 'Meta': {'unique_together': "[('polymorphic_ctype', 'name')]", 'object_name': 'UnifiedJobTemplate'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'unifiedjobtemplate\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'current_job': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'unifiedjobtemplate_as_current_job+'", 'null': 'True', 'to': "orm['main.UnifiedJob']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'has_schedules': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_job': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'unifiedjobtemplate_as_last_job+'", 'null': 'True', 'to': "orm['main.UnifiedJob']"}), + 'last_job_failed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_job_run': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'unifiedjobtemplate\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + 'next_job_run': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), + 'old_pk': ('django.db.models.fields.PositiveIntegerField', [], {'default': 'None', 'null': 'True'}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'polymorphic_main.unifiedjobtemplate_set'", 'null': 'True', 'to': u"orm['contenttypes.ContentType']"}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'ok'", 'max_length': '32'}) + }, + u'taggit.tag': { + 'Meta': {'object_name': 'Tag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100'}) + }, + u'taggit.taggeditem': { + 'Meta': {'object_name': 'TaggedItem'}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'taggit_taggeditem_tagged_items'", 'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}), + 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'taggit_taggeditem_items'", 'to': u"orm['taggit.Tag']"}) + } + } + + complete_apps = ['main'] \ No newline at end of file diff --git a/awx/main/migrations/0037_v148_changes.py b/awx/main/migrations/0037_v148_changes.py new file mode 100644 index 0000000000..40cb63e232 --- /dev/null +++ b/awx/main/migrations/0037_v148_changes.py @@ -0,0 +1,475 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + ''' + Rename tables to be consistent with model names. + ''' + + def forwards(self, orm): + db.rename_table(u'main_projectnew', 'main_project') + db.rename_table(u'main_projectupdatenew', 'main_projectupdate') + db.rename_table(u'main_inventorysourcenew', 'main_inventorysource') + db.rename_table(u'main_inventoryupdatenew', 'main_inventoryupdate') + db.rename_table(u'main_jobtemplatenew', 'main_jobtemplate') + db.rename_table(u'main_jobnew', 'main_job') + + db.rename_table(db.shorten_name(u'main_team_new_projects'), db.shorten_name(u'main_team_projects')) + db.rename_table(db.shorten_name(u'main_organization_new_projects'), db.shorten_name(u'main_organization_projects')) + db.rename_column(u'main_permission', 'new_project_id', 'project_id') + + db.rename_column(u'main_host', 'new_last_job_id', 'last_job_id') + db.rename_table(db.shorten_name(u'main_host_new_inventory_sources'), db.shorten_name(u'main_host_inventory_sources')) + db.rename_table(db.shorten_name(u'main_group_new_inventory_sources'), db.shorten_name(u'main_group_inventory_sources')) + + db.rename_column(u'main_jobhostsummary', 'new_job_id', 'job_id') + db.rename_column(u'main_jobevent', 'new_job_id', 'job_id') + + db.rename_table(db.shorten_name(u'main_activitystream_new_project'), db.shorten_name(u'main_activitystream_project')) + db.rename_table(db.shorten_name(u'main_activitystream_new_project_update'), db.shorten_name(u'main_activitystream_project_update')) + db.rename_table(db.shorten_name(u'main_activitystream_new_inventory_source'), db.shorten_name(u'main_activitystream_inventory_source')) + db.rename_table(db.shorten_name(u'main_activitystream_new_inventory_update'), db.shorten_name(u'main_activitystream_inventory_update')) + db.rename_table(db.shorten_name(u'main_activitystream_new_job_template'), db.shorten_name(u'main_activitystream_job_template')) + db.rename_table(db.shorten_name(u'main_activitystream_new_job'), db.shorten_name(u'main_activitystream_job')) + + def backwards(self, orm): + db.rename_table(db.shorten_name(u'main_activitystream_job'), db.shorten_name(u'main_activitystream_new_job')) + db.rename_table(db.shorten_name(u'main_activitystream_job_template'), db.shorten_name(u'main_activitystream_new_job_template')) + db.rename_table(db.shorten_name(u'main_activitystream_inventory_update'), db.shorten_name(u'main_activitystream_new_inventory_update')) + db.rename_table(db.shorten_name(u'main_activitystream_inventory_source'), db.shorten_name(u'main_activitystream_new_inventory_source')) + db.rename_table(db.shorten_name(u'main_activitystream_project_update'), db.shorten_name(u'main_activitystream_new_project_update')) + db.rename_table(db.shorten_name(u'main_activitystream_project'), db.shorten_name(u'main_activitystream_new_project')) + + db.rename_column(u'main_jobevent', 'job_id', 'new_job_id') + db.rename_column(u'main_jobhostsummary', 'job_id', 'new_job_id') + + + db.rename_table(db.shorten_name(u'main_group_inventory_sources'), db.shorten_name(u'main_group_new_inventory_sources')) + db.rename_table(db.shorten_name(u'main_host_inventory_sources'), db.shorten_name(u'main_host_new_inventory_sources')) + db.rename_column(u'main_host', 'last_job_id', 'new_last_job_id') + + db.rename_column(u'main_permission', 'project_id', 'new_project_id') + db.rename_table(db.shorten_name(u'main_organization_projects'), db.shorten_name(u'main_organization_new_projects')) + db.rename_table(db.shorten_name(u'main_team_projects'), db.shorten_name(u'main_team_new_projects')) + + db.rename_table(u'main_job', 'main_jobnew') + db.rename_table(u'main_jobtemplate', 'main_jobtemplatenew') + db.rename_table(u'main_inventoryupdate', 'main_inventoryupdatenew') + db.rename_table(u'main_inventorysource', 'main_inventorysourcenew') + db.rename_table(u'main_projectupdate', 'main_projectupdatenew') + db.rename_table(u'main_project', 'main_projectnew') + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'main.activitystream': { + 'Meta': {'object_name': 'ActivityStream'}, + 'actor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_stream'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'changes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'credential': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.Credential']", 'symmetrical': 'False', 'blank': 'True'}), + 'group': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'host': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.Host']", 'symmetrical': 'False', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inventory': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.Inventory']", 'symmetrical': 'False', 'blank': 'True'}), + 'inventory_source': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.InventorySource']", 'symmetrical': 'False', 'blank': 'True'}), + 'inventory_update': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.InventoryUpdate']", 'symmetrical': 'False', 'blank': 'True'}), + 'job': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.Job']", 'symmetrical': 'False', 'blank': 'True'}), + 'job_template': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.JobTemplate']", 'symmetrical': 'False', 'blank': 'True'}), + 'object1': ('django.db.models.fields.TextField', [], {}), + 'object2': ('django.db.models.fields.TextField', [], {}), + 'object_relationship_type': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'operation': ('django.db.models.fields.CharField', [], {'max_length': '13'}), + 'organization': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.Organization']", 'symmetrical': 'False', 'blank': 'True'}), + 'permission': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'project': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.Project']", 'symmetrical': 'False', 'blank': 'True'}), + 'project_update': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.ProjectUpdate']", 'symmetrical': 'False', 'blank': 'True'}), + 'team': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['main.Team']", 'symmetrical': 'False', 'blank': 'True'}), + 'timestamp': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'unified_job': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'activity_stream_as_unified_job+'", 'blank': 'True', 'to': "orm['main.UnifiedJob']"}), + 'unified_job_template': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'activity_stream_as_unified_job_template+'", 'blank': 'True', 'to': "orm['main.UnifiedJobTemplate']"}), + 'user': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.User']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'main.authtoken': { + 'Meta': {'object_name': 'AuthToken'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'expires': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'key': ('django.db.models.fields.CharField', [], {'max_length': '40', 'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'request_hash': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '40', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'auth_tokens'", 'to': u"orm['auth.User']"}) + }, + 'main.credential': { + 'Meta': {'unique_together': "[('user', 'team', 'kind', 'name')]", 'object_name': 'Credential'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'cloud': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'credential\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'kind': ('django.db.models.fields.CharField', [], {'default': "'ssh'", 'max_length': '32'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'credential\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + 'password': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'ssh_key_data': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'ssh_key_unlock': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'sudo_password': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'sudo_username': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'team': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'credentials'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Team']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'credentials'", 'null': 'True', 'blank': 'True', 'to': u"orm['auth.User']"}), + 'username': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}) + }, + 'main.group': { + 'Meta': {'unique_together': "(('name', 'inventory'),)", 'object_name': 'Group'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'group\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'groups_with_active_failures': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'has_active_failures': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'has_inventory_sources': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'hosts': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'groups'", 'blank': 'True', 'to': "orm['main.Host']"}), + 'hosts_with_active_failures': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'groups'", 'to': "orm['main.Inventory']"}), + 'inventory_sources': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'groups'", 'blank': 'True', 'to': "orm['main.InventorySource']"}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'group\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + 'parents': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'children'", 'blank': 'True', 'to': "orm['main.Group']"}), + 'total_groups': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'total_hosts': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'variables': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}) + }, + 'main.host': { + 'Meta': {'unique_together': "(('name', 'inventory'),)", 'object_name': 'Host'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'host\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'has_active_failures': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'has_inventory_sources': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'instance_id': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100', 'blank': 'True'}), + 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hosts'", 'to': "orm['main.Inventory']"}), + 'inventory_sources': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'hosts'", 'blank': 'True', 'to': "orm['main.InventorySource']"}), + 'last_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hosts_as_last_job+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Job']", 'blank': 'True', 'null': 'True'}), + 'last_job_host_summary': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hosts_as_last_job_summary+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.JobHostSummary']", 'blank': 'True', 'null': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'host\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + 'variables': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}) + }, + 'main.inventory': { + 'Meta': {'unique_together': "[('name', 'organization')]", 'object_name': 'Inventory'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'inventory\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'groups_with_active_failures': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'has_active_failures': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'has_inventory_sources': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'hosts_with_active_failures': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inventory_sources_with_failures': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'inventory\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512'}), + 'organization': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'inventories'", 'to': "orm['main.Organization']"}), + 'total_groups': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'total_hosts': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'total_inventory_sources': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'variables': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}) + }, + 'main.inventorysource': { + 'Meta': {'object_name': 'InventorySource', '_ormbases': ['main.UnifiedJobTemplate']}, + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'inventorysources'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Credential']"}), + 'group': ('awx.main.fields.AutoOneToOneField', [], {'related_name': "'inventory_source'", 'null': 'True', 'default': 'None', 'to': "orm['main.Group']", 'blank': 'True', 'unique': 'True'}), + 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'inventory_sources'", 'null': 'True', 'to': "orm['main.Inventory']"}), + 'overwrite': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'overwrite_vars': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'source': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '32', 'blank': 'True'}), + 'source_path': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'source_regions': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'source_vars': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + u'unifiedjobtemplate_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['main.UnifiedJobTemplate']", 'unique': 'True', 'primary_key': 'True'}), + 'update_cache_timeout': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'update_on_launch': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + 'main.inventoryupdate': { + 'Meta': {'object_name': 'InventoryUpdate', '_ormbases': ['main.UnifiedJob']}, + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'inventoryupdates'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Credential']"}), + 'inventory_source': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'inventory_updates'", 'to': "orm['main.InventorySource']"}), + 'license_error': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'overwrite': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'overwrite_vars': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'source': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '32', 'blank': 'True'}), + 'source_path': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'source_regions': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'source_vars': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + u'unifiedjob_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['main.UnifiedJob']", 'unique': 'True', 'primary_key': 'True'}) + }, + 'main.job': { + 'Meta': {'object_name': 'Job', '_ormbases': ['main.UnifiedJob']}, + 'cloud_credential': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobs_as_cloud_credential+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Credential']", 'blank': 'True', 'null': 'True'}), + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobs'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Credential']", 'blank': 'True', 'null': 'True'}), + 'extra_vars': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'forks': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'}), + 'hosts': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'jobs'", 'blank': 'True', 'through': "orm['main.JobHostSummary']", 'to': "orm['main.Host']"}), + 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobs'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Inventory']"}), + 'job_tags': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'job_template': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobs'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.JobTemplate']", 'blank': 'True', 'null': 'True'}), + 'job_type': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'limit': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'playbook': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}), + 'project': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobs'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Project']"}), + u'unifiedjob_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['main.UnifiedJob']", 'unique': 'True', 'primary_key': 'True'}), + 'verbosity': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'}) + }, + 'main.jobevent': { + 'Meta': {'ordering': "('pk',)", 'object_name': 'JobEvent'}, + 'changed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'event': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'event_data': ('jsonfield.fields.JSONField', [], {'default': '{}', 'blank': 'True'}), + 'failed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'host': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'job_events_as_primary_host'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Host']", 'blank': 'True', 'null': 'True'}), + 'hosts': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'job_events'", 'blank': 'True', 'to': "orm['main.Host']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'job_events'", 'to': "orm['main.Job']"}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'children'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.JobEvent']", 'blank': 'True', 'null': 'True'}), + 'play': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'role': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'task': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}) + }, + 'main.jobhostsummary': { + 'Meta': {'ordering': "('-pk',)", 'unique_together': "[('job', 'host')]", 'object_name': 'JobHostSummary'}, + 'changed': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'dark': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'failed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'failures': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'host': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'job_host_summaries'", 'to': "orm['main.Host']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'job_host_summaries'", 'to': "orm['main.Job']"}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'ok': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'processed': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'skipped': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) + }, + 'main.jobtemplate': { + 'Meta': {'object_name': 'JobTemplate', '_ormbases': ['main.UnifiedJobTemplate']}, + 'cloud_credential': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobtemplates_as_cloud_credential+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Credential']", 'blank': 'True', 'null': 'True'}), + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobtemplates'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['main.Credential']", 'blank': 'True', 'null': 'True'}), + 'extra_vars': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'forks': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'}), + 'host_config_key': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jobtemplates'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Inventory']"}), + 'job_tags': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'job_type': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'limit': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'playbook': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}), + 'project': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'job_templates'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Project']"}), + u'unifiedjobtemplate_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['main.UnifiedJobTemplate']", 'unique': 'True', 'primary_key': 'True'}), + 'verbosity': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'}) + }, + 'main.organization': { + 'Meta': {'object_name': 'Organization'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'admins': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'admin_of_organizations'", 'blank': 'True', 'to': u"orm['auth.User']"}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'organization\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'organization\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512'}), + 'projects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'organizations'", 'blank': 'True', 'to': "orm['main.Project']"}), + 'users': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'organizations'", 'blank': 'True', 'to': u"orm['auth.User']"}) + }, + 'main.permission': { + 'Meta': {'object_name': 'Permission'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'permission\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'permissions'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Inventory']"}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'permission\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + 'permission_type': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'project': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'permissions'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Project']"}), + 'team': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'permissions'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Team']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'permissions'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}) + }, + 'main.profile': { + 'Meta': {'object_name': 'Profile'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ldap_dn': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'user': ('awx.main.fields.AutoOneToOneField', [], {'related_name': "'profile'", 'unique': 'True', 'to': u"orm['auth.User']"}) + }, + 'main.project': { + 'Meta': {'object_name': 'Project', '_ormbases': ['main.UnifiedJobTemplate']}, + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'projects'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Credential']"}), + 'local_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}), + 'scm_branch': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), + 'scm_clean': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_delete_on_next_update': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_delete_on_update': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_type': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '8', 'blank': 'True'}), + 'scm_update_cache_timeout': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'scm_update_on_launch': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_url': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + u'unifiedjobtemplate_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['main.UnifiedJobTemplate']", 'unique': 'True', 'primary_key': 'True'}) + }, + 'main.projectupdate': { + 'Meta': {'object_name': 'ProjectUpdate', '_ormbases': ['main.UnifiedJob']}, + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'projectupdates'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Credential']"}), + 'local_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}), + 'project': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'project_updates'", 'to': "orm['main.Project']"}), + 'scm_branch': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), + 'scm_clean': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_delete_on_update': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'scm_type': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '8', 'blank': 'True'}), + 'scm_url': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + u'unifiedjob_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['main.UnifiedJob']", 'unique': 'True', 'primary_key': 'True'}) + }, + 'main.schedule': { + 'Meta': {'object_name': 'Schedule'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'schedule\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'dtend': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), + 'dtstart': ('django.db.models.fields.DateTimeField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'job_template': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'schedules'", 'to': "orm['main.UnifiedJobTemplate']"}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'schedule\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512'}), + 'rrule': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + 'main.team': { + 'Meta': {'unique_together': "[('organization', 'name')]", 'object_name': 'Team'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'team\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'team\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + 'organization': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'teams'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['main.Organization']"}), + 'projects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'teams'", 'blank': 'True', 'to': "orm['main.Project']"}), + 'users': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'teams'", 'blank': 'True', 'to': u"orm['auth.User']"}) + }, + 'main.unifiedjob': { + 'Meta': {'object_name': 'UnifiedJob'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'cancel_flag': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'celery_task_id': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'unifiedjob\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'depends_on': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'depends_on_rel_+'", 'to': "orm['main.UnifiedJob']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'elapsed': ('django.db.models.fields.DecimalField', [], {'max_digits': '12', 'decimal_places': '3'}), + 'failed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'finished': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'job_args': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'job_cwd': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}), + 'job_env': ('jsonfield.fields.JSONField', [], {'default': '{}', 'blank': 'True'}), + 'launch_type': ('django.db.models.fields.CharField', [], {'default': "'manual'", 'max_length': '20'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'unifiedjob\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'old_pk': ('django.db.models.fields.PositiveIntegerField', [], {'default': 'None', 'null': 'True'}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'polymorphic_main.unifiedjob_set'", 'null': 'True', 'to': u"orm['contenttypes.ContentType']"}), + 'result_stdout_file': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'result_stdout_text': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'result_traceback': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'schedule': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['main.Schedule']", 'null': 'True'}), + 'start_args': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'started': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'new'", 'max_length': '20'}), + 'unified_job_template': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'unifiedjob_unified_jobs'", 'null': 'True', 'to': "orm['main.UnifiedJobTemplate']"}) + }, + 'main.unifiedjobtemplate': { + 'Meta': {'unique_together': "[('polymorphic_ctype', 'name')]", 'object_name': 'UnifiedJobTemplate'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'unifiedjobtemplate\', \'app_label\': \'main\'}(class)s_created+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'current_job': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'unifiedjobtemplate_as_current_job+'", 'null': 'True', 'to': "orm['main.UnifiedJob']"}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'has_schedules': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_job': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'unifiedjobtemplate_as_last_job+'", 'null': 'True', 'to': "orm['main.UnifiedJob']"}), + 'last_job_failed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_job_run': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': '"{\'class\': \'unifiedjobtemplate\', \'app_label\': \'main\'}(class)s_modified+"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + 'next_job_run': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), + 'old_pk': ('django.db.models.fields.PositiveIntegerField', [], {'default': 'None', 'null': 'True'}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'polymorphic_main.unifiedjobtemplate_set'", 'null': 'True', 'to': u"orm['contenttypes.ContentType']"}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'ok'", 'max_length': '32'}) + }, + u'taggit.tag': { + 'Meta': {'object_name': 'Tag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100'}) + }, + u'taggit.taggeditem': { + 'Meta': {'object_name': 'TaggedItem'}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'taggit_taggeditem_tagged_items'", 'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}), + 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'taggit_taggeditem_items'", 'to': u"orm['taggit.Tag']"}) + } + } + + complete_apps = ['main'] \ No newline at end of file diff --git a/awx/main/models/__init__.py b/awx/main/models/__init__.py index 21c5b96948..f5f73c82eb 100644 --- a/awx/main/models/__init__.py +++ b/awx/main/models/__init__.py @@ -1,48 +1,55 @@ # Copyright (c) 2014 AnsibleWorks, Inc. # All Rights Reserved. +# Django +from django.conf import settings + +# AWX from awx.main.models.base import * +from awx.main.models.unified_jobs import * from awx.main.models.organization import * from awx.main.models.projects import * from awx.main.models.inventory import * from awx.main.models.jobs import * +from awx.main.models.schedules import * from awx.main.models.activity_stream import * -# Monkeypatch Django serializer to ignore django-taggit fields (which break -# the dumpdata command; see https://github.com/alex/django-taggit/issues/155). -from django.core.serializers.python import Serializer as _PythonSerializer -_original_handle_m2m_field = _PythonSerializer.handle_m2m_field -def _new_handle_m2m_field(self, obj, field): - try: - field.rel.through._meta - except AttributeError: - return - return _original_handle_m2m_field(self, obj, field) -_PythonSerializer.handle_m2m_field = _new_handle_m2m_field +if getattr(settings, 'UNIFIED_JOBS_STEP') in (0, 2): + # Monkeypatch Django serializer to ignore django-taggit fields (which break + # the dumpdata command; see https://github.com/alex/django-taggit/issues/155). + from django.core.serializers.python import Serializer as _PythonSerializer + _original_handle_m2m_field = _PythonSerializer.handle_m2m_field + def _new_handle_m2m_field(self, obj, field): + try: + field.rel.through._meta + except AttributeError: + return + return _original_handle_m2m_field(self, obj, field) + _PythonSerializer.handle_m2m_field = _new_handle_m2m_field -# Add custom methods to User model for permissions checks. -from django.contrib.auth.models import User -from awx.main.access import * -User.add_to_class('get_queryset', get_user_queryset) -User.add_to_class('can_access', check_user_access) + # Add custom methods to User model for permissions checks. + from django.contrib.auth.models import User + from awx.main.access import * + User.add_to_class('get_queryset', get_user_queryset) + User.add_to_class('can_access', check_user_access) -# Import signal handlers only after models have been defined. -import awx.main.signals + # Import signal handlers only after models have been defined. + import awx.main.signals -from awx.main.registrar import activity_stream_registrar -activity_stream_registrar.connect(Organization) -activity_stream_registrar.connect(Inventory) -activity_stream_registrar.connect(Host) -activity_stream_registrar.connect(Group) -activity_stream_registrar.connect(InventorySource) -#activity_stream_registrar.connect(InventoryUpdate) -activity_stream_registrar.connect(Credential) -activity_stream_registrar.connect(Team) -activity_stream_registrar.connect(Project) -#activity_stream_registrar.connect(ProjectUpdate) -activity_stream_registrar.connect(Permission) -activity_stream_registrar.connect(JobTemplate) -activity_stream_registrar.connect(Job) -# activity_stream_registrar.connect(JobHostSummary) -# activity_stream_registrar.connect(JobEvent) -#activity_stream_registrar.connect(Profile) + from awx.main.registrar import activity_stream_registrar + activity_stream_registrar.connect(Organization) + activity_stream_registrar.connect(Inventory) + activity_stream_registrar.connect(Host) + activity_stream_registrar.connect(Group) + activity_stream_registrar.connect(InventorySource) + #activity_stream_registrar.connect(InventoryUpdate) + activity_stream_registrar.connect(Credential) + activity_stream_registrar.connect(Team) + activity_stream_registrar.connect(Project) + #activity_stream_registrar.connect(ProjectUpdate) + activity_stream_registrar.connect(Permission) + activity_stream_registrar.connect(JobTemplate) + activity_stream_registrar.connect(Job) + # activity_stream_registrar.connect(JobHostSummary) + # activity_stream_registrar.connect(JobEvent) + #activity_stream_registrar.connect(Profile) diff --git a/awx/main/models/activity_stream.py b/awx/main/models/activity_stream.py index a41f14f0d1..d25b2220fc 100644 --- a/awx/main/models/activity_stream.py +++ b/awx/main/models/activity_stream.py @@ -1,7 +1,8 @@ # Copyright (c) 2014 AnsibleWorks, Inc. # All Rights Reserved. - +# Django +from django.conf import settings from django.db import models from django.core.urlresolvers import reverse from django.utils.translation import ugettext_lazy as _ @@ -9,12 +10,13 @@ from django.utils.translation import ugettext_lazy as _ __all__ = ['ActivityStream'] -class ActivityStream(models.Model): +class ActivityStreamBase(models.Model): ''' Model used to describe activity stream (audit) events ''' class Meta: + abstract = True app_label = 'main' OPERATION_CHOICES = [ @@ -39,15 +41,15 @@ class ActivityStream(models.Model): inventory = models.ManyToManyField("Inventory", blank=True) host = models.ManyToManyField("Host", blank=True) group = models.ManyToManyField("Group", blank=True) - inventory_source = models.ManyToManyField("InventorySource", blank=True) - inventory_update = models.ManyToManyField("InventoryUpdate", blank=True) + #inventory_source = models.ManyToManyField("InventorySource", blank=True) + #inventory_update = models.ManyToManyField("InventoryUpdate", blank=True) credential = models.ManyToManyField("Credential", blank=True) team = models.ManyToManyField("Team", blank=True) - project = models.ManyToManyField("Project", blank=True) - project_update = models.ManyToManyField("ProjectUpdate", blank=True) + #project = models.ManyToManyField("Project", blank=True) + #project_update = models.ManyToManyField("ProjectUpdate", blank=True) permission = models.ManyToManyField("Permission", blank=True) - job_template = models.ManyToManyField("JobTemplate", blank=True) - job = models.ManyToManyField("Job", blank=True) + #job_template = models.ManyToManyField("JobTemplate", blank=True) + #job = models.ManyToManyField("Job", blank=True) def get_absolute_url(self): return reverse('api:activity_stream_detail', args=(self.pk,)) @@ -62,3 +64,62 @@ class ActivityStream(models.Model): raise kwargs.pop('update_fields') super(ActivityStream, self).save(*args, **kwargs) + + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 0: + + class ActivityStream(ActivityStreamBase): + + class Meta: + app_label = 'main' + + inventory_source = models.ManyToManyField("InventorySource", blank=True) + inventory_update = models.ManyToManyField("InventoryUpdate", blank=True) + project = models.ManyToManyField("Project", blank=True) + project_update = models.ManyToManyField("ProjectUpdate", blank=True) + job_template = models.ManyToManyField("JobTemplate", blank=True) + job = models.ManyToManyField("Job", blank=True) + + unified_job_template = models.ManyToManyField("UnifiedJobTemplate", blank=True, related_name='activity_stream_as_unified_job_template+') + unified_job = models.ManyToManyField("UnifiedJob", blank=True, related_name='activity_stream_as_unified_job+') + + new_inventory_source = models.ManyToManyField("InventorySourceNew", blank=True) + new_inventory_update = models.ManyToManyField("InventoryUpdateNew", blank=True) + new_project = models.ManyToManyField("ProjectNew", blank=True) + new_project_update = models.ManyToManyField("ProjectUpdateNew", blank=True) + new_job_template = models.ManyToManyField("JobTemplateNew", blank=True) + new_job = models.ManyToManyField("JobNew", blank=True) + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 1: + + class ActivityStream(ActivityStreamBase): + + class Meta: + app_label = 'main' + + unified_job_template = models.ManyToManyField("UnifiedJobTemplate", blank=True, related_name='activity_stream_as_unified_job_template+') + unified_job = models.ManyToManyField("UnifiedJob", blank=True, related_name='activity_stream_as_unified_job+') + + new_inventory_source = models.ManyToManyField("InventorySourceNew", blank=True) + new_inventory_update = models.ManyToManyField("InventoryUpdateNew", blank=True) + new_project = models.ManyToManyField("ProjectNew", blank=True) + new_project_update = models.ManyToManyField("ProjectUpdateNew", blank=True) + new_job_template = models.ManyToManyField("JobTemplateNew", blank=True) + new_job = models.ManyToManyField("JobNew", blank=True) + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 2: + + class ActivityStream(ActivityStreamBase): + + class Meta: + app_label = 'main' + + unified_job_template = models.ManyToManyField("UnifiedJobTemplate", blank=True, related_name='activity_stream_as_unified_job_template+') + unified_job = models.ManyToManyField("UnifiedJob", blank=True, related_name='activity_stream_as_unified_job+') + + inventory_source = models.ManyToManyField("InventorySource", blank=True) + inventory_update = models.ManyToManyField("InventoryUpdate", blank=True) + project = models.ManyToManyField("Project", blank=True) + project_update = models.ManyToManyField("ProjectUpdate", blank=True) + job_template = models.ManyToManyField("JobTemplate", blank=True) + job = models.ManyToManyField("Job", blank=True) diff --git a/awx/main/models/base.py b/awx/main/models/base.py index d4a700c388..c9d81c6ec9 100644 --- a/awx/main/models/base.py +++ b/awx/main/models/base.py @@ -15,19 +15,23 @@ from django.conf import settings from django.db import models from django.db import transaction from django.core.exceptions import ValidationError +from django.contrib.contenttypes.models import ContentType from django.utils.translation import ugettext_lazy as _ from django.utils.timezone import now # Django-JSONField from jsonfield import JSONField +# Django-Polymorphic +from polymorphic import PolymorphicModel + # Django-Taggit from taggit.managers import TaggableManager # Django-Celery from djcelery.models import TaskMeta -__all__ = ['VarsDictProperty', 'BaseModel', 'PrimordialModel', 'CommonModel', +__all__ = ['VarsDictProperty', 'BaseModel', 'CreatedModifiedModel', 'PrimordialModel', 'CommonModel', 'CommonModelNameNotUnique', 'CommonTask', 'PERM_INVENTORY_ADMIN', 'PERM_INVENTORY_READ', 'PERM_INVENTORY_WRITE', 'PERM_INVENTORY_DEPLOY', 'PERM_INVENTORY_CHECK', 'JOB_TYPE_CHOICES', @@ -150,7 +154,37 @@ class BaseModel(models.Model): super(BaseModel, self).save(*args, **kwargs) -class PrimordialModel(BaseModel): +class CreatedModifiedModel(BaseModel): + + class Meta: + abstract = True + + created = models.DateTimeField( + #auto_now_add=True, # FIXME: Disabled temporarily for data migration. + default=None, + editable=False, + ) + modified = models.DateTimeField( + #auto_now=True, # FIXME: Disabled temporarily for data migration. + #default=now, + default=None, + editable=False, + ) + + def save(self, *args, **kwargs): + update_fields = kwargs.get('update_fields', []) + # Manually perform auto_now_add and auto_now logic (for unified jobs migration). + if not self.pk and not self.created: + self.created = now() + if 'created' not in update_fields: + update_fields.append('created') + if 'modified' not in update_fields or not self.modified: + self.modified = now() # FIXME: Moved temporarily for unified jobs migration. + update_fields.append('modified') + super(CreatedModifiedModel, self).save(*args, **kwargs) + + +class PrimordialModel(CreatedModifiedModel): ''' common model for all object types that have these standard fields must use a subclass CommonModel or CommonModelNameNotUnique though @@ -164,13 +198,6 @@ class PrimordialModel(BaseModel): blank=True, default='', ) - created = models.DateTimeField( - auto_now_add=True, - ) - modified = models.DateTimeField( - auto_now=True, - default=now, - ) created_by = models.ForeignKey( 'auth.User', related_name='%s(class)s_created+', @@ -198,8 +225,9 @@ class PrimordialModel(BaseModel): '''Use instead of delete to rename and mark inactive.''' update_fields = update_fields or [] if self.active: + dtnow = now() if 'name' in self._meta.get_all_field_names(): - self.name = "_deleted_%s_%s" % (now().isoformat(), self.name) + self.name = "_deleted_%s_%s" % (dtnow.isoformat(), self.name) if 'name' not in update_fields: update_fields.append('name') self.active = False @@ -238,226 +266,234 @@ class CommonModelNameNotUnique(PrimordialModel): ) -class CommonTask(PrimordialModel): - ''' - Common fields for models run by the task engine. - ''' +if getattr(settings, 'UNIFIED_JOBS_STEP') == 0: - class Meta: - app_label = 'main' - abstract = True + class CommonTask(PrimordialModel): + ''' + Common fields for models run by the task engine. + ''' - cancel_flag = models.BooleanField( - blank=True, - default=False, - editable=False, - ) - status = models.CharField( - max_length=20, - choices=TASK_STATUS_CHOICES, - default='new', - editable=False, - ) - failed = models.BooleanField( - default=False, - editable=False, - ) - job_args = models.TextField( - blank=True, - default='', - editable=False, - ) - job_cwd = models.CharField( - max_length=1024, - blank=True, - default='', - editable=False, - ) - job_env = JSONField( - blank=True, - default={}, - editable=False, - ) - start_args = models.TextField( - blank=True, - default='', - editable=False, - ) - _result_stdout = models.TextField( - blank=True, - default='', - editable=False, - db_column="result_stdout", - ) - result_stdout_file = models.TextField( - blank=True, - default='', - editable=False, - ) - result_traceback = models.TextField( - blank=True, - default='', - editable=False, - ) - celery_task_id = models.CharField( - max_length=100, - blank=True, - default='', - editable=False, - ) + class Meta: + app_label = 'main' + abstract = True - def __unicode__(self): - return u'%s-%s-%s' % (self.created, self.id, self.status) + cancel_flag = models.BooleanField( + blank=True, + default=False, + editable=False, + ) + status = models.CharField( + max_length=20, + choices=TASK_STATUS_CHOICES, + default='new', + editable=False, + ) + failed = models.BooleanField( + default=False, + editable=False, + ) + job_args = models.TextField( + blank=True, + default='', + editable=False, + ) + job_cwd = models.CharField( + max_length=1024, + blank=True, + default='', + editable=False, + ) + job_env = JSONField( + blank=True, + default={}, + editable=False, + ) + start_args = models.TextField( + blank=True, + default='', + editable=False, + ) + _result_stdout = models.TextField( + blank=True, + default='', + editable=False, + db_column="result_stdout", + ) + result_stdout_file = models.TextField( + blank=True, + default='', + editable=False, + ) + result_traceback = models.TextField( + blank=True, + default='', + editable=False, + ) + celery_task_id = models.CharField( + max_length=100, + blank=True, + default='', + editable=False, + ) - def _get_parent_instance(self): - return None + def __unicode__(self): + return u'%s-%s-%s' % (self.created, self.id, self.status) - def _update_parent_instance(self): - parent_instance = self._get_parent_instance() - if parent_instance: - if self.status in ('pending', 'waiting', 'running'): - if parent_instance.current_update != self: - parent_instance.current_update = self - parent_instance.save(update_fields=['current_update']) - elif self.status in ('successful', 'failed', 'error', 'canceled'): - if parent_instance.current_update == self: - parent_instance.current_update = None - parent_instance.last_update = self - parent_instance.last_update_failed = self.failed - parent_instance.save(update_fields=['current_update', - 'last_update', - 'last_update_failed']) + def _get_parent_instance(self): + return None - def save(self, *args, **kwargs): - # Get status before save... - status_before = self.status or 'new' - if self.pk: - self_before = self.__class__.objects.get(pk=self.pk) - if self_before.status != self.status: - status_before = self_before.status - self.failed = bool(self.status in ('failed', 'error', 'canceled')) - super(CommonTask, self).save(*args, **kwargs) - # If status changed, update parent instance.... - if self.status != status_before: - self._update_parent_instance() + def _update_parent_instance(self): + parent_instance = self._get_parent_instance() + if parent_instance: + if self.status in ('pending', 'waiting', 'running'): + if parent_instance.current_update != self: + parent_instance.current_update = self + parent_instance.save(update_fields=['current_update']) + elif self.status in ('successful', 'failed', 'error', 'canceled'): + if parent_instance.current_update == self: + parent_instance.current_update = None + parent_instance.last_update = self + parent_instance.last_update_failed = self.failed + parent_instance.save(update_fields=['current_update', + 'last_update', + 'last_update_failed']) - def delete(self): - if self.result_stdout_file != "": + def save(self, *args, **kwargs): + # Get status before save... + status_before = self.status or 'new' + if self.pk: + self_before = self.__class__.objects.get(pk=self.pk) + if self_before.status != self.status: + status_before = self_before.status + self.failed = bool(self.status in ('failed', 'error', 'canceled')) + super(CommonTask, self).save(*args, **kwargs) + # If status changed, update parent instance.... + if self.status != status_before: + self._update_parent_instance() + + def delete(self): + if self.result_stdout_file != "": + try: + os.remove(self.result_stdout_file) + except Exception, e: + pass + super(CommonTask, self).delete() + + @property + def result_stdout(self): + if self.result_stdout_file != "": + if not os.path.exists(self.result_stdout_file): + return "stdout capture is missing" + stdout_fd = open(self.result_stdout_file, "r") + output = stdout_fd.read() + stdout_fd.close() + return output + return self._result_stdout + + @property + def celery_task(self): try: - os.remove(self.result_stdout_file) - except Exception, e: + if self.celery_task_id: + return TaskMeta.objects.get(task_id=self.celery_task_id) + except TaskMeta.DoesNotExist: pass - super(CommonTask, self).delete() - @property - def result_stdout(self): - if self.result_stdout_file != "": - if not os.path.exists(self.result_stdout_file): - return "stdout capture is missing" - stdout_fd = open(self.result_stdout_file, "r") - output = stdout_fd.read() - stdout_fd.close() - return output - return self._result_stdout + @property + def can_start(self): + return bool(self.status in ('new', 'waiting')) - @property - def celery_task(self): - try: - if self.celery_task_id: - return TaskMeta.objects.get(task_id=self.celery_task_id) - except TaskMeta.DoesNotExist: - pass + @property + def task_impact(self): + raise NotImplementedError - @property - def can_start(self): - return bool(self.status in ('new', 'waiting')) + def _get_task_class(self): + raise NotImplementedError - @property - def task_impact(self): - raise NotImplementedError + def _get_passwords_needed_to_start(self): + return [] - def _get_task_class(self): - raise NotImplementedError + def is_blocked_by(self, task_object): + ''' Given another task object determine if this task would be blocked by it ''' + raise NotImplementedError - def _get_passwords_needed_to_start(self): - return [] + def generate_dependencies(self, active_tasks): + ''' Generate any tasks that the current task might be dependent on given a list of active + tasks that might preclude creating one''' + return [] - def is_blocked_by(self, task_object): - ''' Given another task object determine if this task would be blocked by it ''' - raise NotImplementedError + def signal_start(self): + ''' Notify the task runner system to begin work on this task ''' + raise NotImplementedError - def generate_dependencies(self, active_tasks): - ''' Generate any tasks that the current task might be dependent on given a list of active - tasks that might preclude creating one''' - return [] + def start(self, error_callback, **kwargs): + task_class = self._get_task_class() + if not self.status == 'waiting': + return False + needed = self._get_passwords_needed_to_start() + try: + stored_args = json.loads(decrypt_field(self, 'start_args')) + except Exception, e: + stored_args = None + if stored_args is None or stored_args == '': + opts = dict([(field, kwargs.get(field, '')) for field in needed]) + else: + opts = dict([(field, stored_args.get(field, '')) for field in needed]) + if not all(opts.values()): + return False + task_class().apply_async((self.pk,), opts, link_error=error_callback) + return True - def signal_start(self): - ''' Notify the task runner system to begin work on this task ''' - raise NotImplementedError + @property + def can_cancel(self): + return bool(self.status in ('pending', 'waiting', 'running')) - def start(self, error_callback, **kwargs): - task_class = self._get_task_class() - if not self.status == 'waiting': - return False - needed = self._get_passwords_needed_to_start() - try: - stored_args = json.loads(decrypt_field(self, 'start_args')) - except Exception, e: - stored_args = None - if stored_args is None or stored_args == '': - opts = dict([(field, kwargs.get(field, '')) for field in needed]) - else: - opts = dict([(field, stored_args.get(field, '')) for field in needed]) - if not all(opts.values()): - return False - task_class().apply_async((self.pk,), opts, link_error=error_callback) - return True - - @property - def can_cancel(self): - return bool(self.status in ('pending', 'waiting', 'running')) - - def _force_cancel(self): - # Update the status to 'canceled' if we can detect that the job - # really isn't running (i.e. celery has crashed or forcefully - # killed the worker). - task_statuses = ('STARTED', 'SUCCESS', 'FAILED', 'RETRY', 'REVOKED') - try: - taskmeta = self.celery_task - if not taskmeta or taskmeta.status not in task_statuses: - return - from celery import current_app - i = current_app.control.inspect() - for v in (i.active() or {}).values(): - if taskmeta.task_id in [x['id'] for x in v]: + def _force_cancel(self): + # Update the status to 'canceled' if we can detect that the job + # really isn't running (i.e. celery has crashed or forcefully + # killed the worker). + task_statuses = ('STARTED', 'SUCCESS', 'FAILED', 'RETRY', 'REVOKED') + try: + taskmeta = self.celery_task + if not taskmeta or taskmeta.status not in task_statuses: return - for v in (i.reserved() or {}).values(): - if taskmeta.task_id in [x['id'] for x in v]: - return - for v in (i.revoked() or {}).values(): - if taskmeta.task_id in [x['id'] for x in v]: - return - for v in (i.scheduled() or {}).values(): - if taskmeta.task_id in [x['id'] for x in v]: - return - instance = self.__class__.objects.get(pk=self.pk) - if instance.can_cancel: - instance.status = 'canceled' - update_fields = ['status'] - if not instance.result_traceback: - instance.result_traceback = 'Forced cancel' - update_fields.append('result_traceback') - instance.save(update_fields=update_fields) - except: # FIXME: Log this exception! - if settings.DEBUG: - raise + from celery import current_app + i = current_app.control.inspect() + for v in (i.active() or {}).values(): + if taskmeta.task_id in [x['id'] for x in v]: + return + for v in (i.reserved() or {}).values(): + if taskmeta.task_id in [x['id'] for x in v]: + return + for v in (i.revoked() or {}).values(): + if taskmeta.task_id in [x['id'] for x in v]: + return + for v in (i.scheduled() or {}).values(): + if taskmeta.task_id in [x['id'] for x in v]: + return + instance = self.__class__.objects.get(pk=self.pk) + if instance.can_cancel: + instance.status = 'canceled' + update_fields = ['status'] + if not instance.result_traceback: + instance.result_traceback = 'Forced cancel' + update_fields.append('result_traceback') + instance.save(update_fields=update_fields) + except: # FIXME: Log this exception! + if settings.DEBUG: + raise - def cancel(self): - if self.can_cancel: - if not self.cancel_flag: - self.cancel_flag = True - self.save(update_fields=['cancel_flag']) - if settings.BROKER_URL.startswith('amqp://'): - self._force_cancel() - return self.cancel_flag + def cancel(self): + if self.can_cancel: + if not self.cancel_flag: + self.cancel_flag = True + self.save(update_fields=['cancel_flag']) + if settings.BROKER_URL.startswith('amqp://'): + self._force_cancel() + return self.cancel_flag +else: + + class CommonTask(PrimordialModel): + + class Meta: + abstract = True diff --git a/awx/main/models/inventory.py b/awx/main/models/inventory.py index b5bc77aea1..99c59a87ef 100644 --- a/awx/main/models/inventory.py +++ b/awx/main/models/inventory.py @@ -31,6 +31,7 @@ from django.utils.timezone import now, make_aware, get_default_timezone # AWX from awx.main.fields import AutoOneToOneField from awx.main.models.base import * +from awx.main.models.unified_jobs import * from awx.main.utils import encrypt_field __all__ = ['Inventory', 'Host', 'Group', 'InventorySource', 'InventoryUpdate'] @@ -157,12 +158,13 @@ class Inventory(CommonModel): return self.groups.exclude(parents__pk__in=group_pks).distinct() -class Host(CommonModelNameNotUnique): +class HostBase(CommonModelNameNotUnique): ''' A managed node ''' class Meta: + abstract = True app_label = 'main' unique_together = (("name", "inventory"),) # FIXME: Add ('instance_id', 'inventory') after migration. @@ -184,15 +186,15 @@ class Host(CommonModelNameNotUnique): default='', help_text=_('Host variables in JSON or YAML format.'), ) - last_job = models.ForeignKey( - 'Job', - related_name='hosts_as_last_job+', - blank=True, - null=True, - default=None, - editable=False, - on_delete=models.SET_NULL, - ) + #last_job = models.ForeignKey( + # 'Job', + # related_name='hosts_as_last_job+', + # blank=True, + # null=True, + # default=None, + # editable=False, + # on_delete=models.SET_NULL, + #) last_job_host_summary = models.ForeignKey( 'JobHostSummary', related_name='hosts_as_last_job_summary+', @@ -212,13 +214,13 @@ class Host(CommonModelNameNotUnique): editable=False, help_text=_('Flag indicating whether this host was created/updated from any external inventory sources.'), ) - inventory_sources = models.ManyToManyField( - 'InventorySource', - related_name='hosts', - blank=True, - editable=False, - help_text=_('Inventory source(s) that created or modified this host.'), - ) + #inventory_sources = models.ManyToManyField( + # 'InventorySource', + # related_name='hosts', + # blank=True, + # editable=False, + # help_text=_('Inventory source(s) that created or modified this host.'), + #) def __unicode__(self): return self.name @@ -280,13 +282,106 @@ class Host(CommonModelNameNotUnique): # Use .job_events.all() to get events affecting this host. -class Group(CommonModelNameNotUnique): +if getattr(settings, 'UNIFIED_JOBS_STEP') == 0: + + class Host(HostBase): + + class Meta: + app_label = 'main' + unique_together = (("name", "inventory"),) + + last_job = models.ForeignKey( + 'Job', + related_name='hosts_as_last_job+', + blank=True, + null=True, + default=None, + editable=False, + on_delete=models.SET_NULL, + ) + new_last_job = models.ForeignKey( + 'JobNew', + related_name='hosts_as_last_job+', + blank=True, + null=True, + default=None, + editable=False, + on_delete=models.SET_NULL, + ) + inventory_sources = models.ManyToManyField( + 'InventorySource', + related_name='hosts', + blank=True, + editable=False, + help_text=_('Inventory source(s) that created or modified this host.'), + ) + new_inventory_sources = models.ManyToManyField( + 'InventorySourceNew', + related_name='hosts', + blank=True, + editable=False, + help_text=_('Inventory source(s) that created or modified this host.'), + ) + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 1: + + class Host(HostBase): + + class Meta: + app_label = 'main' + unique_together = (("name", "inventory"),) + + new_last_job = models.ForeignKey( + 'JobNew', + related_name='hosts_as_last_job+', + blank=True, + null=True, + default=None, + editable=False, + on_delete=models.SET_NULL, + ) + new_inventory_sources = models.ManyToManyField( + 'InventorySourceNew', + related_name='hosts', + blank=True, + editable=False, + help_text=_('Inventory source(s) that created or modified this host.'), + ) + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 2: + + class Host(HostBase): + + class Meta: + app_label = 'main' + unique_together = (("name", "inventory"),) + + last_job = models.ForeignKey( + 'Job', + related_name='hosts_as_last_job+', + blank=True, + null=True, + default=None, + editable=False, + on_delete=models.SET_NULL, + ) + inventory_sources = models.ManyToManyField( + 'InventorySource', + related_name='hosts', + blank=True, + editable=False, + help_text=_('Inventory source(s) that created or modified this host.'), + ) + + +class GroupBase(CommonModelNameNotUnique): ''' A group containing managed hosts. A group or host may belong to multiple groups. ''' class Meta: + abstract = True app_label = 'main' unique_together = (("name", "inventory"),) @@ -342,13 +437,13 @@ class Group(CommonModelNameNotUnique): editable=False, help_text=_('Flag indicating whether this group was created/updated from any external inventory sources.'), ) - inventory_sources = models.ManyToManyField( - 'InventorySource', - related_name='groups', - blank=True, - editable=False, - help_text=_('Inventory source(s) that created or modified this group.'), - ) + #inventory_sources = models.ManyToManyField( + # 'InventorySource', + # related_name='groups', + # blank=True, + # editable=False, + # help_text=_('Inventory source(s) that created or modified this group.'), + #) def __unicode__(self): return self.name @@ -468,7 +563,68 @@ class Group(CommonModelNameNotUnique): from awx.main.models.jobs import JobEvent return JobEvent.objects.filter(host__in=self.all_hosts) -class InventorySource(PrimordialModel): + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 0: + + class Group(GroupBase): + + class Meta: + app_label = 'main' + unique_together = (("name", "inventory"),) + + inventory_sources = models.ManyToManyField( + 'InventorySource', + related_name='groups', + blank=True, + editable=False, + help_text=_('Inventory source(s) that created or modified this group.'), + ) + + new_inventory_sources = models.ManyToManyField( + 'InventorySourceNew', + related_name='groups', + blank=True, + editable=False, + help_text=_('Inventory source(s) that created or modified this group.'), + ) + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 1: + + class Group(GroupBase): + + class Meta: + app_label = 'main' + unique_together = (("name", "inventory"),) + + new_inventory_sources = models.ManyToManyField( + 'InventorySourceNew', + related_name='groups', + blank=True, + editable=False, + help_text=_('Inventory source(s) that created or modified this group.'), + ) + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 2: + + class Group(GroupBase): + + class Meta: + app_label = 'main' + unique_together = (("name", "inventory"),) + + inventory_sources = models.ManyToManyField( + 'InventorySource', + related_name='groups', + blank=True, + editable=False, + help_text=_('Inventory source(s) that created or modified this group.'), + ) + + +class InventorySourceOptions(BaseModel): + ''' + Common fields for InventorySource and InventoryUpdate. + ''' SOURCE_CHOICES = [ ('file', _('Local File, Directory or Script')), @@ -476,32 +632,9 @@ class InventorySource(PrimordialModel): ('ec2', _('Amazon EC2')), ] - INVENTORY_SOURCE_STATUS_CHOICES = [ - ('none', _('No External Source')), - ('never updated', _('Never Updated')), - ('updating', _('Updating')), - ('failed', _('Failed')), - ('successful', _('Successful')), - ] - class Meta: - app_label = 'main' + abstract = True - inventory = models.ForeignKey( - 'Inventory', - related_name='inventory_sources', - null=True, - default=None, - editable=False, - ) - group = AutoOneToOneField( - 'Group', - related_name='inventory_source', - blank=True, - null=True, - default=None, - editable=False, - ) source = models.CharField( max_length=32, choices=SOURCE_CHOICES, @@ -521,10 +654,11 @@ class InventorySource(PrimordialModel): ) credential = models.ForeignKey( 'Credential', - related_name='inventory_sources', + related_name='%(class)ss', null=True, default=None, blank=True, + #on_delete=models.SET_NULL, # FIXME ) source_regions = models.CharField( max_length=1024, @@ -539,41 +673,19 @@ class InventorySource(PrimordialModel): default=False, help_text=_('Overwrite local variables from remote inventory source.'), ) + + +class InventorySourceBase(InventorySourceOptions): + + class Meta: + abstract = True + app_label = 'main' + update_on_launch = models.BooleanField( default=False, ) - update_interval = models.PositiveIntegerField( + update_cache_timeout = models.PositiveIntegerField( default=0, - help_text=_('If nonzero, inventory source will be updated every N minutes.'), - ) - current_update = models.ForeignKey( - 'InventoryUpdate', - null=True, - default=None, - editable=False, - related_name='inventory_source_as_current_update+', - ) - last_update = models.ForeignKey( - 'InventoryUpdate', - null=True, - default=None, - editable=False, - related_name='inventory_source_as_last_update+', - ) - last_update_failed = models.BooleanField( - default=False, - editable=False, - ) - last_updated = models.DateTimeField( - null=True, - default=None, - editable=False, - ) - status = models.CharField( - max_length=32, - choices=INVENTORY_SOURCE_STATUS_CHOICES, - default='none', - editable=False, ) @classmethod @@ -702,13 +814,13 @@ class InventorySource(PrimordialModel): def update_signature(self, **kwargs): if self.can_update: - inventory_update = self.inventory_updates.create() + inventory_update = self.inventory_updates.create() # FIXME: Copy inventory source fields to update inventory_update_sig = inventory_update.start_signature() return (inventory_update, inventory_update_sig) def update(self, **kwargs): if self.can_update: - inventory_update = self.inventory_updates.create() + inventory_update = self.inventory_updates.create() # FIXME: Copy inventory source fields to update if hasattr(settings, 'CELERY_UNIT_TEST'): inventory_update.start(None, **kwargs) else: @@ -719,20 +831,129 @@ class InventorySource(PrimordialModel): return reverse('api:inventory_source_detail', args=(self.pk,)) -class InventoryUpdate(CommonTask): +if getattr(settings, 'UNIFIED_JOBS_STEP') == 0: + + class InventorySource(PrimordialModel, InventorySourceBase): + + INVENTORY_SOURCE_STATUS_CHOICES = [ + ('none', _('No External Source')), + ('never updated', _('Never Updated')), + ('updating', _('Updating')), + ('failed', _('Failed')), + ('successful', _('Successful')), + ] + + class Meta: + app_label = 'main' + + inventory = models.ForeignKey( + 'Inventory', + related_name='inventory_sources', + null=True, + default=None, + editable=False, + ) + group = AutoOneToOneField( + 'Group', + related_name='inventory_source', + blank=True, + null=True, + default=None, + editable=False, + ) + current_update = models.ForeignKey( + 'InventoryUpdate', + null=True, + default=None, + editable=False, + related_name='inventory_source_as_current_update+', + ) + last_update = models.ForeignKey( + 'InventoryUpdate', + null=True, + default=None, + editable=False, + related_name='inventory_source_as_last_update+', + ) + last_update_failed = models.BooleanField( + default=False, + editable=False, + ) + last_updated = models.DateTimeField( + null=True, + default=None, + editable=False, + ) + status = models.CharField( + max_length=32, + choices=INVENTORY_SOURCE_STATUS_CHOICES, + default='none', + editable=False, + ) + +if getattr(settings, 'UNIFIED_JOBS_STEP') in (0, 1): + + class InventorySourceNew(UnifiedJobTemplate, InventorySourceBase): + + class Meta: + app_label = 'main' + + inventory = models.ForeignKey( + 'Inventory', + related_name='new_inventory_sources', + null=True, + default=None, + editable=False, + ) + group = AutoOneToOneField( + 'Group', + related_name='new_inventory_source', + blank=True, + null=True, + default=None, + editable=False, + ) + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 1: + + class InventorySource(InventorySourceNew): + + class Meta: + proxy = True + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 2: + + class InventorySource(UnifiedJobTemplate, InventorySourceBase): + + class Meta: + app_label = 'main' + + inventory = models.ForeignKey( + 'Inventory', + related_name='inventory_sources', + null=True, + default=None, + editable=False, + ) + group = AutoOneToOneField( + 'Group', + related_name='inventory_source', + blank=True, + null=True, + default=None, + editable=False, + ) + + +class InventoryUpdateBase(InventorySourceOptions): ''' Internal job for tracking inventory updates from external sources. ''' class Meta: app_label = 'main' + abstract = True - inventory_source = models.ForeignKey( - 'InventorySource', - related_name='inventory_updates', - on_delete=models.CASCADE, - editable=False, - ) license_error = models.BooleanField( default=False, editable=False, @@ -783,3 +1004,53 @@ class InventoryUpdate(CommonTask): self.save() # notify_task_runner.delay(dict(task_type="inventory_update", id=self.id, metadata=kwargs)) return True + + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 0: + + class InventoryUpdate(CommonTask, InventoryUpdateBase): + + class Meta: + app_label = 'main' + + inventory_source = models.ForeignKey( + 'InventorySource', + related_name='inventory_updates', + on_delete=models.CASCADE, + editable=False, + ) + +if getattr(settings, 'UNIFIED_JOBS_STEP') in (0, 1): + + class InventoryUpdateNew(UnifiedJob, InventoryUpdateBase): + + class Meta: + app_label = 'main' + + inventory_source = models.ForeignKey( + 'InventorySourceNew', + related_name='inventory_updates', + on_delete=models.CASCADE, + editable=False, + ) + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 1: + + class InventoryUpdate(InventoryUpdateNew): + + class Meta: + proxy = True + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 2: + + class InventoryUpdate(UnifiedJob, InventoryUpdateBase): + + class Meta: + app_label = 'main' + + inventory_source = models.ForeignKey( + 'InventorySource', + related_name='inventory_updates', + on_delete=models.CASCADE, + editable=False, + ) diff --git a/awx/main/models/jobs.py b/awx/main/models/jobs.py index 27ac1e86e0..76b24ff932 100644 --- a/awx/main/models/jobs.py +++ b/awx/main/models/jobs.py @@ -34,6 +34,7 @@ from jsonfield import JSONField # AWX from awx.main.models.base import * +from awx.main.models.unified_jobs import * from awx.main.utils import encrypt_field, decrypt_field # Celery @@ -43,15 +44,12 @@ logger = logging.getLogger('awx.main.models.jobs') __all__ = ['JobTemplate', 'Job', 'JobHostSummary', 'JobEvent'] - -class JobTemplate(CommonModel): +class JobOptions(BaseModel): ''' - A job template is a reusable job definition for applying a project (with - playbook) to an inventory source with a given credential. ''' - + class Meta: - app_label = 'main' + abstract = True job_type = models.CharField( max_length=64, @@ -59,23 +57,23 @@ class JobTemplate(CommonModel): ) inventory = models.ForeignKey( 'Inventory', - related_name='job_templates', - null=True, - on_delete=models.SET_NULL, - ) - project = models.ForeignKey( - 'Project', - related_name='job_templates', + related_name='%(class)ss', null=True, on_delete=models.SET_NULL, ) + #project = models.ForeignKey( + # 'Project', + # related_name='%(class)ss', + # null=True, + # on_delete=models.SET_NULL, + #) playbook = models.CharField( max_length=1024, default='', ) credential = models.ForeignKey( 'Credential', - related_name='job_templates', + related_name='%(class)ss', blank=True, null=True, default=None, @@ -83,7 +81,7 @@ class JobTemplate(CommonModel): ) cloud_credential = models.ForeignKey( 'Credential', - related_name='job_templates_as_cloud_credential+', + related_name='%(class)ss_as_cloud_credential+', blank=True, null=True, default=None, @@ -111,11 +109,8 @@ class JobTemplate(CommonModel): blank=True, default='', ) - host_config_key = models.CharField( - max_length=1024, - blank=True, - default='', - ) + + extra_vars_dict = VarsDictProperty('extra_vars', True) def clean_credential(self): cred = self.credential @@ -130,6 +125,24 @@ class JobTemplate(CommonModel): '"rax"') return cred + +class JobTemplateBase(JobOptions): + ''' + A job template is a reusable job definition for applying a project (with + playbook) to an inventory source with a given credential. + ''' + + class Meta: + abstract = True + app_label = 'main' + + host_config_key = models.CharField( + max_length=1024, + blank=True, + default='', + ) + + def create_job(self, **kwargs): ''' Create a new job based on this template. @@ -169,117 +182,80 @@ class JobTemplate(CommonModel): needed.append(pw) return bool(self.credential and not len(needed)) -class Job(CommonTask): + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 0: + + class JobTemplate(CommonModel, JobTemplateBase): + + class Meta: + app_label = 'main' + + project = models.ForeignKey( + 'Project', + related_name='job_templates', + null=True, + on_delete=models.SET_NULL, + ) + +if getattr(settings, 'UNIFIED_JOBS_STEP') in (0, 1): + + class JobTemplateNew(UnifiedJobTemplate, JobTemplateBase): + + class Meta: + app_label = 'main' + db_table = 'main_jobtemplatenew' + + project = models.ForeignKey( + 'ProjectNew', + related_name='job_templates', + null=True, + on_delete=models.SET_NULL, + ) + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 1: + + class JobTemplate(JobTemplateNew): + + class Meta: + proxy = True + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 2: + + class JobTemplate(UnifiedJobTemplate, JobTemplateBase): + + class Meta: + app_label = 'main' + + project = models.ForeignKey( + 'Project', + related_name='job_templates', + null=True, + on_delete=models.SET_NULL, + ) + + +class JobBase(JobOptions): ''' A job applies a project (with playbook) to an inventory source with a given credential. It represents a single invocation of ansible-playbook with the given parameters. ''' - LAUNCH_TYPE_CHOICES = [ - ('manual', _('Manual')), - ('callback', _('Callback')), - ('scheduled', _('Scheduled')), - ] - class Meta: + abstract = True app_label = 'main' - job_template = models.ForeignKey( - 'JobTemplate', - related_name='jobs', - blank=True, - null=True, - default=None, - on_delete=models.SET_NULL, - ) - job_type = models.CharField( - max_length=64, - choices=JOB_TYPE_CHOICES, - ) - inventory = models.ForeignKey( - 'Inventory', - related_name='jobs', - null=True, - on_delete=models.SET_NULL, - ) - credential = models.ForeignKey( - 'Credential', - related_name='jobs', - null=True, - on_delete=models.SET_NULL, - ) - cloud_credential = models.ForeignKey( - 'Credential', - related_name='jobs_as_cloud_credential+', - blank=True, - null=True, - default=None, - on_delete=models.SET_NULL, - ) - project = models.ForeignKey( - 'Project', - related_name='jobs', - null=True, - on_delete=models.SET_NULL, - ) - playbook = models.CharField( - max_length=1024, - ) - forks = models.PositiveIntegerField( - blank=True, - default=0, - ) - limit = models.CharField( - max_length=1024, - blank=True, - default='', - ) - verbosity = models.PositiveIntegerField( - blank=True, - default=0, - ) - extra_vars = models.TextField( - blank=True, - default='', - ) - job_tags = models.CharField( - max_length=1024, - blank=True, - default='', - ) - launch_type = models.CharField( - max_length=20, - choices=LAUNCH_TYPE_CHOICES, - default='manual', - editable=False, - ) hosts = models.ManyToManyField( 'Host', - related_name='jobs', + related_name='%(class)ss', blank=True, editable=False, through='JobHostSummary', ) - def clean_credential(self): - cred = self.credential - if cred and cred.kind != 'ssh': - raise ValidationError('Credential kind must be "ssh"') - return cred - - def clean_cloud_credential(self): - cred = self.cloud_credential - if cred and cred.kind not in ('aws', 'rax'): - raise ValidationError('Cloud credential kind must be "aws" or ' - '"rax"') - return cred - def get_absolute_url(self): return reverse('api:job_detail', args=(self.pk,)) - extra_vars_dict = VarsDictProperty('extra_vars', True) - @property def task_auth_token(self): '''Return temporary auth token used for task requests via API.''' @@ -426,36 +402,116 @@ class Job(CommonTask): task_class().apply_async((self.pk,), opts, link_error=error_callback) return True -class JobHostSummary(BaseModel): + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 0: + + class Job(CommonTask, JobBase): + + LAUNCH_TYPE_CHOICES = [ + ('manual', _('Manual')), + ('callback', _('Callback')), + ('scheduled', _('Scheduled')), + ] + + class Meta: + app_label = 'main' + + job_template = models.ForeignKey( + 'JobTemplate', + related_name='jobs', + blank=True, + null=True, + default=None, + on_delete=models.SET_NULL, + ) + project = models.ForeignKey( + 'Project', + related_name='jobs', + null=True, + on_delete=models.SET_NULL, + ) + launch_type = models.CharField( + max_length=20, + choices=LAUNCH_TYPE_CHOICES, + default='manual', + editable=False, + ) + +if getattr(settings, 'UNIFIED_JOBS_STEP') in (0, 1): + + class JobNew(UnifiedJob, JobBase): + + class Meta: + app_label = 'main' + + job_template = models.ForeignKey( + 'JobTemplateNew', + related_name='jobs', + blank=True, + null=True, + default=None, + on_delete=models.SET_NULL, + ) + project = models.ForeignKey( + 'ProjectNew', + related_name='jobs', + null=True, + on_delete=models.SET_NULL, + ) + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 1: + + class Job(JobNew): + + class Meta: + proxy = True + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 2: + + class Job(UnifiedJob, JobBase): + + class Meta: + app_label = 'main' + + job_template = models.ForeignKey( + 'JobTemplate', + related_name='jobs', + blank=True, + null=True, + default=None, + on_delete=models.SET_NULL, + ) + project = models.ForeignKey( + 'Project', + related_name='jobs', + null=True, + on_delete=models.SET_NULL, + ) + + +class JobHostSummaryBase(CreatedModifiedModel): ''' Per-host statistics for each job. ''' class Meta: + abstract = True app_label = 'main' unique_together = [('job', 'host')] verbose_name_plural = _('job host summaries') ordering = ('-pk',) - job = models.ForeignKey( - 'Job', - related_name='job_host_summaries', - on_delete=models.CASCADE, - editable=False, - ) + #job = models.ForeignKey( + # 'Job', + # related_name='job_host_summaries', + # on_delete=models.CASCADE, + # editable=False, + #) host = models.ForeignKey('Host', related_name='job_host_summaries', on_delete=models.CASCADE, editable=False, ) - created = models.DateTimeField( - auto_now_add=True, - default=now, - ) - modified = models.DateTimeField( - auto_now=True, - default=now, - ) changed = models.PositiveIntegerField(default=0, editable=False) dark = models.PositiveIntegerField(default=0, editable=False) @@ -494,7 +550,68 @@ class JobHostSummary(BaseModel): self.host.save(update_fields=update_fields) #self.host.update_computed_fields() -class JobEvent(BaseModel): + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 0: + + class JobHostSummary(JobHostSummaryBase): + + class Meta: + app_label = 'main' + unique_together = [('job', 'host'), ('new_job', 'host')] + verbose_name_plural = _('job host summaries') + ordering = ('-pk',) + + job = models.ForeignKey( + 'Job', + related_name='job_host_summaries', + on_delete=models.CASCADE, + editable=False, + ) + new_job = models.ForeignKey( + 'JobNew', + related_name='new_job_host_summaries', + on_delete=models.CASCADE, + null=True, + default=None, + editable=False, + ) + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 1: + + class JobHostSummary(JobHostSummaryBase): + + class Meta: + app_label = 'main' + unique_together = [('new_job', 'host')] + verbose_name_plural = _('job host summaries') + ordering = ('-pk',) + + new_job = models.ForeignKey( + 'JobNew', + related_name='new_job_host_summaries', + on_delete=models.CASCADE, + editable=False, + ) + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 2: + + class JobHostSummary(JobHostSummaryBase): + + class Meta: + app_label = 'main' + unique_together = [('job', 'host')] + verbose_name_plural = _('job host summaries') + ordering = ('-pk',) + + job = models.ForeignKey( + 'Job', + related_name='job_host_summaries', + on_delete=models.CASCADE, + editable=False, + ) + + +class JobEventBase(CreatedModifiedModel): ''' An event/message logged from the callback when running a job. ''' @@ -503,14 +620,14 @@ class JobEvent(BaseModel): # - playbook_on_start (once for each playbook file) # - playbook_on_vars_prompt (for each play, but before play starts, we # currently don't handle responding to these prompts) - # - playbook_on_play_start + # - playbook_on_play_start (once for each play) # - playbook_on_import_for_host # - playbook_on_not_import_for_host # - playbook_on_no_hosts_matched # - playbook_on_no_hosts_remaining # - playbook_on_setup # - runner_on* - # - playbook_on_task_start + # - playbook_on_task_start (once for each task within a play) # - runner_on_failed # - runner_on_ok # - runner_on_error @@ -521,7 +638,7 @@ class JobEvent(BaseModel): # - runner_on_async_ok # - runner_on_async_failed # - runner_on_file_diff - # - playbook_on_notify + # - playbook_on_notify (once for each notification from the play) # - playbook_on_stats EVENT_TYPES = [ @@ -557,25 +674,16 @@ class JobEvent(BaseModel): LEVEL_FOR_EVENT = dict([(x[1], x[0]) for x in EVENT_TYPES]) class Meta: + abstract = True app_label = 'main' ordering = ('pk',) - job = models.ForeignKey( - 'Job', - related_name='job_events', - on_delete=models.CASCADE, - editable=False, - ) - created = models.DateTimeField( - #auto_now_add=True, - editable=False, - default=None, - ) - modified = models.DateTimeField( - #auto_now=True, - editable=False, - default=None, - ) + #job = models.ForeignKey( + # 'Job', + # related_name='job_events', + # on_delete=models.CASCADE, + # editable=False, + #) event = models.CharField( max_length=100, choices=EVENT_CHOICES, @@ -613,6 +721,12 @@ class JobEvent(BaseModel): default='', editable=False, ) + role = models.CharField( # FIXME: Determine from callback or task name. + max_length=1024, + blank=True, + default='', + editable=False, + ) task = models.CharField( max_length=1024, blank=True, @@ -773,15 +887,6 @@ class JobEvent(BaseModel): self.parent = self._find_parent() if 'parent' not in update_fields: update_fields.append('parent') - # Manually perform auto_now_add and auto_now logic (to allow overriding - # created timestamp for queued job events). - if not self.pk and not self.created: - self.created = now() - if 'created' not in update_fields: - update_fields.append('created') - self.modified = now() - if 'modified' not in update_fields: - update_fields.append('modified') super(JobEvent, self).save(*args, **kwargs) if post_process and not from_parent_update: self.update_parent_failed_and_changed() @@ -859,3 +964,56 @@ class JobEvent(BaseModel): host_summary.save(update_fields=update_fields) job.inventory.update_computed_fields() + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 0: + + class JobEvent(JobEventBase): + + class Meta: + app_label = 'main' + ordering = ('pk',) + + job = models.ForeignKey( + 'Job', + related_name='job_events', + on_delete=models.CASCADE, + editable=False, + ) + new_job = models.ForeignKey( + 'JobNew', + related_name='new_job_events', + on_delete=models.CASCADE, + null=True, + default=None, + editable=False, + ) + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 1: + + class JobEvent(JobEventBase): + + class Meta: + app_label = 'main' + ordering = ('pk',) + + new_job = models.ForeignKey( + 'JobNew', + related_name='new_job_events', + on_delete=models.CASCADE, + editable=False, + ) + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 2: + + class JobEvent(JobEventBase): + + class Meta: + app_label = 'main' + ordering = ('pk',) + + job = models.ForeignKey( + 'Job', + related_name='job_events', + on_delete=models.CASCADE, + editable=False, + ) diff --git a/awx/main/models/organization.py b/awx/main/models/organization.py index eb7c4ddc6f..764187160f 100644 --- a/awx/main/models/organization.py +++ b/awx/main/models/organization.py @@ -37,12 +37,13 @@ __all__ = ['Organization', 'Team', 'Permission', 'Credential', 'Profile', 'AuthToken'] -class Organization(CommonModel): +class OrganizationBase(CommonModel): ''' An organization is the basic unit of multi-tenancy divisions ''' class Meta: + abstract = True app_label = 'main' users = models.ManyToManyField( @@ -55,11 +56,6 @@ class Organization(CommonModel): blank=True, related_name='admin_of_organizations', ) - projects = models.ManyToManyField( - 'Project', - blank=True, - related_name='organizations', - ) def get_absolute_url(self): return reverse('api:organization_detail', args=(self.pk,)) @@ -68,20 +64,61 @@ class Organization(CommonModel): return self.name -class Team(CommonModelNameNotUnique): +if getattr(settings, 'UNIFIED_JOBS_STEP') == 0: + + class Organization(OrganizationBase): + + class Meta: + app_label = 'main' + + projects = models.ManyToManyField( + 'Project', + blank=True, + related_name='organizations', + ) + new_projects = models.ManyToManyField( + 'ProjectNew', + blank=True, + related_name='organizations', + ) + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 1: + + class Organization(OrganizationBase): + + class Meta: + app_label = 'main' + + new_projects = models.ManyToManyField( + 'ProjectNew', + blank=True, + related_name='organizations', + ) + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 2: + + class Organization(OrganizationBase): + + class Meta: + app_label = 'main' + + projects = models.ManyToManyField( + 'Project', + blank=True, + related_name='organizations', + ) + + +class TeamBase(CommonModelNameNotUnique): ''' A team is a group of users that work on common projects. ''' class Meta: + abstract = True app_label = 'main' unique_together = [('organization', 'name')] - projects = models.ManyToManyField( - 'Project', - blank=True, - related_name='teams', - ) users = models.ManyToManyField( 'auth.User', blank=True, @@ -99,12 +136,61 @@ class Team(CommonModelNameNotUnique): return reverse('api:team_detail', args=(self.pk,)) -class Permission(CommonModelNameNotUnique): +if getattr(settings, 'UNIFIED_JOBS_STEP') == 0: + + class Team(TeamBase): + + class Meta: + app_label = 'main' + unique_together = [('organization', 'name')] + + projects = models.ManyToManyField( + 'Project', + blank=True, + related_name='teams', + ) + new_projects = models.ManyToManyField( + 'ProjectNew', + blank=True, + related_name='teams', + ) + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 1: + + class Team(TeamBase): + + class Meta: + app_label = 'main' + unique_together = [('organization', 'name')] + + new_projects = models.ManyToManyField( + 'ProjectNew', + blank=True, + related_name='teams', + ) + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 2: + + class Team(TeamBase): + + class Meta: + app_label = 'main' + unique_together = [('organization', 'name')] + + projects = models.ManyToManyField( + 'Project', + blank=True, + related_name='teams', + ) + + +class PermissionBase(CommonModelNameNotUnique): ''' A permission allows a user, project, or team to be able to use an inventory source. ''' class Meta: + abstract = True app_label = 'main' # permissions are granted to either a user or a team: @@ -112,7 +198,7 @@ class Permission(CommonModelNameNotUnique): team = models.ForeignKey('Team', null=True, on_delete=models.SET_NULL, blank=True, related_name='permissions') # to be used against a project or inventory (or a project and inventory in conjunction): - project = models.ForeignKey('Project', null=True, on_delete=models.SET_NULL, blank=True, related_name='permissions') + #project = models.ForeignKey('Project', null=True, on_delete=models.SET_NULL, blank=True, related_name='permissions') inventory = models.ForeignKey('Inventory', null=True, on_delete=models.SET_NULL, related_name='permissions') # permission system explanation: @@ -143,6 +229,59 @@ class Permission(CommonModelNameNotUnique): return reverse('api:permission_detail', args=(self.pk,)) +if getattr(settings, 'UNIFIED_JOBS_STEP') == 0: + + class Permission(PermissionBase): + + class Meta: + app_label = 'main' + + project = models.ForeignKey( + 'Project', + null=True, + on_delete=models.SET_NULL, + blank=True, + related_name='permissions', + ) + new_project = models.ForeignKey( + 'ProjectNew', + null=True, + on_delete=models.SET_NULL, + blank=True, + related_name='permissions', + ) + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 1: + + class Permission(PermissionBase): + + class Meta: + app_label = 'main' + + new_project = models.ForeignKey( + 'ProjectNew', + null=True, + on_delete=models.SET_NULL, + blank=True, + related_name='permissions', + ) + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 2: + + class Permission(PermissionBase): + + class Meta: + app_label = 'main' + + project = models.ForeignKey( + 'Project', + null=True, + on_delete=models.SET_NULL, + blank=True, + related_name='permissions', + ) + + class Credential(CommonModelNameNotUnique): ''' A credential contains information about how to talk to a remote resource @@ -370,7 +509,8 @@ class Credential(CommonModelNameNotUnique): update_fields.append(field) self.save(update_fields=update_fields) -class Profile(BaseModel): + +class Profile(CreatedModifiedModel): ''' Profile model related to User object. Currently stores LDAP DN for users loaded from LDAP. @@ -379,12 +519,6 @@ class Profile(BaseModel): class Meta: app_label = 'main' - created = models.DateTimeField( - auto_now_add=True, - ) - modified = models.DateTimeField( - auto_now=True, - ) user = AutoOneToOneField( 'auth.User', related_name='profile', @@ -395,6 +529,7 @@ class Profile(BaseModel): default='', ) + class AuthToken(BaseModel): ''' Custom authentication tokens per user with expiration and request-specific @@ -459,10 +594,12 @@ def user_mark_inactive(user, save=True): '''Use instead of delete to rename and mark users inactive.''' if user.is_active: # Set timestamp to datetime.isoformat() but without the time zone - # offse to stay withint the 30 character username limit. - deleted_ts = now().strftime('%Y-%m-%dT%H:%M:%S.%f') + # offset to stay withint the 30 character username limit. + dtnow = now() + deleted_ts = dtnow.strftime('%Y-%m-%dT%H:%M:%S.%f') user.username = '_d_%s' % deleted_ts user.is_active = False if save: user.save() + User.add_to_class('mark_inactive', user_mark_inactive) diff --git a/awx/main/models/projects.py b/awx/main/models/projects.py index 3a2d45a642..70152175b1 100644 --- a/awx/main/models/projects.py +++ b/awx/main/models/projects.py @@ -32,26 +32,14 @@ from django.utils.timezone import now, make_aware, get_default_timezone # AWX from awx.lib.compat import slugify from awx.main.models.base import * +from awx.main.models.unified_jobs import * from awx.main.utils import update_scm_url from awx.main.utils import encrypt_field __all__ = ['Project', 'ProjectUpdate'] +class ProjectOptions(models.Model): -class Project(CommonModel): - ''' - A project represents a playbook git repo that can access a set of inventories - ''' - - PROJECT_STATUS_CHOICES = [ - ('ok', 'OK'), - ('missing', 'Missing'), - ('never updated', 'Never Updated'), - ('updating', 'Updating'), - ('failed', 'Failed'), - ('successful', 'Successful'), - ] - SCM_TYPE_CHOICES = [ ('', _('Manual')), ('git', _('Git')), @@ -60,10 +48,7 @@ class Project(CommonModel): ] class Meta: - app_label = 'main' - - # this is not part of the project, but managed with perms - # inventories = models.ManyToManyField('Inventory', blank=True, related_name='projects') + abstract = True # Project files must be available on the server in folders directly # beneath the path specified by settings.PROJECTS_ROOT. There is no way @@ -115,50 +100,13 @@ class Project(CommonModel): scm_delete_on_update = models.BooleanField( default=False, ) - scm_delete_on_next_update = models.BooleanField( - default=False, - editable=False, - ) - scm_update_on_launch = models.BooleanField( - default=False, - ) credential = models.ForeignKey( 'Credential', - related_name='projects', + related_name='%(class)ss', blank=True, null=True, default=None, ) - current_update = models.ForeignKey( - 'ProjectUpdate', - null=True, - default=None, - editable=False, - related_name='project_as_current_update+', - ) - last_update = models.ForeignKey( - 'ProjectUpdate', - null=True, - default=None, - editable=False, - related_name='project_as_last_update+', - ) - last_update_failed = models.BooleanField( - default=False, - editable=False, - ) - last_updated = models.DateTimeField( - null=True, - default=None, - editable=False, - ) - status = models.CharField( - max_length=32, - choices=PROJECT_STATUS_CHOICES, - default='ok', - editable=False, - null=True, # FIXME: Remove - ) def clean_scm_type(self): return self.scm_type or '' @@ -203,6 +151,30 @@ class Project(CommonModel): pass return cred + +class ProjectBase(ProjectOptions): + ''' + A project represents a playbook git repo that can access a set of inventories + ''' + + class Meta: + app_label = 'main' + abstract = True + + # this is not part of the project, but managed with perms + # inventories = models.ManyToManyField('Inventory', blank=True, related_name='projects') + + scm_delete_on_next_update = models.BooleanField( + default=False, + editable=False, + ) + scm_update_on_launch = models.BooleanField( + default=False, + ) + scm_update_cache_timeout = models.PositiveIntegerField( + default=0, + ) + def save(self, *args, **kwargs): new_instance = not bool(self.pk) # If update_fields has been specified, add our field names to it, @@ -288,13 +260,13 @@ class Project(CommonModel): def update_signature(self, **kwargs): if self.can_update: - project_update = self.project_updates.create() + project_update = self.project_updates.create() # FIXME: Copy options to ProjectUpdate project_update_sig = project_update.start_signature() return (project_update, project_update_sig) def update(self, **kwargs): if self.can_update: - project_update = self.project_updates.create() + project_update = self.project_updates.create() # FIXME: Copy options to ProjectUpdate if hasattr(settings, 'CELERY_UNIT_TEST'): project_update.start(None, **kwargs) else: @@ -344,20 +316,84 @@ class Project(CommonModel): results.append(playbook) return results -class ProjectUpdate(CommonTask): + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 0: + + class Project(CommonModel, ProjectBase): + + PROJECT_STATUS_CHOICES = [ + ('ok', 'OK'), + ('missing', 'Missing'), + ('never updated', 'Never Updated'), + ('updating', 'Updating'), + ('failed', 'Failed'), + ('successful', 'Successful'), + ] + + class Meta: + app_label = 'main' + + current_update = models.ForeignKey( + 'ProjectUpdate', + null=True, + default=None, + editable=False, + related_name='project_as_current_update+', + ) + last_update = models.ForeignKey( + 'ProjectUpdate', + null=True, + default=None, + editable=False, + related_name='project_as_last_update+', + ) + last_update_failed = models.BooleanField( + default=False, + editable=False, + ) + last_updated = models.DateTimeField( + null=True, + default=None, + editable=False, + ) + status = models.CharField( + max_length=32, + choices=PROJECT_STATUS_CHOICES, + default='ok', + editable=False, + null=True, # FIXME: Remove + ) + +if getattr(settings, 'UNIFIED_JOBS_STEP') in (0, 1): + + class ProjectNew(UnifiedJobTemplate, ProjectBase): + + class Meta: + app_label = 'main' + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 1: + + class Project(ProjectNew): + + class Meta: + proxy = True + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 2: + + class Project(UnifiedJobTemplate, ProjectBase): + + class Meta: + app_label = 'main' + + +class ProjectUpdateBase(ProjectOptions): ''' Internal job for tracking project updates from SCM. ''' class Meta: app_label = 'main' - - project = models.ForeignKey( - 'Project', - related_name='project_updates', - on_delete=models.CASCADE, - editable=False, - ) + abstract = True def get_absolute_url(self): return reverse('api:project_update_detail', args=(self.pk,)) @@ -414,3 +450,53 @@ class ProjectUpdate(CommonTask): 'last_update', 'last_update_failed', 'scm_delete_on_next_update']) + + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 0: + + class ProjectUpdate(CommonTask, ProjectUpdateBase): + + class Meta: + app_label = 'main' + + project = models.ForeignKey( + 'Project', + related_name='project_updates', + on_delete=models.CASCADE, + editable=False, + ) + +if getattr(settings, 'UNIFIED_JOBS_STEP') in (0, 1): + + class ProjectUpdateNew(UnifiedJob, ProjectUpdateBase): + + class Meta: + app_label = 'main' + + project = models.ForeignKey( + 'ProjectNew', + related_name='project_updates', + on_delete=models.CASCADE, + editable=False, + ) + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 1: + + class ProjectUpdate(ProjectUpdateNew): + + class Meta: + proxy = True + +if getattr(settings, 'UNIFIED_JOBS_STEP') == 2: + + class ProjectUpdate(UnifiedJob, ProjectUpdateBase): + + class Meta: + app_label = 'main' + + project = models.ForeignKey( + 'Project', + related_name='project_updates', + on_delete=models.CASCADE, + editable=False, + ) diff --git a/awx/main/models/schedules.py b/awx/main/models/schedules.py new file mode 100644 index 0000000000..44a9a969fa --- /dev/null +++ b/awx/main/models/schedules.py @@ -0,0 +1,42 @@ +# Copyright (c) 2014 AnsibleWorks, Inc. +# All Rights Reserved. + +import logging + +# Django +from django.db import models + +# AWX +from awx.main.models.base import * + + +logger = logging.getLogger('awx.main.models.schedule') + +__all__ = ['Schedule'] + +class ScheduleManager(models.Manager): + pass + +class Schedule(CommonModel): + + class Meta: + app_label = 'main' + + objects = ScheduleManager() + + job_template = models.ForeignKey( + 'UnifiedJobTemplate', + related_name='schedules', + on_delete=models.CASCADE, + ) + dtstart = models.DateTimeField( + + ) + dtend = models.DateTimeField( + null=True, + default=None, + editable=False + ) + rrule = models.CharField( + max_length=255, + ) diff --git a/awx/main/models/unified_jobs.py b/awx/main/models/unified_jobs.py new file mode 100644 index 0000000000..9673910e31 --- /dev/null +++ b/awx/main/models/unified_jobs.py @@ -0,0 +1,232 @@ +# Copyright (c) 2014 AnsibleWorks, Inc. +# All Rights Reserved. + +# Python +import json +import logging +import shlex +import os +import os.path + +# PyYAML +import yaml + +# Django +from django.conf import settings +from django.db import models +from django.db import transaction +from django.core.exceptions import ValidationError +from django.contrib.contenttypes.models import ContentType +from django.utils.translation import ugettext_lazy as _ +from django.utils.timezone import now + +# Django-JSONField +from jsonfield import JSONField + +# Django-Polymorphic +from polymorphic import PolymorphicModel + +# Django-Celery +from djcelery.models import TaskMeta + +# AWX +from awx.main.models.base import * + +logger = logging.getLogger('awx.main.models.unified_jobs') + + +class UnifiedJobTemplate(PolymorphicModel, CommonModelNameNotUnique): + ''' + Concrete base class for unified job templates. + ''' + + STATUS_CHOICES = [ + # from Project + ('ok', 'OK'), + ('missing', 'Missing'), + ('never updated', 'Never Updated'), + ('running', 'Running'), + ('failed', 'Failed'), + ('successful', 'Successful'), + # from InventorySource + ('none', _('No External Source')), + ('never updated', _('Never Updated')), + ('updating', _('Updating')), + #('failed', _('Failed')), + #('successful', _('Successful')), + ] + + + class Meta: + app_label = 'main' + unique_together = [('polymorphic_ctype', 'name')] + + old_pk = models.PositiveIntegerField( + null=True, + default=None, + editable=False, + ) + current_job = models.ForeignKey( # alias for current_update + 'UnifiedJob', + null=True, + default=None, + editable=False, + related_name='%(class)s_as_current_job+', + ) + last_job = models.ForeignKey( # alias for last_update + 'UnifiedJob', + null=True, + default=None, + editable=False, + related_name='%(class)s_as_last_job+', + ) + last_job_failed = models.BooleanField( # alias for last_update_failed + default=False, + editable=False, + ) + last_job_run = models.DateTimeField( # alias for last_updated + null=True, + default=None, + editable=False, + ) + has_schedules = models.BooleanField( + default=False, + editable=False, + ) + #on_missed_schedule = models.CharField( + # max_length=32, + # choices=[], + #) + next_job_run = models.DateTimeField( # FIXME: Calculate from schedule. + null=True, + default=None, + editable=False, + ) + status = models.CharField( + max_length=32, + choices=STATUS_CHOICES, + default='ok', + editable=False, + ) + + # FIXME: Include code common to Project/InventorySource/JobTemplate + + +class UnifiedJob(PolymorphicModel, PrimordialModel): + ''' + Concrete base class for unified job run by the task engine. + ''' + + LAUNCH_TYPE_CHOICES = [ + ('manual', _('Manual')), + ('callback', _('Callback')), + ('scheduled', _('Scheduled')), + ('dependency', _('Dependency')), + ] + + class Meta: + app_label = 'main' + + old_pk = models.PositiveIntegerField( + null=True, + default=None, + editable=False, + ) + unified_job_template = models.ForeignKey( + 'UnifiedJobTemplate', + null=True, # Some jobs can be run without a template. + default=None, + editable=False, + related_name='%(class)s_unified_jobs', + ) + launch_type = models.CharField( + max_length=20, + choices=LAUNCH_TYPE_CHOICES, + default='manual', + editable=False, + ) + schedule = models.ForeignKey( + 'Schedule', + null=True, + default=None, + editable=False, + ) + depends_on = models.ManyToManyField( + 'self', + editable=False, + related_name='%(class)s_blocked_by+', + ) + + cancel_flag = models.BooleanField( + blank=True, + default=False, + editable=False, + ) + status = models.CharField( + max_length=20, + choices=TASK_STATUS_CHOICES, + default='new', + editable=False, + ) + failed = models.BooleanField( + default=False, + editable=False, + ) + started = models.DateTimeField( + null=True, + default=None, + editable=False, + ) + finished = models.DateTimeField( + null=True, + default=None, + editable=False, + ) + elapsed = models.DecimalField( + max_digits=12, + decimal_places=3, + editable=False, + ) + job_args = models.TextField( + blank=True, + default='', + editable=False, + ) + job_cwd = models.CharField( + max_length=1024, + blank=True, + default='', + editable=False, + ) + job_env = JSONField( + blank=True, + default={}, + editable=False, + ) + start_args = models.TextField( + blank=True, + default='', + editable=False, + ) + result_stdout_text = models.TextField( + blank=True, + default='', + editable=False, + ) + result_stdout_file = models.TextField( # FilePathfield? + blank=True, + default='', + editable=False, + ) + result_traceback = models.TextField( + blank=True, + default='', + editable=False, + ) + celery_task_id = models.CharField( + max_length=100, + blank=True, + default='', + editable=False, + ) + # FIXME: Add methods from CommonTask. diff --git a/awx/settings/defaults.py b/awx/settings/defaults.py index 3a75da2f48..27baaca80c 100644 --- a/awx/settings/defaults.py +++ b/awx/settings/defaults.py @@ -134,6 +134,7 @@ INSTALLED_APPS = ( 'django_extensions', 'djcelery', 'kombu.transport.django', + 'polymorphic', 'taggit', 'awx.main', 'awx.api', @@ -303,6 +304,9 @@ AWX_TASK_ENV = {} # Flag to enable/disable updating hosts M2M when saving job events. CAPTURE_JOB_EVENT_HOSTS = False +# Flag to indicate which version of unified jobs model to use. +UNIFIED_JOBS_STEP = 2 + # Not possible to get list of regions without authenticating, so use this list # instead (based on docs from: # http://docs.rackspace.com/loadbalancers/api/v1.0/clb-devguide/content/Service_Access_Endpoints-d1e517.html)