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 則會展開更多欄位資訊。