Как переопределить fields_view_get для TransientModel в odoo 10?

Я уже сделал это, и в более старой версии odoo это работало! Не могу увидеть этот сигнал «kecske» в файле журнала. Нет сообщения об ошибке. Если бы я написал какой-то код перед super, это не имело бы никакого эффекта.

Есть идеи? Это правильный путь?

class DemoWizard(models.TransientModel):
    _name = 'demo.wizard'

    name = fields.Char(string='Name')

    @api.model
    def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False):
        log = logging.getLogger('demo.wizard.fields_view_get()')
        log.debug('kecske')
        return super(DemoWizard,self).fields_view_get(view_id, view_type, toolbar, submenu)

person Döme    schedule 27.01.2017    source источник
comment
Я собираюсь опубликовать пример из исходного кода Odoo10. Я не проверял это. Это выглядит очень близко к тому, что у вас есть. Единственная разница, которую я вижу, заключается в том, что в вызове Odoo к super() они используют аргументы ключевого слова, а не позиционные аргументы.   -  person Phillip Stack    schedule 27.01.2017


Ответы (1)


Это из источника Odoo10. Файл находится в аддоне анонимизации. odoo/addons/anonymization/wizard/anonymize_wizard.py. Обратите внимание на вызов super() и использование аргументов ключевого слова вместо позиционных аргументов.

В остальном ваш код выглядит правильно.

В вашем примере вы инициализировали ведение журнала, используя другую технику. Попробуйте инициализировать регистратор следующим образом.

log = logging.getLogger(__name__)
log.info("My Log Message")

или для отладки.

log.debug("My debug message")

info,debug,warning,error можно использовать для регистрации различных степеней серьезности сообщений журнала.

@api.model
def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False):
    state = self.env['ir.model.fields.anonymization']._get_global_state()
    step = self.env.context.get('step', 'new_window')
    res = super(IrModelFieldsAnonymizeWizard, self).fields_view_get(view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu)
    eview = etree.fromstring(res['arch'])
    placeholder = eview.xpath("group[@name='placeholder1']")
    if len(placeholder):
        placeholder = placeholder[0]
        if step == 'new_window' and state == 'clear':
            # clicked in the menu and the fields are not anonymized: warn the admin that backuping the db is very important
            placeholder.addnext(etree.Element('field', {'name': 'msg', 'colspan': '4', 'nolabel': '1'}))
            placeholder.addnext(etree.Element('newline'))
            placeholder.addnext(etree.Element('label', {'string': 'Warning'}))
            eview.remove(placeholder)
        elif step == 'new_window' and state == 'anonymized':
            # clicked in the menu and the fields are already anonymized
            placeholder.addnext(etree.Element('newline'))
            placeholder.addnext(etree.Element('field', {'name': 'file_import', 'required': "1"}))
            placeholder.addnext(etree.Element('label', {'string': 'Anonymization file'}))
            eview.remove(placeholder)
        elif step == 'just_anonymized':
            # we just ran the anonymization process, we need the file export field
            placeholder.addnext(etree.Element('newline'))
            placeholder.addnext(etree.Element('field', {'name': 'file_export'}))
            # we need to remove the button:
            buttons = eview.xpath("button")
            for button in buttons:
                eview.remove(button)
            # and add a message:
            placeholder.addnext(etree.Element('field', {'name': 'msg', 'colspan': '4', 'nolabel': '1'}))
            placeholder.addnext(etree.Element('newline'))
            placeholder.addnext(etree.Element('label', {'string': 'Result'}))
            # remove the placeholer:
            eview.remove(placeholder)
        elif step == 'just_desanonymized':
            # we just reversed the anonymization process, we don't need any field
            # we need to remove the button
            buttons = eview.xpath("button")
            for button in buttons:
                eview.remove(button)
            # and add a message
            placeholder.addnext(etree.Element('field', {'name': 'msg', 'colspan': '4', 'nolabel': '1'}))
            placeholder.addnext(etree.Element('newline'))
            placeholder.addnext(etree.Element('label', {'string': 'Result'}))
            # remove the placeholer:
            eview.remove(placeholder)
        else:
            raise UserError(_("The database anonymization is currently in an unstable state. Some fields are anonymized,"
                              " while some fields are not anonymized. You should try to solve this problem before trying to do anything else."))
        res['arch'] = etree.tostring(eview)
    return res
person Phillip Stack    schedule 27.01.2017
comment
К сожалению, это не решает мою проблему. В журнале до сих пор нет того, что я пишу перед возвращением, как я уже сказал. И эти два метода вызова одинаковы. Но спасибо за помощь в намеренном ответе. - person Döme; 27.01.2017
comment
С уважением к вам регистратор. Обычно я вижу регистратор, инициализированный таким образом. log = logging.getLogger(__name__) можете ли вы попробовать это и посмотреть, появится ли ваш журнал? - person Phillip Stack; 27.01.2017
comment
Кроме того, в вашей конфигурации или сценарии запуска сервера вы регистрируетесь на уровне отладки? Убедитесь, что вы ведете журнал на том уровне, для которого ваш код выводит журналы. Если ваш стартовый скрипт использует info, вам следует использовать log.info('Hello World') - person Phillip Stack; 27.01.2017
comment
Уууу, ты прав, когда сказал getLogger(__name__)! :O (уровень журнала был правильным) В старой версии этот getLogger работает хорошо. Мне стыдно. Но когда я вызываю такую ​​функцию, как self.myFunction(), и этот метод содержит getLogger(__name__) и log.debug('kamion') в верхней части метода, его все равно нет в файле журнала. - person Döme; 27.01.2017
comment
Попробуйте использовать ведение журнала информационного уровня. log.info('Hello') не уверен, почему это не работает для вас. - person Phillip Stack; 27.01.2017
comment
Не работает, но когда я копирую код метода в fields_view_get, он работает... что это за хрень? Но первоначальная проблема была решена. Так что, если вы отредактируете ответ, я поставлю вам отметку «принять». И еще раз огромное спасибо! - person Döme; 27.01.2017
comment
Что вы подразумеваете под копированием кода метода в fields_view_get? Я не уверен, знаю ли я, как отредактировать свой ответ, чтобы он был правильным. - person Phillip Stack; 27.01.2017
comment
Что мне следует изменить? - person Phillip Stack; 27.01.2017
comment
Я скопировал код self.myFunction() в функцию fields_view_get, и это сработало. Но когда я только что вызвал эту функцию, этого не произошло. Ключевой идеей решения стал ваш комментарий к регистратору. - person Döme; 27.01.2017
comment
Я добавлю примечания к моему ответу. Большое тебе спасибо. Я рад, что вы продвигаетесь в своем проекте сейчас. Хорошего дня! - person Phillip Stack; 27.01.2017