Skip to content

Commit db1be2c

Browse files
committed
[FIX] website_event_attendee_fields: учитываем все контакты с введенной почтой при проверке на существующую регистрацию
1 parent 125980c commit db1be2c

4 files changed

Lines changed: 77 additions & 37 deletions

File tree

website_event_attendee_fields/controllers/main.py

Lines changed: 8 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
# ruff: noqa: E501
2-
import re
3-
41
from odoo import _, http
52
from odoo.http import request
63
from odoo.tools.mail import email_normalize
@@ -55,40 +52,20 @@ def check_email(self, event_id, email):
5552
return {"email_not_allowed": _("Invalid email")}
5653

5754
current_user = request.env.user
58-
if email == current_user.email:
59-
partner = current_user.partner_id
60-
else:
61-
partner = Partners.search([("email", "=", email)], limit=1)
62-
55+
partner = Partners.search([("email_normalized", "=", email)])
6356
if not partner:
64-
65-
def remove_spaces(s):
66-
s = re.sub(r"^\s*", "", s)
67-
s = re.sub(r"\s*$", "", s)
68-
return s
69-
70-
email = remove_spaces(email)
71-
partner = Partners.search(
72-
[
73-
"|",
74-
"|",
75-
("email", "=ilike", "% " + email),
76-
("email", "=ilike", "% " + email + " %"),
77-
("email", "=ilike", email + " %"),
78-
],
79-
limit=1,
80-
)
81-
if not partner:
82-
return {}
83-
partner_email = remove_spaces(partner.email)
84-
# It's a workaround in order to prevent duplicating partner accounts when buying a ticket
85-
partner.write({"email": partner_email})
57+
return {}
8658

8759
event = request.env["event.event"].sudo().browse(event_id)
88-
error_msg = event.check_partner_for_new_ticket(partner.id)
60+
error_msg = event.check_partner_for_new_ticket(partner.ids)
8961
if error_msg:
9062
return {"email_not_allowed": error_msg}
9163

64+
if current_user.partner_id in partner:
65+
partner = current_user.partner_id
66+
else:
67+
partner = partner.sorted("id", reverse=True)[0]
68+
9269
known_fields = {}
9370
do_not_disable_fields = {}
9471

website_event_attendee_fields/models/event_event.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ def _compute_partner_questions(self):
1515
lambda q: q.question_type == "partner_field"
1616
)
1717

18-
def check_partner_for_new_ticket(self, partner_id):
19-
if self.partner_is_participating(partner_id):
18+
def check_partner_for_new_ticket(self, partner_ids):
19+
if self.partners_are_participating(partner_ids):
2020
return _("This email address is already signed up for the event")
2121
return None
2222

23-
def partner_is_participating(self, partner_id):
23+
def partners_are_participating(self, partner_ids):
2424
self.ensure_one()
2525
registration = (
2626
self.env["event.registration"]
@@ -29,10 +29,10 @@ def partner_is_participating(self, partner_id):
2929
[
3030
("event_id", "=", self.id),
3131
"|",
32-
("attendee_partner_id", "=", partner_id),
32+
("attendee_partner_id", "in", partner_ids),
3333
"&",
3434
("attendee_partner_id", "=", False),
35-
("partner_id", "=", partner_id),
35+
("partner_id", "in", partner_ids),
3636
("state", "=", "open"),
3737
]
3838
)

website_event_attendee_fields/models/ir_ui_view.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,16 @@ def _render_template(self, template, values=None):
1111

1212
are_tickets_different = len(set(map(lambda x: x["id"], tickets))) > 1
1313
user = self.env.user
14+
partners = (
15+
self.sudo()
16+
.env["res.partner"]
17+
.search([("email_normalized", "=", user.email_normalized)])
18+
)
1419

1520
if (
1621
are_tickets_different
1722
or user._is_public()
18-
or event.partner_is_participating(user.partner_id.id)
23+
or event.partners_are_participating(partners.ids)
1924
):
2025
values["default_first_attendee"] = {}
2126

website_event_attendee_fields/tests/test_backend.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,61 @@ def test_emails_duplicates(self):
6666
with MockRequest(self.env), self.assertRaises(AssertionError):
6767
obj = WebsiteEventControllerExtended()
6868
obj.registration_confirm(event, **post)
69+
70+
def test_check_email_01(self):
71+
event = self.env["event.event"].create(
72+
{
73+
"name": "Test Default Event",
74+
}
75+
)
76+
77+
with MockRequest(self.env):
78+
obj = WebsiteEventControllerExtended()
79+
res = obj.check_email(event.id, "attendee01@example.com")
80+
self.assertNotIn("email_not_allowed", res)
81+
82+
self.env["event.registration"].create(
83+
{
84+
"name": "Attendee Name",
85+
"email": "attendee01@example.com",
86+
"event_id": event.id,
87+
}
88+
)
89+
90+
with MockRequest(self.env):
91+
obj = WebsiteEventControllerExtended()
92+
res = obj.check_email(event.id, "attendee01@example.com")
93+
self.assertIn("email_not_allowed", res)
94+
95+
def test_check_email_02(self):
96+
slavik_email = "slavik@slavik.ru"
97+
slavik1, slavik2 = self.env["res.partner"].create(
98+
[
99+
{"name": "Slavik 01", "email": slavik_email},
100+
{"name": "Slavik 02", "email": slavik_email},
101+
]
102+
)
103+
104+
event = self.env["event.event"].create(
105+
{
106+
"name": "Test Default Event",
107+
}
108+
)
109+
110+
with MockRequest(self.env):
111+
obj = WebsiteEventControllerExtended()
112+
res = obj.check_email(event.id, slavik_email)
113+
self.assertNotIn("email_not_allowed", res)
114+
115+
self.env["event.registration"].create(
116+
{
117+
"name": "Attendee Name",
118+
"attendee_partner_id": slavik2.id,
119+
"event_id": event.id,
120+
}
121+
)
122+
123+
with MockRequest(self.env):
124+
obj = WebsiteEventControllerExtended()
125+
res = obj.check_email(event.id, slavik_email)
126+
self.assertIn("email_not_allowed", res)

0 commit comments

Comments
 (0)