スクエアのサブスクリプションのリストには、カスタマーIDが表示されるが、これをアプリ内のユーザー名と紐づけする方法を考えてみた。簡単そうだが、意外にはまってしまった。結果的には、以下のようにすることで解決できたが、ここに至るまでは、試行錯誤が必要だった。
<View側>
usertmpl3=list(map(lambda ob:{'customerid':ob.customerid,'username':ob.username},User.objects.all()) )
srclst=list(filter( lambda ob: ob.get('canceled_date',"")=="",list(result.body['subscriptions'])))
subscriptions=list(map( lambda ob : {'subsc':ob , 'cid':next( filter(lambda ob2: ob2['customerid'].strip() == ob['customer_id'].strip() ,usertmpl3),{'customerid':"",'username':"削除"})['username'] } ,srclst ))
sng= datetime.datetime.strptime(nen1, "%Y/%m/%d")
eng= datetime.datetime.strptime(nen2, "%Y/%m/%d")
sbdt=list(filter(lambda sd:datetime.datetime.strptime(sd['subsc']['start_date'], '%Y-%m-%d')>=sng and datetime.datetime.strptime(sd['subsc']['start_date'], '%Y-%m-%d')<= eng,subscriptions))
注意点:usrtmpl3、srclstいずれも最後にlistを適用してある。こうしないと、うまく動作しない。(filter()関数の戻り値はgeneratorオブジェクトという記述がネット内にある。)
まわりくどい式になってしまった。もっとスマートな方法がありそうだが。値が存在しないときに「削除」という表示にしたかったので、nextを使ってみた。
<HTML>
sbdt=response.sbdt;
$('<p style=font-weight:bold;>ユーザー名 サブスクリプションID ~</p>').appendTo('.result');
for (var i in sbdt) {
$('<p>'+sbdt[i]['cid']+" "+sbdt[i]['subsc']['id'] ~ +'</p>').appendTo('.result'); }