partner.py
2.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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