From acdd537de6f01b943ff1e3863b19239792ac5ffb Mon Sep 17 00:00:00 2001 From: Samir Ladoui Date: Mon, 5 May 2025 12:00:16 +0100 Subject: [PATCH 01/22] [FIX] odex25_website_event_track_gantt --- odex25_sales/odex25_website_event_track_gantt/i18n/ar.po | 1 - 1 file changed, 1 deletion(-) diff --git a/odex25_sales/odex25_website_event_track_gantt/i18n/ar.po b/odex25_sales/odex25_website_event_track_gantt/i18n/ar.po index 926c47a6b..971290140 100644 --- a/odex25_sales/odex25_website_event_track_gantt/i18n/ar.po +++ b/odex25_sales/odex25_website_event_track_gantt/i18n/ar.po @@ -113,7 +113,6 @@ msgid "State" msgstr "المحافظة" #. module: odex25_website_event_track_gantt -#: model:ir.model.fields,field_description:odex25_website_event_track_gantt.field_event_event__state_id #: model_terms:ir.ui.view,arch_db:odex25_website_event_track_gantt.event_event_view_form msgid "Country" msgstr "الدولة" From 9225ed0af952961c088926e86fecabf29754e061 Mon Sep 17 00:00:00 2001 From: Esraa-Exp Date: Sat, 10 May 2025 12:43:41 +0200 Subject: [PATCH 02/22] stop contrain --- .../dev_membership/models/res_partner.py | 95 +++++++++++++++---- 1 file changed, 78 insertions(+), 17 deletions(-) diff --git a/odex25_sales/dev_membership/models/res_partner.py b/odex25_sales/dev_membership/models/res_partner.py index be396d38f..ca387b5ea 100644 --- a/odex25_sales/dev_membership/models/res_partner.py +++ b/odex25_sales/dev_membership/models/res_partner.py @@ -11,6 +11,10 @@ from odoo import fields, models, api,_ from datetime import datetime +from odoo.exceptions import Warning, ValidationError +import re +import logging +_logger = logging.getLogger(__name__) class Partner(models.Model): _inherit = 'res.partner' @@ -66,22 +70,26 @@ class Partner(models.Model): partner.product_id = last_membership_id.product_id.id @api.depends('active_membership_id') def _compute_membership_end(self): - for partner in self: - partner.memebership_end_date = False - if partner.membership_count > 0: - if partner.active_membership_id: - membership_id = self.env['dev.membership'].sudo().search([ - ('partner_id', '=', partner.id), - ('state', '=', 'active'), - ('product_id', '=', partner.active_membership_id.product_id.id)], order='to_date desc', limit=1) - if membership_id: - partner.memebership_end_date = membership_id.to_date - else: - membership_id = self.env['dev.membership'].sudo().search([ - ('partner_id', '=', partner.id), - ('state', 'in', ('expire','cancel'))], order='to_date desc', limit=1) - if membership_id: - partner.memebership_end_date = membership_id.to_date + for partner in self: + partner.membership_end_date = False + if partner.membership_count > 0: + if partner.active_membership_id: + # Search for the latest active membership with the same product + membership = self.env['dev.membership'].sudo().search([ + ('partner_id', '=', partner.id), + ('state', '=', 'active'), + ('product_id', '=', partner.active_membership_id.product_id.id) + ], order='to_date desc', limit=1) + if membership: + partner.membership_end_date = membership.to_date + else: + # Find the latest expired or cancelled membership + membership = self.env['dev.membership'].sudo().search([ + ('partner_id', '=', partner.id), + ('state', 'in', ('expire', 'cancel')) + ], order='to_date desc', limit=1) + if membership: + partner.membership_end_date = membership.to_date @api.depends('active_membership_id') def _compute_membership_level(self): @@ -156,4 +164,57 @@ class Partner(models.Model): 'domain': [('id', '=', board_nominations)], 'view_mode': 'tree,form', 'target': 'current', - } \ No newline at end of file + } + + + + + @api.constrains('identification_number', 'is_member') + def _check_id_no_required_if_member(self): + for record in self: + if record.is_member and not record.identification_number: + raise ValidationError(_("ID number is required for members.")) + + @api.constrains('mobile', 'is_member') + def _check_mobile_required_if_member(self): + for record in self: + if record.is_member and not record.mobile: + raise ValidationError(_("Mobile number is required for members.")) + + @api.constrains('mobile', 'identification_number') + def _check_unique_mobile_id(self): + for record in self: + if record.mobile: + existing_mobile = self.search([ + ('mobile', '=', record.mobile), + ('id', '!=', record.id) + ], limit=1) + if existing_mobile: + raise ValidationError(_("Mobile number must be unique.")) + if record.identification_number: + existing_id = self.search([ + ('identification_number', '=', record.identification_number), + ('id', '!=', record.id) + ], limit=1) + if existing_id: + raise ValidationError(_("ID number must be unique.")) + + # @api.constrains('mobile') + # def _check_mobile_format(self): + # print("Test constraint running!") + # for record in self: + # print("Checking mobile format: %s", record.mobile) + # if record.mobile and (len(record.mobile) != 10 or not record.mobile.isdigit()): + # raise ValidationError(_("Mobile number must be exactly 10 digits.")) + + # Optional: Add SQL constraints for uniqueness + _sql_constraints = [ + ('unique_mobile', 'UNIQUE(mobile)', 'Mobile number must be unique.'), + ('unique_identification_number', 'UNIQUE(identification_number)', 'ID number must be unique.'), + ] + + + + + + From 7b0111167ecb99c93aef6a8b809955cee2dd44fc Mon Sep 17 00:00:00 2001 From: ahmed-nouri051 Date: Sun, 11 May 2025 10:42:31 +0200 Subject: [PATCH 03/22] fix temlates for sales --- odex25_sales/dev_membership/data/mail_template.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/odex25_sales/dev_membership/data/mail_template.xml b/odex25_sales/dev_membership/data/mail_template.xml index 41d7f8704..8d50b91b7 100644 --- a/odex25_sales/dev_membership/data/mail_template.xml +++ b/odex25_sales/dev_membership/data/mail_template.xml @@ -1,5 +1,7 @@ + + Membership Created 20 @@ -100,5 +102,5 @@

