Source code for xer_parser.model.classes.rsrc

import json
from typing import Any, ClassVar, Optional


[docs] class Resource: """ Represents a Primavera P6 resource. This class encapsulates all the attributes and functionalities of a resource in Primavera P6, including labor and non-labor resources that can be assigned to activities. Parameters ---------- params : Dict[str, Any] Dictionary of parameters from the XER file Attributes ---------- rsrc_id : int Unique identifier for the resource rsrc_name : str Name of the resource rsrc_short_name : str Short name of the resource rsrc_type : str Type of resource (Labor, Non-Labor, etc.) parent_rsrc_id : int ID of the parent resource in a hierarchical structure clndr_id : int ID of the calendar assigned to this resource role_id : int ID of the role assigned to this resource active_flag : str Flag indicating whether the resource is active email_addr : str Email address of the resource (for labor resources) """ obj_list: ClassVar[list["Resource"]] = []
[docs] def __init__(self, params: dict[str, Any]) -> None: """ Initialize a Resource object from XER file parameters. Parameters ---------- params : Dict[str, Any] Dictionary of parameters from the XER file """ self.rsrc_id = ( int(params.get("rsrc_id").strip()) if params.get("rsrc_id") else None ) self.parent_rsrc_id = ( int(params.get("parent_rsrc_id").strip()) if params.get("parent_rsrc_id") else None ) self.clndr_id = ( int(params.get("clndr_id").strip()) if params.get("clndr_id") else None ) self.role_id = ( int(params.get("role_id").strip()) if params.get("role_id") else None ) self.shift_id = ( params.get("shift_id").strip() if params.get("shift_id") else None ) self.user_id = params.get("user_id").strip() if params.get("user_id") else None self.pobs_id = params.get("pobs_id").strip() if params.get("pobs_id") else None self.guid = params.get("guid").strip() if params.get("guid") else None self.rsrc_seq_num = ( params.get("rsrc_seq_num").strip() if params.get("rsrc_seq_num") else None ) self.email_addr = ( params.get("email_addr").strip() if params.get("email_addr") else None ) self.employee_code = ( params.get("employee_code").strip() if params.get("employee_code") else None ) self.office_phone = ( params.get("office_phone").strip() if params.get("office_phone") else None ) self.other_phone = ( params.get("other_phone").strip() if params.get("other_phone") else None ) self.rsrc_name = ( params.get("rsrc_name").strip() if params.get("rsrc_name") else None ) self.rsrc_short_name = ( params.get("rsrc_short_name").strip() if params.get("rsrc_short_name") else None ) self.rsrc_title_name = ( params.get("rsrc_title_name").strip() if params.get("rsrc_title_name") else None ) self.def_qty_per_hr = ( params.get("def_qty_per_hr").strip() if params.get("def_qty_per_hr") else None ) self.cost_qty_type = ( params.get("cost_qty_type").strip() if params.get("cost_qty_type") else None ) self.ot_factor = ( params.get("ot_factor").strip() if params.get("ot_factor") else None ) self.active_flag = ( params.get("active_flag").strip() if params.get("active_flag") else None ) self.auto_compute_act_flag = ( params.get("auto_compute_act_flag").strip() if params.get("auto_compute_act_flag") else None ) self.def_cost_qty_link_flag = ( params.get("def_cost_qty_link_flag").strip() if params.get("def_cost_qty_link_flag") else None ) self.ot_flag = params.get("ot_flag").strip() if params.get("ot_flag") else None self.curr_id = ( int(params.get("curr_id").strip()) if params.get("curr_id") else None ) self.unit_id = ( int(params.get("unit_id").strip()) if params.get("unit_id") else None ) self.rsrc_type = ( params.get("rsrc_type").strip() if params.get("rsrc_type") else None ) self.location_id = ( int(params.get("location_id").strip()) if params.get("location_id") else None ) self.rsrc_notes = ( params.get("rsrc_notes").strip() if params.get("rsrc_notes") else None ) self.load_tasks_flag = ( params.get("load_tasks_flag").strip() if params.get("load_tasks_flag") else None ) self.level_flag = ( params.get("level_flag").strip() if params.get("level_flag") else None ) self.last_checksum = ( params.get("level_flag").strip() if params.get("level_flag") else None ) Resource.obj_list.append(self)
[docs] def get_id(self) -> int: """ Get the resource ID. Returns ------- int The unique identifier for this resource """ return self.rsrc_id
[docs] def get_tsv(self) -> list[Any]: """ Get the resource data in TSV format. Returns ------- List[Any] Resource data formatted for TSV output """ tsv = [ "%R", self.rsrc_id, self.parent_rsrc_id, self.clndr_id, self.role_id, self.shift_id, self.user_id, self.pobs_id, self.guid, self.rsrc_seq_num, self.email_addr, self.employee_code, self.office_phone, self.other_phone, self.rsrc_name, self.rsrc_short_name, self.rsrc_title_name, self.def_qty_per_hr, self.cost_qty_type, self.ot_factor, self.active_flag, self.auto_compute_act_flag, self.def_cost_qty_link_flag, self.ot_flag, self.curr_id, self.unit_id, self.rsrc_type, self.location_id, self.rsrc_notes, self.load_tasks_flag, self.level_flag, self.last_checksum, ] return tsv
[docs] @classmethod def find_by_id(cls, id: int) -> Optional["Resource"]: """ Find a resource by its ID. Parameters ---------- id : int The resource ID to search for Returns ------- Resource or None The resource with the specified ID, or None if not found """ obj = list(filter(lambda x: x.rsrc_id == id, cls.obj_list)) if obj: return obj[0] return None
@property def parent(self) -> int | None: """ Get the parent resource ID. Returns ------- int or None The ID of the parent resource, or None if this is a top-level resource """ return self.parent_rsrc_id
[docs] def __repr__(self) -> str: """ String representation of the resource. Returns ------- str The resource's name """ return self.rsrc_name
[docs] def __str__(self) -> str: """ String representation of the resource. Returns ------- str The resource's name """ return self.rsrc_name
[docs] def toJson(self) -> str: """ Convert the resource to a JSON string. Returns ------- str JSON representation of the resource """ return json.dumps(self, default=lambda o: o.__dict__)