예제 #1
0
파일: models.py 프로젝트: hieuldt/promgen
class Shard(models.Model):
    name = models.CharField(max_length=128,
                            unique=True,
                            validators=[validators.labelvalue])
    url = models.URLField(max_length=256)
    proxy = models.BooleanField(
        default=False,
        help_text="Queries can be proxied to these shards",
    )
    enabled = models.BooleanField(
        default=True,
        help_text="Able to register new Services and Projects",
    )

    samples = models.PositiveBigIntegerField(
        default=5000000,
        help_text="Estimated Sample Count",
    )
    targets = models.PositiveBigIntegerField(
        default=10000,
        help_text="Estimated Target Count",
    )

    class Meta:
        ordering = ["name"]

    def get_absolute_url(self):
        return reverse("datasource-detail", kwargs={"pk": self.pk})

    def __str__(self):
        if self.enabled:
            return self.name
        return self.name + " (disabled)"
예제 #2
0
class Migration(migrations.Migration):

    dependencies = [
        ('projects', '0008_add_subproject_alias_prefix'),
    ]

    operations = [
        migrations.AlterModelOptions(
            name='domain',
            options={'ordering': ('-canonical', '-machine', 'domain')},
        ),
        migrations.AddField(
            model_name='domain',
            name='domain',
            field=models.CharField(
                null=True,
                max_length=255,
                verbose_name='Domain',
                validators=[
                    django.contrib.sites.models._simple_domain_name_validator
                ]),
            preserve_default=False,
        ),
        migrations.AlterField(
            model_name='domain',
            name='canonical',
            field=models.BooleanField(
                default=False,
                help_text=
                'This Domain is the primary one where the documentation is served from.'
            ),
        ),
        migrations.AlterField(
            model_name='domain',
            name='cname',
            field=models.BooleanField(
                default=False,
                help_text='This Domain is a CNAME for the project'),
        ),
        migrations.AlterField(
            model_name='domain',
            name='machine',
            field=models.BooleanField(
                default=False, help_text='This Domain was auto-created'),
        ),
        migrations.AlterField(
            model_name='domain',
            name='url',
            field=models.URLField(unique=True, verbose_name='domain'),
        ),
    ]
예제 #3
0
class Shard(models.Model):
    name = models.CharField(max_length=128, unique=True)
    url = models.URLField(max_length=256)
    proxy = models.BooleanField(
        default=False, help_text='Queries can be proxied to these shards')
    enabled = models.BooleanField(
        default=True, help_text='Able to register new Services and Projects')

    class Meta:
        ordering = ['name']

    def get_absolute_url(self):
        return reverse('shard-detail', kwargs={'pk': self.pk})

    def __str__(self):
        return self.name
예제 #4
0
class Exporter(models.Model):
    job = models.CharField(max_length=128,
                           help_text="Exporter name. Example node, jmx, app")
    port = models.IntegerField(help_text="Port Exporter is running on")
    path = models.CharField(max_length=128,
                            blank=True,
                            help_text="Exporter path. Defaults to /metrics")
    scheme = models.CharField(max_length=5,
                              choices=(("http", "http"), ("https", "https")),
                              default="http",
                              help_text="Scrape exporter over http or https")

    project = models.ForeignKey("Project", on_delete=models.CASCADE)
    enabled = models.BooleanField(default=True)

    class Meta:
        ordering = ['job', 'port']
        unique_together = ((
            'job',
            'port',
            'project',
        ), )

    def __str__(self):
        return '{}:{}:{} ({})'.format(self.job, self.port, self.path,
                                      self.project)

    def get_absolute_url(self):
        return reverse('project-detail', kwargs={'pk': self.project.pk})
예제 #5
0
class Exporter(BaseExporter):
    project = models.ForeignKey("Project", on_delete=models.CASCADE)
    enabled = models.BooleanField(default=True)

    class Meta:
        ordering = ["job", "port"]
        unique_together = (("job", "port", "path"),)

    def __str__(self):
        return "{}:{}{}".format(self.job, self.port, self.path or "/metrics")
예제 #6
0
class Shard(models.Model):
    name = models.CharField(max_length=128, unique=True)
    url = models.URLField(max_length=256)
    proxy = models.BooleanField(default=False)

    class Meta:
        ordering = ['name']

    def get_absolute_url(self):
        return reverse('shard-detail', kwargs={'pk': self.pk})

    def __str__(self):
        return self.name
예제 #7
0
class Exporter(models.Model):
    job = models.CharField(max_length=128)
    port = models.IntegerField()
    path = models.CharField(max_length=128, blank=True)
    project = models.ForeignKey('Project', on_delete=models.CASCADE)
    enabled = models.BooleanField(default=True)

    class Meta:
        ordering = ['job', 'port']
        unique_together = (('job', 'port', 'project',),)

    def __str__(self):
        return '{}:{}:{} ({})'.format(self.job, self.port, self.path, self.project)

    def get_absolute_url(self):
        return reverse('project-detail', kwargs={'pk': self.project.pk})
예제 #8
0
class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ('sites', '0002_alter_domain_unique'),
    ]

    operations = [
        migrations.CreateModel(
            name='Domain',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('domain', models.CharField(max_length=100, unique=True, validators=[django.contrib.sites.models._simple_domain_name_validator], verbose_name='domain name')),
                ('name', models.CharField(max_length=50, verbose_name='display name')),
            ],
            options={
                'ordering': ('domain',),
                'verbose_name': 'domain',
                'verbose_name_plural': 'domains',
            },
        ),
        migrations.CreateModel(
            name='Tenant',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True, verbose_name='ID')),
                ('name', models.CharField(max_length=100)),
                ('is_active', models.BooleanField(default=False, help_text='Designates whether this tenant should be treated as active. ', verbose_name='active')),
                ('date_joined', models.DateTimeField(default=django.utils.timezone.now, help_text='When did the user join?', verbose_name='date joined')),
                ('site', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sites.Site')),
            ],
            options={
                'verbose_name': 'tenant',
                'verbose_name_plural': 'tenants',
            },
        ),
        migrations.AddField(
            model_name='domain',
            name='tenant',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tenants.Tenant'),
        ),
    ]
예제 #9
0
class Rule(models.Model):
    objects = ObjectFilterManager()

    name = models.CharField(max_length=128,
                            unique=True,
                            validators=[validators.alphanumeric])
    clause = models.TextField(help_text='Prometheus query')
    duration = models.CharField(
        max_length=128,
        validators=[validators.duration],
        help_text="Duration field with postfix. Example 30s, 5m, 1d")
    enabled = models.BooleanField(default=True)
    parent = models.ForeignKey('Rule',
                               null=True,
                               related_name='overrides',
                               on_delete=models.SET_NULL)

    content_type = models.ForeignKey(
        ContentType,
        on_delete=models.CASCADE,
        limit_choices_to=(models.Q(app_label='sites', model='site')
                          | models.Q(app_label='promgen', model='project')
                          | models.Q(app_label='promgen', model='service')))
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')
    description = models.TextField(blank=True)

    class Meta:
        ordering = ['content_type', 'object_id', 'name']

    @cached_property
    def labels(self):
        return {obj.name: obj.value for obj in self.rulelabel_set.all()}

    def add_label(self, name, value):
        return RuleLabel.objects.get_or_create(rule=self,
                                               name=name,
                                               value=value)

    def add_annotation(self, name, value):
        return RuleAnnotation.objects.get_or_create(rule=self,
                                                    name=name,
                                                    value=value)

    @cached_property
    def annotations(self):
        _annotations = {
            obj.name: obj.value
            for obj in self.ruleannotation_set.all()
        }
        # Skip when pk is not set, such as when test rendering a rule
        if self.pk and 'rule' not in _annotations:
            _annotations['rule'] = resolve_domain('rule-edit', pk=self.pk)
        return _annotations

    def __str__(self):
        return '{} [{}]'.format(self.name, self.content_object.name)

    def get_absolute_url(self):
        return reverse('rule-edit', kwargs={'pk': self.pk})

    def set_object(self, content_type, object_id):
        self.content_type = ContentType.objects.get(model=content_type,
                                                    app_label='promgen')
        self.object_id = object_id

    def copy_to(self, content_type, object_id):
        '''
        Make a copy under a new service

        It's important that we set pk to None so a new object is created, but we
        also need to ensure the new name is unique by appending some unique data
        to the end of the name
        '''
        with transaction.atomic():
            content_type = ContentType.objects.get(model=content_type,
                                                   app_label='promgen')

            # First check to see if this rule is already overwritten
            for rule in Rule.objects.filter(parent_id=self.pk,
                                            content_type=content_type,
                                            object_id=object_id):
                return rule

            content_object = content_type.get_object_for_this_type(
                pk=object_id)

            orig_pk = self.pk
            self.pk = None
            self.parent_id = orig_pk
            self.name = '{}_{}'.format(self.name,
                                       slugify(content_object.name)).replace(
                                           '-', '_')
            self.content_type = content_type
            self.object_id = object_id
            self.enabled = False
            self.clause = self.clause.replace(
                macro.EXCLUSION_MACRO,
                '{}="{}",{}'.format(content_type.model, content_object.name,
                                    macro.EXCLUSION_MACRO))
            self.save()

            # Add a label to our new rule by default, to help ensure notifications
            # get routed to the notifier we expect
            self.add_label(content_type.model, content_object.name)

            for label in RuleLabel.objects.filter(rule_id=orig_pk):
                # Skip service labels from our previous rule
                if label.name in ['service', 'project']:
                    logger.debug('Skipping %s: %s', label.name, label.value)
                    continue
                logger.debug('Copying %s to %s', label, self)
                label.pk = None
                label.rule = self
                label.save()

            for annotation in RuleAnnotation.objects.filter(rule_id=orig_pk):
                logger.debug('Copying %s to %s', annotation, self)
                annotation.pk = None
                annotation.rule = self
                annotation.save()

        return self
