@ -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) |
||||
|
|
@ -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,), |
||||
|
), |
||||
|
] |
After Width: | Height: | Size: 697 B |
After Width: | Height: | Size: 717 B |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 881 B |
After Width: | Height: | Size: 557 B |
After Width: | Height: | Size: 617 B |
@ -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; |
||||
|
} |
@ -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,'"') |
||||
|
); |
||||
|
}; |
||||
|
|
@ -0,0 +1 @@ |
|||||
|
* |
@ -0,0 +1 @@ |
|||||
|
* |
@ -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> |
@ -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'), |
||||
|
) |