Merge branch 'master' into stable
This commit is contained in:
		
						commit
						661a940756
					
				
					 13 changed files with 299 additions and 50 deletions
				
			
		
							
								
								
									
										4
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								Makefile
									
									
									
									
									
								
							|  | @ -117,10 +117,10 @@ sync_test: sync_test_media sync_test_db | ||||||
| # Does not sync Galerie and CACHE (too huge). 
 | # Does not sync Galerie and CACHE (too huge). 
 | ||||||
| sync_local_media: | sync_local_media: | ||||||
| 	rsync -ave ssh --exclude Galerie --exclude CACHE\
 | 	rsync -ave ssh --exclude Galerie --exclude CACHE\
 | ||||||
| 		atrey.karlin.mff.cuni.cz:/akce/MaM/WWW/mamweb-prod/media/ ./media/ | 		www-mam@atrey.karlin.mff.cuni.cz:/akce/MaM/WWW/mamweb-prod/media/ ./media/ | ||||||
| # Downloads and restores production database to local database. PostgreSQL only. 
 | # Downloads and restores production database to local database. PostgreSQL only. 
 | ||||||
| sync_local_db: | sync_local_db: | ||||||
| 	scp atrey.karlin.mff.cuni.cz:`ssh atrey.karlin.mff.cuni.cz 'ls -v /akce/MaM/WWW/backups/mam-prod-*\.pgdump | tail -n 1'` \
 | 	scp www-mam@atrey.karlin.mff.cuni.cz:`ssh www-mam@atrey.karlin.mff.cuni.cz 'ls -v /akce/MaM/WWW/backups/mam-prod-*\.pgdump | tail -n 1'` \
 | ||||||
| 		./last.pgdump | 		./last.pgdump | ||||||
| 	pg_restore -c -d mam -U mam last.pgdump | 	pg_restore -c -d mam -U mam last.pgdump | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										16
									
								
								_git_hooks/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								_git_hooks/README.md
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,16 @@ | ||||||
|  | git hooks | ||||||
|  | ========= | ||||||
|  | 
 | ||||||
|  | Kontrola stylu pythoních zdrojáků pomocí flake8. Kontrolujeme jen změny, | ||||||
|  | abychom nenutili lidi dělat nesouvisející úpravy, které by rozbíjely historii | ||||||
|  | (git blame). | ||||||
|  | 
 | ||||||
|  | pre-commit | ||||||
|  | ---------- | ||||||
|  | * kontrola změn před commitnutím | ||||||
|  | * instalace: lokálně zkopírovat do .git/hooks (musí být spustitelný) | ||||||
|  | 
 | ||||||
|  | update | ||||||
|  | ------ | ||||||
|  | * kontrola změn přicházejících s pushem | ||||||
|  | * instalace: na atreyi zkopírovat do /akce/MaM/MaMweb/mamweb.git/hooks | ||||||
							
								
								
									
										6
									
								
								_git_hooks/pre-commit
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										6
									
								
								_git_hooks/pre-commit
									
									
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,6 @@ | ||||||
|  | #!/bin/sh | ||||||
|  | # | ||||||
|  | # Git hook script to verify what is about to be committed. | ||||||
|  | # Checks that the changes don't introduce new flake8 errors. | ||||||
|  | 
 | ||||||
|  | git diff --unified=1 --cached HEAD -- '*py' | flake8 --diff | ||||||
							
								
								
									
										53
									
								
								_git_hooks/update
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										53
									
								
								_git_hooks/update
									
									
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,53 @@ | ||||||
|  | #!/bin/sh | ||||||
|  | 
 | ||||||
|  | # git update hook to check that pushed changes don't introduce new flake8 | ||||||
|  | # errors | ||||||
|  | 
 | ||||||
|  | # --- Command line | ||||||
|  | refname="$1" | ||||||
|  | oldrev="$2" | ||||||
|  | newrev="$3" | ||||||
|  | 
 | ||||||
