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:
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,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')),
|
||||||
|
|