[Hỏi] Tạo menu để gọi method

Thảo luận trong 'Hỏi - Đáp' bắt đầu bởi thinhgr, 16/1/13.

  1. thinhgr Active Member

    Làm sao mình tạo menu phía bên phải. Ví dụ: người sử dụng sẽ check các record trên tree sau đó click menu phía bên phải sẽ gọi method với các ids là các record đã được check.
  2. bruce.nguyen Active Member

    Dear thinhgr:

    Vấn đề bạn hỏi là tạo act_window ( 1 dạng của action ) lên Menu Action default của openerp
    Mình lấy ví dụ module : stock_assigned_picker nhé

    1. FORM
    Mã (xml):
    1. <record id="view_picker_report" model="ir.ui.view">
    2.     <field name="name">Consolidated Pick List</field>
    3.     <field name="model">stock.assigned.picker</field>
    4.     <field name="type">form</field>
    5.     <field name="arch" type="xml">
    6.         <form string="Select User">
    7.             <group height="65" >
    8.                 <field name='name'/>
    9.                 <button name='print_report' type="object" string="Print Report" invisible="0"/>
    10.                 <field name='read_only' invisible="1"/>
    11.             </group>
    12.         </form>
    13.     </field>
    14. </record>
    2. Action gọi FORM
    Mã (xml):
    1. <record id="action_picker_report" model="ir.actions.act_window">
    2.     <field name="name">Consolidated Pick List</field>
    3.     <field name="type">ir.actions.act_window</field>
    4.     <field name="res_model">stock.assigned.picker</field>
    5.     <field name="view_type">form</field>
    6.     <field name="view_mode">form</field>
    7.     <field name="view_id" ref="view_picker_report"/>
    8.     <field name="target">new</field>
    9. </record>
    3. Tạo Action bên tay phải mà bạn muốn, ở đây mình gọi từ stock.picking ( Hay gọi là delivery order, internal move, incomming shippment)
    Mã (xml):
    1. <act_window name="Consolidated Pick List"
    2.    view_id="view_picker_report"
    3.    res_model="stock.assigned.picker"
    4.    src_model="stock.picking" <!--module mà cái view này hiện lên -->
    5.     view_mode="form"
    6.     target="new"
    7.     key2="client_action_multi"
    8.     multi="True"
    9.     id="picker_report_act_window"/>
    loanloan and admin like this.
  3. thinhgr Active Member

    Mình làm được cái menu bên phải hiện lên, nhưng để gọi method thì không được. Trong tài liệu nó có ghi nhưng không có ví dụ.
    Actions

    Introduction


    The actions define the behavior of the system in response to the actions of the users ; login of a new user, double-click on an invoice, click on the action button, ...
    There are different types of simple actions:
    • Window: Opening of a new window
    • Report: The printing of a report
      o Custom Report: The personalized reports o RML Report: The XSL:RML reports
    • Wizard: The beginning of a Wizard
    • Execute: The execution of a method on the server side
    • Group: Gather some actions in one group

    Sao khai báo để gọi method đó lên đây? Cám ơn
  4. thinhgr Active Member

    Mình đã làm như thế này:
    Tạo action window có truyền context
    Mã (xml):
    1.  
    2. <act_window name="Lập lịch bảo trì 123"
    3. view_id="view_laplich_baotri"
    4. res_model="dienmay.phieubaotri.laplich"
    5. src_model="dienmay.phieubaotri"
    6. view_mode="form"
    7. target="current"
    8. multi="True"
    9. key2="client_action_multi"
    10. id="action_view_laplich_baotri"
    11. context = "{'phieubaotri_id': active_id}"/>
    12.  
    Sau đó tạo form
    Mã (xml):
    1.  
    2. <record id="view_laplich_baotri" model="ir.ui.view">
    3. <field name="name">Lập lịch bảo trì</field>
    4. <field name="model">dienmay.phieubaotri.laplich</field>
    5. <field name="type">form</field>
    6. <field name="arch" type="xml">
    7. <form string="Lập lịch bảo trì">
    8. <separator string="Bạn muốn máy tự động lập lịch bảo trì cho tháng kế?" colspan="4"/>
    9. <newline/>
    10. <label string="......
    11. " colspan="4"/>
    12. <newline/>
    13. <separator string="" colspan="4" />
    14. <button special="cancel" string="Cancel" icon="gtk-cancel"/>
    15. <button name="laplichbaotri" string="Merge orders" type="object" icon="gtk-convert"/>
    16. </form>
    17. </field>
    18. </record>
    19.  
    Sau đó trong class dienmay.phieubaotri.laplich mình tạo method
    Mã (python):
    1.  
    2. class laplichbaotri(osv.osv):
    3. _name = 'dienmay.phieubaotri.laplich'
    4. def laplichbaotri(self, cr, uid, ids, context):
    5. phieubaotris = self.pool.get('dienmay.phieubaotri')
    6. phieubaotri = context.value()
    7. raise osv.except_osv(('Hết hàng trong kho'),("%s hết hàng") % (phieubaotri))
    8. return True
    9. laplichbaotri()
    10.  
    Làm cách nào để lấy ra 1 list các active id đó
  5. thinhgr Active Member

    Oh tự mò ra luôn sử dụng context.get('active_ids') là lấy ra được hết khà khà
  6. bruce.nguyen Active Member

    Đoạn raise osv.except_osv(('Hết hàng trong kho'):
    bạn nên đổi thành:
    raise osv.except_osv((u'Hết hàng trong kho')
    có ngày bạn sẻ gặp bug unicode
    admin thích bài này.
  7. thinhgr Active Member

    sao phải đặt chữ u phía trước, chữ u đó có ý nghĩa sao?. Cho nó hiểu rằng phải encode sang utf-8 à
  8. bruce.nguyen Active Member

    Dear thinhgr: trước khi bạn đặt câu hỏi, bạn nên google trước. Như thế tạo cho bạn tính chủ động hơn trong công việc.
    Khi bạn đi làm, chẳng lẻ có vấn đề gì bạn củng lên 4rum post à ?
  9. thinhgr Active Member

    Sorry bạn nhé, tại mình thấy forum mới, đã ít member lại còn ít khi hỏi nữa, nên mình muốn hỏi nhiều hơn thôi. Nếu bạn rảnh thì bạn trả lời, không rảnh thì thôi đâu ai ép bạn phải trả lời liền. Tôi biết đến openerp chỉ mới 2 tháng nay, lúc đó tôi chưa biết python là gì càng không biết openerp và khái niệm ERP?. Lúc forum này chưa có, tôi cũng lang thang qua các forum nước ngoài và blog của wordpress.com của admin chưa từng đặt câu hỏi ở bất kỳ forum nào. Cả cái pentaho phải mất gần cả tuần mới cài được nó, post lên forum cũng có ai trả lời cách cài đâu. Dù sao cũng cám ơn bạn đã giúp tôi rất nhiều.
  10. bruce.nguyen Active Member

    - Dear thinhgr: mình trích dẩn câu của bạn "sao phải đặt chữ u phía trước, chữ u đó có ý nghĩa sao?. Cho nó hiểu rằng phải encode sang utf-8 à", với câu hỏi này bạn
    lên google với systax: unicode with python. Tôi tin rằng kết quả trả về ngoài mông đợi bạn đó. Ý của mình là bạn nên chủ động tìm câu trả lời. Góp ý thôi, nghe không tùy bạn
  11. thinhgr Active Member

    Thực ra cái này tôi cũng gặp rùi trong quá trình sửa lỗi, tôi show các context ra thì thấy trước mỗi cái nó có chữ u, trong report openoffice cũng thấy những tại chưa thấy cần thiết nên không hỏi và cũng không tìm kiếm. Nay thấy ông nói vậy thì sẵn hỏi luôn thôi.
  12. huy_nguyen_41 Member

    chào 2 anh !
    2 anh cho e hỏi chút e muốn làm tương tự như câu hỏi trên top nhưng là tạo 1 button hay đại loại 1 cái gì đấy cũng được thay vì cái action kia để có thể check các record sau đấy ấn cái button kia thì nó gọi 1 def trong python để tác động tất cả các record mình vừa chọn, cái button này kiểu như button delete check các record rồi ấn là nó xóa các record vừa check ý !
    cảm ơn 2 anh trước nhé !
  13. mrkhuongcc Member

    chào mọi người.
    vấn đề 1 cái button trên tree ta có thể thay bằng 1 link giống như delete nhiều record trên tree. E thường dùng action server và ir.values để khai báo và gọi trực tiếp đến 1 method khi click vào link này. lúc này ids trong method sẽ nhận là các item đã check trên tree view.
    huy_nguyen_41 thích bài này.
  14. huy_nguyen_41 Member

    chào anh mrkhuongcc !
    e có làm thử 1 ví dụ như hướng dẫn của anh. nó đã chạy được đến hàm kia rồi nhưng sau đấy báo lỗi, lỗi k biết ở đâu mong a chỉ giúp e với :
    e chỉ muốn ở class qlbanhang.loaihanghoa này có 1 nút khi ấn vào sẽ print ra các id của các record đang check (đã in đươc) nhưng sau đó nó báo lỗi : File "D:\OpenERP\setup library\openerp-6.1-1\openerp\addons\web\controllers\main.py", line 638, in clean_action
    action.setdefault('flags', {})
    AttributeError: 'bool' object has no attribute 'setdefault'

    Mã (text):
    1. <record id="action_multiple_confirmation_qlloaihanghoa" model="ir.actions.server">
    2.                 <field name="name">test_test</field>
    3.                 <field name="model_id" ref="model_qlbanhang_loaihanghoa"/>
    4.                 <field name="state">code</field>
    5.                 <field name="code">action = obj.test2(context=context)</field>
    6.             </record>
    7.  
    8.             <record id="ir_open_multiple_confirmation_qlbanhang_loaihanghoa" model="ir.values">
    9.                 <field eval="'client_action_multi'" name="key2"/>
    10.                 <field eval="'qlbanhang.loaihanghoa'" name="model"/>
    11.                 <field name="name">test_test</field>
    12.                 <field eval="'ir.actions.server,%d'%action_multiple_confirmation_qlloaihanghoa" name="value"/>
    13.                 <field eval="True" name="object"/>
    14.             </record>
    Mã (text):
    1. def test2(self,cr,uid,ids,context=None):
    2.         print context.get('active_ids')
    3.         return True
    cảm ơn anh nhiều ! :)
  15. mrkhuongcc Member

    Chào bạn, nếu bạn muốn lấy các record (các dòng đã check) thì bạn dùng ids ( ids la danh sách id của các record mà bạn check trên tree). lỗi trên của bạn là: context = None nên ko get được active_ids
    huy_nguyen_41 and bruce.nguyen like this.
  16. huy_nguyen_41 Member

    cảm ơn anh !
    nhưng e sửa def test2 thành
    def test2(self,cr,uid,ids,context=context):
    thì vẫn lỗi nhưng sửa lại cái return lại 1 cái tree thì hết lỗi nhưng return về không có kiểu tree,form
    Mã (text):
    1. [/FONT]
    2. return {'name':'loaihanghoa_tree','view_type':'form','view_mode':'tree','view_id':[res and res[1] or False],'res_model':'qlbanhang.loaihanghoa','context':"{}",'type': 'ir.actions.act_window','nodestroy': True,'target': 'current',}
    3. [FONT=monospace]

Chia sẻ trang này