# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-06-21 11:23
from __future__ import unicode_literals

from django.conf import settings
import django.contrib.postgres.fields.jsonb
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

    initial = True

    dependencies = [
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
        ('contenttypes', '0002_remove_content_type_name'),
    ]

    operations = [
        migrations.CreateModel(
            name='Application',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=255)),
                ('isPublic', models.BooleanField(default=True)),
                ('object_id', models.PositiveIntegerField(null=True, verbose_name='app owner id')),
                ('content_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType', verbose_name='application owner')),
            ],
            options={
                'permissions': (('admin', 'All application privileges'), ('edit', 'add/modify application attributes'), ('view', 'read access to the application')),
            },
        ),
        migrations.CreateModel(
            name='AppVersion',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=255)),
                ('aliases', django.contrib.postgres.fields.jsonb.JSONField()),
                ('domain', models.URLField(max_length=255)),
                ('app', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='appmgr.Application')),
            ],
        ),
        migrations.CreateModel(
            name='Organization',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=255)),
            ],
            options={
                'permissions': (('admin', 'All organizational privileges'), ('change_apps', "Create/Modify/Delete Org's Applications"), ('change_members', 'Add/Remove Users')),
            },
        ),
        migrations.CreateModel(
            name='UserProfile',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
            ],
        ),
        migrations.AddField(
            model_name='organization',
            name='members',
            field=models.ManyToManyField(to='appmgr.UserProfile'),
        ),
    ]
