@ -0,0 +1,14 @@ |
|||||
|
- korektura potrebuje reakci |
||||
|
+ komentáře fixně na username |
||||
|
- používat skutečné jméno? |
||||
|
- vyžádat pozornost autora obsahu |
||||
|
- zvednout upload limit na 5MB |
||||
|
- sbalit a rozbalit korekturu |
||||
|
- nápověda |
||||
|
- nahrávání jiných věcí než PDF - kontrolovat? |
||||
|
- stylování |
||||
|
- vylepšení hlavičky |
||||
|
- seznam PDF, homepage M&M, admin, wiki |
||||
|
- seznam PDF - co zobrazovat? |
||||
|
|
||||
|
|
@ -0,0 +1,16 @@ |
|||||
|
from django.contrib import admin |
||||
|
from reversion.admin import VersionAdmin |
||||
|
from korektury.models import KorekturovanePDF |
||||
|
|
||||
|
# Register your models here. |
||||
|
class KorekturovanePDFAdmin(VersionAdmin): |
||||
|
readonly_fields = ['cas', 'stran'] |
||||
|
fieldsets = [ |
||||
|
(None, {'fields': ['pdf', 'cas', 'stran', 'nazev', 'komentar']}), |
||||
|
# (u'PDF', {'fields': ['pdf']}), |
||||
|
] |
||||
|
list_display = ['pdf', 'cas', 'stran'] |
||||
|
list_filter = [] |
||||
|
search_fields = [] |
||||
|
|
||||
|
admin.site.register(KorekturovanePDF, KorekturovanePDFAdmin) |
@ -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,), |
||||
|
), |
||||
|
] |
@ -0,0 +1,39 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
from __future__ import unicode_literals |
||||
|
|
||||
|
from django.db import models, migrations |
||||
|
import django.utils.timezone |
||||
|
|
||||
|
|
||||
|
class Migration(migrations.Migration): |
||||
|
|
||||
|
dependencies = [ |
||||
|
('korektury', '0001_initial'), |
||||
|
] |
||||
|
|
||||
|
operations = [ |
||||
|
migrations.CreateModel( |
||||
|
name='Komentar', |
||||
|
fields=[ |
||||
|
('id', models.AutoField(serialize=False, primary_key=True)), |
||||
|
('cas', models.DateTimeField(default=django.utils.timezone.now, 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': 'komentare', |
||||
|
'verbose_name': 'Koment\xe1\u0159 k oprav\u011b', |
||||
|
'verbose_name_plural': 'Koment\xe1\u0159e k oprav\u011b', |
||||
|
}, |
||||
|
bases=(models.Model,), |
||||
|
), |
||||
|
migrations.RemoveField( |
||||
|
model_name='opravakomentar', |
||||
|
name='oprava', |
||||
|
), |
||||
|
migrations.DeleteModel( |
||||
|
name='OpravaKomentar', |
||||
|
), |
||||
|
] |
@ -0,0 +1,27 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
from __future__ import unicode_literals |
||||
|
|
||||
|
from django.db import models, migrations |
||||
|
import django.utils.timezone |
||||
|
|
||||
|
|
||||
|
class Migration(migrations.Migration): |
||||
|
|
||||
|
dependencies = [ |
||||
|
('korektury', '0002_auto_20151202_2351'), |
||||
|
] |
||||
|
|
||||
|
operations = [ |
||||
|
migrations.AddField( |
||||
|
model_name='korekturovanepdf', |
||||
|
name='cas', |
||||
|
field=models.DateTimeField(default=django.utils.timezone.now, help_text=b'\xc4\x8cas vlo\xc5\xbeen\xc3\xad PDF', verbose_name='\u010das vlo\u017een\xed PDF'), |
||||
|
preserve_default=True, |
||||
|
), |
||||
|
migrations.AddField( |
||||
|
model_name='korekturovanepdf', |
||||
|
name='stran', |
||||
|
field=models.IntegerField(default=0, help_text=b'Po\xc4\x8det stran PDF', verbose_name='po\u010det stran'), |
||||
|
preserve_default=True, |
||||
|
), |
||||
|
] |
@ -0,0 +1,26 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
from __future__ import unicode_literals |
||||
|
|
||||
|
from django.db import models, migrations |
||||
|
|
||||
|
|
||||
|
class Migration(migrations.Migration): |
||||
|
|
||||
|
dependencies = [ |
||||
|
('korektury', '0003_auto_20151204_1855'), |
||||
|
] |
||||
|
|
||||
|
operations = [ |
||||
|
migrations.AddField( |
||||
|
model_name='korekturovanepdf', |
||||
|
name='komentar', |
||||
|
field=models.TextField(help_text=b'Koment\xc3\xa1\xc5\x99 ke korekturovan\xc3\xa9mu PDF (nap\xc5\x99. na co se zam\xc4\x9b\xc5\x99it)', verbose_name='koment\xe1\u0159 k PDF', blank=True), |
||||
|
preserve_default=True, |
||||
|
), |
||||
|
migrations.AddField( |
||||
|
model_name='korekturovanepdf', |
||||
|
name='nazev', |
||||
|
field=models.TextField(help_text=b'N\xc3\xa1zev (nap\xc5\x99. 22.1 verze 4) korekturovan\xc3\xa9ho PDF', verbose_name='n\xe1zev PDF', blank=True), |
||||
|
preserve_default=True, |
||||
|
), |
||||
|
] |
@ -0,0 +1,32 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
from __future__ import unicode_literals |
||||
|
|
||||
|
from django.db import models, migrations |
||||
|
|
||||
|
|
||||
|
class Migration(migrations.Migration): |
||||
|
|
||||
|
dependencies = [ |
||||
|
('korektury', '0004_auto_20151204_2240'), |
||||
|
] |
||||
|
|
||||
|
operations = [ |
||||
|
migrations.AlterField( |
||||
|
model_name='komentar', |
||||
|
name='autor', |
||||
|
field=models.CharField(help_text=b'Autor koment\xc3\xa1\xc5\x99e', max_length=20, verbose_name='autor koment\xe1\u0159e', blank=True), |
||||
|
preserve_default=True, |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='korekturovanepdf', |
||||
|
name='nazev', |
||||
|
field=models.CharField(help_text=b'N\xc3\xa1zev (nap\xc5\x99. 22.1 verze 4) korekturovan\xc3\xa9ho PDF', max_length=50, verbose_name='n\xe1zev PDF', blank=True), |
||||
|
preserve_default=True, |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='oprava', |
||||
|
name='autor', |
||||
|
field=models.CharField(help_text=b'Autor opravy', max_length=20, verbose_name='autor opravy', blank=True), |
||||
|
preserve_default=True, |
||||
|
), |
||||
|
] |
@ -0,0 +1,20 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
from __future__ import unicode_literals |
||||
|
|
||||
|
from django.db import models, migrations |
||||
|
|
||||
|
|
||||
|
class Migration(migrations.Migration): |
||||
|
|
||||
|
dependencies = [ |
||||
|
('korektury', '0005_auto_20151204_2244'), |
||||
|
] |
||||
|
|
||||
|
operations = [ |
||||
|
migrations.AddField( |
||||
|
model_name='oprava', |
||||
|
name='pdf', |
||||
|
field=models.ForeignKey(default=-1, to='korektury.KorekturovanePDF'), |
||||
|
preserve_default=True, |
||||
|
), |
||||
|
] |
@ -0,0 +1,33 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
from __future__ import unicode_literals |
||||
|
|
||||
|
from django.db import models, migrations |
||||
|
import korektury.models |
||||
|
|
||||
|
|
||||
|
class Migration(migrations.Migration): |
||||
|
|
||||
|
dependencies = [ |
||||
|
('korektury', '0006_oprava_pdf'), |
||||
|
] |
||||
|
|
||||
|
operations = [ |
||||
|
migrations.AddField( |
||||
|
model_name='korekturovanepdf', |
||||
|
name='status', |
||||
|
field=models.CharField(default=b'pridavani', max_length=16, verbose_name='stav PDF', choices=[(b'pridavani', 'P\u0159id\xe1v\xe1n\xed korektur'), (b'zanaseni', 'Korektury jsou zan\xe1\u0161eny'), (b'zastarale', 'Star\xe1 verze, nekorigovat')]), |
||||
|
preserve_default=True, |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='korekturovanepdf', |
||||
|
name='pdf', |
||||
|
field=models.FileField(upload_to=korektury.models.generate_filename, verbose_name='PDF'), |
||||
|
preserve_default=True, |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='oprava', |
||||
|
name='status', |
||||
|
field=models.CharField(default=b'k_oprave', max_length=16, verbose_name='stav opravy', choices=[(b'k_oprave', 'K oprav\u011b'), (b'opraveno', 'Opraveno'), (b'neni_chyba', 'Nen\xed chyba'), (b'k_reakci', 'K reakci autora textu'), (b'smazano', 'Smaz\xe1no')]), |
||||
|
preserve_default=True, |
||||
|
), |
||||
|
] |
@ -0,0 +1,176 @@ |
|||||
|
# -*- 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 django.core.exceptions import ObjectDoesNotExist |
||||
|
from imagekit.models import ImageSpecField, ProcessedImageField |
||||
|
from imagekit.processors import ResizeToFit, Transpose |
||||
|
|
||||
|
import os |
||||
|
import subprocess |
||||
|
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', '').replace(":","_") |
||||
|
fname = "%s_%s" % ( |
||||
|
timezone.now().strftime('%Y-%m-%d-%H_%M'), |
||||
|
clean) |
||||
|
return os.path.join(settings.KOREKTURY_PDF_DIR, 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) |
||||
|
|
||||
|
cas = models.DateTimeField(u'čas vložení PDF',default=timezone.now,help_text = 'Čas vložení PDF') |
||||
|
|
||||
|
nazev = models.CharField(u'název PDF',blank = True,max_length=50, help_text='Název (např. 22.1 verze 4) korekturovaného PDF') |
||||
|
|
||||
|
komentar = models.TextField(u'komentář k PDF',blank = True, help_text='Komentář ke korekturovanému PDF (např. na co se zaměřit)') |
||||
|
|
||||
|
pdf = models.FileField(u'PDF', upload_to = generate_filename) |
||||
|
|
||||
|
stran = models.IntegerField(u'počet stran', help_text = 'Počet stran PDF', default = 0) |
||||
|
STATUS_PRIDAVANI = 'pridavani' |
||||
|
STATUS_ZANASENI = 'zanaseni' |
||||
|
STATUS_ZASTARALE = 'zastarale' |
||||
|
STATUS_CHOICES = ( |
||||
|
(STATUS_PRIDAVANI, u'Přidávání korektur'), |
||||
|
(STATUS_ZANASENI, u'Korektury jsou zanášeny'), |
||||
|
(STATUS_ZASTARALE, u'Stará verze, nekorigovat'), |
||||
|
) |
||||
|
status = models.CharField(u'stav PDF',max_length=16, choices=STATUS_CHOICES, blank=False, |
||||
|
default = STATUS_PRIDAVANI) |
||||
|
|
||||
|
|
||||
|
#TODO Nepovinný foreign key k číslu |
||||
|
|
||||
|
def save(self): |
||||
|
# Pokud se nezmenilo PDF, tak nepregenerovavej nahledy |
||||
|
try: |
||||
|
original = KorekturovanePDF.objects.get(pk=self.pk) |
||||
|
if original.pdf == self.pdf: |
||||
|
super(KorekturovanePDF, self).save() |
||||
|
return |
||||
|
except ObjectDoesNotExist: |
||||
|
pass |
||||
|
super(KorekturovanePDF, self).save() |
||||
|
print("\nSaving") |
||||
|
print(self.pdf.path) |
||||
|
print(self.pdf.url) |
||||
|
filename = os.path.split(self.pdf.file.name)[1].split(".")[0] |
||||
|
try: |
||||
|
os.listdir(settings.KOREKTURY_IMG_DIR) |
||||
|
except OSError: |
||||
|
os.mkdir(settings.KOREKTURY_IMG_DIR) |
||||
|
while True: |
||||
|
res = subprocess.call([ |
||||
|
"convert", |
||||
|
"-density","180x180", |
||||
|
"-geometry"," 1024x1448", |
||||
|
self.pdf.path+"[%d]"%self.stran, |
||||
|
os.path.join(settings.KOREKTURY_IMG_DIR, "%s-%d.png"%(filename,self.stran))]) |
||||
|
if res==1: |
||||
|
break |
||||
|
self.stran +=1 |
||||
|
super(KorekturovanePDF, self).save() |
||||
|
|
||||
|
|
||||
|
|
||||
|
@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, default=-1) |
||||
|
|
||||
|
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_NENI_CHYBA = 'neni_chyba' |
||||
|
STATUS_K_REAKCI = 'k_reakci' |
||||
|
STATUS_SMAZANO = 'smazano' |
||||
|
STATUS_CHOICES = ( |
||||
|
(STATUS_K_OPRAVE, u'K opravě'), |
||||
|
(STATUS_OPRAVENO, u'Opraveno'), |
||||
|
(STATUS_NENI_CHYBA, u'Není chyba'), |
||||
|
(STATUS_K_REAKCI, u'K reakci autora textu'), |
||||
|
(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.CharField(u'autor opravy',blank = True,max_length=20, 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 Komentar(models.Model): |
||||
|
class Meta: |
||||
|
db_table = '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',default=timezone.now,help_text = 'Čas zadání komentáře') |
||||
|
|
||||
|
oprava = models.ForeignKey(Oprava) |
||||
|
# TODO: Změnit na cizí klíč do orgů |
||||
|
autor = models.CharField(u'autor komentáře',blank = True,max_length=20, 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)) |
||||
|
|
||||
|
|
||||
|
|
After Width: | Height: | Size: 697 B |
After Width: | Height: | Size: 726 B |
After Width: | Height: | Size: 717 B |
After Width: | Height: | Size: 347 B |
After Width: | Height: | Size: 500 B |
After Width: | Height: | Size: 973 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,145 @@ |
|||||
|
body{background: #f3f3f3; color: black;} |
||||
|
body.comitting { |
||||
|
background: yellow; |
||||
|
} |
||||
|
body.deprecated { |
||||
|
background: red; |
||||
|
} |
||||
|
|
||||
|
img{background:white;} |
||||
|
|
||||
|
.pointer-hi, |
||||
|
.pointer, |
||||
|
.pointer-wontfix, |
||||
|
.pointer-wontfix-hi, |
||||
|
.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-wontfix-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); |
||||
|
} |
||||
|
.pointer-wontfix { |
||||
|
border-color: #00F; /*IE*/ |
||||
|
border-color: rgba(128, 128, 128, 0.2); |
||||
|
} |
||||
|
.pointer-wontfix-hi { |
||||
|
border-color: #00F; /*IE*/ |
||||
|
border-color: rgba(128, 128, 128, 1); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
.box:hover, |
||||
|
.box-done:hover, |
||||
|
.box-wontfix:hover{ |
||||
|
border-width:3px; |
||||
|
margin: 0px; |
||||
|
} |
||||
|
.box, .box-done, .box-wontfix { |
||||
|
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; |
||||
|
} |
||||
|
.box-wontfix { |
||||
|
border-color: grey; |
||||
|
} |
||||
|
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; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
.box button, |
||||
|
.box img, |
||||
|
.box-done button, |
||||
|
.box-done img, |
||||
|
.box-wontfix button, |
||||
|
.box-wontfix 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, |
||||
|
.box-wontfix img:hover, |
||||
|
.box-wontfix button:hover{ |
||||
|
border: 1px solid black; |
||||
|
} |
||||
|
|
||||
|
.comment hr { |
||||
|
height: 0px; |
||||
|
} |
||||
|
|
||||
|
.corr-header { |
||||
|
overflow: auto; |
||||
|
} |
||||
|
|
||||
|
.author { |
||||
|
font-weight: bold; |
||||
|
float: left; |
||||
|
margin-top: 3px; |
||||
|
} |
||||
|
|
@ -0,0 +1,256 @@ |
|||||
|
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 body_class = document.body.className; |
||||
|
switch(body_class){ |
||||
|
case "comitting": |
||||
|
if (!confirm("Právě jsou zanášeny korektury, opravdu chcete přidat novou?")) |
||||
|
return; |
||||
|
break; |
||||
|
case "deprecated": |
||||
|
if (!confirm("Toto PDF je již zastaralé, opravdu chcete vytvořit korekturu?")) |
||||
|
return; |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
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' or 'comment' button pressed
|
||||
|
function box_edit(button, action) |
||||
|
{ |
||||
|
var divbox = button.parentNode.parentNode.parentNode; |
||||
|
var id = divbox.id; |
||||
|
var divpointer = document.getElementById(divbox.id + '-pointer'); |
||||
|
|
||||
|
var text; |
||||
|
if (action == 'update') { |
||||
|
var text_el = document.getElementById(divbox.id + '-text'); |
||||
|
text = text_el.innerHTML.unescapeHTML(); |
||||
|
|
||||
|
} else { |
||||
|
text = ''; |
||||
|
} |
||||
|
|
||||
|
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, action); |
||||
|
} |
||||
|
|
||||
|
// show comment form when 'update-comment' button pressed
|
||||
|
function update_comment(button) |
||||
|
{ |
||||
|
var divbox = button.parentNode.parentNode.parentNode.parentNode; |
||||
|
var id = divbox.id; |
||||
|
var divpointer = document.getElementById(divbox.id + '-pointer'); |
||||
|
var dx = parseInt(divpointer.style.left); |
||||
|
var dy = parseInt(divpointer.style.top); |
||||
|
|
||||
|
var commentdiv = button.parentNode.parentNode.parentNode; |
||||
|
var id = commentdiv.id.substring(1); |
||||
|
var text = document.getElementById('kt' + id).innerHTML.unescapeHTML(); |
||||
|
|
||||
|
return show_form(divbox.img_id, dx, dy, id, text, 'update-comment'); |
||||
|
} |
||||
|
|
||||
|
//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, stat) |
||||
|
{ |
||||
|
var id = box.id; |
||||
|
var pointer = document.getElementById(box.id + '-pointer'); |
||||
|
switch (stat){ |
||||
|
case 'done': |
||||
|
pointer.className = 'pointer-done-hi'; |
||||
|
break; |
||||
|
case 'wontfix': |
||||
|
pointer.className = 'pointer-wontfix-hi'; |
||||
|
break; |
||||
|
default: |
||||
|
pointer.className = 'pointer-hi'; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function box_onmouseout(box, stat) |
||||
|
{ |
||||
|
var id = box.id; |
||||
|
var pointer = document.getElementById(box.id + '-pointer'); |
||||
|
switch (stat){ |
||||
|
case 'done': |
||||
|
pointer.className = 'pointer-done'; |
||||
|
break; |
||||
|
case 'wontfix': |
||||
|
pointer.className = 'pointer-wontfix'; |
||||
|
break; |
||||
|
default: |
||||
|
pointer.className = 'pointer'; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
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,9 @@ |
|||||
|
{% extends "base.html" %} |
||||
|
|
||||
|
{% block content %} |
||||
|
{# blok do kterého se nacita text, v pripade jinyhc templatu obalit vlastnim blokem #} |
||||
|
{% endblock %} |
||||
|
|
||||
|
{% block title %} |
||||
|
{# blok pro titulek stranky #} |
||||
|
{% endblock %} |
@ -0,0 +1,47 @@ |
|||||
|
{% extends "korektury/base.html" %} |
||||
|
{% load staticfiles %} |
||||
|
|
||||
|
{% block title %} Nápověda ke korigovátku {% endblock title %} |
||||
|
|
||||
|
{% block content %} |
||||
|
<h1> Nápověda ke korigovátku</h1> |
||||
|
<p> Korigovátko slouží ke korigování PDF souborů. Umožňuje přidávat a komentovat |
||||
|
korektury a označovat je jako zanesené / irelevantní. Rovněž umožňuje o PDF |
||||
|
říci, že jsou právě zanášeny korektury nebo že je zastaralé. |
||||
|
<h2> Použití </h2> |
||||
|
<p> |
||||
|
Kliknu do PDF tam, kam chci zadat korekturu, napíši text a kliknu na Oprav! |
||||
|
(nebo Ctrl-Enter). |
||||
|
Korektura se zobrazí na pravé straně červeně. Korektura nelze smazat ani |
||||
|
upravit. |
||||
|
</p><p> |
||||
|
Pokud chci korekturu okomentovat, kliknu na ikonu <img src="{% static "korektury/imgs/comment.png" %}"/>, |
||||
|
napíši komentář a kliknu na Oprav! (nebo Ctrl-Enter). Komentář se zobrazí pod |
||||
|
původní korekturou. |
||||
|
</p> |
||||
|
<h2> Tlačítka u korektury </h2> |
||||
|
<ul> |
||||
|
<li> <img src="{% static "korektury/imgs/delete.png" %}"/> - smazat korekturu |
||||
|
<li> <img src="{% static "korektury/imgs/check.png" %}"/> - označt koreturu jako zanesenou |
||||
|
<li> <img src="{% static "korektury/imgs/cross.png" %}"/> - označit korekturu jako irelevantní |
||||
|
(není to chyba, nebude zaneseno) |
||||
|
<li> <img src="{% static "korektury/imgs/edit.png" %}"/> - upravit text korektury |
||||
|
<li> <img src="{% static "korektury/imgs/comment.png" %}"/> - okomentovat korekturu |
||||
|
</ul> |
||||
|
<h2> Stavy </h2> |
||||
|
<h3> Korektura </h3> |
||||
|
<ul> |
||||
|
<li> K opravě - zadaná, čeká na zanesení / zahození |
||||
|
<li> Zanesená - zanesená v TeXu |
||||
|
<li> Irelevantní - není to chyba, nebude zanesena |
||||
|
<li> K reakci - vyžaduje reakci od autora <i>(zatím není |
||||
|
implementováno)</i> |
||||
|
</ul> |
||||
|
<h3> PDF </h3> |
||||
|
<ul> |
||||
|
<li> Přidávání - probíhá přidávání korektur |
||||
|
<li> Zanášení - probíhá zanášení korektur do TeXu |
||||
|
<li> Zastaralé - PDF je zastaralé, nepřidávat nové korektury |
||||
|
</ul> |
||||
|
|
||||
|
{% endblock content %} |
@ -0,0 +1,187 @@ |
|||||
|
{% load staticfiles %} |
||||
|
|
||||
|
<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 {{pdf.nazev}}</title> |
||||
|
</head> |
||||
|
<body {% if pdf.status = 'zanaseni'%} class="comitting" {% elif pdf.status = 'zastarale' %} class="deprecated" {% endif %}> |
||||
|
<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 = 'zastarale' %} <h2> Toto PDF je již zastaralé, nepřidávejte nové korektury </h2> {% endif %} |
||||
|
<i>{{pdf.komentar}}</i> |
||||
|
<br> |
||||
|
<i>Klikni na chybu, napiš komentář</i> | |
||||
|
<a href="../">seznam souborů</a> | |
||||
|
<a href="../help">nápověda</a> | | |
||||
|
<a href="/">hlavní stránka</a> | |
||||
|
<a href="https://mam.mff.cuni.cz/wiki">wiki</a> | |
||||
|
<hr/> |
||||
|
|
||||
|
<div id="commform-div"> |
||||
|
<!-- Pridat korekturu / komentar !--> |
||||
|
<form action='' onsubmit='save_scroll(this)' id="commform" method="POST"> |
||||
|
{% csrf_token %} |
||||
|
<input size="8" name="au" value="{{user.username}}"/> |
||||
|
<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='{{pdf.id}}'/> |
||||
|
<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> |
||||
|
<!-- /Pridat korekturu / komentar !--> |
||||
|
</div> |
||||
|
|
||||
|
{% for i in img_indexes %} |
||||
|
<div class='imgdiv'> |
||||
|
<img width='1021' height='1448' |
||||
|
onclick='img_click(this,event)' id='img-{{i}}' |
||||
|
src='/media/korektury/img/{{img_name}}-{{i}}.png'/> |
||||
|
</div> |
||||
|
<hr/> |
||||
|
{% endfor %} |
||||
|
|
||||
|
<!-- Smazat vsechny komentare !--> |
||||
|
<form method="post"> |
||||
|
{% csrf_token %} |
||||
|
<input type='hidden' name='action' value='delall'/> |
||||
|
<input type='submit' value='Smazat všechny komentáře'/> |
||||
|
<input type='hidden' name='pdf' value='{{pdf.id}}'/> |
||||
|
<input type='checkbox' name='yes'/> Souhlasím se smazáním všech kometářů |
||||
|
</form> |
||||
|
<!-- /Smazat vsechny komentare !--> |
||||
|
<hr/> |
||||
|
<h4>Změnit stav PDF:</h4> |
||||
|
<i>Aktuální: {{pdf.status}}</i> |
||||
|
<br> |
||||
|
<!-- Zmenit stav PDF !--> |
||||
|
<form method="post"> |
||||
|
{% csrf_token %} |
||||
|
<input type='hidden' name='action' value='set-state'/> |
||||
|
<input type='hidden' name='pdf' value='{{pdf.id}}'/> |
||||
|
<input type="radio" name="state" value="adding" {% if pdf.status = 'pridavani' %} checked {% endif %}>Přidávání korektur |
||||
|
<br> |
||||
|
<input type="radio" name="state" value="comitting" {% if pdf.status = 'zanaseni' %} checked {% endif %}>Zanášení korektur |
||||
|
<br> |
||||
|
<input type="radio" name="state" value="deprecated" {% if pdf.status = 'zastarale' %} checked {% endif %}>Zastaralé, nekorigovat |
||||
|
<br> |
||||
|
<input type='submit' value='Změnit stav PDF'/> |
||||
|
</form> |
||||
|
|
||||
|
<!-- /Zmenit stav PDF !--> |
||||
|
<hr/> |
||||
|
<p> |
||||
|
Děkujeme opravovatelům: {% for autor,pocet in zasluhy.items %} {{autor}}({{pocet}}) {% endfor %}</p> |
||||
|
<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> |
||||
|
</div> |
||||
|
</div> |
||||
|
<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> |
||||
|
{% endfor %} |
||||
|
|
||||
|
<script> |
||||
|
{% for s in opravy_strany %} |
||||
|
place_comments_one_div("img-{{s.strana}}", [{% for o in s.op_id %}["op{{o.id}}",{{o.x}},{{o.y}}],{% endfor %}[]]); |
||||
|
{% endfor %} |
||||
|
{% if scroll %} |
||||
|
window.scrollTo(0,{{scroll}}); |
||||
|
{% endif %} |
||||
|
</script> |
||||
|
</body> |
||||
|
</html> |
@ -0,0 +1,22 @@ |
|||||
|
{% extends "korektury/base.html" %} |
||||
|
|
||||
|
{% block content %} |
||||
|
|
||||
|
<h1> |
||||
|
{% block nadpis1a %} |
||||
|
{% block title %} |
||||
|
Korektury |
||||
|
{% endblock title %} |
||||
|
{% endblock nadpis1a %} |
||||
|
</h1> |
||||
|
|
||||
|
<ul> |
||||
|
{% for pdf in object_list %} |
||||
|
<li> <b>{{ pdf.nazev }}</b> <i>{{pdf.komentar}}</i> <a href="/korektury/{{pdf.id}}">{{pdf.pdf.url}}</a> </li> |
||||
|
{% empty %} |
||||
|
<li> Nejsou žádné dokumenty ke korekturování. |
||||
|
{% endfor %} |
||||
|
</ul> |
||||
|
|
||||
|
|
||||
|
{% endblock content %} |
@ -0,0 +1,3 @@ |
|||||
|
from django.test import TestCase |
||||
|
|
||||
|
# Create your tests here. |
@ -0,0 +1,12 @@ |
|||||
|
from django.conf.urls import * # NOQA |
||||
|
from django.conf.urls import patterns, url |
||||
|
from django.contrib.auth.decorators import user_passes_test |
||||
|
from . import views |
||||
|
|
||||
|
staff_member_required = user_passes_test(lambda u: u.is_staff) |
||||
|
|
||||
|
urlpatterns = patterns('', |
||||
|
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/help/', staff_member_required(views.KorekturyHelpView.as_view()), name='korektury-help'), |
||||
|
) |
@ -0,0 +1,165 @@ |
|||||
|
# -*- 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,Komentar,KorekturovanePDF |
||||
|
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 |
||||
|
|
||||
|
class KorekturyHelpView(generic.TemplateView): |
||||
|
template_name = 'korektury/help.html' |
||||
|
|
||||
|
class KorekturyListView(generic.ListView): |
||||
|
model = KorekturovanePDF |
||||
|
template_name = 'korektury/seznam.html' |
||||
|
|
||||
|
### 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 |
||||
|
scroll = q.get('scroll') |
||||
|
autor = q.get('au') |
||||
|
print "autor:" + str(autor) |
||||
|
if not autor: |
||||
|
autor = 'anonym' |
||||
|
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.filter(id=q.get('pdf')).first() |
||||
|
|
||||
|
op = Oprava(x=x,y=y, autor=autor, text=text, strana=strana,pdf = pdf) |
||||
|
op.save() |
||||
|
elif (action == u'del'): |
||||
|
id = int(q.get('id')) |
||||
|
op = Oprava.objects.filter(id=id).first() |
||||
|
op.delete() |
||||
|
elif (action == u'update'): |
||||
|
id = int(q.get('id')) |
||||
|
op = Oprava.objects.filter(id=id).first() |
||||
|
text = q.get('txt') |
||||
|
op.autor = autor |
||||
|
op.text = text |
||||
|
op.save() |
||||
|
elif (action == u'undone'): |
||||
|
id = int(q.get('id')) |
||||
|
op = Oprava.objects.filter(id=id).first() |
||||
|
op.status = op.STATUS_K_OPRAVE |
||||
|
op.save() |
||||
|
elif (action == u'done'): |
||||
|
id = int(q.get('id')) |
||||
|
op = Oprava.objects.filter(id=id).first() |
||||
|
op.status = op.STATUS_OPRAVENO |
||||
|
op.save() |
||||
|
elif (action == u'wontfix'): |
||||
|
id = int(q.get('id')) |
||||
|
op = Oprava.objects.filter(id=id).first() |
||||
|
op.status = op.STATUS_NENI_CHYBA |
||||
|
op.save() |
||||
|
elif (action == u'comment'): |
||||
|
id = int(q.get('id')) |
||||
|
op = Oprava.objects.filter(id=id).first() |
||||
|
text = q.get('txt') |
||||
|
kom = Komentar(oprava=op,autor=autor,text=text) |
||||
|
kom.save() |
||||
|
elif (action == u'update-comment'): |
||||
|
id = int(q.get('id')) |
||||
|
kom = Komentar.objects.filter(id=id).first() |
||||
|
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.filter(id=id).first() |
||||
|
kom.delete() |
||||
|
elif (action == u'delall'): |
||||
|
pdf = KorekturovanePDF.objects.filter(id=q.get('pdf')) |
||||
|
checked = q.get('yes') |
||||
|
if checked: |
||||
|
opravy = Oprava.objects.filter(pdf=pdf) |
||||
|
komentare = Komentar.objects.filter(oprava=opravy) |
||||
|
opravy.delete() |
||||
|
komentare.delete() |
||||
|
elif (action == u'set-state'): |
||||
|
pdf = KorekturovanePDF.objects.get(id=q.get('pdf')) |
||||
|
if (q.get('state') == u'adding'): |
||||
|
pdf.status = pdf.STATUS_PRIDAVANI |
||||
|
elif (q.get('state') == u'comitting'): |
||||
|
pdf.status = pdf.STATUS_ZANASENI |
||||
|
elif (q.get('state') == u'deprecated'): |
||||
|
pdf.status = pdf.STATUS_ZASTARALE |
||||
|
pdf.save() |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
# return HttpResponse(u'Keys: %s '%(q.iteitems())) |
||||
|
# return HttpResponse(u'Oprav: %d, akce: %s'%( |
||||
|
# len(Oprava.objects.all()),action)) |
||||
|
|
||||
|
# return HttpResponseRedirect(reverse('korektury')+"?scroll=%s"%(scroll)) |
||||
|
context = self.get_context_data() |
||||
|
context['scroll'] = scroll |
||||
|
context['autor'] = autor |
||||
|
return render(request, 'korektury/opraf.html',context) |
||||
|
# 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) |
||||
|
pdf = KorekturovanePDF.objects.filter(id=self.kwargs['pdf']).first() |
||||
|
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 |
||||
|
|
||||
|
strany = opravy.values('strana') |
||||
|
opravy_na_stranu = [{'strana':s['strana'],'op_id':opravy.filter(strana=s['strana'])} 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) |
||||
|
|
@ -0,0 +1,36 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
from __future__ import unicode_literals |
||||
|
|
||||
|
from django.db import models, migrations |
||||
|
|
||||
|
|
||||
|
class Migration(migrations.Migration): |
||||
|
|
||||
|
dependencies = [ |
||||
|
('seminar', '0035_django_imagekit'), |
||||
|
] |
||||
|
|
||||
|
operations = [ |
||||
|
migrations.CreateModel( |
||||
|
name='Soustredeni_Organizatori', |
||||
|
fields=[ |
||||
|
('id', models.AutoField(serialize=False, primary_key=True)), |
||||
|
('poznamka', models.TextField(help_text='Neve\u0159ejn\xe1 pozn\xe1mka k \xfa\u010dasti organiz\xe1tora (plain text)', verbose_name='neve\u0159ejn\xe1 pozn\xe1mka', blank=True)), |
||||
|
('organizator', models.ForeignKey(verbose_name='organiz\xe1tor', to='seminar.Organizator')), |
||||
|
('soustredeni', models.ForeignKey(verbose_name='soust\u0159ed\u011bn\xed', to='seminar.Soustredeni')), |
||||
|
], |
||||
|
options={ |
||||
|
'ordering': ['soustredeni', 'organizator'], |
||||
|
'db_table': 'seminar_soustredeni_organizatori', |
||||
|
'verbose_name': '\xda\u010dast organiz\xe1tor\u016f na soust\u0159ed\u011bn\xed', |
||||
|
'verbose_name_plural': '\xda\u010dasti organiz\xe1tor\u016f na soust\u0159ed\u011bn\xed', |
||||
|
}, |
||||
|
bases=(models.Model,), |
||||
|
), |
||||
|
migrations.AddField( |
||||
|
model_name='soustredeni', |
||||
|
name='organizatori', |
||||
|
field=models.ManyToManyField(help_text='Seznam organiz\xe1tor\u016f soust\u0159ed\u011bn\xed', to='seminar.Organizator', verbose_name='Organiz\xe1to\u0159i soust\u0159ed\u011bn\xed', through='seminar.Soustredeni_Organizatori'), |
||||
|
preserve_default=True, |
||||
|
), |
||||
|
] |