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)
-
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 5e5d1204a17..a31ec00b8c0 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 _
@@ -156,6 +157,22 @@ class event_event(osv.osv):
for event in self.browse(cr, uid, ids, context=context)
}
+ def _compute_date_tz(self, cr, uid, ids, fld, arg, context=None):
+ if context is None:
+ context = {}
+ res = {}
+ for event in self.browse(cr, uid, ids, context=context):
+ ctx = dict(context, tz=(event.date_tz or 'UTC'))
+ if fld == 'date_begin_located':
+ date_to_convert = event.date_begin
+ elif fld == 'date_end_located':
+ 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):
+ 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)]}),
@@ -175,8 +192,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'),
@@ -204,7 +224,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 cc6edfbd9bd..baa553babaf 100644
--- a/addons/event/event_view.xml
+++ b/addons/event/event_view.xml
@@ -89,6 +89,7 @@
+
diff --git a/addons/mass_mailing/__openerp__.py b/addons/mass_mailing/__openerp__.py
index e96cc910920..e0a8ab041fe 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',
'views/mass_mailing.xml',
],
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/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
-
+
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 00000000000..46a63ef9b00
Binary files /dev/null and b/addons/mass_mailing/static/src/img/blocks/button_newsletter.png differ
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..4caba1d29b5
--- /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("Newsletter"),
+ 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..cefe2e7bdfd
--- /dev/null
+++ b/addons/mass_mailing/views/snippets.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
Newsletter
+
+
+
+
+
+ Subscribe
+
+
Thanks for your subscription!
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/website/models/ir_ui_view.py b/addons/website/models/ir_ui_view.py
index 9d89665c56f..3f868e0d208 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
@@ -197,3 +198,7 @@ class view(osv.osv):
self.write(cr, uid, res_id, {
'arch': self._pretty_arch(arch)
}, context=context)
+
+ view = self.browse(cr, SUPERUSER_ID, res_id, context=context)
+ if view.model_data_id:
+ view.model_data_id.write({'noupdate': True})
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
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
diff --git a/addons/website_mail/static/src/img/blocks/button_group_subscribe.png b/addons/website_mail/static/src/img/blocks/button_group_subscribe.png
new file mode 100644
index 00000000000..204239a8e0c
Binary files /dev/null and b/addons/website_mail/static/src/img/blocks/button_group_subscribe.png differ
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 98a79393211..c9f76ce4273 100644
--- a/addons/website_mail/views/snippets.xml
+++ b/addons/website_mail/views/snippets.xml
@@ -499,8 +499,8 @@
-
-
Subscribe Button
+
+
Discussion Group
Unsubscribe
Subscribe
-
thanks for your subscription!
+
Thanks for your subscription!
@@ -529,7 +529,7 @@
data-selector-siblings="p, h1, h2, h3, blockquote, .well, .panel"
>
- Change mailing list
+ Change Discussion List