Перейти к содержимому
Odoo Меню
  • Войти
  • Попробовать бесплатно
  • Модули
    Финансы
    • Бухгалтерия
    • Выставление счетов
    • Расходы
    • Таблицы
    • Документооборот
    • Подпись
    Продажи
    • CRM
    • Продажи
    • POS Магазин
    • POS Ресторан
    • Подписки
    • Аренда
    Вебсайты
    • Конструктор вебсайтов
    • eCommerce
    • Блог
    • Форум
    • Онлайн-чат
    • Электронное обучение
    Логистика
    • Склад
    • Производство
    • PLM
    • Закупки
    • Обслуживание
    • Качество
    Отдел кадров
    • Сотрудники
    • Подбор персонала
    • Отпуска
    • Оценка персонала
    • Реферальная программа
    • Автопарк
    Маркетинг
    • SMM
    • E-mail рассылки
    • СМС рассылки
    • Мероприятия
    • Автоматизация маркетинга
    • Опросы
    Услуги
    • Проекты
    • Табели
    • Выездной сервис
    • Поддержка
    • Планирование
    • Встречи
    Продуктивность
    • Обсуждения
    • Согласование
    • IoT
    • VoIP-телефония
    • Knowledge
    • WhatsApp
    Сторонние приложения Модуль Студия Odoo Платформа Odoo Cloud
  • Индустрии
    Розничная торговля
    • Книжный магазин
    • Магазин одежды
    • Мебельный магазин
    • Продуктовый магазин
    • Строительный магазин
    • Магазин игрушек
    Гостинично-ресторанный бизнес
    • Бар и паб
    • Ресторан
    • Фастфуд
    • Гостевой дом
    • Дистрибьютор напитков
    • Отель
    Недвижимость
    • Агентство недвижимости
    • Архитектурное бюро
    • Строительство
    • Управление недвижимостью
    • Ландшафтный дизайн
    • Товарищество собственников жилья
    Консалтинг
    • Бухгалтерская фирма
    • Партнер Odoo
    • Маркетинговое агентство
    • Юридическая фирма
    • Подбор персонала
    • Аудиторское бюро
    Производство
    • Текстиль
    • Металл
    • Мебель
    • Продукты питания
    • Пивоварня
    • Корпоративные сувениры
    Здоровье и фитнес
    • Спортивный комплекс
    • Магазин оптики
    • Фитнес-клуб
    • Велнес-центр
    • Аптека
    • Салон красоты
    Услуги
    • Специалист по бытовым услугам
    • Продажа и обслуживание IT-оборудования
    • Солнечные энергосистемы
    • Производство обуви
    • Клининг
    • Системы ОВКВ
    Прочее
    • Некоммерческая организация
    • Консалтинг в сфере устойчивого развития
    • Аренда рекламных щитов
    • Бизнес по фотосъемке
    • Прокат велосипедов
    • Реселлер программного обеспечения
    Все индустрии
  • Community
    Обучение
    • Видео уроки
    • Документация
    • Сертификация
    • Тренинг
    • Блог
    • Подкаст
    Образование и развитие
    • Образовательная программа
    • Деловая игра Scale Up!
    • Экскурсия в офис Odoo
    ПО
    • Скачать
    • Сравнить версии
    • Релизы
    Сотрудничество
    • Github
    • Форум
    • Мероприятия
    • Перевод
    • Стать партнером
    • Услуги для партнеров
    • Зарегистрировать бухгалтерскую фирму
    Услуги
    • Найти партнера
    • Найти бухгалтера
    • Встреча с экспертом
    • Услуги по внедрению
    • Отзывы клиентов
    • Поддержка
    • Обновления
    Github Youtube Twitter Linkedin Instagram Facebook Spotify
    +1 (650) 691-3277
    Заказать демонстрацию
  • Цены
  • Поддержка

Odoo is the world's easiest all-in-one management software.
It includes hundreds of business apps:

  • CRM
  • e-Commerce
  • Бухгалтерия
  • Склад
  • PoS
  • Проекты
  • MRP
All apps
Чтобы взаимодействовать с сообществом, необходимо зарегистрироваться.
Все посты Люди Значки
Теги (Смотреть все)
odoo accounting v14 pos v15
Об этом форуме
Чтобы взаимодействовать с сообществом, необходимо зарегистрироваться.
Все посты Люди Значки
Теги (Смотреть все)
odoo accounting v14 pos v15
Об этом форуме
Помощь