|  | # --- Safety check | ||||||
|  | if [ -z "$GIT_DIR" ]; then | ||||||
|  | 	echo "Don't run this script from the command line." >&2 | ||||||
|  | 	echo " (if you want, you could supply GIT_DIR then run" >&2 | ||||||
|  | 	echo "  $0 <ref> <oldrev> <newrev>)" >&2 | ||||||
|  | 	exit 1 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then | ||||||
|  | 	echo "usage: $0 <ref> <oldrev> <newrev>" >&2 | ||||||
|  | 	exit 1 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | TMPDIR=`mktemp -d` | ||||||
|  | TMPDIFF=`tempfile` | ||||||
|  | 
 | ||||||
|  | [ $refname != "refs/heads/master" -a $refname != "refs/heads/stable" ] && exit 0 | ||||||
|  | 
 | ||||||
|  | git diff --unified=1 $oldrev $newrev -- '*.py' >${TMPDIFF} | ||||||
|  | 
 | ||||||
|  | # there is no working tree in bare git repository, so we recreate it for flake8 | ||||||
|  | git archive $newrev | tar -x -C ${TMPDIR} | ||||||
|  | 
 | ||||||
|  | cd ${TMPDIR} | ||||||
|  | # report only errors on lines in diff | ||||||
|  | # (if threre was flake8 installed on atrey, we could just call flake8) | ||||||
|  | /akce/MaM/WWW/mamweb-test/bin/flake8 --diff <${TMPDIFF} | ||||||
|  | status=$? | ||||||
|  | if [ $status != 0 ] ; then | ||||||
|  |     echo | ||||||
|  |     echo -n "Změny, které se snažíte pushnout, obsahují kód v pythonu " | ||||||
|  |     echo -n "nevyhovující flake8 (viz výše). Opravte je a zkuste to znovu. " | ||||||
|  |     echo -n "Nezapomeňte, že můžete editovat historii (git commit --amend, " | ||||||
|  |     echo -n "git rebase -i). Pokud byste chybu příště raději odhalili už při " | ||||||
|  |     echo "commitu, zkopírujte si pre-commit hook z _git_hooks do .git/hooks." | ||||||
|  |     echo | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | rm -rf ${TMPDIR} | ||||||
|  | rm -f ${TMPDIFF} | ||||||
|  | 
 | ||||||
|  | exit $status | ||||||
							
								
								
									
										25
									
								
								korektury/migrations/0010_Pridani_odkazu_na_organizatora.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								korektury/migrations/0010_Pridani_odkazu_na_organizatora.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | from __future__ import unicode_literals | ||||||
|  | 
 | ||||||
|  | from django.db import migrations, models | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Migration(migrations.Migration): | ||||||
|  | 
 | ||||||
|  |     dependencies = [ | ||||||
|  |         ('seminar', '0041_konfery'), | ||||||
|  |         ('korektury', '0009_trizeni_korektur_v_seznamu'), | ||||||
|  |     ] | ||||||
|  | 
 | ||||||
|  |     operations = [ | ||||||
|  |         migrations.AddField( | ||||||
|  |             model_name='komentar', | ||||||
|  |             name='autor_org', | ||||||
|  |             field=models.ForeignKey(blank=True, to='seminar.Organizator', help_text='Autor koment\xe1\u0159e', null=True), | ||||||
|  |         ), | ||||||
|  |         migrations.AddField( | ||||||
|  |             model_name='oprava', | ||||||
|  |             name='autor_org', | ||||||
|  |             field=models.ForeignKey(blank=True, to='seminar.Organizator', help_text=b'Autor opravy', null=True), | ||||||
|  |         ), | ||||||
|  |     ] | ||||||
|  | @ -0,0 +1,56 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | from __future__ import unicode_literals | ||||||
|  | 
 | ||||||
|  | from django.db import migrations, models | ||||||
|  | 
 | ||||||
|  | def transform_autor(apps, schema_editor): | ||||||
|  |     print | ||||||
|  |     Organizator = apps.get_model('seminar', 'Organizator') | ||||||
|  | 
 | ||||||
