djangoをdockerコンテナで利用(17) – djangoで帳簿運用

3か月の並行運用期間と過去データで検算

php版を最初に作ったときは、excelで検算してた。
webページをそのままexcelに貼り付けるだけじゃうまく行かない箇所は電卓。

今回は3月にdjango版がだいたいできたから、4月から入力しながら処理誤りを修正しつつ、php版の結果と比べてった。

django-hist

処理をそろえて作ってるから当たり前なんやけど、1円単位で合計があったときはやっぱり嬉しい。

こういうときディスプレイが3枚あるとチェックがめっちゃ楽。

入力は3か月やけど、帳簿は7年分を確認してった。
django版はちょっと細かめに計算。

その計算結果を使ってグラフ作らせたら、これまたパーセンテージが一致。
小数点第2位まで一致。

django-hist

7年分見たとき、この数字が一致したときの快感はなんとも言えず気持ちよかった。

印刷でアセった

検索結果一覧画面を表示させておいて、これをpdf保管したい。
例えば現金出納帳は決まった年数保管しとかないといけない。

django-hist

firefoxで見たら、なんじゃこりゃ。
ボタンとかロゴとかだけ表示されてるけど、数字があらへん。
cssのせい? djangoの中の何か設定? pipでなんかインストールいるんか?

django-hist

小一時間ほどdjangoで印刷っていうのを調べたら、いろいろ結果が出てきた。
けっこう面倒くさい。

こんなんやってられへんし、もっと楽にできへんのかなぁってfirefox閉じてchromeで表示させたら、あっさり表示できた。

django-hist

ブラウザ依存とか困るなぁ。

何年か前に「閉じる」のボタンを作ってたら、セキュリティか何かの都合でfirefoxもchromeも閉じてくれんようになった。

最近はjava scriptの解釈が変わったんかもしれんけど、また閉じれるようになった。

この印刷も何年かしたらちゃんと見えなくなるんとちゃうか。

フォームの箇所いらんから結果だけ印刷したいけど、まぁ数字は読めるしええか。
今年はいったんこれで完成。

どっかで解決方法見つけたら、pdf出力の方法探そっと。

1年かけて得られたもの

php版の帳簿管理の仕組みから脱却してdjangoで動かそうとしたのが去年の今頃。

django-hist

「pythonで扱うdjangoってどんなんやねん」から始まって、ssl利用とかpdfのデータベース保存とかグラフ作成とか、いろいろ挑戦してようやく完成。

google cloudの中のコンテナも用意できて、ローカルの開発環境とクラウドの本番環境を切り替えながら使うのもできるようになった。

コンテナ仮想化使ってるから、単純にアプリケーション作るための知識を得るだけじゃなく、アプリケーションインフラ寄りの知見も得られた。

日本語フォントのインストールとか、円グラフのライブラリをdjangoで使えるようにするのは苦労したなぁ。

djangoのモジュールのgitグラフを見ると、作って楽しかった履歴が見える。

できたつもりが、できてなかったり、思い出したら人に言えない恥ずかしいコミットもある。

django-hist

最初はurls.py小さかったけど、こんなにデカなってた。
画面遷移がうまく行かんなぁって、コレ書き間違えてるのに気づくの時間かかったっけ。

