diff --git a/addons/account_asset/account_asset.py b/addons/account_asset/account_asset.py index 5c019155fdc..6792682fdbe 100644 --- a/addons/account_asset/account_asset.py +++ b/addons/account_asset/account_asset.py @@ -35,9 +35,9 @@ class account_asset_category(osv.osv): 'name': fields.char('Name', size=64, required=True, select=1), 'note': fields.text('Note'), 'account_analytic_id': fields.many2one('account.analytic.account', 'Analytic account'), - 'account_asset_id': fields.many2one('account.account', 'Asset Account', required=True), - 'account_depreciation_id': fields.many2one('account.account', 'Depreciation Account', required=True), - 'account_expense_depreciation_id': fields.many2one('account.account', 'Depr. Expense Account', required=True), + 'account_asset_id': fields.many2one('account.account', 'Asset Account', required=True, domain=[('type','=','other')]), + 'account_depreciation_id': fields.many2one('account.account', 'Depreciation Account', required=True, domain=[('type','=','other')]), + 'account_expense_depreciation_id': fields.many2one('account.account', 'Depr. Expense Account', required=True, domain=[('type','=','other')]), 'journal_id': fields.many2one('account.journal', 'Journal', required=True), 'company_id': fields.many2one('res.company', 'Company', required=True), 'method': fields.selection([('linear','Linear'),('degressive','Degressive')], 'Computation Method', required=True, help="Choose the method to use to compute the amount of depreciation lines.\n"\ diff --git a/addons/document_ftp/ftpserver/abstracted_fs.py b/addons/document_ftp/ftpserver/abstracted_fs.py index 4a2d6e5e1ec..514ba10f2f6 100644 --- a/addons/document_ftp/ftpserver/abstracted_fs.py +++ b/addons/document_ftp/ftpserver/abstracted_fs.py @@ -262,6 +262,7 @@ class abstracted_fs(object): if path == '/' and mode in ('list', 'cwd'): return (None, None, None ) + if path == '..': path = self.cwd + '/..' path = _to_unicode(os.path.normpath(path)) # again, for '/db/../ss' if path == '.': path = '' diff --git a/addons/email_template/email_template.py b/addons/email_template/email_template.py index 904481096d3..4a9169e0aae 100644 --- a/addons/email_template/email_template.py +++ b/addons/email_template/email_template.py @@ -410,8 +410,8 @@ class email_template(osv.osv): # create a mail_mail based on values, without attachments values = self.generate_email(cr, uid, template_id, res_id, context=context) - assert values.get('email_from'), 'email_from is missing or empty after template rendering, send_mail() cannot proceed' - + if not values.get('email_from'): + raise osv.except_osv(_('Warning!'),_("Sender email is missing or empty after template rendering. Specify one to deliver your message")) # process partner_to field that is a comma separated list of partner_ids -> recipient_ids # NOTE: only usable if force_send is True, because otherwise the value is # not stored on the mail_mail, and therefore lost -> fixed in v8 diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py index 4ef2a6a4f4c..e3271f3f947 100644 --- a/addons/mrp/mrp.py +++ b/addons/mrp/mrp.py @@ -320,10 +320,9 @@ class mrp_bom(osv.osv): """ routing_obj = self.pool.get('mrp.routing') factor = factor / (bom.product_efficiency or 1.0) - max_rounding = max(bom.product_rounding, bom.product_uom.rounding) - factor = rounding(factor, max_rounding) - if factor < max_rounding: - factor = max_rounding + factor = rounding(factor, bom.product_rounding) + if factor < bom.product_rounding: + factor = bom.product_rounding result = [] result2 = [] phantom = False @@ -772,7 +771,7 @@ class mrp_production(osv.osv): # qty available for consume and produce qty_avail = scheduled.product_qty - consumed_data.get(scheduled.product_id.id, 0.0) - if qty_avail <= 0.0: + if float_compare(qty_avail, 0, precision_rounding=scheduled.product_id.uom_id.rounding) <= 0: # there will be nothing to consume for this raw material continue @@ -784,7 +783,7 @@ class mrp_production(osv.osv): # if qtys we have to consume is more than qtys available to consume prod_name = scheduled.product_id.name_get()[0][1] raise osv.except_osv(_('Warning!'), _('You are going to consume total %s quantities of "%s".\nBut you can only consume up to total %s quantities.') % (qty, prod_name, qty_avail)) - if qty <= 0.0: + if float_compare(qty, 0, precision_rounding=scheduled.product_id.uom_id.rounding) <= 0: # we already have more qtys consumed than we need continue diff --git a/addons/mrp/mrp_view.xml b/addons/mrp/mrp_view.xml index 2576235586f..d145bbeb847 100644 --- a/addons/mrp/mrp_view.xml +++ b/addons/mrp/mrp_view.xml @@ -764,7 +764,7 @@ - + @@ -772,7 +772,7 @@ - + diff --git a/addons/mrp_operations/mrp_operations_view.xml b/addons/mrp_operations/mrp_operations_view.xml index 9b8587349bc..aa73ecc136b 100644 --- a/addons/mrp_operations/mrp_operations_view.xml +++ b/addons/mrp_operations/mrp_operations_view.xml @@ -51,7 +51,7 @@ - + diff --git a/addons/plugin/plugin_handler.py b/addons/plugin/plugin_handler.py index fc6c874fab5..bdc0a50810b 100644 --- a/addons/plugin/plugin_handler.py +++ b/addons/plugin/plugin_handler.py @@ -93,8 +93,9 @@ class plugin_handler(osv.osv_memory): """ mail_message = self.pool.get('mail.message') model_obj = self.pool[model] - msg = self.pool.get('mail.thread').message_parse(cr, uid, email) - message_id = msg.get('message-id') + mail_thread_obj = self.pool.get('mail.thread') + msg = mail_thread_obj.message_parse(cr, uid, email) + message_id = msg.get('message_id') mail_ids = mail_message.search(cr, uid, [('message_id', '=', message_id), ('res_id', '=', res_id), ('model', '=', model)]) if message_id and mail_ids: mail_record = mail_message.browse(cr, uid, mail_ids)[0] @@ -107,12 +108,22 @@ class plugin_handler(osv.osv_memory): res_id = model_obj.message_process(cr, uid, model, email) notify = _("Mail successfully pushed, a new %s has been created.") % model else: + email_from = msg.get('email_from') + if email_from: + author_id = False + else: + authors = mail_thread_obj.message_find_partner_from_emails(cr, uid, [res_id], [email_from]) + author_id = authors and authors[0].get('partner_id') or False + model_obj.message_post(cr, uid, [res_id], body=msg.get('body'), subject=msg.get('subject'), type='comment' if model == 'res.partner' else 'email', parent_id=msg.get('parent_id'), - attachments=msg.get('attachments')) + attachments=msg.get('attachments'), + message_id=message_id, + email_from=email_from, + author_id=author_id) notify = _("Mail successfully pushed") url = self._make_url(cr, uid, res_id, model) return (model, res_id, url, notify) @@ -151,7 +162,7 @@ class plugin_handler(osv.osv_memory): ir_attachment_obj = self.pool.get('ir.attachment') attach_ids = [] msg = self.pool.get('mail.thread').message_parse(cr, uid, headers) - message_id = msg.get('message-id') + message_id = msg.get('message_id') push_mail = self.push_message(cr, uid, model, headers, res_id) res_id = push_mail[1] model = push_mail[0] @@ -165,6 +176,6 @@ class plugin_handler(osv.osv_memory): attach_ids.append(ir_attachment_obj.create(cr, uid, vals)) mail_ids = mail_message.search(cr, uid, [('message_id', '=', message_id), ('res_id', '=', res_id), ('model', '=', model)]) if mail_ids: - mail_message.write(cr, uid, mail_ids[0], {'attachment_ids': [(6, 0, attach_ids)], 'body': body, 'body_html': body_html}) + mail_message.write(cr, uid, mail_ids[0], {'attachment_ids': [(6, 0, attach_ids)], 'body': body_html}) url = self._make_url(cr, uid, res_id, model) return (model, res_id, url, notify) diff --git a/addons/project_long_term/wizard/project_compute_phases.py b/addons/project_long_term/wizard/project_compute_phases.py index 5ac89e2def2..751265d5eba 100644 --- a/addons/project_long_term/wizard/project_compute_phases.py +++ b/addons/project_long_term/wizard/project_compute_phases.py @@ -52,7 +52,8 @@ class project_compute_phases(osv.osv_memory): else: project_ids = project_pool.search(cr, uid, [('user_id','=',uid)], context=context) - project_pool.schedule_phases(cr, uid, project_ids, context=context) + if project_ids: + project_pool.schedule_phases(cr, uid, project_ids, context=context) return self._open_phases_list(cr, uid, data, context=context) def _open_phases_list(self, cr, uid, data, context=None): diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py index a44e022ba27..9d3e0e68279 100644 --- a/addons/purchase/purchase.py +++ b/addons/purchase/purchase.py @@ -909,6 +909,15 @@ class purchase_order_line(osv.osv): default.update({'state':'draft', 'move_ids':[],'invoiced':0,'invoice_lines':[]}) return super(purchase_order_line, self).copy_data(cr, uid, id, default, context) + def unlink(self, cr, uid, ids, context=None): + procurement_ids_to_cancel = [] + for line in self.browse(cr, uid, ids, context=context): + if line.move_dest_id: + procurement_ids_to_cancel.extend(procurement.id for procurement in line.move_dest_id.procurements) + if procurement_ids_to_cancel: + self.pool['procurement.order'].action_cancel(cr, uid, procurement_ids_to_cancel) + return super(purchase_order_line, self).unlink(cr, uid, ids, context=context) + def onchange_product_uom(self, cr, uid, ids, pricelist_id, product_id, qty, uom_id, partner_id, date_order=False, fiscal_position_id=False, date_planned=False, name=False, price_unit=False, context=None): diff --git a/addons/purchase/purchase_view.xml b/addons/purchase/purchase_view.xml index d58d561a122..385dbc26bfe 100644 --- a/addons/purchase/purchase_view.xml +++ b/addons/purchase/purchase_view.xml @@ -208,7 +208,7 @@ - + @@ -387,7 +387,7 @@ - +