diff --git a/.gitignore b/.gitignore
index 36b0b565..05e728bd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,3 +24,9 @@ TODO
# .htpasswd kvůli přihlášení
.htpasswd
+
+# reversion kvůli historii objektů v reversion
+**/reversion
+
+# pro lidi, co programují v nástrojích od JetBrains
+.idea
\ No newline at end of file
diff --git a/flat.json b/data/flat.json
similarity index 100%
rename from flat.json
rename to data/flat.json
diff --git a/data/fotka_header.json b/data/fotka_header.json
new file mode 100644
index 00000000..065c378a
--- /dev/null
+++ b/data/fotka_header.json
@@ -0,0 +1,207 @@
+[
+{
+ "model": "header_fotky.fotkaheader",
+ "pk": "baliky.jpg",
+ "fields": {
+ "cas": "2020-09-20T09:18:34.562Z",
+ "fotka": "header/baliky.jpg"
+ }
+},
+{
+ "model": "header_fotky.fotkaheader",
+ "pk": "beh.jpg",
+ "fields": {
+ "cas": "2020-09-20T09:18:34.562Z",
+ "fotka": "header/beh.jpg"
+ }
+},
+{
+ "model": "header_fotky.fotkaheader",
+ "pk": "kryptografie.jpg",
+ "fields": {
+ "cas": "2020-09-20T09:18:34.562Z",
+ "fotka": "header/kryptografie.jpg"
+ }
+},
+{
+ "model": "header_fotky.fotkaheader",
+ "pk": "mam_cernobile.jpg",
+ "fields": {
+ "cas": "2020-09-20T09:18:34.562Z",
+ "fotka": "header/mam_cernobile.jpg"
+ }
+},
+{
+ "model": "header_fotky.fotkaheader",
+ "pk": "noc.jpg",
+ "fields": {
+ "cas": "2020-09-20T09:18:34.562Z",
+ "fotka": "header/noc.jpg"
+ }
+},
+{
+ "model": "header_fotky.fotkaheader",
+ "pk": "ohen.jpg",
+ "fields": {
+ "cas": "2020-09-20T09:18:34.562Z",
+ "fotka": "header/ohen.jpg"
+ }
+},
+{
+ "model": "header_fotky.fotkaheader",
+ "pk": "snih.jpg",
+ "fields": {
+ "cas": "2020-09-20T09:18:34.562Z",
+ "fotka": "header/snih.jpg"
+ }
+},
+{
+ "model": "header_fotky.fotkaheader",
+ "pk": "spolecna.jpg",
+ "fields": {
+ "cas": "2020-09-20T09:18:34.562Z",
+ "fotka": "header/spolecna.jpg"
+ }
+},
+{
+ "model": "header_fotky.fotkaheader",
+ "pk": "stiny.jpg",
+ "fields": {
+ "cas": "2020-09-20T09:18:34.562Z",
+ "fotka": "header/stiny.jpg"
+ }
+},
+{
+ "model": "header_fotky.fotkaheader",
+ "pk": "vikendovka.jpg",
+ "fields": {
+ "cas": "2020-09-20T09:18:34.562Z",
+ "fotka": "header/vikendovka.jpg"
+ }
+},
+{
+ "model": "header_fotky.fotkaheader",
+ "pk": "vylet.jpg",
+ "fields": {
+ "cas": "2020-09-20T09:18:34.562Z",
+ "fotka": "header/vylet.jpg"
+ }
+},
+{
+ "model": "header_fotky.fotkaurlvazba",
+ "pk": 1,
+ "fields": {
+ "url": "/archiv/",
+ "fotka": "stiny.jpg",
+ "denni_doba": "oboji"
+ }
+},
+{
+ "model": "header_fotky.fotkaurlvazba",
+ "pk": 2,
+ "fields": {
+ "url": "/clanky/",
+ "fotka": "kryptografie.jpg",
+ "denni_doba": "den"
+ }
+},
+{
+ "model": "header_fotky.fotkaurlvazba",
+ "pk": 3,
+ "fields": {
+ "url": "/clanky/",
+ "fotka": "ohen.jpg",
+ "denni_doba": "noc"
+ }
+},
+{
+ "model": "header_fotky.fotkaurlvazba",
+ "pk": 4,
+ "fields": {
+ "url": "/zadani/",
+ "fotka": "baliky.jpg",
+ "denni_doba": "den"
+ }
+},
+{
+ "model": "header_fotky.fotkaurlvazba",
+ "pk": 5,
+ "fields": {
+ "url": "/zadani/",
+ "fotka": "stiny.jpg",
+ "denni_doba": "noc"
+ }
+},
+{
+ "model": "header_fotky.fotkaurlvazba",
+ "pk": 6,
+ "fields": {
+ "url": "/co-je-MaM/",
+ "fotka": "vikendovka.jpg",
+ "denni_doba": "den"
+ }
+},
+{
+ "model": "header_fotky.fotkaurlvazba",
+ "pk": 7,
+ "fields": {
+ "url": "/co-je-MaM/",
+ "fotka": "noc.jpg",
+ "denni_doba": "noc"
+ }
+},
+{
+ "model": "header_fotky.fotkaurlvazba",
+ "pk": 8,
+ "fields": {
+ "url": "/soustredeni/",
+ "fotka": "beh.jpg",
+ "denni_doba": "den"
+ }
+},
+{
+ "model": "header_fotky.fotkaurlvazba",
+ "pk": 9,
+ "fields": {
+ "url": "/soustredeni/",
+ "fotka": "vylet.jpg",
+ "denni_doba": "noc"
+ }
+},
+{
+ "model": "header_fotky.fotkaurlvazba",
+ "pk": 10,
+ "fields": {
+ "url": "/login/",
+ "fotka": "baliky.jpg",
+ "denni_doba": "den"
+ }
+},
+{
+ "model": "header_fotky.fotkaurlvazba",
+ "pk": 11,
+ "fields": {
+ "url": "/login/",
+ "fotka": "stiny.jpg",
+ "denni_doba": "noc"
+ }
+},
+{
+ "model": "header_fotky.fotkaurlvazba",
+ "pk": 12,
+ "fields": {
+ "url": "/profil/",
+ "fotka": "baliky.jpg",
+ "denni_doba": "den"
+ }
+},
+{
+ "model": "header_fotky.fotkaurlvazba",
+ "pk": 13,
+ "fields": {
+ "url": "/profil/",
+ "fotka": "stiny.jpg",
+ "denni_doba": "noc"
+ }
+}
+]
\ No newline at end of file
diff --git a/sitetree_new.json b/data/sitetree_new.json
similarity index 85%
rename from sitetree_new.json
rename to data/sitetree_new.json
index e66f9bc7..195723cd 100644
--- a/sitetree_new.json
+++ b/data/sitetree_new.json
@@ -397,7 +397,7 @@
"fields": {
"title": "\u00davod",
"hint": "",
- "url": "/soustredeni/uvod/",
+ "url": "/soustredeni/",
"urlaspattern": false,
"tree": 1,
"hidden": false,
@@ -558,5 +558,103 @@
"sort_order": 24,
"access_permissions": []
}
+},
+{
+ "model": "sitetree.treeitem",
+ "pk": 28,
+ "fields": {
+ "title": "HIDDEN",
+ "hint": "",
+ "url": "/korektury/",
+ "urlaspattern": false,
+ "tree": 1,
+ "hidden": false,
+ "alias": null,
+ "description": "",
+ "inmenu": true,
+ "inbreadcrumbs": true,
+ "insitetree": true,
+ "access_loggedin": false,
+ "access_guest": false,
+ "access_restricted": true,
+ "access_perm_type": 1,
+ "parent": null,
+ "sort_order": 28,
+ "access_permissions": [
+ 1
+ ]
+ }
+},
+{
+ "model": "sitetree.treeitem",
+ "pk": 30,
+ "fields": {
+ "title": "Aktu\u00e1ln\u00ed",
+ "hint": "",
+ "url": "/korektury/",
+ "urlaspattern": false,
+ "tree": 1,
+ "hidden": false,
+ "alias": null,
+ "description": "",
+ "inmenu": true,
+ "inbreadcrumbs": true,
+ "insitetree": true,
+ "access_loggedin": false,
+ "access_guest": false,
+ "access_restricted": false,
+ "access_perm_type": 1,
+ "parent": 28,
+ "sort_order": 30,
+ "access_permissions": []
+ }
+},
+{
+ "model": "sitetree.treeitem",
+ "pk": 31,
+ "fields": {
+ "title": "Zastaral\u00e9",
+ "hint": "",
+ "url": "/korektury/zastarale/",
+ "urlaspattern": false,
+ "tree": 1,
+ "hidden": false,
+ "alias": null,
+ "description": "",
+ "inmenu": true,
+ "inbreadcrumbs": true,
+ "insitetree": true,
+ "access_loggedin": false,
+ "access_guest": false,
+ "access_restricted": false,
+ "access_perm_type": 1,
+ "parent": 28,
+ "sort_order": 31,
+ "access_permissions": []
+ }
+},
+{
+ "model": "sitetree.treeitem",
+ "pk": 32,
+ "fields": {
+ "title": "N\u00e1pov\u011bda",
+ "hint": "",
+ "url": "/korektury/help/",
+ "urlaspattern": false,
+ "tree": 1,
+ "hidden": false,
+ "alias": null,
+ "description": "",
+ "inmenu": true,
+ "inbreadcrumbs": true,
+ "insitetree": true,
+ "access_loggedin": false,
+ "access_guest": false,
+ "access_restricted": false,
+ "access_perm_type": 1,
+ "parent": 28,
+ "sort_order": 32,
+ "access_permissions": []
+ }
}
]
diff --git a/galerie/templates/galerie/Base.html b/galerie/templates/galerie/Base.html
deleted file mode 100644
index 61f96eb4..00000000
--- a/galerie/templates/galerie/Base.html
+++ /dev/null
@@ -1,6 +0,0 @@
-{% extends "base.html" %}
-
-{# TODO predelat pres context processor #}
-{% block header %}soustredeni{% endblock %}
-{% block menu_soustredeni %}selected{% endblock %}
-{% block submenu %}{% include 'seminar/soustredeni/submenu.html' %}{% endblock %}
diff --git a/galerie/templates/galerie/Galerie.html b/galerie/templates/galerie/Galerie.html
index c23c6c42..b2dfe994 100644
--- a/galerie/templates/galerie/Galerie.html
+++ b/galerie/templates/galerie/Galerie.html
@@ -1,4 +1,4 @@
-{% extends "galerie/Base.html" %}
+{% extends "base.html" %}
{% block nadpis1a %}
diff --git a/galerie/templates/galerie/GalerieNahled.html b/galerie/templates/galerie/GalerieNahled.html
index 7d9313fc..ec0d5f67 100644
--- a/galerie/templates/galerie/GalerieNahled.html
+++ b/galerie/templates/galerie/GalerieNahled.html
@@ -1,4 +1,4 @@
-{% extends "galerie/Base.html" %}
+{% extends "base.html" %}
{% block nadpis1a %}
Galerie {{galerie.nazev}}
@@ -61,7 +61,7 @@ Galerie {{galerie.nazev}}
{{ galerie|truncatechars:max_delka_nazvu }}
- {% if user.is_staff and galerie.zobrazit > 0 %}
+ {% if user.je_org and galerie.zobrazit > 0 %}
({{galerie.poradi}})
+
@@ -73,7 +73,7 @@ Galerie {{galerie.nazev}}
{% endwith %}
{% endif %}
{% endif %}
- {% if user.is_staff and galerie.zobrazit > 0 %}
+ {% if user.je_org and galerie.zobrazit > 0 %}
diff --git a/galerie/templates/galerie/GalerieNew.html b/galerie/templates/galerie/GalerieNew.html
index 38237d86..2da23ece 100644
--- a/galerie/templates/galerie/GalerieNew.html
+++ b/galerie/templates/galerie/GalerieNew.html
@@ -1,4 +1,4 @@
-{% extends "galerie/Base.html" %}
+{% extends "base.html" %}
{% block title %}{% block nadpis1a %}
Vytvářím novou galerii
diff --git a/galerie/urls.py b/galerie/urls.py
index 4d1e8f24..d299165f 100644
--- a/galerie/urls.py
+++ b/galerie/urls.py
@@ -1,13 +1,14 @@
# coding: utf-8
from django.urls import path
+from seminar.utils import org_required
from . import views
urlpatterns = [
path('
/', views.nahled),
path('//', views.detail),
- path('/new/', views.new_galerie),
- path('/plus//', views.plus_galerie),
- path('/minus//', views.minus_galerie),
+ path('/new/', org_required(views.new_galerie)),
+ path('/plus//', org_required(views.plus_galerie)),
+ path('/minus//', org_required(views.minus_galerie)),
]
diff --git a/galerie/views.py b/galerie/views.py
index d23e79f1..4570b8fb 100644
--- a/galerie/views.py
+++ b/galerie/views.py
@@ -14,7 +14,7 @@ from galerie.forms import KomentarForm, NewGalerieForm
def zobrazit(galerie, request):
preview = False
if galerie.zobrazit >= 1:
- if request.user.is_staff:
+ if request.user.je_org:
preview = True;
else:
raise Http404
@@ -35,7 +35,7 @@ def nahled(request, pk, soustredeni):
galerie = get_object_or_404(Galerie, pk=pk)
podgalerie = Galerie.objects.filter(galerie_up = galerie).order_by('poradi')
- if not request.user.is_staff:
+ if not request.user.je_org:
podgalerie = podgalerie.filter(zobrazit__lt=1)
obrazky = Obrazek.objects.filter(galerie = galerie).order_by('poradi', 'nazev')
@@ -44,7 +44,7 @@ def nahled(request, pk, soustredeni):
sourozenci = []
if galerie.galerie_up:
sourozenci = galerie.galerie_up.galerie_set.all().order_by('poradi')
- if not request.user.is_staff:
+ if not request.user.je_org:
sourozenci = sourozenci.filter(zobrazit__lt=1)
predchozi = None
diff --git a/header_fotky/__init__.py b/header_fotky/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/header_fotky/admin.py b/header_fotky/admin.py
new file mode 100644
index 00000000..35d3427b
--- /dev/null
+++ b/header_fotky/admin.py
@@ -0,0 +1,10 @@
+from django.contrib import admin
+from django.contrib.admin import ModelAdmin
+import header_fotky.models as m
+
+
+class FotkaPozadiAdmin(ModelAdmin):
+ readonly_fields = ['cas']
+
+admin.site.register(m.FotkaHeader, FotkaPozadiAdmin)
+admin.site.register(m.FotkaUrlVazba)
\ No newline at end of file
diff --git a/header_fotky/apps.py b/header_fotky/apps.py
new file mode 100644
index 00000000..084aa955
--- /dev/null
+++ b/header_fotky/apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class HeaderFotkyConfig(AppConfig):
+ name = 'header_fotky'
diff --git a/header_fotky/context_processors.py b/header_fotky/context_processors.py
new file mode 100644
index 00000000..be259cbf
--- /dev/null
+++ b/header_fotky/context_processors.py
@@ -0,0 +1,45 @@
+
+from datetime import datetime, date
+import random
+
+from django.conf import settings
+
+from header_fotky.models import FotkaUrlVazba
+
+
+def vzhled(request):
+ ''' Podle casu prida do templatu, zdali je nebo neni noc '''
+ hodin = datetime.now().hour
+ if (hodin <= 6) or (hodin >= 20):
+ noc = True
+ nedoba = 'den'
+ doba = 'noc'
+ else:
+ noc = False
+ nedoba = 'noc'
+ doba = 'den'
+ url = request.path
+
+ fotky = FotkaUrlVazba.objects.exclude(denni_doba=nedoba)
+ fotka = None
+
+ # TODO rychlejší patternmatch?
+ while (fotka is None) and (url != ''):
+ presne = fotky.filter(url__exact=url)
+ if presne.count() > 0:
+ presne_doba = presne.filter(denni_doba=doba)
+ if presne_doba.count() > 0:
+ fotka = random.choice(presne_doba).url_fotky()
+ else:
+ fotka = random.choice(presne).url_fotky()
+
+ url = url[:-1]
+ index = url.rfind('/')
+ if index != -1:
+ url = url[:index+1]
+
+ if fotka is None:
+ fotka = settings.STATIC_URL + "images/header/vikendovka.jpg"
+
+ return {'noc': noc, 'fotka': fotka}
+
diff --git a/header_fotky/migrations/0001_initial.py b/header_fotky/migrations/0001_initial.py
new file mode 100644
index 00000000..4b90d0c6
--- /dev/null
+++ b/header_fotky/migrations/0001_initial.py
@@ -0,0 +1,63 @@
+# Generated by Django 2.2.15 on 2020-09-20 09:14
+
+from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+
+from shutil import copytree
+
+
+def zkopiruj_fotky(apps, schema_editor):
+ try:
+ copytree("mamweb/static/images/header/", "media/header/") # FIXME: bylo tu dirs_exists_ok=True, nekompatibilní s Py 3.7
+ except FileExistsError:
+ pass
+
+
+class Migration(migrations.Migration):
+ initial = True
+
+ dependencies = [
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='FotkaHeader',
+ fields=[
+ ('cas', models.DateTimeField(default=django.utils.timezone.now, help_text='Čas vložení fotky',
+ verbose_name='čas vložení fotky')),
+ ('nazev',
+ models.CharField(help_text='Název např. archiv_noc', max_length=50, primary_key=True, serialize=False,
+ unique=True, verbose_name='název fotky')),
+ ('fotka', models.ImageField(upload_to='header')),
+ ],
+ options={
+ 'verbose_name': 'fotka do pozadí menu',
+ 'verbose_name_plural': 'fotky do pozadí menu',
+ 'db_table': 'fotky_header',
+ 'ordering': ['-cas'],
+ },
+ ),
+ migrations.CreateModel(
+ name='FotkaUrlVazba',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('url',
+ models.CharField(blank=True, help_text='url prefix stránek např: /archiv/ nebo /', max_length=100,
+ verbose_name='URL')),
+ ('denni_doba', models.CharField(choices=[('den', 'Zobrazit jen ve dne'), ('noc', 'Zobrazit jen v noci'),
+ ('oboji', 'Zobrazovat pořád')], default='oboji', max_length=16,
+ verbose_name='denní doba')),
+ ('fotka', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='header_fotky.FotkaHeader',
+ verbose_name='fotka')),
+ ],
+ options={
+ 'verbose_name': 'vazba url a fotky do pozadí menu',
+ 'verbose_name_plural': 'vazby url a fotek do pozadí menu',
+ 'db_table': 'fotky_url_vazby',
+ 'ordering': ['url'],
+ },
+
+ ),
+ migrations.RunPython(zkopiruj_fotky, migrations.RunPython.noop),
+ ]
diff --git a/header_fotky/migrations/__init__.py b/header_fotky/migrations/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/header_fotky/models.py b/header_fotky/models.py
new file mode 100644
index 00000000..481a652c
--- /dev/null
+++ b/header_fotky/models.py
@@ -0,0 +1,65 @@
+from django.core.exceptions import ValidationError
+from django.db import models
+from django.utils import timezone
+
+
+class FotkaHeader(models.Model):
+ class Meta:
+ ordering = ['-cas']
+ db_table = 'fotky_header'
+ verbose_name = u'fotka do pozadí menu'
+ verbose_name_plural = u'fotky do pozadí menu'
+
+ cas = models.DateTimeField(u'čas vložení fotky', default=timezone.now, help_text='Čas vložení fotky')
+
+ nazev = models.CharField(
+ u'název fotky', null=False, blank=False, unique=True, primary_key=True,
+ max_length=50, help_text='Název např. archiv_noc'
+ )
+
+ fotka = models.ImageField(upload_to='header', null=False, blank=False)
+
+ def __str__(self):
+ return self.nazev
+
+ def clean(self):
+ if not self.fotka:
+ raise ValidationError("Chybí obrázek")
+ """ Kontroluje, zda sedí poměr stran """
+ if abs(self.fotka.width - (self.fotka.height * 970 / 350)) > 2:
+ raise ValidationError("Obrázek by měl mít rozměry 970w na 350h, nebo alespoň podobný poměr stran.")
+ super().clean()
+
+
+class FotkaUrlVazba(models.Model):
+ class Meta:
+ ordering = ['url']
+ db_table = 'fotky_url_vazby'
+ verbose_name = u'vazba url a fotky do pozadí menu'
+ verbose_name_plural = u'vazby url a fotek do pozadí menu'
+
+ url = models.CharField(
+ u'URL', blank=True, null=False, max_length=100,
+ help_text='url prefix stránek např: /archiv/ nebo /'
+ )
+
+ fotka = models.ForeignKey(
+ FotkaHeader, blank=False, null=False, verbose_name='fotka',
+ on_delete=models.CASCADE
+ )
+
+ DOBA_DEN = 'den'
+ DOBA_NOC = 'noc'
+ DOBA_OBOJI = 'oboji'
+ DOBA_CHOICES = [
+ (DOBA_DEN, 'Zobrazit jen ve dne'),
+ (DOBA_NOC, 'Zobrazit jen v noci'),
+ (DOBA_OBOJI, 'Zobrazovat pořád')]
+
+ denni_doba = models.CharField('denní doba', max_length=16, choices=DOBA_CHOICES, blank=False, default=DOBA_OBOJI)
+
+ def __str__(self):
+ return self.url
+
+ def url_fotky(self):
+ return self.fotka.fotka.url
diff --git a/korektury/models.py b/korektury/models.py
index 88c1a5e6..37213172 100644
--- a/korektury/models.py
+++ b/korektury/models.py
@@ -103,7 +103,7 @@ class KorekturovanePDF(models.Model):
# Změnil se počet stran, ukládáme
super(KorekturovanePDF, self).save()
- def save(self):
+ def save(self, **kwargs):
# Pokud se nezmenilo PDF, tak nepregenerovavej nahledy
try:
original = KorekturovanePDF.objects.get(pk=self.pk)
@@ -113,7 +113,7 @@ class KorekturovanePDF(models.Model):
except ObjectDoesNotExist:
pass
# uložíme nahrávané pdf
- super(KorekturovanePDF, self).save()
+ super(KorekturovanePDF, self).save(kwargs)
# uložíme png a změněný počet stran
self.convert()
diff --git a/korektury/templates/korektury/base.html b/korektury/templates/korektury/base.html
deleted file mode 100644
index 886a15e1..00000000
--- a/korektury/templates/korektury/base.html
+++ /dev/null
@@ -1,13 +0,0 @@
-{% extends "base.html" %}
-
-{% block submenu %}
- {% include "korektury/submenu.html" %}
-{% endblock %}
-
-{% block content %}
-{# blok do kterého se nacita text, v pripade jinyhc templatu obalit vlastnim blokem #}
-{% endblock %}
-
-{% block title %}
-{# blok pro titulek stranky #}
-{% endblock %}
diff --git a/korektury/templates/korektury/help.html b/korektury/templates/korektury/help.html
index f2ddafb9..3cce7a4f 100644
--- a/korektury/templates/korektury/help.html
+++ b/korektury/templates/korektury/help.html
@@ -1,10 +1,4 @@
-{% extends "korektury/base.html" %}
-
-{% block submenu %}
- {% with "help" as selected %}
- {% include "korektury/submenu.html" %}
- {% endwith %}
-{% endblock %}
+{% extends "base.html" %}
{% load staticfiles %}
diff --git a/korektury/templates/korektury/opraf.html b/korektury/templates/korektury/opraf.html
index ba8898a6..00c81c2d 100644
--- a/korektury/templates/korektury/opraf.html
+++ b/korektury/templates/korektury/opraf.html
@@ -36,12 +36,12 @@
id="neni_chyba_checkbox"
name="neni_chyba_checkbox"
onchange="toggle_corrections('neni_chyba')" checked>
-