|  |     # preorgovani oprav | ||||||
|  |     Oprava = apps.get_model('korektury', 'Oprava') | ||||||
|  |     for oprava in Oprava.objects.all(): | ||||||
|  |         jmeno = oprava.autor.split() | ||||||
|  |         if len(jmeno) == 2: | ||||||
|  |             try: | ||||||
|  |                 org = Organizator.objects.get(user__first_name=jmeno[0], | ||||||
|  |                                                  user__last_name=jmeno[1]) | ||||||
|  |                 oprava.autor_org = org | ||||||
|  |                 oprava.save() | ||||||
|  |             except: | ||||||
|  |                 print "Org nenalezen -- mažu korekturu" | ||||||
|  | #                oprava.delete() | ||||||
|  |         else: | ||||||
|  |             print "Org nenalezen -- mažu korekturu" | ||||||
|  |             oprava.delete() | ||||||
|  | 
 | ||||||
|  |     # preorgovani komentaru | ||||||
|  |     Komentar = apps.get_model('korektury', 'Komentar') | ||||||
|  |     for komentar in Komentar.objects.all(): | ||||||
|  |         jmeno = komentar.autor.split() | ||||||
|  |         if len(jmeno) == 2: | ||||||
|  |             try: | ||||||
|  |                 org = Organizator.objects.get(user__first_name=jmeno[0], | ||||||
|  |                                                  user__last_name=jmeno[1]) | ||||||
|  |                 komentar.autor_org = org | ||||||
|  |                 komentar.save() | ||||||
|  |             except: | ||||||
|  |                 print "Org nenalezen -- mažu korekturu" | ||||||
|  | #                oprava.delete() | ||||||
|  |         else: | ||||||
|  |             print "Org nenalezen -- mažu korekturu" | ||||||
|  |             komentar.delete() | ||||||
|  | 
 | ||||||
|  | def back(apps, schema_editor): | ||||||
|  |     pass | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Migration(migrations.Migration): | ||||||
|  | 
 | ||||||
|  |     dependencies = [ | ||||||
|  |         ('korektury', '0010_Pridani_odkazu_na_organizatora'), | ||||||
|  |     ] | ||||||
|  | 
 | ||||||
|  |     operations = [ | ||||||
|  |             migrations.RunPython(transform_autor, back), | ||||||
|  |     ] | ||||||
							
								
								
									
										22
									
								
								korektury/migrations/0012_delete_autor.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								korektury/migrations/0012_delete_autor.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,22 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | from __future__ import unicode_literals | ||||||
|  | 
 | ||||||
|  | from django.db import migrations, models | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Migration(migrations.Migration): | ||||||
|  | 
 | ||||||
|  |     dependencies = [ | ||||||
|  |         ('korektury', '0011_prevod_autora_z_charField_na_Organizator'), | ||||||
|  |     ] | ||||||
|  | 
 | ||||||
|  |     operations = [ | ||||||
|  |         migrations.RemoveField( | ||||||
|  |             model_name='komentar', | ||||||
|  |             name='autor', | ||||||
|  |         ), | ||||||
|  |         migrations.RemoveField( | ||||||
|  |             model_name='oprava', | ||||||
|  |             name='autor', | ||||||
|  |         ), | ||||||
|  |     ] | ||||||
							
								
								
									
										24
									
								
								korektury/migrations/0013_rename_autor_org.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								korektury/migrations/0013_rename_autor_org.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,24 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | from __future__ import unicode_literals | ||||||
|  | 
 | ||||||
|  | from django.db import migrations, models | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Migration(migrations.Migration): | ||||||
|  | 
 | ||||||
|  |     dependencies = [ | ||||||
|  |         ('korektury', '0012_delete_autor'), | ||||||
|  |     ] | ||||||
|  | 
 | ||||||
|  |     operations = [ | ||||||
|  |         migrations.RenameField( | ||||||
|  |             model_name='komentar', | ||||||
|  |             old_name='autor_org', | ||||||
|  |             new_name='autor', | ||||||
|  |         ), | ||||||
|  |         migrations.RenameField( | ||||||
|  |             model_name='oprava', | ||||||
|  |             old_name='autor_org', | ||||||
|  |             new_name='autor', | ||||||
|  |         ), | ||||||
|  |     ] | ||||||
|  | @ -6,13 +6,22 @@ from django.conf import settings | ||||||
| from django.utils.encoding import python_2_unicode_compatible | from django.utils.encoding import python_2_unicode_compatible | ||||||
| from django.utils.encoding import force_unicode | from django.utils.encoding import force_unicode | ||||||
| from django.core.exceptions import ObjectDoesNotExist | from django.core.exceptions import ObjectDoesNotExist | ||||||
|  | from django.utils.text import get_valid_filename | ||||||
|  | 
 | ||||||
