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 []
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
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
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
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)
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")
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)