Oprava vytvoření polymorfických contenttypes
This commit is contained in:
		
							parent
							
								
									3153b31b2d
								
							
						
					
					
						commit
						303c8e4b4b
					
				
					 3 changed files with 53 additions and 4 deletions
				
			
		|  | @ -5,7 +5,7 @@ import django.db.models.deletion | ||||||
| 
 | 
 | ||||||
| def vyrob_treenodum_ctypes(apps, schema_editor): | def vyrob_treenodum_ctypes(apps, schema_editor): | ||||||
| 	# Kód zkopírovaný z dokumentace: https://django-polymorphic.readthedocs.io/en/stable/migrating.html | 	# Kód zkopírovaný z dokumentace: https://django-polymorphic.readthedocs.io/en/stable/migrating.html | ||||||
| 	# XXX: Nevím, jestli se tohle náhodou nemělo spustit na všech childech (jen/i) | 	# NOTE: Tahle migrace je špatně, 0087 ji opravuje. Možno squashnout pryč. | ||||||
| 	TreeNode = apps.get_model('seminar', 'TreeNode') | 	TreeNode = apps.get_model('seminar', 'TreeNode') | ||||||
| 	ContentType = apps.get_model('contenttypes', 'ContentType') | 	ContentType = apps.get_model('contenttypes', 'ContentType') | ||||||
| 	 | 	 | ||||||
|  | @ -27,5 +27,5 @@ class Migration(migrations.Migration): | ||||||
| 			name='polymorphic_ctype', | 			name='polymorphic_ctype', | ||||||
| 			field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_seminar.treenode_set+', to='contenttypes.ContentType'), | 			field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_seminar.treenode_set+', to='contenttypes.ContentType'), | ||||||
| 		), | 		), | ||||||
| 		migrations.RunPython(vyrob_treenodum_ctypes, migrations.RunPython.noop), | 		migrations.RunPython(vyrob_treenodum_ctypes, migrations.RunPython.noop, elidable=True), | ||||||
| 	] | 	] | ||||||
|  |  | ||||||
|  | @ -5,7 +5,7 @@ import django.db.models.deletion | ||||||
| 
 | 
 | ||||||
| def vyrob_problemum_ctypes(apps, schema_editor): | def vyrob_problemum_ctypes(apps, schema_editor): | ||||||
| 	# Kód zkopírovaný z dokumentace: https://django-polymorphic.readthedocs.io/en/stable/migrating.html | 	# Kód zkopírovaný z dokumentace: https://django-polymorphic.readthedocs.io/en/stable/migrating.html | ||||||
| 	# XXX: Nevím, jestli se tohle náhodou nemělo spustit na všech childech (jen/i) | 	# NOTE: Tahle migrace je špatně, 0087 ji opravuje. Možno squashnout pryč. | ||||||
| 	Problem = apps.get_model('seminar', 'Problem') | 	Problem = apps.get_model('seminar', 'Problem') | ||||||
| 	ContentType = apps.get_model('contenttypes', 'ContentType') | 	ContentType = apps.get_model('contenttypes', 'ContentType') | ||||||
| 	 | 	 | ||||||
|  | @ -25,5 +25,5 @@ class Migration(migrations.Migration): | ||||||
| 			name='polymorphic_ctype', | 			name='polymorphic_ctype', | ||||||
| 			field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_seminar.problem_set+', to='contenttypes.ContentType'), | 			field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_seminar.problem_set+', to='contenttypes.ContentType'), | ||||||
| 		), | 		), | ||||||
| 		migrations.RunPython(vyrob_problemum_ctypes, migrations.RunPython.noop), | 		migrations.RunPython(vyrob_problemum_ctypes, migrations.RunPython.noop, elidable=True), | ||||||
| 	] | 	] | ||||||
|  |  | ||||||
							
								
								
									
										49
									
								
								seminar/migrations/0087_fix_polymorphism.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								seminar/migrations/0087_fix_polymorphism.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,49 @@ | ||||||
|  | # Generated by Django 2.2.16 on 2020-09-04 12:06 | ||||||
|  | 
 | ||||||
|  | from django.db import migrations | ||||||
|  | from logging import getLogger | ||||||
|  | 
 | ||||||
|  | log = getLogger(__name__) | ||||||
|  | 
 | ||||||
|  | # Oprava migrací 0065 a 0066, kde jsem špatně pochopil django-polymorphic | ||||||
|  | 
 | ||||||
|  | # Pomocná funkce -- děláme to samé pro obě polymorfní hierarchie | ||||||
|  | def fix_ctypes(parent: str, children, apps, schema_editor): | ||||||
|  | 	Parent = apps.get_model('seminar', parent) | ||||||
|  | 	ContentType = apps.get_model('contenttypes', 'ContentType') | ||||||
|  | 
 | ||||||
|  | 	# Nejdřív všechno smažeme: | ||||||
|  | 	Parent.objects.update(polymorphic_ctype=None) | ||||||
|  | 
 | ||||||
|  | 	# Opravíme děti | ||||||
|  | 	for clsname in children: | ||||||
|  | 		Model = apps.get_model('seminar', clsname) | ||||||
|  | 		ct = ContentType.objects.get_for_model(Model) | ||||||
|  | 		Model.objects.update(polymorphic_ctype=ct) | ||||||
|  | 	 | ||||||
|  | 
 | ||||||
|  | 	# Ostatní instance mají mít explicitně content type pro rodiče | ||||||
|  | 	new_ct = ContentType.objects.get_for_model(Parent) | ||||||
|  | 	for obj in Parent.objects.filter(polymorphic_ctype__isnull=True): | ||||||
|  | 		log.warn(f"{parent} {obj} neměl content type -- nejspíš to je instance přímo {parent}!") | ||||||
|  | 		obj.polymorphic_ctype=new_ct | ||||||
|  | 		obj.save() | ||||||
|  | 
 | ||||||
|  | def fix_treenode(apps, schema_editor): | ||||||
|  | 	children = ['RocnikNode', 'CisloNode', 'MezicisloNode', 'TemaVCisleNode', | ||||||
|  | 			'OrgTextNode', 'UlohaZadaniNode', 'UlohaVzorakNode', 'PohadkaNode', | ||||||
|  | 			'TextNode', 'CastNode', 'ReseniNode'] | ||||||
|  | 	fix_ctypes("TreeNode", children, apps, schema_editor) | ||||||
|  | 
 | ||||||
|  | def fix_problem(apps, schema_editor): | ||||||
|  | 	children = ['Tema', 'Clanek', 'Uloha', 'Konfera'] | ||||||
|  | 	fix_ctypes("Problem", children, apps, schema_editor) | ||||||
|  | 
 | ||||||
|  | class Migration(migrations.Migration): | ||||||
|  | 	dependencies = [ | ||||||
|  | 		('seminar', '0086_auto_20200819_0959'), | ||||||
|  | 	] | ||||||
|  | 	operations = [ | ||||||
|  | 		migrations.RunPython(fix_treenode, migrations.RunPython.noop), | ||||||
|  | 		migrations.RunPython(fix_problem, migrations.RunPython.noop), | ||||||
|  | 	] | ||||||
		Loading…
	
		Reference in a new issue
	
	 Pavel "LEdoian" Turinsky
						Pavel "LEdoian" Turinsky