@ -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'), |
|||
) |