2010年10月29日金曜日

さくらでFlask(CGI)

さくらでFlaskをCGIで動かすには。
まずなにはともあれHello Flaskということで
# -*- encoding: utf-8 -*-

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello Flask World!"

'''
if __name__ == "__main__":
    app.debug = True
    app.run()
'''
続けてCGI
#!/home/path2yourVirtualenv/bin/python
# -*- encoding: utf-8 -*-

from wsgiref.handlers import CGIHandler
from helloFlask import app

CGIHandler().run(app)
 .htaccessに
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /helloCGI.cgi/$1 [QSA,L]
 きもはCGIの1行目virtualenvへのpathの設定

2010年10月27日水曜日

Django-cmsでauth

たとえばadminページで
auth | group | Can add group
auth | group | Can change group
auth | group | Can delete group
と表示されているとき

userPermissions = user.get_all_permissions()
でユーザーと所属グループのpermissionsを得る。上記の例なら、
userPermissions = [u"auth.add_group", u"auth.change_group", u"auth.delete_group", ]
そこでパーミッションを例えば
u"auth.add_group" in userPermissions
で分解して個別のpermissionを得る。

追記: has_perm(perm), has_perms(perm_list)を使う。

templatetagsでのerrorはTemplateSyntaxError

templatetagsでerrorを起こすとdebug表示でTemplateSyntaxErrorが表示される。

Django-cmsでgroup

userは必ず1つのグループに所属しなければならない。
permissionを持たないグループも必要かも。

2010年10月26日火曜日

python manage.py syncdbで入力不要

python manage.py --noinput syncdb
でプロンプトがでなくなる。あとは
python manage.py createsuperuser --username=foo --email=hoge
でスーパーユーザーをつくればOK!
deployでつかえる。

追記:createsuperuserでスーパーユーザーを作るときはpost_saveシグナルが発行された後        is_staff = True, is_active = True, is_superuser = Trueが設定される。

2010年10月20日水曜日

2010年10月19日火曜日

Boost.Pythonのデバッグ

メモのみ

gdb --args python [./test.py]
C++のクラスをpythonにさらしてインタープリターからコントロールしようとすると
Segmentation fault
同じライブラリでC++のアプリから同じ手順で動かすと動く。
それもある特定のオブジェクトを使ったときだけ…不思議じゃ。
Boost PythonとBoost serializationの相性か?
boost-1.44 
Ubuntu10.04
GCC-4.4.3
python 2.6.5
 
追記10/22
どうも根が深いみたい。ここ 
gdb --args python ./test.py
だと
Program received signal SIGSEGV, Segmentation fault.
0xb5010c17 in __cxa_allocate_exception () from /usr/lib/libstdc++.so.6
LD_PRELOAD="libGL.so libstdc++.so.6" gdb --args python ./test.py
だと
Traceback (most recent call last):
  File "./test.py", line 16, in <module>
    lst.save("./test.xml")
RuntimeError: unregistered class - derived class not registered or exported

Program exited with code 01.

2010年10月16日土曜日

重複取り出し

setを使うべきでした。

#!/usr/bin/env python
#-*- coding:utf-8 -*-

answer0 = 'a'
answer1 = 'b'
answer2 = 'c'
answer3 = 'b'
answer4 = 'd'

passPhrases = (answer0, answer1, answer2, answer3, answer4, )
sets = set('')
ret = []
size = 0
for item in passPhrases:
    sets.add(item)
    if len(sets)== size:
        ret.append(item)

    size = len(sets)

print ret
dups = {}
for dup in ret:
    duplist = []
    pos =0
    for item in passPhrases:
        if item == dup:
            duplist.append(pos)
        pos =pos + 1

    dups[dup] = duplist

print dups

2010年10月15日金曜日

PILで文字列画像化

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import Image, ImageFont, ImageDraw

# output string
emailString = u"こんにちは"
#get font metrics
font = ImageFont.truetype("/usr/share/fonts/truetype/takao/TakaoPGothic.ttf", 24, encoding='unicode')
size = font.getsize(emailString)
#create image
image = Image.new('RGBA', (size[0]+10, size[1]+10), (0, 0, 0, 0))
draw = ImageDraw.Draw(image)
# use a truetype font
draw.text((5, 5), emailString, font=font, fill='#000000')
#save the image
image.save("string.png", 'PNG')

 でけた。

2010年10月13日水曜日

