Skip to content

Commit

Permalink
Merge remote-tracking branch 'odoo/11.0' into 11.0
Browse files Browse the repository at this point in the history
  • Loading branch information
OCA-git-bot committed Jan 17, 2020
2 parents e781a4a + eb4aac3 commit a472ea9
Show file tree
Hide file tree
Showing 8 changed files with 126 additions and 48 deletions.
40 changes: 8 additions & 32 deletions addons/base_vat/models/res_partner.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
'mx': 'ABC123456T1B',
'nl': 'NL123456782B90',
'no': 'NO123456785',
'pe': 'PER10254824220 or PED10254824220',
'pe': '10XXXXXXXXY or 20XXXXXXXXY or 15XXXXXXXXY or 16XXXXXXXXY or 17XXXXXXXXY',
'pl': 'PL1234567883',
'pt': 'PT123456789',
'ro': 'RO1234567897',
Expand Down Expand Up @@ -284,38 +284,14 @@ def check_vat_no(self, vat):

# Peruvian VAT validation, contributed by Vauxoo
def check_vat_pe(self, vat):

vat_type, vat = vat and len(vat) >= 2 and (vat[0], vat[1:]) or (False, False)

if vat_type and vat_type.upper() == 'D':
# DNI
return True
elif vat_type and vat_type.upper() == 'R':
# verify RUC
factor = '5432765432'
sum = 0
dig_check = False
if len(vat) != 11:
return False
try:
int(vat)
except ValueError:
return False

for f in range(0, 10):
sum += int(factor[f]) * int(vat[f])

subtraction = 11 - (sum % 11)
if subtraction == 10:
dig_check = 0
elif subtraction == 11:
dig_check = 1
else:
dig_check = subtraction

return int(vat[10]) == dig_check
else:
if len(vat) != 11 or not vat.isdigit():
return False
dig_check = 11 - (sum([int('5432765432'[f]) * int(vat[f]) for f in range(0, 10)]) % 11)
if dig_check == 10:
dig_check = 0
elif dig_check == 11:
dig_check = 1
return int(vat[10]) == dig_check

# VAT validation in Turkey, contributed by # Levent Karakas @ Eska Yazilim A.S.
def check_vat_tr(self, vat):
Expand Down
2 changes: 2 additions & 0 deletions addons/base_vat/tests/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import test_validate_ruc
16 changes: 16 additions & 0 deletions addons/base_vat/tests/test_validate_ruc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo.tests import common
from odoo.exceptions import ValidationError


class TestRUCStructure(common.TransactionCase):

def test_peru_ruc_format(self):
"""Only values that has the length of 11 will be checked as RUC, that's what we are proving. The second part
will check for a valid ruc and there will be no problem at all.
"""
partner = self.env['res.partner'].create({'name': "Dummy partner", 'country_id': self.env.ref('base.pe').id})

with self.assertRaises(ValidationError):
partner.vat = '11111111111'
partner.vat = '20507822470'
9 changes: 9 additions & 0 deletions addons/mail/models/mail_thread.py
Original file line number Diff line number Diff line change
Expand Up @@ -425,6 +425,15 @@ def _track_template(self, tracking):
def _message_track_post_template(self, tracking):
if not any(change for rec_id, (change, tracking_value_ids) in tracking.items()):
return True
# Clean the context to get rid of residual default_* keys
# that could cause issues afterward during the mail.message
# generation. Example: 'default_parent_id' would refer to
# the parent_id of the current record that was used during
# its creation, but could refer to wrong parent message id,
# leading to a traceback in case the related message_id
# doesn't exist
ctx = {k: v for k, v in self.env.context.items() if not k.startswith('default_')} # Use clean_context on further versions
self = self.with_context(ctx)
templates = self._track_template(tracking)
for field_name, (template, post_kwargs) in templates.items():
if not template:
Expand Down
52 changes: 52 additions & 0 deletions addons/mail/tests/test_message_track.py
Original file line number Diff line number Diff line change
Expand Up @@ -133,3 +133,55 @@ def cleanup():
self.assertEqual(set(last_msg.tracking_value_ids.mapped('new_value_char')), set([group_system.name_get()[0][1], 'Everyone', 'supername']))
self.assertEqual(set(last_msg.tracking_value_ids.mapped('old_value_integer')), set([0, group_user.id]))
self.assertEqual(set(last_msg.tracking_value_ids.mapped('new_value_integer')), set([0, group_system.id]))

def test_track_template(self):
# Test: Check that default_* keys are not taken into account in _message_track_post_template
magic_code = 'Up-Up-Down-Down-Left-Right-Left-Right-Square-Triangle'

