Prototyp korekturovatka v Djangu.
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						|  | @ -20,3 +20,6 @@ | ||||||
| 
 | 
 | ||||||
| # secrets | # secrets | ||||||
| /django.secret | /django.secret | ||||||
|  | 
 | ||||||
|  | # vim tmp files | ||||||
|  | *~ | ||||||
|  |  | ||||||
							
								
								
									
										13
									
								
								korektury/forms.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,13 @@ | ||||||
|  | from django import forms | ||||||
|  | 
 | ||||||
|  | class OpravaForm(forms.Form): | ||||||
|  |     text = forms.CharField(max_length=256) | ||||||
|  |     autor = forms.CharField(max_length=20) | ||||||
|  |     x = forms.IntegerField() | ||||||
|  |     y = forms.IntegerField() | ||||||
|  |     scroll = forms.CharField(max_length=256) | ||||||
|  |     pdf = forms.CharField(max_length=256) | ||||||
|  |     img_id = forms.CharField(max_length=256) | ||||||
|  |     id = forms.CharField(max_length=256) | ||||||
|  |     action = forms.CharField(max_length=256) | ||||||
|  | 
 | ||||||
							
								
								
									
										63
									
								
								korektury/migrations/0001_initial.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,63 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | from __future__ import unicode_literals | ||||||
|  | 
 | ||||||
|  | from django.db import models, migrations | ||||||
|  | import korektury.models | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Migration(migrations.Migration): | ||||||
|  | 
 | ||||||
|  |     dependencies = [ | ||||||
|  |     ] | ||||||
|  | 
 | ||||||
|  |     operations = [ | ||||||
|  |         migrations.CreateModel( | ||||||
|  |             name='KorekturovanePDF', | ||||||
|  |             fields=[ | ||||||
|  |                 ('id', models.AutoField(serialize=False, primary_key=True)), | ||||||
|  |                 ('pdf', models.FileField(upload_to=korektury.models.generate_filename, verbose_name='pdf')), | ||||||
|  |             ], | ||||||
|  |             options={ | ||||||
|  |                 'db_table': 'korekturovane_cislo', | ||||||
|  |                 'verbose_name': 'PDF k oprav\xe1m', | ||||||
|  |                 'verbose_name_plural': 'PDF k oprav\xe1m', | ||||||
|  |             }, | ||||||
|  |             bases=(models.Model,), | ||||||
|  |         ), | ||||||
|  |         migrations.CreateModel( | ||||||
|  |             name='Oprava', | ||||||
|  |             fields=[ | ||||||
|  |                 ('id', models.AutoField(serialize=False, primary_key=True)), | ||||||
|  |                 ('strana', models.IntegerField(help_text=b'Strana s opravou (od 0)', verbose_name='strana s opravou')), | ||||||
|  |                 ('x', models.IntegerField(verbose_name='x-ov\xe1 sou\u0159adnice bugu')), | ||||||
|  |                 ('y', models.IntegerField(verbose_name='y-ov\xe1 sou\u0159adnice bugu')), | ||||||
|  |                 ('status', models.CharField(default=b'k_oprave', max_length=16, verbose_name='stav opravy', choices=[(b'k_oprave', 'K oprav\u011b'), (b'opraveno', 'Opraveno'), (b'smazano', 'Smaz\xe1no')])), | ||||||
|  |                 ('autor', models.TextField(help_text=b'Autor opravy', verbose_name='autor opravy', blank=True)), | ||||||
|  |                 ('text', models.TextField(help_text=b'Text opravy', verbose_name='text opravy', blank=True)), | ||||||
|  |             ], | ||||||
|  |             options={ | ||||||
|  |                 'ordering': ['y', 'x'], | ||||||
|  |                 'db_table': 'opravy', | ||||||
|  |                 'verbose_name': 'Oprava', | ||||||
|  |                 'verbose_name_plural': 'Opravy', | ||||||
|  |             }, | ||||||
|  |             bases=(models.Model,), | ||||||
|  |         ), | ||||||
|  |         migrations.CreateModel( | ||||||
|  |             name='OpravaKomentar', | ||||||
|  |             fields=[ | ||||||
|  |                 ('id', models.AutoField(serialize=False, primary_key=True)), | ||||||
|  |                 ('cas', models.DateTimeField(help_text=b'\xc4\x8cas zad\xc3\xa1n\xc3\xad koment\xc3\xa1\xc5\x99e', verbose_name='\u010das koment\xe1\u0159e')), | ||||||
|  |                 ('autor', models.TextField(help_text=b'Autor koment\xc3\xa1\xc5\x99e', verbose_name='autor koment\xe1\u0159e', blank=True)), | ||||||
|  |                 ('text', models.TextField(help_text=b'Text koment\xc3\xa1\xc5\x99e', verbose_name='text koment\xe1\u0159e', blank=True)), | ||||||
|  |                 ('oprava', models.ForeignKey(to='korektury.Oprava')), | ||||||
|  |             ], | ||||||
|  |             options={ | ||||||
|  |                 'ordering': ['cas'], | ||||||
|  |                 'db_table': 'opravy_komentare', | ||||||
|  |                 'verbose_name': 'Koment\xe1\u0159 k oprav\u011b', | ||||||
|  |                 'verbose_name_plural': 'Koment\xe1\u0159e k oprav\u011b', | ||||||
|  |             }, | ||||||
|  |             bases=(models.Model,), | ||||||
|  |         ), | ||||||
|  |     ] | ||||||
|  | @ -1,3 +1,123 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | import os | ||||||
|  | import random | ||||||
| from django.db import models | from django.db import models | ||||||
|  | from django.contrib import auth | ||||||
|  | from django.utils import timezone | ||||||
|  | from django.conf import settings | ||||||
|  | from django.utils.encoding import python_2_unicode_compatible | ||||||
|  | from django.utils.encoding import force_unicode | ||||||
|  | from django.utils.text import slugify | ||||||
|  | from django.core.urlresolvers import reverse | ||||||
|  | from django.core.cache import cache | ||||||
|  | from imagekit.models import ImageSpecField, ProcessedImageField | ||||||
|  | from imagekit.processors import ResizeToFit, Transpose | ||||||
|  | 
 | ||||||