|  | from seminar.models import Organizator | ||||||
| 
 | 
 | ||||||
| import subprocess | import subprocess | ||||||
| from reversion import revisions as reversion | from reversion import revisions as reversion | ||||||
| 
 | 
 | ||||||
| # PrilohaReseni method | from unidecode import unidecode | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| def generate_filename(self, filename): | def generate_filename(self, filename): | ||||||
|     clean = filename.replace('/','-').replace('\0', '').replace(":","_") |     clean = get_valid_filename( | ||||||
|  |         unidecode( | ||||||
|  |             filename.replace('/', '-').replace('\0', '').replace(":", "_") | ||||||
|  |         ) | ||||||
|  |     ) | ||||||
|     fname = "%s_%s" % ( |     fname = "%s_%s" % ( | ||||||
|         timezone.now().strftime('%Y-%m-%d-%H_%M'), |         timezone.now().strftime('%Y-%m-%d-%H_%M'), | ||||||
|         clean) |         clean) | ||||||
|  | @ -64,23 +73,18 @@ class KorekturovanePDF(models.Model): | ||||||
|         except ObjectDoesNotExist: |         except ObjectDoesNotExist: | ||||||
|             pass |             pass | ||||||
|         super(KorekturovanePDF, self).save() |         super(KorekturovanePDF, self).save() | ||||||
|         print("\nSaving") |  | ||||||
|         print(self.pdf.path) |  | ||||||
|         print(self.pdf.url) |  | ||||||
|         filename = os.path.split(self.pdf.file.name)[1].split(".")[0] |         filename = os.path.split(self.pdf.file.name)[1].split(".")[0] | ||||||
|         try: |         dirname = os.path.join(settings.MEDIA_ROOT, settings.KOREKTURY_IMG_DIR) | ||||||
|             os.listdir(settings.KOREKTURY_IMG_DIR) |         if not os.path.exists(dirname): | ||||||
|         except OSError: |             os.mkdir(dirname) | ||||||
|             os.mkdir(settings.KOREKTURY_IMG_DIR) |  | ||||||
|         while True: |         while True: | ||||||
|             res = subprocess.call([ |             res = subprocess.call([ | ||||||
|             "convert", |                 "convert", | ||||||
|             "-density","180x180", |                 "-density", "180x180", | ||||||
|             "-geometry"," 1024x1448", |                 "-geometry", " 1024x1448", | ||||||
|             self.pdf.path+"[%d]"%self.stran, |                 "%s[%d]" % (self.pdf.path, self.stran), | ||||||
|             os.path.join(settings.BASE_DIR, "media", |                 os.path.join(dirname, "%s-%d.png" % (filename, self.stran)) | ||||||
|                 settings.KOREKTURY_IMG_DIR,  |             ]) | ||||||
|                 "%s-%d.png"%(filename,self.stran))]) |  | ||||||
|             if res==1: |             if res==1: | ||||||
|                 break |                 break | ||||||
|             self.stran +=1 |             self.stran +=1 | ||||||
|  | @ -120,9 +124,9 @@ class Oprava(models.Model): | ||||||
|     status = models.CharField(u'stav opravy',max_length=16, choices=STATUS_CHOICES, blank=False, |     status = models.CharField(u'stav opravy',max_length=16, choices=STATUS_CHOICES, blank=False, | ||||||
|             default = STATUS_K_OPRAVE) |             default = STATUS_K_OPRAVE) | ||||||
| 
 | 
 | ||||||
| 
 |     autor = models.ForeignKey(Organizator, blank = True, | ||||||
|     # TODO: Změnit na cizí klíč do orgů |             help_text='Autor opravy', | ||||||
|     autor = models.CharField(u'autor opravy',blank = True,max_length=20, help_text='Autor opravy') |             null = True) | ||||||
|      |      | ||||||
|     text = models.TextField(u'text opravy',blank = True, help_text='Text opravy') |     text = models.TextField(u'text opravy',blank = True, help_text='Text opravy') | ||||||
| 
 | 
 | ||||||
