Я использую модуль OpenERP 7.0 для управления запросами. Каждый запрос может (или не иметь) иметь владельца. Владелец запроса принадлежит какой-то группе, и в данный момент он может захотеть отдать свой запрос другому пользователю в той же группе. Мой вопрос идет именно в этом направлении. Нужно ли выбирать пользователя из res.users, есть ли способ сузить возможности его поиска для пользователей, принадлежащих к той же группе, что и он?Как сузить поиск в res.user пользователям, принадлежащим к той же группе, что и в OpenERP?
Добавление немного больше информации:
У меня есть 4 группы, созданные в OpenERP: Пользователь, HR Group, логистики, и менеджер В каком-то этапе обработки, только пользователи, принадлежащие к персоналу группы (и, очевидно, группа менеджера) могут принимать меры по запросам. Как я уже говорил, пользователи HR-группы берут на себя ответственность за запросы, которые становятся его владельцами, на данном этапе только владелец может внести изменения в этот запрос. Тем не менее, он может предоставить право собственности на этот запрос другому пользователю, принадлежащему к той же группе персонала. Чтобы сделать это, я открываю мастер, где он должен выбирать пользователя из res.users. Поскольку у меня будет около 4 тыс. Пользователей, было бы лучше сузить его поиск до пользователей с теми же правами (также принадлежащими группе OpenERP, созданной в этом модуле).
Вот питон код моего мастера:
from openerp.osv import osv
from openerp.osv import fields
from openerp.tools.translate import _
import netsvc
class give_request(osv.osv_memory):
_name='give.request'
_columns = {
'assign_to': fields.many2one('res.users', 'Assign request to', help='Person who will be responsible for the next action'),
}
def save_info(self, cr, uid, ids, context=None):
if 'active_id' in context:
assign_to=self.browse(cr,uid,ids)[0].assign_to
#import pdb; pdb.set_trace()
self.pool.get('generic.request').write(cr,uid,context['active_id'],{'assign_to' : assign_to.id})
wf_service = netsvc.LocalService('workflow')
wf_service.trg_validate(uid,'generic.request',context['active_id'],'give_request',cr)
return {
'type': 'ir.actions.act_window_close',
}
give_request()
И вид XML:
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- Give request -->
<record id="view_give_request_wizard" model="ir.ui.view">
<field name="name">give_request_wizard.form</field>
<field name="model">give.request</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Select user" version="7.0">
<group >
<separator string="Please select the person you want to set the ownership of the request" colspan="2"/>
<!--<field name="assign_to" string="Assign to" domain="[('groups_id', 'in', [uid.groups_id])]" />-->
<field name="assign_to" string="Assign to" />
<newline/>
</group>
<div style="text-align:right">
<button icon="gtk-cancel" special="cancel" string="Cancel"/>
<button icon="gtk-ok" name="save_info" string="Give the request" type="object" />
</div>
</form>
</field>
</record>
<record id="action_give_request" model="ir.actions.act_window">
<field name="name">Give ownership of the request</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">give.request</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="view_id" ref="view_give_request_wizard"/>
<field name="target">new</field>
</record>
<act_window id="action_give_request"
name="Give request"
res_model="give.request"
view_mode="form"
target="new"
/>
</data>
</openerp>
Я попытался применить фильтр доменов на моем assign_to фильтре <field name="assign_to" string="Assign to" domain="[('groups_id', 'in', [user.groups_id])]" />
(а позже с uid.groups_id
) , но это не сработало.
Заранее спасибо.
Новое редактирование, чтобы адаптировать мой код к подсказкам нитеша.
Теперь питон код моего мастера выглядит следующим образом:
class give_request(osv.osv_memory):
_name='give.request'
def search(self, cr, uid, domain, offset=0, limit=None, order=None, context=None, count=False):
cr.execute("SELECT gid FROM res_groups_users_rel WHERE uid="+str(uid))
group=cr.fetchall()
names = []
#import pdb; pdb.set_trace()
for group_id in group:
cr.execute("SELECT name FROM res_groups WHERE id="+str(group_id[0]))
group_name = cr.fetchall()
names.append(group_name[0][0])
#Now "names" will contain al the group that the user has assigned to
#Check if "Hr Group" is present in that group or not
if 'UC Human Resources' in names:
domain += [('group','=','UC Human Resources')]
return super(give_request, self).search(cr, uid, domain, offset, limit, order, context, count)
_columns = {
#'assign_to': fields.many2one('res.users', 'Assign request to', help='Person who will be responsible for the next action'),
'assign_to': fields.function(search, 'Assign request to', help='Person who will be responsible for the next action', type="integer", obj="res.users", method=True),
}
def save_info(self, cr, uid, ids, context=None):
if 'active_id' in context:
assign_to=self.browse(cr,uid,ids)[0].assign_to
#import pdb; pdb.set_trace()
self.pool.get('generic.request').write(cr,uid,context['active_id'],{'assign_to' : assign_to.id})
wf_service = netsvc.LocalService('workflow')
wf_service.trg_validate(uid,'generic.request',context['active_id'],'give_request',cr)
return {
'type': 'ir.actions.act_window_close',
}
give_request()
И не вносить никаких изменений в моем XML, так как я не уверен, если это необходимо или нет.
Во всяком случае, с изменением я сделал, теперь XML отображается как этот (с «0» перед полем раскрывающегося списка, которым не то, что я ожидал, я надеялся получить выпадающий список здесь ...) И еще одна странная вещь: даже если я добавил pdb в определение функции поиска, это не останавливается, когда мастер загружается (не стоит ли останавливаться, так как он вызывается функцией field.function?) он останавливается, когда я нажимаю кнопку «Сохранить». Я думаю, что строка функции save_info вызывает
assign_to=self.browse(cr,uid,ids)[0].assign_to
, а затем, когда я делаю отладку, я думаю, что получаю бесконечный цикл.
В противном случае, без PDB, я получаю следующий след (после того, как я нажимаю кнопку сохранить):
2014-06-11 14:19:08,063 753 ERROR may_9 openerp.osv.osv: Uncaught exception
Traceback (most recent call last):
File "/opt/openerp/v7/server/openerp/osv/osv.py", line 131, in wrapper
return f(self, dbname, *args, **kwargs)
File "/opt/openerp/v7/server/openerp/osv/osv.py", line 197, in execute
res = self.execute_cr(cr, uid, obj, method, *args, **kw)
File "/opt/openerp/v7/server/openerp/osv/osv.py", line 185, in execute_cr
return getattr(object, method)(cr, uid, *args, **kw)
File "/opt/openerp/v7/server/openerp/osv/orm.py", line 3606, in read
result = self._read_flat(cr, user, select, fields, context, load)
File "/opt/openerp/v7/server/openerp/osv/orm.py", line 3726, in _read_flat
res2 = self._columns[f].get(cr, self, ids, f, user, context=context, values=res)
File "/opt/openerp/v7/server/openerp/osv/fields.py", line 1133, in get
result = self._fnct(obj, cr, uid, ids, name, self._arg, context)
File "/home/lfc/openerp/v7/addons/processos_uc/wizard/give_req_wiz.py", line 23, in search
return super(give_request, self).search(cr, uid, domain, offset, limit, order, context, count)
File "/opt/openerp/v7/server/openerp/osv/orm.py", line 2356, in search
return self._search(cr, user, args, offset=offset, limit=limit, order=order, context=context, count=count)
File "/opt/openerp/v7/server/openerp/osv/orm.py", line 4847, in _search
query = self._where_calc(cr, user, args, context=context)
File "/opt/openerp/v7/server/openerp/osv/orm.py", line 4676, in _where_calc
e = expression.expression(cr, user, domain, self, context)
File "/opt/openerp/v7/server/openerp/osv/expression.py", line 642, in __init__
self.parse(cr, uid, context=context)
File "/opt/openerp/v7/server/openerp/osv/expression.py", line 742, in parse
self.stack = [ExtendedLeaf(leaf, self.root_model) for leaf in self.expression]
File "/opt/openerp/v7/server/openerp/osv/expression.py", line 528, in __init__
self.check_leaf()
File "/opt/openerp/v7/server/openerp/osv/expression.py", line 584, in check_leaf
raise ValueError("Invalid leaf %s" % str(self.leaf))
ValueError: Invalid leaf 16
2014-06-11 14:19:08,068 753 ERROR may_9 openerp.netsvc: Invalid leaf 16
Traceback (most recent call last):
File "/opt/openerp/v7/server/openerp/netsvc.py", line 292, in dispatch_rpc
result = ExportService.getService(service_name).dispatch(method, params)
File "/opt/openerp/v7/server/openerp/service/web_services.py", line 626, in dispatch
res = fn(db, uid, *params)
File "/opt/openerp/v7/server/openerp/osv/osv.py", line 188, in execute_kw
return self.execute(db, uid, obj, method, *args, **kw or {})
File "/opt/openerp/v7/server/openerp/osv/osv.py", line 131, in wrapper
return f(self, dbname, *args, **kwargs)
File "/opt/openerp/v7/server/openerp/osv/osv.py", line 197, in execute
res = self.execute_cr(cr, uid, obj, method, *args, **kw)
File "/opt/openerp/v7/server/openerp/osv/osv.py", line 185, in execute_cr
return getattr(object, method)(cr, uid, *args, **kw)
File "/opt/openerp/v7/server/openerp/osv/orm.py", line 3606, in read
result = self._read_flat(cr, user, select, fields, context, load)
File "/opt/openerp/v7/server/openerp/osv/orm.py", line 3726, in _read_flat
res2 = self._columns[f].get(cr, self, ids, f, user, context=context, values=res)
File "/opt/openerp/v7/server/openerp/osv/fields.py", line 1133, in get
result = self._fnct(obj, cr, uid, ids, name, self._arg, context)
File "/home/lfc/openerp/v7/addons/processos_uc/wizard/give_req_wiz.py", line 23, in search
return super(give_request, self).search(cr, uid, domain, offset, limit, order, context, count)
File "/opt/openerp/v7/server/openerp/osv/orm.py", line 2356, in search
return self._search(cr, user, args, offset=offset, limit=limit, order=order, context=context, count=count)
File "/opt/openerp/v7/server/openerp/osv/orm.py", line 4847, in _search
query = self._where_calc(cr, user, args, context=context)
File "/opt/openerp/v7/server/openerp/osv/orm.py", line 4676, in _where_calc
e = expression.expression(cr, user, domain, self, context)
File "/opt/openerp/v7/server/openerp/osv/expression.py", line 642, in __init__
self.parse(cr, uid, context=context)
File "/opt/openerp/v7/server/openerp/osv/expression.py", line 742, in parse
self.stack = [ExtendedLeaf(leaf, self.root_model) for leaf in self.expression]
File "/opt/openerp/v7/server/openerp/osv/expression.py", line 528, in __init__
self.check_leaf()
File "/opt/openerp/v7/server/openerp/osv/expression.py", line 584, in check_leaf
raise ValueError("Invalid leaf %s" % str(self.leaf))
ValueError: Invalid leaf 16
Не будучи специалистом по питону и каждый день, который проходит реализация не специалиста по OpenERP либо я не знаю, что я делаю неправильно? Кто угодно? Спасибо заранее!
Что вы подразумеваете под группой? Группы, которые уже реализованы в OpenERP/Odoo или новое отношение к новой модели (например, request.usergroup или что-то еще)? – CZoellner
Я имею в виду группы OpenERP. Я редактировал свой вопрос, чтобы добавить более подробное описание и код. –