Bug#801441: jessie-pu: package bcfg2/1.3.5-1
"Adam D. Barratt" <adam@adam-barratt.org.uk> writes:
> On 2015-10-12 13:13, Arto Jantunen wrote:
>> "Adam D. Barratt" <adam@adam-barratt.org.uk> writes:
>>
>>> Control: tags -1 + moreinfo
>>>
>>> On Sat, 2015-10-10 at 09:43 +0300, Arto Jantunen wrote:
>>>> I would like to update bcfg2 in stable to match the version currently in
>>>> testing to enable it to work with Django 1.7 (bug #755645). To do this I
>>>> would
>>>> add the attached patch, which looks much worse than it is due to the db
>>>> migration files being moved around.
>>>
>>> That is rather noisy, yes. :-(
>>>
>>> Is there any chance we could have an interdiff of the before-and-after
>>> patches, to highlight the actual differences between them? In any case
>>> we'd need a full debdiff of a package built and tested on jessie before
>>> giving a definite ack.
>>
>> The patch doesn't exist in jessie, so either interdiff isn't possible or
>> I'm misunderstanding something.
>
> The latter, although possibly because I wasn't clear enough.
>
> The patch contains, for example:
>
> src/lib/Bcfg2/Reporting/migrations/0001_initial.py | 1006
> +++++++++++---------
> .../migrations/0002_convert_perms_to_mode.py | 171 ----
> .../Reporting/south_migrations/0001_initial.py | 465 +++++++++
> .../south_migrations/0002_convert_perms_to_mode.py | 171 ++++
>
> What I was looking for was an indication of what the actual difference between
> the two sets of files is, ignoring renames (e.g. are the two
> 0002_convert_perms_to_mode.py files actually exactly the same?).
>
>> The debdiff is attached (for convenience
>> built on jessie but without modifying the version number for a stable
>> update).
>
> Sorry, I meant a _source_ debdiff (in practice, that's basically always what's
> needed).
>
> On the subject of the binary debdiff however...
>
> Files in first set of .debs but not in second
> ---------------------------------------------
> -rw-r--r-- root/root
> /usr/lib/python2.7/dist-packages/Bcfg2/Reporting/migrations/0002_convert_perms_to_mode.py
> -rw-r--r-- root/root
> /usr/lib/python2.7/dist-packages/Bcfg2/Reporting/migrations/0003_expand_hash_key.py
> -rw-r--r-- root/root
> /usr/lib/python2.7/dist-packages/Bcfg2/Reporting/migrations/0004_profile_can_be_null.py
> -rw-r--r-- root/root
> /usr/lib/python2.7/dist-packages/Bcfg2/Reporting/migrations/0005_add_selinux_entry_support.py
> -rw-r--r-- root/root
> /usr/lib/python2.7/dist-packages/Bcfg2/Reporting/migrations/0006_add_user_group_entry_support.py
>
> Shouldn't there be a corresponding set of files appearing in the second
> package? (in /Reporting/south_migrations)
I don't know the answer to that question, my understanding of Django is
rather limited (which is also why I didn't write the patch to do
this). The "initial migration" file grows quite a bit, so it's entirely
possible that it ends up containing the relevant parts of those, but
this is only a theory.
Source debdiff is attached, I'll see about generating something suitable
to compare the migration files while ignoring the renames.
--
Arto Jantunen
diff -Nru bcfg2-1.3.5/debian/patches/0003-make-Bcfg2-compatible-with-django-1.7.patch bcfg2-1.3.5/debian/patches/0003-make-Bcfg2-compatible-with-django-1.7.patch
--- bcfg2-1.3.5/debian/patches/0003-make-Bcfg2-compatible-with-django-1.7.patch 1970-01-01 02:00:00.000000000 +0200
+++ bcfg2-1.3.5/debian/patches/0003-make-Bcfg2-compatible-with-django-1.7.patch 2015-09-22 13:27:53.000000000 +0300
@@ -0,0 +1,4442 @@
+From: Jonas Jochmaring <jjonas@mail.upb.de>
+Date: Fri, 22 May 2015 15:29:02 +0200
+Subject: make Bcfg2 compatible with django 1.7
+
+ - reports.wsgi uses get_wsgi_application() now
+ - old south-based migrations have been moved
+ - manage.py has been updated
+ - fix SOUTH_MIGRATION_MODULES value in settings.py
+ - fix django loading in bcfg2 server core
+ - fix django loading DjangoORM storage
+ - revert back to old django testrunner
+ - call django.setup in bcfg2-reports
+ - close the database connection after syncdb in BaseCore.__init__
+ - fixed reports.wsgi script
+---
+ reports/reports.wsgi | 19 +-
+ src/lib/Bcfg2/Reporting/Storage/DjangoORM.py | 3 +
+ src/lib/Bcfg2/Reporting/migrations/0001_initial.py | 1006 +++++++++++---------
+ .../migrations/0002_convert_perms_to_mode.py | 171 ----
+ .../Reporting/migrations/0003_expand_hash_key.py | 180 ----
+ .../migrations/0004_profile_can_be_null.py | 156 ---
+ .../migrations/0005_add_selinux_entry_support.py | 485 ----------
+ .../0006_add_user_group_entry_support.py | 340 -------
+ .../Reporting/south_migrations/0001_initial.py | 465 +++++++++
+ .../south_migrations/0002_convert_perms_to_mode.py | 171 ++++
+ .../south_migrations/0003_expand_hash_key.py | 180 ++++
+ .../south_migrations/0004_profile_can_be_null.py | 156 +++
+ .../0005_add_selinux_entry_support.py | 485 ++++++++++
+ .../0006_add_user_group_entry_support.py | 340 +++++++
+ .../Bcfg2/Reporting/south_migrations/__init__.py | 0
+ src/lib/Bcfg2/Server/Admin/Reports.py | 14 +-
+ src/lib/Bcfg2/Server/Core.py | 4 +
+ src/lib/Bcfg2/manage.py | 27 +-
+ src/lib/Bcfg2/settings.py | 11 +-
+ src/sbin/bcfg2-reports | 3 +
+ 20 files changed, 2399 insertions(+), 1817 deletions(-)
+ delete mode 100644 src/lib/Bcfg2/Reporting/migrations/0002_convert_perms_to_mode.py
+ delete mode 100644 src/lib/Bcfg2/Reporting/migrations/0003_expand_hash_key.py
+ delete mode 100644 src/lib/Bcfg2/Reporting/migrations/0004_profile_can_be_null.py
+ delete mode 100644 src/lib/Bcfg2/Reporting/migrations/0005_add_selinux_entry_support.py
+ delete mode 100644 src/lib/Bcfg2/Reporting/migrations/0006_add_user_group_entry_support.py
+ create mode 100644 src/lib/Bcfg2/Reporting/south_migrations/0001_initial.py
+ create mode 100644 src/lib/Bcfg2/Reporting/south_migrations/0002_convert_perms_to_mode.py
+ create mode 100644 src/lib/Bcfg2/Reporting/south_migrations/0003_expand_hash_key.py
+ create mode 100644 src/lib/Bcfg2/Reporting/south_migrations/0004_profile_can_be_null.py
+ create mode 100644 src/lib/Bcfg2/Reporting/south_migrations/0005_add_selinux_entry_support.py
+ create mode 100644 src/lib/Bcfg2/Reporting/south_migrations/0006_add_user_group_entry_support.py
+ create mode 100644 src/lib/Bcfg2/Reporting/south_migrations/__init__.py
+
+diff --git a/reports/reports.wsgi b/reports/reports.wsgi
+index 92401d7..75f1a73 100644
+--- a/reports/reports.wsgi
++++ b/reports/reports.wsgi
+@@ -1,9 +1,18 @@
+ import os
+ import Bcfg2.settings
+ os.environ['DJANGO_SETTINGS_MODULE'] = 'Bcfg2.settings'
+-import django.core.handlers.wsgi
++import django
+
+-def application(environ, start_response):
+- if 'BCFG2_CONFIG_FILE' in environ:
+- Bcfg2.settings.read_config(cfile=environ['BCFG2_CONFIG_FILE'])
+- return django.core.handlers.wsgi.WSGIHandler()(environ, start_response)
++if django.VERSION[0] == 1 and django.VERSION[1] >= 7:
++ from django.core.wsgi import get_wsgi_application
++ def application(environ, start_response):
++ if 'BCFG2_CONFIG_FILE' in environ:
++ Bcfg2.settings.read_config(cfile=environ['BCFG2_CONFIG_FILE'])
++ return get_wsgi_application()(environ, start_response)
++
++else:
++ import django.core.handlers.wsgi
++ def application(environ, start_response):
++ if 'BCFG2_CONFIG_FILE' in environ:
++ Bcfg2.settings.read_config(cfile=environ['BCFG2_CONFIG_FILE'])
++ return django.core.handlers.wsgi.WSGIHandler()(environ, start_response)
+diff --git a/src/lib/Bcfg2/Reporting/Storage/DjangoORM.py b/src/lib/Bcfg2/Reporting/Storage/DjangoORM.py
+index 0bb3111..8eadb87 100644
+--- a/src/lib/Bcfg2/Reporting/Storage/DjangoORM.py
++++ b/src/lib/Bcfg2/Reporting/Storage/DjangoORM.py
+@@ -19,6 +19,9 @@ from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
+ from django.db.models import FieldDoesNotExist
+ from django.core.cache import cache
+ from django import db
++import django
++if django.VERSION[0] == 1 and django.VERSION[1] >= 7:
++ django.setup()
+
+ #Used by GetCurrentEntry
+ import difflib
+diff --git a/src/lib/Bcfg2/Reporting/migrations/0001_initial.py b/src/lib/Bcfg2/Reporting/migrations/0001_initial.py
+index 609290e..aab0df6 100644
+--- a/src/lib/Bcfg2/Reporting/migrations/0001_initial.py
++++ b/src/lib/Bcfg2/Reporting/migrations/0001_initial.py
+@@ -1,465 +1,543 @@
+ # -*- coding: utf-8 -*-
+-import datetime
+-from south.db import db
+-from south.v2 import SchemaMigration
+-from django.db import models
+-
+-
+-class Migration(SchemaMigration):
+-
+- def forwards(self, orm):
+- # Adding model 'Client'
+- db.create_table('Reporting_client', (
+- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+- ('creation', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
+- ('name', self.gf('django.db.models.fields.CharField')(max_length=128)),
+- ('current_interaction', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='parent_client', null=True, to=orm['Reporting.Interaction'])),
+- ('expiration', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)),
+- ))
+- db.send_create_signal('Reporting', ['Client'])
+-
+- # Adding model 'Interaction'
+- db.create_table('Reporting_interaction', (
+- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+- ('client', self.gf('django.db.models.fields.related.ForeignKey')(related_name='interactions', to=orm['Reporting.Client'])),
+- ('timestamp', self.gf('django.db.models.fields.DateTimeField')(db_index=True)),
+- ('state', self.gf('django.db.models.fields.CharField')(max_length=32)),
+- ('repo_rev_code', self.gf('django.db.models.fields.CharField')(max_length=64)),
+- ('server', self.gf('django.db.models.fields.CharField')(max_length=256)),
+- ('good_count', self.gf('django.db.models.fields.IntegerField')()),
+- ('total_count', self.gf('django.db.models.fields.IntegerField')()),
+- ('bad_count', self.gf('django.db.models.fields.IntegerField')(default=0)),
+- ('modified_count', self.gf('django.db.models.fields.IntegerField')(default=0)),
+- ('extra_count', self.gf('django.db.models.fields.IntegerField')(default=0)),
+- ('profile', self.gf('django.db.models.fields.related.ForeignKey')(related_name='+', to=orm['Reporting.Group'])),
+- ))
+- db.send_create_signal('Reporting', ['Interaction'])
+-
+- # Adding unique constraint on 'Interaction', fields ['client', 'timestamp']
+- db.create_unique('Reporting_interaction', ['client_id', 'timestamp'])
+-
+- # Adding M2M table for field actions on 'Interaction'
+- db.create_table('Reporting_interaction_actions', (
+- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+- ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+- ('actionentry', models.ForeignKey(orm['Reporting.actionentry'], null=False))
+- ))
+- db.create_unique('Reporting_interaction_actions', ['interaction_id', 'actionentry_id'])
+-
+- # Adding M2M table for field packages on 'Interaction'
+- db.create_table('Reporting_interaction_packages', (
+- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+- ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+- ('packageentry', models.ForeignKey(orm['Reporting.packageentry'], null=False))
+- ))
+- db.create_unique('Reporting_interaction_packages', ['interaction_id', 'packageentry_id'])
+-
+- # Adding M2M table for field paths on 'Interaction'
+- db.create_table('Reporting_interaction_paths', (
+- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+- ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+- ('pathentry', models.ForeignKey(orm['Reporting.pathentry'], null=False))
+- ))
+- db.create_unique('Reporting_interaction_paths', ['interaction_id', 'pathentry_id'])
+-
+- # Adding M2M table for field services on 'Interaction'
+- db.create_table('Reporting_interaction_services', (
+- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+- ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+- ('serviceentry', models.ForeignKey(orm['Reporting.serviceentry'], null=False))
+- ))
+- db.create_unique('Reporting_interaction_services', ['interaction_id', 'serviceentry_id'])
+-
+- # Adding M2M table for field failures on 'Interaction'
+- db.create_table('Reporting_interaction_failures', (
+- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+- ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+- ('failureentry', models.ForeignKey(orm['Reporting.failureentry'], null=False))
+- ))
+- db.create_unique('Reporting_interaction_failures', ['interaction_id', 'failureentry_id'])
+-
+- # Adding M2M table for field groups on 'Interaction'
+- db.create_table('Reporting_interaction_groups', (
+- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+- ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+- ('group', models.ForeignKey(orm['Reporting.group'], null=False))
+- ))
+- db.create_unique('Reporting_interaction_groups', ['interaction_id', 'group_id'])
+-
+- # Adding M2M table for field bundles on 'Interaction'
+- db.create_table('Reporting_interaction_bundles', (
+- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+- ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+- ('bundle', models.ForeignKey(orm['Reporting.bundle'], null=False))
+- ))
+- db.create_unique('Reporting_interaction_bundles', ['interaction_id', 'bundle_id'])
+-
+- # Adding model 'Performance'
+- db.create_table('Reporting_performance', (
+- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+- ('interaction', self.gf('django.db.models.fields.related.ForeignKey')(related_name='performance_items', to=orm['Reporting.Interaction'])),
+- ('metric', self.gf('django.db.models.fields.CharField')(max_length=128)),
+- ('value', self.gf('django.db.models.fields.DecimalField')(max_digits=32, decimal_places=16)),
+- ))
+- db.send_create_signal('Reporting', ['Performance'])
+-
+- # Adding model 'Group'
+- db.create_table('Reporting_group', (
+- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+- ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=255)),
+- ('profile', self.gf('django.db.models.fields.BooleanField')(default=False)),
+- ('public', self.gf('django.db.models.fields.BooleanField')(default=False)),
+- ('category', self.gf('django.db.models.fields.CharField')(max_length=1024, blank=True)),
+- ('comment', self.gf('django.db.models.fields.TextField')(blank=True)),
+- ))
+- db.send_create_signal('Reporting', ['Group'])
+-
+- # Adding M2M table for field groups on 'Group'
+- db.create_table('Reporting_group_groups', (
+- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+- ('from_group', models.ForeignKey(orm['Reporting.group'], null=False)),
+- ('to_group', models.ForeignKey(orm['Reporting.group'], null=False))
+- ))
+- db.create_unique('Reporting_group_groups', ['from_group_id', 'to_group_id'])
+-
+- # Adding M2M table for field bundles on 'Group'
+- db.create_table('Reporting_group_bundles', (
+- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+- ('group', models.ForeignKey(orm['Reporting.group'], null=False)),
+- ('bundle', models.ForeignKey(orm['Reporting.bundle'], null=False))
+- ))
+- db.create_unique('Reporting_group_bundles', ['group_id', 'bundle_id'])
+-
+- # Adding model 'Bundle'
+- db.create_table('Reporting_bundle', (
+- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+- ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=255)),
+- ))
+- db.send_create_signal('Reporting', ['Bundle'])
+-
+- # Adding model 'FilePerms'
+- db.create_table('Reporting_fileperms', (
+- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+- ('owner', self.gf('django.db.models.fields.CharField')(max_length=128)),
+- ('group', self.gf('django.db.models.fields.CharField')(max_length=128)),
+- ('perms', self.gf('django.db.models.fields.CharField')(max_length=128)),
+- ))
+- db.send_create_signal('Reporting', ['FilePerms'])
+-
+- # Adding unique constraint on 'FilePerms', fields ['owner', 'group', 'perms']
+- db.create_unique('Reporting_fileperms', ['owner', 'group', 'perms'])
+-
+- # Adding model 'FileAcl'
+- db.create_table('Reporting_fileacl', (
+- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+- ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+- ))
+- db.send_create_signal('Reporting', ['FileAcl'])
+-
+- # Adding model 'FailureEntry'
+- db.create_table('Reporting_failureentry', (
+- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+- ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+- ('hash_key', self.gf('django.db.models.fields.IntegerField')(db_index=True)),
+- ('entry_type', self.gf('django.db.models.fields.CharField')(max_length=128)),
+- ('message', self.gf('django.db.models.fields.TextField')()),
+- ))
+- db.send_create_signal('Reporting', ['FailureEntry'])
+-
+- # Adding model 'ActionEntry'
+- db.create_table('Reporting_actionentry', (
+- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+- ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+- ('hash_key', self.gf('django.db.models.fields.IntegerField')(db_index=True)),
+- ('state', self.gf('django.db.models.fields.IntegerField')()),
+- ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+- ('status', self.gf('django.db.models.fields.CharField')(default='check', max_length=128)),
+- ('output', self.gf('django.db.models.fields.IntegerField')(default=0)),
+- ))
+- db.send_create_signal('Reporting', ['ActionEntry'])
+-
+- # Adding model 'PackageEntry'
+- db.create_table('Reporting_packageentry', (
+- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+- ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+- ('hash_key', self.gf('django.db.models.fields.IntegerField')(db_index=True)),
+- ('state', self.gf('django.db.models.fields.IntegerField')()),
+- ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+- ('target_version', self.gf('django.db.models.fields.CharField')(default='', max_length=1024)),
+- ('current_version', self.gf('django.db.models.fields.CharField')(max_length=1024)),
+- ('verification_details', self.gf('django.db.models.fields.TextField')(default='')),
+- ))
+- db.send_create_signal('Reporting', ['PackageEntry'])
+-
+- # Adding model 'PathEntry'
+- db.create_table('Reporting_pathentry', (
+- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+- ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+- ('hash_key', self.gf('django.db.models.fields.IntegerField')(db_index=True)),
+- ('state', self.gf('django.db.models.fields.IntegerField')()),
+- ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+- ('path_type', self.gf('django.db.models.fields.CharField')(max_length=128)),
+- ('target_perms', self.gf('django.db.models.fields.related.ForeignKey')(related_name='+', to=orm['Reporting.FilePerms'])),
+- ('current_perms', self.gf('django.db.models.fields.related.ForeignKey')(related_name='+', to=orm['Reporting.FilePerms'])),
+- ('detail_type', self.gf('django.db.models.fields.IntegerField')(default=0)),
+- ('details', self.gf('django.db.models.fields.TextField')(default='')),
+- ))
+- db.send_create_signal('Reporting', ['PathEntry'])
+-
+- # Adding M2M table for field acls on 'PathEntry'
+- db.create_table('Reporting_pathentry_acls', (
+- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+- ('pathentry', models.ForeignKey(orm['Reporting.pathentry'], null=False)),
+- ('fileacl', models.ForeignKey(orm['Reporting.fileacl'], null=False))
+- ))
+- db.create_unique('Reporting_pathentry_acls', ['pathentry_id', 'fileacl_id'])
+-
+- # Adding model 'LinkEntry'
+- db.create_table('Reporting_linkentry', (
+- ('pathentry_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['Reporting.PathEntry'], unique=True, primary_key=True)),
+- ('target_path', self.gf('django.db.models.fields.CharField')(max_length=1024, blank=True)),
+- ('current_path', self.gf('django.db.models.fields.CharField')(max_length=1024, blank=True)),
+- ))
+- db.send_create_signal('Reporting', ['LinkEntry'])
+-
+- # Adding model 'DeviceEntry'
+- db.create_table('Reporting_deviceentry', (
+- ('pathentry_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['Reporting.PathEntry'], unique=True, primary_key=True)),
+- ('device_type', self.gf('django.db.models.fields.CharField')(max_length=16)),
+- ('target_major', self.gf('django.db.models.fields.IntegerField')()),
+- ('target_minor', self.gf('django.db.models.fields.IntegerField')()),
+- ('current_major', self.gf('django.db.models.fields.IntegerField')()),
+- ('current_minor', self.gf('django.db.models.fields.IntegerField')()),
+- ))
+- db.send_create_signal('Reporting', ['DeviceEntry'])
+-
+- # Adding model 'ServiceEntry'
+- db.create_table('Reporting_serviceentry', (
+- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+- ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+- ('hash_key', self.gf('django.db.models.fields.IntegerField')(db_index=True)),
+- ('state', self.gf('django.db.models.fields.IntegerField')()),
+- ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+- ('target_status', self.gf('django.db.models.fields.CharField')(default='', max_length=128)),
+- ('current_status', self.gf('django.db.models.fields.CharField')(default='', max_length=128)),
+- ))
+- db.send_create_signal('Reporting', ['ServiceEntry'])
+-
+-
+- def backwards(self, orm):
+- # Removing unique constraint on 'FilePerms', fields ['owner', 'group', 'perms']
+- db.delete_unique('Reporting_fileperms', ['owner', 'group', 'perms'])
+-
+- # Removing unique constraint on 'Interaction', fields ['client', 'timestamp']
+- db.delete_unique('Reporting_interaction', ['client_id', 'timestamp'])
+-
+- # Deleting model 'Client'
+- db.delete_table('Reporting_client')
+-
+- # Deleting model 'Interaction'
+- db.delete_table('Reporting_interaction')
+-
+- # Removing M2M table for field actions on 'Interaction'
+- db.delete_table('Reporting_interaction_actions')
+-
+- # Removing M2M table for field packages on 'Interaction'
+- db.delete_table('Reporting_interaction_packages')
+-
+- # Removing M2M table for field paths on 'Interaction'
+- db.delete_table('Reporting_interaction_paths')
+-
+- # Removing M2M table for field services on 'Interaction'
+- db.delete_table('Reporting_interaction_services')
+-
+- # Removing M2M table for field failures on 'Interaction'
+- db.delete_table('Reporting_interaction_failures')
+-
+- # Removing M2M table for field groups on 'Interaction'
+- db.delete_table('Reporting_interaction_groups')
+-
+- # Removing M2M table for field bundles on 'Interaction'
+- db.delete_table('Reporting_interaction_bundles')
+-
+- # Deleting model 'Performance'
+- db.delete_table('Reporting_performance')
+-
+- # Deleting model 'Group'
+- db.delete_table('Reporting_group')
+-
+- # Removing M2M table for field groups on 'Group'
+- db.delete_table('Reporting_group_groups')
+-
+- # Removing M2M table for field bundles on 'Group'
+- db.delete_table('Reporting_group_bundles')
+-
+- # Deleting model 'Bundle'
+- db.delete_table('Reporting_bundle')
+-
+- # Deleting model 'FilePerms'
+- db.delete_table('Reporting_fileperms')
+-
+- # Deleting model 'FileAcl'
+- db.delete_table('Reporting_fileacl')
+-
+- # Deleting model 'FailureEntry'
+- db.delete_table('Reporting_failureentry')
+-
+- # Deleting model 'ActionEntry'
+- db.delete_table('Reporting_actionentry')
+-
+- # Deleting model 'PackageEntry'
+- db.delete_table('Reporting_packageentry')
+-
+- # Deleting model 'PathEntry'
+- db.delete_table('Reporting_pathentry')
+-
+- # Removing M2M table for field acls on 'PathEntry'
+- db.delete_table('Reporting_pathentry_acls')
+-
+- # Deleting model 'LinkEntry'
+- db.delete_table('Reporting_linkentry')
+-
+- # Deleting model 'DeviceEntry'
+- db.delete_table('Reporting_deviceentry')
+-
+- # Deleting model 'ServiceEntry'
+- db.delete_table('Reporting_serviceentry')
+-
+-
+- models = {
+- 'Reporting.actionentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'ActionEntry'},
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'output': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {}),
+- 'status': ('django.db.models.fields.CharField', [], {'default': "'check'", 'max_length': '128'})
+- },
+- 'Reporting.bundle': {
+- 'Meta': {'ordering': "('name',)", 'object_name': 'Bundle'},
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
+- },
+- 'Reporting.client': {
+- 'Meta': {'object_name': 'Client'},
+- 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+- 'current_interaction': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parent_client'", 'null': 'True', 'to': "orm['Reporting.Interaction']"}),
+- 'expiration': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+- },
+- 'Reporting.deviceentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'DeviceEntry', '_ormbases': ['Reporting.PathEntry']},
+- 'current_major': ('django.db.models.fields.IntegerField', [], {}),
+- 'current_minor': ('django.db.models.fields.IntegerField', [], {}),
+- 'device_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
+- 'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
+- 'target_major': ('django.db.models.fields.IntegerField', [], {}),
+- 'target_minor': ('django.db.models.fields.IntegerField', [], {})
+- },
+- 'Reporting.failureentry': {
+- 'Meta': {'object_name': 'FailureEntry'},
+- 'entry_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'message': ('django.db.models.fields.TextField', [], {}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
+- },
+- 'Reporting.fileacl': {
+- 'Meta': {'object_name': 'FileAcl'},
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
+- },
+- 'Reporting.fileperms': {
+- 'Meta': {'unique_together': "(('owner', 'group', 'perms'),)", 'object_name': 'FilePerms'},
+- 'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'perms': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+- },
+- 'Reporting.group': {
+- 'Meta': {'ordering': "('name',)", 'object_name': 'Group'},
+- 'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
+- 'category': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
+- 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+- 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+- 'profile': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+- 'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+- },
+- 'Reporting.interaction': {
+- 'Meta': {'ordering': "['-timestamp']", 'unique_together': "(('client', 'timestamp'),)", 'object_name': 'Interaction'},
+- 'actions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ActionEntry']", 'symmetrical': 'False'}),
+- 'bad_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
+- 'client': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interactions'", 'to': "orm['Reporting.Client']"}),
+- 'extra_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'failures': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FailureEntry']", 'symmetrical': 'False'}),
+- 'good_count': ('django.db.models.fields.IntegerField', [], {}),
+- 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'modified_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'packages': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PackageEntry']", 'symmetrical': 'False'}),
+- 'paths': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PathEntry']", 'symmetrical': 'False'}),
+- 'profile': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.Group']"}),
+- 'repo_rev_code': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+- 'server': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
+- 'services': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ServiceEntry']", 'symmetrical': 'False'}),
+- 'state': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
+- 'timestamp': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
+- 'total_count': ('django.db.models.fields.IntegerField', [], {})
+- },
+- 'Reporting.linkentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'LinkEntry', '_ormbases': ['Reporting.PathEntry']},
+- 'current_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
+- 'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
+- 'target_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'})
+- },
+- 'Reporting.packageentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'PackageEntry'},
+- 'current_version': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {}),
+- 'target_version': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}),
+- 'verification_details': ('django.db.models.fields.TextField', [], {'default': "''"})
+- },
+- 'Reporting.pathentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'PathEntry'},
+- 'acls': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FileAcl']", 'symmetrical': 'False'}),
+- 'current_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"}),
+- 'detail_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'details': ('django.db.models.fields.TextField', [], {'default': "''"}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'path_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {}),
+- 'target_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"})
+- },
+- 'Reporting.performance': {
+- 'Meta': {'object_name': 'Performance'},
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'interaction': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'performance_items'", 'to': "orm['Reporting.Interaction']"}),
+- 'metric': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '32', 'decimal_places': '16'})
+- },
+- 'Reporting.serviceentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'ServiceEntry'},
+- 'current_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {}),
+- 'target_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'})
+- }
+- }
+-
+- complete_apps = ['Reporting']
+\ No newline at end of file
++from __future__ import unicode_literals
++
++from django.db import models, migrations
++
++
++class Migration(migrations.Migration):
++
++ dependencies = [
++ ]
++
++ operations = [
++ migrations.CreateModel(
++ name='ActionEntry',
++ fields=[
++ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
++ ('name', models.CharField(max_length=128, db_index=True)),
++ ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
++ ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
++ ('exists', models.BooleanField(default=True)),
++ ('status', models.CharField(default=b'check', max_length=128)),
++ ('output', models.IntegerField(default=0)),
++ ],
++ options={
++ 'ordering': ('state', 'name'),
++ 'abstract': False,
++ },
++ bases=(models.Model,),
++ ),
++ migrations.CreateModel(
++ name='Bundle',
++ fields=[
++ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
++ ('name', models.CharField(unique=True, max_length=255)),
++ ],
++ options={
++ 'ordering': ('name',),
++ },
++ bases=(models.Model,),
++ ),
++ migrations.CreateModel(
++ name='Client',
++ fields=[
++ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
++ ('creation', models.DateTimeField(auto_now_add=True)),
++ ('name', models.CharField(max_length=128)),
++ ('expiration', models.DateTimeField(null=True, blank=True)),
++ ],
++ options={
++ },
++ bases=(models.Model,),
++ ),
++ migrations.CreateModel(
++ name='FailureEntry',
++ fields=[
++ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
++ ('name', models.CharField(max_length=128, db_index=True)),
++ ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
++ ('entry_type', models.CharField(max_length=128)),
++ ('message', models.TextField()),
++ ],
++ options={
++ 'abstract': False,
++ },
++ bases=(models.Model,),
++ ),
++ migrations.CreateModel(
++ name='FileAcl',
++ fields=[
++ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
++ ('name', models.CharField(max_length=128, db_index=True)),
++ ],
++ options={
++ },
++ bases=(models.Model,),
++ ),
++ migrations.CreateModel(
++ name='FilePerms',
++ fields=[
++ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
++ ('owner', models.CharField(max_length=128)),
++ ('group', models.CharField(max_length=128)),
++ ('mode', models.CharField(max_length=128)),
++ ],
++ options={
++ },
++ bases=(models.Model,),
++ ),
++ migrations.CreateModel(
++ name='Group',
++ fields=[
++ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
++ ('name', models.CharField(unique=True, max_length=255)),
++ ('profile', models.BooleanField(default=False)),
++ ('public', models.BooleanField(default=False)),
++ ('category', models.CharField(max_length=1024, blank=True)),
++ ('comment', models.TextField(blank=True)),
++ ('bundles', models.ManyToManyField(to='Reporting.Bundle')),
++ ('groups', models.ManyToManyField(to='Reporting.Group')),
++ ],
++ options={
++ 'ordering': ('name',),
++ },
++ bases=(models.Model,),
++ ),
++ migrations.CreateModel(
++ name='Interaction',
++ fields=[
++ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
++ ('timestamp', models.DateTimeField(db_index=True)),
++ ('state', models.CharField(max_length=32)),
++ ('repo_rev_code', models.CharField(max_length=64)),
++ ('server', models.CharField(max_length=256)),
++ ('good_count', models.IntegerField()),
++ ('total_count', models.IntegerField()),
++ ('bad_count', models.IntegerField(default=0)),
++ ('modified_count', models.IntegerField(default=0)),
++ ('extra_count', models.IntegerField(default=0)),
++ ('actions', models.ManyToManyField(to='Reporting.ActionEntry')),
++ ('bundles', models.ManyToManyField(to='Reporting.Bundle')),
++ ('client', models.ForeignKey(related_name='interactions', to='Reporting.Client')),
++ ('failures', models.ManyToManyField(to='Reporting.FailureEntry')),
++ ('groups', models.ManyToManyField(to='Reporting.Group')),
++ ],
++ options={
++ 'ordering': ['-timestamp'],
++ 'get_latest_by': 'timestamp',
++ },
++ bases=(models.Model,),
++ ),
++ migrations.CreateModel(
++ name='PackageEntry',
++ fields=[
++ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
++ ('name', models.CharField(max_length=128, db_index=True)),
++ ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
++ ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
++ ('exists', models.BooleanField(default=True)),
++ ('target_version', models.CharField(default=b'', max_length=1024)),
++ ('current_version', models.CharField(max_length=1024)),
++ ('verification_details', models.TextField(default=b'')),
++ ],
++ options={
++ 'ordering': ('state', 'name'),
++ 'abstract': False,
++ },
++ bases=(models.Model,),
++ ),
++ migrations.CreateModel(
++ name='PathEntry',
++ fields=[
++ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
++ ('name', models.CharField(max_length=128, db_index=True)),
++ ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
++ ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
++ ('exists', models.BooleanField(default=True)),
++ ('path_type', models.CharField(max_length=128, choices=[(b'device', b'Device'), (b'directory', b'Directory'), (b'hardlink', b'Hard Link'), (b'nonexistent', b'Non Existent'), (b'permissions', b'Permissions'), (b'symlink', b'Symlink')])),
++ ('detail_type', models.IntegerField(default=0, choices=[(0, b'Unused'), (1, b'Diff'), (2, b'Binary'), (3, b'Sensitive'), (4, b'Size limit exceeded'), (5, b'VCS output'), (6, b'Pruned paths')])),
++ ('details', models.TextField(default=b'')),
++ ],
++ options={
++ 'ordering': ('state', 'name'),
++ 'abstract': False,
++ },
++ bases=(models.Model,),
++ ),
++ migrations.CreateModel(
++ name='LinkEntry',
++ fields=[
++ ('pathentry_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='Reporting.PathEntry')),
++ ('target_path', models.CharField(max_length=1024, blank=True)),
++ ('current_path', models.CharField(max_length=1024, blank=True)),
++ ],
++ options={
++ 'ordering': ('state', 'name'),
++ 'abstract': False,
++ },
++ bases=('Reporting.pathentry',),
++ ),
++ migrations.CreateModel(
++ name='DeviceEntry',
++ fields=[
++ ('pathentry_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='Reporting.PathEntry')),
++ ('device_type', models.CharField(max_length=16, choices=[(b'block', b'Block'), (b'char', b'Char'), (b'fifo', b'Fifo')])),
++ ('target_major', models.IntegerField()),
++ ('target_minor', models.IntegerField()),
++ ('current_major', models.IntegerField()),
++ ('current_minor', models.IntegerField()),
++ ],
++ options={
++ 'ordering': ('state', 'name'),
++ 'abstract': False,
++ },
++ bases=('Reporting.pathentry',),
++ ),
++ migrations.CreateModel(
++ name='Performance',
++ fields=[
++ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
++ ('metric', models.CharField(max_length=128)),
++ ('value', models.DecimalField(max_digits=32, decimal_places=16)),
++ ('interaction', models.ForeignKey(related_name='performance_items', to='Reporting.Interaction')),
++ ],
++ options={
++ },
++ bases=(models.Model,),
++ ),
++ migrations.CreateModel(
++ name='POSIXGroupEntry',
++ fields=[
++ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
++ ('name', models.CharField(max_length=128, db_index=True)),
++ ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
++ ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
++ ('exists', models.BooleanField(default=True)),
++ ('gid', models.IntegerField(null=True)),
++ ('current_gid', models.IntegerField(null=True)),
++ ],
++ options={
++ 'ordering': ('state', 'name'),
++ 'abstract': False,
++ },
++ bases=(models.Model,),
++ ),
++ migrations.CreateModel(
++ name='POSIXUserEntry',
++ fields=[
++ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
++ ('name', models.CharField(max_length=128, db_index=True)),
++ ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
++ ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
++ ('exists', models.BooleanField(default=True)),
++ ('uid', models.IntegerField(null=True)),
++ ('current_uid', models.IntegerField(null=True)),
++ ('group', models.CharField(max_length=64)),
++ ('current_group', models.CharField(max_length=64, null=True)),
++ ('gecos', models.CharField(max_length=1024)),
++ ('current_gecos', models.CharField(max_length=1024, null=True)),
++ ('home', models.CharField(max_length=1024)),
++ ('current_home', models.CharField(max_length=1024, null=True)),
++ ('shell', models.CharField(default=b'/bin/bash', max_length=1024)),
++ ('current_shell', models.CharField(max_length=1024, null=True)),
++ ],
++ options={
++ 'ordering': ('state', 'name'),
++ 'abstract': False,
++ },
++ bases=(models.Model,),
++ ),
++ migrations.CreateModel(
++ name='SEBooleanEntry',
++ fields=[
++ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
++ ('name', models.CharField(max_length=128, db_index=True)),
++ ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
++ ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
++ ('exists', models.BooleanField(default=True)),
++ ('value', models.BooleanField(default=True)),
++ ],
++ options={
++ 'ordering': ('state', 'name'),
++ 'abstract': False,
++ },
++ bases=(models.Model,),
++ ),
++ migrations.CreateModel(
++ name='SEFcontextEntry',
++ fields=[
++ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
++ ('name', models.CharField(max_length=128, db_index=True)),
++ ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
++ ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
++ ('exists', models.BooleanField(default=True)),
++ ('selinuxtype', models.CharField(max_length=128)),
++ ('current_selinuxtype', models.CharField(max_length=128, null=True)),
++ ('filetype', models.CharField(max_length=16)),
++ ],
++ options={
++ 'ordering': ('state', 'name'),
++ 'abstract': False,
++ },
++ bases=(models.Model,),
++ ),
++ migrations.CreateModel(
++ name='SEInterfaceEntry',
++ fields=[
++ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
++ ('name', models.CharField(max_length=128, db_index=True)),
++ ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
++ ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
++ ('exists', models.BooleanField(default=True)),
++ ('selinuxtype', models.CharField(max_length=128)),
++ ('current_selinuxtype', models.CharField(max_length=128, null=True)),
++ ],
++ options={
++ 'ordering': ('state', 'name'),
++ 'abstract': False,
++ },
++ bases=(models.Model,),
++ ),
++ migrations.CreateModel(
++ name='SELoginEntry',
++ fields=[
++ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
++ ('name', models.CharField(max_length=128, db_index=True)),
++ ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
++ ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
++ ('exists', models.BooleanField(default=True)),
++ ('selinuxuser', models.CharField(max_length=128)),
++ ('current_selinuxuser', models.CharField(max_length=128, null=True)),
++ ],
++ options={
++ 'ordering': ('state', 'name'),
++ 'abstract': False,
++ },
++ bases=(models.Model,),
++ ),
++ migrations.CreateModel(
++ name='SEModuleEntry',
++ fields=[
++ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
++ ('name', models.CharField(max_length=128, db_index=True)),
++ ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
++ ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
++ ('exists', models.BooleanField(default=True)),
++ ('disabled', models.BooleanField(default=False)),
++ ('current_disabled', models.BooleanField(default=False)),
++ ],
++ options={
++ 'ordering': ('state', 'name'),
++ 'abstract': False,
++ },
++ bases=(models.Model,),
++ ),
++ migrations.CreateModel(
++ name='SENodeEntry',
++ fields=[
++ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
++ ('name', models.CharField(max_length=128, db_index=True)),
++ ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
++ ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
++ ('exists', models.BooleanField(default=True)),
++ ('selinuxtype', models.CharField(max_length=128)),
++ ('current_selinuxtype', models.CharField(max_length=128, null=True)),
++ ('proto', models.CharField(max_length=4)),
++ ],
++ options={
++ 'ordering': ('state', 'name'),
++ 'abstract': False,
++ },
++ bases=(models.Model,),
++ ),
++ migrations.CreateModel(
++ name='SEPermissiveEntry',
++ fields=[
++ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
++ ('name', models.CharField(max_length=128, db_index=True)),
++ ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
++ ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
++ ('exists', models.BooleanField(default=True)),
++ ],
++ options={
++ 'ordering': ('state', 'name'),
++ 'abstract': False,
++ },
++ bases=(models.Model,),
++ ),
++ migrations.CreateModel(
++ name='SEPortEntry',
++ fields=[
++ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
++ ('name', models.CharField(max_length=128, db_index=True)),
++ ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
++ ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
++ ('exists', models.BooleanField(default=True)),
++ ('selinuxtype', models.CharField(max_length=128)),
++ ('current_selinuxtype', models.CharField(max_length=128, null=True)),
++ ],
++ options={
++ 'ordering': ('state', 'name'),
++ 'abstract': False,
++ },
++ bases=(models.Model,),
++ ),
++ migrations.CreateModel(
++ name='ServiceEntry',
++ fields=[
++ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
++ ('name', models.CharField(max_length=128, db_index=True)),
++ ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
++ ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
++ ('exists', models.BooleanField(default=True)),
++ ('target_status', models.CharField(default=b'', max_length=128)),
++ ('current_status', models.CharField(default=b'', max_length=128)),
++ ],
++ options={
++ 'ordering': ('state', 'name'),
++ 'abstract': False,
++ },
++ bases=(models.Model,),
++ ),
++ migrations.CreateModel(
++ name='SEUserEntry',
++ fields=[
++ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
++ ('name', models.CharField(max_length=128, db_index=True)),
++ ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
++ ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
++ ('exists', models.BooleanField(default=True)),
++ ('roles', models.CharField(max_length=128)),
++ ('current_roles', models.CharField(max_length=128, null=True)),
++ ('prefix', models.CharField(max_length=128)),
++ ('current_prefix', models.CharField(max_length=128, null=True)),
++ ],
++ options={
++ 'ordering': ('state', 'name'),
++ 'abstract': False,
++ },
++ bases=(models.Model,),
++ ),
++ migrations.AddField(
++ model_name='pathentry',
++ name='acls',
++ field=models.ManyToManyField(to='Reporting.FileAcl'),
++ preserve_default=True,
++ ),
++ migrations.AddField(
++ model_name='pathentry',
++ name='current_perms',
++ field=models.ForeignKey(related_name='+', to='Reporting.FilePerms'),
++ preserve_default=True,
++ ),
++ migrations.AddField(
++ model_name='pathentry',
++ name='target_perms',
++ field=models.ForeignKey(related_name='+', to='Reporting.FilePerms'),
++ preserve_default=True,
++ ),
++ migrations.AddField(
++ model_name='interaction',
++ name='packages',
++ field=models.ManyToManyField(to='Reporting.PackageEntry'),
++ preserve_default=True,
++ ),
++ migrations.AddField(
++ model_name='interaction',
++ name='paths',
++ field=models.ManyToManyField(to='Reporting.PathEntry'),
++ preserve_default=True,
++ ),
++ migrations.AddField(
++ model_name='interaction',
++ name='posixgroups',
++ field=models.ManyToManyField(to='Reporting.POSIXGroupEntry'),
++ preserve_default=True,
++ ),
++ migrations.AddField(
++ model_name='interaction',
++ name='posixusers',
++ field=models.ManyToManyField(to='Reporting.POSIXUserEntry'),
++ preserve_default=True,
++ ),
++ migrations.AddField(
++ model_name='interaction',
++ name='profile',
++ field=models.ForeignKey(related_name='+', to='Reporting.Group', null=True),
++ preserve_default=True,
++ ),
++ migrations.AddField(
++ model_name='interaction',
++ name='sebooleans',
++ field=models.ManyToManyField(to='Reporting.SEBooleanEntry'),
++ preserve_default=True,
++ ),
++ migrations.AddField(
++ model_name='interaction',
++ name='sefcontexts',
++ field=models.ManyToManyField(to='Reporting.SEFcontextEntry'),
++ preserve_default=True,
++ ),
++ migrations.AddField(
++ model_name='interaction',
++ name='seinterfaces',
++ field=models.ManyToManyField(to='Reporting.SEInterfaceEntry'),
++ preserve_default=True,
++ ),
++ migrations.AddField(
++ model_name='interaction',
++ name='selogins',
++ field=models.ManyToManyField(to='Reporting.SELoginEntry'),
++ preserve_default=True,
++ ),
++ migrations.AddField(
++ model_name='interaction',
++ name='semodules',
++ field=models.ManyToManyField(to='Reporting.SEModuleEntry'),
++ preserve_default=True,
++ ),
++ migrations.AddField(
++ model_name='interaction',
++ name='senodes',
++ field=models.ManyToManyField(to='Reporting.SENodeEntry'),
++ preserve_default=True,
++ ),
++ migrations.AddField(
++ model_name='interaction',
++ name='sepermissives',
++ field=models.ManyToManyField(to='Reporting.SEPermissiveEntry'),
++ preserve_default=True,
++ ),
++ migrations.AddField(
++ model_name='interaction',
++ name='seports',
++ field=models.ManyToManyField(to='Reporting.SEPortEntry'),
++ preserve_default=True,
++ ),
++ migrations.AddField(
++ model_name='interaction',
++ name='services',
++ field=models.ManyToManyField(to='Reporting.ServiceEntry'),
++ preserve_default=True,
++ ),
++ migrations.AddField(
++ model_name='interaction',
++ name='seusers',
++ field=models.ManyToManyField(to='Reporting.SEUserEntry'),
++ preserve_default=True,
++ ),
++ migrations.AlterUniqueTogether(
++ name='interaction',
++ unique_together=set([('client', 'timestamp')]),
++ ),
++ migrations.AlterUniqueTogether(
++ name='fileperms',
++ unique_together=set([('owner', 'group', 'mode')]),
++ ),
++ migrations.AddField(
++ model_name='client',
++ name='current_interaction',
++ field=models.ForeignKey(related_name='parent_client', blank=True, to='Reporting.Interaction', null=True),
++ preserve_default=True,
++ ),
++ ]
+diff --git a/src/lib/Bcfg2/Reporting/migrations/0002_convert_perms_to_mode.py b/src/lib/Bcfg2/Reporting/migrations/0002_convert_perms_to_mode.py
+deleted file mode 100644
+index 668094c..0000000
+--- a/src/lib/Bcfg2/Reporting/migrations/0002_convert_perms_to_mode.py
++++ /dev/null
+@@ -1,171 +0,0 @@
+-# -*- coding: utf-8 -*-
+-import datetime
+-from south.db import db
+-from south.v2 import SchemaMigration
+-from django.db import models
+-
+-from Bcfg2 import settings
+-
+-class Migration(SchemaMigration):
+-
+- def forwards(self, orm):
+- # Removing unique constraint on 'FilePerms', fields ['owner', 'perms', 'group']
+- db.delete_unique('Reporting_fileperms', ['owner', 'perms', 'group'])
+-
+- # Renaming field 'FilePerms.perms' to 'FilePerms.mode'
+- db.rename_column('Reporting_fileperms', 'perms', 'mode')
+-
+- if not settings.DATABASES['default']['ENGINE'] == 'django.db.backends.sqlite3':
+- # Adding unique constraint on 'FilePerms', fields ['owner', 'group', 'mode']
+- db.create_unique('Reporting_fileperms', ['owner', 'group', 'mode'])
+-
+-
+- def backwards(self, orm):
+- # Removing unique constraint on 'FilePerms', fields ['owner', 'group', 'mode']
+- db.delete_unique('Reporting_fileperms', ['owner', 'group', 'mode'])
+-
+- # Renaming field 'FilePerms.mode' to 'FilePerms.perms'
+- db.rename_column('Reporting_fileperms', 'mode', 'perms')
+-
+- if not settings.DATABASES['default']['ENGINE'] == 'django.db.backends.sqlite3':
+- # Adding unique constraint on 'FilePerms', fields ['owner', 'perms', 'group']
+- db.create_unique('Reporting_fileperms', ['owner', 'perms', 'group'])
+-
+-
+- models = {
+- 'Reporting.actionentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'ActionEntry'},
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'output': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {}),
+- 'status': ('django.db.models.fields.CharField', [], {'default': "'check'", 'max_length': '128'})
+- },
+- 'Reporting.bundle': {
+- 'Meta': {'ordering': "('name',)", 'object_name': 'Bundle'},
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
+- },
+- 'Reporting.client': {
+- 'Meta': {'object_name': 'Client'},
+- 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+- 'current_interaction': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parent_client'", 'null': 'True', 'to': "orm['Reporting.Interaction']"}),
+- 'expiration': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+- },
+- 'Reporting.deviceentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'DeviceEntry', '_ormbases': ['Reporting.PathEntry']},
+- 'current_major': ('django.db.models.fields.IntegerField', [], {}),
+- 'current_minor': ('django.db.models.fields.IntegerField', [], {}),
+- 'device_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
+- 'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
+- 'target_major': ('django.db.models.fields.IntegerField', [], {}),
+- 'target_minor': ('django.db.models.fields.IntegerField', [], {})
+- },
+- 'Reporting.failureentry': {
+- 'Meta': {'object_name': 'FailureEntry'},
+- 'entry_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'message': ('django.db.models.fields.TextField', [], {}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
+- },
+- 'Reporting.fileacl': {
+- 'Meta': {'object_name': 'FileAcl'},
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
+- },
+- 'Reporting.fileperms': {
+- 'Meta': {'unique_together': "(('owner', 'group', 'mode'),)", 'object_name': 'FilePerms'},
+- 'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'mode': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+- },
+- 'Reporting.group': {
+- 'Meta': {'ordering': "('name',)", 'object_name': 'Group'},
+- 'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
+- 'category': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
+- 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+- 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+- 'profile': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+- 'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+- },
+- 'Reporting.interaction': {
+- 'Meta': {'ordering': "['-timestamp']", 'unique_together': "(('client', 'timestamp'),)", 'object_name': 'Interaction'},
+- 'actions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ActionEntry']", 'symmetrical': 'False'}),
+- 'bad_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
+- 'client': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interactions'", 'to': "orm['Reporting.Client']"}),
+- 'extra_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'failures': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FailureEntry']", 'symmetrical': 'False'}),
+- 'good_count': ('django.db.models.fields.IntegerField', [], {}),
+- 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'modified_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'packages': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PackageEntry']", 'symmetrical': 'False'}),
+- 'paths': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PathEntry']", 'symmetrical': 'False'}),
+- 'profile': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.Group']"}),
+- 'repo_rev_code': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+- 'server': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
+- 'services': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ServiceEntry']", 'symmetrical': 'False'}),
+- 'state': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
+- 'timestamp': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
+- 'total_count': ('django.db.models.fields.IntegerField', [], {})
+- },
+- 'Reporting.linkentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'LinkEntry', '_ormbases': ['Reporting.PathEntry']},
+- 'current_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
+- 'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
+- 'target_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'})
+- },
+- 'Reporting.packageentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'PackageEntry'},
+- 'current_version': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {}),
+- 'target_version': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}),
+- 'verification_details': ('django.db.models.fields.TextField', [], {'default': "''"})
+- },
+- 'Reporting.pathentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'PathEntry'},
+- 'acls': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FileAcl']", 'symmetrical': 'False'}),
+- 'current_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"}),
+- 'detail_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'details': ('django.db.models.fields.TextField', [], {'default': "''"}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'path_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {}),
+- 'target_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"})
+- },
+- 'Reporting.performance': {
+- 'Meta': {'object_name': 'Performance'},
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'interaction': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'performance_items'", 'to': "orm['Reporting.Interaction']"}),
+- 'metric': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '32', 'decimal_places': '16'})
+- },
+- 'Reporting.serviceentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'ServiceEntry'},
+- 'current_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {}),
+- 'target_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'})
+- }
+- }
+-
+- complete_apps = ['Reporting']
+diff --git a/src/lib/Bcfg2/Reporting/migrations/0003_expand_hash_key.py b/src/lib/Bcfg2/Reporting/migrations/0003_expand_hash_key.py
+deleted file mode 100644
+index 2da1fa7..0000000
+--- a/src/lib/Bcfg2/Reporting/migrations/0003_expand_hash_key.py
++++ /dev/null
+@@ -1,180 +0,0 @@
+-# -*- coding: utf-8 -*-
+-import datetime
+-from south.db import db
+-from south.v2 import SchemaMigration
+-from django.db import models
+-
+-
+-class Migration(SchemaMigration):
+-
+- def forwards(self, orm):
+-
+- # Changing field 'FailureEntry.hash_key'
+- db.alter_column('Reporting_failureentry', 'hash_key', self.gf('django.db.models.fields.BigIntegerField')())
+-
+- # Changing field 'PackageEntry.hash_key'
+- db.alter_column('Reporting_packageentry', 'hash_key', self.gf('django.db.models.fields.BigIntegerField')())
+-
+- # Changing field 'ServiceEntry.hash_key'
+- db.alter_column('Reporting_serviceentry', 'hash_key', self.gf('django.db.models.fields.BigIntegerField')())
+-
+- # Changing field 'PathEntry.hash_key'
+- db.alter_column('Reporting_pathentry', 'hash_key', self.gf('django.db.models.fields.BigIntegerField')())
+-
+- # Changing field 'ActionEntry.hash_key'
+- db.alter_column('Reporting_actionentry', 'hash_key', self.gf('django.db.models.fields.BigIntegerField')())
+-
+- def backwards(self, orm):
+-
+- # Changing field 'FailureEntry.hash_key'
+- db.alter_column('Reporting_failureentry', 'hash_key', self.gf('django.db.models.fields.IntegerField')())
+-
+- # Changing field 'PackageEntry.hash_key'
+- db.alter_column('Reporting_packageentry', 'hash_key', self.gf('django.db.models.fields.IntegerField')())
+-
+- # Changing field 'ServiceEntry.hash_key'
+- db.alter_column('Reporting_serviceentry', 'hash_key', self.gf('django.db.models.fields.IntegerField')())
+-
+- # Changing field 'PathEntry.hash_key'
+- db.alter_column('Reporting_pathentry', 'hash_key', self.gf('django.db.models.fields.IntegerField')())
+-
+- # Changing field 'ActionEntry.hash_key'
+- db.alter_column('Reporting_actionentry', 'hash_key', self.gf('django.db.models.fields.IntegerField')())
+-
+- models = {
+- 'Reporting.actionentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'ActionEntry'},
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'output': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {}),
+- 'status': ('django.db.models.fields.CharField', [], {'default': "'check'", 'max_length': '128'})
+- },
+- 'Reporting.bundle': {
+- 'Meta': {'ordering': "('name',)", 'object_name': 'Bundle'},
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
+- },
+- 'Reporting.client': {
+- 'Meta': {'object_name': 'Client'},
+- 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+- 'current_interaction': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parent_client'", 'null': 'True', 'to': "orm['Reporting.Interaction']"}),
+- 'expiration': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+- },
+- 'Reporting.deviceentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'DeviceEntry', '_ormbases': ['Reporting.PathEntry']},
+- 'current_major': ('django.db.models.fields.IntegerField', [], {}),
+- 'current_minor': ('django.db.models.fields.IntegerField', [], {}),
+- 'device_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
+- 'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
+- 'target_major': ('django.db.models.fields.IntegerField', [], {}),
+- 'target_minor': ('django.db.models.fields.IntegerField', [], {})
+- },
+- 'Reporting.failureentry': {
+- 'Meta': {'object_name': 'FailureEntry'},
+- 'entry_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'message': ('django.db.models.fields.TextField', [], {}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
+- },
+- 'Reporting.fileacl': {
+- 'Meta': {'object_name': 'FileAcl'},
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
+- },
+- 'Reporting.fileperms': {
+- 'Meta': {'unique_together': "(('owner', 'group', 'mode'),)", 'object_name': 'FilePerms'},
+- 'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'mode': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+- },
+- 'Reporting.group': {
+- 'Meta': {'ordering': "('name',)", 'object_name': 'Group'},
+- 'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
+- 'category': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
+- 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+- 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+- 'profile': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+- 'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+- },
+- 'Reporting.interaction': {
+- 'Meta': {'ordering': "['-timestamp']", 'unique_together': "(('client', 'timestamp'),)", 'object_name': 'Interaction'},
+- 'actions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ActionEntry']", 'symmetrical': 'False'}),
+- 'bad_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
+- 'client': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interactions'", 'to': "orm['Reporting.Client']"}),
+- 'extra_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'failures': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FailureEntry']", 'symmetrical': 'False'}),
+- 'good_count': ('django.db.models.fields.IntegerField', [], {}),
+- 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'modified_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'packages': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PackageEntry']", 'symmetrical': 'False'}),
+- 'paths': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PathEntry']", 'symmetrical': 'False'}),
+- 'profile': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.Group']"}),
+- 'repo_rev_code': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+- 'server': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
+- 'services': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ServiceEntry']", 'symmetrical': 'False'}),
+- 'state': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
+- 'timestamp': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
+- 'total_count': ('django.db.models.fields.IntegerField', [], {})
+- },
+- 'Reporting.linkentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'LinkEntry', '_ormbases': ['Reporting.PathEntry']},
+- 'current_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
+- 'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
+- 'target_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'})
+- },
+- 'Reporting.packageentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'PackageEntry'},
+- 'current_version': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {}),
+- 'target_version': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}),
+- 'verification_details': ('django.db.models.fields.TextField', [], {'default': "''"})
+- },
+- 'Reporting.pathentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'PathEntry'},
+- 'acls': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FileAcl']", 'symmetrical': 'False'}),
+- 'current_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"}),
+- 'detail_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'details': ('django.db.models.fields.TextField', [], {'default': "''"}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'path_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {}),
+- 'target_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"})
+- },
+- 'Reporting.performance': {
+- 'Meta': {'object_name': 'Performance'},
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'interaction': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'performance_items'", 'to': "orm['Reporting.Interaction']"}),
+- 'metric': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '32', 'decimal_places': '16'})
+- },
+- 'Reporting.serviceentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'ServiceEntry'},
+- 'current_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {}),
+- 'target_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'})
+- }
+- }
+-
+- complete_apps = ['Reporting']
+\ No newline at end of file
+diff --git a/src/lib/Bcfg2/Reporting/migrations/0004_profile_can_be_null.py b/src/lib/Bcfg2/Reporting/migrations/0004_profile_can_be_null.py
+deleted file mode 100644
+index 26a053b..0000000
+--- a/src/lib/Bcfg2/Reporting/migrations/0004_profile_can_be_null.py
++++ /dev/null
+@@ -1,156 +0,0 @@
+-# -*- coding: utf-8 -*-
+-import datetime
+-from south.db import db
+-from south.v2 import SchemaMigration
+-from django.db import models
+-
+-
+-class Migration(SchemaMigration):
+-
+- def forwards(self, orm):
+-
+- # Changing field 'Interaction.profile'
+- db.alter_column('Reporting_interaction', 'profile_id', self.gf('django.db.models.fields.related.ForeignKey')(null=True, to=orm['Reporting.Group']))
+-
+- def backwards(self, orm):
+-
+- # User chose to not deal with backwards NULL issues for 'Interaction.profile'
+- raise RuntimeError("Cannot reverse this migration. 'Interaction.profile' and its values cannot be restored.")
+-
+- models = {
+- 'Reporting.actionentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'ActionEntry'},
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'output': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {}),
+- 'status': ('django.db.models.fields.CharField', [], {'default': "'check'", 'max_length': '128'})
+- },
+- 'Reporting.bundle': {
+- 'Meta': {'ordering': "('name',)", 'object_name': 'Bundle'},
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
+- },
+- 'Reporting.client': {
+- 'Meta': {'object_name': 'Client'},
+- 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+- 'current_interaction': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parent_client'", 'null': 'True', 'to': "orm['Reporting.Interaction']"}),
+- 'expiration': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+- },
+- 'Reporting.deviceentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'DeviceEntry', '_ormbases': ['Reporting.PathEntry']},
+- 'current_major': ('django.db.models.fields.IntegerField', [], {}),
+- 'current_minor': ('django.db.models.fields.IntegerField', [], {}),
+- 'device_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
+- 'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
+- 'target_major': ('django.db.models.fields.IntegerField', [], {}),
+- 'target_minor': ('django.db.models.fields.IntegerField', [], {})
+- },
+- 'Reporting.failureentry': {
+- 'Meta': {'object_name': 'FailureEntry'},
+- 'entry_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'message': ('django.db.models.fields.TextField', [], {}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
+- },
+- 'Reporting.fileacl': {
+- 'Meta': {'object_name': 'FileAcl'},
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
+- },
+- 'Reporting.fileperms': {
+- 'Meta': {'unique_together': "(('owner', 'group', 'mode'),)", 'object_name': 'FilePerms'},
+- 'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'mode': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+- },
+- 'Reporting.group': {
+- 'Meta': {'ordering': "('name',)", 'object_name': 'Group'},
+- 'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
+- 'category': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
+- 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+- 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+- 'profile': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+- 'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+- },
+- 'Reporting.interaction': {
+- 'Meta': {'ordering': "['-timestamp']", 'unique_together': "(('client', 'timestamp'),)", 'object_name': 'Interaction'},
+- 'actions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ActionEntry']", 'symmetrical': 'False'}),
+- 'bad_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
+- 'client': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interactions'", 'to': "orm['Reporting.Client']"}),
+- 'extra_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'failures': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FailureEntry']", 'symmetrical': 'False'}),
+- 'good_count': ('django.db.models.fields.IntegerField', [], {}),
+- 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'modified_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'packages': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PackageEntry']", 'symmetrical': 'False'}),
+- 'paths': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PathEntry']", 'symmetrical': 'False'}),
+- 'profile': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'null': 'True', 'to': "orm['Reporting.Group']"}),
+- 'repo_rev_code': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+- 'server': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
+- 'services': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ServiceEntry']", 'symmetrical': 'False'}),
+- 'state': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
+- 'timestamp': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
+- 'total_count': ('django.db.models.fields.IntegerField', [], {})
+- },
+- 'Reporting.linkentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'LinkEntry', '_ormbases': ['Reporting.PathEntry']},
+- 'current_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
+- 'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
+- 'target_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'})
+- },
+- 'Reporting.packageentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'PackageEntry'},
+- 'current_version': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {}),
+- 'target_version': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}),
+- 'verification_details': ('django.db.models.fields.TextField', [], {'default': "''"})
+- },
+- 'Reporting.pathentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'PathEntry'},
+- 'acls': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FileAcl']", 'symmetrical': 'False'}),
+- 'current_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"}),
+- 'detail_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'details': ('django.db.models.fields.TextField', [], {'default': "''"}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'path_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {}),
+- 'target_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"})
+- },
+- 'Reporting.performance': {
+- 'Meta': {'object_name': 'Performance'},
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'interaction': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'performance_items'", 'to': "orm['Reporting.Interaction']"}),
+- 'metric': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '32', 'decimal_places': '16'})
+- },
+- 'Reporting.serviceentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'ServiceEntry'},
+- 'current_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {}),
+- 'target_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'})
+- }
+- }
+-
+- complete_apps = ['Reporting']
+\ No newline at end of file
+diff --git a/src/lib/Bcfg2/Reporting/migrations/0005_add_selinux_entry_support.py b/src/lib/Bcfg2/Reporting/migrations/0005_add_selinux_entry_support.py
+deleted file mode 100644
+index d5f5d80..0000000
+--- a/src/lib/Bcfg2/Reporting/migrations/0005_add_selinux_entry_support.py
++++ /dev/null
+@@ -1,485 +0,0 @@
+-# -*- coding: utf-8 -*-
+-import datetime
+-from south.db import db
+-from south.v2 import SchemaMigration
+-from django.db import models
+-
+-
+-class Migration(SchemaMigration):
+-
+- def forwards(self, orm):
+- # Adding model 'SELoginEntry'
+- db.create_table('Reporting_seloginentry', (
+- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+- ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+- ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
+- ('state', self.gf('django.db.models.fields.IntegerField')()),
+- ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+- ('selinuxuser', self.gf('django.db.models.fields.CharField')(max_length=128)),
+- ('current_selinuxuser', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
+- ))
+- db.send_create_signal('Reporting', ['SELoginEntry'])
+-
+- # Adding model 'SEUserEntry'
+- db.create_table('Reporting_seuserentry', (
+- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+- ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+- ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
+- ('state', self.gf('django.db.models.fields.IntegerField')()),
+- ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+- ('roles', self.gf('django.db.models.fields.CharField')(max_length=128)),
+- ('current_roles', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
+- ('prefix', self.gf('django.db.models.fields.CharField')(max_length=128)),
+- ('current_prefix', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
+- ))
+- db.send_create_signal('Reporting', ['SEUserEntry'])
+-
+- # Adding model 'SEBooleanEntry'
+- db.create_table('Reporting_sebooleanentry', (
+- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+- ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+- ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
+- ('state', self.gf('django.db.models.fields.IntegerField')()),
+- ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+- ('value', self.gf('django.db.models.fields.BooleanField')(default=True)),
+- ))
+- db.send_create_signal('Reporting', ['SEBooleanEntry'])
+-
+- # Adding model 'SENodeEntry'
+- db.create_table('Reporting_senodeentry', (
+- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+- ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+- ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
+- ('state', self.gf('django.db.models.fields.IntegerField')()),
+- ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+- ('selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128)),
+- ('current_selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
+- ('proto', self.gf('django.db.models.fields.CharField')(max_length=4)),
+- ))
+- db.send_create_signal('Reporting', ['SENodeEntry'])
+-
+- # Adding model 'SEFcontextEntry'
+- db.create_table('Reporting_sefcontextentry', (
+- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+- ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+- ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
+- ('state', self.gf('django.db.models.fields.IntegerField')()),
+- ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+- ('selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128)),
+- ('current_selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
+- ('filetype', self.gf('django.db.models.fields.CharField')(max_length=16)),
+- ))
+- db.send_create_signal('Reporting', ['SEFcontextEntry'])
+-
+- # Adding model 'SEInterfaceEntry'
+- db.create_table('Reporting_seinterfaceentry', (
+- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+- ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+- ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
+- ('state', self.gf('django.db.models.fields.IntegerField')()),
+- ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+- ('selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128)),
+- ('current_selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
+- ))
+- db.send_create_signal('Reporting', ['SEInterfaceEntry'])
+-
+- # Adding model 'SEPermissiveEntry'
+- db.create_table('Reporting_sepermissiveentry', (
+- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+- ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+- ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
+- ('state', self.gf('django.db.models.fields.IntegerField')()),
+- ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+- ))
+- db.send_create_signal('Reporting', ['SEPermissiveEntry'])
+-
+- # Adding model 'SEModuleEntry'
+- db.create_table('Reporting_semoduleentry', (
+- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+- ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+- ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
+- ('state', self.gf('django.db.models.fields.IntegerField')()),
+- ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+- ('disabled', self.gf('django.db.models.fields.BooleanField')(default=False)),
+- ('current_disabled', self.gf('django.db.models.fields.BooleanField')(default=False)),
+- ))
+- db.send_create_signal('Reporting', ['SEModuleEntry'])
+-
+- # Adding model 'SEPortEntry'
+- db.create_table('Reporting_seportentry', (
+- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+- ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+- ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
+- ('state', self.gf('django.db.models.fields.IntegerField')()),
+- ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+- ('selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128)),
+- ('current_selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
+- ))
+- db.send_create_signal('Reporting', ['SEPortEntry'])
+-
+- # Adding M2M table for field sebooleans on 'Interaction'
+- db.create_table('Reporting_interaction_sebooleans', (
+- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+- ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+- ('sebooleanentry', models.ForeignKey(orm['Reporting.sebooleanentry'], null=False))
+- ))
+- db.create_unique('Reporting_interaction_sebooleans', ['interaction_id', 'sebooleanentry_id'])
+-
+- # Adding M2M table for field seports on 'Interaction'
+- db.create_table('Reporting_interaction_seports', (
+- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+- ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+- ('seportentry', models.ForeignKey(orm['Reporting.seportentry'], null=False))
+- ))
+- db.create_unique('Reporting_interaction_seports', ['interaction_id', 'seportentry_id'])
+-
+- # Adding M2M table for field sefcontexts on 'Interaction'
+- db.create_table('Reporting_interaction_sefcontexts', (
+- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+- ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+- ('sefcontextentry', models.ForeignKey(orm['Reporting.sefcontextentry'], null=False))
+- ))
+- db.create_unique('Reporting_interaction_sefcontexts', ['interaction_id', 'sefcontextentry_id'])
+-
+- # Adding M2M table for field senodes on 'Interaction'
+- db.create_table('Reporting_interaction_senodes', (
+- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+- ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+- ('senodeentry', models.ForeignKey(orm['Reporting.senodeentry'], null=False))
+- ))
+- db.create_unique('Reporting_interaction_senodes', ['interaction_id', 'senodeentry_id'])
+-
+- # Adding M2M table for field selogins on 'Interaction'
+- db.create_table('Reporting_interaction_selogins', (
+- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+- ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+- ('seloginentry', models.ForeignKey(orm['Reporting.seloginentry'], null=False))
+- ))
+- db.create_unique('Reporting_interaction_selogins', ['interaction_id', 'seloginentry_id'])
+-
+- # Adding M2M table for field seusers on 'Interaction'
+- db.create_table('Reporting_interaction_seusers', (
+- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+- ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+- ('seuserentry', models.ForeignKey(orm['Reporting.seuserentry'], null=False))
+- ))
+- db.create_unique('Reporting_interaction_seusers', ['interaction_id', 'seuserentry_id'])
+-
+- # Adding M2M table for field seinterfaces on 'Interaction'
+- db.create_table('Reporting_interaction_seinterfaces', (
+- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+- ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+- ('seinterfaceentry', models.ForeignKey(orm['Reporting.seinterfaceentry'], null=False))
+- ))
+- db.create_unique('Reporting_interaction_seinterfaces', ['interaction_id', 'seinterfaceentry_id'])
+-
+- # Adding M2M table for field sepermissives on 'Interaction'
+- db.create_table('Reporting_interaction_sepermissives', (
+- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+- ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+- ('sepermissiveentry', models.ForeignKey(orm['Reporting.sepermissiveentry'], null=False))
+- ))
+- db.create_unique('Reporting_interaction_sepermissives', ['interaction_id', 'sepermissiveentry_id'])
+-
+- # Adding M2M table for field semodules on 'Interaction'
+- db.create_table('Reporting_interaction_semodules', (
+- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+- ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+- ('semoduleentry', models.ForeignKey(orm['Reporting.semoduleentry'], null=False))
+- ))
+- db.create_unique('Reporting_interaction_semodules', ['interaction_id', 'semoduleentry_id'])
+-
+-
+- def backwards(self, orm):
+- # Deleting model 'SELoginEntry'
+- db.delete_table('Reporting_seloginentry')
+-
+- # Deleting model 'SEUserEntry'
+- db.delete_table('Reporting_seuserentry')
+-
+- # Deleting model 'SEBooleanEntry'
+- db.delete_table('Reporting_sebooleanentry')
+-
+- # Deleting model 'SENodeEntry'
+- db.delete_table('Reporting_senodeentry')
+-
+- # Deleting model 'SEFcontextEntry'
+- db.delete_table('Reporting_sefcontextentry')
+-
+- # Deleting model 'SEInterfaceEntry'
+- db.delete_table('Reporting_seinterfaceentry')
+-
+- # Deleting model 'SEPermissiveEntry'
+- db.delete_table('Reporting_sepermissiveentry')
+-
+- # Deleting model 'SEModuleEntry'
+- db.delete_table('Reporting_semoduleentry')
+-
+- # Deleting model 'SEPortEntry'
+- db.delete_table('Reporting_seportentry')
+-
+- # Removing M2M table for field sebooleans on 'Interaction'
+- db.delete_table('Reporting_interaction_sebooleans')
+-
+- # Removing M2M table for field seports on 'Interaction'
+- db.delete_table('Reporting_interaction_seports')
+-
+- # Removing M2M table for field sefcontexts on 'Interaction'
+- db.delete_table('Reporting_interaction_sefcontexts')
+-
+- # Removing M2M table for field senodes on 'Interaction'
+- db.delete_table('Reporting_interaction_senodes')
+-
+- # Removing M2M table for field selogins on 'Interaction'
+- db.delete_table('Reporting_interaction_selogins')
+-
+- # Removing M2M table for field seusers on 'Interaction'
+- db.delete_table('Reporting_interaction_seusers')
+-
+- # Removing M2M table for field seinterfaces on 'Interaction'
+- db.delete_table('Reporting_interaction_seinterfaces')
+-
+- # Removing M2M table for field sepermissives on 'Interaction'
+- db.delete_table('Reporting_interaction_sepermissives')
+-
+- # Removing M2M table for field semodules on 'Interaction'
+- db.delete_table('Reporting_interaction_semodules')
+-
+-
+- models = {
+- 'Reporting.actionentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'ActionEntry'},
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'output': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {}),
+- 'status': ('django.db.models.fields.CharField', [], {'default': "'check'", 'max_length': '128'})
+- },
+- 'Reporting.bundle': {
+- 'Meta': {'ordering': "('name',)", 'object_name': 'Bundle'},
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
+- },
+- 'Reporting.client': {
+- 'Meta': {'object_name': 'Client'},
+- 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+- 'current_interaction': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parent_client'", 'null': 'True', 'to': "orm['Reporting.Interaction']"}),
+- 'expiration': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+- },
+- 'Reporting.deviceentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'DeviceEntry', '_ormbases': ['Reporting.PathEntry']},
+- 'current_major': ('django.db.models.fields.IntegerField', [], {}),
+- 'current_minor': ('django.db.models.fields.IntegerField', [], {}),
+- 'device_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
+- 'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
+- 'target_major': ('django.db.models.fields.IntegerField', [], {}),
+- 'target_minor': ('django.db.models.fields.IntegerField', [], {})
+- },
+- 'Reporting.failureentry': {
+- 'Meta': {'object_name': 'FailureEntry'},
+- 'entry_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'message': ('django.db.models.fields.TextField', [], {}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
+- },
+- 'Reporting.fileacl': {
+- 'Meta': {'object_name': 'FileAcl'},
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
+- },
+- 'Reporting.fileperms': {
+- 'Meta': {'unique_together': "(('owner', 'group', 'mode'),)", 'object_name': 'FilePerms'},
+- 'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'mode': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+- },
+- 'Reporting.group': {
+- 'Meta': {'ordering': "('name',)", 'object_name': 'Group'},
+- 'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
+- 'category': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
+- 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+- 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+- 'profile': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+- 'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+- },
+- 'Reporting.interaction': {
+- 'Meta': {'ordering': "['-timestamp']", 'unique_together': "(('client', 'timestamp'),)", 'object_name': 'Interaction'},
+- 'actions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ActionEntry']", 'symmetrical': 'False'}),
+- 'bad_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
+- 'client': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interactions'", 'to': "orm['Reporting.Client']"}),
+- 'extra_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'failures': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FailureEntry']", 'symmetrical': 'False'}),
+- 'good_count': ('django.db.models.fields.IntegerField', [], {}),
+- 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'modified_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'packages': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PackageEntry']", 'symmetrical': 'False'}),
+- 'paths': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PathEntry']", 'symmetrical': 'False'}),
+- 'profile': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'null': 'True', 'to': "orm['Reporting.Group']"}),
+- 'repo_rev_code': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+- 'sebooleans': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEBooleanEntry']", 'symmetrical': 'False'}),
+- 'sefcontexts': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEFcontextEntry']", 'symmetrical': 'False'}),
+- 'seinterfaces': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEInterfaceEntry']", 'symmetrical': 'False'}),
+- 'selogins': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SELoginEntry']", 'symmetrical': 'False'}),
+- 'semodules': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEModuleEntry']", 'symmetrical': 'False'}),
+- 'senodes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SENodeEntry']", 'symmetrical': 'False'}),
+- 'sepermissives': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEPermissiveEntry']", 'symmetrical': 'False'}),
+- 'seports': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEPortEntry']", 'symmetrical': 'False'}),
+- 'server': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
+- 'services': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ServiceEntry']", 'symmetrical': 'False'}),
+- 'seusers': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEUserEntry']", 'symmetrical': 'False'}),
+- 'state': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
+- 'timestamp': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
+- 'total_count': ('django.db.models.fields.IntegerField', [], {})
+- },
+- 'Reporting.linkentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'LinkEntry', '_ormbases': ['Reporting.PathEntry']},
+- 'current_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
+- 'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
+- 'target_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'})
+- },
+- 'Reporting.packageentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'PackageEntry'},
+- 'current_version': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {}),
+- 'target_version': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}),
+- 'verification_details': ('django.db.models.fields.TextField', [], {'default': "''"})
+- },
+- 'Reporting.pathentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'PathEntry'},
+- 'acls': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FileAcl']", 'symmetrical': 'False'}),
+- 'current_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"}),
+- 'detail_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'details': ('django.db.models.fields.TextField', [], {'default': "''"}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'path_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {}),
+- 'target_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"})
+- },
+- 'Reporting.performance': {
+- 'Meta': {'object_name': 'Performance'},
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'interaction': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'performance_items'", 'to': "orm['Reporting.Interaction']"}),
+- 'metric': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '32', 'decimal_places': '16'})
+- },
+- 'Reporting.sebooleanentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEBooleanEntry'},
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {}),
+- 'value': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
+- },
+- 'Reporting.sefcontextentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEFcontextEntry'},
+- 'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'filetype': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {})
+- },
+- 'Reporting.seinterfaceentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEInterfaceEntry'},
+- 'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {})
+- },
+- 'Reporting.seloginentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SELoginEntry'},
+- 'current_selinuxuser': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'selinuxuser': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {})
+- },
+- 'Reporting.semoduleentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEModuleEntry'},
+- 'current_disabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+- 'disabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {})
+- },
+- 'Reporting.senodeentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SENodeEntry'},
+- 'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'proto': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+- 'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {})
+- },
+- 'Reporting.sepermissiveentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEPermissiveEntry'},
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {})
+- },
+- 'Reporting.seportentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEPortEntry'},
+- 'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {})
+- },
+- 'Reporting.serviceentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'ServiceEntry'},
+- 'current_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {}),
+- 'target_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'})
+- },
+- 'Reporting.seuserentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEUserEntry'},
+- 'current_prefix': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+- 'current_roles': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'prefix': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'roles': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {})
+- }
+- }
+-
+- complete_apps = ['Reporting']
+\ No newline at end of file
+diff --git a/src/lib/Bcfg2/Reporting/migrations/0006_add_user_group_entry_support.py b/src/lib/Bcfg2/Reporting/migrations/0006_add_user_group_entry_support.py
+deleted file mode 100644
+index d86e663..0000000
+--- a/src/lib/Bcfg2/Reporting/migrations/0006_add_user_group_entry_support.py
++++ /dev/null
+@@ -1,340 +0,0 @@
+-# -*- coding: utf-8 -*-
+-import datetime
+-from south.db import db
+-from south.v2 import SchemaMigration
+-from django.db import models
+-
+-
+-class Migration(SchemaMigration):
+-
+- def forwards(self, orm):
+- # Adding model 'POSIXGroupEntry'
+- db.create_table('Reporting_posixgroupentry', (
+- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+- ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+- ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
+- ('state', self.gf('django.db.models.fields.IntegerField')()),
+- ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+- ('gid', self.gf('django.db.models.fields.IntegerField')(null=True)),
+- ('current_gid', self.gf('django.db.models.fields.IntegerField')(null=True)),
+- ))
+- db.send_create_signal('Reporting', ['POSIXGroupEntry'])
+-
+- # Adding model 'POSIXUserEntry'
+- db.create_table('Reporting_posixuserentry', (
+- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+- ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+- ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
+- ('state', self.gf('django.db.models.fields.IntegerField')()),
+- ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+- ('uid', self.gf('django.db.models.fields.IntegerField')(null=True)),
+- ('current_uid', self.gf('django.db.models.fields.IntegerField')(null=True)),
+- ('group', self.gf('django.db.models.fields.CharField')(max_length=64)),
+- ('current_group', self.gf('django.db.models.fields.CharField')(max_length=64, null=True)),
+- ('gecos', self.gf('django.db.models.fields.CharField')(max_length=1024)),
+- ('current_gecos', self.gf('django.db.models.fields.CharField')(max_length=1024, null=True)),
+- ('home', self.gf('django.db.models.fields.CharField')(max_length=1024)),
+- ('current_home', self.gf('django.db.models.fields.CharField')(max_length=1024, null=True)),
+- ('shell', self.gf('django.db.models.fields.CharField')(default='/bin/bash', max_length=1024)),
+- ('current_shell', self.gf('django.db.models.fields.CharField')(max_length=1024, null=True)),
+- ))
+- db.send_create_signal('Reporting', ['POSIXUserEntry'])
+-
+- # Adding M2M table for field posixusers on 'Interaction'
+- db.create_table('Reporting_interaction_posixusers', (
+- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+- ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+- ('posixuserentry', models.ForeignKey(orm['Reporting.posixuserentry'], null=False))
+- ))
+- db.create_unique('Reporting_interaction_posixusers', ['interaction_id', 'posixuserentry_id'])
+-
+- # Adding M2M table for field posixgroups on 'Interaction'
+- db.create_table('Reporting_interaction_posixgroups', (
+- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+- ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+- ('posixgroupentry', models.ForeignKey(orm['Reporting.posixgroupentry'], null=False))
+- ))
+- db.create_unique('Reporting_interaction_posixgroups', ['interaction_id', 'posixgroupentry_id'])
+-
+-
+- def backwards(self, orm):
+- # Deleting model 'POSIXGroupEntry'
+- db.delete_table('Reporting_posixgroupentry')
+-
+- # Deleting model 'POSIXUserEntry'
+- db.delete_table('Reporting_posixuserentry')
+-
+- # Removing M2M table for field posixusers on 'Interaction'
+- db.delete_table('Reporting_interaction_posixusers')
+-
+- # Removing M2M table for field posixgroups on 'Interaction'
+- db.delete_table('Reporting_interaction_posixgroups')
+-
+-
+- models = {
+- 'Reporting.actionentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'ActionEntry'},
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'output': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {}),
+- 'status': ('django.db.models.fields.CharField', [], {'default': "'check'", 'max_length': '128'})
+- },
+- 'Reporting.bundle': {
+- 'Meta': {'ordering': "('name',)", 'object_name': 'Bundle'},
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
+- },
+- 'Reporting.client': {
+- 'Meta': {'object_name': 'Client'},
+- 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+- 'current_interaction': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parent_client'", 'null': 'True', 'to': "orm['Reporting.Interaction']"}),
+- 'expiration': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+- },
+- 'Reporting.deviceentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'DeviceEntry', '_ormbases': ['Reporting.PathEntry']},
+- 'current_major': ('django.db.models.fields.IntegerField', [], {}),
+- 'current_minor': ('django.db.models.fields.IntegerField', [], {}),
+- 'device_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
+- 'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
+- 'target_major': ('django.db.models.fields.IntegerField', [], {}),
+- 'target_minor': ('django.db.models.fields.IntegerField', [], {})
+- },
+- 'Reporting.failureentry': {
+- 'Meta': {'object_name': 'FailureEntry'},
+- 'entry_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'message': ('django.db.models.fields.TextField', [], {}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
+- },
+- 'Reporting.fileacl': {
+- 'Meta': {'object_name': 'FileAcl'},
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
+- },
+- 'Reporting.fileperms': {
+- 'Meta': {'unique_together': "(('owner', 'group', 'mode'),)", 'object_name': 'FilePerms'},
+- 'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'mode': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+- },
+- 'Reporting.group': {
+- 'Meta': {'ordering': "('name',)", 'object_name': 'Group'},
+- 'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
+- 'category': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
+- 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+- 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+- 'profile': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+- 'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+- },
+- 'Reporting.interaction': {
+- 'Meta': {'ordering': "['-timestamp']", 'unique_together': "(('client', 'timestamp'),)", 'object_name': 'Interaction'},
+- 'actions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ActionEntry']", 'symmetrical': 'False'}),
+- 'bad_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
+- 'client': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interactions'", 'to': "orm['Reporting.Client']"}),
+- 'extra_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'failures': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FailureEntry']", 'symmetrical': 'False'}),
+- 'good_count': ('django.db.models.fields.IntegerField', [], {}),
+- 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'modified_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'packages': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PackageEntry']", 'symmetrical': 'False'}),
+- 'paths': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PathEntry']", 'symmetrical': 'False'}),
+- 'posixgroups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.POSIXGroupEntry']", 'symmetrical': 'False'}),
+- 'posixusers': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.POSIXUserEntry']", 'symmetrical': 'False'}),
+- 'profile': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'null': 'True', 'to': "orm['Reporting.Group']"}),
+- 'repo_rev_code': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+- 'sebooleans': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEBooleanEntry']", 'symmetrical': 'False'}),
+- 'sefcontexts': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEFcontextEntry']", 'symmetrical': 'False'}),
+- 'seinterfaces': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEInterfaceEntry']", 'symmetrical': 'False'}),
+- 'selogins': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SELoginEntry']", 'symmetrical': 'False'}),
+- 'semodules': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEModuleEntry']", 'symmetrical': 'False'}),
+- 'senodes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SENodeEntry']", 'symmetrical': 'False'}),
+- 'sepermissives': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEPermissiveEntry']", 'symmetrical': 'False'}),
+- 'seports': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEPortEntry']", 'symmetrical': 'False'}),
+- 'server': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
+- 'services': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ServiceEntry']", 'symmetrical': 'False'}),
+- 'seusers': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEUserEntry']", 'symmetrical': 'False'}),
+- 'state': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
+- 'timestamp': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
+- 'total_count': ('django.db.models.fields.IntegerField', [], {})
+- },
+- 'Reporting.linkentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'LinkEntry', '_ormbases': ['Reporting.PathEntry']},
+- 'current_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
+- 'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
+- 'target_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'})
+- },
+- 'Reporting.packageentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'PackageEntry'},
+- 'current_version': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {}),
+- 'target_version': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}),
+- 'verification_details': ('django.db.models.fields.TextField', [], {'default': "''"})
+- },
+- 'Reporting.pathentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'PathEntry'},
+- 'acls': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FileAcl']", 'symmetrical': 'False'}),
+- 'current_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"}),
+- 'detail_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+- 'details': ('django.db.models.fields.TextField', [], {'default': "''"}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'path_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {}),
+- 'target_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"})
+- },
+- 'Reporting.performance': {
+- 'Meta': {'object_name': 'Performance'},
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'interaction': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'performance_items'", 'to': "orm['Reporting.Interaction']"}),
+- 'metric': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '32', 'decimal_places': '16'})
+- },
+- 'Reporting.posixgroupentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'POSIXGroupEntry'},
+- 'current_gid': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'gid': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {})
+- },
+- 'Reporting.posixuserentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'POSIXUserEntry'},
+- 'current_gecos': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True'}),
+- 'current_group': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True'}),
+- 'current_home': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True'}),
+- 'current_shell': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True'}),
+- 'current_uid': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'gecos': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
+- 'group': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'home': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'shell': ('django.db.models.fields.CharField', [], {'default': "'/bin/bash'", 'max_length': '1024'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {}),
+- 'uid': ('django.db.models.fields.IntegerField', [], {'null': 'True'})
+- },
+- 'Reporting.sebooleanentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEBooleanEntry'},
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {}),
+- 'value': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
+- },
+- 'Reporting.sefcontextentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEFcontextEntry'},
+- 'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'filetype': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {})
+- },
+- 'Reporting.seinterfaceentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEInterfaceEntry'},
+- 'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {})
+- },
+- 'Reporting.seloginentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SELoginEntry'},
+- 'current_selinuxuser': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'selinuxuser': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {})
+- },
+- 'Reporting.semoduleentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEModuleEntry'},
+- 'current_disabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+- 'disabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {})
+- },
+- 'Reporting.senodeentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SENodeEntry'},
+- 'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'proto': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+- 'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {})
+- },
+- 'Reporting.sepermissiveentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEPermissiveEntry'},
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {})
+- },
+- 'Reporting.seportentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEPortEntry'},
+- 'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {})
+- },
+- 'Reporting.serviceentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'ServiceEntry'},
+- 'current_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {}),
+- 'target_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'})
+- },
+- 'Reporting.seuserentry': {
+- 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEUserEntry'},
+- 'current_prefix': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+- 'current_roles': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+- 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+- 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+- 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+- 'prefix': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'roles': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+- 'state': ('django.db.models.fields.IntegerField', [], {})
+- }
+- }
+-
+- complete_apps = ['Reporting']
+\ No newline at end of file
+diff --git a/src/lib/Bcfg2/Reporting/south_migrations/0001_initial.py b/src/lib/Bcfg2/Reporting/south_migrations/0001_initial.py
+new file mode 100644
+index 0000000..609290e
+--- /dev/null
++++ b/src/lib/Bcfg2/Reporting/south_migrations/0001_initial.py
+@@ -0,0 +1,465 @@
++# -*- coding: utf-8 -*-
++import datetime
++from south.db import db
++from south.v2 import SchemaMigration
++from django.db import models
++
++
++class Migration(SchemaMigration):
++
++ def forwards(self, orm):
++ # Adding model 'Client'
++ db.create_table('Reporting_client', (
++ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
++ ('creation', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
++ ('name', self.gf('django.db.models.fields.CharField')(max_length=128)),
++ ('current_interaction', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='parent_client', null=True, to=orm['Reporting.Interaction'])),
++ ('expiration', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)),
++ ))
++ db.send_create_signal('Reporting', ['Client'])
++
++ # Adding model 'Interaction'
++ db.create_table('Reporting_interaction', (
++ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
++ ('client', self.gf('django.db.models.fields.related.ForeignKey')(related_name='interactions', to=orm['Reporting.Client'])),
++ ('timestamp', self.gf('django.db.models.fields.DateTimeField')(db_index=True)),
++ ('state', self.gf('django.db.models.fields.CharField')(max_length=32)),
++ ('repo_rev_code', self.gf('django.db.models.fields.CharField')(max_length=64)),
++ ('server', self.gf('django.db.models.fields.CharField')(max_length=256)),
++ ('good_count', self.gf('django.db.models.fields.IntegerField')()),
++ ('total_count', self.gf('django.db.models.fields.IntegerField')()),
++ ('bad_count', self.gf('django.db.models.fields.IntegerField')(default=0)),
++ ('modified_count', self.gf('django.db.models.fields.IntegerField')(default=0)),
++ ('extra_count', self.gf('django.db.models.fields.IntegerField')(default=0)),
++ ('profile', self.gf('django.db.models.fields.related.ForeignKey')(related_name='+', to=orm['Reporting.Group'])),
++ ))
++ db.send_create_signal('Reporting', ['Interaction'])
++
++ # Adding unique constraint on 'Interaction', fields ['client', 'timestamp']
++ db.create_unique('Reporting_interaction', ['client_id', 'timestamp'])
++
++ # Adding M2M table for field actions on 'Interaction'
++ db.create_table('Reporting_interaction_actions', (
++ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
++ ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
++ ('actionentry', models.ForeignKey(orm['Reporting.actionentry'], null=False))
++ ))
++ db.create_unique('Reporting_interaction_actions', ['interaction_id', 'actionentry_id'])
++
++ # Adding M2M table for field packages on 'Interaction'
++ db.create_table('Reporting_interaction_packages', (
++ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
++ ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
++ ('packageentry', models.ForeignKey(orm['Reporting.packageentry'], null=False))
++ ))
++ db.create_unique('Reporting_interaction_packages', ['interaction_id', 'packageentry_id'])
++
++ # Adding M2M table for field paths on 'Interaction'
++ db.create_table('Reporting_interaction_paths', (
++ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
++ ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
++ ('pathentry', models.ForeignKey(orm['Reporting.pathentry'], null=False))
++ ))
++ db.create_unique('Reporting_interaction_paths', ['interaction_id', 'pathentry_id'])
++
++ # Adding M2M table for field services on 'Interaction'
++ db.create_table('Reporting_interaction_services', (
++ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
++ ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
++ ('serviceentry', models.ForeignKey(orm['Reporting.serviceentry'], null=False))
++ ))
++ db.create_unique('Reporting_interaction_services', ['interaction_id', 'serviceentry_id'])
++
++ # Adding M2M table for field failures on 'Interaction'
++ db.create_table('Reporting_interaction_failures', (
++ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
++ ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
++ ('failureentry', models.ForeignKey(orm['Reporting.failureentry'], null=False))
++ ))
++ db.create_unique('Reporting_interaction_failures', ['interaction_id', 'failureentry_id'])
++
++ # Adding M2M table for field groups on 'Interaction'
++ db.create_table('Reporting_interaction_groups', (
++ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
++ ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
++ ('group', models.ForeignKey(orm['Reporting.group'], null=False))
++ ))
++ db.create_unique('Reporting_interaction_groups', ['interaction_id', 'group_id'])
++
++ # Adding M2M table for field bundles on 'Interaction'
++ db.create_table('Reporting_interaction_bundles', (
++ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
++ ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
++ ('bundle', models.ForeignKey(orm['Reporting.bundle'], null=False))
++ ))
++ db.create_unique('Reporting_interaction_bundles', ['interaction_id', 'bundle_id'])
++
++ # Adding model 'Performance'
++ db.create_table('Reporting_performance', (
++ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
++ ('interaction', self.gf('django.db.models.fields.related.ForeignKey')(related_name='performance_items', to=orm['Reporting.Interaction'])),
++ ('metric', self.gf('django.db.models.fields.CharField')(max_length=128)),
++ ('value', self.gf('django.db.models.fields.DecimalField')(max_digits=32, decimal_places=16)),
++ ))
++ db.send_create_signal('Reporting', ['Performance'])
++
++ # Adding model 'Group'
++ db.create_table('Reporting_group', (
++ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
++ ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=255)),
++ ('profile', self.gf('django.db.models.fields.BooleanField')(default=False)),
++ ('public', self.gf('django.db.models.fields.BooleanField')(default=False)),
++ ('category', self.gf('django.db.models.fields.CharField')(max_length=1024, blank=True)),
++ ('comment', self.gf('django.db.models.fields.TextField')(blank=True)),
++ ))
++ db.send_create_signal('Reporting', ['Group'])
++
++ # Adding M2M table for field groups on 'Group'
++ db.create_table('Reporting_group_groups', (
++ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
++ ('from_group', models.ForeignKey(orm['Reporting.group'], null=False)),
++ ('to_group', models.ForeignKey(orm['Reporting.group'], null=False))
++ ))
++ db.create_unique('Reporting_group_groups', ['from_group_id', 'to_group_id'])
++
++ # Adding M2M table for field bundles on 'Group'
++ db.create_table('Reporting_group_bundles', (
++ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
++ ('group', models.ForeignKey(orm['Reporting.group'], null=False)),
++ ('bundle', models.ForeignKey(orm['Reporting.bundle'], null=False))
++ ))
++ db.create_unique('Reporting_group_bundles', ['group_id', 'bundle_id'])
++
++ # Adding model 'Bundle'
++ db.create_table('Reporting_bundle', (
++ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
++ ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=255)),
++ ))
++ db.send_create_signal('Reporting', ['Bundle'])
++
++ # Adding model 'FilePerms'
++ db.create_table('Reporting_fileperms', (
++ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
++ ('owner', self.gf('django.db.models.fields.CharField')(max_length=128)),
++ ('group', self.gf('django.db.models.fields.CharField')(max_length=128)),
++ ('perms', self.gf('django.db.models.fields.CharField')(max_length=128)),
++ ))
++ db.send_create_signal('Reporting', ['FilePerms'])
++
++ # Adding unique constraint on 'FilePerms', fields ['owner', 'group', 'perms']
++ db.create_unique('Reporting_fileperms', ['owner', 'group', 'perms'])
++
++ # Adding model 'FileAcl'
++ db.create_table('Reporting_fileacl', (
++ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
++ ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
++ ))
++ db.send_create_signal('Reporting', ['FileAcl'])
++
++ # Adding model 'FailureEntry'
++ db.create_table('Reporting_failureentry', (
++ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
++ ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
++ ('hash_key', self.gf('django.db.models.fields.IntegerField')(db_index=True)),
++ ('entry_type', self.gf('django.db.models.fields.CharField')(max_length=128)),
++ ('message', self.gf('django.db.models.fields.TextField')()),
++ ))
++ db.send_create_signal('Reporting', ['FailureEntry'])
++
++ # Adding model 'ActionEntry'
++ db.create_table('Reporting_actionentry', (
++ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
++ ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
++ ('hash_key', self.gf('django.db.models.fields.IntegerField')(db_index=True)),
++ ('state', self.gf('django.db.models.fields.IntegerField')()),
++ ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
++ ('status', self.gf('django.db.models.fields.CharField')(default='check', max_length=128)),
++ ('output', self.gf('django.db.models.fields.IntegerField')(default=0)),
++ ))
++ db.send_create_signal('Reporting', ['ActionEntry'])
++
++ # Adding model 'PackageEntry'
++ db.create_table('Reporting_packageentry', (
++ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
++ ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
++ ('hash_key', self.gf('django.db.models.fields.IntegerField')(db_index=True)),
++ ('state', self.gf('django.db.models.fields.IntegerField')()),
++ ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
++ ('target_version', self.gf('django.db.models.fields.CharField')(default='', max_length=1024)),
++ ('current_version', self.gf('django.db.models.fields.CharField')(max_length=1024)),
++ ('verification_details', self.gf('django.db.models.fields.TextField')(default='')),
++ ))
++ db.send_create_signal('Reporting', ['PackageEntry'])
++
++ # Adding model 'PathEntry'
++ db.create_table('Reporting_pathentry', (
++ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
++ ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
++ ('hash_key', self.gf('django.db.models.fields.IntegerField')(db_index=True)),
++ ('state', self.gf('django.db.models.fields.IntegerField')()),
++ ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
++ ('path_type', self.gf('django.db.models.fields.CharField')(max_length=128)),
++ ('target_perms', self.gf('django.db.models.fields.related.ForeignKey')(related_name='+', to=orm['Reporting.FilePerms'])),
++ ('current_perms', self.gf('django.db.models.fields.related.ForeignKey')(related_name='+', to=orm['Reporting.FilePerms'])),
++ ('detail_type', self.gf('django.db.models.fields.IntegerField')(default=0)),
++ ('details', self.gf('django.db.models.fields.TextField')(default='')),
++ ))
++ db.send_create_signal('Reporting', ['PathEntry'])
++
++ # Adding M2M table for field acls on 'PathEntry'
++ db.create_table('Reporting_pathentry_acls', (
++ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
++ ('pathentry', models.ForeignKey(orm['Reporting.pathentry'], null=False)),
++ ('fileacl', models.ForeignKey(orm['Reporting.fileacl'], null=False))
++ ))
++ db.create_unique('Reporting_pathentry_acls', ['pathentry_id', 'fileacl_id'])
++
++ # Adding model 'LinkEntry'
++ db.create_table('Reporting_linkentry', (
++ ('pathentry_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['Reporting.PathEntry'], unique=True, primary_key=True)),
++ ('target_path', self.gf('django.db.models.fields.CharField')(max_length=1024, blank=True)),
++ ('current_path', self.gf('django.db.models.fields.CharField')(max_length=1024, blank=True)),
++ ))
++ db.send_create_signal('Reporting', ['LinkEntry'])
++
++ # Adding model 'DeviceEntry'
++ db.create_table('Reporting_deviceentry', (
++ ('pathentry_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['Reporting.PathEntry'], unique=True, primary_key=True)),
++ ('device_type', self.gf('django.db.models.fields.CharField')(max_length=16)),
++ ('target_major', self.gf('django.db.models.fields.IntegerField')()),
++ ('target_minor', self.gf('django.db.models.fields.IntegerField')()),
++ ('current_major', self.gf('django.db.models.fields.IntegerField')()),
++ ('current_minor', self.gf('django.db.models.fields.IntegerField')()),
++ ))
++ db.send_create_signal('Reporting', ['DeviceEntry'])
++
++ # Adding model 'ServiceEntry'
++ db.create_table('Reporting_serviceentry', (
++ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
++ ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
++ ('hash_key', self.gf('django.db.models.fields.IntegerField')(db_index=True)),
++ ('state', self.gf('django.db.models.fields.IntegerField')()),
++ ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
++ ('target_status', self.gf('django.db.models.fields.CharField')(default='', max_length=128)),
++ ('current_status', self.gf('django.db.models.fields.CharField')(default='', max_length=128)),
++ ))
++ db.send_create_signal('Reporting', ['ServiceEntry'])
++
++
++ def backwards(self, orm):
++ # Removing unique constraint on 'FilePerms', fields ['owner', 'group', 'perms']
++ db.delete_unique('Reporting_fileperms', ['owner', 'group', 'perms'])
++
++ # Removing unique constraint on 'Interaction', fields ['client', 'timestamp']
++ db.delete_unique('Reporting_interaction', ['client_id', 'timestamp'])
++
++ # Deleting model 'Client'
++ db.delete_table('Reporting_client')
++
++ # Deleting model 'Interaction'
++ db.delete_table('Reporting_interaction')
++
++ # Removing M2M table for field actions on 'Interaction'
++ db.delete_table('Reporting_interaction_actions')
++
++ # Removing M2M table for field packages on 'Interaction'
++ db.delete_table('Reporting_interaction_packages')
++
++ # Removing M2M table for field paths on 'Interaction'
++ db.delete_table('Reporting_interaction_paths')
++
++ # Removing M2M table for field services on 'Interaction'
++ db.delete_table('Reporting_interaction_services')
++
++ # Removing M2M table for field failures on 'Interaction'
++ db.delete_table('Reporting_interaction_failures')
++
++ # Removing M2M table for field groups on 'Interaction'
++ db.delete_table('Reporting_interaction_groups')
++
++ # Removing M2M table for field bundles on 'Interaction'
++ db.delete_table('Reporting_interaction_bundles')
++
++ # Deleting model 'Performance'
++ db.delete_table('Reporting_performance')
++
++ # Deleting model 'Group'
++ db.delete_table('Reporting_group')
++
++ # Removing M2M table for field groups on 'Group'
++ db.delete_table('Reporting_group_groups')
++
++ # Removing M2M table for field bundles on 'Group'
++ db.delete_table('Reporting_group_bundles')
++
++ # Deleting model 'Bundle'
++ db.delete_table('Reporting_bundle')
++
++ # Deleting model 'FilePerms'
++ db.delete_table('Reporting_fileperms')
++
++ # Deleting model 'FileAcl'
++ db.delete_table('Reporting_fileacl')
++
++ # Deleting model 'FailureEntry'
++ db.delete_table('Reporting_failureentry')
++
++ # Deleting model 'ActionEntry'
++ db.delete_table('Reporting_actionentry')
++
++ # Deleting model 'PackageEntry'
++ db.delete_table('Reporting_packageentry')
++
++ # Deleting model 'PathEntry'
++ db.delete_table('Reporting_pathentry')
++
++ # Removing M2M table for field acls on 'PathEntry'
++ db.delete_table('Reporting_pathentry_acls')
++
++ # Deleting model 'LinkEntry'
++ db.delete_table('Reporting_linkentry')
++
++ # Deleting model 'DeviceEntry'
++ db.delete_table('Reporting_deviceentry')
++
++ # Deleting model 'ServiceEntry'
++ db.delete_table('Reporting_serviceentry')
++
++
++ models = {
++ 'Reporting.actionentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'ActionEntry'},
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'output': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {}),
++ 'status': ('django.db.models.fields.CharField', [], {'default': "'check'", 'max_length': '128'})
++ },
++ 'Reporting.bundle': {
++ 'Meta': {'ordering': "('name',)", 'object_name': 'Bundle'},
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
++ },
++ 'Reporting.client': {
++ 'Meta': {'object_name': 'Client'},
++ 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
++ 'current_interaction': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parent_client'", 'null': 'True', 'to': "orm['Reporting.Interaction']"}),
++ 'expiration': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
++ },
++ 'Reporting.deviceentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'DeviceEntry', '_ormbases': ['Reporting.PathEntry']},
++ 'current_major': ('django.db.models.fields.IntegerField', [], {}),
++ 'current_minor': ('django.db.models.fields.IntegerField', [], {}),
++ 'device_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
++ 'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
++ 'target_major': ('django.db.models.fields.IntegerField', [], {}),
++ 'target_minor': ('django.db.models.fields.IntegerField', [], {})
++ },
++ 'Reporting.failureentry': {
++ 'Meta': {'object_name': 'FailureEntry'},
++ 'entry_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'message': ('django.db.models.fields.TextField', [], {}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
++ },
++ 'Reporting.fileacl': {
++ 'Meta': {'object_name': 'FileAcl'},
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
++ },
++ 'Reporting.fileperms': {
++ 'Meta': {'unique_together': "(('owner', 'group', 'perms'),)", 'object_name': 'FilePerms'},
++ 'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'perms': ('django.db.models.fields.CharField', [], {'max_length': '128'})
++ },
++ 'Reporting.group': {
++ 'Meta': {'ordering': "('name',)", 'object_name': 'Group'},
++ 'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
++ 'category': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
++ 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
++ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
++ 'profile': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++ 'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
++ },
++ 'Reporting.interaction': {
++ 'Meta': {'ordering': "['-timestamp']", 'unique_together': "(('client', 'timestamp'),)", 'object_name': 'Interaction'},
++ 'actions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ActionEntry']", 'symmetrical': 'False'}),
++ 'bad_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
++ 'client': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interactions'", 'to': "orm['Reporting.Client']"}),
++ 'extra_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'failures': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FailureEntry']", 'symmetrical': 'False'}),
++ 'good_count': ('django.db.models.fields.IntegerField', [], {}),
++ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'modified_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'packages': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PackageEntry']", 'symmetrical': 'False'}),
++ 'paths': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PathEntry']", 'symmetrical': 'False'}),
++ 'profile': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.Group']"}),
++ 'repo_rev_code': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
++ 'server': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
++ 'services': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ServiceEntry']", 'symmetrical': 'False'}),
++ 'state': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
++ 'timestamp': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
++ 'total_count': ('django.db.models.fields.IntegerField', [], {})
++ },
++ 'Reporting.linkentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'LinkEntry', '_ormbases': ['Reporting.PathEntry']},
++ 'current_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
++ 'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
++ 'target_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'})
++ },
++ 'Reporting.packageentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'PackageEntry'},
++ 'current_version': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {}),
++ 'target_version': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}),
++ 'verification_details': ('django.db.models.fields.TextField', [], {'default': "''"})
++ },
++ 'Reporting.pathentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'PathEntry'},
++ 'acls': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FileAcl']", 'symmetrical': 'False'}),
++ 'current_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"}),
++ 'detail_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'details': ('django.db.models.fields.TextField', [], {'default': "''"}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'path_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {}),
++ 'target_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"})
++ },
++ 'Reporting.performance': {
++ 'Meta': {'object_name': 'Performance'},
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'interaction': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'performance_items'", 'to': "orm['Reporting.Interaction']"}),
++ 'metric': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '32', 'decimal_places': '16'})
++ },
++ 'Reporting.serviceentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'ServiceEntry'},
++ 'current_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {}),
++ 'target_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'})
++ }
++ }
++
++ complete_apps = ['Reporting']
+\ No newline at end of file
+diff --git a/src/lib/Bcfg2/Reporting/south_migrations/0002_convert_perms_to_mode.py b/src/lib/Bcfg2/Reporting/south_migrations/0002_convert_perms_to_mode.py
+new file mode 100644
+index 0000000..668094c
+--- /dev/null
++++ b/src/lib/Bcfg2/Reporting/south_migrations/0002_convert_perms_to_mode.py
+@@ -0,0 +1,171 @@
++# -*- coding: utf-8 -*-
++import datetime
++from south.db import db
++from south.v2 import SchemaMigration
++from django.db import models
++
++from Bcfg2 import settings
++
++class Migration(SchemaMigration):
++
++ def forwards(self, orm):
++ # Removing unique constraint on 'FilePerms', fields ['owner', 'perms', 'group']
++ db.delete_unique('Reporting_fileperms', ['owner', 'perms', 'group'])
++
++ # Renaming field 'FilePerms.perms' to 'FilePerms.mode'
++ db.rename_column('Reporting_fileperms', 'perms', 'mode')
++
++ if not settings.DATABASES['default']['ENGINE'] == 'django.db.backends.sqlite3':
++ # Adding unique constraint on 'FilePerms', fields ['owner', 'group', 'mode']
++ db.create_unique('Reporting_fileperms', ['owner', 'group', 'mode'])
++
++
++ def backwards(self, orm):
++ # Removing unique constraint on 'FilePerms', fields ['owner', 'group', 'mode']
++ db.delete_unique('Reporting_fileperms', ['owner', 'group', 'mode'])
++
++ # Renaming field 'FilePerms.mode' to 'FilePerms.perms'
++ db.rename_column('Reporting_fileperms', 'mode', 'perms')
++
++ if not settings.DATABASES['default']['ENGINE'] == 'django.db.backends.sqlite3':
++ # Adding unique constraint on 'FilePerms', fields ['owner', 'perms', 'group']
++ db.create_unique('Reporting_fileperms', ['owner', 'perms', 'group'])
++
++
++ models = {
++ 'Reporting.actionentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'ActionEntry'},
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'output': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {}),
++ 'status': ('django.db.models.fields.CharField', [], {'default': "'check'", 'max_length': '128'})
++ },
++ 'Reporting.bundle': {
++ 'Meta': {'ordering': "('name',)", 'object_name': 'Bundle'},
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
++ },
++ 'Reporting.client': {
++ 'Meta': {'object_name': 'Client'},
++ 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
++ 'current_interaction': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parent_client'", 'null': 'True', 'to': "orm['Reporting.Interaction']"}),
++ 'expiration': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
++ },
++ 'Reporting.deviceentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'DeviceEntry', '_ormbases': ['Reporting.PathEntry']},
++ 'current_major': ('django.db.models.fields.IntegerField', [], {}),
++ 'current_minor': ('django.db.models.fields.IntegerField', [], {}),
++ 'device_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
++ 'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
++ 'target_major': ('django.db.models.fields.IntegerField', [], {}),
++ 'target_minor': ('django.db.models.fields.IntegerField', [], {})
++ },
++ 'Reporting.failureentry': {
++ 'Meta': {'object_name': 'FailureEntry'},
++ 'entry_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'message': ('django.db.models.fields.TextField', [], {}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
++ },
++ 'Reporting.fileacl': {
++ 'Meta': {'object_name': 'FileAcl'},
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
++ },
++ 'Reporting.fileperms': {
++ 'Meta': {'unique_together': "(('owner', 'group', 'mode'),)", 'object_name': 'FilePerms'},
++ 'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'mode': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'})
++ },
++ 'Reporting.group': {
++ 'Meta': {'ordering': "('name',)", 'object_name': 'Group'},
++ 'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
++ 'category': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
++ 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
++ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
++ 'profile': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++ 'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
++ },
++ 'Reporting.interaction': {
++ 'Meta': {'ordering': "['-timestamp']", 'unique_together': "(('client', 'timestamp'),)", 'object_name': 'Interaction'},
++ 'actions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ActionEntry']", 'symmetrical': 'False'}),
++ 'bad_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
++ 'client': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interactions'", 'to': "orm['Reporting.Client']"}),
++ 'extra_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'failures': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FailureEntry']", 'symmetrical': 'False'}),
++ 'good_count': ('django.db.models.fields.IntegerField', [], {}),
++ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'modified_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'packages': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PackageEntry']", 'symmetrical': 'False'}),
++ 'paths': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PathEntry']", 'symmetrical': 'False'}),
++ 'profile': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.Group']"}),
++ 'repo_rev_code': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
++ 'server': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
++ 'services': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ServiceEntry']", 'symmetrical': 'False'}),
++ 'state': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
++ 'timestamp': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
++ 'total_count': ('django.db.models.fields.IntegerField', [], {})
++ },
++ 'Reporting.linkentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'LinkEntry', '_ormbases': ['Reporting.PathEntry']},
++ 'current_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
++ 'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
++ 'target_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'})
++ },
++ 'Reporting.packageentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'PackageEntry'},
++ 'current_version': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {}),
++ 'target_version': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}),
++ 'verification_details': ('django.db.models.fields.TextField', [], {'default': "''"})
++ },
++ 'Reporting.pathentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'PathEntry'},
++ 'acls': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FileAcl']", 'symmetrical': 'False'}),
++ 'current_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"}),
++ 'detail_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'details': ('django.db.models.fields.TextField', [], {'default': "''"}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'path_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {}),
++ 'target_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"})
++ },
++ 'Reporting.performance': {
++ 'Meta': {'object_name': 'Performance'},
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'interaction': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'performance_items'", 'to': "orm['Reporting.Interaction']"}),
++ 'metric': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '32', 'decimal_places': '16'})
++ },
++ 'Reporting.serviceentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'ServiceEntry'},
++ 'current_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {}),
++ 'target_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'})
++ }
++ }
++
++ complete_apps = ['Reporting']
+diff --git a/src/lib/Bcfg2/Reporting/south_migrations/0003_expand_hash_key.py b/src/lib/Bcfg2/Reporting/south_migrations/0003_expand_hash_key.py
+new file mode 100644
+index 0000000..2da1fa7
+--- /dev/null
++++ b/src/lib/Bcfg2/Reporting/south_migrations/0003_expand_hash_key.py
+@@ -0,0 +1,180 @@
++# -*- coding: utf-8 -*-
++import datetime
++from south.db import db
++from south.v2 import SchemaMigration
++from django.db import models
++
++
++class Migration(SchemaMigration):
++
++ def forwards(self, orm):
++
++ # Changing field 'FailureEntry.hash_key'
++ db.alter_column('Reporting_failureentry', 'hash_key', self.gf('django.db.models.fields.BigIntegerField')())
++
++ # Changing field 'PackageEntry.hash_key'
++ db.alter_column('Reporting_packageentry', 'hash_key', self.gf('django.db.models.fields.BigIntegerField')())
++
++ # Changing field 'ServiceEntry.hash_key'
++ db.alter_column('Reporting_serviceentry', 'hash_key', self.gf('django.db.models.fields.BigIntegerField')())
++
++ # Changing field 'PathEntry.hash_key'
++ db.alter_column('Reporting_pathentry', 'hash_key', self.gf('django.db.models.fields.BigIntegerField')())
++
++ # Changing field 'ActionEntry.hash_key'
++ db.alter_column('Reporting_actionentry', 'hash_key', self.gf('django.db.models.fields.BigIntegerField')())
++
++ def backwards(self, orm):
++
++ # Changing field 'FailureEntry.hash_key'
++ db.alter_column('Reporting_failureentry', 'hash_key', self.gf('django.db.models.fields.IntegerField')())
++
++ # Changing field 'PackageEntry.hash_key'
++ db.alter_column('Reporting_packageentry', 'hash_key', self.gf('django.db.models.fields.IntegerField')())
++
++ # Changing field 'ServiceEntry.hash_key'
++ db.alter_column('Reporting_serviceentry', 'hash_key', self.gf('django.db.models.fields.IntegerField')())
++
++ # Changing field 'PathEntry.hash_key'
++ db.alter_column('Reporting_pathentry', 'hash_key', self.gf('django.db.models.fields.IntegerField')())
++
++ # Changing field 'ActionEntry.hash_key'
++ db.alter_column('Reporting_actionentry', 'hash_key', self.gf('django.db.models.fields.IntegerField')())
++
++ models = {
++ 'Reporting.actionentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'ActionEntry'},
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'output': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {}),
++ 'status': ('django.db.models.fields.CharField', [], {'default': "'check'", 'max_length': '128'})
++ },
++ 'Reporting.bundle': {
++ 'Meta': {'ordering': "('name',)", 'object_name': 'Bundle'},
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
++ },
++ 'Reporting.client': {
++ 'Meta': {'object_name': 'Client'},
++ 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
++ 'current_interaction': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parent_client'", 'null': 'True', 'to': "orm['Reporting.Interaction']"}),
++ 'expiration': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
++ },
++ 'Reporting.deviceentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'DeviceEntry', '_ormbases': ['Reporting.PathEntry']},
++ 'current_major': ('django.db.models.fields.IntegerField', [], {}),
++ 'current_minor': ('django.db.models.fields.IntegerField', [], {}),
++ 'device_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
++ 'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
++ 'target_major': ('django.db.models.fields.IntegerField', [], {}),
++ 'target_minor': ('django.db.models.fields.IntegerField', [], {})
++ },
++ 'Reporting.failureentry': {
++ 'Meta': {'object_name': 'FailureEntry'},
++ 'entry_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'message': ('django.db.models.fields.TextField', [], {}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
++ },
++ 'Reporting.fileacl': {
++ 'Meta': {'object_name': 'FileAcl'},
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
++ },
++ 'Reporting.fileperms': {
++ 'Meta': {'unique_together': "(('owner', 'group', 'mode'),)", 'object_name': 'FilePerms'},
++ 'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'mode': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'})
++ },
++ 'Reporting.group': {
++ 'Meta': {'ordering': "('name',)", 'object_name': 'Group'},
++ 'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
++ 'category': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
++ 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
++ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
++ 'profile': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++ 'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
++ },
++ 'Reporting.interaction': {
++ 'Meta': {'ordering': "['-timestamp']", 'unique_together': "(('client', 'timestamp'),)", 'object_name': 'Interaction'},
++ 'actions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ActionEntry']", 'symmetrical': 'False'}),
++ 'bad_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
++ 'client': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interactions'", 'to': "orm['Reporting.Client']"}),
++ 'extra_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'failures': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FailureEntry']", 'symmetrical': 'False'}),
++ 'good_count': ('django.db.models.fields.IntegerField', [], {}),
++ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'modified_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'packages': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PackageEntry']", 'symmetrical': 'False'}),
++ 'paths': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PathEntry']", 'symmetrical': 'False'}),
++ 'profile': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.Group']"}),
++ 'repo_rev_code': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
++ 'server': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
++ 'services': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ServiceEntry']", 'symmetrical': 'False'}),
++ 'state': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
++ 'timestamp': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
++ 'total_count': ('django.db.models.fields.IntegerField', [], {})
++ },
++ 'Reporting.linkentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'LinkEntry', '_ormbases': ['Reporting.PathEntry']},
++ 'current_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
++ 'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
++ 'target_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'})
++ },
++ 'Reporting.packageentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'PackageEntry'},
++ 'current_version': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {}),
++ 'target_version': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}),
++ 'verification_details': ('django.db.models.fields.TextField', [], {'default': "''"})
++ },
++ 'Reporting.pathentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'PathEntry'},
++ 'acls': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FileAcl']", 'symmetrical': 'False'}),
++ 'current_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"}),
++ 'detail_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'details': ('django.db.models.fields.TextField', [], {'default': "''"}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'path_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {}),
++ 'target_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"})
++ },
++ 'Reporting.performance': {
++ 'Meta': {'object_name': 'Performance'},
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'interaction': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'performance_items'", 'to': "orm['Reporting.Interaction']"}),
++ 'metric': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '32', 'decimal_places': '16'})
++ },
++ 'Reporting.serviceentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'ServiceEntry'},
++ 'current_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {}),
++ 'target_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'})
++ }
++ }
++
++ complete_apps = ['Reporting']
+\ No newline at end of file
+diff --git a/src/lib/Bcfg2/Reporting/south_migrations/0004_profile_can_be_null.py b/src/lib/Bcfg2/Reporting/south_migrations/0004_profile_can_be_null.py
+new file mode 100644
+index 0000000..26a053b
+--- /dev/null
++++ b/src/lib/Bcfg2/Reporting/south_migrations/0004_profile_can_be_null.py
+@@ -0,0 +1,156 @@
++# -*- coding: utf-8 -*-
++import datetime
++from south.db import db
++from south.v2 import SchemaMigration
++from django.db import models
++
++
++class Migration(SchemaMigration):
++
++ def forwards(self, orm):
++
++ # Changing field 'Interaction.profile'
++ db.alter_column('Reporting_interaction', 'profile_id', self.gf('django.db.models.fields.related.ForeignKey')(null=True, to=orm['Reporting.Group']))
++
++ def backwards(self, orm):
++
++ # User chose to not deal with backwards NULL issues for 'Interaction.profile'
++ raise RuntimeError("Cannot reverse this migration. 'Interaction.profile' and its values cannot be restored.")
++
++ models = {
++ 'Reporting.actionentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'ActionEntry'},
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'output': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {}),
++ 'status': ('django.db.models.fields.CharField', [], {'default': "'check'", 'max_length': '128'})
++ },
++ 'Reporting.bundle': {
++ 'Meta': {'ordering': "('name',)", 'object_name': 'Bundle'},
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
++ },
++ 'Reporting.client': {
++ 'Meta': {'object_name': 'Client'},
++ 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
++ 'current_interaction': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parent_client'", 'null': 'True', 'to': "orm['Reporting.Interaction']"}),
++ 'expiration': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
++ },
++ 'Reporting.deviceentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'DeviceEntry', '_ormbases': ['Reporting.PathEntry']},
++ 'current_major': ('django.db.models.fields.IntegerField', [], {}),
++ 'current_minor': ('django.db.models.fields.IntegerField', [], {}),
++ 'device_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
++ 'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
++ 'target_major': ('django.db.models.fields.IntegerField', [], {}),
++ 'target_minor': ('django.db.models.fields.IntegerField', [], {})
++ },
++ 'Reporting.failureentry': {
++ 'Meta': {'object_name': 'FailureEntry'},
++ 'entry_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'message': ('django.db.models.fields.TextField', [], {}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
++ },
++ 'Reporting.fileacl': {
++ 'Meta': {'object_name': 'FileAcl'},
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
++ },
++ 'Reporting.fileperms': {
++ 'Meta': {'unique_together': "(('owner', 'group', 'mode'),)", 'object_name': 'FilePerms'},
++ 'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'mode': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'})
++ },
++ 'Reporting.group': {
++ 'Meta': {'ordering': "('name',)", 'object_name': 'Group'},
++ 'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
++ 'category': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
++ 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
++ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
++ 'profile': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++ 'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
++ },
++ 'Reporting.interaction': {
++ 'Meta': {'ordering': "['-timestamp']", 'unique_together': "(('client', 'timestamp'),)", 'object_name': 'Interaction'},
++ 'actions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ActionEntry']", 'symmetrical': 'False'}),
++ 'bad_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
++ 'client': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interactions'", 'to': "orm['Reporting.Client']"}),
++ 'extra_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'failures': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FailureEntry']", 'symmetrical': 'False'}),
++ 'good_count': ('django.db.models.fields.IntegerField', [], {}),
++ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'modified_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'packages': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PackageEntry']", 'symmetrical': 'False'}),
++ 'paths': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PathEntry']", 'symmetrical': 'False'}),
++ 'profile': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'null': 'True', 'to': "orm['Reporting.Group']"}),
++ 'repo_rev_code': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
++ 'server': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
++ 'services': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ServiceEntry']", 'symmetrical': 'False'}),
++ 'state': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
++ 'timestamp': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
++ 'total_count': ('django.db.models.fields.IntegerField', [], {})
++ },
++ 'Reporting.linkentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'LinkEntry', '_ormbases': ['Reporting.PathEntry']},
++ 'current_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
++ 'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
++ 'target_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'})
++ },
++ 'Reporting.packageentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'PackageEntry'},
++ 'current_version': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {}),
++ 'target_version': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}),
++ 'verification_details': ('django.db.models.fields.TextField', [], {'default': "''"})
++ },
++ 'Reporting.pathentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'PathEntry'},
++ 'acls': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FileAcl']", 'symmetrical': 'False'}),
++ 'current_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"}),
++ 'detail_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'details': ('django.db.models.fields.TextField', [], {'default': "''"}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'path_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {}),
++ 'target_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"})
++ },
++ 'Reporting.performance': {
++ 'Meta': {'object_name': 'Performance'},
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'interaction': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'performance_items'", 'to': "orm['Reporting.Interaction']"}),
++ 'metric': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '32', 'decimal_places': '16'})
++ },
++ 'Reporting.serviceentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'ServiceEntry'},
++ 'current_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {}),
++ 'target_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'})
++ }
++ }
++
++ complete_apps = ['Reporting']
+\ No newline at end of file
+diff --git a/src/lib/Bcfg2/Reporting/south_migrations/0005_add_selinux_entry_support.py b/src/lib/Bcfg2/Reporting/south_migrations/0005_add_selinux_entry_support.py
+new file mode 100644
+index 0000000..d5f5d80
+--- /dev/null
++++ b/src/lib/Bcfg2/Reporting/south_migrations/0005_add_selinux_entry_support.py
+@@ -0,0 +1,485 @@
++# -*- coding: utf-8 -*-
++import datetime
++from south.db import db
++from south.v2 import SchemaMigration
++from django.db import models
++
++
++class Migration(SchemaMigration):
++
++ def forwards(self, orm):
++ # Adding model 'SELoginEntry'
++ db.create_table('Reporting_seloginentry', (
++ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
++ ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
++ ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
++ ('state', self.gf('django.db.models.fields.IntegerField')()),
++ ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
++ ('selinuxuser', self.gf('django.db.models.fields.CharField')(max_length=128)),
++ ('current_selinuxuser', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
++ ))
++ db.send_create_signal('Reporting', ['SELoginEntry'])
++
++ # Adding model 'SEUserEntry'
++ db.create_table('Reporting_seuserentry', (
++ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
++ ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
++ ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
++ ('state', self.gf('django.db.models.fields.IntegerField')()),
++ ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
++ ('roles', self.gf('django.db.models.fields.CharField')(max_length=128)),
++ ('current_roles', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
++ ('prefix', self.gf('django.db.models.fields.CharField')(max_length=128)),
++ ('current_prefix', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
++ ))
++ db.send_create_signal('Reporting', ['SEUserEntry'])
++
++ # Adding model 'SEBooleanEntry'
++ db.create_table('Reporting_sebooleanentry', (
++ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
++ ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
++ ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
++ ('state', self.gf('django.db.models.fields.IntegerField')()),
++ ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
++ ('value', self.gf('django.db.models.fields.BooleanField')(default=True)),
++ ))
++ db.send_create_signal('Reporting', ['SEBooleanEntry'])
++
++ # Adding model 'SENodeEntry'
++ db.create_table('Reporting_senodeentry', (
++ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
++ ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
++ ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
++ ('state', self.gf('django.db.models.fields.IntegerField')()),
++ ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
++ ('selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128)),
++ ('current_selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
++ ('proto', self.gf('django.db.models.fields.CharField')(max_length=4)),
++ ))
++ db.send_create_signal('Reporting', ['SENodeEntry'])
++
++ # Adding model 'SEFcontextEntry'
++ db.create_table('Reporting_sefcontextentry', (
++ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
++ ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
++ ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
++ ('state', self.gf('django.db.models.fields.IntegerField')()),
++ ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
++ ('selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128)),
++ ('current_selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
++ ('filetype', self.gf('django.db.models.fields.CharField')(max_length=16)),
++ ))
++ db.send_create_signal('Reporting', ['SEFcontextEntry'])
++
++ # Adding model 'SEInterfaceEntry'
++ db.create_table('Reporting_seinterfaceentry', (
++ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
++ ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
++ ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
++ ('state', self.gf('django.db.models.fields.IntegerField')()),
++ ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
++ ('selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128)),
++ ('current_selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
++ ))
++ db.send_create_signal('Reporting', ['SEInterfaceEntry'])
++
++ # Adding model 'SEPermissiveEntry'
++ db.create_table('Reporting_sepermissiveentry', (
++ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
++ ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
++ ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
++ ('state', self.gf('django.db.models.fields.IntegerField')()),
++ ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
++ ))
++ db.send_create_signal('Reporting', ['SEPermissiveEntry'])
++
++ # Adding model 'SEModuleEntry'
++ db.create_table('Reporting_semoduleentry', (
++ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
++ ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
++ ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
++ ('state', self.gf('django.db.models.fields.IntegerField')()),
++ ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
++ ('disabled', self.gf('django.db.models.fields.BooleanField')(default=False)),
++ ('current_disabled', self.gf('django.db.models.fields.BooleanField')(default=False)),
++ ))
++ db.send_create_signal('Reporting', ['SEModuleEntry'])
++
++ # Adding model 'SEPortEntry'
++ db.create_table('Reporting_seportentry', (
++ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
++ ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
++ ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
++ ('state', self.gf('django.db.models.fields.IntegerField')()),
++ ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
++ ('selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128)),
++ ('current_selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
++ ))
++ db.send_create_signal('Reporting', ['SEPortEntry'])
++
++ # Adding M2M table for field sebooleans on 'Interaction'
++ db.create_table('Reporting_interaction_sebooleans', (
++ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
++ ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
++ ('sebooleanentry', models.ForeignKey(orm['Reporting.sebooleanentry'], null=False))
++ ))
++ db.create_unique('Reporting_interaction_sebooleans', ['interaction_id', 'sebooleanentry_id'])
++
++ # Adding M2M table for field seports on 'Interaction'
++ db.create_table('Reporting_interaction_seports', (
++ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
++ ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
++ ('seportentry', models.ForeignKey(orm['Reporting.seportentry'], null=False))
++ ))
++ db.create_unique('Reporting_interaction_seports', ['interaction_id', 'seportentry_id'])
++
++ # Adding M2M table for field sefcontexts on 'Interaction'
++ db.create_table('Reporting_interaction_sefcontexts', (
++ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
++ ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
++ ('sefcontextentry', models.ForeignKey(orm['Reporting.sefcontextentry'], null=False))
++ ))
++ db.create_unique('Reporting_interaction_sefcontexts', ['interaction_id', 'sefcontextentry_id'])
++
++ # Adding M2M table for field senodes on 'Interaction'
++ db.create_table('Reporting_interaction_senodes', (
++ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
++ ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
++ ('senodeentry', models.ForeignKey(orm['Reporting.senodeentry'], null=False))
++ ))
++ db.create_unique('Reporting_interaction_senodes', ['interaction_id', 'senodeentry_id'])
++
++ # Adding M2M table for field selogins on 'Interaction'
++ db.create_table('Reporting_interaction_selogins', (
++ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
++ ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
++ ('seloginentry', models.ForeignKey(orm['Reporting.seloginentry'], null=False))
++ ))
++ db.create_unique('Reporting_interaction_selogins', ['interaction_id', 'seloginentry_id'])
++
++ # Adding M2M table for field seusers on 'Interaction'
++ db.create_table('Reporting_interaction_seusers', (
++ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
++ ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
++ ('seuserentry', models.ForeignKey(orm['Reporting.seuserentry'], null=False))
++ ))
++ db.create_unique('Reporting_interaction_seusers', ['interaction_id', 'seuserentry_id'])
++
++ # Adding M2M table for field seinterfaces on 'Interaction'
++ db.create_table('Reporting_interaction_seinterfaces', (
++ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
++ ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
++ ('seinterfaceentry', models.ForeignKey(orm['Reporting.seinterfaceentry'], null=False))
++ ))
++ db.create_unique('Reporting_interaction_seinterfaces', ['interaction_id', 'seinterfaceentry_id'])
++
++ # Adding M2M table for field sepermissives on 'Interaction'
++ db.create_table('Reporting_interaction_sepermissives', (
++ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
++ ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
++ ('sepermissiveentry', models.ForeignKey(orm['Reporting.sepermissiveentry'], null=False))
++ ))
++ db.create_unique('Reporting_interaction_sepermissives', ['interaction_id', 'sepermissiveentry_id'])
++
++ # Adding M2M table for field semodules on 'Interaction'
++ db.create_table('Reporting_interaction_semodules', (
++ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
++ ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
++ ('semoduleentry', models.ForeignKey(orm['Reporting.semoduleentry'], null=False))
++ ))
++ db.create_unique('Reporting_interaction_semodules', ['interaction_id', 'semoduleentry_id'])
++
++
++ def backwards(self, orm):
++ # Deleting model 'SELoginEntry'
++ db.delete_table('Reporting_seloginentry')
++
++ # Deleting model 'SEUserEntry'
++ db.delete_table('Reporting_seuserentry')
++
++ # Deleting model 'SEBooleanEntry'
++ db.delete_table('Reporting_sebooleanentry')
++
++ # Deleting model 'SENodeEntry'
++ db.delete_table('Reporting_senodeentry')
++
++ # Deleting model 'SEFcontextEntry'
++ db.delete_table('Reporting_sefcontextentry')
++
++ # Deleting model 'SEInterfaceEntry'
++ db.delete_table('Reporting_seinterfaceentry')
++
++ # Deleting model 'SEPermissiveEntry'
++ db.delete_table('Reporting_sepermissiveentry')
++
++ # Deleting model 'SEModuleEntry'
++ db.delete_table('Reporting_semoduleentry')
++
++ # Deleting model 'SEPortEntry'
++ db.delete_table('Reporting_seportentry')
++
++ # Removing M2M table for field sebooleans on 'Interaction'
++ db.delete_table('Reporting_interaction_sebooleans')
++
++ # Removing M2M table for field seports on 'Interaction'
++ db.delete_table('Reporting_interaction_seports')
++
++ # Removing M2M table for field sefcontexts on 'Interaction'
++ db.delete_table('Reporting_interaction_sefcontexts')
++
++ # Removing M2M table for field senodes on 'Interaction'
++ db.delete_table('Reporting_interaction_senodes')
++
++ # Removing M2M table for field selogins on 'Interaction'
++ db.delete_table('Reporting_interaction_selogins')
++
++ # Removing M2M table for field seusers on 'Interaction'
++ db.delete_table('Reporting_interaction_seusers')
++
++ # Removing M2M table for field seinterfaces on 'Interaction'
++ db.delete_table('Reporting_interaction_seinterfaces')
++
++ # Removing M2M table for field sepermissives on 'Interaction'
++ db.delete_table('Reporting_interaction_sepermissives')
++
++ # Removing M2M table for field semodules on 'Interaction'
++ db.delete_table('Reporting_interaction_semodules')
++
++
++ models = {
++ 'Reporting.actionentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'ActionEntry'},
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'output': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {}),
++ 'status': ('django.db.models.fields.CharField', [], {'default': "'check'", 'max_length': '128'})
++ },
++ 'Reporting.bundle': {
++ 'Meta': {'ordering': "('name',)", 'object_name': 'Bundle'},
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
++ },
++ 'Reporting.client': {
++ 'Meta': {'object_name': 'Client'},
++ 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
++ 'current_interaction': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parent_client'", 'null': 'True', 'to': "orm['Reporting.Interaction']"}),
++ 'expiration': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
++ },
++ 'Reporting.deviceentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'DeviceEntry', '_ormbases': ['Reporting.PathEntry']},
++ 'current_major': ('django.db.models.fields.IntegerField', [], {}),
++ 'current_minor': ('django.db.models.fields.IntegerField', [], {}),
++ 'device_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
++ 'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
++ 'target_major': ('django.db.models.fields.IntegerField', [], {}),
++ 'target_minor': ('django.db.models.fields.IntegerField', [], {})
++ },
++ 'Reporting.failureentry': {
++ 'Meta': {'object_name': 'FailureEntry'},
++ 'entry_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'message': ('django.db.models.fields.TextField', [], {}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
++ },
++ 'Reporting.fileacl': {
++ 'Meta': {'object_name': 'FileAcl'},
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
++ },
++ 'Reporting.fileperms': {
++ 'Meta': {'unique_together': "(('owner', 'group', 'mode'),)", 'object_name': 'FilePerms'},
++ 'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'mode': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'})
++ },
++ 'Reporting.group': {
++ 'Meta': {'ordering': "('name',)", 'object_name': 'Group'},
++ 'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
++ 'category': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
++ 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
++ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
++ 'profile': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++ 'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
++ },
++ 'Reporting.interaction': {
++ 'Meta': {'ordering': "['-timestamp']", 'unique_together': "(('client', 'timestamp'),)", 'object_name': 'Interaction'},
++ 'actions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ActionEntry']", 'symmetrical': 'False'}),
++ 'bad_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
++ 'client': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interactions'", 'to': "orm['Reporting.Client']"}),
++ 'extra_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'failures': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FailureEntry']", 'symmetrical': 'False'}),
++ 'good_count': ('django.db.models.fields.IntegerField', [], {}),
++ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'modified_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'packages': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PackageEntry']", 'symmetrical': 'False'}),
++ 'paths': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PathEntry']", 'symmetrical': 'False'}),
++ 'profile': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'null': 'True', 'to': "orm['Reporting.Group']"}),
++ 'repo_rev_code': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
++ 'sebooleans': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEBooleanEntry']", 'symmetrical': 'False'}),
++ 'sefcontexts': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEFcontextEntry']", 'symmetrical': 'False'}),
++ 'seinterfaces': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEInterfaceEntry']", 'symmetrical': 'False'}),
++ 'selogins': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SELoginEntry']", 'symmetrical': 'False'}),
++ 'semodules': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEModuleEntry']", 'symmetrical': 'False'}),
++ 'senodes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SENodeEntry']", 'symmetrical': 'False'}),
++ 'sepermissives': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEPermissiveEntry']", 'symmetrical': 'False'}),
++ 'seports': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEPortEntry']", 'symmetrical': 'False'}),
++ 'server': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
++ 'services': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ServiceEntry']", 'symmetrical': 'False'}),
++ 'seusers': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEUserEntry']", 'symmetrical': 'False'}),
++ 'state': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
++ 'timestamp': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
++ 'total_count': ('django.db.models.fields.IntegerField', [], {})
++ },
++ 'Reporting.linkentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'LinkEntry', '_ormbases': ['Reporting.PathEntry']},
++ 'current_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
++ 'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
++ 'target_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'})
++ },
++ 'Reporting.packageentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'PackageEntry'},
++ 'current_version': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {}),
++ 'target_version': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}),
++ 'verification_details': ('django.db.models.fields.TextField', [], {'default': "''"})
++ },
++ 'Reporting.pathentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'PathEntry'},
++ 'acls': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FileAcl']", 'symmetrical': 'False'}),
++ 'current_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"}),
++ 'detail_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'details': ('django.db.models.fields.TextField', [], {'default': "''"}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'path_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {}),
++ 'target_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"})
++ },
++ 'Reporting.performance': {
++ 'Meta': {'object_name': 'Performance'},
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'interaction': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'performance_items'", 'to': "orm['Reporting.Interaction']"}),
++ 'metric': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '32', 'decimal_places': '16'})
++ },
++ 'Reporting.sebooleanentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEBooleanEntry'},
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {}),
++ 'value': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
++ },
++ 'Reporting.sefcontextentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEFcontextEntry'},
++ 'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'filetype': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {})
++ },
++ 'Reporting.seinterfaceentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEInterfaceEntry'},
++ 'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {})
++ },
++ 'Reporting.seloginentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SELoginEntry'},
++ 'current_selinuxuser': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'selinuxuser': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {})
++ },
++ 'Reporting.semoduleentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEModuleEntry'},
++ 'current_disabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++ 'disabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {})
++ },
++ 'Reporting.senodeentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SENodeEntry'},
++ 'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'proto': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
++ 'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {})
++ },
++ 'Reporting.sepermissiveentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEPermissiveEntry'},
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {})
++ },
++ 'Reporting.seportentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEPortEntry'},
++ 'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {})
++ },
++ 'Reporting.serviceentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'ServiceEntry'},
++ 'current_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {}),
++ 'target_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'})
++ },
++ 'Reporting.seuserentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEUserEntry'},
++ 'current_prefix': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
++ 'current_roles': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'prefix': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'roles': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {})
++ }
++ }
++
++ complete_apps = ['Reporting']
+\ No newline at end of file
+diff --git a/src/lib/Bcfg2/Reporting/south_migrations/0006_add_user_group_entry_support.py b/src/lib/Bcfg2/Reporting/south_migrations/0006_add_user_group_entry_support.py
+new file mode 100644
+index 0000000..d86e663
+--- /dev/null
++++ b/src/lib/Bcfg2/Reporting/south_migrations/0006_add_user_group_entry_support.py
+@@ -0,0 +1,340 @@
++# -*- coding: utf-8 -*-
++import datetime
++from south.db import db
++from south.v2 import SchemaMigration
++from django.db import models
++
++
++class Migration(SchemaMigration):
++
++ def forwards(self, orm):
++ # Adding model 'POSIXGroupEntry'
++ db.create_table('Reporting_posixgroupentry', (
++ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
++ ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
++ ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
++ ('state', self.gf('django.db.models.fields.IntegerField')()),
++ ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
++ ('gid', self.gf('django.db.models.fields.IntegerField')(null=True)),
++ ('current_gid', self.gf('django.db.models.fields.IntegerField')(null=True)),
++ ))
++ db.send_create_signal('Reporting', ['POSIXGroupEntry'])
++
++ # Adding model 'POSIXUserEntry'
++ db.create_table('Reporting_posixuserentry', (
++ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
++ ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
++ ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
++ ('state', self.gf('django.db.models.fields.IntegerField')()),
++ ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
++ ('uid', self.gf('django.db.models.fields.IntegerField')(null=True)),
++ ('current_uid', self.gf('django.db.models.fields.IntegerField')(null=True)),
++ ('group', self.gf('django.db.models.fields.CharField')(max_length=64)),
++ ('current_group', self.gf('django.db.models.fields.CharField')(max_length=64, null=True)),
++ ('gecos', self.gf('django.db.models.fields.CharField')(max_length=1024)),
++ ('current_gecos', self.gf('django.db.models.fields.CharField')(max_length=1024, null=True)),
++ ('home', self.gf('django.db.models.fields.CharField')(max_length=1024)),
++ ('current_home', self.gf('django.db.models.fields.CharField')(max_length=1024, null=True)),
++ ('shell', self.gf('django.db.models.fields.CharField')(default='/bin/bash', max_length=1024)),
++ ('current_shell', self.gf('django.db.models.fields.CharField')(max_length=1024, null=True)),
++ ))
++ db.send_create_signal('Reporting', ['POSIXUserEntry'])
++
++ # Adding M2M table for field posixusers on 'Interaction'
++ db.create_table('Reporting_interaction_posixusers', (
++ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
++ ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
++ ('posixuserentry', models.ForeignKey(orm['Reporting.posixuserentry'], null=False))
++ ))
++ db.create_unique('Reporting_interaction_posixusers', ['interaction_id', 'posixuserentry_id'])
++
++ # Adding M2M table for field posixgroups on 'Interaction'
++ db.create_table('Reporting_interaction_posixgroups', (
++ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
++ ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
++ ('posixgroupentry', models.ForeignKey(orm['Reporting.posixgroupentry'], null=False))
++ ))
++ db.create_unique('Reporting_interaction_posixgroups', ['interaction_id', 'posixgroupentry_id'])
++
++
++ def backwards(self, orm):
++ # Deleting model 'POSIXGroupEntry'
++ db.delete_table('Reporting_posixgroupentry')
++
++ # Deleting model 'POSIXUserEntry'
++ db.delete_table('Reporting_posixuserentry')
++
++ # Removing M2M table for field posixusers on 'Interaction'
++ db.delete_table('Reporting_interaction_posixusers')
++
++ # Removing M2M table for field posixgroups on 'Interaction'
++ db.delete_table('Reporting_interaction_posixgroups')
++
++
++ models = {
++ 'Reporting.actionentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'ActionEntry'},
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'output': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {}),
++ 'status': ('django.db.models.fields.CharField', [], {'default': "'check'", 'max_length': '128'})
++ },
++ 'Reporting.bundle': {
++ 'Meta': {'ordering': "('name',)", 'object_name': 'Bundle'},
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
++ },
++ 'Reporting.client': {
++ 'Meta': {'object_name': 'Client'},
++ 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
++ 'current_interaction': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parent_client'", 'null': 'True', 'to': "orm['Reporting.Interaction']"}),
++ 'expiration': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
++ },
++ 'Reporting.deviceentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'DeviceEntry', '_ormbases': ['Reporting.PathEntry']},
++ 'current_major': ('django.db.models.fields.IntegerField', [], {}),
++ 'current_minor': ('django.db.models.fields.IntegerField', [], {}),
++ 'device_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
++ 'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
++ 'target_major': ('django.db.models.fields.IntegerField', [], {}),
++ 'target_minor': ('django.db.models.fields.IntegerField', [], {})
++ },
++ 'Reporting.failureentry': {
++ 'Meta': {'object_name': 'FailureEntry'},
++ 'entry_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'message': ('django.db.models.fields.TextField', [], {}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
++ },
++ 'Reporting.fileacl': {
++ 'Meta': {'object_name': 'FileAcl'},
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
++ },
++ 'Reporting.fileperms': {
++ 'Meta': {'unique_together': "(('owner', 'group', 'mode'),)", 'object_name': 'FilePerms'},
++ 'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'mode': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'})
++ },
++ 'Reporting.group': {
++ 'Meta': {'ordering': "('name',)", 'object_name': 'Group'},
++ 'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
++ 'category': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
++ 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
++ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
++ 'profile': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++ 'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
++ },
++ 'Reporting.interaction': {
++ 'Meta': {'ordering': "['-timestamp']", 'unique_together': "(('client', 'timestamp'),)", 'object_name': 'Interaction'},
++ 'actions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ActionEntry']", 'symmetrical': 'False'}),
++ 'bad_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
++ 'client': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interactions'", 'to': "orm['Reporting.Client']"}),
++ 'extra_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'failures': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FailureEntry']", 'symmetrical': 'False'}),
++ 'good_count': ('django.db.models.fields.IntegerField', [], {}),
++ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'modified_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'packages': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PackageEntry']", 'symmetrical': 'False'}),
++ 'paths': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PathEntry']", 'symmetrical': 'False'}),
++ 'posixgroups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.POSIXGroupEntry']", 'symmetrical': 'False'}),
++ 'posixusers': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.POSIXUserEntry']", 'symmetrical': 'False'}),
++ 'profile': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'null': 'True', 'to': "orm['Reporting.Group']"}),
++ 'repo_rev_code': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
++ 'sebooleans': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEBooleanEntry']", 'symmetrical': 'False'}),
++ 'sefcontexts': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEFcontextEntry']", 'symmetrical': 'False'}),
++ 'seinterfaces': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEInterfaceEntry']", 'symmetrical': 'False'}),
++ 'selogins': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SELoginEntry']", 'symmetrical': 'False'}),
++ 'semodules': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEModuleEntry']", 'symmetrical': 'False'}),
++ 'senodes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SENodeEntry']", 'symmetrical': 'False'}),
++ 'sepermissives': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEPermissiveEntry']", 'symmetrical': 'False'}),
++ 'seports': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEPortEntry']", 'symmetrical': 'False'}),
++ 'server': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
++ 'services': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ServiceEntry']", 'symmetrical': 'False'}),
++ 'seusers': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEUserEntry']", 'symmetrical': 'False'}),
++ 'state': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
++ 'timestamp': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
++ 'total_count': ('django.db.models.fields.IntegerField', [], {})
++ },
++ 'Reporting.linkentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'LinkEntry', '_ormbases': ['Reporting.PathEntry']},
++ 'current_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
++ 'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
++ 'target_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'})
++ },
++ 'Reporting.packageentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'PackageEntry'},
++ 'current_version': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {}),
++ 'target_version': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}),
++ 'verification_details': ('django.db.models.fields.TextField', [], {'default': "''"})
++ },
++ 'Reporting.pathentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'PathEntry'},
++ 'acls': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FileAcl']", 'symmetrical': 'False'}),
++ 'current_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"}),
++ 'detail_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
++ 'details': ('django.db.models.fields.TextField', [], {'default': "''"}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'path_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {}),
++ 'target_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"})
++ },
++ 'Reporting.performance': {
++ 'Meta': {'object_name': 'Performance'},
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'interaction': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'performance_items'", 'to': "orm['Reporting.Interaction']"}),
++ 'metric': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '32', 'decimal_places': '16'})
++ },
++ 'Reporting.posixgroupentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'POSIXGroupEntry'},
++ 'current_gid': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'gid': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {})
++ },
++ 'Reporting.posixuserentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'POSIXUserEntry'},
++ 'current_gecos': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True'}),
++ 'current_group': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True'}),
++ 'current_home': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True'}),
++ 'current_shell': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True'}),
++ 'current_uid': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'gecos': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
++ 'group': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'home': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'shell': ('django.db.models.fields.CharField', [], {'default': "'/bin/bash'", 'max_length': '1024'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {}),
++ 'uid': ('django.db.models.fields.IntegerField', [], {'null': 'True'})
++ },
++ 'Reporting.sebooleanentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEBooleanEntry'},
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {}),
++ 'value': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
++ },
++ 'Reporting.sefcontextentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEFcontextEntry'},
++ 'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'filetype': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {})
++ },
++ 'Reporting.seinterfaceentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEInterfaceEntry'},
++ 'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {})
++ },
++ 'Reporting.seloginentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SELoginEntry'},
++ 'current_selinuxuser': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'selinuxuser': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {})
++ },
++ 'Reporting.semoduleentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEModuleEntry'},
++ 'current_disabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++ 'disabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {})
++ },
++ 'Reporting.senodeentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SENodeEntry'},
++ 'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'proto': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
++ 'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {})
++ },
++ 'Reporting.sepermissiveentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEPermissiveEntry'},
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {})
++ },
++ 'Reporting.seportentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEPortEntry'},
++ 'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {})
++ },
++ 'Reporting.serviceentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'ServiceEntry'},
++ 'current_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {}),
++ 'target_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'})
++ },
++ 'Reporting.seuserentry': {
++ 'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEUserEntry'},
++ 'current_prefix': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
++ 'current_roles': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
++ 'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++ 'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
++ 'prefix': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'roles': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++ 'state': ('django.db.models.fields.IntegerField', [], {})
++ }
++ }
++
++ complete_apps = ['Reporting']
+\ No newline at end of file
+diff --git a/src/lib/Bcfg2/Reporting/south_migrations/__init__.py b/src/lib/Bcfg2/Reporting/south_migrations/__init__.py
+new file mode 100644
+index 0000000..e69de29
+diff --git a/src/lib/Bcfg2/Server/Admin/Reports.py b/src/lib/Bcfg2/Server/Admin/Reports.py
+index eb97123..6399d24 100644
+--- a/src/lib/Bcfg2/Server/Admin/Reports.py
++++ b/src/lib/Bcfg2/Server/Admin/Reports.py
+@@ -8,6 +8,7 @@ import traceback
+ from Bcfg2 import settings
+
+ # Load django and reports stuff _after_ we know we can load settings
++import django
+ from django.core import management
+ from Bcfg2.Reporting.utils import *
+
+@@ -71,11 +72,14 @@ class Reports(Bcfg2.Server.Admin.Mode):
+
+ def __init__(self, setup):
+ Bcfg2.Server.Admin.Mode.__init__(self, setup)
+- try:
+- import south
+- except ImportError:
+- print("Django south is required for Reporting")
+- raise SystemExit(-3)
++ if django.VERSION[0] == 1 and django.VERSION[1] >= 7:
++ django.setup()
++ elif django.VERIONS[0] == 1 and django.VERSION[1] <= 6:
++ try:
++ import south
++ except ImportError:
++ print("Django south is required for Reporting")
++ raise SystemExit(-3)
+
+ def __call__(self, args):
+ if len(args) == 0 or args[0] == '-h':
+diff --git a/src/lib/Bcfg2/Server/Core.py b/src/lib/Bcfg2/Server/Core.py
+index 44ba0fe..9d5a3a5 100644
+--- a/src/lib/Bcfg2/Server/Core.py
++++ b/src/lib/Bcfg2/Server/Core.py
+@@ -248,10 +248,14 @@ class BaseCore(object):
+
+ from django.core.exceptions import ImproperlyConfigured
+ from django.core import management
++ import django
++ if django.VERSION[0] == 1 and django.VERSION[1] >= 7:
++ django.setup()
+ try:
+ management.call_command("syncdb", interactive=False,
+ verbosity=0)
+ self._database_available = True
++ django.db.close_connection()
+ except ImproperlyConfigured:
+ self.logger.error("Django configuration problem: %s" %
+ sys.exc_info()[1])
+diff --git a/src/lib/Bcfg2/manage.py b/src/lib/Bcfg2/manage.py
+index 3e4eedc..2861916 100755
+--- a/src/lib/Bcfg2/manage.py
++++ b/src/lib/Bcfg2/manage.py
+@@ -1,14 +1,21 @@
+ #!/usr/bin/env python
+-from django.core.management import execute_manager
+-import imp
+-try:
+- imp.find_module('settings') # Assumed to be in the same directory.
+-except ImportError:
+- import sys
+- sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n" % __file__)
+- sys.exit(1)
++import os
++import sys
++import django
+
+-import settings
++if django.VERSION[0] == 1 and django.VERSION[1] <= 6:
++ try:
++ imp.find_module('settings') # Assumed to be in the same directory.
++ except ImportError:
++ import sys
++ sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n" % __file__)
++ sys.exit(1)
+
+ if __name__ == "__main__":
+- execute_manager(settings)
++ if django.VERSION[0] == 1 and django.VERSION[1] >= 7:
++ os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Bcfg2.settings')
++
++ from django.core.management import execute_from_command_line
++ execute_from_command_line(sys.argv)
++ else:
++ execute_manager(settings)
+diff --git a/src/lib/Bcfg2/settings.py b/src/lib/Bcfg2/settings.py
+index 2c5466a..fd7103e 100644
+--- a/src/lib/Bcfg2/settings.py
++++ b/src/lib/Bcfg2/settings.py
+@@ -144,11 +144,18 @@ INSTALLED_APPS = (
+ 'django.contrib.admin',
+ 'Bcfg2.Server',
+ )
+-if HAS_SOUTH:
++if HAS_DJANGO and django.VERSION[0] == 1 and django.VERSION[1] >= 7:
++ INSTALLED_APPS = INSTALLED_APPS + (
++ 'Bcfg2.Reporting',
++ )
++elif HAS_SOUTH:
+ INSTALLED_APPS = INSTALLED_APPS + (
+ 'south',
+ 'Bcfg2.Reporting',
+ )
++ SOUTH_MIGRATION_MODULES = {
++ 'Bcfg2.Reporting': 'Bcfg2.Reporting.south_migrations',
++ }
+ if 'BCFG2_LEGACY_MODELS' in os.environ:
+ INSTALLED_APPS += ('Bcfg2.Server.Reports.reports',)
+
+@@ -224,3 +231,5 @@ else:
+ 'django.core.context_processors.media',
+ 'django.core.context_processors.request'
+ )
++
++TEST_RUNNER = 'django.test.simple.DjangoTestSuiteRunner'
+diff --git a/src/sbin/bcfg2-reports b/src/sbin/bcfg2-reports
+index 2a8447a..7fc2da1 100755
+--- a/src/sbin/bcfg2-reports
++++ b/src/sbin/bcfg2-reports
+@@ -23,6 +23,9 @@ sys.path.pop()
+ # Set DJANGO_SETTINGS_MODULE appropriately.
+ os.environ['DJANGO_SETTINGS_MODULE'] = '%s.settings' % project_name
+
++import django
++if django.VERSION[0] == 1 and django.VERSION[1] >= 7:
++ django.setup()
+ from Bcfg2.Reporting.models import (Client, BaseEntry)
+ from django import db
+
diff -Nru bcfg2-1.3.5/debian/patches/series bcfg2-1.3.5/debian/patches/series
--- bcfg2-1.3.5/debian/patches/series 2014-09-09 19:52:58.000000000 +0300
+++ bcfg2-1.3.5/debian/patches/series 2015-09-22 13:27:53.000000000 +0300
@@ -1,2 +1,3 @@
0001-Update-Apache-configuration-for-version-2.4.patch
0002-Modify-systemd-service-files-to-suit-Debian.patch
+0003-make-Bcfg2-compatible-with-django-1.7.patch
Reply to: