[MERGE] sync with latest trunk
bzr revid: odo@openerp.com-20111122145557-z67fp3trhh1lq2wc
This commit is contained in:
commit
a02e470164
|
@ -7,13 +7,13 @@ msgstr ""
|
|||
"Project-Id-Version: OpenERP Server 5.0.4\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
|
||||
"PO-Revision-Date: 2011-11-20 09:04+0000\n"
|
||||
"Last-Translator: Ahmad Khayyat <Unknown>\n"
|
||||
"PO-Revision-Date: 2011-11-21 12:13+0000\n"
|
||||
"Last-Translator: kifcaliph <kifcaliph@hotmail.com>\n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-22 05:00+0000\n"
|
||||
"X-Generator: Launchpad (build 14299)\n"
|
||||
|
||||
#. module: base
|
||||
|
@ -307,7 +307,7 @@ msgstr "خطوات إعداد المعالج"
|
|||
#. module: base
|
||||
#: model:ir.model,name:base.model_ir_ui_view_sc
|
||||
msgid "ir.ui.view_sc"
|
||||
msgstr ""
|
||||
msgstr "ir.ui.view_sc"
|
||||
|
||||
#. module: base
|
||||
#: field:res.widget.user,widget_id:0
|
||||
|
@ -338,7 +338,7 @@ msgstr "اختر نوع الإجراء"
|
|||
#. module: base
|
||||
#: model:res.country,name:base.tv
|
||||
msgid "Tuvalu"
|
||||
msgstr ""
|
||||
msgstr "توفالو"
|
||||
|
||||
#. module: base
|
||||
#: selection:ir.model,state:0
|
||||
|
@ -482,7 +482,7 @@ msgstr "مورّدون متنوعون"
|
|||
#: code:addons/base/ir/ir_model.py:255
|
||||
#, python-format
|
||||
msgid "Custom fields must have a name that starts with 'x_' !"
|
||||
msgstr ""
|
||||
msgstr "الحقول الخاصة يجب أن تيدأ باسم يبدأ بـ 'x_' !"
|
||||
|
||||
#. module: base
|
||||
#: help:ir.actions.server,action_id:0
|
||||
|
@ -720,7 +720,7 @@ msgstr "أيام العمل"
|
|||
#. module: base
|
||||
#: selection:ir.module.module,license:0
|
||||
msgid "Other OSI Approved Licence"
|
||||
msgstr "رخص أخرى تعترف بها \"مبادرة المصدر المفتوح\" (OSI)"
|
||||
msgstr "رخص أخرى تعترف بها الـ (OSI)"
|
||||
|
||||
#. module: base
|
||||
#: help:res.config.users,context_lang:0
|
||||
|
@ -777,7 +777,7 @@ msgstr "ir.config_parameter"
|
|||
#. module: base
|
||||
#: selection:base.language.export,format:0
|
||||
msgid "TGZ Archive"
|
||||
msgstr ""
|
||||
msgstr "ملف TGZ"
|
||||
|
||||
#. module: base
|
||||
#: view:res.lang:0
|
||||
|
|
|
@ -24,7 +24,7 @@ import time
|
|||
|
||||
def _links_get(self, cr, uid, context=None):
|
||||
obj = self.pool.get('res.request.link')
|
||||
ids = obj.search(cr, uid, [], context)
|
||||
ids = obj.search(cr, uid, [], context=context)
|
||||
res = obj.read(cr, uid, ids, ['object', 'name'], context)
|
||||
return [(r['object'], r['name']) for r in res]
|
||||
|
||||
|
|
|
@ -49,14 +49,12 @@
|
|||
<record model="ir.rule" id="res_widget_user_rule">
|
||||
<field name="name">res.widget.user rule</field>
|
||||
<field name="model_id" ref="model_res_widget_user"/>
|
||||
<field name="global" eval="True"/>
|
||||
<field name="domain_force">['|', ('user_id','=',user.id),('user_id','=',False)]</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.rule" id="res_partner_rule">
|
||||
<field name="name">res.partner company</field>
|
||||
<field name="model_id" ref="model_res_partner"/>
|
||||
<field name="global" eval="True"/>
|
||||
<!-- Show partners from ancestors and descendants companies (or company-less), this is usually a better
|
||||
default for multicompany setups. -->
|
||||
<field name="domain_force">['|','|',('company_id.child_ids','child_of',[user.company_id.id]),('company_id','child_of',[user.company_id.id]),('company_id','=',False)]</field>
|
||||
|
@ -65,16 +63,22 @@
|
|||
<record model="ir.rule" id="multi_company_default_rule">
|
||||
<field name="name">Multi_company_default company</field>
|
||||
<field name="model_id" ref="model_multi_company_default"/>
|
||||
<field name="global" eval="True"/>
|
||||
<field name="domain_force">[('company_id','child_of',[user.company_id.id])]</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.rule" id="ir_values_default_rule">
|
||||
<field name="name">Defaults: alter personal values only</field>
|
||||
<field name="model_id" ref="model_ir_values"/>
|
||||
<field name="domain_force">[('key','=','default'),('user_id','=',user.id)]</field>
|
||||
<field name="perm_read" eval="False"/>
|
||||
</record>
|
||||
<record model="ir.rule" id="ir_values_default_rule">
|
||||
<field name="name">Defaults: alter personal values only</field>
|
||||
<field name="model_id" ref="model_ir_values"/>
|
||||
<field name="domain_force">[('key','=','default'),('user_id','=',user.id)]</field>
|
||||
<field name="perm_read" eval="False"/>
|
||||
</record>
|
||||
|
||||
<!-- Used for dashboard customizations, users should only be able to edit their own dashboards -->
|
||||
<record model="ir.rule" id="ir_ui_view_custom_personal">
|
||||
<field name="name">ir.ui.view_custom rule</field>
|
||||
<field name="model_id" ref="model_ir_ui_view_custom"/>
|
||||
<field name="domain_force">[('user_id','=',user.id)]</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
|
|
@ -35,8 +35,7 @@
|
|||
"access_ir_ui_menu_group_system","ir_ui_menu group_system","model_ir_ui_menu","group_system",1,1,1,1
|
||||
"access_ir_ui_view_group_user","ir_ui_view group_user","model_ir_ui_view",,1,0,0,0
|
||||
"access_ir_ui_view_group_system","ir_ui_view group_system","model_ir_ui_view","group_system",1,1,1,1
|
||||
"access_ir_ui_view_custom_group_user","ir_ui_view_custom_group_user","model_ir_ui_view_custom",,1,0,0,0
|
||||
"access_ir_ui_view_custom_group_system","ir_ui_view_custom_group_system","model_ir_ui_view_custom","group_system",1,1,1,1
|
||||
"access_ir_ui_view_custom_group_user","ir_ui_view_custom_group_user","model_ir_ui_view_custom",,1,1,1,1
|
||||
"access_ir_ui_view_sc_group_user","ir_ui_view_sc group_user","model_ir_ui_view_sc",,1,1,1,1
|
||||
"access_ir_values_group_all","ir_values group_all","model_ir_values",,1,1,1,1
|
||||
"access_res_company_group_erp_manager","res_company group_erp_manager","model_res_company","group_erp_manager",1,1,1,1
|
||||
|
|
|
|
@ -2359,43 +2359,70 @@ class BaseModel(object):
|
|||
pass
|
||||
|
||||
|
||||
def _read_group_fill_results(self, cr, uid, domain, groupby, groupby_list, aggregated_fields, read_group_result, context=None):
|
||||
"""Helper method for filling in read_group results for all missing values of
|
||||
the field being grouped by, in case self._group_by_full provides methods
|
||||
to give the list of all the values that should be displayed."""
|
||||
def _read_group_fill_results(self, cr, uid, domain, groupby, groupby_list, aggregated_fields,
|
||||
read_group_result, read_group_order=None, context=None):
|
||||
"""Helper method for filling in empty groups for all possible values of
|
||||
the field being grouped by"""
|
||||
|
||||
# self._group_by_full should map groupable fields to a method that returns
|
||||
# a list of all aggregated values that we want to display for this field
|
||||
# a list of all aggregated values that we want to display for this field,
|
||||
# in the form of a m2o-like pair (key,label).
|
||||
# This is useful to implement kanban views for instance, where all columns
|
||||
# should be displayed even if they don't contain any record.
|
||||
# let "groups" represent the various possible values for the group_by field
|
||||
|
||||
# Grab the list of all groups that should be displayed, including all present groups
|
||||
present_group_ids = [x[groupby][0] for x in read_group_result if x[groupby]]
|
||||
# grab the list of all groups that should be displayed, including all present groups
|
||||
all_groups = self._group_by_full[groupby](self, cr, uid, present_group_ids, domain,
|
||||
context=context)
|
||||
read_group_order=read_group_order, context=context)
|
||||
|
||||
result_template = dict.fromkeys(aggregated_fields, False)
|
||||
result_template.update({'__context':{'group_by':groupby_list[1:]}, groupby + '_count':0})
|
||||
result_template.update({groupby + '_count':0})
|
||||
if groupby_list and len(groupby_list) > 1:
|
||||
result_template.update(__context={'group_by': groupby_list[1:]})
|
||||
|
||||
# Merge the left_side (current results as dicts) with the right_side (all
|
||||
# possible values as m2o pairs). Both lists are supposed to be using the
|
||||
# same ordering, and can be merged in one pass.
|
||||
result = []
|
||||
def append_filler_line(right_side):
|
||||
line = dict(result_template)
|
||||
line.update({
|
||||
groupby: right_side,
|
||||
'__domain': [(groupby, '=', right_side[0])] + domain,
|
||||
})
|
||||
result.append(line)
|
||||
#as both lists use the same ordering, we can merge in one pass
|
||||
known_values = {}
|
||||
def append_left(left_side):
|
||||
grouped_value = left_side[groupby] and left_side[groupby][0]
|
||||
if not grouped_value in known_values:
|
||||
result.append(left_side)
|
||||
known_values[grouped_value] = left_side
|
||||
else:
|
||||
count_attr = groupby + '_count'
|
||||
known_values[grouped_value].update({count_attr: left_side[count_attr]})
|
||||
def append_right(right_side):
|
||||
grouped_value = right_side[0]
|
||||
if not grouped_value in known_values:
|
||||
line = dict(result_template)
|
||||
line.update({
|
||||
groupby: right_side,
|
||||
'__domain': [(groupby,'=',grouped_value)] + domain,
|
||||
})
|
||||
result.append(line)
|
||||
known_values[grouped_value] = line
|
||||
while read_group_result or all_groups:
|
||||
left_side = read_group_result[0] if read_group_result else None
|
||||
right_side = all_groups[0] if all_groups else None
|
||||
assert left_side is None or left_side[groupby] is False \
|
||||
or isinstance(left_side[groupby], (tuple,list)), \
|
||||
'M2O-like pair expected, got %r' % left_side[groupby]
|
||||
assert right_side is None or isinstance(right_side, (tuple,list)), \
|
||||
'M2O-like pair expected, got %r' % right_side
|
||||
if left_side is None:
|
||||
append_filler_line(all_groups.pop(0))
|
||||
append_right(all_groups.pop(0))
|
||||
elif right_side is None:
|
||||
result.append(read_group_result.pop(0))
|
||||
elif left_side[groupby][0] == right_side[0]:
|
||||
result.append(read_group_result.pop(0))
|
||||
all_groups.pop(0)
|
||||
append_left(read_group_result.pop(0))
|
||||
elif left_side[groupby] == right_side:
|
||||
append_left(read_group_result.pop(0))
|
||||
all_groups.pop(0) # discard right_side
|
||||
elif not left_side[groupby] or not left_side[groupby][0]:
|
||||
# left side == "Undefined" entry, not present on right_side
|
||||
append_left(read_group_result.pop(0))
|
||||
else:
|
||||
result.append(read_group_result.pop(0)) # should be False
|
||||
append_filler_line(all_groups.pop(0))
|
||||
append_right(all_groups.pop(0))
|
||||
return result
|
||||
|
||||
def read_group(self, cr, uid, domain, fields, groupby, offset=0, limit=None, context=None, orderby=False):
|
||||
|
@ -2491,7 +2518,8 @@ class BaseModel(object):
|
|||
alldata[r['id']] = r
|
||||
del r['id']
|
||||
|
||||
data_ids = self.search(cr, uid, [('id', 'in', alldata.keys())], order=orderby or groupby, context=context)
|
||||
order = orderby or groupby
|
||||
data_ids = self.search(cr, uid, [('id', 'in', alldata.keys())], order=order, context=context)
|
||||
# the IDS of records that have groupby field value = False or '' should be sorted too
|
||||
data_ids += filter(lambda x:x not in data_ids, alldata.keys())
|
||||
data = self.read(cr, uid, data_ids, groupby and [groupby] or ['id'], context=context)
|
||||
|
@ -2518,7 +2546,8 @@ class BaseModel(object):
|
|||
|
||||
if groupby and groupby in self._group_by_full:
|
||||
data = self._read_group_fill_results(cr, uid, domain, groupby, groupby_list,
|
||||
aggregated_fields, data, context=context)
|
||||
aggregated_fields, data, read_group_order=order,
|
||||
context=context)
|
||||
|
||||
return data
|
||||
|
||||
|
|
Loading…
Reference in New Issue