Source code for policyengine_core.entities.group_entity

from typing import List

from policyengine_core.entities.entity import Entity
from policyengine_core.entities.role import Role


[docs]class GroupEntity(Entity): """Represents an entity containing several others with different roles. A :class:`.GroupEntity` represents an :class:`.Entity` containing several other :class:`.Entity` with different :class:`.Role`, and on which calculations can be run. Args: key: A key to identify the group entity. plural: The ``key``, pluralised. label: A summary description. doc: A full description. roles: The list of :class:`.Role` of the group entity. containing_entities: The list of keys of group entities whose members are guaranteed to be a superset of this group's entities. .. versionchanged:: 35.7.0 Added ``containing_entities``, that allows the defining of group entities which entirely contain other group entities. """ def __init__( self, key: str, plural: str, label: str, doc: str, roles: List[str], containing_entities: List[str] = (), ): super().__init__(key, plural, label, doc) self.roles_description = roles self.roles = [] for role_description in roles: role = Role(role_description, self) setattr(self, role.key.upper(), role) self.roles.append(role) if role_description.get("subroles"): role.subroles = [] for subrole_key in role_description["subroles"]: subrole = Role({"key": subrole_key, "max": 1}, self) setattr(self, subrole.key.upper(), subrole) role.subroles.append(subrole) role.max = len(role.subroles) self.flattened_roles = sum( [role2.subroles or [role2] for role2 in self.roles], [] ) self.is_person = False self.containing_entities = containing_entities