How to get attribute from another class using the browse method in OpenERP ?

Подписаться

Получайте уведомления о появлении активности в этом посте

Этот вопрос был отмечен
pythonormbrowsepool
2 Ответы
18607 Представления
Аватар
Oussama

I've installed the oemedical addon in my OperERP 7. I'm adding some modifications on it.
I have a problem with the function _get_ssn_from_name that I have created in the appointment module, which gets the SSN from the oemedical.patient class to display it in oemedical.appointment view.

Here is the code of the class oemedical.appointment containing the function I've developed

    class OeMedicalAppointment(osv.Model):
        _name = 'oemedical.appointment'
        
        # The function causing the problem
        def _get_ssn_from_name(self, cr, uid, ids, field_name, arg, context=None):
            res = {}
            ssn = ''
            for record in self.pool.get('oemedical.patient').browse(cr, uid, ids, context=context):
                # When patient is not yet specified
                if not record.lastname:
                    ssn = 'No Patient Specified!'
        
                # Return the ssn when the caller is the field name
                if field_name == 'alias':
                    if record.ssn:
                        ssn = record.ssn
                    else:
                        ssn = "Not Specified"
                    print("ssn : %s" % ssn)
        
                res[record.id] = ssn
            return res
    
        _columns = {
            'patient_id': fields.many2one('oemedical.patient', string='Patient',
                                       required=True, select=True,
                                       help='Patient Name'),
            'name': fields.char(size=256, string='Appointment ID', readonly=True),
            'appointment_date': fields.datetime(string='Date and Time'),
            'appointment_day': fields.date(string='Date'),
            # some other attributes
            'alias': fields.function(_get_ssn_from_name, type='char', string='SSN', help="Social Security Number", multi=False),
            # other attributes
        }
    
    OeMedicalAppointment()

And here is the code of the class oemedical.patient

    class OeMedicalPatient(osv.Model):
        _name='oemedical.patient'
        _inherits={
            'res.partner': 'partner_id',
        }
    
        _columns={
            'partner_id': fields.many2one(
                'res.partner', 'Related Partner', required=True,
                ondelete='cascade', help='Partner-related data of the patient'),
            'first_name': fields.char(size=256, string='Name', required=True),
            'lastname': fields.char(size=256, string='Lastname', required=True),
            # many other attributes..
            'ssn': fields.char(size=256, string='SSN'),
            # some other attributes..
            'deceased': fields.boolean(string='Deceased'),
        }

    OeMedicalPatient()


Here is the interface of creation of a new appointment : http://i.stack.imgur.com/lX9CE.png

When I create a new patient on the Appointment creation form (the field where I can choose the patient in the screenshot), I doesnt't get an error and everything goes well, but when I try to create an appointment for an existing patient I get the following error :

    AttributeError: 'Field lastname not found in browse_record(oemedical.patient, 8)'

Please help me, and thanks in advance!!

0
Аватар
Отменить
Аватар
René Schuster
Лучший ответ

First of all: The way I would do it (with the tradeoff that the field is empty, if no ssn is given).

Instead of the functional field use a relational field:

'alias': fields.related('patient_id', 'ssn', type='char', string='SSN', store=False)

 

Now to your code:

The passed ids in the function parameter list are the ids of the records that need to have the field values calculated. In your case, ids contains one or more ids of oemedical.appointment. You shouldn't really use those ids to browse your patients!

def _get_ssn_from_name(self, cr, uid, ids, field_name, arg, context=None):
    res = {};
    for obj in self.browse(cr, uid, ids, context=context):
        if obj.patient_id.ssn:
            res[obj.id] = obj.patient_id.ssn;
        else:
            res[obj.id] = 'Not Specified';
        # as alternative to the if-clause one could write: res[obj.id] = obj.patient_id.ssn or 'Not Specified';
    return res;

Also, you should think about renaming the function to: _get_ssn(..)

(EDIT: fixed answer)

Hope this helps.

0
Аватар
Отменить
Аватар
Oussama
Автор Лучший ответ

Thank you your help. But I'm still getting errors for both suggestions that you have provided.

 

Here is what I get when trying to use relational field and ommitting the _get_ssn(...) function :

raise KeyError(error_msg)
KeyError: "Field 'oemedical.patient' does not exist in object 'browse_record(oemedical.appointment, 17)'"

 

