diff --git a/src/ralph/cmdb/fixtures/initial_data.yaml b/src/ralph/cmdb/fixtures/initial_data.yaml index b92fb9adad..6a1cfca7c3 100644 --- a/src/ralph/cmdb/fixtures/initial_data.yaml +++ b/src/ralph/cmdb/fixtures/initial_data.yaml @@ -67,6 +67,12 @@ name: Environment icon_class: fugue-tree +- model: cmdb.CIType + pk: 12 + fields: + name: ProfitCenter + icon_class: fugue-money-coin + # Attribute - model: cmdb.CIAttribute @@ -90,7 +96,6 @@ attribute_type: 3 ci_types: [2] - - model: cmdb.CIAttribute pk: 4 fields: @@ -98,6 +103,13 @@ attribute_type: 4 ci_types: [2,1] +- model: cmdb.CIAttribute + pk: 5 + fields: + name: Description + attribute_type: 2 + ci_types: [12] + # Layers - model: cmdb.CILayer diff --git a/src/ralph/cmdb/migrations/0024_bumped_id_ci_type.py b/src/ralph/cmdb/migrations/0024_bumped_id_ci_type.py index 326eca395b..57dfa7a4c4 100644 --- a/src/ralph/cmdb/migrations/0024_bumped_id_ci_type.py +++ b/src/ralph/cmdb/migrations/0024_bumped_id_ci_type.py @@ -49,7 +49,13 @@ def forwards(self, orm): db.commit_transaction() def backwards(self, orm): - """Backwards migrations not needed""" + """Remove new ci types""" + db.start_transaction() + db.execute('DELETE FROM cmdb_cilayer_connected_types WHERE citype_id > 10 and citype_id < 1000;') + db.execute('DELETE FROM cmdb_ciattribute_ci_types WHERE citype_id > 10 and citype_id < 1000;') + db.execute('DELETE FROM cmdb_ci WHERE type_id > 10 and type_id < 1000;') + db.execute('DELETE FROM cmdb_citype WHERE id > 10 and id < 1000;') + db.commit_transaction() models = { 'auth.group': { diff --git a/src/ralph/cmdb/migrations/0025_bumped_id_ci_attribute.py b/src/ralph/cmdb/migrations/0025_bumped_id_ci_attribute.py new file mode 100644 index 0000000000..5a614b0897 --- /dev/null +++ b/src/ralph/cmdb/migrations/0025_bumped_id_ci_attribute.py @@ -0,0 +1,487 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db, engine +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def change_id(self, table_name, old_id, new_id, where_field='attribute_id'): + db.execute('UPDATE {} SET {} = {} WHERE {} = {}'.format( + table_name, where_field, new_id, where_field, old_id, + )) + + def change_ciattribute_ids(self): + db.execute('UPDATE cmdb_ciattribute SET id = id + 1000 WHERE id > 4') + + def bumped_auto_increment(self): + """For sqlite3 bumped is not needed""" + if engine == 'south.db.mysql': + db.execute('ALTER TABLE cmdb_ciattribute AUTO_INCREMENT = 1000') + + def set_foreign_key_checks(self, value): + if engine == 'south.db.mysql': + db.execute('SET FOREIGN_KEY_CHECKS={};'.format(int(value))) + elif engine == 'south.db.sqlite3': + value = 'ON' if value else 'OFF' + db.execute('PRAGMA foreign_keys = {};'.format(value)) + + def forwards(self, orm): + """Migration moves ci_attributes ids added by the user. Migration reserves + ids from 1 to 1000 ci_attribute for added by fixtures. + """ + db.start_transaction() + self.set_foreign_key_checks(False) + + for ci_attribute_id in db.execute( + 'SELECT id FROM cmdb_ciattribute WHERE id > 4;' + ): + old_id = ci_attribute_id[0] + new_id = old_id + 1000 + self.change_id('cmdb_ciattributevalue', old_id, new_id) + self.bumped_auto_increment() + self.change_ciattribute_ids() + + self.set_foreign_key_checks(True) + db.commit_transaction() + + def backwards(self, orm): + """Backwards migrations not needed""" + db.start_transaction() + db.execute('DELETE FROM cmdb_ciattribute WHERE id > 4 and id < 1000;') + db.commit_transaction() + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + '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': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + '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': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + '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': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'cmdb.archivedcichange': { + 'Meta': {'unique_together': "((u'content_type', u'object_id'),)", 'object_name': 'ArchivedCIChange'}, + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'ci': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cmdb.CI']", 'null': 'True', 'blank': 'True'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']", 'null': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'external_key': ('django.db.models.fields.CharField', [], {'max_length': '60', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'message': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'priority': ('django.db.models.fields.IntegerField', [], {'max_length': '11'}), + 'registration_type': ('django.db.models.fields.IntegerField', [], {'default': '4', 'max_length': '11'}), + 'time': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'type': ('django.db.models.fields.IntegerField', [], {'max_length': '11', 'db_index': 'True'}) + }, + 'cmdb.archivedcichangecmdbhistory': { + 'Meta': {'object_name': 'ArchivedCIChangeCMDBHistory'}, + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'ci': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cmdb.CI']"}), + 'comment': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'field_name': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '64'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'new_value': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255'}), + 'old_value': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255'}), + 'time': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['auth.User']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}) + }, + 'cmdb.archivedcichangegit': { + 'Meta': {'object_name': 'ArchivedCIChangeGit'}, + 'author': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'changeset': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80', 'db_index': 'True'}), + 'ci': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cmdb.CI']", 'null': 'True', 'blank': 'True'}), + 'comment': ('django.db.models.fields.CharField', [], {'max_length': '1000'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'file_paths': ('django.db.models.fields.CharField', [], {'max_length': '3000'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'time': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'cmdb.archivedcichangepuppet': { + 'Meta': {'object_name': 'ArchivedCIChangePuppet'}, + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'ci': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cmdb.CI']", 'null': 'True', 'blank': 'True'}), + 'configuration_version': ('django.db.models.fields.CharField', [], {'max_length': '30', 'db_index': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'host': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'kind': ('django.db.models.fields.CharField', [], {'max_length': '30'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'status': ('django.db.models.fields.CharField', [], {'max_length': '30'}), + 'time': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}) + }, + 'cmdb.archivedcichangezabbixtrigger': { + 'Meta': {'object_name': 'ArchivedCIChangeZabbixTrigger'}, + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'ci': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cmdb.CI']", 'null': 'True', 'blank': 'True'}), + 'comments': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'host': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'host_id': ('django.db.models.fields.BigIntegerField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'lastchange': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'priority': ('django.db.models.fields.IntegerField', [], {}), + 'status': ('django.db.models.fields.IntegerField', [], {}), + 'trigger_id': ('django.db.models.fields.BigIntegerField', [], {}) + }, + 'cmdb.archivedpuppetlog': { + 'Meta': {'object_name': 'ArchivedPuppetLog'}, + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'cichange': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cmdb.ArchivedCIChangePuppet']"}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'level': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'message': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'source': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'tags': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'time': ('django.db.models.fields.DateTimeField', [], {}) + }, + 'cmdb.ci': { + 'Meta': {'unique_together': "((u'content_type', u'object_id'),)", 'object_name': 'CI'}, + 'added_manually': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'barcode': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '255', 'unique': 'True', 'null': 'True'}), + 'business_service': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']", 'null': 'True', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'layers': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['cmdb.CILayer']", 'symmetrical': 'False'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'owners': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['cmdb.CIOwner']", 'through': "orm['cmdb.CIOwnership']", 'symmetrical': 'False'}), + 'pci_scope': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'relations': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['cmdb.CI']", 'through': "orm['cmdb.CIRelation']", 'symmetrical': 'False'}), + 'state': ('django.db.models.fields.IntegerField', [], {'default': '2', 'max_length': '11'}), + 'status': ('django.db.models.fields.IntegerField', [], {'default': '2', 'max_length': '11'}), + 'technical_service': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cmdb.CIType']"}), + 'uid': ('django.db.models.fields.CharField', [], {'max_length': '100', 'unique': 'True', 'null': 'True', 'blank': 'True'}), + 'zabbix_id': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}) + }, + 'cmdb.ciattribute': { + 'Meta': {'object_name': 'CIAttribute'}, + 'attribute_type': ('django.db.models.fields.IntegerField', [], {'max_length': '11'}), + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'choices': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}), + 'ci_types': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['cmdb.CIType']", 'symmetrical': 'False'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'cmdb.ciattributevalue': { + 'Meta': {'object_name': 'CIAttributeValue'}, + 'attribute': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cmdb.CIAttribute']"}), + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'ci': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cmdb.CI']"}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'value_choice': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cmdb.CIValueChoice']", 'null': 'True', 'blank': 'True'}), + 'value_date': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cmdb.CIValueDate']", 'null': 'True', 'blank': 'True'}), + 'value_float': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cmdb.CIValueFloat']", 'null': 'True', 'blank': 'True'}), + 'value_integer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cmdb.CIValueInteger']", 'null': 'True', 'blank': 'True'}), + 'value_string': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cmdb.CIValueString']", 'null': 'True', 'blank': 'True'}) + }, + 'cmdb.cichange': { + 'Meta': {'unique_together': "((u'content_type', u'object_id'),)", 'object_name': 'CIChange'}, + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'ci': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cmdb.CI']", 'null': 'True', 'blank': 'True'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']", 'null': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'external_key': ('django.db.models.fields.CharField', [], {'max_length': '60', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'message': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'priority': ('django.db.models.fields.IntegerField', [], {'max_length': '11'}), + 'registration_type': ('django.db.models.fields.IntegerField', [], {'default': '4', 'max_length': '11'}), + 'time': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'type': ('django.db.models.fields.IntegerField', [], {'max_length': '11', 'db_index': 'True'}) + }, + 'cmdb.cichangecmdbhistory': { + 'Meta': {'object_name': 'CIChangeCMDBHistory'}, + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'ci': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cmdb.CI']"}), + 'comment': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'field_name': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '64'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'new_value': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255'}), + 'old_value': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255'}), + 'time': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['auth.User']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}) + }, + 'cmdb.cichangegit': { + 'Meta': {'object_name': 'CIChangeGit'}, + 'author': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'changeset': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80', 'db_index': 'True'}), + 'ci': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cmdb.CI']", 'null': 'True', 'blank': 'True'}), + 'comment': ('django.db.models.fields.CharField', [], {'max_length': '1000'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'file_paths': ('django.db.models.fields.CharField', [], {'max_length': '3000'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'time': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'cmdb.cichangepuppet': { + 'Meta': {'object_name': 'CIChangePuppet'}, + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'ci': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cmdb.CI']", 'null': 'True', 'blank': 'True'}), + 'configuration_version': ('django.db.models.fields.CharField', [], {'max_length': '30', 'db_index': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'host': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'kind': ('django.db.models.fields.CharField', [], {'max_length': '30'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'status': ('django.db.models.fields.CharField', [], {'max_length': '30'}), + 'time': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}) + }, + 'cmdb.cichangezabbixtrigger': { + 'Meta': {'object_name': 'CIChangeZabbixTrigger'}, + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'ci': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cmdb.CI']", 'null': 'True', 'blank': 'True'}), + 'comments': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'host': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'host_id': ('django.db.models.fields.BigIntegerField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'lastchange': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'priority': ('django.db.models.fields.IntegerField', [], {}), + 'status': ('django.db.models.fields.IntegerField', [], {}), + 'trigger_id': ('django.db.models.fields.BigIntegerField', [], {}) + }, + 'cmdb.cicontenttypeprefix': { + 'Meta': {'object_name': 'CIContentTypePrefix'}, + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'content_type_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'primary_key': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'prefix': ('django.db.models.fields.SlugField', [], {'max_length': '50'}) + }, + 'cmdb.ciincident': { + 'Meta': {'object_name': 'CIIncident'}, + 'analysis': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}), + 'assignee': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'cis': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "u'ciincident'", 'symmetrical': 'False', 'to': "orm['cmdb.CI']"}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'created_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'issue_type': ('django.db.models.fields.CharField', [], {'max_length': '254', 'null': 'True', 'blank': 'True'}), + 'jira_id': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'planned_end_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'planned_start_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'priority': ('django.db.models.fields.CharField', [], {'max_length': '254', 'null': 'True', 'blank': 'True'}), + 'problems': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}), + 'resolvet_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'update_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'cmdb.cilayer': { + 'Meta': {'ordering': "(u'name',)", 'object_name': 'CILayer'}, + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'connected_types': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['cmdb.CIType']", 'symmetrical': 'False', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'icon': (u'dj.choices.fields.ChoiceField', [], {'unique': 'False', 'primary_key': 'False', 'db_column': 'None', 'blank': 'True', u'default': 'None', 'null': 'True', '_in_south': 'True', 'db_index': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}) + }, + 'cmdb.ciowner': { + 'Meta': {'object_name': 'CIOwner'}, + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'unique': 'True', 'null': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'sAMAccountName': ('django.db.models.fields.CharField', [], {'max_length': '256', 'blank': 'True'}) + }, + 'cmdb.ciownership': { + 'Meta': {'object_name': 'CIOwnership'}, + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'ci': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cmdb.CI']"}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cmdb.CIOwner']"}), + 'type': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}) + }, + 'cmdb.ciproblem': { + 'Meta': {'object_name': 'CIProblem'}, + 'analysis': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}), + 'assignee': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'cis': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "u'ciproblem'", 'symmetrical': 'False', 'to': "orm['cmdb.CI']"}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'created_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'issue_type': ('django.db.models.fields.CharField', [], {'max_length': '254', 'null': 'True', 'blank': 'True'}), + 'jira_id': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'planned_end_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'planned_start_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'priority': ('django.db.models.fields.CharField', [], {'max_length': '254', 'null': 'True', 'blank': 'True'}), + 'problems': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}), + 'resolvet_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'update_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'cmdb.cirelation': { + 'Meta': {'unique_together': "((u'parent', u'child', u'type'),)", 'object_name': 'CIRelation'}, + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'child': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'child'", 'to': "orm['cmdb.CI']"}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'parent'", 'to': "orm['cmdb.CI']"}), + 'readonly': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'type': ('django.db.models.fields.IntegerField', [], {'max_length': '11'}) + }, + 'cmdb.citype': { + 'Meta': {'object_name': 'CIType'}, + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'icon_class': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'name': ('django.db.models.fields.SlugField', [], {'max_length': '50'}) + }, + 'cmdb.civaluechoice': { + 'Meta': {'object_name': 'CIValueChoice'}, + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'value': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) + }, + 'cmdb.civaluedate': { + 'Meta': {'object_name': 'CIValueDate'}, + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'value': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}) + }, + 'cmdb.civaluefloat': { + 'Meta': {'object_name': 'CIValueFloat'}, + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}) + }, + 'cmdb.civalueinteger': { + 'Meta': {'object_name': 'CIValueInteger'}, + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'value': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) + }, + 'cmdb.civaluestring': { + 'Meta': {'object_name': 'CIValueString'}, + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'value': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}) + }, + 'cmdb.gitpathmapping': { + 'Meta': {'object_name': 'GitPathMapping'}, + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'ci': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cmdb.CI']"}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_regex': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'path': ('django.db.models.fields.CharField', [], {'max_length': '1024'}) + }, + 'cmdb.jirachanges': { + 'Meta': {'object_name': 'JiraChanges'}, + 'analysis': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}), + 'assignee': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'cis': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "u'jirachanges'", 'symmetrical': 'False', 'to': "orm['cmdb.CI']"}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'created_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'issue_type': ('django.db.models.fields.CharField', [], {'max_length': '254', 'null': 'True', 'blank': 'True'}), + 'jira_id': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'planned_end_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'planned_start_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'priority': ('django.db.models.fields.CharField', [], {'max_length': '254', 'null': 'True', 'blank': 'True'}), + 'problems': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}), + 'resolvet_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'update_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'cmdb.puppetlog': { + 'Meta': {'object_name': 'PuppetLog'}, + 'cache_version': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'cichange': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cmdb.CIChangePuppet']"}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'level': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'message': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'source': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'tags': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'time': ('django.db.models.fields.DateTimeField', [], {}) + }, + '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'}), + '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'}) + } + } + + complete_apps = ['cmdb'] diff --git a/src/ralph/cmdb/models_ci.py b/src/ralph/cmdb/models_ci.py index b4fccaed40..99e1570789 100644 --- a/src/ralph/cmdb/models_ci.py +++ b/src/ralph/cmdb/models_ci.py @@ -71,6 +71,7 @@ class CI_TYPES(Choices): DATACENTER = _('Data Center') NETWORKTERMINATOR = _('Network Terminator') ENVIRONMENT = _('Environment') + PROFIT_CENTER = _('Profit Center') contenttype_mappings = { @@ -314,7 +315,7 @@ class CI(TimeTrackable): ) barcode = models.CharField( verbose_name=_("barcode"), max_length=255, unique=True, null=True, - default=None, + default=None, blank=True, ) content_type = models.ForeignKey( ContentType, verbose_name=_("content type"), null=True, blank=True, diff --git a/src/ralph/util/api_pricing.py b/src/ralph/util/api_pricing.py index 4ee14e65a6..5eb7561c7d 100644 --- a/src/ralph/util/api_pricing.py +++ b/src/ralph/util/api_pricing.py @@ -11,7 +11,7 @@ from django.db import models as db from ralph.business.models import Venture, VentureExtraCost -from ralph.cmdb.models import CI, CIOwner, CIType +from ralph.cmdb.models import CI, CIAttributeValue, CIOwner, CIType from ralph.discovery.models import ( Device, DeviceEnvironment, @@ -338,6 +338,30 @@ def get_business_lines(): } +def get_profit_centers(): + """ + Returns Profit Centers from CMDB (CIs with type Profit Center) + """ + profit_center_type = CIType.objects.get(name='ProfitCenter') + business_line_type = CIType.objects.get(name='BusinessLine') + for profit_center in CI.objects.filter(type=profit_center_type): + try: + description = profit_center.ciattributevalue_set.get( + attribute__name='description' + ).value + except CIAttributeValue.DoesNotExist: + description = None + business_line = profit_center.child.filter( + parent__type=business_line_type + ).values_list('parent__uid', flat=True) + yield { + 'ci_uid': profit_center.uid, + 'name': profit_center.name, + 'description': description, + 'business_line': business_line[0] if business_line else None, + } + + def get_owners(): """ Returns CIOwners from CMDB @@ -358,17 +382,17 @@ def get_services(): owners, business line etc. """ service_type = CIType.objects.get(name='Service') - business_line_type = CIType.objects.get(name='BusinessLine') + profit_center_type = CIType.objects.get(name='ProfitCenter') for service in CI.objects.filter( type=service_type ).select_related('relations'): - business_line = service.child.filter( - parent__type=business_line_type + profit_center = service.child.filter( + parent__type=profit_center_type ).values_list('parent__uid', flat=True) yield { 'ci_uid': service.uid, 'name': service.name, - 'business_line': business_line[0] if business_line else None, + 'profit_center': profit_center[0] if profit_center else None, 'business_owners': list(service.business_owners.values_list( 'id', flat=True, diff --git a/src/ralph/util/tests/tests.py b/src/ralph/util/tests/tests.py index f0234eadbd..a5af9daa44 100644 --- a/src/ralph/util/tests/tests.py +++ b/src/ralph/util/tests/tests.py @@ -214,9 +214,9 @@ def test_get_owners(self): def test_get_services(self): service = utils.ServiceFactory() - business_line = utils.BusinessLineFactory() + profit_center = utils.ProfitCenterFactory() utils.ServiceBusinessLineRelationFactory( - parent=business_line, + parent=profit_center, child=service, ) business_ownership = utils.ServiceOwnershipFactory.create_batch( @@ -233,19 +233,19 @@ def test_get_services(self): service_dict = { 'name': service.name, 'ci_uid': service.uid, - 'business_line': business_line.uid, + 'profit_center': profit_center.uid, 'business_owners': [bo.owner.id for bo in business_ownership], 'technical_owners': [to.owner.id for to in technical_ownership], } self.assertEquals(result, [service_dict]) - def test_get_services_without_business_line(self): + def test_get_services_without_profit_center(self): service = utils.ServiceFactory() result = [a for a in api_pricing.get_services()] service_dict = { 'name': service.name, 'ci_uid': service.uid, - 'business_line': None, + 'profit_center': None, 'technical_owners': [], 'business_owners': [], } diff --git a/src/ralph/util/tests/utils.py b/src/ralph/util/tests/utils.py index 956ccdc016..789186ca97 100644 --- a/src/ralph/util/tests/utils.py +++ b/src/ralph/util/tests/utils.py @@ -19,6 +19,12 @@ def type(self): return models_ci.CIType.objects.get(name='BusinessLine') +class ProfitCenterFactory(CIFactory): + @factory.lazy_attribute + def type(self): + return models_ci.CIType.objects.get(name='ProfitCenter') + + class ServiceFactory(CIFactory): @factory.lazy_attribute def type(self):