ラベル python の投稿を表示しています。 すべての投稿を表示
ラベル python の投稿を表示しています。 すべての投稿を表示

2010年3月23日火曜日

Djangoのパーミッションテーブルを更新するスクリプト

Djangoでproxy modelというものを使って、ひとつのモデルを複数にわけて、
管理するようにした際に、片方のモデルがadminのユーザーパーミッション一覧に
表示されなくて困っていた。

ユーザーパーミッションのテーブルを更新する方法がないかと
調べてみるとこんなページを発見

http://www.djangosnippets.org/snippets/698/

これを参考にパーミッションを更新するスクリプトを書いてみた。


# -*- coding: utf-8 -*-
from django.core.management.base import BaseCommand
from django.contrib.contenttypes.management import update_all_contenttypes
from django.contrib.auth.management import create_permissions
from django.db.models import get_apps


"""
パーミッションを更新する
"""
class Command(BaseCommand):
def handle(self, *args, **options):

# Add any missing content types
update_all_contenttypes()

# Add any missing permissions
for app in get_apps():
create_permissions(app, None, 2)



これをインストール済みのアプリのmanagement/commands/syncpermissions.pyとして保存すれば、以下のコマンドで更新できる。


$ python manage.py syncpermissions

2009年11月20日金曜日

Python 今日覚えたこと

utf-8な文字列を内部で扱う形式にデコードする際、


unicode_str = utf8_data.decode('utf-8')

とするとutf8_dataにデコードできないバイト列があった場合、UnicodeDecodeErrorの例外をだす。


UnicodeDecodeError: 'utf8' codec can't decode byte 0xb4 in position 1: unexpected code byte


デコードできない文字列を削除してしまっていいのなら'ignore'を引数で渡してやればよい。


unicode_str = utf8_data.decode('utf-8', 'ignore')


さらにdecodeよりunicodeの方が高速らしい。


unicode_str = unicode(utf8_data, "utf-8", 'ignore')


エンコード、デコードの概念はPerlと同じなので理解しやすかった。

参考
http://snippets.hachinos.net/lang/python/user/piro_suke/3/
http://d.hatena.ne.jp/methane/20090816/1250433407

2009年11月18日水曜日

saveをオーバーライドする時はforce_insert、force_updateを渡す

Djangoでdjango.db.Modelsのsaveメソッドをオーバーライドする際


def save(self):


とすると、create()とget_or_create()で以下のようなエラーを吐いた。


TypeError: save() got an unexpected keyword argument 'force_insert'


saveにforce_insert,force_updateを渡すようにしないといけないらしい。
正解はこう


def save(self, force_insert=False, force_update=False):


http://code.djangoproject.com/wiki/BackwardsIncompatibleChanges


create() and get_or_create() will never update existing objects ¶

In [8670] a change was made to both create() and get_or_create() that affects people in two ways:

Firstly, if you have a custom save() method on your model and it is going to be called using create() or get_or_create(), you should make sure you accept the force_insert parameter (best to accept force_update as well, just like django.db.models.base.Model.save()). You don't have to do anything with these parameters, just pass them through to the Model.save() method.

2009年11月17日火曜日

urllib2でgzipされたデータを扱う

ここに書いてあった。
http://diveintomark.org/projects/misc/httpgzip.py.txt

StringIOよりcStringIOのが高速でよいと聞いたのでそちらを使ってみる。
それ以外はまるパクリ。



import urllib2, gzip, cStringIO

def get(uri):
request = urllib2.Request(uri)
request.add_header("Accept-encoding", "gzip")
usock = urllib2.urlopen(request)
data = usock.read()
if usock.headers.get('content-encoding', None) == 'gzip':
data = gzip.GzipFile(fileobj=cStringIO.StringIO(data)).read()
return data

if __name__ == '__main__':
import sys
uri = sys.argv[1:] and sys.argv[1] or 'http://mixi.jp/'
print get(uri)

2009年6月4日木曜日

10日でおぼえるPython入門教室

CMSコミュニケーションズの寺田さんから「10日でおぼえるPython入門教室」を献本いただきました!
どうもありがとうございます!!

ちょうど僕の中で「Python」が熱くなっていたところだったんです!
まさにベストなタイミング!

10日目にはGoogle App Engineの使い方の解説もあるみたい。
これからじっくり読んでみます。


10日でおぼえる Python 入門教室
穂苅 実紀夫 寺田 学 中西 直樹 堀田 直孝 永井 孝
翔泳社
売り上げランキング: 5963