Что легко, а что сложно в OpenERP (в плане разработок)

Здесь я немного хотел бы осветить процесс разработки в OpenERP. Сказать или рассказать, что доступно выполнить, имею ввиду доработок или дополнений (расширений к основным модулям), а что сложновато.

Рано или поздно каждый с этим сталкивается. Ведь не даром же на сегодняшний день существует более 2000 модулей. На самом деле около 50% процентов этих модулей это добавка всего лишь нескольких полей к существующим модулям. Это то что каждый из вас сможет сделать за несколько минут (технически) :).

И так что просто:
1. Добавить поле в описание существующего модуля и вставить его в нужное место вида. Так же сюда можно добавить: замену, перестановку, удаление из вида.

2. Создать свой простой модуль, со своими видами формы, дерева, поиска, графика, календаря, канбан.

3. Создать пункт меню и добавить туда существующий документ или свой созданный.

4. Создать боковое меню — правое Действие, Ссылки.

5. Новое действие окна для существующего документа или опять же своего.

6. Новую группу, с правами и правилами доступа.

7. Процессы предприятия, рабочие процессы.

8. Отчеты

Почему это просто — тут все стандартно. Я не программист, не IT — ник просто смотрел по аналогии. Это все выполнил в виде модуля.

Что сложнее — это уже мастера (и все что описал до этого, где есть место следующим описаниям, потому что там уже появляются функции такого типа:

def _create_new_share_users(self, cr, uid, wizard_data, group_id, context=None):
        """Create one new res.users record for each email address provided in
           wizard_data.new_users, ignoring already existing users.
           Populates wizard_data.result_line_ids with one new line for
           each user (existing or not). New users will also have a value
           for the password field, so they can receive it by email.
           Returns the ids of the created users, and the ids of the
           ignored, existing ones."""
        user_obj = self.pool.get('res.users')
        current_user = user_obj.browse(cr, UID_ROOT, uid, context=context)
        # modify context to disable shortcuts when creating share users
        context['noshortcut'] = True
        created_ids = []
        existing_ids = []
        if wizard_data.user_type == 'emails':
            for new_user in (wizard_data.new_users or '').split('\n'):
                # Ignore blank lines
                new_user = new_user.strip()
                if not new_user: continue
                # Ignore the user if it already exists.
                existing = user_obj.search(cr, UID_ROOT, [('login', '=', new_user)])
                existing_ids.extend(existing)
                if existing:
                    new_line = { 'user_id': existing[0],
                                 'newly_created': False}
                    wizard_data.write({'result_line_ids': [(0,0,new_line)]})
                    continue
                new_pass = generate_random_pass()
                user_id = user_obj.create(cr, UID_ROOT, {
                        'login': new_user,
                        'password': new_pass,
                        'name': new_user,
                        'user_email': new_user,
                        'groups_id': [(6,0,[group_id])],
                        'share': True,
                        'company_id': current_user.company_id.id
                }, context)
                new_line = { 'user_id': user_id,
                             'password': new_pass,
                             'newly_created': True}
                wizard_data.write({'result_line_ids': [(0,0,new_line)]})
                created_ids.append(user_id)

        elif wizard_data.user_type == 'embedded':
            new_login = 'embedded-%s' % (uuid.uuid4().hex,)
            new_pass = generate_random_pass()
            user_id = user_obj.create(cr, UID_ROOT, {
                'login': new_login,
                'password': new_pass,
                'name': new_login,
                'groups_id': [(6,0,[group_id])],
                'share': True,
                'menu_tips' : False,
                'company_id': current_user.company_id.id
            }, context)
            new_line = { 'user_id': user_id,
                         'password': new_pass,
                         'newly_created': True}
            wizard_data.write({'result_line_ids': [(0,0,new_line)]})
            created_ids.append(user_id)

        return created_ids, existing_ids


Эта функция создает пользователя в системе с некоторыми условиями. Есть конечно и попроще:

def hr_candidate_values(self, form):
        values = {}
        values['last_name'] = form.last_name
        if 'first_name' in form: values['first_name'] = form.first_name
        if 'gender' in form: values['gender'] = form.gender
        if 'mobile_phone' in form: values['mobile_phone'] = form.mobile_phone
        if 'email' in form: values['email'] = form.email
        return values


Предварителное условия для переноса даных из полей мастера в поля существующего документа (модуля).

В общем вселегко в OpenERP. Потому как многое стандартно не надо думать, просто повторяй. :)

Сложно там где уже просто повторять мало получается — надо уже программировать.

Т.е. всечто начинается и заканчивается вот так:
def _create_share_group(self, cr, uid, wizard_data, context=None):
        group_obj = self.pool.get('res.groups')
        share_group_name = '%s: %s (%d-%s)' %('Shared', wizard_data.name, uid, time.time())
        # create share group without putting admin in it
        return group_obj.create(cr, UID_ROOT, {'name': share_group_name, 'share': True}, {'noadmin': True})


А именно:
def _
return


Может «не так страшен черт как его малютка :)», но все же «без труда не выловишь рыбку из пруда» — это точно! :)

2 комментария

avatar
ИМХО не чего сложного в приведённой функции создания нового логина нет, если разобраться как работать с объектами в ОЕРП (pool.get, ..._obj.browse, ..._obj.search, read, write). Вообщем-то методов штук 5 и названия вполне адекватные.
Ну и def _ еще ни о чём не говорит, тут каждый волен называть свои функции как хочет.
avatar
Что касается разработки нового модуля, то есть достаточное количество стандартных средств, использовать которые можно легко и быстро.
Т.е. например:
1. Определить модель (сущность) с полями различного типа (включая функциональные).
2. Задать связи между моделями (m2o, o2m, m2m), как между новыми, так и существующими.
3. Добавить/изменить поля существующих моделей (удалить нельзя).
4. Для отображения модели использовать существующие типы view — form, tree, search, включая их вариации (типа tree модели order_lines на form моделей purchase_order и sale_order).
5. С некоторыми костылями (aeroo в основном) переводить любые данные в xls, doc, pdf (отчеты) — доступная документация и простой синтаксис шаблонов.
Все это нормально (к сожалению не хорошо) документировано, можно посмотреть исходники, в общем проблем немного.
Но чуть только шаг в сторону (например «хочу чтобы количество колонок в tree динамически изменялось в зависимости от выбранного фильтра search») — уже начинается геморрой. Сложноватый веб-клиент накладывает свои ограничения — приходится приспосабливаться под то, что есть.
Вот кстати — как вывести на печать (хоть ПДФ, хоть эксель, хоть что) данные из группы пунктов меню Отчетность каждого модуля?

Оставить комментарий