mt_name_changed = self.env['mail.message.subtype'].create({
'name': 'MAGIC CODE WOOP WOOP',
'description': 'SPECIAL CONTENT UNLOCKED'
})
self.env['ir.model.data'].create({
'name': 'mt_name_changed',
'model': 'mail.message.subtype',
'module': 'mail',
'res_id': mt_name_changed.id
})
mail_template = self.env['mail.template'].create({
'name': 'SPECIAL CONTENT UNLOCKED',
'subject': 'SPECIAL CONTENT UNLOCKED',
'model_id': self.env.ref('mail.model_mail_test').id,
'auto_delete': True,
'body_html': '''<div>WOOP WOOP</div>''',
})

@api.multi
def _track_subtype(self, init_values):
if 'name' in init_values and init_values['name'] == magic_code:
return 'mail.mt_name_changed'
return False
self.registry('mail.test')._patch_method('_track_subtype', _track_subtype)

def _track_template(self, tracking):
res = {}
record = self[0]
changes, tracking_value_ids = tracking[record.id]
if 'name' in changes:
res['name'] = (mail_template, {'composition_mode': 'mass_mail'})
return res
self.registry('mail.test')._patch_method('_track_template', _track_template)

cls = type(self.env['mail.test'])
self.assertFalse(hasattr(getattr(cls, 'name'), 'track_visibility'))
getattr(cls, 'name').track_visibility = 'always'

@self.addCleanup
def cleanup():
del getattr(cls, 'name').track_visibility

test_mail_record = self.env['mail.test'].create({
'name': 'Zizizatestmailname',
'description': 'Zizizatestmaildescription',
})
test_mail_record.with_context(default_parent_id=2147483647).write({'name': magic_code})
11 changes: 10 additions & 1 deletion addons/web_editor/static/src/js/editor/rte.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,16 @@ var History = function History($editable) {
}

$editable.trigger('content_will_be_destroyed');
$editable.html(oSnap.contents).scrollTop(oSnap.scrollTop);
var $tempDiv = $('<div/>', {html: oSnap.contents});
_.each($tempDiv.find('.o_temp_auto_element'), function (el) {
var $el = $(el);
var originalContent = $el.attr('data-temp-auto-element-original-content');
if (originalContent) {
$el.after(originalContent);
}
$el.remove();
});
$editable.html($tempDiv.html()).scrollTop(oSnap.scrollTop);
$editable.trigger('content_was_recreated');

$('.oe_overlay').remove();
Expand Down
8 changes: 7 additions & 1 deletion addons/website_event/static/src/js/website_geolocation.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ sAnimation.registry.visitor = sAnimation.Class.extend({
defs.push(this._rpc({route: '/event/get_country_event_list'}).then(function (data) {
if (data) {
self._$loadedContent = $(data);

self._$loadedContent.addClass('o_temp_auto_element');
self._$loadedContent.attr('data-temp-auto-element-original-content', self._originalContent);

$eventList.replaceWith(self._$loadedContent);
}
}));
Expand All @@ -27,7 +31,9 @@ sAnimation.registry.visitor = sAnimation.Class.extend({
*/
destroy: function () {
this._super.apply(this, arguments);
this._$loadedContent.replaceWith(this._originalContent);
if (this._$loadedContent) {
this._$loadedContent.replaceWith(this._originalContent);
}
},
});
});
36 changes: 22 additions & 14 deletions odoo/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@

import babel.dates
import dateutil.relativedelta
import psycopg2
import psycopg2, psycopg2.extensions
from lxml import etree
from lxml.builder import E

Expand Down Expand Up @@ -668,19 +668,27 @@ def to_xid(record_id):
for r in missing
)
fields = ['module', 'model', 'name', 'res_id']
cr.copy_from(io.StringIO(
u'\n'.join(
u"%s\t%s\t%s\t%d" % (
modname,
record._name,
xids[record.id][1],
record.id,
)
for record in missing
)),
table='ir_model_data',
columns=fields,
)

# disable eventual async callback / support for the extent of
# the COPY FROM, as these are apparently incompatible
callback = psycopg2.extensions.get_wait_callback()
psycopg2.extensions.set_wait_callback(None)
try:
cr.copy_from(io.StringIO(
u'\n'.join(
u"%s\t%s\t%s\t%d" % (
modname,
record._name,
xids[record.id][1],
record.id,
)
for record in missing
)),
table='ir_model_data',
columns=fields,
)
finally:
psycopg2.extensions.set_wait_callback(callback)
self.env['ir.model.data'].invalidate_cache(fnames=fields)

return (
Expand Down

0 comments on commit a472ea9

Please sign in to comment.