### 甘特图 水平条形图通常用于显示项目的规划和进展,它们的根元素是 `<gantt>`. ~~~ xml <gantt string="Ideas" date_start="invent_date" color="inventor_id"> <level object="idea.idea" link="id" domain="[]"> <field name="inventor_id"/> </level> </gantt> ~~~ 练习 甘特图 添加一个“甘特图”允许用户查看会议调度与学术开放模块。会议应该由讲师分组。 1. 创建一个计算字段,在数小时内表示会话的持续时间 2. 添加“甘特图”视图的定义,并添加“甘特图”视图的*会议*模型的作用 *openacademy/models.py* ~~~ python end_date = fields.Date(string="End Date", store=True, compute='_get_end_date', inverse='_set_end_date') hours = fields.Float(string="Duration in hours", compute='_get_hours', inverse='_set_hours') @api.depends('seats', 'attendee_ids') def _taken_seats(self): for r in self: ~~~ ~~~ python end_date = fields.Datetime.from_string(r.end_date) r.duration = (end_date - start_date).days + 1 @api.depends('duration') def _get_hours(self): for r in self: r.hours = r.duration * 24 def _set_hours(self): for r in self: r.duration = r.hours / 24 @api.constrains('instructor_id', 'attendee_ids') def _check_instructor_not_in_attendees(self): for r in self: ~~~ *openacademy/views/openacademy.xml* ~~~ xml </field> </record> <record model="ir.ui.view" id="session_gantt_view"> <field name="name">session.gantt</field> <field name="model">openacademy.session</field> <field name="arch" type="xml"> <gantt string="Session Gantt" color="course_id" date_start="start_date" date_delay="hours" default_group_by='instructor_id'> <field name="name"/> </gantt> </field> </record> <record model="ir.actions.act_window" id="session_list_action"> <field name="name">Sessions</field> <field name="res_model">openacademy.session</field> <field name="view_type">form</field> <field name="view_mode">tree,form,calendar,gantt</field> </record> <menuitem id="session_menu" name="Sessions" ~~~