86 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # Generated by Django 3.2.15 on 2022-10-01 09:28
 | |
| 
 | |
| from django.db import migrations, models
 | |
| import django.db.models.deletion
 | |
| from logging import getLogger
 | |
| 
 | |
| log = getLogger(__name__)
 | |
| 
 | |
| def prirad_deadliny(apps, schema_editor):
 | |
|     Hodnoceni = apps.get_model('seminar', 'Hodnoceni')
 | |
|     Deadline = apps.get_model('seminar', 'Deadline')
 | |
| 
 | |
|     for h in Hodnoceni.objects.all():
 | |
|         if h.cislo_body is not None and h.cislo_body.rocnik.rocnik < 26:
 | |
|             # Deadline připravený v minulé migraci
 | |
|             h.deadline_body = h.cislo_body.deadline_v_cisle.get()
 | |
|             h.save()
 | |
|             continue
 | |
| 
 | |
|         p = h.problem
 | |
| 
 | |
|         if p.polymorphic_ctype.model == 'tema':
 | |
|             t = p.tema
 | |
|             d = Deadline.objects.filter(cislo__rocnik=t.rocnik, deadline__gte=h.reseni.cas_doruceni).first()
 | |
| 
 | |
|             if d is None:
 | |
|                 d = Deadline.objects.filter(cislo__rocnik=t.rocnik).last()
 | |
| 
 | |
|             if d is not None:
 | |
|                 h.deadline_body = d
 | |
|                 h.save()
 | |
|                 continue
 | |
| 
 | |
|         cislo = None
 | |
| 
 | |
|         if p.polymorphic_ctype.model == 'uloha':
 | |
|             u = p.uloha
 | |
|             cislo = u.cislo_zadani
 | |
| 
 | |
|         if p.polymorphic_ctype.model == 'clanek':
 | |
|             c = p.clanek
 | |
|             if c.cislo is not None:
 | |
|                 cislo = c.cislo
 | |
| 
 | |
|         if cislo is None:
 | |
|             log.warning(f"Číslo hodnocení {h.id} se nepodařilo určit exaktním způsobem. Dané hodnocení házím do jeho cislo_body: {h.cislo_body}.")
 | |
|             cislo = h.cislo_body
 | |
| 
 | |
|         if cislo is not None:
 | |
|             d = Deadline.objects.filter(cislo=cislo, deadline__gte=h.reseni.cas_doruceni).first()
 | |
|             if d is None:
 | |
|                 d = Deadline.objects.filter(cislo=cislo).last()
 | |
|             if d is not None:
 | |
|                 h.deadline_body = d
 | |
|                 h.save()
 | |
|                 continue
 | |
| 
 | |
|         d = Deadline.objects.filter(deadline__gte=h.reseni.cas_doruceni).first()
 | |
|         h.deadline_body = d
 | |
|         h.save()
 | |
| 
 | |
|         log.warning(f"Deadline hodnocení {h.id} se nepodařil určit exaktnějším způsobem. Zkouším další. Přiřazen {h.deadline_body}. Původní cislo_body: {h.cislo_body}.")
 | |
| 
 | |
|         # Zběžná kontrola. Předpokládá, že M&M má méně než 10 čísel v ročníku
 | |
|         # a že první znak pořadí je int určující dané pořadí (schroustání 7-8).
 | |
|         if h.cislo_body and h.deadline_body and (
 | |
|                     int(h.deadline_body.cislo.poradi[0]) + 2 < int(h.cislo_body.poradi[0])
 | |
|                     or int(h.deadline_body.cislo.poradi[0]) > int(h.cislo_body.poradi[0])
 | |
|                 ):
 | |
|             log.error(f"Hodnocení {h.id} se špatně změnilo číslo z {h.cislo_body} na {h.deadline_body.cislo}")
 | |
| 
 | |
| 
 | |
| class Migration(migrations.Migration):
 | |
| 
 | |
|     dependencies = [
 | |
|         ('seminar', '0103_deadline'),
 | |
|     ]
 | |
| 
 | |
|     operations = [
 | |
|         migrations.AddField(
 | |
|             model_name='hodnoceni',
 | |
|             name='deadline_body',
 | |
|             field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='hodnoceni', to='seminar.deadline', verbose_name='deadline pro body'),
 | |
|         ),
 | |
|         migrations.RunPython(prirad_deadliny, migrations.RunPython.noop),
 | |
|     ]
 |