class Migration(migrations.Migration): dependencies = [ ('money', '0002_income_incomecategory_incomegroup'), ] operations = [ migrations.CreateModel( name='ExpenseGroup', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('create_time', common.models.IntDateTimeField()), ('update_time', common.models.IntDateTimeField()), ('name', models.CharField(max_length=50, unique=True)), ], options={ 'db_table': 'expense_group_tab', }, ), migrations.AlterField( model_name='income', name='receive_time', field=common.models.IntDateTimeField(default=portfolio.time_util.now), ), migrations.CreateModel( name='ExpenseCategory', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('create_time', common.models.IntDateTimeField()), ('update_time', common.models.IntDateTimeField()), ('name', models.CharField(max_length=50, unique=True)), ('group', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='money.expensegroup')), ], options={ 'verbose_name_plural': 'expense categories', 'db_table': 'expense_category_tab', }, ), migrations.CreateModel( name='Expense', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('create_time', common.models.IntDateTimeField()), ('update_time', common.models.IntDateTimeField()), ('name', models.CharField(blank=True, max_length=500)), ('value', models.PositiveIntegerField()), ('receive_time', common.models.IntDateTimeField(default=portfolio.time_util.now)), ('category', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='money.expensecategory')), ('wallet', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='money.wallet')), ], options={ 'db_table': 'expense_tab', }, ), ]
class Migration(migrations.Migration): initial = True dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='GCalShow', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('gcal_id', common.models.TruncatingCharField(max_length=256, unique=True)), ('title', common.models.TruncatingCharField(max_length=1024, verbose_name='title')), ('start', models.DateTimeField(verbose_name='start time')), ('end', models.DateTimeField(verbose_name='end time')), ('users', models.ManyToManyField(related_name='gcal_shows', to=settings.AUTH_USER_MODEL, verbose_name='users')), ], options={ 'verbose_name': 'Google Calendar show', 'verbose_name_plural': 'Google Calendar shows', 'ordering': ('start', 'id'), }, ), ]
class Migration(migrations.Migration): dependencies = [ ('money', '0004_auto_20210527_2007'), ] operations = [ migrations.CreateModel( name='Budget', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('create_time', common.models.IntDateTimeField()), ('update_time', common.models.IntDateTimeField()), ('limit', models.PositiveIntegerField()), ('expense_group', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='money.expensegroup')), ], options={ 'db_table': 'budget_tab', }, ), ]
class Migration(migrations.Migration): initial = True dependencies = [] operations = [ migrations.CreateModel( name='Wallet', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=50, unique=True)), ('create_time', common.models.IntDateTimeField()), ('update_time', common.models.IntDateTimeField()), ], options={ 'db_table': 'wallet_tab', }, ), ]
class Migration(migrations.Migration): initial = True dependencies = [ ('autodj', '0001_initial'), ('broadcast', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='UpstreamServer', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.SlugField( help_text= 'Unique codename to identify this upstream server.', max_length=20, unique=True, verbose_name='name')), ('hostname', models.CharField( help_text='Hostname for the server, eg. example.com', max_length=255, verbose_name='hostname')), ('protocol', models.CharField( choices=[('http', 'http'), ('https', 'https (secure)')], default='http', help_text= "The protocol for the server, if unsure it's likely http", max_length=5, verbose_name='protocol')), ('port', models.PositiveSmallIntegerField( help_text='Port for this server, eg. 8000', verbose_name='port')), ('telnet_port', models.PositiveIntegerField()), ('username', models.CharField(default='source', max_length=255, verbose_name='username')), ('password', models.CharField(max_length=255, verbose_name='password')), ('mount', models.CharField( help_text= 'Mount point for the upstream server, eg. /stream', max_length=255, verbose_name='mount point')), ('encoding', models.CharField(choices=[ ('mp3', 'MP3'), ('fdkaac', 'AAC'), ('vorbis.cbr', 'OGG Vorbis'), ('ffmpeg', 'ffmpeg (custom additional arguments needed)') ], default='mp3', max_length=20, verbose_name='encoding format')), ('bitrate', models.PositiveSmallIntegerField( blank=True, help_text= 'Encoding bitrate (kbits), blank for a sane default or ffmpeg.', null=True, verbose_name='bitrate')), ('mime', models.CharField( blank=True, help_text= 'MIME format, ie audio/mpeg, leave blank for Liquidsoap to guess. (Needed for ffmpeg.)', max_length=50, verbose_name='MIME format')), ('encoding_args', models.JSONField( blank=True, default=None, help_text= 'Enter any additional arguments for the encoder here. Advanced use cases only, see the <a href="https://www.liquidsoap.info/doc-1.4.3/encoding_formats.html" target="_blank">Liquidsoap docs here</a> for more info. Leave empty or <code>null</code> for none.', null=True, verbose_name='additional arguments for encoding')), ], options={ 'ordering': ('name', ), 'unique_together': {('hostname', 'port', 'mount')}, }, ), migrations.CreateModel( name='PlayoutLogEntry', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created', models.DateTimeField(db_index=True, default=django.utils.timezone.now, verbose_name='Date')), ('event_type', models.CharField(choices=[('track', 'Track'), ('dj', 'Live DJ'), ('general', 'General'), ('source', 'Source Transition')], default='general', max_length=10, verbose_name='Type')), ('description', common.models.TruncatingCharField(max_length=500, verbose_name='Entry')), ('active_source', common.models.TruncatingCharField( default='N/A', max_length=50, verbose_name='Active Source')), ('audio_asset', models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='autodj.audioasset')), ('broadcast_asset', models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='broadcast.broadcastasset')), ('rotator_asset', models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='autodj.rotatorasset')), ('user', models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), ], options={ 'verbose_name': 'playout log entry', 'verbose_name_plural': 'playout logs', 'ordering': ('-created', ), }, ), ]
class Migration(migrations.Migration): initial = True dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='BroadcastAsset', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created', models.DateTimeField(auto_now_add=True, verbose_name='created')), ('modified', models.DateTimeField(auto_now=True, verbose_name='last modified')), ('title', common.models.TruncatingCharField( blank=True, db_index=True, help_text= "If left empty, a title will be generated from the file's metadata.", max_length=255, verbose_name='title')), ('file_basename', models.CharField(max_length=512)), ('file', models.FileField( blank=True, help_text= 'You can provide either an uploaded audio file or a URL to an external asset.', max_length=512, upload_to=common.models.audio_asset_file_upload_to, verbose_name='audio file')), ('duration', models.DurationField(default=datetime.timedelta(0), verbose_name='Audio duration')), ('fingerprint', models.UUIDField(db_index=True, null=True)), ('status', models.CharField( choices=[('-', 'processing queued'), ('p', 'processing'), ('f', 'processing failed'), ('r', 'ready for play')], db_index=True, default='-', help_text= 'You will be able to edit this asset when status is "ready for play."', max_length=1, verbose_name='status')), ('task_id', models.UUIDField(null=True)), ('uploader', models.ForeignKey( null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='uploader')), ], options={ 'verbose_name': 'scheduled broadcast asset', 'verbose_name_plural': 'scheduled broadcast assets', 'ordering': ('title', 'id'), }, bases=(dirtyfields.dirtyfields.DirtyFieldsMixin, models.Model), ), migrations.CreateModel( name='Broadcast', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created', models.DateTimeField(auto_now_add=True, verbose_name='created')), ('modified', models.DateTimeField(auto_now=True, verbose_name='last modified')), ('scheduled_time', models.DateTimeField()), ('status', models.CharField(choices=[('-', 'to be queued'), ('q', 'queued for play'), ('p', 'played'), ('f', 'failed to play')], default='-', max_length=1)), ('task_id', models.UUIDField(null=True)), ('asset', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='broadcasts', to='broadcast.broadcastasset', verbose_name='broadcast asset')), ('creator', models.ForeignKey( null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='creator')), ], options={ 'verbose_name': 'scheduled broadcast', 'verbose_name_plural': 'scheduled broadcasts', 'ordering': ('-scheduled_time', ), }, ), ]
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')), ('id', models.BigAutoField(primary_key=True, serialize=False)), ('created', models.DateTimeField(default=django.utils.timezone.now)), ('updated', models.DateTimeField(default=django.utils.timezone.now)), ('enabled', models.BooleanField(default=True)), ('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={ 'abstract': False, }, managers=[ ('objects', django.contrib.auth.models.UserManager()), ], ), migrations.CreateModel( name='Application', fields=[ ('id', models.BigAutoField(primary_key=True, serialize=False)), ('created', models.DateTimeField(default=django.utils.timezone.now)), ('updated', models.DateTimeField(default=django.utils.timezone.now)), ('enabled', models.BooleanField(default=True)), ], options={ 'abstract': False, }, ), migrations.CreateModel( name='Token', fields=[ ('id', models.BigAutoField(primary_key=True, serialize=False)), ('created', models.DateTimeField(default=django.utils.timezone.now)), ('updated', models.DateTimeField(default=django.utils.timezone.now)), ('enabled', models.BooleanField(default=True)), ('expires', models.DateTimeField(default=common.models.get_expiration)), ('value', models.CharField(max_length=255)), ('application', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='common.Application')), ('owner', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ], options={ 'abstract': False, }, ), ]
class Migration(migrations.Migration): initial = True dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='AudioAsset', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created', models.DateTimeField(auto_now_add=True, verbose_name='created')), ('modified', models.DateTimeField(auto_now=True, verbose_name='last modified')), ('title', common.models.TruncatingCharField( blank=True, db_index=True, help_text= "If left empty, a title will be generated from the file's metadata.", max_length=255, verbose_name='title')), ('file_basename', models.CharField(max_length=512)), ('file', models.FileField( blank=True, help_text= 'You can provide either an uploaded audio file or a URL to an external asset.', max_length=512, upload_to=common.models.audio_asset_file_upload_to, verbose_name='audio file')), ('duration', models.DurationField(default=datetime.timedelta(0), verbose_name='Audio duration')), ('fingerprint', models.UUIDField(db_index=True, null=True)), ('status', models.CharField( choices=[('-', 'processing queued'), ('p', 'processing'), ('f', 'processing failed'), ('r', 'ready for play')], db_index=True, default='-', help_text= 'You will be able to edit this asset when status is "ready for play."', max_length=1, verbose_name='status')), ('task_id', models.UUIDField(null=True)), ('artist', common.models.TruncatingCharField( blank=True, help_text= "If left empty, an artist will be generated from the file's metadata.", max_length=255, verbose_name='artist')), ('album', common.models.TruncatingCharField( blank=True, help_text= "If left empty, an album will be generated from the file's metadata.", max_length=255, verbose_name='album')), ('title_normalized', common.models.TruncatingCharField(db_index=True, max_length=255)), ('artist_normalized', common.models.TruncatingCharField(db_index=True, max_length=255)), ('album_normalized', common.models.TruncatingCharField(db_index=True, max_length=255)), ('uploader', models.ForeignKey( null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='uploader')), ], options={ 'verbose_name': 'audio asset', 'verbose_name_plural': 'audio assets', 'ordering': ('title', 'artist', 'album', 'id'), }, bases=(dirtyfields.dirtyfields.DirtyFieldsMixin, models.Model), ), migrations.CreateModel( name='Rotator', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=100, unique=True, verbose_name='name')), ], options={ 'ordering': ('name', ), }, ), migrations.CreateModel( name='Stopset', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=100, unique=True, verbose_name='name')), ('weight', models.FloatField( default=1.0, help_text= "The weight (ie selection bias) for how likely random selection from this playlist/stopset occurs, eg '1.0' is just as likely as all others, '2.0' is 2x as likely, '3.0' is 3x as likely, '0.5' half as likely, and so on. If unsure, leave as '1.0'.", validators=[ django.core.validators.MinValueValidator(0.0) ], verbose_name='random weight')), ('is_active', models.BooleanField( default=True, help_text= 'Whether tracks from this playlist/stopset will be selected. You may want to enable special playlists/stopsets at certain times, for example during the holidays.', verbose_name='currently active')), ], options={ 'ordering': ('name', ), 'abstract': False, }, ), migrations.CreateModel( name='StopsetRotator', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('rotator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='stopset_rotators', to='autodj.rotator')), ('stopset', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='stopset_rotators', to='autodj.stopset')), ], options={ 'verbose_name': 'rotator in stop set relationship', 'verbose_name_plural': 'rotator in stop set relationships', 'ordering': ('id', ), }, ), migrations.CreateModel( name='RotatorAsset', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created', models.DateTimeField(auto_now_add=True, verbose_name='created')), ('modified', models.DateTimeField(auto_now=True, verbose_name='last modified')), ('title', common.models.TruncatingCharField( blank=True, db_index=True, help_text= "If left empty, a title will be generated from the file's metadata.", max_length=255, verbose_name='title')), ('file_basename', models.CharField(max_length=512)), ('file', models.FileField( blank=True, help_text= 'You can provide either an uploaded audio file or a URL to an external asset.', max_length=512, upload_to=common.models.audio_asset_file_upload_to, verbose_name='audio file')), ('duration', models.DurationField(default=datetime.timedelta(0), verbose_name='Audio duration')), ('fingerprint', models.UUIDField(db_index=True, null=True)), ('status', models.CharField( choices=[('-', 'processing queued'), ('p', 'processing'), ('f', 'processing failed'), ('r', 'ready for play')], db_index=True, default='-', help_text= 'You will be able to edit this asset when status is "ready for play."', max_length=1, verbose_name='status')), ('task_id', models.UUIDField(null=True)), ('uploader', models.ForeignKey( null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='uploader')), ], options={ 'verbose_name': 'rotator asset', 'verbose_name_plural': 'rotator assets', 'ordering': ('title', 'id'), }, bases=(dirtyfields.dirtyfields.DirtyFieldsMixin, models.Model), ), migrations.AddField( model_name='rotator', name='rotator_assets', field=models.ManyToManyField(blank=True, db_index=True, related_name='rotators', to='autodj.RotatorAsset', verbose_name='rotator assets'), ), migrations.CreateModel( name='Playlist', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=100, unique=True, verbose_name='name')), ('weight', models.FloatField( default=1.0, help_text= "The weight (ie selection bias) for how likely random selection from this playlist/stopset occurs, eg '1.0' is just as likely as all others, '2.0' is 2x as likely, '3.0' is 3x as likely, '0.5' half as likely, and so on. If unsure, leave as '1.0'.", validators=[ django.core.validators.MinValueValidator(0.0) ], verbose_name='random weight')), ('is_active', models.BooleanField( default=True, help_text= 'Whether tracks from this playlist/stopset will be selected. You may want to enable special playlists/stopsets at certain times, for example during the holidays.', verbose_name='currently active')), ('audio_assets', models.ManyToManyField(blank=True, db_index=True, related_name='playlists', to='autodj.AudioAsset', verbose_name='audio assets')), ], options={ 'ordering': ('name', ), 'abstract': False, }, ), ]