2014-05-22 8 views
0

Я использую модуль 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 отображается как этот enter image description here (с «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 либо я не знаю, что я делаю неправильно? Кто угодно? Спасибо заранее!

+0

Что вы подразумеваете под группой? Группы, которые уже реализованы в OpenERP/Odoo или новое отношение к новой модели (например, request.usergroup или что-то еще)? – CZoellner

+0

Я имею в виду группы OpenERP. Я редактировал свой вопрос, чтобы добавить более подробное описание и код. –

ответ

2

Вы можете сделать это с помощью приведенного ниже кода. В основном мы можем познакомиться со всеми группами пользователей, которые вошли в систему.Из этого попытайтесь найти группу u want, назначенную ему или нет.

код:

cr.execute("SELECT gid FROM res_groups_users_rel WHERE uid="+str(uid)) 
group=cr.fetchall() 
names = [] 
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 'HR group' in names: 
    #Execute your code 

Тогда и нужно установить domain.Please убедитесь, что у вас есть поле, сказать, к какой группе он is.I'm assumimg группа является подана, который говорит мне, в какую группу его принадлежит.

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 = [] 
    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 'HR group' in names: 
     domain += [('group','=','HR group')] 
    return super(sale_order, self).search(cr, uid, domain, offset, limit, order, context, count) 
+0

Спасибо, ваш ответ ясен, но извините, но я до сих пор не владею OpenERP (я знаю, должен, к настоящему времени!), Так, как бы я получил, что код python вступает в силу на моем представлении XML? Первоначальная идея состояла в том, чтобы показать только пользователей, принадлежащих к той же группе, что и пользователь (в этом случае пользователи из группы HR). Что я должен поставить в свой XML-код, чтобы вызвать этот (позволяет называть его) фильтр python? –

+0

Каковы ваши фактические требования. Вы должны фильтровать? Или предоставлять права доступа для некоторых действий кнопки? – nitesh

+0

У меня есть этот столбец на моем объекте ''assign_to': fields.many2one ('res.users', 'Assign request to', help = 'Лицо, которое будет отвечать за следующее действие') ', и около 4000 пользователей на 'res.users', для простоты мне понадобилось поле' 'на моем представлении XML, чтобы отображать только 20 или около того пользователей, принадлежащих к HR-группе. Не знаю, возможно ли это. –

 Смежные вопросы

  • Нет связанных вопросов^_^