|  | @ -150,8 +154,9 @@ class Komentar(models.Model): | ||||||
|     cas = models.DateTimeField(u'čas komentáře',default=timezone.now,help_text = 'Čas zadání komentáře') |     cas = models.DateTimeField(u'čas komentáře',default=timezone.now,help_text = 'Čas zadání komentáře') | ||||||
| 
 | 
 | ||||||
|     oprava = models.ForeignKey(Oprava) |     oprava = models.ForeignKey(Oprava) | ||||||
|     # TODO: Změnit na cizí klíč do orgů |     autor = models.ForeignKey(Organizator, blank = True, | ||||||
|     autor = models.CharField(u'autor komentáře',blank = True,max_length=20, help_text='Autor komentáře') |             help_text = u'Autor komentáře', | ||||||
|  |             null = True) | ||||||
|      |      | ||||||
|     text = models.TextField(u'text komentáře',blank = True, help_text='Text komentáře') |     text = models.TextField(u'text komentáře',blank = True, help_text='Text komentáře') | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -82,7 +82,10 @@ | ||||||
| 	<!-- /Zmenit stav PDF !--> | 	<!-- /Zmenit stav PDF !--> | ||||||
| 	<hr/> | 	<hr/> | ||||||
| 	<p> | 	<p> | ||||||
| 	Děkujeme opravovatelům: {% for autor,pocet in zasluhy.items %} {{autor}}({{pocet}}) {% endfor %}</p> |   Děkujeme opravovatelům: | ||||||
|  |     {% for autor,pocet in zasluhy.items %} | ||||||
|  |       {{autor}} ({{pocet}}){% if not forloop.last %},{% endif %} | ||||||
|  |     {% endfor %}</p> | ||||||
| 	<hr> | 	<hr> | ||||||
| 
 | 
 | ||||||
| 	{% for o in opravy %} | 	{% for o in opravy %} | ||||||
|  |  | ||||||
|  | @ -3,8 +3,10 @@ from django.shortcuts import get_object_or_404, render | ||||||
| from django.views import generic | from django.views import generic | ||||||
| from django.utils.translation import ugettext as _ | from django.utils.translation import ugettext as _ | ||||||
| from django.conf import settings | from django.conf import settings | ||||||
|  | from django.http import HttpResponseForbidden | ||||||
|  | from django.core.mail import send_mail | ||||||
| 
 | 
 | ||||||
| from .models import Oprava,Komentar,KorekturovanePDF | from .models import Oprava,Komentar,KorekturovanePDF, Organizator | ||||||
| from .forms import OpravaForm | from .forms import OpravaForm | ||||||
| 
 | 
 | ||||||
| import subprocess | import subprocess | ||||||
|  | @ -29,14 +31,17 @@ class KorekturyView(generic.TemplateView): | ||||||
|         form = self.form_class(request.POST) |         form = self.form_class(request.POST) | ||||||
|         q = request.POST |         q = request.POST | ||||||
|         scroll = q.get('scroll') |         scroll = q.get('scroll') | ||||||
|         autor = q.get('au') |  | ||||||
| 
 | 
 | ||||||
|  |         # prirazeni autora podle prihlaseni | ||||||
|  |         autor_user = request.user | ||||||
|  |         # pokud existuje ucet (user), ale neni to organizator = 403 | ||||||
|  |         autor = Organizator.objects.filter(user=autor_user).first() | ||||||
|         if not autor: |         if not autor: | ||||||
|             autor = 'anonym' |             return HttpResponseForbidden() | ||||||
|  | 
 | ||||||
