Jonas Havelka
1 year ago
8 changed files with 0 additions and 1249 deletions
@ -1,3 +0,0 @@ |
|||||
Tahle slozka obsahuje vsechny detaily a popisy, jak nasadit "druhou verzi" M&M webu. |
|
||||
|
|
||||
TODO: chybi tu popis na zprovozneni flatpages, na loaddata &c. |
|
Binary file not shown.
@ -1,652 +0,0 @@ |
|||||
[ |
|
||||
{ |
|
||||
"codename": "org", |
|
||||
"ct_app_label": "auth", |
|
||||
"ct_model": "user" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_flatpage", |
|
||||
"ct_app_label": "flatpages", |
|
||||
"ct_model": "flatpage" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_flatpage", |
|
||||
"ct_app_label": "flatpages", |
|
||||
"ct_model": "flatpage" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_flatpage", |
|
||||
"ct_app_label": "flatpages", |
|
||||
"ct_model": "flatpage" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_flatpage", |
|
||||
"ct_app_label": "flatpages", |
|
||||
"ct_model": "flatpage" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_galerie", |
|
||||
"ct_app_label": "galerie", |
|
||||
"ct_model": "galerie" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_galerie", |
|
||||
"ct_app_label": "galerie", |
|
||||
"ct_model": "galerie" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_galerie", |
|
||||
"ct_app_label": "galerie", |
|
||||
"ct_model": "galerie" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_galerie", |
|
||||
"ct_app_label": "galerie", |
|
||||
"ct_model": "galerie" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_obrazek", |
|
||||
"ct_app_label": "galerie", |
|
||||
"ct_model": "obrazek" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_obrazek", |
|
||||
"ct_app_label": "galerie", |
|
||||
"ct_model": "obrazek" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_obrazek", |
|
||||
"ct_app_label": "galerie", |
|
||||
"ct_model": "obrazek" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_obrazek", |
|
||||
"ct_app_label": "galerie", |
|
||||
"ct_model": "obrazek" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_komentar", |
|
||||
"ct_app_label": "korektury", |
|
||||
"ct_model": "komentar" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_komentar", |
|
||||
"ct_app_label": "korektury", |
|
||||
"ct_model": "komentar" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_komentar", |
|
||||
"ct_app_label": "korektury", |
|
||||
"ct_model": "komentar" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_komentar", |
|
||||
"ct_app_label": "korektury", |
|
||||
"ct_model": "komentar" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_korekturovanepdf", |
|
||||
"ct_app_label": "korektury", |
|
||||
"ct_model": "korekturovanepdf" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_korekturovanepdf", |
|
||||
"ct_app_label": "korektury", |
|
||||
"ct_model": "korekturovanepdf" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_korekturovanepdf", |
|
||||
"ct_app_label": "korektury", |
|
||||
"ct_model": "korekturovanepdf" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_korekturovanepdf", |
|
||||
"ct_app_label": "korektury", |
|
||||
"ct_model": "korekturovanepdf" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_oprava", |
|
||||
"ct_app_label": "korektury", |
|
||||
"ct_model": "oprava" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_oprava", |
|
||||
"ct_app_label": "korektury", |
|
||||
"ct_model": "oprava" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_oprava", |
|
||||
"ct_app_label": "korektury", |
|
||||
"ct_model": "oprava" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_oprava", |
|
||||
"ct_app_label": "korektury", |
|
||||
"ct_model": "oprava" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_hlasovani", |
|
||||
"ct_app_label": "prednasky", |
|
||||
"ct_model": "hlasovani" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_hlasovani", |
|
||||
"ct_app_label": "prednasky", |
|
||||
"ct_model": "hlasovani" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_hlasovani", |
|
||||
"ct_app_label": "prednasky", |
|
||||
"ct_model": "hlasovani" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_hlasovani", |
|
||||
"ct_app_label": "prednasky", |
|
||||
"ct_model": "hlasovani" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_prednaska", |
|
||||
"ct_app_label": "prednasky", |
|
||||
"ct_model": "prednaska" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_prednaska", |
|
||||
"ct_app_label": "prednasky", |
|
||||
"ct_model": "prednaska" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_prednaska", |
|
||||
"ct_app_label": "prednasky", |
|
||||
"ct_model": "prednaska" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_prednaska", |
|
||||
"ct_app_label": "prednasky", |
|
||||
"ct_model": "prednaska" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_seznam", |
|
||||
"ct_app_label": "prednasky", |
|
||||
"ct_model": "seznam" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_seznam", |
|
||||
"ct_app_label": "prednasky", |
|
||||
"ct_model": "seznam" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_seznam", |
|
||||
"ct_app_label": "prednasky", |
|
||||
"ct_model": "seznam" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_seznam", |
|
||||
"ct_app_label": "prednasky", |
|
||||
"ct_model": "seznam" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_cislo", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "cislo" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_cislo", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "cislo" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_cislo", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "cislo" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_cislo", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "cislo" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_clanek", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "clanek" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_clanek", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "clanek" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_clanek", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "clanek" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_clanek", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "clanek" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_konfera", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "konfera" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_konfera", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "konfera" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_konfera", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "konfera" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_konfera", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "konfera" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_konfery_ucastnici", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "konfery_ucastnici" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_konfery_ucastnici", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "konfery_ucastnici" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_konfery_ucastnici", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "konfery_ucastnici" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_konfery_ucastnici", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "konfery_ucastnici" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_nastaveni", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "nastaveni" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_nastaveni", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "nastaveni" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_nastaveni", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "nastaveni" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_nastaveni", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "nastaveni" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_novinky", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "novinky" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_novinky", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "novinky" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_novinky", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "novinky" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_novinky", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "novinky" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_organizator", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "organizator" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_organizator", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "organizator" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_organizator", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "organizator" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_organizator", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "organizator" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_osoba", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "osoba" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_osoba", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "osoba" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_osoba", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "osoba" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_osoba", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "osoba" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_pohadka", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "pohadka" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_pohadka", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "pohadka" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_pohadka", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "pohadka" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_pohadka", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "pohadka" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_prijemce", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "prijemce" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_prijemce", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "prijemce" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_prijemce", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "prijemce" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_prijemce", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "prijemce" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_problem", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "problem" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_problem", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "problem" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_problem", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "problem" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_problem", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "problem" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_resitel", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "resitel" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_resitel", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "resitel" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_resitel", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "resitel" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_resitel", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "resitel" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_rocnik", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "rocnik" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_rocnik", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "rocnik" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_rocnik", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "rocnik" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_rocnik", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "rocnik" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_skola", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "skola" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_skola", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "skola" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_skola", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "skola" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_skola", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "skola" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_soustredeni", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "soustredeni" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_soustredeni", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "soustredeni" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_soustredeni", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "soustredeni" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_soustredeni", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "soustredeni" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_soustredeni_organizatori", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "soustredeni_organizatori" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_soustredeni_organizatori", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "soustredeni_organizatori" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_soustredeni_organizatori", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "soustredeni_organizatori" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_soustredeni_organizatori", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "soustredeni_organizatori" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_soustredeni_ucastnici", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "soustredeni_ucastnici" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_soustredeni_ucastnici", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "soustredeni_ucastnici" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_soustredeni_ucastnici", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "soustredeni_ucastnici" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_soustredeni_ucastnici", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "soustredeni_ucastnici" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_tema", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "tema" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_tema", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "tema" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_tema", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "tema" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_tema", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "tema" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_uloha", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "uloha" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_uloha", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "uloha" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_uloha", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "uloha" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_uloha", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "uloha" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_tag", |
|
||||
"ct_app_label": "taggit", |
|
||||
"ct_model": "tag" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_tag", |
|
||||
"ct_app_label": "taggit", |
|
||||
"ct_model": "tag" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_tag", |
|
||||
"ct_app_label": "taggit", |
|
||||
"ct_model": "tag" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_tag", |
|
||||
"ct_app_label": "taggit", |
|
||||
"ct_model": "tag" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_taggeditem", |
|
||||
"ct_app_label": "taggit", |
|
||||
"ct_model": "taggeditem" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_taggeditem", |
|
||||
"ct_app_label": "taggit", |
|
||||
"ct_model": "taggeditem" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "delete_taggeditem", |
|
||||
"ct_app_label": "taggit", |
|
||||
"ct_model": "taggeditem" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_taggeditem", |
|
||||
"ct_app_label": "taggit", |
|
||||
"ct_model": "taggeditem" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_fotkaheader", |
|
||||
"ct_app_label": "header_fotky", |
|
||||
"ct_model": "fotkaheader" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_fotkaheader", |
|
||||
"ct_app_label": "header_fotky", |
|
||||
"ct_model": "fotkaheader" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_fotkaheader", |
|
||||
"ct_app_label": "header_fotky", |
|
||||
"ct_model": "fotkaheader" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_fotkaurlvazba", |
|
||||
"ct_app_label": "header_fotky", |
|
||||
"ct_model": "fotkaurlvazba" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_fotkaurlvazba", |
|
||||
"ct_app_label": "header_fotky", |
|
||||
"ct_model": "fotkaurlvazba" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_fotkaurlvazba", |
|
||||
"ct_app_label": "header_fotky", |
|
||||
"ct_model": "fotkaurlvazba" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "add_deadline", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "deadline" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "change_deadline", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "deadline" |
|
||||
}, |
|
||||
{ |
|
||||
"codename": "view_deadline", |
|
||||
"ct_app_label": "seminar", |
|
||||
"ct_model": "deadline" |
|
||||
} |
|
||||
] |
|
@ -1,513 +0,0 @@ |
|||||
#!/usr/bin/env python3 |
|
||||
|
|
||||
import psycopg2 |
|
||||
import psycopg2.extras |
|
||||
|
|
||||
OLD_DB = "mam_old" |
|
||||
NEW_DB = "mamweb" |
|
||||
|
|
||||
oldconn = psycopg2.connect(f"dbname={OLD_DB}") |
|
||||
newconn = psycopg2.connect(f"dbname={NEW_DB}") |
|
||||
|
|
||||
oldcur = oldconn.cursor(cursor_factory=psycopg2.extras.DictCursor) |
|
||||
newcur = newconn.cursor(cursor_factory=psycopg2.extras.DictCursor) |
|
||||
|
|
||||
|
|
||||
# Uses global variables oldcur, newcur! |
|
||||
def execute_simple(old_query, new_query=None): |
|
||||
if new_query is None: |
|
||||
new_query = old_query |
|
||||
|
|
||||
oldcur.execute(old_query) |
|
||||
newcur.execute(new_query) |
|
||||
|
|
||||
if oldcur.rowcount != newcur.rowcount: |
|
||||
raise ValueError(f"Queries '{old_query}' and '{new_query}' returned different number of rows ({oldcur.rowcount} and {newcur.rowcount})") |
|
||||
|
|
||||
return(oldcur.fetchall(), newcur.fetchall()) |
|
||||
|
|
||||
def check_same(old_row, new_row, old_fields, new_fields=None): |
|
||||
if type(old_fields) != list: |
|
||||
old_fields = [old_fields] |
|
||||
|
|
||||
if new_fields is None: |
|
||||
new_fields = old_fields |
|
||||
|
|
||||
fields = zip(old_fields, new_fields) |
|
||||
|
|
||||
for old_field, new_field in fields: |
|
||||
if old_row[old_field] == new_row[new_field]: |
|
||||
continue |
|
||||
raise ValueError(f"Fields '{old_field}'({old_row[old_field]}) and '{new_field}'({new_row[new_field]}) differs for rows \n'{old_row}' and \n'{new_row}'") |
|
||||
return True |
|
||||
|
|
||||
def get_user_id_for_org_id(org_id): |
|
||||
query = """SELECT auth_user.id FROM auth_user |
|
||||
INNER JOIN seminar_osoby ON seminar_osoby.user_id = auth_user.id |
|
||||
INNER JOIN seminar_organizator ON seminar_organizator.osoba_id = seminar_osoby.id |
|
||||
WHERE seminar_organizator.id = %s """ |
|
||||
|
|
||||
newcur.execute(query,(org_id,)) |
|
||||
return newcur.fetchone()['id'] |
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
def check_skola(): |
|
||||
old_query = "SELECT * FROM seminar_skoly ORDER BY id" |
|
||||
|
|
||||
old_res, new_res = execute_simple(old_query) |
|
||||
res = zip(old_res,new_res) |
|
||||
|
|
||||
for o,n in res: |
|
||||
check_same(o,n,['id','aesop_id','izo','nazev','kratky_nazev','ulice','mesto','psc','stat','je_zs','je_ss','poznamka']) |
|
||||
|
|
||||
def check_resitel(): |
|
||||
old_query = 'SELECT * FROM seminar_resitele ORDER BY id' |
|
||||
new_query = '''SELECT seminar_resitele.id, skola_id, rok_maturity, zasilat, seminar_resitele.poznamka, |
|
||||
o.jmeno AS jmeno, o.prijmeni AS prijmeni, o.user_id AS user_id, o.pohlavi_muz AS pohlavi_muz, o.email AS email, o.telefon AS telefon, o.datum_narozeni AS datum_narozeni, |
|
||||
o.datum_souhlasu_udaje AS datum_souhlasu_udaje, o.datum_souhlasu_zasilani AS datum_souhlasu_zasilani, o.datum_registrace AS datum_prihlaseni, o.ulice AS ulice, o.mesto AS mesto, o.psc AS psc, o.stat AS stat |
|
||||
FROM seminar_resitele JOIN seminar_osoby AS o ON seminar_resitele.osoba_id = o.id ORDER BY seminar_resitele.id''' |
|
||||
|
|
||||
old_res, new_res = execute_simple(old_query,new_query) |
|
||||
|
|
||||
res = zip(old_res,new_res) |
|
||||
|
|
||||
fields_osoba = [ |
|
||||
'jmeno', |
|
||||
'prijmeni', |
|
||||
'user_id', |
|
||||
'pohlavi_muz', |
|
||||
#'email', #vyreseno separatne |
|
||||
'telefon', |
|
||||
'datum_narozeni', |
|
||||
'datum_souhlasu_udaje', |
|
||||
'datum_souhlasu_zasilani', |
|
||||
'datum_prihlaseni', |
|
||||
'ulice', |
|
||||
'mesto', |
|
||||
'psc', |
|
||||
'stat', |
|
||||
] |
|
||||
fields_keep = [ |
|
||||
'id', |
|
||||
'skola_id', |
|
||||
'rok_maturity', |
|
||||
'zasilat', |
|
||||
'poznamka', |
|
||||
] |
|
||||
fields = fields_keep+fields_osoba |
|
||||
for o,n in res: |
|
||||
check_same(o,n,fields) |
|
||||
if o['email'] != n['email'] and o['email'] != '': |
|
||||
print(f"WARNING: Emails differ: old: {o['email']}, new: {n['email']}") |
|
||||
|
|
||||
def check_reseni(): |
|
||||
# Migrace 0058 zamerne meni (zmensuje) pocet reseni, aby kazdy clanek mel |
|
||||
# jen jedno reseni (s vice resiteli, coz postaru neslo) |
|
||||
# Kvuli tomu je potreba kontrolovat dve veci: |
|
||||
# 1) Ze kazdy resitel dostal za kazdy problem spravne bodu |
|
||||
# 2) Ze detaily reseni zustaly zachovany |
|
||||
|
|
||||
# Cast 1) |
|
||||
old_query = 'SELECT * FROM seminar_reseni ORDER BY problem_id, resitel_id, body, timestamp' |
|
||||
new_query = '''SELECT seminar_reseni.id, forma, seminar_reseni.poznamka, cas_doruceni, hodnoceni.problem_id AS problem_id, hodnoceni.body AS body, hodnoceni.cislo_body_id AS cislo_body_id, res.id AS resitel_id |
|
||||
FROM seminar_reseni |
|
||||
JOIN seminar_hodnoceni AS hodnoceni ON seminar_reseni.id = hodnoceni.reseni_id |
|
||||
JOIN seminar_reseni_resitele AS rr ON seminar_reseni.id = rr.reseni_id |
|
||||
JOIN seminar_resitele AS res ON res.id = rr.resitele_id |
|
||||
ORDER BY problem_id, resitel_id, body, cas_doruceni''' |
|
||||
|
|
||||
# Po spojeni nekterych problemu se lisi casy doruceni a poznamky, proto je nebudeme kontrolovat (jde v podstate o triviality, tak je to snad jedno) |
|
||||
same_fields = ['forma', 'problem_id', 'body', 'cislo_body_id', 'resitel_id'] |
|
||||
renamed_fields = [ |
|
||||
#('timestamp', 'cas_doruceni'), |
|
||||
] |
|
||||
old_fields = same_fields + [f[0] for f in renamed_fields] |
|
||||
new_fields = same_fields + [f[1] for f in renamed_fields] |
|
||||
|
|
||||
old_res, new_res = execute_simple(old_query, new_query) |
|
||||
|
|
||||
res = zip(old_res,new_res) |
|
||||
|
|
||||
for o,n in res: |
|
||||
check_same(o,n,old_fields, new_fields) |
|
||||
|
|
||||
# Cast 2) |
|
||||
# Query se lisi tim, ze uz nejoinujeme resitele. |
|
||||
old_query = 'SELECT * FROM seminar_reseni ORDER BY id' |
|
||||
new_query = '''SELECT seminar_reseni.id, forma, poznamka, cas_doruceni AS timestamp, h.problem_id AS problem_id, h.body AS body, h.cislo_body_id AS cislo_body_id |
|
||||
FROM seminar_reseni |
|
||||
JOIN seminar_hodnoceni AS h ON h.reseni_id = seminar_reseni.id |
|
||||
ORDER BY id''' |
|
||||
|
|
||||
# execute_simple kontroluje stejnost poctu radku, to nechceme. |
|
||||
oldcur.execute(old_query) |
|
||||
newcur.execute(new_query) |
|
||||
old_res, new_res = oldcur.fetchall(), newcur.fetchall() |
|
||||
# Zkontrolujeme, ze pro kazde nove reseni ma stare reseni spravna data. |
|
||||
new_ids = [n['id'] for n in new_res] |
|
||||
spravna_old = list(filter(lambda o: o['id'] in new_ids, old_res)) |
|
||||
res = zip(spravna_old,new_res) |
|
||||
for o,n in res: |
|
||||
# Tady by se poznamky i timestampy mely zachovat |
|
||||
# Z nejakeho duvodu se ale poznamky lisi ve whitespace, tak je zkontrolujeme separatne |
|
||||
check_same(o,n,['id', 'forma', 'timestamp', 'problem_id', 'body', 'cislo_body_id']) |
|
||||
old_pozn = o['poznamka'].strip() |
|
||||
new_pozn = n['poznamka'].strip() |
|
||||
if old_pozn != new_pozn: |
|
||||
raise ValueError('Poznamky se lisi pro radky {dict(o)} a {dict(n)}') |
|
||||
|
|
||||
|
|
||||
|
|
||||
def check_organizator(): |
|
||||
old_query = 'SELECT * FROM seminar_organizator ORDER BY id' |
|
||||
new_query = '''SELECT seminar_organizator.id AS id, studuje, strucny_popis_organizatora, users.id AS uid, osoba.prezdivka AS o_prezdivka, osoba.foto AS o_foto, organizuje_od, organizuje_do |
|
||||
FROM seminar_organizator |
|
||||
JOIN seminar_osoby AS osoba ON osoba_id = osoba.id |
|
||||
JOIN auth_user AS users ON osoba.user_id = users.id |
|
||||
ORDER BY seminar_organizator.id''' |
|
||||
|
|
||||
same_fields = ['studuje', 'strucny_popis_organizatora'] |
|
||||
renamed_fields = [ |
|
||||
('user_id', 'uid'), |
|
||||
#('prezdivka', 'o_prezdivka'), |
|
||||
('foto', 'o_foto'), |
|
||||
] |
|
||||
old_fields = same_fields + [f[0] for f in renamed_fields] |
|
||||
new_fields = same_fields + [f[1] for f in renamed_fields] |
|
||||
|
|
||||
old_res, new_res = execute_simple(old_query,new_query) |
|
||||
res = zip(old_res, new_res) |
|
||||
for o,n in res: |
|
||||
check_same(o,n,old_fields, new_fields) |
|
||||
# organizuje od, do: |
|
||||
# Migrace prirazuje aktualni casovou zonu, takze chceme tady rucne vynutit CET. |
|
||||
from datetime import timedelta, timezone |
|
||||
cet = timezone(timedelta(hours=1)) |
|
||||
if o['organizuje_od_roku'] is None and n['organizuje_od'] is None: |
|
||||
pass |
|
||||
elif o['organizuje_od_roku'] != n['organizuje_od'].astimezone(cet).year: |
|
||||
raise ValueError(f'Not matching organizuje_od for org id={o["id"]}: old {o["organizuje_od_roku"]}, new {n["organizuje_od"]}') |
|
||||
if o['organizuje_do_roku'] is None and n['organizuje_do'] is None: |
|
||||
pass |
|
||||
elif o['organizuje_do_roku'] != n['organizuje_do'].astimezone(cet).year: |
|
||||
raise ValueError(f'Not matching organizuje_do for org id={o["id"]}: old {o["organizuje_do_roku"]}, new {n["organizuje_do"]}') |
|
||||
if o['prezdivka'] == n['o_prezdivka']: |
|
||||
continue |
|
||||
if o['prezdivka'] is None and n['o_prezdivka'] == '': |
|
||||
continue |
|
||||
raise ValueError(f'Not matching prezdivka for org id={o["id"]}: old {o["prezdivka"]}, new {n["o_prezdivka"]}') |
|
||||
|
|
||||
|
|
||||
def check_rocnik(): |
|
||||
old_query = "SELECT * FROM seminar_rocniky ORDER BY id" |
|
||||
|
|
||||
old_res, new_res = execute_simple(old_query) |
|
||||
res = zip(old_res,new_res) |
|
||||
|
|
||||
for o,n in res: |
|
||||
check_same(o,n,['id','prvni_rok', 'rocnik', 'exportovat']) |
|
||||
|
|
||||
def check_cislo(): |
|
||||
old_query = "SELECT * FROM seminar_cisla ORDER BY id" |
|
||||
|
|
||||
old_res, new_res = execute_simple(old_query) |
|
||||
res = zip(old_res,new_res) |
|
||||
|
|
||||
for o,n in res: |
|
||||
check_same(o,n, ['id','rocnik_id','cislo', 'datum_vydani','datum_deadline','verejne','poznamka','pdf'], |
|
||||
['id','rocnik_id','poradi','datum_vydani','datum_deadline','verejne','poznamka','pdf']) |
|
||||
|
|
||||
def check_priloha_reseni(): |
|
||||
old_query = "SELECT * FROM seminar_priloha_reseni" |
|
||||
|
|
||||
old_res, new_res = execute_simple(old_query) |
|
||||
res = zip(old_res,new_res) |
|
||||
|
|
||||
for o,n in res: |
|
||||
check_same(o,n, ['id','reseni_id', 'timestamp', 'soubor', 'poznamka'], |
|
||||
['id','reseni_id', 'vytvoreno', 'soubor', 'poznamka']) |
|
||||
|
|
||||
def check_soustredeni(): |
|
||||
old_query = "SELECT * FROM seminar_soustredeni ORDER BY id" |
|
||||
|
|
||||
old_res, new_res = execute_simple(old_query) |
|
||||
res = zip(old_res,new_res) |
|
||||
|
|
||||
for o,n in res: |
|
||||
check_same(o,n,['id','rocnik_id','datum_zacatku','datum_konce','verejne','misto','text','typ','exportovat']) |
|
||||
#Kontrola ucasnici, organizatori v samostatnych funkcich |
|
||||
|
|
||||
def check_soustredeni_ucastnici(): |
|
||||
old_query = "SELECT * FROM seminar_soustredeni_ucastnici ORDER BY id" |
|
||||
|
|
||||
old_res, new_res = execute_simple(old_query) |
|
||||
res = zip(old_res,new_res) |
|
||||
|
|
||||
for o,n in res: |
|
||||
check_same(o,n,['id','resitel_id','soustredeni_id','poznamka']) |
|
||||
|
|
||||
def check_soustredeni_organizatori(): |
|
||||
old_query = "SELECT * FROM seminar_soustredeni_organizatori ORDER BY id" |
|
||||
|
|
||||
old_res, new_res = execute_simple(old_query) |
|
||||
res = zip(old_res,new_res) |
|
||||
|
|
||||
for o,n in res: |
|
||||
check_same(o,n,['id','organizator_id','soustredeni_id','poznamka']) |
|
||||
|
|
||||
def check_nastaveni(): |
|
||||
old_query = "SELECT * FROM seminar_nastaveni ORDER BY id" |
|
||||
|
|
||||
old_res, new_res = execute_simple(old_query) |
|
||||
res = zip(old_res,new_res) |
|
||||
|
|
||||
for o,n in res: |
|
||||
check_same(o,n,['id','aktualni_cislo_id']) |
|
||||
|
|
||||
def check_novinky(): |
|
||||
old_query = "SELECT * FROM seminar_novinky ORDER BY id" |
|
||||
|
|
||||
old_res, new_res = execute_simple(old_query) |
|
||||
res = zip(old_res,new_res) |
|
||||
|
|
||||
for o,n in res: |
|
||||
check_same(o,n,['id','datum','text','obrazek','zverejneno']) |
|
||||
if get_user_id_for_org_id(n['autor_id']) != o['autor_id']: |
|
||||
raise ValueError("Nesedi autori u novinek") |
|
||||
|
|
||||
def check_pohadka(): |
|
||||
old_query = "SELECT * FROM seminar_pohadky ORDER BY id" |
|
||||
new_query = """SELECT sp.id AS id, sp.autor_id AS autor_id, sp.vytvoreno AS vytvoreno, snp.treenode_ptr_id AS treenode_ptr_id, st.na_web AS text, |
|
||||
zn_pred.uloha_id AS uloha_pred, zn_po.uloha_id AS uloha_po |
|
||||
FROM seminar_pohadky AS sp |
|
||||
-- Text pohádky |
|
||||
INNER JOIN seminar_nodes_pohadka AS snp ON sp.id = snp.pohadka_id |
|
||||
INNER JOIN seminar_nodes_treenode AS snt ON snt.id = snp.treenode_ptr_id |
|
||||
INNER JOIN seminar_nodes_obsah AS sno ON sno.treenode_ptr_id = snt.first_child_id |
|
||||
INNER JOIN seminar_texty AS st ON sno.text_id = st.id |
|
||||
-- Predchozí úloha |
|
||||
LEFT OUTER JOIN seminar_nodes_treenode AS ztn_pred ON ztn_pred.succ_id = snt.id |
|
||||
LEFT OUTER JOIN seminar_nodes_uloha_zadani AS zn_pred ON zn_pred.treenode_ptr_id = ztn_pred.id |
|
||||
-- Následující úloha |
|
||||
LEFT OUTER JOIN seminar_nodes_uloha_zadani AS zn_po ON zn_po.treenode_ptr_id = snt.succ_id |
|
||||
|
|
||||
ORDER BY sp.id""" |
|
||||
|
|
||||
old_res, new_res = execute_simple(old_query,new_query) |
|
||||
res = zip(old_res,new_res) |
|
||||
|
|
||||
for o,n in res: |
|
||||
check_same(o,n,['id','timestamp','text'],['id','vytvoreno','text']) |
|
||||
if o['autor_id'] is not None: |
|
||||
if get_user_id_for_org_id(n['autor_id']) != o['autor_id']: |
|
||||
raise ValueError("Nesedi autori u pohadky") |
|
||||
# Správné úlohy |
|
||||
# NOTE: o['pred'] rika, zda je pohadka pred ulohou, nikoliv zda je relevantni uloha pred pohadkou! |
|
||||
spravny_klic = 'uloha_po' if o['pred'] else 'uloha_pred' |
|
||||
if o['uloha_id'] != n[spravny_klic]: |
|
||||
raise ValueError(f"Pohádka přidružená ke špatné úloze! old: {o['uloha_id']}, new: {n[spravny_klic]}, pozice: {spravny_klic}") |
|
||||
|
|
||||
|
|
||||
# Problémy jsou rozdělené podle typů: |
|
||||
def check_problem_common(): |
|
||||
old_query = "SELECT id, nazev, stav, kod, autor_id, text_org, timestamp, typ FROM seminar_problemy ORDER BY id" |
|
||||
new_query = """SELECT sp.id AS id, sp.nazev AS nazev, sp.stav AS stav, sp.kod AS kod, au.id AS autor_id, sp.poznamka AS poznamka, sp.vytvoreno AS vytvoreno |
|
||||
FROM seminar_problemy AS sp |
|
||||
LEFT OUTER JOIN seminar_organizator AS so ON sp.autor_id = so.id |
|
||||
LEFT OUTER JOIN seminar_osoby AS sos ON so.osoba_id = sos.id |
|
||||
LEFT OUTER JOIN auth_user AS au ON sos.user_id = au.id |
|
||||
ORDER BY sp.id""" |
|
||||
|
|
||||
same_fields = ['id', 'nazev', 'stav', 'autor_id', 'kod'] |
|
||||
renamed_fields = [ |
|
||||
('text_org', 'poznamka'), |
|
||||
('timestamp', 'vytvoreno'), |
|
||||
] |
|
||||
old_fields = same_fields + [f[0] for f in renamed_fields] |
|
||||
new_fields = same_fields + [f[1] for f in renamed_fields] |
|
||||
|
|
||||
old_res, new_res = execute_simple(old_query,new_query) |
|
||||
res = zip(old_res,new_res) |
|
||||
|
|
||||
for o,n in res: |
|
||||
check_same(o,n, old_fields, new_fields) |
|
||||
|
|
||||
# Opravovatelé |
|
||||
# Po staru byli opravovatele organizatori, takze je potreba je dohledat. |
|
||||
old_query = """SELECT seminar_problemy.id, org.id AS opravovatel_id FROM seminar_problemy |
|
||||
JOIN seminar_organizator AS org ON seminar_problemy.opravovatel_id = org.user_id;""" |
|
||||
new_query = "SELECT problem_id, organizator_id FROM seminar_problemy_opravovatele" |
|
||||
|
|
||||
# Simple cursors |
|
||||
#oldcur = oldconn.cursor() |
|
||||
oldcur.execute(old_query) |
|
||||
old_results = oldcur.fetchall() |
|
||||
#newcur = newconn.cursor() |
|
||||
newcur.execute(new_query) |
|
||||
new_results = newcur.fetchall() |
|
||||
|
|
||||
for oldr in old_results: |
|
||||
if oldr not in new_results: |
|
||||
raise ValueError(f'Opravovatel pair {oldr} not found in new db.') |
|
||||
|
|
||||
# Zaměření se vyřeší okometricky (#1186) |
|
||||
|
|
||||
|
|
||||
def check_uloha(): |
|
||||
old_query = "SELECT * FROM seminar_problemy WHERE typ = 'uloha' ORDER BY id" |
|
||||
new_query = """SELECT cislo_zadani_id, cislo_reseni_id, problem_ptr_id, max_body, COALESCE(uzt.na_web, '') AS text_zadani, COALESCE(uvt.na_web, '') AS text_reseni, cislo_deadline_id |
|
||||
FROM seminar_ulohy |
|
||||
-- Problém: |
|
||||
JOIN seminar_problemy AS problem ON problem_ptr_id = problem.id |
|
||||
-- Text zadání: |
|
||||
-- ZadaniNode a VzorakNode maji existovat vzdy, ale obsah nemusi (pokud ho nemaji) |
|
||||
INNER JOIN seminar_nodes_uloha_zadani AS uzn ON problem.id = uzn.uloha_id |
|
||||
INNER JOIN seminar_nodes_treenode AS uztn ON uztn.id = uzn.treenode_ptr_id |
|
||||
LEFT OUTER JOIN seminar_nodes_obsah AS uzo ON uzo.treenode_ptr_id = uztn.first_child_id |
|
||||
LEFT OUTER JOIN seminar_texty AS uzt ON uzo.text_id = uzt.id |
|
||||
-- Text vzoráku: |
|
||||
INNER JOIN seminar_nodes_uloha_vzorak AS uvn ON problem.id = uvn.uloha_id |
|
||||
INNER JOIN seminar_nodes_treenode AS uvtn ON uvtn.id = uvn.treenode_ptr_id |
|
||||
LEFT OUTER JOIN seminar_nodes_obsah AS uvo ON uvo.treenode_ptr_id = uvtn.first_child_id |
|
||||
LEFT OUTER JOIN seminar_texty AS uvt ON uvo.text_id = uvt.id |
|
||||
|
|
||||
ORDER BY problem_ptr_id""" |
|
||||
|
|
||||
same_fields = ['cislo_zadani_id', 'cislo_reseni_id', 'text_zadani', 'text_reseni'] |
|
||||
renamed_fields = [ |
|
||||
('id', 'problem_ptr_id'), |
|
||||
('body', 'max_body'), |
|
||||
] |
|
||||
old_fields = same_fields + [f[0] for f in renamed_fields] |
|
||||
new_fields = same_fields + [f[1] for f in renamed_fields] |
|
||||
|
|
||||
old_res, new_res = execute_simple(old_query, new_query) |
|
||||
res = zip(old_res,new_res) |
|
||||
|
|
||||
for o,n in res: |
|
||||
check_same(o,n, old_fields, new_fields) |
|
||||
# Datum deadline vypadá prázdně, tak to budeme předpokládat. |
|
||||
if n['cislo_deadline_id'] is not None: |
|
||||
raise ValueError("Úloha má deadline.") |
|
||||
|
|
||||
def check_tema(): |
|
||||
old_query = """SELECT text_zadani, text_reseni, typ, c.rocnik_id AS rocnik_id |
|
||||
FROM seminar_problemy |
|
||||
LEFT OUTER JOIN seminar_cisla AS c ON c.id = cislo_zadani_id |
|
||||
WHERE typ IN ('tema', 'serial') |
|
||||
ORDER BY seminar_problemy.id""" |
|
||||
new_query = """SELECT tema_typ, COALESCE(zad_text.na_web, '') AS text_zadani, COALESCE(res_text.na_web, '') AS text_reseni, rn.rocnik_id AS rocnik_id |
|
||||
FROM seminar_temata |
|
||||
-- Problém: |
|
||||
JOIN seminar_problemy AS problem ON problem_ptr_id = problem.id |
|
||||
-- Text: |
|
||||
-- TvCNode má dva potomky, oba TextNode. První drží původní text zadání, druhý řešení. |
|
||||
INNER JOIN seminar_nodes_temavcisle AS tvcn ON tvcn.tema_id = id |
|
||||
INNER JOIN seminar_nodes_treenode AS ttn ON tvcn.treenode_ptr_id = ttn.id |
|
||||
LEFT OUTER JOIN seminar_nodes_treenode AS zad_tn ON ttn.first_child_id = zad_tn.id -- jen 33 z nich ma zadani |
|
||||
LEFT OUTER JOIN seminar_nodes_treenode AS res_tn ON zad_tn.succ_id = res_tn.id -- jen 4 z nich ma reseni |
|
||||
LEFT OUTER JOIN seminar_nodes_obsah AS zad_on ON zad_on.treenode_ptr_id = zad_tn.id |
|
||||
LEFT OUTER JOIN seminar_nodes_obsah AS res_on ON res_on.treenode_ptr_id = res_tn.id |
|
||||
LEFT OUTER JOIN seminar_texty AS zad_text ON zad_on.text_id = zad_text.id |
|
||||
LEFT OUTER JOIN seminar_texty AS res_text ON res_on.text_id = res_text.id -- vsechny 4 |
|
||||
-- Ročník tématu: |
|
||||
-- Podle rootu TvCN |
|
||||
LEFT OUTER JOIN seminar_nodes_rocnik AS rn ON ttn.root_id = rn.treenode_ptr_id |
|
||||
|
|
||||
ORDER BY problem_ptr_id""" |
|
||||
same_fields = ['text_zadani', 'text_reseni', 'rocnik_id'] |
|
||||
renamed_fields = [ |
|
||||
('typ', 'tema_typ'), |
|
||||
] |
|
||||
old_fields = same_fields + [f[0] for f in renamed_fields] |
|
||||
new_fields = same_fields + [f[1] for f in renamed_fields] |
|
||||
|
|
||||
old_res, new_res = execute_simple(old_query, new_query) |
|
||||
res = zip(old_res,new_res) |
|
||||
|
|
||||
for o,n in res: |
|
||||
check_same(o,n, old_fields, new_fields) |
|
||||
|
|
||||
def check_konfera(): |
|
||||
old_query = "SELECT * FROM seminar_problemy WHERE typ = 'konfera'" |
|
||||
new_query = "SELECT * FROM seminar_konfera" |
|
||||
|
|
||||
oldcur.execute(old_query) |
|
||||
newcur.execute(new_query) |
|
||||
|
|
||||
if oldcur.rowcount != 0 or newcur.rowcount != 0: |
|
||||
raise ValueError('There exists a Konfera!') |
|
||||
|
|
||||
def check_org_clanek(): |
|
||||
old_query = "SELECT * FROM seminar_problemy WHERE typ = 'org-clanek'" |
|
||||
|
|
||||
oldcur.execute(old_query) |
|
||||
|
|
||||
if oldcur.rowcount != 0: |
|
||||
raise ValueError('There exists a Org-clanek!') |
|
||||
|
|
||||
def check_res_clanek(): |
|
||||
# Dva(!) články mají text (zadání), který se má zachovat. |
|
||||
old_query = "SELECT * FROM seminar_problemy WHERE typ = 'res-clanek' ORDER BY id" |
|
||||
new_query = """SELECT cislo_id, text.na_web AS text_zadani |
|
||||
FROM seminar_clanky |
|
||||
JOIN seminar_problemy AS problem ON problem_ptr_id = problem.id |
|
||||
INNER JOIN seminar_hodnoceni AS hodn ON problem.id = hodn.problem_id |
|
||||
INNER JOIN seminar_reseni AS rese ON rese.id = hodn.reseni_id |
|
||||
INNER JOIN seminar_nodes_otistene_reseni AS rn ON rese.text_cely_id = rn.treenode_ptr_id -- Tenhle radek neni potreba, ale ujistuje se mj. o spravnem typu TreeNode. |
|
||||
INNER JOIN seminar_nodes_treenode AS tn ON rn.treenode_ptr_id = tn.id |
|
||||
-- Nektere clanky vubec nemely text, tak jim migr 0058 nevyrobila dalsi treenody |
|
||||
LEFT OUTER JOIN seminar_nodes_obsah AS son ON son.treenode_ptr_id = tn.first_child_id |
|
||||
LEFT OUTER JOIN seminar_texty AS text ON text.id = son.text_id |
|
||||
|
|
||||
ORDER BY problem_ptr_id""" |
|
||||
same_fields = ['text_zadani'] |
|
||||
renamed_fields = [ |
|
||||
('cislo_zadani_id', 'cislo_id'), |
|
||||
] |
|
||||
old_fields = same_fields + [f[0] for f in renamed_fields] |
|
||||
new_fields = same_fields + [f[1] for f in renamed_fields] |
|
||||
|
|
||||
old_res, new_res = execute_simple(old_query, new_query) |
|
||||
res = zip(old_res,new_res) |
|
||||
|
|
||||
for o,n in res: |
|
||||
# text_zadani po novu mohl byt None |
|
||||
if n['text_zadani'] is None: |
|
||||
n['text_zadani'] = '' |
|
||||
check_same(o,n, old_fields, new_fields) |
|
||||
assert(o['text_reseni'] == '') |
|
||||
|
|
||||
def check_untyped_problem(): |
|
||||
old_query = "SELECT * FROM seminar_problemy WHERE typ NOT IN ('uloha', 'tema', 'serial', 'konfera', 'org-clanek', 'res-clanek')" |
|
||||
|
|
||||
oldcur.execute(old_query) |
|
||||
|
|
||||
if oldcur.rowcount != 0: |
|
||||
raise ValueError('There exists a Problem without type!') |
|
||||
|
|
||||
|
|
||||
|
|
||||
check_skola() |
|
||||
check_resitel() |
|
||||
check_reseni() |
|
||||
check_organizator() |
|
||||
check_rocnik() |
|
||||
check_cislo() |
|
||||
check_priloha_reseni() |
|
||||
check_soustredeni() |
|
||||
check_soustredeni_ucastnici() |
|
||||
check_soustredeni_organizatori() |
|
||||
check_nastaveni() |
|
||||
check_novinky() |
|
||||
check_pohadka() |
|
||||
|
|
||||
check_problem_common() |
|
||||
check_uloha() |
|
||||
check_tema() |
|
||||
check_konfera() |
|
||||
check_org_clanek() |
|
||||
check_res_clanek() |
|
||||
check_untyped_problem() |
|
@ -1,22 +0,0 @@ |
|||||
#!/bin/bash |
|
||||
|
|
||||
set -u |
|
||||
|
|
||||
deactivate || true |
|
||||
|
|
||||
cd /akce/mam/www/mamweb-test/ |
|
||||
make sync_test |
|
||||
systemctl --user stop mamweb-test.service |
|
||||
rm -rvf env |
|
||||
make install_venv |
|
||||
. env/bin/activate |
|
||||
make install |
|
||||
deploy_v2/pre_migration.py |
|
||||
make deploy_test |
|
||||
./manage.py load_org_permissions admin_org_prava.json |
|
||||
./manage.py loaddata data/* |
|
||||
systemctl --user start mamweb-test.service |
|
||||
./manage.py generate_thumbnails |
|
||||
|
|
||||
echo 'Et voilá!' |
|
||||
echo 'Nezapomeň opravit práva pro sitetree!' |
|
@ -1,14 +0,0 @@ |
|||||
Milí řešitelé M&M, |
|
||||
|
|
||||
web M&Mka dostal nový kabátek a zároveň se v něm objevilo odevzdávátko. Navíc, |
|
||||
pokud se zaregistrujete pod e-mailem, na který jsme vám poslali tuhle zprávu, |
|
||||
uvidíte rovnou i body za svá dosud odevzdaná řešení. |
|
||||
|
|
||||
Web budeme i nadále vylepšovat, a zajímá nás i jak to vidíte vy. Pokud byste |
|
||||
na webu našli nějaký nedostatek, nebo nám prostě jen chtěli napsat, nebojte se |
|
||||
k tomu použít adresu mam@matfyz.cz. |
|
||||
|
|
||||
Těšíme se na vaše řešení! (Připomínáme termín pro účast na soustředění 21. září.) |
|
||||
|
|
||||
Za časopis M&M, |
|
||||
Pavel Turinský |
|
@ -1,3 +0,0 @@ |
|||||
Jsou špatně práva k sitetree (protože se používají primární klíče, které jsou jiné :-() |
|
||||
Špatné položky se dají najít pomocí následujícího příkazu: |
|
||||
grep -E 'access_permissions": \[$' data/sitetree.json -A17 | grep -E 'acc|tit' -A2 |
|
@ -1,42 +0,0 @@ |
|||||
#!/usr/bin/env python3 |
|
||||
|
|
||||
import os |
|
||||
import sys |
|
||||
|
|
||||
import django |
|
||||
|
|
||||
#### Inicializace Djanga |
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__))+'/..') |
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mamweb.settings') |
|
||||
django.setup() |
|
||||
|
|
||||
## Pozor, nejde pouzit ORM, protoze kod je na jine verzi nez databaze a nejde namigrovat. |
|
||||
from django.db import connection |
|
||||
|
|
||||
|
|
||||
def smaz_zle_clanky(): |
|
||||
# Tyhle clanky vubec nejsou clanky, bude potreba je udelat cele jinak a spravne. |
|
||||
#m.Problem.objects.filter(id__in=[1981, 1970, 2222]).delete() |
|
||||
## with connection.cursor() as cursor: |
|
||||
## # Nejdriv musime smazat reseni: |
|
||||
## cursor.execute('DELETE FROM seminar_reseni WHERE problem_id IN (1981, 1970, 2222);') |
|
||||
## # Nakonec i ty clanky samotne |
|
||||
## cursor.execute('DELETE FROM seminar_problemy WHERE id IN (1981, 1970, 2222);') |
|
||||
|
|
||||
# Update: stejně je v DB bordel, tak z nich prostě jen udělám témata a všechno zhruba přežije… |
|
||||
with connection.cursor() as cursor: |
|
||||
cursor.execute("UPDATE seminar_problemy SET typ = 'tema' WHERE id IN (1981, 1970, 2222);") |
|
||||
|
|
||||
def smaz_divne_uzivatele(): |
|
||||
# U techto uzivatelu neexistuje Organizator s nimi spojeny |
|
||||
# Takze pak delaji akorat neporadek |
|
||||
with connection.cursor() as cursor: |
|
||||
# Jeste je potreba zrusit vazby |
|
||||
cursor.execute('UPDATE django_comments SET user_id = NULL WHERE user_id = 34;') |
|
||||
cursor.execute('UPDATE seminar_problemy SET autor_id = NULL WHERE autor_id = 34;') |
|
||||
cursor.execute('DELETE FROM django_admin_log WHERE user_id = 34;') |
|
||||
cursor.execute('DELETE FROM auth_user_groups WHERE user_id = 34;') |
|
||||
cursor.execute('DELETE FROM auth_user WHERE id IN (34, 40, 30, 50, 54, 58, 43);') |
|
||||
|
|
||||
smaz_zle_clanky() |
|
||||
smaz_divne_uzivatele() |
|
Loading…
Reference in new issue