Dvojitá alchymie III

25. 10. 2013 20:46 (aktualizováno) Petr Blahoš

Podívejte se na všechny díly seriálu nebo na zdrojáky příkladu.

předchozích dílech jsem si postavil nějakou tu základní strukturu aplikace, a dnes ji začnu rozbíjet.

step05

Minule jsem přidal odkazy pro editaci a mazání tak, že jsem předstíral, že jsou to pole. To je samozřejmě ideově pochybené, proto to dnes uděláme pomocí šablony.

cd step05
python setup.py develop

pserve --reload development.ini
Vpodstatě stačí formalchemy sdělit, kde má hledat naše lepší šablony. Je to v model/__init__.py ve funkci includeme. Není to ideální místo. Berte to trochu jako provizorium. Té konfigurace tam bude víc, a až bude, tak to uspořádám lépe. Každopádně, naše šablony budou v templates/formalchemy, a ze začátku jenom zkopírujeme ty z formalchemy/paster_templa­tes/pylons_fa/+package+/tem­plates/forms, ovšem přejmenujeme je na *.mako a ze začátku a konce odstraníme podmínku na mako. A budeme pracovat s grid_readonly.mako. Teď mrkněte na model/grids.py. Zrušil jsem field a renderer, a ty nesmysly s přidáváním vlastního pole, a jediné co chci je, aby ten můj grid dostal request. Budu ho potřebovat ke generování url z rout, a k lokalizaci. Teď už vás v grid_readonly.mako nemůže nic překvapit. To je v tomto kroku vše.

step06

Jak jsem zmínil minule, funguje to s tím, že všechny modely mají primární klíč id. Teď už si vytvoříme novou databázi s tabulkou, ve které primární klíč nebude id, a dokonce bude složený ze dvou sloupců.

cd step06
python setup.py develop
..\..\scripts\initialize_faapp_db development.ini
pserve --reload development.ini

Tento krok jsem vlastně udělal jenom kvůli tomu, abych se podíval, jak vlastně formalchemy staví ten formulář. Když tak mrkněte na výpis NonId a použijte třeba DOM inspector, abyste viděli, jaké DOM ID formalchemy používá. Nebude to pro nás asi důležité, ale je dobré to vědet.

step07

Tady se konečně stane něco zajímavého. Předěláme routy tak, aby nepoužívaly natvrdo id, a uděláme si generování query parameters pro primární klíče.

cd step07
python setup.py develop
pserve --reload development.ini
V první řadě si všimněte v __init__.py těch rout. Už tam není id, a tím pádem už není rozdíl mezi edit a new. Pak v handlerech pro editaci a mazání views/view.py nepoužiju žádné request.matchdict[„id“], ale dělám _add_pk_q(…, model, request.params). A nakonec v šabloně templates/formalchemy/grid_re­adonly.mako pro generování url nepředávám id, ale _query, což je speciální parametr funkce route_url, který přidá query params.

Tak nejprve nějaké ty pomocné funkce. V model/meta.py najdete get_pk_columns, což je to nejdůležitější – najde nám jména sloupců s primárními klíči pro model/tabulku. Funkce pk vrátí pole dvojic (sloupec, hodnota) a get_pk_map je převede na mapu. Z ní se pak generují request parametry.

Teď obráceně – jak z request parametrů udělat podmínky pro where pro SQL dotaz. Tady si prostě vezmu seznam slupců – primárních klíčů, a hledám v request.params jejich hodnoty. Pokud najdu všechny, tak normálně sestavím SQL dotaz. Pokud mi některý chybí, tak je vyvolána vyjímka, a ta způsobí, že vytvořím nový objekt. Najdete to v views/view.py, funkci _add_pk_q. Můžete celkem oprávněně namítnout, že když někdo podvrhne url se špatnými parametry, tak místo toho, abych vyhodil chybu normálně vytvořím nový objekt. Přemýšlím, jestli to vadí, a řekl bych, že ne.

Příště

Podíváme se na Route Factories a uděláme nějaká drobná vylepšení.

Sdílet