From e9a1f9f5a7e5c68d4daf9863c3ba6678f53c2317 Mon Sep 17 00:00:00 2001 From: Christophe Matthieu Date: Mon, 19 Nov 2012 11:53:30 +0100 Subject: [PATCH 01/16] [FIX] tools mail: html_email_clean return an empty string if the are no value bzr revid: chm@openerp.com-20121119105330-2kud8vp18gp15u9e --- openerp/tools/mail.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openerp/tools/mail.py b/openerp/tools/mail.py index 39d918da97b..6a10731281c 100644 --- a/openerp/tools/mail.py +++ b/openerp/tools/mail.py @@ -130,6 +130,9 @@ def html_email_clean(html): dest += source[idx:] return dest + if not html: + return '' + html = ustr(html) # 1. -> \n, because otherwise the tree is obfuscated From c7e8142caec674e887c01a2161cd493d3f675522 Mon Sep 17 00:00:00 2001 From: Christophe Matthieu Date: Mon, 19 Nov 2012 13:24:13 +0100 Subject: [PATCH 02/16] [FIX] many2many_tags: the widget accept the required attribute bzr revid: chm@openerp.com-20121119122413-plp6klbytyjuhwqt --- addons/web/static/src/js/view_form.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index dad622fb7f9..7ae4221e054 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -4026,9 +4026,11 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(in } this._super(value_); }, + is_false: function() { + return _(this.get("value")).isEmpty(); + }, get_value: function() { - var tmp = [commands.replace_with(this.get("value"))]; - return tmp; + return [commands.replace_with(this.get("value"))]; }, get_search_blacklist: function() { return this.get("value"); From b4dc178588ad998cff28887c7ad4497e52efe0f9 Mon Sep 17 00:00:00 2001 From: Christophe Matthieu Date: Mon, 19 Nov 2012 16:17:39 +0100 Subject: [PATCH 03/16] [IMP] tools.mail: add a test for html_email_clean function, if empty string bzr revid: chm@openerp.com-20121119151739-vcofz0abk7i71b3l --- openerp/tests/test_mail.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openerp/tests/test_mail.py b/openerp/tests/test_mail.py index 0ad6504a7ae..c58beecb4c4 100644 --- a/openerp/tests/test_mail.py +++ b/openerp/tests/test_mail.py @@ -173,6 +173,9 @@ class TestCleaner(unittest2.TestCase): new_html = html_email_clean(TEXT_TPL) self.assertNotIn('quote', new_html, 'html_email_cleaner did not remove correctly plaintext quotes') + # Test5: False boolean for text must return empty string + new_html = html_email_clean(False) + self.assertEqual('', new_html, 'html_email_cleaner did not change a False (boolean) in an empty string.') class TestHtmlTools(unittest2.TestCase): """ Test some of our generic utility functions about html """ From a4b831e3ed5ed10aed90706d6e835d7097721ba7 Mon Sep 17 00:00:00 2001 From: Christophe Matthieu Date: Mon, 19 Nov 2012 16:24:46 +0100 Subject: [PATCH 04/16] [FIX] tools.mail: html_email_clean test type of empty value bzr revid: chm@openerp.com-20121119152446-w1z1vuhfk631h0ko --- openerp/tests/test_mail.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/tests/test_mail.py b/openerp/tests/test_mail.py index c58beecb4c4..2f3086962b4 100644 --- a/openerp/tests/test_mail.py +++ b/openerp/tests/test_mail.py @@ -175,7 +175,7 @@ class TestCleaner(unittest2.TestCase): # Test5: False boolean for text must return empty string new_html = html_email_clean(False) - self.assertEqual('', new_html, 'html_email_cleaner did not change a False (boolean) in an empty string.') + self.assertEqual(type(new_html), type(''), 'html_email_cleaner did not change a False (boolean) in an empty string.') class TestHtmlTools(unittest2.TestCase): """ Test some of our generic utility functions about html """ From f8a44b2bacfd7a456f4d59b42c2ddb012df1015f Mon Sep 17 00:00:00 2001 From: Christophe Matthieu Date: Mon, 19 Nov 2012 16:26:15 +0100 Subject: [PATCH 05/16] [FIX] tools.mail: html_email_clean test type and value of empty value bzr revid: chm@openerp.com-20121119152615-sazfnlc5uwiw0ut9 --- openerp/tests/test_mail.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openerp/tests/test_mail.py b/openerp/tests/test_mail.py index 2f3086962b4..3098a94c5f1 100644 --- a/openerp/tests/test_mail.py +++ b/openerp/tests/test_mail.py @@ -175,6 +175,7 @@ class TestCleaner(unittest2.TestCase): # Test5: False boolean for text must return empty string new_html = html_email_clean(False) + self.assertEqual(new_html, '', 'html_email_cleaner did not change a False (boolean) in an empty string.') self.assertEqual(type(new_html), type(''), 'html_email_cleaner did not change a False (boolean) in an empty string.') class TestHtmlTools(unittest2.TestCase): From ceefb58670c736e33e5645de1bd5e706f56b13d9 Mon Sep 17 00:00:00 2001 From: Christophe Matthieu Date: Tue, 20 Nov 2012 11:02:25 +0100 Subject: [PATCH 06/16] [IMP] tools mail: remove one line test (double) bzr revid: chm@openerp.com-20121120100225-it12j6qgxjn3ilbg --- openerp/tests/test_mail.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openerp/tests/test_mail.py b/openerp/tests/test_mail.py index 3098a94c5f1..edf5571ca20 100644 --- a/openerp/tests/test_mail.py +++ b/openerp/tests/test_mail.py @@ -176,7 +176,6 @@ class TestCleaner(unittest2.TestCase): # Test5: False boolean for text must return empty string new_html = html_email_clean(False) self.assertEqual(new_html, '', 'html_email_cleaner did not change a False (boolean) in an empty string.') - self.assertEqual(type(new_html), type(''), 'html_email_cleaner did not change a False (boolean) in an empty string.') class TestHtmlTools(unittest2.TestCase): """ Test some of our generic utility functions about html """ From 50f09660fb7b8a8b9cd89ea6385274b9ccb80a3b Mon Sep 17 00:00:00 2001 From: Christophe Matthieu Date: Tue, 20 Nov 2012 14:40:01 +0100 Subject: [PATCH 07/16] [FIX] tools mail: html_email_clean return False (standard OpenERP) if the param is False bzr revid: chm@openerp.com-20121120134001-ivw9dqxha2du70o6 --- openerp/tests/test_mail.py | 2 +- openerp/tools/mail.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openerp/tests/test_mail.py b/openerp/tests/test_mail.py index edf5571ca20..a8c806a13d0 100644 --- a/openerp/tests/test_mail.py +++ b/openerp/tests/test_mail.py @@ -175,7 +175,7 @@ class TestCleaner(unittest2.TestCase): # Test5: False boolean for text must return empty string new_html = html_email_clean(False) - self.assertEqual(new_html, '', 'html_email_cleaner did not change a False (boolean) in an empty string.') + self.assertEqual(new_html, False, 'html_email_cleaner did change a False in an other value.') class TestHtmlTools(unittest2.TestCase): """ Test some of our generic utility functions about html """ diff --git a/openerp/tools/mail.py b/openerp/tools/mail.py index 6a10731281c..9faae0815c5 100644 --- a/openerp/tools/mail.py +++ b/openerp/tools/mail.py @@ -131,7 +131,7 @@ def html_email_clean(html): return dest if not html: - return '' + return False html = ustr(html) From 5bbce53e3515401ede024f54d51ccd030b2221c5 Mon Sep 17 00:00:00 2001 From: Christophe Matthieu Date: Tue, 20 Nov 2012 16:42:17 +0100 Subject: [PATCH 08/16] [FIX] tools mail : html_email_clean bzr revid: chm@openerp.com-20121120154217-4ewxir45q1wtjoax --- openerp/tools/mail.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/tools/mail.py b/openerp/tools/mail.py index 9faae0815c5..0711aa982aa 100644 --- a/openerp/tools/mail.py +++ b/openerp/tools/mail.py @@ -131,7 +131,7 @@ def html_email_clean(html): return dest if not html: - return False + return html html = ustr(html) From 53d35debfd8b2e905e54e58f45f126a4caf13a57 Mon Sep 17 00:00:00 2001 From: Christophe Matthieu Date: Tue, 20 Nov 2012 17:24:34 +0100 Subject: [PATCH 09/16] [FIX] mail followers: invisible attribute and mode create bzr revid: chm@openerp.com-20121120162434-g5wfgwndozrcstld --- addons/mail/static/src/js/mail_followers.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/addons/mail/static/src/js/mail_followers.js b/addons/mail/static/src/js/mail_followers.js index d299b9eb6f6..0645c2b9225 100644 --- a/addons/mail/static/src/js/mail_followers.js +++ b/addons/mail/static/src/js/mail_followers.js @@ -36,22 +36,22 @@ openerp_mail_followers = function(session, mail) { start: function() { // use actual_mode property on view to know if the view is in create mode anymore - this.view.on("change:actual_mode", this, this._check_visibility); - this._check_visibility(); + this.view.on("change:actual_mode", this, this.on_check_visibility_mode); + this.on_check_visibility_mode(); this.reinit(); this.bind_events(); this._super(); }, + on_check_visibility_mode: function () { + this.set({"force_invisible": this.view.get("actual_mode") == "create"}); + }, + set_value: function(_value) { this.value = _value; this._super(_value); }, - _check_visibility: function() { - this.$el.toggle(this.view.get("actual_mode") !== "create"); - }, - reinit: function() { this.message_is_follower == undefined; this.display_buttons(); From ddc5d6804edebf4d3a2db9fc19091a9dada46c9b Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Wed, 21 Nov 2012 11:04:34 +0100 Subject: [PATCH 10/16] [IMP] portal: unify wording as `Customer Portal` + make footer link translatable + cleanup bzr revid: odo@openerp.com-20121121100434-wq5julc2njlee7t1 --- addons/account/edi/invoice_action_data.xml | 2 +- addons/portal/mail_mail.py | 8 +++++--- addons/portal_sale/portal_sale_data.xml | 6 +++--- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/addons/account/edi/invoice_action_data.xml b/addons/account/edi/invoice_action_data.xml index 723f5c06c22..88073c7dff6 100644 --- a/addons/account/edi/invoice_action_data.xml +++ b/addons/account/edi/invoice_action_data.xml @@ -34,7 +34,7 @@

