Prototyp korekturovatka v Djangu.
3
.gitignore
vendored
|
@ -20,3 +20,6 @@
|
|||
|
||||
# secrets
|
||||
/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.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 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',
|
||||
'seminar',
|
||||
'galerie',
|
||||
'korektury',
|
||||
|
||||
# Admin upravy:
|
||||
|
||||
|
|
|
@ -14,6 +14,9 @@ urlpatterns = patterns('',
|
|||
|
||||
# Seminarova aplikace (ma vlastni podadresare)
|
||||
url(r'^', include('seminar.urls')),
|
||||
|
||||
# Korekturovaci aplikace (ma vlastni podadresare)
|
||||
url(r'^', include('korektury.urls')),
|
||||
|
||||
# Comments (interni i verejne)
|
||||
url(r'^comments_dj/', include('django_comments.urls')),
|
||||
|
|