# Generated by Django 6.1.3 on 2026-11-04 15:49 import django.db.models.deletion import uuid from django.conf import settings from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ('skills', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='TaskCompletion', fields=[ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('status', models.CharField(choices=[('pending', 'En attente'), ('accepted', 'Acceptée'), ('rejected', 'Refusée'), ('cancelled', 'Annulée')], default='accepted', max_length=16)), ('completed_at', models.DateTimeField()), ('submitted_at', models.DateTimeField(auto_now_add=True)), ('note', models.TextField(blank=True)), ('proof_url', models.URLField(blank=True)), ('idempotency_key', models.CharField(blank=True, max_length=100, null=True)), ('task_name_snapshot', models.CharField(max_length=160)), ('xp_snapshot', models.PositiveIntegerField(default=0)), ('validated_at', models.DateTimeField(blank=True, null=True)), ('player', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='task_completions', to=settings.AUTH_USER_MODEL)), ('task', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='completions', to='skills.task')), ('validated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='validated_completions', to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( name='XPTransaction', fields=[ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('amount', models.IntegerField()), ('reason', models.CharField(choices=[('task', 'Réalisation d’une tâche'), ('achievement', 'Succès'), ('bonus', 'Bonus'), ('correction', 'Correction'), ('reversal', 'Annulation')], max_length=20)), ('metadata', models.JSONField(blank=True, default=dict)), ('created_at', models.DateTimeField(auto_now_add=True)), ('completion', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='xp_transactions', to='progression.taskcompletion')), ('player', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='xp_transactions', to=settings.AUTH_USER_MODEL)), ('reversed_transaction', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='reversal', to='progression.xptransaction')), ('skill', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='xp_transactions', to='skills.skill')), ], ), migrations.CreateModel( name='PlayerSkillProgress', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('xp', models.PositiveBigIntegerField(default=0)), ('level', models.PositiveIntegerField(default=0)), ('unlocked_at', models.DateTimeField(blank=True, null=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('player', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='skill_progress', to=settings.AUTH_USER_MODEL)), ('skill', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='player_progress', to='skills.skill')), ], options={ 'constraints': [models.UniqueConstraint(fields=('player', 'skill'), name='unique_player_skill_progress')], }, ), migrations.AddIndex( model_name='taskcompletion', index=models.Index(fields=['player', '-completed_at'], name='progression_player__24cf43_idx'), ), migrations.AddIndex( model_name='taskcompletion', index=models.Index(fields=['task', '-completed_at'], name='progression_task_id_ddb5c4_idx'), ), migrations.AddConstraint( model_name='taskcompletion', constraint=models.UniqueConstraint(condition=models.Q(('idempotency_key__isnull', False)), fields=('player', 'idempotency_key'), name='unique_player_idempotency_key'), ), migrations.AddIndex( model_name='xptransaction', index=models.Index(fields=['player', 'skill'], name='progression_player__3e4558_idx'), ), migrations.AddIndex( model_name='xptransaction', index=models.Index(fields=['player', '-created_at'], name='progression_player__435a67_idx'), ), ]