2012/08/28

ftw.meeting Reviewed

ftw.meeting 是一個 Archetypes 模組,功能跟 Event 類似,不過設計成 folderish 因此可以包含 Meeting Item,搭配 ftw.pdfgenerator 還可以匯出 PDF 檔案。

安裝時的相依模組,主要包括 Products.DataGridField、ftw.calendarwidget。

它使用 ftw.calendarwidget 作為月曆輸入介面,特色是整合了 jQuery UI calendar widget。

在 Event type 欄位選擇 Meeting 項目的話,會在下方即時展開 Meeting form 等四個欄位,它們都指定為 schemata='meeting'。

DataGridField 用於動態新增與會名單,不過實際用到的程式碼有新增 select all 功能,細節可參考 content/widget.py 檔案的 DataGridWidgetExtended 類別內容。

網站新增會員帳號後,就可以成為與會人員的選項。

程式碼範例片段如下:

atapi.StringField(
    name='meeting_type',
    searchable=False,
    schemata='default',
    required=True,
    default='event',
    vocabulary_factory='ftw.meeting.types',

    widget=atapi.SelectionWidget(
        label=_(u"meeting_label_type", default=u"Event type"),
        description=_(u"meeting_help_type",
                      default=u"Choose your event type."),
        helper_js=['meeting_toggle_date.js', ],
        format='radio')),

DataGridField(
    name='responsibility',
    searchable=False,
    schemata='default',
    columns=('contact', ),
    allow_empty_rows=False,

    widget=DataGridWidgetExtended(
        label=_(u"meeting_label_responsibility",
                default=u"Responsibility"),
        description=_(
            u"meeting_help_responsibility",
            default=u"Enter the responsible of the meeting."),
        auto_insert=True,
        select_all_column='contact',
        columns={
            'contact':
                SelectColumn(
                title=_(
                    u"meeting_label_responsibility",
                    default="Responsibility"),
                vocabulary='getAttendeesVocabulary'
                ),
            })),

DataGridField(
    name='attendees',
    searchable=True,
    schemata='meeting',
    columns=('contact', 'present'),
    allow_empty_rows=False,

    widget=DataGridWidgetExtended(
        label=_(u"meeting_label_attendees",
                default=u"Attendees"),
        description=_(u"meeting_help_attendees",
                      default=u"Enter the attendees of the meeting."),
        auto_insert=True,
        select_all_column='contact',

        columns={
            'contact': SelectColumn(
                title=_(
                    u"meeting_label_attendees_attendee",
                    default=u"Attendee"),
                vocabulary='getAttendeesVocabulary'
                ),
            'present': SelectColumn(
                title=_(
                    u"meeting_label_attendees_present",
                    default=u"Present"),
                vocabulary='getPresentOptions',
                ),
            })),

ZODB 裡的儲存範例如下:

>>> app.mysite['my-meeting'].responsibility
({'contact': 'ababy'}, {'contact': 'jsmith'})

>>> app.mysite['my-meeting'].attendees
({'contact': 'ababy', 'present': 'present'},
 {'contact': 'jsmith', 'present': 'excused'})

在顯示上,實作了 Drag and Drop Order 功能,可以即時拖拉來決定 Meeting Item 的順序,它會更新 getObjPositionInParent 的索引值。

點選各別的 Meeting Item 則會展開更多欄位資訊。

No comments: