from odoo import models, fields, api from odoo.exceptions import UserError, ValidationError, Warning from psycopg2 import sql, DatabaseError from werkzeug import utils import re class partner(models.Model): _inherit = 'res.partner' # @api.depends('qualifier_ids.partner_id') # def _compute_text_qualifier_count(self): # # The current user may not have access rights for donations # for partner in self: # try: # partner.text_qualifier_count = len(partner.qualifier_ids) # except Exception: # partner.text_qualifier_count = 0 # @api.depends('qualifier_ids.partner_id') # def _compute_bool_qualifier_count(self): # # The current user may not have access rights for donations # for partner in self: # try: # for qualifier_id in partner.qualifier_ids: # partner.bool_qualifier_count =self.env['opendons_qualifier.partnerqualifier'].search([(partner.qual_i # except Exception: # partner.bool_qualifier_count = 0 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 ) # text_qualifier_count = fields.Integer( # compute='_compute_text_qualifier_count', # string="# of Qualifiers", # readonly=True # ) # bool_qualifier_count = fields.Integer( # compute='_compute_bool_qualifier_count', # string="# of Qualifiers", # readonly=True # ) address_ids = fields.One2many( 'opendons.partneraddress', 'partner_id', string='Address', readonly=True ) # request_ids = fields.One2many( # 'opendons.request', # 'partner_ids', # string='Request', # 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.Integer( compute='_compute_key', 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 _compute_key(self): for rec in self: rec.key=int(rec.id)*40456 def _compute_all_key(self): #for rec in self.env: #rec.write({'key':3}) #raise Warning(rec.id) for rec in self.env['res.partner'].search([]): rec.key=int(rec.id)*40456 #raise Warning(len()) def _update_source(self): #for rec in self.env: #rec.write({'key':3}) #raise Warning(rec.id) for rec in self.env['res.partner'].search([]): rec.source='joomla' #raise Warning(len()) def _remove_source(self): #for rec in self.env: #rec.write({'key':3}) #raise Warning(rec.id) self.env["res.partner"].search([('source','=','joomla')]).unlink() #raise Warning(len()) @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')