124 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # Generated by Django 1.11.15 on 2019-05-16 20:59
 | |
| from __future__ import unicode_literals
 | |
| 
 | |
| from django.db import migrations
 | |
| 
 | |
| from datetime import date
 | |
| 
 | |
| import logging
 | |
| 
 | |
| logger = logging.getLogger(__name__)
 | |
| 
 | |
| def spoj_k_organizatorum_osoby(apps, scema_editor):	
 | |
| 	Organizator = apps.get_model('seminar', 'Organizator')
 | |
| 	Resitel = apps.get_model('seminar', 'Resitel')
 | |
| 	Osoba = apps.get_model('seminar', 'Osoba')
 | |
| 	for org in Organizator.objects.all():
 | |
| 		
 | |
| 		# Spárování organizátora s osobou
 | |
| 		# Myšlenka: Když najdeme řešitele pro daného uživatele, tak se vezme Osoba příslušná uživateli,
 | |
| 		# Pokud nenajdeme uživatele, tak ještě zkusíme dohledat Osobu podle e-mailu
 | |
| 		user = org.user
 | |
| 		if user is None:
 | |
| 			logger.error(f'Org {org} nemá uživatele!')
 | |
| 			# Je to podezřelé, ale prostě vyrobíme novou osobu.
 | |
| 			osoba = Osoba()
 | |
| 			osoba.poznamka += f'\nWEB DEBUG: BUG: Osoba pro Orga {org.id} bez Uživatele'
 | |
| 			# Téhle osobě nejdou nastavit detaily, protože žádné nemáme.
 | |
| 			# Datum registrace budiž maximální
 | |
| 			osoba.datum_registrace = date.max
 | |
| 		else:
 | |
| 			logger.info(f'Org {org.user.email}(ID: {org.id}) má uživatele {user}')
 | |
| 			# 💢💢💢 Python nemá goto, ale prý má výjimky… 💢💢💢
 | |
| 			class EndException(Exception): pass
 | |
| 			try:
 | |
| 				# Hledáme podle uživatele
 | |
| 				resitele = Resitel.objects.filter(user=user)
 | |
| 				if resitele.count() != 0 and user is not None:
 | |
| 					osoba = resitele.first().osoba
 | |
| 					osoba.poznamka += f'\nWEB DEBUG: Osoba pro Orga {org.id} spárovaná podle Uživatele Řešitele'
 | |
| 					logger.info(f'Našel jsem řešitele {resitele.first().email} podle uživatele, používám jeho Osobu')
 | |
| 					raise EndException
 | |
| 				
 | |
| 				# Hledáme podle e-mailu
 | |
| 				osoby = Osoba.objects.filter(email__iexact=user.email)
 | |
| 				if osoby.count() != 0 and user.email != '':
 | |
| 					osoba = osoby.first()
 | |
| 					if osoba.user is None:
 | |
| 						osoba.user = user
 | |
| 					osoba.poznamka += f'\nWEB DEBUG: Osoba pro Orga {org.id} spárovaná podle e-mailu'
 | |
| 					logger.info(f'Našel jsem Osobu {osoby.first().email} podle e-mailu')
 | |
| 					raise EndException
 | |
| 
 | |
| 				# Fallback
 | |
| 				logger.warning(f'Org neměl řešitele, zakládám novou Osobu.')
 | |
| 				osoba = Osoba(user=user)
 | |
| 				osoba.poznamka += f'\nWEB DEBUG: Osoba pro Orga {org.id} vytvořena nová jen podle existence Uživatele'
 | |
| 
 | |
| 				# Přesun informací z usera do osoby
 | |
| 				# pro osoby z řešitelů (jediné dosud existující osoby) již v minule migraci
 | |
| 				osoba.jmeno = user.first_name
 | |
| 				osoba.prijmeni = user.last_name
 | |
| 				osoba.email = user.email
 | |
| 				user.first_name += " (Uživatel!)"
 | |
| 				user.last_name += " (Uživatel!)"
 | |
| 				osoba.datum_registrace = min(osoba.datum_registrace, user.date_joined, key=lambda d: d if d is not None else date.max)
 | |
| 				user.save()
 | |
| 
 | |
| 			except EndException: pass
 | |
| 
 | |
| 		# Přesun informací z organizátora do jeho osoby
 | |
| 		osoba.prezdivka = org.prezdivka if org.prezdivka is not None else ''
 | |
| 		osoba.foto = org.foto
 | |
| 		
 | |
| 		# Všechno uložit
 | |
| 		osoba.save()
 | |
| 		org.osoba = osoba
 | |
| 		org.save()
 | |
| 		
 | |
| def fix_problem(apps, schema_editor):
 | |
| 	Problem = apps.get_model('seminar', 'Problem')
 | |
| 	Organizator = apps.get_model('seminar', 'Organizator')
 | |
| 	for pr in Problem.objects.all():
 | |
| 		if pr.autor_old is not None:
 | |
| 			pr.autor = Organizator.objects.filter(osoba__user=pr.autor_old).first()
 | |
| 		else:
 | |
| 			pr.autor = None
 | |
| 		if pr.opravovatel is not None:
 | |
| 			if Organizator.objects.filter(osoba__user=pr.opravovatel).first() is not None:
 | |
| 				pr.opravovatele.add(Organizator.objects.filter(osoba__user=pr.opravovatel).first())
 | |
| 			else:
 | |
| 				logger.error(f'WTF, nespárovaný opravovatel {pr.opravovatel} problému {pr}')
 | |
| 		pr.save()
 | |
| 
 | |
| def fix_pohadka(apps, schema_editor):
 | |
| 	Pohadka = apps.get_model('seminar', 'Pohadka')
 | |
| 	Organizator = apps.get_model('seminar', 'Organizator')
 | |
| 	for poh in Pohadka.objects.all():
 | |
| 		if poh.autor_old is not None:
 | |
| 			poh.autor = Organizator.objects.filter(osoba__user=poh.autor_old).first()
 | |
| 		else:
 | |
| 			poh.autor = None
 | |
| 		poh.save()
 | |
| 
 | |
| def fix_novinka(apps, schema_editor):
 | |
| 	Novinky = apps.get_model('seminar', 'Novinky')
 | |
| 	Organizator = apps.get_model('seminar', 'Organizator')
 | |
| 	for nov in Novinky.objects.all():
 | |
| 		nov.autor = Organizator.objects.filter(osoba__user=nov.autor_old).first()
 | |
| 		nov.save()
 | |
| 	
 | |
| 	
 | |
| 
 | |
| class Migration(migrations.Migration):
 | |
| 
 | |
| 	dependencies = [
 | |
| 		('seminar', '0051_resitel_to_osoba'),
 | |
| 	]
 | |
| 
 | |
| 	operations = [
 | |
| 		migrations.RunPython(spoj_k_organizatorum_osoby, migrations.RunPython.noop),
 | |
| 		migrations.RunPython(fix_problem, migrations.RunPython.noop),
 | |
| 		migrations.RunPython(fix_pohadka, migrations.RunPython.noop),
 | |
| 		migrations.RunPython(fix_novinka, migrations.RunPython.noop),
 | |
| 	]
 |