【snake】 Section: 16 Accepting Recurring Payments ②

 Cancelling Your Subscription

Subscriptionのページで下のボタンでキャンセル項目がある。 f:id:yukking3:20180721002810p:plain 進むとconnect itボタンがある。 f:id:yukking3:20180721002817p:plain キャンセルを確定させると f:id:yukking3:20180721002825p:plain

それでは実際にcancel.htmlをみる。 かなりシンプルなので解説はない。 f:id:yukking3:20180721003432p:plain

次にbilling.pyを確認する。
以下の2つをチェックする
@handle_stripe_exceptions  @login_required
130行目ではユーザーがsubscriberで無いか確認する。
もし、subscriberでない場合は、settingsページへ飛ばす。
134行目はただのフォームである。
136行目は有効なsubmitionかを確認する。
userをパスしてcancellationを確定させる。

f:id:yukking3:20180721003614p:plain

この際のキャンセルメソッドを解説する。
それではsubscription.pyを確認する。
f:id:yukking3:20180721004539p:plain 最初にするのはgatewayを呼び出す。
subscription.comを確認する。
updateメソッドと同じである。
customer_idを検索して、customerへ格納する。
subscription_idへそのidを渡して、182行目でdeleteする。
f:id:yukking3:20180721103610p:plain

再度subscription.pyに戻る
158行目でpayment_idがnoneになる。
159行目で時間を渡す
161行目でuserをdbにadd
162行目でuserとsubscriptionをdeleteする
168行目でもしcredicard があればdbから消す
subscriptionを解約してもクレカ情報は保存できるように
discard_credit_cardパラメーターを作ってある。
そして最後にcommmitして確定させる。 f:id:yukking3:20180721110935p:plain

Extending the Admin Dashboard

adminページを作る。
何%がクーポン使ってるかとかをわかるようにしている。
f:id:yukking3:20180721230816p:plain

dashboard.htmlを見て見る。 f:id:yukking3:20180721231525p:plain

次にviews.pyを見て見る group_and_count_plans
group_and_count_coupons
group_and_count_users
f:id:yukking3:20180721232219p:plain
models.pyを見て見る
group_and_count_couponsのみ普通では無い。
33行目でsqlalchemyのqueryを使って、couponを使用した数を数える。
query(Subscription)でサブスクリプションの中で検索
filter(Subscription.coupon.isnot(None))で使って無いクーポン
最後に.count()で数を数える。
35行目で全てのsubscriptionをカウントする。
fun.countと.countだとfuncの方が効率的らしい。
37行目でtotalが0の場合は、percentぜろとしている。
f:id:yukking3:20180721232144p:plain f:id:yukking3:20180721232156p:plain



Managing Coupons in the Admin (Front-End)

クーポンの発行ページ f:id:yukking3:20180722121816p:plain Duration
Foreverは 請求の度に適用
Onceは一度だけ
f:id:yukking3:20180722122220p:plain クーポンの発行枚数や有効期限はここで確認できる f:id:yukking3:20180722122302p:plain

view.pyとかを見る前にjavascriptのdatetimeに関して見る。
92行目から99行目は重要だけどjs読めない。
103行目はdtは何をする?
104行目は重要なフォまーマット設定。
f:id:yukking3:20180722124049p:plain form.pyをみる。51行目でdtが設定されている。 f:id:yukking3:20180722133044p:plain index.htmlを見るとcreate couponボタンが設定されている f:id:yukking3:20180722133220p:plain 89行目から91行にはマクロが設定されている。 f:id:yukking3:20180722133416p:plain 次にbillling.htmlを見る f:id:yukking3:20180722134442p:plain macro coupon_expiration(coupon)を見る f:id:yukking3:20180722134541p:plain インフィニティサインを見せる f:id:yukking3:20180722134617p:plain



Managing Coupons in the Admin (Back-End)

views.pyをみる。 149行目はcouponページ f:id:yukking3:20180724093618p:plain 次にnew couponをみる f:id:yukking3:20180724093737p:plain

coupon formを確認する前にcoupon modelを確認する。
クーポンテーブル
40行目にvalidを設定(Boolean)して、有効じゃ無いのは表示されないようにする。
f:id:yukking3:20180724215948p:plain form.pyでCouponFormを確認する。いろいろ制限がある。
この中で新しいのはRedeem(受け取り)を日程で入れれる。
f:id:yukking3:20180724220616p:plain 次に、def validateを確認する。
89行目でvalidationじゃなければreturn falseする。
パーセントオフか金額のオフの1つしか選べないようになっている。
f:id:yukking3:20180724221127p:plain

