125 lines
6.8 KiB
Python
125 lines
6.8 KiB
Python
# Generated by Django 5.2.17 on 2026-09-30 15:14
|
||
|
||
import django.db.models.deletion
|
||
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='DayChangeRequest',
|
||
fields=[
|
||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
('kind', models.CharField(choices=[('leave', 'Congé / absence'), ('hours', 'Modification d’horaires'), ('swap', 'Inversion de journées')], max_length=8)),
|
||
('start_date', models.DateField()),
|
||
('end_date', models.DateField()),
|
||
('target_date', models.DateField(blank=True, null=True)),
|
||
('reason', models.TextField(blank=True, max_length=2000)),
|
||
('proposed_slots', models.JSONField(default=list)),
|
||
('before', models.JSONField(default=list)),
|
||
('after', models.JSONField(default=list)),
|
||
('status', models.CharField(choices=[('pending', 'En attente'), ('approved', 'Acceptée'), ('rejected', 'Refusée'), ('cancelled', 'Annulée')], default='pending', max_length=10)),
|
||
('reviewed_at', models.DateTimeField(blank=True, null=True)),
|
||
('response', models.TextField(blank=True, max_length=2000)),
|
||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||
('updated_at', models.DateTimeField(auto_now=True)),
|
||
('reviewed_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
|
||
('target_user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='received_swaps', to=settings.AUTH_USER_MODEL)),
|
||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='day_requests', to=settings.AUTH_USER_MODEL)),
|
||
],
|
||
options={
|
||
'ordering': ['-created_at', '-pk'],
|
||
},
|
||
),
|
||
migrations.CreateModel(
|
||
name='PlanningState',
|
||
fields=[
|
||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
('revision', models.PositiveIntegerField(default=0)),
|
||
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||
],
|
||
),
|
||
migrations.CreateModel(
|
||
name='ScheduleException',
|
||
fields=[
|
||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
('label', models.CharField(blank=True, max_length=160)),
|
||
('kind', models.CharField(choices=[('work', 'Horaires exceptionnels'), ('rest', 'Repos'), ('absence', 'Congé / absence')], default='work', max_length=8)),
|
||
('start_date', models.DateField()),
|
||
('end_date', models.DateField(blank=True, null=True)),
|
||
('recurring', models.BooleanField(default=False)),
|
||
('weekdays', models.JSONField(default=list)),
|
||
('every_weeks', models.PositiveSmallIntegerField(default=1)),
|
||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||
('updated_at', models.DateTimeField(auto_now=True)),
|
||
('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
|
||
('request', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='applied_exceptions', to='planning.daychangerequest')),
|
||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='schedule_exceptions', to=settings.AUTH_USER_MODEL)),
|
||
],
|
||
options={
|
||
'ordering': ['-pk'],
|
||
},
|
||
),
|
||
migrations.CreateModel(
|
||
name='ExceptionSlot',
|
||
fields=[
|
||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
('start_time', models.TimeField()),
|
||
('end_time', models.TimeField()),
|
||
('end_day_offset', models.PositiveSmallIntegerField(default=0)),
|
||
('exception', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='slots', to='planning.scheduleexception')),
|
||
],
|
||
options={
|
||
'ordering': ['start_time'],
|
||
},
|
||
),
|
||
migrations.CreateModel(
|
||
name='WorkSchedule',
|
||
fields=[
|
||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
('valid_from', models.DateField()),
|
||
('valid_to', models.DateField(blank=True, null=True)),
|
||
('updated_at', models.DateTimeField(auto_now=True)),
|
||
('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
|
||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='work_schedules', to=settings.AUTH_USER_MODEL)),
|
||
],
|
||
options={
|
||
'ordering': ['-valid_from', '-pk'],
|
||
},
|
||
),
|
||
migrations.CreateModel(
|
||
name='WorkScheduleSlot',
|
||
fields=[
|
||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
('weekday', models.PositiveSmallIntegerField()),
|
||
('start_time', models.TimeField()),
|
||
('end_time', models.TimeField()),
|
||
('end_day_offset', models.PositiveSmallIntegerField(default=0)),
|
||
('schedule', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='slots', to='planning.workschedule')),
|
||
],
|
||
options={
|
||
'ordering': ['weekday', 'start_time'],
|
||
},
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='daychangerequest',
|
||
index=models.Index(fields=['status', 'user'], name='request_status_user_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='scheduleexception',
|
||
index=models.Index(fields=['user', 'start_date'], name='exception_user_date_idx'),
|
||
),
|
||
migrations.AddConstraint(
|
||
model_name='workschedule',
|
||
constraint=models.UniqueConstraint(fields=('user', 'valid_from'), name='schedule_user_start_unique'),
|
||
),
|
||
]
|