From f93e5310388a518c46ff94e3fc14a9e19188d780 Mon Sep 17 00:00:00 2001 From: cubells Date: Fri, 19 Apr 2019 19:25:21 +0200 Subject: [PATCH] [MIG] web_widget_digitized_signature: Migration to 11.0 --- web_widget_digitized_signature/README.rst | 82 ++-- web_widget_digitized_signature/__init__.py | 1 - .../__manifest__.py | 5 +- .../i18n/web_widget_digitized_signature.pot | 24 +- .../models/__init__.py | 1 - .../models/mail_thread.py | 1 - .../models/res_users.py | 8 +- .../readme/CONFIGURE.rst | 5 + .../readme/CONTRIBUTORS.rst | 4 + .../readme/DESCRIPTION.rst | 5 + .../readme/USAGE.rst | 3 + .../static/description/index.html | 448 ++++++++++++++++++ .../static/lib/jSignature/jSignatureCustom.js | 239 +++++----- .../static/src/js/digital_sign.js | 194 ++++---- .../static/src/xml/digital_sign.xml | 36 +- .../tests/__init__.py | 1 - .../tests/test_signature_tracking.py | 5 +- .../views/res_users_view.xml | 20 +- .../views/web_digital_sign_view.xml | 1 - 19 files changed, 811 insertions(+), 272 deletions(-) create mode 100644 web_widget_digitized_signature/readme/CONFIGURE.rst create mode 100644 web_widget_digitized_signature/readme/CONTRIBUTORS.rst create mode 100644 web_widget_digitized_signature/readme/DESCRIPTION.rst create mode 100644 web_widget_digitized_signature/readme/USAGE.rst create mode 100644 web_widget_digitized_signature/static/description/index.html diff --git a/web_widget_digitized_signature/README.rst b/web_widget_digitized_signature/README.rst index 471728f2..bca4c557 100644 --- a/web_widget_digitized_signature/README.rst +++ b/web_widget_digitized_signature/README.rst @@ -1,10 +1,29 @@ -.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg - :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html - :alt: License: AGPL-3 - -======================= -Web Digitized Signature -======================= +============================== +Web Widget Digitized Signature +============================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/11.0/web_widget_digitized_signature + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-11-0/web-11-0-web_widget_digitized_signature + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/162/11.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| This module provides a widget for binary fields that allows to digitize a signature and store it as an image. @@ -12,13 +31,19 @@ signature and store it as an image. As demonstration, it includes this widget at user level, so that we can store a signature image for each user. +**Table of contents** + +.. contents:: + :local: + Configuration ============= #. To use this module, you need to add ``widget="signature"`` to your binary field in your view. #. You can specifify signature dimensions like the following: - ```` + ```` Usage ===== @@ -27,44 +52,47 @@ Usage #. Open one of the existing users. #. You can set a digital signature for it on the field "Signature". - -.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas - :alt: Try me on Runbot - :target: https://runbot.odoo-community.org/runbot/162/10.0 - Bug Tracker =========== -Bugs are tracked on `GitHub Issues -`_. In case of trouble, please -check there if your issue has already been reported. If you spotted it first, -help us smashing it by providing a detailed and welcomed feedback. +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. Credits ======= -Images ------- +Authors +~~~~~~~ -* Odoo Community Association: `Icon `_. +* Serpent Consulting Services Pvt. Ltd. +* Agile Business Group +* Tecnativa Contributors ------------- +~~~~~~~~~~~~ * Jay Vora -* Vicent Cubells +* Tecnativa : -Maintainer ----------- + * Vicent Cubells + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. .. image:: https://odoo-community.org/logo.png :alt: Odoo Community Association :target: https://odoo-community.org -This module is maintained by the OCA. - OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -To contribute to this module, please visit https://odoo-community.org. +This module is part of the `OCA/web `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/web_widget_digitized_signature/__init__.py b/web_widget_digitized_signature/__init__.py index 96b2d789..063c0251 100644 --- a/web_widget_digitized_signature/__init__.py +++ b/web_widget_digitized_signature/__init__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2004-2010 OpenERP SA () # Copyright 2011-2015 Serpent Consulting Services Pvt. Ltd. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). diff --git a/web_widget_digitized_signature/__manifest__.py b/web_widget_digitized_signature/__manifest__.py index 9d97eeca..5ab784ff 100644 --- a/web_widget_digitized_signature/__manifest__.py +++ b/web_widget_digitized_signature/__manifest__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2004-2010 OpenERP SA () # Copyright 2011-2015 Serpent Consulting Services Pvt. Ltd. # Copyright 2017 Tecnativa - Vicent Cubells @@ -6,11 +5,12 @@ { "name": "Web Widget Digitized Signature", - "version": "10.0.0.1.0", + "version": "11.0.0.1.0", "author": "Serpent Consulting Services Pvt. Ltd., " "Agile Business Group, " "Tecnativa, " "Odoo Community Association (OCA)", + 'website': 'https://github.com/OCA/web', "license": "AGPL-3", "category": 'Web', 'depends': [ @@ -21,7 +21,6 @@ 'views/web_digital_sign_view.xml', 'views/res_users_view.xml', ], - 'website': 'http://www.serpentcs.com', 'qweb': [ 'static/src/xml/digital_sign.xml', ], diff --git a/web_widget_digitized_signature/i18n/web_widget_digitized_signature.pot b/web_widget_digitized_signature/i18n/web_widget_digitized_signature.pot index cf175089..f784b3f8 100644 --- a/web_widget_digitized_signature/i18n/web_widget_digitized_signature.pot +++ b/web_widget_digitized_signature/i18n/web_widget_digitized_signature.pot @@ -4,8 +4,10 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 10.0\n" +"Project-Id-Version: Odoo Server 11.0\n" "Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-04-19 08:29+0000\n" +"PO-Revision-Date: 2019-04-19 08:29+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -15,27 +17,27 @@ msgstr "" #. module: web_widget_digitized_signature #. openerp-web -#: code:addons/web_widget_digitized_signature/static/src/xml/digital_sign.xml:7 +#: code:addons/web_widget_digitized_signature/static/src/xml/digital_sign.xml:8 #, python-format msgid "Clear" msgstr "" #. module: web_widget_digitized_signature #. openerp-web -#: code:addons/web_widget_digitized_signature/static/src/js/digital_sign.js:81 +#: code:addons/web_widget_digitized_signature/static/src/js/digital_sign.js:99 #, python-format msgid "Could not display the selected image." msgstr "" #. module: web_widget_digitized_signature -#: code:addons/web_widget_digitized_signature/models/mail_thread.py:33 +#: code:addons/web_widget_digitized_signature/models/mail_thread.py:32 #, python-format msgid "Deletion date: %s" msgstr "" #. module: web_widget_digitized_signature #. openerp-web -#: code:addons/web_widget_digitized_signature/static/src/xml/digital_sign.xml:10 +#: code:addons/web_widget_digitized_signature/static/src/xml/digital_sign.xml:11 #, python-format msgid "Draw your signature" msgstr "" @@ -47,30 +49,32 @@ msgstr "" #. module: web_widget_digitized_signature #. openerp-web -#: code:addons/web_widget_digitized_signature/static/src/js/digital_sign.js:81 +#: code:addons/web_widget_digitized_signature/static/src/js/digital_sign.js:99 #, python-format msgid "Image" msgstr "" #. module: web_widget_digitized_signature -#: model:ir.model.fields,field_description:web_widget_digitized_signature.field_res_users_signature_image +#: model:ir.model.fields,field_description:web_widget_digitized_signature.field_res_users_digital_signature +#: model:ir.ui.view,arch_db:web_widget_digitized_signature.inherited_res_users_form +#: model:ir.ui.view,arch_db:web_widget_digitized_signature.inherited_res_users_preferences_form msgid "Signature" msgstr "" #. module: web_widget_digitized_signature -#: code:addons/web_widget_digitized_signature/models/mail_thread.py:30 +#: code:addons/web_widget_digitized_signature/models/mail_thread.py:29 #, python-format msgid "Signature date: %s" msgstr "" #. module: web_widget_digitized_signature -#: code:addons/web_widget_digitized_signature/models/mail_thread.py:28 +#: code:addons/web_widget_digitized_signature/models/mail_thread.py:27 #, python-format msgid "Signature has been created." msgstr "" #. module: web_widget_digitized_signature -#: code:addons/web_widget_digitized_signature/models/mail_thread.py:32 +#: code:addons/web_widget_digitized_signature/models/mail_thread.py:31 #, python-format msgid "Signature has been deleted." msgstr "" diff --git a/web_widget_digitized_signature/models/__init__.py b/web_widget_digitized_signature/models/__init__.py index 3f2b1438..68301ad2 100644 --- a/web_widget_digitized_signature/models/__init__.py +++ b/web_widget_digitized_signature/models/__init__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2004-2010 OpenERP SA () # Copyright 2011-2015 Serpent Consulting Services Pvt. Ltd. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). diff --git a/web_widget_digitized_signature/models/mail_thread.py b/web_widget_digitized_signature/models/mail_thread.py index b6c3ce5d..5f4fa107 100644 --- a/web_widget_digitized_signature/models/mail_thread.py +++ b/web_widget_digitized_signature/models/mail_thread.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2004-2010 OpenERP SA () # Copyright 2011-2015 Serpent Consulting Services Pvt. Ltd. # Copyright 2017 Tecnativa - Vicent Cubells diff --git a/web_widget_digitized_signature/models/res_users.py b/web_widget_digitized_signature/models/res_users.py index 1d6fc437..e90efc99 100644 --- a/web_widget_digitized_signature/models/res_users.py +++ b/web_widget_digitized_signature/models/res_users.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2004-2010 OpenERP SA () # Copyright 2011-2015 Serpent Consulting Services Pvt. Ltd. # Copyright 2017 Tecnativa - Vicent Cubells @@ -11,17 +10,18 @@ class ResUsers(models.Model): _name = 'res.users' _inherit = ['res.users', 'mail.thread'] - signature_image = fields.Binary( + digital_signature = fields.Binary( string='Signature', + oldname="signature_image", ) @api.model def create(self, vals): res = super(ResUsers, self).create(vals) - res._track_signature(vals, 'signature_image') + res._track_signature(vals, 'digital_signature') return res @api.multi def write(self, vals): - self._track_signature(vals, 'signature_image') + self._track_signature(vals, 'digital_signature') return super(ResUsers, self).write(vals) diff --git a/web_widget_digitized_signature/readme/CONFIGURE.rst b/web_widget_digitized_signature/readme/CONFIGURE.rst new file mode 100644 index 00000000..4706fed3 --- /dev/null +++ b/web_widget_digitized_signature/readme/CONFIGURE.rst @@ -0,0 +1,5 @@ +#. To use this module, you need to add ``widget="signature"`` to your binary + field in your view. +#. You can specify signature dimensions like the following: + ```` diff --git a/web_widget_digitized_signature/readme/CONTRIBUTORS.rst b/web_widget_digitized_signature/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..888312b9 --- /dev/null +++ b/web_widget_digitized_signature/readme/CONTRIBUTORS.rst @@ -0,0 +1,4 @@ +* Jay Vora +* Tecnativa : + + * Vicent Cubells diff --git a/web_widget_digitized_signature/readme/DESCRIPTION.rst b/web_widget_digitized_signature/readme/DESCRIPTION.rst new file mode 100644 index 00000000..ad46b7ee --- /dev/null +++ b/web_widget_digitized_signature/readme/DESCRIPTION.rst @@ -0,0 +1,5 @@ +This module provides a widget for binary fields that allows to digitize a +signature and store it as an image. + +As demonstration, it includes this widget at user level, so that we can store +a signature image for each user. diff --git a/web_widget_digitized_signature/readme/USAGE.rst b/web_widget_digitized_signature/readme/USAGE.rst new file mode 100644 index 00000000..1533be61 --- /dev/null +++ b/web_widget_digitized_signature/readme/USAGE.rst @@ -0,0 +1,3 @@ +#. Go to *Settings > Users > Users*. +#. Open one of the existing users. +#. You can set a digital signature for it on the field "Signature". diff --git a/web_widget_digitized_signature/static/description/index.html b/web_widget_digitized_signature/static/description/index.html new file mode 100644 index 00000000..7d00e2c5 --- /dev/null +++ b/web_widget_digitized_signature/static/description/index.html @@ -0,0 +1,448 @@ + + + + + + +Web Widget Digitized Signature + + + +
+

