91 lines
3.1 KiB
Python
91 lines
3.1 KiB
Python
# 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()]
|