django-import-exportでインポート、エクスポートの権限を付与する

やりたいこと

Djangoでインポート、エクスポートを実行できるようにする https://github.com/django-import-export/django-import-export において、特定ユーザーにのみ、インポートエクスポート機能を公開したい。

例として今回エクスポートしたいモデルは以下

class Book(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=60)

対象のバージョンは Django 4.2.13, django-import-exportは 4.0.3 になります。

やったこと

django.contrib.auth がもつパーミッション機能と組み合わせることで実現します。

1. IMPORT_EXPORT_IMPORT_PERMISSION_CODE, IMPORT_EXPORT_IMPORT_PERMISSION_CODE を settings.py にセットする

IMPORT_EXPORT_IMPORT_PERMISSION_CODE = "import"
IMPORT_EXPORT_EXPORT_PERMISSION_CODE = "export" 

2. 対象モデルのメタクラスpermissionsを付与する。その場合、「1で付与した文字列_モデル名」とする

class Book(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=60)
+
+    class Meta:
+       permissions = (('import_book', 'Can import book'), ('export_book', 'Can export book'))

3. python manage.py makemigrations 対象モデルのあるアプリ を実行してマイグレーションファイルを作成

4. python manage.py migrate

5. その後 Can import bookCan export book の権限を対象ユーザに付与する

以上です。

ハマったこと

対象となるモデル名が別アプリで使用しているモデル名と同名だったため、permissionsのラベル名を アプリ名_モデル名 としてしまい動作しなかった。

結論は IMPORT_EXPORT_IMPORT_PERMISSION_CODE(もしくは IMPORT_EXPORT_EXPORT_PERMISSION_CODE)_モデル名 で良い。

該当のソースコードこちら。ここから参照される django.contrib.auth.get_permission_codename のコードはこちら(Django 4.2現在)

この場合、別アプリの同名モデルはどうなるんだろう?と思ったが、データベース上では django_content_type.id で関連付けが実施されるため問題なかった。

参考リンク

jefftriplett/django-startprojectをDjangoのプロジェクトテンプレートとして使っている

表題以上の情報はありませんが 😇

最近新しいプロジェクトを使うときに django-admin startproject --template の指定先で

github.com

を使っています。

好きなところ

  • ミニマムで最低限必要な部分だけ入っているところ(CSSJavaScriptフレームワークが入っていない)
  • 最低限ではありながら、uvやpytestなどよく使うパッケージが入っているところ

Djangoのテンプレートとして有名どころとして挙げられる

github.com

github.com

などもありますが、 django-admin startproject --template でもいい感じのやつがありますよってのを書きたかったです。

django-admin startproject のコマンドについては

docs.djangoproject.com

で確認できます。

2023年で面白かったもの(コンテンツ)

2023年の振り返りを真面目に書こうと思ったけど、諦めました。 ただ面白かったコンテンツだけは書いておきたいなと思ったので、投下。

私が視聴した時間が2023年だったので2023年としていますが、コンテンツの公開日は2023年以前のケースもあります。

アンガールズのジャンピン[オールナイトニッポンPODCAST]

https://podcast.1242.com/show/ung/

オールナイトニッポンPODCAST 土曜日 怪奇!YesどんぐりRPG の初回

omny.fm

くりぃむナンタラ「はだかの王様度チェック」でのチャンス大城

https://post.tv-asahi.co.jp/post-228849/

有吉クイズ

蛭子能収と絵を一緒に書く

https://post.tv-asahi.co.jp/post-218596/

動いてないLINEグループを3分以内に既読にできたら賞金獲得のスマホクイズ

https://www.tv-asahi.co.jp/ariyoshiquiz/backnumber/#/?pageType=article&number=8

東野vs

若槻千夏出演回

www.youtube.com

www.youtube.com

キングコング西野出演回

www.youtube.com

ダイノジ出演回

www.youtube.com

あぁ〜しらき回

www.youtube.com

タイマン森本

ひょうろく回

www.youtube.com

北陽虻川回

www.youtube.com

ハッカーズチャンプルー2023でhtmxについて話しました #hcmpl23

hackers-champloo.org

ハッカーズチャンプルー2023でhtmxについて話しました

発表スライド

参加者やスタッフの1人としてハッカーズチャンプルーに参加することはありましたが、発表自体は7年近くぶりだったのでとても緊張しました。

トークをするまでに助けていただいた方々へのお礼、そしてトークした後に少し意外な展開があったので、そのことについて書こうと思います。

応募

CfPがあり、レギュラートークと今回採択されたLT枠で2つ応募しました。どちらのトークでもhtmxに話したいな、というのがモチベーションでした。

レギュラートークの内容はLaravel、RailsDjangoPhoenixのフロントエンド事情と称して Inertia.js, Hotwire, htmx, LiveViewの概要と違いを話すつもりでいました。

いま思えばレギュラートークに採択されたら準備に忙殺されていたかなと思います。

発表するまで

スライドのレビュー

そもそも2年近くウォッチしていたhtmxが国内で言及されている事例(触ってみました系記事を除く)がなかったので、話しても理解を得られないのではと不安でした。

