Source code for xerparser.model.resources

# PyP6XER
# Copyright (C) 2020, 2021 Hassan Emam <hassan@constology.com>
#
# This file is part of PyP6XER.
#
# PyP6XER library is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License v2.1 as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# PyP6XER is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with PyP6XER.  If not, see <https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html>.


from xerparser.model.classes.rsrc import Resource


[docs] class Resources: def __init__(self):
[docs] self.index = 0
self._rsrcs = []
[docs] def add(self, params): rsrc = Resource(params) self._rsrcs.append(rsrc)
[docs] def get_resource_by_id(self, id) -> Resource: rsrc = list(filter(lambda x: x.rsrc_id == id, self._rsrcs)) if len(rsrc) > 0: rsrc = rsrc[0] else: rsrc = None return rsrc
[docs] def get_parent(self, id) -> Resource: rsrc = list(filter(lambda x: x.rsrc_id == id, self._rsrcs)) if len(rsrc) > 0: rsrc = rsrc[0] parent = Resources.get_resource_by_id(rsrc.parent_rsrc_id) else: rsrc = None return rsrc
[docs] def __iter__(self): return self
[docs] def __next__(self) -> Resource: if self.index >= len(self._rsrcs): raise StopIteration idx = self.index self.index += 1 return self._rsrcs[idx]
def _get_list(self): resor = [] for res in self._rsrcs: resor.append((res.rsrc_id, res.parent_rsrc_id)) return resor
[docs] def get_tsv(self): tsv = [] if len(self._rsrcs) > 0: tsv.append(['%T', 'RSRC']) tsv.append(['%F', 'rsrc_id', 'parent_rsrc_id', 'clndr_id', 'role_id', 'shift_id', 'user_id', 'pobs_id', 'guid', 'rsrc_seq_num', 'email_addr', 'employee_code', 'office_phone', 'other_phone', 'rsrc_name', 'rsrc_short_name', 'rsrc_title_name', 'def_qty_per_hr', 'cost_qty_type', 'ot_factor', 'active_flag', 'auto_compute_act_flag', 'def_cost_qty_link_flag', 'ot_flag', 'curr_id', 'unit_id', 'rsrc_type', 'location_id', 'rsrc_notes', 'load_tasks_flag', 'level_flag', 'last_checksum']) for rsr in self._rsrcs: tsv.append(rsr.get_tsv()) return tsv
[docs] def build_tree(self): # pass 1: create nodes dictionary a = self._get_list() nodes = {} for i in a: id, parent_id = i nodes[id] = {id: self.get_resource_by_id(id)} # a = a[1:] # pass 2: create trees and parent-child relations forest = [] for i in a: id, parent_id = i node = nodes[id] # either make the node a new tree or link it to its parent if parent_id == None or nodes.get(parent_id) == None: # start a new tree in the forest forest.append(node) else: # add new_node as child to parent parent = nodes.get(parent_id) if not 'children' in parent: # ensure parent has a 'children' field parent['children'] = [] children = parent['children'] children.append(node) return forest