Merge branch 'master' into stable
This commit is contained in:
		
						commit
						2eb9481d8d
					
				
					 30 changed files with 4157 additions and 140 deletions
				
			
		|  | @ -34,7 +34,7 @@ class ObrazekAdmin(admin.ModelAdmin): | |||
|    | ||||
| class GalerieAdmin(admin.ModelAdmin):  | ||||
|   model = Galerie | ||||
|   fields = ('zobrazit', 'nazev', 'titulni_obrazek', 'popis', 'galerie_up', 'soustredeni') | ||||
|   fields = ('zobrazit', 'nazev', 'titulni_obrazek', 'popis', 'galerie_up', 'soustredeni', 'poradi') | ||||
|   list_display = ('nazev', 'pk', 'datum_zmeny', 'zobrazit', 'soustredeni') | ||||
|   inlines = [GalerieInline] | ||||
|   actions = [zverejnit_fotogalerii, prepnout_fotogalerii_do_org_rezimu] | ||||
|  |  | |||
|  | @ -8,4 +8,4 @@ class KomentarForm(forms.Form): | |||
| 
 | ||||
| class NewGalerieForm(forms.Form): | ||||
|     nazev = forms.CharField(label = "Název galerie", max_length = 100) | ||||
|     popis = forms.CharField(label = "Popis", required = False, max_length = 2000, widget = forms.Textarea) | ||||
|     #popis = forms.CharField(label = "Popis", required = False, max_length = 2000, widget = forms.Textarea) | ||||
|  |  | |||
							
								
								
									
										20
									
								
								galerie/migrations/0004_nepovinna_galerie_u_obrazku.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								galerie/migrations/0004_nepovinna_galerie_u_obrazku.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,20 @@ | |||
| # -*- coding: utf-8 -*- | ||||
| from __future__ import unicode_literals | ||||
| 
 | ||||
| from django.db import models, migrations | ||||
| 
 | ||||
| 
 | ||||
| class Migration(migrations.Migration): | ||||
| 
 | ||||
|     dependencies = [ | ||||
|         ('galerie', '0003_add_galerie_poradi'), | ||||
|     ] | ||||
| 
 | ||||
|     operations = [ | ||||
|         migrations.AlterField( | ||||
|             model_name='obrazek', | ||||
|             name='galerie', | ||||
|             field=models.ForeignKey(blank=True, to='galerie.Galerie', null=True), | ||||
|             preserve_default=True, | ||||
|         ), | ||||
|     ] | ||||
|  | @ -77,7 +77,7 @@ class Obrazek(models.Model): | |||
|   popis = models.TextField('Popis', blank = True, null = True) | ||||
|   datum_vlozeni = models.DateTimeField('Datum vložení', auto_now_add = True) | ||||
|   datum = models.DateTimeField('Datum pořízení fotografie', blank = True, null = True) | ||||
|   galerie = models.ForeignKey('Galerie') | ||||
|   galerie = models.ForeignKey('Galerie', blank=True, null=True) | ||||
|   poradi = models.IntegerField('Pořadí', blank = True, null = True) | ||||
|   def __unicode__(self): | ||||
|     return self.nazev + " -- " + unicode(self.obrazek_velky.name) + " (" + str(self.datum) + ")" | ||||
|  | @ -104,7 +104,7 @@ class Obrazek(models.Model): | |||
|                               datum_int[3], datum_int[4], datum_int[5]) | ||||
|     jmeno = os.path.basename(self.obrazek_velky.file.name) | ||||
|     if not self.obrazek_stredni: | ||||
|       Obrazek._vyrobMiniaturu(original, jmeno, 600, self.obrazek_stredni) | ||||
|       Obrazek._vyrobMiniaturu(original, jmeno, 1024, self.obrazek_stredni) | ||||
|     if not self.obrazek_maly: | ||||
|       Obrazek._vyrobMiniaturu(original, jmeno, 200, self.obrazek_maly) | ||||
|     super(Obrazek, self).save() | ||||
|  |  | |||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 15 KiB | 
							
								
								
									
										
											BIN
										
									
								
								galerie/static/galerie/prvky/nahoru.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								galerie/static/galerie/prvky/nahoru.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 18 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 15 KiB | 
|  | @ -1,40 +1,85 @@ | |||
| {% extends "galerie/Base.html" %} | ||||
| 
 | ||||
| {% block title %}{% block nadpis1a %} | ||||
| {{galerie.nazev}} | Galerie | ||||
| {% endblock %}{% endblock %} | ||||
| 
 | ||||
| {% block nadpis1a %} | ||||
| {{galerie.nazev}}: {{ obrazek.popis | default:"Fotka" }} | ||||
| {% endblock %} | ||||
| 
 | ||||
| 
 | ||||
