Merge branch 'data_migrations' into test
This commit is contained in:
commit
275cdb18dd
14 changed files with 113 additions and 8 deletions
|
@ -78,6 +78,7 @@ TEMPLATES = [
|
|||
'django.contrib.messages.context_processors.messages',
|
||||
'sekizai.context_processors.sekizai',
|
||||
'header_fotky.context_processors.vzhled',
|
||||
'various.context_processors.april',
|
||||
)
|
||||
},
|
||||
},
|
||||
|
@ -132,6 +133,7 @@ INSTALLED_APPS = (
|
|||
'korektury',
|
||||
'prednasky',
|
||||
'header_fotky',
|
||||
'various',
|
||||
|
||||
# Admin upravy:
|
||||
|
||||
|
|
|
@ -131,6 +131,48 @@
|
|||
$("a[rel^='gallery-image']").prettyPhoto(prettyparams);
|
||||
});
|
||||
</script>
|
||||
{% if april == 2021 %}
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
function rotace(vektor, uhel_deg) {
|
||||
var uhel = uhel_deg *(Math.PI / 180);
|
||||
var x = vektor[0];
|
||||
var y = vektor[1];
|
||||
return [x*Math.cos(uhel) - y*Math.sin(uhel), x*Math.sin(uhel) + y*Math.cos(uhel)];
|
||||
}
|
||||
|
||||
function rotace_a_posun(obj, uhel) {
|
||||
var ow = obj.width();
|
||||
var oh = obj.height();
|
||||
|
||||
var rohy = [[0,0], [0,oh], [ow, 0], [ow, oh]];
|
||||
var minx = 0;
|
||||
var miny = 0;
|
||||
for (var roh of rohy) {
|
||||
var otoceny = rotace(roh, uhel);
|
||||
if (otoceny[0] < minx) {
|
||||
minx = otoceny[0];
|
||||
}
|
||||
if (otoceny[1] < miny) {
|
||||
miny = otoceny[1];
|
||||
}
|
||||
}
|
||||
|
||||
miny *= -1;
|
||||
minx *= -1;
|
||||
|
||||
var transf_str = "translateX("+minx+"px) translateY("+miny+"px) rotate("+uhel+"deg)";
|
||||
obj.css('transform-origin', 'top left');
|
||||
obj.css('transform', transf_str);
|
||||
}
|
||||
|
||||
function randomUhel() {
|
||||
return Math.floor(360*Math.random());
|
||||
}
|
||||
|
||||
$('.container').css('margin', 0);
|
||||
rotace_a_posun($('.container'), randomUhel());
|
||||
</script>
|
||||
{% endif %}
|
||||
{% render_block "js" %}
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
{% extends "base.html" %}
|
||||
{% load static %}
|
||||
{% load deadliny %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
|
@ -62,7 +63,9 @@ $(document).ready(function(){
|
|||
<p>Řešitelé: {{ object.resitele.all | join:", " }}</p>
|
||||
|
||||
{# https://docs.djangoproject.com/en/3.1/ref/models/instances/#django.db.models.Model.get_FOO_display #}
|
||||
<p>Forma: {{ object.get_forma_display }}, doručeno {{ object.cas_doruceni }}</p>
|
||||
<p>Forma: {{ object.get_forma_display }}</p>
|
||||
|
||||
<p>Doručeno {{ object.cas_doruceni }}, deadline: {{object.cas_doruceni | deadline_html }}</p>
|
||||
|
||||
{# Soubory: #}
|
||||
<h3>Přílohy:</h3>
|
||||
|
|
|
@ -4,5 +4,5 @@ Obdrželi jsme od Tebe žádost o obnovu hesla uživatele {{ user }} na webu M&M
|
|||
Pro zadání nového hesla přejdi na následující stránku:
|
||||
{{ protocol}}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}
|
||||
|
||||
S pozdravem,
|
||||
S pozdravem
|
||||
organizátoři M&M
|
25
seminar/templatetags/deadliny.py
Normal file
25
seminar/templatetags/deadliny.py
Normal file
|
@ -0,0 +1,25 @@
|
|||
from django import template
|
||||
from django.utils.safestring import mark_safe
|
||||
from seminar.utils import TypDeadline, deadline
|
||||
register = template.Library()
|
||||
|
||||
@register.filter(name='deadline')
|
||||
def deadline_text(datum):
|
||||
typ, cislo, dl = deadline(datum)
|
||||
strings = {
|
||||
TypDeadline.PredDeadline: f"1. deadline čísla {cislo} ({dl})",
|
||||
TypDeadline.SousDeadline: f"Soustřeďkový deadline čísla {cislo} ({dl})",
|
||||
TypDeadline.FinalDeadline: f"Finální deadline čísla {cislo} ({dl})",
|
||||
}
|
||||
return strings[typ]
|
||||
|
||||
@register.filter(name='deadline_html')
|
||||
def deadline_html(datum):
|
||||
typ, _, _ = deadline(datum)
|
||||
text = deadline_text(datum)
|
||||
classes = {
|
||||
TypDeadline.PredDeadline: 'preddeadline',
|
||||
TypDeadline.SousDeadline: 'sous_deadline',
|
||||
TypDeadline.FinalDeadline: 'final_deadline',
|
||||
}
|
||||
return mark_safe(f'<span class="{classes[typ]}">{text}</span>')
|
|
@ -309,7 +309,7 @@ def deadline_v_rocniku(datum, rocnik):
|
|||
deadliny.append((TypDeadline.FinalDeadline, c, c.datum_deadline))
|
||||
deadliny = sorted(deadliny, key=lambda x: x[2]) # podle data
|
||||
for dl in deadliny:
|
||||
if datum <= dl:
|
||||
if datum <= dl[2]:
|
||||
# První takový deadline je ten nejtěsnější
|
||||
return dl
|
||||
|
||||
|
@ -319,20 +319,22 @@ def deadline(datum):
|
|||
Vrací trojici (TypDeadline, Cislo, datumDeadline: date).
|
||||
"""
|
||||
|
||||
if isinstance(datum, datetime.datetime):
|
||||
datum = datum.date()
|
||||
rok = datum.year
|
||||
# Dva ročníky podezřelé z obsahování dat
|
||||
pozdejsi_rocnik = m.Rocnik.filter(prvni_rok=rok)
|
||||
drivejsi_rocnik = m.Rocnik.filter(druhy_rok=rok)
|
||||
if any(
|
||||
pozdejsi_rocnik = m.Rocnik.objects.filter(prvni_rok=rok)
|
||||
drivejsi_rocnik = m.Rocnik.objects.filter(prvni_rok=rok-1)
|
||||
if any([
|
||||
pozdejsi_rocnik.count() > 1,
|
||||
drivejsi_rocnik.count() > 1,
|
||||
):
|
||||
]):
|
||||
raise ValueError(f"Více ročníků začíná/končí stejným rokem: {rok}")
|
||||
pozdejsi_rocnik = pozdejsi_rocnik.first() if pozdejsi_rocnik.count() > 0 else None
|
||||
drivejsi_rocnik = drivejsi_rocnik.first() if drivejsi_rocnik.count() > 0 else None
|
||||
|
||||
# Předpokládáme, že neexistuje číslo, které má deadline ale nemá finální deadline.
|
||||
posledni_deadline_drivejsiho_rocniku = m.Cislo.objects.get(rocnik=drivejsi_rocnik, datum_deadline__isnull=False).datum_deadline
|
||||
posledni_deadline_drivejsiho_rocniku = m.Cislo.objects.filter(rocnik=drivejsi_rocnik, datum_deadline__isnull=False).last().datum_deadline
|
||||
|
||||
if datum <= posledni_deadline_drivejsiho_rocniku:
|
||||
return deadline_v_rocniku(datum, drivejsi_rocnik)
|
||||
|
|
0
various/__init__.py
Normal file
0
various/__init__.py
Normal file
3
various/admin.py
Normal file
3
various/admin.py
Normal file
|
@ -0,0 +1,3 @@
|
|||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
5
various/apps.py
Normal file
5
various/apps.py
Normal file
|
@ -0,0 +1,5 @@
|
|||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class VariousConfig(AppConfig):
|
||||
name = 'various'
|
14
various/context_processors.py
Normal file
14
various/context_processors.py
Normal file
|
@ -0,0 +1,14 @@
|
|||
def april(req):
|
||||
if 'X-April' in req.headers:
|
||||
try:
|
||||
year = int(req.headers['X-April'])
|
||||
return {'april': year}
|
||||
except:
|
||||
pass # Fall-back to regular behaviour
|
||||
|
||||
import datetime
|
||||
today = datetime.date.today()
|
||||
if today.day == 1 and today.month == 4:
|
||||
return {'april': today.year}
|
||||
return {}
|
||||
|
0
various/migrations/__init__.py
Normal file
0
various/migrations/__init__.py
Normal file
3
various/models.py
Normal file
3
various/models.py
Normal file
|
@ -0,0 +1,3 @@
|
|||
from django.db import models
|
||||
|
||||
# Create your models here.
|
3
various/tests.py
Normal file
3
various/tests.py
Normal file
|
@ -0,0 +1,3 @@
|
|||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
3
various/views.py
Normal file
3
various/views.py
Normal file
|
@ -0,0 +1,3 @@
|
|||
from django.shortcuts import render
|
||||
|
||||
# Create your views here.
|
Loading…
Reference in a new issue