ここでviews.pyの174行目に戻る。もし、有効であれば、進む。
177行目でおkであれば、couponをpopulateする。
189行目はからは値が入れられる。
もしよければ190行目でクーポンを発行する。
f:id:yukking3:20180724222051p:plain

creartメソッドを見る前にcoupon.pyのinitを確認する。
initでクーポンを発行する。44行目でuppper laterにする。
もしくは、46行目でランダムなクーポンコードを発行する。
f:id:yukking3:20180724222302p:plain
random_coupon_code()を確認する。
charset = string.digits + string.ascii_uppercaseでランダムで発行
89〜91行目は、読み間違えやすいので含めないようにする。
.join(choice(charset) for _ in range(14))で合体させた14桁で作る。
f:id:yukking3:20180724222826p:plain

クーポンがちゃんと発行できたかを確認する。 f:id:yukking3:20180724223053p:plain

adminのviews.pyに戻って、bulk_deleteを確認する。
クーポンを削除するコード。
f:id:yukking3:20180724235017p:plain

celery.taskをtask.pyで確認する。 f:id:yukking3:20180724235129p:plain

次にcoupon.pyを見る。
166行目でクーポンがあるか確認して、あればstropeで消す。
f:id:yukking3:20180724235510p:plain stripe gatewayで確認して見る。stripecome.pyで確認できる。
class Coupon(object):のdeleteメソッドがある。
f:id:yukking3:20180724235716p:plain

また、coupon.pyへ戻り続きを確認する。
173行目でもしdeleteだったらクーポンdelet eして、deleteした数をカウントする。 f:id:yukking3:20180724235952p:plain

Expiring and Subscribing with Coupons 有効期限管理

configフォルダーのsetting.pyを確認する。
クレカの有効期限チェックと同じでceleryを確認する。
f:id:yukking3:20180725083707p:plain

task.pyを確認する。expire_old_couponsをみる。 f:id:yukking3:20180725083819p:plain

次にmodelフォルダーのcoupon.pyでexpire_old_couponsをみる。
compare_datetimeは今日の日付けである。
本日を過ぎているかチェックして、データベースをアップデートする。
114行目の書き方がよくわからない。
f:id:yukking3:20180725084012p:plain

クーポン一覧のページ f:id:yukking3:20180725084456p:plain クーポン入力ページ。下に緑くdetailが出るようになっている。 f:id:yukking3:20180725084612p:plain 実際にクーポンを使うとredeemがカウントされる。 f:id:yukking3:20180725084716p:plain subscriptionの人数やそのうち何人がクーポン使ってるかを表示する。 f:id:yukking3:20180725084812p:plain

Javascriptに関して、main.jsを確認する。
jsはよくわからないので飛ばす。 f:id:yukking3:20180725085018p:plain


billing.pyを確認する。
43行目の422はhttpでprocess出来ないというコード f:id:yukking3:20180725085415p:plain

coupon.pyでfind_by_codeを確認する。 f:id:yukking3:20180725085459p:plain

Coupon.redeemableはスペシャルハイブリドモデルらしい。
@hybrid_propertyはなんかいいらしい。
f:id:yukking3:20180725085648p:plain coupon.pyでredeemableを確認して見る。
ここで残りのクーポン数を確認する。
f:id:yukking3:20180725085845p:plain
views.pyへ戻る。
48行目でクーポンがまだあるかを確認する。
もしあれば、render_jsonへ飛ばす。
f:id:yukking3:20180725091108p:plain

coupon.pyでto_jsonを確認する。 f:id:yukking3:20180725091409p:plain

main.jsで確認する。 f:id:yukking3:20180725091606p:plain

subscription.pyを確認する。
103行目でもしクーポンが存在するなら f:id:yukking3:20180725091828p:plain

coupon.pyでredeemを確認する。
残りの使えるクーポン枚数を確認してdbへsaveする。 f:id:yukking3:20180725092101p:plain

billing.pyを確認する。 f:id:yukking3:20180725092508p:plain

subscription.pyでupdateメソッドを確認する。 f:id:yukking3:20180725092630p:plain