2015-10-02 8 views
0

Я пытаюсь использовать этот Odoo аддон:Odoo, Python: TypeError: информация() есть несколько значений для ключевого слова аргумента 'названия'

https://www.odoo.com/apps/modules/8.0/warning_box/

https://github.com/ingadhoc/odoo-addons/tree/8.0/warning_box

для отображения некоторых сообщений.

Установочный страница говорит:

usage return self.pool.get('warning_box').info(cr, uid, title='The title', message='the message')

Поскольку код написан в стиле V8.0, я думаю, что это неправильно. Я все равно пробовал, и он дал ошибки о cr и uid.

Затем я попробовал это так:

self.env['warning_box'].info(self, title='The title', message='the message') 

Это дает мне эту ошибку:

TypeError: info() got multiple values for keyword argument 'title'

Это питон код Odoo аддона:

WARNING_TYPES = [('warning', 'Warning'), ('info', 'Information'), ('error', 'Error')] 

class warning_box(models.TransientModel): 
    _name = 'warning_box' 
    _description = 'warning_box' 
    _req_name = 'title' 

    type = fields.Selection(WARNING_TYPES, string='Type', readonly=True) 
    title = fields.Char(string="Title", size=100, readonly=True) 
    message = fields.Text(string="Message", readonly=True) 

    @api.multi 
    def message_action(self): 
     self.ensure_one 
     message_type = [t[1]for t in WARNING_TYPES if self.type == t[0]][0] 
     res = { 
      'name': '%s: %s' % (_(message_type), _(self.title)), 
      'view_type': 'form', 
      'view_mode': 'form', 
      'view_id': self.env['ir.model.data'].xmlid_to_res_id(
       'warning_box.warning_box_form'), 
      'res_model': 'warning_box', 
      'domain': [], 
      'context': self._context, 
      'type': 'ir.actions.act_window', 
      'target': 'new', 
      'res_id': self.id 
     } 
     return res 

    @api.model 
    def warning(self, title, message): 
     record = self.create({'title': title, 'message': message, 'type': 'warning'}) 
     return record.message_action() 

    @api.model 
    def info(self, title, message): 
     record = self.create({'title': title, 'message': message, 'type': 'info'}) 
     return record.message_action() 

    @api.model 
    def error(self, title, message): 
     record = self.create({'title': title, 'message': message, 'type': 'error'}) 
     return record.message_action() 

У меня есть искал ошибку и нашел эти 2 части информации:

class method generates "TypeError: ... got multiple values for keyword argument ..."

TypeError: create() got multiple values for keyword argument 'context'

Я пытался понять и применить его к моей ситуации, но я не могу получить его работу ... Может кто-нибудь сказать мне, что случилось с этим кодом?

редактировать для Forvas:

я теперь вызываем функцию так:

return self.env['warning_box'].error(title='The title', message='the message') 

Это не дает никаких ошибок с указанным кодом.

Теперь я изменил def message_action, как вы сказали. Для этого:

form_view_id = self.env.ref(
     'your_module_name.your_form_view_xml_id').id 

Я использовал:

form_view_id = self.env.ref(
    'warning_box_git.warning_box_form').id 

Просто чтобы убедиться, вы имели в виду имя модуля или название модели? Моя модель (класс) - warning_box, а мое имя модуля - warning_box_git (имя папки модуля). Я сделал это правильно?

В любом случае я получаю эту ошибку:

AttributeError: 'warning_box' object has no attribute 'error'

Это мой XML:

<openerp> 
    <data> 
     <record id="warning_box_form" model="ir.ui.view"> 
      <field name="name">warning_box.form</field> 
      <field name="model">warning_box</field> 
      <field eval="20" name="priority"/> 
      <field name="arch" type="xml"> 
       <form string="Warning"> 
        <field name="message" nolabel="1"/> 
        <footer> 
         <button string="OK" class="oe_highlight" special="cancel"/> 
        </footer> 
       </form> 
      </field> 
     </record> 

     <record model="ir.actions.act_window" id="action_warning_box"> 
      <field name="name">Warning Box</field> 
      <field name="res_model">warning_box</field> 
      <field name="view_type">form</field> 
      <field name="view_mode">form</field> 
      <field name="view_id" ref="warning_box_form" /> 
      <field name="target">new</field> 
     </record> 
    </data> 
</openerp> 

Есть ли у вас какие-либо идеи, как решить эту ошибку?

Редактировать 2 для Forvas: Я сделал глупую ошибку отступа. Теперь эта ошибка исчезла. Но все же, у него нет всплывающих окон?

ответ

0

Вы не можете передать self в качестве параметра.

self.env['warning_box'].info(title='The title', message='the message') 

Вы «передаете» его, когда вызываете модель от self.

EDIT

Try со следующим кодом:

@api.multi 
def message_action(self): 
    self.ensure_one() 
    message_type = [t[1]for t in WARNING_TYPES if self.type == t[0]][0] 
    form_view_id = self.env.ref(
     'your_module_name.your_form_view_xml_id').id 
    return { 
     'name': '%s: %s' % (_(message_type), _(self.title)), 
     'view_type': 'form', 
     'view_mode': 'form', 
     'views': [(form_view_id, 'form'), ], 
     'res_model': 'warning_box', 
     'context': self._context, 
     'type': 'ir.actions.act_window', 
     'target': 'new', 
     'flags': {'action_buttons': True}, 
    } 
+0

Спасибо. Это сработало! Больше никаких ошибок – RobbeM

+0

Но по-прежнему нет всплывающих окон. У вас также есть идеи, почему это может быть? – RobbeM

+0

Я отредактировал свой ответ @RobbeM, посмотрю, что я делаю, когда хочу открыть всплывающее окно (очевидно, замените * your_module_name.your_form_view_xml_id вашими данными). – forvas