示例#1
0
    def remove_preset(name: str):
        """Remove a preset."""
        preset_folder = query_preset()

        dir_file = join(preset_folder, name)
        shutil.rmtree(dir_file)
        if name.startswith('OsmQuery_'):
            presets = os.listdir(preset_folder)
            list_preset = filter(
                lambda query_file: query_file.startswith('OsmQuery_'), presets)
            num = re.findall('OsmQuery_([0-9]+)', name)[0]
            for k, file in enumerate(list_preset):
                if k >= num:
                    former_file = join(preset_folder, file, file + '.json')
                    new_name = 'OsmQuery_{}'.format(k)
                    new_file = join(preset_folder, new_name,
                                    new_name + '.json')
                    rename(former_file, new_file)

                    files = os.listdir(join(preset_folder, file))
                    files_qml = filter(
                        lambda file_ext: file_ext[-4:] == '.qml', files)
                    for file_qml in files_qml:
                        end_file_name = file_qml[len(file):]
                        new_file_qml = join(join(preset_folder, new_name),
                                            new_name + end_file_name)
                        old_file_qml = join(join(preset_folder, file),
                                            file + 'qml')
                        rename(old_file_qml, new_file_qml)
                    index = k

            if index:
                os.rmdir(join(preset_folder, 'OsmQuery_{}'.format(index + 1)))
示例#2
0
    def __init__(self, parent=None, data_preset: dict = None):
        """Constructor."""
        QDialog.__init__(self, parent)
        self.setupUi(self)
        self.dialog = parent
        self.panel = Panels.MapPreset
        self.folder = query_preset()
        TableKeyValue.__init__(self, self.table_keys_values_eb, self.combo_preset_eb)
        self.setup_preset()
        self.setup_table()

        self.previous_name = data_preset['file_name']
        self.current_query = 0
        self.nb_queries = len(data_preset['query'])

        for k in range(self.nb_queries):
            self.list_queries.addItem(data_preset['query_name'][k])

        self.button_add.clicked.connect(self.add_query)
        self.list_queries.currentRowChanged.connect(self.change_query)
        self.list_queries.setContextMenuPolicy(Qt.CustomContextMenu)
        self.list_queries.customContextMenuRequested.connect(self.item_context)

        self.bbox = QgsExtentWidget()
        self.bbox.setMapCanvas(parent.iface.mapCanvas())
        self.bbox_layout.addWidget(self.bbox)
        self.crs = QgsCoordinateReferenceSystem('EPSG:4326')

        self.combo_output_format.addItem(
            Format.GeoPackage.value.label, Format.GeoPackage)
        self.combo_output_format.addItem(
            Format.GeoJSON.value.label, Format.GeoJSON)
        self.combo_output_format.addItem(
            Format.Shapefile.value.label, Format.Shapefile)
        self.combo_output_format.addItem(
            Format.Kml.value.label, Format.Kml)

        self.output_directory.lineEdit().setPlaceholderText(
            tr('Save to temporary file'))
        self.output_directory.setStorageMode(
            QgsFileWidget.GetDirectory)

        self.data = data_preset.copy()
        if self.data:
            self.preset_name.setText(self.data['file_name'])
            self.description.setPlainText('\\n'.join(self.data['description']))

            if self.data['advanced']:
                self.radio_advanced.setChecked(True)
                self.change_type_preset()
            self.data_filling_form()

        self.disable_enable_format()
        self.update_qml_format()

        self.preset_name.textChanged.connect(self.update_qml_format)
        self.radio_advanced.toggled.connect(self.change_type_preset)
        self.output_directory.lineEdit().textChanged.connect(self.disable_enable_format)
        self.button_validate.clicked.connect(self.validate)
        self.button_cancel.clicked.connect(self.close)
示例#3
0
    def update_preset(data: dict):
        """Rename a preset query"""
        preset_folder = query_preset()

        preset_file = join(preset_folder, data['file_name'],
                           data['file_name'] + '.json')

        with open(preset_file, 'w', encoding='utf8') as json_file:
            json.dump(data, json_file, cls=EnumEncoder)