|  | from PIL import Image | ||||||
|  | import os | ||||||
|  | from cStringIO import StringIO | ||||||
|  | from django.core.files.base import ContentFile | ||||||
|  | 
 | ||||||
|  | from django_countries.fields import CountryField | ||||||
|  | from solo.models import SingletonModel | ||||||
|  | from taggit.managers import TaggableManager | ||||||
|  | 
 | ||||||
|  | import reversion | ||||||
|  | 
 | ||||||
|  | # PrilohaReseni method | ||||||
|  | def generate_filename(self, filename): | ||||||
|  |     clean = filename.replace('/','-').replace('\0', '') | ||||||
|  |     datedir = timezone.now().strftime('%Y-%m') | ||||||
|  |     fname = "%s_%s" % ( | ||||||
|  |         timezone.now().strftime('%Y-%m-%d-%H:%M'), | ||||||
|  |         clean) | ||||||
|  |     return os.path.join(settings.SEMINAR_RESENI_DIR, datedir, fname) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #@reversion.register(ignore_duplicate_revision=True) | ||||||
|  | #@python_2_unicode_compatible | ||||||
|  | class KorekturovanePDF(models.Model): | ||||||
|  |     class Meta: | ||||||
|  |         db_table = 'korekturovane_cislo' | ||||||
|  |         verbose_name = u'PDF k opravám' | ||||||
|  |         verbose_name_plural = u'PDF k opravám' | ||||||
|  |      | ||||||
|  |     #Interní ID | ||||||
|  |     id  = models.AutoField(primary_key = True) | ||||||
|  | 
 | ||||||
|  |     pdf = models.FileField(u'pdf', upload_to = generate_filename) | ||||||
|  | 
 | ||||||
|  |     #TODO Nepovinný foreign key k číslu | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @reversion.register(ignore_duplicate_revision=True) | ||||||
|  | @python_2_unicode_compatible | ||||||
|  | class Oprava(models.Model): | ||||||
|  |     class Meta: | ||||||
|  |         db_table = 'opravy' | ||||||
|  |         verbose_name = u'Oprava' | ||||||
|  |         verbose_name_plural = u'Opravy' | ||||||
|  |         ordering = ['y','x'] | ||||||
|  |      | ||||||
|  |     #Interní ID | ||||||
|  |     id  = models.AutoField(primary_key = True) | ||||||
|  | 
 | ||||||
|  |     #pdf = models.ForeignKey(KorekturovanePDF) | ||||||
|  | 
 | ||||||
|  |     strana = models.IntegerField(u'strana s opravou', help_text='Strana s opravou (od 0)') | ||||||
|  | 
 | ||||||
|  |     x = models.IntegerField(u'x-ová souřadnice bugu') | ||||||
|  |     y = models.IntegerField(u'y-ová souřadnice bugu') | ||||||
|  | 
 | ||||||
