Merge branch 'korekturovatko'
This commit is contained in:
commit
c41281378b
9 changed files with 74 additions and 126 deletions
|
@ -35,7 +35,6 @@
|
||||||
for (let [_, opravy] of Object.entries(comments)) {
|
for (let [_, opravy] of Object.entries(comments)) {
|
||||||
for (const oprava of opravy) {
|
for (const oprava of opravy) {
|
||||||
if (stav == null || oprava.status === stav) {
|
if (stav == null || oprava.status === stav) {
|
||||||
console.log(oprava, oprava.htmlElement.getBoundingClientRect().y);
|
|
||||||
const y = oprava.htmlElement.getBoundingClientRect().y;
|
const y = oprava.htmlElement.getBoundingClientRect().y;
|
||||||
if (y >= -1) {
|
if (y >= -1) {
|
||||||
if (dalsi) {
|
if (dalsi) {
|
||||||
|
@ -44,7 +43,6 @@
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
console.log(predchozi);
|
|
||||||
if (predchozi !== null) predchozi.htmlElement.scrollIntoView(); else alert("Výše už není žádná taková korektura.");
|
if (predchozi !== null) predchozi.htmlElement.scrollIntoView(); else alert("Výše už není žádná taková korektura.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
#autor; #text;
|
#autor; #text;
|
||||||
htmlElement;
|
htmlElement;
|
||||||
id; oprava; {# komentar_data; #}
|
id; oprava; {# komentar_data; #}
|
||||||
|
autor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -66,7 +67,11 @@
|
||||||
this.set_text(komentar_data['text']);
|
this.set_text(komentar_data['text']);
|
||||||
};
|
};
|
||||||
|
|
||||||
set_autor(autor) {this.#autor.textContent=autor;};
|
set_autor(autor) {
|
||||||
|
this.#autor.textContent=autor;
|
||||||
|
this.autor = autor;
|
||||||
|
};
|
||||||
|
|
||||||
set_text(text) {
|
set_text(text) {
|
||||||
this.#text.innerHTML=text;
|
this.#text.innerHTML=text;
|
||||||
};
|
};
|
||||||
|
|
|
@ -151,7 +151,10 @@
|
||||||
fetch('{% url "korektury_api_oprava_stav" %}', {method: 'POST', body: data})
|
fetch('{% url "korektury_api_oprava_stav" %}', {method: 'POST', body: data})
|
||||||
.then(response => {
|
.then(response => {
|
||||||
if (!response.ok) {alert('Něco se nepovedlo:' + response.statusText);}
|
if (!response.ok) {alert('Něco se nepovedlo:' + response.statusText);}
|
||||||
else response.json().then(data => this.set_status(data['status']));
|
else response.json().then(data => {
|
||||||
|
this.set_status(data['status']);
|
||||||
|
updatuj_pocty_stavu();
|
||||||
|
});
|
||||||
})
|
})
|
||||||
.catch(error => {alert('Něco se nepovedlo:' + error);});
|
.catch(error => {alert('Něco se nepovedlo:' + error);});
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<img
|
<img
|
||||||
id='img-{{i}}'
|
id='img-{{i}}'
|
||||||
width='1021' height='1448'
|
width='1021' height='1448'
|
||||||
src='/media/korektury/img/{{img_prefix}}-{{i}}.png'
|
src='/media/korektury/img/{{korekturovanepdf.get_prefix}}-{{i}}.png'
|
||||||
alt='Strana {{ i|add:1 }}'
|
alt='Strana {{ i|add:1 }}'
|
||||||
class="strana"
|
class="strana"
|
||||||
/>
|
/>
|
||||||
|
@ -14,6 +14,9 @@
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
// Mapování stránka -> korektury
|
// Mapování stránka -> korektury
|
||||||
|
/**
|
||||||
|
* @type {Object.<number, Array<Oprava>>}
|
||||||
|
*/
|
||||||
const comments = {
|
const comments = {
|
||||||
{% for s in img_indexes %}
|
{% for s in img_indexes %}
|
||||||
{{s}}: []{% if not forloop.last %},{% endif %}
|
{{s}}: []{% if not forloop.last %},{% endif %}
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
* @param pri_uspechu Akce, která se má provést při úspěchu (speciálně zavřít formulář)
|
* @param pri_uspechu Akce, která se má provést při úspěchu (speciálně zavřít formulář)
|
||||||
*/
|
*/
|
||||||
function update_all(data={}, catchError=true, pri_uspechu=null) { // FIXME není mi jasné, zda v {} nemá být `cache: "no-store"`, aby prohlížeč necachoval GET.
|
function update_all(data={}, catchError=true, pri_uspechu=null) { // FIXME není mi jasné, zda v {} nemá být `cache: "no-store"`, aby prohlížeč necachoval GET.
|
||||||
fetch('{% url "korektury_api_opravy_a_komentare" pdf.id %}', data)
|
fetch('{% url "korektury_api_opravy_a_komentare" korekturovanepdf.id %}', data)
|
||||||
.then(response => {
|
.then(response => {
|
||||||
if (!response.ok && catchError) {alert('Něco se nepovedlo:' + response.statusText);}
|
if (!response.ok && catchError) {alert('Něco se nepovedlo:' + response.statusText);}
|
||||||
else response.json().then(data => {
|
else response.json().then(data => {
|
||||||
|
@ -30,6 +30,8 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updatuj_pocty_stavu();
|
||||||
|
updatuj_pocty_zasluh();
|
||||||
place_comments();
|
place_comments();
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
|
|
|
@ -3,26 +3,33 @@ Zobrazit:
|
||||||
id="k_oprave_checkbox"
|
id="k_oprave_checkbox"
|
||||||
name="k_oprave_checkbox"
|
name="k_oprave_checkbox"
|
||||||
onchange="toggle_corrections('k_oprave')" checked>
|
onchange="toggle_corrections('k_oprave')" checked>
|
||||||
<label for="k_oprave_checkbox">K opravě ({{k_oprave_cnt}})</label>
|
<label for="k_oprave_checkbox">K opravě (<span id="k_oprave_pocet">↺</span>)</label>
|
||||||
<input type="checkbox"
|
<input type="checkbox"
|
||||||
id="opraveno_checkbox"
|
id="opraveno_checkbox"
|
||||||
name="opraveno_checkbox"
|
name="opraveno_checkbox"
|
||||||
onchange="toggle_corrections('opraveno')" checked>
|
onchange="toggle_corrections('opraveno')" checked>
|
||||||
<label for="opraveno_checkbox">Opraveno ({{opraveno_cnt}})</label>
|
<label for="opraveno_checkbox">Opraveno (<span id="opraveno_pocet">↺</span>)</label>
|
||||||
<input type="checkbox"
|
<input type="checkbox"
|
||||||
id="neni_chyba_checkbox"
|
id="neni_chyba_checkbox"
|
||||||
name="neni_chyba_checkbox"
|
name="neni_chyba_checkbox"
|
||||||
onchange="toggle_corrections('neni_chyba')" checked>
|
onchange="toggle_corrections('neni_chyba')" checked>
|
||||||
<label for="neni_chyba_checkbox">Není chyba ({{neni_chyba_cnt}})</label>
|
<label for="neni_chyba_checkbox">Není chyba (<span id="neni_chyba_pocet">↺</span>)</label>
|
||||||
<input type="checkbox"
|
<input type="checkbox"
|
||||||
id="k_zaneseni_checkbox"
|
id="k_zaneseni_checkbox"
|
||||||
name="k_zaneseni_checkbox"
|
name="k_zaneseni_checkbox"
|
||||||
onchange="toggle_corrections('k_zaneseni')" checked>
|
onchange="toggle_corrections('k_zaneseni')" checked>
|
||||||
<label for="k_zaneseni_checkbox">K zanesení ({{k_zaneseni_cnt}})</label>
|
<label for="k_zaneseni_checkbox">K zanesení (<span id="k_zaneseni_pocet">↺</span>)</label>
|
||||||
|
|
||||||
<hr/>
|
<hr/>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
const spany_s_pocty_stavu = {
|
||||||
|
'k_oprave': document.getElementById('k_oprave_pocet'),
|
||||||
|
'opraveno': document.getElementById('opraveno_pocet'),
|
||||||
|
'neni_chyba': document.getElementById('neni_chyba_pocet'),
|
||||||
|
'k_zaneseni': document.getElementById('k_zaneseni_pocet'),
|
||||||
|
}
|
||||||
|
|
||||||
function toggle_corrections(aclass)
|
function toggle_corrections(aclass)
|
||||||
{
|
{
|
||||||
const stylesheets = document.styleSheets;
|
const stylesheets = document.styleSheets;
|
||||||
|
@ -48,4 +55,14 @@ Zobrazit:
|
||||||
}
|
}
|
||||||
place_comments();
|
place_comments();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function updatuj_pocty_stavu() {
|
||||||
|
const pocty_stavu = {};
|
||||||
|
for (const stav of Object.keys(spany_s_pocty_stavu)) pocty_stavu[stav] = 0;
|
||||||
|
for (const oprava of Object.values(opravy)) {
|
||||||
|
if (!(oprava.status in pocty_stavu)) pocty_stavu[oprava.status] = 0;
|
||||||
|
pocty_stavu[oprava.status] += 1;
|
||||||
|
}
|
||||||
|
for (let [stav, pocet] of Object.entries(pocty_stavu)) spany_s_pocty_stavu[stav].innerText = pocet;
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
<h4>Změnit stav PDF:</h4>
|
<h4>Změnit stav PDF:</h4>
|
||||||
<i>Aktuální: {{pdf.status}}</i>
|
<i>Aktuální: {{korekturovanepdf.status}}</i>
|
||||||
<br>
|
<br>
|
||||||
<form method="post" id="PDFSTAV_FORM">
|
<form method="post" id="PDFSTAV_FORM">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<input type="radio" name="state" value="{{ pdf.STATUS.PRIDAVANI }}" {% if pdf.status == pdf.STATUS.PRIDAVANI %} checked {% endif %}>Přidávání korektur
|
<input type="radio" name="state" value="{{ korekturovanepdf.STATUS.PRIDAVANI }}" {% if korekturovanepdf.status == korekturovanepdf.STATUS.PRIDAVANI %} checked {% endif %}>Přidávání korektur
|
||||||
<br>
|
<br>
|
||||||
<input type="radio" name="state" value="{{ pdf.STATUS.ZANASENI }}" {% if pdf.status == pdf.STATUS.ZANASENI %} checked {% endif %}>Zanášení korektur
|
<input type="radio" name="state" value="{{ korekturovanepdf.STATUS.ZANASENI }}" {% if korekturovanepdf.status == korekturovanepdf.STATUS.ZANASENI %} checked {% endif %}>Zanášení korektur
|
||||||
<br>
|
<br>
|
||||||
<input type="radio" name="state" value="{{ pdf.STATUS.ZASTARALE }}" {% if pdf.status == pdf.STATUS.ZASTARALE %} checked {% endif %}>Zastaralé, nekorigovat
|
<input type="radio" name="state" value="{{ korekturovanepdf.STATUS.ZASTARALE }}" {% if korekturovanepdf.status == korekturovanepdf.STATUS.ZASTARALE %} checked {% endif %}>Zastaralé, nekorigovat
|
||||||
<br>
|
<br>
|
||||||
<input type='submit' value='Změnit stav PDF'/>
|
<input type='submit' value='Změnit stav PDF'/>
|
||||||
</form>
|
</form>
|
||||||
|
@ -21,7 +21,7 @@
|
||||||
* @param {Boolean} catchError
|
* @param {Boolean} catchError
|
||||||
*/
|
*/
|
||||||
function fetchStav(data, catchError=true) {
|
function fetchStav(data, catchError=true) {
|
||||||
fetch("{% url 'korektury_api_pdf_stav' pdf.id %}", data
|
fetch("{% url 'korektury_api_pdf_stav' korekturovanepdf.id %}", data
|
||||||
)
|
)
|
||||||
.then(response => {
|
.then(response => {
|
||||||
if (!response.ok) { if (catchError) alert("Něco se nepovedlo:" + response.statusText);}
|
if (!response.ok) { if (catchError) alert("Něco se nepovedlo:" + response.statusText);}
|
||||||
|
|
|
@ -6,19 +6,19 @@
|
||||||
<link rel="stylesheet" title="opraf-css" type="text/css" media="screen, projection" href="{% static "korektury/opraf.css"%}?version=1" />
|
<link rel="stylesheet" title="opraf-css" type="text/css" media="screen, projection" href="{% static "korektury/opraf.css"%}?version=1" />
|
||||||
<link href="{% static 'css/rozliseni.css' %}?version=1" rel="stylesheet">
|
<link href="{% static 'css/rozliseni.css' %}?version=1" rel="stylesheet">
|
||||||
<script src="{% static "korektury/opraf.js"%}?version=1"></script>
|
<script src="{% static "korektury/opraf.js"%}?version=1"></script>
|
||||||
<title>Korektury {{pdf.nazev}}</title>
|
<title>Korektury {{korekturovanepdf.nazev}}</title>
|
||||||
</head>
|
</head>
|
||||||
<body class="{{ LOCAL_TEST_PROD }}web" data-status="{{ pdf.status }}" onload='place_comments()'>
|
<body class="{{ LOCAL_TEST_PROD }}web" data-status="{{ korekturovanepdf.status }}">
|
||||||
|
|
||||||
<h1>Korektury {{pdf.nazev}}</h1>
|
<h1>Korektury {{korekturovanepdf.nazev}}</h1>
|
||||||
|
|
||||||
<h2 class="textzanaseni"> Probíhá zanášení korektur, zvažte, zda chcete přidávat nové </h2>
|
<h2 class="textzanaseni"> Probíhá zanášení korektur, zvažte, zda chcete přidávat nové </h2>
|
||||||
<h2 class="textzastarale"> Toto PDF je již zastaralé, nepřidávejte nové korektury </h2>
|
<h2 class="textzastarale"> Toto PDF je již zastaralé, nepřidávejte nové korektury </h2>
|
||||||
|
|
||||||
<i>{{pdf.komentar}}</i>
|
<i>{{korekturovanepdf.komentar}}</i>
|
||||||
<br>
|
<br>
|
||||||
<i>Klikni na chybu, napiš komentář</i> |
|
<i>Klikni na chybu, napiš komentář</i> |
|
||||||
<a href="{{pdf.pdf.url}}">stáhnout PDF (bez korektur)</a> |
|
<a href="{{korekturovanepdf.pdf.url}}">stáhnout PDF (bez korektur)</a> |
|
||||||
<a href="../">seznam souborů</a> |
|
<a href="../">seznam souborů</a> |
|
||||||
<a href="/admin/korektury/korekturovanepdf/">Spravovat PDF</a> |
|
<a href="/admin/korektury/korekturovanepdf/">Spravovat PDF</a> |
|
||||||
<a href="../help">nápověda</a> |
|
<a href="../help">nápověda</a> |
|
||||||
|
@ -35,10 +35,27 @@
|
||||||
|
|
||||||
<hr/>
|
<hr/>
|
||||||
<p>
|
<p>
|
||||||
Děkujeme opravovatelům:
|
Děkujeme opravovatelům: <span id="pocty_autoru">↺</span></p>
|
||||||
{% for z in zasluhy %}
|
|
||||||
{{z.autor}} ({{z.pocet}}){% if not forloop.last %},{% endif %}
|
|
||||||
{% endfor %}</p>
|
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
const span_s_pocty_autoru = document.getElementById("pocty_autoru")
|
||||||
|
|
||||||
|
function updatuj_pocty_zasluh() {
|
||||||
|
const pocty_autoru = {};
|
||||||
|
for (let komentar of Object.values(komentare)) {
|
||||||
|
if (!(komentar.autor in pocty_autoru)) pocty_autoru[komentar.autor] = 0;
|
||||||
|
pocty_autoru[komentar.autor] += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
const setrizene = [];
|
||||||
|
for (const keyval of Object.entries(pocty_autoru)) setrizene.push(keyval);
|
||||||
|
setrizene.sort(function(a, b) {return a[1] - b[1];});
|
||||||
|
|
||||||
|
let ans = "";
|
||||||
|
for (let [autor, pocet] of setrizene) ans += `, ${autor} (${pocet})`;
|
||||||
|
span_s_pocty_autoru.innerHTML = ans.substring(2);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -1,11 +1,7 @@
|
||||||
from django.shortcuts import get_object_or_404, render
|
|
||||||
from django.views import generic
|
from django.views import generic
|
||||||
from django.conf import settings
|
|
||||||
from django.http import HttpResponseForbidden
|
|
||||||
from django.db.models import Count,Q
|
from django.db.models import Count,Q
|
||||||
|
|
||||||
from .utils import send_email_notification_komentar
|
from .models import Oprava, KorekturovanePDF, KorekturaTag
|
||||||
from .models import Oprava, Komentar, KorekturovanePDF, Organizator, KorekturaTag
|
|
||||||
|
|
||||||
class KorekturyListView(generic.ListView):
|
class KorekturyListView(generic.ListView):
|
||||||
model = KorekturovanePDF
|
model = KorekturovanePDF
|
||||||
|
@ -50,107 +46,14 @@ class KorekturySeskupeneListView(KorekturyAktualniListView):
|
||||||
return reversed(sorted(qs, key=lambda it: it.cislo_a_tema))
|
return reversed(sorted(qs, key=lambda it: it.cislo_a_tema))
|
||||||
|
|
||||||
### Korektury
|
### Korektury
|
||||||
class KorekturyView(generic.TemplateView):
|
class KorekturyView(generic.DetailView):
|
||||||
model = Oprava
|
model = KorekturovanePDF
|
||||||
|
pk_url_kwarg = "pdf"
|
||||||
template_name = 'korektury/korekturovatko/htmlstrana.html'
|
template_name = 'korektury/korekturovatko/htmlstrana.html'
|
||||||
|
|
||||||
def setup(self, request, *args, **kwargs):
|
|
||||||
super().setup(request, *args, **kwargs)
|
|
||||||
self.pdf_id = self.kwargs["pdf"]
|
|
||||||
self.pdf = get_object_or_404(KorekturovanePDF, id=self.pdf_id)
|
|
||||||
|
|
||||||
def post(self, request, *args, **kwargs):
|
|
||||||
q = request.POST
|
|
||||||
|
|
||||||
# prirazeni autora podle prihlaseni
|
|
||||||
autor_user = request.user
|
|
||||||
# pokud existuje ucet (user), ale neni to organizator = 403
|
|
||||||
autor = Organizator.objects.filter(osoba__user=autor_user).first()
|
|
||||||
if not autor:
|
|
||||||
return HttpResponseForbidden()
|
|
||||||
|
|
||||||
action = q.get('action')
|
|
||||||
if (action == ''): # Přidej
|
|
||||||
x = int(q.get('x'))
|
|
||||||
y = int(q.get('y'))
|
|
||||||
text = q.get('txt')
|
|
||||||
strana = int(q.get('img-id')[4:])
|
|
||||||
op = Oprava(x=x,y=y, strana=strana, pdf=self.pdf)
|
|
||||||
op.save()
|
|
||||||
kom = Komentar(oprava=op,autor=autor,text=text)
|
|
||||||
kom.save()
|
|
||||||
send_email_notification_komentar(op, autor, request)
|
|
||||||
elif (action == 'del'):
|
|
||||||
id = int(q.get('id'))
|
|
||||||
op = Oprava.objects.get(id=id)
|
|
||||||
for k in Komentar.objects.filter(oprava=op):
|
|
||||||
k.delete()
|
|
||||||
op.delete()
|
|
||||||
elif action in Oprava.STATUS.values:
|
|
||||||
id = int(q.get('id'))
|
|
||||||
op = Oprava.objects.get(id=id)
|
|
||||||
op.status = action
|
|
||||||
op.save()
|
|
||||||
elif (action == '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()
|
|
||||||
send_email_notification_komentar(op, autor, request)
|
|
||||||
elif (action == '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 == 'del-comment'):
|
|
||||||
id = int(q.get('id'))
|
|
||||||
kom = Komentar.objects.get(id=id)
|
|
||||||
kom.delete()
|
|
||||||
elif (action == 'set-state'):
|
|
||||||
status = q.get('state')
|
|
||||||
assert status in KorekturovanePDF.STATUS.values
|
|
||||||
self.pdf.status = status
|
|
||||||
self.pdf.save()
|
|
||||||
context = self.get_context_data()
|
|
||||||
context['autor'] = autor
|
|
||||||
return render(request, 'korektury/korekturovatko/htmlstrana.html', context)
|
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super().get_context_data(**kwargs)
|
context = super().get_context_data(**kwargs)
|
||||||
context['pdf'] = self.pdf
|
context['img_indexes'] = range(self.object.stran)
|
||||||
context['img_prefix'] = self.pdf.get_prefix()
|
|
||||||
context['img_path'] = settings.KOREKTURY_IMG_DIR
|
|
||||||
context['img_indexes'] = range(self.pdf.stran)
|
|
||||||
opravy = Oprava.objects.filter(pdf=self.pdf_id)
|
|
||||||
zasluhy = {}
|
|
||||||
for o in opravy:
|
|
||||||
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['k_oprave_cnt'] = opravy.filter(status='k_oprave').count()
|
|
||||||
context['opraveno_cnt'] = opravy.filter(status='opraveno').count()
|
|
||||||
context['neni_chyba_cnt'] = opravy.filter(status='neni_chyba').count()
|
|
||||||
context['k_zaneseni_cnt'] = opravy.filter(status='k_zaneseni').count()
|
|
||||||
|
|
||||||
context['opravy'] = opravy
|
|
||||||
context['zasluhy'] = zasluhy
|
|
||||||
|
|
||||||
context['tagy'] = KorekturaTag.objects.all()
|
context['tagy'] = KorekturaTag.objects.all()
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue