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' type = fields.Selection( [('contact', 'Contact'), ('invoice', 'Invoice Address'), ('delivery', 'Delivery Address'), ('other', 'Other Address'), ("private", "Private Address"), ], string='Address Type', default='private', help="Invoice & Delivery addresses are used in sales orders. Private addresses are only visible by authorized users.") locality=fields.Char('Locality') tax_street=fields.Char('Street') tax_street2=fields.Char('Street2') tax_locality=fields.Char('Locality') tax_city=fields.Char('City') tax_zip=fields.Char('Zip ') tax_country_id=fields.Many2one('res.country') 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") donor_id=fields.Char('Donor id',compute="_compute_donor_id") def _compute_donor_id(self): for rec in self: rec.donor_id=str(rec.id)+rec.key def _alpha(self,id): alpha={} alpha[0]='A' alpha[1]='B' alpha[2]='C' alpha[3]='D' alpha[4]='E' alpha[5]='F' alpha[6]='G' alpha[7]='H' alpha[8]='I' alpha[9]='J' alpha[10]='K' alpha[11]='L' alpha[12]='M' alpha[13]='N' alpha[14]='P' alpha[15]='Q' alpha[16]='R' alpha[17]='S' alpha[18]='T' alpha[19]='U' alpha[20]='V' alpha[21]='W' alpha[22]='X' alpha[23]='Y' alpha[24]='Z' return (alpha[id%25]) 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')