def save(form, reference=None, code: Optional[str] = None, origin=None) -> str: g.cursor.execute('BEGIN') log_action = 'update' try: if not reference: log_action = 'insert' system_type = code.replace('_', ' ') reference = EntityMapper.insert('E31', form.name.data, system_type) reference.name = form.name.data reference.description = form.description.data reference.update() reference.save_nodes(form) url = url_for('reference_view', id_=reference.id) if origin: link_id = reference.link('P67', origin) url = url_for('reference_link_update', link_id=link_id, origin_id=origin.id) if form.continue_.data == 'yes' and code: url = url_for('reference_insert', code=code) g.cursor.execute('COMMIT') logger.log_user(reference.id, log_action) flash( _('entity created') if log_action == 'insert' else _('info update'), 'info') except Exception as e: # pragma: no cover g.cursor.execute('ROLLBACK') logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') url = url_for('reference_index') return url
def save(form: FlaskForm, entity: Optional[Entity] = None, class_: Optional[str] = None, origin: Optional[Entity] = None) -> Union[str, Response]: if class_ == 'file' and not entity: return insert_file(form, origin) Transaction.begin() action = 'update' try: if not entity: action = 'insert' entity = insert_entity(form, class_, origin) if isinstance(entity, ReferenceSystem): entity.name = entity.name \ if hasattr(entity, 'system') and entity.system \ else form.name.data entity.description = form.description.data entity.website_url = form.website_url.data \ if form.website_url.data else None entity.resolver_url = form.resolver_url.data \ if form.resolver_url.data else None entity.placeholder = form.placeholder.data \ if form.placeholder.data else None entity.update_system(form) if hasattr(form, 'forms'): entity.add_forms(form) else: entity.update(form) class_ = entity.class_.name update_links(entity, form, action, origin) url = link_and_get_redirect_url(form, entity, class_, origin) logger.log_user(entity.id, action) Transaction.commit() flash( _('entity created') if action == 'insert' else _('info update'), 'info') except InvalidGeomException as e: # pragma: no cover Transaction.rollback() logger.log('error', 'database', 'transaction failed because of invalid geom', e) flash(_('Invalid geom entered'), 'error') if action == 'update' and entity: url = url_for('update', id_=entity.id, origin_id=origin.id if origin else None) else: url = url_for('index', view=g.classes[class_].view) except Exception as e: # pragma: no cover Transaction.rollback() logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') if action == 'update' and entity: url = url_for('update', id_=entity.id, origin_id=origin.id if origin else None) else: url = url_for('index', view=g.classes[class_].view) if class_ in ['administrative_unit', 'type']: url = url_for('node_index') return url
def save(form, source=None, origin=None): g.cursor.execute('BEGIN') try: log_action = 'update' if not source: source = EntityMapper.insert('E33', form.name.data, 'source content') log_action = 'insert' source.name = form.name.data source.description = form.description.data source.update() source.save_nodes(form) url = url_for('source_view', id_=source.id) if origin: url = url_for(get_view_name(origin) + '_view', id_=origin.id) + '#tab-source' if get_view_name(origin) == 'reference': link_ = origin.link('P67', source) url = url_for('reference_link_update', link_id=link_, origin_id=origin) elif get_view_name(origin) == 'file': origin.link('P67', source) else: source.link('P67', origin) g.cursor.execute('COMMIT') if form.continue_.data == 'yes': url = url_for('source_insert', origin_id=origin.id if origin else None) logger.log_user(source.id, log_action) flash(_('entity created') if log_action == 'insert' else _('info update'), 'info') except Exception as e: # pragma: no cover g.cursor.execute('ROLLBACK') logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') url = url_for('source_insert', origin_id=origin.id if origin else None) return url
def save(form, source=None, origin=None): g.cursor.execute('BEGIN') log_action = 'update' try: if not source: source = EntityMapper.insert('E33', form.name.data, 'source content') log_action = 'insert' source.name = form.name.data source.description = form.description.data source.update() source.save_nodes(form) url = url_for('source_view', id_=source.id) if origin: url = url_for(origin.view_name + '_view', id_=origin.id) + '#tab-source' if origin.view_name == 'reference': link_ = origin.link('P67', source) url = url_for('reference_link_update', link_id=link_, origin_id=origin) elif origin.view_name == 'file': origin.link('P67', source) else: source.link('P67', origin) g.cursor.execute('COMMIT') if form.continue_.data == 'yes': url = url_for('source_insert', origin_id=origin.id if origin else None) logger.log_user(source.id, log_action) flash(_('entity created') if log_action == 'insert' else _('info update'), 'info') except Exception as e: # pragma: no cover g.cursor.execute('ROLLBACK') logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') url = url_for('source_insert', origin_id=origin.id if origin else None) return url
def insert_files(form: FlaskForm, origin: Optional[Entity] = None) -> Union[str, Response]: filenames = [] url = url_for('index', view=g.classes['file'].view) try: Transaction.begin() entity_name = form.name.data.strip() for count, file in enumerate(form.file.data): entity = Entity.insert('file', file.filename) url = get_redirect_url(form, entity, origin) # Add 'a' to prevent emtpy temporary filename, has no side effects filename = secure_filename(f'a{file.filename}') new_name = f"{entity.id}.{filename.rsplit('.', 1)[1].lower()}" file.save(str(app.config['UPLOAD_DIR'] / new_name)) filenames.append(new_name) if g.settings['image_processing']: resize_image(new_name) if len(form.file.data) > 1: form.name.data = f'{entity_name}_{str(count + 1).zfill(2)}' if origin: url = f"{url_for('view', id_=origin.id)}#tab-file" entity.update(process_form_data(form, entity, origin)) logger.log_user(entity.id, 'insert') Transaction.commit() flash(_('entity created'), 'info') except Exception as e: # pragma: no cover Transaction.rollback() for filename in filenames: (app.config['UPLOAD_DIR'] / filename).unlink() logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') url = url_for('index', view=g.classes['file'].view) return url
def save(form, reference=None, code=None, origin=None): g.cursor.execute('BEGIN') log_action = 'update' try: if not reference: log_action = 'insert' class_code = 'E84' if code == 'carrier' else 'E31' system_type = 'information carrier' if code == 'carrier' else code reference = EntityMapper.insert(class_code, form.name.data, system_type) reference.name = form.name.data reference.description = form.description.data reference.update() reference.save_nodes(form) url = url_for('reference_view', id_=reference.id) if origin: link_id = reference.link('P67', origin) url = url_for('reference_link_update', link_id=link_id, origin_id=origin.id) if form.continue_.data == 'yes' and code: url = url_for('reference_insert', code=code) g.cursor.execute('COMMIT') logger.log_user(reference.id, log_action) flash(_('entity created') if log_action == 'insert' else _('info update'), 'info') except Exception as e: # pragma: no cover g.cursor.execute('ROLLBACK') logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') url = url_for('reference_index') return url
def save(form, object_=None) -> str: g.cursor.execute('BEGIN') log_action = 'update' try: if not object_: log_action = 'insert' object_ = EntityMapper.insert('E84', form.name.data, 'information carrier') object_.name = form.name.data object_.description = form.description.data object_.update() object_.save_nodes(form) url = url_for('object_view', id_=object_.id) url = url_for('object_insert') if form.continue_.data == 'yes' else url g.cursor.execute('COMMIT') logger.log_user(object_.id, log_action) flash( _('entity created') if log_action == 'insert' else _('info update'), 'info') except Exception as e: # pragma: no cover g.cursor.execute('ROLLBACK') logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') url = url_for('object_index') return url
def delete_entity(id_: int) -> Optional[str]: url = None entity = Entity.get_by_id(id_) if not is_authorized(entity.class_.write_access): abort(403) # pragma: no cover if isinstance(entity, ReferenceSystem): if entity.system: abort(403) if entity.forms: flash(_('Deletion not possible if forms are attached'), 'error') return url_for('entity_view', id_=id_) if entity.class_.view in ['artifact', 'place']: if entity.get_linked_entities('P46'): flash(_('Deletion not possible if subunits exists'), 'error') return url_for('entity_view', id_=id_) parent = None \ if entity.class_.name == 'place' \ else entity.get_linked_entity('P46', True) entity.delete() logger.log_user(id_, 'delete') flash(_('entity deleted'), 'info') if parent: tab = f"#tab-{entity.class_.name.replace('_', '-')}" url = url_for('entity_view', id_=parent.id) + tab else: Entity.delete_(id_) logger.log_user(id_, 'delete') flash(_('entity deleted'), 'info') if entity.class_.name == 'file': try: delete_files(id_) except Exception as e: # pragma: no cover logger.log('error', 'file', 'file deletion failed', e) flash(_('error file delete'), 'error') return url
def save(form, actor=None, code: Optional[str] = None, origin=None) -> str: g.cursor.execute('BEGIN') try: log_action = 'update' if actor: actor.delete_links(['P74', 'OA8', 'OA9']) else: actor = EntityMapper.insert(code, form.name.data) log_action = 'insert' actor.name = form.name.data actor.description = form.description.data actor.set_dates(form) actor.update() actor.update_aliases(form) actor.save_nodes(form) url = url_for('actor_view', id_=actor.id) if form.residence.data: object_ = EntityMapper.get_by_id(form.residence.data) actor.link('P74', object_.get_linked_entity('P53')) if form.begins_in.data: object_ = EntityMapper.get_by_id(form.begins_in.data) actor.link('OA8', object_.get_linked_entity('P53')) if form.ends_in.data: object_ = EntityMapper.get_by_id(form.ends_in.data) actor.link('OA9', object_.get_linked_entity('P53')) if origin: if origin.view_name == 'reference': link_id = origin.link('P67', actor) url = url_for('reference_link_update', link_id=link_id, origin_id=origin.id) elif origin.view_name == 'source': origin.link('P67', actor) url = url_for('source_view', id_=origin.id) + '#tab-actor' elif origin.view_name == 'event': link_id = origin.link('P11', actor) url = url_for('involvement_update', id_=link_id, origin_id=origin.id) elif origin.view_name == 'actor': link_id = origin.link('OA7', actor) url = url_for('relation_update', id_=link_id, origin_id=origin.id) if form.continue_.data == 'yes' and code: url = url_for('actor_insert', code=code) logger.log_user(actor.id, log_action) g.cursor.execute('COMMIT') flash( _('entity created') if log_action == 'insert' else _('info update'), 'info') except Exception as e: # pragma: no cover g.cursor.execute('ROLLBACK') logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') return redirect(url_for('actor_index')) return url
def save(form, object_=None, location=None, origin=None): g.cursor.execute('BEGIN') try: log_action = 'update' if object_: for alias in object_.get_linked_entities('P1'): alias.delete() GisMapper.delete_by_entity(location) else: log_action = 'insert' if origin and origin.system_type == 'stratigraphic unit': object_ = EntityMapper.insert('E22', form.name.data, 'find') else: system_type = 'place' if origin and origin.system_type == 'place': system_type = 'feature' elif origin and origin.system_type == 'feature': system_type = 'stratigraphic unit' object_ = EntityMapper.insert('E18', form.name.data, system_type) location = EntityMapper.insert('E53', 'Location of ' + form.name.data, 'place location') object_.link('P53', location) object_.name = form.name.data object_.description = form.description.data object_.update() object_.save_dates(form) object_.save_nodes(form) location.name = 'Location of ' + form.name.data location.update() location.save_nodes(form) if hasattr(form, 'alias'): for alias in form.alias.data: if alias.strip(): # check if it isn't empty object_.link('P1', EntityMapper.insert('E41', alias)) url = url_for('place_view', id_=object_.id) if origin: url = url_for(get_view_name(origin) + '_view', id_=origin.id) + '#tab-place' if get_view_name(origin) == 'reference': link_id = origin.link('P67', object_) url = url_for('reference_link_update', link_id=link_id, origin_id=origin.id) elif origin.system_type in ['place', 'feature', 'stratigraphic unit']: url = url_for('place_view', id_=object_.id) origin.link('P46', object_) else: origin.link('P67', object_) GisMapper.insert(location, form) g.cursor.execute('COMMIT') if form.continue_.data == 'yes': url = url_for('place_insert', origin_id=origin.id if origin else None) logger.log_user(object_.id, log_action) flash(_('entity created') if log_action == 'insert' else _('info update'), 'info') except Exception as e: # pragma: no cover g.cursor.execute('ROLLBACK') logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') url = url_for('place_index') return url
def save(form, event=None, code=None, origin=None): g.cursor.execute('BEGIN') try: if event: log_action = 'update' LinkMapper.delete_by_codes(event, ['P117', 'P7', 'P24']) else: log_action = 'insert' event = EntityMapper.insert(code, form.name.data) event.name = form.name.data event.description = form.description.data event.update() event.save_dates(form) event.save_nodes(form) if form.event.data: event.link('P117', int(form.event.data)) if form.place.data: place = LinkMapper.get_linked_entity(int(form.place.data), 'P53') event.link('P7', place) if event.class_.code == 'E8' and form.given_place.data: # Link place for acquisition event.link('P24', ast.literal_eval(form.given_place.data)) url = url_for('event_view', id_=event.id) if origin: view_name = get_view_name(origin) url = url_for(view_name + '_view', id_=origin.id) + '#tab-event' if view_name == 'reference': link_id = origin.link('P67', event) url = url_for('reference_link_update', link_id=link_id, origin_id=origin.id) elif view_name == 'source': origin.link('P67', event) elif view_name == 'actor': link_id = event.link('P11', origin) url = url_for('involvement_update', id_=link_id, origin_id=origin.id) elif view_name == 'file': origin.link('P67', event) if form.continue_.data == 'yes': url = url_for('event_insert', code=code, origin_id=origin.id if origin else None) g.cursor.execute('COMMIT') logger.log_user(event.id, log_action) flash( _('entity created') if log_action == 'insert' else _('info update'), 'info') except Exception as e: # pragma: no cover g.cursor.execute('ROLLBACK') logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') url = url_for('event_index') return url
def source_delete(id_): g.cursor.execute('BEGIN') try: EntityMapper.delete(id_) logger.log_user(id_, 'delete') g.cursor.execute('COMMIT') flash(_('entity deleted'), 'info') except Exception as e: # pragma: no cover g.cursor.execute('ROLLBACK') logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') return redirect(url_for('source_index'))
def save(form, actor=None, code=None, origin=None): g.cursor.execute('BEGIN') try: log_action = 'update' if actor: actor.delete_links(['P74', 'OA8', 'OA9']) for alias in actor.get_linked_entities('P131'): alias.delete() else: actor = EntityMapper.insert(code, form.name.data) log_action = 'insert' actor.name = form.name.data actor.description = form.description.data actor.update() actor.save_dates(form) actor.save_nodes(form) url = url_for('actor_view', id_=actor.id) if form.residence.data: object_ = EntityMapper.get_by_id(form.residence.data) actor.link('P74', object_.get_linked_entity('P53')) if form.appears_first.data: object_ = EntityMapper.get_by_id(form.appears_first.data) actor.link('OA8', object_.get_linked_entity('P53')) if form.appears_last.data: object_ = EntityMapper.get_by_id(form.appears_last.data) actor.link('OA9', object_.get_linked_entity('P53')) for alias in form.alias.data: if alias.strip(): # Check if it isn't empty actor.link('P131', EntityMapper.insert('E82', alias)) if origin: if origin.view_name == 'reference': link_id = origin.link('P67', actor) url = url_for('reference_link_update', link_id=link_id, origin_id=origin.id) elif origin.view_name == 'source': origin.link('P67', actor) url = url_for('source_view', id_=origin.id) + '#tab-actor' elif origin.view_name == 'event': link_id = origin.link('P11', actor) url = url_for('involvement_update', id_=link_id, origin_id=origin.id) elif origin.view_name == 'actor': link_id = origin.link('OA7', actor) url = url_for('relation_update', id_=link_id, origin_id=origin.id) if form.continue_.data == 'yes' and code: url = url_for('actor_insert', code=code) logger.log_user(actor.id, log_action) g.cursor.execute('COMMIT') flash(_('entity created') if log_action == 'insert' else _('info update'), 'info') except Exception as e: # pragma: no cover g.cursor.execute('ROLLBACK') logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') return redirect(url_for('actor_index')) return url
def save(form, node=None, root=None): g.cursor.execute('BEGIN') try: if node: log_action = 'update' root = g.nodes[node.root[-1]] if node.root else None super_ = g.nodes[node.root[0]] if node.root else None else: log_action = 'insert' node = NodeMapper.insert(root.class_.code, form.name.data) super_ = 'new' new_super_id = getattr(form, str(root.id)).data new_super = g.nodes[int(new_super_id)] if new_super_id else g.nodes[ root.id] if new_super.id == node.id: flash(_('error node self as super'), 'error') return if new_super.root and node.id in new_super.root: flash(_('error node sub as super'), 'error') return node.name = form.name.data if root.directional and form.name_inverse.data.strip(): node.name += ' (' + form.name_inverse.data.strip() + ')' if not root.directional: node.name = node.name.replace('(', '').replace(')', '') node.description = form.description.data if form.description else form.unit.data node.update() # Update super if changed and node is not a root node if super_ and (super_ == 'new' or super_.id != new_super_id): property_code = 'P127' if node.class_.code == 'E55' else 'P89' node.delete_links(property_code) node.link(property_code, new_super) g.cursor.execute('COMMIT') url = url_for('node_view', id_=node.id) if form.continue_.data == 'yes': url = url_for('node_insert', root_id=root.id, super_id=new_super_id if new_super_id else None) logger.log_user(node.id, log_action) flash( _('entity created') if log_action == 'insert' else _('info update'), 'info') except Exception as e: # pragma: no cover g.cursor.execute('ROLLBACK') logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') url = url_for('node_index') return url
def place_delete(id_: int) -> str: entity = EntityMapper.get_by_id(id_) parent = None if entity.system_type == 'place' else entity.get_linked_entity( 'P46', True) if entity.get_linked_entities('P46'): flash(_('Deletion not possible if subunits exists'), 'error') return redirect(url_for('place_view', id_=id_)) entity.delete() logger.log_user(id_, 'delete') flash(_('entity deleted'), 'info') if parent: return redirect( url_for('place_view', id_=parent.id) + '#tab-' + entity.system_type) return redirect(url_for('place_index'))
def file_delete(id_: Optional[int] = None) -> str: try: EntityMapper.delete(id_) logger.log_user(id_, 'delete') except Exception as e: # pragma: no cover logger.log('error', 'database', 'Deletion failed', e) flash(_('error database'), 'error') try: path = get_file_path(id_) if path: os.remove(path) except Exception as e: # pragma: no cover logger.log('error', 'file', 'file deletion failed', e) flash(_('error file delete'), 'error') flash(_('entity deleted'), 'info') return redirect(url_for('file_index'))
def save(form, event=None, code=None, origin=None): g.cursor.execute('BEGIN') try: log_action = 'insert' if event: log_action = 'update' event.delete_links(['P117', 'P7', 'P24']) else: event = EntityMapper.insert(code, form.name.data) event.name = form.name.data event.description = form.description.data event.update() event.save_dates(form) event.save_nodes(form) if form.event.data: entity = EntityMapper.get_by_id(form.event.data) event.link('P117', entity) if form.place.data: place = LinkMapper.get_linked_entity(int(form.place.data), 'P53') event.link('P7', place) if event.class_.code == 'E8' and form.given_place.data: # Link place for acquisition places = [EntityMapper.get_by_id(i) for i in ast.literal_eval(form.given_place.data)] event.link('P24', places) url = url_for('event_view', id_=event.id) if origin: url = url_for(origin.view_name + '_view', id_=origin.id) + '#tab-event' if origin.view_name == 'reference': link_id = origin.link('P67', event) url = url_for('reference_link_update', link_id=link_id, origin_id=origin.id) elif origin.view_name == 'source': origin.link('P67', event) elif origin.view_name == 'actor': link_id = event.link('P11', origin) url = url_for('involvement_update', id_=link_id, origin_id=origin.id) elif origin.view_name == 'file': origin.link('P67', event) if form.continue_.data == 'yes': url = url_for('event_insert', code=code, origin_id=origin.id if origin else None) g.cursor.execute('COMMIT') logger.log_user(event.id, log_action) flash(_('entity created') if log_action == 'insert' else _('info update'), 'info') except Exception as e: # pragma: no cover g.cursor.execute('ROLLBACK') logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') url = url_for('event_index') return url
def save( form: FlaskForm, entity: Optional[Entity] = None, class_: Optional[str] = None, origin: Optional[Entity] = None) -> Union[str, Response]: Transaction.begin() action = 'update' if entity else 'insert' try: if not entity: if not class_: abort(404) # pragma: no cover, entity or class needed entity = insert_entity(form, class_) if class_ == 'source_translation' and origin: origin.link('P73', entity) redirect_link_id = entity.update( data=process_form_data(form, entity, origin), new=(action == 'insert')) logger.log_user(entity.id, action) Transaction.commit() url = get_redirect_url(form, entity, origin, redirect_link_id) flash( _('entity created') if action == 'insert' else _('info update'), 'info') except InvalidGeomException as e: # pragma: no cover Transaction.rollback() logger.log('error', 'database', 'invalid geom', e) flash(_('Invalid geom entered'), 'error') url = url_for('index', view=g.classes[class_].view) if action == 'update' and entity: url = url_for( 'update', id_=entity.id, origin_id=origin.id if origin else None) except Exception as e: # pragma: no cover Transaction.rollback() logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') if action == 'update' and entity: url = url_for( 'update', id_=entity.id, origin_id=origin.id if origin else None) else: url = url_for('index', view=g.classes[class_].view) if class_ in ['administrative_unit', 'type']: url = url_for('type_index') return url
def save(form, node=None, root=None): g.cursor.execute('BEGIN') try: if node: log_action = 'update' root = g.nodes[node.root[-1]] if node.root else None super_ = g.nodes[node.root[0]] if node.root else None else: log_action = 'insert' node = NodeMapper.insert(root.class_.code, form.name.data) super_ = 'new' new_super_id = getattr(form, str(root.id)).data new_super = g.nodes[int(new_super_id)] if new_super_id else g.nodes[root.id] if new_super.id == node.id: flash(_('error node self as super'), 'error') return if new_super.root and node.id in new_super.root: flash(_('error node sub as super'), 'error') return node.name = form.name.data if root.directional and form.name_inverse.data.strip(): node.name += ' (' + form.name_inverse.data.strip() + ')' if not root.directional: node.name = node.name.replace('(', '').replace(')', '') node.description = form.description.data node.update() # Update super if changed and node is not a root node if super_ and (super_ == 'new' or super_.id != new_super_id): property_code = 'P127' if node.class_.code == 'E55' else 'P89' node.delete_links(property_code) node.link(property_code, new_super) g.cursor.execute('COMMIT') url = url_for('node_view', id_=node.id) if form.continue_.data == 'yes': url = url_for('node_insert', root_id=root.id, super_id=new_super_id if new_super_id else None) logger.log_user(node.id, log_action) flash(_('entity created') if log_action == 'insert' else _('info update'), 'info') except Exception as e: # pragma: no cover g.cursor.execute('ROLLBACK') logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') url = url_for('node_index') return url
def type_delete_recursive(id_: int) -> Union[str, Response]: class DeleteRecursiveTypesForm(FlaskForm): confirm_delete = BooleanField( _("I'm sure to delete this type, it's subs and links"), default=False, validators=[InputRequired()]) save = SubmitField(_('delete types and remove all links')) type_ = g.types[id_] root = g.types[type_.root[0]] if type_.root else None if type_.category in ('standard', 'system', 'place') and not root: abort(403) form = DeleteRecursiveTypesForm() if form.validate_on_submit() and form.confirm_delete.data: for sub_id in Type.get_all_sub_ids(type_): g.types[sub_id].delete() type_.delete() flash(_('types deleted'), 'info') logger.log_user(id_, 'Recursive type delete') return redirect( url_for('view', id_=root.id) if root else url_for('type_index')) tabs = { 'info': Tab('info', content=_( 'Warning: this type has subs and/or links to entities ' '(see tabs). Please check if you want to delete these subs ' 'and links too.'), form=form), 'subs': Tab('subs', entity=type_), 'entities': Tab('entities', entity=type_) } for sub_id in Type.get_all_sub_ids(type_): sub = g.types[sub_id] tabs['subs'].table.rows.append([link(sub), sub.count, sub.description]) for item in get_entities_linked_to_type_recursive(type_.id, []): data = [link(item), item.class_.label, item.description] tabs['entities'].table.rows.append(data) crumbs = [[_('types'), url_for('type_index')]] if root: crumbs += [g.types[type_id] for type_id in type_.root] crumbs += [type_, _('delete')] return render_template('tabs.html', tabs=tabs, crumbs=crumbs)
def file_delete(id_=None): g.cursor.execute('BEGIN') try: EntityMapper.delete(id_) logger.log_user(id_, 'delete') g.cursor.execute('COMMIT') except Exception as e: # pragma: no cover g.cursor.execute('ROLLBACK') logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') try: path = get_file_path(id_) if path: os.remove(get_file_path(id_)) except Exception as e: # pragma: no cover logger.log('error', 'file', 'file deletion failed', e) flash(_('error file delete'), 'error') flash(_('entity deleted'), 'info') return redirect(url_for('file_index'))
def save(form, entity=None, source=None): g.cursor.execute('BEGIN') try: if entity: logger.log_user(entity.id, 'update') else: entity = EntityMapper.insert('E33', form.name.data, 'source translation') source.link('P73', entity) logger.log_user(entity.id, 'insert') entity.name = form.name.data entity.description = form.description.data entity.update() entity.save_nodes(form) g.cursor.execute('COMMIT') except Exception as e: # pragma: no cover g.cursor.execute('ROLLBACK') logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') return entity
def save(form: FileForm, file: Optional[Entity] = None, origin: Optional[Entity] = None) -> str: g.cursor.execute('BEGIN') try: log_action = 'update' if not file: log_action = 'insert' file_ = request.files['file'] file = EntityMapper.insert('E31', form.name.data, 'file') filename = secure_filename( 'a' + file_.filename) # Add an 'a' to prevent emtpy filename new_name = str(file.id) + '.' + filename.rsplit('.', 1)[1].lower() full_path = os.path.join(app.config['UPLOAD_FOLDER_PATH'], new_name) file_.save(full_path) file.name = form.name.data file.description = form.description.data file.update() file.save_nodes(form) url = url_for('file_view', id_=file.id) if origin: if origin.system_type in ['edition', 'bibliography']: link_id = origin.link('P67', file) url = url_for('reference_link_update', link_id=link_id, origin_id=origin.id) else: file.link('P67', origin) url = url_for(origin.view_name + '_view', id_=origin.id) + '#tab-file' g.cursor.execute('COMMIT') logger.log_user(file.id, log_action) flash( _('entity created') if log_action == 'insert' else _('info update'), 'info') except Exception as e: # pragma: no cover g.cursor.execute('ROLLBACK') openatlas.logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') url = url_for('file_index', origin_id=origin.id if origin else None) return url
def save(form: FlaskForm, entity: Optional[Entity] = None, source: Optional[Entity] = None) -> Entity: Transaction.begin() try: if entity: logger.log_user(entity.id, 'update') elif source: entity = Entity.insert('source_translation', form.name.data) source.link('P73', entity) logger.log_user(entity.id, 'insert') else: abort(400) # pragma: no cover, entity or source needed entity.update(form) Transaction.commit() except Exception as e: # pragma: no cover Transaction.rollback() logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') return entity # type: ignore
def place_delete(id_): entity = EntityMapper.get_by_id(id_) if entity.get_linked_entities('P46'): flash(_('Deletion not possible if subunits exists'), 'error') return redirect(url_for('place_view', id_=id_)) system_type = entity.system_type parent = None if system_type == 'place' else LinkMapper.get_linked_entity(id_, 'P46', True) g.cursor.execute('BEGIN') try: EntityMapper.delete(id_) logger.log_user(id_, 'delete') g.cursor.execute('COMMIT') except Exception as e: # pragma: no cover g.cursor.execute('ROLLBACK') logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') flash(_('entity deleted'), 'info') url = url_for('place_index') if parent: url = url_for('place_view', id_=parent.id) + '#tab-' + system_type return redirect(url)
def save(form: Form, event=None, code: Optional[str] = None, origin=None) -> str: g.cursor.execute('BEGIN') try: log_action = 'insert' if event: log_action = 'update' event.delete_links(['P7', 'P24', 'P25', 'P26', 'P27', 'P117']) else: event = EntityMapper.insert(code, form.name.data) event.name = form.name.data event.description = form.description.data event.set_dates(form) event.update() event.save_nodes(form) if form.event.data: event.link('P117', int(form.event.data)) if form.place and form.place.data: event.link( 'P7', LinkMapper.get_linked_entity(int(form.place.data), 'P53')) if event.class_.code == 'E8' and form.given_place.data: # Link place for acquisition event.link('P24', form.given_place.data) if event.class_.code == 'E9': # Move if form.object.data: # Moved objects event.link('P25', form.object.data) if form.person.data: # Moved persons event.link('P25', form.person.data) if form.place_from.data: # Link place for move from event.link( 'P27', LinkMapper.get_linked_entity(int(form.place_from.data), 'P53')) if form.place_to.data: # Link place for move to event.link( 'P26', LinkMapper.get_linked_entity(int(form.place_to.data), 'P53')) url = url_for('event_view', id_=event.id) if origin: url = url_for(origin.view_name + '_view', id_=origin.id) + '#tab-event' if origin.view_name == 'reference': link_id = origin.link('P67', event) url = url_for('reference_link_update', link_id=link_id, origin_id=origin.id) elif origin.view_name == 'source': origin.link('P67', event) elif origin.view_name == 'actor': link_id = event.link('P11', origin) url = url_for('involvement_update', id_=link_id, origin_id=origin.id) elif origin.view_name == 'file': origin.link('P67', event) if form.continue_.data == 'yes': url = url_for('event_insert', code=code, origin_id=origin.id if origin else None) g.cursor.execute('COMMIT') logger.log_user(event.id, log_action) flash( _('entity created') if log_action == 'insert' else _('info update'), 'info') except Exception as e: # pragma: no cover g.cursor.execute('ROLLBACK') logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') url = url_for('event_index') return url
def object_delete(id_: int) -> str: EntityMapper.delete(id_) logger.log_user(id_, 'delete') flash(_('entity deleted'), 'info') return redirect(url_for('object_index'))
elif entity.class_.view in ['artifact', 'place']: if entity.get_linked_entities('P46'): flash(_('Deletion not possible if subunits exists'), 'error') return url_for('view', id_=id_) if entity.class_.name != 'place': if parent := entity.get_linked_entity('P46', True): url = \ f"{url_for('view', id_=parent.id)}" \ f"#tab-{entity.class_.name.replace('_', '-')}" elif entity.class_.name == 'source_translation': source = entity.get_linked_entity_safe('P73', inverse=True) url = f"{url_for('view', id_=source.id)}#tab-text" elif entity.class_.name == 'file': try: delete_files(id_) except Exception as e: # pragma: no cover logger.log('error', 'file', 'file deletion failed', e) flash(_('error file delete'), 'error') return url_for('view', id_=id_) entity.delete() logger.log_user(id_, 'delete') flash(_('entity deleted'), 'info') return url def delete_files(id_: int) -> None: if path := get_file_path(id_): # Prevent missing file warning path.unlink() for resized_path in app.config['RESIZED_IMAGES'].glob(f'**/{id_}.*'): resized_path.unlink()
def save(form: DateForm, object_=None, location=None, origin=None) -> str: g.cursor.execute('BEGIN') log_action = 'update' try: if object_: GisMapper.delete_by_entity(location) else: log_action = 'insert' if origin and origin.system_type == 'stratigraphic unit': object_ = EntityMapper.insert('E22', form.name.data, 'find') else: system_type = 'place' if origin and origin.system_type == 'place': system_type = 'feature' elif origin and origin.system_type == 'feature': system_type = 'stratigraphic unit' object_ = EntityMapper.insert('E18', form.name.data, system_type) location = EntityMapper.insert('E53', 'Location of ' + form.name.data, 'place location') object_.link('P53', location) object_.name = form.name.data object_.description = form.description.data object_.set_dates(form) object_.update() object_.save_nodes(form) if object_.system_type == 'place': object_.update_aliases(form) location.name = 'Location of ' + form.name.data location.update() location.save_nodes(form) if hasattr(form, 'geonames_id') and current_user.settings['module_geonames']: GeonamesMapper.update_geonames(form, object_) url = url_for('place_view', id_=object_.id) if origin: url = url_for(origin.view_name + '_view', id_=origin.id) + '#tab-place' if origin.view_name == 'reference': link_id = origin.link('P67', object_) url = url_for('reference_link_update', link_id=link_id, origin_id=origin.id) elif origin.system_type in [ 'place', 'feature', 'stratigraphic unit' ]: url = url_for('place_view', id_=object_.id) origin.link('P46', object_) else: origin.link('P67', object_) GisMapper.insert(location, form) g.cursor.execute('COMMIT') if form.continue_.data == 'yes': url = url_for('place_insert', origin_id=origin.id if origin else None) logger.log_user(object_.id, log_action) flash( _('entity created') if log_action == 'insert' else _('info update'), 'info') except InvalidGeomException as e: # pragma: no cover g.cursor.execute('ROLLBACK') logger.log('error', 'database', 'transaction failed because of invalid geom', e) flash(_('Invalid geom entered'), 'error') url = url_for('place_index') if log_action == 'insert' else url_for( 'place_view', id_=object_.id) except Exception as e: # pragma: no cover g.cursor.execute('ROLLBACK') logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') url = url_for('place_index') if log_action == 'insert' else url_for( 'place_view', id_=object_.id) return url
def actor_delete(id_): EntityMapper.delete(id_) logger.log_user(id_, 'delete') flash(_('entity deleted'), 'info') return redirect(url_for('actor_index'))
def save(form, actor=None, code=None, origin=None): g.cursor.execute('BEGIN') try: log_action = 'update' if actor: LinkMapper.delete_by_codes(actor, ['P74', 'OA8', 'OA9']) for alias in actor.get_linked_entities('P131'): alias.delete() else: actor = EntityMapper.insert(code, form.name.data) log_action = 'insert' actor.name = form.name.data actor.description = form.description.data actor.update() actor.save_dates(form) actor.save_nodes(form) url = url_for('actor_view', id_=actor.id) if form.residence.data: object_ = EntityMapper.get_by_id(form.residence.data) actor.link('P74', object_.get_linked_entity('P53')) if form.appears_first.data: object_ = EntityMapper.get_by_id(form.appears_first.data) actor.link('OA8', object_.get_linked_entity('P53')) if form.appears_last.data: object_ = EntityMapper.get_by_id(form.appears_last.data) actor.link('OA9', object_.get_linked_entity('P53')) for alias in form.alias.data: if alias.strip(): # check if it isn't empty actor.link('P131', EntityMapper.insert('E82', alias)) if origin: view_name = get_view_name(origin) if view_name == 'reference': link_id = origin.link('P67', actor) url = url_for('reference_link_update', link_id=link_id, origin_id=origin.id) elif view_name == 'source': origin.link('P67', actor) url = url_for('source_view', id_=origin.id) + '#tab-actor' elif view_name == 'event': link_id = origin.link('P11', actor) url = url_for('involvement_update', id_=link_id, origin_id=origin.id) elif view_name == 'actor': link_id = origin.link('OA7', actor) url = url_for('relation_update', id_=link_id, origin_id=origin.id) if form.continue_.data == 'yes' and code: url = url_for('actor_insert', code=code) g.cursor.execute('COMMIT') logger.log_user(actor.id, log_action) flash( _('entity created') if log_action == 'insert' else _('info update'), 'info') except Exception as e: # pragma: no cover g.cursor.execute('ROLLBACK') logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') return redirect(url_for('actor_index')) return url