Example #1
0
def import_vector():
    from ...lib.vectormapping import default_mappings as mappings

    uploaded_shapes=[]
    upload_failures=[]
    not_allowed_files=[]

    for upload_file in request.files.getlist('file_upload'):
        import_dir = current_app.config.geobox_state.user_data_path('import')
        target = os.path.join(import_dir, upload_file.filename)
        if os.path.splitext(target)[1].lower() in ('.shp', '.shx', '.dbf'):
            try:
                if not os.path.isdir(import_dir):
                    os.mkdir(import_dir)

                f = open(target, 'wb')
                f.write(upload_file.stream.read())
                f.close()
            except IOError:
                upload_failures.append(upload_file.filename)

            uploaded_shapes.append(upload_file.filename)
        else:
            not_allowed_files.append(upload_file.filename)

    form = forms.ImportVectorEdit(request.form)
    shape_files, missing_files = get_shapefile_list()
    form.file_name.choices = [(name, name) for name in shape_files]
    form.mapping_name.choices = [
        (name, '%s (%s, %s)' % (mapping.name, mapping.geom_type, mapping.other_srs.srs_code))
        for name, mapping in mappings.items()
    ]

    if not len(request.files):
        if form.validate_on_submit():
            try:
                is_valid_shapefile(current_app.config.geobox_state.user_data_path('import', form.file_name.data), mappings[form.mapping_name.data])
            except ConvertError:
                flash(_('invalid mapping'), 'error')
                return render_template('vector/import.html', form=form)
            except OSError:
                flash(_('invalid shapefile'), 'error')
                return render_template('vector/import.html', form=form)
            task = VectorImportTask(
                mapping_name=form.mapping_name.data,
                db_name=mappings[form.mapping_name.data].couchdb,
                file_name=form.file_name.data
            )
            send_task_logging(current_app.config.geobox_state, task)
            g.db.add(task)
            g.db.commit()
            return redirect(url_for('tasks.list'))
        elif request.method == 'POST':
            flash(_('form error'), 'error')

    for missing_file in missing_files:
        flash(_('file %(name)s missing', name=missing_file), 'error')
    for upload_failure in upload_failures:
        flash(_('failed to upload %(name)s', name=upload_failure), 'error')
    for not_allowed_file in not_allowed_files:
        flash(_('filetype of %(name)s not allowed', name=not_allowed_file), 'error')
    for uploaded_shape in uploaded_shapes:
        flash(_('file %(name)s uploaded', name=uploaded_shape), 'info')

    file_browser = request_is_local()
    return render_template('vector/import.html', form=form, file_browser=file_browser)
Example #2
0
def import_vector():
    from ...lib.vectormapping import default_mappings as mappings

    uploaded_shapes = []
    upload_failures = []
    not_allowed_files = []

    for upload_file in request.files.getlist('file_upload'):
        import_dir = current_app.config.geobox_state.user_data_path('import')
        target = os.path.join(import_dir, upload_file.filename)
        if os.path.splitext(target)[1].lower() in ('.shp', '.shx', '.dbf'):
            try:
                if not os.path.isdir(import_dir):
                    os.mkdir(import_dir)

                f = open(target, 'w')
                f.write(upload_file.stream.read())
                f.close()
            except IOError:
                upload_failures.append(upload_file.filename)

            uploaded_shapes.append(upload_file.filename)
        else:
            not_allowed_files.append(upload_file.filename)

    form = forms.ImportVectorEdit(request.form)
    shape_files, missing_files = get_shapefile_list()
    form.file_name.choices = [(name, name) for name in shape_files]
    form.mapping_name.choices = [
        (name, '%s (%s, %s)' %
         (mapping.name, mapping.geom_type, mapping.other_srs.srs_code))
        for name, mapping in mappings.items()
    ]

    if not len(request.files):
        if form.validate_on_submit():
            try:
                is_valid_shapefile(
                    current_app.config.geobox_state.user_data_path(
                        'import', form.file_name.data),
                    mappings[form.mapping_name.data])
            except ConvertError:
                flash(_('invalid mapping'), 'error')
                return render_template('vector/import.html', form=form)
            except OSError:
                flash(_('invalid shapefile'), 'error')
                return render_template('vector/import.html', form=form)

            g.db.add(
                VectorImportTask(
                    mapping_name=form.mapping_name.data,
                    db_name=mappings[form.mapping_name.data].couchdb,
                    file_name=form.file_name.data))
            g.db.commit()
            return redirect(url_for('tasks.list'))
        elif request.method == 'POST':
            flash(_('form error'), 'error')

    for missing_file in missing_files:
        flash(_('file %(name)s missing', name=missing_file), 'error')
    for upload_failure in upload_failures:
        flash(_('failed to upload %(name)s', name=upload_failure), 'error')
    for not_allowed_file in not_allowed_files:
        flash(_('filetype of %(name)s not allowed', name=not_allowed_file),
              'error')
    for uploaded_shape in uploaded_shapes:
        flash(_('file %(name)s uploaded', name=uploaded_shape), 'info')
    return render_template('vector/import.html', form=form)
Example #3
0
def import_vector():
    from ...lib.vectormapping import Mapping

    uploaded_shapes = []
    upload_failures = []
    not_allowed_files = []

    for upload_file in request.files.getlist('file_upload'):
        import_dir = current_app.config.geobox_state.user_data_path('import')
        target = os.path.join(import_dir, upload_file.filename)
        upload_file_ext = os.path.splitext(target)[1].lower()
        if upload_file_ext in ('.shp', '.shx', '.dbf'):
            try:
                if not os.path.isdir(import_dir):
                    os.mkdir(import_dir)

                f = open(target, 'wb')
                f.write(upload_file.stream.read())
                f.close()
            except IOError:
                upload_failures.append(upload_file.filename)

            uploaded_shapes.append(upload_file.filename)
        elif upload_file_ext in ('.sbn', '.sbx', '.prj', '.index', '.cpg'):
            # ignore files without showing message
            continue
        else:
            not_allowed_files.append(upload_file.filename)
    form = forms.ImportVectorEdit(request.form)
    form.srs.choices = list(current_app.config.geobox_state.config.get('web', 'available_srs'))
    form.srs.choices.insert(0, ('', _('-- select srs --'), ''))
    couch_url = 'http://%s:%s' % ('127.0.0.1', current_app.config.geobox_state.config.get('couchdb', 'port'))
    form.layers.choices = [(item['dbname'], item['title']) for item in vector_layers_metadata(couch_url)]
    form.layers.choices.insert(0, ('', _('-- select layer or add new --')))

    shape_files, missing_files = get_shapefile_list()
    form.file_name.choices = [(name, name) for name in shape_files]
    form.file_name.choices.insert(0, ('', _('-- select a shapefile --')))

    if not len(request.files):
        if form.validate_on_submit():
            try:
                is_valid_shapefile(current_app.config.geobox_state.user_data_path('import', form.file_name.data), Mapping(None, None, '*'))
            except ConvertError as e:
                flash(e, 'error')
                return render_template('vector/import.html', form=form)
            except OSError:
                flash(_('invalid shapefile'), 'error')
                return render_template('vector/import.html', form=form)

            if (form.layers.data and form.name.data) or (not form.layers.data and not form.name.data):
                flash(_('please select new layer or current layer to import'), 'error')
                return redirect(url_for('.import_vector'))

            title = None
            if form.layers.data:
                layer = form.layers.data
            else:
                title = form.name.data
                layer = 'local_vector_' + re.sub(r'[^a-z0-9]*', '',  title.lower())
                if layer == 'local_vector_':
                    flash(_('None of the characters used for the layer is allowed'))
                    return redirect(url_for('.import_vector'))

            task = VectorImportTask(
                db_name=layer,
                title=title,
                file_name=form.file_name.data,
                srs=form.srs.data,
                type_='shp',
            )
            g.db.add(task)
            g.db.commit()
            return redirect(url_for('tasks.list'))
        elif request.method == 'POST':
            flash(_('form error'), 'error')

    for missing_file in missing_files:
        flash(_('file %(name)s missing', name=missing_file), 'error')
    for upload_failure in upload_failures:
        flash(_('failed to upload %(name)s', name=upload_failure), 'error')
    for not_allowed_file in not_allowed_files:
        flash(_('filetype of %(name)s not allowed', name=not_allowed_file), 'error')
    for uploaded_shape in uploaded_shapes:
        flash(_('file %(name)s uploaded', name=uploaded_shape), 'info')

    file_browser = request_is_local()
    return render_template('vector/import.html', form=form, file_browser=file_browser)