[IMP] sms: show characters count
This commit is contained in:
committed by
Rémi Rahir
parent
7895862584
commit
3c2d407dd6
@@ -14,6 +14,10 @@ The service is provided by the In App Purchase Odoo platform.
|
||||
'data': [
|
||||
'wizard/send_sms_views.xml',
|
||||
'views/res_partner_views.xml',
|
||||
'views/templates.xml',
|
||||
],
|
||||
'qweb': [
|
||||
'static/src/xml/sms_widget.xml',
|
||||
],
|
||||
'installable': True,
|
||||
'auto_install': True,
|
||||
|
||||
@@ -0,0 +1,120 @@
|
||||
odoo.define('sms.sms_widget', function (require) {
|
||||
"use strict";
|
||||
|
||||
var basicFields = require('web.basic_fields');
|
||||
var core = require('web.core');
|
||||
var fieldRegistry = require('web.field_registry');
|
||||
var framework = require('web.framework');
|
||||
|
||||
var FieldText = basicFields.FieldText;
|
||||
var QWeb = core.qweb;
|
||||
|
||||
/**
|
||||
* SmsWidget is a widget to display a textarea (the body) and a text representing
|
||||
* the number of SMS and the number of characters. This text is computed every
|
||||
* time the user changes the body.
|
||||
*/
|
||||
var SmsWidget = FieldText.extend({
|
||||
/**
|
||||
* @constructor
|
||||
*/
|
||||
init: function () {
|
||||
this._super.apply(this, arguments);
|
||||
this.nbrChar = 0;
|
||||
this.nbrSMS = 0;
|
||||
this.encoding = "GSM7";
|
||||
this.tagName = 'div';
|
||||
},
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Private
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Compute the number of characters and sms
|
||||
* @private
|
||||
*/
|
||||
_compute: function () {
|
||||
var content = this._getValue();
|
||||
this.encoding = this._extractEncoding(content);
|
||||
this.nbrChar = content.length;
|
||||
this.nbrChar += (content.match(/\n/g) || []).length;
|
||||
this.nbrSMS = this._countSMS(this.nbrChar, this.encoding);
|
||||
this._renderSMS();
|
||||
},
|
||||
/**
|
||||
* Count the number of SMS of the content
|
||||
* @private
|
||||
* @returns {integer} Number of SMS
|
||||
*/
|
||||
_countSMS: function () {
|
||||
if (this.nbrChar === 0) {
|
||||
return 0;
|
||||
}
|
||||
if (this.encoding === 'UNICODE') {
|
||||
if (this.nbrChar <= 70) {
|
||||
return 1;
|
||||
}
|
||||
return Math.ceil(this.nbrChar / 67);
|
||||
}
|
||||
if (this.nbrChar <= 160) {
|
||||
return 1;
|
||||
}
|
||||
return Math.ceil(this.nbrChar / 153);
|
||||
},
|
||||
/**
|
||||
* @private
|
||||
* @override
|
||||
*/
|
||||
_renderEdit: function () {
|
||||
this.$el.empty();
|
||||
this._prepareInput($('<textarea/>')).appendTo(this.$el);
|
||||
this.$el.append($(QWeb.render("sms.sms_count", {})));
|
||||
this._compute();
|
||||
},
|
||||
/**
|
||||
* Extract the encoding depending on the characters in the content
|
||||
* @private
|
||||
* @param {String} content Content of the SMS
|
||||
* @returns {String} Encoding of the content (GSM7 or UNICODE)
|
||||
*/
|
||||
_extractEncoding: function (content) {
|
||||
if (String(content).match(RegExp("^[@£$¥èéùìòÇ\\nØø\\rÅåΔ_ΦΓΛΩΠΨΣΘΞÆæßÉ !\\\"#¤%&'()*+,-./0123456789:;<=>?¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑܧ¿abcdefghijklmnopqrstuvwxyzäöñüà]*$"))) {
|
||||
return 'GSM7';
|
||||
}
|
||||
return 'UNICODE';
|
||||
},
|
||||
/**
|
||||
* Render the number of characters, sms and the encoding.
|
||||
* @private
|
||||
*/
|
||||
_renderSMS: function () {
|
||||
this.$('.o_sms_count').text(this.nbrChar + ' / ' + this.nbrSMS + ' SMS (' + this.encoding + ') ');
|
||||
},
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Handlers
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* @override
|
||||
* @private
|
||||
*/
|
||||
_onChange: function () {
|
||||
this._super.apply(this, arguments);
|
||||
this._compute();
|
||||
},
|
||||
/**
|
||||
* @override
|
||||
* @private
|
||||
*/
|
||||
_onInput: function () {
|
||||
this._super.apply(this, arguments);
|
||||
this._compute();
|
||||
},
|
||||
});
|
||||
|
||||
fieldRegistry.add('sms_widget', SmsWidget);
|
||||
|
||||
return SmsWidget;
|
||||
});
|
||||
@@ -0,0 +1,67 @@
|
||||
odoo.define('sms.sms_widget_tests', function (require) {
|
||||
"use strict";
|
||||
|
||||
var FormView = require('web.FormView');
|
||||
var testUtils = require('web.test_utils');
|
||||
|
||||
var createView = testUtils.createView;
|
||||
|
||||
QUnit.module('fields', {
|
||||
beforeEach: function () {
|
||||
this.data = {
|
||||
partner: {
|
||||
fields: {
|
||||
message: {string: "message", type: "text"},
|
||||
},
|
||||
records: [{
|
||||
id: 1,
|
||||
message: "",
|
||||
}]
|
||||
},
|
||||
};
|
||||
}
|
||||
}, function () {
|
||||
|
||||
QUnit.module('SmsWidget');
|
||||
|
||||
QUnit.test('Sms widgets are correctly rendered', function (assert) {
|
||||
assert.expect(9);
|
||||
var form = createView({
|
||||
View: FormView,
|
||||
model: 'partner',
|
||||
data: this.data,
|
||||
arch: '<form><sheet><field name="message" widget="sms_widget"/></sheet></form>',
|
||||
});
|
||||
form.$buttons.find('.o_form_button_edit').click();
|
||||
assert.ok(form.$('.o_sms_count').length, "Should have a sms counter");
|
||||
assert.strictEqual(form.$('.o_sms_count').text(), '0 / 0 SMS (GSM7) ', 'Should be "0 / 0 SMS (GSM7) " by default');
|
||||
// GSM-7
|
||||
form.$('.o_input').val("Hello from Odoo").trigger('input');
|
||||
assert.strictEqual(form.$('.o_sms_count').text(), '15 / 1 SMS (GSM7) ', 'Should be "15 / 1 SMS (GSM7) " for "Hello from Odoo"');
|
||||
// GSM-7 with \n => this one count as 2 characters
|
||||
form.$('.o_input').val("Hello from Odoo\n").trigger('input');
|
||||
assert.strictEqual(form.$('.o_sms_count').text(), '17 / 1 SMS (GSM7) ', 'Should be "17 / 1 SMS (GSM7) " for "Hello from Odoo\\n"');
|
||||
// Unicode => ê
|
||||
form.$('.o_input').val("Hêllo from Odoo").trigger('input');
|
||||
assert.strictEqual(form.$('.o_sms_count').text(), '15 / 1 SMS (UNICODE) ', 'Should be "15 / 1 SMS (UNICODE) " for "Hêllo from Odoo"');
|
||||
// GSM-7 with 160c
|
||||
var text = Array(161).join('a');
|
||||
form.$('.o_input').val(text).trigger('input');
|
||||
assert.strictEqual(form.$('.o_sms_count').text(), '160 / 1 SMS (GSM7) ', 'Should be "160 / 1 SMS (GSM7) " for 160 x "a"');
|
||||
// GSM-7 with 161c
|
||||
text = Array(162).join('a');
|
||||
form.$('.o_input').val(text).trigger('input');
|
||||
assert.strictEqual(form.$('.o_sms_count').text(), '161 / 2 SMS (GSM7) ', 'Should be "161 / 2 SMS (GSM7) " for 161 x "a"');
|
||||
// Unicode with 70c
|
||||
text = Array(71).join('ê');
|
||||
form.$('.o_input').val(text).trigger('input');
|
||||
assert.strictEqual(form.$('.o_sms_count').text(), '70 / 1 SMS (UNICODE) ', 'Should be "70 / 1 SMS (UNICODE) " for 70 x "ê"');
|
||||
// Unicode with 71c
|
||||
text = Array(72).join('ê');
|
||||
form.$('.o_input').val(text).trigger('input');
|
||||
assert.strictEqual(form.$('.o_sms_count').text(), '71 / 2 SMS (UNICODE) ', 'Should be "71 / 2 SMS (UNICODE) " for 71 x "ê"');
|
||||
|
||||
form.destroy();
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<templates>
|
||||
<t t-name="sms.sms_count">
|
||||
<span class="pull-right"><span class="text-muted o_sms_count"></span> <a href="https://iap-services.odoo.com/iap/sms/pricing" class="fa fa-lg fa-info"/></span>
|
||||
</t>
|
||||
</templates>
|
||||
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data>
|
||||
<template id="assets_backend" name="sms_assets" inherit_id="web.assets_backend">
|
||||
<xpath expr="." position="inside">
|
||||
<script type="text/javascript" src="/sms/static/src/js/sms_widget.js"></script>
|
||||
</xpath>
|
||||
</template>
|
||||
|
||||
<template id="qunit_suite" name="sms_widget_tests" inherit_id="web.qunit_suite">
|
||||
<xpath expr="." position="inside">
|
||||
<script type="text/javascript" src="/sms/static/src/tests/sms_widget_test.js"></script>
|
||||
</xpath>
|
||||
</template>
|
||||
</data>
|
||||
</odoo>
|
||||
@@ -71,8 +71,7 @@ class SendSMS(models.TransientModel):
|
||||
phone_numbers = []
|
||||
no_phone_partners = []
|
||||
for partner in partners:
|
||||
default_field_name = 'mobile' if partner.mobile else 'phone'
|
||||
number = self._sms_sanitization(partner, self.env.context.get('field_name') or default_field_name)
|
||||
number = self._sms_sanitization(partner, self.env.context.get('field_name') or 'mobile')
|
||||
if number:
|
||||
phone_numbers.append(number)
|
||||
else:
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<sheet>
|
||||
<group>
|
||||
<field name="recipients"/>
|
||||
<field name="message" widget="text"/>
|
||||
<field name="message" widget="sms_widget"/>
|
||||
</group>
|
||||
</sheet>
|
||||
<footer>
|
||||
|
||||
Reference in New Issue
Block a user