Как отфильтровать пользователей системы из контактов в Odoo?

В модуле «Календарь» есть поле «Участники», и эти участники подключены к «res.partner». Проблема в том, что показывает все значения контактов, как отфильтровать значения или показывать только пользователей системы в поле many2manyn?

_columns = {
'partner_id': fields.many2one('res.partner', 'Contact', readonly="True"),

def onchange_partner_id(self, cr, uid, ids, partner_id, context=None):
"""
Make entry on email and availability on change of partner_id field.
@param partner_id: changed value of partner id
"""
if not partner_id:
return {'value': {'email': ''}}
partner = self.pool['res.partner'].browse(cr, uid, partner_id, context=context)
return {'value': {'email': partner.email}}

и представление файла xml выглядит так

<field name="partner_ids" widget="many2manyattendee"
context="{'force_email':True}"
on_change="onchange_partner_ids(partner_ids)"
class="oe_inline" />

person Shravy    schedule 04.11.2015    source источник


Ответы (3)


Я столкнулся с той же проблемой, и самое простое решение — изменить непосредственно файл .../addons/base_calendar/crm_meeting_view.xml и строку:

<field name="partner_ids" widget="many2many_tags"
    context="{'force_email':True}"
    on_change="onchange_partner_ids(partner_ids)"/>

to

<field name="partner_ids" widget="many2many_tags"
    context="{'force_email':True}"
    domain="[('user_ids','!=',False)]"
    on_change="onchange_partner_ids(partner_ids)"/>

если вы не хотите изменять исходные файлы, вы можете наследовать от view_crm_meeting_form и внести соответствующие коррективы.

person Ethan Furman    schedule 09.11.2015
comment
@ShravyaShetty: когда вы обновляете файл xml (или _columns файла py), вы должны перезапустить сервер и обновить затронутые модули. Итак, в вашем случае что-то вроде openerp --update base_calendar. - person Ethan Furman; 09.11.2015
comment
Да, я это знаю, и я сделал все, пока не обновил модуль. - person Shravy; 11.11.2015

Если вы хотите видеть только пользователей системы, используйте res.users вместо res.partner. Нравиться:-

'partner_id': fields.many2one('res.users', 'Contact', readonly="True"),

Надеюсь это поможет.

person Baiju KS    schedule 04.11.2015
comment
у него много зависимостей Байдзю, такое изменение не работает - person Shravy; 04.11.2015

Я бы добавил функциональное поле в класс res.partner, которое определяет, является ли партнер пользователем.

  1. определите поле в вашей модели:
'is_user': fields.function(
        _is_user,
        type='boolean',
        string='Is User',
        store=True)
  1. создайте связанную функцию:
def _is_user(self, cr, uid, id, field_name,
args,context=None):
    res={}
    partner = self.read(cr,uid,id,fields=['user_id'],context=context)
    if partner[0]['user_id']:
        res[id[0]]=True
    else:
        res[id[0]]=False
    return res 
  1. измените определение вашего связанного поля в родительском объекте:
_columns = {
            'partner_id': fields.many2one('res.partner',
                'Contact',
                readonly="True", 
                domain="[('is_user','=', True)]")

Примечание. Возможно, вам придется вручную заполнить значения поля is_user в базе данных для существующих записей в таблице res_partner (запустите что-то вроде этого):

update res_partner set is_user='t' where user_id is not null;
person zee    schedule 05.11.2015
comment
user_id — продавец; user_ids являются связанными пользователями для партнера. - person Ethan Furman; 09.11.2015
comment
Я предполагаю, что следующее предложение сбило меня с толку пользователей системы. Теперь это работает? - person zee; 10.11.2015
comment
Проблема в том, что OpenERP использует user_id очень запутанным образом — должно было быть salesperson_id, так как оно есть. Поэтому им пришлось придумать новое имя, и они выбрали user_ids (а не s) и сделали его полем one2many. Итак, чтобы узнать, является ли партнер также пользователем, вам нужно посмотреть на поле partner.user_ids (обратите внимание на s) и посмотреть, есть ли в нем что-то. - person Ethan Furman; 11.11.2015