Browse Source

Merge branch 'data_migrations' of gimli.ms.mff.cuni.cz:/akce/mam/git/mamweb into data_migrations

export_seznamu_prednasek
parent
commit
b10c5d227a
  1. 2
      Makefile
  2. 2
      README.md
  3. 8
      mamweb/settings_local.py
  4. 735
      mamweb/static/css/mamweb.css
  5. BIN
      mamweb/static/favicon.ico
  6. 201
      mamweb/static/fonts/OpenSans/Apache License.txt
  7. BIN
      mamweb/static/fonts/OpenSans/OpenSans-Bold.ttf
  8. BIN
      mamweb/static/fonts/OpenSans/OpenSans-BoldItalic.ttf
  9. BIN
      mamweb/static/fonts/OpenSans/OpenSans-ExtraBold.ttf
  10. BIN
      mamweb/static/fonts/OpenSans/OpenSans-ExtraBoldItalic.ttf
  11. BIN
      mamweb/static/fonts/OpenSans/OpenSans-Italic.ttf
  12. BIN
      mamweb/static/fonts/OpenSans/OpenSans-Light.ttf
  13. BIN
      mamweb/static/fonts/OpenSans/OpenSans-LightItalic.ttf
  14. BIN
      mamweb/static/fonts/OpenSans/OpenSans-Regular.ttf
  15. BIN
      mamweb/static/fonts/OpenSans/OpenSans-Semibold.ttf
  16. BIN
      mamweb/static/fonts/OpenSans/OpenSans-SemiboldItalic.ttf
  17. 120
      mamweb/static/images/MATFYZ_MM_barevne.svg
  18. BIN
      mamweb/static/images/footer-bg-bottom.png
  19. BIN
      mamweb/static/images/footer-bg-top.png
  20. BIN
      mamweb/static/images/graf/adrenalinove.jpeg
  21. BIN
      mamweb/static/images/graf/behaci.jpeg
  22. BIN
      mamweb/static/images/graf/ceny.jpeg
  23. BIN
      mamweb/static/images/graf/deskovky.jpeg
  24. BIN
      mamweb/static/images/graf/dort.jpeg
  25. BIN
      mamweb/static/images/graf/hry.jpeg
  26. BIN
      mamweb/static/images/graf/jidlo.jpeg
  27. BIN
      mamweb/static/images/graf/konfery.jpeg
  28. BIN
      mamweb/static/images/graf/legenda.jpeg
  29. BIN
      mamweb/static/images/graf/prednasky.jpeg
  30. BIN
      mamweb/static/images/graf/strategicke.jpeg
  31. BIN
      mamweb/static/images/graf/vylet.jpeg
  32. BIN
      mamweb/static/images/graph.png
  33. BIN
      mamweb/static/images/header-bg-archiv-NOC.jpg
  34. BIN
      mamweb/static/images/header-bg-archiv.jpg
  35. BIN
      mamweb/static/images/header-bg-clanek-NOC.jpg
  36. BIN
      mamweb/static/images/header-bg-clanek.jpg
  37. BIN
      mamweb/static/images/header-bg-odevzdat-NOC.jpg
  38. BIN
      mamweb/static/images/header-bg-soustredeni-NOC.jpg
  39. BIN
      mamweb/static/images/header-bg-soustredeni.jpg
  40. BIN
      mamweb/static/images/header-bg-uvod-NOC.jpg
  41. BIN
      mamweb/static/images/header-bg-uvod.jpg
  42. BIN
      mamweb/static/images/header-bg-zadani-NOC.jpg
  43. BIN
      mamweb/static/images/header-bg-zadani.jpg
  44. BIN
      mamweb/static/images/header-bg.jpg
  45. BIN
      mamweb/static/images/header/baliky.jpg
  46. BIN
      mamweb/static/images/header/beh.jpg
  47. BIN
      mamweb/static/images/header/kryptografie.jpg
  48. BIN
      mamweb/static/images/header/mam_cernobile.jpg
  49. BIN
      mamweb/static/images/header/noc.jpg
  50. BIN
      mamweb/static/images/header/ohen.jpg
  51. BIN
      mamweb/static/images/header/snih.jpg
  52. BIN
      mamweb/static/images/header/spolecna.jpg
  53. BIN
      mamweb/static/images/header/stiny.jpg
  54. BIN
      mamweb/static/images/header/vikendovka.jpg
  55. BIN
      mamweb/static/images/header/vylet.jpg
  56. BIN
      mamweb/static/images/logo-jcmf.png
  57. BIN
      mamweb/static/images/logo-mff.png
  58. 240
      mamweb/static/images/logo-mobile.svg
  59. BIN
      mamweb/static/images/logo.png
  60. 208
      mamweb/static/images/logo.svg
  61. BIN
      mamweb/static/images/logojcmf.png
  62. BIN
      mamweb/static/images/matfyz-logo.png
  63. BIN
      mamweb/static/images/menu-bg-selected.png
  64. BIN
      mamweb/static/images/menu-bg.png
  65. 660
      mamweb/static/images/mozaika-footer.svg
  66. BIN
      mamweb/static/images/submenu-bg-selected.png
  67. BIN
      mamweb/static/images/submenu-bg.png
  68. 10598
      mamweb/static/js/jquery-3.4.1.js
  69. 111
      mamweb/templates/base.html
  70. 733
      mamweb/templates/graph.svg
  71. 24
      mamweb/templates/menu.html
  72. 19
      mamweb/templates/menu_mobile.html
  73. 8
      mamweb/templates/menu_mobile_dropdown.html
  74. 8
      mamweb/templates/submenu.html
  75. BIN
      seminar/static/images/no-photo.png
  76. 16
      seminar/templates/seminar/archiv/cislo.html
  77. 87
      seminar/templates/seminar/cojemam/organizatori.html
  78. 33
      seminar/templates/seminar/titulnistrana.html
  79. 195
      seminar/testutils.py
  80. 101
      seminar/treelib.py
  81. 2
      seminar/urls.py
  82. 327
      seminar/views/views_all.py

2
Makefile

@ -94,7 +94,7 @@ deploy_prod: venv_check
@echo Done. @echo Done.
sync_prod_flatpages: sync_prod_flatpages: venv_check
@echo Downloading current version of flatpages from mamweb-prod. @echo Downloading current version of flatpages from mamweb-prod.
ssh mam-web@gimli.ms.mff.cuni.cz \ ssh mam-web@gimli.ms.mff.cuni.cz \
"cd /akce/mam/www/mamweb-prod; ./manage.py dumpdata flatpages --indent=2 > flat.json" "cd /akce/mam/www/mamweb-prod; ./manage.py dumpdata flatpages --indent=2 > flat.json"

2
README.md

@ -41,7 +41,7 @@ Make commands
* `make schema` - generates graph of seminar and all schemas as PDF. Supercool! * `make schema` - generates graph of seminar and all schemas as PDF. Supercool!
* `make sync_prod_flatpages` - downloads current flat/static pages from production version * `make sync_prod_flatpages` - downloads and applies static/flat pages from mamweb-prod
./manage.py commands ./manage.py commands
-------------------- --------------------

8
mamweb/settings_local.py