Web Widget Digitized Signature

+ + +

Beta License: AGPL-3 OCA/web Translate me on Weblate Try me on Runbot

+

This module provides a widget for binary fields that allows to digitize a +signature and store it as an image.

+

As demonstration, it includes this widget at user level, so that we can store +a signature image for each user.

+

Table of contents

+ +
+

Configuration

+
    +
  1. To use this module, you need to add widget="signature" to your binary +field in your view.
  2. +
  3. You can specifify signature dimensions like the following: +<field name="signature_image" widget="signature" width="400" +height="100"/>
  4. +
+
+
+

Usage

+
    +
  1. Go to Settings > Users > Users.
  2. +
  3. Open one of the existing users.
  4. +
  5. You can set a digital signature for it on the field “Signature”.
  6. +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Serpent Consulting Services Pvt. Ltd.
  • +
  • Agile Business Group
  • +
  • Tecnativa
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/web project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/web_widget_digitized_signature/static/lib/jSignature/jSignatureCustom.js b/web_widget_digitized_signature/static/lib/jSignature/jSignatureCustom.js index bb99cac8..bf3d7359 100644 --- a/web_widget_digitized_signature/static/lib/jSignature/jSignatureCustom.js +++ b/web_widget_digitized_signature/static/lib/jSignature/jSignatureCustom.js @@ -1,10 +1,11 @@ -/** @preserve +/** @preserve jSignature v2 "${buildDate}" "${commitID}" Copyright (c) 2012 Willow Systems Corp http://willow-systems.com Copyright (c) 2010 Brinley Ang http://www.unbolt.net -MIT License +MIT License */ + ;(function() { var apinamespace = 'jSignature' @@ -25,7 +26,7 @@ var KickTimerClass = function(time, callback) { timer = setTimeout( callback , time - ) + ) } this.clear = function() { clearTimeout(timer) @@ -35,7 +36,7 @@ var KickTimerClass = function(time, callback) { var PubSubClass = function(context){ 'use strict' - /* @preserve + /* @preserve ----------------------------------------------------------------------------------------------- JavaScript PubSub library 2012 (c) Willow Systems Corp (www.willow-systems.com) @@ -68,7 +69,7 @@ var PubSubClass = function(context){ for (i = 0, l = currentTopic.length; i < l; i++) { pair = currentTopic[i] // this is a [function, once_flag] array - fn = pair[0] + fn = pair[0] if (pair[1] /* 'run once' flag set */){ pair[0] = function(){} toremove.push(i) @@ -81,13 +82,13 @@ var PubSubClass = function(context){ } } /** - * Allows listener code to subscribe to channel and be called when data is available + * Allows listener code to subscribe to channel and be called when data is available * @public * @function * @param topic {String} Name of the channel on which to voice this event * @param callback {Function} Executable (function pointer) that will be ran when event is voiced on this channel. * @param once {Boolean} (optional. False by default) Flag indicating if the function is to be triggered only once. - * @returns {Object} A token object that cen be used for unsubscribing. + * @returns {Object} A token object that cen be used for unsubscribing. */ this.subscribe = function(topic, callback, once) { 'use strict' @@ -102,15 +103,15 @@ var PubSubClass = function(context){ }; }; /** - * Allows listener code to unsubscribe from a channel + * Allows listener code to unsubscribe from a channel * @public * @function - * @param token {Object} A token object that was returned by `subscribe` method + * @param token {Object} A token object that was returned by `subscribe` method */ this.unsubscribe = function(token) { if (this.topics[token.topic]) { var currentTopic = this.topics[token.topic] - + for (var i = 0, l = currentTopic.length; i < l; i++) { if (currentTopic[i][0] === token.callback) { currentTopic.splice(i, 1) @@ -127,7 +128,7 @@ function getColors($e){ , frontcolor = $e.css('color') , backcolor , e = $e[0] - + var toOfDOM = false while(e && !backcolor && !toOfDOM){ try{ @@ -192,18 +193,18 @@ function getColors($e){ // backcolorcomponents = {'r':0,'g':0,'b':0} // } } - + // Deriving Decor color - // THis is LAZY!!!! Better way would be to use HSL and adjust luminocity. However, that could be an overkill. - - var toRGBfn = function(o){return 'rgb(' + [o.r, o.g, o.b].join(', ') + ')'} + // THis is LAZY!!!! Better way would be to use HSL and adjust luminocity. However, that could be an overkill. + + var toRGBfn = function(o){return 'rgb(' + [o.r, o.g, o.b].join(', ') + ')'} , decorcolorcomponents , frontcolorbrightness , adjusted - + if (frontcolorcomponents && backcolorcomponents){ var backcolorbrightness = Math.max.apply(null, [frontcolorcomponents.r, frontcolorcomponents.g, frontcolorcomponents.b]) - + frontcolorbrightness = Math.max.apply(null, [backcolorcomponents.r, backcolorcomponents.g, backcolorcomponents.b]) adjusted = Math.round(frontcolorbrightness + (-1 * (frontcolorbrightness - backcolorbrightness) * 0.75)) // "dimming" the difference between pen and back. decorcolorcomponents = {'r':adjusted,'g':adjusted,'b':adjusted} // always shade of gray @@ -231,7 +232,7 @@ function Vector(x,y){ this.x = x this.y = y this.reverse = function(){ - return new this.constructor( + return new this.constructor( this.x * -1 , this.y * -1 ) @@ -243,7 +244,7 @@ function Vector(x,y){ } return this._length } - + var polarity = function (e){ return Math.round(e / Math.abs(e)) } @@ -267,12 +268,12 @@ function Vector(x,y){ } return this } - + /** * Calculates the angle between 'this' vector and another. * @public * @function - * @returns {Number} The angle between the two vectors as measured in PI. + * @returns {Number} The angle between the two vectors as measured in PI. */ this.angleTo = function(vectorB) { var divisor = this.getLength() * vectorB.getLength() @@ -283,8 +284,8 @@ function Vector(x,y){ // because of it, the core of the formula can, on occasion, have values // over 1.0 and below -1.0. return Math.acos( - Math.min( - Math.max( + Math.min( + Math.max( ( this.x * vectorB.x + this.y * vectorB.y ) / divisor , -1.0 ) @@ -298,7 +299,7 @@ function Vector(x,y){ function Point(x,y){ this.x = x this.y = y - + this.getVectorToCoordinates = function (x, y) { return new Vector(x - this.x, y - this.y) } @@ -316,17 +317,17 @@ function Point(x,y){ /* * About data structure: * We don't store / deal with "pictures" this signature capture code captures "vectors" - * + * * We don't store bitmaps. We store "strokes" as arrays of arrays. (Actually, arrays of objects containing arrays of coordinates. - * + * * Stroke = mousedown + mousemoved * n (+ mouseup but we don't record that as that was the "end / lack of movement" indicator) - * + * * Vectors = not classical vectors where numbers indicated shift relative last position. Our vectors are actually coordinates against top left of canvas. - * we could calc the classical vectors, but keeping the the actual coordinates allows us (through Math.max / min) + * we could calc the classical vectors, but keeping the the actual coordinates allows us (through Math.max / min) * to calc the size of resulting drawing very quickly. If we want classical vectors later, we can always get them in backend code. - * + * * So, the data structure: - * + * * var data = [ * { // stroke starts * x : [101, 98, 57, 43] // x points @@ -341,9 +342,9 @@ function Point(x,y){ * , y : [151] // y points * } // stroke ends * ] - * + * * we don't care or store stroke width (it's canvas-size-relative), color, shadow values. These can be added / changed on whim post-capture. - * + * */ function DataEngine(storageObject, context, startStrokeFn, addToStrokeFn, endStrokeFn){ this.data = storageObject // we expect this to be an instance of Array @@ -354,7 +355,7 @@ function DataEngine(storageObject, context, startStrokeFn, addToStrokeFn, endStr var numofstrokes = storageObject.length , stroke , numofpoints - + for (var i = 0; i < numofstrokes; i++){ stroke = storageObject[i] numofpoints = stroke.x.length @@ -367,13 +368,13 @@ function DataEngine(storageObject, context, startStrokeFn, addToStrokeFn, endStr } this.changed = function(){} - + this.startStrokeFn = startStrokeFn this.addToStrokeFn = addToStrokeFn this.endStrokeFn = endStrokeFn this.inStroke = false - + this._lastPoint = null this._stroke = null this.startStroke = function(point){ @@ -383,7 +384,7 @@ function DataEngine(storageObject, context, startStrokeFn, addToStrokeFn, endStr this._lastPoint = point this.inStroke = true // 'this' does not work same inside setTimeout( - var stroke = this._stroke + var stroke = this._stroke , fn = this.startStrokeFn , context = this.context setTimeout( @@ -402,8 +403,8 @@ function DataEngine(storageObject, context, startStrokeFn, addToStrokeFn, endStr // when clustering of these is too tight, it produces noise on the line, which, because of smoothing, makes lines too curvy. // maybe, later, we can expose this as a configurable setting of some sort. this.addToStroke = function(point){ - if (this.inStroke && - typeof(point.x) === "number" && + if (this.inStroke && + typeof(point.x) === "number" && typeof(point.y) === "number" && // calculates absolute shift in diagonal pixels away from original point (Math.abs(point.x - this._lastPoint.x) + Math.abs(point.y - this._lastPoint.y)) > 4 @@ -412,7 +413,7 @@ function DataEngine(storageObject, context, startStrokeFn, addToStrokeFn, endStr this._stroke.x.push(point.x) this._stroke.y.push(point.y) this._lastPoint = point - + var stroke = this._stroke , fn = this.addToStrokeFn , context = this.context @@ -478,7 +479,7 @@ var basicDot = function(ctx, x, y, size){ // Because we are funky this way, here we draw TWO curves. // 1. POSSIBLY "this line" - spanning from point right before us, to this latest point. // 2. POSSIBLY "prior curve" - spanning from "latest point" to the one before it. - + // Why you ask? // long lines (ones with many pixels between them) do not look good when they are part of a large curvy stroke. // You know, the jaggedy crocodile spine instead of a pretty, smooth curve. Yuck! @@ -486,23 +487,23 @@ var basicDot = function(ctx, x, y, size){ // To approximate a very nice curve we need to know the direction of line before and after. // Hence, on long lines we actually wait for another point beyond it to come back from // mousemoved before we draw this curve. - - // So for "prior curve" to be calc'ed we need 4 points + + // So for "prior curve" to be calc'ed we need 4 points // A, B, C, D (we are on D now, A is 3 points in the past.) // and 3 lines: - // pre-line (from points A to B), - // this line (from points B to C), (we call it "this" because if it was not yet, it's the only one we can draw for sure.) + // pre-line (from points A to B), + // this line (from points B to C), (we call it "this" because if it was not yet, it's the only one we can draw for sure.) // post-line (from points C to D) (even through D point is 'current' we don't know how we can draw it yet) // // Well, actually, we don't need to *know* the point A, just the vector A->B var Cpoint = new Point(stroke.x[positionInStroke-1], stroke.y[positionInStroke-1]) , Dpoint = new Point(stroke.x[positionInStroke], stroke.y[positionInStroke]) , CDvector = Cpoint.getVectorToPoint(Dpoint) - + // Again, we have a chance here to draw TWO things: - // BC Curve (only if it's long, because if it was short, it was drawn by previous callback) and + // BC Curve (only if it's long, because if it was short, it was drawn by previous callback) and // CD Line (only if it's short) - + // So, let's start with BC curve. // if there is only 2 points in stroke array, we don't have "history" long enough to have point B, let alone point A. // Falling through to drawing line CD is proper, as that's the only line we have points for. @@ -530,7 +531,7 @@ var basicDot = function(ctx, x, y, size){ , CCP2vector = (new Vector(BCvector.x + CDvector.x, BCvector.y + CDvector.y)).reverse().resizeTo( Math.max(minlenfraction, BCDangle) * maxlen ) - + basicCurve( this.canvasContext , Bpoint.x @@ -558,23 +559,23 @@ var basicDot = function(ctx, x, y, size){ // this = jSignatureClass instance // Here we tidy up things left unfinished in last strokeAddCallback run. - + // What's POTENTIALLY left unfinished there is the curve between the last points // in the stroke, if the len of that line is more than lineCurveThreshold // If the last line was shorter than lineCurveThreshold, it was drawn there, and there // is nothing for us here to do. - // We can also be called when there is only one point in the stroke (meaning, the + // We can also be called when there is only one point in the stroke (meaning, the // stroke was just a dot), in which case, again, there is nothing for us to do. - - // So for "this curve" to be calc'ed we need 3 points + + // So for "this curve" to be calc'ed we need 3 points // A, B, C // and 2 lines: - // pre-line (from points A to B), - // this line (from points B to C) + // pre-line (from points A to B), + // this line (from points B to C) // Well, actually, we don't need to *know* the point A, just the vector A->B // so, we really need points B, C and AB vector. var positionInStroke = stroke.x.length - 1 - + if (positionInStroke > 0){ // there are at least 2 points in the stroke.we are in business. var Cpoint = new Point(stroke.x[positionInStroke], stroke.y[positionInStroke]) @@ -649,7 +650,7 @@ var getDataStats = function(){ function conditionallyLinkCanvasResizeToWindowResize(jSignatureInstance, settingsWidth, apinamespace, globalEvents){ 'use strict' if ( settingsWidth === 'ratio' || settingsWidth.split('')[settingsWidth.length - 1] === '%' ) { - + this.eventTokens[apinamespace + '.parentresized'] = globalEvents.subscribe( apinamespace + '.parentresized' , (function(eventTokens, $parent, originalParentWidth, sizeRatio){ @@ -660,9 +661,9 @@ function conditionallyLinkCanvasResizeToWindowResize(jSignatureInstance, setting var w = $parent.width() if (w !== originalParentWidth) { - + // UNsubscribing this particular instance of signature pad only. - // there is a separate `eventTokens` per each instance of signature pad + // there is a separate `eventTokens` per each instance of signature pad for (var key in eventTokens){ if (eventTokens.hasOwnProperty(key)) { globalEvents.unsubscribe(eventTokens[key]) @@ -677,21 +678,21 @@ function conditionallyLinkCanvasResizeToWindowResize(jSignatureInstance, setting delete jSignatureInstance[key] } } - + // scale data to new signature pad size settings.data = (function(data, scale){ var newData = [] var o, i, l, j, m, stroke for ( i = 0, l = data.length; i < l; i++) { stroke = data[i] - + o = {'x':[],'y':[]} - + for ( j = 0, m = stroke.x.length; j < m; j++) { o.x.push(stroke.x[j] * scale) o.y.push(stroke.y[j] * scale) } - + newData.push(o) } return newData @@ -699,7 +700,7 @@ function conditionallyLinkCanvasResizeToWindowResize(jSignatureInstance, setting settings.data , w * 1.0 / originalParentWidth ) - + $parent[apinamespace](settings) } } @@ -769,14 +770,14 @@ function jSignatureClass(parent, options, instanceExtensions) { // Most of our exposed API will be looking for this: $canvas.data(apinamespace + '.this', this) - - + + settings.lineWidth = (function(defaultLineWidth, canvasWidth){ if (!defaultLineWidth){ return Math.max( Math.round(canvasWidth / 400) /*+1 pixel for every extra 300px of width.*/ , 2 /* minimum line width */ - ) + ) } else { return defaultLineWidth } @@ -830,7 +831,7 @@ function jSignatureClass(parent, options, instanceExtensions) { this.drawStartHandler = function(e) { e.preventDefault() // for performance we cache the offsets - // we recalc these only at the beginning the stroke + // we recalc these only at the beginning the stroke setStartValues() jSignatureInstance.dataEngine.startStroke( getPointFromEvent(e) ) timer.kick() @@ -839,7 +840,7 @@ function jSignatureClass(parent, options, instanceExtensions) { e.preventDefault() if (!jSignatureInstance.dataEngine.inStroke){ return - } + } jSignatureInstance.dataEngine.addToStroke( getPointFromEvent(e) ) timer.kick() } @@ -866,7 +867,7 @@ function jSignatureClass(parent, options, instanceExtensions) { canvas.onmousemove = undef this.fatFingerCompensation = ( - settings.minFatFingerCompensation && + settings.minFatFingerCompensation && settings.lineWidth * -3 > settings.minFatFingerCompensation ) ? settings.lineWidth * -3 : settings.minFatFingerCompensation @@ -888,7 +889,7 @@ function jSignatureClass(parent, options, instanceExtensions) { canvas.onmousemove = drawMoveHandler } } - }).call( + }).call( this , movementHandlers.drawEndHandler , movementHandlers.drawStartHandler @@ -918,7 +919,7 @@ function jSignatureClass(parent, options, instanceExtensions) { , settings.width.toString(10) , apinamespace, globalEvents ) - + // end of event handlers. // =============================== @@ -944,7 +945,7 @@ jSignatureClass.prototype.resetCanvas = function(data){ , cw = canvas.width , ch = canvas.height - + // preparing colors, drawing area ctx.clearRect(0, 0, cw + 30, ch + 30) @@ -952,13 +953,13 @@ jSignatureClass.prototype.resetCanvas = function(data){ ctx.shadowColor = ctx.fillStyle = settings['background-color'] if (isCanvasEmulator){ // FLashCanvas fills with Black by default, covering up the parent div's background - // hence we refill + // hence we refill ctx.fillRect(0,0,cw + 30, ch + 30) } ctx.lineWidth = Math.ceil(parseInt(settings.lineWidth, 10)) ctx.lineCap = ctx.lineJoin = "round" - + // signature line ctx.strokeStyle = settings['decor-color'] ctx.shadowOffsetX = 0 @@ -971,13 +972,13 @@ jSignatureClass.prototype.resetCanvas = function(data){ ctx.shadowColor = ctx.strokeStyle ctx.shadowOffsetX = ctx.lineWidth * 0.5 ctx.shadowOffsetY = ctx.lineWidth * -0.6 - ctx.shadowBlur = 0 + ctx.shadowBlur = 0 } - + // setting up new dataEngine if (!data) { data = [] } - + var dataEngine = this.dataEngine = new DataEngine( data , this @@ -996,7 +997,7 @@ jSignatureClass.prototype.resetCanvas = function(data){ 'use strict' return function() { events.publish(apinamespace+'.change') - target.trigger('change') + target.trigger('change') } })(this.$parent, this.events, apinamespace) // let's trigger change on all data reloads @@ -1026,9 +1027,9 @@ function initializeCanvasEmulator(canvas){ if (FC) { canvas = FC.initElement(canvas) - + var zoom = 1 - // FlashCanvas uses flash which has this annoying habit of NOT scaling with page zoom. + // FlashCanvas uses flash which has this annoying habit of NOT scaling with page zoom. // It matches pixel-to-pixel to screen instead. // Since we are targeting ONLY IE 7, 8 with FlashCanvas, we will test the zoom only the IE8, IE7 way if (window && window.screen && window.screen.deviceXDPI && window.screen.logicalXDPI){ @@ -1105,7 +1106,7 @@ jSignatureClass.prototype.initializeCanvas = function(settings) { canvas.width = $canvas.width() canvas.height = $canvas.height() - + // Special case Sizing code this.isCanvasEmulator = initializeCanvasEmulator(canvas) @@ -1124,7 +1125,7 @@ jSignatureClass.prototype.initializeCanvas = function(settings) { var GlobalJSignatureObjectInitializer = function(window){ var globalEvents = new PubSubClass() - + // common "window resized" event listener. // jSignature instances will subscribe to this chanel. // to resize themselves when needed. @@ -1144,7 +1145,7 @@ var GlobalJSignatureObjectInitializer = function(window){ if (resizetimer) { clearTimeout(resizetimer) } - resizetimer = setTimeout( + resizetimer = setTimeout( runner , 500 ) @@ -1160,13 +1161,13 @@ var GlobalJSignatureObjectInitializer = function(window){ })(globalEvents, apinamespace, $, window) var jSignatureInstanceExtensions = { - + 'exampleExtension':function(extensionName){ // we are called very early in instance's life. - // right after the settings are resolved and - // jSignatureInstance.events is created + // right after the settings are resolved and + // jSignatureInstance.events is created // and right before first ("jSignature.initializing") event is called. - // You don't really need to manupilate + // You don't really need to manupilate // jSignatureInstance directly, just attach // a bunch of events to jSignatureInstance.events // (look at the source of jSignatureClass to see when these fire) @@ -1201,7 +1202,7 @@ var GlobalJSignatureObjectInitializer = function(window){ } ) } - + } var exportplugins = { @@ -1210,12 +1211,12 @@ var GlobalJSignatureObjectInitializer = function(window){ , 'image':function(data){ /*this = canvas elem */ var imagestring = this.toDataURL() - - if (typeof imagestring === 'string' && - imagestring.length > 4 && + + if (typeof imagestring === 'string' && + imagestring.length > 4 && imagestring.slice(0,5) === 'data:' && imagestring.indexOf(',') !== -1){ - + var splitterpos = imagestring.indexOf(',') return [ @@ -1230,9 +1231,9 @@ var GlobalJSignatureObjectInitializer = function(window){ // will be part of "importplugins" function _renderImageOnCanvas( data, formattype, rerendercallable ) { 'use strict' - // #1. Do NOT rely on this. No worky on IE + // #1. Do NOT rely on this. No worky on IE // (url max len + lack of base64 decoder + possibly other issues) - // #2. This does NOT affect what is captured as "signature" as far as vector data is + // #2. This does NOT affect what is captured as "signature" as far as vector data is // concerned. This is treated same as "signature line" - i.e. completely ignored // the only time you see imported image data exported is if you export as image. @@ -1240,20 +1241,32 @@ var GlobalJSignatureObjectInitializer = function(window){ // because importing image does absolutely nothing to the underlying vector data storage // This could be a way to "import" old signatures stored as images // This could also be a way to import extra decor into signature area. - - var img = new Image() - // this = Canvas DOM elem. Not jQuery object. Not Canvas's parent div. - , c = this - - img.onload = function() { - var ctx = c.getContext("2d").drawImage( - img, 0, 0 - , ( img.width < c.width) ? img.width : c.width - , ( img.height < c.height) ? img.height : c.height - ) - } - img.src = 'data:' + formattype + ',' + data +// var img = new Image() +// // this = Canvas DOM elem. Not jQuery object. Not Canvas's parent div. +// , c = this +// +// img.onload = function() { +// var ctx = c.getContext("2d").drawImage( +// img, 0, 0 +// , ( img.width < c.width) ? img.width : c.width +// , ( img.height < c.height) ? img.height : c.height +// ) +// } +// +// img.src = 'data:' + formattype + ',' + data + + var c = new Image, + e = this; + c.onload = function() { + var a = e.getContext("2d"), + b = a.shadowColor; + a.shadowColor = "transparent"; + a.drawImage(c, 0, 0, c.width < e.width ? c.width : e.width, c.height < + e.height ? c.height : e.height); + a.shadowColor = b + }; + c.src = "data:" + formattype + "," + data } var importplugins = { @@ -1281,7 +1294,7 @@ var GlobalJSignatureObjectInitializer = function(window){ if (formattype === undef && typeof data === 'string' && data.substr(0,5) === 'data:') { formattype = data.slice(5).split(',')[0] // 5 chars of "data:" + mimetype len + 1 "," char = all skipped. - data = data.slice(6 + formattype.length) + data = data.slice(6 + formattype.length) if (formattype === data) return } @@ -1294,7 +1307,7 @@ var GlobalJSignatureObjectInitializer = function(window){ $canvas[0] , data , formattype - , (function(jSignatureInstance){ + , (function(jSignatureInstance){ return function(){ return jSignatureInstance.resetCanvas.apply(jSignatureInstance, arguments) } })($canvas.data(apinamespace+'.this')) ) @@ -1307,7 +1320,7 @@ var GlobalJSignatureObjectInitializer = function(window){ var topOfDOM = false e = e.parentNode while (e && !topOfDOM){ - topOfDOM = $(e).find(".oe_form") + topOfDOM = $(e).find(".o_form_view") e = e.parentNode } return !topOfDOM @@ -1319,7 +1332,7 @@ var GlobalJSignatureObjectInitializer = function(window){ 'init' : function( options ) { return this.each( function() { if (!elementIsOrphan(this)) { - new jSignatureClass(this, options, jSignatureInstanceExtensions) + new jSignatureClass(this, options, jSignatureInstanceExtensions) } }) } @@ -1353,7 +1366,7 @@ var GlobalJSignatureObjectInitializer = function(window){ , 'getData' : function( formattype ) { var undef, $canvas=this.find('canvas.'+apinamespace).add(this.filter('canvas.'+apinamespace)) if (formattype === undef) formattype = 'default' - if ($canvas.length !== 0 && exportplugins.hasOwnProperty(formattype)){ + if ($canvas.length !== 0 && exportplugins.hasOwnProperty(formattype)){ return exportplugins[formattype].call( $canvas.get(0) // canvas dom elem , $canvas.data(apinamespace+'.data') // raw signature data as array of objects of arrays @@ -1373,7 +1386,7 @@ var GlobalJSignatureObjectInitializer = function(window){ .data(apinamespace+'.this').events } } // end of methods declaration. - + $.fn[apinamespace] = function(method) { 'use strict' if ( !method || typeof method === 'object' ) { diff --git a/web_widget_digitized_signature/static/src/js/digital_sign.js b/web_widget_digitized_signature/static/src/js/digital_sign.js index 468a644a..842f89a8 100644 --- a/web_widget_digitized_signature/static/src/js/digital_sign.js +++ b/web_widget_digitized_signature/static/src/js/digital_sign.js @@ -2,121 +2,155 @@ odoo.define('web_widget_digitized_signature.web_digital_sign', function(require) "use strict"; var core = require('web.core'); - var FormView = require('web.FormView'); + var BasicFields= require('web.basic_fields'); + var FormController = require('web.FormController'); + var Registry = require('web.field_registry'); var utils = require('web.utils'); var session = require('web.session'); - var Model = require('web.Model'); + var field_utils = require('web.field_utils'); var _t = core._t; var QWeb = core.qweb; - var FieldSignature = core.form_widget_registry.map.image.extend({ + var FieldSignature = BasicFields.FieldBinaryImage.extend({ template: 'FieldSignature', + events: _.extend({}, BasicFields.FieldBinaryImage.prototype.events, { + 'click .save_sign': '_on_save_sign', + 'click #sign_clean': '_on_clear_sign' + }), + jsLibs: ['/web_widget_digitized_signature/static/lib/jSignature/jSignatureCustom.js'], placeholder: "/web/static/src/img/placeholder.png", - initialize_content: function() { - var self = this; - this.$el.find('> img').remove(); - this.$el.find('.signature > canvas').remove(); - var sign_options = {'decor-color' : '#D1D0CE', 'color': '#000', 'background-color': '#fff','height':'150','width':'550'}; - this.$el.find(".signature").jSignature("init",sign_options); - this.$el.find(".signature").attr({"tabindex": "0",'height':"100"}); - this.empty_sign = this.$el.find(".signature").jSignature("getData",'image'); - this.$el.find('#sign_clean').click(this.on_clear_sign); - this.$el.find('.save_sign').click(this.on_save_sign); + init: function() { + this._super.apply(this, arguments); + this.$('> img').remove(); + this.$('.signature > canvas').remove(); + this.sign_options = { + 'decor-color': '#D1D0CE', + 'color': '#000', + 'background-color': '#fff', + 'height': '150', + 'width': '550' + }; + this.empty_sign = []; }, - on_clear_sign: function() { + start: function() { var self = this; - this.$el.find(".signature > canvas").remove(); - this.$el.find('> img').remove(); - this.$el.find(".signature").attr("tabindex", "0"); - var sign_options = {'decor-color' : '#D1D0CE', 'color': '#000', 'background-color': '#fff','height':'150','width':'550','clear': true}; - this.$el.find(".signature").jSignature(sign_options); - this.$el.find(".signature").focus(); - self.set('value', false); + this.$(".signature").jSignature("init", this.sign_options); + this.$(".signature").attr({ + "tabindex": "0", + 'height': "100" + }); + this.empty_sign = this.$(".signature").jSignature("getData", 'image'); + self._render(); + }, + _on_clear_sign: function() { + this.$(".signature > canvas").remove(); + this.$('> img').remove(); + this.$(".signature").attr("tabindex", "0"); + var sign_options = { + 'decor-color': '#D1D0CE', + 'color': '#000', + 'background-color': '#fff', + 'height': '150', + 'width': '550', + 'clear': true + }; + this.$(".signature").jSignature(sign_options); + this.$(".signature").focus(); + this._setValue(false); }, - on_save_sign: function(value_) { + _on_save_sign: function(value_) { var self = this; - this.$el.find('> img').remove(); - var signature = self.$el.find(".signature").jSignature("getData",'image'); - var is_empty = signature - ? self.empty_sign[1] === signature[1] - : false; - if (! is_empty && typeof signature !== "undefined" && signature[1]) { - self.set('value',signature[1]); + this.$('> img').remove(); + var signature = this.$(".signature").jSignature("getData", 'image'); + var is_empty = signature ? + self.empty_sign[1] === signature[1] : + false; + if (!is_empty && typeof signature !== "undefined" && signature[1]) { + this._setValue(signature[1]); } }, - render_value: function() { + _render: function() { var self = this; var url = this.placeholder; - if (this.get('value') && !utils.is_bin_size(this.get('value'))) { - url = 'data:image/png;base64,' + this.get('value'); - } else if (this.get('value')) { - url = this.session.url('/web/binary/image', { - model: this.view.dataset.model, - id: JSON.stringify(this.view.datarecord.id || null), - field: this.options.preview_image - ? this.options.preview_image - : this.name, - t: new Date().getTime() + if (this.value && !utils.is_bin_size(this.value)) { + url = 'data:image/png;base64,' + this.value; + } else if (this.value) { + url = session.url('/web/image', { + model: this.model, + id: JSON.stringify(this.res_id), + field: this.nodeOptions.preview_image || this.name, + unique: field_utils.format.datetime(this.recordData.__last_update).replace(/[^0-9]/g, ''), }); } else { url = this.placeholder; } - if (this.view.get("actual_mode") === 'view') { - var $img = $(QWeb.render("FieldBinaryImage-extend", { widget: this, url: url })); - this.$el.find('> img').remove(); - this.$el.find(".signature").hide(); + if (this.mode === "readonly") { + var $img = $(QWeb.render("FieldBinaryImage-img", { + widget: self, + url: url + })); + this.$('> img').remove(); + this.$(".signature").hide(); this.$el.prepend($img); - $img.load(function() { - if (! self.options.size) { - return; - } - $img.css("max-width", "" + self.options.size[0] + "px"); - $img.css("max-height", "" + self.options.size[1] + "px"); - $img.css("margin-left", "" + (self.options.size[0] - $img.width()) / 2 + "px"); - $img.css("margin-top", "" + (self.options.size[1] - $img.height()) / 2 + "px"); - }); $img.on('error', function() { + self.on_clear(); $img.attr('src', self.placeholder); self.do_warn(_t("Image"), _t("Could not display the selected image.")); }); - } else if (this.view.get("actual_mode") === 'edit') { - this.$el.find('> img').remove(); - if (this.get('value')) { - var field_name = this.options.preview_image - ? this.options.preview_image - : this.name; - new Model(this.view.dataset.model).call("read", [this.view.datarecord.id, [field_name]]).done(function(data) { + } else if (this.mode === "edit") { + this.$('> img').remove(); + if (this.value) { + var field_name = this.nodeOptions.preview_image ? + this.nodeOptions.preview_image : + this.name; + self._rpc({ + model: this.model, + method: 'read', + args: [this.res_id, [field_name]] + }).done(function(data) { if (data) { - var field_desc = _.values(_.pick(data, field_name)); - self.$el.find(".signature").jSignature("reset"); - self.$el.find(".signature").jSignature("setData",'data:image/png;base64,'+field_desc[0]); + var field_desc = _.values(_.pick(data[0], field_name)); + self.$(".signature").jSignature("clear"); + self.$(".signature").jSignature("setData", 'data:image/png;base64,' + field_desc[0]); } }); } else { - this.$el.find('> img').remove(); - this.$el.find('.signature > canvas').remove(); - var sign_options = {'decor-color' : '#D1D0CE', 'color': '#000','background-color': '#fff','height':'150','width':'550'}; - this.$el.find(".signature").jSignature("init",sign_options); + this.$('> img').remove(); + this.$('.signature > canvas').remove(); + var sign_options = { + 'decor-color': '#D1D0CE', + 'color': '#000', + 'background-color': '#fff', + 'height': '150', + 'width': '550' + }; + this.$(".signature").jSignature("init", sign_options); + } + } else if (this.mode === 'create') { + this.$('> img').remove(); + this.$('> canvas').remove(); + if (!this.value) { + this.$(".signature").empty().jSignature("init", { + 'decor-color': '#D1D0CE', + 'color': '#000', + 'background-color': '#fff', + 'height': '150', + 'width': '550' + }); } - } else if (this.view.get("actual_mode") === 'create') { - this.$el.find('> img').remove(); - this.$el.find('> canvas').remove(); - if (!this.get('value')) { - this.$el.find(".signature").empty().jSignature("init",{'decor-color' : '#D1D0CE', 'color': '#000','background-color': '#fff','height':'150','width':'550'}); - } - } + } } }); - core.form_widget_registry.add('signature', FieldSignature); - - FormView.include({ - save: function() { - this.$el.find('.save_sign').click(); + FormController.include({ + saveRecord: function() { + this.$('.save_sign').click(); return this._super.apply(this, arguments); } }); -}); + Registry.add('signature', FieldSignature); + +}); diff --git a/web_widget_digitized_signature/static/src/xml/digital_sign.xml b/web_widget_digitized_signature/static/src/xml/digital_sign.xml index df4e8e22..e722a2cc 100644 --- a/web_widget_digitized_signature/static/src/xml/digital_sign.xml +++ b/web_widget_digitized_signature/static/src/xml/digital_sign.xml @@ -1,24 +1,22 @@ - + diff --git a/web_widget_digitized_signature/tests/__init__.py b/web_widget_digitized_signature/tests/__init__.py index 3dc777d5..9aa8c1e2 100644 --- a/web_widget_digitized_signature/tests/__init__.py +++ b/web_widget_digitized_signature/tests/__init__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from . import test_signature_tracking diff --git a/web_widget_digitized_signature/tests/test_signature_tracking.py b/web_widget_digitized_signature/tests/test_signature_tracking.py index 98d04421..1ca800dd 100644 --- a/web_widget_digitized_signature/tests/test_signature_tracking.py +++ b/web_widget_digitized_signature/tests/test_signature_tracking.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2017 Tecnativa - Pedro M. Baeza # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). @@ -25,14 +24,14 @@ class TestSignatureTracking(common.SavepointCase): direct chatter""" prev_attachment_num = self.attachment_obj.search_count([]) prev_messages = self.message_obj.search([]) - self.user.signature_image = self.image + self.user.digital_signature = self.image current_attachment_num = self.attachment_obj.search_count([]) self.assertEqual(current_attachment_num - prev_attachment_num, 1) current_messages = self.message_obj.search([]) message = current_messages - prev_messages self.assertIn('Signature has been created.', message.body) prev_messages = current_messages - self.user.signature_image = False + self.user.digital_signature = False current_messages = self.message_obj.search([]) message = current_messages - prev_messages self.assertIn('Signature has been deleted.', message.body) diff --git a/web_widget_digitized_signature/views/res_users_view.xml b/web_widget_digitized_signature/views/res_users_view.xml index 3971c209..49934e08 100644 --- a/web_widget_digitized_signature/views/res_users_view.xml +++ b/web_widget_digitized_signature/views/res_users_view.xml @@ -4,22 +4,26 @@ inherited.res.users.form res.users - + - - - res.users.preferences.form + + inherited.res.users.preferences.form res.users - + - diff --git a/web_widget_digitized_signature/views/web_digital_sign_view.xml b/web_widget_digitized_signature/views/web_digital_sign_view.xml index 4331c08c..9c63731d 100644 --- a/web_widget_digitized_signature/views/web_digital_sign_view.xml +++ b/web_widget_digitized_signature/views/web_digital_sign_view.xml @@ -3,7 +3,6 @@