예제 #10
0
class Migration(migrations.Migration):

    replaces = [('promgen', '0001_initial'), ('promgen', '0002_audit'),
                ('promgen', '0003_setting'),
                ('promgen', '0004_auto_20161019_0755'),
                ('promgen', '0005_sender'),
                ('promgen', '0006_auto_20161019_1214'),
                ('promgen', '0007_auto_20161020_0253'),
                ('promgen', '0008_auto_20161020_0528'),
                ('promgen', '0009_auto_20161021_0640'),
                ('promgen', '0010_auto_20161025_0034'),
                ('promgen', '0011_auto_20161025_0737'),
                ('promgen', '0012_auto_20161027_0306'),
                ('promgen', '0013_auto_20161027_0307'),
                ('promgen', '0014_stat'), ('promgen', '0015_delete_stat'),
                ('promgen', '0016_auto_20161121_0714'),
                ('promgen', '0017_auto_20161215_2352'),
                ('promgen', '0018_rule_enabled'), ('promgen', '0019_url'),
                ('promgen', '0020_auto_20161226_0337'),
                ('promgen', '0021_auto_20161228_0049'),
                ('promgen', '0022_auto_20170116_0824'),
                ('promgen', '0023_shard'),
                ('promgen', '0024_auto_20170220_0324'),
                ('promgen', '0025_shard_url'),
                ('promgen', '0026_auto_20170315_0344'),
                ('promgen', '0027_prometheus_server'),
                ('promgen', '0028_url_sort_fields'),
                ('promgen', '0029_auto_20170406_0236'),
                ('promgen', '0030_exporter_enabled'),
                ('promgen', '0031_sender_to_notification'),
                ('promgen', '0032_audit_diff'), ('promgen', '0033_diff_old'),
                ('promgen', '0034_auto_20170622_0518'),
                ('promgen', '0035_rule_parent'),
                ('promgen', '0036_auto_20170626_0231'),
                ('promgen', '0037_shard_proxy'),
                ('promgen', '0038_audit_user'),
                ('promgen', '0039_auto_20170725_0257'),
                ('promgen', '0040_default_farm'),
                ('promgen', '0041_sender_owner'),
                ('promgen', '0042_description_field'),
                ('promgen', '0043_rule_description'),
                ('promgen', '0044_common-rules')]

    initial = True

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

    operations = [
        migrations.CreateModel(
            name='Audit',
            fields=[
                ('id',
                 models.AutoField(auto_created=True,
                                  primary_key=True,
                                  serialize=False,
                                  verbose_name='ID')),
                ('body', models.TextField()),
                ('created', models.DateTimeField()),
                ('data', models.TextField(blank=True)),
                ('old', models.TextField(blank=True)),
                ('object_id', models.PositiveIntegerField(default=0)),
                ('content_type',
                 models.ForeignKey(null=True,
                                   on_delete=django.db.models.deletion.CASCADE,
                                   to='contenttypes.ContentType')),
                ('user',
                 models.ForeignKey(
                     default=None,
                     null=True,
                     on_delete=django.db.models.deletion.SET_NULL,
                     to=settings.AUTH_USER_MODEL)),
            ],
        ),
        migrations.CreateModel(
            name='Exporter',
            fields=[
                ('id',
                 models.AutoField(auto_created=True,
                                  primary_key=True,
                                  serialize=False,
                                  verbose_name='ID')),
                ('job', models.CharField(max_length=128)),
                ('port', models.IntegerField()),
                ('path', models.CharField(blank=True, max_length=128)),
                ('enabled', models.BooleanField(default=True)),
            ],
            options={
                'ordering': ['job', 'port'],
            },
        ),
        migrations.CreateModel(
            name='Farm',
            fields=[
                ('id',
                 models.AutoField(auto_created=True,
                                  primary_key=True,
                                  serialize=False,
                                  verbose_name='ID')),
                ('name', models.CharField(max_length=128)),
                ('source', models.CharField(max_length=128)),
            ],
            options={
                'ordering': ['name'],
            },
        ),
        migrations.CreateModel(
            name='Host',
            fields=[
                ('id',
                 models.AutoField(auto_created=True,
                                  primary_key=True,
                                  serialize=False,
                                  verbose_name='ID')),
                ('name', models.CharField(max_length=128)),
                ('farm',
                 models.ForeignKey(on_delete=django.db.models.deletion.CASCADE,
                                   to='promgen.Farm')),
            ],
            options={
                'ordering': ['name'],
            },
        ),
        migrations.CreateModel(
            name='Project',
            fields=[
                ('id',
                 models.AutoField(auto_created=True,
                                  primary_key=True,
                                  serialize=False,
                                  verbose_name='ID')),
                ('name', models.CharField(max_length=128, unique=True)),
                ('description', models.TextField(blank=True)),
                ('farm',
                 models.ForeignKey(
                     blank=True,
                     null=True,
                     on_delete=django.db.models.deletion.SET_NULL,
                     to='promgen.Farm')),
            ],
            options={
                'ordering': ['name'],
            },
        ),
        migrations.CreateModel(
            name='Prometheus',
            fields=[
                ('id',
                 models.AutoField(auto_created=True,
                                  primary_key=True,
                                  serialize=False,
                                  verbose_name='ID')),
                ('host', models.CharField(max_length=128)),
                ('port', models.IntegerField()),
            ],
            options={
                'verbose_name_plural': 'prometheis',
                'ordering': ['shard', 'host'],
            },
        ),
        migrations.CreateModel(
            name='Rule',
            fields=[
                ('id',
                 models.AutoField(auto_created=True,
                                  primary_key=True,
                                  serialize=False,
                                  verbose_name='ID')),
                ('name',
                 models.CharField(
                     max_length=128,
                     unique=True,
                     validators=[
                         django.core.validators.RegexValidator(
                             '^[0-9a-zA-Z_]*$',
                             'Only alphanumeric characters are allowed.')
                     ])),
                ('clause', models.TextField(help_text='Prometheus query')),
                ('duration',
                 models.CharField(
                     help_text=
                     'Duration field with postfix. Example 30s, 5m, 1d',
                     max_length=128,
                     validators=[promgen.validators.prometheusduration])),
                ('enabled', models.BooleanField(default=True)),
                ('object_id', models.PositiveIntegerField()),
                ('description', models.TextField(blank=True)),
                ('content_type',
                 models.ForeignKey(on_delete=django.db.models.deletion.CASCADE,
                                   to='contenttypes.ContentType')),
                ('parent',
                 models.ForeignKey(
                     null=True,
                     on_delete=django.db.models.deletion.SET_NULL,
                     related_name='overrides',
                     to='promgen.Rule')),
            ],
            options={
                'ordering': ['content_type', 'object_id', 'name'],
            },
        ),
        migrations.CreateModel(
            name='RuleAnnotation',
            fields=[
                ('id',
                 models.AutoField(auto_created=True,
                                  primary_key=True,
                                  serialize=False,
                                  verbose_name='ID')),
                ('name', models.CharField(max_length=128)),
                ('value', models.TextField()),
                ('rule',
                 models.ForeignKey(on_delete=django.db.models.deletion.CASCADE,
                                   to='promgen.Rule')),
            ],
        ),
        migrations.CreateModel(
            name='RuleLabel',
            fields=[
                ('id',
                 models.AutoField(auto_created=True,
                                  primary_key=True,
                                  serialize=False,
                                  verbose_name='ID')),
                ('name', models.CharField(max_length=128)),
                ('value', models.CharField(max_length=128)),
                ('rule',
                 models.ForeignKey(on_delete=django.db.models.deletion.CASCADE,
                                   to='promgen.Rule')),
            ],
        ),
        migrations.CreateModel(
            name='Sender',
            fields=[
                ('id',
                 models.AutoField(auto_created=True,
                                  primary_key=True,
                                  serialize=False,
                                  verbose_name='ID')),
                ('sender', models.CharField(max_length=128)),
                ('value', models.CharField(max_length=128)),
                ('alias', models.CharField(blank=True, max_length=128)),
                ('object_id', models.PositiveIntegerField()),
                ('content_type',
                 models.ForeignKey(on_delete=django.db.models.deletion.CASCADE,
                                   to='contenttypes.ContentType')),
                ('owner',
                 models.ForeignKey(null=True,
                                   on_delete=django.db.models.deletion.CASCADE,
                                   to=settings.AUTH_USER_MODEL)),
            ],
            options={
                'abstract': False,
            },
        ),
        migrations.CreateModel(
            name='Service',
            fields=[
                ('id',
                 models.AutoField(auto_created=True,
                                  primary_key=True,
                                  serialize=False,
                                  verbose_name='ID')),
                ('name', models.CharField(max_length=128, unique=True)),
                ('description', models.TextField(blank=True)),
            ],
            options={
                'ordering': ['shard', 'name'],
            },
        ),
        migrations.CreateModel(
            name='Shard',
            fields=[
                ('id',
                 models.AutoField(auto_created=True,
                                  primary_key=True,
                                  serialize=False,
                                  verbose_name='ID')),
                ('name', models.CharField(max_length=128, unique=True)),
                ('url', models.URLField(max_length=256)),
                ('proxy', models.BooleanField(default=False)),
            ],
            options={
                'ordering': ['name'],
            },
        ),
        migrations.CreateModel(
            name='URL',
            fields=[
                ('id',
                 models.AutoField(auto_created=True,
                                  primary_key=True,
                                  serialize=False,
                                  verbose_name='ID')),
                ('url', models.URLField(max_length=256)),
                ('project',
                 models.ForeignKey(on_delete=django.db.models.deletion.CASCADE,
                                   to='promgen.Project')),
            ],
            options={
                'ordering': ['project__service', 'project', 'url'],
            },
        ),
        migrations.CreateModel(
            name='Site',
            fields=[],
            options={
                'indexes': [],
                'proxy': True,
            },
            bases=('sites.site', ),
            managers=[
                ('objects', django.contrib.sites.models.SiteManager()),
            ],
        ),
        migrations.AddField(
            model_name='service',
            name='shard',
            field=models.ForeignKey(
                on_delete=django.db.models.deletion.CASCADE,
                to='promgen.Shard'),
        ),
        migrations.AddField(
            model_name='prometheus',
            name='shard',
            field=models.ForeignKey(
                on_delete=django.db.models.deletion.CASCADE,
                to='promgen.Shard'),
        ),
        migrations.AddField(
            model_name='project',
            name='service',
            field=models.ForeignKey(
                on_delete=django.db.models.deletion.CASCADE,
                to='promgen.Service'),
        ),
        migrations.AlterUniqueTogether(
            name='farm',
            unique_together=set([('name', 'source')]),
        ),
        migrations.AddField(
            model_name='exporter',
            name='project',
            field=models.ForeignKey(
                on_delete=django.db.models.deletion.CASCADE,
                to='promgen.Project'),
        ),
        migrations.AlterUniqueTogether(
            name='prometheus',
            unique_together=set([('host', 'port')]),
        ),
        migrations.AlterUniqueTogether(
            name='host',
            unique_together=set([('name', 'farm')]),
        ),
        migrations.AlterUniqueTogether(
            name='exporter',
            unique_together=set([('job', 'port', 'project')]),
        ),
    ]