urlpatterns = [
    path('login/', auth_views.LoginView.as_view(template_name='gvisWebApp/login.html'), name='login'),
    path('logout/', auth_views.LogoutView.as_view(template_name='gvisWebApp/logout.html'), name='logout'),
    path('home/', gvis_base_views.home, name="home"),
    path('gvis_001_IntraIchiran/', gvis_base_views.gvis_001_IntraIchiran, name="gvis_001_IntraIchiran"),
    path('gvis_002_LogKensaku/', gvis_log_views.GvisLogList.as_view(), name="gvis_002_LogKensaku"),
    path('gvis_Complete/', gvis_base_views.gvis_Complete, name="gvis_Complete"),
    path('gvis_100_ShisanKensaku/', gvis_zaiko_views.GvisZaikoList.as_view(), name="gvis_100_ShisanKensaku"),
    path('gvis_101_ShisanDetail/<int:pk>/', gvis_zaiko_views.GvisZaikoDetail.as_view(), name="gvis_101_ShisanDetail"),
    path('gvis_102_ShisanCreate/', gvis_zaiko_views.GvisZaikoCreate.as_view(), name="gvis_102_ShisanCreate"),
    path('gvis_103_ShisanDelete/<int:pk>/', gvis_zaiko_views.GvisZaikoDelete.as_view(), name="gvis_103_ShisanDelete"),
    path('gvis_104_ShisanUpdate/<int:pk>/', gvis_zaiko_views.GvisZaikoUpdate.as_view(), name="gvis_104_ShisanUpdate"),
    path('gvis_105_GvisZaikoTENPU/<int:pk>/', gvis_zaiko_views.GvisZaikoTENPU.as_view(), name="gvis_105_GvisZaikoTENPU"),
    path('gvis_200_KokyakuKensaku/', gvis_cust_views.GvisMstCustomerList.as_view(), name="gvis_200_KokyakuKensaku"),
    path('gvis_201_KokyakuDetail/<int:pk>/', gvis_cust_views.GvisMstCustomerDetail.as_view(), name="gvis_201_KokyakuDetail"),
    path('gvis_202_KokyakuCreate/', gvis_cust_views.GvisMstCustomerCreate.as_view(), name="gvis_202_KokyakuCreate"),
    path('gvis_203_KokyakuDelete/<int:pk>/', gvis_cust_views.GvisMstCustomerDelete.as_view(), name="gvis_203_KokyakuDelete"),
    path('gvis_204_KokyakuUpdate/<int:pk>/', gvis_cust_views.GvisMstCustomerUpdate.as_view(), name="gvis_204_KokyakuUpdate"),
    path('gvis_205_GvisCustTENPU/<int:pk>/', gvis_cust_views.GvisMstCustomerTENPU.as_view(), name="gvis_205_GvisCustTENPU"),
    path('gvis_300_TorihikiKensaku/', gvis_tran_views.GvisTransactionList.as_view(), name="gvis_300_TorihikiKensaku"),
    path('gvis_301_TorihikiDetail/<int:pk>/', gvis_tran_views.GvisTransactionDetail.as_view(), name="gvis_301_TorihikiDetail"),
    path('gvis_302_TorihikiCreate/', gvis_tran_views.GvisTransactionCreate.as_view(), name="gvis_302_TorihikiCreate"),
    path('gvis_303_TorihikiDelete/<int:pk>/', gvis_tran_views.GvisTransactionDelete.as_view(), name="gvis_303_TorihikiDelete"),
    path('gvis_304_TorihikiUpdate/<int:pk>/', gvis_tran_views.GvisTransactionUpdate.as_view(), name="gvis_304_TorihikiUpdate"),
    path('gvis_305_GvisTranTENPU/<int:pk>/', gvis_tran_views.GvisTransactionTENPU.as_view(), name="gvis_305_GvisTranTENPU"),
    path('gvis_400_KatsudoKensaku/', gvis_work_views.GvisWorkList.as_view(), name="gvis_400_KatsudoKensaku"),
    path('gvis_401_KatsudoDetail/<int:pk>/', gvis_work_views.GvisWorkDetail.as_view(), name="gvis_401_KatsudoDetail"),
    path('gvis_402_KatsudoCreate/', gvis_work_views.GvisWorkCreate.as_view(), name="gvis_402_KatsudoCreate"),
    path('gvis_403_KatsudoDelete/<int:pk>/', gvis_work_views.GvisWorkDelete.as_view(), name="gvis_403_KatsudoDelete"),
    path('gvis_404_KatsudoUpdate/<int:pk>/', gvis_work_views.GvisWorkUpdate.as_view(), name="gvis_404_KatsudoUpdate"),
    path('gvis_405_GvisWorkTENPU/<int:pk>/', gvis_work_views.GvisWorkTENPU.as_view(), name="gvis_405_GvisWorkTENPU"),
    path('GvisWorkCopy/', gvis_work_views.GvisWorkCopy, name="GvisWorkCopy"),
    path('GvisWorkMonthlyCopy/', gvis_work_views.GvisWorkMonthlyCopy, name="GvisWorkMonthlyCopy"),
    path('gvis_500_KeihiKensaku/', gvis_keihi_views.GvisKeihiList.as_view(), name="gvis_500_KeihiKensaku"),
    path('gvis_501_KeihiDetail/<int:pk>/', gvis_keihi_views.GvisKeihiDetail.as_view(), name="gvis_501_KeihiDetail"),
    path('gvis_502_KeihiCreate/', gvis_keihi_views.GvisKeihiCreate.as_view(), name="gvis_502_KeihiCreate"),
    path('gvis_503_KeihiDelete/<int:pk>/', gvis_keihi_views.GvisKeihiDelete.as_view(), name="gvis_503_KeihiDelete"),
    path('gvis_504_KeihiUpdate/<int:pk>/', gvis_keihi_views.GvisKeihiUpdate.as_view(), name="gvis_504_KeihiUpdate"),
    path('GvisKeihiCopy/', gvis_keihi_views.GvisKeihiCopy, name="GvisKeihiCopy"),
    path('GvisKeihiMonthlyCopy/', gvis_keihi_views.GvisKeihiMonthlyCopy, name="GvisKeihiMonthlyCopy"),
    path('gvis_510_KamokuKensaku/', gvis_kamoku_views.GvisKamokuList.as_view(), name="gvis_510_KamokuKensaku"),
    ## 科目画面ではcreate/detail viewを扱わず、削除と更新のみ
    path('gvis_513_KamokuDelete/<int:pk>/', gvis_kamoku_views.GvisKamokuDelete.as_view(), name="gvis_513_KamokuDelete"),
    path('gvis_514_KamokuUpdate/<int:pk>/', gvis_kamoku_views.GvisKamokuUpdate.as_view(), name="gvis_514_KamokuUpdate"),
    path('GvisKamokuCopy/', gvis_kamoku_views.GvisKamokuCopy, name="GvisKamokuCopy"),
    path('gvis_600_ChoboKensaku/', gvis_chobo_views.GvisChoboList.as_view(), name="gvis_600_ChoboKensaku"),
    path('gvis_700_KoteishisanKensaku/', gvis_koteishisan_views.GvisKoteishisanList.as_view(), name="gvis_700_KoteishisanKensaku"),
    path('gvis_800_GenkinKensaku/', gvis_genkin_views.GvisGenkinList.as_view(), name="gvis_800_GenkinKensaku"),
    path('gvis_900_ShiwakeKensaku/', gvis_shiwake_views.GvisShiwakeList.as_view(), name="gvis_900_ShiwakeKensaku"),
    path('ENplot/<int:year>', gvis_chobo_views.get_ENpng, name='ENplot')   # 円グラフを描くための設定

数年したらまたpython&djangoの環境から脱却して別の実装へ引っ越すかもしれんけど、別の言語へ引っ越すための勉強になった。

3か月の並行運用で表示の色合いとか、pipでのバージョンアップとかをやりつつ、帳簿運用はdjango版に移せた。

ダークモードを使えるようにしたから、目も楽になった。
20インチ以上の画面が3枚あって、白っぽい画面で見てると目がツラかったのがやっと改善できた。

ubuntuが20から22にバージョン上がっても、コンテナ仮想化のおかげで楽に引っ越せたし。

けっこう長いことかかったなぁ。

2022年12月、過去5年分と今年の金額が一致できることを確認してphpとnginxのdockerコンテナ・イメージは役割を終えてバックアップしてから年末コンテナ整理で削除完了。

タイトルとURLをコピーしました