|         if not scroll: |         if not scroll: | ||||||
|             scroll = 0 |             scroll = 0 | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|         action = q.get('action') |         action = q.get('action') | ||||||
|         if (action == u''):  # Přidej |         if (action == u''):  # Přidej | ||||||
|             x = int(q.get('x')) |             x = int(q.get('x')) | ||||||
|  | @ -79,6 +84,7 @@ class KorekturyView(generic.TemplateView): | ||||||
|             text = q.get('txt') |             text = q.get('txt') | ||||||
|             kom = Komentar(oprava=op,autor=autor,text=text) |             kom = Komentar(oprava=op,autor=autor,text=text) | ||||||
|             kom.save() |             kom.save() | ||||||
|  |             self.send_email_notification_komentar(op, autor, text) | ||||||
|         elif (action == u'update-comment'): |         elif (action == u'update-comment'): | ||||||
|             id = int(q.get('id')) |             id = int(q.get('id')) | ||||||
|             kom = Komentar.objects.get(id=id) |             kom = Komentar.objects.get(id=id) | ||||||
|  | @ -112,6 +118,32 @@ class KorekturyView(generic.TemplateView): | ||||||
|         context['autor'] = autor |         context['autor'] = autor | ||||||
|         return render(request, 'korektury/opraf.html',context) |         return render(request, 'korektury/opraf.html',context) | ||||||
| 
 | 
 | ||||||
|  |     def send_email_notification_komentar(self, oprava, autor, text): | ||||||
|  |         ''' Rozesle e-mail pri pridani komentare, | ||||||
|  |             ktery obsahuje text komentare. | ||||||
|  |         ''' | ||||||
|  | 
 | ||||||
|  |         # parametry e-mailu | ||||||
|  |         odkaz = "https://mam.mff.cuni.cz:1443/korektury/{}/".format(oprava.pdf.pk) | ||||||
|  |         from_email = 'korekturovatko@mam.mff.cuni.cz' | ||||||
|  |         subject = u'Nová korektura od {} v {}'.format(autor, | ||||||
|  |                                                      oprava.pdf.nazev) | ||||||
|  |         text = u"Text komentáře:\n\n{}\n\n=== Konec textu komentáře ===\n\ | ||||||
|  |                 \nodkaz do korekturovátka: {}\n\ | ||||||
|  |                 \nVaše korekturovátko\n".format(text, odkaz) | ||||||
|  | 
 | ||||||
|  |         # Prijemci e-mailu | ||||||
|  |         emails = set() | ||||||
|  |         email = oprava.autor.user.email | ||||||
|  |         if email: | ||||||
|  |             emails.add(email) | ||||||
|  |         for komentar in oprava.komentar_set.all(): | ||||||
|  |             email = komentar.autor.user.email | ||||||
|  |             if email: | ||||||
|  |                 emails.add(email) | ||||||
|  |          | ||||||
|  |         send_mail(subject, text, from_email, list(emails)) | ||||||
|  | 
 | ||||||
|     def get_context_data(self, **kwargs): |     def get_context_data(self, **kwargs): | ||||||
|         context = super(KorekturyView,self).get_context_data(**kwargs) |         context = super(KorekturyView,self).get_context_data(**kwargs) | ||||||
|         pdf = get_object_or_404(KorekturovanePDF, id=self.kwargs['pdf']) |         pdf = get_object_or_404(KorekturovanePDF, id=self.kwargs['pdf']) | ||||||
|  | @ -141,6 +173,7 @@ class KorekturyView(generic.TemplateView): | ||||||
|         context['opravy'] = opravy |         context['opravy'] = opravy | ||||||
|         context['zasluhy'] = zasluhy |         context['zasluhy'] = zasluhy | ||||||
|         return context |         return context | ||||||
|  | 
 | ||||||
|     def form_valid(self,form): |     def form_valid(self,form): | ||||||
|         return super(KorekturyView,self).form_valid(form) |         return super(KorekturyView,self).form_valid(form) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -8,6 +8,8 @@ pytz==2015.7 | ||||||
| six==1.10.0 | six==1.10.0 | ||||||
| pexpect==4.0.1 | pexpect==4.0.1 | ||||||
| traitlets==4.0.0 | traitlets==4.0.0 | ||||||
|  | Unidecode==0.4.19 | ||||||
|  | flake8==3.0.4 | ||||||
| 
 | 
 | ||||||
| # Django and modules | # Django and modules | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -12,15 +12,10 @@ from django.utils.text import slugify | ||||||
| from django.core.urlresolvers import reverse | from django.core.urlresolvers import reverse | ||||||
| from django.core.cache import cache | from django.core.cache import cache | ||||||
| from django.core.exceptions import ObjectDoesNotExist | from django.core.exceptions import ObjectDoesNotExist | ||||||
|  | from django.utils.text import get_valid_filename | ||||||
| from imagekit.models import ImageSpecField, ProcessedImageField | from imagekit.models import ImageSpecField, ProcessedImageField | ||||||
| from imagekit.processors import ResizeToFit, Transpose | from imagekit.processors import ResizeToFit, Transpose | ||||||
| 
 | 
 | ||||||