| {# přecházení mezi fotkami pomocí šipek #} | ||||
| {% block script %} | ||||
|   {% with obrazky_predchozi|last as predchozi_obrazek %} | ||||
|   {% with obrazky_dalsi|first as dalsi_obrazek %} | ||||
|       <script type="text/javascript"> | ||||
|           $(document).ready(function() { | ||||
|             $(document).keydown(function(e) { | ||||
|                 {% if predchozi_obrazek %} | ||||
|                     // doleva | ||||
|                     if (e.which == 37) { | ||||
|                         window.location.assign("../{{ predchozi_obrazek.pk }}#nahoru"); | ||||
|                     } | ||||
|                 {% endif %} | ||||
|                 {% if dalsi_obrazek %} | ||||
|                     // doprava | ||||
|                     if (e.which == 39) { | ||||
|                         window.location.assign("../{{ dalsi_obrazek.pk }}#nahoru"); | ||||
|                     } | ||||
|                 {% endif %} | ||||
|                 if (e.which == 27) { | ||||
|                     window.location.assign("../#obsah"); | ||||
|                 } | ||||
|             }); | ||||
| 
 | ||||
|             $("#prostredni").click(function() { | ||||
|                 $("#prostredni").parent().append("<p style='text-align: center;'>Prohrál jsi</p>"); | ||||
|                 $("#prostredni").off("click"); | ||||
|             }); | ||||
|         }) | ||||
|       </script> | ||||
|   {% endwith %} | ||||
|   {% endwith %} | ||||
| {% endblock %} | ||||
| 
 | ||||
| {% block content %} | ||||
|   <h1><a title="Zpět na náhled fotek" href="../#obsah">{{galerie.nazev}}</a></h1> | ||||
| 
 | ||||
| 
 | ||||
|   {# TODO šipky na přecházeni dodelat ve stylech #} | ||||
|   <h2> | ||||
|     {% for g in cesta %} | ||||
|         <a href="../../{{ g.pk }}">{{ g.nazev }}</a>{% if not forloop.last %} >{% endif %} | ||||
|     {% endfor %} | ||||
|   </h2> | ||||
| 
 | ||||
| 
 | ||||
|   <div class="galerie"> | ||||
|     {% if obrazky_predchozi %} | ||||
|       {% with obrazky_predchozi|last as predchozi_obrazek %} | ||||
|         <div id="popis"> | ||||
|           <a title="Předchozí" class="predchozi_obrazek" href="../{{predchozi_obrazek.pk}}#popis"></a> | ||||
|         <div> | ||||
|           <a title="Předchozí" class="predchozi_obrazek" href="../{{predchozi_obrazek.pk}}#nahoru"></a> | ||||
|         </div> | ||||
|       {% endwith %} | ||||
|     {% endif%} | ||||
|     <img src={{obrazek.obrazek_stredni.url}} | ||||
|     <img src="{{obrazek.obrazek_stredni.url}}" | ||||
|          height="{{vyska}}" | ||||
|          width="{{sirka}}" | ||||
|          alt="{{obrazek.popis}}" | ||||
|          class="obrazek"> | ||||
|          class="obrazek" id="nahoru"> | ||||
|           | ||||
|     {% if obrazky_dalsi %} | ||||
|       {% with obrazky_dalsi|first as dalsi_obrazek %} | ||||
|         <div> | ||||
|           <a title="Další" class="dalsi_obrazek" href="../{{dalsi_obrazek.pk}}#popis"></a> | ||||
|           <a title="Další" class="dalsi_obrazek" href="../{{dalsi_obrazek.pk}}#nahoru"></a> | ||||
|         </div> | ||||
|       {% endwith %} | ||||
|     {% endif%} | ||||
|   </div> | ||||
|   <!--<div>--> | ||||
|   <!--<a href="{{ obrazek.obrazek_velky.url }}">Obrázek v plné velikosti</a>--> | ||||
|   <!--</div>--> | ||||
| 
 | ||||
|   {# Popisek fotky #} | ||||
|   <div class="popis"> | ||||
|     {% if preview %} | ||||
|     <form action=".#popis" method="post"> | ||||
|     <form action=".#nahoru" method="post"> | ||||
|       {% csrf_token %} | ||||
|       <table> | ||||
|         <tr><td><label>Aktuální komentář:</label></td><td>{{obrazek.popis}}</td> | ||||
|  | @ -50,16 +95,37 @@ | |||
|   </div> | ||||
| 
 | ||||
|   <div class="galerie_nahledy"> | ||||
|     {% for obrazek in obrazky_predchozi %} | ||||
|     <a href="../{{obrazek.pk}}#popis"><img src="{{obrazek.obrazek_maly.url}}" height="100"></a> | ||||
|     {% endfor %} | ||||
|     {# odkaz na predchozi galerii #} | ||||
|     <div class="navigace"> | ||||
|       {% if predchozi_galerie %} | ||||
|         Předchozí: <a href="../../{{predchozi_galerie.pk}}/{{predchozi_galerie.obrazek_set.last.pk}}/#nahoru"> | ||||
|           {{predchozi_galerie}} | ||||
|         </a> | ||||
|       {% endif %} | ||||
|       {# nahledy predchozich obrazku #} | ||||
|       {% for obrazek in obrazky_predchozi %} | ||||
|       <a href="../{{obrazek.pk}}#nahoru"><img src="{{obrazek.obrazek_maly.url}}" height="100"></a> | ||||
|       {% endfor %} | ||||
|     </div> | ||||
| 
 | ||||
|     <img src={{obrazek.obrazek_maly.url}} | ||||
|          height="{{obrazek.obrazek_maly.height}}" | ||||
|               width="{{obrazek.obrazek_maly.width}}" | ||||
|                    alt="{{obrazek.popis}}" | ||||
|                         class="obrazek"> | ||||
|     {% for obrazek in obrazky_dalsi %} | ||||
|     <a href="../{{obrazek.pk}}#popis"><img src="{{obrazek.obrazek_maly.url}}" height="100"></a> | ||||
|     {% endfor %} | ||||
|        height="{{obrazek.obrazek_maly.height}}" | ||||
|        width="{{obrazek.obrazek_maly.width}}" | ||||
|        alt="{{obrazek.popis}}" | ||||
|        class="obrazek" | ||||
|        id="prostredni"> | ||||
| 
 | ||||
|     <div class="navigace"> | ||||
|       {# nahledy nasledujicich obrazku #} | ||||
|       {% for obrazek in obrazky_dalsi %} | ||||
|       <a href="../{{obrazek.pk}}#nahoru"><img src="{{obrazek.obrazek_maly.url}}" height="100"></a> | ||||
|       {% endfor %} | ||||
|       {# odkaz na nasledujici galerii #} | ||||
|       {% if nasledujici_galerie %} | ||||
|         Následující: <a href="../../{{nasledujici_galerie.pk}}/{{nasledujici_galerie.obrazek_set.first.pk}}/#nahoru"> | ||||
|           {{nasledujici_galerie}} | ||||
|         </a> | ||||
|       {% endif %} | ||||
|     </div> | ||||
|   </div> | ||||
| {% endblock %} | ||||
|  |  | |||
|  | @ -1,77 +1,106 @@ | |||
| {% extends "galerie/Base.html" %} | ||||
| 
 | ||||
| {% block title %}{% block nadpis1a %} | ||||
| {{galerie.nazev}} | Galerie TODO title | ||||
| {% endblock %}{% endblock %} | ||||
| {% block nadpis1a %} | ||||
| Galerie {{galerie.nazev}} | ||||
| {% endblock %} | ||||
| 
 | ||||
| {% block content %} | ||||
|   <h2>{{galerie.nazev}}</h2> | ||||
| 
 | ||||
|   <h2> | ||||
|     {% for g in cesta %} | ||||
|       {% if not forloop.last %} | ||||
|         <a href="../{{ g.pk }}">{{ g.nazev }}</a> > | ||||
|       {% else %} | ||||
|         {{ g.nazev }} | ||||
|       {% endif %} | ||||
|     {% endfor %} | ||||
|   </h2> | ||||
| 
 | ||||
|   {% if not obrazky %} | ||||
|    <div class="galerie_hlavicka"> | ||||
|     {% if galerie.titulni_obrazek %} | ||||
|       <img src="{{ galerie.titulni_obrazek.obrazek_stredni.url }}" style="border: 1px solid black;"> | ||||
|     {% endif %} | ||||
|    </div> | ||||
|   {% endif %} | ||||
| 
 | ||||
|   {# podgalerie #} | ||||
|   {% if podgalerie or galerie.galerie_up %} | ||||
|     <h3> PODGALERIE </h3> | ||||
|     <ul> | ||||
|     {% if galerie.galerie_up %} | ||||
|       <li><a href="../{{galerie.galerie_up.pk}}">..</a> | ||||
|     {% endif %} | ||||
|     {% for galerie in podgalerie %} | ||||
|       {% if galerie.zobrazit < 1 or user.is_staff %} | ||||
|       <li><a href="../{{galerie.pk}}">{{galerie}}</a> | ||||
|         {% if user.is_staff and galerie.zobrazit > 0 %} | ||||
|           ({{galerie.poradi}}) | ||||
|           <span class="plus"><a href="plus/{{galerie.pk}}/">+</a></span> | ||||
|           <span class="minus"><a href="minus/{{galerie.pk}}/">-</a></span> | ||||
| 
 | ||||
|     {% if sourozenci|length > 1 %} | ||||
|       {% for g in sourozenci %} | ||||
|         {% if g.pk != galerie.pk %} | ||||
|           <a href="../{{ g.pk }}">{{ g.nazev }}</a> | ||||
|         {% else %} | ||||
|           {{ g.nazev }} | ||||
|         {% endif %} | ||||
|       {% endif %} | ||||
|     {% endfor %} | ||||
|   </ul> | ||||
|         <span style="width: 1em; display: inline-block;"></span> | ||||
|       {% endfor %} | ||||
|     {% endif %} | ||||
| 
 | ||||
|     {% if podgalerie %} | ||||
|       <div class="galerie_nahledy"> | ||||
|       {% for galerie in podgalerie %} | ||||
|         <a href="../{{galerie.pk}}" class="podgalerie_nahled"> | ||||
|             {% if galerie.titulni_obrazek %} | ||||
|             {% with galerie.titulni_obrazek.obrazek_maly as obrazek %} | ||||
|             <img src="{{ obrazek.url }}" | ||||
|                 width={% widthratio obrazek.width 200 167 %} | ||||
|                 height={% widthratio obrazek.height 200 167 %} /> | ||||
|             {% endwith %} | ||||
|             {% endif %} | ||||
|             <div> | ||||
|             {{ galerie }} | ||||
|             </div> | ||||
|         </a> | ||||
|         {% if user.is_staff and galerie.zobrazit > 0 %} | ||||
|           <div class="mam-org-only-galerie"> | ||||
|             ({{galerie.poradi}}) | ||||
|             <span class="plus"><a href="plus/{{galerie.pk}}/">+</a></span> | ||||
|             <span class="minus"><a href="minus/{{galerie.pk}}/">-</a></span> | ||||
|           </div> | ||||
|         {% endif %} | ||||
|       {% endfor %} | ||||
|       </div> | ||||
|     {% endif %} | ||||
|   {% endif %} | ||||
|   {% if user.is_staff and galerie.zobrazit > 0 %} | ||||
|   <ul> | ||||
|     <li><a href="./new">VYTVOŘIT NOVOU PODGALERII </a> | ||||
|   </ul> | ||||
|   <div class="mam-org-only"> | ||||
|       <a href="./new">Vytvořit novou podgalerii </a> | ||||
|   </div> | ||||
|   {% endif %} | ||||
| 
 | ||||
|   {# obrazky v galerii #} | ||||
|   {% if obrazky %} | ||||
|   <table class="galerie_nahled"> | ||||
|   <div class="galerie_nahledy"> | ||||
|     {% for obrazek in obrazky %} | ||||
|       {% if forloop.counter|add:-1|divisibleby:3 %} | ||||
|         <tr> | ||||
|       {% endif %} | ||||
|         <td class="vystredeno"> | ||||
|           <a title="Zobrazit tuto fotografii" href="./{{obrazek.pk}}#popis" | ||||
|             class="jednoducha-galerie"> | ||||
|           <img | ||||
|         <a title="Zobrazit tuto fotografii" href="./{{obrazek.pk}}#nahoru" class="galerie_nahled"><span class="vystredeno"></span><img | ||||
|             src="{{obrazek.obrazek_maly.url}}" | ||||
|             width={% widthratio obrazek.obrazek_maly.width 200 167 %} | ||||
|             height={% widthratio obrazek.obrazek_maly.height 200 167 %} /> | ||||
|           </a> | ||||
|           <!--<a href="{{obrazek.obrazek_velky.url}}" | ||||
|             class="javascript-galerie" data-lightbox="galerie" data-title="{{obrazek.popis}}" | ||||
|             style="display: none;"> | ||||
|           <img | ||||
|             src="{{obrazek.obrazek_maly.url}}" | ||||
|             width={% widthratio obrazek.obrazek_maly.width 200 167 %} | ||||
|             height={% widthratio obrazek.obrazek_maly.height 200 167 %} /> | ||||
|           </a>--> | ||||
| 	</td> | ||||
|       {% if forloop.last %} | ||||
|         {% if not forloop.counter|divisibleby:3 %} | ||||
|           <td></td> | ||||
|         {% endif %} | ||||
|         {% if not forloop.counter|divisibleby:2 %} | ||||
|           <td></td> | ||||
|         {% endif %} | ||||
|       {% endif %} | ||||
|       {% if forloop.counter|divisibleby:3 or forloop.last %} | ||||
|         </tr> | ||||
|       {% endif %} | ||||
|         </a> | ||||
|     {% endfor %} | ||||
|   </table> | ||||
|     <br> | ||||
|   </div> | ||||
| 
 | ||||
|   <div class="galerie_predchozi_nasledujici"> | ||||
|     {% if predchozi %} | ||||
|       <div class="predchozi"> | ||||
|         <a href="../{{ predchozi.pk }}">Předchozí: {{ predchozi.nazev }}</a> | ||||
|       </div> | ||||
|     {% endif %} | ||||
|     {% if nasledujici %} | ||||
|       <div class="nasledujici"> | ||||
|         <a href="../{{ nasledujici.pk }}">Následující: {{ nasledujici.nazev }}</a> | ||||
|       </div> | ||||
|     {% endif %} | ||||
|   </div> | ||||
| 
 | ||||
|   {% else %} | ||||
|     <div class="zadne-vysledky"> | ||||
|       V galerii nejsou žádné fotky. | ||||
|     </div> | ||||
|     {% if not podgalerie %} | ||||
|       <div class="zadne-vysledky"> | ||||
|         V galerii nejsou žádné fotky. | ||||
|       </div> | ||||
|     {% endif %} | ||||
|   {% endif %} | ||||
| {% endblock content %} | ||||
|  |  | |||
|  | @ -20,23 +20,61 @@ def zobrazit(galerie, request): | |||
|             raise Http404 | ||||
|     return preview | ||||
| 
 | ||||
| 
 | ||||
| def cesta_od_korene(g): | ||||
|     """Vrátí seznam galerií od kořene ke g""" | ||||
|     cesta = [] | ||||
|     while g != None: | ||||
|         cesta.append(g) | ||||
|         g = g.galerie_up | ||||
|     return reversed(cesta) | ||||
| 
 | ||||
| 
 | ||||
| def nahled(request, pk, soustredeni): | ||||
|   """Zobrazeni nahledu vsech fotek ve skupine.""" | ||||
|   galerie = get_object_or_404(Galerie, pk=pk) | ||||
|   podgalerie = Galerie.objects.filter(galerie_up = galerie).order_by('poradi') | ||||
|   obrazky = Obrazek.objects.filter(galerie = galerie).order_by('datum') | ||||
|   preview = zobrazit(galerie, request) | ||||
|   return render(request, 'galerie/GalerieNahled.html', | ||||
|       {'galerie' : galerie, | ||||
|        'podgalerie' : podgalerie, | ||||
|        'obrazky' : obrazky, | ||||
|        'preview' : preview, | ||||
|       }) | ||||
|     """Zobrazeni nahledu vsech fotek ve skupine.""" | ||||
|     galerie = get_object_or_404(Galerie, pk=pk) | ||||
| 
 | ||||
|     podgalerie = Galerie.objects.filter(galerie_up = galerie).order_by('poradi') | ||||
|     if not request.user.is_staff: | ||||
|         podgalerie = podgalerie.filter(zobrazit__lt=1) | ||||
| 
 | ||||
|     obrazky = Obrazek.objects.filter(galerie = galerie).order_by('datum') | ||||
|     preview = zobrazit(galerie, request) | ||||
| 
 | ||||
|     sourozenci = [] | ||||
|     if galerie.galerie_up: | ||||
|         sourozenci = galerie.galerie_up.galerie_set.all().order_by('poradi') | ||||
|         if not request.user.is_staff: | ||||
|             sourozenci = sourozenci.filter(zobrazit__lt=1) | ||||
| 
 | ||||
|     predchozi = None | ||||
|     nasledujici = None | ||||
|     minuly = None | ||||
|     for g in sourozenci: | ||||
|         if g.pk == galerie.pk: | ||||
|             predchozi = minuly | ||||
|         if minuly != None and minuly.pk == galerie.pk: | ||||
|             nasledujici = g | ||||
|             break | ||||
|         minuly = g | ||||
| 
 | ||||
|     cesta = cesta_od_korene(galerie) | ||||
| 
 | ||||
|     return render(request, 'galerie/GalerieNahled.html', | ||||
|         {'galerie' : galerie, | ||||
|          'podgalerie' : podgalerie, | ||||
|          'obrazky' : obrazky, | ||||
|          'preview' : preview, | ||||
|          'cesta': cesta, | ||||
|          'sourozenci': sourozenci, | ||||
|          'predchozi': predchozi, | ||||
|          'nasledujici': nasledujici, | ||||
|         }) | ||||
| 
 | ||||
| def detail(request, pk, fotka, soustredeni): | ||||
|   """Zobrazeni nahledu fotky s id 'fotka'.""" | ||||
|   MAX_VYSKA = 600 | ||||
|   MAX_SIRKA = 600 | ||||
|   MAX_VYSKA = 900 | ||||
|   MAX_SIRKA = 900 | ||||
|   MAX_VYSKA_MALA = 100 | ||||
|   MAX_SIRKA_MALA = 200 | ||||
|   NAHLEDU = 1 | ||||
|  | @ -64,12 +102,35 @@ def detail(request, pk, fotka, soustredeni): | |||
|     # Obrazek neni v galerii/stitku. | ||||
|     raise Http404 | ||||
| 
 | ||||
|   # Nacteni okolnich obrazku. | ||||
|    | ||||
|   # Nacteni okolnich obrazku a galerii | ||||
|   # TODO vyjmout zjisteni predchozich a nasledujicich galerii | ||||
|   # a udelat z toho funkci, ktera se pouzije u nahledu | ||||
|   predchozi_galerie = None | ||||
|   nasledujici_galerie = None | ||||
|   obrazky_dalsi = obrazky[znacka+1:znacka+NAHLEDU+1] | ||||
|   if znacka > NAHLEDU: | ||||
|   if (znacka+1) > NAHLEDU: | ||||
|     obrazky_predchozi = obrazky[znacka-NAHLEDU:znacka] | ||||
|   else: | ||||
|     obrazky_predchozi = obrazky[0:znacka] | ||||
|     if galerie.poradi > 1: | ||||
|         predchozi_galerie = Galerie.objects.\ | ||||
|             filter(galerie_up=galerie.galerie_up).\ | ||||
|             filter(poradi=(galerie.poradi-1)) | ||||
|     if predchozi_galerie: | ||||
|         predchozi_galerie = predchozi_galerie[0] | ||||
|     else: | ||||
|         predchozi_galerie = None | ||||
|   if (znacka+1) == len(obrazky): | ||||
|     nasledujici_galerie = Galerie.objects.\ | ||||
|             filter(galerie_up=galerie.galerie_up).\ | ||||
|             filter(poradi=(galerie.poradi+1)) | ||||
|     if nasledujici_galerie: | ||||
|         nasledujici_galerie = nasledujici_galerie[0] | ||||
|     else: | ||||
|         nasledujici_galerie = None | ||||
| 
 | ||||
| 
 | ||||
|    | ||||
|   # Preskalovani obrazku do vybraneho prostoru. | ||||
|   vyska = obrazek.obrazek_stredni.height | ||||
|  | @ -83,6 +144,8 @@ def detail(request, pk, fotka, soustredeni): | |||
| 
 | ||||
|   return render(request, 'galerie/Galerie.html', | ||||
|       {'galerie' : galerie, | ||||
|        'predchozi_galerie' : predchozi_galerie, | ||||
|        'nasledujici_galerie' : nasledujici_galerie, | ||||
|        'obrazek' : obrazek, | ||||
|        'vyska' : vyska, | ||||
|        'sirka' : sirka, | ||||
|  | @ -90,6 +153,7 @@ def detail(request, pk, fotka, soustredeni): | |||
|        'obrazky_dalsi' : obrazky_dalsi, | ||||
|        'preview' : preview, | ||||
|        'form' : form, | ||||
|        'cesta': cesta_od_korene(galerie), | ||||
|       }) | ||||
| 
 | ||||
| 
 | ||||
|  | @ -113,7 +177,7 @@ def new_galerie(request, galerie, soustredeni): | |||
|             # vytvoreni nove galerie | ||||
|             gal = Galerie() | ||||
|             gal.nazev = form.cleaned_data['nazev'] | ||||
|             gal.popis = form.cleaned_data['popis'] | ||||
|             #gal.popis = form.cleaned_data['popis'] # popis nepouzivame | ||||
|             gal.zobrazit = 1 # galerie je v procesu vytvareni | ||||
|             ''' pokud je to podgalerie pridej nadrazenou galerii | ||||
|             a nadrazene soustredeni nechej volne, | ||||
|  |  | |||
|  | @ -57,6 +57,7 @@ TEMPLATE_LOADERS = ( | |||
| ) | ||||
| 
 | ||||
| MIDDLEWARE_CLASSES = ( | ||||
|     'reversion.middleware.RevisionMiddleware', | ||||
|     'django.contrib.sessions.middleware.SessionMiddleware', | ||||
|     'django.middleware.common.CommonMiddleware', | ||||
|     'django.middleware.csrf.CsrfViewMiddleware', | ||||
|  | @ -186,7 +187,48 @@ try: | |||
| except: | ||||
|     SECRET_KEY = '12345zmr_k53a*@f4q_+ji^o@!pgpef*5&8c7zzdqwkdlkj' | ||||
| 
 | ||||
| # Logging | ||||
| 
 | ||||
| LOGGING = { | ||||
|         'version': 1, | ||||
|         'disable_existing_loggers': False, | ||||
| 
 | ||||
|         'formatters': {  | ||||
|             'verbose': {  | ||||
|                 'format': '%(levelname)s %(asctime)s %(module)s: %(message)s'  | ||||
|                 },  | ||||
|             },  | ||||
| 
 | ||||
|         'loggers': { | ||||
| 
 | ||||
|             'django': { | ||||
|                 'handlers': ['console'], | ||||
|                 'level': 'DEBUG', | ||||
|                 }, | ||||
| 
 | ||||
|             # Catch-all logger | ||||
|             '': { | ||||
|                 'handlers': ['console'], # Add 'mail_admins' in prod and test | ||||
|                 'level': 'DEBUG', | ||||
|                 }, | ||||
| 
 | ||||
|             }, | ||||
| 
 | ||||
|         'handlers': { | ||||
| 
 | ||||
|             'console': { | ||||
|                 'level': 'WARNING', ## Set to 'DEBUG' in local | ||||
|                 'class': 'logging.StreamHandler', | ||||
|                 'formatter': 'verbose',  | ||||
|                 }, | ||||
| 
 | ||||
|             'mail_admins': { | ||||
|                 'level': 'ERROR', | ||||
|                 'class': 'django.utils.log.AdminEmailHandler', | ||||
|                 'formatter': 'verbose',  | ||||
|                 }, | ||||
|             }, | ||||
|         } | ||||
| 
 | ||||
| # MaM specific | ||||
| 
 | ||||
|  |  | |||
|  | @ -36,3 +36,12 @@ DATABASES = { | |||
|     } | ||||
| } | ||||
| 
 | ||||
| # LOGGING | ||||
| 
 | ||||
| # set to 'DEBUG' for EXTRA verbose output | ||||
| LOGGING['handlers']['console']['level'] = 'INFO' | ||||
| 
 | ||||
| # So that it is not necessary to restart the server every time a template is | ||||
| # changed | ||||
| TEMPLATE_LOADERS = ('django.template.loaders.filesystem.Loader', | ||||
|  'django.template.loaders.app_directories.Loader') | ||||
|  |  | |||
|  | @ -60,20 +60,9 @@ CSRF_COOKIE_SECURE = True | |||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| # LOGGING = { | ||||
| #     'version': 1, | ||||
| #     'disable_existing_loggers': True, | ||||
| #     'handlers': { | ||||
| #         'console': { | ||||
| #             'class': 'logging.StreamHandler', | ||||
| #         }, | ||||
| #     }, | ||||
| #     'loggers': { | ||||
| #         'django': { | ||||
| #             'handlers': ['console'], | ||||
| #             'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'), | ||||
| #         }, | ||||
| #     }, | ||||
| # } | ||||
| # LOGGING  | ||||
| 
 | ||||
| LOGGING['loggers']['']['handlers'] = ['console', 'mail_admins'] | ||||
| LOGGING['loggers']['django']['handlers'] = ['console', 'mail_admins'] | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -50,7 +50,6 @@ import os | |||
| SERVER_EMAIL = 'mamweb-test-errors@mam.mff.cuni.cz' | ||||
| ADMINS = [ | ||||
|     ('Petr Pecha', 'nejlepsitextovyeditorjevim@gmail.com'), | ||||
|     ('Tomas Gavenciak', 'gavento@gmail.com'), | ||||
| ] | ||||
| 
 | ||||
| 
 | ||||
|  | @ -59,5 +58,10 @@ ADMINS = [ | |||
| SESSION_COOKIE_SECURE = True | ||||
| CSRF_COOKIE_SECURE = True | ||||
| 
 | ||||
| # LOGGING | ||||
| 
 | ||||
| LOGGING['loggers']['']['handlers'] = ['console', 'mail_admins'] | ||||
| LOGGING['loggers']['django']['handlers'] = ['console', 'mail_admins'] | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| @import url(http://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,400,300,600&subset=latin,latin-ext); | ||||
| @import url(https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,400,300,600&subset=latin,latin-ext); | ||||
| 
 | ||||
| body { | ||||
| 	font-family: 'Open Sans', sans-serif; | ||||
|  | @ -15,6 +15,7 @@ body { | |||
|   background: #fff0d7; | ||||
|   padding: 10px;  | ||||
|   margin: 10px -10px;  | ||||
|   border: orange 2px dashed; | ||||
| } | ||||
| 
 | ||||
| table .border-r { | ||||
|  | @ -150,6 +151,10 @@ div.menu li.selected a { | |||
| 	z-index: 15px; | ||||
| } | ||||
| 
 | ||||
| h2 a:hover { | ||||
|     text-decoration: none; | ||||
| } | ||||
| 
 | ||||
| #submenu { | ||||
| 	position: relative; | ||||
| 	top: -15px; | ||||
|  | @ -440,6 +445,13 @@ div.zadani_azad_termin { | |||
| 
 | ||||
| /* galerie */ | ||||
| 
 | ||||
| /* velká fotka */ | ||||
| .galerie .obrazek { | ||||
|     max-width: 100%; | ||||
|     height: auto; | ||||
|     width: auto\9; /* ie8 */ | ||||
| } | ||||
| 
 | ||||
| .predchozi_obrazek{ | ||||
|   position: absolute; | ||||
|   z-index: 1; | ||||
|  | @ -467,27 +479,162 @@ div.zadani_azad_termin { | |||
|   background-repeat: no-repeat; | ||||
| } | ||||
| 
 | ||||
| .galerie{ | ||||
| .galerie { | ||||
|   position: relative; | ||||
|   text-align: center; | ||||
|   /*width: 100%;*/ | ||||
|   margin: 20px auto 0 auto; | ||||
| } | ||||
| 
 | ||||
| .galerie h2 { | ||||
|   text-align: center; | ||||
| } | ||||
| 
 | ||||
| .galerie_hlavicka { | ||||
|     margin: 30px auto 30px auto; | ||||
| } | ||||
| 
 | ||||
| .popis { | ||||
|   margin: 10px 10px 30px 0px; | ||||
|   text-align: center; | ||||
| } | ||||
| 
 | ||||
| #nahoru { | ||||
|   text-align: center; | ||||
| } | ||||
| 
 | ||||
| .galerie_nahledy{ | ||||
|   margin: 1em 0; | ||||
|   /*margin: 1em 0;*/ | ||||
|   margin: 0 auto 30px auto; | ||||
|   text-align: center; | ||||
|   overflow: auto; | ||||
| } | ||||
| .galerie_index{ | ||||
|   width: 100%; | ||||
| 
 | ||||
| .galerie_nahledy div.navigace { | ||||
|     display: inline-block; | ||||
|     width: 150px; | ||||
| } | ||||
| .galerie_index td{ | ||||
|   width: 50%; | ||||
| 
 | ||||
| /*.galerie_nahledy img{*/ | ||||
| /*margin: 0 10px 0 10px;*/ | ||||
| /*}*/ | ||||
| 
 | ||||
| /*.galerie_nahledy a{*/ | ||||
| /*height: 100%;*/ | ||||
| /*width: 100%;*/ | ||||
| /*}*/ | ||||
| 
 | ||||
| .galerie_nahled { /* frame */ | ||||
|   display: block; | ||||
|   position: relative; | ||||
|   float: left; | ||||
|   width: 200px; | ||||
|   height: 200px; | ||||
|   text-align: center; | ||||
|   border: solid; | ||||
|   border-width: 2px; | ||||
|   border-radius: 5px; | ||||
|   /*border-color: #ffa500;*/ | ||||
|   border-color: #ffd546; | ||||
|   /*background-color: #ffb52d;*/ | ||||
|   background-color: white; | ||||
|   white-space: nowrap; | ||||
|   margin: 10px 20px 10px 0px; | ||||
| } | ||||
| .galerie_nahled{ | ||||
|   width: 100%; | ||||
| 
 | ||||
| .galerie_nahled:hover { | ||||
|     background-color: #ffd546; | ||||
|     border-color: #ffa500; | ||||
| } | ||||
| .galerie_nahled td{ | ||||
|   width: 33%; | ||||
| 
 | ||||
| .vystredeno{ /* helper */ | ||||
|   display: inline-block; | ||||
|   height: 100%; | ||||
|   vertical-align: middle; | ||||
| } | ||||
| 
 | ||||
| .galerie_nahled img { | ||||
|   vertical-align: middle; | ||||
|   max-height: 180px; | ||||
|   max-width: 180px; | ||||
|   /*border: 1px solid white;*/ | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| .galerie_nahled img, .podgalerie_nahled img { | ||||
|     border-radius: 2px; | ||||
| } | ||||
| 
 | ||||
| .galerie_nahled div { | ||||
|     position: absolute; | ||||
|     bottom: 0px; | ||||
|     width: 100%; | ||||
|     text-align: center; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| .podgalerie_nahled { | ||||
|   display: block; | ||||
|   position: relative; | ||||
|   float: left; | ||||
|   width: 200px; | ||||
|   height: 200px; | ||||
|   text-align: center; | ||||
|   border: solid; | ||||
|   border-width: 2px; | ||||
|   border-radius: 5px; | ||||
|   border-color: #ffa500; | ||||
|   /*border-color: #ffd546;*/ | ||||
|   background-color: #ffd546; | ||||
|   /*background-color: white;*/ | ||||
|   white-space: nowrap; | ||||
|   margin: 10px 20px 10px 0px; | ||||
|   font-weight: bold; | ||||
| } | ||||
| 
 | ||||
| .podgalerie_nahled:hover { | ||||
|     background-color: #ffa500; | ||||
| } | ||||
| 
 | ||||
| .podgalerie_nahled img { | ||||
|     margin-top: 20px; | ||||
|     margin-bottom: 15px; | ||||
| } | ||||
| 
 | ||||
| /* plus a minus tlacitka */ | ||||
| .mam-org-only-galerie { | ||||
|   background: #fff0d7; | ||||
|   padding: 10px;  | ||||
|   margin: 10px 10px 10px -20px;  | ||||
|   border: orange 2px dashed; | ||||
|   float: left; | ||||
| } | ||||
| 
 | ||||
| .mam-org-only-galerie a{ | ||||
|   padding: 3px 5px; | ||||
|   margin: 5px; | ||||
|   border-radius: 20px; | ||||
|   background-color: lightblue; | ||||
|   color: black; | ||||
|   float: left; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /* Odkazy na předchozí a následující podgalerii */ | ||||
| .galerie_predchozi_nasledujici { | ||||
|     overflow: auto; | ||||
|     margin: 10px auto 10px auto; | ||||
| } | ||||
| 
 | ||||
| .galerie_predchozi_nasledujici .predchozi { | ||||
|     float: left; | ||||
| } | ||||
| 
 | ||||
| .galerie_predchozi_nasledujici .nasledujici { | ||||
|     float: right; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /* titulni stranka */ | ||||
| 
 | ||||
| .zjistit_vic{ | ||||
|  |  | |||
|  | @ -29,6 +29,9 @@ | |||
|       src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"> | ||||
|     </script> | ||||
| 
 | ||||
|     {# script specifický pro stránku #} | ||||
|     {% block script %}{% endblock %} | ||||
| 
 | ||||
|   </head> | ||||
|   <body class='{% if user.is_staff %}org-logged-in{% endif %}'> | ||||
|   {% if user.is_staff %} | ||||
|  |  | |||
							
								
								
									
										1603
									
								
								obalky/lisak.eps
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1603
									
								
								obalky/lisak.eps
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										78
									
								
								obalky/obalky-template.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								obalky/obalky-template.tex
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,78 @@ | |||
| \input czech.sty | ||||
| \input epsf | ||||
| \special{landscape} | ||||
| \nopagenumbers | ||||
| \hoffset=-1in | ||||
| \voffset=-1in | ||||
| \advance\voffset by 0.9cm | ||||
| %nove pridano, aby to fungovalo... | ||||
| \advance\hoffset by 6.5cm | ||||
| \hsize=22cm | ||||
| \vsize=16cm | ||||
| 
 | ||||
| \font\adrfonta=csssbx10 at 14pt | ||||
| \font\adrfontb=csssbx10 at 12pt | ||||
| \font\adrfontc=csss12 | ||||
| \font\tofont=csr12 at 16pt | ||||
| 
 | ||||
| \newdimen\fromskip | ||||
| \newdimen\toskip | ||||
| \fromskip=4.35cm | ||||
| \toskip=13.2cm | ||||
| 
 | ||||
| \def\first{\relax} | ||||
| 
 | ||||
| \catcode`_=13 | ||||
| %\catcode`_=12 | ||||
| 
 | ||||
| \def_{$\_$} | ||||
| 
 | ||||
| \advance\voffset by 2.5cm | ||||
| 
 | ||||
| 
 | ||||
| \def\obalka#1#2#3#4#5#6#7{ | ||||
| 
 | ||||
| \def\jmeno{#1} | ||||
| \def\prijm{#2} | ||||
| \def\skola{#3} | ||||
| \def\popis{} | ||||
| \def\first{} | ||||
| \def\ulice{#4} | ||||
| \def\PSC{#5} | ||||
| \def\mesto{#6} | ||||
| \def\stat{#7} | ||||
| \vskip-4mm\vbox to 0pt{\hbox to 0pt{\hskip1.4cm\epsfysize=2.55cm\epsfbox{lisak.eps}\hss}\vss} | ||||
| 
 | ||||
| \baselineskip=13pt | ||||
| \parindent=\fromskip | ||||
| \line{\indent\adrfonta Časopis M\&M,\hfil} | ||||
| \vskip3pt | ||||
| \line{\indent\adrfontb OVVP UK MFF\hfil} | ||||
| \vskip3pt | ||||
| \line{\indent\adrfontc Ke Karlovu 3, 121 16 Praha 2\hfil} | ||||
| \line{\indent\adrfontc Tel.: +420 221 911 235\hss} | ||||
| \line{\indent\adrfontc mam@atrey.karlin.mff.cuni.cz\hfil} | ||||
| 
 | ||||
| \vskip6.15cm | ||||
| \vbox to 0pt{\parindent=1.4cm\hsize=\toskip\advance\hsize by -1cm | ||||
| \vbox to 60pt{\vfil} \popis\vss} | ||||
| \parindent=\toskip | ||||
| \baselineskip=18pt | ||||
| \line{\indent\tofont\first\hfil} | ||||
| \line{\indent\tofont\jmeno\ \prijm\hfil} | ||||
| \ifx \skola \empty | ||||
| {} | ||||
| \else | ||||
| \line{\indent\tofont\skola\hfil} | ||||
| \fi | ||||
| \line{\indent\tofont\ulice\hfil} | ||||
| \line{\tofont\item{\PSC} \mesto\hfil} | ||||
| \vskip5pt | ||||
| \line{\indent\tofont\stat\hfil} | ||||
| 
 | ||||
| \vfil\eject | ||||
| } | ||||
| 
 | ||||
| %\obalka{Lenka}{Kopfová}{Leknínová 10}{746 01}{Opava} | ||||
| 
 | ||||
| 
 | ||||
							
								
								
									
										53
									
								
								obalky/obalky.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										53
									
								
								obalky/obalky.py
									
									
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,53 @@ | |||
| #!/usr/bin/python | ||||
| #coding: utf-8 | ||||
| 
 | ||||
| import psycopg2 | ||||
| import sys | ||||
| import subprocess | ||||
| import re | ||||
| 
 | ||||
| dbname="mam-prod" | ||||
| user="mam" | ||||
| 
 | ||||
| conn = psycopg2.connect("dbname={0} user={1}".format(dbname,user)) | ||||
| cur = conn.cursor() | ||||
| 
 | ||||
| names = [] | ||||
| 
 | ||||
| with open("obalky.sql") as qfile, open("obalky-template.tex") as texheader, open("obalky.tex","w") as texout : | ||||
|     texout.write(texheader.read()) | ||||
|     cur.execute(qfile.read()) | ||||
|     for row in cur.fetchall(): | ||||
|         (muz,jmeno,prijmeni,skola,ulice,mesto,psc,stat)=row | ||||
|         if (stat=='CZ'): | ||||
|             stat = "" | ||||
|         elif (stat=='SK'): | ||||
|             stat = "Slovenská republika" | ||||
|         else: | ||||
|             print("Neznamy stat: {}\n".format(stat)) | ||||
|         if (skola==None): | ||||
|             skola="" | ||||
|         psc = psc.replace(" ","") | ||||
|         psc = psc[0:3]+" "+psc[3:] | ||||
|          | ||||
|         texout.write("\\obalka{{{0}}}{{{1}}}{{{2}}}{{{3}}}{{{4}}}{{{5}}}{{{6}}}\n".format(jmeno,prijmeni,skola,ulice,psc,mesto,stat)) | ||||
|         names.append((jmeno,prijmeni)) | ||||
|     texout.write("\\bye\n") | ||||
| 
 | ||||
| cur.close() | ||||
| conn.close() | ||||
| 
 | ||||
| print("Spoustim csplain ...") | ||||
| output = subprocess.check_output(["csplain","obalky.tex"],stderr=subprocess.STDOUT) | ||||
| page = 0 | ||||
| for line in output.decode("utf-8").splitlines(): | ||||
|     pmatch = re.search("\[([0-9]+)\]",line) | ||||
|     if pmatch: | ||||
|         page = int(pmatch.group(1)) | ||||
|     errmatch = re.match("Overfull",line) | ||||
|     if errmatch: | ||||
|         print("Preteceni na strane",page,"u osoby",names[page][0],names[page][1]) | ||||
|          | ||||
| print("Spoustim dvipdf ...") | ||||
| subprocess.call(["dvipdf","obalky.dvi"]) | ||||
| print("Hotovo.") | ||||
							
								
								
									
										26
									
								
								obalky/obalky.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								obalky/obalky.sql
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,26 @@ | |||
| WITH akt_rocnik AS ( | ||||
| 	SELECT rocnik FROM seminar_rocniky  | ||||
| 	WHERE id=(SELECT aktualni_rocnik_id FROM seminar_nastaveni) | ||||
| ), id_rocniku AS ( | ||||
| 	SELECT id,prvni_rok  FROM seminar_rocniky  | ||||
| 	WHERE rocnik=(SELECT * FROM akt_rocnik) OR rocnik=(SELECT * FROM akt_rocnik)-1 | ||||
| ), id_cisel AS ( | ||||
| 	SELECT seminar_cisla.id FROM seminar_cisla  | ||||
| 	INNER JOIN id_rocniku ON rocnik_id=id_rocniku.id | ||||
| ), problemy AS ( | ||||
| 	SELECT seminar_problemy.id FROM seminar_problemy  | ||||
| 	INNER JOIN id_cisel ON cislo_zadani_id = id_cisel.id | ||||
| ), resitele AS( | ||||
| 	SELECT DISTINCT resitel_id FROM seminar_reseni  | ||||
| 	INNER JOIN problemy ON problem_id=problemy.id | ||||
| ) | ||||
| SELECT pohlavi_muz,jmeno,prijmeni,NULL AS skola,ulice,mesto,psc,stat FROM seminar_resitele  | ||||
| INNER JOIN resitele ON seminar_resitele.id=resitel_id | ||||
| WHERE zasilat='domu' AND rok_maturity > (SELECT MAX(prvni_rok) FROM id_rocniku) | ||||
| UNION | ||||
| SELECT res.pohlavi_muz,res.jmeno,res.prijmeni,sk.nazev,sk.ulice,sk.mesto,sk.psc,sk.stat  | ||||
| FROM seminar_resitele AS res | ||||
| INNER JOIN resitele ON res.id=resitel_id | ||||
| INNER JOIN seminar_skoly AS sk ON sk.id=skola_id | ||||
| WHERE zasilat='do_skoly' AND rok_maturity > (SELECT MAX(prvni_rok) FROM id_rocniku) | ||||
| ORDER BY prijmeni ASC, jmeno ASC | ||||
|  | @ -3,7 +3,7 @@ | |||
| from django.contrib import admin | ||||
| from django import forms | ||||
| from django.forms import widgets | ||||
| import reversion | ||||
| from reversion.admin import VersionAdmin | ||||
| from solo.admin import SingletonModelAdmin | ||||
| from ckeditor.widgets import CKEditorWidget | ||||
| from django.db.models import Count | ||||
|  | @ -165,7 +165,7 @@ class Soustredeni_UcastniciInline(admin.TabularInline): | |||
| 
 | ||||
| ### Resitel | ||||
| 
 | ||||
| class ResitelAdmin(reversion.VersionAdmin): | ||||
| class ResitelAdmin(VersionAdmin): | ||||
|     form = autocomplete_light.modelform_factory(Resitel, autocomplete_fields=['skola'], fields=['skola']) | ||||
|     fieldsets = [ | ||||
|         (None,              {'fields': ['jmeno', 'prijmeni', 'user']}), | ||||
|  | @ -192,7 +192,7 @@ admin.site.register(Resitel, ResitelAdmin) | |||
| 
 | ||||
| ### Skola | ||||
| 
 | ||||
| class SkolaAdmin(reversion.VersionAdmin): | ||||
| class SkolaAdmin(VersionAdmin): | ||||
|     fieldsets = [ | ||||
|         (None,              {'fields': ['nazev', 'kratky_nazev', 'je_zs', 'je_ss']}), | ||||
|         (u'Interní ID',     {'fields': ['aesop_id', 'izo'], 'classes': ['collapse']}), | ||||
|  | @ -209,7 +209,7 @@ admin.site.register(Skola, SkolaAdmin) | |||
| 
 | ||||
| ### Cislo | ||||
| 
 | ||||
| class CisloAdmin(reversion.VersionAdmin): | ||||
| class CisloAdmin(VersionAdmin): | ||||
|     fieldsets = [ | ||||
|         (None,              {'fields': ['cislo', 'rocnik', 'verejne_db', 'verejna_vysledkovka', 'poznamka', 'pdf']}), | ||||
|         (u'Data',           {'fields': ['datum_vydani', 'datum_deadline']}), | ||||
|  | @ -232,7 +232,7 @@ admin.site.register(Cislo, CisloAdmin) | |||
| 
 | ||||
| ### Rocnik | ||||
| 
 | ||||
| class RocnikAdmin(reversion.VersionAdmin): | ||||
| class RocnikAdmin(VersionAdmin): | ||||
|     fieldsets = [ | ||||
|         (None,              {'fields': ['rocnik', 'prvni_rok', 'exportovat']}), | ||||
|         ] | ||||
|  | @ -264,7 +264,7 @@ admin.site.register(Rocnik, RocnikAdmin) | |||
| 
 | ||||
| ### Reseni | ||||
| 
 | ||||
| class ReseniAdmin(reversion.VersionAdmin): | ||||
| class ReseniAdmin(VersionAdmin): | ||||
|     form = autocomplete_light.modelform_factory(Reseni, autocomplete_fields=['problem', 'resitel'], fields=['problem', 'resitel']) | ||||
|     fieldsets = [ | ||||
|         (None,              {'fields': ['problem', 'resitel', 'forma', 'body', 'cislo_body', 'timestamp']}), | ||||
|  | @ -299,7 +299,7 @@ class ProblemAdminForm(forms.ModelForm): | |||
|         model = Problem | ||||
|         exclude = [] | ||||
| 
 | ||||
| class ProblemAdmin(reversion.VersionAdmin): | ||||
| class ProblemAdmin(VersionAdmin): | ||||
|     form = ProblemAdminForm | ||||
|     fieldsets = [ | ||||
|         (None,              {'fields': ['nazev', 'typ', 'stav', 'autor', 'zamereni', 'body', 'timestamp', 'import_dakos_id']}), | ||||
|  | @ -310,6 +310,7 @@ class ProblemAdmin(reversion.VersionAdmin): | |||
|     list_select_related = True | ||||
|     search_fields = ['nazev', 'text_zadani', 'text_reseni', 'text_org'] | ||||
|     view_on_site = Problem.verejne_url | ||||
|     ordering = ['-timestamp'] | ||||
| 
 | ||||
|     def get_queryset(self, request): | ||||
|         qs = super(ProblemAdmin, self).get_queryset(request) | ||||
|  | @ -354,7 +355,7 @@ class SoustredeniAdminForm(forms.ModelForm): | |||
|         model = Soustredeni | ||||
|         exclude = [] | ||||
| 
 | ||||
| class SoustredeniAdmin(reversion.VersionAdmin): | ||||
| class SoustredeniAdmin(VersionAdmin): | ||||
|     form = SoustredeniAdminForm | ||||
|     fieldsets = [ | ||||
|         (None,              {'fields': ['rocnik', 'misto', 'typ', 'verejne_db', 'exportovat', 'text']}), | ||||
|  | @ -399,7 +400,7 @@ def zneverejnit_novinky(modeladmin, request, queryset): | |||
|     zneverejnit_novinky.short_description = 'Zneveřejnit vybrané novinky' | ||||
| 
 | ||||
| 
 | ||||
| class NovinkyAdmin(admin.ModelAdmin): | ||||
| class NovinkyAdmin(VersionAdmin): | ||||
|     form = NovinkyAdminForm | ||||
|     list_display = ['datum', 'autor', 'text', 'zverejneno', 'obrazek'] | ||||
|     actions = [zverejnit_novinky, zneverejnit_novinky] | ||||
|  | @ -444,7 +445,7 @@ deaktivovat_organizatory.short_description = 'Deaktivovat organizátory' | |||
| 
 | ||||
| 
 | ||||
| @admin.register(Organizator) | ||||
| class OrganizatorAdmin(admin.ModelAdmin): | ||||
| class OrganizatorAdmin(VersionAdmin): | ||||
|     list_filter = ['organizuje_do_roku'] | ||||
|     list_display = [jmeno_organizatora, je_organizator_aktivni,] | ||||
|     actions = [zaktivovat_organizatory, deaktivovat_organizatory,] | ||||
|  |  | |||
|  | @ -630,6 +630,7 @@ class Soustredeni(SeminarModelBase): | |||
|         return reverse('seminar_seznam_soustredeni') | ||||
| 
 | ||||
| 
 | ||||
| @reversion.register(ignore_duplicate_revisions=True) | ||||
| @python_2_unicode_compatible | ||||
| class Soustredeni_Ucastnici(models.Model): | ||||
| 
 | ||||
|  | @ -747,6 +748,7 @@ class Nastaveni(SingletonModel): | |||
|         return False | ||||
| 
 | ||||
| 
 | ||||
| @reversion.register(ignore_duplicate_revisions=True) | ||||
| @python_2_unicode_compatible | ||||
| class Novinky(models.Model): | ||||
|     datum = models.DateField(auto_now_add=True) | ||||
|  | @ -765,6 +767,7 @@ class Novinky(models.Model): | |||
|         verbose_name_plural = 'Novinky' | ||||
| 
 | ||||
| 
 | ||||
| @reversion.register(ignore_duplicate_revisions=True) | ||||
| @python_2_unicode_compatible | ||||
| class Organizator(models.Model): | ||||
|     user = models.OneToOneField(settings.AUTH_USER_MODEL, verbose_name='Osoba', | ||||
|  |  | |||
							
								
								
									
										1603
									
								
								seminar/static/seminar/lisak.eps
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1603
									
								
								seminar/static/seminar/lisak.eps
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										103
									
								
								seminar/templates/seminar/archiv/obalky.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								seminar/templates/seminar/archiv/obalky.tex
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,103 @@ | |||
| {% autoescape off %} | ||||
| {% load staticfiles %} | ||||
| {% load tex %} | ||||
| \input czech.sty | ||||
| \input epsf | ||||
| \special{landscape} | ||||
| \nopagenumbers | ||||
| \hoffset=-1in | ||||
| \voffset=-1in | ||||
| \advance\voffset by 0.9cm | ||||
| %nove pridano, aby to fungovalo... | ||||
| \advance\hoffset by 6.5cm | ||||
| \hsize=22cm | ||||
| \vsize=16cm | ||||
| 
 | ||||
| \font\adrfonta=csssbx10 at 14pt | ||||
| \font\adrfontb=csssbx10 at 12pt | ||||
| \font\adrfontc=csss12 | ||||
| \font\tofont=csr12 at 16pt | ||||
| 
 | ||||
| \newdimen\fromskip | ||||
| \newdimen\toskip | ||||
| \fromskip=4.35cm | ||||
| \toskip=13.2cm | ||||
| 
 | ||||
| \def\first{\relax} | ||||
| 
 | ||||
| \catcode`_=13 | ||||
| %\catcode`_=12 | ||||
| 
 | ||||
| \def_{$\_$} | ||||
| 
 | ||||
| \advance\voffset by 2.5cm | ||||
| 
 | ||||
| 
 | ||||
| \def\obalka#1#2#3#4#5#6#7{ | ||||
| 
 | ||||
| \def\jmeno{#1} | ||||
| \def\prijm{#2} | ||||
| \def\skola{#3} | ||||
| \def\popis{} | ||||
| \def\first{} | ||||
| \def\ulice{#4} | ||||
| \def\PSC{#5} | ||||
| \def\mesto{#6} | ||||
| \def\stat{#7} | ||||
| \vskip-4mm\vbox to 0pt{\hbox to 0pt{\hskip1.4cm\epsfysize=2.55cm\epsfbox{lisak.eps}\hss}\vss} | ||||
| 
 | ||||
| \baselineskip=13pt | ||||
| \parindent=\fromskip | ||||
| \line{\indent\adrfonta Časopis M\&M,\hfil} | ||||
| \vskip3pt | ||||
| \line{\indent\adrfontb OVVP UK MFF\hfil} | ||||
| \vskip3pt | ||||
| \line{\indent\adrfontc Ke Karlovu 3, 121 16 Praha 2\hfil} | ||||
| \line{\indent\adrfontc Tel.: +420 221 911 235\hss} | ||||
| \line{\indent\adrfontc mam@atrey.karlin.mff.cuni.cz\hfil} | ||||
| 
 | ||||
| \vskip6.15cm | ||||
| \vbox to 0pt{\parindent=1.4cm\hsize=\toskip\advance\hsize by -1cm | ||||
| \vbox to 60pt{\vfil} \popis\vss} | ||||
| \parindent=\toskip | ||||
| \baselineskip=18pt | ||||
| \line{\indent\tofont\first\hfil} | ||||
| \line{\indent\tofont\jmeno\ \prijm\hfil} | ||||
| \ifx \skola \empty | ||||
| {} | ||||
| \else | ||||
| \line{\indent\tofont\skola\hfil} | ||||
| \fi | ||||
| \line{\indent\tofont\ulice\hfil} | ||||
| \line{\tofont\item{\PSC} \mesto\hfil} | ||||
| \vskip5pt | ||||
| \line{\indent\tofont\stat\hfil} | ||||
| 
 | ||||
| \vfil\eject | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| {% for r in resitele %} | ||||
| 	{% spaceless %} | ||||
| 	{% if r.zasilat == "do_skoly" %}  | ||||
| 		{% if r.stat == "CZ" %} | ||||
| \obalka{{r.jmeno|sloz}}{{r.prijmeni|sloz}}{{r.skola.nazev|sloz}}{{r.skola.ulice|sloz}}{{r.skola.psc|sloz}}{{r.skola.mesto|sloz}}{{''|sloz}} | ||||
| 		{% else %} | ||||
| \obalka{{r.jmeno|sloz}}{{r.prijmeni|sloz}}{{r.skola.nazev|sloz}}{{r.skola.ulice|sloz}}{{r.skola.psc|sloz}}{{r.skola.mesto|sloz}}{{r.stat.name|sloz}} | ||||
| 		{% endif %} | ||||
| 
 | ||||
| 	{% elif r.zasilat == "domu" %} | ||||
| 		{% if r.stat == "CZ" %} | ||||
| \obalka{{r.jmeno|sloz}}{{r.prijmeni|sloz}}{{''|sloz}}{{r.ulice|sloz}}{{r.psc|sloz}}{{r.mesto|sloz}}{{''|sloz}} | ||||
| 		{% else %} | ||||
| \obalka{{r.jmeno|sloz}}{{r.prijmeni|sloz}}{{''|sloz}}{{r.ulice|sloz}}{{r.psc|sloz}}{{r.mesto|sloz}}{{r.stat.name|sloz}} | ||||
| 		{% endif %} | ||||
| 	{% else %} | ||||
| % zasilat: {{r.zasilat}} | ||||
| %\obalka{{r.jmeno|sloz}}{{r.prijmeni|sloz}}{{''|sloz}}{{r.ulice|sloz}}{{r.psc|sloz}}{{r.mesto|sloz}}{{r.stat.name|sloz}} | ||||
| 	{% endif %} | ||||
| 	{% endspaceless %} | ||||
| {% endfor %} | ||||
| \bye | ||||
| 
 | ||||
| {% endautoescape %} | ||||
							
								
								
									
										9
									
								
								seminar/templates/seminar/archiv/tituly.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								seminar/templates/seminar/archiv/tituly.tex
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,9 @@ | |||
| {% autoescape off %} | ||||
| {% load tex %} | ||||
| 
 | ||||
| {% for r in resitele %} | ||||
| 	{% spaceless %} | ||||
| \def\{{r.ascii}}{\titul{{r.titul|sloz}}\relax} | ||||
| 	{% endspaceless %} | ||||
| {% endfor %} | ||||
| {% endautoescape %} | ||||
|  | @ -43,19 +43,19 @@ | |||
|     {% for galerie in soustredeni.galerie_set.all %} | ||||
|       {% if galerie.zobrazit == 0 or user.is_staff %} | ||||
|         <li> | ||||
|           <a href="../{{soustredeni.pk}}/fotogalerie/{{galerie.pk}}">FOTOGALERIE: {{galerie}}</a> | ||||
|           <a href="../{{soustredeni.pk}}/fotogalerie/{{galerie.pk}}">Fotogalerie</a> | ||||
|           {# TODO kdyz je titulni obrazek, tak asi i titulni obrazek #} | ||||
|         </li> | ||||
|       {% endif %} | ||||
|     {% endfor %} | ||||
|   {% endif %} | ||||
| 	</ul> | ||||
|   {% if user.is_staff %} | ||||
|     <li> | ||||
|       <a href="../{{soustredeni.pk}}/fotogalerie/0/new/"> VYTVOŘIT NOVOU FOTOGALERII </a> | ||||
|     </li> | ||||
|     <div class="mam-org-only"> | ||||
|       <a href="../{{soustredeni.pk}}/fotogalerie/0/new/">Vytvořit novou fotogalerii</a> | ||||
|     </div> | ||||
|   {% endif %} | ||||
| 
 | ||||
| 	</ul> | ||||
| 
 | ||||
|         {# popis soustredeni #} | ||||
|         {% if soustredeni.text %} | ||||
|  |  | |||
							
								
								
									
										6
									
								
								seminar/templatetags/tex.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								seminar/templatetags/tex.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,6 @@ | |||
| from django import template | ||||
| register = template.Library() | ||||
| 
 | ||||
| @register.filter(name='sloz') | ||||
| def sloz(value): | ||||
|     return u"{{{}}}".format(value) | ||||
							
								
								
									
										82
									
								
								seminar/tools.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								seminar/tools.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,82 @@ | |||
| # -*- coding: utf-8 -*- | ||||
| 
 | ||||
| import logging as log | ||||
| from .models import Resitel | ||||
| import reversion | ||||
| 
 | ||||
| def merge_props(r1, r2, prop, pretend=True, smaller=False, equal=True): | ||||
|     """Merge r2.`prop` into r1.`prop`. | ||||
| 
 | ||||
|     If r1.`prop` unset, use r1.`prop`=r2.`prop`. | ||||
|     If both set and equal=True, warn if not equal. | ||||
|     If both set and smaller=True, use the smaller one. | ||||
|     With pretend=True does not modify r1. | ||||
|     """ | ||||
|     a1 = r1.__getattribute__(prop) | ||||
|     a2 = r2.__getattribute__(prop) | ||||
|     if not a1: | ||||
|         if not pretend: | ||||
|             r1.__setattr__(prop, a2) | ||||
|     elif a2: | ||||
|         if equal and a1 != a2: | ||||
|             log.warn(u"merge: Ruzna %s: %s VS %s", prop, a1, a2) | ||||
|         if smaller: | ||||
|             if not pretend: | ||||
|                 r1.__setattr__(prop, min(a1, a2)) | ||||
| 
 | ||||
| 
 | ||||
| def merge_Resitel(rbase, rmerge, pretend=True): | ||||
|     """Zahrne data a vztahy Resitele rmerge do Resitele rbase, pak smaze rmerge. | ||||
| 
 | ||||
|     Selze pro uzivatele s user!=NULL. S pretend=True nezmeni databazi. | ||||
|     """ | ||||
|     # Ma relace: skola | ||||
|     # Je v relaci: user, reseni, soustredeni_ucastnici, vysledky_base(VIEW) | ||||
| 
 | ||||
|     log.info(u"merge: %s <- %s", unicode(rbase), unicode(rmerge)) | ||||
| 
 | ||||
|     assert not rbase.user | ||||
|     assert not rmerge.user | ||||
|     assert rbase != rmerge | ||||
| 
 | ||||
|     if (rbase.jmeno != rmerge.jmeno) or (rbase.prijmeni != rmerge.prijmeni): | ||||
|         log.error(u"merge: Ruzna jmena: %s VS %s", rbase, rmerge) | ||||
|     if rbase.rok_maturity != rmerge.rok_maturity: | ||||
|         log.error(u"merge: Ruzne roky maturity: %s VS %s", rbase.rok_maturity, rmerge.rok_maturity) | ||||
| 
 | ||||
|     with reversion.create_revision(): | ||||
|         reversion.set_comment('Merge duplicitnich Resitelu: %r <- %r' % (rbase.pk, rmerge.pk)) | ||||
| 
 | ||||
|         merge_props(rbase, rmerge, 'skola', pretend=pretend) | ||||
|         merge_props(rbase, rmerge, 'datum_narozeni', pretend=pretend) | ||||
|         merge_props(rbase, rmerge, 'datum_prihlaseni', pretend=pretend) | ||||
|         merge_props(rbase, rmerge, 'datum_souhlasu_zasilani', pretend=pretend, smaller=True, equal=False) | ||||
|         merge_props(rbase, rmerge, 'datum_souhlasu_udaje', pretend=pretend, smaller=True, equal=False) | ||||
|         merge_props(rbase, rmerge, 'email', pretend=pretend) | ||||
|         if rmerge.import_mamoper_id and not pretend: | ||||
|             rbase.import_mamoper_id += ' ' + rmerge.import_mamoper_id | ||||
|         if rmerge.poznamka and not pretend: | ||||
|             rbase.poznamka += ' ' + rmerge.poznamka | ||||
|         merge_props(rbase, rmerge, 'mesto', pretend=pretend) | ||||
|         merge_props(rbase, rmerge, 'pohlavi_muz', pretend=pretend) | ||||
|         merge_props(rbase, rmerge, 'psc', pretend=pretend) | ||||
|         merge_props(rbase, rmerge, 'stat', pretend=pretend) | ||||
|         merge_props(rbase, rmerge, 'telefon', pretend=pretend) | ||||
|         merge_props(rbase, rmerge, 'ulice', pretend=pretend) | ||||
|         merge_props(rbase, rmerge, 'zasilat', pretend=pretend) | ||||
| 
 | ||||
|         for res in rmerge.reseni.all(): | ||||
|             if not pretend: | ||||
|                 res.resitel = rbase | ||||
|                 res.save() | ||||
| 
 | ||||
|         for uc in rmerge.soustredeni_ucastnici_set.all(): | ||||
|             if not pretend: | ||||
|                 uc.resitel = rbase | ||||
|                 uc.save() | ||||
| 
 | ||||
|         if not pretend: | ||||
|             rmerge.delete() | ||||
|             rbase.save() | ||||
|          | ||||
| 
 | ||||
|  | @ -18,6 +18,7 @@ urlpatterns = patterns('', | |||
|         name = 'seminar_seznam_soustredeni'), | ||||
|     url(r'^soustredeni/probehlo/(?P<soustredeni>\d+)/$', views.SoustredeniView.as_view(), name='seminar_soustredeni'), | ||||
|     url(r'^soustredeni/(?P<soustredeni>\d+)/fotogalerie/', include('galerie.urls')), | ||||
|     url(r'^soustredeni/(?P<soustredeni>\d+)/obalky.pdf', views.soustredeniObalkyView,name='seminar_soustredeni_obalky'), | ||||
| 
 | ||||
|     url(r'^zadani/aktualni/$', views.AktualniZadaniView, name='seminar_aktualni_zadani'), | ||||
|     url(r'^zadani/temata/$', views.ZadaniTemataView, name='seminar_temata'), | ||||
|  | @ -35,4 +36,8 @@ urlpatterns = patterns('', | |||
|     url(r'^aesop-export/mam-sous-(?P<datum_zacatku>[\d-]+)\.csv$', export.ExportSousView.as_view(), name='seminar_export_sous'), | ||||
|     url(r'^aesop-export/index.csv$', export.ExportIndexView.as_view(), name='seminar_export_index'), | ||||
|     url(r'^cislo/(?P<rocnik>\d+).(?P<cislo>\d+)/vysledkovka.tex$', views.CisloVysledkovkaView.as_view(), name='seminar_cislo_vysledkovka'), | ||||
|     url(r'^cislo/(?P<rocnik>\d+).(?P<cislo>\d+)/obalky.pdf$',views.cisloObalkyView, name='seminar_cislo_obalky'), | ||||
| 
 | ||||
|     url(r'^cislo/(?P<rocnik>\d+).(?P<cislo>\d+)/tituly.tex$', views.TitulyView, | ||||
|         name='seminar_cislo_titul'), | ||||
| ) | ||||
|  |  | |||
|  | @ -2,18 +2,24 @@ | |||
| 
 | ||||
| from django.shortcuts import get_object_or_404, render | ||||
| from django.http import HttpResponseRedirect | ||||
| from django.http import HttpResponse | ||||
| from django.core.urlresolvers import reverse | ||||
| from django.views import generic | ||||
| from django.utils.translation import ugettext as _ | ||||
| from django.http import Http404 | ||||
| 
 | ||||
| from .models import Problem, Cislo, Reseni, Nastaveni, Rocnik, Soustredeni, Organizator, Resitel, Novinky | ||||
| from .models import Problem, Cislo, Reseni, Nastaveni, Rocnik, Soustredeni, Organizator, Resitel, Novinky, Soustredeni_Ucastnici | ||||
| from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjakziva | ||||
| from . import utils | ||||
| 
 | ||||
| from datetime import timedelta, date, datetime | ||||
| from itertools import groupby | ||||
| 
 | ||||
| import tempfile | ||||
| import subprocess | ||||
| import shutil | ||||
| import os | ||||
| from django.conf import settings | ||||
| import unicodedata | ||||
| 
 | ||||
| def verejna_temata(rocnik): | ||||
|     """Vrací queryset zveřejněných témat v daném ročníku. | ||||
|  | @ -334,6 +340,67 @@ class RocnikVysledkovkaView(RocnikView): | |||
|     content_type = 'text/plain; charset=UTF8' | ||||
|     #vypise na stranku textovy obsah vyTeXane vysledkovky k okopirovani | ||||
| 
 | ||||
| ### Generovani obalek | ||||
| class CisloObalkyStruct: | ||||
|     resitele = None | ||||
|     rocnik = None | ||||
|     problemy = None | ||||
| 
 | ||||
| def cisloObalkyView(request,rocnik,cislo): | ||||
|     letos = CisloObalkyStruct() | ||||
|     loni = CisloObalkyStruct() | ||||
| 
 | ||||
|     letos.rocnik = Rocnik.objects.filter(rocnik = rocnik)[0] | ||||
|     loni.rocnik = Rocnik.objects.filter(rocnik = int(rocnik)-1)[0] | ||||
|     letos.problemy = Problem.objects.filter(cislo_zadani = Cislo.objects.filter(rocnik=letos.rocnik,cislo__lte = cislo)) | ||||
|     loni.problemy = Problem.objects.filter(cislo_zadani = Cislo.objects.filter(rocnik=loni.rocnik)) | ||||
|     letos.resitele = Resitel.objects.filter(reseni = Reseni.objects.filter(problem=letos.problemy)).distinct() | ||||
|     loni.resitele = Resitel.objects.filter(reseni = Reseni.objects.filter(problem=loni.problemy)).distinct() | ||||
| 
 | ||||
|     loni.resitele = loni.resitele.filter(rok_maturity__gt =  letos.rocnik.prvni_rok) | ||||
| 
 | ||||
|     if int(cislo) > 3: | ||||
|         resitele = letos.resitele | ||||
|     else: | ||||
|         resitele = list(letos.resitele) + list(loni.resitele) | ||||
|     return obalkyView(request,resitele) | ||||
| 
 | ||||
| 
 | ||||
| def obalkyView(request,resitele): | ||||
|     tex = render(request,'seminar/archiv/obalky.tex', {'resitele': resitele}).content | ||||
| 
 | ||||
|     tempdir = tempfile.mkdtemp() | ||||
|     with open(tempdir+"/obalky.tex","w") as texfile: | ||||
|         # Pokud TeX chce ISO Latin, tak se da encode nastavit | ||||
|         texfile.write(tex.decode("utf-8").encode("iso-8859-2")) | ||||
|     shutil.copy(os.path.join(settings.STATIC_ROOT, 'seminar/lisak.eps'),tempdir) | ||||
|     subprocess.call(["csplain","obalky.tex"],cwd = tempdir) | ||||
|     subprocess.call(["dvipdf","obalky.dvi"],cwd = tempdir) | ||||
| 
 | ||||
|     with open(tempdir+"/obalky.pdf","rb") as pdffile: | ||||
|         response = HttpResponse(pdffile.read(),content_type='application/pdf') | ||||
|     shutil.rmtree(tempdir) | ||||
|     return response | ||||
| 
 | ||||
| ### Tituly | ||||
| 
 | ||||
| # TODO udelat neco jako get_objects_or_404 | ||||
| def TitulyView(request, rocnik, cislo): | ||||
|     rocnik_obj = Rocnik.objects.filter(rocnik = rocnik).first() | ||||
|     resitele = Resitel.objects.filter(rok_maturity__gte = rocnik_obj.prvni_rok) | ||||
|     cislo_obj = Cislo.objects.filter(rocnik = rocnik_obj, cislo = cislo).first() | ||||
| 
 | ||||
|     for resitel in resitele: | ||||
|         vys = VysledkyKCisluOdjakziva.objects.filter(resitel = resitel, cislo = cislo_obj).first() | ||||
|         if vys == None: | ||||
|             body = 0 | ||||
|         else:  | ||||
|             body = vys.body | ||||
|         resitel.titul = resitel.get_titul(body) | ||||
|         resitel.ascii = unicodedata.normalize('NFKD',resitel.jmeno+resitel.prijmeni).encode("ascii","ignore").replace(" ","") | ||||
| 
 | ||||
|     return render(request, 'seminar/archiv/tituly.tex',{'resitele': resitele}) | ||||
| 
 | ||||
| 
 | ||||
| ### Soustredeni | ||||
| 
 | ||||
|  | @ -345,6 +412,11 @@ class SoustredeniView(generic.DetailView): | |||
|     model = Soustredeni | ||||
|     template_name = 'seminar/archiv/soustredeni.html' | ||||
| 
 | ||||
| def soustredeniObalkyView(request,soustredeni): | ||||
|     soustredeni = Soustredeni.objects.filter(id = soustredeni)[0] | ||||
|     return obalkyView(request,soustredeni.ucastnici.all()) | ||||
| 
 | ||||
| 
 | ||||
| ### Články | ||||
| 
 | ||||
| class ClankyResitelView(generic.ListView): | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Bc. Petr Pecha
						Bc. Petr Pecha