@ -72,11 +72,17 @@ LOGGING = {
}, },
}, },
'loggers': { 'loggers': {
# Vypisovani databazovych dotazu do konzole
#'django.db.backends': {
# 'level': 'DEBUG',
# 'handlers': ['console'],
# 'propagate': False,
#},
'werkzeug': { 'werkzeug': {
'handlers': ['console'], 'handlers': ['console'],
'level': 'DEBUG', 'level': 'DEBUG',
'propagate': True, 'propagate': True,
}, },
'': { '': {
'handlers': ['console'], 'handlers': ['console'],
'level': 'DEBUG', 'level': 'DEBUG',

735
mamweb/static/css/mamweb.css

@ -1,10 +1,78 @@
@import url(https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,400,300,600&subset=latin,latin-ext); @font-face {
font-family: 'OpenSans';
src: url("../fonts/OpenSans/OpenSans-Regular.ttf");
font-weight: normal;
}
body { body {
font-family: 'Open Sans', sans-serif; font-family: 'OpenSans';
font-weight: 400; background-color: #fffbf6;
}
div.container {
width: 970px;
margin: auto;
}
div.login-bar {
background: #6a0043;
}
/* odkazy a nadpisy */
a {
color: #6f2509;
}
a:focus, a:hover, a:active {
color: #e84e10;
text-decoration: none;
}
a:focus a:hover
h1 { /*todo: odlišit 1 a 2 */
font-size: 200%;
font-variant: small-caps;
font-weight: bold;
color: #6f2509;
}
h2 {
font-size: 200%;
font-variant: small-caps;
font-weight: bold;
color: #6f2509;
}
h3 {
font-size: 160%;
font-variant: small-caps;
font-weight: bold;
color: #6f2509;
}
h4 {
font-size: 140%;
font-variant: small-caps;
font-weight: bold;
color: #6f2509;
}
h5 {
font-size: 140%;
font-variant: small-caps;
font-weight: bold;
color: black;
}
h6 {
font-size: 120%;
font-variant: small-caps;
font-weight: bold;
color: black;
} }
.org-logged-in .mam-text-plugin { .org-logged-in .mam-text-plugin {
border: dashed 1px #f77; border: dashed 1px #f77;
padding: 5px; padding: 5px;
@ -13,8 +81,8 @@ body {
.mam-org-only { .mam-org-only {
background: #fff0d7; background: #fff0d7;
padding: 10px; padding: 10px;
margin: 10px -10px; margin: 10px -10px;
border: orange 2px dashed; border: orange 2px dashed;
} }
@ -44,7 +112,6 @@ table .border-b {
} }
div.container { div.container {
background-color: #fff8eb;
padding: 0px; padding: 0px;
} }
@ -65,150 +132,158 @@ h1 {
/* Headline & Header */ /* Headline & Header */
#title { /*dělá blbosti šířka, je to kvůli fixed pozici, zatím natvrdo, vyřešit*/
height: 55px;
width: 970px;
position: fixed;
z-index: 10;
background-color: #e84e10;
filter: drop-shadow(0px 5px 5px rgba(0, 0, 0, 0.4));
font-size: 28px;
color: #fffbf6;
font-weight: 400;
font-variant: small-caps;
text-align: center;
text-decoration: none;
padding-top: 8px;
text-shadow: none;
}
#title-mobile {
display: none;
}
#header { #header {
position: relative; position: relative;
font-size: 250%; background: url("../images/header/vikendovka.jpg") no-repeat center top; /* poměr 350:970, TODO: aby to nemuselo být přesně na pixely */
background: url("../images/header-bg-uvod.jpg") no-repeat center top; background-size: 100%;
height: 255px; top: 58px;
top: -1px;
} }
/*
fotky:
todo url
kryptografie
baliky
beh
mam_cernobile -pro archiv? asi ne
vylet
spolecna -spíš ne, moc lidí
snih
ohen
noc
stiny
vikendovka
*/
#header.cojemam { background-image: url("../images/header/vikendovka.jpg");}
#header.soustredeni { background-image: url("../images/header/beh.jpg");}
#header.zadani { background-image: url("../images/header/baliky.jpg");}
#header.clanky { background-image: url("../images/header/kryptografie.jpg");}
#header.archiv { background-image: url("../images/header/stiny.jpg");}
#header.cojemam { background-image: url("../images/header-bg-uvod.jpg"); } #header.NOC {background-image: url("../images/header/noc.jpg");}
#header.soustredeni { background-image: url("../images/header-bg-soustredeni.jpg"); } #header.NOCcojemam { background-image: url("../images/header/noc.jpg");}
#header.zadani { background-image: url("../images/header-bg-zadani.jpg"); } #header.NOCsoustredeni { background-image: url("../images/header/vylet.jpg");}
#header.clanky { background-image: url("../images/header-bg-clanek.jpg"); } #header.NOCzadani { background-image: url("../images/header/stiny.jpg");}
#header.archiv { background-image: url("../images/header-bg-archiv.jpg"); } #header.NOCclanky { background-image: url("../images/header/ohen.jpg");}
#header.NOCarchiv { background-image: url("../images/header/vikendovka.jpg");}
#header.NOC {background-image: url("../images/header-bg-uvod-NOC.jpg"); }
#header.NOCcojemam { background-image: url("../images/header-bg-uvod-NOC.jpg"); }
#header.NOCsoustredeni { background-image: url("../images/header-bg-soustredeni-NOC.jpg"); }
#header.NOCzadani { background-image: url("../images/header-bg-zadani-NOC.jpg"); }
#header.NOCclanky { background-image: url("../images/header-bg-clanek-NOC.jpg"); }
#header.NOCarchiv { background-image: url("../images/header-bg-archiv-NOC.jpg"); }
#header img.logo { #header img.logo {
position: absolute; position: absolute center;
top: 40px; width: 100%;
left: 55px; filter: drop-shadow(0px 5px 5px rgba(0, 0, 0, 0.4));
}
/*
#header h1 {
font-size: 130%;
position: absolute;
top: 125px;
left: 30px;
height: 110px;
} }
*/
#header img.header { #header img.logo-mobile {
margin: -25px 20px 0px 0px; display: none;
height: 145px;
float: right;
visibility: hidden;
} }
/* Menu */ /* Menu */
div.menu.mobile { ul.menu_mobile {
display: none; display: none;
} }
div.menu.desktop {
display: block; nav.nav-button {
display: none;
} }
div.menu {
position: relative; h1 a:hover {
top: -10px; text-decoration: none;
z-index: 10;
background: url("../images/menu-bg.png") no-repeat left top;
height: 60px;
} }
div.menu ul {
/* nové menu */
ul.menu {
width: 100%;
padding: 0px; padding: 0px;
margin: 0px; margin-top: -5px; /* posune celé menu nahoru (pak potřeba zvětšit mezeru mezi menu a submenu) */
font-variant: small-caps;
} }
div.menu li {
ul.menu a {
text-decoration: none;
font-weight: bold;
font-size: 105%;
}
ul.menu li {
margin: 0px;
display: inline-block; display: inline-block;
border-radius: 0px; width: 16.666667%;
padding: 6px 0px 0px 0px;
width: 16.66%;
min-width: 140px;
text-align: center; text-align: center;
font-size: 140%; font-size: 140%;
font-weight: 400; font-weight: 400;
font-variant: small-caps;
border-bottom-left-radius: 8px;
border-bottom-right-radius: 8px;
}
div.menu a {
display: block;
padding: 8px 10px;
color: #006400;
height: 48px;
}
div.menu a:hover {
background: url("../images/menu-bg-selected.png") no-repeat left -7px;
background-size: 100% 68px;
text-decoration: none;
color: #003c00;
} }
div.menu li.selected a {
background: url("../images/menu-bg-selected.png") no-repeat left -7px; ul.menu li>a:hover {
background-size: 100% 68px; color: black;
text-decoration: none;
color: #003c00;
z-index: 15px;
} }
h1 a:hover { ul.menu li>a:active { /* TODO: nefunfuje */
text-decoration: none; color: black;
} }
#submenu { ul.submenu {
position: relative;
top: -15px; background-color: #e84e10;
background: url("../images/submenu-bg.png") no-repeat left top; margin-top: 10px; /* mezera mezi hlavním menu a submenu */
height: 60px; margin-bottom: 10px;
padding-top: 10px;
padding-bottom: 5px;
filter: drop-shadow(0px 5px 5px rgba(0, 0, 0, 0.4));
} }
#submenu ul {
padding: 0px 15px; ul.submenu {
font-size: 120%; background-color: #e84e10;
z-index: 5;
font-weight: 400; font-weight: 400;
} }
#submenu li {
padding: 4px 20px; ul.submenu li {
width: auto;
padding: 0px 20px 0px 20px;
display: inline-block; display: inline-block;
height: 40px;
} }
#submenu li>a { ul.submenu li>a {
color: #003c00; color: #f9d59e;
text-decoration: none; text-decoration: none;
text-shadow: none;
} }
#submenu li>a:hover {
color: #3c003c; ul.submenu li>a:hover {
} color: black;
#submenu li.selected {
background: url("../images/submenu-bg-selected.png") no-repeat center;
background-size: 150% 150%;
}
#submenu li.selected>a {
color: #3c003c;
}
/*#submenu li:first-child {
border-top-left-radius: 7px;
border-top-right-radius: 7px;
padding-top: 8px;
}
#submenu li:last-child {
border-bottom-left-radius: 7px;
border-bottom-right-radius: 7px;
padding-bottom: 8px;
} }
#submenu li>a:hover {
text-decoration: none; /* konec nového menu */
}*/
div.novinky_name { div.novinky_name {
text-align: right; text-align: right;
@ -222,100 +297,60 @@ div.zadani_azad_termin {
} }
/********** /**********
* Footer * Footer
**********/ **********/
#footer {
background: url("../images/footer-bg-top.png") no-repeat top center;
background-color: #ffd546;
padding: 20px 30px 0px 30px;
min-height: 210px;
}
#footer-extra { #footer {
background: url("../images/footer-bg-bottom.png") no-repeat bottom center; background: url("../images/mozaika-footer.svg") no-repeat top center;
height: 39px; height: 200px;
background-position: relative;
background-size: 100%;
filter: drop-shadow(5px 0px 5px rgba(0, 0, 0, 0.4));
padding-top: 3.5%;
} }
#footer p.license { #footer p.license {
text-align: center; text-align: center;
font-weight: 400; font-weight: 400;
bottom: 0px;
} }
#footer p.organize { p.license-mobile {
text-align: center; display: none;
margin-top: 50px;
margin-left: 30px;
display: inline-block;
max-width: 350px;
} }
#footer img.logo-left {
padding: 50px 0px 0px 0px;
float: left;
}
#footer img.logo-right {
padding: 40px 0px 00px 10px;
float: right;
}
.foto_org { /**********************
width: 250px; * Zmenšování displeje
text-align: center; ***********************/
}
#seznam_orgu h1 {
text-align: center;
}
@media (max-width: 991px) { /* stránka přes celý displej */
#header { @media (max-width: 970px) {
height: 196px;
background-size: 100% 100%; div.container {
} width: 100%;
#header img.logo {
top: 27px;
left: 35px;
height: 140px;
} }
div.menu li {
min-width: 120px; #title {
font-size: 130%; width: 100%;
text-align: center;
} }
#submenu ul {
font-size: 115%; #header {
background-size: 100%;
} }
#submenu li {
padding-top: 5px; #header img.logo {
width: 100%;
} }
#footer { #footer {
padding: 20px 40px 0px 40px; width: 100%;
min-height: 270px;
}
#footer-extra {
position: relative;
top: -10px;
height: 39px;
}
#footer p.organize {
margin-top: 50px;
margin-left: 0px;
max-width: 80%;
min-height: 70px;
}
#footer img.logo-left {
padding: 50px 20px 0px 13px;
float: left;
}
#footer img.logo-right {
padding: 20px 0px 20px 0px;
float: none;
} }
div.novinky{ div.novinky{
max-width: 100%; max-width: 100%;
margin-left: auto; margin-left: auto;
@ -330,116 +365,180 @@ div.zadani_azad_termin {
width: 70%; width: 70%;
} }
ul.menu {
font-size: 90%;
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 {
margin-top: 8px; /* mezera mezi hlavním menu a submenu */
}
}
/* stránka přes celý menší displej, větší mobil, tablet */
@media(max-width: 800px){
ul.menu {
font-size: 80%;
margin-top: -2px;
}
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 {
margin-top: 8px; /* mezera mezi hlavním menu a submenu */
}
} }
@media (max-width: 767px) { /* malý tablet, mobil */
@media (max-width: 650px) {
#title {
display: none;
}
#header { #header {
width: 100%; width: 100%;
height: 196px; top: 0px;
height: 0px; background-image: none;
background-size: 100%;
padding-bottom: 25%;
} }
#header.cojemam,
#header.soustredeni,
#header.zadani,
#header.clanky,
#header.archiv,
#header.NOC,
#header.NOCcojemam,
#header.NOCsoustredeni,
#header.NOCzaani,
#header.NOCclanky,
#header.NOCarchiv {
background-image: none;
}
#header img.logo { #header img.logo {
display: none;
}
#header img.logo-mobile {
display: block;
top: 0px; top: 0px;
left: 0px; left: 0px;
height: 100%; width: 100%;
filter: drop-shadow(0px 0px 5px rgba(0, 0, 0, 0.4));
margin-bottom: 3px;
} }
div.menu {
height: auto; /* mobilní menu */
ul.menu {
display: none;
} }
div.menu li {
ul.menu_mobile {
display: block; display: block;
width: 100%; z-index: 10;
height: 35px; position: sticky;
font-size: 130%; font-variant: small-caps;
font-size: 150%;
font-weight: bold;
list-style-type: none;
padding-top: 3px;
padding-bottom: 3px;
padding-left: 12px;
}
ul.menu_mobile a:active,
ul.menu_mobile a:hover,
ul.menu_mobile a:focus {
text-decoration: none;
color: black;
} }
#submenu {
background: none; ul.menu_mobile ul {
height: auto; list-style-type: none;
margin-left: 90px; font-size: 90%;
margin-top: 15px; color: black; /*černé šipky submenu*/
} }
#submenu ul {
font-size: 110%; ul.menu_mobile ul li>a {
color: black;
} }
#submenu li {
display: inline-block; ul.menu_mobile ul li::before {
margin: 5px 8px; content: ' \276D '; /*https://www.w3schools.com/cssref/css_entities.asp*/
border-radius: 30px;
background: #ffd546;
height: auto;
} }
#submenu li a:hover, #submenu li.selected {
background: #ffd546; ul.menu_mobile br {
display: none;
} }
div.menu.mobile {
nav.nav-button {
display: block; display: block;
position: absolute; position: sticky;
top: -1px; position: -webkit-sticky;
background: none; top: 0;
z-index: 10;
} }
div.menu.mobile > div.dropdown > button {
font-size: 20px; #navbar-content {
background-color: #e84e10;
} }
div.menu.mobile > div.dropdown > ul {
margin: 0px; button.navbar-button {
padding: 0px; color: #f9d59e;
background-color: #e84e10;
font-variant: small-caps;
font-size: 160%;
border-radius: 0px; border-radius: 0px;
border-width: 0px;
width: 100%;
text-align: right;
} }
div.menu.mobile > div.dropdown > ul > li {
margin: 0px; button.navbar-button span::after{
padding: 0px; content: ' \2261 ';
display: block; font-size: 120%;
font-size: 20px;
background: none;
font-variant: normal;
height: auto;
}
div.menu.mobile > div.dropdown > ul > li > a {
margin: 0px;
padding: 5px 30px;
height: auto;
}
div.menu.mobile > div.dropdown > ul > li > a:hover {
background: #ffa500;
} }
div.menu.desktop { li.dropdown div.submenu_mobile{
display: none; display: none;
} }
li.dropdown.open div.submenu_mobile{
display: block;
}
/*patička mobil*/
#footer { #footer {
padding: 20px 40px 0px 40px; display: none;
min-height: 270px;
} }
#footer-extra {
p.license-mobile {
position: relative; position: relative;
top: -10px; display: block;
height: 39px;
}
#footer p.license {
font-size: 80%;
}
#footer p.organize {
margin: 30px 0px 0px 0px;
min-height: 80px;
width: 300px;
font-size: 90%; font-size: 90%;
background-color: #e84e10;
padding: 5%;
text-align: justify;
} }
#footer img.logo-left { div.novinky {
padding: 30px 20px 0px 18px;
float: left;
}
#footer img.logo-right {
padding: 30px 0px 20px 0px;
float: none;
}
div.novinky{
max-width: 100%; max-width: 100%;
float: none; float: none;
} }
@ -449,10 +548,100 @@ div.zadani_azad_termin {
width: 70%; width: 70%;
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
} }
} }
/*stránka organizátorů*/
div.seznam_orgu {
text-align: center;
}
div.org_pole {
display: inline-block;
width: 30%;
min-width: 300px;
text-align: center;
}
div.seznam_orgu h3 {
text-align: center;
margin-top: 10px;
margin-bottom: 0px;
}
div.org_email {
margin-bottom: 10px;
font-weight: bold;
}
/*otáčecí karty organizátorů*/
.flip-card {
width: 200px;
height: 250px;
perspective: 1000px; /* Remove this if you don't want the 3D effect */
margin-left: auto;
margin-right: auto;
}
/* This container is needed to position the front and back side */
.flip-card-inner {
position: relative;
width: 100%;
height: 100%;
transition: transform 0.8s;
transform-style: preserve-3d;
}
/* Do an horizontal flip when you move the mouse over the flip box container */
.flip-card:hover .flip-card-inner {
transform: rotateY(180deg);
}
/* Position the front and back side */
.flip-card-front, .flip-card-back {
position: absolute;
width: 100%;
height: 100%;
-webkit-backface-visibility: hidden; /* Safari */
backface-visibility: hidden;
}
/* Style the front side (fallback if image is missing) */
.flip-card-front {
background-color: #bbb;
}
div.foto_org img {
width: 100%;
height: 100%;
}
/* Style the back side */
.flip-card-back {
/*background-color: #e84e10;
color: #fffbf6;
background-color: #fdedd5;*/
background-color: #f9d59e;
color: black;/**/
transform: rotateY(180deg);
padding: 10px;
padding-top: 20px;
}
/* graf na úvodní stránce */
a span.popup {
position: absolute;
visibility: hidden;
}
a span.popup:hover {
visibility:visible;
top:37px; left:37px;
}
/* galerie */ /* galerie */
@ -628,8 +817,8 @@ div.zadani_azad_termin {
/* plus a minus tlacitka */ /* plus a minus tlacitka */
.mam-org-only-galerie { .mam-org-only-galerie {
background: #fff0d7; background: #fff0d7;
padding: 10px; padding: 10px;
margin: 10px 10px 10px -20px; margin: 10px 10px 10px -20px;
border: orange 2px dashed; border: orange 2px dashed;
float: left; float: left;
} }
@ -699,21 +888,21 @@ div.nahledy_cisel div, div.nahledy_cisel img {
position: absolute; position: absolute;
} }
ul.form { ul.form {
list-style-type: none; list-style-type: none;
padding-left: 0px; padding-left: 0px;
} }
label.field-label { label.field-label {
font-weight: normal; font-weight: normal;
} }
label.field-required { label.field-required {
font-weight: bold; font-weight: bold;
} }
.field-error { .field-error {
font-size: 14px; font-size: 14px;
color: red; color: red;
} }
ul.form li{ ul.form li{
margin-bottom: 3px; margin-bottom: 3px;
} }
p.gdpr { p.gdpr {
font-size: 6pt; font-size: 6pt;

BIN
mamweb/static/favicon.ico

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 B

201
mamweb/static/fonts/OpenSans/Apache License.txt

@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

BIN
mamweb/static/fonts/OpenSans/OpenSans-Bold.ttf

Binary file not shown.

BIN
mamweb/static/fonts/OpenSans/OpenSans-BoldItalic.ttf

Binary file not shown.

BIN
mamweb/static/fonts/OpenSans/OpenSans-ExtraBold.ttf

Binary file not shown.

BIN
mamweb/static/fonts/OpenSans/OpenSans-ExtraBoldItalic.ttf

Binary file not shown.

BIN
mamweb/static/fonts/OpenSans/OpenSans-Italic.ttf

Binary file not shown.

BIN
mamweb/static/fonts/OpenSans/OpenSans-Light.ttf

Binary file not shown.

BIN
mamweb/static/fonts/OpenSans/OpenSans-LightItalic.ttf

Binary file not shown.

BIN
mamweb/static/fonts/OpenSans/OpenSans-Regular.ttf

Binary file not shown.

BIN
mamweb/static/fonts/OpenSans/OpenSans-Semibold.ttf

Binary file not shown.

BIN
mamweb/static/fonts/OpenSans/OpenSans-SemiboldItalic.ttf

Binary file not shown.

120
mamweb/static/images/MATFYZ_MM_barevne.svg

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="svg2"
xml:space="preserve"
width="873.38959"
height="697.76959"
viewBox="0 0 873.38957 697.7696"
sodipodi:docname="MATFYZ_MM_barevne.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)"><metadata
id="metadata8"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs6" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1853"
inkscape:window-height="1025"
id="namedview4"
showgrid="false"
inkscape:zoom="0.29733907"
inkscape:cx="436.69495"
inkscape:cy="348.92161"
inkscape:window-x="67"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="g10" /><g
id="g10"
inkscape:groupmode="layer"
inkscape:label="ink_ext_XXXXXX"
transform="matrix(1.3333333,0,0,-1.3333333,-124.56506,745.70131)"><g
id="g12"
transform="scale(0.1)"><path
d="M 7483.93,3086.74 6136.77,1739.57 h -1324.9 l 1347.41,1347.17 h 1324.65"
style="fill:#e94e0f;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path14"
inkscape:connector-curvature="0" /><path
d="m 7210.43,1001.61 v -88.579 h -308.59 v 91.489 l 179.35,190.24 H 6909.1 v 88.58 h 294.07 v -91.49 l -179.35,-190.24 h 186.61"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path16"
inkscape:connector-curvature="0" /><path
d="M 6847.38,1283.34 6704.34,793.219 h -100.93 l 34.85,119.812 H 6578 l -108.19,370.309 h 114.72 l 73.34,-298.43 74.06,298.43 h 115.45"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path18"
inkscape:connector-curvature="0" /><path
d="m 6437.13,1415.49 -5.08,-72.61 c -21.06,2.18 -37.76,2.9 -50.1,2.9 -52.28,0 -60.99,-6.53 -62.45,-63.17 h 94.4 v -87.85 h -94.4 V 913.031 h -108.91 v 387.009 c 0,96.57 32.67,128.52 129.24,128.52 36.31,0 74.07,-5.81 97.3,-13.07"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path20"
inkscape:connector-curvature="0" /><path
d="M 6151.29,3087.46 C 5702.07,2638.25 5252.62,2188.79 4803.4,1739.57 h -3.15 l -0.72,0.73 1347.4,1347.16 h 4.36"
style="fill:#e94e0f;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path22"
inkscape:connector-curvature="0" /><path
d="m 6116.92,998.711 5.81,-78.422 c -24.69,-7.988 -67.53,-14.519 -99.48,-14.519 -80.59,0 -119.8,25.41 -119.8,124.16 v 321.66 l 108.91,30.5 v -98.75 h 87.13 v -88.58 h -87.13 V 1056.8 c 0,-54.46 6.54,-62.448 48.65,-62.448 15.98,0 37.76,1.449 55.91,4.359"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path24"
inkscape:connector-curvature="0" /><path
d="m 5685.62,1068.41 c -26.14,1.45 -52.28,2.91 -68.26,2.91 -38.48,-0.73 -53,-15.98 -53,-44.3 0,-26.86 18.87,-44.29 56.63,-44.29 24.69,0 46.47,8.719 64.63,21.06 z m 0,67.53 v 3.63 c 0,55.91 -17.43,65.35 -74.07,65.35 -38.48,0 -80.59,-2.9 -122.71,-6.53 l -5.08,77.69 c 43.56,7.99 104.56,14.52 147.4,14.52 124.16,0 163.37,-31.95 163.37,-148.13 V 913.031 h -72.61 l -22.51,37.75 c -31.22,-27.59 -69.7,-45.011 -116.9,-45.011 -79.15,0 -124.16,47.921 -124.16,119.8 0,84.96 47.92,113.28 153.2,113.28 23.24,0.72 49.38,-0.73 74.07,-2.91"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path26"
inkscape:connector-curvature="0" /><path
d="m 5424.22,522.629 -17.19,-154.66 h -50.58 l 31.71,231.859 h 50.1 l 51.31,-134.078 50.58,134.078 h 51.56 l 30.49,-231.859 h -50.82 l -16.7,156.351 -45.27,-119.082 h -41.62 l -43.57,117.391"
style="fill:#e94e0f;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path28"
inkscape:connector-curvature="0" /><path
d="m 5204.69,402.09 c 9.93,0 18.64,2.91 26.87,8.23 l -54.7,56.399 c -8.47,-7.02 -12.83,-16.457 -12.83,-28.559 0,-21.789 17.43,-36.07 40.66,-36.07 z m -88.58,30.98 c 0,25.168 13.31,48.172 35.58,61.239 -13.07,16.461 -19.61,31.953 -19.61,47.203 0,19.84 6.78,35.57 20.33,47.918 13.8,12.582 31.71,18.879 53.98,18.879 52.04,0 77.93,-20.817 81.81,-65.11 h -53.74 c -1.45,16.942 -11.13,25.903 -28.07,25.903 -13.56,0 -23.96,-8.481 -23.96,-23.243 0,-11.859 4.6,-19.847 20.09,-35.82 l 56.39,-58.09 c 3.87,13.563 5.81,27.84 5.81,43.813 h 50.83 c 0,-28.563 -7.51,-54.942 -22.76,-79.153 l 47.2,-48.64 h -67.04 l -13.07,13.07 c -17.19,-12.109 -36.07,-18.16 -57.36,-18.16 -24.21,0 -45.02,6.051 -61.72,18.402 -16.7,12.578 -24.69,29.77 -24.69,51.789"
style="fill:#e94e0f;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path30"
inkscape:connector-curvature="0" /><path
d="m 5130.87,1248.49 c 39.94,25.41 89.31,42.11 127.8,42.11 72.61,0 109.64,-39.94 109.64,-121.98 V 913.031 h -108.92 v 212.019 c 0,67.53 -7.26,76.97 -53,76.97 -17.43,0 -38.49,-2.18 -58.09,-6.54 0.73,-8.71 1.45,-17.43 1.45,-26.86 V 913.031 h -108.91 v 212.019 c 0,67.53 -7.26,76.97 -53.01,76.97 -17.43,0 -38.48,-2.18 -58.09,-6.54 V 913.031 h -108.91 v 370.309 h 72.61 l 19.6,-34.13 c 39.21,24.69 88.59,41.39 127.07,41.39 42.84,0 73.34,-13.79 90.76,-42.11"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path32"
inkscape:connector-curvature="0" /><path
d="m 5019.05,524.32 -45.26,-119.082 h -41.63 l -43.56,117.391 -17.43,-154.66 h -50.34 l 31.7,231.859 h 50.1 l 51.07,-134.078 50.83,134.078 h 51.55 l 30.5,-231.859 h -50.83 l -16.7,156.351"
style="fill:#e94e0f;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path34"
inkscape:connector-curvature="0" /><path
d="M 6159.28,3086.74 4811.87,1739.57 h -8.47 c 449.22,449.22 898.67,898.68 1347.89,1347.89 h 1333.37 l -0.73,-0.72 H 6159.28"
style="fill:#e94e0f;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path36"
inkscape:connector-curvature="0" /><path
d="m 4800.25,1739.57 h -1.45 l 0.73,0.73 z"
style="fill:#e94e0f;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path38"
inkscape:connector-curvature="0" /><path
d="m 4782.34,1740.3 -0.24,-0.24 H 2883.34 v 1899 l 1899,-1898.76"
style="fill:#e94e0f;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path40"
inkscape:connector-curvature="0" /><path
d="M 4481.01,1707.38 V 359.488 H 3133.12 V 1707.38 h 1347.89"
style="fill:#e94e0f;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path42"
inkscape:connector-curvature="0" /><path
d="M 2850.67,5592.76 V 3710.7 l -941.27,941.03 z"
style="fill:#e94e0f;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path44"
inkscape:connector-curvature="0" /><path
d="m 2845.59,3672.94 -953.14,-953.13 -953.126,953.13 953.126,953.14 953.14,-953.14"
style="fill:#e94e0f;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path46"
inkscape:connector-curvature="0" /><path
d="M 1875.27,4651.73 934.238,3710.7 v 1882.06 z"
style="fill:#e94e0f;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path48"
inkscape:connector-curvature="0" /></g></g></svg>

After

Width:  |  Height:  |  Size: 7.9 KiB

BIN
mamweb/static/images/footer-bg-bottom.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

BIN
mamweb/static/images/footer-bg-top.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

BIN
mamweb/static/images/graf/adrenalinove.jpeg

Binary file not shown.

After

Width:  |  Height:  |  Size: 568 KiB

BIN
mamweb/static/images/graf/behaci.jpeg

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 KiB

BIN
mamweb/static/images/graf/ceny.jpeg

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

BIN
mamweb/static/images/graf/deskovky.jpeg

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
mamweb/static/images/graf/dort.jpeg

Binary file not shown.

After

Width:  |  Height:  |  Size: 323 KiB

BIN
mamweb/static/images/graf/hry.jpeg

Binary file not shown.

After

Width:  |  Height:  |  Size: 394 KiB

BIN
mamweb/static/images/graf/jidlo.jpeg

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 KiB

BIN
mamweb/static/images/graf/konfery.jpeg

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

BIN
mamweb/static/images/graf/legenda.jpeg

Binary file not shown.

After

Width:  |  Height:  |  Size: 250 KiB

BIN
mamweb/static/images/graf/prednasky.jpeg

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

BIN
mamweb/static/images/graf/strategicke.jpeg

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

BIN
mamweb/static/images/graf/vylet.jpeg

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

BIN
mamweb/static/images/graph.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

BIN
mamweb/static/images/header-bg-archiv-NOC.jpg

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

BIN
mamweb/static/images/header-bg-archiv.jpg

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

BIN
mamweb/static/images/header-bg-clanek-NOC.jpg

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

BIN
mamweb/static/images/header-bg-clanek.jpg

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

BIN
mamweb/static/images/header-bg-odevzdat-NOC.jpg

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

BIN
mamweb/static/images/header-bg-soustredeni-NOC.jpg

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

BIN
mamweb/static/images/header-bg-soustredeni.jpg

Binary file not shown.

Before

Width:  |  Height:  |  Size: 105 KiB

BIN
mamweb/static/images/header-bg-uvod-NOC.jpg

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

BIN
mamweb/static/images/header-bg-uvod.jpg

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

BIN
mamweb/static/images/header-bg-zadani-NOC.jpg

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

BIN
mamweb/static/images/header-bg-zadani.jpg

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

BIN
mamweb/static/images/header-bg.jpg

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

BIN
mamweb/static/images/header/baliky.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 351 KiB

BIN
mamweb/static/images/header/beh.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 MiB

BIN
mamweb/static/images/header/kryptografie.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 KiB

BIN
mamweb/static/images/header/mam_cernobile.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

BIN
mamweb/static/images/header/noc.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 KiB

BIN
mamweb/static/images/header/ohen.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 363 KiB

BIN
mamweb/static/images/header/snih.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 235 KiB

BIN
mamweb/static/images/header/spolecna.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 338 KiB

BIN
mamweb/static/images/header/stiny.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 443 KiB

BIN
mamweb/static/images/header/vikendovka.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 KiB

BIN
mamweb/static/images/header/vylet.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 426 KiB

BIN
mamweb/static/images/logo-jcmf.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

BIN
mamweb/static/images/logo-mff.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

240
mamweb/static/images/logo-mobile.svg

@ -0,0 +1,240 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="svg2"
xml:space="preserve"
width="1116.5013"
height="404.98737"
viewBox="0 0 1116.5013 404.98736"
sodipodi:docname="logo-mobile.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)"><metadata
id="metadata8"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
id="defs6" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1853"
inkscape:window-height="1145"
id="namedview4"
showgrid="true"
inkscape:zoom="0.84100187"
inkscape:cx="330.58146"
inkscape:cy="30.848545"
inkscape:window-x="67"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="g12"
inkscape:snap-page="true"><inkscape:grid
type="xygrid"
id="grid903"
originx="-3.4986323"
originy="-416.4963" /></sodipodi:namedview><g
id="g10"
inkscape:groupmode="layer"
inkscape:label="ink_ext_XXXXXX"
transform="matrix(1.3333333,0,0,-1.3333333,-3.4986322,821.48366)"><g
id="g12"
transform="scale(0.1)"><path
d="m 8335.3454,4798.1624 -595.1505,-620.7555 h -585.3165 l 595.2607,620.7555 h 585.2063"
style="fill:#e84e10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.18195856"
id="path14"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="m 7078.5791,4120.5393 h -0.5073 l 0.2556,0.2663 z"
style="fill:#e84e10;fill-opacity:0.94117647;fill-rule:nonzero;stroke:none;stroke-width:0.93578213"
id="path38"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" /><path
d="m 7102.4996,4177.5001 -0.089,-0.093 h -708.1905 v 738.7467 l 708.2801,-738.6537"
style="fill:#e84e10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99787205"
id="path40"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="m 6937.5002,4101.5435 v -464.0434 h -444.9049 v 464.0434 h 444.9049"
style="fill:#e84e10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88309515"
id="path42"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="M 6337.5002,5718.9966 V 5062.5001 L 6022.709,5390.7482 Z"
style="fill:#e84e10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89475256"
id="path44"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" /><path
d="m 5962.5001,4650.0001 -337.5,337.5 337.5,337.5 337.5001,-337.5 z"
style="fill:#e84e10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.95725137"
id="path46"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="m 6420.0002,3637.5001 v 465 l -457.5001,1.0607 -330,-466.0607 c 166.1399,-0.083 621.3604,0 787.5001,0 z"
style="fill:#fbe1b8;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.6284067"
id="path40-9"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="m 5587.5001,5719.164 v -656.6639 l 314.8715,328.332 z"
style="fill:#e84e10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89498103"
id="path44-3"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" /><path
d="m 6000.0001,4575.0001 v -394.33 l 314.7902,-1.1147 c -6.0705,262.4914 -52.96,471.0265 -314.7902,395.4447 z"
style="fill:#fdedd5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89475173"
id="path44-3-2"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" /><path
d="m 6320.8633,4912.5001 -6.073,-732.9447 -314.7902,395.4447 z"
style="fill:#fdedd5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89933741"
id="path44-6"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" /><path
d="M 1387.5,3106.9263 26.145617,3112.5 26.239743,3429.3745 1387.5,3732.5654 Z"
style="fill:#f7cb87;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.53136837"
id="path42-2"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="M 2775.0001,3109.1558 H 1462.5 v 640.8443 l 525,-112.5001 787.5001,206.4179 z"
style="fill:#f7cb87;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.53136837"
id="path42-2-8"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccc" /><path
d="m 4237.5001,3110.2705 h -1387.5 l 0,752.2296 675,150 712.5,-246.8936 z"
style="fill:#f7cb87;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.53136837"
id="path42-2-7"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccc" /><path
d="m 5550.0001,3112.5 h -1237.5 l 0,626.1475 618.75,-176.1474 h 618.75 z"
style="fill:#f9d59e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.53136837"
id="path42-2-9"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccc" /><path
d="m 6937.5002,3105.8115 -1312.5001,-1.1287 0,457.8173 h 1312.5001 z"
style="fill:#f9d59e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.53136837"
id="path42-2-6"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="m 8417.4395,3112.5 -1404.9393,-3.3582 v 453.3585 l 1405.2097,262.4998 z"
style="fill:#f9d59e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5496583"
id="path42-2-0"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="m 8328.8772,3870.0686 -1316.377,-232.5685 v 465 z"
style="fill:#fbe1b8;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.53136837"
id="path42-2-0-4"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" /><path
d="m 7290.0002,4106.2559 1127.4393,-188.0235 1.5764,187.55 z"
style="fill:#fce7c6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.49430776"
id="path42-2-0-4-1"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" /><path
d="m 7928.737,4175.1068 0.056,-0.059 490.363,0.083 -1.6663,624.8689 -595.4746,-624.9521"
style="fill:#fce7c6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.61935329"
id="path40-8"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="m 7447.5002,4575.0001 -322.5,-337.5 -300,337.5 h 622.5"
style="fill:#fdedd5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.95725137"
id="path46-6"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" /><path
d="m 5925.0001,4575.0001 0,-392.8359 -337.5,280.3359 0,450 z"
style="fill:#fdedd5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.64549828"
id="path14-7"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="m 5887.5001,4125.0001 -337.5,-487.5 h -600 l 600,766.3199 z"
style="fill:#fbe1b8;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5409205"
id="path42-2-6-9"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
style="opacity:1;fill:#fef6eb;fill-opacity:1;fill-rule:evenodd;stroke:#cc2200;stroke-width:22.25494003;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
d="m 5234.2851,6184.7748 1476.9917,14.5116 -447.5529,-438.1391 c -176.9133,-173.1921 -301.1716,-305.5968 -301.2238,-305.5968 -242.6593,249.8656 -457.1495,460.2945 -728.215,729.2243 z"
id="path1203"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccscc" /><path
style="opacity:1;fill:#fdedd5;fill-opacity:1;fill-rule:evenodd;stroke:#cc2200;stroke-width:22.84425163;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
d="m 6396.6887,5762.3467 353.3115,363.8943 V 4650.0001 l -351.0821,375 z"
id="path1201-3"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
style="opacity:1;fill:#fdedd5;fill-opacity:1;fill-rule:evenodd;stroke:#cc2200;stroke-width:17.39934158;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
d="m 6825.0002,5400.0001 c 0,0 591.4391,-696.4314 637.5,-750 l -320.7729,0 h -316.7271 z"
id="path1199-9"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="m 7462.5002,5400.0001 0,-637.5 -637.5,750 0,600 z"
style="fill:#fdedd5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.16200352"
id="path14-8"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="m 7800.0002,4875.0001 0,1295.0654 600,3.3442 0,-1298.4097 z"
style="fill:#fef6eb;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.52054787"
id="path42-2-6-3"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="m 6839.0906,6172.2949 v 0 l 885.9096,-2.2294 0,-920.0654 -885.9096,922.2948"
style="fill:#fef6eb;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.21138752"
id="path40-0"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
style="opacity:1;fill:#fdedd5;fill-opacity:1;fill-rule:evenodd;stroke:#cc2200;stroke-width:9.21227551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
d="m 7725.0002,5137.5001 -187.5,199.7622 v -649.7622 l 187.5,206.4178 z"
id="path1201-3-1"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="M 1387.5,3787.5001 562.50001,3617.6989 v 448.4953 z"
style="fill:#f9d59e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.09587288"
id="path42-2-0-4-1-7"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" /><path
style="opacity:1;fill:#f9d59e;fill-opacity:1;fill-rule:evenodd;stroke:#cc2200;stroke-width:22.52051163;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
d="m 487.50001,4087.5001 -465.000009,165 V 3480 l 465.000009,120.0001 z"
id="path1201-3-8"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="m 5137.5001,4012.5001 -262.5,-337.5001 -1350,412.5001 L 1987.5,3712.5 -7.4999957e-7,4312.5001 l -8.5e-13,1875 4650.00010075000045,0 487.5,-525"
style="fill:#e84e10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99139333"
id="path40-5"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccc" /><path
d="m 5512.5001,5775.0001 v -1312.5 l -300,-375 0,1612.5 -450,487.5 354.5057,0 z"
style="fill:#fdedd5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.64549828"
id="path14-7-9"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccc" /><path
d="m 3713.6828,5316.7522 -83.8442,-754.3526 h -246.7035 l 154.6653,1130.8901 h 244.3623 l 250.2641,-653.9642 246.7034,653.9642 h 251.4839 l 148.7142,-1130.8901 h -247.874 l -81.4542,762.6005 -220.804,-580.8213 H 3926.195 l -212.5122,572.5734"
style="fill:#fdedd5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.87749052"
id="path28"
inkscape:connector-curvature="0" /><path
d="m 2642.9272,4728.8244 c 48.4335,0 90.9163,14.1934 131.0581,40.1417 l -266.7988,275.0857 c -41.3123,-34.24 -62.5782,-80.2689 -62.5782,-139.2963 0,-106.2757 85.0147,-175.9311 198.3189,-175.9311 z m -432.0483,151.1047 c 0,122.7567 64.9195,234.9585 173.5417,298.6927 -63.7494,80.2883 -95.6482,155.8504 -95.6482,230.2322 0,96.7694 33.0694,173.4923 99.16,233.7197 67.3094,61.3685 154.6647,92.082 263.2865,92.082 253.8246,0 380.1028,-101.5346 399.0275,-317.5734 H 2788.13 c -7.0724,82.6344 -54.2865,126.3416 -136.9111,126.3416 -66.1388,0 -116.8648,-41.366 -116.8648,-113.3675 0,-57.8422 22.4366,-96.8036 97.9889,-174.7117 l 275.0416,-283.3335 c 18.876,66.1533 28.3383,135.7894 28.3383,213.6975 h 247.9229 c 0,-139.3157 -36.63,-267.9791 -111.0117,-386.068 l 230.2181,-237.2411 h -326.9876 l -63.7483,63.7488 c -83.844,-59.0616 -175.9316,-88.5753 -279.7733,-88.5753 -118.0841,0 -219.5847,29.5137 -301.0383,89.7556 -81.4546,61.3491 -120.4258,145.2029 -120.4258,252.6004"
style="fill:#fdedd5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.87749052"
id="path30"
inkscape:connector-curvature="0" /><path
d="m 1737.4696,5325.0001 -220.7552,-580.8213 h -203.05 l -212.4634,572.5734 -85.0147,-754.3526 H 770.6534 l 154.61644,1130.8901 h 244.36236 l 249.0939,-653.9642 247.9224,653.9642 h 251.4347 l 148.7634,-1130.8901 h -247.9228 l -81.4542,762.6005"
style="fill:#fdedd5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.87749052"
id="path34"
inkscape:connector-curvature="0" /><flowRoot
xml:space="preserve"
id="flowRoot1023"
style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:sans-serif;font-style:normal;font-weight:normal;font-size:29.33333333px;line-height:40.99999964%;letter-spacing:0px;word-spacing:0px;-inkscape-font-specification:'sans-serif, Normal';font-stretch:normal;font-variant:normal;text-anchor:start;text-align:start;writing-mode:lr;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal"><flowRegion
id="flowRegion1025"><rect
id="rect1027"
width="210"
height="140"
x="246.50137"
y="481.48367" /></flowRegion><flowPara
id="flowPara1029" /></flowRoot></g></g></svg>

After

Width:  |  Height:  |  Size: 14 KiB

BIN
mamweb/static/images/logo.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

208
mamweb/static/images/logo.svg

@ -0,0 +1,208 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="svg2"
xml:space="preserve"
width="1116.5013"
height="404.98737"
viewBox="0 0 1116.5013 404.98736"
sodipodi:docname="logo.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)"><metadata
id="metadata8"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs6" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1853"
inkscape:window-height="1025"
id="namedview4"
showgrid="true"
inkscape:zoom="4.757425"
inkscape:cx="351.39177"
inkscape:cy="107.16285"
inkscape:window-x="67"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="g12"
inkscape:snap-page="true"><inkscape:grid
type="xygrid"
id="grid903"
originx="-3.4986323"
originy="-416.4963" /></sodipodi:namedview><g
id="g10"
inkscape:groupmode="layer"
inkscape:label="ink_ext_XXXXXX"
transform="matrix(1.3333333,0,0,-1.3333333,-3.4986322,821.48366)"><g
id="g12"
transform="scale(0.1)"><path
d="m 8335.3454,4798.1624 -595.1505,-620.7555 h -585.3165 l 595.2607,620.7555 h 585.2063"
style="fill:#e84e10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.18195856"
id="path14"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="m 7078.5791,4120.5393 h -0.5073 l 0.2556,0.2663 z"
style="fill:#e84e10;fill-opacity:0.94117647;fill-rule:nonzero;stroke:none;stroke-width:0.93578213"
id="path38"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" /><path
d="m 7102.4996,4177.5001 -0.089,-0.093 h -708.1905 v 738.7467 l 708.2801,-738.6537"
style="fill:#e84e10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99787205"
id="path40"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="m 6937.5002,4101.5435 v -464.0434 h -444.9049 v 464.0434 h 444.9049"
style="fill:#e84e10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88309515"
id="path42"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="M 6337.5002,5718.9966 V 5062.5001 L 6022.709,5390.7482 Z"
style="fill:#e84e10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89475256"
id="path44"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" /><path
d="m 5962.5001,4650.0001 -337.5,337.5 337.5,337.5 337.5001,-337.5 z"
style="fill:#e84e10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.95725137"
id="path46"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="m 6420.0002,3637.5001 v 465 l -457.5001,1.0607 -330,-466.0607 c 166.1399,-0.083 621.3604,0 787.5001,0 z"
style="fill:#fbe1b8;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.6284067"
id="path40-9"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="m 5587.5001,5719.164 v -656.6639 l 314.8715,328.332 z"
style="fill:#e84e10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89498103"
id="path44-3"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" /><path
d="m 6000.0001,4575.0001 v -394.33 l 314.7902,-1.1147 c -6.0705,262.4914 -52.96,471.0265 -314.7902,395.4447 z"
style="fill:#fdedd5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89475173"
id="path44-3-2"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" /><path
d="m 6320.8633,4912.5001 -6.073,-732.9447 -314.7902,395.4447 z"
style="fill:#fdedd5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89933741"
id="path44-6"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" /><path
d="M 1387.5,3106.9263 26.145617,3112.5 26.239743,3429.3745 1387.5,3732.5654 Z"
style="fill:#f7cb87;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.53136837"
id="path42-2"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="M 2775.0001,3109.1558 H 1462.5 v 640.8443 l 525,-112.5001 787.5001,206.4179 z"
style="fill:#f7cb87;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.53136837"
id="path42-2-8"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccc" /><path
d="m 4237.5001,3110.2705 h -1387.5 l 0,752.2296 675,150 712.5,-246.8936 z"
style="fill:#f7cb87;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.53136837"
id="path42-2-7"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccc" /><path
d="m 5550.0001,3112.5 h -1237.5 l 0,626.1475 618.75,-176.1474 h 618.75 z"
style="fill:#f9d59e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.53136837"
id="path42-2-9"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccc" /><path
d="m 6937.5002,3105.8115 -1312.5001,-1.1287 0,457.8173 h 1312.5001 z"
style="fill:#f9d59e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.53136837"
id="path42-2-6"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="m 8417.4395,3112.5 -1404.9393,-3.3582 v 453.3585 l 1405.2097,262.4998 z"
style="fill:#f9d59e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5496583"
id="path42-2-0"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="m 8328.8772,3870.0686 -1316.377,-232.5685 v 465 z"
style="fill:#fbe1b8;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.53136837"
id="path42-2-0-4"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" /><path
d="m 7290.0002,4106.2559 1127.4393,-188.0235 1.5764,187.55 z"
style="fill:#fce7c6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.49430776"
id="path42-2-0-4-1"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" /><path
d="m 7928.737,4175.1068 0.056,-0.059 490.363,0.083 -1.6663,624.8689 -595.4746,-624.9521"
style="fill:#fce7c6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.61935329"
id="path40-8"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="m 7447.5002,4575.0001 -322.5,-337.5 -300,337.5 h 622.5"
style="fill:#fdedd5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.95725137"
id="path46-6"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" /><path
d="m 5925.0001,4575.0001 0,-392.8359 -337.5,280.3359 0,450 z"
style="fill:#fdedd5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.64549828"
id="path14-7"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="m 5887.5001,4125.0001 -337.5,-487.5 h -600 l 600,766.3199 z"
style="fill:#fbe1b8;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5409205"
id="path42-2-6-9"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
style="opacity:1;fill:#fef6eb;fill-opacity:1;fill-rule:evenodd;stroke:#cc2200;stroke-width:22.25494003;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
d="m 5234.2851,6184.7748 1476.9917,14.5116 -447.5529,-438.1391 c -176.9133,-173.1921 -301.1716,-305.5968 -301.2238,-305.5968 -242.6593,249.8656 -457.1495,460.2945 -728.215,729.2243 z"
id="path1203"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccscc" /><path
style="opacity:1;fill:#fdedd5;fill-opacity:1;fill-rule:evenodd;stroke:#cc2200;stroke-width:22.84425163;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
d="m 6396.6887,5762.3467 353.3115,363.8943 V 4650.0001 l -351.0821,375 z"
id="path1201-3"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
style="opacity:1;fill:#fdedd5;fill-opacity:1;fill-rule:evenodd;stroke:#cc2200;stroke-width:17.39934158;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
d="m 6825.0002,5400.0001 c 0,0 591.4391,-696.4314 637.5,-750 l -320.7729,0 h -316.7271 z"
id="path1199-9"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="m 7462.5002,5400.0001 0,-637.5 -637.5,750 0,600 z"
style="fill:#fdedd5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.16200352"
id="path14-8"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="m 7800.0002,4875.0001 0,1295.0654 600,3.3442 0,-1298.4097 z"
style="fill:#fef6eb;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.52054787"
id="path42-2-6-3"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="m 6839.0906,6172.2949 v 0 l 885.9096,-2.2294 0,-920.0654 -885.9096,922.2948"
style="fill:#fef6eb;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.21138752"
id="path40-0"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
style="opacity:1;fill:#fdedd5;fill-opacity:1;fill-rule:evenodd;stroke:#cc2200;stroke-width:9.21227551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
d="m 7725.0002,5137.5001 -187.5,199.7622 v -649.7622 l 187.5,206.4178 z"
id="path1201-3-1"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><path
d="M 1387.5,3787.5001 562.50001,3617.6989 v 448.4953 z"
style="fill:#f9d59e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.09587288"
id="path42-2-0-4-1-7"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" /><path
style="opacity:1;fill:#f9d59e;fill-opacity:1;fill-rule:evenodd;stroke:#cc2200;stroke-width:22.52051163;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
d="m 487.50001,4087.5001 -465.000009,165 V 3480 l 465.000009,120.0001 z"
id="path1201-3-8"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /></g></g></svg>

After

Width:  |  Height:  |  Size: 11 KiB

BIN
mamweb/static/images/logojcmf.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

BIN
mamweb/static/images/matfyz-logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

BIN
mamweb/static/images/menu-bg-selected.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

BIN
mamweb/static/images/menu-bg.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

660
mamweb/static/images/mozaika-footer.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 128 KiB

BIN
mamweb/static/images/submenu-bg-selected.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

BIN
mamweb/static/images/submenu-bg.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

10598
mamweb/static/js/jquery-3.4.1.js

File diff suppressed because it is too large

111
mamweb/templates/base.html

@ -5,13 +5,14 @@
<head> <head>
<title>{% block title %}{% block nadpis1a %}{% endblock %} – Korespondenční seminář M&amp;M{% endblock title %}</title> <title>{% block title %}{% block nadpis1a %}{% endblock %} – Korespondenční seminář M&amp;M{% endblock title %}</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="{% static 'favicon.ico' %}" type="image/x-icon"> <link rel="shortcut icon" href="{% static 'images/MATFYZ_MM_barevne.svg' %}" type="image/x-icon">
{% render_block "css" %} {% render_block "css" %}
<link href="{% static 'css/bootstrap-theme.css' %}" rel="stylesheet"> <link href="{% static 'css/bootstrap-theme.css' %}" rel="stylesheet">
<link href="{% static 'css/bootstrap.css' %}" rel="stylesheet"> <link href="{% static 'css/bootstrap.css' %}" rel="stylesheet">
<link href="{% static 'css/mamweb.css' %}" rel="stylesheet"> <link href="{% static 'css/mamweb.css' %}" rel="stylesheet">
<link href="{% static 'css/prettyPhoto.css' %}" rel="stylesheet" type="text/css" media="screen" charset="utf-8" /> <link href="{% static 'css/prettyPhoto.css' %}" rel="stylesheet" type="text/css" media="screen" charset="utf-8" />
<script src="{% static 'js/jquery-1.11.1.js' %}"></script> <script src="{% static 'js/jquery-1.11.1.js' %}"></script>
<script src="{% static '/jquery-3.4.1.js' %}"></script>
<link rel="stylesheet" type="text/css" href="{% static 'fluent_comments/css/ajaxcomments.css' %}" /> <link rel="stylesheet" type="text/css" href="{% static 'fluent_comments/css/ajaxcomments.css' %}" />
<script type="text/javascript" src="{% static 'fluent_comments/js/ajaxcomments.js' %}"></script> <script type="text/javascript" src="{% static 'fluent_comments/js/ajaxcomments.js' %}"></script>
@ -34,8 +35,11 @@
</head> </head>
<body class='{% if user.is_staff %}org-logged-in{% endif %}'> <body class='{% if user.is_staff %}org-logged-in{% endif %}'>
<div class="container">
{% if user.is_staff %} {% if user.is_staff %}
<div class="login-bar" style='background: #F80;'> <div class="login-bar" >
{% if view.object %} {% if view.object %}
Objekt {{ view.object }}: {{ view.object }} Objekt {{ view.object }}: {{ view.object }}
{% if view.object.admin_url %}<a href='{{ view.object.admin_url }}'>[admin]</a>{% endif %} {% if view.object.admin_url %}<a href='{{ view.object.admin_url }}'>[admin]</a>{% endif %}
@ -47,92 +51,66 @@
</div> </div>
{% endif %} {% endif %}
<div class="container">
<div class='row'> <div class='row'>
<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="header" class="{% if noc %}NOC{% endif %}{% block header %}{% endblock %}"> <div id="header" class="{% if noc %}NOC{% endif %}{% block header %}{% endblock %}">
<img class="logo" src="{% static 'images/logo.png' %}" /> <img class="logo" src="{% static 'images/logo.svg' %}" />
<!--<h1>{% block nadpis1b %}Nadpis 1. úrovně{% endblock %}</h1>--> <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'>
{# ========= MOBILE MENU ========== #}
<div class="menu mobile">
<div class="dropdown">
<button class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown">Menu
<span class="glyphicon glyphicon-th-list"></span></button>
<ul class="dropdown-menu">
<li class=""><a href="/co-je-MaM/uvod/">Co je M&amp;M</a>
<li class=""><a href="/soustredeni/">Soustředění</a>
<li class=""><a href="/zadani/aktualni/">Zadání</a>
<li class=""><a href="/clanky/uvod/">Články</a>
<li class=""><a href="/archiv/cisla/">Archiv</a>
<li class=""><a href="/co-je-MaM/kontakt/">Kontakt</a>
</ul>
</div>
</div>
{# ============= MENU ============== #}
<div class="menu desktop">
<ul>
<li class="{% block menu_uvod %}{% endblock %}"><a href="/co-je-MaM/uvod/">Co je M&amp;M</a>
{# ukazka jak pouzit tag url <li class="{% block menu_soustredeni %}{% endblock %}"><a href="{% url 'seminar_seznam_soustredeni' %}">Soustředění</a> #}
<li class="{% block menu_soustredeni %}{% endblock %}"><a href="/soustredeni/">Soustředění</a>
<li class="{% block menu_zadani %}{% endblock %}"><a href="/zadani/aktualni/">Zadání</a>
<li class="{% block menu_clanky %}{% endblock %}"><a href="/clanky/uvod/">Články</a>
<li class="{% block menu_archiv %}{% endblock %}"><a href="/archiv/cisla/">Archiv</a>
<li class="{% block menu_odevzdat %}{% endblock %}"><a href="/co-je-MaM/kontakt/">Kontakt</a>
</ul>
</div>
{# ======== KONEC MENU =============#}
</div>
</div>
<div class='row'>
<div class='col-md-12'>
{% block submenu %}
{% endblock %}
</div>
</div>
<div class='row content'>
{% sitetree_menu from "main_menu" include "trunk" %}
{#
{% for item in menu_top %}
<li class="{% if item.selected %} active {% endif %}">
<a href="{{ item.url }}"> <i class="{{ item.icon_class }}"></i> {{ item.name }}</a>
</li>
{% if item.submenu %}
<ul>
{% for menu in item.submenu %}
<li class="{% if menu.selected %} active {% endif %}">
<a href="{{ menu.url }}">{{ menu.name }}</a>
</li>
{% endfor %}
</ul>
{% endif %}
{% endfor %}
#}
{# ========= MENU ========== #}
<div class='col-md-12'> {% sitetree_menu from "main_menu" include "trunk" template "menu.html" %}
{# ========= MENU MOBILE ========== #}
<!--Navbar-->
<nav class="nav-button">
<!-- Collapse button -->
<button class="navbar-button" type="button" data-toggle="collapse" data-target="#navbar-content"
aria-controls="navbar-content" aria-expanded="false"><span>Menu</span></button>
<!-- Collapsible content -->
<div class="collapse navbar-collapse" id="navbar-content">
<!-- Links -->
{% sitetree_menu from "main_menu" include "trunk" template "menu_mobile.html" %}
<!-- Links -->
</div>
<!-- Collapsible content -->
</nav>
<!--/.Navbar-->
{# ========= END MENU ========== #}
<div class='row content'>
<div class='col-md-12'>
{% block content %} {% block content %}
{% endblock content %} {% endblock content %}
</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">
<p class="license">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">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>
<a href="http://jcmf.cz/"><img class="logo-left" src="{% static 'images/logo-jcmf.png' %}" /></a> </div>
<p class="organize"><a href="/co-je-MaM/kontakt/">Korespondenční seminář M&amp;M</a> organizují převážně studenti MFF UK. Organizaci semináře a vydávání časopisu podporuje <a href="http://jcmf.cz">Jednota českých matematiků a fyziků</a>.</p> <p class="license-mobile">Korespondenční seminář M&M organizují převážně studenti <a herf="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>
<a href="http://mff.cuni.cz"><img class="logo-right" src="{% static 'images/logo-mff.png' %}" /></a>
</div><div id="footer-extra"></div>
</div> </div>
</div> </div>
</div> </div>
<script src="{% static 'js/bootstrap.js' %}"></script> <script src="{% static 'js/bootstrap.js' %}"></script>
<script src="{% static 'js/jquery.jcarousel-core.js' %}" type="text/javascript"></script> <script src="{% static 'js/jquery.jcarousel-core.js' %}" type="text/javascript"></script>
<script src="{% static 'js/jquery.prettyPhoto.js' %}" type="text/javascript" charset="utf-8"></script> <script src="{% static 'js/jquery.prettyPhoto.js' %}" type="text/javascript" charset="utf-8"></script>
@ -148,4 +126,3 @@
{% render_block "js" %} {% render_block "js" %}
</body> </body>
</html> </html>

733
mamweb/templates/graph.svg

@ -0,0 +1,733 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="svg2"
width="482.57019"
height="599.45636"
viewBox="0 0 482.57019 599.45636"
sodipodi:docname="graph.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
<metadata
id="metadata8">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs6" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1850"
inkscape:window-height="1016"
id="namedview4"
showgrid="false"
inkscape:snap-text-baseline="true"
inkscape:zoom="0.40901275"
inkscape:cx="112.62979"
inkscape:cy="398.31783"
inkscape:window-x="70"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<g
inkscape:groupmode="layer"
id="layer1"
inkscape:label="Layer 1"
transform="translate(690.4036,-12.546621)">
<a
href="/static/images/graf/strategicke.jpeg"
id="strategicke"
transform="matrix(0.70138313,0,0,0.7462289,-192.38886,20.298351)">
<g
id="g908">
<path
sodipodi:open="true"
d="m -123.87186,42.65255 a 88.169495,30.105928 0 0 1 -86.57546,30.101008 88.169495,30.105928 0 0 1 -89.70589,-29.012603 88.169495,30.105928 0 0 1 83.33184,-31.150058 88.169495,30.105928 0 0 1 92.71904,27.886265"
sodipodi:end="6.2108645"
sodipodi:start="0"
sodipodi:ry="30.105928"
sodipodi:rx="88.169495"
sodipodi:cy="42.65255"
sodipodi:cx="-212.04135"
sodipodi:type="arc"
id="path4527"
style="fill:#fbe1b8;fill-opacity:1;stroke-width:1.04325855" />
<text
id="text4577"
y="50.742676"
x="-287.2771"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
xml:space="preserve"><tspan
y="50.742676"
x="-287.2771"
id="tspan4575"
sodipodi:role="line">Strategické</tspan></text>
</g>
<!--<span class="popup"><img src="/static/images/graf/strategicke.jpeg"></span>-->
</a>
<a
href="/static/images/graf/behaci.jpeg"
id="behaci"
transform="matrix(0.70138313,0,0,0.7462289,-192.38886,20.298351)">
<g
id="g903">
<ellipse
cx="-371.12292"
cy="49.419495"
rx="58.810379"
ry="24.20339"
id="path4523"
style="fill:#fbe1b8;fill-opacity:1;stroke-width:1.02704167" />
<text
id="text4581"
y="58.077408"
x="-414.41251"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
xml:space="preserve"><tspan
y="58.077408"
x="-414.41251"
id="tspan4579"
sodipodi:role="line">Běhací</tspan></text>
</g>
</a>
<a
href="/static/images/graf/adrenalinove.jpeg"
id="adrenalinove"
transform="matrix(0.70138313,0,0,0.7462289,-192.38886,20.298351)">
<g
id="g898">
<ellipse
style="fill:#fbe1b8;fill-opacity:1;stroke-width:1.05774128"
id="path4521"
cx="-531.18652"
cy="67.855934"
rx="99.437492"
ry="31.402538" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
x="-617.34015"
y="76.414246"
id="text4585"><tspan
sodipodi:role="line"
id="tspan4583"
x="-617.34015"
y="76.414246">Adrenalinové</tspan></text>
</g>
</a>
<a
href="/static/images/graf/jidlo.jpeg"
id="jidlo"
transform="matrix(0.70138313,0,0,0.7462289,-192.38886,20.298351)">
<g
id="g924">
<path
style="fill:#f9d59e;fill-opacity:1"
id="path4533"
sodipodi:type="arc"
sodipodi:cx="-470.93118"
sodipodi:cy="174.75847"
sodipodi:rx="45.381355"
sodipodi:ry="25.067797"
sodipodi:start="0"
sodipodi:end="6.2108589"
sodipodi:open="true"
d="m -425.54983,174.75847 a 45.381355,25.067797 0 0 1 -44.56083,25.0637 45.381355,25.067797 0 0 1 -46.17221,-24.15737 45.381355,25.067797 0 0 1 42.89119,-25.93726 45.381355,25.067797 0 0 1 47.72321,23.21945" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
x="-496.31705"
y="181.54544"
id="text4593"><tspan
sodipodi:role="line"
id="tspan4591"
x="-496.31705"
y="181.54544">Jídlo</tspan></text>
</g>
</a>
<a
id="prednasky"
href="/static/images/graf/prednasky.jpeg"
transform="matrix(0.70138313,0,0,0.7462289,-192.38886,20.298351)">
<g
id="g929">
<path
style="fill:#f9d59e;fill-opacity:1"
id="path4535"
sodipodi:type="arc"
sodipodi:cx="-237.46721"
sodipodi:cy="179.30296"
sodipodi:rx="81.254234"
sodipodi:ry="30.686441"
sodipodi:start="0"
sodipodi:end="6.2108589"
sodipodi:open="true"
d="m -156.21297,179.30296 a 81.254234,30.686441 0 0 1 -79.78511,30.68143 81.254234,30.686441 0 0 1 -82.67024,-29.57195 81.254234,30.686441 0 0 1 76.79565,-31.75078 81.254234,30.686441 0 0 1 85.44726,28.4238" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
x="-304.39151"
y="187.65773"
id="text4597"><tspan
sodipodi:role="line"
id="tspan4595"
x="-304.39151"
y="187.65773">Přednášky</tspan></text>
</g>
</a>
<a
id="sous"
href="/soustredeni/"
transform="matrix(0.70138313,0,0,0.7462289,-192.38886,20.298351)">
<g
id="g944">
<path
style="fill:#f7cb87;fill-opacity:1"
id="path4539"
sodipodi:type="arc"
sodipodi:cx="-347.75323"
sodipodi:cy="283.24152"
sodipodi:rx="95.084747"
sodipodi:ry="32.415253"
sodipodi:start="0"
sodipodi:end="6.2108589"
sodipodi:open="true"
d="m -252.66849,283.24152 a 95.084747,32.415253 0 0 1 -93.36555,32.40995 95.084747,32.415253 0 0 1 -96.74177,-31.23797 95.084747,32.415253 0 0 1 89.86725,-33.53956 95.084747,32.415253 0 0 1 99.99148,30.02514" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
x="-426.63708"
y="290.34402"
id="text4601"><tspan
sodipodi:role="line"
id="tspan4599"
x="-426.63708"
y="290.34402">Soustředění</tspan></text>
</g>
</a>
<a
href="/static/images/graf/konfery.jpeg"
id="konfery"
transform="matrix(0.70138313,0,0,0.7462289,-192.38886,20.298351)">
<g
id="g934">
<path
style="fill:#f9d59e;fill-opacity:1"
id="path4537"
sodipodi:type="arc"
sodipodi:cx="-149.37189"
sodipodi:cy="246.07204"
sodipodi:rx="65.262711"
sodipodi:ry="28.957626"
sodipodi:start="0"
sodipodi:end="6.2108589"
sodipodi:open="true"
d="m -84.109177,246.07204 a 65.262711,28.957626 0 0 1 -64.082723,28.95289 65.262711,28.957626 0 0 1 -66.40003,-27.90592 65.262711,28.957626 0 0 1 61.68162,-29.96201 65.262711,28.957626 0 0 1 68.63051,26.82246" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
x="-199.2603"
y="252.44788"
id="text4605"><tspan
sodipodi:role="line"
id="tspan4603"
x="-199.2603"
y="252.44788">Konfery</tspan></text>
</g>
</a>
<a
href="/static/images/graf/vylet.jpeg"
id="vylet"
transform="matrix(0.70138313,0,0,0.7462289,-192.38886,20.298351)">
<g
id="g939">
<path
style="fill:#f9d59e;fill-opacity:1"
id="path4543"
sodipodi:type="arc"
sodipodi:cx="-145.91425"
sodipodi:cy="313.49576"
sodipodi:rx="47.110172"
sodipodi:ry="25.5"
sodipodi:start="0"
sodipodi:end="6.2108589"
sodipodi:open="true"
d="m -98.804073,313.49576 a 47.110172,25.5 0 0 1 -46.258387,25.49583 47.110172,25.5 0 0 1 -47.93116,-24.57387 47.110172,25.5 0 0 1 44.52515,-26.38445 47.110172,25.5 0 0 1 49.541231,23.61977" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
x="-180.92346"
y="319.68295"
id="text4609"><tspan
sodipodi:role="line"
id="tspan4607"
x="-180.92346"
y="319.68295">Výlet</tspan></text>
</g>
</a>
<a
href="/static/images/graf/legenda.jpeg"
id="legenda"
transform="matrix(0.70138313,0,0,0.7462289,-192.38886,20.298351)">
<g
id="g949">
<path
style="fill:#f9d59e;fill-opacity:1"
id="path4541"
sodipodi:type="arc"
sodipodi:cx="-574.94385"
sodipodi:cy="276.80719"
sodipodi:rx="70.016953"
sodipodi:ry="29.822035"
sodipodi:start="0"
sodipodi:end="6.2108589"
sodipodi:open="true"
d="m -504.9269,276.80719 a 70.016953,29.822035 0 0 1 -68.751,29.81716 70.016953,29.822035 0 0 1 -71.23712,-28.73893 70.016953,29.822035 0 0 1 66.17498,-30.8564 70.016953,29.822035 0 0 1 73.63009,27.62313" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
x="-633.23212"
y="285.45419"
id="text4613"><tspan
sodipodi:role="line"
id="tspan4611"
x="-633.23212"
y="285.45419">Legenda</tspan></text>
</g>
</a>
<a
href="/"
id="mam"
transform="matrix(0.70138313,0,0,0.7462289,-192.38886,20.298351)">
<g
id="g954">
<path
style="fill:#e84d0f;fill-opacity:1"
id="path4551"
sodipodi:type="arc"
sodipodi:cx="-343.86337"
sodipodi:cy="427.59747"
sodipodi:rx="142.19492"
sodipodi:ry="65.262711"
sodipodi:start="0"
sodipodi:end="6.2108589"
sodipodi:open="true"
d="m -201.66846,427.59747 a 142.19492,65.262711 0 0 1 -139.62394,65.25205 142.19492,65.262711 0 0 1 -144.67292,-62.89245 142.19492,65.262711 0 0 1 134.39239,-67.52631 142.19492,65.262711 0 0 1 149.53272,60.45061" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:77.33333588px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#fdedd5;fill-opacity:1;stroke:none"
x="-454.75357"
y="451.70819"
id="text4617"><tspan
sodipodi:role="line"
id="tspan4615"
x="-454.75357"
y="451.70819">M&amp;M</tspan></text>
</g>
</a>
<a
id="casopis"
href="/archiv/cisla/"
transform="matrix(0.70138313,0,0,0.7462289,-192.38886,20.298351)">
<g
id="g959">
<path
style="fill:#f7cb87;fill-opacity:1"
id="path4557"
sodipodi:type="arc"
sodipodi:cx="-347.95062"
sodipodi:cy="557.67822"
sodipodi:rx="65.262711"
sodipodi:ry="28.525423"
sodipodi:start="0"
sodipodi:end="6.2108589"
sodipodi:open="true"
d="m -282.68791,557.67822 a 65.262711,28.525423 0 0 1 -64.08272,28.52076 65.262711,28.525423 0 0 1 -66.40003,-27.48941 65.262711,28.525423 0 0 1 61.68161,-29.51481 65.262711,28.525423 0 0 1 68.63051,26.42212" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
x="-399.74304"
y="565.39655"
id="text4621"><tspan
sodipodi:role="line"
id="tspan4619"
x="-399.74304"
y="565.39655">Časopis</tspan></text>
</g>
</a>
<a
href="/clanky/uvod/"
id="clanky"
transform="matrix(0.70138313,0,0,0.7462289,-192.38886,20.298351)">
<g
id="g964">
<path
style="fill:#f9d59e;fill-opacity:1"
id="path4559"
sodipodi:type="arc"
sodipodi:cx="-138.71506"
sodipodi:cy="590.18011"
sodipodi:rx="63.966103"
sodipodi:ry="27.661016"
sodipodi:start="0"
sodipodi:end="6.2108589"
sodipodi:open="true"
d="m -74.748955,590.18011 a 63.966103,27.661016 0 0 1 -62.809555,27.6565 63.966103,27.661016 0 0 1 -65.08083,-26.6564 63.966103,27.661016 0 0 1 60.45616,-28.62043 63.966103,27.661016 0 0 1 67.266991,25.62146" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
x="-184.59082"
y="597.18036"
id="text4625"><tspan
sodipodi:role="line"
id="tspan4623"
x="-184.59082"
y="597.18036">Články</tspan></text>
</g>
</a>
<a
href="/zadani/temata/"
id="temata"
transform="matrix(0.70138313,0,0,0.7462289,-192.38886,20.298351)">
<g
id="g992">
<path
style="fill:#fbe1b8;fill-opacity:1"
id="path4561"
sodipodi:type="arc"
sodipodi:cx="-111.48623"
sodipodi:cy="704.74774"
sodipodi:rx="89.466103"
sodipodi:ry="33.711864"
sodipodi:start="0"
sodipodi:end="6.2108589"
sodipodi:open="true"
d="m -22.020126,704.74774 a 89.466103,33.711864 0 0 1 -87.848504,33.70636 89.466103,33.711864 0 0 1 -91.02521,-32.48749 89.466103,33.711864 0 0 1 84.55692,-34.88115 89.466103,33.711864 0 0 1 94.082892,31.22615" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
x="-188.25819"
y="713.31366"
id="text4629"><tspan
sodipodi:role="line"
id="tspan4627"
x="-188.25819"
y="713.31366">Matematika</tspan></text>
</g>
</a>
<a
href="/zadani/temata/"
id="a74"
transform="matrix(0.70138313,0,0,0.7462289,-192.38886,20.298351)">
<g
id="g987">
<path
style="fill:#fbe1b8;fill-opacity:1"
id="path4573"
sodipodi:type="arc"
sodipodi:cx="-236.51923"
sodipodi:cy="766.56201"
sodipodi:rx="54.457626"
sodipodi:ry="26.364407"
sodipodi:start="0"
sodipodi:end="6.2108589"
sodipodi:open="true"
d="m -182.0616,766.56201 a 54.457626,26.364407 0 0 1 -53.473,26.3601 54.457626,26.364407 0 0 1 -55.40665,-25.40688 54.457626,26.364407 0 0 1 51.46943,-27.27885 54.457626,26.364407 0 0 1 57.26785,24.42045" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
x="-277.49747"
y="771.99158"
id="text4633"><tspan
sodipodi:role="line"
id="tspan4631"
x="-277.49747"
y="771.99158">Fyzika</tspan></text>
</g>
</a>
<a
href="/zadani/temata/"
id="a80"
transform="matrix(0.70138313,0,0,0.7462289,-192.38886,20.298351)">
<g
id="g997">
<path
style="fill:#fbe1b8;fill-opacity:1;stroke-width:1.04856682"
id="path4565"
sodipodi:type="arc"
sodipodi:cx="-397.39514"
sodipodi:cy="737.35175"
sodipodi:rx="94.565666"
sodipodi:ry="30.686441"
sodipodi:start="0"
sodipodi:end="6.2108589"
sodipodi:open="true"
d="m -302.82948,737.35175 a 94.565666,30.686441 0 0 1 -92.85586,30.68142 94.565666,30.686441 0 0 1 -96.21364,-29.57195 94.565666,30.686441 0 0 1 89.37666,-31.75078 94.565666,30.686441 0 0 1 99.44561,28.4238" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
x="-471.86792"
y="745.09753"
id="text4637"><tspan
sodipodi:role="line"
id="tspan4635"
x="-471.86792"
y="745.09753">Informatika</tspan></text>
</g>
</a>
<a
href="/zadani/temata/"
id="a86"
transform="matrix(0.70138313,0,0,0.7462289,-192.38886,20.298351)">
<g
id="g969">
<path
style="fill:#f9d59e;fill-opacity:1"
id="path4569"
sodipodi:type="arc"
sodipodi:cx="-292.48862"
sodipodi:cy="650.91101"
sodipodi:rx="64.398308"
sodipodi:ry="29.822035"
sodipodi:start="0"
sodipodi:end="6.2108589"
sodipodi:open="true"
d="m -228.09031,650.91101 a 64.398308,29.822035 0 0 1 -63.23395,29.81716 64.398308,29.822035 0 0 1 -65.52056,-28.73893 64.398308,29.822035 0 0 1 60.86464,-30.8564 64.398308,29.822035 0 0 1 67.72151,27.62313" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
x="-339.84271"
y="658.30322"
id="text4645"><tspan
sodipodi:role="line"
id="tspan4643"
x="-339.84271"
y="658.30322">Témata</tspan></text>
</g>
</a>
<a
href="/static/images/graf/dort.jpeg"
id="dort"
transform="matrix(0.70138313,0,0,0.7462289,-192.38886,20.298351)">
<g
id="g982">
<path
style="fill:#fbe1b8;fill-opacity:1"
id="path4571"
sodipodi:type="arc"
sodipodi:cx="-486.11139"
sodipodi:cy="675.53607"
sodipodi:rx="44.516949"
sodipodi:ry="27.661016"
sodipodi:start="0"
sodipodi:end="6.2108589"
sodipodi:open="true"
d="m -441.59444,675.53607 a 44.516949,27.661016 0 0 1 -43.71206,27.6565 44.516949,27.661016 0 0 1 -45.29273,-26.65641 44.516949,27.661016 0 0 1 42.07421,-28.62042 44.516949,27.661016 0 0 1 46.81419,25.62145" />
<text
id="text4752"
y="683.06036"
x="-517.18115"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
xml:space="preserve"><tspan
y="683.06036"
x="-517.18115"
id="tspan4750"
sodipodi:role="line">Dort</tspan></text>
</g>
</a>
<a
href="/static/images/graf/ceny.jpeg"
id="ceny"
transform="matrix(0.70138313,0,0,0.7462289,-192.38886,20.298351)">
<g
id="g977">
<path
d="m -457.01376,585.3136 a 116.69492,35.872883 0 0 1 -114.585,35.86702 116.69492,35.872883 0 0 1 -118.72855,-34.57003 116.69492,35.872883 0 0 1 110.29164,-37.11711 116.69492,35.872883 0 0 1 122.71683,33.22782"
sodipodi:open="true"
sodipodi:end="6.2108589"
sodipodi:start="0"
sodipodi:ry="35.872883"
sodipodi:rx="116.69492"
sodipodi:cy="585.3136"
sodipodi:cx="-573.70868"
sodipodi:type="arc"
id="path4754"
style="fill:#f9d59e;fill-opacity:1" />
<text
id="text4758"
y="591.75879"
x="-677.78503"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
xml:space="preserve"><tspan
y="591.75879"
x="-677.78503"
id="tspan4756"
sodipodi:role="line">Ceny pro vítěze</tspan></text>
</g>
</a>
<path
inkscape:connector-curvature="0"
id="path4778"
d="m -455.76698,141.64789 11.45289,66.10747"
style="fill:none;stroke:#000000;stroke-width:0.81115544px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4780"
d="m -508.91811,167.68039 40.58828,43.00581"
style="fill:none;stroke:#000000;stroke-width:0.85441852px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4782"
d="m -383.6046,174.02635 -21.40856,36.47147"
style="fill:none;stroke:#000000;stroke-width:0.75690192px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4784"
d="m -546.65496,225.3237 43.87422,4.26791"
style="fill:none;stroke:#000000;stroke-width:0.81483483px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4786"
d="m -375.01988,222.14416 32.37265,-15.29285"
style="fill:none;stroke:#000000;stroke-width:0.70687616px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4792"
d="m -373.08316,239.03475 46.07613,10.67714"
style="fill:none;stroke:#000000;stroke-width:0.75863773px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4794"
d="m -527.20742,90.092115 44.58531,23.718035"
style="fill:none;stroke:#000000;stroke-width:0.72345865px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4796"
d="m -456.57828,75.154318 -0.64305,27.138892"
style="fill:none;stroke:#000000;stroke-width:0.72345865px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4798"
d="m -364.62108,72.75971 -67.19949,38.65582"
style="fill:none;stroke:#000000;stroke-width:0.72345865px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4800"
d="m -437.32612,256.06242 0.45471,34.67118"
style="fill:none;stroke:#000000;stroke-width:0.72345865px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4802"
d="m -434.29471,388.13545 -0.15157,26.76937"
style="fill:none;stroke:#000000;stroke-width:0.72345865px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4804"
d="m -425.86106,456.98142 19.74987,27.58136"
style="fill:none;stroke:#000000;stroke-width:0.74608427px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4816"
d="m -368.09012,573.66943 -21.03117,-46.36255"
style="fill:none;stroke:#000000;stroke-width:0.73523891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4818"
d="m -357.22591,515.99035 26.90124,22.34969"
style="fill:none;stroke:#000000;stroke-width:0.72345865px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4829"
d="m -504.2717,517.47275 61.51915,-9.8065"
style="fill:none;stroke:#000000;stroke-width:0.72345865px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4831"
d="m -445.11042,549.17279 19.93479,-25.77054"
style="fill:none;stroke:#000000;stroke-width:0.72345865px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4835"
d="m -515.23314,450.54358 34.86113,-8.06306"
style="fill:none;stroke:#000000;stroke-width:0.72345865px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4837"
d="m -393.97707,443.7706 59.71861,14.191"
style="fill:none;stroke:#000000;stroke-width:0.72345865px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<g
id="g922"
transform="matrix(0.70138313,0,0,0.7462289,-192.38886,20.298351)">
<path
style="fill:#f9d59e;fill-opacity:1"
id="path4531"
sodipodi:type="arc"
sodipodi:cx="-375.41425"
sodipodi:cy="136.29237"
sodipodi:rx="40.627117"
sodipodi:ry="26.364407"
sodipodi:start="0"
sodipodi:end="6.2108589"
sodipodi:open="true"
d="m -334.78713,136.29237 a 40.627117,26.364407 0 0 1 -39.89255,26.3601 40.627117,26.364407 0 0 1 -41.33512,-25.40688 40.627117,26.364407 0 0 1 38.39782,-27.27884 40.627117,26.364407 0 0 1 42.72364,24.42044" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
x="-400.96548"
y="142.42686"
id="text4589"><tspan
sodipodi:role="line"
id="tspan4587"
x="-400.96548"
y="142.42686">Hry</tspan></text>
<g
id="g919">
<path
style="fill:#f9d59e;fill-opacity:1"
id="path910"
sodipodi:type="arc"
sodipodi:cx="-375.41425"
sodipodi:cy="136.29237"
sodipodi:rx="40.627117"
sodipodi:ry="26.364407"
sodipodi:start="0"
sodipodi:end="6.2108589"
sodipodi:open="true"
d="m -334.78713,136.29237 a 40.627117,26.364407 0 0 1 -39.89255,26.3601 40.627117,26.364407 0 0 1 -41.33512,-25.40688 40.627117,26.364407 0 0 1 38.39782,-27.27884 40.627117,26.364407 0 0 1 42.72364,24.42044" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
x="-400.96548"
y="142.42686"
id="text914"><tspan
sodipodi:role="line"
id="tspan912"
x="-400.96548"
y="142.42686">Hry</tspan></text>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 34 KiB

24
mamweb/templates/menu.html

@ -0,0 +1,24 @@
{% load sitetree %}
{% spaceless %}
{% autoescape off %}
<ul class="menu">
{% for item in sitetree_items %}
<li class="{% if item.has_children %}dropdown{% endif %} {% if item.is_current or item.in_current_branch %}active{% endif %}" >
<a href="{% sitetree_url for item %}" >
{{ item.title_resolved }}
</a>
<div class="submenu">
{% if item.is_current or item.in_current_branch %}
{% sitetree_children of item for menu template "submenu.html" %}
{% endif %}
</div>
</li>
{% endfor %}
<div class="submenu-newline">
</div>
<script>
$( ".submenu" ).prependTo( ".submenu-newline" ); {# api.jquery.com/prependTo #}
</script>
</ul>
{% endautoescape %}
{% endspaceless %}

19
mamweb/templates/menu_mobile.html

@ -0,0 +1,19 @@
{% load sitetree %}
{% spaceless %}
{% autoescape off %}
<ul class="menu_mobile">
{% for item in sitetree_items %}
<li class="{% if item.has_children %}dropdown{% endif %} {% if item.is_current or item.in_current_branch %}active{% endif %}">
<a href="{% if item.has_children %}#{% else %}{% sitetree_url for item %}{% endif %}" {% if item.has_children %}class="dropdown-toggle" data-toggle="dropdown"{% endif %}>
{{ item.title_resolved }}
</a>
<div class="submenu_mobile {% if item.is_current or item.in_current_branch %}active{% endif %}">
{% if item.has_children %}
{% sitetree_children of item for menu template "menu_mobile_dropdown.html" %}
{% endif %}
</div>
</li>
{% endfor %}
</ul>
{% endautoescape %}
{% endspaceless %}

8
mamweb/templates/menu_mobile_dropdown.html

@ -0,0 +1,8 @@
{% load sitetree %}
<ul class="submenu_mobile">
{% for item in sitetree_items %}
<li {% if item.is_current or item.in_current_branch %}class="active"{% endif %}>
<a href="{% sitetree_url for item %}" {% if item.hint %}title="{{ item.hint }}"{% endif %}>{{ item.title_resolved }}</a>
</li>
{% endfor %}
</ul>

8
mamweb/templates/submenu.html

@ -0,0 +1,8 @@
{% load sitetree %}
<ul class="submenu">
{% for item in sitetree_items %}
<li {% if item.is_current or item.in_current_branch %}class="active"{% endif %}>
<a href="{% sitetree_url for item %}" {% if item.hint %}title="{{ item.hint }}"{% endif %}>{{ item.title_resolved }}</a>
</li>
{% endfor %}
</ul>

BIN
seminar/static/images/no-photo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

16
seminar/templates/seminar/archiv/cislo.html

@ -67,21 +67,21 @@
{% endfor %} {% endfor %}
<th class='border-r'>Za číslo</sup> <th class='border-r'>Za číslo</sup>
<th class='border-r'>Za ročník <th class='border-r'>Za ročník
<th class='border-r'>Odjakživa {#<th class='border-r'>Odjakživa#}
{% for rv in vysledkovka %} {% for rv in radky_vysledkovky %}
<tr> <tr>
<td class='border-r'>{% autoescape off %}{{ rv.poradi }}{% endautoescape %} <td class='border-r'>{% autoescape off %}{{ rv.poradi }}{% endautoescape %}
<th class='border-r'> <th class='border-r'>
{% if rv.titul %} {% if rv.resitel.get_titul != "" %}
{{ rv.titul }}<sup>MM</sup> {{ rv.resitel.get_titul }}<sup>MM</sup>
{% endif %} {% endif %}
{{ rv.resitel.plne_jmeno }} {{ rv.resitel.osoba.plne_jmeno }}
{% for b in rv.body_ulohy %} {% for b in rv.hlavni_problemy_body %}
<td class='border-r'>{{ b }} <td class='border-r'>{{ b }}
{% endfor %} {% endfor %}
<td class='border-r'>{{ rv.body_cislo }} <td class='border-r'>{{ rv.body_cislo }}
<td class='border-r'><b>{{ rv.body_celkem_rocnik }}</b> <td class='border-r'><b>{{ rv.body_rocnik }}</b>
<td class='border-r'>{{ rv.body_celkem_odjakziva }} {# <td class='border-r'>{{ rv.body_celkem_odjakziva }}#}
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>

87
seminar/templates/seminar/cojemam/organizatori.html

@ -18,63 +18,80 @@
{# zmena fotky #}{% block header %}cojemam{% endblock %} {# zmena fotky #}{% block header %}cojemam{% endblock %}
{% block content %} {% block content %}
<div id='seznam_orgu'>
{% if not aktivni %} {% if not aktivni %}
<br>
<a href="/co-je-MaM/organizatori/">Aktivní organizátoři</a><br> <a href="/co-je-MaM/organizatori/">Aktivní organizátoři</a><br>
<br> <br>
{% endif %} {% endif %}
<div class="seznam_orgu">
{% for org in object_list %} {% for org in object_list %}
<h1> <div class="org_pole">
<h3>
{{org.osoba.jmeno}} {{org.osoba.jmeno}}
{% if org.prezdivka %} {% if org.osoba.prezdivka %}
&bdquo;{{org.osoba.prezdivka}}&ldquo; &bdquo;{{org.osoba.prezdivka}}&ldquo;
{% endif %} {% endif %}
{{org.osoba.prijmeni}} {{org.osoba.prijmeni}}
</h1> </h3>
<table>
<tr> <div class="org_email">
<td> {% if org.osoba.email %}
{# zobrazeni e-mailu (na jednom radku, aby nevznikaly mezery navic) #}
{% for znak in org.osoba.email %}{% if znak == '@' %}&#60;at&#62;{% else %}{{znak}}{% endif %}{% endfor %}
{% endif %}
</div>
{# karta organizátora - zepředu fotka, zezadu popis, u neaktivních data kdy organizovali #}
<div class="flip-card">
<div class="flip-card-inner">
<div class="flip-card-front">
<div class="foto_org"> <div class="foto_org">
{% if org.osoba.foto %} {% if org.osoba.foto %}
{# <img src="{{org.osoba.foto.url}}" height="{{org.osoba.foto.height}}"> #}
<a href="{{org.osoba.foto.url}}"><img src="{{org.osoba.foto_male.url}}" height="{{org.osoba.foto_male.height}}" alt="{{org.osoba.jmeno}} {{org.osoba.prijmeni}}"></a> <a href="{{org.osoba.foto.url}}"><img src="{{org.osoba.foto_male.url}}" height="{{org.osoba.foto_male.height}}" alt="{{org.osoba.jmeno}} {{org.osoba.prijmeni}}"></a>
{% else %} {# pokud osoba nemá fotku, zobrazuje se defaultní obrázek #}
{% load static %} <img src="{% static 'images/no-photo.png' %}" height=200px alt="{{org.osoba.jmeno}} {{org.osoba.prijmeni}}">
{% endif %} {% endif %}
</div> </div>
</td>
<td> </div>
<ul> <div class="flip-card-back">
{% if aktivni %}
<div class="popis_orga">
{% if aktivni %}
{% if org.strucny_popis_organizatora %}
{{org.strucny_popis_organizatora}}
{% endif %}
{% if org.organizuje_od %} {% if org.organizuje_od %}
<li> Organizuji od roku {{org.organizuje_od.year}}.
Organizuje od roku {{org.organizuje_od}}
{% endif %} {% endif %}
{% else %} {% else %}
<li> Aktivní {{org.organizuje_od.year | default:"?" }}&ndash;{{org.organizuje_do.year | default:"?" }}
Aktivní v letech {{org.organizuje_od | default:"?" }}&ndash;{{org.organizuje_do | default:"?" }} {% endif %}
{% endif %} </div>
{% if org.skola %}
<li>{{org.studuje}} na {{org.skola}} </div>
{% endif %} </div>
{% if org.osoba.email %} </div>
<li>Pošta: {# konec karty organizátora #}
{# zobrazeni e-mailu (na jednom radku, aby nevznikaly mezery navic) #}
{% for znak in org.osoba.email %}{% if znak == '@' %} &#60;zavináč&#62; {% elif znak == '.' %} &#60;tečka&#62; {% else %}{{znak}}{% endif %}{% endfor %}
{% endif %}
</ul>
{# {{org.strucny_popis_organizatora}} #}
</td>
</tr>
</table>
<hr> <hr>
</div>
{% endfor %} {% endfor %}
{% if aktivni%} </div>
{% if aktivni%}
<a href="organizovali/">Vysloužilí organizátoři</a> <a href="organizovali/">Vysloužilí organizátoři</a>
{% else %} {% else %}
<a href="/co-je-MaM/organizatori/">Aktivní organizátoři</a> <a href="/co-je-MaM/organizatori/">Aktivní organizátoři</a>
{% endif %} {% endif %}
</div>
{% endblock content %} {% endblock content %}

33
seminar/templates/seminar/titulnistrana.html

@ -13,7 +13,7 @@
</h1> </h1>
<p> <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 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í. 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í.
</p> </p>
@ -33,38 +33,13 @@ M&amp;M je korespondenční seminář. Několikrát do roka zdarma vydáváme č
</div> </div>
<div class="graf"> <div class="graf">
<img class="map" src="{% static 'images/graph.png' %}" width="505.0" height="612.0" usemap="#vuemap"> <div class="graf-svg">
{% include 'graph.svg' %} <!-- TODO: aby to nemuselo být v templates -->
<map name="vuemap"> </div>
<area href="/" id="mam" shape="rect" coords="148,277,354,364"></area>
<area href="/soustredeni/" id="sous" shape="rect" coords="180,194,313,236"></area>
<area href="/archiv/cisla/" id="casopis" shape="rect" coords="206,393,297,432"></area>
<area href="/media/ilustrace/graf/duvera.jpeg" id="hry" shape="rect" coords="198,87,251,121"></area>
<area href="/media/ilustrace/graf/prednaska.jpeg" id="prednasky" shape="rect" coords="273,120,390,160"></area>
<area href="/media/ilustrace/graf/konfera.jpeg" id="konfery" shape="rect" coords="350,168,445,207"></area>
<area href="/media/ilustrace/graf/vylet.jpeg" id="vylet" shape="rect" coords="366,220,434,256"></area>
<area href="/media/ilustrace/graf/legenda.jpeg" id="legenda" shape="rect" coords="29,180,129,219"></area>
<area href="/media/ilustrace/graf/jidlo.jpeg" id="jidlo" shape="rect" coords="125,114,184,149"></area>
<area href="/media/ilustrace/graf/adrenalin.jpeg" id="adrenalinove" shape="rect" coords="38,30,184,73"></area>
<area href="/media/ilustrace/graf/beh-p.jpeg" id="behaci" shape="rect" coords="193,20,274,57"></area>
<area href="/media/ilustrace/graf/strategie.jpeg" id="strategicke" shape="rect" coords="284,16,411,57"></area>
<area href="/clanky/uvod/" id="clanky" shape="rect" coords="363,428,447,466"></area>
<area href="/zadani/aktualni/" id="ulohy" shape="rect" coords="246,492,321,529"></area>
<area href="/zadani/temata/" id="temata" shape="rect" coords="126,473,217,511"></area>
<area href="/media/ilustrace/graf/knihy.jpg" id="ceny" shape="rect" coords="15,413,188,458"></area>
<area href="/zadani/aktualni/#zam_M" id="matika" shape="rect" coords="357,514,488,556"></area>
<area href="/zadani/aktualni/#zam_F" id="fyzika" shape="rect" coords="276,557,354,594"></area>
<area href="/zadani/aktualni/#zam_I" id="informatika" shape="rect" coords="141,539,269,580"></area>
<area href="/media/ilustrace/graf/dort.jpg" id="dort" shape="rect" coords="60,519,121,554"></area>
</map>
<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/">Zjistit víc!</a></h2>
</span> </span>
</div> </div>
{% endblock %} {% endblock %}

195
seminar/testutils.py

@ -30,28 +30,28 @@ def gen_osoby(rnd, size):
logger.info('Generuji osoby (size={})...'.format(size)) logger.info('Generuji osoby (size={})...'.format(size))
jmena_m = ['Aleš', 'Tomáš', 'Martin', 'Jakub', 'Petr', 'Lukáš', 'Cyril', 'Pavel Karel'] jmena_m = ['Aleš', 'Tomáš', 'Martin', 'Jakub', 'Petr', 'Lukáš', 'Cyril', 'Pavel Karel']
jmena_f = ['Eva', 'Karolína', 'Zuzana', 'Sylvie', 'Iva', 'Jana', 'Marie', jmena_f = ['Eva', 'Karolína', 'Zuzana', 'Sylvie', 'Iva', 'Jana', 'Marie',
'Marta Iva', 'Shu Shan'] 'Marta Iva', 'Shu Shan']
prijmeni_m = ['Novotný', 'Svoboda', 'Pecha', 'Kořen', 'Holan', 'Uhlíř', 'Chytráček', prijmeni_m = ['Novotný', 'Svoboda', 'Pecha', 'Kořen', 'Holan', 'Uhlíř', 'Chytráček',
'Pokora', 'Koch', 'Szegedy', 'Rudý', "von Neumann", "d'Este"] 'Pokora', 'Koch', 'Szegedy', 'Rudý', "von Neumann", "d'Este"]
prijmeni_f = ['Novotná', 'Svobodová', 'Machová', 'Zelená', 'Yu-Xin', 'Mlsná', 'Dubná', prijmeni_f = ['Novotná', 'Svobodová', 'Machová', 'Zelená', 'Yu-Xin', 'Mlsná', 'Dubná',
'Mrkvová', 'Suchá', 'Lovelace', 'Holcová', 'Rui'] 'Mrkvová', 'Suchá', 'Lovelace', 'Holcová', 'Rui', "Nováčková Tydlitátová"]
prezdivky = ['Kaki', 'Hurdur', 'Maracuja', 'Bobbo', "", "", "", "", "", prezdivky = ['Kaki', 'Hurdur', 'Maracuja', 'Bobbo', "", "", "", "", "",
"", "", 'Riki', 'Sapa', "", '', '---', 'Koko'] "", "", 'Riki', 'Sapa', "", '', '---', 'Koko']
domain = ['example.com', 'dolujeme.eu', 'mff.cuni.cz', 'strcprstskrzkrk.cz', domain = ['example.com', 'dolujeme.eu', 'mff.cuni.cz', 'strcprstskrzkrk.cz',
'british.co.uk', 'splachni.to', 'haha.org'] 'british.co.uk', 'splachni.to', 'haha.org']
seznam_ulic = ['Krátká', 'Vlhká', 'Jungmanova', '17. listopadu', '4. října', 'Roztocká', seznam_ulic = ['Krátká', 'Vlhká', 'Jungmanova', '17. listopadu', '4. října', 'Roztocká',
'Forstova', 'Generála Františka Janouška', 'Náměstí Války', 'Forstova', 'Generála Františka Janouška', 'Náměstí Války',
'Svratecké náměstí', 'Zelená lhota', 'Z Plynu', 'K Jezeru', 'U Kocourkova', 'Svratecké náměstí', 'Zelená lhota', 'Z Plynu', 'K Jezeru', 'U Kocourkova',
'Uštěpačná', 'Ostrorepská', 'Zubří'] 'Uštěpačná', 'Ostrorepská', 'Zubří']
seznam_mest = ['Praha', 'Brno', 'Ostrava', 'Horní Jelení', 'Dolní Zábrdovice', 'Prdelkov', seznam_mest = ['Praha', 'Brno', 'Ostrava', 'Horní Jelení', 'Dolní Zábrdovice', 'Prdelkov',
'Stará myslivna', 'Kocourkov', 'Šalingrad', 'Medvědí hora', 'Basilej', 'Stará myslivna', 'Kocourkov', 'Šalingrad', 'Medvědí hora', 'Basilej',
'Unterschiedlich', 'Old York', 'Lancastershire', 'Vóloďháza'] 'Unterschiedlich', 'Old York', 'Lancastershire', 'Vóloďháza']
osoby = [] osoby = []
# 30 je náhodná konstanta, size je použité na víc místech a # 30 je náhodná konstanta, size je použité na víc místech a
# říká, jak velká asi chceme testovací data # říká, jak velká asi chceme testovací data
for i in range(30 * size): for i in range(30 * size):
pohlavi = rnd.randint(0,1) pohlavi = rnd.randint(0,1)
jmeno = rnd.choice([jmena_m, jmena_f][pohlavi]) jmeno = rnd.choice([jmena_m, jmena_f][pohlavi])
prijmeni = rnd.choice([prijmeni_m, prijmeni_f][pohlavi]) prijmeni = rnd.choice([prijmeni_m, prijmeni_f][pohlavi])
@ -71,47 +71,48 @@ def gen_osoby(rnd, size):
prezdivka = rnd.choice(prezdivky) prezdivka = rnd.choice(prezdivky)
email = "@".join([unidecode.unidecode(jmeno), rnd.choice(domain)]) email = "@".join([unidecode.unidecode(jmeno), rnd.choice(domain)])
telefon = "".join([str(rnd.choice([k for k in range(10)])) for i in range(9)]) telefon = "".join([str(rnd.choice([k for k in range(10)])) for i in range(9)])
narozeni = datetime.date(rnd.randint(1980, 2020), rnd.randint(1, 12), narozeni = datetime.date(rnd.randint(1980, 2020), rnd.randint(1, 12),
rnd.randint(1, 28)) rnd.randint(1, 28))
ulic = rnd.choice(seznam_ulic) ulic = rnd.choice(seznam_ulic)
cp = rnd.randint(1, 99) cp = rnd.randint(1, 99)
ulice = " ".join([ulic, str(cp)]) ulice = "".join([ulic, str(cp)])
mesto = rnd.choice(seznam_mest) mesto = rnd.choice(seznam_mest)
psc = "".join([str(rnd.choice([k for k in range(10)])) for i in range(5)]) psc = "".join([str(rnd.choice([k for k in range(10)])) for i in range(5)])
osoby.append(Osoba.objects.create(jmeno = jmeno, prijmeni = prijmeni,
prezdivka = prezdivka, pohlavi_muz = pohlavi, email = email, osoby.append(Osoba.objects.create(jmeno = jmeno, prijmeni = prijmeni,
telefon = telefon, datum_narozeni = narozeni, ulice = ulice, prezdivka = prezdivka, pohlavi_muz = pohlavi, email = email,
mesto = mesto, psc = psc, telefon = telefon, datum_narozeni = narozeni, ulice = ulice,
datum_registrace = datetime.date(rnd.randint(2019, 2029), mesto = mesto, psc = psc,
datum_registrace = datetime.date(rnd.randint(2019, 2029),
rnd.randint(1, 12), rnd.randint(1, 28)))) rnd.randint(1, 12), rnd.randint(1, 28))))
#TODO pridat foto male a velke. Jak? #TODO pridat foto male a velke. Jak?
# Pavel tvrdí, že to necháme a přidáme až do adminu # Pavel tvrdí, že to necháme a přidáme až do adminu
return osoby return osoby
def gen_skoly(): #TODO někdy to přepsat, aby jich bylo více def gen_skoly(): #TODO někdy to přepsat, aby jich bylo více
logger.info('Generuji školy...') logger.info('Generuji školy...')
skoly = [] skoly = []
prvnizs = Skola.objects.create(mesto='Praha', stat='CZ', psc='101 00', prvnizs = Skola.objects.create(mesto='Praha', stat='CZ', psc='101 00',
ulice='Krátká 5', nazev='První ZŠ', je_zs=True, je_ss=False) ulice='Krátká 5', nazev='První ZŠ', je_zs=True, je_ss=False)
skoly.append(prvnizs) skoly.append(prvnizs)
skoly.append(Skola.objects.create(mesto='Praha', stat='CZ', psc='101 00', skoly.append(Skola.objects.create(mesto='Praha', stat='CZ', psc='101 00',
ulice='Krátká 5', nazev='První SŠ', je_zs=False, je_ss=True)) ulice='Krátká 5', nazev='První SŠ', je_zs=False, je_ss=True))
skoly.append(Skola.objects.create(mesto='Praha', stat='CZ', psc='102 00', skoly.append(Skola.objects.create(mesto='Praha', stat='CZ', psc='102 00',
ulice='Dlouhá 5', nazev='Druhá SŠ', je_zs=False, je_ss=True)) ulice='Dlouhá 5', nazev='Druhá SŠ', je_zs=False, je_ss=True))
skoly.append(Skola.objects.create(mesto='Praha', stat='CZ', psc='103 00', skoly.append(Skola.objects.create(mesto='Praha', stat='CZ', psc='103 00',
ulice='Široká 3', nazev='Třetí SŠ a ZŠ', je_zs=True, je_ss=True)) ulice='Široká 3', nazev='Třetí SŠ a ZŠ', je_zs=True, je_ss=True))
skoly.append(Skola.objects.create(mesto='Ostrava', stat='CZ', psc='700 00', skoly.append(Skola.objects.create(mesto='Ostrava', stat='CZ', psc='700 00',
ulice='Hluboká 42', nazev='Hutní gympl', je_zs=False, je_ss=True)) ulice='Hluboká 42', nazev='Hutní gympl', je_zs=False, je_ss=True))
skoly.append(Skola.objects.create(mesto='Humenné', stat='SK', psc='012 34', skoly.append(Skola.objects.create(mesto='Humenné', stat='SK', psc='012 34',
ulice='Pltká 1', nazev='Sredná škuola', je_zs=False, je_ss=True)) ulice='Pltká 1', nazev='Sredná škuola', je_zs=False, je_ss=True))
global zlinska global zlinska
zlinska = Skola.objects.create(mesto = 'Zlín', stat='CZ', psc='76001', zlinska = Skola.objects.create(mesto = 'Zlín', stat='CZ', psc='76001',
ulice='náměstí T.G. Masaryka 2734-9', ulice='náměstí T.G. Masaryka 2734-9',
nazev='Gymnázium a Střední jazyková škola s právem SJZ', nazev='Gymnázium a Střední jazyková škola s právem SJZ',
kratky_nazev="GaSJŠspSJZ", je_zs=True, je_ss=True) kratky_nazev="GaSJŠspSJZ", je_zs=True, je_ss=True)
skoly.append(zlinska) skoly.append(zlinska)
return skoly return skoly
@ -123,8 +124,8 @@ def gen_resitele(rnd, osoby, skoly):
for os in osoby: for os in osoby:
rand = rnd.randint(0, 8) rand = rnd.randint(0, 8)
if not (rand % 8 == 0): if not (rand % 8 == 0):
resitele.append(Resitel.objects.create(osoba=os, skola=rnd.choice(skoly), resitele.append(Resitel.objects.create(osoba=os, skola=rnd.choice(skoly),
rok_maturity=rnd.randint(2019, 2029), rok_maturity=rnd.randint(2019, 2029),
zasilat=rnd.choice(Resitel.ZASILAT_CHOICES)[0])) zasilat=rnd.choice(Resitel.ZASILAT_CHOICES)[0]))
return resitele return resitele
@ -138,6 +139,13 @@ def gen_prijemci(rnd, osoby, kolik=10):
def gen_organizatori(rnd, osoby, last_rocnik, users): def gen_organizatori(rnd, osoby, last_rocnik, users):
logger.info('Generuji organizátory...') logger.info('Generuji organizátory...')
organizatori = [] organizatori = []
seznam_konicku = ["vařím", "jezdím na kole", "řeším diferenciální rovnice", "koukám z okna",
"tancuji", "programuji", "jezdím vlakem", "nedělám nic"]
seznam_oboru = ["matematiku", "matematiku", "matematiku", "fyziku", "literaturu",
"informatiku", "informatiku", "běhání dokolečka"]
for os in osoby: for os in osoby:
rand = rnd.randint(0, 8) rand = rnd.randint(0, 8)
if (rand % 8 == 0): if (rand % 8 == 0):
@ -155,19 +163,26 @@ def gen_organizatori(rnd, osoby, last_rocnik, users):
tzinfo=timezone('CET'), tzinfo=timezone('CET'),
) )
#aktualni organizatori jeste nemaji vyplnene organizuje_do #aktualni organizatori jeste nemaji vyplnene organizuje_do
#popis orga
konicek1 = rnd.choice(seznam_konicku)
konicek2 = rnd.choice(seznam_konicku)
obor = rnd.choice(seznam_oboru)
popis_orga = "Ve volném čase " + konicek1 + " a také " + konicek2 + ". Studuji " + obor + " a moc mě to baví."
if do.year > datetime.datetime.now().year: if do.year > datetime.datetime.now().year:
do = None do = None
organizatori.append(Organizator.objects.create(osoba=os, organizatori.append(Organizator.objects.create(osoba=os,
organizuje_od=od, organizuje_do=do)) organizuje_od=od, organizuje_do=do, strucny_popis_organizatora = popis_orga))
return organizatori return organizatori
def gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size): def gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size):
logger.info('Generuji úlohy do čísla (size={})...'.format(size)) logger.info('Generuji úlohy do čísla (size={})...'.format(size))
# ulohy resene v cisle # ulohy resene v cisle
jaka = ["Šachová", "Černá", "Větrná", "Dlouhá", "Křehká", "Rychlá", jaka = ["Šachová", "Černá", "Větrná", "Dlouhá", "Křehká", "Rychlá",
"Zákeřná", "Fyzikální"] "Zákeřná", "Fyzikální"]
co = ["kostka", "smršť", "díra", "zrada", "toulka", "tyč", co = ["kostka", "smršť", "díra", "zrada", "toulka", "tyč",
"úloha", "blecha"] "úloha", "blecha"]
sloveso = ["Najděte", "Spočítejte", "Zapište", "Změřte", "Odhadněte"] sloveso = ["Najděte", "Spočítejte", "Zapište", "Změřte", "Odhadněte"]
koho = ["délku", "počet", "množství", "dílky"] koho = ["délku", "počet", "množství", "dílky"]
@ -175,9 +190,9 @@ def gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size)
jmeno = ["řešení", "tahů", "čísel", "kalhot", "koulí", "hadů"] jmeno = ["řešení", "tahů", "čísel", "kalhot", "koulí", "hadů"]
kde = ["na zemi", "ve vesmíru", "ve vzduchu", "na šňůře", "v letadle"] kde = ["na zemi", "ve vesmíru", "ve vzduchu", "na šňůře", "v letadle"]
obor = ["M", "F", "I", "O", "B"] obor = ["M", "F", "I", "O", "B"]
reseni = ["to je přece jasné", "triviální", "omlouváme se," reseni = ["to je přece jasné", "triviální", "omlouváme se,"
"otevřený problém", "neřešitelné", "triviálně triviální", "otevřený problém", "neřešitelné", "triviálně triviální",
"použitím věty z prvního semestru na matfyzu", "použitím věty z prvního semestru na matfyzu",
"jednoduše pomocí látky z druhého semestru na matfyzu", "jednoduše pomocí látky z druhého semestru na matfyzu",
"netriviální aplikace diferenciálních rovnic", "zadání je vnitřně" "netriviální aplikace diferenciálních rovnic", "zadání je vnitřně"
"sporné", "nepopsatelně jednoduché", "pokud jste na to nepřišli," "sporné", "nepopsatelně jednoduché", "pokud jste na to nepřišli,"
@ -204,29 +219,29 @@ def gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size)
nazev=" ".join([rnd.choice(jaka), rnd.choice(co)]), nazev=" ".join([rnd.choice(jaka), rnd.choice(co)]),
stav=Problem.STAV_ZADANY, stav=Problem.STAV_ZADANY,
zamereni=rnd.sample(["M", "F", "I", "O", "B"], poc_oboru), zamereni=rnd.sample(["M", "F", "I", "O", "B"], poc_oboru),
autor=rnd.choice(organizatori), autor=rnd.choice(organizatori),
garant=rnd.choice(organizatori), garant=rnd.choice(organizatori),
kod=str(pi), kod=str(pi),
# atributy třídy Uloha # atributy třídy Uloha
cislo_zadani=cisla[ci-2-1], cislo_zadani=cisla[ci-2-1],
cislo_reseni=cisla[ci-1], cislo_reseni=cisla[ci-1],
cislo_deadline=cisla[ci-1], cislo_deadline=cisla[ci-1],
max_body = rnd.randint(1, 8) max_body = rnd.randint(1, 8)
) )
text_zadani = Text.objects.create( text_zadani = Text.objects.create(
na_web = " ".join( na_web = " ".join(
[rnd.choice(sloveso), [rnd.choice(sloveso),
rnd.choice(koho), rnd.choice(koho),
rnd.choice(ceho), rnd.choice(ceho),
rnd.choice(jmeno), rnd.choice(jmeno),
rnd.choice(kde)] rnd.choice(kde)]
), ),
do_cisla = " ".join( do_cisla = " ".join(
[rnd.choice(sloveso), [rnd.choice(sloveso),
rnd.choice(koho), rnd.choice(koho),
rnd.choice(ceho), rnd.choice(ceho),
rnd.choice(jmeno), rnd.choice(jmeno),
rnd.choice(kde)] rnd.choice(kde)]
) )
) )
@ -234,7 +249,7 @@ def gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size)
uloha_zadani = UlohaZadaniNode.objects.create(uloha=p, first_child = zad) uloha_zadani = UlohaZadaniNode.objects.create(uloha=p, first_child = zad)
p.ulohazadaninode = uloha_zadani p.ulohazadaninode = uloha_zadani
otec_syn(cisla[ci-2-1].cislonode, uloha_zadani) otec_syn(cisla[ci-2-1].cislonode, uloha_zadani)
# generování vzorového textu # generování vzorového textu
text_vzoraku = Text.objects.create( text_vzoraku = Text.objects.create(
na_web = rnd.choice(reseni), na_web = rnd.choice(reseni),
@ -269,7 +284,7 @@ def gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size)
reseni=res, reseni=res,
problem=p problem=p
) )
return return
def gen_soustredeni(rnd, resitele, organizatori): def gen_soustredeni(rnd, resitele, organizatori):
@ -315,8 +330,8 @@ def gen_konfery(size, rnd, organizatori, resitele, soustredeni):
konfery = [] konfery = []
for _ in range(1, size): #FIXME Tu range si změňte jak chcete, nevím, co přesně znamená size (asi Anet?) for _ in range(1, size): #FIXME Tu range si změňte jak chcete, nevím, co přesně znamená size (asi Anet?)
# Anet: size je parametr udávající velikost testovacích dat a dá se pomocí ní škálovat, # Anet: size je parametr udávající velikost testovacích dat a dá se pomocí ní škálovat,
# kolik dat se nageneruje # kolik dat se nageneruje
konfera = Konfera.objects.create( konfera = Konfera.objects.create(
nazev=rnd.choice(['Pozorování', 'Zkoumání', 'Modelování', 'Počítání', 'Zkoušení']) + rnd.choice([' vlastností', ' jevů', ' charakteristik']) + rnd.choice([' vektorových prostorů', ' kinetické terorie látek', ' molekulární biologie', ' syntentických stromů']), nazev=rnd.choice(['Pozorování', 'Zkoumání', 'Modelování', 'Počítání', 'Zkoušení']) + rnd.choice([' vlastností', ' jevů', ' charakteristik']) + rnd.choice([' vektorových prostorů', ' kinetické terorie látek', ' molekulární biologie', ' syntentických stromů']),
anotace=lorem.paragraph(), anotace=lorem.paragraph(),
@ -331,7 +346,7 @@ def gen_konfery(size, rnd, organizatori, resitele, soustredeni):
# Konfery_Ucastnici.objects.create(resitel=res, konfera=konfera) # Konfery_Ucastnici.objects.create(resitel=res, konfera=konfera)
konfera.save() konfera.save()
konfery.append(konfera) konfery.append(konfera)
konferanode = KonferaNode.objects.create(konfera=konfera) konferanode = KonferaNode.objects.create(konfera=konfera)
konferanode.save() konferanode.save()
return konfery return konfery
@ -352,21 +367,21 @@ def gen_cisla(rnd, rocniky):
mesic_vydani = (ci - 1)*2 + 6 mesic_vydani = (ci - 1)*2 + 6
# celociselné dělení mi řekne, jestli to je první nebo druhý rok ročníku # celociselné dělení mi řekne, jestli to je první nebo druhý rok ročníku
vydano = datetime.date(rocnik.prvni_rok + mesic_vydani // 12, vydano = datetime.date(rocnik.prvni_rok + mesic_vydani // 12,
(mesic_vydani - 1) % 12 + 1, (mesic_vydani - 1) % 12 + 1,
rnd.randint(1, 28))
deadline = datetime.date(rocnik.prvni_rok + (mesic_vydani + 2) // 12,
(mesic_vydani + 1) % 12 + 1,
rnd.randint(1, 28)) rnd.randint(1, 28))
deadline = datetime.date(rocnik.prvni_rok + (mesic_vydani + 2) // 12,
(mesic_vydani + 1) % 12 + 1,
rnd.randint(1, 28))
# posledni 2 cisla v rocniku nemaji deadline # posledni 2 cisla v rocniku nemaji deadline
if (ci + 2 > cisel): if (ci + 2 > cisel):
deadline = None deadline = None
cislo = Cislo.objects.create( cislo = Cislo.objects.create(
rocnik = rocnik, rocnik = rocnik,
poradi = str(ci), poradi = str(ci),
datum_vydani=vydano, datum_vydani=vydano,
datum_deadline=deadline, datum_deadline=deadline,
verejne_db=True verejne_db=True
) )
node2 = CisloNode.objects.create(cislo = cislo, succ = node) node2 = CisloNode.objects.create(cislo = cislo, succ = node)
@ -376,7 +391,7 @@ def gen_cisla(rnd, rocniky):
otec = False otec = False
rocnik.rocniknode.first_child = node rocnik.rocniknode.first_child = node
rocnik.save() rocnik.save()
cisla.append(cislo) cisla.append(cislo)
rocnik_cisla.append(cisla) rocnik_cisla.append(cisla)
return rocnik_cisla return rocnik_cisla
@ -385,7 +400,7 @@ def gen_temata(rnd, rocniky, rocnik_cisla, organizatori):
logger.info('Generuji témata...') logger.info('Generuji témata...')
jake = ["Hravé", "Fyzikální", "Nejlepší", "Totálně masakrální", jake = ["Hravé", "Fyzikální", "Nejlepší", "Totálně masakrální",
"Šokující", "Magnetické", "Modré", "Překvapivé", "Šokující", "Magnetické", "Modré", "Překvapivé",
"Plasmatické", "Novoroční"] "Plasmatické", "Novoroční"]
co = ["téma", "záření", "stavení", "jiskření", "jelito", co = ["téma", "záření", "stavení", "jiskření", "jelito",
"drama", "kuře", "moře", "klání", "proudění", "čekání"] "drama", "kuře", "moře", "klání", "proudění", "čekání"]
@ -404,8 +419,8 @@ def gen_temata(rnd, rocniky, rocnik_cisla, organizatori):
nazev=" ".join([rnd.choice(jake), rnd.choice(co)]), nazev=" ".join([rnd.choice(jake), rnd.choice(co)]),
stav=Problem.STAV_ZADANY, stav=Problem.STAV_ZADANY,
zamereni=rnd.sample(["M", "F", "I", "O", "B"], poc_oboru), zamereni=rnd.sample(["M", "F", "I", "O", "B"], poc_oboru),
autor=rnd.choice(organizatori), autor=rnd.choice(organizatori),
garant=rnd.choice(organizatori), garant=rnd.choice(organizatori),
kod=str(kod), kod=str(kod),
# atributy třídy Téma # atributy třídy Téma
tema_typ=rnd.choice(Tema.TEMA_CHOICES)[0], tema_typ=rnd.choice(Tema.TEMA_CHOICES)[0],
@ -439,9 +454,9 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori)
logger.info('Generuji úlohy k tématům...') logger.info('Generuji úlohy k tématům...')
# ulohy resene v cisle # ulohy resene v cisle
jaka = ["Šachová", "Černá", "Větrná", "Dlouhá", "Křehká", "Rychlá", jaka = ["Šachová", "Černá", "Větrná", "Dlouhá", "Křehká", "Rychlá",
"Zákeřná", "Fyzikální"] "Zákeřná", "Fyzikální"]
co = ["kostka", "smršť", "díra", "zrada", "toulka", "tyč", co = ["kostka", "smršť", "díra", "zrada", "toulka", "tyč",
"úloha", "blecha"] "úloha", "blecha"]
sloveso = ["Najděte", "Spočítejte", "Zapište", "Změřte", "Odhadněte"] sloveso = ["Najděte", "Spočítejte", "Zapište", "Změřte", "Odhadněte"]
koho = ["délku", "počet", "množství", "dílky"] koho = ["délku", "počet", "množství", "dílky"]
@ -449,9 +464,9 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori)
jmeno = ["řešení", "tahů", "čísel", "kalhot", "koulí", "hadů"] jmeno = ["řešení", "tahů", "čísel", "kalhot", "koulí", "hadů"]
kde = ["na zemi", "ve vesmíru", "ve vzduchu", "na šňůře", "v letadle"] kde = ["na zemi", "ve vesmíru", "ve vzduchu", "na šňůře", "v letadle"]
obor = ["M", "F", "I", "O", "B"] obor = ["M", "F", "I", "O", "B"]
reseni = ["to je přece jasné", "triviální", "omlouváme se," reseni = ["to je přece jasné", "triviální", "omlouváme se,"
"otevřený problém", "neřešitelné", "triviálně triviální", "otevřený problém", "neřešitelné", "triviálně triviální",
"použitím věty z prvního semestru na matfyzu", "použitím věty z prvního semestru na matfyzu",
"jednoduše pomocí látky z druhého semestru na matfyzu", "jednoduše pomocí látky z druhého semestru na matfyzu",
"netriviální aplikace diferenciálních rovnic", "zadání je vnitřně" "netriviální aplikace diferenciálních rovnic", "zadání je vnitřně"
"sporné", "nepopsatelně jednoduché", "pokud jste na to nepřišli," "sporné", "nepopsatelně jednoduché", "pokud jste na to nepřišli,"
@ -501,12 +516,12 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori)
nadproblem=tema, nadproblem=tema,
stav=Problem.STAV_ZADANY, stav=Problem.STAV_ZADANY,
zamereni=tema.zamereni, zamereni=tema.zamereni,
autor=tema.autor, autor=tema.autor,
garant=tema.garant, garant=tema.garant,
kod=str(kod), kod=str(kod),
cislo_zadani=cislo, cislo_zadani=cislo,
cislo_reseni=cislo_se_vzorakem, cislo_reseni=cislo_se_vzorakem,
cislo_deadline=cislo_se_vzorakem, cislo_deadline=cislo_se_vzorakem,
max_body = rnd.randint(1, 8) max_body = rnd.randint(1, 8)
) )
@ -569,7 +584,7 @@ def gen_novinky(rnd, organizatori):
novinka = Novinky.objects.create(id=i,autor=rnd.choice(organizatori),text=(text_novinky+", těšíme se na vás!"),zverejneno=rnd.choice([True,False])) novinka = Novinky.objects.create(id=i,autor=rnd.choice(organizatori),text=(text_novinky+", těšíme se na vás!"),zverejneno=rnd.choice([True,False]))
novinka.save() novinka.save()
return return
def otec_syn(otec, syn): def otec_syn(otec, syn):
bratr = otec.first_child bratr = otec.first_child
syn.succ = bratr syn.succ = bratr
@ -588,7 +603,7 @@ def create_test_data(size = 6, rnd = None):
# static URL stranky # static URL stranky
# FIXME: nakopirovat sem vsechny z produkcni databaze # FIXME: nakopirovat sem vsechny z produkcni databaze
s = Site.objects.filter(name="example.com") s = Site.objects.filter(name="example.com")
f = FlatPage.objects.create(url="/", title="Seminář M&M", f = FlatPage.objects.create(url="/", title="Seminář M&M",
content = "<p>V&iacute;tejte na str&aacute;nce semin&aacute;ře MaM!</p>") content = "<p>V&iacute;tejte na str&aacute;nce semin&aacute;ře MaM!</p>")
print(s) print(s)
f.sites.add(s[0]) f.sites.add(s[0])
@ -622,35 +637,35 @@ def create_test_data(size = 6, rnd = None):
# prijemci # prijemci
prijemci = gen_prijemci(rnd, osoby) prijemci = gen_prijemci(rnd, osoby)
global zlinska global zlinska
zlinska.kontaktni_osoba=rnd.choice(osoby) zlinska.kontaktni_osoba=rnd.choice(osoby)
zlinska.save() zlinska.save()
# rocniky # rocniky
rocniky = gen_rocniky(last_rocnik, size) rocniky = gen_rocniky(last_rocnik, size)
# cisla # cisla
# rocnik_cisla je pole polí čísel (typ Cislo), vnitřní pole odpovídají jednotlivým ročníkům. # rocnik_cisla je pole polí čísel (typ Cislo), vnitřní pole odpovídají jednotlivým ročníkům.
rocnik_cisla = gen_cisla(rnd, rocniky) rocnik_cisla = gen_cisla(rnd, rocniky)
# generování obyčejných úloh do čísel # generování obyčejných úloh do čísel
gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size) gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size)
# generování témat, zatím v prvních třech číslech po jednom # generování témat, zatím v prvních třech číslech po jednom
# FIXME: více témat # FIXME: více témat
# rocnik_temata je pole polí trojic (první číslo :int, poslední číslo :int, téma:Tema), přičemž každé vnitřní pole odpovídá ročníku a FIXME: je to takhle fuj a když to někdo vidí poprvé, tak je z toho smutný, protože vůbec neví, co se děje a co má čekat. # rocnik_temata je pole polí trojic (první číslo :int, poslední číslo :int, téma:Tema), přičemž každé vnitřní pole odpovídá ročníku a FIXME: je to takhle fuj a když to někdo vidí poprvé, tak je z toho smutný, protože vůbec neví, co se děje a co má čekat.
rocnik_temata = gen_temata(rnd, rocniky, rocnik_cisla, organizatori) rocnik_temata = gen_temata(rnd, rocniky, rocnik_cisla, organizatori)
# generování úloh k tématům ve všech číslech # generování úloh k tématům ve všech číslech
gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori) gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori)
#generování soustředění #generování soustředění
soustredeni = gen_soustredeni(rnd, resitele, organizatori) soustredeni = gen_soustredeni(rnd, resitele, organizatori)
#generování konfer #generování konfer
konfery = gen_konfery(size, rnd, organizatori, resitele, soustredeni) konfery = gen_konfery(size, rnd, organizatori, resitele, soustredeni)
# TODO: nastavi správně, kolik se čeho generuje, aby rozsahy přibližně odpovídaly # TODO: nastavi správně, kolik se čeho generuje, aby rozsahy přibližně odpovídaly
# FIXME: misto typu ruzne typy objektu a vnoreni do sebe (Tom nechápe, co je tímto fixme míněno) # FIXME: misto typu ruzne typy objektu a vnoreni do sebe (Tom nechápe, co je tímto fixme míněno)
# TODO: vytvorit temata s ruznymi vlakny # TODO: vytvorit temata s ruznymi vlakny

101
seminar/treelib.py

@ -173,23 +173,114 @@ def create_child(parent, type, **kwargs):
new_node.succ = orig_child new_node.succ = orig_child
new_node.save() new_node.save()
def create_node_before(some, arguments, but, i, dont, know, which, yet): def create_node_before(successor, type, **kwargs):
pass if safe_pred(successor) is not None:
# Tohle bude hell. # Easy: přidáme za předchůdce
create_node_after(successor.prev, type, **kwargs)
# Nemáme předchůdce, jsme tedy první z bratrů. Máme otce?
if safe_father_of_first(successor) is not None:
# Ano -> Easy: vyrobíme nového potomka
# NOTE: Tohle je možná trošku abuse implementace výše, ale to nevadí moc...
create_child(successor.father_of_first, type, **kwargs)
# Teď už easy: Jsme sirotci, takže se vyrobíme a našeho následníka si přidáme jako succ
new = type.objects.create(**kwargs)
new.succ = successor
new.save()
# ValueError, pokud je (aspoň) jeden parametr None # ValueError, pokud je (aspoň) jeden parametr None
def swap(node, other): def swap(node, other):
raise NotImplementedError("YAGNI (You aren't gonna need it).") raise NotImplementedError("YAGNI (You aren't gonna need it).")
def swap_pred(node): # Exception, kterou některé metody při špatném použití mohou házet
# Hlavní důvod je možnost informovat o selhání, aby se příslušný problém dal zobrazit na frontendu,
class TreeLibError(RuntimeError):
pass pass
def swap_pred(node):
if node is None:
raise TreeLibError("Nelze přesunout None. Tohle by se nemělo stát.")
pred = safe_pred(node)
if pred is None:
raise TreeLibError("Nelze posunout vlevo, není tam žádný další uzel.")
pre_pred = safe_pred(pred)
succ = node.succ
if pre_pred is not None:
pre_pred.succ = node
pre_pred.save()
node.succ = pred
node.save()
pred.succ = succ
pred.save()
def swap_succ(node): def swap_succ(node):
pass if node is None:
raise TreeLibError("Nelze přesunout None. Tohle by se nemělo stát.")
succ = node.succ
if succ is None:
raise TreeLibError("Nelze posunout vpravo, není tam žádný další uzel")
pred = safe_pred(node)
post_succ = succ.succ
if pred is not None:
pred.succ = succ
pred.save()
succ.succ = node
succ.save()
node.succ = post_succ
node.save()
# Rotace stromu # Rotace stromu
# Dokumentace viz wiki: # Dokumentace viz wiki:
# (lower bude jednoduchá rotace, ne mega, existence jednoduché rotace mi došla až po nakreslení obrázku) # (lower bude jednoduchá rotace, ne mega, existence jednoduché rotace mi došla až po nakreslení obrázku)
def raise_node(node): def raise_node(node):
if node is None:
raise TreeLibError("Nelze přesunout None. Tohle by se nemělo stát.")
# Pojmenování viz WIKI (as of 2020-03-19 01:33:44 GMT+1)
# FIXME: Velmi naivní, chybí error checky
D = node
C = get_parent(D)
E = C.succ
subtree4_head = D.first_child
subtree4_tail = last_brother(subtree4_head)
subtree3P_head = D.succ
subtree3L_head = C.first_child
subtree3L_tail = safe_pred(D)
# Prostor pro motlitbu...
pass pass
# Amen.
C.succ = D
C.save()
D.succ = E
D.save()
subtree3L_tail.succ = None
subtree3L_tail.save()
subtree4_tail.succ = subtree3P.head
subtree4_tail.save()
# To by mělo být všechno...
def lower_node(node): def lower_node(node):
if node is None:
raise TreeLibError("Nelze přesunout None. Tohle by se nemělo stát.")
# Pojmenování viz WIKI (as of 2020-03-19 01:33:44 GMT+1)
# FIXME: Velmi naivní, chybí error checky
C = node
D = C.succ
B = safe_pred(C)
subtree2_head = B.first_child
subtree2_tail = last_brother(subtree2_head)
# Prostor pro motlitbu...
pass pass
# Amen.
B.succ = D
B.save()
subtree2_tail.succ = C
subtree2_tail.save()
# To by mělo být všechno...

2
seminar/urls.py

@ -23,7 +23,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>.<int:cislo>/', views.CisloView.as_view(), name='seminar_cislo'), path('cislo/<int:rocnik>.<int:cislo>/', views.CisloView.as_view(), name='seminar_cislo'), # odkomentované jenom kvůli testování archivu
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'),

327
seminar/views/views_all.py

@ -61,7 +61,7 @@ class VlozBodyView(generic.ListView):
print(self.tema) print(self.tema)
self.problemy = Problem.objects.filter(nadproblem = self.tema) self.problemy = Problem.objects.filter(nadproblem = self.tema)
print(self.problemy) print(self.problemy)
self.reseni = Reseni.objects.filter(problem__in=self.problemy) self.reseni = Reseni.objects.filter(problem__in=self.problemy)
print(self.reseni) print(self.reseni)
return self.reseni return self.reseni
@ -80,7 +80,7 @@ class ObalkovaniView(generic.ListView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(ObalkovaniView, self).get_context_data(**kwargs) context = super(ObalkovaniView, self).get_context_data(**kwargs)
print(self.cislo) print(self.cislo)
context['cislo'] = self.cislo context['cislo'] = self.cislo
return context return context
class TNLData(object): class TNLData(object):
@ -285,7 +285,6 @@ class CojemamOrganizatoriStariView(generic.ListView):
### Archiv ### Archiv
class ArchivView(generic.ListView): class ArchivView(generic.ListView):
model = Rocnik model = Rocnik
template_name='seminar/archiv/cisla.html' template_name='seminar/archiv/cisla.html'
@ -296,13 +295,16 @@ class ArchivView(generic.ListView):
vyska = 297 # px vyska = 297 # px
sirka = 210 # px sirka = 210 # px
# nejnovějších 10 zveřejněných čísel
cisla = Cislo.objects.filter(verejne_db=True)[:10] cisla = Cislo.objects.filter(verejne_db=True)[:10]
# op = os.path, udělá z argumentů cestu
png_dir = op.join(settings.MEDIA_ROOT, "cislo", "png") png_dir = op.join(settings.MEDIA_ROOT, "cislo", "png")
# seznam [(url obrázku, číslo)] # seznam [(url obrázku, číslo)]
urls = [] urls = []
# c je číslo, i je pořadí čísla
for i, c in enumerate(cisla): for i, c in enumerate(cisla):
if not c.pdf: if not c.pdf:
continue continue
@ -394,90 +396,140 @@ def sloupec_s_poradim(seznam_s_body):
sloupec_s_poradim.append("{}.".format(aktualni_poradi)) sloupec_s_poradim.append("{}.".format(aktualni_poradi))
# pokud je skupina větší, vypíšu rozsah # pokud je skupina větší, vypíšu rozsah
else: else:
sloupec_s_poradim.append("{}.–{}.".format(aktualni_poradi, sloupec_s_poradim.append("{}.–{}.".format(aktualni_poradi,
aktualni_poradi+velikost_skupiny-1)) aktualni_poradi+velikost_skupiny-1))
# zvětšíme aktuální pořadí o tolik, kolik pozic bylo přeskočeno # zvětšíme aktuální pořadí o tolik, kolik pozic bylo přeskočeno
aktualni_poradi = aktualni_poradi + velikost_skupiny aktualni_poradi = aktualni_poradi + velikost_skupiny
return sloupec_s_poradim return sloupec_s_poradim
# spočítá součet bodů získaných daným řešitelem za zadaný problém a všechny jeho podproblémy ## spočítá součet bodů získaných daným řešitelem za zadaný problém a všechny jeho podproblémy
def __soucet_resitele_problemu(problem, resitel, cislo, soucet): #def __soucet_resitele_problemu(problem, resitel, cislo, soucet):
# sečteme body za daný problém přes všechna řešení daného problému # # sečteme body za daný problém přes všechna řešení daného problému
# od daného řešitele # # od daného řešitele
reseni_resitele = problem.hodnoceni_set.filter(reseni__resitele=resitel, # reseni_resitele = s.Reseni_Resitele.objects.filter(resitele=resitel)
cislo_body=cislo) # hodnoceni_resitele = problem.hodnoceni.filter(reseni__in=reseni_resitele,
# XXX chyba na řádku výše - řešení může mít více řešitelů, asi chceme contains # cislo_body=cislo)
# nebo in # # XXX chyba na řádku výše - řešení může mít více řešitelů, asi chceme contains
for r in reseni_resitele: # # nebo in
soucet += r.body # for r in hodnoceni_resitele:
# soucet += r.body
# a přičteme k tomu hodnocení všech podproblémů #
for p in problem.podproblem.all(): # # a přičteme k tomu hodnocení všech podproblémů
# i přes jméno by to měla být množina jeho podproblémů # for p in problem.podproblem.all():
soucet += __soucet_resitele_problemu(p, resitel, soucet) # # i přes jméno by to měla být množina jeho podproblémů
return soucet # soucet += __soucet_resitele_problemu(p, resitel, soucet)
# return soucet
# spočítá součet všech bodů ze všech podproblémů daného problému daného řešitele
def body_resitele_problemu_v_cisle(problem, resitel, cislo): ## spočítá součet všech bodů ze všech podproblémů daného problému daného řešitele
# probably FIXED: nezohledňuje číslo, do kterého se body počítají #def body_resitele_problemu_v_cisle(problem, resitel, cislo):
return __soucet_resitele_problemu(problem, resitel, cislo, 0) # # probably FIXED: nezohledňuje číslo, do kterého se body počítají
# return __soucet_resitele_problemu(problem, resitel, cislo, 0)
# pro daný problém vrátí jeho nejvyšší nadproblém
def hlavni_problem(problem):
while not(problem.nadproblem == None):
problem = problem.nadproblem
return problem
# vrátí list všech problémů s body v daném čísle, které již nemají nadproblém # vrátí list všech problémů s body v daném čísle, které již nemají nadproblém
def hlavni_problemy_cisla(cislo): def hlavni_problemy_cisla(cislo):
hodnoceni = cislo.hodnoceni.select_related('problem', 'reseni').all() # hodnocení, která se vážou k danému číslu hodnoceni = cislo.hodnoceni.select_related('problem', 'reseni').all() # hodnocení, která se vážou k danému číslu
reseni = [h.reseni for h in hodnoceni] reseni = [h.reseni for h in hodnoceni]
problemy = [h.problem for h in hodnoceni] problemy = [h.problem for h in hodnoceni]
problemy_set = set(problemy) # chceme každý problém unikátně, problemy_set = set(problemy) # chceme každý problém unikátně,
problemy = (list(problemy_set)) # převedení na množinu a zpět to zaručí problemy = (list(problemy_set)) # převedení na množinu a zpět to zaručí
# hlavní problémy čísla # hlavní problémy čísla
# (mají vlastní sloupeček ve výsledkovce, nemají nadproblém) # (mají vlastní sloupeček ve výsledkovce, nemají nadproblém)
hlavni_problemy = [] hlavni_problemy = []
for p in problemy: for p in problemy:
while not(p.nadproblem == None): hlavni_problemy.append(hlavni_problem(p))
p = p.nadproblem
hlavni_problemy.append(p)
# zunikátnění # zunikátnění
hlavni_problemy_set = set(hlavni_problemy) hlavni_problemy_set = set(hlavni_problemy)
hlavni_problemy = list(hlavni_problemy_set) hlavni_problemy = list(hlavni_problemy_set)
hlavni_problemy.sort(key=lambda k: k.kod_v_rocniku()) # setřídit podle t1, t2, c3, ... hlavni_problemy.sort(key=lambda k: k.kod_v_rocniku()) # setřídit podle t1, t2, c3, ...
return hlavni_problemy return hlavni_problemy
def body_resitele_odjakziva(resitel): # vrátí slovník řešitel:body obsahující počty bodů zadaných řešitelů za daný ročník
body = 0 # POZOR! Aktuálně počítá jen za posledních 10 let od zadaného ročníku
resitelova_hodnoceni = Hodnoceni.objects.select_related('body').all().filter(reseni_resitele=resitel) def body_resitelu_odjakziva(rocnik, resitele):
# TODO: v radku nahore chceme _in nebo _contains body_odjakziva = {}
for hodnoceni in resitelova_hodnoceni:
body = body + hodnoceni.body for r in resitele:
return body body_odjakziva[str(r.id)] = 0
# # Body za posledních 10 let je dobrá aproximace pro naše potřeby (výsledkovka
# # s aktivními řešiteli)
#
# body_pred_roky = []
# for i in range(0, 10):
# body_pred_roky.append(body_resitelu_za_rocnik(rocnik-i, resitele))
#
# for r in resitele:
# for i in range(0,10):
# body_odjakziva[str(r.id)] += body_pred_roky[i][str(r.id)]
# Nasledující řešení je sice správné, ale moc pomalé:
for res in Reseni.objects.prefetch_related('resitele', 'hodnoceni').all():
for r in res.resitele.all():
# daný řešitel nemusí být v naší podmnožině
if r not in resitele: continue
for hodn in res.hodnoceni.all():
pricti_body(body_odjakziva, r, hodn.body)
return body_odjakziva
# vrátí slovník řešitel:body obsahující počty bodů zadaných řešitelů za daný ročník
def body_resitelu_za_rocnik(rocnik, aktivni_resitele):
body_za_rocnik = {}
# inicializujeme na 0 pro všechny aktivní řešitele
for ar in aktivni_resitele:
body_za_rocnik[str(ar.id)] = 0
# spočítáme body řešitelům přes všechna řešení s hodnocením v daném ročníku
reseni = Reseni.objects.prefetch_related('resitele', 'hodnoceni').filter(hodnoceni__cislo_body__rocnik=rocnik)
for res in reseni:
for resitel in res.resitele.all():
for hodn in res.hodnoceni.all():
pricti_body(body_za_rocnik, resitel, hodn.body)
return body_za_rocnik
#def body_resitele_odjakziva(resitel):
# body = 0
# resitelova_hodnoceni = Hodnoceni.objects.select_related('body').all().filter(reseni_resitele=resitel)
# # TODO: v radku nahore chceme _in nebo _contains
# for hodnoceni in resitelova_hodnoceni:
# body = body + hodnoceni.body
# return body
# spočítá součet všech bodů řešitele za dané číslo # spočítá součet všech bodů řešitele za dané číslo
def body_resitele_v_cisle(resitel, cislo): #def body_resitele_v_cisle(resitel, cislo):
hlavni_problemy = hlavni_problemy_cisla(cislo) # hlavni_problemy = hlavni_problemy_cisla(cislo)
body_resitele = 0 # body_resitele = 0
for h in hlavni_problemy: # for h in hlavni_problemy:
body_resitele = body_resitele + body_resitele_problemu_v_cisle(h, resitel, cislo) # body_resitele = body_resitele + body_resitele_problemu_v_cisle(h, resitel, cislo)
# TODO: je rozdíl mezi odevzdanou úlohou za 0 a tím, když řešitel nic neodevzdal # # TODO: je rozdíl mezi odevzdanou úlohou za 0 a tím, když řešitel nic neodevzdal
# řešit přes kontrolu velikosti množiny řešení daného problému do daného čísla? # # řešit přes kontrolu velikosti množiny řešení daného problému do daného čísla?
# Tady to ale nevadí, tady se počítá součet za číslo. # # Tady to ale nevadí, tady se počítá součet za číslo.
return body_resitele # return body_resitele
# spočítá součet všech bodů řešitele za daný rok (nebo jen do daného čísla včetně) # spočítá součet všech bodů řešitele za daný rok (nebo jen do daného čísla včetně)
def body_resitele_v_rocniku(resitel, rocnik, do_cisla=None): #def body_resitele_v_rocniku(resitel, rocnik, do_cisla=None):
# pokud do_cisla=None, tak do posledního čísla v ročníku # # pokud do_cisla=None, tak do posledního čísla v ročníku
# do_cisla je objekt Cislo # # do_cisla je objekt Cislo
cisla = rocnik.cisla.all() # funkce vrátí pole objektů # cisla = rocnik.cisla.all() # funkce vrátí pole objektů
# Cislo už lexikograficky setřízené, viz models # # Cislo už lexikograficky setřízené, viz models
body = 0 # body = 0
for cislo in cisla: # for cislo in cisla:
if cislo.poradi == do_cisla.poradi: break # if cislo.poradi == do_cisla.poradi: break
# druhá část zaručuje, že máme výsledky do daného čísla včetně # # druhá část zaručuje, že máme výsledky do daného čísla včetně
body = body + body_resitele_v_cisle(resitel, cislo) # body = body + body_resitele_v_cisle(resitel, cislo)
return body # return body
# TODO: předělat na nový model
#def vysledkovka_rocniku(rocnik, jen_verejne=True): #def vysledkovka_rocniku(rocnik, jen_verejne=True):
# """Přebírá ročník (např. context["rocnik"]) a vrací výsledkovou listinu ve # """Přebírá ročník (např. context["rocnik"]) a vrací výsledkovou listinu ve
# formě vhodné pro šablonu "seminar/vysledkovka_rocniku.html" # formě vhodné pro šablonu "seminar/vysledkovka_rocniku.html"
@ -559,7 +611,8 @@ class RocnikView(generic.DetailView):
#context['vysledkovka'] = vysledkovka_rocniku(context["rocnik"]) #context['vysledkovka'] = vysledkovka_rocniku(context["rocnik"])
#context['vysledkovka_s_neverejnymi'] = vysledkovka_rocniku(context["rocnik"], jen_verejne=False) #context['vysledkovka_s_neverejnymi'] = vysledkovka_rocniku(context["rocnik"], jen_verejne=False)
context['temata_v_rocniku'] = verejna_temata(context["rocnik"]) #context['temata_v_rocniku'] = verejna_temata(context["rocnik"])
# FIXME: opravit vylistování témat v ročníku
return context return context
@ -583,19 +636,30 @@ class ProblemView(generic.DetailView):
return context return context
class VysledkyResitele(object): class RadekVysledkovky(object):
"""Pro daného řešitele ukládá počet bodů za jednotlivé úlohy a celkový """Obsahuje věci, které se hodí vědět při konstruování výsledkovky.
počet bodů za konkrétní ročník do daného čísla a za dané číslo.""" Umožňuje snazší práci v templatu (lepší, než seznam)."""
def __init__(self, resitel, cislo, rocnik): def __init__(self, poradi, resitel, body_problemy_sezn,
body_cislo, body_rocnik, body_odjakziva):
self.resitel = resitel self.resitel = resitel
self.cislo = cislo self.body_cislo = body_cislo
self.body_cislo = body_resitele_v_cisle(resitel, cislo) self.body_rocnik = body_rocnik
self.body = [] self.body_celkem_odjakziva = body_odjakziva
self.rocnik = rocnik self.poradi = poradi
self.body_rocnik = body_resitele_v_rocniku(resitel, rocnik, cislo) self.body_problemy_sezn = body_problemy_sezn
self.body_celkem_odjakziva = resitel.vsechny_body()
self.poradi = 0
# přiřazuje danému řešiteli body do slovníku
def pricti_body(slovnik, resitel, body):
# testujeme na None (""), pokud je to první řešení
# daného řešitele, předěláme na 0
# (v dalším kroku přičteme reálný počet bodů),
# rozlišujeme tím mezi 0 a neodevzdaným řešením
if slovnik[str(resitel.id)] == "":
slovnik[str(resitel.id)] = 0
slovnik[str(resitel.id)] += body
class CisloView(generic.DetailView): class CisloView(generic.DetailView):
model = Cislo model = Cislo
@ -619,48 +683,103 @@ class CisloView(generic.DetailView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(CisloView, self).get_context_data(**kwargs) context = super(CisloView, self).get_context_data(**kwargs)
## TODO upravit dle nového modelu
cislo = context['cislo'] cislo = context['cislo']
hlavni_problemy = hlavni_problemy_cisla(cislo) hlavni_problemy = hlavni_problemy_cisla(cislo)
# TODO setřídit hlavní problémy čísla podle id, ať jsou ve stejném pořadí pokaždé
# pro každý hlavní problém zavedeme slovník s body za daný hlavní problém
# pro jednotlivé řešitele (slovník slovníků hlavních problémů)
hlavni_problemy_slovnik = {}
for hp in hlavni_problemy:
hlavni_problemy_slovnik[str(hp.id)] = {}
## TODO dostat pro tyto problémy součet v daném čísle pro daného řešitele ## TODO dostat pro tyto problémy součet v daném čísle pro daného řešitele
## TODO možná chytřeji vybírat aktivní řešitele ## TODO možná chytřeji vybírat aktivní řešitele
## chceme letos něco poslal # aktivní řešitelé - chceme letos něco poslal, TODO později vyfiltrujeme ty, kdo mají
aktivni_resitele = Resitel.objects.filter( # u alespoň jedné hodnoty něco jiného než NULL
rok_maturity__gte=cislo.rocnik.druhy_rok()) aktivni_resitele = list(Resitel.objects.filter(
rok_maturity__gte=cislo.rocnik.druhy_rok()))
# TODO: zkusit hodnoceni__rocnik... # TODO: zkusit hodnoceni__rocnik...
#.filter(hodnoceni_set__rocnik__eq=cislo_rocnik) #.filter(hodnoceni_set__rocnik__eq=cislo_rocnik)
radky_vysledkovky = [] # zakládání prázdných záznamů pro řešitele
cislobody = {}
for ar in aktivni_resitele: for ar in aktivni_resitele:
# získáme výsledky řešitele - součty přes číslo a ročník # řešitele převedeme na řetězec pomocí unikátního id
vr = VysledkyResitele(ar, cislo, cislo.rocnik) cislobody[str(ar.id)] = ""
for hp in hlavni_problemy: for hp in hlavni_problemy:
vr.body.append( slovnik = hlavni_problemy_slovnik[str(hp.id)]
body_resitele_problemu_v_cisle(hp, ar, cislo)) slovnik[str(ar.id)] = ""
radky_vysledkovky.append(vr)
# setřídíme řádky výsledkovky/objekty VysledkyResitele podle bodů
radky_vysledkovky.sort(key=lambda vr: vr.body_rocnik, reverse=True)
# generujeme sloupec s pořadím pomocí stejně zvané funkce
pocty_bodu = [rv.body_rocnik for rv in radky_vysledkovky]
sloupec_poradi = sloupec_s_poradim(pocty_bodu)
# každému řádku výsledkovky přidáme jeho pořadí # vezmeme všechna řešení s body do daného čísla
i = 0 reseni_do_cisla = Reseni.objects.prefetch_related('problem', 'hodnoceni', 'resitele').filter(hodnoceni__cislo_body=cislo)
for rv in radky_vysledkovky:
rv.poradi = sloupec_poradi[i] # projdeme všechna řešení do čísla a přičteme body každému řešiteli do celkových
i = i + 1 # bodů i do bodů za problém
for reseni in reseni_do_cisla:
# řešení může řešit více problémů
for prob in list(reseni.problem.all()):
nadproblem = hlavni_problem(prob)
nadproblem_slovnik = hlavni_problemy_slovnik[str(nadproblem.id)]
# a více hodnocení
for hodn in list(reseni.hodnoceni.all()):
body = hodn.body
# a více řešitelů
for resitel in list(reseni.resitele.all()):
pricti_body(cislobody, resitel, body)
pricti_body(nadproblem_slovnik, resitel, body)
# zeptáme se na dvojice (řešitel, body) za ročník a setřídíme sestupně
resitel_rocnikbody_slov = body_resitelu_za_rocnik(cislo.rocnik, aktivni_resitele)
resitel_rocnikbody_sezn = sorted(resitel_rocnikbody_slov.items(),
key = lambda x: x[1], reverse = True)
# získáme body odjakživa
resitel_odjakzivabody_slov = body_resitelu_odjakziva(cislo.rocnik.druhy_rok(),
aktivni_resitele)
# řešitelé setřídění podle bodů za číslo sestupně
setrizeni_resitele_id = [dvojice[0] for dvojice in resitel_rocnikbody_sezn]
setrizeni_resitele = [Resitel.objects.get(id=i) for i in setrizeni_resitele_id]
# vytvoříme jednotlivé sloupce výsledkovky
radky_vysledkovky = []
odjakziva_body = []
rocnik_body = []
cislo_body = []
hlavni_problemy_body = []
for ar_id in setrizeni_resitele_id:
# vytáhneme ze slovníků body pro daného řešitele
odjakziva_body.append(resitel_odjakzivabody_slov[ar_id])
rocnik_body.append(resitel_rocnikbody_slov[ar_id])
cislo_body.append(cislobody[ar_id])
problemy = []
for hp in hlavni_problemy:
problemy.append(hlavni_problemy_slovnik[str(hp.id)][ar_id])
hlavni_problemy_body.append(problemy)
print("{}: body za problémy - {}, číslobody - {}, ročníkbody - {}, odjakživabody - ".format(ar_id, problemy, cislobody[ar_id], resitel_rocnikbody_slov[ar_id]))
# pořadí určíme pomocí funkce, které dáme celkové body za ročník vzestupně
poradi = sloupec_s_poradim(rocnik_body)
radky_vysledkovky = []
for i in range(0, len(setrizeni_resitele_id)):
radek = RadekVysledkovky(poradi[i], setrizeni_resitele[i],
hlavni_problemy_body[i], cislo_body[i], rocnik_body[i],
odjakziva_body[i])
radky_vysledkovky.append(radek)
print("Přikládám {}-tý řádek.".format(i))
print("Následuje předávání do kontextu.")
# vytahané informace předáváme do kontextu # vytahané informace předáváme do kontextu
context['cislo'] = cislo context['cislo'] = cislo
context['radky_vysledkovky'] = radky_vysledkovky context['radky_vysledkovky'] = radky_vysledkovky
context['problemy'] = hlavni_problemy context['problemy'] = hlavni_problemy
# context['v_cisle_zadane'] = TODO # context['v_cisle_zadane'] = TODO
# context['resene_problemy'] = resene_problemy # context['resene_problemy'] = resene_problemy
#XXX testovat #XXX nefungují body odjakživa - asi typový problém
#XXX opravit to, že se nezobrazují body za jednotlivé úlohy #XXX nefungují tituly - možná korelace s výše uvedeným problémem
print("Předávám kontext.")
return context return context
# problemy = sorted(set(r.problem for r in reseni), key=lambda x:(poradi_typu[x.typ], x.kod_v_rocniku())) # problemy = sorted(set(r.problem for r in reseni), key=lambda x:(poradi_typu[x.typ], x.kod_v_rocniku()))
@ -1174,7 +1293,7 @@ def loginView(request):
if request.method == 'POST': if request.method == 'POST':
form = LoginForm(request.POST) form = LoginForm(request.POST)
if form.is_valid(): if form.is_valid():
user = authenticate(request, user = authenticate(request,
username=form.cleaned_data['username'], username=form.cleaned_data['username'],
password=form.cleaned_data['password']) password=form.cleaned_data['password'])
print(form.cleaned_data) print(form.cleaned_data)
@ -1182,8 +1301,8 @@ def loginView(request):
login(request,user) login(request,user)
return HttpResponseRedirect('/') return HttpResponseRedirect('/')
else: else:
return render(request, return render(request,
'seminar/login.html', 'seminar/login.html',
{'form': form, 'login_error': 'Neplatné jméno nebo heslo'}) {'form': form, 'login_error': 'Neplatné jméno nebo heslo'})
else: else:
@ -1201,7 +1320,7 @@ def logoutView(request):
def prihlaska_log_gdpr_safe(logger, gdpr_logger, msg, form_data): def prihlaska_log_gdpr_safe(logger, gdpr_logger, msg, form_data):
msg = "{}, form_hash:{}".format(msg,hash(form_data)) msg = "{}, form_hash:{}".format(msg,hash(form_data))
logger.warn(msg) logger.warn(msg)
gdpr_logger.warn(msg+", form:{}".format(form_data)) gdpr_logger.warn(msg+", form:{}".format(form_data))
from django.forms.models import model_to_dict from django.forms.models import model_to_dict
def resitelEditView(request): def resitelEditView(request):
@ -1211,7 +1330,7 @@ def resitelEditView(request):
osoba_edit = Osoba.objects.get(user=u) osoba_edit = Osoba.objects.get(user=u)
resitel_edit = osoba_edit.resitel resitel_edit = osoba_edit.resitel
user_edit = osoba_edit.user user_edit = osoba_edit.user
## Vytvoření slovníku, kterým předvyplním formulář ## Vytvoření slovníku, kterým předvyplním formulář
prefill_1=model_to_dict(user_edit) prefill_1=model_to_dict(user_edit)
prefill_2=model_to_dict(resitel_edit) prefill_2=model_to_dict(resitel_edit)
prefill_3=model_to_dict(osoba_edit) prefill_3=model_to_dict(osoba_edit)
@ -1269,7 +1388,7 @@ def prihlaskaView(request):
fcd = form.cleaned_data fcd = form.cleaned_data
form_hash = hash(fcd) form_hash = hash(fcd)
form_logger.info(fcd,form_hash=form_hash) form_logger.info(fcd,form_hash=form_hash)
with transaction.atomic(): with transaction.atomic():
u = User.objects.create_user( u = User.objects.create_user(
username=fcd['username'], username=fcd['username'],
@ -1308,7 +1427,7 @@ def prihlaskaView(request):
rok_maturity = fcd['rok_maturity'], rok_maturity = fcd['rok_maturity'],
zasilat = fcd['zasilat'] zasilat = fcd['zasilat']
) )
r.save() r.save()
r.osoba = o r.osoba = o
if fcd.get('skola'): if fcd.get('skola'):

Loading…
Cancel
Save