diff --git a/addons/account/data/account_data.xml b/addons/account/data/account_data.xml
index 949d03324f3..9d2e65a3a4c 100644
--- a/addons/account/data/account_data.xml
+++ b/addons/account/data/account_data.xml
@@ -30,7 +30,6 @@
- 15 Days
balance
@@ -48,7 +47,6 @@
- 30 Net Days
balance
diff --git a/addons/account/demo/account_demo.xml b/addons/account/demo/account_demo.xml
index 6918ad44702..8a450c0b6aa 100644
--- a/addons/account/demo/account_demo.xml
+++ b/addons/account/demo/account_demo.xml
@@ -135,7 +135,6 @@
30 Days End of Month
- 30 Days End of Month
balance
@@ -147,16 +146,13 @@
30% Advance End 30 Days
- 30% Advance
procent
-
- Remaining Balance
balance
diff --git a/addons/account/edi/invoice_action_data.xml b/addons/account/edi/invoice_action_data.xml
index 18ac71f55ce..b3fe8362b8b 100644
--- a/addons/account/edi/invoice_action_data.xml
+++ b/addons/account/edi/invoice_action_data.xml
@@ -24,7 +24,7 @@
Invoice - Send by Email
${object.user_id.email or object.company_id.email or 'noreply@localhost'}
${object.company_id.name} Invoice (Ref ${object.number or 'n/a'})
- ${object.partner_id.id}
+ ${object.partner_id.id}
diff --git a/addons/account_analytic_analysis/account_analytic_analysis_view.xml b/addons/account_analytic_analysis/account_analytic_analysis_view.xml
index 3c477b5556f..6f670b2c6b9 100644
--- a/addons/account_analytic_analysis/account_analytic_analysis_view.xml
+++ b/addons/account_analytic_analysis/account_analytic_analysis_view.xml
@@ -276,7 +276,7 @@
form
tree,form
[('invoice_id','=',False)]
- {'search_default_to_invoice': 1, 'search_default_sales': 1}
+ {'search_default_to_invoice': 1}
diff --git a/addons/account_payment/__openerp__.py b/addons/account_payment/__openerp__.py
index 66d0201b2fe..4c3c8f045e3 100644
--- a/addons/account_payment/__openerp__.py
+++ b/addons/account_payment/__openerp__.py
@@ -53,7 +53,6 @@ have a new option to import payment orders as bank statement lines.
'account_payment_view.xml',
'account_payment_workflow.xml',
'account_payment_sequence.xml',
- 'account_invoice_view.xml',
'account_payment_report.xml',
],
'demo': ['account_payment_demo.xml'],
diff --git a/addons/account_payment/account_invoice.py b/addons/account_payment/account_invoice.py
index 7c8560fc9e8..bcce77a54ce 100644
--- a/addons/account_payment/account_invoice.py
+++ b/addons/account_payment/account_invoice.py
@@ -19,9 +19,8 @@
#
##############################################################################
-from datetime import datetime
from openerp.tools.translate import _
-from openerp.osv import fields, osv
+from openerp.osv import osv
class Invoice(osv.osv):
_inherit = 'account.invoice'
@@ -43,28 +42,6 @@ class Invoice(osv.osv):
raise osv.except_osv(_('Error!'), _("You cannot cancel an invoice which has already been imported in a payment order. Remove it from the following payment order : %s."%(payment_order_name)))
return super(Invoice, self).action_cancel(cr, uid, ids, context=context)
- def _amount_to_pay(self, cursor, user, ids, name, args, context=None):
- '''Return the amount still to pay regarding all the payment orders'''
- if not ids:
- return {}
- res = {}
- for invoice in self.browse(cursor, user, ids, context=context):
- res[invoice.id] = 0.0
- if invoice.move_id:
- for line in invoice.move_id.line_id:
- if not line.date_maturity or \
- datetime.strptime(line.date_maturity, '%Y-%m-%d') \
- < datetime.today():
- res[invoice.id] += line.amount_to_pay
- return res
-
- _columns = {
- 'amount_to_pay': fields.function(_amount_to_pay,
- type='float', string='Amount to be paid',
- help='The amount which should be paid at the current date\n' \
- 'minus the amount which is already in payment order'),
- }
-
Invoice()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_payment/account_invoice_view.xml b/addons/account_payment/account_invoice_view.xml
deleted file mode 100644
index ebb6bcbf965..00000000000
--- a/addons/account_payment/account_invoice_view.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
- account.invoice.supplier.form.inherit
- account.invoice
-
-
-
-
-
-
-
-
-
diff --git a/addons/account_payment/account_move_line.py b/addons/account_payment/account_move_line.py
index 35c30c686e8..c601d9e8da3 100644
--- a/addons/account_payment/account_move_line.py
+++ b/addons/account_payment/account_move_line.py
@@ -19,65 +19,12 @@
#
##############################################################################
-from operator import itemgetter
-from openerp.osv import fields, osv
+from openerp.osv import osv
from openerp.tools.translate import _
class account_move_line(osv.osv):
_inherit = "account.move.line"
- def amount_to_pay(self, cr, uid, ids, name, arg=None, context=None):
- """ Return the amount still to pay regarding all the payemnt orders
- (excepting cancelled orders)"""
- if not ids:
- return {}
- cr.execute("""SELECT ml.id,
- CASE WHEN ml.amount_currency < 0
- THEN - ml.amount_currency
- ELSE ml.credit
- END -
- (SELECT coalesce(sum(amount_currency),0)
- FROM payment_line pl
- INNER JOIN payment_order po
- ON (pl.order_id = po.id)
- WHERE move_line_id = ml.id
- AND po.state != 'cancel') AS amount
- FROM account_move_line ml
- WHERE id IN %s""", (tuple(ids),))
- r = dict(cr.fetchall())
- return r
-
- def _to_pay_search(self, cr, uid, obj, name, args, context=None):
- if not args:
- return []
- line_obj = self.pool.get('account.move.line')
- query = line_obj._query_get(cr, uid, context={})
- where = ' and '.join(map(lambda x: '''(SELECT
- CASE WHEN l.amount_currency < 0
- THEN - l.amount_currency
- ELSE l.credit
- END - coalesce(sum(pl.amount_currency), 0)
- FROM payment_line pl
- INNER JOIN payment_order po ON (pl.order_id = po.id)
- WHERE move_line_id = l.id
- AND po.state != 'cancel'
- ) %(operator)s %%s ''' % {'operator': x[1]}, args))
- sql_args = tuple(map(itemgetter(2), args))
-
- cr.execute(('''SELECT id
- FROM account_move_line l
- WHERE account_id IN (select id
- FROM account_account
- WHERE type=%s AND active)
- AND reconcile_id IS null
- AND credit > 0
- AND ''' + where + ' and ' + query), ('payable',)+sql_args )
-
- res = cr.fetchall()
- if not res:
- return [('id', '=', '0')]
- return [('id', 'in', map(lambda x:x[0], res))]
-
def line2bank(self, cr, uid, ids, payment_type=None, context=None):
"""
Try to return for each Ledger Posting line a corresponding bank
@@ -110,11 +57,6 @@ class account_move_line(osv.osv):
raise osv.except_osv(_('Error!'), _('There is no partner defined on the entry line.'))
return line2bank
- _columns = {
- 'amount_to_pay': fields.function(amount_to_pay,
- type='float', string='Amount to pay', fnct_search=_to_pay_search),
- }
-
account_move_line()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_payment/account_payment.py b/addons/account_payment/account_payment.py
index bf0377111a8..2b0fe1271d2 100644
--- a/addons/account_payment/account_payment.py
+++ b/addons/account_payment/account_payment.py
@@ -352,7 +352,7 @@ class payment_line(osv.osv):
if move_line_id:
line = move_line_obj.browse(cr, uid, move_line_id, context=context)
- data['amount_currency'] = line.amount_to_pay
+ data['amount_currency'] = line.amount_residual_currency
res = self.onchange_amount(cr, uid, ids, data['amount_currency'], currency,
company_currency, context)
diff --git a/addons/account_payment/account_payment_view.xml b/addons/account_payment/account_payment_view.xml
index c2f27a576a2..aa52d1d443e 100644
--- a/addons/account_payment/account_payment_view.xml
+++ b/addons/account_payment/account_payment_view.xml
@@ -2,29 +2,6 @@
-
-
- account.move.line.form.inherit
- account.move.line
-
-
-
-
-
-
-
-
-
-
@@ -116,7 +93,7 @@
-
+
@@ -242,7 +219,7 @@
-
+
diff --git a/addons/account_payment/wizard/account_payment_order.py b/addons/account_payment/wizard/account_payment_order.py
index f4d695a05d1..4bd969726fe 100644
--- a/addons/account_payment/wizard/account_payment_order.py
+++ b/addons/account_payment/wizard/account_payment_order.py
@@ -82,7 +82,7 @@ class payment_order_create(osv.osv_memory):
date_to_pay = payment.date_scheduled
payment_obj.create(cr, uid,{
'move_line_id': line.id,
- 'amount_currency': line.amount_to_pay,
+ 'amount_currency': line.amount_residual_currency,
'bank_id': line2bank.get(line.id),
'order_id': payment.id,
'partner_id': line.partner_id and line.partner_id.id or False,
@@ -102,7 +102,7 @@ class payment_order_create(osv.osv_memory):
# payment = self.pool.get('payment.order').browse(cr, uid, context['active_id'], context=context)
# Search for move line to pay:
- domain = [('reconcile_id', '=', False), ('account_id.type', '=', 'payable'), ('amount_to_pay', '>', 0)]
+ domain = [('reconcile_id', '=', False), ('account_id.type', '=', 'payable'), ('amount_residual', '>', 0)]
domain = domain + ['|', ('date_maturity', '<=', search_due_date), ('date_maturity', '=', False)]
line_ids = line_obj.search(cr, uid, domain, context=context)
context.update({'line_ids': line_ids})
diff --git a/addons/auth_crypt/i18n/hu.po b/addons/auth_crypt/i18n/hu.po
new file mode 100644
index 00000000000..03b51f265ac
--- /dev/null
+++ b/addons/auth_crypt/i18n/hu.po
@@ -0,0 +1,28 @@
+# Hungarian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR , 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-19 18:28+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Hungarian \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-20 04:42+0000\n"
+"X-Generator: Launchpad (build 16532)\n"
+
+#. module: auth_crypt
+#: field:res.users,password_crypt:0
+msgid "Encrypted Password"
+msgstr "Kódolt jalszó"
+
+#. module: auth_crypt
+#: model:ir.model,name:auth_crypt.model_res_users
+msgid "Users"
+msgstr "Felhasználók"
diff --git a/addons/auth_oauth/i18n/hu.po b/addons/auth_oauth/i18n/hu.po
new file mode 100644
index 00000000000..5a5c102afaf
--- /dev/null
+++ b/addons/auth_oauth/i18n/hu.po
@@ -0,0 +1,135 @@
+# Hungarian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR , 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-19 18:17+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Hungarian \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-20 04:42+0000\n"
+"X-Generator: Launchpad (build 16532)\n"
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,validation_endpoint:0
+msgid "Validation URL"
+msgstr "URL elérési út érvényesítés"
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,auth_endpoint:0
+msgid "Authentication URL"
+msgstr "URL elérési út hitelesítés"
+
+#. module: auth_oauth
+#: model:ir.model,name:auth_oauth.model_base_config_settings
+msgid "base.config.settings"
+msgstr "base.config.settings"
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,name:0
+msgid "Provider name"
+msgstr "Szolgáltató neve"
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,scope:0
+msgid "Scope"
+msgstr "Hatáskör"
+
+#. module: auth_oauth
+#: field:res.users,oauth_provider_id:0
+msgid "OAuth Provider"
+msgstr "OAuth szolgáltató"
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,css_class:0
+msgid "CSS class"
+msgstr "CSS osztály"
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,body:0
+msgid "Body"
+msgstr "Törzs"
+
+#. module: auth_oauth
+#: model:ir.model,name:auth_oauth.model_res_users
+msgid "Users"
+msgstr "Felhasználók"
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,sequence:0
+msgid "unknown"
+msgstr "ismeretlen"
+
+#. module: auth_oauth
+#: field:res.users,oauth_access_token:0
+msgid "OAuth Access Token"
+msgstr "OAuth hozzáférési Token"
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,client_id:0
+#: field:base.config.settings,auth_oauth_facebook_client_id:0
+#: field:base.config.settings,auth_oauth_google_client_id:0
+msgid "Client ID"
+msgstr "Ügyfál ID azonosító"
+
+#. module: auth_oauth
+#: model:ir.ui.menu,name:auth_oauth.menu_oauth_providers
+msgid "OAuth Providers"
+msgstr "OAuth szolgáltatók"
+
+#. module: auth_oauth
+#: model:ir.model,name:auth_oauth.model_auth_oauth_provider
+msgid "OAuth2 provider"
+msgstr "OAuth2 szolgáltató"
+
+#. module: auth_oauth
+#: field:res.users,oauth_uid:0
+msgid "OAuth User ID"
+msgstr "OAuth felhasználó ID azonosító"
+
+#. module: auth_oauth
+#: field:base.config.settings,auth_oauth_facebook_enabled:0
+msgid "Allow users to sign in with Facebook"
+msgstr "Felhasználók Facebook keresztüli bejelentkezés engedélyezése"
+
+#. module: auth_oauth
+#: sql_constraint:res.users:0
+msgid "OAuth UID must be unique per provider"
+msgstr "OAuth UID egyedinek kell lennie mindegyik szolgáltatóhoz"
+
+#. module: auth_oauth
+#: help:res.users,oauth_uid:0
+msgid "Oauth Provider user_id"
+msgstr "Oauth szolgáltatói felhasználó_id"
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,data_endpoint:0
+msgid "Data URL"
+msgstr "Adat URL elérési út"
+
+#. module: auth_oauth
+#: view:auth.oauth.provider:0
+msgid "arch"
+msgstr ""
+
+#. module: auth_oauth
+#: model:ir.actions.act_window,name:auth_oauth.action_oauth_provider
+msgid "Providers"
+msgstr ""
+
+#. module: auth_oauth
+#: field:base.config.settings,auth_oauth_google_enabled:0
+msgid "Allow users to sign in with Google"
+msgstr ""
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,enabled:0
+msgid "Allowed"
+msgstr ""
diff --git a/addons/auth_oauth_signup/i18n/hu.po b/addons/auth_oauth_signup/i18n/hu.po
new file mode 100644
index 00000000000..c0f8c00557a
--- /dev/null
+++ b/addons/auth_oauth_signup/i18n/hu.po
@@ -0,0 +1,23 @@
+# Hungarian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR , 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-19 18:13+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Hungarian \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-20 04:42+0000\n"
+"X-Generator: Launchpad (build 16532)\n"
+
+#. module: auth_oauth_signup
+#: model:ir.model,name:auth_oauth_signup.model_res_users
+msgid "Users"
+msgstr "Felhasználók"
diff --git a/addons/auth_openid/i18n/hu.po b/addons/auth_openid/i18n/hu.po
new file mode 100644
index 00000000000..356f7180f8c
--- /dev/null
+++ b/addons/auth_openid/i18n/hu.po
@@ -0,0 +1,97 @@
+# Hungarian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR , 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-19 18:15+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Hungarian \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-20 04:42+0000\n"
+"X-Generator: Launchpad (build 16532)\n"
+
+#. module: auth_openid
+#. openerp-web
+#: code:addons/auth_openid/static/src/xml/auth_openid.xml:24
+#, python-format
+msgid "Username"
+msgstr "Felhasználónév"
+
+#. module: auth_openid
+#. openerp-web
+#: code:addons/auth_openid/static/src/xml/auth_openid.xml:12
+#: view:res.users:0
+#, python-format
+msgid "OpenID"
+msgstr "OpenID"
+
+#. module: auth_openid
+#. openerp-web
+#: code:addons/auth_openid/static/src/xml/auth_openid.xml:30
+#: field:res.users,openid_url:0
+#, python-format
+msgid "OpenID URL"
+msgstr "OpenID URL elérési út"
+
+#. module: auth_openid
+#. openerp-web
+#: code:addons/auth_openid/static/src/xml/auth_openid.xml:9
+#: code:addons/auth_openid/static/src/xml/auth_openid.xml:10
+#, python-format
+msgid "Google"
+msgstr "Google"
+
+#. module: auth_openid
+#. openerp-web
+#: code:addons/auth_openid/static/src/xml/auth_openid.xml:11
+#, python-format
+msgid "Launchpad"
+msgstr "Launchpad/Kiadásiszerk"
+
+#. module: auth_openid
+#: help:res.users,openid_email:0
+msgid "Used for disambiguation in case of a shared OpenID URL"
+msgstr ""
+
+#. module: auth_openid
+#. openerp-web
+#: code:addons/auth_openid/static/src/xml/auth_openid.xml:18
+#, python-format
+msgid "Google Apps Domain"
+msgstr "Google Alk Domain"
+
+#. module: auth_openid
+#: field:res.users,openid_email:0
+msgid "OpenID Email"
+msgstr "OpenID Email"
+
+#. module: auth_openid
+#: field:res.users,openid_key:0
+msgid "OpenID Key"
+msgstr "OpenID Kulcs"
+
+#. module: auth_openid
+#. openerp-web
+#: code:addons/auth_openid/static/src/xml/auth_openid.xml:8
+#, python-format
+msgid "Password"
+msgstr "Jelszó"
+
+#. module: auth_openid
+#. openerp-web
+#: code:addons/auth_openid/static/src/xml/auth_openid.xml:10
+#, python-format
+msgid "Google Apps"
+msgstr "Google Alk"
+
+#. module: auth_openid
+#: model:ir.model,name:auth_openid.model_res_users
+msgid "Users"
+msgstr "Felhasználók"
diff --git a/addons/auth_openid/static/src/css/openid.css b/addons/auth_openid/static/src/css/openid.css
index ab01ffd2f60..57c745f0aca 100644
--- a/addons/auth_openid/static/src/css/openid.css
+++ b/addons/auth_openid/static/src/css/openid.css
@@ -1,25 +1,15 @@
-.login .pane {
- width: 260px;
- height: 175px;
-}
-
-.login .pane input[name='openid_url'] {
+.oe_login .oe_login_pane input[name='openid_url'] {
background: #fff url(../img/login-bg.gif) no-repeat 1px;
padding-left: 20px;
}
-.auth_choice {
- position: static;
- display: none;
+.openerp .oe_login .openid_providers {
+ text-align: center;
}
-
-.openid_providers {
- padding: 0;
- list-style: none;
- float: right;
+.openerp .oe_login .openid_providers ul {
+ display: inline-block;
}
-
-.openid_providers li {
+.openerp .oe_login .openid_providers ul li {
display: block;
float: left;
margin: 0 1px 3px 2px;
@@ -29,7 +19,6 @@
display: block;
width: 24px;
height: 24px;
- border: 1px solid #ddd;
background: #fff url(../img/openid_16.png) no-repeat 50%;
text-indent: -9999px;
overflow: hidden;
@@ -37,20 +26,16 @@
}
.openid_providers a.selected {
- border-color: #9A0404;
+ background-color: #DC5F59;
}
-.openid_providers a[title="Password"] { background-image: url(../img/textfield_key.png); }
-.openid_providers a[title="AOL"] { background-image: url(../img/aol.png); }
-.openid_providers a[title="ClaimID"] { background-image: url(../img/claimid.png); }
-.openid_providers a[title="Google"] { background-image: url(../img/googlefav.png); }
-.openid_providers a[title="Google Apps"] { background-image: url(../img/marketplace.gif); }
-.openid_providers a[title="MyOpenID"] { background-image: url(../img/myopenid.png); }
-.openid_providers a[title="VeriSign"] { background-image: url(../img/verisign.png); }
-.openid_providers a[title="Yahoo!"] { background-image: url(../img/yahoo.png); }
-.openid_providers a[title="Launchpad"] { background-image: url(../img/launchpad.png); }
+.openid_providers a[data-provider="Password"] { background-image: url(../img/textfield_key.png); }
+.openid_providers a[data-provider="AOL"] { background-image: url(../img/aol.png); }
+.openid_providers a[data-provider="ClaimID"] { background-image: url(../img/claimid.png); }
+.openid_providers a[data-provider="Google"] { background-image: url(../img/googlefav.png); }
+.openid_providers a[data-provider="Google Apps"] { background-image: url(../img/marketplace.gif); }
+.openid_providers a[data-provider="MyOpenID"] { background-image: url(../img/myopenid.png); }
+.openid_providers a[data-provider="VeriSign"] { background-image: url(../img/verisign.png); }
+.openid_providers a[data-provider="Yahoo!"] { background-image: url(../img/yahoo.png); }
+.openid_providers a[data-provider="Launchpad"] { background-image: url(../img/launchpad.png); }
-
-li.auth_choice.selected {
- display: table-row;
-}
diff --git a/addons/auth_openid/static/src/js/auth_openid.js b/addons/auth_openid/static/src/js/auth_openid.js
index f8615481a40..ac2804cb130 100644
--- a/addons/auth_openid/static/src/js/auth_openid.js
+++ b/addons/auth_openid/static/src/js/auth_openid.js
@@ -14,6 +14,16 @@ instance.web.Login = instance.web.Login.extend({
self.$openid_selected_input = $();
self.$openid_selected_provider = null;
+
+ // Hook auth_signup events. noop if module is not installed.
+ self.on('change:login_mode', self, function() {
+ var mode = self.get('login_mode') || 'default';
+ if (mode !== 'default') {
+ return;
+ }
+ self.do_openid_select(self.$openid_selected_button, self.$openid_selected_provider, true);
+ });
+
var openIdProvider = null;
if (self.has_local_storage && self.remember_credentials) {
@@ -21,12 +31,10 @@ instance.web.Login = instance.web.Login.extend({
}
if (openIdProvider) {
- $openid_selected_provider = openIdProvider;
+ self.$openid_selected_provider = openIdProvider;
self.do_openid_select('a[href="#' + openIdProvider + '"]', openIdProvider, true);
- if (self.has_local_storage && self.remember_credentials) {
- self.$openid_selected_input.find('input').val(localStorage.getItem('openid-login'));
- }
+ self.$openid_selected_input.find('input').val(localStorage.getItem('openid-login') || '');
}
else {
self.do_openid_select('a[data-url=""]', 'login,password', true);
@@ -49,11 +57,12 @@ instance.web.Login = instance.web.Login.extend({
do_openid_select: function (button, provider, noautosubmit) {
var self = this;
+ self.$('li[data-provider]').hide();
self.$openid_selected_button.add(self.$openid_selected_input).removeClass('selected');
self.$openid_selected_button = self.$el.find(button).addClass('selected');
var input = _(provider.split(',')).map(function(p) { return 'li[data-provider="'+p+'"]'; }).join(',');
- self.$openid_selected_input = self.$el.find(input).addClass('selected');
+ self.$openid_selected_input = self.$el.find(input).show();
self.$openid_selected_input.find('input:first').focus();
self.$openid_selected_provider = (self.$openid_selected_button.attr('href') || '').substr(1);
@@ -62,7 +71,7 @@ instance.web.Login = instance.web.Login.extend({
localStorage.setItem('openid-provider', self.$openid_selected_provider);
}
- if (!noautosubmit && self.$openid_selected_input.length == 0) {
+ if (!noautosubmit && self.$openid_selected_input.length === 0) {
self.$el.find('form').submit();
}
diff --git a/addons/auth_openid/static/src/xml/auth_openid.xml b/addons/auth_openid/static/src/xml/auth_openid.xml
index 6a40439a012..75fd2a8fe45 100644
--- a/addons/auth_openid/static/src/xml/auth_openid.xml
+++ b/addons/auth_openid/static/src/xml/auth_openid.xml
@@ -4,44 +4,53 @@
-
+
-
-
+
+
Google Apps Domain
-
+
-
+
Username
-
+
-
+
OpenID URL
-
+
-
+
+ this.each(function() {
+ var $i = $(this);
+ $i.add($i.prev()).attr('data-provider', 'password');
+ });
+
+
this.each(function() {
var $i = $(this),
- dp = $i.find('input').attr('name');
- $i.add($i.prev()).attr('class', 'auth_choice').attr('data-provider', dp);
+ dp = $i.find('input').attr('name'),
+ $p = $i.prev();
+ // $p may not be the correct label when auth_signup is installed.
+ while(($p.attr('data-modes') || 'default') !== 'default') { $p = $p.prev(); }
+ $i.add($p).attr('data-provider', dp);
});
diff --git a/addons/auth_signup/res_users.py b/addons/auth_signup/res_users.py
index 4e86de5b474..b5383e41775 100644
--- a/addons/auth_signup/res_users.py
+++ b/addons/auth_signup/res_users.py
@@ -161,14 +161,12 @@ class res_users(osv.Model):
def _get_state(self, cr, uid, ids, name, arg, context=None):
res = {}
for user in self.browse(cr, uid, ids, context):
- res[user.id] = ('reset' if user.signup_valid else
- 'active' if user.login_date else
- 'new')
+ res[user.id] = ('active' if user.login_date else 'new')
return res
_columns = {
'state': fields.function(_get_state, string='Status', type='selection',
- selection=[('new', 'New'), ('active', 'Active'), ('reset', 'Resetting Password')]),
+ selection=[('new', 'Never Connected'), ('active', 'Activated')]),
}
def signup(self, cr, uid, values, token=None, context=None):
@@ -270,16 +268,7 @@ class res_users(osv.Model):
if mail_state and mail_state['state'] == 'exception':
raise self.pool.get('res.config.settings').get_config_warning(cr, _("Cannot send email: no outgoing email server configured.\nYou can configure it under %(menu:base_setup.menu_general_configuration)s."), context)
else:
- return {
- 'type': 'ir.actions.client',
- 'name': '_(Server Notification)',
- 'tag': 'action_notify',
- 'params': {
- 'title': 'Mail Sent to: %s' % user.name,
- 'text': 'You can reset the password by yourself using this link ' % user.partner_id.signup_url,
- 'sticky': True,
- }
- }
+ return True
def create(self, cr, uid, values, context=None):
# overridden to automatically invite user to sign up
diff --git a/addons/auth_signup/res_users_view.xml b/addons/auth_signup/res_users_view.xml
index 11a5315cbb7..28f66eb101d 100644
--- a/addons/auth_signup/res_users_view.xml
+++ b/addons/auth_signup/res_users_view.xml
@@ -17,13 +17,25 @@
+
+
+ A password reset has been requested for this user. An email containing the following link has been sent:
+
+
+ An invitation email containing the following subscription link has been sent:
+
+
+
+
-
-
+
-
+ type="object" name="action_reset_password"
+ attrs="{'invisible': [('state', '!=', 'active')]}"/>
+
diff --git a/addons/auth_signup/static/src/js/auth_signup.js b/addons/auth_signup/static/src/js/auth_signup.js
index fe071fde55d..bbaf907c625 100644
--- a/addons/auth_signup/static/src/js/auth_signup.js
+++ b/addons/auth_signup/static/src/js/auth_signup.js
@@ -56,7 +56,7 @@ openerp.auth_signup = function(instance) {
self.rpc("/auth_signup/get_config", {dbname: dbname}).done(function(result) {
self.signup_enabled = result.signup;
self.reset_password_enabled = result.reset_password;
- if (self.$("form input[name=login]").val()){
+ if (!self.signup_enabled || self.$("form input[name=login]").val()){
self.set('login_mode', 'default');
} else {
self.set('login_mode', 'signup');
diff --git a/addons/auth_signup/static/src/xml/auth_signup.xml b/addons/auth_signup/static/src/xml/auth_signup.xml
index 9ef4f394e27..1c41dbed181 100644
--- a/addons/auth_signup/static/src/xml/auth_signup.xml
+++ b/addons/auth_signup/static/src/xml/auth_signup.xml
@@ -12,6 +12,9 @@
Username
Username (Email)
+
+ this.attr('data-modes', 'default signup reset');
+
Confirm Password
diff --git a/addons/base_calendar/i18n/hu.po b/addons/base_calendar/i18n/hu.po
index 3ddba871eff..b54cfc10e89 100644
--- a/addons/base_calendar/i18n/hu.po
+++ b/addons/base_calendar/i18n/hu.po
@@ -7,13 +7,13 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
-"PO-Revision-Date: 2013-03-18 00:17+0000\n"
+"PO-Revision-Date: 2013-03-19 17:29+0000\n"
"Last-Translator: krnkris \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: 2013-03-18 04:46+0000\n"
+"X-Launchpad-Export-Date: 2013-03-20 04:42+0000\n"
"X-Generator: Launchpad (build 16532)\n"
#. module: base_calendar
@@ -257,7 +257,7 @@ msgstr "Hiba!"
#. module: base_calendar
#: selection:calendar.attendee,role:0
msgid "Chair Person"
-msgstr ""
+msgstr "Elnök személye"
#. module: base_calendar
#: view:crm.meeting:0
@@ -886,7 +886,7 @@ msgstr "Ügyféltalálkozó"
msgid ""
"Reference to the URIthat points to the directory information corresponding "
"to the attendee."
-msgstr ""
+msgstr "URI hivatkozás mely a felszólaló információs könyvtárára mutat"
#. module: base_calendar
#: selection:calendar.event,month_list:0
@@ -1099,6 +1099,7 @@ msgstr "Feladattal megbízva"
#: help:calendar.alarm,action:0
msgid "Defines the action to be invoked when an alarm is triggered"
msgstr ""
+"Meghatározza a segítségül hivható műveletet egy vészjelzés beindítása esetén"
#. module: base_calendar
#: view:crm.meeting:0
@@ -1124,18 +1125,20 @@ msgid ""
"If the active field is set to true, it will allow you to hide the event "
"alarm information without removing it."
msgstr ""
+"Ha egy aktív mező igazra állított, akkor lehetővé teszi az esemény riasztás "
+"információ eltüntetését annak törlése nélkül."
#. module: base_calendar
#: field:calendar.event,end_type:0
#: field:calendar.todo,end_type:0
#: field:crm.meeting,end_type:0
msgid "Recurrence Termination"
-msgstr ""
+msgstr "Ismétlés megállítása"
#. module: base_calendar
#: view:crm.meeting:0
msgid "Until"
-msgstr ""
+msgstr "Eddig"
#. module: base_calendar
#: view:res.alarm:0
@@ -1145,12 +1148,12 @@ msgstr "Emlékeztető részletei"
#. module: base_calendar
#: model:crm.meeting.type,name:base_calendar.categ_meet3
msgid "Off-site Meeting"
-msgstr ""
+msgstr "Külső találkozó"
#. module: base_calendar
#: view:crm.meeting:0
msgid "Day of Month"
-msgstr ""
+msgstr "A hónap napja"
#. module: base_calendar
#: selection:calendar.alarm,state:0
@@ -1167,7 +1170,7 @@ msgstr "Ismétlés (nap/hét/hó/év)"
#. module: base_calendar
#: view:crm.meeting:0
msgid "All Day?"
-msgstr ""
+msgstr "Minden nap?"
#. module: base_calendar
#: view:calendar.event:0
@@ -1188,6 +1191,16 @@ msgid ""
" \n"
" "
msgstr ""
+"\n"
+" Kattintson új találkozó ütemezéséhez.\n"
+"
\n"
+" A naptár az alkalmazottak között megosztott és teljesen "
+"integrált az\n"
+" egyéb alkalmazásokkal mint az alkalmazotti szabadságok vagy az "
+"üzleti\n"
+" lehetőségek.\n"
+"
\n"
+" "
#. module: base_calendar
#: help:calendar.alarm,description:0
@@ -1196,6 +1209,8 @@ msgid ""
"calendar component, than that provided by the "
"\"SUMMARY\" property"
msgstr ""
+"Egy jóval összetettebb leírást biztosít a naptári bejegyzéshez, mint amit az "
+"\"ÖSSZEGZÉS\" tulajdonságoknál létre lett hozva"
#. module: base_calendar
#: view:calendar.event:0
@@ -1205,7 +1220,7 @@ msgstr "Felelős felhasználó"
#. module: base_calendar
#: view:crm.meeting:0
msgid "Select Weekdays"
-msgstr ""
+msgstr "Munkanapokat válasszon"
#. module: base_calendar
#: code:addons/base_calendar/base_calendar.py:1519
@@ -1220,7 +1235,7 @@ msgstr "Foglalt"
#. module: base_calendar
#: model:ir.model,name:base_calendar.model_calendar_event
msgid "Calendar Event"
-msgstr ""
+msgstr "Naptári esemény"
#. module: base_calendar
#: field:calendar.event,recurrency:0
@@ -1255,6 +1270,8 @@ msgstr "Kivétel szabály"
msgid ""
"To specify the language for text values in aproperty or property parameter."
msgstr ""
+"Nyelv meghatározása a tulajdonság vagy a tulajdonság paraméter szöveg "
+"értékekhez."
#. module: base_calendar
#: view:calendar.event:0
@@ -1269,6 +1286,8 @@ msgid ""
"Defines a rule or repeating pattern of time to exclude from the recurring "
"rule."
msgstr ""
+"Meghatároz egy idő szabályt vagy ismétlődési mintát az ismétlődési "
+"szabályból való kizáráshoz."
#. module: base_calendar
#: field:calendar.event,month_list:0
@@ -1282,17 +1301,17 @@ msgstr "Hónap"
#: selection:calendar.todo,rrule_type:0
#: selection:crm.meeting,rrule_type:0
msgid "Day(s)"
-msgstr ""
+msgstr "Nap(ok)"
#. module: base_calendar
#: view:calendar.event:0
msgid "Confirmed Events"
-msgstr ""
+msgstr "Nyugtázozz események"
#. module: base_calendar
#: field:calendar.attendee,dir:0
msgid "URI Reference"
-msgstr ""
+msgstr "URI Referencia"
#. module: base_calendar
#: field:calendar.alarm,description:0
@@ -1331,7 +1350,7 @@ msgstr "ir.values"
#. module: base_calendar
#: view:crm.meeting:0
msgid "Search Meetings"
-msgstr ""
+msgstr "Találkozó keresés"
#. module: base_calendar
#: model:ir.model,name:base_calendar.model_ir_attachment
@@ -1341,7 +1360,7 @@ msgstr "ir.attachment"
#. module: base_calendar
#: model:ir.model,name:base_calendar.model_crm_meeting_type
msgid "Meeting Type"
-msgstr ""
+msgstr "Találkozó típusa"
#. module: base_calendar
#: selection:calendar.attendee,state:0
@@ -1367,16 +1386,24 @@ msgid ""
" \n"
" "
msgstr ""
+"\n"
+" Kattintson új riasztás típus beállításához.\n"
+"
\n"
+" Meg tud határozni egy személyre szabott naptári riasztás "
+"típust melyet\n"
+" hozzá lehet rendelni naptári eseményhez vagy találkozókhoz.\n"
+"
\n"
+" "
#. module: base_calendar
#: selection:crm.meeting,state:0
msgid "Unconfirmed"
-msgstr ""
+msgstr "Nincs megerősítve"
#. module: base_calendar
#: help:calendar.attendee,sent_by:0
msgid "Specify the user that is acting on behalf of the calendar user"
-msgstr ""
+msgstr "Határozza meg a falhasználót aki a naptár felhasználója lesz"
#. module: base_calendar
#: view:calendar.event:0
@@ -1409,7 +1436,7 @@ msgstr "Név"
#: field:calendar.todo,exdate:0
#: field:crm.meeting,exdate:0
msgid "Exception Date/Times"
-msgstr ""
+msgstr "Dátum/idő kivételek"
#. module: base_calendar
#: help:calendar.alarm,name:0
@@ -1417,11 +1444,13 @@ msgid ""
"Contains the text to be used as the message subject for "
"email or contains the text to be used for display"
msgstr ""
+"Tartalmazza az e-mail tárgyaként felhasznált szöveget vagy a megjeleníteni "
+"kívánt üzenetet"
#. module: base_calendar
#: model:ir.model,name:base_calendar.model_mail_message
msgid "Message"
-msgstr ""
+msgstr "Üzenet"
#. module: base_calendar
#: field:calendar.event,base_calendar_alarm_id:0
@@ -1446,7 +1475,7 @@ msgstr "Április"
#: code:addons/base_calendar/crm_meeting.py:106
#, python-format
msgid "Email addresses not found"
-msgstr ""
+msgstr "E-mail cím nem található"
#. module: base_calendar
#: view:calendar.event:0
@@ -1464,7 +1493,7 @@ msgstr "Hétköznap"
#: code:addons/base_calendar/base_calendar.py:1013
#, python-format
msgid "Interval cannot be negative."
-msgstr ""
+msgstr "Intervallum nem lehet negatív."
#. module: base_calendar
#: field:calendar.event,byday:0
@@ -1477,7 +1506,7 @@ msgstr "Nappal"
#: code:addons/base_calendar/base_calendar.py:441
#, python-format
msgid "First you have to specify the date of the invitation."
-msgstr ""
+msgstr "Elöször meg kell határoznia a meghívó dátumát."
#. module: base_calendar
#: field:calendar.alarm,model_id:0
@@ -1499,7 +1528,7 @@ msgstr "ID"
#. module: base_calendar
#: selection:calendar.attendee,role:0
msgid "For information Purpose"
-msgstr ""
+msgstr "Információs célokra"
#. module: base_calendar
#: field:calendar.event,select1:0
@@ -1511,7 +1540,7 @@ msgstr "Opció"
#. module: base_calendar
#: model:ir.model,name:base_calendar.model_calendar_attendee
msgid "Attendee information"
-msgstr ""
+msgstr "Résztvevők információi"
#. module: base_calendar
#: field:calendar.alarm,res_id:0
@@ -1521,12 +1550,12 @@ msgstr "Erőforrás ID"
#. module: base_calendar
#: selection:calendar.attendee,state:0
msgid "Needs Action"
-msgstr ""
+msgstr "Beavatkozás szükséges"
#. module: base_calendar
#: field:calendar.attendee,sent_by:0
msgid "Sent By"
-msgstr ""
+msgstr "Küldte"
#. module: base_calendar
#: field:calendar.event,sequence:0
@@ -1540,7 +1569,7 @@ msgstr "Sorszám"
#: help:calendar.todo,alarm_id:0
#: help:crm.meeting,alarm_id:0
msgid "Set an alarm at this time, before the event occurs"
-msgstr ""
+msgstr "Most beállított riasztás, mielőtt az esemény elkezdődne"
#. module: base_calendar
#: view:calendar.event:0
@@ -1560,7 +1589,7 @@ msgstr "Szombat"
#: field:calendar.todo,interval:0
#: field:crm.meeting,interval:0
msgid "Repeat Every"
-msgstr ""
+msgstr "Ismétlés minden"
#. module: base_calendar
#: selection:calendar.event,byday:0
@@ -1601,6 +1630,11 @@ msgid ""
" * Points to a procedure resource, which is invoked when "
" the alarm is triggered for procedure."
msgstr ""
+"* Hangforrásra mutat, mely beindul, ha a hangra "
+"riasztást ad,\n"
+" * Fájl mely elküldésre szánt mint e-mail melléklet,\n"
+" * Művelet forrásra mutat, melyet segítségül hív ha "
+" a riasztás a művelet miatt lett kapcsolva."
#. module: base_calendar
#: selection:calendar.event,byday:0
diff --git a/addons/base_import/i18n/hu.po b/addons/base_import/i18n/hu.po
index 7892a528c57..2c3c4e60ab2 100644
--- a/addons/base_import/i18n/hu.po
+++ b/addons/base_import/i18n/hu.po
@@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-18 04:46+0000\n"
+"X-Launchpad-Export-Date: 2013-03-19 05:33+0000\n"
"X-Generator: Launchpad (build 16532)\n"
#. module: base_import
diff --git a/addons/crm/crm_data.xml b/addons/crm/crm_data.xml
index 613141b5818..3db7a457dfd 100644
--- a/addons/crm/crm_data.xml
+++ b/addons/crm/crm_data.xml
@@ -72,19 +72,4 @@
-
-
-
-
-
- Opportunity - Send Emails
- ${object.name}
-
-
- ${object.partner_id.id}
-
-
-
diff --git a/addons/crm/crm_lead_data.xml b/addons/crm/crm_lead_data.xml
index 724ec491efe..e335bd1b2ff 100644
--- a/addons/crm/crm_lead_data.xml
+++ b/addons/crm/crm_lead_data.xml
@@ -221,5 +221,17 @@
section_id
+
+
+ Lead/Opportunity Mass Mail
+
+
+ ${object.partner_id and object.partner_id.id}
+ ${not object.partner_id and object.email_from}
+
+
+
diff --git a/addons/crm/crm_lead_view.xml b/addons/crm/crm_lead_view.xml
index 91154b1ee5a..df28d240a0c 100644
--- a/addons/crm/crm_lead_view.xml
+++ b/addons/crm/crm_lead_view.xml
@@ -104,9 +104,9 @@
-
+
@@ -151,7 +151,8 @@
-->
-
+
@@ -426,7 +427,7 @@
-
+
@@ -436,7 +437,7 @@
@@ -581,5 +582,29 @@
+
+
+
+
+
+
+
+
diff --git a/addons/crm/i18n/hu.po b/addons/crm/i18n/hu.po
index 6a5b8424cdd..193fbdfc6cb 100644
--- a/addons/crm/i18n/hu.po
+++ b/addons/crm/i18n/hu.po
@@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-18 04:46+0000\n"
+"X-Launchpad-Export-Date: 2013-03-19 05:33+0000\n"
"X-Generator: Launchpad (build 16532)\n"
#. module: crm
diff --git a/addons/crm_partner_assign/res_partner_view.xml b/addons/crm_partner_assign/res_partner_view.xml
index aeafc367792..433a290ae81 100644
--- a/addons/crm_partner_assign/res_partner_view.xml
+++ b/addons/crm_partner_assign/res_partner_view.xml
@@ -77,6 +77,7 @@
+
@@ -104,17 +105,19 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/email_template/email_template.py b/addons/email_template/email_template.py
index 08ef3ec6e98..147347182f5 100644
--- a/addons/email_template/email_template.py
+++ b/addons/email_template/email_template.py
@@ -146,7 +146,9 @@ class email_template(osv.osv):
help="Sender address (placeholders may be used here). If not set, the default "
"value will be the author's email alias if configured, or email address."),
'email_to': fields.char('To (Emails)', help="Comma-separated recipient addresses (placeholders may be used here)"),
- 'email_recipients': fields.char('To (Partners)', help="Comma-separated ids of recipient partners (placeholders may be used here)"),
+ 'partner_to': fields.char('To (Partners)',
+ help="Comma-separated ids of recipient partners (placeholders may be used here)",
+ oldname='email_recipients'),
'email_cc': fields.char('Cc', help="Carbon copy recipients (placeholders may be used here)"),
'reply_to': fields.char('Reply-To', help="Preferred response address (placeholders may be used here)"),
'mail_server_id': fields.many2one('ir.mail_server', 'Outgoing Mail Server', readonly=False,
@@ -314,7 +316,7 @@ class email_template(osv.osv):
template = self.get_email_template(cr, uid, template_id, res_id, context)
values = {}
for field in ['subject', 'body_html', 'email_from',
- 'email_to', 'email_recipients', 'email_cc', 'reply_to']:
+ 'email_to', 'partner_to', 'email_cc', 'reply_to']:
values[field] = self.render_template(cr, uid, getattr(template, field),
template.model, res_id, context=context) \
or False
@@ -374,7 +376,7 @@ class email_template(osv.osv):
values = self.generate_email(cr, uid, template_id, res_id, context=context)
assert 'email_from' in values, 'email_from is missing or empty after template rendering, send_mail() cannot proceed'
attachments = values.pop('attachments') or {}
- del values['email_recipients'] # TODO Properly use them.
+ del values['partner_to'] # TODO Properly use them.
msg_id = mail_mail.create(cr, uid, values, context=context)
# link attachments
attachment_ids = []
diff --git a/addons/email_template/email_template_view.xml b/addons/email_template/email_template_view.xml
index 73e796394a8..8c63a06ebe0 100644
--- a/addons/email_template/email_template_view.xml
+++ b/addons/email_template/email_template_view.xml
@@ -30,7 +30,7 @@
-
+
@@ -78,7 +78,7 @@
-
+
diff --git a/addons/email_template/res_partner_view.xml b/addons/email_template/res_partner_view.xml
index 1eab8029cb2..fbcfa8ba6ea 100644
--- a/addons/email_template/res_partner_view.xml
+++ b/addons/email_template/res_partner_view.xml
@@ -25,5 +25,35 @@
+
+
+
+ Partner Mass Mail
+
+
+ ${object.id}
+
+
+
+
+
+
+
+
+
diff --git a/addons/email_template/tests/test_mail.py b/addons/email_template/tests/test_mail.py
index b87b6d63000..56abe6a0fef 100644
--- a/addons/email_template/tests/test_mail.py
+++ b/addons/email_template/tests/test_mail.py
@@ -130,6 +130,7 @@ class test_message_compose(TestMailBase):
# 1. Mass_mail on pigs and bird, with a default_partner_ids set to check he is correctly added
context = {
'default_composition_mode': 'mass_mail',
+ 'default_notify': True,
'default_model': 'mail.group',
'default_res_id': self.group_pigs_id,
'default_template_id': email_template_id,
@@ -170,20 +171,20 @@ class test_message_compose(TestMailBase):
self.assertEqual(set(message_bird_pids), set(partner_ids), 'mail.message on bird notified_partner_ids incorrect')
# ----------------------------------------
- # CASE4: test newly introduced email_recipients field
+ # CASE4: test newly introduced partner_to field
# ----------------------------------------
# get already-created partners back
p_b_id = self.res_partner.search(cr, uid, [('email', '=', 'b@b.b')])[0]
p_c_id = self.res_partner.search(cr, uid, [('email', '=', 'c@c.c')])[0]
p_d_id = self.res_partner.search(cr, uid, [('email', '=', 'd@d.d')])[0]
- # modify template: use email_recipients, use template and email address in email_to to test all features together
+ # modify template: use partner_to, use template and email address in email_to to test all features together
user_model_id = self.registry('ir.model').search(cr, uid, [('model', '=', 'res.users')])[0]
email_template.write(cr, uid, [email_template_id], {
'model_id': user_model_id,
'body_html': '${object.login}',
'email_to': '${object.email} c@c',
- 'email_recipients': '%i,%i' % (p_b_id, p_c_id),
+ 'partner_to': '%i,%i' % (p_b_id, p_c_id),
'email_cc': 'd@d',
})
# patner by email + partner by id (no double)
diff --git a/addons/email_template/wizard/email_template_preview_view.xml b/addons/email_template/wizard/email_template_preview_view.xml
index 8dd4bc92ba7..2d7abcb4eef 100644
--- a/addons/email_template/wizard/email_template_preview_view.xml
+++ b/addons/email_template/wizard/email_template_preview_view.xml
@@ -17,7 +17,7 @@
-
+
diff --git a/addons/email_template/wizard/mail_compose_message.py b/addons/email_template/wizard/mail_compose_message.py
index 255f93998a2..2215d0705f1 100644
--- a/addons/email_template/wizard/mail_compose_message.py
+++ b/addons/email_template/wizard/mail_compose_message.py
@@ -59,14 +59,21 @@ class mail_compose_message(osv.TransientModel):
_columns = {
# incredible hack of the day: size=-1 means we want an int db column instead of an str one
'template_id': fields.selection(_get_templates, 'Template', size=-1),
+ 'partner_to': fields.char('To (Partner IDs)',
+ help="Comma-separated list of recipient partners ids (placeholders may be used here)"),
+ 'email_to': fields.char('To (Emails)',
+ help="Comma-separated recipient addresses (placeholders may be used here)",),
+ 'email_cc': fields.char('Cc (Emails)',
+ help="Carbon copy recipients (placeholders may be used here)"),
}
def onchange_template_id(self, cr, uid, ids, template_id, composition_mode, model, res_id, context=None):
""" - mass_mailing: we cannot render, so return the template values
- normal mode: return rendered values """
if template_id and composition_mode == 'mass_mail':
- values = self.pool.get('email.template').read(cr, uid, template_id, ['subject', 'body_html'], context)
- values.pop('id')
+ fields = ['subject', 'body_html', 'email_from', 'email_to', 'partner_to', 'email_cc', 'reply_to']
+ template_values = self.pool.get('email.template').read(cr, uid, template_id, fields, context)
+ values = dict((field, template_values[field]) for field in fields if template_values.get(field))
elif template_id:
# FIXME odo: change the mail generation to avoid attachment duplication
values = self.generate_email_for_composer(cr, uid, template_id, res_id, context=context)
@@ -84,7 +91,7 @@ class mail_compose_message(osv.TransientModel):
}
values['attachment_ids'].append(ir_attach_obj.create(cr, uid, data_attach, context=context))
else:
- values = self.default_get(cr, uid, ['body', 'subject', 'partner_ids', 'attachment_ids'], context=context)
+ values = self.default_get(cr, uid, ['subject', 'body', 'email_from', 'email_to', 'email_cc', 'partner_to', 'reply_to', 'attachment_ids'], context=context)
if values.get('body_html'):
values['body'] = values.pop('body_html')
@@ -117,26 +124,31 @@ class mail_compose_message(osv.TransientModel):
# Wizard validation and send
#------------------------------------------------------
+ def _get_or_create_partners_from_values(self, cr, uid, rendered_values, context=None):
+ """ Check for email_to, email_cc, partner_to """
+ partner_ids = []
+ mails = tools.email_split(rendered_values.pop('email_to', '') + ' ' + rendered_values.pop('email_cc', ''))
+ for mail in mails:
+ partner_id = self.pool.get('res.partner').find_or_create(cr, uid, mail, context=context)
+ partner_ids.append(partner_id)
+ partner_to = rendered_values.pop('partner_to', '')
+ if partner_to:
+ for partner_id in partner_to.split(','):
+ if partner_id: # placeholders could generate '', 3, 2 due to some empty field values
+ partner_ids.append(int(partner_id))
+ return partner_ids
+
def generate_email_for_composer(self, cr, uid, template_id, res_id, context=None):
""" Call email_template.generate_email(), get fields relevant for
mail.compose.message, transform email_cc and email_to into partner_ids """
template_values = self.pool.get('email.template').generate_email(cr, uid, template_id, res_id, context=context)
# filter template values
- fields = ['body_html', 'subject', 'email_to', 'email_recipients', 'email_cc', 'attachments']
+ fields = ['subject', 'body_html', 'email_from', 'email_to', 'partner_to', 'email_cc', 'reply_to', 'attachments']
values = dict((field, template_values[field]) for field in fields if template_values.get(field))
values['body'] = values.pop('body_html', '')
# transform email_to, email_cc into partner_ids
- partner_ids = set()
- mails = tools.email_split(values.pop('email_to', '') + ' ' + values.pop('email_cc', ''))
- for mail in mails:
- partner_id = self.pool.get('res.partner').find_or_create(cr, uid, mail, context=context)
- partner_ids.add(partner_id)
- email_recipients = values.pop('email_recipients', '')
- if email_recipients:
- for partner_id in email_recipients.split(','):
- if partner_id: # placeholders could generate '', 3, 2 due to some empty field values
- partner_ids.add(int(partner_id))
+ partner_ids = self._get_or_create_partners_from_values(cr, uid, values, context=context)
# legacy template behavior: void values do not erase existing values and the
# related key is removed from the values dict
if partner_ids:
@@ -153,6 +165,11 @@ class mail_compose_message(osv.TransientModel):
values = {}
# get values to return
email_dict = super(mail_compose_message, self).render_message(cr, uid, wizard, res_id, context)
+ # those values are not managed; they are readonly
+ email_dict.pop('email_to', None)
+ email_dict.pop('email_cc', None)
+ email_dict.pop('partner_to', None)
+ # update template values by wizard values
values.update(email_dict)
return values
diff --git a/addons/email_template/wizard/mail_compose_message_view.xml b/addons/email_template/wizard/mail_compose_message_view.xml
index 34a2112e1ac..1b2be68a4a2 100644
--- a/addons/email_template/wizard/mail_compose_message_view.xml
+++ b/addons/email_template/wizard/mail_compose_message_view.xml
@@ -7,6 +7,22 @@
mail.compose.message
+
+
+
+
+
+
+
+
+
+
+
+
+
Use template
diff --git a/addons/hr/hr_view.xml b/addons/hr/hr_view.xml
index 7883e9929f0..c3fecdda0bf 100644
--- a/addons/hr/hr_view.xml
+++ b/addons/hr/hr_view.xml
@@ -50,7 +50,8 @@
-
+
diff --git a/addons/hr_holidays/hr_holidays_view.xml b/addons/hr_holidays/hr_holidays_view.xml
index 113d1267380..5828790c152 100644
--- a/addons/hr_holidays/hr_holidays_view.xml
+++ b/addons/hr_holidays/hr_holidays_view.xml
@@ -374,6 +374,7 @@
hr.holidays.status
diff --git a/addons/hr_recruitment/hr_recruitment_view.xml b/addons/hr_recruitment/hr_recruitment_view.xml
index 2299ca25e65..ccf5c8f7934 100644
--- a/addons/hr_recruitment/hr_recruitment_view.xml
+++ b/addons/hr_recruitment/hr_recruitment_view.xml
@@ -107,7 +107,8 @@
-
+
@@ -341,6 +342,7 @@
hr.recruitment.stage
@@ -399,10 +402,12 @@
hr.recruitment.degree
@@ -436,8 +441,12 @@
hr.recruitment.source.form
hr.recruitment.source
-
diff --git a/addons/hr_timesheet/hr_timesheet_view.xml b/addons/hr_timesheet/hr_timesheet_view.xml
index 6edd2a74eea..a80a0b2f151 100644
--- a/addons/hr_timesheet/hr_timesheet_view.xml
+++ b/addons/hr_timesheet/hr_timesheet_view.xml
@@ -8,7 +8,8 @@
-
+
@@ -29,7 +30,8 @@
-
+
diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
index d4e71cedbf5..4be032ba99b 100644
--- a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
+++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
@@ -213,6 +213,7 @@ class hr_timesheet_sheet(osv.osv):
def onchange_employee_id(self, cr, uid, ids, employee_id, context=None):
department_id = False
+ user_id = False
if employee_id:
empl_id = self.pool.get('hr.employee').browse(cr, uid, employee_id, context=context)
department_id = empl_id.department_id.id
diff --git a/addons/lunch/lunch_view.xml b/addons/lunch/lunch_view.xml
index 2d662a2f785..2f3af2f461d 100644
--- a/addons/lunch/lunch_view.xml
+++ b/addons/lunch/lunch_view.xml
@@ -324,7 +324,8 @@
-
+
@@ -409,7 +410,8 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
+
@@ -46,6 +38,8 @@
+
+
@@ -67,7 +61,7 @@
-
+
@@ -97,7 +91,7 @@
-
+
diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py
index 2f56e620543..8442891f3f9 100644
--- a/addons/mail/mail_message.py
+++ b/addons/mail/mail_message.py
@@ -139,6 +139,8 @@ class mail_message(osv.Model):
"message, comment for other messages such as user replies"),
'email_from': fields.char('From',
help="Email address of the sender. This field is set when no matching partner is found for incoming emails."),
+ 'reply_to': fields.char('Reply-To',
+ help='Reply email address. Setting the reply_to bypasses the automatic thread creation.'),
'author_id': fields.many2one('res.partner', 'Author', select=1,
ondelete='set null',
help="Author of the message. If not set, email_from may hold an email address that did not match any partner."),
@@ -185,8 +187,9 @@ class mail_message(osv.Model):
_defaults = {
'type': 'email',
'date': lambda *a: fields.datetime.now(),
- 'author_id': lambda self, cr, uid, ctx={}: self._get_default_author(cr, uid, ctx),
+ 'author_id': lambda self, cr, uid, ctx=None: self._get_default_author(cr, uid, ctx),
'body': '',
+ 'email_from': lambda self, cr, uid, ctx=None: self.pool.get('mail.mail')._get_default_from(cr, uid, ctx),
}
#------------------------------------------------------
@@ -731,7 +734,10 @@ class mail_message(osv.Model):
if context is None:
context = {}
default_starred = context.pop('default_starred', False)
- if not values.get('message_id') and values.get('res_id') and values.get('model'):
+ # generate message_id, to redirect answers to the right discussion thread
+ if not values.get('message_id') and values.get('reply_to'):
+ values['message_id'] = tools.generate_tracking_message_id('reply_to-%(model)s' % values)
+ elif not values.get('message_id') and values.get('res_id') and values.get('model'):
values['message_id'] = tools.generate_tracking_message_id('%(res_id)s-%(model)s' % values)
elif not values.get('message_id'):
values['message_id'] = tools.generate_tracking_message_id('private')
diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py
index 1d1131faccd..b8bd028289f 100644
--- a/addons/mail/mail_thread.py
+++ b/addons/mail/mail_thread.py
@@ -468,6 +468,7 @@ class mail_thread(osv.AbstractModel):
# 1. Verify if this is a reply to an existing thread
thread_references = references or in_reply_to
ref_match = thread_references and tools.reference_re.search(thread_references)
+
if ref_match:
thread_id = int(ref_match.group(1))
model = ref_match.group(2) or model
@@ -480,7 +481,10 @@ class mail_thread(osv.AbstractModel):
# Verify whether this is a reply to a private message
if in_reply_to:
- message_ids = self.pool.get('mail.message').search(cr, uid, [('message_id', '=', in_reply_to)], limit=1, context=context)
+ message_ids = self.pool.get('mail.message').search(cr, uid, [
+ ('message_id', '=', in_reply_to),
+ '!', ('message_id', 'ilike', 'reply_to')
+ ], limit=1, context=context)
if message_ids:
message = self.pool.get('mail.message').browse(cr, uid, message_ids[0], context=context)
_logger.debug('Routing mail with Message-Id %s: direct reply to a private message: %s, custom_values: %s, uid: %s',
@@ -1026,7 +1030,7 @@ class mail_thread(osv.AbstractModel):
# Create and auto subscribe the author
msg_id = mail_message.create(cr, uid, values, context=context)
message = mail_message.browse(cr, uid, msg_id, context=context)
- if message.author_id and thread_id and type != 'notification':
+ if message.author_id and thread_id and type != 'notification' and not context.get('mail_create_nosubscribe'):
self.message_subscribe(cr, uid, [thread_id], [message.author_id.id], context=context)
return msg_id
diff --git a/addons/mail/res_users_view.xml b/addons/mail/res_users_view.xml
index a119765e1ec..f49ff72194a 100644
--- a/addons/mail/res_users_view.xml
+++ b/addons/mail/res_users_view.xml
@@ -23,7 +23,7 @@
-
+
diff --git a/addons/mail/static/src/css/mail.css b/addons/mail/static/src/css/mail.css
index 1e1142d592c..51306727a09 100644
--- a/addons/mail/static/src/css/mail.css
+++ b/addons/mail/static/src/css/mail.css
@@ -561,6 +561,14 @@
text-align: center;
width:100%;
}
+.openerp .oe_followers button.oe_invite{
+ margin: 5px 0;
+ padding: 2px 8px;
+ font-size: 12px;
+ text-shadow: none;
+ width: 100%;
+}
+.openerp .oe_followers button.oe_invite,
.openerp .oe_followers button.oe_follower.oe_following{
color: white;
background-color: #3465A4;
@@ -614,9 +622,6 @@
margin-top: 12px;
margin-bottom: 4px;
}
-.openerp .oe_followers .oe_invite{
- float: right;
-}
.openerp .oe_followers .oe_partner {
height: 32px;
overflow: hidden;
diff --git a/addons/mail/static/src/js/mail_followers.js b/addons/mail/static/src/js/mail_followers.js
index 5dfc1946587..6fc2f0fdfcd 100644
--- a/addons/mail/static/src/js/mail_followers.js
+++ b/addons/mail/static/src/js/mail_followers.js
@@ -220,23 +220,16 @@ openerp_mail_followers = function(session, mail) {
/** Display subtypes: {'name': default, followed} */
display_subtypes:function (data, id) {
var self = this;
- var subtype_list_ul = this.$('.oe_subtype_list');
- var records = [];
- var nb_subtype = 0;
- subtype_list_ul.empty();
- if (data[id]) {
- records = data[id].message_subtype_data;
- }
- _(records).each(function (record) {nb_subtype++;});
- if (nb_subtype > 1) {
- this.$('hr').show();
- _(records).each(function (record, record_name) {
- record.name = record_name;
- record.followed = record.followed || undefined;
- $(session.web.qweb.render('mail.followers.subtype', {'record': record})).appendTo( self.$('.oe_subtype_list') );
- });
- } else {
- this.$('hr').hide();
+ var $list = this.$('.oe_subtype_list');
+ $list.empty().hide();
+ var records = data[this.view.datarecord.id || this.view.dataset.ids[0]].message_subtype_data;
+ _(records).each(function (record, record_name) {
+ record.name = record_name;
+ record.followed = record.followed || undefined;
+ $(session.web.qweb.render('mail.followers.subtype', {'record': record})).appendTo( self.$('.oe_subtype_list') );
+ });
+ if (_.size(records) > 1) {
+ $list.show();
}
},
diff --git a/addons/mail/static/src/xml/mail_followers.xml b/addons/mail/static/src/xml/mail_followers.xml
index 459f13155a0..16bef174470 100644
--- a/addons/mail/static/src/xml/mail_followers.xml
+++ b/addons/mail/static/src/xml/mail_followers.xml
@@ -17,10 +17,9 @@
-
diff --git a/addons/mail/tests/test_invite.py b/addons/mail/tests/test_invite.py
index fe4b8ed10df..faa9fd55793 100644
--- a/addons/mail/tests/test_invite.py
+++ b/addons/mail/tests/test_invite.py
@@ -31,18 +31,18 @@ class test_invite(TestMailBase):
# Do: create a mail_wizard_invite, validate it
self._init_mock_build_email()
context = {'default_res_model': 'mail.group', 'default_res_id': self.group_pigs_id}
- mail_invite_id = mail_invite.create(cr, self.user_raoul_id, {'partner_ids': [(4, self.partner_bert_id)]}, context)
+ mail_invite_id = mail_invite.create(cr, self.user_raoul_id, {'partner_ids': [(4, self.partner_bert_id)], 'send_mail': True}, context)
mail_invite.add_followers(cr, self.user_raoul_id, [mail_invite_id], {'default_model': 'mail.group', 'default_res_id': 0})
# Test: Pigs followers should contain Admin, Bert
self.group_pigs.refresh()
follower_ids = [follower.id for follower in self.group_pigs.message_follower_ids]
- self.assertEqual(set(follower_ids), set([self.partner_admin_id, self.partner_bert_id]), 'Pigs followers after invite is incorrect')
+ self.assertEqual(set(follower_ids), set([self.partner_admin_id, self.partner_bert_id]), 'invite: Pigs followers after invite is incorrect')
# Test: (pretend to) send email and check subject, body
self.assertEqual(len(self._build_email_kwargs_list), 1, 'sent email number incorrect, should be only for Bert')
for sent_email in self._build_email_kwargs_list:
- self.assertEqual(sent_email.get('subject'), 'Invitation to follow Pigs',
- 'subject of invitation email is incorrect')
- self.assertTrue('You have been invited to follow Pigs' in sent_email.get('body'),
- 'body of invitation email is incorrect')
+ self.assertEqual(sent_email.get('subject'), 'Invitation to follow Discussion group: Pigs',
+ 'invite: subject of invitation email is incorrect')
+ self.assertIn('Raoul Grosbedon invited you to follow Discussion group document: Pigs', sent_email.get('body'),
+ 'invite: body of invitation email is incorrect')
diff --git a/addons/mail/tests/test_mail_features.py b/addons/mail/tests/test_mail_features.py
index b327bd33d98..da7f2ae351c 100644
--- a/addons/mail/tests/test_mail_features.py
+++ b/addons/mail/tests/test_mail_features.py
@@ -20,7 +20,7 @@
##############################################################################
from openerp.addons.mail.tests.test_mail_base import TestMailBase
-from openerp.tools.mail import html_sanitize, append_content_to_html
+from openerp.tools.mail import html_sanitize
MAIL_TEMPLATE = """Return-Path:
To: {to}
@@ -84,23 +84,6 @@ Sylvie
class test_mail(TestMailBase):
- def _mock_send_get_mail_body(self, *args, **kwargs):
- # def _send_get_mail_body(self, cr, uid, mail, partner=None, context=None)
- body = append_content_to_html(args[2].body_html, kwargs.get('partner').name if kwargs.get('partner') else 'No specific partner', plaintext=False)
- return body
-
- def setUp(self):
- super(test_mail, self).setUp()
-
- # Mock send_get_mail_body to test its functionality without other addons override
- self._send_get_mail_body = self.registry('mail.mail').send_get_mail_body
- self.registry('mail.mail').send_get_mail_body = self._mock_send_get_mail_body
-
- def tearDown(self):
- # Remove mocks
- self.registry('mail.mail').send_get_mail_body = self._send_get_mail_body
- super(test_mail, self).tearDown()
-
def test_00_message_process(self):
""" Testing incoming emails processing. """
cr, uid, user_raoul = self.cr, self.uid, self.user_raoul
@@ -329,7 +312,7 @@ class test_mail(TestMailBase):
self.res_users.write(cr, uid, [uid], {'signature': 'Admin', 'email': 'a@a'})
# 1 - Bert Tartopoils, with email, should receive emails for comments and emails
p_b_id = self.res_partner.create(cr, uid, {'name': 'Bert Tartopoils', 'email': 'b@b'})
- # 2 - Carine Poilvache, with email, should never receive emails
+ # 2 - Carine Poilvache, with email, should receive emails for emails
p_c_id = self.res_partner.create(cr, uid, {'name': 'Carine Poilvache', 'email': 'c@c', 'notification_email_send': 'email'})
# 3 - Dédé Grosbedon, without email, to test email verification; should receive emails for every message
p_d_id = self.res_partner.create(cr, uid, {'name': 'Dédé Grosbedon', 'notification_email_send': 'all'})
@@ -341,11 +324,15 @@ class test_mail(TestMailBase):
_subject = 'Pigs'
_mail_subject = 'Re: %s' % (group_pigs.name)
_body1 = 'Pigs rules
'
- _mail_body1 = 'Pigs rules
\n\n'
- _mail_bodyalt1 = 'Pigs rules\nRaoul\n'
+ _mail_body1 = 'Pigs rules
'
+ _mail_signature1 = 'Raoul
'
+ _mail_bodyalt1 = 'Pigs rules\n'
+ _mail_signaturealt1 = '\nRaoul\n'
_body2 = 'Pigs rules'
- _mail_body2 = '\n'
- _mail_bodyalt2 = 'Pigs rules\nRaoul'
+ _mail_body2 = ''
+ _mail_signature2 = 'Raoul
'
+ _mail_bodyalt2 = 'Pigs rules\n'
+ _mail_signaturealt2 = '\nRaoul\n'
_attachments = [('First', 'My first attachment'), ('Second', 'My second attachment')]
# ----------------------------------------
@@ -366,12 +353,14 @@ class test_mail(TestMailBase):
self.assertEqual(len(sent_emails), 2, 'sent_email number of sent emails incorrect')
for sent_email in sent_emails:
self.assertEqual(sent_email['subject'], _subject, 'sent_email subject incorrect')
- self.assertTrue(sent_email['body'] in [_mail_body1 + '\nBert Tartopoils\n', _mail_body1 + '\nAdministrator\n'],
- 'sent_email body incorrect')
+ self.assertIn(_mail_body1, sent_email['body'], 'sent_email body incorrect')
+ self.assertIn(_mail_signature1, sent_email['body'], 'sent_email body incorrect (no signature)')
+ self.assertIn("OpenERP", sent_email['body'], 'sent_email body incorrect (no OpenERP company)')
# the html2plaintext uses etree or beautiful soup, so the result may be slighly different
# depending if you have installed beautiful soup.
- self.assertTrue(sent_email['body_alternative'] in [_mail_bodyalt1 + '\nBert Tartopoils\n', _mail_bodyalt1 + '\nAdministrator\n'],
- 'sent_email body_alternative is incorrect')
+ self.assertIn(_mail_bodyalt1, sent_email['body_alternative'], 'sent_email body_alternative is incorrect')
+ self.assertIn(_mail_signaturealt1, sent_email['body_alternative'], 'sent_email body_alternative is incorrect (no signature)')
+ self.assertIn("OpenERP", sent_email['body_alternative'], 'sent_email body incorrect (no OpenERP company)')
# Test: mail_message: notified_partner_ids = group followers
message_pids = set([partner.id for partner in message1.notified_partner_ids])
test_pids = set([self.partner_admin_id, p_b_id, p_c_id])
@@ -405,7 +394,12 @@ class test_mail(TestMailBase):
for sent_email in sent_emails:
self.assertEqual(sent_email['subject'], _mail_subject, 'sent_email subject incorrect')
self.assertIn(_mail_body2, sent_email['body'], 'sent_email body incorrect')
- self.assertIn(_mail_bodyalt2, sent_email['body_alternative'], 'sent_email body_alternative incorrect')
+ self.assertIn(_mail_signature2, sent_email['body'], 'sent_email body incorrect (no signature)')
+ self.assertIn("OpenERP", sent_email['body'], 'sent_email body incorrect (no OpenERP company)')
+ # body_alternative
+ self.assertIn(_mail_bodyalt2, sent_email['body_alternative'], 'sent_email body_alternative is incorrect')
+ self.assertIn(_mail_signaturealt2, sent_email['body_alternative'], 'sent_email body_alternative is incorrect (no signature)')
+ self.assertIn("OpenERP", sent_email['body'], 'sent_email body incorrect (no OpenERP company)')
# Test: mail_message: notified_partner_ids = group followers
message_pids = set([partner.id for partner in message2.notified_partner_ids])
test_pids = set([self.partner_admin_id, p_b_id, p_c_id, p_d_id])
@@ -462,7 +456,7 @@ class test_mail(TestMailBase):
# 2 - Carine Poilvache, with email, should never receive emails
p_c_id = self.res_partner.create(cr, uid, {'name': 'Carine Poilvache', 'email': 'c@c', 'notification_email_send': 'email'})
# 3 - Dédé Grosbedon, without email, to test email verification; should receive emails for every message
- p_d_id = self.res_partner.create(cr, uid, {'name': 'Dédé Grosbedon', 'notification_email_send': 'all'})
+ p_d_id = self.res_partner.create(cr, uid, {'name': 'Dédé Grosbedon', 'email': 'd@d', 'notification_email_send': 'all'})
# Subscribe #1
group_pigs.message_subscribe([p_b_id])
@@ -525,7 +519,7 @@ class test_mail(TestMailBase):
# 1. mass_mail on pigs and bird
compose_id = mail_compose.create(cr, uid,
{'subject': _subject, 'body': '${object.description}'},
- {'default_composition_mode': 'mass_mail', 'default_model': 'mail.group', 'default_res_id': False,
+ {'default_composition_mode': 'mass_mail', 'default_model': 'mail.group', 'default_res_id': False, 'default_notify': True,
'active_ids': [self.group_pigs_id, group_bird_id]})
compose = mail_compose.browse(cr, uid, compose_id)
diff --git a/addons/mail/wizard/invite.py b/addons/mail/wizard/invite.py
index a7cdc237a60..2eb48f3d998 100644
--- a/addons/mail/wizard/invite.py
+++ b/addons/mail/wizard/invite.py
@@ -32,12 +32,19 @@ class invite_wizard(osv.osv_memory):
def default_get(self, cr, uid, fields, context=None):
result = super(invite_wizard, self).default_get(cr, uid, fields, context=context)
- if 'message' in fields and result.get('res_model') and result.get('res_id'):
- document_name = self.pool.get(result.get('res_model')).name_get(cr, uid, [result.get('res_id')], context=context)[0][1]
- message = _('You have been invited to follow %s.
' % document_name)
+ user_name = self.pool.get('res.users').name_get(cr, uid, [uid], context=context)[0][1]
+ model = result.get('res_model')
+ res_id = result.get('res_id')
+ if 'message' in fields and model and res_id:
+ ir_model = self.pool.get('ir.model')
+ model_ids = ir_model.search(cr, uid, [('model', '=', self.pool.get(model)._name)], context=context)
+ model_name = ir_model.name_get(cr, uid, model_ids, context=context)[0][1]
+
+ document_name = self.pool.get(model).name_get(cr, uid, [res_id], context=context)[0][1]
+ message = _('Hello,
%s invited you to follow %s document: %s.
') % (user_name, model_name, document_name)
result['message'] = message
elif 'message' in fields:
- result['message'] = _('You have been invited to follow a new document.
')
+ result['message'] = _('Hello,
%s invited you to follow a new document.
') % user_name
return result
_columns = {
@@ -46,8 +53,12 @@ class invite_wizard(osv.osv_memory):
help='Model of the followed resource'),
'res_id': fields.integer('Related Document ID', select=1,
help='Id of the followed resource'),
- 'partner_ids': fields.many2many('res.partner', string='Partners'),
+ 'partner_ids': fields.many2many('res.partner', string='Recipients',
+ help="List of partners that will be added as follower of the current document."),
'message': fields.html('Message'),
+ 'send_mail': fields.boolean('Send Email',
+ help="If checked, the partners will receive an email warning they have been "
+ "added in the document's followers."),
}
def add_followers(self, cr, uid, ids, context=None):
@@ -59,23 +70,27 @@ class invite_wizard(osv.osv_memory):
new_follower_ids = [p.id for p in wizard.partner_ids if p not in document.message_follower_ids]
model_obj.message_subscribe(cr, uid, [wizard.res_id], new_follower_ids, context=context)
- # send an email
- if wizard.message:
+ ir_model = self.pool.get('ir.model')
+ model_ids = ir_model.search(cr, uid, [('model', '=', model_obj._name)], context=context)
+ model_name = ir_model.name_get(cr, uid, model_ids, context=context)[0][1]
+
+ # send an email if option checked and if a message exists (do not send void emails)
+ if wizard.send_mail and wizard.message:
# add signature
- user_id = self.pool.get("res.users").read(cr, uid, [uid], fields=["signature"], context=context)[0]
- signature = user_id and user_id["signature"] or ''
- if signature:
- wizard.message = tools.append_content_to_html(wizard.message, signature, plaintext=True, container_tag='div')
# FIXME 8.0: use notification_email_send, send a wall message and let mail handle email notification + message box
- for follower_id in new_follower_ids:
- mail_mail = self.pool.get('mail.mail')
- # the invite wizard should create a private message not related to any object -> no model, no res_id
- mail_id = mail_mail.create(cr, uid, {
- 'model': wizard.res_model,
- 'res_id': wizard.res_id,
- 'subject': 'Invitation to follow %s' % document.name_get()[0][1],
- 'body_html': '%s' % wizard.message,
- 'auto_delete': True,
- }, context=context)
- mail_mail.send(cr, uid, [mail_id], recipient_ids=[follower_id], context=context)
+ signature_company = self.pool.get('mail.notification').get_signature_footer(cr, uid, user_id=uid, res_model=wizard.res_model, res_id=wizard.res_id, context=context)
+ wizard.message = tools.append_content_to_html(wizard.message, signature_company, plaintext=False, container_tag='div')
+
+ # send mail to new followers
+ # the invite wizard should create a private message not related to any object -> no model, no res_id
+ mail_mail = self.pool.get('mail.mail')
+ mail_id = mail_mail.create(cr, uid, {
+ 'model': wizard.res_model,
+ 'res_id': wizard.res_id,
+ 'subject': _('Invitation to follow %s: %s') % (model_name, document.name_get()[0][1]),
+ 'body_html': '%s' % wizard.message,
+ 'auto_delete': True,
+ 'recipient_ids': [(4, id) for id in new_follower_ids]
+ }, context=context)
+ mail_mail.send(cr, uid, [mail_id], context=context)
return {'type': 'ir.actions.act_window_close'}
diff --git a/addons/mail/wizard/invite_view.xml b/addons/mail/wizard/invite_view.xml
index e957d546d37..2d550da2ecd 100644
--- a/addons/mail/wizard/invite_view.xml
+++ b/addons/mail/wizard/invite_view.xml
@@ -14,7 +14,8 @@
-
+
+
+
+
+
+
+
+
-
-
- Followers of selected items and
-
-
+ attrs="{'invisible':[('composition_mode', '=', 'mass_mail')]}"/>
+
+
Followers of
-
- and
+
+ and
-
-
+
or
@@ -52,7 +60,7 @@
-
+ context="{
+ 'default_composition_mode': 'mass_mail',
+ 'default_partner_to': '${object.id or \'\'}',
+ }"/>
+
diff --git a/addons/portal/mail_mail.py b/addons/portal/mail_mail.py
index 5d2a91e691f..3810ddd2540 100644
--- a/addons/portal/mail_mail.py
+++ b/addons/portal/mail_mail.py
@@ -22,7 +22,6 @@
from openerp import SUPERUSER_ID
from openerp.osv import osv
from openerp.osv.orm import except_orm
-from openerp.tools import append_content_to_html
from openerp.tools.translate import _
@@ -30,18 +29,17 @@ class mail_mail(osv.Model):
""" Update of mail_mail class, to add the signin URL to notifications. """
_inherit = 'mail.mail'
- def send_get_mail_body(self, cr, uid, mail, partner=None, context=None):
+ def send_get_mail_body_footer(self, cr, uid, mail, partner=None, context=None):
""" add a signin link inside the body of a mail.mail
:param mail: mail.mail browse_record
:param partner: browse_record of the specific recipient partner
:return: the resulting body_html
"""
partner_obj = self.pool.get('res.partner')
- body = mail.body_html
if partner:
contex_signup = dict(context or {}, signup_valid=True)
partner = partner_obj.browse(cr, SUPERUSER_ID, partner.id, context=contex_signup)
- text = _("""Access your messages and personal documents through our Customer Portal
""") % partner.signup_url
+ body_footer = _("""Access your messages and documents through our Customer Portal """) % partner.signup_url
# partner is an user: add a link to the document if read access
if partner.user_ids and mail.model and mail.res_id \
and self.check_access_rights(cr, partner.user_ids[0].id, 'read', raise_exception=False):
@@ -49,8 +47,9 @@ class mail_mail(osv.Model):
try:
self.pool.get(mail.model).check_access_rule(cr, related_user.id, [mail.res_id], 'read', context=context)
url = partner_obj._get_signup_url_for_action(cr, related_user.id, [partner.id], action='', res_id=mail.res_id, model=mail.model, context=context)[partner.id]
- text = _("""Access this document directly in OpenERP
""") % url
+ text = _("""Access this document directly in OpenERP """) % url
except except_orm, e:
pass
- body = append_content_to_html(body, ("" % text), plaintext=False)
- return body
+ return body_footer
+ else:
+ return super(mail_mail, self).send_get_mail_body_footer(cr, uid, mail, partner=partner, context=context)
diff --git a/addons/portal/tests/test_portal.py b/addons/portal/tests/test_portal.py
index 03f2491315b..07becf5cdd9 100644
--- a/addons/portal/tests/test_portal.py
+++ b/addons/portal/tests/test_portal.py
@@ -106,7 +106,7 @@ class test_portal(TestMailBase):
# Do: create a mail_wizard_invite, validate it
self._init_mock_build_email()
context = {'default_res_model': 'mail.group', 'default_res_id': self.group_pigs_id}
- mail_invite_id = mail_invite.create(cr, uid, {'partner_ids': [(4, partner_carine_id)]}, context)
+ mail_invite_id = mail_invite.create(cr, uid, {'partner_ids': [(4, partner_carine_id)], 'send_mail': True}, context)
mail_invite.add_followers(cr, uid, [mail_invite_id])
# Test: Pigs followers should contain Admin and Bert
@@ -124,9 +124,9 @@ class test_portal(TestMailBase):
# Test: (pretend to) send email and check subject, body
self.assertEqual(len(self._build_email_kwargs_list), 1, 'sent email number incorrect, should be only for Bert')
for sent_email in self._build_email_kwargs_list:
- self.assertEqual(sent_email.get('subject'), 'Invitation to follow Pigs',
- 'subject of invitation email is incorrect')
- self.assertTrue('You have been invited to follow Pigs' in sent_email.get('body'),
- 'body of invitation email is incorrect')
+ self.assertEqual(sent_email.get('subject'), 'Invitation to follow Discussion group: Pigs',
+ 'invite: subject of invitation email is incorrect')
+ self.assertIn('Administrator invited you to follow Discussion group document: Pigs', sent_email.get('body'),
+ 'invite: body of invitation email is incorrect')
self.assertTrue(partner_carine.signup_url in sent_email.get('body'),
- 'body of invitation email does not contain signup url')
+ 'invite: body of invitation email does not contain signup url')
diff --git a/addons/portal_anonymous/portal_anonymous_data.xml b/addons/portal_anonymous/portal_anonymous_data.xml
index ae97f4a577a..eb1fd3889b4 100644
--- a/addons/portal_anonymous/portal_anonymous_data.xml
+++ b/addons/portal_anonymous/portal_anonymous_data.xml
@@ -9,6 +9,7 @@
iVBORw0KGgoAAAANSUhEUgAAAJYAAACWCAAAAAAZai4+AAAMQElEQVR4nO2ce4wV1R3Hv7/fmbvrPliQZWEXWFgWEFgQBRNI0dZW7euPxliTRhNbW5NatammoaaPNKmpKRYiUunDFzEU28YYkRaiaX0hYhUELApaKG90l2VZdmVl2WXvnPPrH/c1M3d2uWdmePzB75+9d+7Mmc/8zjm/+T3OWRJciMLnGyBcLmLZyEUsG7mIZSNOAm2IQAAQQAAEAhBRrCYprjkVI6GPpkXFIIuHJYYJ6D/Wsb+97fiJk339A0ZVDa8bP3lG4xhAjDofWGIUcOifW3ceOFr026Q5V980CSbq2I2B5To49dILL/YAQE4tkhlf0ABG3Pzta+FG7EqJKEZL1/IZANgJuzMrBpxvvCuio7QeFcsVWTsLUEMogxSh7IEBcc8dVlrabyeoM40cRfjS3ihc0bC0bJoOp5R5lkLT1ghckbC0WV1bqiF20PCB/fiKpq30VUiVRgUozOgUY3mDaHaFKkmXeq5O/XehsTVDEc2dzX3Szqp1XPJTZCRRD4KYw+yFyBJtaVSTxGIxRkKmp6ZNG9nYNZUQEgAyo66ZnQrTizLPw250JYfF+OmHG7ZsukWKuQzeH1B2XJEMhHt10fM4+HHGDPwQRf1IqD1oZ7uS0hbpkfcYDWj51VgT1Jeo4+12vZhYJ8qoOlaAkrqWsGdtt2stMW3lfC6RyWG/n7ZrLvnIh04mcJ+ksYzqWE8hNmqYXTMRAzJWAXvOxABgDN/XporeNEL1sLLzEbF6deDWGr0AtOKFzxa//8g01Nq1HxFrfmUq0FO6UYmb6r37GcctOptkyuhzoS1+NGibBMSU2nTfu1xMBZYpZdoqZoyGRcVevGF1YvGy/lQ65HQj11m+EyMHZH4xrpi/zRpkYhPVHbH0T5PBckVeuQYYJDpTuM82ykgEKy2d38Wg4RnzsI+MZZCRBJaWVy4DDzqkU1hsHZIlgOXKCmeIQMjBl11jG/nEx3JllaJB32GUwhWt1lTxsbS8VD44FQM3tEbIjsTFMuZkS7E7moNycMnP+qPkbOJiubJ8MJNMCvjKZrGOqBPAMiZ9HYUqixygeZVIOgpVeDq2dBFufR9hIaDSbt1d99RDR7tBXCx0HA+LTJUu+8G9U+CWlGxKHivcSSfS1y5aAM2RWz8rVQymn7+6QJsYifkkqhhBYf3gL030nDxwVrSlzNd/4cZs+CxgGbqbB7f7pUn8TuQAAUnVVbGfNjaWMUX2IV0et9H4WJWTHT8X6ZpYoz3TSNzCnT5VbAaq4hUTkQDW2ZH4Qz77XCIioEwKILayktJWvqKpQ3PN1pIMllY4/f7h42r8lfUwiZjCeP5WRlxp/3VLJQA0LjwWrYAYkCSwXHm1GQA7DgPTdyfBlUhAtiYFJzvYHUw7oiM5pAljabO7xjOhU7gtUr3VL/HHp9BDPZ6clque26zsKikhEhtL+MA6b7JUaGBN3DYTwDK0q0vEd2BT/D5IwMik/VUekb2nbJNsRZIAVlFWpNeyNhAiCah7Qk1ANzWXxG00PhaZGXN9LjLTnIqQ4p2dJGAg+E4fBcnXwsoYdhL/VS3QX329YLhS6VnvVMV3bWIbZDFycAJSTABIpVD/XgIvxWRe1R/NBaAUA5gfYY1IsSTk2PQsagaAinlP9SXi2CTjBhpG95ZuU9Ewj5JxAxNzmjOOjZELyWkGIEZAcWP8vFygAdkFukr3IpaNXMSykeg5CI/bEMgk5X/QkVeCRzMQIia8duE/iwDRFMXAWmPliU6o6uwhs9eT6qZ09dgsVNdT82aOBgAtbKk1m04UgYCZobt27HhLLctm14w8s2RYbkkGG17dIAyAzMhh1zW3tMyb05gCRJO3e0u4V0lidDoTK3e/ufLez9cqVG7PuwpGfwsOcsH+s/mg2pUHAaBq7veffKNLRETSbol5gBKwjE6ntYhI/4F/PXzjpDIAoIo3CyG9lr4FcEBE5GCRJ9R35TsoZwBINd+8fENbBi1dQo5iaCxjXNcVETndvfH3d3wus1BGOaqMVspA4TQthyeDATDu9FbqjHtyPhSxykyP8Tfc/+yeUyIi2nWH9soGxzI6nbnDwO7V919bT1kiJoLCbyTtPdeVrWNAYHzTrwotB5vAAIiVwwBQOev2Fe/1ioiYoXo0FMtoN3PJwKH1S2+9fExmMDu5ma5wh0n7r0jLYjhEFfsCvqkr/x6WNxCUXV0/fPpNi9d/rEVE9CBsRTNRRDKrP/p2bv5o5+4OAHBgRPJlAaVv/ENw1SuZk4DA9AXsjXIXPHkrZa2QaIDA9NmJXWtQP+PK2dc0OQxooMi0ebEERkgRYPbv2rHzncMaABPE+BYZsZ73VEVwQRLTAQiQPjozwOW4t+x5wJOSkCyFtLevR/nsBbNmT68BoIXYG8XlsTSYoKAPtW3btr31GAAwS3HlBISb69ygkknvgoDNkaKkCJvvLT4VMNoGADHM6S1bUFl/+fx5k8aVAzCeCqSnQ/v3vHD/9fWZxkL3fWR+QsuJ4JIZIx0jQFBYKoFBJ2n50aA2mzhbNK79wsJ/7Pdemcd6+6HbWioZAKngur+AKPwlmIbU8hYDcPCTIJY2H1YPadyJM/Glqp57558O5NaXZLCMkesBwEmVUMhlXNUXmD6urAABDm4JArty16CrNzxsynEA4Jnc5Rl/iwyanXKGm9ZnfnUbtW1dYHOBoBUMCHrAvgYM/++vJSRKRLsuOFU5MzfsOdfuBNctPc/yWGAmEvaDAMGJgYC26dHPuEQnRdIVjQEswujSE4uaNmz0reIUdg9CAEHHp75mDO9YWXJWiTBlZO5zHmt86OKPcFHmCb+jRt1tGZyj/pXDgiWnSlUWCNNY/NoCGpzSk1Ka1273rhURnGiDAMI9x73aMvzBmtJ3OxCmIu+25Q6Nqyn1ckCod6nvOw71cmZD52H/eb/rLdn9JYOW/Jc8Vk1d6VgwtHa3Tw37cqr+xKMtrXY8V7y+efBGKxrznZf7a6jWIrMo3LPSd/a+3IdDvvMW9ZbcJAijJuYR8lhlE2wSnoZWdhbGMmFPFheefZ1GbX3eKrnbWCdBLNBEGyxR7U/nx6ewuy/Td4SufCsCLHNLnoYAoblgpAtRdVPpUAA0Huss7JHp+iyDJWjPJwPtpiEAzCh8zDVCaLQq1Ig6uDrXQ4JPjufU8ml3buqR/LbPQlkQzCn0VwGrPlgjOUMr9ETOjTI42MPZpk92ZZ/O8NvP22xoI6meWowFNIwo2p8zlBj+z4v5PtqdP9zTmf/4SNoqZJfLxoRpa/gltrWHx3N1Q9mVGwA0kH0pat60tvQ9jAAY44aJ51u2PakaaYel6fUXM6OLB/ZksYTRkZuTj7hWSSrCJOjiTjSYYNMKAMbjGXWw25bXFg6DAGje+He7rZLiefX40m7jLLE0vbyNDWDQ6jGinRmdm0VpuyGhaaoHxoM10RILnP4jAAj29ecXAOEoGNDqjdfsbBbBOxG9WPW2WIbX7WUD4KDHtB/JeBKPpG3r1RO99/dgNdpWJ4W7l8NAsN/TzLEBiOENL1uuhWBMTZkQbRHGVNvWcjX9+bAjjD0ebbX3ADLwYNi+mqGEMM2rXg9WlY1rk4GgnhXQ3F+IpQV9ndDq9ddsdywLZoRiATWWG6oAgFZ1KnS1FuIAlm6QWWLdjuZxXpaCtkzFKNvGYPjQGsLRo4W3DA+0Qb1su18ZhNomr1IKhELjI1S+aWk3DnntuXyC9MMh+8jOJOObJBwLY+3XoGjevUYO+B7nY7xgabMAMGb6pm4BizAqwtIYweO0y3fkY3dZlNLFXN837+u00SKCzYmhLRtafWk1943NVq5D9rLJ/hHkSQZtt4hg86Loi/63xuXFW8HPKISyHb6sawHLSJela5OcMCZ3+DbeeB+sujESVvCaKJUnNF7qO+Ad8qmmSFjBeRKh5kZodnz/GsGjLYNo2kpADFr8T+M1hLDcZZycCKb4NeLDsvVPkxKS8mmDYgHjYBWTJSgN4/0kni+EusrYy9QiCaGp3G+BfVijLVJvSQqhJeWfvz6s2gRWz0URwhWBI14sqR5zTmnyImWBEe8baOfLcJEe0zwEFjD2XNLkhTC8PgDi/2Yb7ycjhCnBf+PgxxoXe410NGkJ3teLRZhwnrCmBw/4tXVpVezVyBHE8LTgIb+2Kkach6lIMnps0KH1YZnhDecBizFhZHDs/B9R17D2kvkawAAAAABJRU5ErkJggg==
+
diff --git a/addons/portal_sale/portal_sale.py b/addons/portal_sale/portal_sale.py
index d4d5b64cea3..a6ca616ad2f 100644
--- a/addons/portal_sale/portal_sale.py
+++ b/addons/portal_sale/portal_sale.py
@@ -59,12 +59,11 @@ class sale_order(osv.Model):
assert len(ids) == 1
document = self.browse(cr, uid, ids[0], context=context)
partner = document.partner_id
+ # TDE note: this code should be improved: used a real invite wizard instead of an ugly email
if partner.id not in document.message_follower_ids:
self.message_subscribe(cr, uid, ids, [partner.id], context=context)
- user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
mail_values = {
- 'email_from': user.partner_id.email,
- 'email_to': partner.email,
+ 'recipient_ids': [(4, partner.id)],
'subject': 'Invitation to follow %s' % document.name_get()[0][1],
'body_html': 'You have been invited to follow %s' % document.name_get()[0][1],
'auto_delete': True,
@@ -72,7 +71,7 @@ class sale_order(osv.Model):
}
mail_obj = self.pool.get('mail.mail')
mail_id = mail_obj.create(cr, uid, mail_values, context=context)
- mail_obj.send(cr, uid, [mail_id], recipient_ids=[partner.id], context=context)
+ mail_obj.send(cr, uid, [mail_id], context=context)
return super(sale_order, self).action_button_confirm(cr, uid, ids, context=context)
def get_signup_url(self, cr, uid, ids, context=None):
@@ -120,12 +119,11 @@ class account_invoice(osv.Model):
# fetch the partner's id and subscribe the partner to the invoice
document = self.browse(cr, uid, ids[0], context=context)
partner = document.partner_id
+ # TDE note: this code should be improved: used a real invite wizard instead of an ugly email
if partner.id not in document.message_follower_ids:
self.message_subscribe(cr, uid, ids, [partner.id], context=context)
- user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
mail_values = {
- 'email_from': user.partner_id.email,
- 'email_to': partner.email,
+ 'recipient_ids': [(4, partner.id)],
'subject': 'Invitation to follow %s' % document.name_get()[0][1],
'body_html': 'You have been invited to follow %s' % document.name_get()[0][1],
'auto_delete': True,
@@ -133,7 +131,7 @@ class account_invoice(osv.Model):
}
mail_obj = self.pool.get('mail.mail')
mail_id = mail_obj.create(cr, uid, mail_values, context=context)
- mail_obj.send(cr, uid, [mail_id], recipient_ids=[partner.id], context=context)
+ mail_obj.send(cr, uid, [mail_id], context=context)
return super(account_invoice, self).invoice_validate(cr, uid, ids, context=context)
def get_signup_url(self, cr, uid, ids, context=None):
diff --git a/addons/portal_sale/portal_sale_data.xml b/addons/portal_sale/portal_sale_data.xml
index 31a2f19ef28..2cd7ca8b501 100644
--- a/addons/portal_sale/portal_sale_data.xml
+++ b/addons/portal_sale/portal_sale_data.xml
@@ -8,7 +8,7 @@
Sales Order - Send by Email (Portal)
${object.user_id.email or ''}
${object.company_id.name} ${object.state in ('draft', 'sent') and 'Quotation' or 'Order'} (Ref ${object.name or 'n/a' })
- ${object.partner_invoice_id.id}
+ ${object.partner_invoice_id.id}
@@ -97,7 +97,7 @@
Invoice - Send by Email (Portal)
${object.user_id.email or object.company_id.email or 'noreply@localhost'}
${object.company_id.name} Invoice (Ref ${object.number or 'n/a' })
- ${object.partner_id.id}
+ ${object.partner_id.id}
diff --git a/addons/product/product_view.xml b/addons/product/product_view.xml
index 5a1432149d5..ddb1ab3809f 100644
--- a/addons/product/product_view.xml
+++ b/addons/product/product_view.xml
@@ -109,7 +109,8 @@
-
+
diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml
index 1552bd94ed9..16dbe44ccc1 100644
--- a/addons/project/project_view.xml
+++ b/addons/project/project_view.xml
@@ -100,7 +100,9 @@
-
+
@@ -381,7 +383,10 @@
-
+
diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml
index aa91c11a946..500a1376422 100644
--- a/addons/project_issue/project_issue_view.xml
+++ b/addons/project_issue/project_issue_view.xml
@@ -69,7 +69,8 @@
-
+
diff --git a/addons/purchase/edi/purchase_order_action_data.xml b/addons/purchase/edi/purchase_order_action_data.xml
index 3b02be574ef..b9c3c3ab95d 100644
--- a/addons/purchase/edi/purchase_order_action_data.xml
+++ b/addons/purchase/edi/purchase_order_action_data.xml
@@ -21,7 +21,7 @@
Purchase Order - Send by mail
${object.validator.email or ''}
${object.company_id.name} Order (Ref ${object.name or 'n/a' })
- ${object.partner_id.id}
+ ${object.partner_id.id}
diff --git a/addons/purchase/i18n/es_CO.po b/addons/purchase/i18n/es_CO.po
new file mode 100644
index 00000000000..10918c23138
--- /dev/null
+++ b/addons/purchase/i18n/es_CO.po
@@ -0,0 +1,2210 @@
+# Spanish (Colombia) translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR , 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2012-12-21 17:04+0000\n"
+"PO-Revision-Date: 2013-03-19 03:56+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Spanish (Colombia) \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-20 04:42+0000\n"
+"X-Generator: Launchpad (build 16532)\n"
+
+#. module: purchase
+#: model:res.groups,name:purchase.group_analytic_accounting
+msgid "Analytic Accounting for Purchases"
+msgstr "Contabilidad analítica para Compras"
+
+#. module: purchase
+#: model:ir.model,name:purchase.model_account_config_settings
+msgid "account.config.settings"
+msgstr "contabilidad.configuracion.parametros"
+
+#. module: purchase
+#: view:board.board:0
+msgid "Monthly Purchases by Category"
+msgstr "Compras Mensuales por Categoría"
+
+#. module: purchase
+#: help:purchase.config.settings,module_warning:0
+msgid ""
+"Allow to configure notification on products and trigger them when a user "
+"wants to purchase a given product or a given supplier.\n"
+"Example: Product: this product is deprecated, do not purchase more than 5.\n"
+" Supplier: don't forget to ask for an express delivery."
+msgstr ""
+"Permite configurar notificaciones en los productos y lanzarlas cuando un "
+"usuario quiera comprar un producto dado o en un proveedor determinado. \n"
+"Ejemplo: Producto: este producto está obsoleto - No comprar más de 5. \n"
+"  "
+"; Proveedor: no olvidar preguntar por una entrega rápida."
+
+#. module: purchase
+#: model:product.pricelist,name:purchase.list0
+msgid "Default Purchase Pricelist"
+msgstr "Lista de Precios de Compra por Defecto"
+
+#. module: purchase
+#: report:purchase.order:0
+msgid "Tel :"
+msgstr "Tel [nbsp;]:"
+
+#. module: purchase
+#: help:purchase.order,pricelist_id:0
+msgid ""
+"The pricelist sets the currency used for this purchase order. It also "
+"computes the supplier price for the selected products/quantities."
+msgstr ""
+"La lista de precios establece la moneda usada para esta orden de compra. "
+"También calcula el precio al proveedor para los productos/cantidades "
+"seleccionados."
+
+#. module: purchase
+#: view:purchase.report:0
+#: field:purchase.report,day:0
+msgid "Day"
+msgstr "Día"
+
+#. module: purchase
+#: view:purchase.report:0
+msgid "Order of Day"
+msgstr "Orden del Día"
+
+#. module: purchase
+#: help:purchase.order,message_unread:0
+msgid "If checked new messages require your attention."
+msgstr "Si está marcado, hay nuevos mensajes que requieren su atención."
+
+#. module: purchase
+#: model:ir.ui.menu,name:purchase.menu_procurement_management_inventory
+#: model:process.node,name:purchase.process_node_packinglist0
+#: model:process.node,name:purchase.process_node_productrecept0
+msgid "Incoming Products"
+msgstr "Productos Entrantes"
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "Reference"
+msgstr "Referencia"
+
+#. module: purchase
+#: field:purchase.order.line,account_analytic_id:0
+msgid "Analytic Account"
+msgstr "Cuenta Analítica"
+
+#. module: purchase
+#: help:purchase.order,message_summary:0
+msgid ""
+"Holds the Chatter summary (number of messages, ...). This summary is "
+"directly in html format in order to be inserted in kanban views."
+msgstr ""
+"Contiene el resumen de la charla (número de mensajes, ...). Este resumen "
+"viene directamente en formato HTML para que pueda insertarse en las vistas "
+"kanban."
+
+#. module: purchase
+#: code:addons/purchase/purchase.py:1024
+#, python-format
+msgid "Configuration Error!"
+msgstr "Error de Configuración!"
+
+#. module: purchase
+#: code:addons/purchase/purchase.py:587
+#, python-format
+msgid "You must first cancel all receptions related to this purchase order."
+msgstr ""
+"Primero tiene que cancelar todas las recepciones relacionas con esta orden "
+"de compra."
+
+#. module: purchase
+#: model:ir.model,name:purchase.model_res_partner
+#: field:purchase.order.line,partner_id:0
+msgid "Partner"
+msgstr "Empresa/Cliente"
+
+#. module: purchase
+#: field:purchase.report,negociation:0
+msgid "Purchase-Standard Price"
+msgstr "Precio Compra-Estándar"
+
+#. module: purchase
+#: code:addons/purchase/purchase.py:1011
+#, python-format
+msgid "No supplier defined for this product !"
+msgstr "No se ha definido un proveedor para este producto!"
+
+#. module: purchase
+#: model:ir.actions.act_window,help:purchase.action_picking_tree4_picking_to_invoice
+msgid ""
+"\n"
+" Here you can track all the product receptions of purchase\n"
+" orders where the invoicing is \"Based on Incoming "
+"Shipments\",\n"
+" and for which you have not received a supplier invoice yet.\n"
+" You can generate a supplier invoice based on those "
+"receptions.\n"
+"
\n"
+" "
+msgstr ""
+
+#. module: purchase
+#: view:purchase.report:0
+#: field:purchase.report,price_average:0
+msgid "Average Price"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "Purchase order which are in the exception state"
+msgstr ""
+
+#. module: purchase
+#: model:ir.actions.act_window,name:purchase.action_view_purchase_order_group
+msgid "Merge Purchase orders"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.report:0
+#: field:purchase.report,price_total:0
+msgid "Total Price"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+#: field:purchase.order,minimum_planned_date:0
+#: report:purchase.quotation:0
+#: field:purchase.report,expected_date:0
+msgid "Expected Date"
+msgstr ""
+
+#. module: purchase
+#: report:purchase.order:0
+msgid "Shipping address :"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "Confirm Order"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.config.settings,module_warning:0
+msgid "Alerts by products or supplier"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,name:0
+#: view:purchase.order.line:0
+#: field:purchase.order.line,order_id:0
+msgid "Order Reference"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.config.settings:0
+msgid "Invoicing Process"
+msgstr ""
+
+#. module: purchase
+#: model:process.transition,name:purchase.process_transition_approvingpurchaseorder0
+msgid "Approbation"
+msgstr ""
+
+#. module: purchase
+#: help:purchase.config.settings,group_uom:0
+msgid ""
+"Allows you to select and maintain different units of measure for products."
+msgstr ""
+
+#. module: purchase
+#: help:purchase.order,minimum_planned_date:0
+msgid ""
+"This is computed as the minimum scheduled date of all purchase order lines' "
+"products."
+msgstr ""
+
+#. module: purchase
+#: code:addons/purchase/purchase.py:260
+#, python-format
+msgid "In order to delete a purchase order, you must cancel it first."
+msgstr ""
+
+#. module: purchase
+#: view:product.product:0
+msgid "When you sell this product, OpenERP will trigger"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "Approved purchase orders"
+msgstr ""
+
+#. module: purchase
+#: model:email.template,subject:purchase.email_template_edi_purchase
+msgid "${object.company_id.name} Order (Ref ${object.name or 'n/a' })"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "Total Untaxed amount"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.report:0
+#: field:purchase.report,category_id:0
+msgid "Category"
+msgstr ""
+
+#. module: purchase
+#: model:process.transition,note:purchase.process_transition_purchaseinvoice0
+msgid ""
+"A purchase order generates a supplier invoice, as soon as it is confirmed by "
+"the buyer. Depending on the Invoicing control of the purchase order, the "
+"invoice is based on received or on ordered quantities."
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+#: field:purchase.order,state:0
+#: view:purchase.order.line:0
+#: field:purchase.order.line,state:0
+#: view:purchase.report:0
+msgid "Status"
+msgstr ""
+
+#. module: purchase
+#: selection:purchase.report,month:0
+msgid "August"
+msgstr ""
+
+#. module: purchase
+#: view:product.product:0
+msgid "to"
+msgstr ""
+
+#. module: purchase
+#: selection:purchase.report,month:0
+msgid "June"
+msgstr ""
+
+#. module: purchase
+#: model:ir.model,name:purchase.model_purchase_report
+msgid "Purchases Orders"
+msgstr ""
+
+#. module: purchase
+#: help:account.config.settings,group_analytic_account_for_purchases:0
+#: help:purchase.config.settings,group_analytic_account_for_purchases:0
+msgid "Allows you to specify an analytic account on purchase orders."
+msgstr ""
+
+#. module: purchase
+#: model:ir.actions.act_window,help:purchase.action_invoice_pending
+msgid ""
+"\n"
+" Click to create a draft invoice.\n"
+"
\n"
+" Use this menu to control the invoices to be received from your\n"
+" supplier. OpenERP generates draft invoices from your purchase\n"
+" orders or receptions, according to your settings.\n"
+"
\n"
+" Once you receive a supplier invoice, you can match it with the\n"
+" draft invoice and validate it.\n"
+"
\n"
+" "
+msgstr ""
+
+#. module: purchase
+#: selection:purchase.report,month:0
+msgid "October"
+msgstr ""
+
+#. module: purchase
+#: code:addons/purchase/purchase.py:1024
+#, python-format
+msgid ""
+"The product \"%s\" has been defined with your company as reseller which "
+"seems to be a configuration error!"
+msgstr ""
+
+#. module: purchase
+#: view:product.product:0
+msgid "When you sell this service to a customer,"
+msgstr ""
+
+#. module: purchase
+#: model:process.transition,note:purchase.process_transition_createpackinglist0
+msgid "A pick list is generated to track the incoming products."
+msgstr ""
+
+#. module: purchase
+#: model:ir.actions.act_window,name:purchase.purchase_rfq
+#: model:ir.ui.menu,name:purchase.menu_purchase_rfq
+#: view:purchase.order:0
+#: view:purchase.report:0
+msgid "Quotations"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order.line_invoice:0
+msgid "Do you want to generate the supplier invoices?"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order.line,product_qty:0
+#: view:purchase.report:0
+#: field:purchase.report,quantity:0
+msgid "Quantity"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,fiscal_position:0
+msgid "Fiscal Position"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.config.settings,default_invoice_method:0
+msgid "Default invoicing control method"
+msgstr ""
+
+#. module: purchase
+#: model:ir.model,name:purchase.model_stock_picking_in
+#: model:ir.ui.menu,name:purchase.menu_action_picking_tree4
+#: view:purchase.order:0
+msgid "Incoming Shipments"
+msgstr ""
+
+#. module: purchase
+#: model:ir.actions.act_window,help:purchase.act_res_partner_2_supplier_invoices
+msgid ""
+"\n"
+" Click here to record a supplier invoice.\n"
+"
\n"
+" Supplier invoices can be pre-generated based on "
+"purchase\n"
+" orders or receptions. This allows you to control "
+"invoices\n"
+" you receive from your supplier according to the draft\n"
+" document in OpenERP.\n"
+"
\n"
+" "
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+#: view:purchase.order.line:0
+msgid "Search Purchase Order"
+msgstr ""
+
+#. module: purchase
+#: report:purchase.order:0
+msgid "Date Req."
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+#: view:purchase.order.line:0
+msgid "Purchase Order Lines"
+msgstr ""
+
+#. module: purchase
+#: help:purchase.order,dest_address_id:0
+msgid ""
+"Put an address if you want to deliver directly from the supplier to the "
+"customer. Otherwise, keep empty to deliver to your own company."
+msgstr ""
+
+#. module: purchase
+#: model:ir.actions.act_window,help:purchase.purchase_line_form_action2
+msgid ""
+"\n"
+" Here you can track all the lines of purchase orders where "
+"the\n"
+" invoicing is \"Based on Purchase Order Lines\", and for "
+"which you\n"
+" have not received a supplier invoice yet. You can generate "
+"a\n"
+" draft supplier invoice based on the lines from this list.\n"
+"
\n"
+" "
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order.line,date_planned:0
+msgid "Scheduled Date"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,currency_id:0
+msgid "Currency"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,journal_id:0
+msgid "Journal"
+msgstr ""
+
+#. module: purchase
+#: view:board.board:0
+#: model:ir.actions.act_window,name:purchase.purchase_draft
+msgid "Request for Quotations"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order.line,move_ids:0
+msgid "Reservation"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "Purchase orders that include lines not invoiced."
+msgstr ""
+
+#. module: purchase
+#: view:product.product:0
+#: field:product.template,purchase_ok:0
+msgid "Can be Purchased"
+msgstr ""
+
+#. module: purchase
+#: model:ir.ui.menu,name:purchase.menu_action_picking_tree_in_move
+msgid "Incoming Products"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "Request for Quotation "
+msgstr ""
+
+#. module: purchase
+#: help:purchase.order,partner_ref:0
+msgid ""
+"Reference of the sales order or quotation sent by your supplier. It's mainly "
+"used to do the matching when you receive the products as this reference is "
+"usually written on the delivery order sent by your supplier."
+msgstr ""
+
+#. module: purchase
+#: view:purchase.config.settings:0
+#: view:purchase.order.group:0
+#: view:purchase.order.line_invoice:0
+msgid "or"
+msgstr ""
+
+#. module: purchase
+#: field:res.company,po_lead:0
+msgid "Purchase Lead Time"
+msgstr ""
+
+#. module: purchase
+#: model:process.transition,note:purchase.process_transition_invoicefrompurchase0
+msgid ""
+"The invoice is created automatically if the Invoice control of the purchase "
+"order is 'On order'. The invoice can also be generated manually by the "
+"accountant (Invoice control = Manual)."
+msgstr ""
+
+#. module: purchase
+#: model:mail.message.subtype,name:purchase.mt_rfq_approved
+msgid "RFQ Approved"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.config.settings:0
+msgid "Apply"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,amount_untaxed:0
+msgid "Untaxed Amount"
+msgstr ""
+
+#. module: purchase
+#: model:process.transition,note:purchase.process_transition_confirmingpurchaseorder0
+msgid ""
+"The buyer has to approve the RFQ before being sent to the supplier. The RFQ "
+"becomes a confirmed Purchase Order."
+msgstr ""
+
+#. module: purchase
+#: model:mail.message.subtype,name:purchase.mt_rfq_confirmed
+msgid "RFQ Confirmed"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "Customer Address"
+msgstr ""
+
+#. module: purchase
+#: selection:purchase.order,state:0
+msgid "RFQ Sent"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "Not Invoiced"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+#: field:purchase.order,partner_id:0
+#: view:purchase.order.line:0
+#: view:purchase.report:0
+#: field:purchase.report,partner_id:0
+msgid "Supplier"
+msgstr ""
+
+#. module: purchase
+#: code:addons/purchase/purchase.py:525
+#, python-format
+msgid "Define expense account for this company: \"%s\" (id:%d)."
+msgstr ""
+
+#. module: purchase
+#: model:process.transition,name:purchase.process_transition_packinginvoice0
+#: model:process.transition,name:purchase.process_transition_productrecept0
+msgid "From a Pick list"
+msgstr ""
+
+#. module: purchase
+#: model:ir.actions.act_window,name:purchase.action_purchase_order_monthly_categ_graph
+#: view:purchase.report:0
+msgid "Monthly Purchase by Category"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order.line,price_subtotal:0
+msgid "Subtotal"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,shipped:0
+msgid "Received"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "Purchase order which are in draft state"
+msgstr ""
+
+#. module: purchase
+#: view:product.product:0
+msgid "Suppliers"
+msgstr ""
+
+#. module: purchase
+#: view:product.product:0
+msgid "To Purchase"
+msgstr ""
+
+#. module: purchase
+#: model:ir.actions.act_window,help:purchase.purchase_form_action
+msgid ""
+"\n"
+" Click to create a quotation that will be converted into a "
+"purchase order. \n"
+"
\n"
+" Use this menu to search within your purchase orders by\n"
+" references, supplier, products, etc. For each purchase "
+"order,\n"
+" you can track the related discussion with the supplier, "
+"control\n"
+" the products received and control the supplier invoices.\n"
+"
\n"
+" "
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order.line:0
+msgid "Invoices and Receptions"
+msgstr ""
+
+#. module: purchase
+#: model:process.transition,note:purchase.process_transition_packinginvoice0
+msgid ""
+"A Pick list generates an invoice. Depending on the Invoicing control of the "
+"sales order, the invoice is based on delivered or on ordered quantities."
+msgstr ""
+
+#. module: purchase
+#: view:purchase.report:0
+#: field:purchase.report,nbr:0
+msgid "# of Lines"
+msgstr ""
+
+#. module: purchase
+#: code:addons/purchase/wizard/purchase_line_invoice.py:106
+#, python-format
+msgid "Define expense account for this product: \"%s\" (id:%d)."
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "(update)"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "Calendar View"
+msgstr ""
+
+#. module: purchase
+#: help:purchase.order,shipped:0
+msgid "It indicates that a picking has been done"
+msgstr ""
+
+#. module: purchase
+#: code:addons/purchase/purchase.py:579
+#: code:addons/purchase/purchase.py:586
+#, python-format
+msgid "Unable to cancel this purchase order."
+msgstr ""
+
+#. module: purchase
+#: model:ir.ui.menu,name:purchase.menu_procurement_management_invoice
+msgid "Invoice Control"
+msgstr ""
+
+#. module: purchase
+#: model:ir.actions.act_window,help:purchase.action_stock_move_report_po
+msgid ""
+"Reception Analysis allows you to easily check and analyse your company order "
+"receptions and the performance of your supplier's deliveries."
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "Print"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,order_line:0
+msgid "Order Lines"
+msgstr ""
+
+#. module: purchase
+#: help:purchase.order,name:0
+msgid ""
+"Unique number of the purchase order, computed automatically when the "
+"purchase order is created."
+msgstr ""
+
+#. module: purchase
+#: model:ir.ui.menu,name:purchase.menu_product_pricelist_action2_purchase
+#: model:ir.ui.menu,name:purchase.menu_purchase_config_pricelist
+msgid "Pricelists"
+msgstr ""
+
+#. module: purchase
+#: model:product.pricelist.type,name:purchase.pricelist_type_purchase
+#: field:res.partner,property_product_pricelist_purchase:0
+msgid "Purchase Pricelist"
+msgstr ""
+
+#. module: purchase
+#: report:purchase.order:0
+msgid "Total :"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,pricelist_id:0
+#: field:purchase.report,pricelist_id:0
+msgid "Pricelist"
+msgstr ""
+
+#. module: purchase
+#: selection:purchase.order,state:0
+msgid "Draft PO"
+msgstr ""
+
+#. module: purchase
+#: code:addons/purchase/purchase.py:941
+#: code:addons/purchase/purchase.py:956
+#: code:addons/purchase/purchase.py:960
+#: code:addons/purchase/wizard/purchase_order_group.py:47
+#, python-format
+msgid "Warning!"
+msgstr ""
+
+#. module: purchase
+#: model:process.node,name:purchase.process_node_draftpurchaseorder0
+#: model:process.node,name:purchase.process_node_draftpurchaseorder1
+msgid "RFQ"
+msgstr ""
+
+#. module: purchase
+#: report:purchase.order:0
+#: view:purchase.order:0
+#: field:purchase.order,date_order:0
+#: field:purchase.order.line,date_order:0
+#: field:purchase.report,date:0
+msgid "Order Date"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.config.settings,group_uom:0
+msgid "Manage different units of measure for products"
+msgstr ""
+
+#. module: purchase
+#: model:process.node,name:purchase.process_node_invoiceafterpacking0
+#: model:process.node,name:purchase.process_node_invoicecontrol0
+msgid "Draft Invoice"
+msgstr ""
+
+#. module: purchase
+#: help:purchase.order,amount_tax:0
+msgid "The tax amount"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,shipped_rate:0
+msgid "Received Ratio"
+msgstr ""
+
+#. module: purchase
+#: selection:purchase.report,month:0
+msgid "September"
+msgstr ""
+
+#. module: purchase
+#: selection:purchase.report,state:0
+msgid "Waiting Supplier Ack"
+msgstr ""
+
+#. module: purchase
+#: report:purchase.quotation:0
+msgid "Request for Quotation :"
+msgstr ""
+
+#. module: purchase
+#: model:ir.actions.act_window,name:purchase.action_picking_tree4_picking_to_invoice
+#: model:ir.ui.menu,name:purchase.menu_action_picking_tree4_picking_to_invoice
+msgid "On Incoming Shipments"
+msgstr ""
+
+#. module: purchase
+#: report:purchase.order:0
+msgid "Taxes :"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order.line:0
+msgid "Stock Moves"
+msgstr ""
+
+#. module: purchase
+#: code:addons/purchase/purchase.py:1156
+#, python-format
+msgid "Draft Purchase Order created"
+msgstr ""
+
+#. module: purchase
+#: model:ir.ui.menu,name:purchase.menu_product_category_config_purchase
+msgid "Product Categories"
+msgstr ""
+
+#. module: purchase
+#: help:purchase.order,invoiced:0
+msgid "It indicates that an invoice has been paid"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,notes:0
+msgid "Terms and Conditions"
+msgstr ""
+
+#. module: purchase
+#: help:purchase.order,date_order:0
+msgid "Date on which this document has been created."
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,message_is_follower:0
+msgid "Is a Follower"
+msgstr ""
+
+#. module: purchase
+#: model:ir.actions.act_window,name:purchase.action_purchase_order_report_graph
+#: view:purchase.report:0
+msgid "Total Qty and Amount by month"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.report:0
+msgid "Extended Filters..."
+msgstr ""
+
+#. module: purchase
+#: code:addons/purchase/wizard/purchase_order_group.py:48
+#, python-format
+msgid "Please select multiple order to merge in the list view."
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "Exception"
+msgstr ""
+
+#. module: purchase
+#: model:ir.ui.menu,name:purchase.menu_purchase_partner_cat
+msgid "Address Book"
+msgstr ""
+
+#. module: purchase
+#: model:ir.model,name:purchase.model_res_company
+msgid "Companies"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order.group:0
+msgid "Are you sure you want to merge these orders?"
+msgstr ""
+
+#. module: purchase
+#: field:account.config.settings,module_purchase_analytic_plans:0
+msgid "Use multiple analytic accounts on orders"
+msgstr ""
+
+#. module: purchase
+#: view:product.product:0
+msgid "will be created in order to subcontract the job"
+msgstr ""
+
+#. module: purchase
+#: model:ir.actions.act_window,name:purchase.action_purchase_line_product_tree
+#: model:ir.actions.act_window,name:purchase.open_board_purchase
+#: model:ir.ui.menu,name:purchase.menu_board_purchase
+#: model:ir.ui.menu,name:purchase.menu_purchase_config
+#: view:res.partner:0
+msgid "Purchases"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.report:0
+#: field:purchase.report,delay:0
+msgid "Days to Validate"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.config.settings:0
+msgid "Supplier Features"
+msgstr ""
+
+#. module: purchase
+#: report:purchase.order:0
+#: report:purchase.quotation:0
+msgid "Qty"
+msgstr ""
+
+#. module: purchase
+#: model:process.transition.action,name:purchase.process_transition_action_approvingcancelpurchaseorder0
+#: model:process.transition.action,name:purchase.process_transition_action_cancelpurchaseorder0
+#: view:purchase.config.settings:0
+#: view:purchase.order.group:0
+#: view:purchase.order.line_invoice:0
+msgid "Cancel"
+msgstr ""
+
+#. module: purchase
+#: sql_constraint:purchase.order:0
+msgid "Order Reference must be unique per Company!"
+msgstr ""
+
+#. module: purchase
+#: model:process.transition,name:purchase.process_transition_purchaseinvoice0
+msgid "From a purchase order"
+msgstr ""
+
+#. module: purchase
+#: model:ir.actions.report.xml,name:purchase.report_purchase_quotation
+#: selection:purchase.report,state:0
+msgid "Request for Quotation"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.report:0
+msgid "Order of Month"
+msgstr ""
+
+#. module: purchase
+#: report:purchase.order:0
+#: field:purchase.order.line,price_unit:0
+msgid "Unit Price"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,date_approve:0
+#: field:purchase.report,date_approve:0
+msgid "Date Approved"
+msgstr ""
+
+#. module: purchase
+#: view:product.product:0
+msgid "a draft purchase order"
+msgstr ""
+
+#. module: purchase
+#: model:email.template,body_html:purchase.email_template_edi_purchase
+msgid ""
+"\n"
+"\n"
+"\n"
+"
Hello$ ${object.partner_id.name},
\n"
+" \n"
+"
Here is a ${object.state in ('draft', 'sent') and 'request for "
+"quotation' or 'purchase order confirmation'} from ${object.company_id.name}: "
+"
\n"
+" \n"
+"
\n"
+" REFERENCES \n"
+" Order number: ${object.name} \n"
+" Order total: ${object.amount_total} "
+"${object.pricelist_id.currency_id.name} \n"
+" Order date: ${object.date_order} \n"
+" % if object.origin:\n"
+" Order reference: ${object.origin} \n"
+" % endif\n"
+" % if object.partner_ref:\n"
+" Your reference: ${object.partner_ref} \n"
+" % endif\n"
+" % if object.validator:\n"
+" Your contact: ${object.validator.name} \n"
+" % endif\n"
+"
\n"
+"\n"
+"
\n"
+"
If you have any question, do not hesitate to contact us.
\n"
+"
Thank you!
\n"
+"
\n"
+"
\n"
+"
\n"
+"
\n"
+" ${object.company_id.name} \n"
+" \n"
+"
\n"
+"
\n"
+" % if object.company_id.street:\n"
+" ${object.company_id.street} \n"
+" % endif\n"
+" % if object.company_id.street2:\n"
+" ${object.company_id.street2} \n"
+" % endif\n"
+" % if object.company_id.city or object.company_id.zip:\n"
+" ${object.company_id.zip} ${object.company_id.city} \n"
+" % endif\n"
+" % if object.company_id.country_id:\n"
+" ${object.company_id.state_id and ('%s, ' % "
+"object.company_id.state_id.name) or ''} ${object.company_id.country_id.name "
+"or ''} \n"
+" % endif\n"
+" \n"
+" % if object.company_id.phone:\n"
+"
\n"
+" Phone: ${object.company_id.phone}\n"
+"
\n"
+" % endif\n"
+" % if object.company_id.website:\n"
+"
\n"
+" %endif\n"
+"
\n"
+"
\n"
+"
\n"
+" "
+msgstr ""
+
+#. module: purchase
+#: view:purchase.report:0
+msgid "Order of Year"
+msgstr ""
+
+#. module: purchase
+#: model:ir.actions.act_window,name:purchase.act_res_partner_2_purchase_order
+msgid "RFQs and Purchases"
+msgstr ""
+
+#. module: purchase
+#: field:account.config.settings,group_analytic_account_for_purchases:0
+#: field:purchase.config.settings,group_analytic_account_for_purchases:0
+msgid "Analytic accounting for purchases"
+msgstr ""
+
+#. module: purchase
+#: model:process.transition,note:purchase.process_transition_confirmingpurchaseorder1
+msgid ""
+"In case there is no supplier for this product, the buyer can fill the form "
+"manually and confirm it. The RFQ becomes a confirmed Purchase Order."
+msgstr ""
+
+#. module: purchase
+#: help:purchase.config.settings,group_purchase_pricelist:0
+msgid ""
+"Allows to manage different prices based on rules per category of Supplier.\n"
+" Example: 10% for retailers, promotion of 5 EUR on this "
+"product, etc."
+msgstr ""
+
+#. module: purchase
+#: model:ir.model,name:purchase.model_mail_mail
+msgid "Outgoing Mails"
+msgstr ""
+
+#. module: purchase
+#: code:addons/purchase/purchase.py:456
+#, python-format
+msgid "You cannot confirm a purchase order without any purchase order line."
+msgstr ""
+
+#. module: purchase
+#: help:purchase.order,message_ids:0
+msgid "Messages and communication history"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,warehouse_id:0
+#: field:stock.picking.in,warehouse_id:0
+msgid "Destination Warehouse"
+msgstr ""
+
+#. module: purchase
+#: code:addons/purchase/purchase.py:941
+#, python-format
+msgid ""
+"Selected Unit of Measure does not belong to the same category as the product "
+"Unit of Measure."
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order.line_invoice:0
+msgid "Select an Open Sales Order"
+msgstr ""
+
+#. module: purchase
+#: model:ir.ui.menu,name:purchase.menu_purchase_unit_measure_purchase
+#: model:ir.ui.menu,name:purchase.menu_purchase_uom_form_action
+msgid "Units of Measure"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.config.settings,group_purchase_pricelist:0
+msgid "Manage pricelist per supplier"
+msgstr ""
+
+#. module: purchase
+#: view:board.board:0
+msgid "Purchase Dashboard"
+msgstr ""
+
+#. module: purchase
+#: code:addons/purchase/purchase.py:580
+#, python-format
+msgid "First cancel all receptions related to this purchase order."
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "Approve Order"
+msgstr ""
+
+#. module: purchase
+#: help:purchase.report,date:0
+msgid "Date on which this document has been created"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+#: view:purchase.order.line:0
+#: view:purchase.report:0
+msgid "Group By..."
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "Approved purchase order"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.report:0
+msgid "Purchase Orders Statistics"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+#: field:purchase.order,message_unread:0
+msgid "Unread Messages"
+msgstr ""
+
+#. module: purchase
+#: model:ir.ui.menu,name:purchase.menu_purchase_uom_categ_form_action
+msgid "Unit of Measure Categories"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "Set to Draft"
+msgstr ""
+
+#. module: purchase
+#: help:purchase.order,origin:0
+msgid ""
+"Reference of the document that generated this purchase order request; a "
+"sales order or an internal procurement request."
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order.line:0
+msgid "Notes"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.config.settings,module_purchase_requisition:0
+msgid "Manage purchase requisitions"
+msgstr ""
+
+#. module: purchase
+#: report:purchase.order:0
+#: field:purchase.order,amount_tax:0
+#: field:purchase.order.line,taxes_id:0
+msgid "Taxes"
+msgstr ""
+
+#. module: purchase
+#: model:ir.ui.menu,name:purchase.menu_procurement_management_product
+#: model:ir.ui.menu,name:purchase.menu_procurement_partner_contact_form
+#: model:ir.ui.menu,name:purchase.menu_product_in_config_purchase
+msgid "Products"
+msgstr ""
+
+#. module: purchase
+#: model:ir.model,name:purchase.model_stock_move
+msgid "Stock Move"
+msgstr ""
+
+#. module: purchase
+#: code:addons/purchase/purchase.py:260
+#, python-format
+msgid "Invalid Action!"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,validator:0
+#: view:purchase.report:0
+msgid "Validated by"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.report:0
+#: field:purchase.report,price_standard:0
+msgid "Products Value"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "Purchase orders which are in exception state"
+msgstr ""
+
+#. module: purchase
+#: model:process.node,note:purchase.process_node_draftpurchaseorder0
+#: model:process.node,note:purchase.process_node_draftpurchaseorder1
+msgid "Request for Quotations."
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "Source"
+msgstr ""
+
+#. module: purchase
+#: model:ir.model,name:purchase.model_stock_picking
+#: field:purchase.order,picking_ids:0
+msgid "Picking List"
+msgstr ""
+
+#. module: purchase
+#: report:purchase.quotation:0
+msgid "Fax:"
+msgstr ""
+
+#. module: purchase
+#: help:purchase.order,invoice_ids:0
+msgid "Invoices generated for a purchase order"
+msgstr ""
+
+#. module: purchase
+#: selection:purchase.config.settings,default_invoice_method:0
+msgid "Pre-generate draft invoices based on purchase orders"
+msgstr ""
+
+#. module: purchase
+#: help:product.template,purchase_ok:0
+msgid "Specify if the product can be selected in a purchase order line."
+msgstr ""
+
+#. module: purchase
+#: model:process.transition,note:purchase.process_transition_invoicefrompackinglist0
+msgid ""
+"The invoice is created automatically if the Invoice control of the purchase "
+"order is 'On picking'. The invoice can also be generated manually by the "
+"accountant (Invoice control = Manual)."
+msgstr ""
+
+#. module: purchase
+#: report:purchase.quotation:0
+msgid "Regards,"
+msgstr ""
+
+#. module: purchase
+#: selection:purchase.report,month:0
+msgid "July"
+msgstr ""
+
+#. module: purchase
+#: model:process.node,name:purchase.process_node_packinginvoice0
+msgid "Outgoing Products"
+msgstr ""
+
+#. module: purchase
+#: view:product.product:0
+msgid ""
+"to buy the required quantities to the supplier.\n"
+" The delivery order will be ready after having "
+"received the\n"
+" products."
+msgstr ""
+
+#. module: purchase
+#: view:product.product:0
+msgid ""
+"a draft\n"
+" purchase order"
+msgstr ""
+
+#. module: purchase
+#: code:addons/purchase/purchase.py:320
+#, python-format
+msgid "Please create Invoices."
+msgstr ""
+
+#. module: purchase
+#: model:ir.model,name:purchase.model_procurement_order
+msgid "Procurement"
+msgstr ""
+
+#. module: purchase
+#: selection:purchase.order,state:0
+#: selection:purchase.report,state:0
+msgid "Shipping Exception"
+msgstr ""
+
+#. module: purchase
+#: selection:purchase.report,month:0
+msgid "March"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "Receive Invoice"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "Receive Products"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.report:0
+#: field:purchase.report,month:0
+msgid "Month"
+msgstr ""
+
+#. module: purchase
+#: help:res.company,po_lead:0
+msgid "This is the leads/security time for each purchase order."
+msgstr ""
+
+#. module: purchase
+#: model:process.node,note:purchase.process_node_invoiceafterpacking0
+#: model:process.node,note:purchase.process_node_invoicecontrol0
+msgid "To be reviewed by the accountant."
+msgstr ""
+
+#. module: purchase
+#: model:ir.model,name:purchase.model_purchase_config_settings
+msgid "purchase.config.settings"
+msgstr ""
+
+#. module: purchase
+#: model:process.node,note:purchase.process_node_approvepurchaseorder0
+#: model:process.node,note:purchase.process_node_confirmpurchaseorder0
+msgid "State of the Purchase Order."
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order.line,product_uom:0
+msgid "Product Unit of Measure"
+msgstr ""
+
+#. module: purchase
+#: model:ir.actions.act_window,help:purchase.purchase_pricelist_version_action
+msgid ""
+"\n"
+" Click to add a pricelist version.\n"
+"
\n"
+" There can be more than one version of a pricelist, each of\n"
+" these must be valid during a certain period of time. Some\n"
+" examples of versions: Main Prices, 2010, 2011, Summer "
+"Sales,\n"
+" etc.\n"
+"
\n"
+" "
+msgstr ""
+
+#. module: purchase
+#: model:ir.actions.act_window,name:purchase.action_view_purchase_line_invoice
+msgid "Create invoices"
+msgstr ""
+
+#. module: purchase
+#: model:ir.model,name:purchase.model_purchase_order_line_invoice
+msgid "Purchase Order Line Make Invoice"
+msgstr ""
+
+#. module: purchase
+#: code:addons/purchase/purchase.py:1141
+#, python-format
+msgid "PO: %s"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "Send by EMail"
+msgstr ""
+
+#. module: purchase
+#: code:addons/purchase/purchase.py:515
+#, python-format
+msgid "Define purchase journal for this company: \"%s\" (id:%d)."
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "Purchase Order "
+msgstr ""
+
+#. module: purchase
+#: help:purchase.config.settings,group_costing_method:0
+msgid "Allows you to compute product cost price based on average cost."
+msgstr ""
+
+#. module: purchase
+#: model:ir.actions.act_window,name:purchase.action_purchase_configuration
+#: view:purchase.config.settings:0
+msgid "Configure Purchases"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "Untaxed"
+msgstr ""
+
+#. module: purchase
+#: model:process.transition,name:purchase.process_transition_createpackinglist0
+msgid "Pick list generated"
+msgstr ""
+
+#. module: purchase
+#: model:ir.actions.act_window,name:purchase.purchase_line_form_action2
+#: model:ir.ui.menu,name:purchase.menu_purchase_line_order_draft
+msgid "On Purchase Order Lines"
+msgstr ""
+
+#. module: purchase
+#: report:purchase.quotation:0
+msgid "TVA:"
+msgstr ""
+
+#. module: purchase
+#: help:purchase.order,picking_ids:0
+msgid ""
+"This is the list of incoming shipments that have been generated for this "
+"purchase order."
+msgstr ""
+
+#. module: purchase
+#: field:purchase.config.settings,module_purchase_double_validation:0
+msgid "Force two levels of approvals"
+msgstr ""
+
+#. module: purchase
+#: model:ir.ui.menu,name:purchase.menu_product_pricelist_action2_purchase_type
+msgid "Price Types"
+msgstr ""
+
+#. module: purchase
+#: help:purchase.order,date_approve:0
+msgid "Date on which purchase order has been approved"
+msgstr ""
+
+#. module: purchase
+#: model:process.node,name:purchase.process_node_approvepurchaseorder0
+#: view:purchase.order:0
+#: selection:purchase.report,state:0
+msgid "Approved"
+msgstr ""
+
+#. module: purchase
+#: selection:purchase.order,state:0
+#: selection:purchase.order.line,state:0
+#: selection:purchase.report,state:0
+msgid "Done"
+msgstr ""
+
+#. module: purchase
+#: model:process.transition,name:purchase.process_transition_invoicefrompackinglist0
+#: model:process.transition,name:purchase.process_transition_invoicefrompurchase0
+msgid "Invoice"
+msgstr ""
+
+#. module: purchase
+#: model:process.node,note:purchase.process_node_purchaseorder0
+msgid "Confirmed purchase order to invoice"
+msgstr ""
+
+#. module: purchase
+#: model:process.node,note:purchase.process_node_productrecept0
+msgid "Incoming products to control"
+msgstr ""
+
+#. module: purchase
+#: model:ir.actions.act_window,help:purchase.purchase_rfq
+msgid ""
+"\n"
+" Click to create a request for quotation.\n"
+"
\n"
+" The quotation contains the history of the "
+"discussion/negociation\n"
+" you had with your supplier. Once confirmed, a request for\n"
+" quotation is converted into a purchase order.\n"
+"
\n"
+" Most propositions of purchase orders are created "
+"automatically\n"
+" by OpenERP based on inventory needs.\n"
+"
\n"
+" "
+msgstr ""
+
+#. module: purchase
+#: model:process.transition,note:purchase.process_transition_approvingpurchaseorder0
+msgid "The supplier approves the Purchase Order."
+msgstr ""
+
+#. module: purchase
+#: code:addons/purchase/wizard/purchase_order_group.py:80
+#: model:ir.actions.act_window,name:purchase.purchase_form_action
+#: model:ir.ui.menu,name:purchase.menu_purchase_form_action
+#: view:purchase.order:0
+#: view:purchase.report:0
+#: view:res.partner:0
+#, python-format
+msgid "Purchase Orders"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,origin:0
+msgid "Source Document"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order.group:0
+msgid "Merge orders"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.config.settings,module_purchase_analytic_plans:0
+msgid "Use multiple analytic accounts on purchase orders"
+msgstr ""
+
+#. module: purchase
+#: model:ir.ui.menu,name:purchase.menu_procurement_management
+#: model:process.process,name:purchase.process_process_purchaseprocess0
+msgid "Purchase"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,create_uid:0
+#: view:purchase.report:0
+#: field:purchase.report,user_id:0
+msgid "Responsible"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "Manually Corrected"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.config.settings,group_costing_method:0
+msgid "Compute product cost price based on average cost"
+msgstr ""
+
+#. module: purchase
+#: code:addons/purchase/purchase.py:350
+#: code:addons/purchase/wizard/purchase_line_invoice.py:137
+#: model:ir.actions.act_window,name:purchase.act_res_partner_2_supplier_invoices
+#: view:res.partner:0
+#, python-format
+msgid "Supplier Invoices"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,product_id:0
+#: view:purchase.order.line:0
+#: field:purchase.order.line,product_id:0
+#: view:purchase.report:0
+#: field:purchase.report,product_id:0
+msgid "Product"
+msgstr ""
+
+#. module: purchase
+#: model:process.transition,name:purchase.process_transition_confirmingpurchaseorder0
+#: model:process.transition,name:purchase.process_transition_confirmingpurchaseorder1
+msgid "Confirmation"
+msgstr ""
+
+#. module: purchase
+#: report:purchase.order:0
+msgid "TIN :"
+msgstr ""
+
+#. module: purchase
+#: model:ir.ui.menu,name:purchase.menu_product_by_category_purchase_form
+msgid "Products by Category"
+msgstr ""
+
+#. module: purchase
+#: help:purchase.order.line,state:0
+msgid ""
+" * The 'Draft' status is set automatically when purchase order in draft "
+"status. \n"
+"* The 'Confirmed' status is set automatically as confirm when purchase order "
+"in confirm status. \n"
+"* The 'Done' status is set automatically when purchase order is set as done. "
+" \n"
+"* The 'Cancelled' status is set automatically when user cancel purchase "
+"order."
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,invoiced:0
+msgid "Invoice Received"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,invoice_method:0
+msgid "Invoicing Control"
+msgstr ""
+
+#. module: purchase
+#: model:process.transition.action,name:purchase.process_transition_action_approvingpurchaseorder0
+msgid "Approve"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.report:0
+msgid "Reference UOM"
+msgstr ""
+
+#. module: purchase
+#: selection:purchase.report,month:0
+msgid "May"
+msgstr ""
+
+#. module: purchase
+#: model:res.groups,name:purchase.group_purchase_manager
+msgid "Manager"
+msgstr ""
+
+#. module: purchase
+#: selection:purchase.order,invoice_method:0
+msgid "Based on Purchase Order lines"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,amount_total:0
+msgid "Total"
+msgstr ""
+
+#. module: purchase
+#: help:account.config.settings,module_purchase_analytic_plans:0
+#: help:purchase.config.settings,module_purchase_analytic_plans:0
+msgid ""
+"Allows the user to maintain several analysis plans. These let you split "
+"lines on a purchase order between several accounts and analytic plans.\n"
+" This installs the module purchase_analytic_plans."
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,location_id:0
+#: view:purchase.report:0
+#: field:purchase.report,location_id:0
+msgid "Destination"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,dest_address_id:0
+msgid "Customer Address (Direct Delivery)"
+msgstr ""
+
+#. module: purchase
+#: model:ir.actions.client,name:purchase.action_client_purchase_menu
+msgid "Open Purchase Menu"
+msgstr ""
+
+#. module: purchase
+#: code:addons/purchase/purchase.py:1028
+#, python-format
+msgid "No address defined for the supplier"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,company_id:0
+#: field:purchase.order.line,company_id:0
+#: view:purchase.report:0
+#: field:purchase.report,company_id:0
+msgid "Company"
+msgstr ""
+
+#. module: purchase
+#: selection:purchase.order,state:0
+#: selection:purchase.report,state:0
+msgid "Invoice Exception"
+msgstr ""
+
+#. module: purchase
+#: help:res.partner,property_product_pricelist_purchase:0
+msgid ""
+"This pricelist will be used, instead of the default one, for purchases from "
+"the current partner"
+msgstr ""
+
+#. module: purchase
+#: report:purchase.order:0
+msgid "Fax :"
+msgstr ""
+
+#. module: purchase
+#: model:ir.model,name:purchase.model_stock_partial_picking
+msgid "Partial Picking Processing Wizard"
+msgstr ""
+
+#. module: purchase
+#: model:product.pricelist.version,name:purchase.ver0
+msgid "Default Purchase Pricelist Version"
+msgstr ""
+
+#. module: purchase
+#: selection:purchase.order,invoice_method:0
+msgid "Based on generated draft invoice"
+msgstr ""
+
+#. module: purchase
+#: model:ir.actions.act_window,name:purchase.action_stock_move_report_po
+#: model:ir.ui.menu,name:purchase.menu_action_stock_move_report_po
+msgid "Receptions Analysis"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,message_ids:0
+msgid "Messages"
+msgstr ""
+
+#. module: purchase
+#: model:ir.actions.report.xml,name:purchase.report_purchase_order
+#: model:ir.model,name:purchase.model_purchase_order
+#: model:process.node,name:purchase.process_node_purchaseorder0
+#: field:procurement.order,purchase_id:0
+#: view:purchase.config.settings:0
+#: view:purchase.order:0
+#: selection:purchase.order,state:0
+#: field:res.partner,purchase_order_ids:0
+#: model:res.request.link,name:purchase.req_link_purchase_order
+#: field:stock.picking,purchase_id:0
+#: field:stock.picking.in,purchase_id:0
+msgid "Purchase Order"
+msgstr ""
+
+#. module: purchase
+#: code:addons/purchase/purchase.py:320
+#: code:addons/purchase/purchase.py:456
+#: code:addons/purchase/purchase.py:514
+#: code:addons/purchase/purchase.py:525
+#: code:addons/purchase/wizard/purchase_line_invoice.py:105
+#, python-format
+msgid "Error!"
+msgstr ""
+
+#. module: purchase
+#: report:purchase.order:0
+msgid "Net Total :"
+msgstr ""
+
+#. module: purchase
+#: help:purchase.order,state:0
+msgid ""
+"The status of the purchase order or the quotation request. A quotation is a "
+"purchase order in a 'Draft' status. Then the order has to be confirmed by "
+"the user, the status switch to 'Confirmed'. Then the supplier must confirm "
+"the order to change the status to 'Approved'. When the purchase order is "
+"paid and received, the status becomes 'Done'. If a cancel action occurs in "
+"the invoice or in the reception of goods, the status becomes in exception."
+msgstr ""
+
+#. module: purchase
+#: selection:purchase.order,state:0
+#: selection:purchase.order.line,state:0
+#: selection:purchase.report,state:0
+msgid "Cancelled"
+msgstr ""
+
+#. module: purchase
+#: field:res.partner,purchase_order_count:0
+msgid "# of Purchase Order"
+msgstr ""
+
+#. module: purchase
+#: model:ir.model,name:purchase.model_mail_compose_message
+msgid "Email composition wizard"
+msgstr ""
+
+#. module: purchase
+#: report:purchase.quotation:0
+msgid "Tel.:"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "Resend Purchase Order"
+msgstr ""
+
+#. module: purchase
+#: report:purchase.order:0
+msgid "Net Price"
+msgstr ""
+
+#. module: purchase
+#: model:ir.model,name:purchase.model_purchase_order_line
+#: view:purchase.order.line:0
+#: field:stock.move,purchase_line_id:0
+msgid "Purchase Order Line"
+msgstr ""
+
+#. module: purchase
+#: model:process.transition.action,name:purchase.process_transition_action_confirmpurchaseorder0
+#: view:purchase.order.line_invoice:0
+msgid "Confirm"
+msgstr ""
+
+#. module: purchase
+#: selection:purchase.config.settings,default_invoice_method:0
+msgid "Based on receptions"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,partner_ref:0
+msgid "Supplier Reference"
+msgstr ""
+
+#. module: purchase
+#: model:process.transition,note:purchase.process_transition_productrecept0
+msgid ""
+"A Pick list generates a supplier invoice. Depending on the Invoicing control "
+"of the purchase order, the invoice is based on received or on ordered "
+"quantities."
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,message_follower_ids:0
+msgid "Followers"
+msgstr ""
+
+#. module: purchase
+#: help:purchase.config.settings,module_purchase_requisition:0
+msgid ""
+"Purchase Requisitions are used when you want to request quotations from "
+"several suppliers for a given set of products.\n"
+" You can configure per product if you directly do a Request for "
+"Quotation\n"
+" to one supplier or if you want a purchase requisition to "
+"negotiate with several suppliers."
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order.line,invoice_lines:0
+msgid "Invoice Lines"
+msgstr ""
+
+#. module: purchase
+#: model:ir.actions.act_window,help:purchase.action_purchase_order_report_all
+msgid ""
+"Purchase Analysis allows you to easily check and analyse your company "
+"purchase history and performance. From this menu you can track your "
+"negotiation performance, the delivery performance of your suppliers, etc."
+msgstr ""
+
+#. module: purchase
+#: model:email.template,report_name:purchase.email_template_edi_purchase
+msgid "RFQ_${(object.name or '').replace('/','_')}"
+msgstr ""
+
+#. module: purchase
+#: code:addons/purchase/purchase.py:956
+#, python-format
+msgid "The selected supplier only sells this product by %s"
+msgstr ""
+
+#. module: purchase
+#: model:process.transition.action,name:purchase.process_transition_action_invoicefrompurchaseorder0
+msgid "Create invoice"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order.line,move_dest_id:0
+msgid "Reservation Destination"
+msgstr ""
+
+#. module: purchase
+#: model:ir.ui.menu,name:purchase.menu_purchase_config_purchase
+msgid "Configuration"
+msgstr ""
+
+#. module: purchase
+#: help:purchase.config.settings,module_purchase_double_validation:0
+msgid ""
+"Provide a double validation mechanism for purchases exceeding minimum "
+"amount.\n"
+" This installs the module purchase_double_validation."
+msgstr ""
+
+#. module: purchase
+#: code:addons/purchase/edi/purchase_order.py:132
+#, python-format
+msgid "EDI Pricelist (%s)"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.report:0
+#: field:purchase.report,product_uom:0
+msgid "Reference Unit of Measure"
+msgstr ""
+
+#. module: purchase
+#: model:process.node,note:purchase.process_node_packinginvoice0
+msgid "Outgoing products to invoice"
+msgstr ""
+
+#. module: purchase
+#: report:purchase.order:0
+#: field:purchase.report,validator:0
+msgid "Validated By"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.report:0
+#: field:purchase.report,delay_pass:0
+msgid "Days to Deliver"
+msgstr ""
+
+#. module: purchase
+#: selection:purchase.report,month:0
+msgid "April"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+#: field:purchase.order,invoice_ids:0
+msgid "Invoices"
+msgstr ""
+
+#. module: purchase
+#: selection:purchase.report,month:0
+msgid "December"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.report:0
+msgid "Total Orders Lines by User per month"
+msgstr ""
+
+#. module: purchase
+#: help:purchase.order,amount_untaxed:0
+msgid "The amount without tax"
+msgstr ""
+
+#. module: purchase
+#: model:process.node,note:purchase.process_node_packinglist0
+msgid "List of ordered products."
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "Incoming Shipments & Invoices"
+msgstr ""
+
+#. module: purchase
+#: selection:purchase.order,state:0
+msgid "Waiting Approval"
+msgstr ""
+
+#. module: purchase
+#: help:purchase.order,amount_total:0
+msgid "The total amount"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,invoiced_rate:0
+#: field:purchase.order.line,invoiced:0
+msgid "Invoiced"
+msgstr ""
+
+#. module: purchase
+#: model:process.node,name:purchase.process_node_confirmpurchaseorder0
+#: selection:purchase.order.line,state:0
+msgid "Confirmed"
+msgstr ""
+
+#. module: purchase
+#: selection:purchase.order.line,state:0
+msgid "Draft"
+msgstr ""
+
+#. module: purchase
+#: model:ir.model,name:purchase.model_purchase_order_group
+msgid "Purchase Order Merge"
+msgstr ""
+
+#. module: purchase
+#: model:ir.actions.act_window,name:purchase.action_email_templates
+msgid "Email Templates"
+msgstr ""
+
+#. module: purchase
+#: model:res.groups,name:purchase.group_purchase_user
+msgid "User"
+msgstr ""
+
+#. module: purchase
+#: selection:purchase.report,month:0
+msgid "November"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order.line:0
+msgid "Manual Invoices"
+msgstr ""
+
+#. module: purchase
+#: report:purchase.order:0
+msgid "Our Order Reference"
+msgstr ""
+
+#. module: purchase
+#: selection:purchase.report,month:0
+msgid "January"
+msgstr ""
+
+#. module: purchase
+#: help:purchase.order,invoice_method:0
+msgid ""
+"Based on Purchase Order lines: place individual lines in 'Invoice Control > "
+"Based on P.O. lines' from where you can selectively create an invoice.\n"
+"Based on generated invoice: create a draft invoice you can validate later.\n"
+"Bases on incoming shipments: let you create an invoice when receptions are "
+"validated."
+msgstr ""
+
+#. module: purchase
+#: model:ir.ui.menu,name:purchase.menu_partner_categories_in_form
+msgid "Partner Categories"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.report,state:0
+msgid "Order Status"
+msgstr ""
+
+#. module: purchase
+#: report:purchase.order:0
+msgid "Request for Quotation N°"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.config.settings:0
+msgid "Invoicing Settings"
+msgstr ""
+
+#. module: purchase
+#: model:ir.actions.act_window,name:purchase.action_purchase_order_by_user_all
+msgid "Total Orders by User per month"
+msgstr ""
+
+#. module: purchase
+#: selection:purchase.order,invoice_method:0
+msgid "Based on incoming shipments"
+msgstr ""
+
+#. module: purchase
+#: code:addons/purchase/purchase.py:1018
+#, python-format
+msgid "No default supplier defined for this product"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.report:0
+#: field:purchase.report,warehouse_id:0
+msgid "Warehouse"
+msgstr ""
+
+#. module: purchase
+#: code:addons/purchase/purchase.py:960
+#, python-format
+msgid ""
+"The selected supplier has a minimal quantity set to %s %s, you should not "
+"purchase less."
+msgstr ""
+
+#. module: purchase
+#: report:purchase.order:0
+#: field:purchase.order.line,name:0
+#: report:purchase.quotation:0
+msgid "Description"
+msgstr ""
+
+#. module: purchase
+#: report:purchase.quotation:0
+msgid "Expected Delivery address:"
+msgstr ""
+
+#. module: purchase
+#: selection:purchase.report,month:0
+msgid "February"
+msgstr ""
+
+#. module: purchase
+#: model:ir.actions.act_window,name:purchase.action_invoice_pending
+#: model:ir.ui.menu,name:purchase.menu_procurement_management_pending_invoice
+msgid "On Draft Invoices"
+msgstr ""
+
+#. module: purchase
+#: model:ir.actions.act_window,name:purchase.action_purchase_order_report_all
+#: model:ir.ui.menu,name:purchase.menu_action_purchase_order_report_all
+msgid "Purchase Analysis"
+msgstr ""
+
+#. module: purchase
+#: report:purchase.order:0
+msgid "Your Order Reference"
+msgstr ""
+
+#. module: purchase
+#: report:purchase.order:0
+msgid "Purchase Order Confirmation N°"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "Total amount"
+msgstr ""
+
+#. module: purchase
+#: model:ir.model,name:purchase.model_product_template
+msgid "Product Template"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order.group:0
+msgid ""
+" Please note that: \n"
+" \n"
+" Orders will only be merged if: \n"
+" * Purchase Orders are in draft \n"
+" * Purchase Orders belong to the same supplier \n"
+" * Purchase Orders are have same stock location, same pricelist \n"
+" \n"
+" Lines will only be merged if: \n"
+" * Order lines are exactly the same except for the product,quantity and unit "
+"\n"
+" "
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,message_summary:0
+msgid "Summary"
+msgstr ""
+
+#. module: purchase
+#: model:ir.actions.act_window,name:purchase.purchase_pricelist_version_action
+#: model:ir.ui.menu,name:purchase.menu_purchase_pricelist_version_action
+msgid "Pricelist Versions"
+msgstr ""
+
+#. module: purchase
+#: field:purchase.order,payment_term_id:0
+msgid "Payment Term"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.order:0
+msgid "Purchase orders which are in draft state"
+msgstr ""
+
+#. module: purchase
+#: view:purchase.report:0
+#: field:purchase.report,name:0
+msgid "Year"
+msgstr ""
+
+#. module: purchase
+#: selection:purchase.config.settings,default_invoice_method:0
+msgid "Based on purchase order lines"
+msgstr ""
+
+#. module: purchase
+#: model:ir.actions.act_window,help:purchase.act_res_partner_2_purchase_order
+msgid ""
+"\n"
+" This supplier has no purchase order. Click to create a "
+"new RfQ.\n"
+"
\n"
+" The request for quotation is the first step of the "
+"purchases flow. Once\n"
+" converted into a purchase order, you will be able to "
+"control the reception\n"
+" of the products and the supplier invoice.\n"
+"
\n"
+" "
+msgstr ""
+
+#. module: purchase
+#: view:purchase.report:0
+msgid "Orders"
+msgstr ""
diff --git a/addons/sale/edi/sale_order_action_data.xml b/addons/sale/edi/sale_order_action_data.xml
index 16712532285..a7f597f4339 100644
--- a/addons/sale/edi/sale_order_action_data.xml
+++ b/addons/sale/edi/sale_order_action_data.xml
@@ -22,7 +22,7 @@
Sales Order - Send by Email
${object.user_id.email or ''}
${object.company_id.name} ${object.state in ('draft', 'sent') and 'Quotation' or 'Order'} (Ref ${object.name or 'n/a' })
- ${object.partner_invoice_id.id}
+ ${object.partner_invoice_id.id}
diff --git a/addons/sale/sale.py b/addons/sale/sale.py
index 09ee8d5e3fd..bf9e9484b9f 100644
--- a/addons/sale/sale.py
+++ b/addons/sale/sale.py
@@ -729,7 +729,7 @@ class sale_order_line(osv.osv):
'salesman_id':fields.related('order_id', 'user_id', type='many2one', relation='res.users', store=True, string='Salesperson'),
'company_id': fields.related('order_id', 'company_id', type='many2one', relation='res.company', string='Company', store=True, readonly=True),
}
- _order = 'order_id desc, sequence'
+ _order = 'order_id desc, sequence, id'
_defaults = {
'product_uom' : _get_uom_id,
'discount': 0.0,
diff --git a/addons/sale_analytic_plans/i18n/es_CO.po b/addons/sale_analytic_plans/i18n/es_CO.po
new file mode 100644
index 00000000000..db8a37bcd80
--- /dev/null
+++ b/addons/sale_analytic_plans/i18n/es_CO.po
@@ -0,0 +1,33 @@
+# Spanish (Colombia) translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR , 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2012-12-21 17:06+0000\n"
+"PO-Revision-Date: 2013-03-19 03:45+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Spanish (Colombia) \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-20 04:42+0000\n"
+"X-Generator: Launchpad (build 16532)\n"
+
+#. module: sale_analytic_plans
+#: field:sale.order.line,analytics_id:0
+msgid "Analytic Distribution"
+msgstr "Distribución Analítica"
+
+#. module: sale_analytic_plans
+#: model:ir.model,name:sale_analytic_plans.model_sale_order
+msgid "Sales Order"
+msgstr "Pedido de Venta"
+
+#. module: sale_analytic_plans
+#: model:ir.model,name:sale_analytic_plans.model_sale_order_line
+msgid "Sales Order Line"
+msgstr "Línea de Pedido de Venta"
diff --git a/addons/web_linkedin/static/src/js/linkedin.js b/addons/web_linkedin/static/src/js/linkedin.js
index 661aecdc400..5d8d7a29b1d 100644
--- a/addons/web_linkedin/static/src/js/linkedin.js
+++ b/addons/web_linkedin/static/src/js/linkedin.js
@@ -88,7 +88,7 @@ openerp.web_linkedin = function(instance) {
$("body").append(self.$linkedin);
var tag = document.createElement('script');
tag.type = 'text/javascript';
- tag.src = "http://platform.linkedin.com/in.js";
+ tag.src = "https://platform.linkedin.com/in.js";
tag.innerHTML = 'api_key : ' + self.api_key + '\nauthorize : true\nscope: r_network r_basicprofile'; // r_contactinfo r_fullprofile r_emailaddress';
document.getElementsByTagName('head')[0].appendChild(tag);