def save_entity_nodes(entity: Entity, form: Any) -> None: from openatlas.forms.field import TreeField from openatlas.forms.field import TreeMultiField from openatlas.forms.field import ValueFloatField # Can't use isinstance checks for entity here because it is always a # Entity at this point. So entity.class_.name checks have to be used. if hasattr(entity, 'nodes'): entity.delete_links(['P2', 'P89']) for field in form: if isinstance(field, ValueFloatField): if entity.class_.name == 'object_location' \ or isinstance(entity, Node): continue # pragma: no cover if field.data is not None: # Allow 0 (zero) entity.link('P2', g.nodes[int(field.name)], field.data) elif isinstance(field, (TreeField, TreeMultiField)) and field.data: try: range_ = [g.nodes[int(field.data)]] except ValueError: # Form value was a list string e.g. '[8,27]' range_ = [ g.nodes[int(range_id)] for range_id in ast.literal_eval(field.data)] if g.nodes[int(field.id)].class_.name == 'administrative_unit': if entity.class_.name == 'object_location': entity.link('P89', range_) elif entity.class_.name not in ['object_location', 'type']: entity.link('P2', range_)
def save_entity_nodes(entity: Entity, form: Any) -> None: from openatlas.forms.field import TreeField from openatlas.forms.field import TreeMultiField from openatlas.forms.field import ValueFloatField if hasattr(entity, 'nodes'): entity.delete_links(['P2', 'P89']) for field in form: if isinstance(field, ValueFloatField): if entity.class_.name == 'object_location' or isinstance( entity, Node): continue # pragma: no cover if field.data is not None: # Allow 0 (zero) entity.link('P2', g.nodes[int(field.name)], field.data) elif isinstance(field, (TreeField, TreeMultiField)) and field.data: try: range_ = [g.nodes[int(field.data)]] except ValueError: # Form value was a list string e.g. '[97,2798]' range_ = [ g.nodes[int(range_id)] for range_id in ast.literal_eval(field.data) ] if g.nodes[int(field.id)].class_.name == 'administrative_unit': if entity.class_.name == 'object_location': entity.link('P89', range_) elif entity.class_.name != 'object_location' and not isinstance( entity, Node): entity.link('P2', range_)
def save_entity_nodes(entity: Entity, form: Any) -> None: from openatlas.forms.forms import TreeField, TreeMultiField, ValueFloatField if hasattr(entity, 'nodes'): entity.delete_links(['P2', 'P89']) for field in form: if type(field) is ValueFloatField and entity.class_.code != 'E53': if field.data is not None: # Allow to save 0 but not empty entity.link('P2', g.nodes[int(field.name)], field.data) elif type(field) in (TreeField, TreeMultiField) and field.data: root = g.nodes[int(field.id)] try: range_ = [g.nodes[int(field.data)]] except ValueError: # Form value was a list string e.g. '[97,2798]' range_ = [ g.nodes[int(range_id)] for range_id in ast.literal_eval(field.data) ] if root.name in ['Administrative Unit', 'Historical Place']: if entity.class_.code == 'E53': entity.link('P89', range_) elif entity.class_.code != 'E53': entity.link('P2', range_)
def update_links(entity: Entity, form: FlaskForm, action: str, origin: Optional[Entity]) -> None: if entity.class_.view in ['actor', 'event', 'place', 'artifact', 'type']: ReferenceSystem.update_links(form, entity) if entity.class_.view == 'actor': if action == 'update': entity.delete_links(['P74', 'OA8', 'OA9']) if form.residence.data: object_ = Entity.get_by_id(form.residence.data) entity.link('P74', object_.get_linked_entity_safe('P53')) if form.begins_in.data: object_ = Entity.get_by_id(form.begins_in.data) entity.link('OA8', object_.get_linked_entity_safe('P53')) if form.ends_in.data: object_ = Entity.get_by_id(form.ends_in.data) entity.link('OA9', object_.get_linked_entity_safe('P53')) if entity.class_.view == 'event': if action == 'update': entity.delete_links(['P7', 'P24', 'P25', 'P26', 'P27', 'P117']) if form.event.data: entity.link_string('P117', form.event.data) if hasattr(form, 'place') and form.place.data: entity.link( 'P7', Link.get_linked_entity_safe(int(form.place.data), 'P53')) if entity.class_.name == 'acquisition' and form.given_place.data: entity.link_string('P24', form.given_place.data) if entity.class_.name == 'move': if form.artifact.data: # Moved objects entity.link_string('P25', form.artifact.data) if form.person.data: # Moved persons entity.link_string('P25', form.person.data) if form.place_from.data: # Link place for move from linked_place = Link.get_linked_entity_safe( int(form.place_from.data), 'P53') entity.link('P27', linked_place) if form.place_to.data: # Link place for move to entity.link( 'P26', Link.get_linked_entity_safe(int(form.place_to.data), 'P53')) elif entity.class_.view in ['artifact', 'place']: location = entity.get_linked_entity_safe('P53') if action == 'update': Gis.delete_by_entity(location) location.update(form) Gis.insert(location, form) elif entity.class_.view == 'source' and not origin: if action == 'update': entity.delete_links(['P128'], inverse=True) if form.artifact.data: entity.link_string('P128', form.artifact.data, inverse=True) elif entity.class_.view == 'type': node = origin if isinstance(origin, Node) else entity root = g.nodes[node.root[-1]] if node.root else node super_id = g.nodes[node.root[0]] if node.root else node new_super_id = getattr(form, str(root.id)).data new_super = g.nodes[int(new_super_id)] if new_super_id else root if super_id != new_super.id: property_code = 'P127' if entity.class_.name == 'type' else 'P89' entity.delete_links([property_code]) entity.link(property_code, new_super)