예제 #11
0
class Migration(migrations.Migration):

    initial = True

    dependencies = [("auth", "0009_alter_user_last_name_max_length")]

    operations = [
        migrations.CreateModel(
            name="User",
            fields=[
                ("password",
                 models.CharField(max_length=128, verbose_name="password")),
                (
                    "last_login",
                    models.DateTimeField(blank=True,
                                         null=True,
                                         verbose_name="last login"),
                ),
                (
                    "is_superuser",
                    models.BooleanField(
                        default=False,
                        help_text=
                        "Designates that this user has all permissions without explicitly assigning them.",
                        verbose_name="superuser status",
                    ),
                ),
                (
                    "username",
                    models.CharField(
                        error_messages={
                            "unique":
                            "A user with that username already exists."
                        },
                        help_text=
                        "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.",
                        max_length=150,
                        unique=True,
                        validators=[
                            django.contrib.auth.validators.
                            UnicodeUsernameValidator()
                        ],
                        verbose_name="username",
                    ),
                ),
                (
                    "first_name",
                    models.CharField(blank=True,
                                     max_length=30,
                                     verbose_name="first name"),
                ),
                (
                    "last_name",
                    models.CharField(blank=True,
                                     max_length=150,
                                     verbose_name="last name"),
                ),
                (
                    "email",
                    models.EmailField(blank=True,
                                      max_length=254,
                                      verbose_name="email address"),
                ),
                (
                    "is_staff",
                    models.BooleanField(
                        default=False,
                        help_text=
                        "Designates whether the user can log into this admin site.",
                        verbose_name="staff status",
                    ),
                ),
                (
                    "is_active",
                    models.BooleanField(
                        default=True,
                        help_text=
                        "Designates whether this user should be treated as active. Unselect this instead of deleting accounts.",
                        verbose_name="active",
                    ),
                ),
                (
                    "date_joined",
                    models.DateTimeField(default=django.utils.timezone.now,
                                         verbose_name="date joined"),
                ),
                ("deleted", models.DateTimeField(editable=False, null=True)),
                (
                    "id",
                    models.UUIDField(
                        default=uuid.uuid4,
                        editable=False,
                        help_text="primary key for the record as UUID",
                        primary_key=True,
                        serialize=False,
                        verbose_name="id",
                    ),
                ),
                (
                    "created_on",
                    models.DateTimeField(
                        auto_now_add=True,
                        help_text="date and time at which a record was created",
                        verbose_name="created on",
                    ),
                ),
                (
                    "updated_on",
                    models.DateTimeField(
                        auto_now=True,
                        help_text=
                        "date and time at which a record was last updated",
                        verbose_name="updated on",
                    ),
                ),
                (
                    "groups",
                    models.ManyToManyField(
                        blank=True,
                        help_text=
                        "The groups this user belongs to. A user will get all permissions granted to each of their groups.",
                        related_name="user_set",
                        related_query_name="user",
                        to="auth.Group",
                        verbose_name="groups",
                    ),
                ),
                (
                    "user_permissions",
                    models.ManyToManyField(
                        blank=True,
                        help_text="Specific permissions for this user.",
                        related_name="user_set",
                        related_query_name="user",
                        to="auth.Permission",
                        verbose_name="user permissions",
                    ),
                ),
            ],
            options={
                "verbose_name": "user",
                "verbose_name_plural": "users",
                "db_table": "user",
            },
            managers=[("objects", marsha.core.managers.UserManager())],
        ),
        migrations.CreateModel(
            name="AudioTrack",
            fields=[
                ("deleted", models.DateTimeField(editable=False, null=True)),
                (
                    "id",
                    models.UUIDField(
                        default=uuid.uuid4,
                        editable=False,
                        help_text="primary key for the record as UUID",
                        primary_key=True,
                        serialize=False,
                        verbose_name="id",
                    ),
                ),
                (
                    "created_on",
                    models.DateTimeField(
                        auto_now_add=True,
                        help_text="date and time at which a record was created",
                        verbose_name="created on",
                    ),
                ),
                (
                    "updated_on",
                    models.DateTimeField(
                        auto_now=True,
                        help_text=
                        "date and time at which a record was last updated",
                        verbose_name="updated on",
                    ),
                ),
                (
                    "language",
                    models.CharField(
                        choices=[("en", "english"), ("fr", "french")],
                        help_text="language of this track",
                        max_length=5,
                        verbose_name="track language",
                    ),
                ),
                (
                    "uploaded_on",
                    models.DateTimeField(
                        blank=True,
                        help_text=
                        "datetime at which the active version of the video was uploaded.",
                        null=True,
                        verbose_name="uploaded on",
                    ),
                ),
                (
                    "state",
                    models.CharField(
                        choices=[
                            ("pending", "pending"),
                            ("processing", "processing"),
                            ("error", "error"),
                            ("ready", "ready"),
                        ],
                        default="pending",
                        help_text=
                        "state of the upload and transcoding pipeline in AWS.",
                        max_length=20,
                        verbose_name="state",
                    ),
                ),
            ],
            options={
                "verbose_name": "audio track",
                "verbose_name_plural": "audio tracks",
                "db_table": "audio_track",
            },
        ),
        migrations.CreateModel(
            name="ConsumerSite",
            fields=[
                ("deleted", models.DateTimeField(editable=False, null=True)),
                (
                    "id",
                    models.UUIDField(
                        default=uuid.uuid4,
                        editable=False,
                        help_text="primary key for the record as UUID",
                        primary_key=True,
                        serialize=False,
                        verbose_name="id",
                    ),
                ),
                (
                    "created_on",
                    models.DateTimeField(
                        auto_now_add=True,
                        help_text="date and time at which a record was created",
                        verbose_name="created on",
                    ),
                ),
                (
                    "updated_on",
                    models.DateTimeField(
                        auto_now=True,
                        help_text=
                        "date and time at which a record was last updated",
                        verbose_name="updated on",
                    ),
                ),
                (
                    "name",
                    models.CharField(
                        help_text="name of the consumer site",
                        max_length=50,
                        verbose_name="display name",
                    ),
                ),
                (
                    "domain",
                    models.CharField(
                        help_text="base domain allowed for consumer site.",
                        max_length=100,
                        validators=[
                            django.contrib.sites.models.
                            _simple_domain_name_validator
                        ],
                        verbose_name="domain name",
                    ),
                ),
            ],
            options={
                "verbose_name": "consumer site",
                "verbose_name_plural": "consumer sites",
                "db_table": "consumer_site",
            },
        ),
        migrations.CreateModel(
            name="ConsumerSiteAccess",
            fields=[
                ("deleted", models.DateTimeField(editable=False, null=True)),
                (
                    "id",
                    models.UUIDField(
                        default=uuid.uuid4,
                        editable=False,
                        help_text="primary key for the record as UUID",
                        primary_key=True,
                        serialize=False,
                        verbose_name="id",
                    ),
                ),
                (
                    "created_on",
                    models.DateTimeField(
                        auto_now_add=True,
                        help_text="date and time at which a record was created",
                        verbose_name="created on",
                    ),
                ),
                (
                    "updated_on",
                    models.DateTimeField(
                        auto_now=True,
                        help_text=
                        "date and time at which a record was last updated",
                        verbose_name="updated on",
                    ),
                ),
                (
                    "role",
                    models.CharField(
                        choices=[
                            ("administrator", "administrator"),
                            ("instructor", "instructor"),
                            ("student", "student"),
                        ],
                        default="administrator",
                        help_text=
                        "role granted to the user on the consumer site",
                        max_length=20,
                        verbose_name="role",
                    ),
                ),
                (
                    "consumer_site",
                    models.ForeignKey(
                        help_text="consumer site to which the user has access",
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="user_accesses",
                        to="core.ConsumerSite",
                        verbose_name="site",
                    ),
                ),
                (
                    "user",
                    models.ForeignKey(
                        help_text="user with access to the consumer site",
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="consumersite_accesses",
                        to=settings.AUTH_USER_MODEL,
                        verbose_name="user",
                    ),
                ),
            ],
            options={
                "verbose_name": "consumer site access",
                "verbose_name_plural": "consumer site accesses",
                "db_table": "consumersite_access",
            },
        ),
        migrations.CreateModel(
            name="ConsumerSiteOrganization",
            fields=[
                ("deleted", models.DateTimeField(editable=False, null=True)),
                (
                    "id",
                    models.UUIDField(
                        default=uuid.uuid4,
                        editable=False,
                        help_text="primary key for the record as UUID",
                        primary_key=True,
                        serialize=False,
                        verbose_name="id",
                    ),
                ),
                (
                    "created_on",
                    models.DateTimeField(
                        auto_now_add=True,
                        help_text="date and time at which a record was created",
                        verbose_name="created on",
                    ),
                ),
                (
                    "updated_on",
                    models.DateTimeField(
                        auto_now=True,
                        help_text=
                        "date and time at which a record was last updated",
                        verbose_name="updated on",
                    ),
                ),
                (
                    "consumer_site",
                    models.ForeignKey(
                        help_text="consumer site having this organization",
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="organizations_links",
                        to="core.ConsumerSite",
                        verbose_name="site",
                    ),
                ),
            ],
            options={
                "verbose_name": "organization in consumer site",
                "verbose_name_plural": "organizations in consumer sites",
                "db_table": "consumersite_organization",
            },
        ),
        migrations.CreateModel(
            name="LTIPassport",
            fields=[
                ("deleted", models.DateTimeField(editable=False, null=True)),
                (
                    "id",
                    models.UUIDField(
                        default=uuid.uuid4,
                        editable=False,
                        help_text="primary key for the record as UUID",
                        primary_key=True,
                        serialize=False,
                        verbose_name="id",
                    ),
                ),
                (
                    "created_on",
                    models.DateTimeField(
                        auto_now_add=True,
                        help_text="date and time at which a record was created",
                        verbose_name="created on",
                    ),
                ),
                (
                    "updated_on",
                    models.DateTimeField(
                        auto_now=True,
                        help_text=
                        "date and time at which a record was last updated",
                        verbose_name="updated on",
                    ),
                ),
                (
                    "oauth_consumer_key",
                    models.CharField(
                        editable=False,
                        help_text=
                        "oauth consumer key to authenticate an LTI consumer on the LTI provider",
                        max_length=255,
                        unique=True,
                        verbose_name="oauth consumer key",
                    ),
                ),
                (
                    "shared_secret",
                    models.CharField(
                        editable=False,
                        help_text="LTI Shared secret",
                        max_length=255,
                        verbose_name="shared secret",
                    ),
                ),
                (
                    "is_enabled",
                    models.BooleanField(
                        default=True,
                        help_text="whether the passport is enabled",
                        verbose_name="is enabled",
                    ),
                ),
                (
                    "consumer_site",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="lti_passport_scopes",
                        to="core.ConsumerSite",
                    ),
                ),
                (
                    "created_by",
                    models.ForeignKey(
                        blank=True,
                        editable=False,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="lti_passports",
                        to=settings.AUTH_USER_MODEL,
                    ),
                ),
            ],
            options={
                "verbose_name": "LTI passport",
                "verbose_name_plural": "LTI passports",
                "db_table": "lti_passport",
            },
        ),
        migrations.CreateModel(
            name="Organization",
            fields=[
                ("deleted", models.DateTimeField(editable=False, null=True)),
                (
                    "id",
                    models.UUIDField(
                        default=uuid.uuid4,
                        editable=False,
                        help_text="primary key for the record as UUID",
                        primary_key=True,
                        serialize=False,
                        verbose_name="id",
                    ),
                ),
                (
                    "created_on",
                    models.DateTimeField(
                        auto_now_add=True,
                        help_text="date and time at which a record was created",
                        verbose_name="created on",
                    ),
                ),
                (
                    "updated_on",
                    models.DateTimeField(
                        auto_now=True,
                        help_text=
                        "date and time at which a record was last updated",
                        verbose_name="updated on",
                    ),
                ),
                (
                    "name",
                    models.CharField(
                        help_text="name of the organization",
                        max_length=255,
                        verbose_name="name",
                    ),
                ),
                (
                    "consumer_sites",
                    models.ManyToManyField(
                        help_text=
                        "consumer sites on which this organization is present",
                        related_name="organizations",
                        through="core.ConsumerSiteOrganization",
                        to="core.ConsumerSite",
                        verbose_name="consumer sites",
                    ),
                ),
            ],
            options={
                "verbose_name": "organization",
                "verbose_name_plural": "organizations",
                "db_table": "organization",
            },
        ),
        migrations.CreateModel(
            name="OrganizationAccess",
            fields=[
                ("deleted", models.DateTimeField(editable=False, null=True)),
                (
                    "id",
                    models.UUIDField(
                        default=uuid.uuid4,
                        editable=False,
                        help_text="primary key for the record as UUID",
                        primary_key=True,
                        serialize=False,
                        verbose_name="id",
                    ),
                ),
                (
                    "created_on",
                    models.DateTimeField(
                        auto_now_add=True,
                        help_text="date and time at which a record was created",
                        verbose_name="created on",
                    ),
                ),
                (
                    "updated_on",
                    models.DateTimeField(
                        auto_now=True,
                        help_text=
                        "date and time at which a record was last updated",
                        verbose_name="updated on",
                    ),
                ),
                (
                    "role",
                    models.CharField(
                        choices=[
                            ("administrator", "administrator"),
                            ("instructor", "instructor"),
                            ("student", "student"),
                        ],
                        default="instructor",
                        help_text=
                        "role granted to the user on the consumer site",
                        max_length=20,
                        verbose_name="role",
                    ),
                ),
                (
                    "organization",
                    models.ForeignKey(
                        help_text="organization to which the user has access",
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="user_accesses",
                        to="core.Organization",
                        verbose_name="organization",
                    ),
                ),
                (
                    "user",
                    models.ForeignKey(
                        help_text="user who has access to the organization",
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="organization_accesses",
                        to=settings.AUTH_USER_MODEL,
                        verbose_name="user",
                    ),
                ),
            ],
            options={
                "verbose_name": "organization access",
                "verbose_name_plural": "organization accesses",
                "db_table": "organization_access",
            },
        ),
        migrations.CreateModel(
            name="Playlist",
            fields=[
                ("deleted", models.DateTimeField(editable=False, null=True)),
                (
                    "id",
                    models.UUIDField(
                        default=uuid.uuid4,
                        editable=False,
                        help_text="primary key for the record as UUID",
                        primary_key=True,
                        serialize=False,
                        verbose_name="id",
                    ),
                ),
                (
                    "created_on",
                    models.DateTimeField(
                        auto_now_add=True,
                        help_text="date and time at which a record was created",
                        verbose_name="created on",
                    ),
                ),
                (
                    "updated_on",
                    models.DateTimeField(
                        auto_now=True,
                        help_text=
                        "date and time at which a record was last updated",
                        verbose_name="updated on",
                    ),
                ),
                (
                    "title",
                    models.CharField(
                        help_text="title of the playlist",
                        max_length=255,
                        verbose_name="title",
                    ),
                ),
                (
                    "lti_id",
                    models.CharField(
                        help_text=
                        "ID for synchronization with an external LTI tool",
                        max_length=255,
                        verbose_name="lti id",
                    ),
                ),
                (
                    "is_public",
                    models.BooleanField(
                        default=False,
                        help_text=
                        "if this playlist can be viewed without any access control",
                        verbose_name="is public",
                    ),
                ),
                ("is_portable_to_playlist", models.BooleanField(default=True)),
                ("is_portable_to_consumer_site",
                 models.BooleanField(default=False)),
                (
                    "consumer_site",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="playlists",
                        to="core.ConsumerSite",
                    ),
                ),
                (
                    "created_by",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="created_playlists",
                        to=settings.AUTH_USER_MODEL,
                    ),
                ),
                (
                    "duplicated_from",
                    models.ForeignKey(
                        blank=True,
                        help_text=
                        "original playlist this one was duplicated from",
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="duplicates",
                        to="core.Playlist",
                        verbose_name="duplicate from",
                    ),
                ),
                (
                    "organization",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="playlists",
                        to="core.Organization",
                    ),
                ),
            ],
            options={
                "verbose_name": "playlist",
                "verbose_name_plural": "playlists",
                "db_table": "playlist",
            },
        ),
        migrations.CreateModel(
            name="PlaylistAccess",
            fields=[
                ("deleted", models.DateTimeField(editable=False, null=True)),
                (
                    "id",
                    models.UUIDField(
                        default=uuid.uuid4,
                        editable=False,
                        help_text="primary key for the record as UUID",
                        primary_key=True,
                        serialize=False,
                        verbose_name="id",
                    ),
                ),
                (
                    "created_on",
                    models.DateTimeField(
                        auto_now_add=True,
                        help_text="date and time at which a record was created",
                        verbose_name="created on",
                    ),
                ),
                (
                    "updated_on",
                    models.DateTimeField(
                        auto_now=True,
                        help_text=
                        "date and time at which a record was last updated",
                        verbose_name="updated on",
                    ),
                ),
                (
                    "role",
                    models.CharField(
                        choices=[
                            ("administrator", "administrator"),
                            ("instructor", "instructor"),
                            ("student", "student"),
                        ],
                        default="instructor",
                        help_text=
                        "role granted to the user on the consumer site",
                        max_length=20,
                        verbose_name="role",
                    ),
                ),
                (
                    "playlist",
                    models.ForeignKey(
                        help_text="playlist to which the user has access",
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="user_accesses",
                        to="core.Playlist",
                        verbose_name="playlist",
                    ),
                ),
                (
                    "user",
                    models.ForeignKey(
                        help_text="user who has access to the playlist",
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="playlist_accesses",
                        to=settings.AUTH_USER_MODEL,
                        verbose_name="user",
                    ),
                ),
            ],
            options={
                "verbose_name": "playlist access",
                "verbose_name_plural": "playlist accesses",
                "db_table": "playlist_access",
            },
        ),
        migrations.CreateModel(
            name="SignTrack",
            fields=[
                ("deleted", models.DateTimeField(editable=False, null=True)),
                (
                    "id",
                    models.UUIDField(
                        default=uuid.uuid4,
                        editable=False,
                        help_text="primary key for the record as UUID",
                        primary_key=True,
                        serialize=False,
                        verbose_name="id",
                    ),
                ),
                (
                    "created_on",
                    models.DateTimeField(
                        auto_now_add=True,
                        help_text="date and time at which a record was created",
                        verbose_name="created on",
                    ),
                ),
                (
                    "updated_on",
                    models.DateTimeField(
                        auto_now=True,
                        help_text=
                        "date and time at which a record was last updated",
                        verbose_name="updated on",
                    ),
                ),
                (
                    "language",
                    models.CharField(
                        choices=[("en", "english"), ("fr", "french")],
                        help_text="language of this track",
                        max_length=5,
                        verbose_name="track language",
                    ),
                ),
                (
                    "uploaded_on",
                    models.DateTimeField(
                        blank=True,
                        help_text=
                        "datetime at which the active version of the video was uploaded.",
                        null=True,
                        verbose_name="uploaded on",
                    ),
                ),
                (
                    "state",
                    models.CharField(
                        choices=[
                            ("pending", "pending"),
                            ("processing", "processing"),
                            ("error", "error"),
                            ("ready", "ready"),
                        ],
                        default="pending",
                        help_text=
                        "state of the upload and transcoding pipeline in AWS.",
                        max_length=20,
                        verbose_name="state",
                    ),
                ),
            ],
            options={
                "verbose_name": "signs language track",
                "verbose_name_plural": "signs language tracks",
                "db_table": "sign_track",
            },
        ),
        migrations.CreateModel(
            name="TimedTextTrack",
            fields=[
                ("deleted", models.DateTimeField(editable=False, null=True)),
                (
                    "id",
                    models.UUIDField(
                        default=uuid.uuid4,
                        editable=False,
                        help_text="primary key for the record as UUID",
                        primary_key=True,
                        serialize=False,
                        verbose_name="id",
                    ),
                ),
                (
                    "created_on",
                    models.DateTimeField(
                        auto_now_add=True,
                        help_text="date and time at which a record was created",
                        verbose_name="created on",
                    ),
                ),
                (
                    "updated_on",
                    models.DateTimeField(
                        auto_now=True,
                        help_text=
                        "date and time at which a record was last updated",
                        verbose_name="updated on",
                    ),
                ),
                (
                    "language",
                    models.CharField(
                        choices=[("en", "english"), ("fr", "french")],
                        help_text="language of this track",
                        max_length=5,
                        verbose_name="track language",
                    ),
                ),
                (
                    "uploaded_on",
                    models.DateTimeField(
                        blank=True,
                        help_text=
                        "datetime at which the active version of the video was uploaded.",
                        null=True,
                        verbose_name="uploaded on",
                    ),
                ),
                (
                    "state",
                    models.CharField(
                        choices=[
                            ("pending", "pending"),
                            ("processing", "processing"),
                            ("error", "error"),
                            ("ready", "ready"),
                        ],
                        default="pending",
                        help_text=
                        "state of the upload and transcoding pipeline in AWS.",
                        max_length=20,
                        verbose_name="state",
                    ),
                ),
                (
                    "mode",
                    models.CharField(
                        choices=[
                            ("st", "Subtitle"),
                            ("ts", "Transcript"),
                            ("cc", "Closed captioning"),
                        ],
                        default="st",
                        help_text=
                        "Activate a special mode for this timed text track: simple subtitles, closed captioning (for deaf or hard of hearing viewers) or transcription (complete text below aside of the player).",
                        max_length=2,
                        verbose_name="mode",
                    ),
                ),
            ],
            options={
                "verbose_name": "timed text track",
                "verbose_name_plural": "timed text tracks",
                "db_table": "timed_text_track",
            },
        ),
        migrations.CreateModel(
            name="Video",
            fields=[
                ("deleted", models.DateTimeField(editable=False, null=True)),
                (
                    "id",
                    models.UUIDField(
                        default=uuid.uuid4,
                        editable=False,
                        help_text="primary key for the record as UUID",
                        primary_key=True,
                        serialize=False,
                        verbose_name="id",
                    ),
                ),
                (
                    "created_on",
                    models.DateTimeField(
                        auto_now_add=True,
                        help_text="date and time at which a record was created",
                        verbose_name="created on",
                    ),
                ),
                (
                    "updated_on",
                    models.DateTimeField(
                        auto_now=True,
                        help_text=
                        "date and time at which a record was last updated",
                        verbose_name="updated on",
                    ),
                ),
                (
                    "title",
                    models.CharField(
                        help_text="title of the video",
                        max_length=255,
                        verbose_name="title",
                    ),
                ),
                (
                    "description",
                    models.TextField(
                        blank=True,
                        help_text="description of the video",
                        null=True,
                        verbose_name="description",
                    ),
                ),
                (
                    "resource_id",
                    models.UUIDField(
                        default=uuid.uuid4,
                        editable=False,
                        help_text=
                        "UUID to identify the resource in the backend",
                        verbose_name="Resource UUID",
                    ),
                ),
                (
                    "lti_id",
                    models.CharField(
                        help_text=
                        "ID for synchronization with an external LTI tool",
                        max_length=255,
                        verbose_name="lti id",
                    ),
                ),
                (
                    "position",
                    models.PositiveIntegerField(
                        default=0,
                        help_text="position of this video in the playlist",
                        verbose_name="position",
                    ),
                ),
                (
                    "uploaded_on",
                    models.DateTimeField(
                        blank=True,
                        help_text=
                        "datetime at which the active version of the video was uploaded.",
                        null=True,
                        verbose_name="uploaded on",
                    ),
                ),
                (
                    "state",
                    models.CharField(
                        choices=[
                            ("pending", "pending"),
                            ("processing", "processing"),
                            ("error", "error"),
                            ("ready", "ready"),
                        ],
                        default="pending",
                        help_text=
                        "state of the upload and transcoding pipeline in AWS.",
                        max_length=20,
                        verbose_name="state",
                    ),
                ),
                (
                    "created_by",
                    models.ForeignKey(
                        blank=True,
                        help_text="author of the video",
                        null=True,
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="created_videos",
                        to=settings.AUTH_USER_MODEL,
                        verbose_name="author",
                    ),
                ),
                (
                    "duplicated_from",
                    models.ForeignKey(
                        blank=True,
                        help_text="original video this one was duplicated from",
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="duplicates",
                        to="core.Video",
                        verbose_name="duplicate from",
                    ),
                ),
                (
                    "playlist",
                    models.ForeignKey(
                        help_text="playlist to which this video belongs",
                        on_delete=django.db.models.deletion.PROTECT,
                        related_name="videos",
                        to="core.Playlist",
                        verbose_name="playlist",
                    ),
                ),
            ],
            options={
                "verbose_name": "video",
                "verbose_name_plural": "videos",
                "db_table": "video",
                "ordering": ["position", "id"],
            },
        ),
        migrations.AddField(
            model_name="timedtexttrack",
            name="video",
            field=models.ForeignKey(
                help_text="video for which this track is",
                on_delete=django.db.models.deletion.CASCADE,
                related_name="timedtexttracks",
                to="core.Video",
                verbose_name="video",
            ),
        ),
        migrations.AddField(
            model_name="signtrack",
            name="video",
            field=models.ForeignKey(
                help_text="video for which this track is",
                on_delete=django.db.models.deletion.CASCADE,
                related_name="signtracks",
                to="core.Video",
                verbose_name="video",
            ),
        ),
        migrations.AddField(
            model_name="playlist",
            name="users",
            field=models.ManyToManyField(
                help_text="users who have been granted access to this playlist",
                related_name="playlists",
                through="core.PlaylistAccess",
                to=settings.AUTH_USER_MODEL,
                verbose_name="users",
            ),
        ),
        migrations.AddField(
            model_name="organization",
            name="users",
            field=models.ManyToManyField(
                help_text=
                "users who have been granted access to this organization",
                through="core.OrganizationAccess",
                to=settings.AUTH_USER_MODEL,
                verbose_name="users",
            ),
        ),
        migrations.AddField(
            model_name="ltipassport",
            name="playlist",
            field=models.ForeignKey(
                blank=True,
                null=True,
                on_delete=django.db.models.deletion.SET_NULL,
                related_name="lti_passport_scopes",
                to="core.Playlist",
            ),
        ),
        migrations.AddField(
            model_name="consumersiteorganization",
            name="organization",
            field=models.ForeignKey(
                help_text="organization in this consumer site",
                on_delete=django.db.models.deletion.CASCADE,
                related_name="sites_links",
                to="core.Organization",
                verbose_name="organization",
            ),
        ),
        migrations.AddField(
            model_name="consumersite",
            name="users",
            field=models.ManyToManyField(
                help_text=
                "users who have been granted access to this consumer site",
                through="core.ConsumerSiteAccess",
                to=settings.AUTH_USER_MODEL,
                verbose_name="users",
            ),
        ),
        migrations.AddField(
            model_name="audiotrack",
            name="video",
            field=models.ForeignKey(
                help_text="video for which this track is",
                on_delete=django.db.models.deletion.CASCADE,
                related_name="audiotracks",
                to="core.Video",
                verbose_name="video",
            ),
        ),
        migrations.AddIndex(
            model_name="timedtexttrack",
            index=marsha.core.models.base.NonDeletedUniqueIndex(
                fields=["video", "language", "mode"],
                name="timed_text__video_i_1425f7_idx",
            ),
        ),
        migrations.AddIndex(
            model_name="signtrack",
            index=marsha.core.models.base.NonDeletedUniqueIndex(
                fields=["video", "language"],
                name="sign_track_video_i_8ae92b_idx"),
        ),
        migrations.AddIndex(
            model_name="playlistaccess",
            index=marsha.core.models.base.NonDeletedUniqueIndex(
                fields=["user", "playlist"],
                name="playlist_ac_user_id_c7df1b_idx"),
        ),
        migrations.AddIndex(
            model_name="organizationaccess",
            index=marsha.core.models.base.NonDeletedUniqueIndex(
                fields=["user", "organization"],
                name="organizatio_user_id_d0a5d6_idx"),
        ),
        migrations.AddIndex(
            model_name="consumersiteorganization",
            index=marsha.core.models.base.NonDeletedUniqueIndex(
                fields=["consumer_site", "organization"],
                name="consumersit_consume_89f4d1_idx",
            ),
        ),
        migrations.AddIndex(
            model_name="consumersiteaccess",
            index=marsha.core.models.base.NonDeletedUniqueIndex(
                fields=["user", "consumer_site"],
                name="consumersit_user_id_f9d219_idx"),
        ),
        migrations.AddIndex(
            model_name="audiotrack",
            index=marsha.core.models.base.NonDeletedUniqueIndex(
                fields=["video", "language"],
                name="audio_track_video_i_fe6276_idx"),
        ),
    ]
