From 6c8db2ce6880eb23c2f3675731a12a7788986314 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Tue, 6 May 2014 16:51:45 +0200 Subject: [PATCH 01/13] [ADD] mass_mailing: add a snippet to allow subscribing to a contact list (newsletter) bzr revid: tde@openerp.com-20140506145145-qvncr41sdmplc0bp --- addons/mass_mailing/__openerp__.py | 2 + addons/mass_mailing/controllers/main.py | 32 +++++++++++ .../src/js/website_mass_mailing.editor.js | 40 +++++++++++++ .../static/src/js/website_mass_mailing.js | 57 +++++++++++++++++++ addons/mass_mailing/views/snippets.xml | 44 ++++++++++++++ .../views/website_mass_mailing.xml | 14 +++++ 6 files changed, 189 insertions(+) create mode 100644 addons/mass_mailing/static/src/js/website_mass_mailing.editor.js create mode 100644 addons/mass_mailing/static/src/js/website_mass_mailing.js create mode 100644 addons/mass_mailing/views/snippets.xml create mode 100644 addons/mass_mailing/views/website_mass_mailing.xml diff --git a/addons/mass_mailing/__openerp__.py b/addons/mass_mailing/__openerp__.py index 91b57ac5b5a..8b367439cf3 100644 --- a/addons/mass_mailing/__openerp__.py +++ b/addons/mass_mailing/__openerp__.py @@ -48,6 +48,8 @@ professional emails and reuse templates in a few clicks. 'views/res_config.xml', 'views/res_partner.xml', 'views/email_template.xml', + 'views/website_mass_mailing.xml', + 'views/snippets.xml', 'security/ir.model.access.csv', ], 'js': [ diff --git a/addons/mass_mailing/controllers/main.py b/addons/mass_mailing/controllers/main.py index 6a5f058cee5..935b51c612c 100644 --- a/addons/mass_mailing/controllers/main.py +++ b/addons/mass_mailing/controllers/main.py @@ -40,3 +40,35 @@ class MassMailController(http.Controller): if 'opt_out' in request.registry[mailing.mailing_model]._all_columns: request.registry[mailing.mailing_model].write(cr, SUPERUSER_ID, record_ids, {'opt_out': True}, context=context) return 'OK' + + @http.route(['/website_mass_mailing/is_subscriber'], type='json', auth="public", website=True) + def is_subscriber(self, list_id, **post): + cr, uid, context = request.cr, request.uid, request.context + Contacts = request.registry['mail.mass_mailing.contact'] + Users = request.registry['res.users'] + + public_id = request.registry['website'].get_public_user(cr, uid, context) + is_subscriber = False + email = None + if uid != public_id: + email = Users.browse(cr, SUPERUSER_ID, uid, context).email + elif request.session.get('mass_mailing_email'): + email = request.session['mass_mailing_email'] + + if email: + contact_ids = Contacts.search(cr, SUPERUSER_ID, [('list_id', '=', int(list_id)), ('email', '=', email)], context=context) + is_subscriber = len(contact_ids) > 0 + + return {'is_subscriber': is_subscriber, 'email': email} + + @http.route(['/website_mass_mailing/subscribe'], type='json', auth="public", website=True) + def subscribe(self, list_id, email, **post): + cr, uid, context = request.cr, request.uid, request.context + Contacts = request.registry['mail.mass_mailing.contact'] + + contact_ids = Contacts.search(cr, SUPERUSER_ID, [('list_id', '=', int(list_id)), ('email', '=', email)], context=context) + if not contact_ids: + Contacts.name_create(cr, SUPERUSER_ID, email, context=context) + # add email to session + request.session['mass_mailing_email'] = email + return True diff --git a/addons/mass_mailing/static/src/js/website_mass_mailing.editor.js b/addons/mass_mailing/static/src/js/website_mass_mailing.editor.js new file mode 100644 index 00000000000..2f5a484320c --- /dev/null +++ b/addons/mass_mailing/static/src/js/website_mass_mailing.editor.js @@ -0,0 +1,40 @@ +(function () { + 'use strict'; + + var website = openerp.website; + var _t = openerp._t; + + website.snippet.options.mailing_list_subscribe = website.snippet.Option.extend({ + on_prompt: function () { + var self = this; + return website.prompt({ + id: "editor_new_mailing_list_subscribe_button", + window_title: _t("Add a Newsletter Subscribe Button"), + select: _t("Mailing List"), + init: function (field) { + return website.session.model('mail.mass_mailing.list') + .call('name_search', ['', []], { context: website.get_context() }); + }, + }).then(function (mailing_list_id) { + self.$target.attr("data-list-id", mailing_list_id); + }); + }, + drop_and_build_snippet: function() { + var self = this; + this._super(); + this.on_prompt().fail(function () { + self.editor.on_remove(); + }); + }, + start : function () { + var self = this; + this.$el.find(".js_mailing_list").on("click", _.bind(this.on_prompt, this)); + this._super(); + }, + clean_for_save: function () { + this.$target.addClass("hidden"); + }, + }); +})(); + + diff --git a/addons/mass_mailing/static/src/js/website_mass_mailing.js b/addons/mass_mailing/static/src/js/website_mass_mailing.js new file mode 100644 index 00000000000..5776fadfb3f --- /dev/null +++ b/addons/mass_mailing/static/src/js/website_mass_mailing.js @@ -0,0 +1,57 @@ +(function () { + 'use strict'; + + var website = openerp.website; + + website.snippet.animationRegistry.subscribe = website.snippet.Animation.extend({ + selector: ".js_subscribe", + start: function (editable_mode) { + var self = this; + + // set value and display button + self.$target.find("input").removeClass("hidden"); + openerp.jsonRpc('/website_mass_mailing/is_subscriber', 'call', { + list_id: this.$target.data('list-id'), + }).always(function (data) { + self.$target.find('input.js_subscribe_email') + .val(data.email ? data.email : "") + .attr("disabled", data.is_subscriber && data.email.length ? "disabled" : false); + self.$target.attr("data-subscribe", data.is_subscriber ? 'on' : 'off'); + self.$target.find('a.js_subscribe_btn') + .val(data.email ? data.email : "") + .attr("disabled", data.is_subscriber && data.email.length ? "disabled" : false); + self.$target.removeClass("hidden"); + }); + + // not if editable mode to allow designer to edit alert field + if (!editable_mode) { + $('.js_subscribe > .alert').addClass("hidden"); + $('.js_subscribe > .input-group-btn.hidden').removeClass("hidden"); + this.$target.find('.js_subscribe_btn').on('click', function (event) { + event.preventDefault(); + self.on_click(); + }); + } + }, + on_click: function () { + var self = this; + var $email = this.$target.find(".js_subscribe_email:visible"); + + if ($email.length && !$email.val().match(/.+@.+/)) { + this.$target.addClass('has-error'); + return false; + } + this.$target.removeClass('has-error'); + + openerp.jsonRpc('/website_mass_mailing/subscribe', 'call', { + 'list_id': this.$target.data('list-id'), + 'email': $email.length ? $email.val() : false, + }).then(function (subscribe) { + self.$target.find(".js_subscribe_email, .input-group-btn").addClass("hidden"); + self.$target.find(".alert").removeClass("hidden"); + self.$target.find('input.js_subscribe_email').attr("disabled", subscribe ? "disabled" : false); + self.$target.attr("data-subscribe", subscribe ? 'on' : 'off'); + }); + }, + }); +})(); diff --git a/addons/mass_mailing/views/snippets.xml b/addons/mass_mailing/views/snippets.xml new file mode 100644 index 00000000000..c8feb48be9e --- /dev/null +++ b/addons/mass_mailing/views/snippets.xml @@ -0,0 +1,44 @@ + + + + + + + + diff --git a/addons/mass_mailing/views/website_mass_mailing.xml b/addons/mass_mailing/views/website_mass_mailing.xml new file mode 100644 index 00000000000..bc55f61400c --- /dev/null +++ b/addons/mass_mailing/views/website_mass_mailing.xml @@ -0,0 +1,14 @@ + + + + + + + + From 59b9344babaacfbf345ad48df495dc839bd0779c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 7 May 2014 11:00:29 +0200 Subject: [PATCH 02/13] [IMP] website_mail, mass_mailing: icon in editor for the snippets + renaming bzr revid: tde@openerp.com-20140507090029-fh312buk013t1gdp --- .../static/src/img/blocks/button_newsletter.png | Bin 0 -> 4178 bytes addons/mass_mailing/views/snippets.xml | 4 ++-- .../src/img/blocks/button_group_subscribe.png | Bin 0 -> 2726 bytes addons/website_mail/views/snippets.xml | 4 ++-- 4 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 addons/mass_mailing/static/src/img/blocks/button_newsletter.png create mode 100644 addons/website_mail/static/src/img/blocks/button_group_subscribe.png diff --git a/addons/mass_mailing/static/src/img/blocks/button_newsletter.png b/addons/mass_mailing/static/src/img/blocks/button_newsletter.png new file mode 100644 index 0000000000000000000000000000000000000000..46a63ef9b0021b83e9c25c575f2cb621e09c39e1 GIT binary patch literal 4178 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 literal 0 HcmV?d00001 diff --git a/addons/mass_mailing/views/snippets.xml b/addons/mass_mailing/views/snippets.xml index c8feb48be9e..cefe2e7bdfd 100644 --- a/addons/mass_mailing/views/snippets.xml +++ b/addons/mass_mailing/views/snippets.xml @@ -7,8 +7,8 @@
- - Subscribe to Newsletter + + Newsletter
#O(P_uh1UO@bf@(8=}}F4^OZ z5F+oB5YlPa)jJaaLI^nLojSmt49MRwy`vNV``|p!gJoH;EDMaWUJr`z`yhlMFE0(PsFmvWi2?Ap*qj_l;AcPP+ zc<=yg)~rD!5&)VZ(;u{Q2`4 z%}JYp1VMm!JdU!mGDM?MIF2J%K=M~9rQn>Sxw%;mvNwB(VHof{54x@+6biKnh^A?9 z90#*z&BEcshdU>SEMLAHA3l5l=Nx%?d9ZC8hGEFKX;~IVjvR^7(o&2bJsQzyG$-G4cgX^ zoIQIMx~`|Kc*8JITwIJ>w{D@hxcINM5&lb_!WhG*O`EW1&mLKeiLQl+BrjjS#HUZ6 zvIC^HwpOx=WcvH##}8b;ejUE=OE7YU@}^B<65TB?FUPWF%Mb)XS|MoLHtyWHlN})O zcs!+%<~R-*V_3a76!UdV+mACwBj4?DcG~oUF_i1_7bzKY^G$=bj#*7)0mNO`& zxOVLt9zJ}SvWH#S|Gi_=rcF`{CE0A-#-c@wvIAt=v}sbJNrWp(DI$>wHf-2{y1F`e zo+pLP1WnH55Z;%Z3|m@tf>^ZY`hWA_oXc^0o+l@N_wLIMG z4v>{AS4y#f-)SA^9E%n$LQPFg$^gVB(YB7{oRmqT6f7mv>;KI|sKhyrBfX)bq5>B$ zUQ7w^Li2=kjs*)ApkKd!t>0@VYC!APua^=V$)a7lu7fcK+qPkvCZf?O#*Q6}yu7@O z+`GKI95ZIjfaiIwik?}Pg&#kD;KGFq`26{Ew@V0$1>$)g;_)~d8X6Ff$5BvFkS3=g z@rW`%$++Ilv1e?m7MH_>xzN4hqDhIIuw^KU6SWSog=QL z>pJ%B+lOPvjv*S2%23f0=&cAt$@e3?K?uM3zK@?je`3p)EvT%lY%?mf35bY)@7}$` z;>C**3WcQnP-j%Lgb*xPumHPu?SkvN2!%ot7){gg3w2maQ5A_MtG(#$D_8k7Asb)kR4vbFfwD5?a}QO zY)FI;&N<$^d4tQBFQc}$7LOl4#@n}VTh#d=gkaF1K^QV*2%4IjQrMDh+j#!`x%?eM z2ue#!C36wi^E?lXF?{&&0hVQTTa#1h@D>#nVfgUjm^^thmM&e22@@uuxVSiloV1H9 zwCC*zf9mv#+91=K;^fJb*uQ^&TGKKJ0*o6s4ku2W0OuU{@88GTwQCU$hY=2k<@Zg~ zL`g{r&Ye5gBNI9y1eRsNG)*wZ+O1(s+Z*=<0D@^HSMQl%yKvz`Boc`f+DIvdVHkMz z>Xl?)M~)nk0{0@+{rdF_jg5`iyLYb)SKZxa{}UC?&(8;d4hc%P3y_wyX){gkK@gz0 zxEN(+WoaHI{`|Ui>lQfYsI9GqVHgO9!_osy(?k#i7&dHJx6|J?6{0 zswzpRf9LNOLLx(V6zyLHiH^Z{56eYXu+qc7U95{~CE7j~s(8YHp=->3|)8Tm@ z^78WFx~^1XQX&N?f-V9yW;kvFY5IN^kx?4!E z3c76=1_lls*sH&=Q3e`Q_rpix@R(RIh%(qRTx*gsfOB zhWYd7!!QgPmRd`Y`T6<19*iyrL_AI;D*tus*1>TcG&eW5`Q6IO$`-3+6|y?XeBZ~2 z5hKvAU%ytL^-3fXvPS9c*6ojy?%cUkw%l6^bJM0x17j>FM4P)65Y9O&Dk|{h%NIHM z!c&spEUYJg@yR~^(&q~e=fZv7j)*kJ!A
- - Subscribe Button + + Discussion Group
Date: Thu, 8 May 2014 10:39:48 +0200 Subject: [PATCH 03/13] [FIX] account_analytic_analysis: revert method signature change made at rev 9277 The additional parameters were made to avoid overwriting values when changing of template. As we can not add parameters in only one module, we overwrite values only for not saved records. This mitigates the overwrite while not changing the API. bzr revid: mat@openerp.com-20140508083948-gkk7d1250a8znhlt --- .../account_analytic_analysis.py | 9 ++++----- .../account_analytic_analysis_view.xml | 3 --- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/addons/account_analytic_analysis/account_analytic_analysis.py b/addons/account_analytic_analysis/account_analytic_analysis.py index 6c71f940e8a..785d7cd6db0 100644 --- a/addons/account_analytic_analysis/account_analytic_analysis.py +++ b/addons/account_analytic_analysis/account_analytic_analysis.py @@ -542,18 +542,17 @@ class account_analytic_account(osv.osv): 'nodestroy': True, } - def on_change_template(self, cr, uid, ids, template_id, date_start=False, fix_price_invoices=False, invoice_on_timesheets=False, recurring_invoices=False, context=None): + def on_change_template(self, cr, uid, ids, template_id, date_start=False, context=None): if not template_id: return {} - obj_analytic_line = self.pool.get('account.analytic.invoice.line') res = super(account_analytic_account, self).on_change_template(cr, uid, ids, template_id, date_start=date_start, context=context) template = self.browse(cr, uid, template_id, context=context) - if not fix_price_invoices: + if not ids: res['value']['fix_price_invoices'] = template.fix_price_invoices res['value']['amount_max'] = template.amount_max - if not invoice_on_timesheets: + if not ids: res['value']['invoice_on_timesheets'] = template.invoice_on_timesheets res['value']['hours_qtt_est'] = template.hours_qtt_est @@ -561,7 +560,7 @@ class account_analytic_account(osv.osv): res['value']['to_invoice'] = template.to_invoice.id if template.pricelist_id.id: res['value']['pricelist_id'] = template.pricelist_id.id - if not recurring_invoices: + if not ids: invoice_line_ids = [] for x in template.recurring_invoice_line_ids: invoice_line_ids.append((0, 0, { diff --git a/addons/account_analytic_analysis/account_analytic_analysis_view.xml b/addons/account_analytic_analysis/account_analytic_analysis_view.xml index 97fb15e9290..a6fe828926a 100644 --- a/addons/account_analytic_analysis/account_analytic_analysis_view.xml +++ b/addons/account_analytic_analysis/account_analytic_analysis_view.xml @@ -38,9 +38,6 @@ {'required': [('type','=','contract'),'|','|',('fix_price_invoices','=',True), ('invoice_on_timesheets', '=', True), ('recurring_invoices', '=', True)]} - - on_change_template(template_id, date_start, fix_price_invoices, invoice_on_timesheets, recurring_invoices) - From dee000be14fd55f7d287eee8569f769505f339ac Mon Sep 17 00:00:00 2001 From: Cedric Snauwaert Date: Fri, 9 May 2014 11:48:36 +0200 Subject: [PATCH 04/13] [FIX]modal: when closing a modal, focus previous one to allow several escape hit key bzr revid: csn@openerp.com-20140509094836-yhncaqp60od67w7k --- addons/web/static/src/js/chrome.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js index fca55957fd7..80851395520 100644 --- a/addons/web/static/src/js/chrome.js +++ b/addons/web/static/src/js/chrome.js @@ -46,6 +46,8 @@ instance.web.Notification = instance.web.Widget.extend({ } }); +var opened_modal = []; + instance.web.action_notify = function(element, action) { element.do_notify(action.params.title, action.params.text, action.params.sticky); }; @@ -113,6 +115,8 @@ instance.web.Dialog = instance.web.Widget.extend({ this.init_dialog(); } this.$buttons.insertAfter(this.$dialog_box.find(".modal-body")); + //add to list of currently opened modal + opened_modal.push(this.$dialog_box); return this; }, _add_buttons: function(buttons) { @@ -212,9 +216,13 @@ instance.web.Dialog = instance.web.Widget.extend({ //we need this to put the instruction to remove modal from DOM at the end //of the queue, otherwise it might already have been removed before the modal-backdrop //is removed when pressing escape key - var $parent = this.$el.parents('.modal'); setTimeout(function () { - $parent.remove(); + //remove last modal from list of opened modal since we just destroy it + opened_modal.pop().remove(); + if (opened_modal.length > 0){ + //we still have other opened modal so we should focus it + opened_modal[opened_modal.length-1].focus() + } },0); } this._super(); From 67fb735b50b109dacbba9cf378806f1b74e8be37 Mon Sep 17 00:00:00 2001 From: Kersten Jeremy Date: Fri, 9 May 2014 14:18:27 +0200 Subject: [PATCH 05/13] [FIX] Event - Allow to specify the timezone from the event and use it in template mail. bzr revid: jke@openerp.com-20140509121827-3ngkf93jhduobcoa --- addons/event/email_template.xml | 2 +- addons/event/event.py | 27 +++++++++++++++++++++++++-- addons/event/event_view.xml | 1 + 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/addons/event/email_template.xml b/addons/event/email_template.xml index d99774acd3c..d4479bcfc87 100644 --- a/addons/event/email_template.xml +++ b/addons/event/email_template.xml @@ -9,7 +9,7 @@ Your registration at ${object.event_id.name} Hello ${object.name},

-

The event ${object.event_id.name} that you registered for is confirmed and will be held from ${object.event_id.date_begin} to ${object.event_id.date_end}. +

The event ${object.event_id.name} that you registered for is confirmed and will be held from ${object.event_id.date_begin_located.strftime('%Y-%m-%d %H:%M:%S (%Z)')} to ${object.event_id.date_end_located.strftime('%Y-%m-%d %H:%M:%S (%Z)')}. For any further information please contact our event department.

Thank you for your participation!

Best regards

]]>
diff --git a/addons/event/event.py b/addons/event/event.py index 37efedf2549..9d86b6cc4e3 100644 --- a/addons/event/event.py +++ b/addons/event/event.py @@ -18,7 +18,8 @@ # along with this program. If not, see . # ############################################################################## - +import pytz +from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT from datetime import datetime, timedelta from openerp.osv import fields, osv from openerp.tools.translate import _ @@ -150,6 +151,24 @@ class event_event(osv.osv): continue return res + def _compute_date_tz(self, cr, uid, ids, fld, arg, context=None): + if context is None: + context = {} + res = {} + + print ids + for event in self.browse(cr, uid, ids, context=context): + res[event.id] = {} + context['tz'] = event.date_tz or 'UTC' + if fld == 'date_begin_located': + res[event.id] = fields.datetime.context_timestamp(cr, uid, datetime.strptime(event.date_begin, DEFAULT_SERVER_DATETIME_FORMAT), context=context) + elif fld == 'date_end_located': + res[event.id] = fields.datetime.context_timestamp(cr, uid, datetime.strptime(event.date_end, DEFAULT_SERVER_DATETIME_FORMAT), context=context) + return res + + def _tz_get(self, cr, uid, context=None): + return [(x, x) for x in pytz.all_timezones] + _columns = { 'name': fields.char('Event Name', size=64, required=True, translate=True, readonly=False, states={'done': [('readonly', True)]}), 'user_id': fields.many2one('res.users', 'Responsible User', readonly=False, states={'done': [('readonly', True)]}), @@ -169,8 +188,11 @@ class event_event(osv.osv): store={'event.registration': (_get_events_from_registrations, ['state'], 10), 'event.event': (lambda self, cr, uid, ids, c = {}: ids, ['seats_max', 'registration_ids'], 20)}), 'registration_ids': fields.one2many('event.registration', 'event_id', 'Registrations', readonly=False, states={'done': [('readonly', True)]}), + 'date_tz': fields.selection(_tz_get, string='Timezone'), 'date_begin': fields.datetime('Start Date', required=True, readonly=True, states={'draft': [('readonly', False)]}), 'date_end': fields.datetime('End Date', required=True, readonly=True, states={'draft': [('readonly', False)]}), + 'date_begin_located': fields.function(_compute_date_tz, string='Start Date Located', type="datetime"), + 'date_end_located': fields.function(_compute_date_tz, string='End Date Located', type="datetime"), 'state': fields.selection([ ('draft', 'Unconfirmed'), ('cancel', 'Cancelled'), @@ -197,7 +219,8 @@ class event_event(osv.osv): 'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'event.event', context=c), 'user_id': lambda obj, cr, uid, context: uid, 'organizer_id': lambda self, cr, uid, c: self.pool.get('res.users').browse(cr, uid, uid, context=c).company_id.partner_id.id, - 'address_id': lambda self, cr, uid, c: self.pool.get('res.users').browse(cr, uid, uid, context=c).company_id.partner_id.id + 'address_id': lambda self, cr, uid, c: self.pool.get('res.users').browse(cr, uid, uid, context=c).company_id.partner_id.id, + 'date_tz': lambda self, cr, uid, ctx: ctx.get('tz', "UTC"), } def _check_seats_limit(self, cr, uid, ids, context=None): diff --git a/addons/event/event_view.xml b/addons/event/event_view.xml index 2cdb74bea5b..f608724c9a2 100644 --- a/addons/event/event_view.xml +++ b/addons/event/event_view.xml @@ -83,6 +83,7 @@ + From 0826340b8a761bec3ca5279a9537d8738f40ae1d Mon Sep 17 00:00:00 2001 From: Kersten Jeremy Date: Fri, 9 May 2014 14:31:21 +0200 Subject: [PATCH 06/13] [FIX] Event - Don't update the context but a copy when we recompute dates with the timezone specified for the event. bzr revid: jke@openerp.com-20140509123121-xchv133t7gh0e5nh --- addons/event/event.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/addons/event/event.py b/addons/event/event.py index 9d86b6cc4e3..8021cce19ae 100644 --- a/addons/event/event.py +++ b/addons/event/event.py @@ -155,15 +155,13 @@ class event_event(osv.osv): if context is None: context = {} res = {} - - print ids for event in self.browse(cr, uid, ids, context=context): - res[event.id] = {} - context['tz'] = event.date_tz or 'UTC' + ctx = dict(context, tz=(event.date_tz or 'UTC')) if fld == 'date_begin_located': - res[event.id] = fields.datetime.context_timestamp(cr, uid, datetime.strptime(event.date_begin, DEFAULT_SERVER_DATETIME_FORMAT), context=context) + date_to_convert = event.date_begin elif fld == 'date_end_located': - res[event.id] = fields.datetime.context_timestamp(cr, uid, datetime.strptime(event.date_end, DEFAULT_SERVER_DATETIME_FORMAT), context=context) + date_to_convert = event.date_end + res[event.id] = fields.datetime.context_timestamp(cr, uid, datetime.strptime(date_to_convert, DEFAULT_SERVER_DATETIME_FORMAT), context=ctx) return res def _tz_get(self, cr, uid, context=None): From da20dc9899ae5b1ac0c8aa670ac61dbb72acb784 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 9 May 2014 14:51:18 +0200 Subject: [PATCH 07/13] [IMP] website_mail: rename newsletter mail group to discussion group to avoid confusion with mass mailing mailing lists and newsletters. bzr revid: tde@openerp.com-20140509125118-obvdjkgreyiez8k9 --- addons/website_mail/data/mail_groups.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/website_mail/data/mail_groups.xml b/addons/website_mail/data/mail_groups.xml index 0bc8d3e81d1..b5d037ca866 100644 --- a/addons/website_mail/data/mail_groups.xml +++ b/addons/website_mail/data/mail_groups.xml @@ -3,9 +3,9 @@ - Newsletter + Discussion Group public - Public Newsletter. + Public Discussion Group From 4c4d610336cf020d729d7903f830ff6786997585 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 9 May 2014 14:53:58 +0200 Subject: [PATCH 08/13] [IMP] mass_mailing: added newsletter as mailing list data + imported contact still demo data bzr revid: tde@openerp.com-20140509125358-2kjc462ttrnxmpxm --- addons/mass_mailing/data/mass_mailing_data.xml | 5 +++++ addons/mass_mailing/data/mass_mailing_demo.xml | 8 ++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/addons/mass_mailing/data/mass_mailing_data.xml b/addons/mass_mailing/data/mass_mailing_data.xml index 6bd1df79a72..7137bfcf29b 100644 --- a/addons/mass_mailing/data/mass_mailing_data.xml +++ b/addons/mass_mailing/data/mass_mailing_data.xml @@ -33,5 +33,10 @@ 30 + + + Newsletter + + \ No newline at end of file diff --git a/addons/mass_mailing/data/mass_mailing_demo.xml b/addons/mass_mailing/data/mass_mailing_demo.xml index 569feec9c88..d5a84419f93 100644 --- a/addons/mass_mailing/data/mass_mailing_demo.xml +++ b/addons/mass_mailing/data/mass_mailing_demo.xml @@ -9,7 +9,7 @@ - + Imported Contacts @@ -17,17 +17,17 @@ Aristide Antario aa@example.com - + Beverly Bridge bb@example.com - + Carol Cartridge cc@example.com - + From 9e141c760c97af5a663ceacff4b7fdcfc5107acd Mon Sep 17 00:00:00 2001 From: Kersten Jeremy Date: Fri, 9 May 2014 15:12:03 +0200 Subject: [PATCH 09/13] [FIX] Kanban / Modal - Close the backdrop from dialog when we open the dialog for add a new column in kanban view. This bug was introduced since with use bootstrap modal bzr revid: jke@openerp.com-20140509131203-4gy3nhlj0v6fk7zv --- addons/web_kanban/static/src/js/kanban.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 1c87c453d7f..db4056167a7 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -205,10 +205,10 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ }); var am = instance.webclient.action_manager; var form = am.dialog_widget.views.form.controller; - form.on("on_button_cancel", am.dialog, am.dialog.close); + form.on("on_button_cancel", am.dialog, function() { return am.dialog.$dialog_box.modal('hide'); }); form.on('record_created', self, function(r) { (new instance.web.DataSet(self, self.group_by_field.relation)).name_get([r]).done(function(new_record) { - am.dialog.close(); + am.dialog.$dialog_box.modal('hide'); var domain = self.dataset.domain.slice(0); domain.push([self.group_by, '=', new_record[0][0]]); var dataset = new instance.web.DataSetSearch(self, self.dataset.model, self.dataset.get_context(), domain); From 6f60eb218f40e6048064f759e1bdc080fb2d60a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 9 May 2014 15:21:56 +0200 Subject: [PATCH 10/13] [IMP] subscribe to group / newsletter widgets: wording cleaning bzr revid: tde@openerp.com-20140509132156-qbmop9au07cllgkk --- .../mass_mailing/static/src/js/website_mass_mailing.editor.js | 2 +- addons/website_mail/static/src/js/website_mail.editor.js | 2 +- addons/website_mail/views/snippets.xml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/mass_mailing/static/src/js/website_mass_mailing.editor.js b/addons/mass_mailing/static/src/js/website_mass_mailing.editor.js index 2f5a484320c..4caba1d29b5 100644 --- a/addons/mass_mailing/static/src/js/website_mass_mailing.editor.js +++ b/addons/mass_mailing/static/src/js/website_mass_mailing.editor.js @@ -10,7 +10,7 @@ return website.prompt({ id: "editor_new_mailing_list_subscribe_button", window_title: _t("Add a Newsletter Subscribe Button"), - select: _t("Mailing List"), + select: _t("Newsletter"), init: function (field) { return website.session.model('mail.mass_mailing.list') .call('name_search', ['', []], { context: website.get_context() }); diff --git a/addons/website_mail/static/src/js/website_mail.editor.js b/addons/website_mail/static/src/js/website_mail.editor.js index 7a26920682b..fdfb948121f 100644 --- a/addons/website_mail/static/src/js/website_mail.editor.js +++ b/addons/website_mail/static/src/js/website_mail.editor.js @@ -10,7 +10,7 @@ return website.prompt({ id: "editor_new_subscribe_button", window_title: _t("Add a Subscribe Button"), - select: _t("Mailing List"), + select: _t("Discussion List"), init: function (field) { return website.session.model('mail.group') .call('name_search', ['', [['public','=','public']]], { context: website.get_context() }); diff --git a/addons/website_mail/views/snippets.xml b/addons/website_mail/views/snippets.xml index 3279fa216d2..c9f76ce4273 100644 --- a/addons/website_mail/views/snippets.xml +++ b/addons/website_mail/views/snippets.xml @@ -516,7 +516,7 @@ Unsubscribe Subscribe - +
@@ -529,7 +529,7 @@ data-selector-siblings="p, h1, h2, h3, blockquote, .well, .panel" >
  • - Change mailing list + Change Discussion List
  • From dab3557253968266786ffb999e43bc2c7943e569 Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Fri, 9 May 2014 15:44:34 +0200 Subject: [PATCH 11/13] [FIX] website_forum: correct the 'Editor' goal definition, the field author_id on a mail_message is a m2o to res.partner and not res.users bzr revid: mat@openerp.com-20140509134434-6u2ft2gyv0hcryxq --- addons/website_forum/data/badges_moderation.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/website_forum/data/badges_moderation.xml b/addons/website_forum/data/badges_moderation.xml index 41f3eb7fe41..8e3c1b3dda7 100644 --- a/addons/website_forum/data/badges_moderation.xml +++ b/addons/website_forum/data/badges_moderation.xml @@ -99,7 +99,7 @@ True - user.id + user.partner_id.id Editor From 69a93b07c7626fc0986498dff5951199be60b78d Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Fri, 9 May 2014 16:10:24 +0200 Subject: [PATCH 12/13] [MOV] ir.ui.view#write() forced noupdate moved in `website` (RTE only) bzr revid: fme@openerp.com-20140509141024-xa9mawoye3o8e6c1 --- addons/website/models/ir_ui_view.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/addons/website/models/ir_ui_view.py b/addons/website/models/ir_ui_view.py index f67f6ada4b9..f699e461402 100644 --- a/addons/website/models/ir_ui_view.py +++ b/addons/website/models/ir_ui_view.py @@ -6,6 +6,7 @@ import werkzeug from lxml import etree, html +from openerp import SUPERUSER_ID from openerp.addons.website.models import website from openerp.http import request from openerp.osv import osv, fields @@ -196,3 +197,7 @@ class view(osv.osv): self.write(cr, uid, res_id, { 'arch': self._pretty_arch(arch) }, context=context) + + view = self.browse(cr, uid, res_id, context=context) + if view.model_data_id: + self.pool.get('ir.model.data').write(cr, SUPERUSER_ID, view.model_data_id.id, {'noupdate': True}) From 501ad7abeb0ac40edd37bae46137d2ef5cab9cae Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Fri, 9 May 2014 17:18:55 +0200 Subject: [PATCH 13/13] [IMP] dumb code bzr revid: fme@openerp.com-20140509151855-7v4hp08qvmac1u2d --- addons/website/models/ir_ui_view.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/website/models/ir_ui_view.py b/addons/website/models/ir_ui_view.py index f699e461402..5648301deea 100644 --- a/addons/website/models/ir_ui_view.py +++ b/addons/website/models/ir_ui_view.py @@ -198,6 +198,6 @@ class view(osv.osv): 'arch': self._pretty_arch(arch) }, context=context) - view = self.browse(cr, uid, res_id, context=context) + view = self.browse(cr, SUPERUSER_ID, res_id, context=context) if view.model_data_id: - self.pool.get('ir.model.data').write(cr, SUPERUSER_ID, view.model_data_id.id, {'noupdate': True}) + view.model_data_id.write({'noupdate': True})