Browse Source

Merge branch 'test_deadline' into data_migrations

export_seznamu_prednasek
Pavel "LEdoian" Turinsky 4 years ago
parent
commit
6a1109ba4d
  1. 2
      data/flat.json
  2. 661
      data/sitetree_new.json
  3. 281
      mamweb/static/css/mamweb.css
  4. 26847
      mamweb/static/images/jakresit_1.svg
  5. 26847
      mamweb/static/images/jakresit_2.svg
  6. 26847
      mamweb/static/images/jakresit_3.svg
  7. 15
      mamweb/templates/base.html
  8. 1
      seminar/models.py
  9. 6
      seminar/templates/seminar/archiv/cisla.html
  10. 16
      seminar/templates/seminar/jak-resit.html
  11. 12
      seminar/templates/seminar/novinky.html
  12. 77
      seminar/templates/seminar/titulnistrana.html
  13. 3
      seminar/urls.py
  14. 97
      seminar/views/views_all.py

2
data/flat.json

@ -260,7 +260,7 @@
"fields": { "fields": {
"url": "/co-je-MaM/kontakt/", "url": "/co-je-MaM/kontakt/",
"title": "Kontakt", "title": "Kontakt",
"content": "<p>Sv\u00e1 \u0159e\u0161en\u00ed \u010di p\u0159\u00edpadn\u00e9 dotazy n\u00e1m m\u016f\u017eete&nbsp;pos\u00edlat bu\u010f klasickou, nebo elektronickou po\u0161tou:</p>\r\n\r\n<table align=\"left\" border=\"0\" cellpadding=\"1\" cellspacing=\"1\" style=\"width:100%\">\r\n\t<tbody>\r\n\t\t<tr>\r\n\t\t\t<td>\r\n\t\t\t<p><strong>Adresa redakce</strong>:</p>\r\n\r\n\t\t\t<p>M&amp;M, OPMK MFF UK<br />\r\n\t\t\tKe Karlovu 3<br />\r\n\t\t\t121&nbsp;16 Praha&nbsp;2</p>\r\n\t\t\t</td>\r\n\t\t\t<td>\r\n\t\t\t<p><strong>E-mail</strong>:&nbsp;<a href=\"mailto:mam@matfyz.cz\" style=\"color: rgb(133, 49, 1); line-height: 20.8px;\">mam@matfyz.cz</a></p>\r\n\r\n\t\t\t<p><strong>Facebook:</strong>&nbsp;<a href=\"https://www.facebook.com/casopis.MaM?fref=ts\">Koresponden\u010dn\u00ed semin\u00e1\u0159 M&amp;M</a></p>\r\n\r\n\t\t\t<p><strong>Google Kalend\u00e1\u0159:</strong>&nbsp;<a href=\"https://calendar.google.com/calendar/embed?src=casopis.mam%40gmail.com&amp;ctz=Europe%2FPrague\">casopis.mam@gmail.com</a></p>\r\n\t\t\t</td>\r\n\t\t</tr>\r\n\t</tbody>\r\n</table>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<p>B\u011bhem \u0161koln\u00edho roku je velk\u00e1 \u010d\u00e1st <a href=\"/co-je-MaM/organizatori/\"><strong>organiz\u00e1tor\u016f</strong></a> k zasti\u017een\u00ed na koleji 17. listopadu \u010di jinde po Praze.</p>\r\n\r\n<p><strong>Adresa koleje:</strong></p>\r\n\r\n<p>P\u00e1tkova 3<br />\r\n182 00, Praha 8</p>", "content": "<p>Sv\u00e1 \u0159e\u0161en\u00ed \u010di p\u0159\u00edpadn\u00e9 dotazy n\u00e1m m\u016f\u017eete&nbsp;pos\u00edlat bu\u010f klasickou, nebo elektronickou po\u0161tou:</p>\r\n\r\n<p><strong>Adresa redakce</strong>:</p>\r\n\r\n<p>M&amp;M, OPMK MFF UK<br />\r\nKe Karlovu 3<br />\r\n121&nbsp;16 Praha&nbsp;2</p>\r\n\r\n<p><strong>E-mail</strong>:<a href=\"mailto:mam@matfyz.cz\" style=\"color: rgb(133, 49, 1); line-height: 20.8px;\"> mam@matfyz.cz</a></p>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<p><strong>Facebook:</strong>&nbsp;<a href=\"https://www.facebook.com/casopis.MaM?fref=ts\">Koresponden\u010dn\u00ed semin\u00e1\u0159 M&amp;M</a></p>\r\n\r\n<p><strong>Google Kalend\u00e1\u0159:</strong>&nbsp;<a href=\"https://calendar.google.com/calendar/embed?src=casopis.mam%40gmail.com&amp;ctz=Europe%2FPrague\">casopis.mam@gmail.com</a></p>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<p>B\u011bhem \u0161koln\u00edho roku je velk\u00e1 \u010d\u00e1st <a href=\"/co-je-MaM/organizatori/\"><strong>organiz\u00e1tor\u016f</strong></a> k zasti\u017een\u00ed na koleji 17. listopadu \u010di jinde po Praze.</p>\r\n\r\n<p><strong>Adresa koleje:</strong></p>\r\n\r\n<p>P\u00e1tkova 3<br />\r\n182 00, Praha 8</p>",
"enable_comments": false, "enable_comments": false,
"template_name": "", "template_name": "",
"registration_required": false, "registration_required": false,

661
data/sitetree_new.json

File diff suppressed because one or more lines are too long

281
mamweb/static/css/mamweb.css

@ -101,6 +101,26 @@ h6 {
color: black; color: black;
} }
.button {
margin: 10px 0px 10px 0px;
padding: 4px 0; /*vertikální centování textu*/
text-align: center;
background-color: #e84e10;
color: #fffbf6;
font-size: 150%;
font-weight: bold;
font-variant: small-caps;
filter: drop-shadow(0px 5px 5px rgba(0, 0, 0, 0.4));
}
.button:hover {
position: relative;
top: 2px;
left:2px;
background-color: #df490e;
;
}
.org-logged-in .mam-text-plugin { .org-logged-in .mam-text-plugin {
border: dashed 1px #6a0043; border: dashed 1px #6a0043;
@ -286,7 +306,11 @@ ul.submenu li>a:hover {
color: black; color: black;
} }
ul.menu li.active>a, ul.submenu li.active>a { ul.menu li.active>a {
color: #f9d59e;
}
ul.submenu li.active>a {
color: black; color: black;
} }
@ -367,13 +391,82 @@ input[type="file"] {
} }
.field-with-comment:hover span.field-comment{ .field-with-comment:hover span.field-comment{
display:block; display: block;
} }
input { input {
margin: 5px; margin: 5px;
} }
/* titulni stranka */
.titulnistrana {
display: flex;
text-align: justify;
}
.titulnistrana h1 {
text-align: center;
}
.zjistit_vic{
text-align: center;
margin-bottom: 30px;
}
.zjistit_vic hr {
display: none;
}
.graf-svg {
display: flex;
}
#svg-graf {
width: 100%;
height: auto;
margin: 30px;
}
.titulnistrana_obsah {
width: 66%;
}
.vitej_titulka, .temata_titulka {
width: 49%;
padding: 10px;
display: table-cell;
}
.titulnistrana_novinky {
width: 33%;
padding: 10px;
}
.novinka_obrazek {
margin: 10px 0px 10px 0px;
width: 100%;
}
.novinka_datum {
font-weight: bold;
}
.novinka_autor {
text-align: right;
font-style: italic;
}
div.org-text {
font-style: italic;
}
div.odpocet {
margin: 20px;
text-align: center;
}
/********************** /**********************
* Zmenšování displeje * Zmenšování displeje
***********************/ ***********************/
@ -403,42 +496,22 @@ input {
width: 100%; width: 100%;
} }
div.novinky{ ul.menu {
max-width: 100%; font-size: 90%;
margin-left: auto; margin-top: -7px;
margin-right: auto;
float: none;
}
div.graf{
width: 70%;
float: none;
margin-left: auto;
margin-right: auto;
margin-top: 10px;
}
#svg-graf{
width: 100%;
height: auto;;
} }
ul.menu { ul.menu li {
font-size: 90%; margin-top: 10px; /* posunutí textu hlavního menu níže */
margin-top: -7px; }
}
ul.menu li {
margin-top: 10px; /* posunutí textu hlavního menu níže */
}
ul.submenu li {
margin-top: 0px; /* aby se spolu s textem hlavního menu neposunoval níže i text submenu */
}
ul.submenu { ul.submenu li {
margin-top: 8px; /* mezera mezi hlavním menu a submenu */ margin-top: 0px; /* aby se spolu s textem hlavního menu neposunoval níže i text submenu */
} }
ul.submenu {
margin-top: 8px; /* mezera mezi hlavním menu a submenu */
}
} }
@ -470,11 +543,53 @@ ul.submenu {
display: inline-grid; display: inline-grid;
max-width: 300px; max-width: 300px;
} }
/* titulni stranka */
.titulnistrana {
display: block;
}
.graf {
padding-top: 40px;
}
.titulnistrana_obsah {
width: 100%;
}
.vitej_titulka, .temata_titulka {
width: 49%;
padding: 10px;
display: table-cell;
}
.titulnistrana_novinky {
width: 100%;
max-width: 500px;
padding: 10px;
margin: auto;
}
#svg-graf {
width: 100%;
max-width: 500px;
padding: 10px;
margin: auto;
}
.zjistit_vic hr {
display: flex;
}
} }
/* malý tablet, mobil */ /* malý tablet, mobil */
@media (max-width: 650px) { @media (max-width: 650px) {
.no-mobile{
display: none;
}
#hide-if-small.login-bar-flatpage { #hide-if-small.login-bar-flatpage {
display: none; display: none;
} }
@ -611,18 +726,34 @@ ul.submenu {
text-align: justify; text-align: justify;
} }
div.novinky { table.form td, table.form tr {
max-width: 100%; display: inherit;
float: none; }
}
/* titulni stranka */
.titulnistrana {
display: block;
}
div.graf { .graf {
padding-top: 40px;
}
.titulnistrana_obsah {
width: 100%; width: 100%;
} }
table.form td, table.form tr { .vitej_titulka, .temata_titulka {
display: inherit; width: 100%;
} padding: 10px;
display: block;
}
.titulnistrana_novinky {
width: 100%;
padding: 10px;
}
} }
@ -704,11 +835,6 @@ div.org_email {
backface-visibility: hidden; backface-visibility: hidden;
} }
/* Style the front side (fallback if image is missing) */
.flip-card-front {
background-color: #bbb;
}
div.flip-card-foto img { div.flip-card-foto img {
width: 100%; width: 100%;
height: 100%; height: 100%;
@ -724,6 +850,10 @@ div.flip-card-foto img {
padding-top: 20px; padding-top: 20px;
} }
#archiv.flip-card-back {
background-color: white;
}
/* karty archiv */ /* karty archiv */
div.popis_rocniku { div.popis_rocniku {
@ -920,46 +1050,8 @@ div.cislo_odkazy ul {
} }
/* titulni stranka */ /**/
.zjistit_vic{
text-align: center;
}
.graf{
float: left;
}
.novinky{
float: right;
max-width: 42%;
}
.novinka_obrazek img {
margin-bottom: 15px;
}
div.novinka_obrazek {
width: 100%;
max-width: 400px; /*FIXME*/
}
div.org-text {
font-style: italic;
}
div.nahledy_cisel {
float: right;
height: 297px;
width: 420px;
position: relative;
margin-right: 10%;
margin-bottom: 50px;
}
div.nahledy_cisel div, div.nahledy_cisel img {
position: absolute;
}
ul.form { ul.form {
list-style-type: none; list-style-type: none;
padding-left: 0px; padding-left: 0px;
@ -984,3 +1076,20 @@ p.gdpr {
div.gdpr { div.gdpr {
font-size: 6pt; font-size: 6pt;
} }
/* Jak řešit */
.jakresit img {
width: 33%;
padding: 10px;
filter: none;
}
@media(max-width: 860px) {
.jakresit img {
margin: auto;
display: grid;
width: 100%;
max-width: 360px;
}
}

26847
mamweb/static/images/jakresit_1.svg

File diff suppressed because it is too large

After

Width:  |  Height:  |  Size: 1.8 MiB

26847
mamweb/static/images/jakresit_2.svg

File diff suppressed because it is too large

After

Width:  |  Height:  |  Size: 1.8 MiB

26847
mamweb/static/images/jakresit_3.svg

File diff suppressed because it is too large

After

Width:  |  Height:  |  Size: 1.8 MiB

15
mamweb/templates/base.html

@ -56,14 +56,17 @@
<div class='col-md-12'> <div class='col-md-12'>
<a href='/'> <a href='/'>
<div id="title" >M&M - korespondenční seminář a časopis MFF&nbspUK</div> <div id="title" >M&M - korespondenční seminář a časopis MFF&nbspUK</div>
<div id="header" style="background-image: url('{{ fotka }}')"> <div id="header">
<div class="no-mobile" style="background-image: url('{{ fotka }}')">
{# TODO style=… není fancy řešení, ale u <img> se bojím, že mi to rozbije vzhled #} {# TODO style=… není fancy řešení, ale u <img> se bojím, že mi to rozbije vzhled #}
{% sitetree_menu from "main_menu" include "trunk" template "logo.html" %} {% sitetree_menu from "main_menu" include "trunk" template "logo.html" %}
</div>
<img class="logo-mobile" src="{% static 'images/logo-mobile.svg' %}" /> <img class="logo-mobile" src="{% static 'images/logo-mobile.svg' %}" />
</div> </div>
</a> </a>
</div> </div>
</div> </div>
<div class='row'> <div class='row'>
<div class='col-md-12'> <div class='col-md-12'>
@ -73,6 +76,9 @@
{# ========= MENU MOBILE ========== #} {# ========= MENU MOBILE ========== #}
</div>
</div>
<!--Navbar--> <!--Navbar-->
<nav class="nav-button"> <nav class="nav-button">
@ -95,13 +101,15 @@
{# ========= END MENU ========== #} {# ========= END MENU ========== #}
<div class='row'>
<div class='row content'> <div class='row content'>
<div class='col-md-12'> <div class='col-md-12'>
{% block content %} {% block content %}
{% endblock content %} {% endblock content %}
</div> </div>
</div>
</div> </div>
<div class='row'> <div class='row'>
<div class='col-md-12'> <div class='col-md-12'>
<div id="footer"> <div id="footer">
@ -110,6 +118,7 @@
<p class="license-mobile">Korespondenční seminář M&M organizují převážně studenti <a href="https://www.mff.cuni.cz/">MFF UK</a>. Organizaci semináře a vydávání časopisu podporuje <a href="https://jcmf.cz/">Jednota českých matematiků a fyziků</a>. S obsahem webu M&amp;M je možné nakládat dle licence <a href="https://creativecommons.org/licenses/by/3.0/cz/">Creative Commons Attribution 3.0</a>.</p> <p class="license-mobile">Korespondenční seminář M&M organizují převážně studenti <a href="https://www.mff.cuni.cz/">MFF UK</a>. Organizaci semináře a vydávání časopisu podporuje <a href="https://jcmf.cz/">Jednota českých matematiků a fyziků</a>. S obsahem webu M&amp;M je možné nakládat dle licence <a href="https://creativecommons.org/licenses/by/3.0/cz/">Creative Commons Attribution 3.0</a>.</p>
</div> </div>
</div> </div>
</div> </div>
<script src="{% static 'js/bootstrap.js' %}"></script> <script src="{% static 'js/bootstrap.js' %}"></script>

1
seminar/models.py

@ -706,6 +706,7 @@ class Problem(SeminarModelBase,PolymorphicModel):
(STAV_SMAZANY, 'Smazaný'), (STAV_SMAZANY, 'Smazaný'),
] ]
stav = models.CharField('stav problému', max_length=32, choices=STAV_CHOICES, blank=False, default=STAV_NAVRH) stav = models.CharField('stav problému', max_length=32, choices=STAV_CHOICES, blank=False, default=STAV_NAVRH)
# Téma je taky Problém, takže má stavy, "zadané" témátko je aktuálně otevřené a dá se k němu něco poslat (řešení nebo článek)
zamereni = TaggableManager(verbose_name='zaměření', zamereni = TaggableManager(verbose_name='zaměření',
help_text='Zaměření M/F/I/O problému, příp. další tagy', blank=True) help_text='Zaměření M/F/I/O problému, příp. další tagy', blank=True)

6
seminar/templates/seminar/archiv/cisla.html

@ -8,10 +8,6 @@
{% endblock %}{% endblock %} {% endblock %}{% endblock %}
</h2> </h2>
<!-- <div class='nahledy_cisel'>
{% autoescape off %}{{ nahledy }}{% endautoescape %}
</div>-->
{% for rocnik, url_png in object_list.items %} {% for rocnik, url_png in object_list.items %}
<div class="rocnik_pole"> <div class="rocnik_pole">
@ -33,7 +29,7 @@
</div> </div>
</div> </div>
<div class="flip-card-back"> <div class="flip-card-back" id="archiv">
<div class="popis_rocniku"> <div class="popis_rocniku">
Jednotlivá čísla: Jednotlivá čísla:
<ul> <ul>

16
seminar/templates/seminar/jak-resit.html

@ -0,0 +1,16 @@
{% extends 'base.html' %}
{% load humanize %}
{% load staticfiles %}
{% block content %}
<div class=jakresit>
<img class="jakresit_obrazek" alt="" src="{% static 'images/jakresit_1.svg' %}" />
<img class="jakresit_obrazek" alt="" src="{% static 'images/jakresit_2.svg' %}" />
<img class="jakresit_obrazek" alt="" src="{% static 'images/jakresit_3.svg' %}" />
</div>
{% endblock %}

12
seminar/templates/seminar/novinky.html

@ -9,7 +9,7 @@
{% endif %} {% endif %}
{% if novinka.zverejneno or user.je_org %} {% if novinka.zverejneno or user.je_org %}
{# datum #} {# datum #}
<div><b>{{novinka.datum}}</b></div> <div class=novinka_datum>{{novinka.datum}}</div>
{# text #} {# text #}
{{ novinka.text | safe }} {{ novinka.text | safe }}
{# obrazek #} {# obrazek #}
@ -25,12 +25,12 @@
</div> </div>
{% endif %} {% endif %}
{# autor #} {# autor #}
<div class=novinky_name><p>{{novinka.autor.first_name}} <div class=novinka_autor>
{% if novinka.autor.organizator.prezdivka%} {{novinka.autor.osoba.jmeno}}
&bdquo;{{novinka.autor.organizator.prezdivka}}&ldquo; {% if novinka.autor.osoba.prezdivka%}
&bdquo;{{novinka.autor.osoba.prezdivka}}&ldquo;
{% endif %} {% endif %}
{{novinka.autor.last_name}} {{novinka.autor.osoba.prijmeni}}
</p>
</div> </div>
{% endif %} {% endif %}
{% if not novinka.zverejneno and user.je_org %} {% if not novinka.zverejneno and user.je_org %}

77
seminar/templates/seminar/titulnistrana.html

@ -5,32 +5,53 @@
{% block content %} {% block content %}
{# Uvitaci text #}
{% if nejblizsi_deadline %}
<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á:
{{nejblizsi_deadline|timeuntil}}</big></b></p>
</div>
{% endif %}
<div class=titulnistrana>
<div class="titulnistrana_obsah">
<div class="vitej_titulka">
<h1> <h1>
{% block nadpis1a %}{% block nadpis1b %} {% block nadpis1a %}
Vítej! Vítej
{% endblock %}{% endblock %} {% endblock %}
mezi námi
</h1> </h1>
<p>
M&amp;M je korespondenční seminář. Několikrát do roka zdarma vydáváme časopis a v něm zajímavé podněty k přemýšlení. Ty na ně můžeš reagovat.<br>
M&amp;M je taky soutěž. Můžeš vyhrát knížky, deskovky nebo dokonce dort. Můžeš se dostat na matfyz bez přijímaček. A především s námi můžeš jet na skvělé soustředění. <div>
</p> M&amp;M je korespondenční seminář. Vydáváme časopis a v něm zajímavé podněty k přemýšlení. Ty na ně můžeš reagovat,
experimentovat a objevovat s námi fascinující zákoutí matiky, fyziky a informatiky.
<div class="novinky"> <a href="auth/registrace"> <div class="button"> Zaregistruj se! </div> </a> {# FIXME odkaz #}
{% if dead %} M&amp;M je taky soutěž. Za svá řešení dostaneš body a můžeš vyhrát zajímavé ceny, dostat se
<div class="odpocet"> na Matfyz bez přijímaček a především, můžeš s námi jet na skvělé soustředění.
<p><b>Do konce <a href="/zadani/aktualni/">odeslání řešení</a> {% if deadline_soustredeni %}(pro účast na soustředění) {% endif %}zbývá:<br> <a href="cojemam/odmeny"> <div class="button"> Co můžeš vyhrát? </div> </a> {# FIXME odkaz #}
<big>{{ted|timesince:dead}}</big></b></p>
</div> </div>
{% endif %}
</div>
{# Novinky #} <div class="temata_titulka">
<h1>Novinky</h1>
{% include 'seminar/novinky.html' %}
<a href='/stare-novinky/'>Archiv novinek</a> <h1>
Řeš témata!
</h1>
<div>
Přidej se k nám! Pusť se do řešení témát.
{% for tema in aktualni_temata %}
<a href="{{ tema.url }}"> <div class="button"> {{ tema.nazev }} </div> </a>
{% endfor %}
</div>
</div> </div>
<div class="graf"> <div class="graf">
<div class="graf-svg"> <div class="graf-svg">
@ -38,8 +59,24 @@ M&amp;M je korespondenční seminář. Několikrát do roka zdarma vydáváme č
</div> </div>
<span class="zjistit_vic"> <span class="zjistit_vic">
<h2><a href="/co-je-MaM/uvod/">Zjistit víc!</a></h2> <h2><a href="/co-je-MaM/uvod/">Zjisti víc!</a></h2>
<hr>
</span> </span>
</div> </div>
</div>
<div class="titulnistrana_novinky">
{# Novinky #}
<h1>Co je nového?</h1>
{% include 'seminar/novinky.html' %}
<a href='/stare-novinky/'>Archiv novinek</a>
</div>
</div>
{% endblock %} {% endblock %}

3
seminar/urls.py

@ -17,7 +17,7 @@ urlpatterns = [
path('archiv/temata/', views.ArchivTemataView.as_view()), path('archiv/temata/', views.ArchivTemataView.as_view()),
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'), # odkomentované jenom kvůli testování archivu path('cislo/<int:rocnik>.<str:cislo>/', views.CisloView.as_view(), name='seminar_cislo'),
path('problem/<int:pk>/', views.ProblemView.as_view(), name='seminar_problem'), path('problem/<int:pk>/', views.ProblemView.as_view(), name='seminar_problem'),
path('treenode/<int:pk>/', views.TreeNodeView.as_view(), name='seminar_treenode'), path('treenode/<int:pk>/', views.TreeNodeView.as_view(), name='seminar_treenode'),
#path('problem/(?P<pk>\d+)/(?P<prispevek>\d+)/', views.PrispevekView.as_view(), name='seminar_problem_prispevek'), #path('problem/(?P<pk>\d+)/(?P<prispevek>\d+)/', views.PrispevekView.as_view(), name='seminar_problem_prispevek'),
@ -150,6 +150,7 @@ urlpatterns = [
path('temp/nahraj_reseni', resitel_required(views.NahrajReseniView.as_view()), name='seminar_nahraj_reseni'), path('temp/nahraj_reseni', resitel_required(views.NahrajReseniView.as_view()), name='seminar_nahraj_reseni'),
path('', views.TitulniStranaView.as_view(), name='titulni_strana'), path('', views.TitulniStranaView.as_view(), name='titulni_strana'),
path('jak-resit/', views.JakResitView.as_view(), name='jak-resit'),
# Ceka na autocomplete v3 # Ceka na autocomplete v3
# path('autocomplete/organizatori/', # path('autocomplete/organizatori/',

97
seminar/views/views_all.py

@ -24,7 +24,7 @@ from seminar import utils, treelib
from seminar.forms import PrihlaskaForm, LoginForm, ProfileEditForm from seminar.forms import PrihlaskaForm, LoginForm, ProfileEditForm
import seminar.forms as f import seminar.forms as f
from datetime import timedelta, date, datetime from datetime import timedelta, date, datetime, MAXYEAR
from django.utils import timezone from django.utils import timezone
from itertools import groupby from itertools import groupby
from collections import OrderedDict from collections import OrderedDict
@ -44,14 +44,15 @@ import time
from seminar.utils import aktivniResitele, resi_v_rocniku from seminar.utils import aktivniResitele, resi_v_rocniku
# ze starého modelu
def verejna_temata(rocnik): #def verejna_temata(rocnik):
"""Vrací queryset zveřejněných témat v daném ročníku. # """
""" # Vrací queryset zveřejněných témat v daném ročníku.
return Problem.objects.filter(typ=Problem.TYP_TEMA, cislo_zadani__rocnik=rocnik, cislo_zadani__verejne_db=True).order_by('kod') # """
# return Problem.objects.filter(typ=Problem.TYP_TEMA, cislo_zadani__rocnik=rocnik, cislo_zadani__verejne_db=True).order_by('kod')
def temata_v_rocniku(rocnik): #
return Problem.objects.filter(typ=Problem.TYP_TEMA, rocnik=rocnik) #def temata_v_rocniku(rocnik):
# return Problem.objects.filter(typ=Problem.TYP_TEMA, rocnik=rocnik)
def get_problemy_k_tematu(tema): def get_problemy_k_tematu(tema):
return Problem.objects.filter(nadproblem = tema) return Problem.objects.filter(nadproblem = tema)
@ -242,45 +243,51 @@ def spravne_novinky(request):
qs = qs.filter(zverejneno=True) qs = qs.filter(zverejneno=True)
return qs.order_by('-datum') return qs.order_by('-datum')
def aktualni_temata(rocnik):
"""
Vrací PolymorphicQuerySet témat v daném ročníku, ke kterým se aktuálně něco odevzdat.
"""
return Tema.objects.filter(rocnik=rocnik, stav='zadany').order_by('kod')
class TitulniStranaView(generic.ListView): class TitulniStranaView(generic.ListView):
template_name='seminar/titulnistrana.html' template_name='seminar/titulnistrana.html'
def get_queryset(self): def get_queryset(self):
return spravne_novinky(self.request)[:5] return spravne_novinky(self.request)[:3]
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(TitulniStranaView, self).get_context_data(**kwargs) context = super(TitulniStranaView, self).get_context_data(**kwargs)
nastaveni = get_object_or_404(Nastaveni) nastaveni = get_object_or_404(Nastaveni)
deadline_soustredeni = (nastaveni.aktualni_cislo.datum_deadline_soustredeni, "soustredeni")
preddeadline = (nastaveni.aktualni_cislo.datum_preddeadline, "preddeadline")
deadline = (nastaveni.aktualni_cislo.datum_deadline, "deadline")
# zjisteni spravneho terminu try:
if nastaveni.aktualni_cislo.datum_deadline_soustredeni: nejblizsi_deadline = sorted(filter(lambda dl: dl[0] is not None and dl[0] >= date.today(), [deadline_soustredeni, preddeadline, deadline]))[0]
cas_deadline_soustredeni = nastaveni.aktualni_cislo.\ except IndexError:
datum_deadline_soustredeni nejblizsi_deadline = (None, None) # neni zadna aktualni deadline
if (datetime.now().date() <= cas_deadline_soustredeni):
cas_deadline = cas_deadline_soustredeni if nejblizsi_deadline[0] is not None:
deadline_soustredeni = True context['nejblizsi_deadline'] = datetime.combine(nejblizsi_deadline[0], datetime.max.time())
else:
cas_deadline = nastaveni.aktualni_cislo.datum_deadline
deadline_soustredeni = False
else:
cas_deadline = nastaveni.aktualni_cislo.datum_deadline
deadline_soustredeni = False
# Pokud neni zverejnene cislo nezverejnuj odpocet
if nastaveni.aktualni_cislo.verejne():
# pokus se zjistit termin odeslani a pokud neni zadany,
# nezverejnuj odpocet
context['deadline_soustredeni'] = deadline_soustredeni
try:
context['dead'] = datetime.combine(cas_deadline,
datetime.max.time())
context['ted'] = datetime.now()
except:
context['dead'] = None
else: else:
context['dead'] = None context['nejblizsi_deadline'] = None
context['deadline_soustredeni'] = deadline_soustredeni
context['typ_deadline'] = nejblizsi_deadline[1]
# Aktuální témata
nazvy_a_odkazy_na_aktualni_temata = []
akt_temata = aktualni_temata(nastaveni.aktualni_rocnik)
for tema in akt_temata:
# FIXME: netuším, jestli funguje tema.verejne_url(), nemáme testdata na témátka - je to asi url vzhledem k ročníku
nazvy_a_odkazy_na_aktualni_temata.append({'nazev':tema.nazev,'url':tema.verejne_url()})
context['aktualni_temata'] = nazvy_a_odkazy_na_aktualni_temata
print(context)
return context return context
class StareNovinkyView(generic.ListView): class StareNovinkyView(generic.ListView):
@ -343,7 +350,8 @@ class ArchivView(generic.ListView):
### Výsledky ### Výsledky
def sloupec_s_poradim(setrizene_body): def sloupec_s_poradim(setrizene_body):
""" Ze seznamu obsahujícího sestupně setřízené body řešitelů za daný ročník """
Ze seznamu obsahujícího sestupně setřízené body řešitelů za daný ročník
vytvoří seznam s pořadími (včetně 3.-5. a pak 2 volná místa atp.), vytvoří seznam s pořadími (včetně 3.-5. a pak 2 volná místa atp.),
podle toho, jak jdou za sebou ve výsledkovce. podle toho, jak jdou za sebou ve výsledkovce.
Parametr: Parametr:
@ -383,7 +391,8 @@ def sloupec_s_poradim(setrizene_body):
return sloupec_s_poradim return sloupec_s_poradim
def cisla_rocniku(rocnik, jen_verejne=True): def cisla_rocniku(rocnik, jen_verejne=True):
""" Vrátí všechna čísla daného ročníku. """
Vrátí všechna čísla daného ročníku.
Parametry: Parametry:
rocnik (Rocnik): ročník semináře rocnik (Rocnik): ročník semináře
jen_verejne (bool): zda se mají vrátit jen veřejná, nebo všechna čísla jen_verejne (bool): zda se mají vrátit jen veřejná, nebo všechna čísla
@ -538,7 +547,7 @@ def vysledkovka_rocniku(rocnik, jen_verejne=True):
# získáme body za ročník, seznam obsahuje dvojice (řešitel_id, body) setřízené sestupně # získáme body za ročník, seznam obsahuje dvojice (řešitel_id, body) setřízené sestupně
resitel_rocnikbody_sezn = secti_body_za_rocnik(rocnik, aktivni_resitele) resitel_rocnikbody_sezn = secti_body_za_rocnik(rocnik, aktivni_resitele)
# setřídíme řešitele podle počtu bodů a získáme seznam s body od nejvyšších po nenižší # setřídíme řešitele podle počtu bodů a získáme seznam s body od nejvyšších po nenižší
setrizeni_resitele_id, setrizeni_resitele, setrizene_body = setrid_resitele_a_body(resitel_rocnikbody_sezn) setrizeni_resitele_id, setrizeni_resitele, setrizene_body = setrid_resitele_a_body(resitel_rocnikbody_sezn)
poradi = sloupec_s_poradim(setrizene_body) poradi = sloupec_s_poradim(setrizene_body)
@ -773,6 +782,7 @@ def vysledkovka_cisla(cislo, context=None):
return context return context
class CisloView(generic.DetailView): class CisloView(generic.DetailView):
# FIXME zobrazování témátek a vůbec, teď je tam jen odkaz na číslo v pdf
model = Cislo model = Cislo
template_name = 'seminar/archiv/cislo.html' template_name = 'seminar/archiv/cislo.html'
@ -1332,3 +1342,10 @@ def formularOKView(request):
} }
return render(request, template_name, context) return render(request, template_name, context)
#------------------ Jak řešit - možná má být udělané úplně jinak
class JakResitView(generic.ListView):
template_name = 'seminar/jak-resit.html'
def get_queryset(self):
return None

Loading…
Cancel
Save