少し早めにスライドを作っておき、 htmxと似た方針であるHotwireの事情を知っていそうな @deeeki さんとWebアプリケーション開発とは畑違いのデータエンジニアをしている@tsoshiroさんの二人に見てもらい意見をもらいました。

実際に導入して思うところや、「退屈なのが良い」のが何故なのかを知りたい、というフィードバックは発表後の感想でもコメントもらえたところだったので非常にありがたかったです。

Okinawa.pm

とはいえ、フィードバックをくれたお二人とは元の関係性もあるのである種甘めに見てもらっているのでは?という思いが拭いきれませんでした。 そんな中 Okinawa.pm(という名の飲み会)があることを知り、参加させてもらいました。

他人にhtmxの話をしたのはここが初めてで、思った以上に聞いてくれて嬉しかったです。

特に実際のプロダクトへの導入を決めた @codehex さんの振る舞いがびっくりしたのとトークへの自信に繋がりました。

皆さんの協力があってのLTでした。本当にありがとうございました。

LTの後

ハッカーズチャンプルーにて

LTの後、ありがたいことにお声掛けいただいてhtmxや現代のフロントエンド事情についての情報交換ができてとても良かったです。

htmxのユースケースはまさに

nekorails.hatenablog.com

で言及されているところだなと感じました。

X(旧Twitter)にて

LT中に作者がハッカーズチャンプルー経由でのポスト(旧ツイート)を見つけたようでスクリーンショットを貼りツイートしてくれました。

日本語でのトークを喜んでくださる方 *1や(僕の知っている範囲で)日本圏唯一のhtmxフリークな方からもリプライ*2をもらえてとても嬉しかったです。

雨宿りついでに撮ってもらったhtmxのTシャツ(こちらから購入できます)のツイートも作者が見てくれました。

言語を超えて、推しを応援していることが伝える事ができました。LTをしていなかったらこうはならなかったです。

ハッカーズチャンプルー、貴重な経験をありがとう。

とても楽しかったです。

私のDjango情報収集

ここ2~3年ぐらいはPythonフレームワークであるDjangoでのWebアプリケーション開発を行っています。

Djangoでの開発は今回がはじめてで、これまではRuby on RailsRails)を使って開発していました。

自分なりに試行錯誤する中で、いくつかアクセスする情報源が定まってきたのでそれについて書こうと思います。

Django News

Django News

週1日、Djangoに関するニュースレターを配信しているサイトです。Djangoに限らず、技術系のトピックはニュースレターから仕入れることが多いです。

過去に配信された一覧は登録なしで閲覧できます https://django-news.com/issues

Django Chat

djangochat.com

Django Newsのキュレーションをしている https://github.com/wsvincent さんと つい先日までDjangoのフェローだった https://github.com/carltongibson の二人がホストをしているPodcastです。

ここの情報を積極的に見るというよりは、ここでDjangoに関わっている人を見つける感じです。英語のリスニングが苦手なので、内容はあまり理解できていません 😇

DjangoConUS, DjangoCon Europe, DjangoCongress JPのYouTubeチャンネル

Djangoに関するカンファレンスのアーカイブも見ています。

www.youtube.com

www.youtube.com

www.youtube.com

ちなみに、DjangoCongress JPが2023年10月7日に開催します。当日参加できないのが残念ですが、楽しみです!

django.connpass.com

Django Fellow Report

forum.djangoproject.com

Djangoのフェローが毎週自身の活動をフォーラムに投稿しているので、メールで購読しています。

どんな提案があったのか、どんなプルリクエストが来たのかなど今のDjangoを知りたいなと思ったのが理由です。

興味があるところを見るだけ、という感じです。

Djangoの情報収集で困っていること

僕自身が情報収集に関して困っていることもあるので、Django有識者の方に教えてもらいたいです。

DjangoAPIリファレンスがほしい

個人的にRailsで開発していたときにお世話になっていた https://api.rubyonrails.org/ みたいなものがDjangoにもあったらいいなと思っているのですが、見つけきれていません。https://api.rubyonrails.org/ はサクッと入力してメソッドにたどり着けるのが快適でした。

Djangoソースコードを読むことになり結果それはそれで勉強になっているのでいいのですが、もうちょっと効率的にやりたいなぁと思ってます。

--- 2023-09-24 21:29 追記 ---

djangoproject.jp

のDiscordサーバ (招待リンクはこちら)で質問したところ、

API Reference | Django documentation | Django

を教えてもらいました。 @yamaneko さんコメントありがとうございました!

--- 追記ここまで ---

以上です。「こういうサイトや書籍も便利だよ〜」というのがあればぜひ知りたいです!

heroku/pythonからPython2のサポートが外れたことの回避策

遭遇した問題

原因

使用していたbuildpackであるheroku/pythonのバージョンがあがり、Python 2.7がサポート外になったこと。

対策

Python 2.7 EOL FAQ | Heroku Dev Center に記述があるとおり、buildpackのURLを heroku/python から https://github.com/heroku/heroku-buildpack-python#v218 に変更する必要がある。

参考