Exemplo n.º 1
0
 def get_geom(entity: Entity) -> Union[list[dict[str, Any]], list[Any]]:
     if entity.class_.view == 'place' or entity.class_.name == 'artifact':
         return Gis.get_by_id(
             Link.get_linked_entity_safe(entity.id, 'P53').id)
     if entity.class_.name == 'object_location':
         return Gis.get_by_id(entity.id)
     return []
Exemplo n.º 2
0
def get_csv_geom_entry(entity: Entity) -> dict[str, None]:
    geom = {'type': None, 'coordinates': None}
    if entity.class_.view == 'place' or entity.class_.name == 'artifact':
        geom = get_csv_geometry(
            Link.get_linked_entity_safe(entity.id, 'P53'))
    elif entity.class_.name == 'object_location':
        geom = get_csv_geometry(entity)
    return geom
Exemplo n.º 3
0
def search(data: dict[str, Any]) -> list[Entity]:
    if not data['term']:
        return []
    if 'person' in data['classes'] \
            or 'place' in data['classes'] \
            or 'group' in data['classes']:
        data['classes'].append('appellation')
    entities = []
    for row in Db.search(data['term'], data['classes'], data['desc'],
                         data['own'], current_user.id):
        if row['openatlas_class_name'] == 'appellation':
            entity = Link.get_linked_entity_safe(row['id'], 'P1', True)
            if entity.class_.name not in data['classes']:
                continue
        else:
            entity = Entity(row)
        if entity and check_dates(entity, data):
            entities.append(entity)
    return list({d.id: d for d in entities}.values())  # Remove duplicates
