研究室内で業績をアーカイブするOSSをつくった
まえがき
出した論文とか発表した学会とかの管理ってどうやってるんでしょうね.
以前所属していた研究室ではとくに管理していないようでした. 現在所属している研究室ではWeb管理システムをつくって管理しています.
このシステムが稼働から10年ぐらい経っているらしく, 最新のHWで動作しないので置き換えが必要となりました. というわけで新しいシステムをつくりました. せっかくなので公開します.
成果物
システム本体 github.com
本番用Docker-compose github.com
要件
- 内部の人間しか使わないので制限も最低限. ログインとかいらない. 誰でも登録とか更新とかできるように
- バックアップ等の管理が楽だと良い
移行も楽にやりたい
機能は旧システムと同様でOK
とのことだったので, 研究で触っている人の多いPythonのフレームワークであるDjangoを使用する
また, Docker慣れている人も多いのでDockerを使う
セオリー通りにDjango+Gunicorn+NginxでやりたかったのでDocker-composeで構築
あとはバックアップが楽なSQLiteを組み合わせ, 可能な限り1ディレクトリで完結するように心がける
旧システムはPHPでどこにソースがあるかもわからなかったので適当に構築 最初はAPIサーバにしようと思ったけどJavascriptで画面作るのが面倒になって
機能とか
レコードにはこのような項目が存在する. 主著者と業績区分あたりは外部キー.
著者や雑誌名も外部キー化したかったけど過去の業績との兼ね合いから旧システムとほぼ同様の構造のまま
旧システムがレコードの外部キーに主著者を指定しており, ユーザも主に主著者で検索をかけていたので一覧画面が存在する
レコードの各項目で検索できる
表形式で表示. 表示はDataTablesを使用. ほかに参考文献風やbibtexで表示可能. PDFの一括ダウンロードも可能.
前述の通り誰でも新しいレコードが登録できる. 全角カンマとか全角スペースとかは半角に変換される.
つくってるときに詰まったとことか
POST時のファイル関連で詰まった覚えがある 結局RESTflamework入れてなんとかしたんだっけな
PDFの一括ダウンロードも結構面倒だった HTMLに
<button class="btn btn-secondary" onclick="location.href='{% url 'gyoseki:download' %}?list={% for i in recode_list %}{{ i.file|yesno:"media/," }}{{ i.file }}{{ i.file|yesno:"!!!PARSER!!!," }}{% endfor %}'"> PDF一括ダウンロード </button>
と無茶苦茶なGETリクエストを書いて
def download(request): li = request.GET.get('list') li = li.split('!!!PARSER!!!') response = HttpResponse(content_type='application/zip') response['Content-Disposition'] = 'attachment; filename=matome.zip' zf = zipfile.ZipFile(response, 'w') for l in li: if l: zf.write(l) return response
ただzip化するだけなんだけども, 無茶苦茶なGETリクエストやでかいZIPファイルを通すために
client_max_body_size 4G; large_client_header_buffers 4 128k;
みたいにNginxの設定をいじる必要があったりとすんなりいかなかった
Djangoのstatic周りとか設定ファイルを本番と開発で変更するとかは改めて書かないがすんなりいかなかった
あとはまあそれなりといった感じでしょうかね
Djangoの知識なしで勉強しながらつくってだいたい0.5人月くらいでした