partner.py 2.13 KB
import logging
from psycopg2 import DatabaseError, sql

from odoo import fields, models, api, _
from odoo.exceptions import UserError
# from odoo.tools import sql

_logger = logging.getLogger(__name__)


class ResPartner(models.Model):
    _inherit = 'res.partner'
    supplier_rank = fields.Integer(default=0)
    customer_rank = fields.Integer(default=0)
    company_id = fields.Many2one(
        'res.company', string="Company",
        default=lambda self: self.env.company.id
        if not self.company_id else False)
    type = fields.Selection(
        selection_add=[('ppat', 'PPAT'),
                       ('wp', 'Wajib Pajak')],
        ondelete={
            'ppat': 'cascade',
            'wp': 'cascade',
        })

    def write(self, vals):
        _logger.info(vals)
        if self.env.user.has_group('bphtb_kab.group_bphtb_ppat'):
            _logger.info(f'has groups {self.create_uid.id} {self.env.user.id}')
            if self.create_uid.id != self.env.user.id:
                _logger.info('different')
                raise UserError(_("You are not a record owner"))
        res = super(ResPartner, self).write(vals)
        return res

    def _increase_rank(self, field, n=1):
        if self.ids and field in ['customer_rank', 'supplier_rank']:
            try:
                with self.env.cr.savepoint(flush=False):
                    query = sql.SQL("""
                        SELECT {field} FROM res_partner WHERE ID IN %(partner_ids)s FOR UPDATE NOWAIT;
                        UPDATE res_partner SET {field} = {field} + %(n)s
                        WHERE id IN %(partner_ids)s
                    """).format(field=sql.Identifier(field))
                    self.env.cr.execute(query, {'partner_ids': tuple(self.ids), 'n': n})
                    for partner in self:
                        self.env.cache.remove(partner, partner._fields[field])
            except DatabaseError as e:
                if e.pgcode == '55P03':
                    _logger.debug('Another transaction already locked partner rows. Cannot update partner ranks.')
                else:
                    raise e