diff --git a/lib/main/base_views.py b/lib/main/base_views.py index 16562d42c3..27f5658273 100644 --- a/lib/main/base_views.py +++ b/lib/main/base_views.py @@ -304,14 +304,14 @@ class VariableBaseDetail(BaseDetail): pass if this_object is None: - this_object = self.__class__.model.objects.create(data=data) + this_object = self.__class__.model.objects.create(data=python_json.dumps(data)) else: - this_object.data = data + this_object.data = python_json.dumps(data) this_object.save() setattr(through_obj, self.__class__.reverse_relationship, this_object) through_obj.save() - return Response(status=status.HTTP_200_OK, data=this_object.data) + return Response(status=status.HTTP_200_OK, data=python_json.loads(this_object.data)) def get(self, request, *args, **kwargs): @@ -327,7 +327,7 @@ class VariableBaseDetail(BaseDetail): if this_object is None: new_args = {} - new_args['data'] = {} + new_args['data'] = python_json.dumps(dict()) this_object = self.__class__.model.objects.create(**new_args) setattr(through_obj, self.__class__.reverse_relationship, this_object) through_obj.save() @@ -338,5 +338,5 @@ class VariableBaseDetail(BaseDetail): if not check_user_access(request.user, Inventory, 'read', through_obj.inventory): raise PermissionDenied - return Response(status=status.HTTP_200_OK, data=this_object.data) + return Response(status=status.HTTP_200_OK, data=python_json.loads(this_object.data)) diff --git a/lib/main/management/commands/acom_inventory.py b/lib/main/management/commands/acom_inventory.py index be8b5e4d3d..bd723722f6 100755 --- a/lib/main/management/commands/acom_inventory.py +++ b/lib/main/management/commands/acom_inventory.py @@ -47,7 +47,7 @@ class Command(NoArgsCommand): 'children': list(group.children.values_list('name', flat=True)), } if group.variable_data is not None: - group_info['vars'] = group.variable_data.data + group_info['vars'] = json.loads(group.variable_data.data) group_info = dict(filter(lambda x: bool(x[1]), group_info.items())) if group_info.keys() in ([], ['hosts']): @@ -66,7 +66,7 @@ class Command(NoArgsCommand): raise CommandError('Host %s not found in the given inventory' % hostname) hostvars = {} if host.variable_data is not None: - hostvars = host.variable_data.data + hostvars = json.loads(host.variable_data.data) self.stdout.write(json.dumps(hostvars, indent=indent)) def handle_noargs(self, **options): diff --git a/lib/main/migrations/0004_changes.py b/lib/main/migrations/0004_changes.py index f9525de134..be61a470ef 100644 --- a/lib/main/migrations/0004_changes.py +++ b/lib/main/migrations/0004_changes.py @@ -62,9 +62,11 @@ class Migration(SchemaMigration): # Deleting field 'LaunchJobStatus.celery_task' db.delete_column(u'main_launchjobstatus', 'celery_task_id') + # Deleting field 'LaunchJobStatus.status' + db.delete_column(u'main_launchjobstatus', 'status') - # Changing field 'LaunchJobStatus.status' - db.alter_column(u'main_launchjobstatus', 'status', self.gf('django.db.models.fields.IntegerField')()) + # Adding field 'LaunchJobStatus.status' + db.add_column(u'main_launchjobstatus', 'status', self.gf('django.db.models.fields.IntegerField')(), keep_default=False) models = { u'auth.group': { @@ -300,4 +302,4 @@ class Migration(SchemaMigration): } } - complete_apps = ['main'] \ No newline at end of file + complete_apps = ['main'] diff --git a/lib/main/migrations/0010_changes.py b/lib/main/migrations/0010_changes.py index 003bcbb024..7b08c78d51 100644 --- a/lib/main/migrations/0010_changes.py +++ b/lib/main/migrations/0010_changes.py @@ -31,6 +31,9 @@ class Migration(SchemaMigration): # Deleting field 'LaunchJobStatusEvent.host' db.delete_column(u'main_launchjobstatusevent', 'host_id') + # Deleting field 'LaunchJobStatus.celery_task_id' + db.delete_column(u'main_launchjobstatus', 'celery_task_id') + # Adding field 'LaunchJobStatus.celery_task' db.add_column(u'main_launchjobstatus', 'celery_task', self.gf('django.db.models.fields.related.ForeignKey')(related_name='launch_job_statuses', on_delete=models.SET_NULL, default=None, to=orm['djcelery.TaskMeta'], blank=True, null=True), @@ -39,9 +42,6 @@ class Migration(SchemaMigration): # Deleting field 'LaunchJobStatus.result_traceback' db.delete_column(u'main_launchjobstatus', 'result_traceback') - # Deleting field 'LaunchJobStatus.celery_task_id' - db.delete_column(u'main_launchjobstatus', 'celery_task_id') - models = { u'auth.group': { @@ -268,4 +268,4 @@ class Migration(SchemaMigration): } } - complete_apps = ['main'] \ No newline at end of file + complete_apps = ['main'] diff --git a/lib/main/migrations/0016_changes.py b/lib/main/migrations/0016_changes.py index 5459dfaa2a..81cb1a4ec4 100644 --- a/lib/main/migrations/0016_changes.py +++ b/lib/main/migrations/0016_changes.py @@ -3,6 +3,7 @@ import datetime from south.db import db from south.v2 import SchemaMigration from django.db import models +from django.utils.timezone import now class Migration(SchemaMigration): @@ -19,7 +20,7 @@ class Migration(SchemaMigration): # Adding field 'Job.created' db.add_column(u'main_job', 'created', - self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, default=datetime.datetime(2013, 5, 8, 0, 0), blank=True), + self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, default=now, blank=True), keep_default=False) # Adding field 'Job.failed' @@ -35,7 +36,7 @@ class Migration(SchemaMigration): # Adding field 'Inventory.created' db.add_column(u'main_inventory', 'created', - self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, default=datetime.datetime(2013, 5, 8, 0, 0), blank=True), + self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, default=now, blank=True), keep_default=False) # Deleting field 'Host.creation_date' @@ -43,7 +44,7 @@ class Migration(SchemaMigration): # Adding field 'Host.created' db.add_column(u'main_host', 'created', - self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, default=datetime.datetime(2013, 5, 8, 0, 0), blank=True), + self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, default=now, blank=True), keep_default=False) # Adding field 'Host.last_job' @@ -61,7 +62,7 @@ class Migration(SchemaMigration): # Adding field 'Group.created' db.add_column(u'main_group', 'created', - self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, default=datetime.datetime(2013, 5, 8, 0, 0), blank=True), + self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, default=now, blank=True), keep_default=False) # Deleting field 'Credential.creation_date' @@ -69,7 +70,7 @@ class Migration(SchemaMigration): # Adding field 'Credential.created' db.add_column(u'main_credential', 'created', - self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, default=datetime.datetime(2013, 5, 8, 0, 0), blank=True), + self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, default=now, blank=True), keep_default=False) # Deleting field 'JobTemplate.use_sudo' @@ -80,7 +81,7 @@ class Migration(SchemaMigration): # Adding field 'JobTemplate.created' db.add_column(u'main_jobtemplate', 'created', - self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, default=datetime.datetime(2013, 5, 8, 0, 0), blank=True), + self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, default=now, blank=True), keep_default=False) @@ -91,7 +92,7 @@ class Migration(SchemaMigration): # Adding field 'Team.created' db.add_column(u'main_team', 'created', - self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, default=datetime.datetime(2013, 5, 8, 0, 0), blank=True), + self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, default=now, blank=True), keep_default=False) # Deleting field 'Project.creation_date' @@ -99,7 +100,7 @@ class Migration(SchemaMigration): # Adding field 'Project.created' db.add_column(u'main_project', 'created', - self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, default=datetime.datetime(2013, 5, 8, 0, 0), blank=True), + self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, default=now, blank=True), keep_default=False) # Adding field 'JobEvent.failed' @@ -112,7 +113,7 @@ class Migration(SchemaMigration): # Adding field 'Permission.created' db.add_column(u'main_permission', 'created', - self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, default=datetime.datetime(2013, 5, 8, 0, 0), blank=True), + self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, default=now, blank=True), keep_default=False) # Deleting field 'VariableData.creation_date' @@ -120,25 +121,22 @@ class Migration(SchemaMigration): # Adding field 'VariableData.created' db.add_column(u'main_variabledata', 'created', - self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, default=datetime.datetime(2013, 5, 8, 0, 0), blank=True), + self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, default=now, blank=True), keep_default=False) - - # Changing field 'VariableData.data' - db.alter_column(u'main_variabledata', 'data', self.gf('jsonfield.fields.JSONField')()) # Deleting field 'Organization.creation_date' db.delete_column(u'main_organization', 'creation_date') # Adding field 'Organization.created' db.add_column(u'main_organization', 'created', - self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, default=datetime.datetime(2013, 5, 8, 0, 0), blank=True), + self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, default=now, blank=True), keep_default=False) def backwards(self, orm): # Adding field 'Job.creation_date' db.add_column(u'main_job', 'creation_date', - self.gf('django.db.models.fields.DateField')(auto_now_add=True, default=datetime.datetime(2013, 5, 8, 0, 0), blank=True), + self.gf('django.db.models.fields.DateField')(auto_now_add=True, default=datetime.date.today, blank=True), keep_default=False) # Adding field 'Job.use_sudo' @@ -157,12 +155,12 @@ class Migration(SchemaMigration): # Deleting field 'Job.failed' db.delete_column(u'main_job', 'failed') + # Changing field 'Job.extra_vars' (Disabled: something is broken when going from a TextField to JSONField) + #db.alter_column(u'main_job', 'extra_vars', self.gf('jsonfield.fields.JSONField')()) - # Changing field 'Job.extra_vars' - db.alter_column(u'main_job', 'extra_vars', self.gf('jsonfield.fields.JSONField')()) # Adding field 'Inventory.creation_date' db.add_column(u'main_inventory', 'creation_date', - self.gf('django.db.models.fields.DateField')(auto_now_add=True, default=datetime.datetime(2013, 5, 8, 0, 0), blank=True), + self.gf('django.db.models.fields.DateField')(auto_now_add=True, default=datetime.date.today, blank=True), keep_default=False) # Deleting field 'Inventory.created' @@ -170,7 +168,7 @@ class Migration(SchemaMigration): # Adding field 'Host.creation_date' db.add_column(u'main_host', 'creation_date', - self.gf('django.db.models.fields.DateField')(auto_now_add=True, default=datetime.datetime(2013, 5, 8, 0, 0), blank=True), + self.gf('django.db.models.fields.DateField')(auto_now_add=True, default=datetime.date.today, blank=True), keep_default=False) # Deleting field 'Host.created' @@ -184,7 +182,7 @@ class Migration(SchemaMigration): # Adding field 'Group.creation_date' db.add_column(u'main_group', 'creation_date', - self.gf('django.db.models.fields.DateField')(auto_now_add=True, default=datetime.datetime(2013, 5, 8, 0, 0), blank=True), + self.gf('django.db.models.fields.DateField')(auto_now_add=True, default=datetime.date.today, blank=True), keep_default=False) # Deleting field 'Group.created' @@ -192,7 +190,7 @@ class Migration(SchemaMigration): # Adding field 'Credential.creation_date' db.add_column(u'main_credential', 'creation_date', - self.gf('django.db.models.fields.DateField')(auto_now_add=True, default=datetime.datetime(2013, 5, 8, 0, 0), blank=True), + self.gf('django.db.models.fields.DateField')(auto_now_add=True, default=datetime.date.today, blank=True), keep_default=False) # Deleting field 'Credential.created' @@ -205,18 +203,19 @@ class Migration(SchemaMigration): # Adding field 'JobTemplate.creation_date' db.add_column(u'main_jobtemplate', 'creation_date', - self.gf('django.db.models.fields.DateField')(auto_now_add=True, default=datetime.datetime(2013, 5, 8, 0, 0), blank=True), + self.gf('django.db.models.fields.DateField')(auto_now_add=True, default=datetime.date.today, blank=True), keep_default=False) # Deleting field 'JobTemplate.created' db.delete_column(u'main_jobtemplate', 'created') - # Changing field 'JobTemplate.extra_vars' - db.alter_column(u'main_jobtemplate', 'extra_vars', self.gf('jsonfield.fields.JSONField')()) + # Changing field 'JobTemplate.extra_vars' (disabled: see above) + #db.alter_column(u'main_jobtemplate', 'extra_vars', self.gf('jsonfield.fields.JSONField')()) + # Adding field 'Team.creation_date' db.add_column(u'main_team', 'creation_date', - self.gf('django.db.models.fields.DateField')(auto_now_add=True, default=datetime.datetime(2013, 5, 8, 0, 0), blank=True), + self.gf('django.db.models.fields.DateField')(auto_now_add=True, default=datetime.date.today, blank=True), keep_default=False) # Deleting field 'Team.created' @@ -224,7 +223,7 @@ class Migration(SchemaMigration): # Adding field 'Project.creation_date' db.add_column(u'main_project', 'creation_date', - self.gf('django.db.models.fields.DateField')(auto_now_add=True, default=datetime.datetime(2013, 5, 8, 0, 0), blank=True), + self.gf('django.db.models.fields.DateField')(auto_now_add=True, default=datetime.date.today, blank=True), keep_default=False) # Deleting field 'Project.created' @@ -235,7 +234,7 @@ class Migration(SchemaMigration): # Adding field 'Permission.creation_date' db.add_column(u'main_permission', 'creation_date', - self.gf('django.db.models.fields.DateField')(auto_now_add=True, default=datetime.datetime(2013, 5, 8, 0, 0), blank=True), + self.gf('django.db.models.fields.DateField')(auto_now_add=True, default=datetime.date.today, blank=True), keep_default=False) # Deleting field 'Permission.created' @@ -243,18 +242,15 @@ class Migration(SchemaMigration): # Adding field 'VariableData.creation_date' db.add_column(u'main_variabledata', 'creation_date', - self.gf('django.db.models.fields.DateField')(auto_now_add=True, default=datetime.datetime(2013, 5, 8, 0, 0), blank=True), + self.gf('django.db.models.fields.DateField')(auto_now_add=True, default=datetime.date.today, blank=True), keep_default=False) # Deleting field 'VariableData.created' db.delete_column(u'main_variabledata', 'created') - - # Changing field 'VariableData.data' - db.alter_column(u'main_variabledata', 'data', self.gf('django.db.models.fields.TextField')()) # Adding field 'Organization.creation_date' db.add_column(u'main_organization', 'creation_date', - self.gf('django.db.models.fields.DateField')(auto_now_add=True, default=datetime.datetime(2013, 5, 8, 0, 0), blank=True), + self.gf('django.db.models.fields.DateField')(auto_now_add=True, default=datetime.date.today, blank=True), keep_default=False) # Deleting field 'Organization.created' @@ -506,7 +502,7 @@ class Migration(SchemaMigration): 'audit_trail': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'variabledata_by_audit_trail'", 'blank': 'True', 'to': "orm['main.AuditTrail']"}), 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': '"{\'class\': \'variabledata\', \'app_label\': \'main\'}(class)s_created"', 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), - 'data': ('jsonfield.fields.JSONField', [], {'default': "''"}), + 'data': ('django.db.models.fields.TextField', [], {'default': "''"}), 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '512'}), @@ -514,4 +510,4 @@ class Migration(SchemaMigration): } } - complete_apps = ['main'] \ No newline at end of file + complete_apps = ['main'] diff --git a/lib/main/models/__init__.py b/lib/main/models/__init__.py index e8d34c920a..948e92864a 100644 --- a/lib/main/models/__init__.py +++ b/lib/main/models/__init__.py @@ -269,7 +269,7 @@ class VariableData(CommonModelNameNotUnique): #host = models.OneToOneField('Host', null=True, default=None, blank=True, on_delete=SET_NULL, related_name='variable_data') #group = models.OneToOneField('Group', null=True, default=None, blank=True, on_delete=SET_NULL, related_name='variable_data') - data = JSONField(default='') + data = models.TextField(default='') def __unicode__(self): return '%s = %s' % (self.name, self.data) diff --git a/lib/main/tests/commands.py b/lib/main/tests/commands.py index e6b46f6263..5963cac060 100644 --- a/lib/main/tests/commands.py +++ b/lib/main/tests/commands.py @@ -124,7 +124,7 @@ class AcomInventoryTest(BaseCommandTest): hosts = [] for x in xrange(10): if n > 0: - variable_data = VariableData.objects.create(data={'ho': 'hum-%d' % x}) + variable_data = VariableData.objects.create(data=json.dumps({'ho': 'hum-%d' % x})) else: variable_data = None host = inventory.hosts.create(name='host-%02d-%02d.example.com' % (n, x), @@ -135,7 +135,7 @@ class AcomInventoryTest(BaseCommandTest): groups = [] for x in xrange(5): if n > 0: - variable_data = VariableData.objects.create(data={'gee': 'whiz-%d' % x}) + variable_data = VariableData.objects.create(data=json.dumps({'gee': 'whiz-%d' % x})) else: variable_data = None group = inventory.groups.create(name='group-%d' % x, @@ -199,7 +199,7 @@ class AcomInventoryTest(BaseCommandTest): set(group.hosts.values_list('name', flat=True))) if group.variable_data: self.assertEqual(v.get('vars', {}), - group.variable_data.data) + json.loads(group.variable_data.data)) if k == 'group-3': self.assertEqual(set(v.get('children', [])), set(group.children.values_list('name', flat=True))) @@ -224,7 +224,7 @@ class AcomInventoryTest(BaseCommandTest): host=host.name) self.assertEqual(result, None) data = json.loads(stdout) - self.assertEqual(data, host.variable_data.data) + self.assertEqual(data, json.loads(host.variable_data.data)) def test_invalid_host(self): # Valid host, but not part of the specified inventory.