# Generated by Django 5.2.17 on 2026-09-19 12:26 import django.db.models.deletion import django.utils.timezone from django.conf import settings from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='Employee', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('code', models.CharField(max_length=12, unique=True)), ('name', models.CharField(max_length=160)), ('active', models.BooleanField(db_index=True, default=True)), ], options={ 'ordering': ['code'], }, ), migrations.CreateModel( name='FieldDefinition', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('name', models.CharField(max_length=120)), ('key', models.SlugField(max_length=80, unique=True)), ('field_type', models.CharField(choices=[('text', 'Text'), ('long_text', 'Langer Text'), ('integer', 'Ganzzahl'), ('decimal', 'Dezimalzahl'), ('boolean', 'Ja/Nein'), ('date', 'Datum'), ('select', 'Auswahl'), ('multi_select', 'Mehrfachauswahl')], max_length=20)), ('unit', models.CharField(blank=True, max_length=30)), ('required', models.BooleanField(default=False)), ('active', models.BooleanField(db_index=True, default=True)), ('show_in_list', models.BooleanField(default=False)), ('filterable', models.BooleanField(default=False)), ('searchable', models.BooleanField(default=False)), ('sort_order', models.PositiveIntegerField(default=0)), ('group', models.CharField(default='Zusatzfelder', max_length=80)), ('allow_custom_values', models.BooleanField(default=False)), ], options={ 'ordering': ['sort_order', 'name'], }, ), migrations.CreateModel( name='NumberSequence', fields=[ ('name', models.CharField(max_length=30, primary_key=True, serialize=False)), ('last_value', models.PositiveIntegerField(default=0)), ], ), migrations.CreateModel( name='ChoiceValue', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('kind', models.CharField(choices=[('status', 'Status'), ('recipient', 'Empfänger'), ('location', 'Ort'), ('device_type', 'Typ'), ('ram', 'RAM-Vorschlag'), ('ssd', 'SSD-Vorschlag'), ('hdd', 'HDD-Vorschlag'), ('display', 'Displaygröße')], db_index=True, max_length=30)), ('label', models.CharField(max_length=120)), ('numeric_value', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True)), ('active', models.BooleanField(db_index=True, default=True)), ('sort_order', models.PositiveIntegerField(default=0)), ], options={ 'ordering': ['kind', 'sort_order', 'label'], 'indexes': [models.Index(fields=['kind', 'active', 'sort_order'], name='inventory_c_kind_320c2f_idx')], 'constraints': [models.UniqueConstraint(fields=('kind', 'label'), name='unique_choice_label_per_kind')], }, ), migrations.CreateModel( name='Device', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('number', models.PositiveIntegerField(db_index=True, editable=False, unique=True)), ('shelf', models.CharField(blank=True, db_index=True, max_length=80)), ('date', models.DateField(db_index=True, default=django.utils.timezone.localdate)), ('ticket', models.CharField(blank=True, db_index=True, max_length=120)), ('price', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True)), ('battery', models.CharField(choices=[('YES', 'JA'), ('NO', 'NEIN'), ('UNKNOWN', 'UNBEKANNT')], default='UNKNOWN', max_length=10)), ('wifi', models.CharField(choices=[('YES', 'JA'), ('NO', 'NEIN'), ('UNKNOWN', 'UNBEKANNT')], default='UNKNOWN', max_length=10)), ('lan', models.CharField(choices=[('YES', 'JA'), ('NO', 'NEIN'), ('UNKNOWN', 'UNBEKANNT')], default='UNKNOWN', max_length=10)), ('display_inches', models.DecimalField(blank=True, decimal_places=1, max_digits=4, null=True)), ('ram_gb', models.PositiveIntegerField(blank=True, db_index=True, null=True)), ('ssd_gb', models.PositiveIntegerField(blank=True, db_index=True, null=True)), ('hdd_gb', models.PositiveIntegerField(blank=True, db_index=True, null=True)), ('cpu', models.CharField(blank=True, db_index=True, max_length=200)), ('model', models.CharField(blank=True, db_index=True, max_length=200)), ('donor', models.CharField(blank=True, max_length=200)), ('comment', models.TextField(blank=True)), ('custom_values', models.JSONField(blank=True, default=dict)), ('archived_at', models.DateTimeField(blank=True, db_index=True, null=True)), ('archived_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='archived_devices', to=settings.AUTH_USER_MODEL)), ('device_type', models.ForeignKey(blank=True, limit_choices_to={'kind': 'device_type'}, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='type_devices', to='inventory.choicevalue')), ('location', models.ForeignKey(blank=True, limit_choices_to={'kind': 'location'}, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='location_devices', to='inventory.choicevalue')), ('recipient', models.ForeignKey(blank=True, limit_choices_to={'kind': 'recipient'}, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='recipient_devices', to='inventory.choicevalue')), ('status', models.ForeignKey(limit_choices_to={'kind': 'status'}, on_delete=django.db.models.deletion.PROTECT, related_name='status_devices', to='inventory.choicevalue')), ('employee', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='devices', to='inventory.employee')), ], options={ 'ordering': ['-number'], }, ), migrations.CreateModel( name='FieldOption', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('label', models.CharField(max_length=120)), ('active', models.BooleanField(default=True)), ('sort_order', models.PositiveIntegerField(default=0)), ('field', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='options', to='inventory.fielddefinition')), ], options={ 'ordering': ['sort_order', 'label'], }, ), migrations.CreateModel( name='ImportJob', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('file', models.FileField(upload_to='imports/%Y/%m/')), ('original_name', models.CharField(max_length=255)), ('status', models.CharField(choices=[('UPLOADED', 'Hochgeladen'), ('COMPLETED', 'Abgeschlossen'), ('FAILED', 'Fehlgeschlagen')], default='UPLOADED', max_length=12)), ('headers', models.JSONField(default=list)), ('preview_rows', models.JSONField(default=list)), ('result', models.JSONField(default=dict)), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='import_jobs', to=settings.AUTH_USER_MODEL)), ], options={ 'abstract': False, }, ), migrations.CreateModel( name='SavedView', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('name', models.CharField(max_length=120)), ('filters', models.JSONField(default=dict)), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='saved_views', to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( name='UserPreference', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('visible_columns', models.JSONField(blank=True, default=list)), ('column_order', models.JSONField(blank=True, default=list)), ('column_widths', models.JSONField(blank=True, default=dict)), ('page_size', models.PositiveSmallIntegerField(default=50)), ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='inventory_preferences', to=settings.AUTH_USER_MODEL)), ], options={ 'abstract': False, }, ), migrations.CreateModel( name='UserProfile', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('role', models.CharField(choices=[('ADMIN', 'Administrator'), ('EDITOR', 'Bearbeiter'), ('VIEWER', 'Betrachter')], default='VIEWER', max_length=10)), ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='profile', to=settings.AUTH_USER_MODEL)), ], options={ 'abstract': False, }, ), migrations.CreateModel( name='AuditLog', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('action', models.CharField(choices=[('CREATE', 'Erstellt'), ('UPDATE', 'Geändert'), ('ARCHIVE', 'Archiviert'), ('RESTORE', 'Wiederhergestellt'), ('IMPORT', 'Importiert')], max_length=10)), ('field', models.CharField(blank=True, max_length=100)), ('old_value', models.TextField(blank=True)), ('new_value', models.TextField(blank=True)), ('created_at', models.DateTimeField(auto_now_add=True, db_index=True)), ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='audit_entries', to=settings.AUTH_USER_MODEL)), ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='audit_entries', to='inventory.device')), ], options={ 'ordering': ['-created_at', '-id'], 'indexes': [models.Index(fields=['device', '-created_at'], name='inventory_a_device__78ae29_idx')], }, ), migrations.AddIndex( model_name='device', index=models.Index(fields=['archived_at', '-number'], name='inventory_d_archive_2483fe_idx'), ), migrations.AddIndex( model_name='device', index=models.Index(fields=['status', 'archived_at'], name='inventory_d_status__f41a2e_idx'), ), migrations.AddIndex( model_name='device', index=models.Index(fields=['device_type', 'archived_at'], name='inventory_d_device__ec71d5_idx'), ), migrations.AddIndex( model_name='device', index=models.Index(fields=['employee', 'archived_at'], name='inventory_d_employe_e23a79_idx'), ), migrations.AddIndex( model_name='device', index=models.Index(fields=['recipient', 'archived_at'], name='inventory_d_recipie_5290ea_idx'), ), migrations.AddConstraint( model_name='fieldoption', constraint=models.UniqueConstraint(fields=('field', 'label'), name='unique_custom_field_option'), ), migrations.AddConstraint( model_name='savedview', constraint=models.UniqueConstraint(fields=('user', 'name'), name='unique_saved_view_name'), ), ]