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