| from PIL import Image |  | ||||||
| import os |  | ||||||
| #from functools import partial |  | ||||||
| from cStringIO import StringIO |  | ||||||
| from django.core.files.base import ContentFile |  | ||||||
| 
 |  | ||||||
| from django_countries.fields import CountryField | from django_countries.fields import CountryField | ||||||
| from solo.models import SingletonModel | from solo.models import SingletonModel | ||||||
| from taggit.managers import TaggableManager | from taggit.managers import TaggableManager | ||||||
|  | @ -29,6 +24,8 @@ from reversion import revisions as reversion | ||||||
| 
 | 
 | ||||||
| from seminar.utils import roman | from seminar.utils import roman | ||||||
| 
 | 
 | ||||||
|  | from unidecode import unidecode | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| class SeminarModelBase(models.Model): | class SeminarModelBase(models.Model): | ||||||
| 
 | 
 | ||||||
|  | @ -557,28 +554,35 @@ class Reseni(SeminarModelBase): | ||||||
|         super(Reseni, self).save(*args, **kwargs) |         super(Reseni, self).save(*args, **kwargs) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| # PrilohaReseni method | def aux_generate_filename(self, filename): | ||||||
| # TODO vyresit partial, tak aby slo migrovat |     """Pomocná funkce generující ošetřený název souboru v adresáři s datem""" | ||||||
| #def generate_filename(self, filename, directory): |     clean = get_valid_filename( | ||||||
| # Django 1.9 podporuje partial |         unidecode(filename.replace('/', '-').replace('\0', '')) | ||||||
| 
 |     ) | ||||||
| def generate_filename(self, filename): |  | ||||||
|     clean = filename.replace('/','-').replace('\0', '') |  | ||||||
|     datedir = timezone.now().strftime('%Y-%m') |     datedir = timezone.now().strftime('%Y-%m') | ||||||
|     fname = "%s_%s" % ( |     fname = "%s_%s" % ( | ||||||
|         timezone.now().strftime('%Y-%m-%d-%H:%M'), |         timezone.now().strftime('%Y-%m-%d-%H:%M'), | ||||||
|         clean) |         clean) | ||||||
|     return os.path.join(settings.SEMINAR_RESENI_DIR, datedir, fname) |     return os.path.join(datedir, fname) | ||||||
|  | 
 | ||||||
|  | # Django neumí jednoduše serializovat partial nebo třídu s __call__ | ||||||
|  | # (https://docs.djangoproject.com/en/1.8/topics/migrations/), | ||||||
|  | # neprojdou pak migrace.  Takže rozlišení funkcí generujících názvy souboru | ||||||
|  | # podle adresáře řešíme takto. | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| def generate_filename_konfera(self, filename): | def generate_filename_konfera(self, filename): | ||||||
|     clean = filename.replace('/','-').replace('\0', '') |     return os.path.join( | ||||||
|     datedir = timezone.now().strftime('%Y-%m') |         settings.SEMINAR_KONFERY_DIR, | ||||||
|     fname = "%s_%s" % ( |         aux_generate_filename(self, filename) | ||||||
|         timezone.now().strftime('%Y-%m-%d-%H:%M'), |     ) | ||||||
|         clean) | 
 | ||||||
|     return os.path.join(settings.SEMINAR_KONFERY_DIR, datedir, fname) | 
 | ||||||
| # TODO vyresit partial tak, aby slo migrovat | def generate_filename(self, filename): | ||||||
| #    return os.path.join(directory, datedir, fname) |     return os.path.join( | ||||||
|  |         settings.SEMINAR_RESENI_DIR, | ||||||
|  |         aux_generate_filename(self, filename) | ||||||
|  |     ) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @reversion.register(ignore_duplicate_revisions=True) | @reversion.register(ignore_duplicate_revisions=True) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Bc. Petr Pecha
						Bc. Petr Pecha