예제 #12
0
class Migration(migrations.Migration):

    initial = True

    dependencies = [
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
        ('sites', '0002_alter_domain_unique'),
    ]

    operations = [
        migrations.CreateModel(
            name='SiteCustomization',
            fields=[
                ('site', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='sites.site', verbose_name='site')),
                ('is_open_for_signup', models.BooleanField(default=True, verbose_name='is open for signup')),
                ('tagline', models.CharField(blank=True, default='A few words to describe this very website.', help_text='A few words to describe this very website.', max_length=255, verbose_name='tagline')),
                ('tagline_fr', models.CharField(blank=True, default='A few words to describe this very website.', help_text='A few words to describe this very website.', max_length=255, null=True, verbose_name='tagline')),
                ('tagline_en', models.CharField(blank=True, default='A few words to describe this very website.', help_text='A few words to describe this very website.', max_length=255, null=True, verbose_name='tagline')),
                ('tagline_de', models.CharField(blank=True, default='A few words to describe this very website.', help_text='A few words to describe this very website.', max_length=255, null=True, verbose_name='tagline')),
                ('tagline_pt', models.CharField(blank=True, default='A few words to describe this very website.', help_text='A few words to describe this very website.', max_length=255, null=True, verbose_name='tagline')),
                ('tagline_es', models.CharField(blank=True, default='A few words to describe this very website.', help_text='A few words to describe this very website.', max_length=255, null=True, verbose_name='tagline')),
                ('tagline_ja', models.CharField(blank=True, default='A few words to describe this very website.', help_text='A few words to describe this very website.', max_length=255, null=True, verbose_name='tagline')),
                ('tagline_ar', models.CharField(blank=True, default='A few words to describe this very website.', help_text='A few words to describe this very website.', max_length=255, null=True, verbose_name='tagline')),
                ('tagline_ar_dz', models.CharField(blank=True, default='A few words to describe this very website.', help_text='A few words to describe this very website.', max_length=255, null=True, verbose_name='tagline')),
                ('tagline_zh_hans', models.CharField(blank=True, default='A few words to describe this very website.', help_text='A few words to describe this very website.', max_length=255, null=True, verbose_name='tagline')),
                ('tagline_br', models.CharField(blank=True, default='A few words to describe this very website.', help_text='A few words to describe this very website.', max_length=255, null=True, verbose_name='tagline')),
                ('description', models.TextField(blank=True, default='A short text to describe this very website.', help_text='A short text to describe this very website.', max_length=2048, verbose_name='description')),
                ('description_fr', models.TextField(blank=True, default='A short text to describe this very website.', help_text='A short text to describe this very website.', max_length=2048, null=True, verbose_name='description')),
                ('description_en', models.TextField(blank=True, default='A short text to describe this very website.', help_text='A short text to describe this very website.', max_length=2048, null=True, verbose_name='description')),
                ('description_de', models.TextField(blank=True, default='A short text to describe this very website.', help_text='A short text to describe this very website.', max_length=2048, null=True, verbose_name='description')),
                ('description_pt', models.TextField(blank=True, default='A short text to describe this very website.', help_text='A short text to describe this very website.', max_length=2048, null=True, verbose_name='description')),
                ('description_es', models.TextField(blank=True, default='A short text to describe this very website.', help_text='A short text to describe this very website.', max_length=2048, null=True, verbose_name='description')),
                ('description_ja', models.TextField(blank=True, default='A short text to describe this very website.', help_text='A short text to describe this very website.', max_length=2048, null=True, verbose_name='description')),
                ('description_ar', models.TextField(blank=True, default='A short text to describe this very website.', help_text='A short text to describe this very website.', max_length=2048, null=True, verbose_name='description')),
                ('description_ar_dz', models.TextField(blank=True, default='A short text to describe this very website.', help_text='A short text to describe this very website.', max_length=2048, null=True, verbose_name='description')),
                ('description_zh_hans', models.TextField(blank=True, default='A short text to describe this very website.', help_text='A short text to describe this very website.', max_length=2048, null=True, verbose_name='description')),
                ('description_br', models.TextField(blank=True, default='A short text to describe this very website.', help_text='A short text to describe this very website.', max_length=2048, null=True, verbose_name='description')),
            ],
            options={
                'verbose_name': 'site customization',
                'verbose_name_plural': 'site customizations',
                'ordering': ['site'],
            },
        ),
        migrations.CreateModel(
            name='HistoricalSiteCustomization',
            fields=[
                ('is_open_for_signup', models.BooleanField(default=True, verbose_name='is open for signup')),
                ('tagline', models.CharField(blank=True, default='A few words to describe this very website.', help_text='A few words to describe this very website.', max_length=255, verbose_name='tagline')),
                ('tagline_fr', models.CharField(blank=True, default='A few words to describe this very website.', help_text='A few words to describe this very website.', max_length=255, null=True, verbose_name='tagline')),
                ('tagline_en', models.CharField(blank=True, default='A few words to describe this very website.', help_text='A few words to describe this very website.', max_length=255, null=True, verbose_name='tagline')),
                ('tagline_de', models.CharField(blank=True, default='A few words to describe this very website.', help_text='A few words to describe this very website.', max_length=255, null=True, verbose_name='tagline')),
                ('tagline_pt', models.CharField(blank=True, default='A few words to describe this very website.', help_text='A few words to describe this very website.', max_length=255, null=True, verbose_name='tagline')),
                ('tagline_es', models.CharField(blank=True, default='A few words to describe this very website.', help_text='A few words to describe this very website.', max_length=255, null=True, verbose_name='tagline')),
                ('tagline_ja', models.CharField(blank=True, default='A few words to describe this very website.', help_text='A few words to describe this very website.', max_length=255, null=True, verbose_name='tagline')),
                ('tagline_ar', models.CharField(blank=True, default='A few words to describe this very website.', help_text='A few words to describe this very website.', max_length=255, null=True, verbose_name='tagline')),
                ('tagline_ar_dz', models.CharField(blank=True, default='A few words to describe this very website.', help_text='A few words to describe this very website.', max_length=255, null=True, verbose_name='tagline')),
                ('tagline_zh_hans', models.CharField(blank=True, default='A few words to describe this very website.', help_text='A few words to describe this very website.', max_length=255, null=True, verbose_name='tagline')),
                ('tagline_br', models.CharField(blank=True, default='A few words to describe this very website.', help_text='A few words to describe this very website.', max_length=255, null=True, verbose_name='tagline')),
                ('description', models.TextField(blank=True, default='A short text to describe this very website.', help_text='A short text to describe this very website.', max_length=2048, verbose_name='description')),
                ('description_fr', models.TextField(blank=True, default='A short text to describe this very website.', help_text='A short text to describe this very website.', max_length=2048, null=True, verbose_name='description')),
                ('description_en', models.TextField(blank=True, default='A short text to describe this very website.', help_text='A short text to describe this very website.', max_length=2048, null=True, verbose_name='description')),
                ('description_de', models.TextField(blank=True, default='A short text to describe this very website.', help_text='A short text to describe this very website.', max_length=2048, null=True, verbose_name='description')),
                ('description_pt', models.TextField(blank=True, default='A short text to describe this very website.', help_text='A short text to describe this very website.', max_length=2048, null=True, verbose_name='description')),
                ('description_es', models.TextField(blank=True, default='A short text to describe this very website.', help_text='A short text to describe this very website.', max_length=2048, null=True, verbose_name='description')),
                ('description_ja', models.TextField(blank=True, default='A short text to describe this very website.', help_text='A short text to describe this very website.', max_length=2048, null=True, verbose_name='description')),
                ('description_ar', models.TextField(blank=True, default='A short text to describe this very website.', help_text='A short text to describe this very website.', max_length=2048, null=True, verbose_name='description')),
                ('description_ar_dz', models.TextField(blank=True, default='A short text to describe this very website.', help_text='A short text to describe this very website.', max_length=2048, null=True, verbose_name='description')),
                ('description_zh_hans', models.TextField(blank=True, default='A short text to describe this very website.', help_text='A short text to describe this very website.', max_length=2048, null=True, verbose_name='description')),
                ('description_br', models.TextField(blank=True, default='A short text to describe this very website.', help_text='A short text to describe this very website.', max_length=2048, null=True, verbose_name='description')),
                ('history_id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('history_date', models.DateTimeField()),
                ('history_change_reason', models.CharField(max_length=100, null=True)),
                ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)),
                ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
                ('site', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='sites.site', verbose_name='site')),
            ],
            options={
                'verbose_name': 'historical site customization',
                'ordering': ('-history_date', '-history_id'),
                'get_latest_by': 'history_date',
            },
            bases=(simple_history.models.HistoricalChanges, models.Model),
        ),
        migrations.CreateModel(
            name='HistoricalSite',
            fields=[
                ('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')),
                ('domain', models.CharField(db_index=True, max_length=100, validators=[django.contrib.sites.models._simple_domain_name_validator], verbose_name='domain name')),
                ('name', models.CharField(max_length=50, verbose_name='display name')),
                ('history_id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('history_date', models.DateTimeField()),
                ('history_change_reason', models.CharField(max_length=100, null=True)),
                ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)),
                ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
            ],
            options={
                'verbose_name': 'historical site',
                'ordering': ('-history_date', '-history_id'),
                'get_latest_by': 'history_date',
            },
            bases=(simple_history.models.HistoricalChanges, models.Model),
        ),
    ]
