Example #1
0
 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_)
Example #2
0
 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_)
Example #3
0
 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_)
Example #4
0
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)