131cb27d16
Django project: employees, locations, visit_manager, it_manager, mattermost_connector and stub connectors (ad, mail, portal).
132 lines
9.6 KiB
Python
132 lines
9.6 KiB
Python
# Generated by Django 6.0.3 on 2026-04-24 09:37
|
||
|
||
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 = [
|
||
('locations', '0002_remove_pharmacy_locations_p_last_sy_0dc5a0_idx_and_more'),
|
||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||
]
|
||
|
||
operations = [
|
||
migrations.CreateModel(
|
||
name='Equipment',
|
||
fields=[
|
||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
('equipment_type', models.CharField(choices=[('laptop', 'Ноутбук'), ('desktop', 'ПК'), ('monitor', 'Монитор'), ('printer', 'Принтер'), ('phone', 'Телефон'), ('tablet', 'Планшет'), ('router', 'Роутер/Свитч'), ('ups', 'ИБП'), ('scanner', 'Сканер'), ('other', 'Другое')], max_length=20, verbose_name='Тип')),
|
||
('brand', models.CharField(max_length=100, verbose_name='Бренд')),
|
||
('model', models.CharField(max_length=100, verbose_name='Модель')),
|
||
('serial_number', models.CharField(max_length=100, unique=True, verbose_name='Серийный номер')),
|
||
('inventory_number', models.CharField(blank=True, max_length=50, null=True, unique=True, verbose_name='Инвентарный номер')),
|
||
('status', models.CharField(choices=[('stock', 'На складе'), ('assigned', 'Выдано'), ('repair', 'В ремонте'), ('written_off', 'Списано')], db_index=True, default='stock', max_length=20, verbose_name='Статус')),
|
||
('purchase_date', models.DateField(blank=True, null=True, verbose_name='Дата покупки')),
|
||
('warranty_until', models.DateField(blank=True, null=True, verbose_name='Гарантия до')),
|
||
('notes', models.TextField(blank=True, verbose_name='Примечания')),
|
||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||
('updated_at', models.DateTimeField(auto_now=True)),
|
||
('assigned_to', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='assigned_equipment', to=settings.AUTH_USER_MODEL, verbose_name='Выдано сотруднику')),
|
||
('location', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='location_equipment', to='locations.location', verbose_name='Локация')),
|
||
],
|
||
options={
|
||
'verbose_name': 'Оборудование',
|
||
'verbose_name_plural': 'Оборудование',
|
||
'ordering': ['equipment_type', 'brand', 'model'],
|
||
},
|
||
),
|
||
migrations.CreateModel(
|
||
name='EquipmentAssignment',
|
||
fields=[
|
||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
('assigned_at', models.DateTimeField(default=django.utils.timezone.now, verbose_name='Дата выдачи')),
|
||
('returned_at', models.DateTimeField(blank=True, null=True, verbose_name='Дата возврата')),
|
||
('notes', models.TextField(blank=True, verbose_name='Примечания')),
|
||
('assigned_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='issued_equipment', to=settings.AUTH_USER_MODEL, verbose_name='Выдал')),
|
||
('assigned_to', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='equipment_assignments', to=settings.AUTH_USER_MODEL, verbose_name='Сотрудник')),
|
||
('equipment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='assignments', to='it_manager.equipment', verbose_name='Оборудование')),
|
||
('location', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='equipment_assignments', to='locations.location', verbose_name='Локация')),
|
||
],
|
||
options={
|
||
'verbose_name': 'Перемещение оборудования',
|
||
'verbose_name_plural': 'История перемещений',
|
||
'ordering': ['-assigned_at'],
|
||
},
|
||
),
|
||
migrations.CreateModel(
|
||
name='Ticket',
|
||
fields=[
|
||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
('number', models.CharField(editable=False, max_length=20, unique=True, verbose_name='Номер')),
|
||
('title', models.CharField(max_length=200, verbose_name='Заголовок')),
|
||
('ticket_type', models.CharField(choices=[('repair', 'Ремонт'), ('replacement', 'Замена оборудования'), ('new_equipment', 'Новое оборудование'), ('access', 'Доступ / Аккаунт'), ('consultation', 'Консультация'), ('other', 'Другое')], db_index=True, max_length=20, verbose_name='Тип')),
|
||
('priority', models.CharField(choices=[('low', 'Низкий'), ('medium', 'Средний'), ('high', 'Высокий'), ('critical', 'Критический')], db_index=True, default='medium', max_length=10, verbose_name='Приоритет')),
|
||
('status', models.CharField(choices=[('new', 'Новая'), ('in_progress', 'В работе'), ('waiting', 'Ожидание'), ('resolved', 'Решена'), ('closed', 'Закрыта')], db_index=True, default='new', max_length=20, verbose_name='Статус')),
|
||
('description', models.TextField(verbose_name='Описание проблемы')),
|
||
('resolution', models.TextField(blank=True, verbose_name='Решение')),
|
||
('created_at', models.DateTimeField(auto_now_add=True, db_index=True)),
|
||
('updated_at', models.DateTimeField(auto_now=True)),
|
||
('resolved_at', models.DateTimeField(blank=True, null=True, verbose_name='Решена в')),
|
||
('closed_at', models.DateTimeField(blank=True, null=True, verbose_name='Закрыта в')),
|
||
('assignee', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='assigned_tickets', to=settings.AUTH_USER_MODEL, verbose_name='Исполнитель')),
|
||
('equipment', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='tickets', to='it_manager.equipment', verbose_name='Оборудование')),
|
||
('location', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='it_tickets', to='locations.location', verbose_name='Локация')),
|
||
('requester', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='created_tickets', to=settings.AUTH_USER_MODEL, verbose_name='Заявитель')),
|
||
],
|
||
options={
|
||
'verbose_name': 'Заявка',
|
||
'verbose_name_plural': 'Заявки',
|
||
'ordering': ['-created_at'],
|
||
},
|
||
),
|
||
migrations.CreateModel(
|
||
name='TicketComment',
|
||
fields=[
|
||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
('text', models.TextField(verbose_name='Комментарий')),
|
||
('is_internal', models.BooleanField(default=False, help_text='Виден только сотрудникам IT', verbose_name='Внутренний')),
|
||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||
('author', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='ticket_comments', to=settings.AUTH_USER_MODEL, verbose_name='Автор')),
|
||
('ticket', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='comments', to='it_manager.ticket', verbose_name='Заявка')),
|
||
],
|
||
options={
|
||
'verbose_name': 'Комментарий',
|
||
'verbose_name_plural': 'Комментарии',
|
||
'ordering': ['created_at'],
|
||
},
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='equipment',
|
||
index=models.Index(fields=['status'], name='it_manager__status_f1197a_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='equipment',
|
||
index=models.Index(fields=['equipment_type'], name='it_manager__equipme_0beeb3_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='equipment',
|
||
index=models.Index(fields=['assigned_to'], name='it_manager__assigne_3c2a08_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='equipmentassignment',
|
||
index=models.Index(fields=['equipment', 'assigned_at'], name='it_manager__equipme_87de0f_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='ticket',
|
||
index=models.Index(fields=['status', 'priority'], name='it_manager__status_6e5b9f_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='ticket',
|
||
index=models.Index(fields=['requester', 'status'], name='it_manager__request_a11dcf_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='ticket',
|
||
index=models.Index(fields=['assignee', 'status'], name='it_manager__assigne_555f6b_idx'),
|
||
),
|
||
]
|