Kristian
Kristian

Reputation: 61

TypeError: _get_valid_digit() takes exactly 2 arguments (1 given) - Odoo v8 to Odoo v10 community

Consider this function:

@api.multi
def _validate_rif(self, vat): #, cr, uid, vat, context=None
    '''validates if the VE VAT NUMBER is right
    @param vat: string: Vat number to Check
    returns vat when right otherwise returns False

    '''
    if not vat:
        return False

    if 'VE' in vat:
        vat = vat[2:]

    if re.search(r'^[VJEGP][0-9]{9}$', vat):
        valid_digit = self._get_valid_digit() 
        if valid_digit is None:
            return False
        if int(vat[9]) == valid_digit:
            return vat
        else:
            self._print_error(_('Vat Error !'), _('Invalid VAT!'))
    elif re.search(r'^([VE][0-9]{1,8})$', vat):
        vat = vat[0] + vat[1:].rjust(8, '0')
        valid_digit = self._get_valid_digit() 
        vat += str(valid_digit)
        return vat
    return False

This is from a migration I'm doing from v8 to v10 community.

The error comes on this line: valid_digit = self._get_valid_digit()

This calls for this function:

@api.multi
def _get_valid_digit(self, vat): #, cr, uid, vat, context=None
    '''
    @param vat: string
    returns validating digit
    '''
    #vat = ''
    divisor = 11
    vat_type = {'V': 1, 'E': 2, 'J': 3, 'P': 4, 'G': 5}
    mapper = {1: 3, 2: 2, 3: 7, 4: 6, 5: 5, 6: 4, 7: 3, 8: 2}
    valid_digit = None

    vat_type = vat_type.get(vat[0].upper())
    if vat_type:
        sum_vat = vat_type * 4
        for i in range(8):
            sum_vat += int(vat[i + 1]) * mapper[i + 1]

        valid_digit = divisor - sum_vat % divisor
        if valid_digit >= 10:
            valid_digit = 0
    return valid_digit

Every time I click on this button it throws me this:

Traceback (most recent call last):
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 638, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 675, in dispatch
result = self._call_function(**self.params)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 331, in _call_function
return checked_call(self.db, *args, **kwargs)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/service/model.py", line 119, in wrapper
return f(dbname, *args, **kwargs)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 324, in checked_call
result = self.endpoint(*a, **kw)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 933, in __call__
return self.method(*args, **kw)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 504, in response_wrap
response = f(*args, **kw)
File "/home/kristian/odoov10/odoo-10.0rc1c-20161005/odoo/addons/web/controllers/main.py", line 866, in call_button
action = self._call_kw(model, method, args, {})
File "/home/kristian/odoov10/odoo-10.0rc1c-20161005/odoo/addons/web/controllers/main.py", line 854, in _call_kw
return call_kw(request.env[model], method, args, kwargs)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/api.py", line 681, in call_kw
return call_kw_multi(method, model, args, kwargs)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/api.py", line 672, in call_kw_multi
result = method(recs, *args, **kwargs)
File "/home/kristian/odoov10/gilda/l10n_ve_fiscal_requirements/wizard/search_info_partner_seniat.py", line 64, in search_partner_seniat
res = self.env['seniat.url']._dom_giver(vat)  
File "/home/kristian/odoov10/gilda/l10n_ve_fiscal_requirements/model/seniat_url.py", line 226, in _dom_giver
vat = self._validate_rif(vat) 
File "/home/kristian/odoov10/gilda/l10n_ve_fiscal_requirements/model/seniat_url.py", line 98, in _validate_rif
valid_digit = self._get_valid_digit() 
TypeError: _get_valid_digit() takes exactly 2 arguments (1 given)

These methods originally looked like this:

def _get_valid_digit(self, cr, uid, vat, context=None):
    '''
    @param vat: string
    returns validating digit
    '''
    divisor = 11
    vat_type = {'V': 1, 'E': 2, 'J': 3, 'P': 4, 'G': 5}
    mapper = {1: 3, 2: 2, 3: 7, 4: 6, 5: 5, 6: 4, 7: 3, 8: 2}
    valid_digit = None

    vat_type = vat_type.get(vat[0].upper())
    if vat_type:
        sum_vat = vat_type * 4
        for i in range(8):
            sum_vat += int(vat[i + 1]) * mapper[i + 1]

        valid_digit = divisor - sum_vat % divisor
        if valid_digit >= 10:
            valid_digit = 0
    return valid_digit

def _validate_rif(self, cr, uid, vat, context=None):
    '''validates if the VE VAT NUMBER is right
    @param vat: string: Vat number to Check
    returns vat when right otherwise returns False

    '''
    if not vat:
        return False

    if 'VE' in vat:
        vat = vat[2:]

    if re.search(r'^[VJEGP][0-9]{9}$', vat):
        valid_digit = self._get_valid_digit(cr, uid, vat, context=context)
        if valid_digit is None:
            return False
        if int(vat[9]) == valid_digit:
            return vat
        else:
            self._print_error(_('Vat Error !'), _('Invalid VAT!'))
    elif re.search(r'^([VE][0-9]{1,8})$', vat):
        vat = vat[0] + vat[1:].rjust(8, '0')
        valid_digit = self._get_valid_digit(cr, uid, vat, context=context)
        vat += str(valid_digit)
        return vat
    return False

Any ideas?

Upvotes: 0

Views: 515

Answers (1)

Phillip Stack
Phillip Stack

Reputation: 3378

Replace with this

valid_digit = self._get_valid_digit(vat)

In your original function you were passing the vat argument. You correctly removed the other cr,uid,and context arguments which are passed automatically in the new api however this particular function seems to have a requirement for the vat argument.

Upvotes: 1

Related Questions