from odoo import models, fields, api
|
|
from odoo.exceptions import UserError, ValidationError, Warning
|
|
from psycopg2 import sql, DatabaseError
|
|
|
|
from werkzeug import utils
|
|
import re
|
|
from string import ascii_uppercase
|
|
|
|
class partner(models.Model):
|
|
_inherit = 'res.partner'
|
|
|
|
|
|
def _compute_address_count(self):
|
|
# The current user may not have access rights for donations
|
|
for partner in self:
|
|
try:
|
|
partner.address_count = len(partner.address_ids)
|
|
except Exception:
|
|
partner.address_count = 0
|
|
|
|
def _compute_email_count(self):
|
|
# The current user may not have access rights for donations
|
|
for partner in self:
|
|
try:
|
|
partner.email_count = len(partner.email_ids)
|
|
except Exception:
|
|
partner.email_count = 0
|
|
|
|
def _compute_phone_count(self):
|
|
# The current user may not have access rights for donations
|
|
for partner in self:
|
|
try:
|
|
partner.phone_count = len(partner.phone_ids)
|
|
except Exception:
|
|
partner.phone_count = 0
|
|
|
|
def _compute_relationshipPartner_count(self):
|
|
# The current user may not have access rights for donations
|
|
for partner in self:
|
|
try:
|
|
partner.relationshipPartner_count = len(partner.relationshipPartner_ids)
|
|
except Exception:
|
|
partner.relationshipPartner_count = 0
|
|
|
|
def _compute_recurring_donation_count(self):
|
|
# The current user may not have access rights for donations
|
|
for partner in self:
|
|
try:
|
|
partner.recurring_donation_count=self.env['donation.donation'].search_count(['&',('recurring_template','!=',''),('partner_id','=',int(partner.id))])
|
|
|
|
except Exception:
|
|
partner.recurring_donation_count = 0
|
|
|
|
qualifier_ids = fields.One2many(
|
|
'opendons_qualifier.partnerqualifier',
|
|
'partner_id',
|
|
string='Qualifier',
|
|
readonly=True
|
|
)
|
|
|
|
|
|
address_ids = fields.One2many(
|
|
'opendons.partneraddress',
|
|
'partner_id',
|
|
string='Address',
|
|
readonly=True
|
|
)
|
|
|
|
|
|
request_ids = fields.Many2many('opendons.request', 'request_partner_rel', 'partner_id', 'request_id', string='requests')
|
|
operation_ids = fields.Many2many('opendons.operation', 'operation_partner_rel', 'partner_id', 'operation_id', string='operations')
|
|
operation_excl_ids = fields.Many2many('opendons.operation', 'operation_excl_partner_rel', 'partner_id', 'operation_id', string='excluded operations')
|
|
segment_ids = fields.Many2many('opendons.segment', 'segment_partner_rel', 'partner_id', 'segment_id', string='segments')
|
|
|
|
|
|
address_count = fields.Integer(
|
|
compute='_compute_address_count',
|
|
string="# of Addresses",
|
|
readonly=True
|
|
)
|
|
relationshipPartner_ids = fields.One2many(
|
|
'opendons_relationship.partner',
|
|
'partner_id',
|
|
string='Relationship',
|
|
readonly=True
|
|
)
|
|
relationshipPartner_count = fields.Integer(
|
|
compute='_compute_relationshipPartner_count',
|
|
string="# of Relationship",
|
|
readonly=True
|
|
)
|
|
email_ids = fields.One2many(
|
|
'opendons.partneremail',
|
|
'partner_id',
|
|
string='Email',
|
|
readonly=True
|
|
)
|
|
email_count = fields.Integer(
|
|
compute='_compute_email_count',
|
|
string="# of email",
|
|
readonly=True
|
|
)
|
|
phone_ids = fields.One2many(
|
|
'opendons.partnerphone',
|
|
'partner_id',
|
|
string='Phone',
|
|
readonly=True
|
|
)
|
|
phone_count = fields.Integer(
|
|
compute='_compute_phone_count',
|
|
string="# of phone",
|
|
readonly=True
|
|
)
|
|
recurring_donation_count = fields.Integer(
|
|
compute='_compute_recurring_donation_count',
|
|
string="# of recurring donation",
|
|
readonly=True
|
|
)
|
|
|
|
key=fields.Char(
|
|
string="Key",
|
|
store=True,
|
|
readonly=True
|
|
|
|
)
|
|
firstname=fields.Char(string="First name")
|
|
npai_count=fields.Integer(String="NPAI count", readonly=True)
|
|
source=fields.Char(String="source")
|
|
|
|
def _alpha(self,id):
|
|
alpha={}
|
|
alpha[1]='A'
|
|
alpha[2]='B'
|
|
alpha[3]='C'
|
|
alpha[4]='D'
|
|
alpha[5]='E'
|
|
alpha[6]='F'
|
|
alpha[7]='G'
|
|
alpha[8]='H'
|
|
alpha[9]='I'
|
|
alpha[10]='J'
|
|
alpha[11]='K'
|
|
alpha[12]='L'
|
|
alpha[13]='M'
|
|
alpha[14]='N'
|
|
alpha[15]='O'
|
|
alpha[16]='P'
|
|
alpha[17]='Q'
|
|
alpha[18]='R'
|
|
alpha[19]='S'
|
|
alpha[20]='T'
|
|
alpha[21]='U'
|
|
alpha[22]='V'
|
|
alpha[23]='W'
|
|
alpha[24]='X'
|
|
alpha[25]='Y'
|
|
alpha[26]='Z'
|
|
return (alpha[id%26])
|
|
|
|
def _compute_key(self):
|
|
|
|
|
|
self.key==self._alpha(int(self.id))
|
|
|
|
|
|
@api.model
|
|
def create(self, values):
|
|
# Override the original create function for the res.partner model
|
|
record = super(partner, self).create(values)
|
|
|
|
# Change the values of a variable in this super function
|
|
record['key'] = self._alpha(int(record.id))
|
|
|
|
# Return the record so that the changes are applied and everything is stored.
|
|
return record
|
|
|
|
def _compute_all_key(self):
|
|
|
|
for rec in self.env['res.partner'].search([]):
|
|
rec.key=self._alpha(int(rec.id))
|
|
|
|
|
|
def _update_source(self):
|
|
|
|
|
|
for rec in self.env['res.partner'].search([]):
|
|
rec.source='joomla'
|
|
|
|
|
|
def _remove_source(self):
|
|
|
|
self.env["res.partner"].search([('source','=','joomla')]).unlink()
|
|
|
|
|
|
|
|
@api.onchange('street')
|
|
def _onchange_street(self):
|
|
for rec in self:
|
|
rec.npai_count=0
|
|
return
|
|
|
|
@api.constrains('email')
|
|
def _onchange_email(self):
|
|
if self.email:
|
|
if not self.image_1920 and self._context.get('gravatar_image') and self.email:
|
|
self.image_1920 = self._get_gravatar_image(self.email)
|
|
regex = re.compile(r'([A-Za-z0-9]+[.-_])*[A-Za-z0-9]+@[A-Za-z0-9-]+(\.[A-Z|a-z]{2,})+')
|
|
if not re.fullmatch(regex, self.email):
|
|
|
|
raise ValidationError('Invalid email')
|
|
|
|
@api.constrains('phone')
|
|
def _onchange_phone(self):
|
|
if self.mobile:
|
|
regex = re.compile(r'(^(?:(?:\+|00)33[\s.-]{0,3}(?:\(0\)[\s.-]{0,3})?|0)[1-9](?:(?:[\s.-]?\d{2}){4}|\d{2}(?:[\s.-]?\d{3}){2})$)+')
|
|
|
|
# 0123456789
|
|
# 01 23 45 67 89
|
|
# 01.23.45.67.89
|
|
# 0123 45.67.89
|
|
# 0033 123-456-789
|
|
# +33-1.23.45.67.89
|
|
# +33 - 123 456 789
|
|
# +33(0) 123 456 789
|
|
# +33 (0)123 45 67 89
|
|
# +33 (0)1 2345-6789
|
|
# +33(0) - 123456789
|
|
|
|
|
|
if not re.fullmatch(regex, self.phone):
|
|
|
|
raise ValidationError('Invalid phone')
|
|
|
|
@api.constrains('mobile')
|
|
def _onchange_mobile(self):
|
|
if self.mobile:
|
|
regex = re.compile(r'(^(?:(?:\+|00)33[\s.-]{0,3}(?:\(0\)[\s.-]{0,3})?|0)[1-9](?:(?:[\s.-]?\d{2}){4}|\d{2}(?:[\s.-]?\d{3}){2})$)+')
|
|
|
|
# 0123456789
|
|
# 01 23 45 67 89
|
|
# 01.23.45.67.89
|
|
# 0123 45.67.89
|
|
# 0033 123-456-789
|
|
# +33-1.23.45.67.89
|
|
# +33 - 123 456 789
|
|
# +33(0) 123 456 789
|
|
# +33 (0)123 45 67 89
|
|
# +33 (0)1 2345-6789
|
|
# +33(0) - 123456789
|
|
|
|
|
|
if not re.fullmatch(regex, self.mobile):
|
|
|
|
raise ValidationError('Invalid mobile')
|
|
|
|
|
|
class ResPartnerBank(models.Model):
|
|
_inherit = 'res.partner.bank'
|
|
|
|
@api.onchange('acc_number')
|
|
def _onchange_acc_number(self):
|
|
#validation IBAN
|
|
#https://www.regextester.com/115565
|
|
if self.acc_number:
|
|
|
|
regex = re.compile(r'(^(?:(?:IT|SM)\d{2}[A-Z]\d{22}|CY\d{2}[A-Z]\d{23}|NL\d{2}[A-Z]{4}\d{10}|LV\d{2}[A-Z]{4}\d{13}|(?:BG|BH|GB|IE)\d{2}[A-Z]{4}\d{14}|GI\d{2}[A-Z]{4}\d{15}|RO\d{2}[A-Z]{4}\d{16}|KW\d{2}[A-Z]{4}\d{22}|MT\d{2}[A-Z]{4}\d{23}|NO\d{13}|(?:DK|FI|GL|FO)\d{16}|MK\d{17}|(?:AT|EE|KZ|LU|XK)\d{18}|(?:BA|HR|LI|CH|CR)\d{19}|(?:GE|DE|LT|ME|RS)\d{20}|IL\d{21}|(?:AD|CZ|ES|MD|SA)\d{22}|PT\d{23}|(?:BE|IS)\d{24}|(?:FR|MR|MC)\d{25}|(?:AL|DO|LB|PL)\d{26}|(?:AZ|HU)\d{27}|(?:GR|MU)\d{28})$)+')
|
|
|
|
if not re.fullmatch(regex, self.acc_number):
|
|
|
|
raise Warning('Invalid IBAN')
|
|
|
|
@api.constrains('acc_number')
|
|
def _onchange_acc_number(self):
|
|
#validation IBAN
|
|
#https://www.regextester.com/115565
|
|
if self.acc_number:
|
|
|
|
regex = re.compile(r'(/^(?:(?:IT|SM)\d{2}[A-Z]\d{22}|CY\d{2}[A-Z]\d{23}|NL\d{2}[A-Z]{4}\d{10}|LV\d{2}[A-Z]{4}\d{13}|(?:BG|BH|GB|IE)\d{2}[A-Z]{4}\d{14}|GI\d{2}[A-Z]{4}\d{15}|RO\d{2}[A-Z]{4}\d{16}|KW\d{2}[A-Z]{4}\d{22}|MT\d{2}[A-Z]{4}\d{23}|NO\d{13}|(?:DK|FI|GL|FO)\d{16}|MK\d{17}|(?:AT|EE|KZ|LU|XK)\d{18}|(?:BA|HR|LI|CH|CR)\d{19}|(?:GE|DE|LT|ME|RS)\d{20}|IL\d{21}|(?:AD|CZ|ES|MD|SA)\d{22}|PT\d{23}|(?:BE|IS)\d{24}|(?:FR|MR|MC)\d{25}|(?:AL|DO|LB|PL)\d{26}|(?:AZ|HU)\d{27}|(?:GR|MU)\d{28})$)+')
|
|
|
|
if not re.fullmatch(regex, self.acc_number):
|
|
|
|
raise Warning('Invalid IBAN')
|