示例#4
0
    def prepare_run(self):
        """Prepare the data before running the process."""
        selection = self.dialog.list_default_mp.selectedIndexes()
        try:

            if selection:
                preset = self.dialog.list_default_mp.item(selection[0].row())
                preset_widget = self.dialog.list_default_mp.itemWidget(preset)
                preset_label = preset_widget.layout().itemAt(1).itemAt(
                    0).widget().text()
                preset_folder = resources_path('map_preset')
            else:
                selection = self.dialog.list_personal_preset_mp.selectedIndexes(
                )
                if not len(selection):
                    raise NoSelectedPreset

                preset = self.dialog.list_personal_preset_mp.item(
                    selection[0].row())
                preset_widget = self.dialog.list_personal_preset_mp.itemWidget(
                    preset)
                preset_label = preset_widget.layout().itemAt(0).itemAt(
                    0).widget().text()
                preset_folder = query_preset()
            LOGGER.debug('Preset chosen: {}'.format(preset_label))
            file_path = join(preset_folder, preset_label,
                             preset_label + '.json')
            with open(file_path, encoding='utf8') as json_file:
                data = json.load(json_file, object_hook=as_enum)

            data['folder'] = os.path.dirname(file_path)

            if not data['advanced']:
                properties = self.gather_spatial_values({})
                data['query_type'] = properties['query_type']
                data['distance'] = self.dialog.spin_place_mp.value()
                if data['query_type'] != QueryType.AroundArea:
                    data['distance'] = None
                if data['query_type'] in [
                        QueryType.InArea, QueryType.AroundArea
                ] and properties['place']:
                    for k, _area in enumerate(data['area']):
                        data['area'][k] = properties['place']
                elif data['query_type'] == QueryType.BBox and properties[
                        'bbox']:
                    for k, _bbox in enumerate(data['bbox']):
                        data['bbox'][k] = properties['bbox']

            self.run_saved_query(data)

        except QuickOsmException as error:
            self.dialog.display_quickosm_exception(error)
示例#5
0
    def add_preset(self, name_preset: str):
        """Add a new query in the preset folder"""
        preset_folder = query_preset()
        files = listdir(preset_folder)
        nb_files = len(files)

        self.name[
            0] = name_preset if name_preset != "OsmQuery" else 'OsmQuery_{}'.format(
                nb_files)
        final_name = self.name[0] + '.json'

        new_file = join(preset_folder, self.name[0], final_name)
        os.mkdir(join(preset_folder, self.name[0]))
        self.write_json(new_file)
示例#6
0
    def save_query(self):
        """Save a query in a preset."""
        properties = self.gather_values()

        # Make the query
        query_factory = QueryFactory(
            type_multi_request=properties['type_multi_request'],
            query_type=properties['query_type'],
            key=properties['key'],
            value=properties['value'],
            area=properties['place'],
            around_distance=properties['distance'],
            osm_objects=properties['osm_objects'],
            timeout=properties['timeout'],
            print_mode=properties['metadata']
        )
        query = query_factory.make(QueryLanguage.OQL)
        description = query_factory.friendly_message()

        q_manage = QueryManagement(
            query=query,
            name=properties['layer_name'],
            description=description,
            advanced=False,
            type_multi_request=properties['type_multi_request'],
            keys=properties['key'],
            values=properties['value'],
            area=properties['place'],
            bbox=properties['bbox'],
            output_geometry_types=properties['outputs'],
            output_directory=properties['output_directory'],
            output_format=properties['output_format']
        )
        if self.existing_preset:
            preset_folder = query_preset()
            presets = filter(
                lambda folder: os.path.isdir(join(preset_folder, folder)), os.listdir(preset_folder))
            chosen_preset = QInputDialog.getItem(
                self.dialog, tr('Add in an existing preset'),
                tr('Please select the preset in which the query will be added:'),
                presets, editable=False
            )
            if chosen_preset[1]:
                q_manage.add_query_in_preset(chosen_preset[0])
        else:
            q_manage.add_preset(properties['layer_name'])

        self.dialog.external_panels[Panels.MapPreset].update_personal_preset_view()
        item = self.dialog.menu_widget.item(self.dialog.preset_menu_index)
        self.dialog.menu_widget.setCurrentItem(item)
