# Copyright 2017-present Open Networking Foundation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-20 22:14
from __future__ import unicode_literals

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

    dependencies = [
        ('volt', '0007_auto_20190515_1428'),
    ]

    operations = [
        migrations.CreateModel(
            name='ANIPort_decl',
            fields=[
                ('portbase_decl_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='volt.PortBase_decl')),
                ('onu_device', models.ForeignKey(help_text=b'ONUDevice that owns this ANIPort', on_delete=django.db.models.deletion.CASCADE, related_name='ani_ports', to='volt.ONUDevice_decl')),
            ],
            options={
                'verbose_name': 'ANI Port',
            },
            bases=('volt.portbase_decl',),
        ),
        migrations.RemoveField(
            model_name='pononuport_decl',
            name='onu_device',
        ),
        migrations.RemoveField(
            model_name='pononuport_decl',
            name='portbase_decl_ptr',
        ),
        migrations.DeleteModel(
            name='PONONUPort',
        ),
        migrations.DeleteModel(
            name='PONONUPort_decl',
        ),
        migrations.CreateModel(
            name='ANIPort',
            fields=[
            ],
            options={
                'proxy': True,
                'indexes': [],
            },
            bases=('volt.aniport_decl',),
        ),
    ]
