def __call__(self, table: Table, root: Person, x0: int = 0, y0: int = 0 ) -> List[Union[PersonBox, SpouseLink, ParentChildLink]]: # handle single person spouse = table.get_spouse(root) if spouse is None: x = x0 + self.x_margin y = y0 + self.y_margin elements = [self.person_box_class(root, x, y)] return elements # get family members from the table if root.gender == 'M': parents = [root, spouse] else: parents = [spouse, root] children = table.find_children(*parents) children = sorted(children, key=lambda p: (p.birth_order, p.id_)) elements = [] x = x0 # elements for children for child in children: elems = self(table, child, x0=x, y0=y0 + self.unit_h) x = max([e.xmax for e in _get_person_boxes(elems)]) x += self.x_margin elements += elems child_elements = [e for e in _get_person_boxes(elements) if e.person in children] # elements for parents center = (x0 + x) // 2 x = max(x0, center - self.unit_w) x1 = x + self.x_margin x2 = x + self.x_margin + self.unit_w y = y0 + self.y_margin elements.append(self.person_box_class(parents[0], x1, y)) elements.append(self.person_box_class(parents[1], x2, y)) # parent and child link ym = y0 + self.person_box_class.height // 2 for child_elem in child_elements: x1 = x + self.unit_w y1 = ym x2 = (child_elem.xmin + child_elem.xmax) // 2 y2 = child_elem.ymin elements.append(self.parent_child_link_class(x1, y1, x2, y2)) # spouse link elements.append(self.spouse_link_class( x + self.unit_w - self.x_margin, ym, x + self.unit_w + self.x_margin, ym)) return elements
def test_find_children(self): father = Person(1, "Father") mother = Person(2, "Mother") child1 = Person(3, "Child1", father_id=1, mother_id=2) child2 = Person(4, "Child2", father_id=1, mother_id=2) table = Table([father, mother, child1, child2]) children = table.find_children(father, mother) assert len(children) == 2 assert set(children) == {child1, child2}
def test_find_children_no_result(self): person1 = Person(1, "Person1") person2 = Person(2, "Person2") table = Table([person1, person2]) children = table.find_children(person1, person2) assert len(children) == 0