Merge branch 'data_migrations' of gimli.ms.mff.cuni.cz:/akce/mam/git/mamweb into data_migrations
This commit is contained in:
		
						commit
						6ce6ce9a46
					
				
					 9 changed files with 240 additions and 244 deletions
				
			
		|  | @ -51,7 +51,10 @@ a:focus, a:hover, a:active { | |||
| 	color: #e84e10; | ||||
| 	text-decoration: none; | ||||
| } | ||||
| a:focus a:hover | ||||
| 
 | ||||
| img { | ||||
| 	filter: drop-shadow(0px 3px 3px rgba(0, 0, 0, 0.4)); | ||||
| } | ||||
| 
 | ||||
| h1 {	/*todo: odlišit 1 a 2 */ | ||||
| 	font-size: 200%; | ||||
|  | @ -594,6 +597,14 @@ div.org_pole, div.rocnik_pole { | |||
| 	text-align: center; | ||||
| } | ||||
| 
 | ||||
| div.cislo_pole { | ||||
| 	display: inline-block; | ||||
| 	width: 15%; | ||||
| 	min-width: 165px; | ||||
| 	text-align: center; | ||||
| 	padding: 10px; | ||||
| } | ||||
| 
 | ||||
| div.seznam_orgu h3 { | ||||
| 	text-align: center; | ||||
| 	margin-top: 10px; | ||||
|  | @ -623,6 +634,11 @@ div.org_email { | |||
| 	height: 298px; | ||||
| } | ||||
| 
 | ||||
| #archiv-rocnik.flip-card { | ||||
| 	width: 144px; | ||||
| 	height: 205px; | ||||
| } | ||||
| 
 | ||||
| /* This container is needed to position the front and back side */ | ||||
| .flip-card-inner { | ||||
|  position: relative; | ||||
|  | @ -654,16 +670,13 @@ div.org_email { | |||
| div.flip-card-foto img { | ||||
| 	width: 100%; | ||||
| 	height: 100%; | ||||
| 	filter: drop-shadow(0px 3px 3px rgba(0, 0, 0, 0.4)); /* FIXME:  obecně k obrázkům */ | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| /* Style the back side */ | ||||
| .flip-card-back { | ||||
|  /*background-color: #e84e10; | ||||
|  color: #fffbf6; | ||||
|  background-color: #fdedd5;*/ | ||||
|  background-color: #f9d59e; | ||||
|  color: black;/**/ | ||||
|  color: black; | ||||
|  transform: rotateY(180deg); | ||||
|  padding: 10px; | ||||
|  padding-top: 20px; | ||||
|  | @ -678,26 +691,35 @@ div.popis_rocniku { | |||
| } | ||||
| 
 | ||||
| 
 | ||||
| div.popis_rocniku a{ | ||||
| div.popis_rocniku a, div.cislo_odkazy a { | ||||
| 	font-weight: bold; | ||||
|   color: black; | ||||
| } | ||||
| 
 | ||||
| div.popis_rocniku a:hover{ | ||||
| div.popis_rocniku a:hover, | ||||
| div.cislo_odkazy a:hover { | ||||
| 	color: #6f2509; | ||||
| } | ||||
| 
 | ||||
| /* graf na úvodní stránce */ | ||||
| 
 | ||||
| a span.popup { | ||||
| 	position: absolute; | ||||
| 	visibility: hidden; | ||||
| div.cislo_odkazy ul { | ||||
| 		margin: 0px; | ||||
| 		padding: 0px; | ||||
| } | ||||
| 
 | ||||
| a span.popup:hover { | ||||
| 	visibility:visible; | ||||
| 	top:37px; left:37px; | ||||
| /* archiv ročník | ||||
| div.cisla-v-rocniku { | ||||
| 		font-weight: bold; | ||||
| 		color:  #6f2509; | ||||
| } | ||||
| 
 | ||||
| div.cislo-v-rocniku-blok { | ||||
| 	display: inline-block; | ||||
| 	width: 150px; | ||||
| 	height: 220px; | ||||
| 		text-align: center; | ||||
| }*/ | ||||
| 
 | ||||
| 
 | ||||
| /* galerie */ | ||||
| 
 | ||||
| /* velká fotka */ | ||||
|  |  | |||
|  | @ -35,6 +35,7 @@ class ProblemAdmin(PolymorphicParentModelAdmin): | |||
| 		m.Tema, | ||||
| 		m.Clanek, | ||||
| 		m.Uloha, | ||||
| 		m.Konfera, | ||||
| 		] | ||||
| 
 | ||||
| @admin.register(m.Tema) | ||||
|  | @ -52,6 +53,11 @@ class UlohaAdmin(PolymorphicChildModelAdmin): | |||
| 	base_model = m.Uloha | ||||
| 	show_in_index = True | ||||
| 
 | ||||
| @admin.register(m.Konfera) | ||||
| class KonferaAdmin(PolymorphicChildModelAdmin): | ||||
| 	base_model = m.Konfera | ||||
| 	show_in_index = True | ||||
| 
 | ||||
| class TextAdminInline(admin.TabularInline): | ||||
| 	model = m.Text | ||||
| 	exclude = ['text_zkraceny_set','text_zkraceny'] | ||||
|  | @ -82,7 +88,6 @@ class ReseniAdmin(ReverseModelAdmin): | |||
| 
 | ||||
| admin.site.register(m.Hodnoceni) | ||||
| admin.site.register(m.Pohadka) | ||||
| admin.site.register(m.Konfera) | ||||
| admin.site.register(m.Obrazek) | ||||
| 
 | ||||
| 
 | ||||
|  | @ -97,8 +102,6 @@ class TreeNodeAdmin(PolymorphicParentModelAdmin): | |||
| 		m.CisloNode, | ||||
| 		m.MezicisloNode, | ||||
| 		m.TemaVCisleNode, | ||||
| 		m.KonferaNode, | ||||
| 		m.ClanekNode, | ||||
| 		m.UlohaZadaniNode, | ||||
| 		m.PohadkaNode, | ||||
| 		m.UlohaVzorakNode, | ||||
|  | @ -136,16 +139,6 @@ class TemaVCisleNodeAdmin(PolymorphicChildModelAdmin): | |||
| 	base_model = m.TemaVCisleNode | ||||
| 	show_in_index = True | ||||
| 
 | ||||
| @admin.register(m.KonferaNode) | ||||
| class KonferaNodeAdmin(PolymorphicChildModelAdmin): | ||||
| 	base_model = m.KonferaNode | ||||
| 	show_in_index = True | ||||
| 
 | ||||
| @admin.register(m.ClanekNode) | ||||
| class ClanekNodeAdmin(PolymorphicChildModelAdmin): | ||||
| 	base_model = m.ClanekNode | ||||
| 	show_in_index = True | ||||
| 
 | ||||
| @admin.register(m.UlohaZadaniNode) | ||||
| class UlohaZadaniNodeAdmin(PolymorphicChildModelAdmin): | ||||
| 	base_model = m.UlohaZadaniNode | ||||
|  |  | |||
							
								
								
									
										121
									
								
								seminar/migrations/0080_zruseni_claneknode_a_konferanode.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								seminar/migrations/0080_zruseni_claneknode_a_konferanode.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,121 @@ | |||
| # Generated by Django 2.2.12 on 2020-04-01 20:54 | ||||
| # Fixed by Pavel, 2020-01-04 20:56 UTC | ||||
| # This is quite possibly a bug in Django. | ||||
| 
 | ||||
| from django.db import migrations, models | ||||
| import django.db.models.deletion | ||||
| 
 | ||||
| def vyrob_dummy_problemy(apps, schema_editor): | ||||
| 	Problem = apps.get_model('seminar', 'Problem') | ||||
| 	Konfera = apps.get_model('seminar', 'Konfera') | ||||
| 	for k in Konfera.objects.all(): | ||||
| 		pr = Problem.objects.create(nazev=k.nazev, | ||||
| 			garant=k.organizator) | ||||
| 		pr.save() | ||||
| 		k.problem_ptr = pr | ||||
| 		k.save() | ||||
| 
 | ||||
| 
 | ||||
| class Migration(migrations.Migration): | ||||
| 
 | ||||
|     dependencies = [ | ||||
|         ('contenttypes', '0002_remove_content_type_name'), | ||||
|         ('seminar', '0079_clanek_resitelsky'), | ||||
|     ] | ||||
| 
 | ||||
|     operations = [ | ||||
|         migrations.DeleteModel( | ||||
|             name='Konfery_Ucastnici', | ||||
|         ), | ||||
|         migrations.RemoveField( | ||||
|             model_name='konfera', | ||||
|             name='ucastnici', | ||||
|         ), | ||||
|         migrations.CreateModel( | ||||
|             name='OrgTextNode', | ||||
|             fields=[ | ||||
|                 ('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='seminar.TreeNode')), | ||||
|                 ('org_verejny', models.BooleanField(default=True, help_text='Pokud ano, bude org pod článkem podepsaný', verbose_name='Org je veřejný?')), | ||||
|                 ('organizator', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='seminar.Organizator', verbose_name='Organizátor')), | ||||
|             ], | ||||
|             options={ | ||||
|                 'verbose_name': 'Organizátorský článek (Node)', | ||||
|                 'verbose_name_plural': 'Organizátorské články (Node)', | ||||
|                 'db_table': 'seminar_nodes_orgtextnode', | ||||
|             }, | ||||
|             bases=('seminar.treenode',), | ||||
|         ), | ||||
|         migrations.RemoveField( | ||||
|             model_name='konfera', | ||||
|             name='id', | ||||
|         ), | ||||
|         migrations.RenameModel( | ||||
|             old_name='OtisteneReseniNode', | ||||
|             new_name='ReseniNode', | ||||
|         ), | ||||
|         migrations.RemoveField( | ||||
|             model_name='clanek', | ||||
|             name='cislo', | ||||
|         ), | ||||
|         migrations.RemoveField( | ||||
|             model_name='clanek', | ||||
|             name='resitelsky', | ||||
|         ), | ||||
|         migrations.RemoveField( | ||||
|             model_name='reseni', | ||||
|             name='text_zkraceny', | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name='konfera', | ||||
|             name='problem_ptr', | ||||
|             field=models.OneToOneField(auto_created=True, null=False, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='seminar.Problem'), | ||||
|             preserve_default=False, | ||||
|         ), | ||||
|         migrations.RemoveField( | ||||
|             model_name='konfera', | ||||
|             name='nazev', | ||||
|         ), | ||||
|         migrations.RemoveField( | ||||
|             model_name='konfera', | ||||
|             name='organizator', | ||||
|         ), | ||||
|         migrations.RemoveField( | ||||
|             model_name='konfera', | ||||
|             name='poznamka', | ||||
|         ), | ||||
|         migrations.RemoveField( | ||||
|             model_name='konfera', | ||||
|             name='reseni', | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='reseni', | ||||
|             name='text_cely', | ||||
|             field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='reseni_cely_set', to='seminar.ReseniNode', verbose_name='Plná verze textu řešení'), | ||||
|         ), | ||||
|         migrations.DeleteModel( | ||||
|             name='ClanekNode', | ||||
|         ), | ||||
|         migrations.DeleteModel( | ||||
|             name='KonferaNode', | ||||
|         ), | ||||
|         migrations.CreateModel( | ||||
|             name='Konfery_Ucastnici', | ||||
|             fields=[ | ||||
|                 ('id', models.AutoField(primary_key=True, serialize=False)), | ||||
|                 ('poznamka', models.TextField(blank=True, help_text='Neveřejná poznámka k účasti (plain text)', verbose_name='neveřejná poznámka')), | ||||
|                 ('konfera', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='seminar.Konfera', verbose_name='konfera')), | ||||
|                 ('resitel', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='seminar.Resitel', verbose_name='řešitel')), | ||||
|             ], | ||||
|             options={ | ||||
|                 'verbose_name': 'Účast na konfeře', | ||||
|                 'verbose_name_plural': 'Účasti na konfeře', | ||||
|                 'db_table': 'seminar_konfery_ucastnici', | ||||
|                 'ordering': ['konfera', 'resitel'], | ||||
|             }, | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name='konfera', | ||||
|             name='ucastnici', | ||||
|             field=models.ManyToManyField(help_text='Seznam účastníků konfery', through='seminar.Konfery_Ucastnici', to='seminar.Resitel', verbose_name='účastníci konfery'), | ||||
|         ), | ||||
|     ] | ||||
|  | @ -7,7 +7,7 @@ import seminar.models | |||
| class Migration(migrations.Migration): | ||||
| 
 | ||||
|     dependencies = [ | ||||
|         ('seminar', '0079_clanek_resitelsky'), | ||||
|         ('seminar', '0080_zruseni_claneknode_a_konferanode'), | ||||
|     ] | ||||
| 
 | ||||
|     operations = [ | ||||
|  | @ -792,14 +792,6 @@ class Clanek(Problem): | |||
| 		verbose_name = 'Článek' | ||||
| 		verbose_name_plural = 'Články' | ||||
| 	 | ||||
| 	cislo = models.ForeignKey(Cislo, verbose_name='číslo', blank=True, null=True, | ||||
| 		on_delete=models.PROTECT) | ||||
| 
 | ||||
| 	resitelsky = models.BooleanField('Jde o řešitelský článek?', default=True) | ||||
| 
 | ||||
| 	# má OneToOneField s: | ||||
| 	# ClanekNode | ||||
| 
 | ||||
| 	def kod_v_rocniku(self): | ||||
| 		if self.stav == 'zadany': | ||||
| # Nemělo by být potřeba | ||||
|  | @ -808,15 +800,6 @@ class Clanek(Problem): | |||
| 			return "c{}".format(self.kod) | ||||
| 		return '<Není zadaný>' | ||||
| 
 | ||||
| 	def save(self, *args, **kwargs): | ||||
| 		super().save(*args, **kwargs) | ||||
| 		# *Node.save() aktualizuje název *Nodu. | ||||
| 		try: | ||||
| 			self.claneknode.save() | ||||
| 		except ObjectDoesNotExist: | ||||
| 			# Neexistující *Node nemá smysl aktualizovat. | ||||
| 			pass | ||||
| 
 | ||||
| class Text(SeminarModelBase): | ||||
| 	class Meta: | ||||
| 		db_table = 'seminar_texty' | ||||
|  | @ -926,13 +909,10 @@ class Reseni(SeminarModelBase): | |||
| 	forma = models.CharField('forma řešení', max_length=16, choices=FORMA_CHOICES, blank=False, | ||||
| 		 default=FORMA_EMAIL) | ||||
| 
 | ||||
| 	text_cely = models.OneToOneField(Text, verbose_name='Plná verze textu řešení',  | ||||
| 	text_cely = models.OneToOneField('ReseniNode', verbose_name='Plná verze textu řešení',  | ||||
| 		blank=True, null=True, related_name="reseni_cely_set", | ||||
| 		on_delete=models.SET_NULL) | ||||
| 		on_delete=models.PROTECT) | ||||
| 
 | ||||
| 	text_zkraceny = models.ManyToManyField(Text, verbose_name='zkrácené verze řešení', | ||||
| 		help_text='Seznam úryvků z řešení',related_name="reseni_zkraceny_set") | ||||
| 	 | ||||
| 	poznamka = models.TextField('neveřejná poznámka', blank=True, | ||||
| 		help_text='Neveřejná poznámka k řešení (plain text)') | ||||
| 
 | ||||
|  | @ -1141,25 +1121,18 @@ class Soustredeni_Organizatori(SeminarModelBase): | |||
| 
 | ||||
| 
 | ||||
| @reversion.register(ignore_duplicates=True) | ||||
| class Konfera(models.Model): | ||||
| class Konfera(Problem): | ||||
| 	class Meta: | ||||
| 		db_table = 'seminar_konfera' | ||||
| 		verbose_name = 'Konfera' | ||||
| 		verbose_name_plural = 'Konfery' | ||||
| 	# Interní ID | ||||
| 	id = models.AutoField(primary_key = True) | ||||
| 
 | ||||
| 	nazev = models.CharField('název konfery', max_length=100, help_text = 'Název konfery') | ||||
| 	 | ||||
| 	anotace = models.TextField('anotace', blank=True, | ||||
| 		help_text='Popis, o čem bude konfera.') | ||||
| 	 | ||||
| 	abstrakt = models.TextField('abstrakt', blank=True, | ||||
| 		help_text='Abstrakt konfery tak, jak byl uveden ve sborníku') | ||||
| 	 | ||||
| 	organizator = models.ForeignKey(Organizator, verbose_name='organizátor', related_name='konfery', | ||||
| 			on_delete = models.SET_NULL, null=True) | ||||
| 
 | ||||
| 	# FIXME: Umíme omezit jen na účastníky daného soustřeďka? | ||||
| 	ucastnici = models.ManyToManyField(Resitel, verbose_name='účastníci konfery', | ||||
| 		help_text='Seznam účastníků konfery', through='Konfery_Ucastnici') | ||||
|  | @ -1167,13 +1140,6 @@ class Konfera(models.Model): | |||
| 	soustredeni = models.ForeignKey(Soustredeni, verbose_name='soustředění',  | ||||
| 			related_name='konfery', on_delete = models.SET_NULL, null=True) | ||||
| 
 | ||||
| 	poznamka = models.TextField('neveřejná poznámka', blank=True, | ||||
| 		help_text='Neveřejná poznámka ke konfeře(plain text)') | ||||
| 	# Jedno reseni se vztahuje nejvyse k jedne konfere | ||||
| 	reseni = models.OneToOneField(Reseni, verbose_name='článek ke konfeře', related_name='konfery', | ||||
| 		help_text='Účastnický přípěvek o konfeře', on_delete = models.SET_NULL,  | ||||
| 		null=True, blank=True) | ||||
| 
 | ||||
| 	TYP_VELETRH = 'veletrh' | ||||
| 	TYP_PREZENTACE = 'prezentace' | ||||
| 	TYP_CHOICES = [ | ||||
|  | @ -1190,21 +1156,9 @@ class Konfera(models.Model): | |||
| 			help_text = 'Další materiály ke konfeře zabalené do jednoho souboru',  | ||||
| 			upload_to = generate_filename_konfera, blank=True) | ||||
| 
 | ||||
| 	# má OneToOneField s: | ||||
| 	# KonferaNode | ||||
| 
 | ||||
| 	def __str__(self): | ||||
| 		return "{}: ({})".format(self.nazev, self.soustredeni) | ||||
| 
 | ||||
| 	def save(self, *args, **kwargs): | ||||
| 		super().save(*args, **kwargs) | ||||
| 		# *Node.save() aktualizuje název *Nodu. | ||||
| 		try: | ||||
| 			self.konferanode.save() | ||||
| 		except ObjectDoesNotExist: | ||||
| 			# Neexistující *Node nemá smysl aktualizovat. | ||||
| 			pass | ||||
| 
 | ||||
| 
 | ||||
| # Vazebna tabulka. Mozna se generuje automaticky. | ||||
| @reversion.register(ignore_duplicates=True) | ||||
|  | @ -1417,36 +1371,30 @@ class TemaVCisleNode(TreeNode): | |||
| 	def getOdkazStr(self): | ||||
| 		return str(self.tema) | ||||
| 
 | ||||
| class KonferaNode(TreeNode): | ||||
| class OrgTextNode(TreeNode): | ||||
| 	class Meta: | ||||
| 		db_table = 'seminar_nodes_konfera' | ||||
| 		verbose_name = 'Konfera (Node)' | ||||
| 		verbose_name_plural = 'Konfery (Node)' | ||||
| 	konfera = models.OneToOneField(Konfera, | ||||
| 		on_delete=models.PROTECT, # Pokud chci mazat téma, musím si Node pořešit ručně | ||||
| 		verbose_name = "konfera", | ||||
| 		null=True, | ||||
| 		blank=False) | ||||
| 		db_table = 'seminar_nodes_orgtextnode' | ||||
| 		verbose_name = 'Organizátorský článek (Node)' | ||||
| 		verbose_name_plural = 'Organizátorské články (Node)' | ||||
| 	 | ||||
| 	organizator = models.ForeignKey(Organizator, | ||||
| 		null=False, | ||||
| 		blank=False, | ||||
| 		on_delete=models.DO_NOTHING, | ||||
| 		verbose_name="Organizátor", | ||||
| 		) | ||||
| 	org_verejny = models.BooleanField(default = True, | ||||
| 		verbose_name = "Org je veřejný?", | ||||
| 		help_text = "Pokud ano, bude org pod článkem podepsaný", | ||||
| 		null=False, | ||||
| 		) | ||||
| 
 | ||||
| 	def aktualizuj_nazev(self): | ||||
| 		self.nazev = "KonferaNode: "+str(self.konfera) | ||||
| 		return f"OrgTextNode začínající následujícim: {self.first_child.nazev}" | ||||
| 
 | ||||
| class ClanekNode(TreeNode): | ||||
| 	class Meta: | ||||
| 		db_table = 'seminar_nodes_clanek' | ||||
| 		verbose_name = 'Článek (Node)' | ||||
| 		verbose_name_plural = 'Články (Node)' | ||||
| 	clanek = models.OneToOneField(Clanek, | ||||
| 		on_delete=models.PROTECT, # Pokud chci mazat téma, musím si Node pořešit ručně | ||||
| 		verbose_name = "článek", | ||||
| 		null=True, | ||||
| 		blank=False) | ||||
| 
 | ||||
| 	def aktualizuj_nazev(self): | ||||
| 		self.nazev = "ClanekNode: "+str(self.clanek) | ||||
| 
 | ||||
| 	def getOdkazStr(self): | ||||
| 		return str(self.clanek) | ||||
| 	# FIXME!!! | ||||
| 	#def getOdkazStr(self): | ||||
| 	#	return str(self.clanek) | ||||
| 
 | ||||
| 
 | ||||
| class UlohaZadaniNode(TreeNode): | ||||
|  | @ -1527,7 +1475,7 @@ class CastNode(TreeNode): | |||
| 	def getOdkazStr(self): | ||||
| 		return str(self.nadpis) | ||||
| 
 | ||||
| class OtisteneReseniNode(TreeNode): | ||||
| class ReseniNode(TreeNode): | ||||
| 	class Meta: | ||||
| 		db_table = 'seminar_nodes_otistene_reseni' | ||||
| 		verbose_name = 'Otištěné řešení (Node)' | ||||
|  |  | |||
|  | @ -40,7 +40,7 @@ | |||
|           {% for cislo in rocnik.cisla.all reversed %} | ||||
|           <li><a href='{{ cislo.verejne_url }}'>{{ cislo.poradi }}. číslo</a> {% if cislo.pdf %}(<a href='{{ cislo.pdf.url }}'>pdf</a>) {% endif %} | ||||
|           {% empty %} | ||||
|             --- | ||||
|           Žádná čísla k zobrazení | ||||
|           {% endfor %} | ||||
|           </ul> | ||||
|           <a href='{{ rocnik.verejne_url }}'>Výsledková listina</a> <!-- FIXME:  url výsledkovky--> | ||||
|  |  | |||
|  | @ -17,14 +17,49 @@ | |||
|     </ul> | ||||
|   {% endif %} | ||||
| 
 | ||||
|   <ul> | ||||
| <div class="cisla-v-rocniku"> | ||||
|   {% for c in rocnik.verejna_cisla %} | ||||
|   <li><a href="{{ c.verejne_url }}">Číslo {{ c.kod }}</a> | ||||
|       {% if c.pdf %} | ||||
|         (<a href='{{ c.pdf.url }}'>pdf</a>) | ||||
|       {% endif %} | ||||
|     <div class="cislo_pole"> | ||||
| 
 | ||||
|       <h6> Číslo {{ c.kod }}</h6> | ||||
| 
 | ||||
|       <div class="flip-card" id="archiv-rocnik"> | ||||
| 
 | ||||
|       <div class="flip-card-inner"> | ||||
|         <div class="flip-card-front"> | ||||
| 
 | ||||
|       <div class="flip-card-foto"> | ||||
|         {% if c.titulka_nahled %} | ||||
|         <img src="{{ c.titulka_nahled.url }}" alt="{{ c.kod }}" height=180px> | ||||
|         {% else %} | ||||
|         <img src="" alt="no image" height=180px> | ||||
|         {% endif %} | ||||
|       </div> | ||||
| 
 | ||||
|       </div> | ||||
|        <div class="flip-card-back"> | ||||
| 
 | ||||
|          <div class="cislo_odkazy"> | ||||
|            <ul> | ||||
|              <li> | ||||
|                <a href="{{ c.verejne_url }}">archiv čísla</a> | ||||
|              </li> | ||||
|              {% if c.pdf %} | ||||
|              <li> | ||||
|                  <a href='{{ c.pdf.url }}'>pdf</a> | ||||
|              </li> | ||||
|              {% endif %} | ||||
|            </ul> | ||||
|          </div> | ||||
| 
 | ||||
| 
 | ||||
|       </div> | ||||
|       </div> | ||||
|       </div> | ||||
|       </div> | ||||
| 
 | ||||
|   {% endfor %} | ||||
|   </ul> | ||||
| </div> | ||||
| 
 | ||||
|   {% if vysledkovka %} | ||||
|     {% if user.is_staff %} | ||||
|  |  | |||
|  | @ -9,7 +9,7 @@ from django.db import transaction | |||
| import unidecode | ||||
| import logging | ||||
| 
 | ||||
| from seminar.models import Skola, Resitel, Rocnik, Cislo, Problem, Reseni, PrilohaReseni, Nastaveni, Soustredeni, Soustredeni_Ucastnici, Soustredeni_Organizatori, Osoba, Organizator, Prijemce, Tema, Uloha, Konfera, KonferaNode, TextNode, UlohaVzorakNode, RocnikNode, CisloNode, TemaVCisleNode, Text, Hodnoceni, UlohaZadaniNode, Novinky, TreeNode | ||||
| from seminar.models import Skola, Resitel, Rocnik, Cislo, Problem, Reseni, PrilohaReseni, Nastaveni, Soustredeni, Soustredeni_Ucastnici, Soustredeni_Organizatori, Osoba, Organizator, Prijemce, Tema, Uloha, Konfera, TextNode, UlohaVzorakNode, RocnikNode, CisloNode, TemaVCisleNode, Text, Hodnoceni, UlohaZadaniNode, Novinky, TreeNode | ||||
| 
 | ||||
| from django.contrib.flatpages.models import FlatPage | ||||
| from django.contrib.sites.models import Site | ||||
|  | @ -339,7 +339,7 @@ def gen_konfery(size, rnd, organizatori, resitele, soustredeni): | |||
| 			nazev=rnd.choice(['Pozorování', 'Zkoumání', 'Modelování', 'Počítání', 'Zkoušení']) + rnd.choice([' vlastností', ' jevů', ' charakteristik']) + rnd.choice([' vektorových prostorů', ' kinetické terorie látek', ' molekulární biologie', ' syntentických stromů']), | ||||
| 			anotace=lorem.paragraph(), | ||||
| 			abstrakt=lorem.paragraph(), | ||||
| 			organizator=rnd.choice(organizatori), | ||||
| 			garant=rnd.choice(organizatori), | ||||
| 			soustredeni=rnd.choice(soustredeni), | ||||
| 			typ_prezentace=rnd.choice(['veletrh', 'prezentace'])) | ||||
| 		ucastnici_sous = list(konfera.soustredeni.ucastnici.all()) | ||||
|  | @ -349,9 +349,6 @@ def gen_konfery(size, rnd, organizatori, resitele, soustredeni): | |||
| 		#	Konfery_Ucastnici.objects.create(resitel=res, konfera=konfera) | ||||
| 		konfera.save() | ||||
| 		konfery.append(konfera) | ||||
| 
 | ||||
| 		konferanode = KonferaNode.objects.create(konfera=konfera) | ||||
| 		konferanode.save() | ||||
| 	return konfery | ||||
| 
 | ||||
| def gen_cisla(rnd, rocniky): | ||||
|  |  | |||
|  | @ -309,136 +309,16 @@ class ArchivView(generic.ListView): | |||
| 	def get_context_data(self, **kwargs): | ||||
| 		context = super(ArchivView, self).get_context_data(**kwargs) | ||||
| 
 | ||||
| 		vyska = 594  # px | ||||
| 		sirka = 420  # px | ||||
| 
 | ||||
| 		# první číslo z každého ročníku | ||||
| 		cisla = Cislo.objects.filter(poradi=1)	 | ||||
| 
 | ||||
| 		# op == os.path, udělá z argumentů cestu | ||||
| 		png_dir = op.join(settings.MEDIA_ROOT, "cislo", "png") | ||||
| 
 | ||||
| 		# slovník {(ročník, url obrázku)} | ||||
| 		cisla = Cislo.objects.filter(poradi=1) | ||||
| 		urls ={} | ||||
| 
 | ||||
| 		# for j, rocnik in enumerate(Rocnik.objects.all()): | ||||
| 		# 	urls_rocnik = {} | ||||
| 		# 	for i,c in enumerate(rocnik.cisla.all()): | ||||
| 		# 		if not c.pdf: | ||||
| 		# 			urls_rocnik[c.poradi] = op.join(settings.MEDIA_URL, "cislo", "png", "default.png") | ||||
| 		# 		else: | ||||
| 		# 			filename = os.path.split(c.pdf.file.name)[1].split(".")[0] | ||||
| 		# 			png_filename = "{}.png".format(filename) | ||||
| 
 | ||||
| 		# 			# Pokud obrázek neexistuje nebo není aktuální, vytvoř jej | ||||
| 		# 			png_path = op.join(png_dir, png_filename) | ||||
| 		# 			if not op.exists(png_path) or \ | ||||
| 		# 					op.getmtime(png_path) < op.getmtime(c.pdf.path): | ||||
| 
 | ||||
| 		# 				subprocess.call([ | ||||
| 		# 					"convert", | ||||
| 		# 					"-density", "300x300", | ||||
| 		# 					"-geometry", "{}x{}".format(vyska, sirka), | ||||
| 		# 					"-background", "white", | ||||
| 		# 					"-flatten", | ||||
| 		# 					"{}[0]".format(c.pdf.path),  # titulní strana | ||||
| 		# 					png_path | ||||
| 		# 				]) | ||||
| 
 | ||||
| 		# 			urls_rocnik[c.poradi] = op.join(settings.MEDIA_URL, "cislo", "png", png_filename) | ||||
| 		# 	urls[rocnik] = urls_rocnik | ||||
| 		 | ||||
| 		for i,c in enumerate(cisla): | ||||
| 				if not c.pdf: | ||||
| 					urls[c.rocnik] = op.join(settings.MEDIA_URL, "cislo", "png", "default.png") | ||||
| 				else: | ||||
| 					filename = os.path.split(c.pdf.file.name)[1].split(".")[0] | ||||
| 					png_filename = "{}.png".format(filename) | ||||
| 
 | ||||
| 					# Pokud obrázek neexistuje nebo není aktuální, vytvoř jej | ||||
| 					png_path = op.join(png_dir, png_filename) | ||||
| 					if not op.exists(png_path) or \ | ||||
| 							op.getmtime(png_path) < op.getmtime(c.pdf.path): | ||||
| 
 | ||||
| 						subprocess.call([ | ||||
| 							"convert", | ||||
| 							"-density", "300x300", | ||||
| 							"-geometry", "{}x{}".format(vyska, sirka), | ||||
| 							"-background", "white", | ||||
| 							"-flatten", | ||||
| 							"{}[0]".format(c.pdf.path),  # titulní strana | ||||
| 							png_path | ||||
| 						]) | ||||
| 
 | ||||
| 					urls[c.rocnik] = op.join(settings.MEDIA_URL, "cislo", "png", png_filename) | ||||
| 		for i, c in enumerate(cisla): | ||||
| 			if c.titulka_nahled: | ||||
| 				urls[c.rocnik] = c.titulka_nahled.url | ||||
| 			else: | ||||
| 				urls[c.rocnik] = op.join(settings.MEDIA_URL, "cislo", "png", "default.png") | ||||
| 
 | ||||
| 		context["object_list"] = urls | ||||
| 
 | ||||
| 		print(context) | ||||
| 
 | ||||
| 		# for i, c in enumerate(cisla): | ||||
| 		# 	if not c.pdf: | ||||
| 		# 		continue | ||||
| 		# 	filename = os.path.split(c.pdf.file.name)[1].split(".")[0] | ||||
| 		# 	png_filename = "{}-{}px.png".format(filename, vyska) | ||||
| 
 | ||||
| 		# 	# Pokud obrázek neexistuje nebo není aktuální, vytvoř jej | ||||
| 		# 	png_path = op.join(png_dir, png_filename) | ||||
| 		# 	if not op.exists(png_path) or \ | ||||
| 		# 			op.getmtime(png_path) < op.getmtime(c.pdf.path): | ||||
| 
 | ||||
| 		# 		subprocess.call([ | ||||
| 		# 			"convert", | ||||
| 		# 			"-density", "300x300", | ||||
| 		# 			"-geometry", "{}x{}".format(vyska, sirka), | ||||
| 		# 			"-background", "white", | ||||
| 		# 			"-flatten", | ||||
| 		# 			"-rotate", str(90 * i), | ||||
| 		# 			"{}[0]".format(c.pdf.path),  # titulní strana | ||||
| 		# 			png_path | ||||
| 		# 		]) | ||||
| 
 | ||||
| 		# 	urls.append( | ||||
| 		# 		(op.join(settings.MEDIA_URL, "cislo", "png", png_filename), c) | ||||
| 		# 	) | ||||
| 		# 	vyska, sirka = sirka, vyska / 2 | ||||
| 
 | ||||
| 		# tags = [] | ||||
| 
 | ||||
| 		# def spirala(urls, tags, idx): | ||||
| 		# 	"""Rekurzivně prochází urls a generuje strom elementů do tags""" | ||||
| 		# 	if idx >= len(urls): | ||||
| 		# 		return | ||||
| 
 | ||||
| 		# 	img_url, cislo = urls[idx] | ||||
| 		# 	tags.append( | ||||
| 		# 		"<div style='top:{}%;left:{}%;width:{}%;height:{}%;'>" | ||||
| 		# 		.format( | ||||
| 		# 			50 if idx % 4 == 2 else 0, | ||||
| 		# 			50 if idx % 4 == 1 else 0, | ||||
| 		# 			50 if idx % 2 == 1 else 100, | ||||
| 		# 			50 if idx > 0 and idx % 2 == 0 else 100 | ||||
| 		# 		) | ||||
| 		# 	) | ||||
| 		# 	tags.append("<a href='{}' title='{}'>".format( | ||||
| 		# 		cislo.verejne_url(), cislo.kod() | ||||
| 		# 	)) | ||||
| 		# 	tags.append( | ||||
| 		# 		"<img src='{}' style='top:{}%;left:{}%;width:{}%;height:{}%;'>" | ||||
| 		# 		.format( | ||||
| 		# 			img_url, | ||||
| 		# 			50 if idx % 4 == 3 else 0, | ||||
| 		# 			50 if idx % 4 == 2 else 0, | ||||
| 		# 			50 if idx % 2 == 0 else 100, | ||||
| 		# 			50 if idx % 2 == 1 else 100 | ||||
| 		# 		) | ||||
| 		# 	) | ||||
| 		# 	tags.append("</a>") | ||||
| 		# 	spirala(urls, tags, idx + 1) | ||||
| 		# 	tags.append("</div>") | ||||
| 		# spirala(urls, tags, 0) | ||||
| 
 | ||||
| 		# context["nahledy"] = "\n".join(tags) | ||||
| 		 | ||||
| 		return context | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Anet
						Anet