예제 #13
0
class Sender(models.Model):
    objects = ObjectFilterManager()

    sender = models.CharField(max_length=128)
    value = models.CharField(max_length=128)
    alias = models.CharField(max_length=128, blank=True)

    content_type = models.ForeignKey(
        ContentType,
        on_delete=models.CASCADE,
        limit_choices_to=(models.Q(app_label='auth', model='user')
                          | models.Q(app_label='promgen', model='project')
                          | models.Q(app_label='promgen', model='service')))
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

    owner = models.ForeignKey(settings.AUTH_USER_MODEL,
                              on_delete=models.CASCADE,
                              null=True)

    enabled = models.BooleanField(default=True)

    def show_value(self):
        if self.alias:
            return self.alias
        return self.value

    show_value.short_description = 'Value'

    def __str__(self):
        return '{}:{}'.format(self.sender, self.show_value())

    @classmethod
    def driver_set(cls):
        '''Return the list of drivers for Sender model'''
        for entry in plugins.notifications():
            try:
                yield entry.module_name, entry.load()
            except ImportError:
                logger.warning('Error importing %s', entry.module_name)

    __driver = {}

    @property
    def driver(self):
        '''Return configured driver for Sender model instance'''
        if self.sender in self.__driver:
            return self.__driver[self.sender]

        for entry in plugins.notifications():
            try:
                self.__driver[entry.module_name] = entry.load()()
            except ImportError:
                logger.warning('Error importing %s', entry.module_name)
        return self.__driver[self.sender]

    def test(self):
        '''
        Test sender plugin

        Uses the same test json from our unittests but subs in the currently
        tested object as part of the test data
        '''
        data = tests.Data("examples", "alertmanager.json").json()
        if hasattr(self.content_object, 'name'):
            data['commonLabels'][
                self.content_type.name] = self.content_object.name
            for alert in data.get('alerts', []):
                alert['labels'][
                    self.content_type.name] = self.content_object.name

        from promgen import tasks
        tasks.send_alert(self.sender, self.value, data)

    def filtered(self, alert):
        """
        Check filters for a specific sender

        If no filters are defined, then we let the message through
        If filters are defined, then we check to see if at least one filter matches
        If no filters match, then we assume it's filtered out
        """
        logger.debug("Checking labels %s", alert["commonLabels"])
        # If we have no specific whitelist, then we let everything through
        if self.filter_set.count() == 0:
            return False

        # If we have filters defined, then we need to check to see if our
        # filters match
        for f in self.filter_set.all():
            logger.debug("Checking filter %s %s", f.name, f.value)
            if alert["commonLabels"].get(f.name) == f.value:
                return False
        # If none of our filters match, then we blacklist this sender
        return True