Your membership ${(object.name)} was expired on ${object.datetime_convert()} date.

]]>
- +
From 83204154c36f1c4ec49c35236cc0e6a3ef48eaab Mon Sep 17 00:00:00 2001 From: ahmed-nouri051 Date: Sun, 11 May 2025 10:46:21 +0200 Subject: [PATCH 04/22] fix tempaltes --- .../odex25_sale_subscription/data/mail_template_data.xml | 6 +++++- odex25_sales/sale_custom/data/mail_data.xml | 3 ++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/odex25_sales/odex25_sale_subscription/data/mail_template_data.xml b/odex25_sales/odex25_sale_subscription/data/mail_template_data.xml index aea2f67be..8dd4934d9 100644 --- a/odex25_sales/odex25_sale_subscription/data/mail_template_data.xml +++ b/odex25_sales/odex25_sale_subscription/data/mail_template_data.xml @@ -1,5 +1,7 @@ - + + + Subscription: Payment Failure @@ -466,4 +468,6 @@ ${object.partner_id.lang} + + diff --git a/odex25_sales/sale_custom/data/mail_data.xml b/odex25_sales/sale_custom/data/mail_data.xml index 49cafa3cf..6ba09fd33 100644 --- a/odex25_sales/sale_custom/data/mail_data.xml +++ b/odex25_sales/sale_custom/data/mail_data.xml @@ -1,6 +1,7 @@ - + +
From 4d2757f3fc620c2e06f9ed171a9a23d4bc2b0ca7 Mon Sep 17 00:00:00 2001 From: Esraa-Exp Date: Sun, 11 May 2025 19:42:31 +0200 Subject: [PATCH 05/22] Update res_partner.py --- .../dev_membership/models/res_partner.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/odex25_sales/dev_membership/models/res_partner.py b/odex25_sales/dev_membership/models/res_partner.py index 1a87a3a83..bdc423341 100644 --- a/odex25_sales/dev_membership/models/res_partner.py +++ b/odex25_sales/dev_membership/models/res_partner.py @@ -199,13 +199,13 @@ class Partner(models.Model): if existing_id: raise ValidationError(_("ID number must be unique.")) - # @api.constrains('mobile') - # def _check_mobile_format(self): - # print("Test constraint running!") - # for record in self: - # print("Checking mobile format: %s", record.mobile) - # if record.mobile and (len(record.mobile) != 10 or not record.mobile.isdigit()): - # raise ValidationError(_("Mobile number must be exactly 10 digits.")) + @api.constrains('mobile') + def _check_mobile_format(self): + print("Test constraint running!") + for record in self: + print("Checking mobile format: %s", record.mobile) + if record.mobile and (len(record.mobile) != 10 or not record.mobile.isdigit()): + raise ValidationError(_("Mobile number must be exactly 10 digits.")) # Optional: Add SQL constraints for uniqueness @@ -217,4 +217,4 @@ class Partner(models.Model): - \ No newline at end of file + From 2736b44b9e213fdea43468768d2668f0e84ee9d5 Mon Sep 17 00:00:00 2001 From: Esraa-Exp Date: Sun, 11 May 2025 20:34:31 +0200 Subject: [PATCH 06/22] stop mobile constrain --- odex25_sales/dev_membership/models/res_partner.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/odex25_sales/dev_membership/models/res_partner.py b/odex25_sales/dev_membership/models/res_partner.py index bdc423341..4dcbc07a5 100644 --- a/odex25_sales/dev_membership/models/res_partner.py +++ b/odex25_sales/dev_membership/models/res_partner.py @@ -199,13 +199,13 @@ class Partner(models.Model): if existing_id: raise ValidationError(_("ID number must be unique.")) - @api.constrains('mobile') - def _check_mobile_format(self): - print("Test constraint running!") - for record in self: - print("Checking mobile format: %s", record.mobile) - if record.mobile and (len(record.mobile) != 10 or not record.mobile.isdigit()): - raise ValidationError(_("Mobile number must be exactly 10 digits.")) + # @api.constrains('mobile') + # def _check_mobile_format(self): + # print("Test constraint running!") + # for record in self: + # print("Checking mobile format: %s", record.mobile) + # if record.mobile and (len(record.mobile) != 10 or not record.mobile.isdigit()): + # raise ValidationError(_("Mobile number must be exactly 10 digits.")) # Optional: Add SQL constraints for uniqueness From 6685aac6a1782eef9cd388d545592debc7cfb448 Mon Sep 17 00:00:00 2001 From: ahmed-nouri051 Date: Mon, 12 May 2025 08:53:26 +0200 Subject: [PATCH 07/22] fix membership --- odex25_sales/dev_membership/i18n/ar_001.po | 8 +- .../models/membership_cancel_request.py | 3 +- .../dev_membership/models/res_partner.py | 75 +++++++++---------- .../dev_membership/security/security.xml | 5 +- .../dev_membership/views/dev_membership.xml | 2 +- .../dev_membership/views/partner_extended.xml | 8 ++ 6 files changed, 56 insertions(+), 45 deletions(-) diff --git a/odex25_sales/dev_membership/i18n/ar_001.po b/odex25_sales/dev_membership/i18n/ar_001.po index 7bd3bdfc1..65e68af46 100644 --- a/odex25_sales/dev_membership/i18n/ar_001.po +++ b/odex25_sales/dev_membership/i18n/ar_001.po @@ -1572,4 +1572,10 @@ msgstr "المرشحين" #. module: dev_membership #: model:ir.actions.report,name:dev_membership.menu_print_membership_nomination msgid "Print Membership Nomination" -msgstr "طباعة المرشحين للعضوية" \ No newline at end of file +msgstr "طباعة المرشحين للعضوية" + +#. module: dev_membership +#: code:addons/dev_membership/models/res_partner.py:10 +#, python-format +msgid "email must be unique." +msgstr "يجب أن يكون البريد الإلكتروني فريدًا." \ No newline at end of file diff --git a/odex25_sales/dev_membership/models/membership_cancel_request.py b/odex25_sales/dev_membership/models/membership_cancel_request.py index 8a9802cd5..3f8490119 100644 --- a/odex25_sales/dev_membership/models/membership_cancel_request.py +++ b/odex25_sales/dev_membership/models/membership_cancel_request.py @@ -28,7 +28,8 @@ class MembershipCancellationRequest(models.Model): rec.membership_id.partner_id.memebership_end_date = request_date rec.membership_id.request_date = request_date rec.state = 'approved' - rec.membership_id.state = 'cancel' + if rec.membership_id.state=='active': + rec.membership_id.state = 'cancel' rec.membership_id.partner_id.check_active_membership() def action_reject(self): diff --git a/odex25_sales/dev_membership/models/res_partner.py b/odex25_sales/dev_membership/models/res_partner.py index 1a87a3a83..2dac89c37 100644 --- a/odex25_sales/dev_membership/models/res_partner.py +++ b/odex25_sales/dev_membership/models/res_partner.py @@ -19,7 +19,10 @@ _logger = logging.getLogger(__name__) class Partner(models.Model): _inherit = 'res.partner' - is_member = fields.Boolean(string='Is Member') + is_member = fields.Boolean(string='Is Member' ,default=False) + mobile = fields.Char(copy=False) + identification_number = fields.Char(copy=False) + email = fields.Char(copy=False) membership_count = fields.Integer(string="Membership Count", compute="_get_membership_count") active_membership_id = fields.Many2one('dev.membership', string='Membership', compute='check_active_membership') membrship_level = fields.Many2one('membership.level',string='Membrship level',store=True,compute='_compute_membership_level') @@ -169,50 +172,46 @@ class Partner(models.Model): - @api.constrains('identification_number', 'is_member') - def _check_id_no_required_if_member(self): - for record in self: - if record.is_member and not record.identification_number: - raise ValidationError(_("ID number is required for members.")) + - @api.constrains('mobile', 'is_member') - def _check_mobile_required_if_member(self): - for record in self: - if record.is_member and not record.mobile: - raise ValidationError(_("Mobile number is required for members.")) + - @api.constrains('mobile', 'identification_number') + @api.constrains('mobile', 'identification_number','email') def _check_unique_mobile_id(self): - for record in self: - if record.mobile: - existing_mobile = self.search([ - ('mobile', '=', record.mobile), - ('id', '!=', record.id) - ], limit=1) - if existing_mobile: - raise ValidationError(_("Mobile number must be unique.")) - if record.identification_number: - existing_id = self.search([ - ('identification_number', '=', record.identification_number), - ('id', '!=', record.id) - ], limit=1) - if existing_id: - raise ValidationError(_("ID number must be unique.")) + for record in self: + if record.mobile: + existing_mobile = self.search([ + ('mobile', '=', record.mobile), + ('id', '!=', record.id) + ], limit=1) + if existing_mobile: + raise ValidationError(_("Mobile number must be unique.")) + if record.identification_number: + existing_id = self.search([ + ('identification_number', '=', record.identification_number), + ('id', '!=', record.id) + ], limit=1) + if existing_id: + raise ValidationError(_("ID number must be unique.")) + if record.email: + existing_email = self.search([ + ('email', '=', record.email), + ('id', '!=', record.id) + ], limit=1) + if existing_email: + raise ValidationError(_("email must be unique.")) - # @api.constrains('mobile') - # def _check_mobile_format(self): - # print("Test constraint running!") - # for record in self: - # print("Checking mobile format: %s", record.mobile) - # if record.mobile and (len(record.mobile) != 10 or not record.mobile.isdigit()): - # raise ValidationError(_("Mobile number must be exactly 10 digits.")) + @api.onchange('mobile') + def _check_mobile_format(self): + print("Test constraint running!") + for record in self: + print("Checking mobile format: %s", record.mobile) + if record.mobile and (len(record.mobile) != 10 or not record.mobile.isdigit()): + raise ValidationError(_("Mobile number must be exactly 10 digits.")) # Optional: Add SQL constraints for uniqueness - _sql_constraints = [ - ('unique_mobile', 'UNIQUE(mobile)', 'Mobile number must be unique.'), - ('unique_identification_number', 'UNIQUE(identification_number)', 'ID number must be unique.'), - ] + diff --git a/odex25_sales/dev_membership/security/security.xml b/odex25_sales/dev_membership/security/security.xml index 682252a1f..0faea90a8 100644 --- a/odex25_sales/dev_membership/security/security.xml +++ b/odex25_sales/dev_membership/security/security.xml @@ -39,8 +39,5 @@ [(1,'=',1)] - - Sale/Purchase Tab - - + diff --git a/odex25_sales/dev_membership/views/dev_membership.xml b/odex25_sales/dev_membership/views/dev_membership.xml index 3ec72d24e..6d6c44264 100644 --- a/odex25_sales/dev_membership/views/dev_membership.xml +++ b/odex25_sales/dev_membership/views/dev_membership.xml @@ -48,7 +48,7 @@ attrs="{'invisible':['|',('membership_id','!=',False),('state','not in',['expire','active','cancel'])]}"/>