|  |     STATUS_K_OPRAVE = 'k_oprave' | ||||||
|  |     STATUS_OPRAVENO = 'opraveno' | ||||||
|  |     STATUS_SMAZANO = 'smazano' | ||||||
|  |     STATUS_CHOICES = ( | ||||||
|  |             (STATUS_K_OPRAVE, u'K opravě'), | ||||||
|  |             (STATUS_OPRAVENO, u'Opraveno'), | ||||||
|  |             (STATUS_SMAZANO, u'Smazáno'), | ||||||
|  |             ) | ||||||
|  |     status = models.CharField(u'stav opravy',max_length=16, choices=STATUS_CHOICES, blank=False, | ||||||
|  |             default = STATUS_K_OPRAVE) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     # TODO: Změnit na cizí klíč do orgů | ||||||
|  |     autor = models.TextField(u'autor opravy',blank = True, help_text='Autor opravy') | ||||||
|  |      | ||||||
|  |     text = models.TextField(u'text opravy',blank = True, help_text='Text opravy') | ||||||
|  | 
 | ||||||
|  | #    def __init__(self,dictionary): | ||||||
|  | #        for k,v in dictionary.items(): | ||||||
|  | #            setattr(self,k,v) | ||||||
|  | 
 | ||||||
|  |     def __str__(self): | ||||||
|  |         return force_unicode(u'%s od %s: %s',self.status,self.autor,self.text) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @reversion.register(ignore_duplicate_revision=True) | ||||||
|  | @python_2_unicode_compatible | ||||||
|  | class OpravaKomentar(models.Model): | ||||||
|  |     class Meta: | ||||||
|  |         db_table = 'opravy_komentare' | ||||||
|  |         verbose_name = u'Komentář k opravě' | ||||||
|  |         verbose_name_plural = u'Komentáře k opravě' | ||||||
|  |         ordering = ['cas'] | ||||||
|  |      | ||||||
|  |     #Interní ID | ||||||
|  |     id  = models.AutoField(primary_key = True) | ||||||
|  | 
 | ||||||
|  |     cas = models.DateTimeField(u'čas komentáře',help_text = 'Čas zadání komentáře') | ||||||
|  | 
 | ||||||
|  |     oprava = models.ForeignKey(Oprava) | ||||||
|  |     # TODO: Změnit na cizí klíč do orgů | ||||||
|  |     autor = models.TextField(u'autor komentáře',blank = True, help_text='Autor komentáře') | ||||||
|  |      | ||||||
|  |     text = models.TextField(u'text komentáře',blank = True, help_text='Text komentáře') | ||||||
|  | 
 | ||||||
|  |     def __str__(self): | ||||||
|  |         return force_unicode(u'%s od %s: %s',self.cas,self.autor,self.text) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| # Create your models here. |  | ||||||
|  |  | ||||||
							
								
								
									
										
											BIN
										
									
								
								korektury/static/korektury/imgs/check.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 697 B | 
							
								
								
									
										
											BIN
										
									
								
								korektury/static/korektury/imgs/delete.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 717 B | 
							
								
								
									
										
											BIN
										
									
								
								korektury/static/korektury/imgs/edit.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.5 KiB | 
							
								
								
									
										
											BIN
										
									
								
								korektury/static/korektury/imgs/link.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.4 KiB | 
							
								
								
									
										
											BIN
										
									
								
								korektury/static/korektury/imgs/next-gr.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 881 B | 
							
								
								
									
										
											BIN
										
									
								
								korektury/static/korektury/imgs/next.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 557 B | 
							
								
								
									
										
											BIN
										
									
								
								korektury/static/korektury/imgs/undo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 617 B | 
							
								
								
									
										105
									
								
								korektury/static/korektury/opraf.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,105 @@ | ||||||
