pyramid_layoutと僕と、ときどきzope.interface

25
2012/5/13 pyramid_layout 僕と ときどきzope.interface hirokiky 13516日木曜日

description

pyramid_layoutのpanelとは、どのようなものか。どう使ったか。 あと、zope.interfaceで模索したことについて。 LT。

Transcript of pyramid_layoutと僕と、ときどきzope.interface

2012/5/13

pyramid_layoutと僕とときどきzope.interfacehirokiky

13年5月16日木曜日

Pyramidでアプリ作る

✤ 集計アプリを作りたい

✤ panelやべぇ

13年5月16日木曜日

panelって?

✤ pyramid_layoutの一機能

✤ 部分的なview, templateをテンプレートから指定する感じ

13年5月16日木曜日

panel

@panel_config( name='sidebar', renderer='sakila:templates/panels/sidebar.mako')def sidebar(context, request): return dict(menus=[ (u'速報', request.route_url('home')),

(u'ランキング', '#'),

])

13年5月16日木曜日

panelのテンプレート

<div class="well sidebar-nav"> <ul class="nav nav-list"> % for menu, url in menus: <li><a href="${url}">${menu}</a></li> % endfor </ul></div><!--/.well -->

sidebar関数の返り値がpanelのテンプレートに渡る

13年5月16日木曜日

Template

<html>## ...

${panel('sidebar')}

## ...</html>

実際のTemplateからはpanelの名前を指定するだけ

13年5月16日木曜日

最終的に<html>## ...

<div class="well sidebar-nav"> <ul class="nav nav-list"> <li><a href="/">売上速報</a></li>

<li><a href="#">ランキング</a></li>

</ul> </div><!--/.well -->

## ...</html>

13年5月16日木曜日

panelやべぇ

✤ 画面要素を自由に切り貼りできる

✤ iGoogleのように画面を組み立てれるのでは

夢のよう!!

13年5月16日木曜日

できつぅあ

サイドバーpanel

折れ線グラフpanel

13年5月16日木曜日

実は

この前に一回panel諦めてviewで書いた

request.contextから値とるようにしたらpanelで書けた

13年5月16日木曜日

panel良い

✤好きなだけ置くことができる

✤テンプレートから引数も取れる

13年5月16日木曜日

panelつらい

✤ NotFoundが投げれない(Templateの描画エラーになる)

✤ 画面で共通の引数を渡すのが面倒くさい

13年5月16日木曜日

折れ線グラフに必要な処理

✤ リクエストパラメーターから集計期間を取る

✤ リクエストパラメーターのバリデーションチェック

✤ DBアクセス、折れ線グラフ集計 (ペアのリスト)

✤ 折れ線グラフ化 (x, yなど分割して取れるようにする)

✤ JSライブラリ依存の形式に変換

✤ テンプレートに適切に値を与えて表示

13年5月16日木曜日

折れ線グラフに必要な処理

✤ リクエストパラメーターから集計期間を取る

✤ リクエストパラメーターのバリデーションチェック

✤ DBアクセス、折れ線グラフ集計 (ペアのリスト)

✤ 折れ線グラフ化 (x, yなど分割して取れるようにする)

✤ JSライブラリ依存の形式に変換

✤ テンプレートに適切に値を与えて表示

request.context

アダプタ

関数

panel

13年5月16日木曜日

request.context.summary

class SakilaResource(object):

# ...

@property def linechart(self): c = DBSession.query( sql.func.date(Payment.payment_date).label('date'), sql.func.sum(Payment.amount), ).\ filter(self.conditions).group_by('date').all() return c

ユーザー入力から条件を取るプロパティ

13年5月16日木曜日

panel

@panel_config( name='linechart', renderer='sakila:templates/panels/linechart.mako')def line_chart(context, request, renderTo='container'): highcharts.need()

adapter = LinechartDataAdapter(request.context.linechart) options = daily_linechart_options(adapter.x, adapter.y, renderTo=renderTo)

return {'options': options, 'renderTo': renderTo}

options, rendecToからHighchartsを表示13年5月16日木曜日

( ˘⊖˘) 。o(待てよ

✤ 折れ線グラフで例えば日次、月次、年次のグラフを切り替えたい

✤ Highchartsだけでなく、その他のJSライブラリにも切り替えたい

13年5月16日木曜日

▂▅▇█▓▒░('ω')░▒▓█▇▅▂

@panel_config( name='linechart', renderer='sakila:templates/panels/linechart.mako')def line_chart(context, request, renderTo='container'): highcharts.need()

adapter = LinechartDataAdapter(request.context.linechart) options = daily_linechart_options(adapter.x, adapter.y, renderTo=renderTo)

return {'options': options, 'renderTo': renderTo}

何らかの指定によって色々変えたい

13年5月16日木曜日

zope.interface

✤ まずInterfaceを定めて、そこにあとから実装を付ける

✤ Adaptationしたい

13年5月16日木曜日

もさく

IResource

ILinechart

IRenderer

ResourceDailyLinechart

LinechartHighchartsRenderer

13年5月16日木曜日

もさく

list

ILinechart

IHighcharts

ListLinechart

LinechartHighcharts

13年5月16日木曜日

例えばこんなpanel

def linechart(context, request, renderTo='container', type=‘daily’): highcharts.need()

reg = request.registry.getAdapter(request.context.linechart, IHighchart, type) options = reg.getOptions(renderTo=renderTo)

return dict(options=options, renderTo=renderTo)

panelがhighchartsに依存してる

13年5月16日木曜日

あとzope.interfaceは隠したい

✤ zope.interfaceは隠すとお行儀がいいらしい

✤ 利用者(アプリ開発者)にはapiだけ提供する

✤ 開発者(ライブラリ開発者)は内部でzope.interfaceを使う

✤ まぁzope.interfaceわかりにくいし

13年5月16日木曜日

妄想色々

@tochart_config('daily.linechart.highcharts', chart_type='linechart', chart_backend='highcharts')@tochart_config(‘daily.linechart.graphel’, chart_type=‘linechart’, chart_backend=‘graphel’)def daily(request, data) x = 1 y = 2 return [(x, y), (x, y)] chart = tochart(request, data, 'daily.linechart.highcharts')chart.render()

https://gist.github.com/hirokiky/5567640

13年5月16日木曜日

やってるとこです

✤ MySQLのサンプルデータベース「sakila」を集計していますのよ

✤ https://github.com/hirokiky/aggregating_sakila

13年5月16日木曜日