Exemplo n.º 1
0
    def __select_wfs_layer(self) -> None:

        indexes = self.tbl_wdgt_stored_queries.selectedIndexes()
        if not indexes:
            LOGGER.warning(
                tr("Could not execute select"),
                extra=bar_msg(tr("Data source must be selected first!")),
            )
            return
        self.selected_stored_query = self.stored_queries[indexes[0].row()]
        LOGGER.info(
            tr("Selected query id: {}",
               self.selected_stored_query.id))  # type: ignore # noqa E501
        self.sq_factory.expand(self.selected_stored_query)  # type: ignore

        for widget_set in self.parameter_rows.values():
            for widget in widget_set:
                if isinstance(widget, QVBoxLayout):
                    self.grid.removeItem(widget)
                else:
                    self.grid.removeWidget(widget)
                    widget.hide()
                widget.setParent(None)
                widget = None
        self.parameter_rows = {}

        row_idx = -1
        self.extent_group_box_bbox.setEnabled(False)
        for param_name, parameter in self.selected_stored_query.parameters.items(
        ):  # type: ignore # noqa E501
            possible_values = parameter.possible_values
            widgets = set()  # type: ignore
            if parameter.type in (QVariant.Rect, QVariant.RectF):
                self.parameter_rows[param_name] = widgets
                self.extent_group_box_bbox.setEnabled(True)
                if possible_values:
                    dataset_extent = QgsRectangle(
                        *(map(float, possible_values[0].split(","))))
                    current_extent: QgsRectangle = (
                        self.extent_group_box_bbox.outputExtent())
                    extent_msg = tr(
                        "Your extent: {}, dataset maximum extent: {}",
                        current_extent.toString(2),
                        dataset_extent.toString(2),
                    )

                    if dataset_extent.area() / current_extent.area() > 100:
                        LOGGER.warning(
                            tr("Big difference in bounding boxes"),
                            extra=bar_msg(
                                tr(
                                    "You might want to get a larger extent. {}",
                                    extent_msg,
                                )),
                        )
                    elif current_extent.area() / dataset_extent.area() > 100:
                        LOGGER.warning(
                            tr("Big difference in bounding boxes"),
                            extra=bar_msg(
                                tr(
                                    "You might want to get a smaller extent. {}",
                                    extent_msg,
                                )),
                        )

                    if not current_extent.toRectF().intersects(
                            dataset_extent.toRectF()):
                        LOGGER.warning(
                            tr("Your bounding box and dataset bounding "
                               "box do not intersect"),
                            extra=bar_msg(
                                tr(
                                    "You might want to change your extent. {}",
                                    extent_msg,
                                )),
                        )
                continue
            row_idx += 1
            widget: QWidget = widget_for_field(parameter.type)  # type: ignore
            if (isinstance(widget, QComboBox) or isinstance(widget, QSpinBox)
                    or isinstance(widget, QgsDoubleSpinBox)):
                widget = QLineEdit()
                if possible_values:
                    if len(possible_values) == 1:
                        widget.setText(possible_values[0])
                    else:
                        widget = QComboBox()
                        widget.addItems(possible_values)
                        widget.setEditable(True)

            if isinstance(widget, QgsDateTimeEdit) and possible_values:
                widget.setDateTimeRange(min(possible_values),
                                        max(possible_values))
                if param_name.startswith("end"):
                    widget.setDateTime(max(possible_values))
                else:
                    widget.setDateTime(min(possible_values))
                if len(possible_values) == 1:
                    widget.setEnabled(False)

            widget.setToolTip(parameter.abstract)

            if parameter.type == QVariant.StringList:
                if parameter.has_variables():
                    widget = QVBoxLayout()
                    widget.addStretch(1)
                    for variable in parameter.variables:
                        box = QCheckBox(text=variable.alias)
                        box.setToolTip(variable.label)
                        widgets.add(box)
                        widget.addWidget(box)
                        LOGGER.info(tr("Variables: {}", variable.alias))

            # TODO: all others
            if widget is None:
                LOGGER.error(
                    tr("Unknown parameter type"),
                    extra=bar_msg(
                        tr('With parameter"{}": {}', param_name,
                           parameter.type)),
                )
                return
            label = QLabel(text=parameter.name)
            label.setToolTip(parameter.abstract)

            widgets.update({label, widget})

            self.grid.addWidget(label, row_idx, 1)
            if isinstance(widget, QVBoxLayout):
                self.grid.addLayout(widget, row_idx, 2)
            else:
                self.grid.addWidget(widget, row_idx, 2)
            self.parameter_rows[param_name] = widgets