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)))
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)
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)
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)
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)
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)
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)
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)
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)