示例#7
0
    def rename_preset(self, former_name: str, new_name: str, data: dict):
        """Rename a preset query"""
        preset_folder = query_preset()
        old_folder = join(preset_folder, former_name)
        new_folder = join(preset_folder, new_name)
        os.mkdir(new_folder)

        new_file = join(new_folder, new_name + '.json')

        with open(new_file, 'w', encoding='utf8') as new_json_file:
            json.dump(data, new_json_file, cls=EnumEncoder)

        files = os.listdir(old_folder)
        files_qml = filter(lambda file_ext: file_ext[-4:] == '.qml', files)
        for file in files_qml:
            end_file_name = file[len(former_name):]
            new_file_qml = join(new_folder, new_name + end_file_name)
            old_file_qml = join(old_folder, file)
            rename(old_file_qml, new_file_qml)

        self.remove_preset(former_name)
示例#8
0
    def add_query_in_preset(self, existing_preset: str):
        """Add a query in a preset file"""
        preset_folder = query_preset()
        file_path = join(preset_folder, existing_preset,
                         existing_preset + '.json')
        with open(file_path, encoding='utf8') as json_file:
            data = json.load(json_file, object_hook=as_enum)

        data['query'].append(self.query[0])
        data['query_layer_name'].append(self.name[0])
        data['query_name'].append(tr('Query') + str(len(data['query'])))
        data['type_multi_request'].append(self.type_multi_request[0])
        data['keys'].append(self.keys[0])
        data['values'].append(self.values[0])
        data['area'].append(self.area[0])
        data['bbox'].append(self.bbox[0])
        data['output_geom_type'].append(self.output_geom_type[0])
        data['white_list_column'].append(self.white_list[0])
        data['output_format'].append(self.output_format[0])
        data['output_directory'].append(self.output_directory[0])

        self.update_preset(data)
示例#9
0
    def update_personal_preset_view(self):
        """Update the presets displayed."""
        preset_folder = query_preset()
        files = filter(
            lambda folder: os.path.isdir(join(preset_folder, folder)),
            os.listdir(preset_folder))

        self.dialog.list_personal_preset_mp.clear()

        for file in files:
            file_path = join(preset_folder, file, file + '.json')
            with open(file_path, encoding='utf8') as json_file:
                data = json.load(json_file, object_hook=as_enum)
            name = data['file_name']

            item = QListWidgetItem(self.dialog.list_personal_preset_mp)
            item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsUserCheckable
                          | Qt.ItemIsEnabled)
            self.dialog.list_personal_preset_mp.addItem(item)

            preset = QFrame()
            preset.setObjectName('FramePreset')
            preset.setFrameStyle(QFrame.StyledPanel)
            preset.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
            hbox = QHBoxLayout()
            vbox = QVBoxLayout()
            label_name = QLabel(name)
            label_name.setStyleSheet('font-weight: bold;')
            label_name.setWordWrap(True)
            vbox.addWidget(label_name)
            for label in data['description']:
                if not label:
                    label = tr('No description')
                real_label = QLabel(label)
                real_label.setWordWrap(True)
                vbox.addWidget(real_label)
            hbox.addItem(vbox)
            button_edit = QPushButton()
            button_remove = QPushButton()
            button_edit.setIcon(
                QIcon(QgsApplication.iconPath("mActionToggleEditing.svg")))
            button_remove.setIcon(
                QIcon(QgsApplication.iconPath('symbologyRemove.svg')))
            button_edit.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
            button_remove.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
            button_edit.setToolTip(tr('Edit the preset'))
            button_remove.setToolTip(tr('Delete the preset'))
            hbox.addWidget(button_edit)
            hbox.addWidget(button_remove)
            if data['advanced']:
                self.listAdvanced.append(True)
                preset.setStyleSheet('#FramePreset { margin: 3px;'
                                     ' border: 3px solid ' +
                                     self.advanced_selected + ';'
                                     ' border-width: 1px 1px 1px 4px;}')
            else:
                self.listAdvanced.append(False)
                preset.setStyleSheet('#FramePreset { margin: 3px;'
                                     ' border: 3px solid ' +
                                     self.basic_selected + ';'
                                     ' border-width: 1px 1px 1px 4px;}')
            preset.setLayout(hbox)

            # Actions on click
            remove = partial(self.verification_remove_preset, item, name)
            button_remove.clicked.connect(remove)
            edit = partial(self.edit_preset, data)
            button_edit.clicked.connect(edit)

            item.setSizeHint(preset.minimumSizeHint())
            self.dialog.list_personal_preset_mp.setItemWidget(item, preset)

        self.listAdvanced.append(False)