ผลต่างระหว่างรุ่นของ "Tutorial Odoo 9.0 Part 9 : Advanced Views"
Sirawich (คุย | มีส่วนร่วม) |
Sirawich (คุย | มีส่วนร่วม) ล |
||
(ไม่แสดง 1 รุ่นระหว่างกลางโดยผู้ใช้คนเดียวกัน) | |||
แถว 138: | แถว 138: | ||
แก้ไขไฟล์ดังนี้ | แก้ไขไฟล์ดังนี้ | ||
<br/><br/> | <br/><br/> | ||
− | openacademy/ | + | openacademy/views/openacademy.xml |
<br/> | <br/> | ||
ส่วนที่ 1 | ส่วนที่ 1 | ||
แถว 335: | แถว 335: | ||
openacademy/models.py | openacademy/models.py | ||
<pre> | <pre> | ||
+ | duration = fields.Float(digits=(6, 2), help="Duration in days") | ||
+ | seats = fields.Integer(string="Number of seats") | ||
+ | active = fields.Boolean(default=True) | ||
+ | color = fields.Integer() | ||
+ | |||
+ | instructor_id = fields.Many2one('res.partner', string="Instructor", | ||
+ | domain=['|', ('instructor', '=', True), | ||
</pre> | </pre> | ||
<br/> | <br/> | ||
+ | openacademy/models.py | ||
+ | <pre> | ||
+ | </record> | ||
+ | |||
+ | <record model="ir.ui.view" id="view_openacad_session_kanban"> | ||
+ | <field name="name">openacad.session.kanban</field> | ||
+ | <field name="model">openacademy.session</field> | ||
+ | <field name="arch" type="xml"> | ||
+ | <kanban default_group_by="course_id"> | ||
+ | <field name="color"/> | ||
+ | <templates> | ||
+ | <t t-name="kanban-box"> | ||
+ | <div | ||
+ | t-attf-class="oe_kanban_color_{{kanban_getcolor(record.color.raw_value)}} | ||
+ | oe_kanban_global_click_edit oe_semantic_html_override | ||
+ | oe_kanban_card {{record.group_fancy==1 ? 'oe_kanban_card_fancy' : ''}}"> | ||
+ | <div class="oe_dropdown_kanban"> | ||
+ | <!-- dropdown menu --> | ||
+ | <div class="oe_dropdown_toggle"> | ||
+ | <i class="fa fa-bars fa-lg"/> | ||
+ | <ul class="oe_dropdown_menu"> | ||
+ | <li> | ||
+ | <a type="delete">Delete</a> | ||
+ | </li> | ||
+ | <li> | ||
+ | <ul class="oe_kanban_colorpicker" | ||
+ | data-field="color"/> | ||
+ | </li> | ||
+ | </ul> | ||
+ | </div> | ||
+ | <div class="oe_clear"></div> | ||
+ | </div> | ||
+ | <div t-attf-class="oe_kanban_content"> | ||
+ | <!-- title --> | ||
+ | Session name: | ||
+ | <field name="name"/> | ||
+ | <br/> | ||
+ | Start date: | ||
+ | <field name="start_date"/> | ||
+ | <br/> | ||
+ | duration: | ||
+ | <field name="duration"/> | ||
+ | </div> | ||
+ | </div> | ||
+ | </t> | ||
+ | </templates> | ||
+ | </kanban> | ||
+ | </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,graph,kanban</field> | ||
+ | </record> | ||
+ | |||
+ | <menuitem id="session_menu" name="Sessions" | ||
+ | parent="openacademy_menu" | ||
+ | </pre> | ||
+ | <br/> | ||
+ | จากการแก้ไขโค้ดข้างต้น เป็นการเพิ่ม kanban views ให้กับ session ดังภาพ | ||
+ | [[ไฟล์:Odoo9-6-1.png]] | ||
+ | <br/><br/> | ||
+ | สามารถเปลี่ยนสีของ card ได้ (โดยเก็บที่ field <b>color</b>) ดังภาพ | ||
+ | [[ไฟล์:Odoo9-6-2.png]] | ||
+ | <br/><br/> | ||
+ | หัวข้อถัดไป [[Tutorial Odoo 9.0 Part 10 : Workflows]] |
รุ่นแก้ไขปัจจุบันเมื่อ 05:51, 25 กรกฎาคม 2559
เนื้อหา
Advanced Views
Tree views
แก้ไขไฟล์ดังนี้
openacademy/views/openacademy.xml
<field name="name">session.tree</field> <field name="model">openacademy.session</field> <field name="arch" type="xml"> <tree string="Session Tree" decoration-info="duration<5" decoration-danger="duration>15"> <field name="name"/> <field name="course_id"/> <field name="duration" invisible="1"/> <field name="taken_seats" widget="progressbar"/> </tree> </field>
ส่วนนี้เป็นการปรับแก้ไข decoration ของ tree views โดยคิดจาก duration ของ session นั้น
ถ้าหาก duration ของ session น้อยกว่า 5 จะเปลี่ยนสีที่แสดงของ session นั้นเป็นสีฟ้า
แต่ถ้าหาก duration ของ session มากกว่า 15 จะเปลี่ยนสีที่แสดงของ session นั้นเป็นสีแดง ดังภาพ
Calendars
แก้ไขไฟล์ดังนี้
openacademy/models.py
ส่วนที่ 1
# -*- coding: utf-8 -*- from datetime import timedelta from openerp import models, fields, api, exceptions class Course(models.Model):
ส่วนที่ 2
attendee_ids = fields.Many2many('res.partner', string="Attendees") taken_seats = fields.Float(string="Taken seats", compute='_taken_seats') end_date = fields.Date(string="End Date", store=True, compute='_get_end_date', inverse='_set_end_date') @api.depends('seats', 'attendee_ids') def _taken_seats(self):
ส่วนที่ 3
}, } @api.depends('start_date', 'duration') def _get_end_date(self): for r in self: if not (r.start_date and r.duration): r.end_date = r.start_date continue # Add duration to start_date, but: Monday + 5 days = Saturday, so # subtract one second to get on Friday instead start = fields.Datetime.from_string(r.start_date) duration = timedelta(days=r.duration, seconds=-1) r.end_date = start + duration def _set_end_date(self): for r in self: if not (r.start_date and r.end_date): continue # Compute the difference between dates, but: Friday - Monday = 4 days, # so add one day to get 5 days instead start_date = fields.Datetime.from_string(r.start_date) end_date = fields.Datetime.from_string(r.end_date) r.duration = (end_date - start_date).days + 1 @api.constrains('instructor_id', 'attendee_ids') def _check_instructor_not_in_attendees(self): for r in self:
เพิ่ท field end_date ใน session โดยค่าของ end_date จะคำนวนจาก start_date และ duration ของ session นั้นๆ
openacademy/views/openacademy.xml
</field> </record> <!-- calendar view --> <record model="ir.ui.view" id="session_calendar_view"> <field name="name">session.calendar</field> <field name="model">openacademy.session</field> <field name="arch" type="xml"> <calendar string="Session Calendar" date_start="start_date" date_stop="end_date" color="instructor_id"> <field name="name"/> </calendar> </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</field> </record> <menuitem id="session_menu" name="Sessions"
จากโค้ดข้างต้น เป็นการเพิ่ม calendar view ให้กับ session ผลลัพธ์เป็นดังภาพ
Search views
แก้ไขไฟล์ดังนี้
openacademy/views/openacademy.xml
ส่วนที่ 1
<search> <field name="name"/> <field name="description"/> <filter name="my_courses" string="My Courses" domain="[('responsible_id', '=', uid)]"/> <group string="Group By"> <filter name="by_responsible" string="Responsible" context="{'group_by': 'responsible_id'}"/> </group> </search> </field> </record>
ส่วนที่ 2
<field name="res_model">openacademy.course</field> <field name="view_type">form</field> <field name="view_mode">tree,form</field> <field name="context" eval="{'search_default_my_courses': 1}"/> <field name="help" type="html"> <p class="oe_view_nocontent_create">Create the first course </p>
ก่อนจะแก้ไขโค้ดส่วน search views จะสามารถค้นหาได้เฉพาะ name และ description ของ course เท่านั้น ดังภาพ
หลังจากแก้โค้ดในทั้ง 2 ส่วนแล้ว search views จะสามารถ filter ให้แสดงเฉพาะ course ที่เป็นของเราได้ (ต้องเป็น responsible) ดังภาพ
Gantt
แก้ไขไฟล์ดังนี้
openacademy/models.py
ส่วนที่ 1
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:
ส่วนที่ 2
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
</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"
(odoo 9.0 ได้ยกเลิกการใช้งาน gantt views แบบไม่เสียค่าใช้จ่าย หากต้องการใช้งาน ท่านจำเป็นต้องซื้อ จึงนำภาพตัวอย่างมาแสดงเพื่อให้เห็นถึง gantt views โดยคร่าวๆ ดังนี้)
source : https://acespritechblog.files.wordpress.com/2013/08/openerp-gantt-default2.png
Graph views
แก้ไขไฟล์ดังนี้
openacademy/models.py
ส่วนที่ 1
hours = fields.Float(string="Duration in hours", compute='_get_hours', inverse='_set_hours') attendees_count = fields.Integer( string="Attendees count", compute='_get_attendees_count', store=True) @api.depends('seats', 'attendee_ids') def _taken_seats(self): for r in self:
ส่วนที่ 2
for r in self: r.duration = r.hours / 24 @api.depends('attendee_ids') def _get_attendees_count(self): for r in self: r.attendees_count = len(r.attendee_ids) @api.constrains('instructor_id', 'attendee_ids') def _check_instructor_not_in_attendees(self): for r in self:
openacademy/views/openacademy.xml
</field> </record> <record model="ir.ui.view" id="openacademy_session_graph_view"> <field name="name">openacademy.session.graph</field> <field name="model">openacademy.session</field> <field name="arch" type="xml"> <graph string="Participations by Courses"> <field name="course_id"/> <field name="attendees_count" type="measure"/> </graph> </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,graph</field> </record> <menuitem id="session_menu" name="Sessions"
หลังจากแก้ไขโค้ดข้างต้นแล้ว จะได้ผลลัพธ์เป็น graph view ดังภาพ
Kanban
แก้ไขไฟล์ดังนี้
openacademy/models.py
duration = fields.Float(digits=(6, 2), help="Duration in days") seats = fields.Integer(string="Number of seats") active = fields.Boolean(default=True) color = fields.Integer() instructor_id = fields.Many2one('res.partner', string="Instructor", domain=['|', ('instructor', '=', True),
openacademy/models.py
</record> <record model="ir.ui.view" id="view_openacad_session_kanban"> <field name="name">openacad.session.kanban</field> <field name="model">openacademy.session</field> <field name="arch" type="xml"> <kanban default_group_by="course_id"> <field name="color"/> <templates> <t t-name="kanban-box"> <div t-attf-class="oe_kanban_color_{{kanban_getcolor(record.color.raw_value)}} oe_kanban_global_click_edit oe_semantic_html_override oe_kanban_card {{record.group_fancy==1 ? 'oe_kanban_card_fancy' : ''}}"> <div class="oe_dropdown_kanban"> <!-- dropdown menu --> <div class="oe_dropdown_toggle"> <i class="fa fa-bars fa-lg"/> <ul class="oe_dropdown_menu"> <li> <a type="delete">Delete</a> </li> <li> <ul class="oe_kanban_colorpicker" data-field="color"/> </li> </ul> </div> <div class="oe_clear"></div> </div> <div t-attf-class="oe_kanban_content"> <!-- title --> Session name: <field name="name"/> <br/> Start date: <field name="start_date"/> <br/> duration: <field name="duration"/> </div> </div> </t> </templates> </kanban> </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,graph,kanban</field> </record> <menuitem id="session_menu" name="Sessions" parent="openacademy_menu"
จากการแก้ไขโค้ดข้างต้น เป็นการเพิ่ม kanban views ให้กับ session ดังภาพ
สามารถเปลี่ยนสีของ card ได้ (โดยเก็บที่ field color) ดังภาพ
หัวข้อถัดไป Tutorial Odoo 9.0 Part 10 : Workflows