# Part of Newlogic G2P. See LICENSE file for full copyright and licensing details.
import logging
from odoo import api, fields, models
_logger = logging.getLogger(__name__)
class EligibilityManager(models.Model):
_name = "g2p.eligibility.manager"
_description = "Eligibility Manager"
_inherit = "g2p.manager.mixin"
program_id = fields.Many2one("g2p.program", "Program")
@api.model
def _selection_manager_ref_id(self):
selection = super()._selection_manager_ref_id()
new_manager = ("g2p.program_membership.manager.default", "Default Eligibility")
if new_manager not in selection:
selection.append(new_manager)
return selection
[docs]class BaseEligibilityManager(models.AbstractModel):
_name = "g2p.program_membership.manager"
_inherit = "base.programs.manager"
_description = "Base Eligibility"
name = fields.Char("Manager Name", required=True)
program_id = fields.Many2one("g2p.program", string="Program", required=True)
[docs] def enroll_eligible_registrants(self, program_memberships):
"""
This method is used to validate if a user match the criteria needed to be enrolled in a program.
Args:
program_membership:
Returns:
bool: True if the user match the criterias, False otherwise.
"""
raise NotImplementedError()
[docs] def verify_cycle_eligibility(self, cycle, program_memberships):
"""
This method is used to validate if a beneficiary match the criteria needed to be enrolled in a cycle.
Args:
cycle:
program_membership:
Returns:
bool: True if the cycle match the criterias, False otherwise.
"""
raise NotImplementedError()
[docs] def import_eligible_registrants(self):
"""
This method is used to import the beneficiaries in a program.
Returns:
"""
raise NotImplementedError()
[docs]class DefaultEligibilityManager(models.Model):
_name = "g2p.program_membership.manager.default"
_inherit = ["g2p.program_membership.manager", "g2p.manager.source.mixin"]
_description = "Simple Eligibility"
# TODO: rename to allow_
# support_individual = fields.Boolean(string="Support Individual", default=False)
# support_group = fields.Boolean(string="Support Group", default=False)
# TODO: cache the parsed domain
eligibility_domain = fields.Text(string="Domain", default="[]")
def _prepare_eligible_domain(self, membership):
ids = membership.mapped("partner_id.id")
domain = [("id", "in", ids)]
# TODO: use the config of the program
if self.program_id.target_type == "group":
domain += [("is_group", "=", True)]
if self.program_id.target_type == "individual":
domain += [("is_group", "=", False)]
domain += self._safe_eval(self.eligibility_domain)
return domain
[docs] def enroll_eligible_registrants(self, program_memberships):
# TODO: check if the beneficiary still match the criterias
_logger.info("-" * 100)
_logger.info("Checking eligibility for %s", program_memberships)
for rec in self:
beneficiaries = rec._verify_eligibility(program_memberships)
return self.env["g2p.program_membership"].search(
[("partner_id", "in", beneficiaries)]
)
[docs] def verify_cycle_eligibility(self, cycle, membership):
for rec in self:
beneficiaries = rec._verify_eligibility(membership)
return self.env["g2p.cycle.membership"].search(
[("partner_id", "in", beneficiaries)]
)
def _verify_eligibility(self, membership):
domain = self._prepare_eligible_domain(membership)
_logger.info("Eligibility domain: %s", domain)
beneficiaries = self.env["res.partner"].search(domain).ids
_logger.info("Beneficiaries: %s", beneficiaries)
return beneficiaries