Hello${object.partner_id.name and ' ' or ''}${object.partner_id.name or ''},

-

A new invoice is available for ${object.partner_id.name}:

+

A new invoice is available for you:

  REFERENCES
diff --git a/addons/portal/mail_mail.py b/addons/portal/mail_mail.py index 0dc7348f2c8..c7cf0eb5d65 100644 --- a/addons/portal/mail_mail.py +++ b/addons/portal/mail_mail.py @@ -19,8 +19,9 @@ # ############################################################################## -from osv import osv -import tools +from openerp.osv import osv +from openerp.tools import append_content_to_html +from openerp.tools.translate import _ class mail_mail(osv.Model): """ Update of mail_mail class, to add the signin URL to notifications. """ @@ -36,5 +37,6 @@ class mail_mail(osv.Model): if partner: context = dict(context or {}, signup_valid=True) partner = self.pool.get('res.partner').browse(cr, uid, partner.id, context) - body = tools.append_content_to_html(body, ("

Log in our portal at: %s

" % partner.signup_url), plaintext=False) + text = _("""Access your personal documents through our Customer Portal""") % partner.signup_url + body = append_content_to_html(body, ("

%s

" % text), plaintext=False) return body diff --git a/addons/portal_sale/portal_sale_data.xml b/addons/portal_sale/portal_sale_data.xml index 2abb70b068c..72e64dc15bd 100644 --- a/addons/portal_sale/portal_sale_data.xml +++ b/addons/portal_sale/portal_sale_data.xml @@ -43,7 +43,7 @@ %> % if signup_url:

- You can access this document and pay online via our Customers Portal: + You can access this document and pay online via our Customer Portal:

View ${object.state in ('draft', 'sent') and 'Quotation' or 'Order'} @@ -122,7 +122,7 @@

Hello${object.partner_id.name and ' ' or ''}${object.partner_id.name or ''},

-

A new invoice is available for ${object.partner_id.name}:

+

A new invoice is available for you:

  REFERENCES
@@ -144,7 +144,7 @@ %> % if signup_url:

- You can access the invoice document and pay online via our Customers Portal: + You can access the invoice document and pay online via our Customer Portal:

View Invoice From 548994707f55945a5dc4b8b661f0f860270a151e Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Wed, 21 Nov 2012 11:11:33 +0100 Subject: [PATCH 11/16] [FIX] account.invoice: typos in default email templates: amount_residual -> residual bzr revid: odo@openerp.com-20121121101133-i14gzydtxzevjcvt --- addons/account/edi/invoice_action_data.xml | 2 +- addons/portal_sale/portal_sale_data.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/account/edi/invoice_action_data.xml b/addons/account/edi/invoice_action_data.xml index 88073c7dff6..7cc4f4978f7 100644 --- a/addons/account/edi/invoice_action_data.xml +++ b/addons/account/edi/invoice_action_data.xml @@ -54,7 +54,7 @@ comp_name = quote(object.company_id.name) inv_number = quote(object.number) paypal_account = quote(object.company_id.paypal_account) - inv_amount = quote(str(object.amount_total)) + inv_amount = quote(str(object.residual)) cur_name = quote(object.currency_id.name) paypal_url = "https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=%s&item_name=%s%%20Invoice%%20%s&" \ "invoice=%s&amount=%s&currency_code=%s&button_subtype=services&no_note=1&bn=OpenERP_Invoice_PayNow_%s" % \ diff --git a/addons/portal_sale/portal_sale_data.xml b/addons/portal_sale/portal_sale_data.xml index 72e64dc15bd..8239f1cbcca 100644 --- a/addons/portal_sale/portal_sale_data.xml +++ b/addons/portal_sale/portal_sale_data.xml @@ -155,7 +155,7 @@ comp_name = quote(object.company_id.name) inv_number = quote(object.number) paypal_account = quote(object.company_id.paypal_account) - inv_amount = quote(str(object.amount_residual)) + inv_amount = quote(str(object.residual)) cur_name = quote(object.currency_id.name) paypal_url = "https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=%s&item_name=%s%%20Invoice%%20%s&" \ "invoice=%s&amount=%s&currency_code=%s&button_subtype=services&no_note=1&bn=OpenERP_Invoice_PayNow_%s" % \ From f3bc4f4f41c95123ce3f272187b5b73b500399a3 Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Wed, 21 Nov 2012 11:12:10 +0100 Subject: [PATCH 12/16] [FIX] portal: typo makes prevents acquirer defaults from working bzr revid: odo@openerp.com-20121121101210-1gtejd9u5blpb1o3 --- addons/portal/acquirer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/portal/acquirer.py b/addons/portal/acquirer.py index 1361d627105..083a8c93d4f 100644 --- a/addons/portal/acquirer.py +++ b/addons/portal/acquirer.py @@ -43,7 +43,7 @@ class acquirer(osv.Model): 'visible': fields.boolean('Visible', help="Make this payment acquirer available in portal forms (Customer invoices, etc.)"), } - _default = { + _defaults = { 'visible': True, } From fadd3119456b9429aeb336802a4a2b41d897ac17 Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Wed, 21 Nov 2012 11:19:17 +0100 Subject: [PATCH 13/16] [FIX] mail: remove ugly hack for context filtering that wreaks havoc in contexts This hacks makes a mess and works with a whitelist that completely breaks the generic context passing mechanism. Replaced by specific guard through default_get overrides for the models that are sensitive to default value leaks via context. E.g. mail.message is sensitive to leaked default_type context keys that are meant for other models, such as those passed by the Invoices menus. bzr revid: odo@openerp.com-20121121101917-izeu4c493un86udf --- addons/mail/mail_message.py | 6 ++++++ addons/mail/static/src/js/mail.js | 33 ------------------------------- 2 files changed, 6 insertions(+), 33 deletions(-) diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py index e7288a46853..ba6d101541c 100644 --- a/addons/mail/mail_message.py +++ b/addons/mail/mail_message.py @@ -59,6 +59,12 @@ class mail_message(osv.Model): _message_record_name_length = 18 _message_read_more_limit = 1024 + def default_get(self, cr, uid, fields, context=None): + # protection for `default_type` values leaking from menu action context (e.g. for invoices) + if context and context.get('default_type') and context.get('default_type') not in self._columns['type'].selection: + context = dict(context, default_type=None) + return super(mail_message, self).default_get(cr, uid, fields, context=context) + def _shorten_name(self, name): if len(name) <= (self._message_record_name_length + 3): return name diff --git a/addons/mail/static/src/js/mail.js b/addons/mail/static/src/js/mail.js index 040b83e8f33..44bb4e9ae09 100644 --- a/addons/mail/static/src/js/mail.js +++ b/addons/mail/static/src/js/mail.js @@ -7,39 +7,6 @@ openerp.mail = function (session) { openerp_mail_followers(session, mail); // import mail_followers.js openerp_FieldMany2ManyTagsEmail(session); // import manyy2many_tags_email.js - /** - * ------------------------------------------------------------ - * FormView - * ------------------------------------------------------------ - * - * Override of formview do_action method, to catch all return action about - * mail.compose.message. The purpose is to bind 'Send by e-mail' buttons. - */ - - session.web.FormView = session.web.FormView.extend({ - do_action: function (action) { - if (action.res_model == 'mail.compose.message') { - /* hack for stop context propagation of wrong value - * delete this hack when a global method to clean context is create - */ - var context_keys = ['default_template_id', 'default_composition_mode', - 'default_use_template', 'default_partner_ids', 'default_model', - 'default_res_id', 'default_content_subtype', 'default_subject', - 'default_body', 'active_id', 'lang', 'bin_raw', 'tz', - 'active_model', 'edi_web_url_view', 'active_ids', - 'default_attachment_ids'] - for (var key in action.context) { - if (_.indexOf(context_keys, key) == -1) { - action.context[key] = null; - } - } - /* end hack */ - } - return this._super.apply(this, arguments); - }, - }); - - /** * ------------------------------------------------------------ * ChatterUtils From 2c3d422964c85c61e96dbf354f597db28ab67574 Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Wed, 21 Nov 2012 11:21:37 +0100 Subject: [PATCH 14/16] [FIX] sale.order,invoices: more robust/consistent mechanism for marking documents sent after Send by Email bzr revid: odo@openerp.com-20121121102137-9wukkbnfktfkg4lo --- addons/account/account_invoice.py | 19 ++++++++----------- addons/sale/sale.py | 7 ++----- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/addons/account/account_invoice.py b/addons/account/account_invoice.py index 35afac5a508..b0671e501ae 100644 --- a/addons/account/account_invoice.py +++ b/addons/account/account_invoice.py @@ -408,6 +408,7 @@ class account_invoice(osv.osv): 'default_use_template': bool(template_id), 'default_template_id': template_id, 'default_composition_mode': 'comment', + 'mark_invoice_as_sent': True, }) return { 'type': 'ir.actions.act_window', @@ -1730,8 +1731,6 @@ class account_invoice_tax(osv.osv): }) return res -account_invoice_tax() - class res_partner(osv.osv): """ Inherits partner and adds invoice information in the partner form """ @@ -1745,16 +1744,14 @@ class res_partner(osv.osv): default.update({'invoice_ids' : []}) return super(res_partner, self).copy(cr, uid, id, default, context) -res_partner() -class mail_message(osv.osv): - _name = 'mail.message' - _inherit = 'mail.message' +class mail_compose_message(osv.osv): + _inherit = 'mail.compose.message' - def _postprocess_sent_message(self, cr, uid, message, context=None): - if message.model == 'account.invoice': - self.pool.get('account.invoice').write(cr, uid, [message.res_id], {'sent':True}, context=context) - return super(mail_message, self)._postprocess_sent_message(cr, uid, message=message, context=context) + def send_mail(self, cr, uid, ids, context=None): + context = context or {} + if context.get('default_model') == 'account.invoice' and context.get('default_res_id') and context.get('mark_invoice_as_sent'): + self.pool.get('account.invoice').write(cr, uid, [context['default_res_id']], {'sent': True}, context=context) + return super(mail_compose_message, self).send_mail(cr, uid, ids, context=context) -mail_message() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/sale/sale.py b/addons/sale/sale.py index 3c568cc8227..382fe093907 100644 --- a/addons/sale/sale.py +++ b/addons/sale/sale.py @@ -1028,17 +1028,14 @@ class sale_order_line(osv.osv): raise osv.except_osv(_('Invalid Action!'), _('Cannot delete a sales order line which is in state \'%s\'.') %(rec.state,)) return super(sale_order_line, self).unlink(cr, uid, ids, context=context) -sale_order_line() class mail_compose_message(osv.osv): _inherit = 'mail.compose.message' def send_mail(self, cr, uid, ids, context=None): context = context or {} - if context.get('mark_so_as_sent', False) and context.get('default_res_id', False): + if context.get('default_model') == 'sale.order' and context.get('default_res_id') and context.get('mark_so_as_sent'): wf_service = netsvc.LocalService("workflow") - wf_service.trg_validate(uid, 'sale.order', context.get('default_res_id', False), 'quotation_sent', cr) + wf_service.trg_validate(uid, 'sale.order', context['default_res_id'], 'quotation_sent', cr) return super(mail_compose_message, self).send_mail(cr, uid, ids, context=context) -mail_compose_message() - # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: From 74a5e92d4652955d7c03409cfe1e668bc8809689 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 21 Nov 2012 11:43:29 +0100 Subject: [PATCH 15/16] [FIX] Binary fields, limit upload size to 25Mo (only works for browsers supporting FileAPI) bzr revid: fme@openerp.com-20121121104329-5aa88lxqogn206l2 --- addons/web/static/src/js/view_form.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index ac54df69309..c737282a460 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -4791,6 +4791,7 @@ instance.web.form.FieldBinary = instance.web.form.AbstractField.extend(instance. this._super(field_manager, node); this.binary_value = false; this.useFileAPI = !!window.FileReader; + this.max_upload_size = 25 * 1024 * 1024; // 25Mo if (!this.useFileAPI) { this.fileupload_id = _.uniqueId('oe_fileupload'); $(window).on(this.fileupload_id, function() { @@ -4816,6 +4817,11 @@ instance.web.form.FieldBinary = instance.web.form.AbstractField.extend(instance. if ((this.useFileAPI && file_node.files.length) || (!this.useFileAPI && $(file_node).val() !== '')) { if (this.useFileAPI) { var file = file_node.files[0]; + if (file.size > this.max_upload_size) { + var msg = _t("The selected file exceed the maximum file size of %s."); + instance.webclient.notification.warn(_t("File upload"), _.str.sprintf(msg, instance.web.human_size(this.max_upload_size))); + return false; + } var filereader = new FileReader(); filereader.readAsDataURL(file); filereader.onloadend = function(upload) { From d61507a799b0fdf7fd9620226601bdc5372aa7d4 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 21 Nov 2012 13:01:41 +0100 Subject: [PATCH 16/16] [IMP] adaptation to hr demo data bzr revid: fme@openerp.com-20121121120141-zxj96k7ch8j2xqk7 --- addons/hr/hr_demo.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/hr/hr_demo.xml b/addons/hr/hr_demo.xml index 914f373d02a..14e4a7f5da2 100644 --- a/addons/hr/hr_demo.xml +++ b/addons/hr/hr_demo.xml @@ -184,6 +184,7 @@ Grand-Rosière +3281813700 fme@openerp.com + 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