diff --git a/addons/account/account.py b/addons/account/account.py
index 3aa17901e6e..99aa7b542bb 100644
--- a/addons/account/account.py
+++ b/addons/account/account.py
@@ -1731,7 +1731,7 @@ class account_tax_code(osv.osv):
res2 = {}
for record in self.browse(cr, uid, ids, context=context):
def _rec_get(record):
- amount = res.get(record.id, 0.0)
+ amount = res.get(record.id) or 0.0
for rec in record.child_ids:
amount += _rec_get(rec) * rec.sign
return amount
diff --git a/addons/crm/calendar_event_menu.xml b/addons/crm/calendar_event_menu.xml
index aec88a5748e..eb3889f0857 100644
--- a/addons/crm/calendar_event_menu.xml
+++ b/addons/crm/calendar_event_menu.xml
@@ -5,5 +5,16 @@
+
+ CRM - Meetings Search
+ calendar.event
+
+
+
+
+
+
+
+
diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py
index fbb0a3951a6..9975528774d 100644
--- a/addons/crm/crm_lead.py
+++ b/addons/crm/crm_lead.py
@@ -917,6 +917,7 @@ class crm_lead(format_address, osv.osv):
if lead.partner_id:
partner_ids.append(lead.partner_id.id)
res['context'] = {
+ 'search_default_opportunity_id': lead.type == 'opportunity' and lead.id or False,
'default_opportunity_id': lead.type == 'opportunity' and lead.id or False,
'default_partner_id': lead.partner_id and lead.partner_id.id or False,
'default_partner_ids': partner_ids,
diff --git a/addons/document/document.py b/addons/document/document.py
index 866f3e88ac5..5ba296f8d9d 100644
--- a/addons/document/document.py
+++ b/addons/document/document.py
@@ -109,8 +109,11 @@ class document_file(osv.osv):
ids.extend(parents[parent_id])
# sort result according to the original sort ordering
- ids = [id for id in orig_ids if id in ids]
- return len(ids) if count else ids
+ if count:
+ return len(ids)
+ else:
+ set_ids = set(ids)
+ return [id for id in orig_ids if id in set_ids]
def copy(self, cr, uid, id, default=None, context=None):
if not default:
diff --git a/addons/event/event_view.xml b/addons/event/event_view.xml
index 9433c0018e9..201f5568cc4 100644
--- a/addons/event/event_view.xml
+++ b/addons/event/event_view.xml
@@ -277,7 +277,7 @@
-
+
diff --git a/addons/membership/membership_view.xml b/addons/membership/membership_view.xml
index c70c8cd6cc0..db4a50f4972 100644
--- a/addons/membership/membership_view.xml
+++ b/addons/membership/membership_view.xml
@@ -257,7 +257,7 @@
-
+
diff --git a/addons/point_of_sale/point_of_sale_view.xml b/addons/point_of_sale/point_of_sale_view.xml
index f8cbb6ce882..4b248f2ceb0 100644
--- a/addons/point_of_sale/point_of_sale_view.xml
+++ b/addons/point_of_sale/point_of_sale_view.xml
@@ -930,7 +930,7 @@
-
+
diff --git a/addons/portal/wizard/share_wizard.py b/addons/portal/wizard/share_wizard.py
index 0ffae804f07..81fff31a0d0 100644
--- a/addons/portal/wizard/share_wizard.py
+++ b/addons/portal/wizard/share_wizard.py
@@ -19,12 +19,13 @@
#
##############################################################################
+from openerp import SUPERUSER_ID
from openerp.osv import fields, osv
from openerp.tools.translate import _
import logging
_logger = logging.getLogger(__name__)
-UID_ROOT = 1
+UID_ROOT = SUPERUSER_ID
SHARED_DOCS_MENU = "Documents"
SHARED_DOCS_CHILD_MENU = "Shared Documents"
@@ -56,9 +57,18 @@ class share_wizard_portal(osv.TransientModel):
return super(share_wizard_portal, self)._check_preconditions(cr, uid, wizard_data, context=context)
def _create_or_get_submenu_named(self, cr, uid, parent_menu_id, menu_name, context=None):
- if not parent_menu_id:
- return
+ if context is None:
+ context = {}
Menus = self.pool.get('ir.ui.menu')
+ if not parent_menu_id and context.get('group_id'):
+ cxt = dict(context)
+ cxt['ir.ui.menu.full_list'] = True
+ parent_menu_ids = Menus.search(cr, SUPERUSER_ID,
+ [('groups_id', 'in', [context.get('group_id')]), ('parent_id', '=', False)], limit=1, context=cxt)
+ parent_menu_id = parent_menu_ids and parent_menu_ids[0] or False
+ if not parent_menu_id:
+ return False
+
parent_menu = Menus.browse(cr, uid, parent_menu_id) # No context
menu_id = None
max_seq = 10
@@ -79,9 +89,12 @@ class share_wizard_portal(osv.TransientModel):
def _sharing_root_menu_id(self, cr, uid, portal, context=None):
"""Create or retrieve root ID of sharing menu in portal menu
- :param portal: browse_record of portal, constructed with a context WITHOUT language
+ :param portal: browse_record of shared group, constructed with a context WITHOUT language
"""
- parent_menu_id = self._create_or_get_submenu_named(cr, uid, portal.parent_menu_id.id, SHARED_DOCS_MENU, context=context)
+ if context is None:
+ context = {}
+ ctx = dict(context, group_id=portal.id)
+ parent_menu_id = self._create_or_get_submenu_named(cr, uid, False, SHARED_DOCS_MENU, context=ctx)
if parent_menu_id:
child_menu_id = self._create_or_get_submenu_named(cr, uid, parent_menu_id, SHARED_DOCS_CHILD_MENU, context=context)
return child_menu_id
@@ -90,7 +103,7 @@ class share_wizard_portal(osv.TransientModel):
"""Create sharing menus in portal menu according to share wizard options.
:param wizard_data: browse_record of share.wizard
- :param portal: browse_record of portal, constructed with a context WITHOUT language
+ :param portal: browse_record of shared group, constructed with a context WITHOUT language
"""
root_menu_id = self._sharing_root_menu_id(cr, uid, portal, context=context)
if not root_menu_id:
@@ -126,13 +139,16 @@ class share_wizard_portal(osv.TransientModel):
# setup the menu for portal groups
for group in wizard_data.group_ids:
if group.id in all_portal_group_ids:
- self._create_shared_data_menu(cr, uid, wizard_data, group.id, context=context)
+ self._create_shared_data_menu(cr, uid, wizard_data, group, context=context)
for user in group.users:
new_line = {'user_id': user.id,
'newly_created': False}
wizard_data.write({'result_line_ids': [(0,0,new_line)]})
+ selected_group_ids = [x.id for x in wizard_data.group_ids]
+ res_groups.write(cr, SUPERUSER_ID, selected_group_ids, {'implied_ids': [(4, super_result[0])]})
+
elif wizard_data.user_ids:
# must take care of existing users, by adding them to the new group, which is super_result[0],
# and adding the shortcut
diff --git a/addons/project/project.py b/addons/project/project.py
index d062076181d..a6ca9bc17a1 100644
--- a/addons/project/project.py
+++ b/addons/project/project.py
@@ -1057,13 +1057,20 @@ class task(osv.osv):
context = context or {}
result = ""
ident = ' '*ident
+ company = self.pool["res.users"].browse(cr, uid, uid, context=context).company_id
+ duration_uom = {
+ 'day(s)': 'd', 'days': 'd', 'day': 'd', 'd': 'd',
+ 'month(s)': 'm', 'months': 'm', 'month': 'month', 'm': 'm',
+ 'week(s)': 'w', 'weeks': 'w', 'week': 'w', 'w': 'w',
+ 'hour(s)': 'H', 'hours': 'H', 'hour': 'H', 'h': 'H',
+ }.get(company.project_time_mode_id.name.lower(), "hour(s)")
for task in tasks:
if task.stage_id and task.stage_id.fold:
continue
result += '''
%sdef Task_%s():
-%s todo = \"%.2fH\"
-%s effort = \"%.2fH\"''' % (ident,task.id, ident,task.remaining_hours, ident,task.total_hours)
+%s todo = \"%.2f%s\"
+%s effort = \"%.2f%s\"''' % (ident, task.id, ident, task.remaining_hours, duration_uom, ident, task.total_hours, duration_uom)
start = []
for t2 in task.parent_ids:
start.append("up.Task_%s.end" % (t2.id,))
diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py
index e0434e635eb..92788ed51cf 100644
--- a/addons/purchase/purchase.py
+++ b/addons/purchase/purchase.py
@@ -1505,10 +1505,16 @@ class account_invoice(osv.Model):
for order in purchase_order_obj.browse(cr, uid, po_ids, context=context):
purchase_order_obj.message_post(cr, user_id, order.id, body=_("Invoice received"), context=context)
invoiced = []
+ shipped = True
+ # for invoice method manual or order, don't care about shipping state
+ # for invoices based on incoming shippment, beware of partial deliveries
+ if (order.invoice_method == 'picking' and
+ not all(picking.invoice_state in ['invoiced'] for picking in order.picking_ids)):
+ shipped = False
for po_line in order.order_line:
- if any(line.invoice_id.state not in ['draft', 'cancel'] for line in po_line.invoice_lines):
+ if all(line.invoice_id.state not in ['draft', 'cancel'] for line in po_line.invoice_lines):
invoiced.append(po_line.id)
- if invoiced:
+ if invoiced and shipped:
self.pool['purchase.order.line'].write(cr, uid, invoiced, {'invoiced': True})
workflow.trg_write(uid, 'purchase.order', order.id, cr)
return res
diff --git a/addons/stock/stock_view.xml b/addons/stock/stock_view.xml
index 174483e54a1..44352125727 100644
--- a/addons/stock/stock_view.xml
+++ b/addons/stock/stock_view.xml
@@ -1113,7 +1113,7 @@
-
+
diff --git a/openerp/addons/base/ir/ir_ui_view.py b/openerp/addons/base/ir/ir_ui_view.py
index 5adaad8aadf..ea7b11c426d 100644
--- a/openerp/addons/base/ir/ir_ui_view.py
+++ b/openerp/addons/base/ir/ir_ui_view.py
@@ -1051,15 +1051,15 @@ class view(osv.osv):
if model_value._obj==node_obj:
_Node_Field=model_key
_Model_Field=model_value._fields_id
- flag=False
for node_key,node_value in _Node_Obj._columns.items():
if node_value._type=='one2many':
if node_value._obj==conn_obj:
- if src_node in _Arrow_Obj._columns and flag:
+ # _Source_Field = "Incoming Arrows" (connected via des_node)
+ if node_value._fields_id == des_node:
_Source_Field=node_key
- if des_node in _Arrow_Obj._columns and not flag:
+ # _Destination_Field = "Outgoing Arrows" (connected via src_node)
+ if node_value._fields_id == src_node:
_Destination_Field=node_key
- flag = True
datas = _Model_Obj.read(cr, uid, id, [],context)
for a in _Node_Obj.read(cr,uid,datas[_Node_Field],[]):
diff --git a/openerp/sql_db.py b/openerp/sql_db.py
index f9e0522ef47..d1009113a02 100644
--- a/openerp/sql_db.py
+++ b/openerp/sql_db.py
@@ -265,7 +265,7 @@ class Cursor(object):
def split_for_in_conditions(self, ids):
"""Split a list of identifiers into one or more smaller tuples
safe for IN conditions, after uniquifying them."""
- return tools.misc.split_every(self.IN_MAX, set(ids))
+ return tools.misc.split_every(self.IN_MAX, ids)
def print_log(self):
global sql_counter