From 68f0397609d3fbc68318a10712b18b7f968c9870 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 17 Dec 2013 16:02:11 +0100 Subject: [PATCH 1/3] [IMP] preload all objects bzr revid: fme@openerp.com-20131217150211-zquu7nn05g23m4r4 --- addons/website_crm_partner_assign/controllers/main.py | 1 + addons/website_customer/controllers/main.py | 2 ++ addons/website_event_track/controllers/event.py | 7 +++++++ addons/website_membership/controllers/main.py | 1 + addons/website_partner/controllers/main.py | 1 + 5 files changed, 12 insertions(+) diff --git a/addons/website_crm_partner_assign/controllers/main.py b/addons/website_crm_partner_assign/controllers/main.py index 50ad1e26519..f8e84d912fd 100644 --- a/addons/website_crm_partner_assign/controllers/main.py +++ b/addons/website_crm_partner_assign/controllers/main.py @@ -93,6 +93,7 @@ class WebsiteCrmPartnerAssign(http.Controller): @website.route(['/partners//'], type='http', auth="public", multilang=True) def partners_ref(self, partner, **post): + website.preload_records(partner) values = website_partner.get_partner_template_value(partner) if not values: return self.partners(**post) diff --git a/addons/website_customer/controllers/main.py b/addons/website_customer/controllers/main.py index d0663dfdfdc..a4dd4aa00f5 100644 --- a/addons/website_customer/controllers/main.py +++ b/addons/website_customer/controllers/main.py @@ -19,6 +19,7 @@ class WebsiteCustomer(http.Controller): '/customers/country//page//' ], type='http', auth="public", multilang=True) def customers(self, country=None, page=0, **post): + website.preload_records(country) cr, uid, context = request.cr, request.uid, request.context partner_obj = request.registry['res.partner'] partner_name = post.get('search', '') @@ -76,6 +77,7 @@ class WebsiteCustomer(http.Controller): @website.route(['/customers//'], type='http', auth="public", multilang=True) def customer(self, partner, **post): + website.preload_records(partner) values = website_partner.get_partner_template_value(partner) if not values: return self.customers(**post) diff --git a/addons/website_event_track/controllers/event.py b/addons/website_event_track/controllers/event.py index 22e4c1501a9..4ca9cfa4280 100644 --- a/addons/website_event_track/controllers/event.py +++ b/addons/website_event_track/controllers/event.py @@ -31,6 +31,8 @@ class website_event(http.Controller): @website.route(['/event//track/'], type='http', auth="public", multilang=True) def event_track_view(self, event, track, **post): # TODO: not implemented + website.preload_records(event, on_error="website_event.404") + website.preload_records(track) values = { 'track': track, 'event': track.event_id, 'main_object': track } return request.website.render("website_event_track.track_view", values) @@ -39,6 +41,8 @@ class website_event(http.Controller): '/event//track/tag/' ], type='http', auth="public", multilang=True) def event_tracks(self, event, tag=None, **post): + website.preload_records(event, on_error="website_event.404") + website.preload_records(tag) searches = {} if tag: @@ -65,15 +69,18 @@ class website_event(http.Controller): @website.route(['/event/detail/'], type='http', auth="public", multilang=True) def event_detail(self, event, **post): + website.preload_records(event, on_error="website_event.404") values = { 'event': event, 'main_object': event } return request.website.render("website_event_track.event_home", values) @website.route(['/event//track_proposal/'], type='http', auth="public", multilang=True) def event_track_proposal(self, event, **post): + website.preload_records(event, on_error="website_event.404") values = { 'event': event } return request.website.render("website_event_track.event_track_proposal", values) @website.route(['/event//track_proposal/success/'], type='http', auth="public", multilang=True) def event_track_proposal_success(self, event, **post): + website.preload_records(event, on_error="website_event.404") values = { 'event': event } return request.website.render("website_event_track.event_track_proposal_success", values) diff --git a/addons/website_membership/controllers/main.py b/addons/website_membership/controllers/main.py index 6985d4449f2..98a7654c71a 100644 --- a/addons/website_membership/controllers/main.py +++ b/addons/website_membership/controllers/main.py @@ -84,6 +84,7 @@ class WebsiteMembership(http.Controller): @website.route(['/members//'], type='http', auth="public", multilang=True) def partners_ref(self, partner, **post): + website.preload_records(partner) values = website_partner.get_partner_template_value(partner) if not values: return self.members(**post) diff --git a/addons/website_partner/controllers/main.py b/addons/website_partner/controllers/main.py index eab8ef92306..6a246883df6 100644 --- a/addons/website_partner/controllers/main.py +++ b/addons/website_partner/controllers/main.py @@ -36,6 +36,7 @@ class WebsitePartner(http.Controller): @website.route(['/partners//'], type='http', auth="public", multilang=True) def partner(self, partner, **post): """ Route for displaying a single partner / customer. """ + website.preload_records(partner) values = get_partner_template_value(partner) if not values: raise werkzeug.exceptions.NotFound From 128f1e1281a640d21cb4ef7b587f66fdffc4ce7f Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 17 Dec 2013 16:37:51 +0100 Subject: [PATCH 2/3] [FIX] odd behavior in cke widgets in "block-level" widgets (divs), when hitting [return] instead of adding a newline in the widget a new bit of widget may be added. This is caused by an incompability between widgets and the enterKey plugin. Remove enterKey, behavior on [Return] is slightly worse (always inserts br) but widgets don't get broken. See https://dev.ckeditor.com/ticket/11326 for issue in upstream. bzr revid: xmo@openerp.com-20131217153751-7fbwp34o8kac9x94 --- addons/website/static/src/js/website.editor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/website/static/src/js/website.editor.js b/addons/website/static/src/js/website.editor.js index 1e3ef0da66a..c7c5620c9a4 100644 --- a/addons/website/static/src/js/website.editor.js +++ b/addons/website/static/src/js/website.editor.js @@ -859,7 +859,7 @@ var plugins = [ 'a11yhelp', 'basicstyles', 'blockquote', 'clipboard', 'colorbutton', 'colordialog', 'dialogadvtab', - 'elementspath', 'enterkey', 'entities', 'filebrowser', + 'elementspath', /*'enterkey',*/ 'entities', 'filebrowser', 'find', 'floatingspace','format', 'htmlwriter', 'iframe', 'indentblock', 'indentlist', 'justify', 'list', 'pastefromword', 'pastetext', 'preview', From 90a9e522f3190a314fca289066943f312cd637f3 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 18 Dec 2013 12:49:01 +0100 Subject: [PATCH 3/3] [ADD] placeholder support on t-field A placeholder is looked up: 1. in the field's options ("placeholder") 2. on the t-field node itself (@placeholder) 3. on the field's column (.placeholder) The first one found is used as the @placeholder of the resulting node (in-HTML), and displayed when the field is empty and unfocused. If no placeholder is found, an empty field just gets a small padding in order to be easier to see & focus. bzr revid: xmo@openerp.com-20131218114901-xi3ye11x5pysq2a2 --- addons/website/models/ir_qweb.py | 11 ++++++++++- addons/website/static/src/css/editor.css | 8 +++++++- addons/website/static/src/css/editor.sass | 15 ++++++++++++--- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/addons/website/models/ir_qweb.py b/addons/website/models/ir_qweb.py index ea982bbe563..64a374119fa 100644 --- a/addons/website/models/ir_qweb.py +++ b/addons/website/models/ir_qweb.py @@ -73,12 +73,21 @@ class Field(orm.AbstractModel): def attributes(self, cr, uid, field_name, record, options, source_element, g_att, t_att, qweb_context, context=None): + if options is None: options = {} column = record._model._all_columns[field_name].column + attrs = [('data-oe-translate', 1 if column.translate else 0)] + + placeholder = options.get('placeholder') \ + or source_element.getAttribute('placeholder') \ + or getattr(column, 'placeholder', None) + if placeholder: + attrs.append(('placeholder', placeholder)) + return itertools.chain( super(Field, self).attributes(cr, uid, field_name, record, options, source_element, g_att, t_att, qweb_context, context=context), - [('data-oe-translate', 1 if column.translate else 0)] + attrs ) def value_from_string(self, value): diff --git a/addons/website/static/src/css/editor.css b/addons/website/static/src/css/editor.css index e40d6996850..e21bfc1fbe8 100644 --- a/addons/website/static/src/css/editor.css +++ b/addons/website/static/src/css/editor.css @@ -211,9 +211,15 @@ ul.oe_menu_editor .disclose { } .cke_widget_editable:empty:after { - content: " "; + opacity: 0.3; white-space: pre-wrap; } +.cke_widget_editable:not([placeholder]):empty::after { + content: " "; +} +.cke_widget_editable[placeholder]:not(:focus):empty::after { + content: attr(placeholder); +} .oe_carlos_danger { outline: 1px solid red !important; diff --git a/addons/website/static/src/css/editor.sass b/addons/website/static/src/css/editor.sass index 38b1d9f3436..ff62f416d8d 100644 --- a/addons/website/static/src/css/editor.sass +++ b/addons/website/static/src/css/editor.sass @@ -171,11 +171,20 @@ ul.oe_menu_editor // Breaks completely horribly crazy products listing page, so take it out. .cke_widget_wrapper position: static !important + // prevent inline widgets from entirely disappearing when their (textual) // content is removed -.cke_widget_editable:empty:after - content: " " - white-space: pre-wrap +.cke_widget_editable + // basic config + &:empty:after + opacity: 0.3 + white-space: pre-wrap + // no @placeholder -> just add some padding + &:not([placeholder]):empty::after + content: " " + // with placeholder and when not (yet) focused -> display placeholder + &[placeholder]:not(:focus):empty::after + content: attr(placeholder) .oe_carlos_danger outline: 1px solid red !important