예제 #14
0
class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ('sites', '0002_alter_domain_unique'),
        ('pulse', '0005_auto_20180422_1602'),
    ]

    operations = [
        migrations.CreateModel(
            name='MenuItem',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('icon', models.SlugField(blank=True, choices=[('fa fa-home', 'Home'), ('fa fa-pencil-square-o', 'Posts'), ('fa fa-book', 'Notes'), ('fa fa-tags', 'Topics'), ('fa fa-code-fork', 'Channels'), ('fa fa-file-image-o', 'Media'), ('fa fa-cogs', 'Gears')], max_length=510)),
                ('title', models.CharField(default='Untitled', max_length=510)),
                ('description', models.CharField(blank=True, help_text='Optional subtitle', max_length=510)),
                ('slug', models.SlugField(blank=True, max_length=510)),
                ('url', models.CharField(blank=True, max_length=510)),
                ('weight', models.IntegerField(default=0)),
                ('date_created', models.DateTimeField(auto_now_add=True)),
                ('date_updated', models.DateTimeField(auto_now=True)),
                ('page', models.ForeignKey(blank=True, default=replica.pulse.models.DefaultEntry, null=True, on_delete=django.db.models.deletion.SET_DEFAULT, to='pulse.Entry')),
            ],
            options={
                'verbose_name': 'Menu Item',
                'verbose_name_plural': 'Menu Items',
                'db_table': 'r_MenuItem',
                'ordering': ('weight',),
            },
        ),
        migrations.CreateModel(
            name='MenuPosition',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('title', models.CharField(default='Untitled', max_length=510)),
                ('slug', models.SlugField(max_length=510)),
                ('date_created', models.DateTimeField(auto_now_add=True)),
                ('date_updated', models.DateTimeField(auto_now=True)),
            ],
            options={
                'verbose_name': 'Menu',
                'verbose_name_plural': 'Menus',
                'db_table': 'r_MenuPosition',
                'ordering': ('-title',),
            },
        ),
        migrations.CreateModel(
            name='Plugin',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('name', models.CharField(blank=True, max_length=510)),
                ('slug', models.SlugField(max_length=510)),
                ('author', models.CharField(blank=True, max_length=510)),
                ('is_enabled', models.BooleanField(choices=[(True, 'Enabled'), (False, 'Disabled')], default=True, help_text='Check to enable plugin')),
                ('date_created', models.DateTimeField(auto_now_add=True)),
                ('date_updated', models.DateTimeField(auto_now=True)),
            ],
            options={
                'verbose_name': 'Plugin',
                'verbose_name_plural': 'Plugins',
                'db_table': 'r_Plugin',
                'ordering': ('slug', 'date_updated'),
            },
        ),
        migrations.CreateModel(
            name='SiteSettings',
            fields=[
                ('site_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='sites.Site')),
                ('is_enabled', models.BooleanField(choices=[(True, 'Enabled'), (False, 'Disabled')], default=True, help_text='Is site enabled?')),
                ('password', models.CharField(blank=True, max_length=128)),
                ('secret_token', models.CharField(blank=True, max_length=12)),
                ('view_settings', models.TextField(default='{}')),
                ('author', models.CharField(blank=True, max_length=510)),
                ('description', models.TextField(blank=True, help_text='Site Description', null=True)),
                ('summary', models.TextField(blank=True, help_text='Summary')),
                ('summary_html', models.TextField(blank=True, editable=False)),
                ('date_created', models.DateTimeField(auto_now_add=True)),
                ('date_updated', models.DateTimeField(auto_now=True)),
                ('featured', models.ForeignKey(blank=True, help_text='Featured Image', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='featured', to='pulse.Media')),
                ('logo', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='logo', to='pulse.Media')),
            ],
            options={
                'verbose_name': 'Site Settings',
                'verbose_name_plural': 'Site Settings',
                'db_table': 'r_SiteSettings',
            },
            bases=('sites.site',),
            managers=[
                ('objects', django.contrib.sites.models.SiteManager()),
            ],
        ),
        migrations.AddField(
            model_name='menuitem',
            name='position',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cms.MenuPosition'),
        ),
    ]
