at_yasu's blog

ロード的なことを

相手を招待する

今の今まで知らなかった、Gmail+Calenderの機能。

相手がGmailを使ってる場合、招待状を送ることでカレンダーに予定を追加させることができるっぽい。
もちろん許可、不許可や中止など、最終的な操作は向こうができるから、強制的にカレンダーへ追加することはできないけどね。
ただ、Gmailからだと新規作成で予定の作成ができたが2014/07以降は使えなくなるっぽいので、Calenderで予定を作ってから招待という手順になる。

これ: https://support.google.com/calendar/answer/37161?hl=ja

Gmail から送った招待メールはただのText/HTMLだけなんだけど、スパムメール業者がOutlookで送ってきて、それ見たらどうもcalenderのフォーマットであればうまくいくっぽい。

そのスパム業者のメールを見たら、こんな感じだった。

Content-Type: text/calendar; method=REQUEST; name=meeting.ics
Content-Transfer-Encoding: 7bit

BEGIN:VCALENDAR
PRODID:-//Microsoft Corporation//Outlook 12.0 MIMEDIR//EN
VERSION:2.0
METHOD:REQUEST
X-MS-OLK-FORCEINSPECTOROPEN:TRUE
BEGIN:VEVENT
ATTENDEE;CN=A.YASUI+TEST@GMAIL.COM;RSVP=TRUE:mailto:A.YASUI+TEST@GMAIL.COM
CLASS:PUBLIC
CREATED:20140514T140009Z
DTEND:20140514T200009Z
DTSTAMP:20140514T202209Z
DTSTART:20140514T203009Z
LAST-MODIFIED:20140514T143050Z
LOCATION:Test Nanodesu
ORGANIZER;CN="Tesutonano":mailto:a.yasui@gmail.com
PRIORITY:5
SEQUENCE:0
SUMMARY;LANGUAGE=ja-jp:Tesuto nano
TRANSP:OPAQUE
UID:{1e991223-9e1c-4aa9-b8c6-92d9b6e13dce}
X-MICROSOFT-CDO-BUSYSTATUS:TENTATIVE
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOSTARTCHECK:FALSE
X-MS-OLK-CONFTYPE:0
X-MS-OLK-SENDER;CN="Tesuto Nano":mailto:a.yasui@gmail.com
BEGIN:VALARM
TRIGGER:-PT15M
ACTION:DISPLAY
DESCRIPTION:Reminder
END:VALARM
END:VEVENT
END:VCALENDAR

とりあえず。

__str__ と __unicode__ と Python3

いちおう、Django1.5から(だっけ?忘れた)はPython3対応をうたってるけど、__str__ と __unicode__ があってそれの対応方法

デコレ

from django.utils.encoding import python_2_unicode_compatible 
@python_2_unicode_compatible 
class Room (models.Model): 
  def __str__ (self): return self
  # def __unicode__ (self): return self # これが有効になっているとエラーを出す

CakePHP の DebugToolbar みたいなのがほしい

django-debug-toolbar をいれればいい(Django1.6で動いた)

1. pip install django-debug-toolbar
2. インストールした先(virtualenv で py27 とかしている場合、「py27/lib/python2.7/site-packages/debug_toolbar」)にあるtemplates と static を適切なディレクトリにまるごとコピー
3. settings.py に色々追記

MIDDLEWARE_CLASSES = (
    …
    'debug_toolbar.middleware.DebugToolbarMiddleware', # 一番最後出ないとダメだけ、GZip 使ってる場合はそれより上に。
)
INTERNAL_IPS = ('127.0.0.1',)
DEBUG_TOOLBAR_PANELS = (
    'debug_toolbar.panels.version.VersionDebugPanel',
    'debug_toolbar.panels.timer.TimerDebugPanel',
    'debug_toolbar.panels.settings_vars.SettingsVarsDebugPanel',
    'debug_toolbar.panels.headers.HeaderDebugPanel',
    'debug_toolbar.panels.request_vars.RequestVarsDebugPanel',
    'debug_toolbar.panels.template.TemplateDebugPanel',
    'debug_toolbar.panels.sql.SQLDebugPanel',
    'debug_toolbar.panels.signals.SignalDebugPanel',
    'debug_toolbar.panels.logger.LoggingPanel',
)
DEBUG_TOOLBAR_CONFIG = {
    'INTERCEPT_REDIRECTS': True,
    'SHOW_TOOLBAR_CALLBACK': lambda (request): True,
    'EXTRA_SIGNALS': [],
    'HIDE_DJANGO_SQL': True,
    'TAG': 'div',
}

4. これでだいたい見れた

Cake の Session->flash みたいなのはないのか?

メモ書きを一気に。

view 側

{% if messages %}
<ul class="messages"> {% for message in messages %} <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li> {% endfor %}
</ul>
{% endif %}

view.py 側

from django.contrib import messages
MESSAGE_TAGS = {
    messages.INFO: '',
    50: 'critical',
}

def action(request):
    messages.error(request, u'ルーム名を入力してください')
    return render_to_response("hogs.html", {}, context_instance=RequestContext(request))