Merge branch 'data_migrations' into odevzdavatko
This commit is contained in:
commit
a8f91e1222
21 changed files with 946 additions and 835 deletions
4
Makefile
4
Makefile
|
@ -34,8 +34,8 @@ install_web: venv_check
|
||||||
pip install --upgrade setuptools
|
pip install --upgrade setuptools
|
||||||
# Instalace závislostí webu
|
# Instalace závislostí webu
|
||||||
pip install -r requirements.txt --upgrade
|
pip install -r requirements.txt --upgrade
|
||||||
# Po vygenerování testdat spusť ./manage.py loaddata sitetree_new.json, ať máš menu
|
# Po vygenerování testdat spusť ./manage.py loaddata data/*, ať máš menu a další modely
|
||||||
# Pro synchronizaci flatpages spusť make sync_prod_flatpages
|
:x
|
||||||
|
|
||||||
install_venv:
|
install_venv:
|
||||||
${VENV} ${VENV_PATH}
|
${VENV} ${VENV_PATH}
|
||||||
|
|
File diff suppressed because it is too large
Load diff
12
fix_json.py
Executable file
12
fix_json.py
Executable file
|
@ -0,0 +1,12 @@
|
||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import json
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument("input", type=argparse.FileType('r', encoding='utf-8'))
|
||||||
|
parser.add_argument('output', type=argparse.FileType('w', encoding='utf-8'))
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
data = json.load(args.input)
|
||||||
|
json.dump(data, args.output, ensure_ascii=False, sort_keys=True, indent='\t')
|
|
@ -186,7 +186,7 @@ class KorekturyView(generic.TemplateView):
|
||||||
if email:
|
if email:
|
||||||
emails.discard(email)
|
emails.discard(email)
|
||||||
|
|
||||||
if not settings.SEND_EMAIL_NOTIFICATIONS:
|
if not settings.POSLI_MAILOVOU_NOTIFIKACI:
|
||||||
print("Poslal bych upozornění na tyto adresy: ", " ".join(emails))
|
print("Poslal bych upozornění na tyto adresy: ", " ".join(emails))
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
|
@ -308,4 +308,4 @@ CISLO_IMG_DIR = os.path.join('cislo', 'img')
|
||||||
|
|
||||||
|
|
||||||
# E-MAIL NOTIFICATIONS
|
# E-MAIL NOTIFICATIONS
|
||||||
SEND_EMAIL_NOTIFICATIONS = False
|
POSLI_MAILOVOU_NOTIFIKACI = False
|
||||||
|
|
|
@ -66,4 +66,4 @@ LOGGING['handlers']['registration_error_log']['filename'] = '/home/mam-web/logs/
|
||||||
|
|
||||||
|
|
||||||
# E-MAIL NOTIFICATIONS
|
# E-MAIL NOTIFICATIONS
|
||||||
SEND_EMAIL_NOTIFICATIONS = True
|
POSLI_MAILOVOU_NOTIFIKACI = True
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 3.2 MiB After Width: | Height: | Size: 476 KiB |
|
@ -31,6 +31,10 @@
|
||||||
src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.6/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
|
src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.6/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
{# Případné skripty widgetů formulářů #}
|
||||||
|
{% if form %}
|
||||||
|
{{form.media}}
|
||||||
|
{% endif %}
|
||||||
{# script specifický pro stránku #}
|
{# script specifický pro stránku #}
|
||||||
{% block script %}{% endblock %}
|
{% block script %}{% endblock %}
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,14 @@
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from django.contrib.auth.models import Permission
|
from django.contrib.auth.models import Permission
|
||||||
|
from django.db import models
|
||||||
|
from django.forms import widgets
|
||||||
|
|
||||||
from polymorphic.admin import PolymorphicParentModelAdmin, PolymorphicChildModelAdmin, PolymorphicChildModelFilter
|
from polymorphic.admin import PolymorphicParentModelAdmin, PolymorphicChildModelAdmin, PolymorphicChildModelFilter
|
||||||
from reversion.admin import VersionAdmin
|
from reversion.admin import VersionAdmin
|
||||||
from django_reverse_admin import ReverseModelAdmin
|
from django_reverse_admin import ReverseModelAdmin
|
||||||
from solo.admin import SingletonModelAdmin
|
from solo.admin import SingletonModelAdmin
|
||||||
|
|
||||||
|
|
||||||
# Todo: reversion
|
# Todo: reversion
|
||||||
|
|
||||||
import seminar.models as m
|
import seminar.models as m
|
||||||
|
@ -14,8 +17,6 @@ admin.site.register(m.Skola)
|
||||||
admin.site.register(m.Prijemce)
|
admin.site.register(m.Prijemce)
|
||||||
admin.site.register(m.Rocnik)
|
admin.site.register(m.Rocnik)
|
||||||
admin.site.register(m.Cislo)
|
admin.site.register(m.Cislo)
|
||||||
admin.site.register(m.Organizator)
|
|
||||||
admin.site.register(m.Soustredeni)
|
|
||||||
|
|
||||||
@admin.register(m.Osoba)
|
@admin.register(m.Osoba)
|
||||||
class OsobaAdmin(admin.ModelAdmin):
|
class OsobaAdmin(admin.ModelAdmin):
|
||||||
|
@ -42,7 +43,14 @@ class OsobaAdmin(admin.ModelAdmin):
|
||||||
org.save()
|
org.save()
|
||||||
udelej_orgem.short_description = "Udělej vybraných osob organizátory"
|
udelej_orgem.short_description = "Udělej vybraných osob organizátory"
|
||||||
|
|
||||||
|
@admin.register(m.Organizator)
|
||||||
|
class OrganizatorAdmin(admin.ModelAdmin):
|
||||||
|
search_fields = ['osoba__jmeno', 'osoba__prijmeni', 'prezdivka']
|
||||||
|
|
||||||
|
@admin.register(m.Resitel)
|
||||||
|
class ResitelAdmin(admin.ModelAdmin):
|
||||||
|
search_fields = ['jmeno', 'prijmeni', 'prezdivka']
|
||||||
|
ordering = ('osoba__jmeno','osoba__prijmeni')
|
||||||
|
|
||||||
@admin.register(m.Problem)
|
@admin.register(m.Problem)
|
||||||
class ProblemAdmin(PolymorphicParentModelAdmin):
|
class ProblemAdmin(PolymorphicParentModelAdmin):
|
||||||
|
@ -74,15 +82,55 @@ class KonferaAdmin(PolymorphicChildModelAdmin):
|
||||||
base_model = m.Konfera
|
base_model = m.Konfera
|
||||||
show_in_index = True
|
show_in_index = True
|
||||||
|
|
||||||
|
|
||||||
class TextAdminInline(admin.TabularInline):
|
class TextAdminInline(admin.TabularInline):
|
||||||
model = m.Text
|
model = m.Text
|
||||||
|
formfield_overrides = {
|
||||||
|
models.TextField: {'widget': widgets.TextInput}
|
||||||
|
}
|
||||||
exclude = ['text_zkraceny_set','text_zkraceny']
|
exclude = ['text_zkraceny_set','text_zkraceny']
|
||||||
|
|
||||||
admin.site.register(m.Text)
|
admin.site.register(m.Text)
|
||||||
|
|
||||||
class ResitelInline(admin.TabularInline):
|
class ResitelInline(admin.TabularInline):
|
||||||
model = m.Resitel
|
model = m.Resitel
|
||||||
extra = 1
|
extra = 1
|
||||||
admin.site.register(m.Resitel)
|
|
||||||
|
class SoustredeniUcastniciInline(admin.TabularInline):
|
||||||
|
model = m.Soustredeni_Ucastnici
|
||||||
|
extra = 1
|
||||||
|
fields = ['resitel','poznamka']
|
||||||
|
autocomplete_fields = ['resitel']
|
||||||
|
ordering = ['resitel__osoba__jmeno', 'resitel__osoba__prijmeni']
|
||||||
|
formfield_overrides = {
|
||||||
|
models.TextField: {'widget': widgets.TextInput}
|
||||||
|
}
|
||||||
|
|
||||||
|
def get_queryset(self,request):
|
||||||
|
qs = super().get_queryset(request)
|
||||||
|
return qs.select_related('resitel','soustredeni')
|
||||||
|
|
||||||
|
class SoustredeniOrganizatoriInline(admin.TabularInline):
|
||||||
|
model = m.Soustredeni.organizatori.through
|
||||||
|
extra = 1
|
||||||
|
fields = ['organizator','poznamka']
|
||||||
|
autocomplete_fields = ['organizator']
|
||||||
|
ordering = ['organizator__osoba__jmeno','organizator__prijmeni']
|
||||||
|
formfield_overrides = {
|
||||||
|
models.TextField: {'widget': widgets.TextInput}
|
||||||
|
}
|
||||||
|
|
||||||
|
def get_queryset(self,request):
|
||||||
|
qs = super().get_queryset(request)
|
||||||
|
return qs.select_related('organizator', 'soustredeni')
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(m.Soustredeni)
|
||||||
|
class SoustredeniAdmin(admin.ModelAdmin):
|
||||||
|
model = m.Soustredeni
|
||||||
|
inline_type = 'tabular'
|
||||||
|
inlines = [SoustredeniUcastniciInline, SoustredeniOrganizatoriInline]
|
||||||
|
|
||||||
|
|
||||||
class PrilohaReseniInline(admin.TabularInline):
|
class PrilohaReseniInline(admin.TabularInline):
|
||||||
model = m.PrilohaReseni
|
model = m.PrilohaReseni
|
||||||
|
@ -92,6 +140,7 @@ admin.site.register(m.PrilohaReseni)
|
||||||
class Reseni_ResiteleInline(admin.TabularInline):
|
class Reseni_ResiteleInline(admin.TabularInline):
|
||||||
model = m.Reseni_Resitele
|
model = m.Reseni_Resitele
|
||||||
|
|
||||||
|
|
||||||
@admin.register(m.Reseni)
|
@admin.register(m.Reseni)
|
||||||
class ReseniAdmin(ReverseModelAdmin):
|
class ReseniAdmin(ReverseModelAdmin):
|
||||||
base_model = m.Reseni
|
base_model = m.Reseni
|
||||||
|
@ -106,7 +155,6 @@ admin.site.register(m.Hodnoceni)
|
||||||
admin.site.register(m.Pohadka)
|
admin.site.register(m.Pohadka)
|
||||||
admin.site.register(m.Obrazek)
|
admin.site.register(m.Obrazek)
|
||||||
|
|
||||||
|
|
||||||
# Polymorfismus pro stromy
|
# Polymorfismus pro stromy
|
||||||
# TODO: Inlines podle https://django-polymorphic.readthedocs.io/en/stable/admin.html
|
# TODO: Inlines podle https://django-polymorphic.readthedocs.io/en/stable/admin.html
|
||||||
|
|
||||||
|
|
|
@ -184,7 +184,7 @@ class ProfileEditForm(forms.Form):
|
||||||
max_value=date.today().year+8,
|
max_value=date.today().year+8,
|
||||||
required=True)
|
required=True)
|
||||||
zasilat = forms.ChoiceField(label='Kam zasílat čísla a řešení',choices = Resitel.ZASILAT_CHOICES, required=True)
|
zasilat = forms.ChoiceField(label='Kam zasílat čísla a řešení',choices = Resitel.ZASILAT_CHOICES, required=True)
|
||||||
zasilat_cislo_emailem = forms.BooleanField(label='Chci dostávat email s upozorněním na vydání nového čísla', required=True)
|
zasilat_cislo_emailem = forms.BooleanField(label='Chci dostávat email s upozorněním na vydání nového čísla', required=False)
|
||||||
|
|
||||||
spam = forms.BooleanField(label='Souhlasím se zasíláním materiálů od MFF UK', required=False)
|
spam = forms.BooleanField(label='Souhlasím se zasíláním materiálů od MFF UK', required=False)
|
||||||
# def clean_username(self):
|
# def clean_username(self):
|
||||||
|
|
|
@ -31,6 +31,8 @@ from unidecode import unidecode # Používám pro získání ID odkazu (ještě
|
||||||
|
|
||||||
from polymorphic.models import PolymorphicModel
|
from polymorphic.models import PolymorphicModel
|
||||||
|
|
||||||
|
from django.core.mail import EmailMessage
|
||||||
|
from seminar.utils import aktivniResitele
|
||||||
|
|
||||||
class SeminarModelBase(models.Model):
|
class SeminarModelBase(models.Model):
|
||||||
|
|
||||||
|
@ -624,9 +626,43 @@ class Cislo(SeminarModelBase):
|
||||||
return None
|
return None
|
||||||
return c
|
return c
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
self.__original_verejne = self.verejne_db
|
||||||
|
|
||||||
|
def posli_cislo_mailem(self):
|
||||||
|
# parametry e-mailu
|
||||||
|
odkaz = self.get_absolute_url()
|
||||||
|
|
||||||
|
poslat_z_mailu = 'zadani@mam.mff.cuni.cz'
|
||||||
|
predmet = 'Vyšlo číslo {}'.format(self.kod())
|
||||||
|
text_mailu = 'Ahoj,\n' \
|
||||||
|
'na adrese {} najdete nejnovější číslo.\n' \
|
||||||
|
'Vaše M&M\n'.format(odkaz)
|
||||||
|
|
||||||
|
# Prijemci e-mailu
|
||||||
|
emaily = map(lambda r: r.osoba.email, filter(lambda r: r.zasilat_cislo_emailem, aktivniResitele(self)))
|
||||||
|
|
||||||
|
if not settings.POSLI_MAILOVOU_NOTIFIKACI:
|
||||||
|
print("Poslal bych upozornění na tyto adresy: ", " ".join(emaily))
|
||||||
|
return
|
||||||
|
|
||||||
|
email = EmailMessage(
|
||||||
|
subject=predmet,
|
||||||
|
body=text_mailu,
|
||||||
|
from_email=poslat_z_mailu,
|
||||||
|
bcc=list(emaily)
|
||||||
|
#bcc = příjemci skryté kopie
|
||||||
|
)
|
||||||
|
|
||||||
|
email.send()
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
super().save(*args, **kwargs)
|
super().save(*args, **kwargs)
|
||||||
self.vygeneruj_nahled()
|
self.vygeneruj_nahled()
|
||||||
|
# Při zveřejnění pošle mail
|
||||||
|
if self.verejne_db and not self.__original_verejne:
|
||||||
|
self.posli_cislo_mailem()
|
||||||
# *Node.save() aktualizuje název *Nodu.
|
# *Node.save() aktualizuje název *Nodu.
|
||||||
try:
|
try:
|
||||||
self.cislonode.save()
|
self.cislonode.save()
|
||||||
|
|
BIN
seminar/static/images/no-picture.png
Normal file
BIN
seminar/static/images/no-picture.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 86 KiB |
|
@ -32,7 +32,7 @@
|
||||||
{% if c.titulka_nahled %}
|
{% if c.titulka_nahled %}
|
||||||
<img src="{{ c.titulka_nahled.url }}" alt="{{ c.kod }}" height=180px>
|
<img src="{{ c.titulka_nahled.url }}" alt="{{ c.kod }}" height=180px>
|
||||||
{% else %}
|
{% else %}
|
||||||
<img src="" alt="no image" height=180px>
|
{% load static %} <img src="{% static 'images/no-picture.png' %}" height=180px alt="no-picture">
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -58,6 +58,7 @@
|
||||||
<h2><strong>Soustředění</strong></h2>
|
<h2><strong>Soustředění</strong></h2>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
|
<li><a href="/admin/seminar/soustredeni/add/">přidat soustředění</a></li>
|
||||||
<li><strong>přednášky</strong>
|
<li><strong>přednášky</strong>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
{% load staticfiles %}
|
{% load staticfiles %}
|
||||||
|
|
||||||
{% block script %}
|
{% block script %}
|
||||||
<!--script type="text/javascript" src="{% static 'admin/js/vendor/jquery/jquery.js' %}"></script!-->
|
|
||||||
{{form.media}}
|
|
||||||
<script src="{% static 'seminar/prihlaska.js' %}"></script>
|
<script src="{% static 'seminar/prihlaska.js' %}"></script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
{% load staticfiles %}
|
{% load staticfiles %}
|
||||||
{% block script %}
|
{% block script %}
|
||||||
<!--script type="text/javascript" src="{% static 'admin/js/vendor/jquery/jquery.js' %}"></script!-->
|
|
||||||
{{form.media}}
|
|
||||||
<script src="{% static 'seminar/dynamic_formsets.js' %}"></script>
|
<script src="{% static 'seminar/dynamic_formsets.js' %}"></script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
{% load staticfiles %}
|
{% load staticfiles %}
|
||||||
|
|
||||||
{% block script %}
|
{% block script %}
|
||||||
<!--script type="text/javascript" src="{% static 'admin/js/vendor/jquery/jquery.js' %}"></script!-->
|
|
||||||
{{form.media}}
|
|
||||||
<script src="{% static 'seminar/prihlaska.js' %}"></script>
|
<script src="{% static 'seminar/prihlaska.js' %}"></script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,12 @@
|
||||||
|
<script>
|
||||||
|
function preddeadline() {
|
||||||
|
alert("Řešení, která nám přijdou do tohoto deadlinu, se pokusíme opravit co nejdříve, abyste měli ještě šanci si je ještě opravit před definitivním deadlinem čísla.");
|
||||||
|
}
|
||||||
|
function sousdeadline() {
|
||||||
|
alert("Body za řešení, která nám přijdou do tohoto deadlinu, se ještě započítají pro účast na připravovaném soustředění.");
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
|
|
||||||
{% load humanize %}
|
{% load humanize %}
|
||||||
|
@ -8,7 +17,17 @@
|
||||||
|
|
||||||
{% if nejblizsi_deadline %}
|
{% if nejblizsi_deadline %}
|
||||||
<div class="odpocet">
|
<div class="odpocet">
|
||||||
<p><b><big>Do konce <a href="/zadani/aktualni/">odeslání řešení</a> {% if typ_deadline == 'soustredeni' %}(pro účast na soustředění) {% elif typ_deadline == 'preddeadline' %}(pro otištění došlých řešení) {% endif %}zbývá:
|
<p><b><big>Do
|
||||||
|
{% if typ_deadline == 'soustredeni' %}
|
||||||
|
<a href="" onClick="sousdeadline()"
|
||||||
|
title="Body za řešení, která nám přijdou do tohoto deadlinu, se ještě započítají pro účast na připravovaném soustředění.">
|
||||||
|
deadlinu</a> odeslání <a href="/zadani/aktualni/">řešení
|
||||||
|
</a> pro účast na soustředění
|
||||||
|
|
||||||
|
{% elif typ_deadline == 'preddeadline' %} <a href="" onClick="preddeadline()"
|
||||||
|
title="Řešení, která nám přijdou do tohoto deadlinu, se pokusíme opravit co nejdříve, abyste měli ještě šanci si je ještě opravit před definitivním deadlinem čísla.">1. deadlinu</a> aktuálního <a href="/zadani/aktualni/">čísla</a>
|
||||||
|
{% else %} deadlinu aktuálního <a href="/zadani/aktualni/">čísla</a>
|
||||||
|
{% endif %}zbývá:
|
||||||
{{nejblizsi_deadline|timeuntil}}</big></b></p>
|
{{nejblizsi_deadline|timeuntil}}</big></b></p>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
|
@ -13,8 +13,8 @@ urlpatterns = [
|
||||||
path('co-je-MaM/organizatori/organizovali/', views.CojemamOrganizatoriStariView.as_view(), name='stari_organizatori'),
|
path('co-je-MaM/organizatori/organizovali/', views.CojemamOrganizatoriStariView.as_view(), name='stari_organizatori'),
|
||||||
|
|
||||||
# Archiv
|
# Archiv
|
||||||
path('archiv/rocniky/', views.ArchivView.as_view(), name="seninar_archiv_rocniky"),
|
path('archiv/rocniky/', views.ArchivView.as_view(), name="seminar_archiv_rocniky"),
|
||||||
path('archiv/temata/', views.ArchivTemataView.as_view(), name="seninar_archiv_temata"),
|
path('archiv/temata/', views.ArchivTemataView.as_view(), name="seminar_archiv_temata"),
|
||||||
|
|
||||||
path('rocnik/<int:rocnik>/', views.RocnikView.as_view(), name='seminar_rocnik'),
|
path('rocnik/<int:rocnik>/', views.RocnikView.as_view(), name='seminar_rocnik'),
|
||||||
path('cislo/<int:rocnik>.<str:cislo>/', views.CisloView.as_view(), name='seminar_cislo'),
|
path('cislo/<int:rocnik>.<str:cislo>/', views.CisloView.as_view(), name='seminar_cislo'),
|
||||||
|
@ -63,7 +63,7 @@ urlpatterns = [
|
||||||
path('stare-novinky/', views.StareNovinkyView.as_view(), name='stare_novinky'),
|
path('stare-novinky/', views.StareNovinkyView.as_view(), name='stare_novinky'),
|
||||||
|
|
||||||
# Clanky
|
# Clanky
|
||||||
path('clanky/resitel/', views.ClankyResitelView.as_view(), name='clanky_resitel'),
|
path('archiv/clanky/', views.ClankyResitelView.as_view(), name='clanky_resitel'),
|
||||||
#path('clanky/org/', views.ClankyOrganizatorView.as_view(), name='clanky_organizator'),
|
#path('clanky/org/', views.ClankyOrganizatorView.as_view(), name='clanky_organizator'),
|
||||||
|
|
||||||
# Aesop
|
# Aesop
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
from dal import autocomplete
|
from dal import autocomplete
|
||||||
from django.shortcuts import get_object_or_404
|
from django.shortcuts import get_object_or_404
|
||||||
|
from django.db.models import Q
|
||||||
|
|
||||||
import seminar.models as m
|
import seminar.models as m
|
||||||
from .helpers import LoginRequiredAjaxMixin
|
from .helpers import LoginRequiredAjaxMixin
|
||||||
|
|
|
@ -568,6 +568,8 @@ class TitulniStranaView(generic.ListView):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
nejblizsi_deadline = sorted(filter(lambda dl: dl[0] is not None and dl[0] >= date.today(), [deadline_soustredeni, preddeadline, deadline]))[0]
|
nejblizsi_deadline = sorted(filter(lambda dl: dl[0] is not None and dl[0] >= date.today(), [deadline_soustredeni, preddeadline, deadline]))[0]
|
||||||
|
if nejblizsi_deadline[0] == deadline_soustredeni[0]:
|
||||||
|
nejblizsi_deadline = deadline_soustredeni
|
||||||
except IndexError:
|
except IndexError:
|
||||||
nejblizsi_deadline = (None, None) # neni zadna aktualni deadline
|
nejblizsi_deadline = (None, None) # neni zadna aktualni deadline
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue