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 hierarchy_insert(category: str) -> Union[str, Response]: form = build_form('hierarchy', code=category) form.classes.choices = Type.get_class_choices() if form.validate_on_submit(): if Type.check_hierarchy_exists(form.name.data): flash(_('error name exists'), 'error') return render_template('display_form.html', form=form) try: Transaction.begin() type_ = Entity.insert('type', sanitize(form.name.data)) Type.insert_hierarchy( type_, # type: ignore category, form.classes.data, is_multiple(form, category)) type_.update(process_form_data(form, type_)) Transaction.commit() except Exception as e: # pragma: no cover Transaction.rollback() logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') abort(418) flash(_('entity created'), 'info') return redirect(f"{url_for('type_index')}#menu-tab-{category}") return render_template( 'display_form.html', form=form, manual_page='entity/type', title=_('types'), crumbs=[ [_('types'), url_for('type_index')], f'+ {uc_first(_(category))}'])
def hierarchy_update(id_: int) -> Union[str, Response]: hierarchy = g.types[id_] if hierarchy.category in ('standard', 'system'): abort(403) form = build_form('hierarchy', hierarchy) form.classes.choices = Type.get_class_choices(hierarchy) linked_entities = set() has_multiple_links = False for entity in get_entities_linked_to_type_recursive(id_, []): if entity.id in linked_entities: has_multiple_links = True break linked_entities.add(entity.id) if hasattr(form, 'multiple') and has_multiple_links: form.multiple.render_kw = {'disabled': 'disabled'} if form.validate_on_submit(): if form.name.data != hierarchy.name and Type.get_types(form.name.data): flash(_('error name exists'), 'error') else: Transaction.begin() try: Type.update_hierarchy(hierarchy, sanitize(form.name.data), form.classes.data, multiple=(hierarchy.category == 'value' or (hasattr(form, 'multiple') and form.multiple.data) or has_multiple_links)) hierarchy.update(process_form_data(form, hierarchy)) Transaction.commit() except Exception as e: # pragma: no cover Transaction.rollback() logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') abort(418) flash(_('info update'), 'info') tab = 'value' if g.types[id_].category == 'value' else 'custom' return redirect( f"{url_for('type_index')}#menu-tab-{tab}_collapse-{hierarchy.id}") form.multiple = hierarchy.multiple table = Table(paging=False) for class_name in hierarchy.classes: count = Type.get_form_count(hierarchy, class_name) table.rows.append([ g.classes[class_name].label, format_number(count) if count else link( _('remove'), url_for( 'remove_class', id_=hierarchy.id, class_name=class_name)) ]) return render_template('display_form.html', form=form, table=table, manual_page='entity/type', title=_('types'), crumbs=[[_('types'), url_for('type_index')], hierarchy, _('edit')])
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