And here is what I get by changing the code of the function as you specified :

2014-07-16 12:32:09,993 7597 ERROR demo openerp.netsvc: 15
Traceback (most recent call last):
  File "/home/oussama/PycharmProjects/openerp-7.0/openerp/netsvc.py", line 296, in dispatch_rpc
    result = ExportService.getService(service_name).dispatch(method, params)
  File "/home/oussama/PycharmProjects/openerp-7.0/openerp/service/web_services.py", line 626, in dispatch
    res = fn(db, uid, *params)
  File "/home/oussama/PycharmProjects/openerp-7.0/openerp/osv/osv.py", line 190, in execute_kw
    return self.execute(db, uid, obj, method, *args, **kw or {})
  File "/home/oussama/PycharmProjects/openerp-7.0/openerp/osv/osv.py", line 132, in wrapper
    return f(self, dbname, *args, **kwargs)
  File "/home/oussama/PycharmProjects/openerp-7.0/openerp/osv/osv.py", line 199, in execute
    res = self.execute_cr(cr, uid, obj, method, *args, **kw)
  File "/home/oussama/PycharmProjects/openerp-7.0/openerp/osv/osv.py", line 187, in execute_cr
    return getattr(object, method)(cr, uid, *args, **kw)
  File "/home/oussama/PycharmProjects/openerp-7.0/openerp/osv/orm.py", line 3679, in read
    result = self._read_flat(cr, user, select, fields, context, load)
  File "/home/oussama/PycharmProjects/openerp-7.0/openerp/osv/orm.py", line 3803, in _read_flat
    record[f] = res2[record['id']]
KeyError: 15

EDIT: The two solutions worked well after making the modifications you provided :)
Thank you again !

0
Аватар
Отменить
René Schuster

Sorry.. Minor error in the first solution. Edited my answer. Don't know yet what the issue with the other funtion is...

René Schuster

For the second solution: The res-keywords are wrong. Edited my answer again.

Oussama
Автор

Both of the solutions that you provided worked well :) Thanks !

Не оставайтесь в стороне – присоединяйтесь к обсуждению!

Создайте аккаунт сегодня, чтобы получить доступ к эксклюзивным функциям и стать частью нашего замечательного сообщества!

Регистрация
Похожие посты Ответы Просмотры Активность
How to access to the ORM from outside properly ? Решено
python orm pool
Аватар
Аватар
1
мар. 15
8079
Get author_id from mail_message in openERP
python orm
Аватар
Аватар
1
мар. 15
6617
ORM .browse method returns objects even if the ids do not exist on the database Решено
python code orm
Аватар
Аватар
2
июл. 22
6490
How i can apply filter into record ?
filter python orm
Аватар
Аватар
1
сент. 19
2886
Add a model into a pre-existant module (getting need more than 1 value to unpack error)
python pricelist pool
Аватар
0
сент. 15
4621
Сообщество
  • Видео уроки
  • Документация
  • Форум
Открытый исходный код
  • Скачать
  • Github
  • Runbot
  • Перевод
Услуги
  • Хостинг Odoo.sh
  • Поддержка
  • Обновление
  • Индивидуальные решения по доработке
  • Образование
  • Найти бухгалтера
  • Найти партнера
  • Стать партнером
О нас
  • Наша компания
  • Активы бренда
  • Cвяжитесь с нами
  • Вакансии
  • Мероприятия
  • Подкаст
  • Блог
  • Клиенты
  • Правовые документы • Конфиденциальность
  • Безопасность
الْعَرَبيّة Català 简体中文 繁體中文 (台灣) Čeština Dansk Nederlands English Suomi Français Deutsch हिंदी Bahasa Indonesia Italiano 日本語 한국어 (KR) Lietuvių kalba Język polski Português (BR) română русский язык Slovenský jazyk slovenščina Español (América Latina) Español ภาษาไทย Türkçe українська Tiếng Việt

Odoo – это набор бизнес-модулей с открытым исходным кодом, который закроет все потребности вашей компании: CRM, E-commerce, Бухгалтерия, Склад, POS, управление проектами и др.

Odoo сочетает в себе простоту использования и полную интеграцию всех бизнес-процессов в одной системе.

Website made with

Odoo Experience on YouTube

1. Use the live chat to ask your questions.
2. The operator answers within a few minutes.

Live support on Youtube
Watch now