【snake】Section: 13 Creating a Custom Admin Dashboard

 Why Are We Not Using Flask-Admin?

①カスタマイズに関してより知識を深めるため。
デバッグでテストする際に何千行も書かれた3rd partyを使うべきでない。
③大して難しくない。

Adding the Admin Blueprint Viewing the Main Dashboard

Section12からAdminフォルダーがある。
url_prefix='/admin'を設定することでurlがすべてadminになる。
f:id:yukking3:20180715202556p:plain
@admin.before_requestを設定することで、
これより下の@確認が完了しないとrequestができないようにする。
26行目のrole_requiredはuserフォルダーのdecolator.pyで設定されている。
f:id:yukking3:20180715204237p:plain

38行目のif文でrolesを確認して、違うroleなら見れないようにする。
f:id:yukking3:20180715203035p:plain

views.pyに戻る、
@admin.route('')→が空欄になっているのはprefixでurlを指定しているから。
f:id:yukking3:20180715203254p:plain
models.pyでDashboardクラスを確認してみる。
27行目でcountをして、28行目で検索をする。
35行目で結果を反映させる。
f:id:yukking3:20180715203554p:plain



Listing Users

9行目はサーチボックス。
12行目は0で初期設定してある。
f:id:yukking3:20180715205342p:plain
61行目から64行目は時間表示をさせる。 f:id:yukking3:20180715210037p:plain マウスオーバーさせると詳しい時刻も表示する。 f:id:yukking3:20180715210017p:plain 実際にmoment.jsの使い方を説明する。 base.htmlにmoment.jsを埋め込む。 f:id:yukking3:20180715210324p:plain 16行目からjavascriptでfrom.nowが設定されている。 f:id:yukking3:20180715210601p:plain
macroで設定がされている。 f:id:yukking3:20180715210759p:plain macroフォルダーのuser.htmlで設定がされている。
もしadminならfa-shieldアイコンで表示する。
レギュラーユーザーならfa-userアイコンで表示する。 f:id:yukking3:20180715211015p:plain

macroフォルダーのitem.htmlの 34行目の{% macro paginate(resource) -%}は非常に重要である。
よくわからん。 f:id:yukking3:20180715212035p:plain
views.pyへ戻る、
55行目の.paginate(page, 50, True)で何人表示させるかを決める。 f:id:yukking3:20180715212423p:plain

Editing Users

edit.htmlを開くと{% include 'admin/user/form.html' with context %}とある。 f:id:yukking3:20180715213522p:plain form.htmlを開くと、 endpointって何よ? f:id:yukking3:20180715214211p:plain

biews.pyに戻る、
64行目で検索して
65行mでidを発行する。 f:id:yukking3:20180715214523p:plain
UserFormがどうのように設定されているかをforms.pyで確認する。
roleを選択できるようにする。 f:id:yukking3:20180715214653p:plain
choices=choices_from_dictがどのように設定されているかをlibフォルダーで確認する。
dict=辞書って意味。変更の設定をできるようにする。 f:id:yukking3:20180715215204p:plain
forms.pyに戻る
active = BooleanFieldが使われている。 f:id:yukking3:20180715215412p:plain

views.pyへ戻る
validate_on_submitでformを確認する f:id:yukking3:20180715215758p:plain

is_last_adminを詳しく見る、 最後のadminか確認するコードが書かれている。 f:id:yukking3:20180715220356p:plain もし最後のadminの場合はflashメッセージを報じさせる flash('You are the last admin, you cannot do that.', 'error')

Generating Fake Users with the CLI

fake id mの発行方法

以下のコマンドで何をaddできるかを見ることができる。

$ docker-compose exec website snakeeyes add

次のコマンドでuserを100人追加することができる。

$ docker-compose exec website snakeeyes add users

requirement.txtで取り込む。 f:id:yukking3:20180715221555p:plain 次にcmdフォルダーのcmd_add.pyを見る。
users functionをみる。かなり大規模だが簡単である。
74行目で100人追加する。
75行目の(fake.email())は偽アドレスを生成する。

81行目はrandom_emailがなくなったらストップする。
84行目はfake.dateにすることで適当な時間が生成される。
92行目は95%がメンバーで生成される。
f:id:yukking3:20180715222629p:plain 同じような感じでいろいろ書かれている。 最後はpramsにまとめて_bulk_insertへ送り込む。 f:id:yukking3:20180715222720p:plain

bulk_insert functionは一気にデータをinsertしてくれる。 f:id:yukking3:20180715222906p:plain

Searching and Sorting Users

Searchはuser/index.htmlで行われている。
3行目でform.pyからfとしてインポートされている。
9行目でmacroが指示されている。
f:id:yukking3:20180716002500p:plain

68行目でsearch formが定義されている。
今回はgetメソッドで定義されている。
getにすることでブックマークや検索ページをブックマークできる。
f:id:yukking3:20180716002956p:plain


ここからviews.pyを解説する。 f:id:yukking3:20180716003245p:plain
.filter(User.search(request.args.get('q', '')))とあるので
models.pyのsearch functionを確認する。

%{0}%はパーシャルでも検索可能にする。 emailとuserを検索する。その際、ilikeとしている。

また、from sqlalchemy import orでシーコルアルコミーからorをインポートしてる。 or(*search_chain)とすることでmailかuserのどちらとも検索する。 and_だったら、両方に待ちしたものになる。 f:id:yukking3:20180716003436p:plain

他にも確認すべきことは色々あるが飛ばす。

Deleting Users

この画面を作る。 f:id:yukking3:20180716005213p:plain

statistic/script/main.jsのチェックボックスをカウントする。 f:id:yukking3:20180716005735p:plain checkboxのjsに関してはよくわからん。 f:id:yukking3:20180716005818p:plain

javascriptの使い方に関して。

views.pyの/users/bulk_deleteに関して postリクエストで行う。 get_bulk_action_idsはsqlalcomyにある f:id:yukking3:20180716012444p:plain get_bulk_action_idsはlibフォルダーのutil_sqlalchemy.pyにある。 f:id:yukking3:20180716012654p:plain