class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ('sites', '0002_alter_domain_unique'),
        ('django_simple_file_handler', '0006_auto_20190429_1949'),
    ]

    operations = [
        migrations.CreateModel(
            name='BulkEmail',
            fields=[
                ('id',
                 models.AutoField(auto_created=True,
                                  primary_key=True,
                                  serialize=False,
                                  verbose_name='ID')),
                ('created', models.DateTimeField(auto_now_add=True)),
                ('updated',
                 models.DateTimeField(auto_now=True,
                                      verbose_name='last updated')),
                ('headline', models.CharField(max_length=254)),
                ('body_text', ckeditor.fields.RichTextField()),
                ('publication_date',
                 models.DateField(default=django.utils.timezone.localdate)),
                ('deletion_date',
                 models.DateField(blank=True,
                                  default=django_simple_bulk_emailer.models.
                                  get_deletion_date,
                                  null=True)),
                ('published', models.BooleanField(default=False)),
                ('is_updated',
                 models.BooleanField(default=False,
                                     verbose_name='has been updated')),
                ('sendable', models.BooleanField(default=False)),
                ('sending', models.BooleanField(default=False)),
                ('sent', models.BooleanField(default=False)),
                ('send_history', models.TextField(blank=True)),
            ],
            options={
                'abstract': False,
            },
        ),
        migrations.CreateModel(
            name='EmailTracker',
            fields=[
                ('id',
                 models.AutoField(auto_created=True,
                                  primary_key=True,
                                  serialize=False,
                                  verbose_name='ID')),
                ('created', models.DateTimeField(auto_now_add=True)),
                ('updated',
                 models.DateTimeField(auto_now=True,
                                      verbose_name='last updated')),
                ('subject', models.CharField(max_length=254)),
                ('subscription_name', models.CharField(max_length=254)),
                ('send_complete',
                 models.DateTimeField(default=django.utils.timezone.now)),
                ('number_sent', models.PositiveIntegerField(default=0)),
                ('json_data', models.TextField(blank=True)),
            ],
            options={
                'abstract': False,
            },
        ),
        migrations.CreateModel(
            name='SiteProfile',
            fields=[
                ('site_ptr',
                 models.OneToOneField(
                     auto_created=True,
                     on_delete=django.db.models.deletion.CASCADE,
                     parent_link=True,
                     primary_key=True,
                     serialize=False,
                     to='sites.Site')),
                ('created', models.DateTimeField(auto_now_add=True)),
                ('updated',
                 models.DateTimeField(auto_now=True,
                                      verbose_name='last updated')),
                ('protocol',
                 models.CharField(default='https://', max_length=254)),
            ],
            options={
                'abstract': False,
            },
            bases=('sites.site', models.Model),
            managers=[
                ('objects', django.contrib.sites.models.SiteManager()),
            ],
        ),
        migrations.CreateModel(
            name='Subscription',
            fields=[
                ('id',
                 models.AutoField(auto_created=True,
                                  primary_key=True,
                                  serialize=False,
                                  verbose_name='ID')),
                ('created', models.DateTimeField(auto_now_add=True)),
                ('updated',
                 models.DateTimeField(auto_now=True,
                                      verbose_name='last updated')),
                ('list_name', models.CharField(max_length=254)),
                ('descriptive_text',
                 ckeditor.fields.RichTextField(
                     blank=True,
                     verbose_name='descriptive text (if using page views)')),
                ('list_slug', models.CharField(blank=True, max_length=254)),
                ('publicly_visible', models.BooleanField(default=False)),
                ('use_pages',
                 models.BooleanField(default=True,
                                     verbose_name='use page view')),
                ('email_directory',
                 models.CharField(
                     default='django_simple_bulk_emailer/subscription/emails',
                     max_length=254,
                     verbose_name='email template directory')),
                ('page_directory',
                 models.CharField(
                     default='django_simple_bulk_emailer/subscription/pages',
                     max_length=254,
                     verbose_name='page template directory')),
                ('associated_model',
                 models.CharField(
                     default='django_simple_bulk_emailer.models.BulkEmail',
                     max_length=254)),
                ('mc_sync',
                 models.BooleanField(default=False,
                                     verbose_name='MailChimp sync')),
                ('mc_user',
                 models.CharField(default='username',
                                  max_length=254,
                                  verbose_name='MailChimp username')),
                ('mc_api',
                 models.CharField(default='API_key',
                                  max_length=254,
                                  verbose_name='MailChimp API key')),
                ('mc_list',
                 models.CharField(default='list_ID',
                                  max_length=254,
                                  verbose_name='MailChimp audience ID')),
                ('sort_order',
                 models.PositiveIntegerField(default=0, verbose_name='order')),
            ],
            options={
                'ordering': ['sort_order'],
            },
        ),
        migrations.CreateModel(
            name='Subscriber',
            fields=[
                ('id',
                 models.AutoField(auto_created=True,
                                  primary_key=True,
                                  serialize=False,
                                  verbose_name='ID')),
                ('created', models.DateTimeField(auto_now_add=True)),
                ('updated',
                 models.DateTimeField(auto_now=True,
                                      verbose_name='last updated')),
                ('subscriber_key', models.CharField(max_length=254)),
                ('first_name',
                 models.CharField(default='Anonymous', max_length=254)),
                ('last_name',
                 models.CharField(default='Subscriber', max_length=254)),
                ('subscriber_email',
                 models.EmailField(max_length=254,
                                   unique=True,
                                   verbose_name='email address')),
                ('mc_email',
                 models.EmailField(blank=True,
                                   max_length=254,
                                   verbose_name='MailChimp email address')),
                ('mc_synced', models.BooleanField(default=False)),
                ('subscriptions',
                 models.ManyToManyField(
                     blank=True,
                     to='django_simple_bulk_emailer.Subscription')),
            ],
            options={
                'abstract': False,
            },
        ),
        migrations.CreateModel(
            name='MonthlyStat',
            fields=[
                ('id',
                 models.AutoField(auto_created=True,
                                  primary_key=True,
                                  serialize=False,
                                  verbose_name='ID')),
                ('created', models.DateTimeField(auto_now_add=True)),
                ('updated',
                 models.DateTimeField(auto_now=True,
                                      verbose_name='last updated')),
                ('year_int', models.PositiveIntegerField()),
                ('month_int', models.PositiveIntegerField()),
                ('stat_data', models.TextField(blank=True)),
                ('current_trackers',
                 models.ManyToManyField(
                     related_name='current',
                     to='django_simple_bulk_emailer.EmailTracker')),
                ('older_trackers',
                 models.ManyToManyField(
                     related_name='older',
                     to='django_simple_bulk_emailer.EmailTracker')),
            ],
            options={
                'abstract': False,
            },
        ),
        migrations.CreateModel(
            name='EmailImage',
            fields=[
                ('processedimage_ptr',
                 models.OneToOneField(
                     auto_created=True,
                     on_delete=django.db.models.deletion.CASCADE,
                     parent_link=True,
                     primary_key=True,
                     serialize=False,
                     to='django_simple_file_handler.ProcessedImage')),
                ('description',
                 models.CharField(default='Image',
                                  max_length=254,
                                  verbose_name='screen reader description')),
                ('caption',
                 models.TextField(blank=True,
                                  verbose_name='image caption (optional)')),
                ('image_width', models.PositiveIntegerField()),
                ('bulk_email',
                 models.ForeignKey(on_delete=django.db.models.deletion.CASCADE,
                                   related_name='emailimage',
                                   to='django_simple_bulk_emailer.BulkEmail')),
            ],
            options={
                'verbose_name': 'image (optional)',
                'verbose_name_plural': 'image (optional)',
            },
            bases=('django_simple_file_handler.processedimage', ),
        ),
        migrations.CreateModel(
            name='EmailDocument',
            fields=[
                ('temporarydocument_ptr',
                 models.OneToOneField(
                     auto_created=True,
                     on_delete=django.db.models.deletion.CASCADE,
                     parent_link=True,
                     primary_key=True,
                     serialize=False,
                     to='django_simple_file_handler.TemporaryDocument')),
                ('sort_order',
                 models.PositiveIntegerField(default=0, verbose_name='order')),
                ('bulk_email',
                 models.ForeignKey(on_delete=django.db.models.deletion.CASCADE,
                                   related_name='documents',
                                   to='django_simple_bulk_emailer.BulkEmail')),
            ],
            options={
                'verbose_name': 'document',
                'ordering': ['sort_order'],
            },
            bases=('django_simple_file_handler.temporarydocument', ),
        ),
        migrations.AddField(
            model_name='bulkemail',
            name='subscription_list',
            field=models.ForeignKey(
                null=True,
                on_delete=django.db.models.deletion.SET_NULL,
                to='django_simple_bulk_emailer.Subscription'),
        ),
    ]