django-cmsでsnippetのi18n

snippetの中に{% trans "Site Map" %}としてやってもdjango-admin makemessagesでは取り出してくれない。*.htmlだけだから?でもsnippetsはdbの中にあるし。
しかたがないのでdjango.poの末尾に
msgid "Site Map"
msgstr "サイトマップ"
と付けた。

templateに出してみることをしてみたが、今度は肝心のmenuがそのまま出力されてしまう。ちなみにコードはこう。
{% load cache cms_tags %}
{% load cms_tags menu_tags %}
{% load i18n %}
<h2>{% trans "Site Map" %}</h2>
<ul  id="siteMapTree" class="treeview">
    {% show_menu 0 100 100 100 %}
</ul>

2010年10月12日火曜日

django-cmsでdjago-scheduleの年間スケジュールの月名をi18n

オリジナルはpythonのlocaleで月名を出しているので

periods.pyのclass Month(Period)のdef name(self)を
    def name(self):
        return self.start.strftime('%B')
から
    def name(self):
        monthName=(_('January'), _('February'), _('March'), _('April'),
                _('May'), _('June'), _('July'), _('August'),
                _('September'), _('October'), _('November'), _('December'), )
        month = int(self.start.strftime('%m')) - 1
        return monthName[month]
に変更。

えらい苦労したぞ。

djangoでnew userにpassword change mailを送る

サイトにアカウントを作成したら、ユーザーにパスワードを設定してもらえるようにメールを送りたい。
 1)emailを必須に(django/contrib/auth/models.py version 1.2.3)
@@ -196,7 +196,7 @@
     username = models.CharField(_('username'), max_length=30, unique=True, help_text=_("Required. 30 characters or fewer. Letters, numbers and @/./+/-/_ characters"))
     first_name = models.CharField(_('first name'), max_length=30, blank=True)
     last_name = models.CharField(_('last name'), max_length=30, blank=True)
-    email = models.EmailField(_('e-mail address'), blank=True)
+    email = models.EmailField(_('e-mail address'), blank=False)
     password = models.CharField(_('password'), max_length=128, help_text=_("Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change password form</a>."))
     is_staff = models.BooleanField(_('staff status'), default=False, help_text=_("Designates whether the user can log into this admin site."))
     is_active = models.BooleanField(_('active'), default=True, help_text=_("Designates whether this user should be treated as active. Unselect this instead of deleting accounts."))
2)admin pageに表示(django/contrib/auth/admin.py version 1.2.3)
@@ -34,7 +34,7 @@
     add_fieldsets = (
         (None, {
             'classes': ('wide',),
-            'fields': ('username', 'password1', 'password2')}
+            'fields': ('username', 'password1', 'password2', 'email')}
         ),
     )
     form = UserChangeForm
 3)User post save signal(profile/models.py)
from django.db.models.signals import post_save
from django.contrib.sites.models import Site
from django.core.mail import send_mail
from django.contrib.auth.tokens import default_token_generator
from django.template import Context, loader
from django.utils.http import int_to_base36

def sendEmailToNewUser(sender, **kwargs):
    if kwargs['created']:
        domain_override=None
        email_template_name='registration/add_member_email.html'
        use_https=False
        token_generator=default_token_generator
        '''
        Generates a one-use only link for resetting password and sends to the user
        from django.contrib.auth.forms.PasswordResetForm.save
        '''
        if not domain_override:
            current_site = Site.objects.get_current()
            site_name = current_site.name
            domain = current_site.domain
        else:
            site_name = domain = domain_override
        user = User.objects.get(id=kwargs['instance']._get_pk_val())
        t = loader.get_template(email_template_name)
        c = {
            'email': user.email,
            'domain': domain,
            'site_name': site_name,
            'uid': int_to_base36(user.id),
            'user': user,
            'token': token_generator.make_token(user),
            'protocol': use_https and 'https' or 'http',
        }
        send_mail(_("Set your account on %s as new user") % site_name,
            t.render(Context(c)),  None,  [user.email])

post_save.connect(sendEmailToNewUser, sender=User)
初期化時にはsuperuser作成のときにcrashするので、最後の行をコメントアウト

2010年10月8日金曜日

Epydocって素敵

Epydocって素敵。api吐き出してくれる。
djangoなんかもこう。
使い方は簡単。
epydoc [--html|--pdf] -o [output dir] package_dir
django-cmsもはきだしてみるべい。