Что легко, а что сложно в OpenERP (в плане разработок)
Здесь я немного хотел бы осветить процесс разработки в OpenERP. Сказать или рассказать, что доступно выполнить, имею ввиду доработок или дополнений (расширений к основным модулям), а что сложновато.
Рано или поздно каждый с этим сталкивается. Ведь не даром же на сегодняшний день существует более 2000 модулей. На самом деле около 50% процентов этих модулей это добавка всего лишь нескольких полей к существующим модулям. Это то что каждый из вас сможет сделать за несколько минут (технически) :).
И так что просто:
1. Добавить поле в описание существующего модуля и вставить его в нужное место вида. Так же сюда можно добавить: замену, перестановку, удаление из вида.
2. Создать свой простой модуль, со своими видами формы, дерева, поиска, графика, календаря, канбан.
3. Создать пункт меню и добавить туда существующий документ или свой созданный.
4. Создать боковое меню — правое Действие, Ссылки.
5. Новое действие окна для существующего документа или опять же своего.
6. Новую группу, с правами и правилами доступа.
7. Процессы предприятия, рабочие процессы.
8. Отчеты
Почему это просто — тут все стандартно. Я не программист, не IT — ник просто смотрел по аналогии. Это все выполнил в виде модуля.
Что сложнее — это уже мастера (и все что описал до этого, где есть место следующим описаниям, потому что там уже появляются функции такого типа:
Эта функция создает пользователя в системе с некоторыми условиями. Есть конечно и попроще:
Предварителное условия для переноса даных из полей мастера в поля существующего документа (модуля).
В общем вселегко в 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 комментария
Ну и def _ еще ни о чём не говорит, тут каждый волен называть свои функции как хочет.
Т.е. например:
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») — уже начинается геморрой. Сложноватый веб-клиент накладывает свои ограничения — приходится приспосабливаться под то, что есть.
Вот кстати — как вывести на печать (хоть ПДФ, хоть эксель, хоть что) данные из группы пунктов меню Отчетность каждого модуля?