Exemplo n.º 4
0
def process_form_data(form: FlaskForm,
                      entity: Entity,
                      origin: Optional[Entity] = None) -> dict[str, Any]:
    data: dict[str, Any] = {
        'attributes': process_form_dates(form),
        'links': {
            'insert': [],
            'delete': set(),
            'delete_inverse': set()
        }
    }
    for key, value in form.data.items():
        field_type = getattr(form, key).type
        if field_type in [
                'TreeField', 'TreeMultiField', 'TableField', 'TableMultiField'
        ]:
            if value:
                ids = ast.literal_eval(value)
                value = ids if isinstance(ids, list) else [int(ids)]
            else:
                value = []
        if key.startswith((
                'begin_',
                'end_',
                'name_inverse',
                'multiple',
                'page',
                'reference_system_precision_',
                'website_url',
                'resolver_url',
                'placeholder',
                'classes')) \
                or field_type in [
                    'CSRFTokenField',
                    'HiddenField',
                    'MultipleFileField',
                    'SelectMultipleField',
                    'SubmitField',
                    'TableField',
                    'TableMultiField']:
            continue
        if key == 'name':
            name = form.data['name']
            if hasattr(form, 'name_inverse'):
                name = form.name.data.replace('(', '').replace(')', '').strip()
                if form.name_inverse.data.strip():
                    inverse = form.name_inverse.data.\
                        replace('(', '').\
                        replace(')', '').strip()
                    name += ' (' + inverse + ')'
            if entity.class_.name == 'type':
                name = sanitize(name, 'type')
            elif isinstance(entity, ReferenceSystem) and entity.system:
                name = entity.name  # Prevent name changing of a system type
            data['attributes']['name'] = name
        elif key == 'description':
            data['attributes'][key] = form.data[key]
        elif key == 'alias':
            data['aliases'] = value
        elif field_type in ['TreeField', 'TreeMultiField']:
            if g.types[int(getattr(form, key).id)].class_.name \
                    == 'administrative_unit':
                if 'administrative_units' not in data:
                    data['administrative_units'] = []
                data['administrative_units'] += value
            elif entity.class_.view != 'type':
                data['links']['delete'].add('P2')
                data['links']['insert'].append({
                    'property':
                    'P2',
                    'range': [g.types[id_] for id_ in value]
                })
        elif field_type == 'ValueFloatField':
            if value is not None:  # Allow the number zero
                data['links']['insert'].append({
                    'property': 'P2',
                    'description': value,
                    'range': g.types[int(key)]
                })
        elif key.startswith('reference_system_id_'):
            system = Entity.get_by_id(
                int(key.replace('reference_system_id_', '')))
            precision_field = getattr(form, key.replace('id_', 'precision_'))
            data['links']['delete_reference_system'] = True
            if value:
                data['links']['insert'].append({
                    'property': 'P67',
                    'range': system,
                    'description': value,
                    'type_id': precision_field.data,
                    'inverse': True
                })
        else:  # pragma: no cover
            abort(418, f'Form field error: {key}, {field_type}, value={value}')

    if entity.class_.view == 'actor':
        data['links']['delete'].update(['P74', 'OA8', 'OA9'])
        if form.residence.data:
            residence = Entity.get_by_id(int(form.residence.data))
            data['links']['insert'].append({
                'property':
                'P74',
                'range':
                residence.get_linked_entity_safe('P53')
            })
        if form.begins_in.data:
            begin_place = Entity.get_by_id(int(form.begins_in.data))
            data['links']['insert'].append({
                'property':
                'OA8',
                'range':
                begin_place.get_linked_entity_safe('P53')
            })
        if form.ends_in.data:
            end_place = Entity.get_by_id(int(form.ends_in.data))
            data['links']['insert'].append({
                'property':
                'OA9',
                'range':
                end_place.get_linked_entity_safe('P53')
            })
    elif entity.class_.view == 'event':
        data['links']['delete'].update(['P7', 'P9'])
        data['links']['delete_inverse'].update(['P134'])
        if form.event.data:  # Super event
            data['links']['insert'].append({
                'property': 'P9',
                'range': form.event.data
            })
        if form.event_preceding.data:
            data['links']['insert'].append({
                'property': 'P134',
                'range': form.event_preceding.data,
                'inverse': True
            })
        if hasattr(form, 'place') and form.place.data:
            data['links']['insert'].append({
                'property':
                'P7',
                'range':
                Link.get_linked_entity_safe(int(form.place.data), 'P53')
            })
        if entity.class_.name == 'acquisition':
            data['links']['delete'].add('P24')
            if form.given_place.data:
                data['links']['insert'].append({
                    'property': 'P24',
                    'range': form.given_place.data
                })
        elif entity.class_.name == 'production':
            data['links']['delete'].add('P108')
            if form.artifact.data:
                data['links']['insert'].append({
                    'property': 'P108',
                    'range': form.artifact.data
                })
        elif entity.class_.name == 'move':
            data['links']['delete'].update(['P25', 'P26', 'P27'])
            if form.artifact.data:
                data['links']['insert'].append({
                    'property': 'P25',
                    'range': form.artifact.data
                })
            if form.person.data:
                data['links']['insert'].append({
                    'property': 'P25',
                    'range': form.person.data
                })
            if form.place_from.data:
                data['links']['insert'].append({
                    'property':
                    'P27',
                    'range':
                    Link.get_linked_entity_safe(int(form.place_from.data),
                                                'P53')
                })
            if form.place_to.data:
                data['links']['insert'].append({
                    'property':
                    'P26',
                    'range':
                    Link.get_linked_entity_safe(int(form.place_to.data), 'P53')
                })
    elif entity.class_.view in ['artifact', 'place']:
        data['gis'] = {}
        for shape in ['point', 'line', 'polygon']:
            data['gis'][shape] = getattr(form, f'gis_{shape}s').data
        if entity.class_.name == 'artifact':
            data['links']['delete'].add('P52')
            if form.actor.data:
                data['links']['insert'].append({
                    'property': 'P52',
                    'range': form.actor.data
                })
    elif entity.class_.view == 'reference_system':
        data['reference_system'] = {
            'website_url': form.website_url.data,
            'resolver_url': form.resolver_url.data,
            'placeholder': form.placeholder.data,
            'classes': form.classes.data if hasattr(form, 'classes') else None
        }
    elif entity.class_.view == 'source' and not origin:
        data['links']['delete_inverse'].add('P128')
        if form.artifact.data:
            data['links']['insert'].append({
                'property': 'P128',
                'range': form.artifact.data,
                'inverse': True
            })
    elif entity.class_.view == 'type' and 'classes' not in form:
        type_ = origin if isinstance(origin, Type) else entity
        if isinstance(type_, Type):
            root = g.types[type_.root[0]] if type_.root else type_
            super_id = g.types[type_.root[-1]] if type_.root else type_
            new_super_id = getattr(form, str(root.id)).data
            new_super = g.types[int(new_super_id)] if new_super_id else root
            code = 'P127' if entity.class_.name == 'type' else 'P89'
            if super_id != new_super.id:
                data['links']['delete'].add(code)
                data['links']['insert'].append({
                    'property': code,
                    'range': new_super
                })
    for link_ in data['links']['insert']:
        if isinstance(link_['range'], str):
            link_['range'] = form_string_to_entity_list(link_['range'])
    if origin and entity.class_.name not in ('administrative_unit', 'type'):
        data = process_origin_data(entity, origin, form, data)
    return data
Exemplo n.º 5
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)
Exemplo n.º 6
0
def translation_delete(id_: int) -> Response:
    source = Link.get_linked_entity_safe(id_, 'P73', inverse=True)
    Entity.delete_(id_)
    flash(_('entity deleted'), 'info')
    return redirect(f"{url_for('entity_view', id_=source.id)}#tab-text")
Exemplo n.º 7
0
 def get_linked_entity_safe(self,
                            code: str,
                            inverse: bool = False,
                            nodes: bool = False) -> Entity:
     return Link.get_linked_entity_safe(self.id, code, inverse, nodes)