2014-09-26 1 views
0

Я пытаюсь создать поле функции, которое получит текущий тип членства члена и сохранит его в новом поле res.partner. Однако этот код не вызывается, когда я создаю или редактирую членство члена. Но если я удалю атрибут store, функциональное поле работает так, как ожидалось. Обратите внимание, что я повторно использую модуль членства openerp и теперь использую odoo8. Я прикрепляю код, пожалуйста, дайте мне знать, где я ошибаюсь. Мне нужно, чтобы этот метод назывался atleast, когда я использую атрибут store. Я неправильно использую атрибут магазина:Open ERP- Функциональное поле, которое не получает вызов из кода

from openerp.osv import osv, fields 

class partner_member(osv.Model): 
    '''Partner''' 
    _inherit = 'res.partner' 

    def _get_membership_type(self,cr,uid,ids,context=None): 
     member_line_obj = self.pool.get('membership.membership_line') 

     partner_list = [] 
     for line in member_line_obj.browse(cr, uid, ids, context=context): 
      if line.state == 'paid': 
       partner_list.append(line.partner.id) 

     return partner_list 

    def _current_membership(self, cr, uid, ids, field_name= None, arg=False, context=None): 
     res_obj = self.pool.get('res.partner') 
     res_data_obj = res_obj.browse(cr, uid, ids, context=context) 

     res=dict() 

     for member in res_data_obj: 
      if member.member_lines: 
       for lines in member.member_lines: 
        if (lines.state == 'paid'): 
         res[member.id] = lines.membership_id.name_template 
         break 
        else: 
         res[member.id] = 'None' 
      else: 
       res[member.id] = 'None' 

     return res 

    _columns = { 
     'current_membership': 
      fields.function(_current_membership,type='char', 
          string='Current Membership Type', 
          store = { 
           'membership.membership_line': 
            (_get_membership_type, ['state'], 10) 
          }, 
          help="Shows the current membership of a user"), 
    } 

ответ

0

Вы допустили ошибку в методе _get_membership_type(). Действительно, вы возвращаете только список res.partner, которые находятся в строке с состоянием == 'paid'.

Я думаю, вы должны вернуть всех партнеров, которые находятся в строках, независимо от состояния линии.

def _get_membership_type(self,cr,uid,ids,context=None): 
    member_line_obj = self.pool.get('membership.membership_line') 

    partner_list = [] 
    for line in member_line_obj.browse(cr, uid, ids, context=context): 
     partner_list.append(line.partner.id) 

    return partner_list 
+0

Но Atleast, моя функция должна быть вызвана при отладке. Я поставил там отладочную точку, но при отладке функция никогда не вызывается. Я определенно попробую то, что вы предложили, и может быть, мой код неверен. Но я все еще удивляюсь, что мешает тому, чтобы метод вызывался. – user3402084

+0

Я пробовал ваш подход. Метод все еще не вызван. Атрибут store просто не работает независимо от того, что я делаю. Я попытался перезагрузить сервер и повторно установить модуль несколько раз. Я также несколько раз удалял базу данных и создавал новые, но для меня ничего не работает. Это действительно расстраивает. – user3402084

0

Если вы хотите, чтобы ваша функция _current_membership быть метод вашего класса (как вы это делали), нужно добавить параметр method=True к вашему определению поля:

_columns = { 
    'current_membership': 
     fields.function(_current_membership,type='char', 
         string='Current Membership Type', 
         store = { 
          'membership.membership_line': 
           (_get_membership_type, ['state'], 10) 
         }, 
         help="Shows the current membership of a user", 
         method=True), 
} 

Это должно решить ваши проблема.

Конечно, вы можете просто использовать store=True, чтобы ваше поле пересчитывалось при каждом изменении в любом поле вашего объекта.