|  | .pointer-hi,  | ||||||
|  | .pointer,  | ||||||
|  | .pointer-done,  | ||||||
|  | .pointer-done-hi { | ||||||
|  | 	position:absolute; | ||||||
|  | 	/*border-bottom-left-radius: 10px; */ | ||||||
|  | 	border-left: 2px solid yellow; | ||||||
|  | 	border-bottom: 2px solid yellow; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .pointer-done-hi,  | ||||||
|  | .pointer-hi { | ||||||
|  | 	border-width: 3px; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .pointer {  | ||||||
|  | 	border-color: #F00; /*IE*/ | ||||||
|  | 	border-color: rgba(255, 0, 0, 0.35); | ||||||
|  | } | ||||||
|  | .pointer-hi { | ||||||
|  | 	border-color: #F00; /*IE*/ | ||||||
|  | 	border-color: rgba(255, 0, 0, 1); | ||||||
|  | } | ||||||
|  | .pointer-done { | ||||||
|  | 	border-color: #00F; /*IE*/ | ||||||
|  | 	border-color: rgba(0, 0, 255, 0.2); | ||||||
|  | } | ||||||
|  | .pointer-done-hi { | ||||||
|  | 	border-color: #00F; /*IE*/ | ||||||
|  | 	border-color: rgba(0, 0, 255, 1); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | .box:hover, .box-done:hover { | ||||||
|  | 	border-width:3px; | ||||||
|  | 	margin: 0px; | ||||||
|  | } | ||||||
|  | .box, .box-done { | ||||||
|  | 	margin: 1px; | ||||||
|  | 	background-color: white; | ||||||
|  | 	width:300px; | ||||||
|  | 	/*position:absolute;*/ | ||||||
|  | 	padding: 3px; | ||||||
|  | 	border: 2px solid black; | ||||||
|  | 	border-radius: 10px; | ||||||
|  | } | ||||||
|  | .box { | ||||||
|  | 	border-color: red; | ||||||
|  | } | ||||||
|  | .box-done { | ||||||
|  | 	border-color: blue; | ||||||
|  | } | ||||||
|  | form { | ||||||
|  | 	display:inline; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .float-right{ | ||||||
|  | 	float:right; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .imgdiv { | ||||||
|  | 	position:relative; | ||||||
|  | 	left:0px; | ||||||
|  | 	top:0px; | ||||||
|  | } | ||||||
|  | #commform-div { | ||||||
|  | 	display: none; | ||||||
|  | 	position: absolute; | ||||||
|  | 	background-color: white; | ||||||
|  | 	border: 1px solid; | ||||||
|  | 	padding: 3px; | ||||||
|  | 	/* | ||||||
|  | 	width: 310; | ||||||
|  | 	height: 220; | ||||||
|  | 	*/ | ||||||
|  | 	z-index: 10; | ||||||
|  | 	border: 4px solid red; | ||||||
|  | 	border-radius: 10px; | ||||||
|  | 	background-color: white; | ||||||
|  | } | ||||||
|  | .close-button{ | ||||||
|  | 	background-color: yellow;	 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | body { | ||||||
|  | 	background-color: #b0b0ff; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | .box button, | ||||||
|  | .box img, | ||||||
|  | .box-done button, | ||||||
|  | .box-done img { | ||||||
|  | 	border: 1px solid white; | ||||||
|  | 	background-color:transparent; | ||||||
|  | 	margin:0; | ||||||
|  | 	padding: 1px; | ||||||
|  | } | ||||||
|  | .box button:hover, | ||||||
|  | .box img:hover, | ||||||
|  | .box-done img:hover, | ||||||
|  | .box-done button:hover { | ||||||
|  | 	border: 1px solid black; | ||||||
|  | } | ||||||
							
								
								
									
										213
									
								
								korektury/static/korektury/opraf.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,213 @@ | ||||||
|  | function place_comments_one_div(img_id, comments) | ||||||
|  | { | ||||||
|  | 	var img = document.getElementById(img_id); | ||||||
|  | 	if( img == null ) {  | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 	var par = img.parentNode; | ||||||
|  | 	var w = img.clientWidth; | ||||||
|  | 	var h = img.clientHeight; | ||||||
|  | 	var w_skip = 10; | ||||||
|  | 	var h_skip = 5; | ||||||
|  | 	var pointer_min_h = 30; | ||||||
|  | 
 | ||||||
|  | 	var bott_max = 0; | ||||||
|  | 	var comments_sorted = comments.sort(function (a,b) { | ||||||
|  | 		return a[2] - b[2]; | ||||||
|  | 		//pokus o hezci kladeni poiteru, ale nic moc
 | ||||||
|  | 		if( a[3] < b[3] ) {  | ||||||
|  | 			return (a[2] + pointer_min_h)- b[2]; | ||||||
|  | 		} else { | ||||||
|  | 			return (a[2] - pointer_min_h)- b[2]; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 	}); | ||||||
|  | 	//console.log("w:" + w);
 | ||||||
|  | 	for (c in comments_sorted) { | ||||||
|  | 		var id = comments_sorted[c][0]; | ||||||
|  | 		var x  = comments_sorted[c][1]; | ||||||
|  | 		var y  = comments_sorted[c][2]; | ||||||
|  | 
 | ||||||
|  | 		var el = document.getElementById(id); | ||||||
|  | 		var elp = document.getElementById(id + "-pointer"); | ||||||
|  | 
 | ||||||
|  | 		if( el == null  || elp == null ) {  | ||||||
|  | 			continue; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		par.appendChild(elp); | ||||||
|  | 		par.appendChild(el); | ||||||
|  | 
 | ||||||
|  | 		var delta_y = (y > bott_max) ?  0: bott_max - y + h_skip; | ||||||
|  | 
 | ||||||
|  | 		elp.style.left = x; | ||||||
|  | 		elp.style.top = y ; | ||||||
|  | 		elp.style.width = w - x  + w_skip; | ||||||
|  | 		elp.style.height = pointer_min_h + delta_y; | ||||||
|  | 		elp.img_id = img_id; | ||||||
|  | 		el.img_id = img_id; | ||||||
|  | 
 | ||||||
|  | 		el.style.position = 'absolute'; | ||||||
|  | 		el.style.left = w + w_skip; | ||||||
|  | 		el.style.top = y + delta_y; | ||||||
|  | 
 | ||||||
|  | 		var bott =  el.offsetTop + el.offsetHeight; | ||||||
|  | 		bott_max = ( bott_max > bott ) ?  bott_max : bott; | ||||||
|  | 
 | ||||||
|  | 		//console.log( "par.w:"  + par.style.width);
 | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | 	if( par.offsetHeight < bott_max ) { | ||||||
|  | 		//par.style.height = bott_max;
 | ||||||
|  | 		//alert("preteklo to:"+ par.offsetHeight +",mx:" + bott_max );
 | ||||||
|  | 		par.style.height = bott_max; | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ctrl-enter submits form
 | ||||||
|  | function textarea_onkey(ev) | ||||||
|  | { | ||||||
|  | 	//console.log("ev:" + ev.keyCode + "," + ev.ctrlKey);
 | ||||||
|  | 	if( (ev.keyCode  == 13 || ev.keyCode == 10 )  && ev.ctrlKey ) { | ||||||
|  | 		var form = document.getElementById('commform'); | ||||||
|  | 		if( form ) {  | ||||||
|  | 			save_scroll(form); | ||||||
|  | 			//form.action ='';
 | ||||||
|  | 			form.submit(); | ||||||
|  | 		} | ||||||
|  | 		return true; | ||||||
|  | 	} | ||||||
|  | 	return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //hide comment  form
 | ||||||
|  | function close_commform() { | ||||||
|  | 
 | ||||||
|  | 	var formdiv = document.getElementById('commform-div'); | ||||||
|  | 	if( formdiv == null ) { | ||||||
|  | 		alert("form null"); | ||||||
|  | 		return true; | ||||||
|  | 	} | ||||||
|  | 	formdiv.style.display = 'none'; | ||||||
|  | 	return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // show comment form, when clicked to image
 | ||||||
|  | function img_click(element, ev) { | ||||||
|  | 
 | ||||||
|  | 	var dx, dy; | ||||||
|  | 	var par = element.parentNode; | ||||||
|  | 	if( ev.pageX != null ) {  | ||||||
|  | 		dx = ev.pageX - par.offsetLeft; | ||||||
|  | 		dy = ev.pageY - par.offsetTop; | ||||||
|  | 	} else { //IE
 | ||||||
|  | 		dx = ev.offsetX; | ||||||
|  | 		dy = ev.offsetY; | ||||||
|  | 	} | ||||||
|  | 	var img_id = element.id; | ||||||
|  | 	if( element.img_id != null ) { | ||||||
|  | 		// click was to '-pointer'
 | ||||||
|  | 		img_id = element.img_id; | ||||||
|  | 	} | ||||||
|  | 	return show_form(img_id, dx, dy, '', '', '', ''); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // show comment form, when 'edit' button pressed
 | ||||||
|  | function box_edit(button)  | ||||||
|  | { | ||||||
|  | 	var divbox = button.parentNode.parentNode.parentNode; | ||||||
|  | 	var id = divbox.id; | ||||||
|  | 	//alert("id: " +  id);
 | ||||||
|  | 	var divpointer = document.getElementById(divbox.id + '-pointer'); | ||||||
|  | 	var text_el = document.getElementById(divbox.id + '-text'); | ||||||
|  | 	var text = text_el.innerHTML.unescapeHTML(); | ||||||
|  | 
 | ||||||
|  | 	var dx = parseInt(divpointer.style.left); | ||||||
|  | 	var dy = parseInt(divpointer.style.top); | ||||||
|  | 	//alert('not yet 2:' + text + text_el); // + divpointer.style.top "x" + divpo );
 | ||||||
|  | 	id = id.substring(2); | ||||||
|  | 	return show_form(divbox.img_id, dx, dy, id, text, 'update'); | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //fill up comment form and show him
 | ||||||
|  | function show_form(img_id, dx, dy, id, text, action) { | ||||||
|  | 	var form = document.getElementById('commform'); | ||||||
|  | 	var formdiv = document.getElementById('commform-div'); | ||||||
|  | 	var textarea = document.getElementById('commform-text'); | ||||||
|  | 	var inputX  = document.getElementById('commform-x'); | ||||||
|  | 	var inputY  = document.getElementById('commform-y'); | ||||||
|  | 	var inputImgId  = document.getElementById('commform-img-id'); | ||||||
|  | 	var inputId  = document.getElementById('commform-id'); | ||||||
|  | 	var inputAction  = document.getElementById('commform-action'); | ||||||
|  | 	var img = document.getElementById(img_id); | ||||||
|  | 
 | ||||||
|  | 	if( formdiv == null || textarea == null ) { | ||||||
|  | 		alert("form null"); | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	//form.action = "#" +  img_id;
 | ||||||
|  | 
 | ||||||
|  | 	// set hidden values
 | ||||||
|  | 	inputX.value = dx; | ||||||
|  | 	inputY.value = dy; | ||||||
|  | 	inputImgId.value = img_id; | ||||||
|  | 	inputId.value = id; | ||||||
|  | 	inputAction.value = action; | ||||||
|  | 	textarea.value = text; | ||||||
|  | 
 | ||||||
|  | 	//textarea.value = "dxy:"+ dx + "x" + dy + "\n" + 'id:' + img_id;
 | ||||||
|  | 
 | ||||||
|  | 	// show form
 | ||||||
|  | 	formdiv.style.display = 'block'; | ||||||
|  | 	formdiv.style.left = dx; | ||||||
|  | 	formdiv.style.top = dy; | ||||||
|  | 	 | ||||||
|  | 	img.parentNode.appendChild(formdiv); | ||||||
|  | 
 | ||||||
|  | 	textarea.focus(); | ||||||
|  | 
 | ||||||
|  | 	return true; | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function box_onmouseover(box, done) | ||||||
|  | { | ||||||
|  | 	var id = box.id; | ||||||
|  | 	var pointer = document.getElementById(box.id + '-pointer'); | ||||||
|  | 	pointer.className = done ? 'pointer-done-hi' : 'pointer-hi'; | ||||||
|  | 	//console.log('mouseout');
 | ||||||
|  | 		 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function box_onmouseout(box, done) | ||||||
|  | { | ||||||
|  | 	var id = box.id; | ||||||
|  | 	var pointer = document.getElementById(box.id + '-pointer'); | ||||||
|  | 	pointer.className = done ? 'pointer-done' : 'pointer'; | ||||||
|  | 
 | ||||||
|  | 	//console.log('mousein');
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function save_scroll(form) | ||||||
|  | { | ||||||
|  | 	//alert('save_scroll:' + document.body.scrollTop);
 | ||||||
|  | 	form.scroll.value =  document.body.scrollTop; | ||||||
|  | 	//alert('save_scroll:' + form.scroll.value);
 | ||||||
|  | 	 | ||||||
|  | 
 | ||||||
|  | 	return true; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | String.prototype.unescapeHTML = function () {                                        | ||||||
|  |         return(                                                                  | ||||||
|  |             this.replace(/&/g,'&').                                          | ||||||
|  |                 replace(/>/g,'>').                                            | ||||||
|  |                 replace(/</g,'<').                                            | ||||||
|  |                 replace(/"/g,'"')                                          | ||||||
|  |         );                                                                      | ||||||
|  | }; | ||||||
|  | 
 | ||||||
							
								
								
									
										1
									
								
								korektury/static/korektury/png/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1 @@ | ||||||
|  | * | ||||||
							
								
								
									
										1
									
								
								korektury/static/korektury/tmp/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1 @@ | ||||||
|  | * | ||||||
							
								
								
									
										97
									
								
								korektury/templates/korektury/opraf.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,97 @@ | ||||||
|  | <html> | ||||||
|  | 	<head> | ||||||
|  |         <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> | ||||||
|  | 	<link rel="stylesheet" type="text/css" media="screen, projection" href="/static/korektury/opraf.css" /> | ||||||
|  | 	<script src="/static/korektury/opraf.js"></script> | ||||||
|  | 	<title>Korektury 22_3_verze5.pdf</title> | ||||||
|  | 	</head> | ||||||
|  | 	<body>  | ||||||
|  | 
 | ||||||
|  | 	<h1>Korektury 22_3_verze5.pdf</h1> | ||||||
|  | 	<i>Klikni na chybu, napi¹ komentáø</i>  | | ||||||
|  | 	<a href="?action=ls">ls</a> | | ||||||
|  | 	<a href="?action=doc">help</a> |          | | ||||||
|  | 	<a href="https://mam.mff.cuni.cz/">hlavní stránka</a> | | ||||||
|  | 	<a href="https://mam.mff.cuni.cz/wiki">wiki</a> | | ||||||
|  | 	<hr/> | ||||||
|  | 
 | ||||||
|  | 	<div id="commform-div"> | ||||||
|  | 	<form action='' onsubmit='save_scroll(this)' id="commform" method="POST"> | ||||||
|  | 		{% csrf_token %} | ||||||
|  | 	  <input size="8" name="au" value="anonym"/> | ||||||
|  | 	  <input type=submit value="Oprav!"/> | ||||||
|  | 	  <button type="button" onclick="close_commform()">Zavøít</button> | ||||||
|  | 	  <br/> | ||||||
|  | 	  <textarea onkeypress="textarea_onkey(event);" id="commform-text" cols=40 rows=10 name="txt"></textarea> | ||||||
|  | 	  <br/> | ||||||
|  | 	  <input type="hidden" size="3" name="pdf" value='22_3_verze5.pdf'/> | ||||||
|  | 	  <input type="hidden" size="3" id="commform-x" name="x"/> | ||||||
|  | 	  <input type="hidden" size="3" id="commform-y" name="y"/> | ||||||
|  | 	  <input type="hidden" size="3" id="commform-img-id" name="img-id"/> | ||||||
|  | 	  <input type="hidden" size="3" id="commform-id" name="id"/> | ||||||
|  | 	  <input type="hidden" size="3" id="commform-action" name="action"/> | ||||||
|  | 	  <input type="hidden" size="3" id="commform-action" name="scroll"/> | ||||||
|  | 	</form> | ||||||
|  | 	</div> | ||||||
|  | 
 | ||||||
|  | 	{% for i in img_indexes %} | ||||||
|  | 	<div class='imgdiv'><img width='1021' height='1448' onclick='img_click(this,event)' id='img-{{i}}' src='/static/korektury/png/{{img_name}}-{{i}}.png'/></div><hr/> | ||||||
|  | 	{% endfor %} | ||||||
|  | 
 | ||||||
|  | 	<form method="post"> | ||||||
|  | 	  <input type='hidden' name='action' value='delall'/> | ||||||
|  | 	  <input type='submit' value='Smazat v¹echny komentáøe'/> | ||||||
|  | 	  <input type='hidden' name='pdf' value='22_3_verze5.pdf'/> | ||||||
|  | 	  <input type='checkbox' name='yes'/> Souhlasím se smazáním v¹ech kometáøù | ||||||
|  | 	</form> | ||||||
|  | 	<hr/> | ||||||
|  | 
 | ||||||
|  | 	Dìkujeme opravovatelùm: Marble(4), zuzka(4), Matìj(2), O(N)dra(2), Va¹ek(1), Kristý(1), Tonda(1), Jethro(1), Pe»a(1), ML(1), Lucka(1)	<hr> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | {% for o in opravy %} | ||||||
|  | 
 | ||||||
|  | <div onclick='img_click(this,event)' id='op{{o.id}}-pointer' class='pointer-done'></div> | ||||||
|  | <div name='op{{o.id}}' id='op{{o.id}}' class='box-done' onmouseover='box_onmouseover(this,1)' onmouseout='box_onmouseout(this,1)' > | ||||||
|  | 	   | ||||||
|  |           | ||||||
|  | 	<b>{{o.autor}}</b> | ||||||
|  | 	 <div class='float-right'> | ||||||
|  | 	  <form  action='' onsubmit='save_scroll(this)' method='POST'> | ||||||
|  | 	   <input type='hidden' name='pdf' value='22_3_verze5.pdf'> | ||||||
|  | 	   <input type='hidden' name='id' value='op{{o.id}}'> | ||||||
|  | 	   <input type='hidden' name='scroll'> | ||||||
|  | 	   <button type='submit' name='action' value='del' title='Sma¾ opravu'><img src="/static/korektury/imgs/delete.png"/></button> | ||||||
|  |           | ||||||
|  | 	   	   <button type='submit' name='action' value='undone' title='Oznaè jako neopravené'><img src="/static/korektury/imgs/undo.png"/></button> | ||||||
|  | 	     | ||||||
|  |           | ||||||
|  | 	   <button type='button' onclick='box_edit(this);' title='Oprav opravu'><img src="/static/korektury/imgs/edit.png"/></button> | ||||||
|  | 	   <a href='#op578'><button type='button' title='Link na opravu'><img src="/static/korektury/imgs/link.png"/></button></a> | ||||||
|  | 	   	    <a href='#op579'><img title='Dal¹í oprava' src="/static/korektury/imgs/next.png"/></button></a> | ||||||
|  | 	     | ||||||
|  | 	  </form> | ||||||
|  | 	 </div> 	 <div id='op{{o.id}}-text'>{{o.text}}</div> | ||||||
|  |           | ||||||
|  | 	</div>		<div onclick='img_click(this,event)' id='op579-pointer' class='pointer'></div> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | {% endfor %} | ||||||
|  | 
 | ||||||
|  | 		<script> | ||||||
|  | 	  {% for o in opravy %} | ||||||
|  | 		place_comments_one_div("img-{{o.strana}}", [["op{{o.id}}",{{o.x}},{{o.y}}]]); | ||||||
|  | 	  {% endfor %} | ||||||
|  | 	  | ||||||
|  | 		</script> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 		<form action='' onsubmit='save_scroll(this)' method='POST'> | ||||||
|  | 			{% csrf_token %} | ||||||
|  | 			{{ form_oprava.as_p }} | ||||||
|  | 			<input type='submit' value='Odeslat'/> | ||||||
|  | 		</form> | ||||||
|  | </body> </html> | ||||||
							
								
								
									
										7
									
								
								korektury/urls.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,7 @@ | ||||||
|  | from django.conf.urls import *  # NOQA | ||||||
|  | from django.conf.urls import patterns, url | ||||||
|  | from . import views | ||||||
|  | 
 | ||||||
|  | urlpatterns = patterns('', | ||||||
|  |     url(r'^korektury$',views.KorekturyView.as_view(),name='korektury'), | ||||||
|  | ) | ||||||
|  | @ -1,3 +1,56 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
| from django.shortcuts import render | from django.shortcuts import render | ||||||
|  | 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 django.http import HttpResponseRedirect | ||||||
|  | 
 | ||||||
|  | from .models import Oprava | ||||||
|  | from .forms import OpravaForm | ||||||
|  | 
 | ||||||
|  | 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 | ||||||
|  | 
 | ||||||
|  | ### Korektury | ||||||
|  | class KorekturyView(generic.TemplateView): | ||||||
|  |     model = Oprava | ||||||
|  |     template_name = 'korektury/opraf.html' | ||||||
|  |     form_class = OpravaForm | ||||||
|  | 
 | ||||||
|  |     def post(self, request, *args, **kwargs): | ||||||
|  |         form = self.form_class(request.POST) | ||||||
|  |         q = request.POST | ||||||
|  |         x = int(q.get('x')) | ||||||
|  |         y = int(q.get('y')) | ||||||
|  |         autor = q.get('au') | ||||||
|  |         text = q.get('txt') | ||||||
|  |         strana = int(q.get('img-id')[4:]) | ||||||
|  |         scroll = q.get('scroll') | ||||||
|  | 
 | ||||||
|  |         oprava = Oprava(x=x,y=y, autor=autor, text=text, strana=strana) | ||||||
|  |         oprava.save() | ||||||
|  |   | ||||||
|  |         return HttpResponseRedirect(reverse('korektury')+"?scroll=%s"%(scroll)) | ||||||
|  | #        return render(request, 'seminar/opraf.html',self.get_context_data()) | ||||||
|  | #        return HttpResponse(u'Oprav: %d,x: %d y: %d, autor: %s, text: %s, strana: %d'%( | ||||||
|  | #            len(Oprava.objects.all()),x,y,autor,text,strana)) | ||||||
|  |     def get_context_data(self, **kwargs): | ||||||
|  |         context = super(KorekturyView,self).get_context_data(**kwargs) | ||||||
|  |         context['img_name'] = "22_3_verze5" | ||||||
|  |         context['img_indexes'] = range(27)  | ||||||
|  |         context['form_oprava'] = OpravaForm() | ||||||
|  |         context['opravy'] = Oprava.objects.all() | ||||||
|  |         return context | ||||||
|  |     def form_valid(self,form): | ||||||
|  |         return super(KorekturyView,self).form_valid(form) | ||||||
| 
 | 
 | ||||||
| # Create your views here. |  | ||||||
|  |  | ||||||
|  | @ -117,6 +117,7 @@ INSTALLED_APPS = ( | ||||||
|     'mamweb', |     'mamweb', | ||||||
|     'seminar', |     'seminar', | ||||||
|     'galerie', |     'galerie', | ||||||
|  |     'korektury', | ||||||
| 
 | 
 | ||||||
|     # Admin upravy: |     # Admin upravy: | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -15,6 +15,9 @@ urlpatterns = patterns('', | ||||||
|     # Seminarova aplikace (ma vlastni podadresare) |     # Seminarova aplikace (ma vlastni podadresare) | ||||||
|     url(r'^', include('seminar.urls')), |     url(r'^', include('seminar.urls')), | ||||||
|      |      | ||||||
|  |     # Korekturovaci aplikace (ma vlastni podadresare) | ||||||
|  |     url(r'^', include('korektury.urls')), | ||||||
|  | 
 | ||||||
|     # Comments (interni i verejne) |     # Comments (interni i verejne) | ||||||
|     url(r'^comments_dj/', include('django_comments.urls')), |     url(r'^comments_dj/', include('django_comments.urls')), | ||||||
|     url(r'^comments_fl/', include('fluent_comments.urls')), |     url(r'^comments_fl/', include('fluent_comments.urls')), | ||||||
|  |  | ||||||