Zacatky dynamickeho korekturovatka.
This commit is contained in:
parent
8671822ca0
commit
e000dd2353
5 changed files with 496 additions and 136 deletions
|
@ -2,6 +2,7 @@ body,
|
||||||
.adding{
|
.adding{
|
||||||
background: #f3f3f3;
|
background: #f3f3f3;
|
||||||
color: black;
|
color: black;
|
||||||
|
overflow: auto;
|
||||||
}
|
}
|
||||||
.comitting
|
.comitting
|
||||||
{
|
{
|
||||||
|
@ -23,6 +24,7 @@ img{background:white;}
|
||||||
/*border-bottom-left-radius: 10px; */
|
/*border-bottom-left-radius: 10px; */
|
||||||
border-left: 2px solid yellow;
|
border-left: 2px solid yellow;
|
||||||
border-bottom: 2px solid yellow;
|
border-bottom: 2px solid yellow;
|
||||||
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pointer-done-hi,
|
.pointer-done-hi,
|
||||||
|
|
|
@ -4,54 +4,58 @@ function place_comments_one_div(img_id, comments)
|
||||||
if( img == null ) {
|
if( img == null ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var par = img.parentNode;
|
var par = $(img.parentNode);
|
||||||
var w = img.clientWidth;
|
var w = img.clientWidth;
|
||||||
var h = img.clientHeight;
|
var h = img.clientHeight;
|
||||||
var w_skip = 10;
|
var w_skip = 10;
|
||||||
var h_skip = 5;
|
var h_skip = 5;
|
||||||
var pointer_min_h = 30;
|
var pointer_min_h = 10;
|
||||||
|
|
||||||
var bott_max = 0;
|
var bott_max = 0;
|
||||||
var comments_sorted = comments.sort(function (a,b) {
|
var comments_sorted = comments.sort(function (a,b) {
|
||||||
return a[2] - b[2];
|
return a.y - b.y;
|
||||||
//pokus o hezci kladeni poiteru, ale nic moc
|
//pokus o hezci kladeni poiteru, ale nic moc
|
||||||
if( a[3] < b[3] ) {
|
if( a.x < b.x ) {
|
||||||
return (a[2] + pointer_min_h)- b[2];
|
return (a.y + pointer_min_h)- b.y;
|
||||||
} else {
|
} else {
|
||||||
return (a[2] - pointer_min_h)- b[2];
|
return (a.y - pointer_min_h)- b.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
//console.log("w:" + w);
|
//console.log("w:" + w);
|
||||||
for (c in comments_sorted) {
|
for (var c of comments_sorted) {
|
||||||
var id = comments_sorted[c][0];
|
var id = c.id;
|
||||||
var x = comments_sorted[c][1];
|
var x = c.x;
|
||||||
var y = comments_sorted[c][2];
|
var y = c.y;
|
||||||
|
|
||||||
var el = document.getElementById(id);
|
var elp;
|
||||||
var elp = document.getElementById(id + "-pointer");
|
var el;
|
||||||
|
|
||||||
|
[elp, el] = create_corr_div(c);
|
||||||
|
|
||||||
if( el == null || elp == null ) {
|
if( el == null || elp == null ) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
par.appendChild(elp);
|
par.append(elp);
|
||||||
par.appendChild(el);
|
par.append(el);
|
||||||
|
|
||||||
var delta_y = (y > bott_max) ? 0: bott_max - y + h_skip;
|
var delta_y = (y > bott_max) ? 0: bott_max - y + h_skip;
|
||||||
|
|
||||||
elp.style.left = x;
|
elp.css({
|
||||||
elp.style.top = y ;
|
left: x,
|
||||||
elp.style.width = w - x + w_skip;
|
top: y,
|
||||||
elp.style.height = pointer_min_h + delta_y;
|
width : w - x + w_skip,
|
||||||
elp.img_id = img_id;
|
height : pointer_min_h + delta_y});
|
||||||
el.img_id = img_id;
|
//elp.img_id = img_id;
|
||||||
|
//el.img_id = img_id;
|
||||||
|
|
||||||
el.style.position = 'absolute';
|
el.css({
|
||||||
el.style.left = w + w_skip;
|
position: 'absolute',
|
||||||
el.style.top = y + delta_y;
|
left: w + w_skip,
|
||||||
|
top: y + delta_y});
|
||||||
|
|
||||||
var bott = el.offsetTop + el.offsetHeight;
|
var bott = el.position().top + el.height() + 10;
|
||||||
bott_max = ( bott_max > bott ) ? bott_max : bott;
|
bott_max = ( bott_max > bott ) ? bott_max : bott;
|
||||||
|
|
||||||
//console.log( "par.w:" + par.style.width);
|
//console.log( "par.w:" + par.style.width);
|
||||||
|
@ -268,3 +272,249 @@ String.prototype.unescapeHTML = function () {
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
$(function() {
|
||||||
|
|
||||||
|
|
||||||
|
// This function gets cookie with a given name
|
||||||
|
function getCookie(name) {
|
||||||
|
var cookieValue = null;
|
||||||
|
if (document.cookie && document.cookie != '') {
|
||||||
|
var cookies = document.cookie.split(';');
|
||||||
|
for (var i = 0; i < cookies.length; i++) {
|
||||||
|
var cookie = jQuery.trim(cookies[i]);
|
||||||
|
// Does this cookie string begin with the name we want?
|
||||||
|
if (cookie.substring(0, name.length + 1) == (name + '=')) {
|
||||||
|
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cookieValue;
|
||||||
|
}
|
||||||
|
var csrftoken = getCookie('csrftoken');
|
||||||
|
|
||||||
|
/*
|
||||||
|
The functions below will create a header with csrftoken
|
||||||
|
*/
|
||||||
|
|
||||||
|
function csrfSafeMethod(method) {
|
||||||
|
// these HTTP methods do not require CSRF protection
|
||||||
|
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
|
||||||
|
}
|
||||||
|
function sameOrigin(url) {
|
||||||
|
// test that a given url is a same-origin URL
|
||||||
|
// url could be relative or scheme relative or absolute
|
||||||
|
var host = document.location.host; // host + port
|
||||||
|
var protocol = document.location.protocol;
|
||||||
|
var sr_origin = '//' + host;
|
||||||
|
var origin = protocol + sr_origin;
|
||||||
|
// Allow absolute or scheme relative URLs to same origin
|
||||||
|
return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||
|
||||||
|
(url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||
|
||||||
|
// or any other URL that isn't scheme relative or absolute i.e relative.
|
||||||
|
!(/^(\/\/|http:|https:).*/.test(url));
|
||||||
|
}
|
||||||
|
|
||||||
|
$.ajaxSetup({
|
||||||
|
beforeSend: function(xhr, settings) {
|
||||||
|
if (!csrfSafeMethod(settings.type) && sameOrigin(settings.url)) {
|
||||||
|
// Send the token to same-origin, relative URLs only.
|
||||||
|
// Send the token only if the method warrants CSRF protection
|
||||||
|
// Using the CSRFToken value acquired earlier
|
||||||
|
xhr.setRequestHeader("X-CSRFToken", csrftoken);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
// AJAX for posting
|
||||||
|
function create_post(inputs) {
|
||||||
|
console.log("create post is working!"); // sanity check
|
||||||
|
console.log(inputs);
|
||||||
|
var dict = {};
|
||||||
|
$.each(inputs,function(i,field){dict[field.name]=field.value})
|
||||||
|
$.ajax({
|
||||||
|
url : "request/", // the endpoint
|
||||||
|
type : "POST", // http method
|
||||||
|
data : dict, // data sent with the post request
|
||||||
|
|
||||||
|
// handle a successful response
|
||||||
|
success : function(json) {
|
||||||
|
alert("Success");
|
||||||
|
// $('#post-text').val(''); // remove the value from the input
|
||||||
|
console.log(json); // log the returned json to the console
|
||||||
|
console.log("success"); // another sanity check
|
||||||
|
},
|
||||||
|
|
||||||
|
// handle a non-successful response
|
||||||
|
error : function(xhr,errmsg,err) {
|
||||||
|
alert("Fail");
|
||||||
|
// $('#results').html("<div class='alert-box alert radius' data-alert>Oops! We have encountered an error: "+errmsg+
|
||||||
|
// " <a href='#' class='close'>×</a></div>"); // add the error to the dom
|
||||||
|
console.log(xhr.status + ": " + xhr.responseText); // provide a bit more info about the error to the console
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
function create_corr_div(corr){
|
||||||
|
/*
|
||||||
|
<div onclick='img_click(this,event)'
|
||||||
|
id='op{{o.id}}-pointer'
|
||||||
|
class='pointer{%if o.status = 'opraveno' %}-done{% elif o.status = 'neni_chyba' %}-wontfix{% endif %}'>
|
||||||
|
</div>
|
||||||
|
*/
|
||||||
|
var corr_status = '';
|
||||||
|
switch (corr.status){
|
||||||
|
case 'opraveno':
|
||||||
|
corr_status='-done';
|
||||||
|
break;
|
||||||
|
case 'neni-chyba':
|
||||||
|
corr_status='-wontfix';
|
||||||
|
}
|
||||||
|
var pointer;
|
||||||
|
pointer = $("<div>",{
|
||||||
|
id:'op'+corr.id+'-pointer',
|
||||||
|
class: 'pointer'+corr_status,
|
||||||
|
onclick: 'img_click(this,event)'
|
||||||
|
});
|
||||||
|
|
||||||
|
var all_buttons;
|
||||||
|
all_buttons = $('<div>');
|
||||||
|
|
||||||
|
var header;
|
||||||
|
header = $('<div>',{class:'corr-header'}).append(
|
||||||
|
$('<div>',{class:'author',id:'op'+corr.id+'-autor'}).append(corr.autor),
|
||||||
|
all_buttons);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
<div name='op{{o.id}}' id='op{{o.id}}'
|
||||||
|
class='box{%if o.status = 'opraveno' %}-done{% elif o.status = 'neni_chyba' %}-wontfix{% endif %}'
|
||||||
|
onmouseover='box_onmouseover(this,{% if o.status = 'opraveno' %}"done"{% elif o.status = 'neni_chyba' %}"wontfix"{%else%}""{% endif %})'
|
||||||
|
onmouseout='box_onmouseout(this,{% if o.status = 'opraveno' %}"done"{% elif o.status = 'neni_chyba' %}"wontfix"{%else%}""{% endif %})'>
|
||||||
|
|
||||||
|
<div class='corr-header'>
|
||||||
|
<div class='author' id='op{{o.id}}-autor'>{{o.autor}}</div>
|
||||||
|
<div class='float-right'>
|
||||||
|
<!-- Existujici korektura !-->
|
||||||
|
<form class="corr-form" action='' method='POST'>
|
||||||
|
{% csrf_token %}
|
||||||
|
<input type='hidden' name="au" value="{{o.autor}}"/>
|
||||||
|
<input type='hidden' name='pdf' value='{{pdf.id}}'>
|
||||||
|
<input type='hidden' name='id' value='{{o.id}}'>
|
||||||
|
<input type='hidden' name='scroll'>
|
||||||
|
|
||||||
|
{% if o.komentare %}
|
||||||
|
<button name='action' value='del' type='button'
|
||||||
|
title="Opravu nelze smazat – už ji někdo okomentoval">
|
||||||
|
<img src="{% static "korektury/imgs/delete-gr.png"%}"/>
|
||||||
|
</button>
|
||||||
|
{% else %}
|
||||||
|
<button type='submit' name='action' value='del' title='Smaž opravu'>
|
||||||
|
<img src="{% static "korektury/imgs/delete.png"%}"/>
|
||||||
|
</button>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if o.status = 'opraveno' or o.status = 'neni_chyba' %}
|
||||||
|
<button type='submit' name='action' value='undone' title='Označ jako neopravené'>
|
||||||
|
<img src="{% static "korektury/imgs/undo.png"%}"/>
|
||||||
|
</button>
|
||||||
|
{% else %}
|
||||||
|
<button type='submit' name='action' value='done' title='Označ jako opravené'>
|
||||||
|
<img src="{% static "korektury/imgs/check.png"%}"/>
|
||||||
|
</button>
|
||||||
|
<button type='submit' name='action' value='wontfix' title='Označ jako irelevantní '>
|
||||||
|
<img src="{% static "korektury/imgs/cross.png" %}"/>
|
||||||
|
</button>
|
||||||
|
{% endif %}
|
||||||
|
</form>
|
||||||
|
<!-- /Existujici korektura !-->
|
||||||
|
|
||||||
|
{% if o.komentare %}
|
||||||
|
<button type='button' title="Korekturu nelze upravit – už ji někdo okomentoval">
|
||||||
|
<img src="{% static "korektury/imgs/edit-gr.png" %}"/>
|
||||||
|
</button>
|
||||||
|
{% else %}
|
||||||
|
<button type='button' onclick='box_edit(this,"update");' title='Oprav opravu'>
|
||||||
|
<img src="{% static "korektury/imgs/edit.png" %}"/>
|
||||||
|
</button>
|
||||||
|
{% endif %}
|
||||||
|
<button type='button' onclick='box_edit(this, "comment");' title='Komentovat'>
|
||||||
|
<img src="{% static "korektury/imgs/comment.png" %}"/>
|
||||||
|
</button>
|
||||||
|
<button type='button' onclick='toggle_visibility(this);' title='Skrýt/Zobrazit'>
|
||||||
|
<img src="{% static "korektury/imgs/hide.png" %}"/>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div> */
|
||||||
|
var body;
|
||||||
|
body = $('<div>',{class:'corr-body', id:'op'+corr.id+'-body'}).append(
|
||||||
|
$('<div>',{id:'op'+corr.id+'-text'}).append(corr.text)
|
||||||
|
);
|
||||||
|
/*
|
||||||
|
+<div class='corr-body' id='op{{o.id}}-body'>
|
||||||
|
+<div id='op{{o.id}}-text'>{{o.text}}</div>
|
||||||
|
|
||||||
|
{% for k in o.komentare %}
|
||||||
|
<hr>
|
||||||
|
<div class='comment' id='k{{k.id}}'>
|
||||||
|
<div class='corr-header'>
|
||||||
|
<div class='author'>{{k.autor}}</div>
|
||||||
|
<div class="float-right">
|
||||||
|
<!-- Komentar !-->
|
||||||
|
<form class="corr-form" action='' method='POST'>
|
||||||
|
{% csrf_token %}
|
||||||
|
<input type='hidden' name='pdf' value='{{pdf.id}}'>
|
||||||
|
<input type='hidden' name='id' value='{{k.id}}'>
|
||||||
|
<input type='hidden' name='scroll'>
|
||||||
|
<button type='submit' name='action' value='del-comment' title='Smaž komentář'
|
||||||
|
onclick='return confirm("Opravdu smazat komentář?")'>
|
||||||
|
<img src="{% static "korektury/imgs/delete.png" %}"/>
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
<!-- /Komentar !-->
|
||||||
|
<button type='button' onclick='update_comment(this);' title='Uprav komentář'>
|
||||||
|
<img src="{% static "korektury/imgs/edit.png"%}"/>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id='kt{{k.id}}'>{{k.text}}</div>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
*/
|
||||||
|
var corr_div;
|
||||||
|
corr_div = $('<div>',{
|
||||||
|
name: corr.id,
|
||||||
|
id: corr.id,
|
||||||
|
'class': 'box'+corr_status,
|
||||||
|
onmouseover: 'box_onmouseover(this,'+(corr_status==''?'\'\'':corr_status)+')',
|
||||||
|
onmouseout: 'box_onmouseout(this,'+(corr_status==''?'\'\'':corr_status)+')'
|
||||||
|
}).append(header,body)
|
||||||
|
return [pointer,corr_div];
|
||||||
|
}
|
||||||
|
|
||||||
|
function show_corrections(corrs){
|
||||||
|
var num_pages;
|
||||||
|
var pages;
|
||||||
|
pages = (corrs.map(function(cur,idx,arr){
|
||||||
|
return cur.strana;
|
||||||
|
}));
|
||||||
|
|
||||||
|
num_pages = Math.max.apply(null,pages);
|
||||||
|
|
||||||
|
for(var i=0;i<num_pages;i++){
|
||||||
|
page_corrs = corrs.filter(function(element,idx,arr){return element.strana==i?1:0});
|
||||||
|
place_comments_one_div('img-'+i,page_corrs);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -4,10 +4,14 @@
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
<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"%}" />
|
<link rel="stylesheet" type="text/css" media="screen, projection" href="{% static "korektury/opraf.css"%}" />
|
||||||
|
<script
|
||||||
|
src="https://code.jquery.com/jquery-3.1.1.min.js"
|
||||||
|
integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8="
|
||||||
|
crossorigin="anonymous"></script>
|
||||||
<script src="{% static "korektury/opraf.js"%}"></script>
|
<script src="{% static "korektury/opraf.js"%}"></script>
|
||||||
<title>Korektury {{pdf.nazev}}</title>
|
<title>Korektury {{pdf.nazev}}</title>
|
||||||
</head>
|
</head>
|
||||||
<body {% if pdf.status = 'zanaseni'%} class="comitting" {% elif pdf.status = 'zastarale' %} class="deprecated" {% endif %} onload='place_comments()'>
|
<body {% if pdf.status = 'zanaseni'%} class="comitting" {% elif pdf.status = 'zastarale' %} class="deprecated" {% endif %}'>
|
||||||
<h1>Korektury {{pdf.nazev}}</h1>
|
<h1>Korektury {{pdf.nazev}}</h1>
|
||||||
{% if pdf.status = 'zanaseni' %} <h2> Probíhá zanášení korektur, zvažte, zda chcete přidávat nové </h2> {% endif %}
|
{% if pdf.status = 'zanaseni' %} <h2> Probíhá zanášení korektur, zvažte, zda chcete přidávat nové </h2> {% endif %}
|
||||||
{% if pdf.status = 'zastarale' %} <h2> Toto PDF je již zastaralé, nepřidávejte nové korektury </h2> {% endif %}
|
{% if pdf.status = 'zastarale' %} <h2> Toto PDF je již zastaralé, nepřidávejte nové korektury </h2> {% endif %}
|
||||||
|
@ -24,7 +28,7 @@
|
||||||
|
|
||||||
<div id="commform-div">
|
<div id="commform-div">
|
||||||
<!-- Pridat korekturu / komentar !-->
|
<!-- Pridat korekturu / komentar !-->
|
||||||
<form action='' onsubmit='save_scroll(this)' id="commform" method="POST">
|
<form class="corr-form" action='' id="commform" method="POST">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<input size="24" name="au" value="{{user.first_name}} {{user.last_name}}" readonly/>
|
<input size="24" name="au" value="{{user.first_name}} {{user.last_name}}" readonly/>
|
||||||
<input type=submit value="Oprav!"/>
|
<input type=submit value="Oprav!"/>
|
||||||
|
@ -88,115 +92,30 @@
|
||||||
{% endfor %}</p>
|
{% endfor %}</p>
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
{% for o in opravy %}
|
|
||||||
<div onclick='img_click(this,event)'
|
|
||||||
id='op{{o.id}}-pointer'
|
|
||||||
class='pointer{%if o.status = 'opraveno' %}-done{% elif o.status = 'neni_chyba' %}-wontfix{% endif %}'>
|
|
||||||
</div>
|
|
||||||
<div name='op{{o.id}}' id='op{{o.id}}'
|
|
||||||
class='box{%if o.status = 'opraveno' %}-done{% elif o.status = 'neni_chyba' %}-wontfix{% endif %}'
|
|
||||||
onmouseover='box_onmouseover(this,{% if o.status = 'opraveno' %}"done"{% elif o.status = 'neni_chyba' %}"wontfix"{%else%}""{% endif %})'
|
|
||||||
onmouseout='box_onmouseout(this,{% if o.status = 'opraveno' %}"done"{% elif o.status = 'neni_chyba' %}"wontfix"{%else%}""{% endif %})'>
|
|
||||||
|
|
||||||
<div class='corr-header'>
|
|
||||||
<div class='author' id='op{{o.id}}-autor'>{{o.autor}}</div>
|
|
||||||
<div class='float-right'>
|
|
||||||
<!-- Existujici korektura !-->
|
|
||||||
<form action='' onsubmit='save_scroll(this)' method='POST'>
|
|
||||||
{% csrf_token %}
|
|
||||||
<input type='hidden' name="au" value="{{o.autor}}"/>
|
|
||||||
<input type='hidden' name='pdf' value='{{pdf.id}}'>
|
|
||||||
<input type='hidden' name='id' value='{{o.id}}'>
|
|
||||||
<input type='hidden' name='scroll'>
|
|
||||||
|
|
||||||
{% if o.komentare %}
|
|
||||||
<button name='action' value='del' type='button'
|
|
||||||
title="Opravu nelze smazat – už ji někdo okomentoval">
|
|
||||||
<img src="{% static "korektury/imgs/delete-gr.png"%}"/>
|
|
||||||
</button>
|
|
||||||
{% else %}
|
|
||||||
<button type='submit' name='action' value='del' title='Smaž opravu'>
|
|
||||||
<img src="{% static "korektury/imgs/delete.png"%}"/>
|
|
||||||
</button>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if o.status = 'opraveno' or o.status = 'neni_chyba' %}
|
|
||||||
<button type='submit' name='action' value='undone' title='Označ jako neopravené'>
|
|
||||||
<img src="{% static "korektury/imgs/undo.png"%}"/>
|
|
||||||
</button>
|
|
||||||
{% else %}
|
|
||||||
<button type='submit' name='action' value='done' title='Označ jako opravené'>
|
|
||||||
<img src="{% static "korektury/imgs/check.png"%}"/>
|
|
||||||
</button>
|
|
||||||
<button type='submit' name='action' value='wontfix' title='Označ jako irelevantní '>
|
|
||||||
<img src="{% static "korektury/imgs/cross.png" %}"/>
|
|
||||||
</button>
|
|
||||||
{% endif %}
|
|
||||||
</form>
|
|
||||||
<!-- /Existujici korektura !-->
|
|
||||||
|
|
||||||
{% if o.komentare %}
|
|
||||||
<button type='button' title="Korekturu nelze upravit – už ji někdo okomentoval">
|
|
||||||
<img src="{% static "korektury/imgs/edit-gr.png" %}"/>
|
|
||||||
</button>
|
|
||||||
{% else %}
|
|
||||||
<button type='button' onclick='box_edit(this,"update");' title='Oprav opravu'>
|
|
||||||
<img src="{% static "korektury/imgs/edit.png" %}"/>
|
|
||||||
</button>
|
|
||||||
{% endif %}
|
|
||||||
<button type='button' onclick='box_edit(this, "comment");' title='Komentovat'>
|
|
||||||
<img src="{% static "korektury/imgs/comment.png" %}"/>
|
|
||||||
</button>
|
|
||||||
<button type='button' onclick='toggle_visibility(this);' title='Skrýt/Zobrazit'>
|
|
||||||
<img src="{% static "korektury/imgs/hide.png" %}"/>
|
|
||||||
</button>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='corr-body' id='op{{o.id}}-body'>
|
|
||||||
<div id='op{{o.id}}-text'>{{o.text}}</div>
|
|
||||||
|
|
||||||
{% for k in o.komentare %}
|
|
||||||
<hr>
|
|
||||||
<div class='comment' id='k{{k.id}}'>
|
|
||||||
<div class='corr-header'>
|
|
||||||
<div class='author'>{{k.autor}}</div>
|
|
||||||
<div class="float-right">
|
|
||||||
<!-- Komentar !-->
|
|
||||||
<form action='' onsubmit='save_scroll(this)' method='POST'>
|
|
||||||
{% csrf_token %}
|
|
||||||
<input type='hidden' name='pdf' value='{{pdf.id}}'>
|
|
||||||
<input type='hidden' name='id' value='{{k.id}}'>
|
|
||||||
<input type='hidden' name='scroll'>
|
|
||||||
<button type='submit' name='action' value='del-comment' title='Smaž komentář'
|
|
||||||
onclick='return confirm("Opravdu smazat komentář?")'>
|
|
||||||
<img src="{% static "korektury/imgs/delete.png" %}"/>
|
|
||||||
</button>
|
|
||||||
</form>
|
|
||||||
<!-- /Komentar !-->
|
|
||||||
<button type='button' onclick='update_comment(this);' title='Uprav komentář'>
|
|
||||||
<img src="{% static "korektury/imgs/edit.png"%}"/>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div id='kt{{k.id}}'>{{k.text}}</div>
|
|
||||||
</div>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
var comments = [
|
var cor_data;
|
||||||
{% for s in opravy_strany %}
|
$(document).ready(function get_corrs(){
|
||||||
["img-{{s.strana}}", [{% for o in s.op_id %}["op{{o.id}}",{{o.x}},{{o.y}}],{% endfor %}[]]],
|
$.getJSON("korektury/",function(data){
|
||||||
{% endfor %}
|
show_corrections(data.opravy);
|
||||||
[]]
|
cor_data = data});
|
||||||
|
});
|
||||||
|
/*
|
||||||
|
|
||||||
function place_comments() {
|
function place_comments() {
|
||||||
for (var i=0; i < comments.length-1; i++) {
|
for (var i=0; i < comments.length-1; i++) {
|
||||||
place_comments_one_div(comments[i][0], comments[i][1])
|
place_comments_one_div(comments[i][0], comments[i][1])
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
$('.corr-form').on('submit', function(event) {
|
||||||
|
//alert("Submitting");
|
||||||
|
event.preventDefault();
|
||||||
|
var inputs = $(this).serializeArray();
|
||||||
|
save_scroll(this);
|
||||||
|
console.log("Submitting");
|
||||||
|
create_post(inputs);
|
||||||
|
});
|
||||||
{% if scroll %}
|
{% if scroll %}
|
||||||
window.scrollTo(0,{{scroll}});
|
window.scrollTo(0,{{scroll}});
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
|
@ -7,6 +7,10 @@ staff_member_required = user_passes_test(lambda u: u.is_staff)
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
url(r'^korektury/$', staff_member_required(views.KorekturyListView.as_view()), name='korektury-list'),
|
url(r'^korektury/$', staff_member_required(views.KorekturyListView.as_view()), name='korektury-list'),
|
||||||
url(r'^korektury/(?P<pdf>\d+)/$', staff_member_required(views.KorekturyView.as_view()), name='korektury'),
|
url(r'^korektury/(?P<pdf>\d+)/$', views.KorekturyBaseView.as_view(), name='korektury'),
|
||||||
|
url(r'^korektury/(?P<pdf>\d+)/korektury/$', views.KorekturyView.as_view(), name='korektury'),
|
||||||
|
url(r'^korektury/(?P<pdf>\d+)/request/$', views.KorekturyRequestView.as_view(), name='korektury-request'),
|
||||||
|
# FIXME url(r'^korektury/(?P<pdf>\d+)/$', staff_member_required(views.KorekturyView.as_view()), name='korektury'),
|
||||||
|
# FIXME url(r'^korektury/(?P<pdf>\d+)/request/$', staff_member_required(views.KorekturyRequestView.as_view()), name='korektury-request'),
|
||||||
url(r'^korektury/help/', staff_member_required(views.KorekturyHelpView.as_view()), name='korektury-help'),
|
url(r'^korektury/help/', staff_member_required(views.KorekturyHelpView.as_view()), name='korektury-help'),
|
||||||
]
|
]
|
||||||
|
|
|
@ -3,15 +3,15 @@ from django.shortcuts import get_object_or_404, render
|
||||||
from django.views import generic
|
from django.views import generic
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.http import HttpResponseForbidden
|
from django.http import HttpResponseForbidden,HttpResponse
|
||||||
from django.core.mail import send_mail
|
from django.core.mail import send_mail
|
||||||
|
from django.core.context_processors import csrf
|
||||||
|
|
||||||
from .models import Oprava,Komentar,KorekturovanePDF, Organizator
|
from .models import Oprava,Komentar,KorekturovanePDF, Organizator
|
||||||
from .forms import OpravaForm
|
from .forms import OpravaForm
|
||||||
|
|
||||||
import subprocess
|
|
||||||
import shutil
|
|
||||||
import os
|
import os
|
||||||
|
import json
|
||||||
import unicodedata
|
import unicodedata
|
||||||
|
|
||||||
class KorekturyHelpView(generic.TemplateView):
|
class KorekturyHelpView(generic.TemplateView):
|
||||||
|
@ -22,7 +22,7 @@ class KorekturyListView(generic.ListView):
|
||||||
template_name = 'korektury/seznam.html'
|
template_name = 'korektury/seznam.html'
|
||||||
|
|
||||||
### Korektury
|
### Korektury
|
||||||
class KorekturyView(generic.TemplateView):
|
class KorekturyBaseView(generic.TemplateView):
|
||||||
model = Oprava
|
model = Oprava
|
||||||
template_name = 'korektury/opraf.html'
|
template_name = 'korektury/opraf.html'
|
||||||
form_class = OpravaForm
|
form_class = OpravaForm
|
||||||
|
@ -164,7 +164,192 @@ class KorekturyView(generic.TemplateView):
|
||||||
send_mail(subject, text, from_email, list(emails))
|
send_mail(subject, text, from_email, list(emails))
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super(KorekturyView,self).get_context_data(**kwargs)
|
context = super(KorekturyBaseView,self).get_context_data(**kwargs)
|
||||||
|
pdf = get_object_or_404(KorekturovanePDF, id=self.kwargs['pdf'])
|
||||||
|
context['pdf'] = pdf
|
||||||
|
context['img_name'] = os.path.split(pdf.pdf.path)[1].split('.')[0]
|
||||||
|
context['img_path'] = settings.KOREKTURY_IMG_DIR
|
||||||
|
context['img_indexes'] = range(pdf.stran)
|
||||||
|
context['form_oprava'] = OpravaForm()
|
||||||
|
opravy = Oprava.objects.filter(pdf=self.kwargs['pdf'])
|
||||||
|
zasluhy = {}
|
||||||
|
for o in opravy:
|
||||||
|
if o.autor in zasluhy:
|
||||||
|
zasluhy[o.autor]+=1
|
||||||
|
else:
|
||||||
|
zasluhy[o.autor]=1
|
||||||
|
o.komentare = o.komentar_set.all()
|
||||||
|
for k in o.komentare:
|
||||||
|
if k.autor in zasluhy:
|
||||||
|
zasluhy[k.autor]+=1
|
||||||
|
else:
|
||||||
|
zasluhy[k.autor]=1
|
||||||
|
zasluhy = [{'autor':jmeno, 'pocet':pocet} for (jmeno,pocet) in zasluhy.items()]
|
||||||
|
zasluhy.sort(key=lambda z:z['pocet'],reverse=True)
|
||||||
|
|
||||||
|
strany = set(o.strana for o in opravy)
|
||||||
|
opravy_na_stranu = [{'strana': s, 'op_id': opravy.filter(strana=s)} for s in strany]
|
||||||
|
context['opravy_strany'] = opravy_na_stranu
|
||||||
|
|
||||||
|
context['opravy'] = opravy
|
||||||
|
context['zasluhy'] = zasluhy
|
||||||
|
return context
|
||||||
|
|
||||||
|
def form_valid(self,form):
|
||||||
|
return super(KorekturyView,self).form_valid(form)
|
||||||
|
|
||||||
|
### Korektury
|
||||||
|
class KorekturyView(generic.TemplateView):
|
||||||
|
model = Oprava
|
||||||
|
template_name = 'korektury/opraf.html'
|
||||||
|
form_class = OpravaForm
|
||||||
|
|
||||||
|
def get(self,request,*args,**kwargs):
|
||||||
|
pdf = get_object_or_404(KorekturovanePDF, id=self.kwargs['pdf'])
|
||||||
|
context = {}
|
||||||
|
context['pdf'] = pdf.id
|
||||||
|
context['img_name'] = os.path.split(pdf.pdf.path)[1].split('.')[0]
|
||||||
|
context['img_path'] = settings.KOREKTURY_IMG_DIR
|
||||||
|
context['img_indexes'] = range(pdf.stran)
|
||||||
|
|
||||||
|
opravy = Oprava.objects.filter(pdf=self.kwargs['pdf'])
|
||||||
|
strany = set(o.strana for o in opravy)
|
||||||
|
opravy_na_stranu = [{'strana': s, 'op_id': map(lambda o:o.id,opravy.filter(strana=s))} for s in strany]
|
||||||
|
context['opravy_strany'] = opravy_na_stranu
|
||||||
|
|
||||||
|
opravy = list(opravy.values())
|
||||||
|
for o in opravy:
|
||||||
|
o["autor"] = str(Organizator.objects.filter(id=(o[u"autor_id"]))[0])
|
||||||
|
context['opravy'] = opravy
|
||||||
|
return HttpResponse(json.dumps(context),content_type="application/json")
|
||||||
|
|
||||||
|
|
||||||
|
class KorekturyRequestView(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
|
||||||
|
scroll = q.get('scroll')
|
||||||
|
|
||||||
|
# prirazeni autora podle prihlaseni
|
||||||
|
autor_user = request.user
|
||||||
|
# pokud existuje ucet (user), ale neni to organizator = 403
|
||||||
|
autor = Organizator.objects.filter(user=autor_user).first()
|
||||||
|
if not autor:
|
||||||
|
return HttpResponseForbidden()
|
||||||
|
|
||||||
|
if not scroll:
|
||||||
|
scroll = 0
|
||||||
|
|
||||||
|
action = q.get('action')
|
||||||
|
if (action == u''): # Přidej
|
||||||
|
x = int(q.get('x'))
|
||||||
|
y = int(q.get('y'))
|
||||||
|
text = q.get('txt')
|
||||||
|
strana = int(q.get('img-id')[4:])
|
||||||
|
pdf = KorekturovanePDF.objects.get(id=q.get('pdf'))
|
||||||
|
|
||||||
|
op = Oprava(x=x,y=y, autor=autor, text=text, strana=strana,pdf = pdf)
|
||||||
|
op.save()
|
||||||
|
self.send_email_notification_komentar(op, autor, text)
|
||||||
|
elif (action == u'del'):
|
||||||
|
id = int(q.get('id'))
|
||||||
|
op = Oprava.objects.get(id=id)
|
||||||
|
op.delete()
|
||||||
|
elif (action == u'update'):
|
||||||
|
id = int(q.get('id'))
|
||||||
|
op = Oprava.objects.get(id=id)
|
||||||
|
text = q.get('txt')
|
||||||
|
op.autor = autor
|
||||||
|
op.text = text
|
||||||
|
op.save()
|
||||||
|
elif (action == u'undone'):
|
||||||
|
id = int(q.get('id'))
|
||||||
|
op = Oprava.objects.get(id=id)
|
||||||
|
op.status = op.STATUS_K_OPRAVE
|
||||||
|
op.save()
|
||||||
|
elif (action == u'done'):
|
||||||
|
id = int(q.get('id'))
|
||||||
|
op = Oprava.objects.get(id=id)
|
||||||
|
op.status = op.STATUS_OPRAVENO
|
||||||
|
op.save()
|
||||||
|
elif (action == u'wontfix'):
|
||||||
|
id = int(q.get('id'))
|
||||||
|
op = Oprava.objects.get(id=id)
|
||||||
|
op.status = op.STATUS_NENI_CHYBA
|
||||||
|
op.save()
|
||||||
|
elif (action == u'comment'):
|
||||||
|
id = int(q.get('id'))
|
||||||
|
op = Oprava.objects.get(id=id)
|
||||||
|
text = q.get('txt')
|
||||||
|
kom = Komentar(oprava=op,autor=autor,text=text)
|
||||||
|
kom.save()
|
||||||
|
self.send_email_notification_komentar(op, autor, text)
|
||||||
|
elif (action == u'update-comment'):
|
||||||
|
id = int(q.get('id'))
|
||||||
|
kom = Komentar.objects.get(id=id)
|
||||||
|
text = q.get('txt')
|
||||||
|
kom.text = text
|
||||||
|
kom.autor = autor
|
||||||
|
kom.save()
|
||||||
|
elif (action == u'del-comment'):
|
||||||
|
id = int(q.get('id'))
|
||||||
|
kom = Komentar.objects.get(id=id)
|
||||||
|
kom.delete()
|
||||||
|
context = self.get_context_data()
|
||||||
|
context['scroll'] = scroll
|
||||||
|
context['autor'] = autor
|
||||||
|
return render(request, 'korektury/opraf.html',context)
|
||||||
|
|
||||||
|
def send_email_notification_komentar(self, oprava, autor, text):
|
||||||
|
''' Rozesle e-mail pri pridani komentare,
|
||||||
|
ktery obsahuje text komentare.
|
||||||
|
'''
|
||||||
|
|
||||||
|
# parametry e-mailu
|
||||||
|
odkaz = "https://mam.mff.cuni.cz/korektury/{}/".format(oprava.pdf.pk)
|
||||||
|
from_email = 'korekturovatko@mam.mff.cuni.cz'
|
||||||
|
subject = u'Nová korektura od {} v {}'.format(autor,
|
||||||
|
oprava.pdf.nazev)
|
||||||
|
text = u"Text komentáře:\n\n{}\n\n=== Konec textu komentáře ===\n\
|
||||||
|
\nodkaz do korekturovátka: {}\n\
|
||||||
|
\nVaše korekturovátko\n".format(text, odkaz)
|
||||||
|
|
||||||
|
# Prijemci e-mailu
|
||||||
|
emails = set()
|
||||||
|
# e-mail autora korektury
|
||||||
|
email = oprava.autor.user.email
|
||||||
|
if email:
|
||||||
|
emails.add(email)
|
||||||
|
|
||||||
|
# nalezeni e-mailu na autory komentaru
|
||||||
|
for komentar in oprava.komentar_set.all():
|
||||||
|
email_komentujiciho = komentar.autor.user.email
|
||||||
|
if email_komentujiciho:
|
||||||
|
emails.add(email_komentujiciho)
|
||||||
|
|
||||||
|
# zodpovedny org
|
||||||
|
if oprava.pdf.org:
|
||||||
|
email_zobpovedny = oprava.pdf.org.user.email
|
||||||
|
if email_zobpovedny:
|
||||||
|
emails.add(email_zobpovedny)
|
||||||
|
|
||||||
|
# odstran e-mail autora opravy
|
||||||
|
email = autor.user.email
|
||||||
|
if email:
|
||||||
|
emails.discard(email)
|
||||||
|
|
||||||
|
if not settings.SEND_EMAIL_NOTIFICATIONS:
|
||||||
|
print "Poslal bych upozornění na tyto adresy: ", " ".join(emails)
|
||||||
|
return
|
||||||
|
|
||||||
|
send_mail(subject, text, from_email, list(emails))
|
||||||
|
|
||||||
|
def get_context_data(self, **kwargs):
|
||||||
|
context = super(KorekturyRequestView,self).get_context_data(**kwargs)
|
||||||
pdf = get_object_or_404(KorekturovanePDF, id=self.kwargs['pdf'])
|
pdf = get_object_or_404(KorekturovanePDF, id=self.kwargs['pdf'])
|
||||||
context['pdf'] = pdf
|
context['pdf'] = pdf
|
||||||
context['img_name'] = os.path.split(pdf.pdf.path)[1].split('.')[0]
|
context['img_name'] = os.path.split(pdf.pdf.path)[1].split('.')[0]
|
||||||
|
|
Loading…
Reference in a new issue