add website_membership_associate
This commit is contained in:
parent
40d7cc8772
commit
31d53c428c
12 changed files with 837 additions and 0 deletions
3
website_membership_associate/models/__init__.py
Normal file
3
website_membership_associate/models/__init__.py
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from . import membership
|
||||
91
website_membership_associate/models/membership.py
Normal file
91
website_membership_associate/models/membership.py
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
# Copyright 2026 Criptomart
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import api, models
|
||||
from odoo.osv import expression
|
||||
|
||||
|
||||
class MembershipLine(models.Model):
|
||||
_inherit = "membership.membership_line"
|
||||
|
||||
def _search(self, domain, offset=0, limit=None, order=None):
|
||||
if self.env.context.get("include_associate_members"):
|
||||
domain = self._expand_domain_for_associates(domain)
|
||||
return super()._search(domain, offset=offset, limit=limit, order=order)
|
||||
|
||||
def _expand_domain_for_associates(self, domain):
|
||||
country_id = None
|
||||
post_name = None
|
||||
for leaf in domain:
|
||||
if isinstance(leaf, (list, tuple)) and len(leaf) == 3:
|
||||
field, operator, value = leaf
|
||||
if field == "partner.country_id" and operator == "=":
|
||||
country_id = value
|
||||
elif (
|
||||
field in ("partner.name", "partner.website_description")
|
||||
and operator == "ilike"
|
||||
):
|
||||
post_name = value
|
||||
if country_id is None and not post_name:
|
||||
return domain
|
||||
associate_domain = [
|
||||
("associate_member", "!=", False),
|
||||
("website_published", "=", True),
|
||||
]
|
||||
if country_id is not None:
|
||||
associate_domain.append(("country_id", "=", country_id))
|
||||
if post_name:
|
||||
associate_domain += [
|
||||
"|",
|
||||
("name", "ilike", post_name),
|
||||
("website_description", "ilike", post_name),
|
||||
]
|
||||
host_ids = (
|
||||
self.env["res.partner"]
|
||||
.sudo()
|
||||
.search(associate_domain)
|
||||
.associate_member.ids
|
||||
)
|
||||
if not host_ids:
|
||||
return domain
|
||||
return expression.OR([domain, [("partner", "in", host_ids)]])
|
||||
|
||||
@api.model
|
||||
def _get_associate_partners(
|
||||
self, host_partner_ids, country_id=None, post_name=None
|
||||
):
|
||||
if not host_partner_ids:
|
||||
return self.env["res.partner"]
|
||||
domain = [
|
||||
("associate_member", "in", tuple(host_partner_ids)),
|
||||
("website_published", "=", True),
|
||||
]
|
||||
if country_id:
|
||||
domain.append(("country_id", "=", country_id))
|
||||
if post_name:
|
||||
domain += [
|
||||
"|",
|
||||
("name", "ilike", post_name),
|
||||
("website_description", "ilike", post_name),
|
||||
]
|
||||
return self.env["res.partner"].sudo().search(domain)
|
||||
|
||||
def _get_published_companies(self, limit=None):
|
||||
if not self.ids:
|
||||
return []
|
||||
limit_clause = "" if limit is None else " LIMIT %d" % limit
|
||||
self.env.cr.execute(
|
||||
"""
|
||||
SELECT DISTINCT p.id
|
||||
FROM res_partner p
|
||||
INNER JOIN membership_membership_line m
|
||||
ON (p.id = m.partner OR p.associate_member = m.partner)
|
||||
WHERE p.is_published
|
||||
AND p.is_company
|
||||
AND m.id IN %s
|
||||
ORDER BY p.id
|
||||
"""
|
||||
+ limit_clause,
|
||||
(tuple(self.ids),),
|
||||
)
|
||||
return [row[0] for row in self.env.cr.fetchall()]
|
||||
Loading…
Add table
Add a link
Reference in a new issue