예제 #1
0
파일: view_str.py 프로젝트: ollawone/stdm
    def executeSearch(self):
        """
        Base class override.
        Search for matching items for the specified entity and column.
        """
        model_root_node = None

        prog_dialog = QProgressDialog(self)
        prog_dialog.setFixedWidth(380)
        prog_dialog.setWindowTitle(
            QApplication.translate("STRViewEntityWidget",
                                   "Searching for STR..."))
        prog_dialog.show()
        prog_dialog.setRange(0, 10)
        search_term = self._searchTerm()

        prog_dialog.setValue(2)
        # Try to get the corresponding search term value from the completer model
        if not self._completer_model is None:
            reg_exp = QRegExp("^%s$" % (search_term), Qt.CaseInsensitive,
                              QRegExp.RegExp2)
            self._proxy_completer_model.setFilterRegExp(reg_exp)

            if self._proxy_completer_model.rowCount() > 0:
                # Get corresponding actual value from the first matching item
                value_model_idx = self._proxy_completer_model.index(0, 1)
                source_model_idx = self._proxy_completer_model.mapToSource(
                    value_model_idx)
                prog_dialog.setValue(4)
                search_term = self._completer_model.data(
                    source_model_idx, Qt.DisplayRole)

        modelInstance = self.config.STRModel()

        modelQueryObj = modelInstance.queryObject()

        queryObjProperty = getattr(self.config.STRModel,
                                   self.currentFieldName())

        entity_name = modelQueryObj._primary_entity._label_name

        entity = self.curr_profile.entity_by_name(entity_name)

        prog_dialog.setValue(6)
        # Get property type so that the filter can
        # be applied according to the appropriate type
        propType = queryObjProperty.property.columns[0].type
        results = []
        try:
            if not isinstance(propType, String):

                col_name = self.currentFieldName()
                col = entity.columns[self.currentFieldName()]

                if col.TYPE_INFO == 'LOOKUP':
                    lookup_entity = lookup_parent_entity(
                        self.curr_profile, col_name)
                    lkp_model = entity_model(lookup_entity)
                    lkp_obj = lkp_model()
                    value_obj = getattr(lkp_model, 'value')

                    result = lkp_obj.queryObject().filter(
                        func.lower(value_obj) == func.lower(
                            search_term)).first()
                    if result is None:
                        result = lkp_obj.queryObject().filter(
                            func.lower(value_obj).like(search_term +
                                                       '%')).first()

                    if not result is None:
                        results = modelQueryObj.filter(
                            queryObjProperty == result.id).all()

                    else:
                        results = []

            else:
                results = modelQueryObj.filter(
                    func.lower(queryObjProperty) == func.lower(
                        search_term)).all()

            if self.validity.isEnabled():
                valid_str_ids = self.str_validity_period_filter(results)
            else:
                valid_str_ids = None

            prog_dialog.setValue(7)
        except exc.StatementError:
            return model_root_node, [], search_term

        # if self.formatter is not None:
        # self.formatter.setData(results)
        # model_root_node = self.formatter.root(valid_str_ids)
        prog_dialog.setValue(10)
        prog_dialog.hide()

        return results, search_term
class UpdateThemesOfGroup:
    def __init__(self, iface, plugin_dir, yleiskaavaSettings,
                 yleiskaavaDatabase, yleiskaavaUtils):

        self.iface = iface

        self.yleiskaavaSettings = yleiskaavaSettings
        self.yleiskaavaDatabase = yleiskaavaDatabase
        self.yleiskaavaUtils = yleiskaavaUtils

        self.plugin_dir = plugin_dir

        self.dialogUpdateThemeOfGroup = uic.loadUi(
            os.path.join(self.plugin_dir, 'ui',
                         'yleiskaava_dialog_update_themes_of_group.ui'))

        self.themes = None
        self.themeNames = None

        self.currentTheme = None

        self.hasUserSelectedPolygonFeaturesForUpdate = False
        self.hasUserSelectedSuplementaryPolygonFeaturesForUpdate = False
        self.hasUserSelectedLineFeaturesForUpdate = False
        self.hasUserSelectedPointFeaturesForUpdate = False

        self.hasUserCanceledCopy = False
        self.progressDialog = None
        self.shouldHide = False

    def setup(self):
        self.setupDialogUpdateThemeOfGroup()

    def setupDialogUpdateThemeOfGroup(self):

        self.dialogUpdateThemeOfGroup.comboBoxThemeNames.currentIndexChanged.connect(
            self.handleComboBoxThemeNameChanged)

        self.dialogUpdateThemeOfGroup.checkBoxUpdatePolygonFeatures.stateChanged.connect(
            self.checkBoxUpdatePolygonFeaturesStateChanged)
        self.dialogUpdateThemeOfGroup.checkBoxUpdateSupplementaryPolygonFeatures.stateChanged.connect(
            self.checkBoxUpdateSupplementaryPolygonFeaturesStateChanged)
        self.dialogUpdateThemeOfGroup.checkBoxUpdateLineFeatures.stateChanged.connect(
            self.checkBoxUpdateLineFeaturesStateChanged)
        self.dialogUpdateThemeOfGroup.checkBoxUpdatePointFeatures.stateChanged.connect(
            self.checkBoxUpdatePointFeaturesStateChanged)

        # Varoita käyttäjää, jos jo valmiiksi valittuja kohteita
        self.dialogUpdateThemeOfGroup.pushButtonSelectPolygonFeatures.clicked.connect(
            self.selectPolygonFeatures)
        self.dialogUpdateThemeOfGroup.pushButtonSelectSupplementaryPolygonFeatures.clicked.connect(
            self.selectSupplementaryPolygonFeatures)
        self.dialogUpdateThemeOfGroup.pushButtonSelectLineFeatures.clicked.connect(
            self.selectLineFeatures)
        self.dialogUpdateThemeOfGroup.pushButtonSelectPointFeatures.clicked.connect(
            self.selectPointFeatures)

        self.dialogUpdateThemeOfGroup.pushButtonUpdate.clicked.connect(
            self.handleUpdateTheme)
        self.dialogUpdateThemeOfGroup.pushButtonUpdateAndClose.clicked.connect(
            self.handleUpdateThemeAndClose)

        self.dialogUpdateThemeOfGroup.pushButtonCancel.clicked.connect(
            self.dialogUpdateThemeOfGroup.hide)

    def selectPolygonFeatures(self):
        layer = QgsProject.instance().mapLayersByName(
            YleiskaavaDatabase.KAAVAOBJEKTI_ALUE)[0]
        if layer.selectedFeatureCount() > 0:
            self.iface.messageBar().pushMessage(
                'Aluevaraukset karttatasolla on jo valmiiksi valittuja kohteita',
                Qgis.Info,
                duration=20)
        self.iface.showAttributeTable(layer)
        self.hasUserSelectedPolygonFeaturesForUpdate = True

        self.dialogUpdateThemeOfGroup.checkBoxUpdatePolygonFeatures.setChecked(
            True)

    def selectSupplementaryPolygonFeatures(self):
        layer = QgsProject.instance().mapLayersByName(
            YleiskaavaDatabase.KAAVAOBJEKTI_ALUE_TAYDENTAVA)[0]
        if layer.selectedFeatureCount() > 0:
            self.iface.messageBar().pushMessage(
                'Täydentävät aluekohteet  karttatasolla on jo valmiiksi valittuja kohteita',
                Qgis.Info,
                duration=20)
        self.iface.showAttributeTable(layer)
        self.hasUserSelectedSuplementaryPolygonFeaturesForUpdate = True

        self.dialogUpdateThemeOfGroup.checkBoxUpdateSupplementaryPolygonFeatures.setChecked(
            True)

    def selectLineFeatures(self):
        layer = QgsProject.instance().mapLayersByName(
            YleiskaavaDatabase.KAAVAOBJEKTI_VIIVA)[0]
        if layer.selectedFeatureCount() > 0:
            self.iface.messageBar().pushMessage(
                'Viivamaiset kaavakohteet karttatasolla on jo valmiiksi valittuja kohteita',
                Qgis.Info,
                duration=20)
        self.iface.showAttributeTable(layer)
        self.hasUserSelectedLineFeaturesForUpdate = True

        self.dialogUpdateThemeOfGroup.checkBoxUpdateLineFeatures.setChecked(
            True)

    def selectPointFeatures(self):
        layer = QgsProject.instance().mapLayersByName(
            YleiskaavaDatabase.KAAVAOBJEKTI_PISTE)[0]
        if layer.selectedFeatureCount() > 0:
            self.iface.messageBar().pushMessage(
                'Pistemäiset kaavakohteet karttatasolla on jo valmiiksi valittuja kohteita',
                Qgis.Info,
                duration=20)
        self.iface.showAttributeTable(layer)
        self.hasUserSelectedPointFeaturesForUpdate = True

        self.dialogUpdateThemeOfGroup.checkBoxUpdatePointFeatures.setChecked(
            True)

    def checkBoxUpdatePolygonFeaturesStateChanged(self):
        pass
        # if self.dialogUpdateThemeOfGroup.checkBoxUpdatePolygonFeatures.isChecked():
        #     self.dialogUpdateThemeOfGroup.pushButtonSelectPolygonFeatures.setEnabled(True)
        # else:
        #     self.dialogUpdateThemeOfGroup.pushButtonSelectPolygonFeatures.setEnabled(False)

    def checkBoxUpdateSupplementaryPolygonFeaturesStateChanged(self):
        pass
        # if self.dialogUpdateThemeOfGroup.checkBoxUpdateSupplementaryPolygonFeatures.isChecked():
        #     self.dialogUpdateThemeOfGroup.pushButtonSelectSupplementaryPolygonFeatures.setEnabled(True)
        # else:
        #     self.dialogUpdateThemeOfGroup.pushButtonSelectSupplementaryPolygonFeatures.setEnabled(False)

    def checkBoxUpdateLineFeaturesStateChanged(self):
        pass
        # if self.dialogUpdateThemeOfGroup.checkBoxUpdateLineFeatures.isChecked():
        #     self.dialogUpdateThemeOfGroup.pushButtonSelectLineFeatures.setEnabled(True)
        # else:
        #     self.dialogUpdateThemeOfGroup.pushButtonSelectLineFeatures.setEnabled(False)

    def checkBoxUpdatePointFeaturesStateChanged(self):
        pass
        # if self.dialogUpdateThemeOfGroup.checkBoxUpdatePointFeatures.isChecked():
        #     self.dialogUpdateThemeOfGroup.pushButtonSelectPointFeatures.setEnabled(True)
        # else:
        #     self.dialogUpdateThemeOfGroup.pushButtonSelectPointFeatures.setEnabled(False)

    def openDialogUpdateThemeForGroup(self):
        self.reset()
        if self.yleiskaavaSettings.shouldKeepDialogsOnTop():
            self.dialogUpdateThemeOfGroup.setWindowFlags(
                Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint
                | Qt.WindowCloseButtonHint | Qt.WindowStaysOnTopHint)
        else:
            self.dialogUpdateThemeOfGroup.setWindowFlags(
                Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint
                | Qt.WindowCloseButtonHint)
        self.dialogUpdateThemeOfGroup.show()

    def handleUpdateTheme(self):
        self.shouldHide = False
        self.updateTheme()

    def handleUpdateThemeAndClose(self):
        self.shouldHide = True
        self.updateTheme()

    def updateTheme(self):
        # Päivitä teema ja siihen liitetyt kaavakohteet ja huomio asetukset, sekä mahd. useat teemat kohteella
        # Tarkista, onko teeman lomaketiedoissa eroa ja jos ei, niin ilmoita käyttäjälle.
        # Lisää teema sellaisille kaavakohteille, joilla sitä ei vielä ole, mutta käyttäjä on ko. kaavakohteen valinnut / valitsee
        # Anna käyttäjän valita kaavakohteet, joille teema päivitetään.
        # Varmista, että käyttäjä ei voi vahingossa päivittää jo aiemmin valitsemiaan kaavaobjekteja.
        # Varmista jotenkin, että käyttäjän valitsemat kohteet päivitetään vaikka niillä olisi eri teema kuin muutettava teema / rajoita valintamahdollisuus kohteisiin, joilla muutettavan teeman relaatio
        # Ilmoita käyttäjälle, että valitse kohteet, tms., jos ei ole valinnut.
        # Varmista, että self.currentTheme != None jo vaikka käyttäjä ei ole valinnut dialogista kohteita / lisää ensimmäiseksi vaihtoehdoksi comboboxiin "Valitse teema"
        # Huomioi, "Poista kaavakohteilta vanhat teemat"-asetuksen pois päältä olo, kun käyttäjä vain päivittää kohteilla jo olevaa teemaa -> ei siis tehdä duplikaattirelaatiota
        # näytä käyttöliittymässä yleiskaavan id, nimi, nro
        if self.currentTheme != None:
            themeID = self.currentTheme["id"]
            themeName = self.dialogUpdateThemeOfGroup.lineEditThemeName.text()
            themeDescription = self.dialogUpdateThemeOfGroup.plainTextEditThemeDescription.toPlainText(
            )

            if not self.equalsThemeAndFormTexts(themeName, themeDescription):
                # self.yleiskaavaDatabase.reconnectToDB()

                success = self.yleiskaavaDatabase.updateTheme(
                    themeID, themeName, themeDescription)

                if success:
                    self.currentTheme["alpha_sort_key"] = themeName
                    self.currentTheme["nimi"] = QVariant(themeName)
                    self.currentTheme["kuvaus"] = QVariant(themeDescription)
                    # self.currentTheme["id_yleiskaava"] = QVariant(themeDescription)

                    self.iface.messageBar().pushMessage('Teema päivitetty',
                                                        Qgis.Info,
                                                        duration=30)
            elif not self.dialogUpdateThemeOfGroup.checkBoxUpdatePolygonFeatures.isChecked(
            ) and not self.dialogUpdateThemeOfGroup.checkBoxUpdateSupplementaryPolygonFeatures.isChecked(
            ) and not self.dialogUpdateThemeOfGroup.checkBoxUpdateLineFeatures.isChecked(
            ) and not self.dialogUpdateThemeOfGroup.checkBoxUpdatePointFeatures.isChecked(
            ):
                self.iface.messageBar().pushMessage(
                    'Teemaan ei ole tehty muutoksia eikä päivitettäviä kaavakohteita ole valittu. Ei tehdä päivityksiä',
                    Qgis.Info,
                    duration=30)

            if self.dialogUpdateThemeOfGroup.checkBoxUpdatePolygonFeatures.isChecked(
            ):
                if not self.hasUserSelectedPolygonFeaturesForUpdate:
                    self.iface.messageBar().pushMessage(
                        'Et ole valinnut päivitettäviä aluevarauksia; aluevarauksia ei päivitetty',
                        Qgis.Warning,
                        duration=0)
                else:
                    self.progressDialog = QProgressDialog(
                        "Päivitetään aluevarausten teemoja...", "Keskeytä", 0,
                        100)
                    self.progressDialog.setWindowFlags(
                        Qt.WindowMinimizeButtonHint
                        | Qt.WindowMaximizeButtonHint
                        | Qt.WindowStaysOnTopHint)
                    self.updateSpatialFeatures("alue")
            if self.dialogUpdateThemeOfGroup.checkBoxUpdateSupplementaryPolygonFeatures.isChecked(
            ):
                if not self.hasUserSelectedSuplementaryPolygonFeaturesForUpdate:
                    self.iface.messageBar().pushMessage(
                        'Et ole valinnut päivitettäviä täydentäviä aluekohteita; täydentäviä aluekohteita ei päivitetty',
                        Qgis.Warning,
                        duration=0)
                else:
                    self.progressDialog = QProgressDialog(
                        "Päivitetään täydentävien aluekohteiden teemoja...",
                        "Keskeytä", 0, 100)
                    self.progressDialog.setWindowFlags(
                        Qt.WindowMinimizeButtonHint
                        | Qt.WindowMaximizeButtonHint
                        | Qt.WindowStaysOnTopHint)
                    self.updateSpatialFeatures("alue_taydentava")
            if self.dialogUpdateThemeOfGroup.checkBoxUpdateLineFeatures.isChecked(
            ):
                if not self.hasUserSelectedLineFeaturesForUpdate:
                    self.iface.messageBar().pushMessage(
                        'Et ole valinnut päivitettäviä viivamaisia kohteita; viivamaisia ei päivitetty',
                        Qgis.Warning,
                        duration=0)
                else:
                    self.progressDialog = QProgressDialog(
                        "Päivitetään viivamaisten kohteiden teemoja...",
                        "Keskeytä", 0, 100)
                    self.progressDialog.setWindowFlags(
                        Qt.WindowMinimizeButtonHint
                        | Qt.WindowMaximizeButtonHint
                        | Qt.WindowStaysOnTopHint)
                    self.updateSpatialFeatures("viiva")
            if self.dialogUpdateThemeOfGroup.checkBoxUpdatePointFeatures.isChecked(
            ):
                if not self.hasUserSelectedPointFeaturesForUpdate:
                    self.iface.messageBar().pushMessage(
                        'Et ole valinnut päivitettäviä pistemäisiä kohteita; pistemäisiä kohteita ei päivitetty',
                        Qgis.Warning,
                        duration=0)
                else:
                    self.progressDialog = QProgressDialog(
                        "Päivitetään pistemäisten kohteiden teemoja...",
                        "Keskeytä", 0, 100)
                    self.progressDialog.setWindowFlags(
                        Qt.WindowMinimizeButtonHint
                        | Qt.WindowMaximizeButtonHint
                        | Qt.WindowStaysOnTopHint)
                    self.updateSpatialFeatures("piste")

            if self.shouldHide:
                self.dialogUpdateThemeOfGroup.hide()

            # else:
            #     self.iface.messageBar().pushMessage("Kaavakohteita ei päivitetty", Qgis.Critical)

        elif self.dialogUpdateThemeOfGroup.checkBoxRemoveOldThemesFromSpatialFeatures.isChecked(
        ):
            # ainoastaan poistetaan vanha(t) teema(t) valituilta kohteilta
            if self.dialogUpdateThemeOfGroup.checkBoxUpdatePolygonFeatures.isChecked(
            ):
                if not self.hasUserSelectedPolygonFeaturesForUpdate:
                    self.iface.messageBar().pushMessage(
                        'Et ole valinnut päivitettäviä aluevarauksia; aluevarauksia ei päivitetty',
                        Qgis.Warning,
                        duration=0)
                else:
                    success = self.removeThemesFromSpatialFeatures("alue")
                    if success:
                        self.iface.messageBar().pushMessage(
                            'Aluvarausten teemat poistettu',
                            Qgis.Info,
                            duration=30)
            if self.dialogUpdateThemeOfGroup.checkBoxUpdateSupplementaryPolygonFeatures.isChecked(
            ):
                if not self.hasUserSelectedSuplementaryPolygonFeaturesForUpdate:
                    self.iface.messageBar().pushMessage(
                        'Et ole valinnut päivitettäviä täydentäviä aluekohteita; täydentäviä aluekohteita ei päivitetty',
                        Qgis.Warning,
                        duration=0)
                else:
                    success = self.removeThemesFromSpatialFeatures(
                        "alue_taydentava")
                    if success:
                        self.iface.messageBar().pushMessage(
                            'Täydentävien aluekohteiden teemat poistettu',
                            Qgis.Info,
                            duration=30)
            if self.dialogUpdateThemeOfGroup.checkBoxUpdateLineFeatures.isChecked(
            ):
                if not self.hasUserSelectedLineFeaturesForUpdate:
                    self.iface.messageBar().pushMessage(
                        'Et ole valinnut päivitettäviä viivamaisia kohteita; viivamaisia ei päivitetty',
                        Qgis.Warning,
                        duration=0)
                else:
                    success = self.removeThemesFromSpatialFeatures("viiva")
                    if success:
                        self.iface.messageBar().pushMessage(
                            'Viivamaisten kohteiden teemat poistettu',
                            Qgis.Info,
                            duration=30)
            if self.dialogUpdateThemeOfGroup.checkBoxUpdatePointFeatures.isChecked(
            ):
                if not self.hasUserSelectedPointFeaturesForUpdate:
                    self.iface.messageBar().pushMessage(
                        'Et ole valinnut päivitettäviä pistemäisiä kohteita; pistemäisiä kohteita ei päivitetty',
                        Qgis.Warning,
                        duration=0)
                else:
                    success = self.removeThemesFromSpatialFeatures("piste")
                    if success:
                        self.iface.messageBar().pushMessage(
                            'Pistemäisten kohteiden teemat poistettu',
                            Qgis.Info,
                            duration=30)

            if self.shouldHide:
                self.dialogUpdateThemeOfGroup.hide()
            self.finishUpdate()
        else:
            self.iface.messageBar().pushMessage('Valitse teema',
                                                Qgis.Info,
                                                duration=30)

    def equalsThemeAndFormTexts(self, formThemeName, formThemeDescription):
        themeName = self.currentTheme["nimi"]
        themeDescription = ""
        if self.currentTheme["kuvaus"] is not None:
            themeDescription = self.currentTheme["kuvaus"]

        if formThemeName == themeName and formThemeDescription == themeDescription:
            return True

        return False

    def finishUpdate(self):
        self.yleiskaavaUtils.refreshTargetLayersInProject()

    def reset(self):
        self.setupThemesInDialog()

        self.dialogUpdateThemeOfGroup.checkBoxUpdatePolygonFeatures.setChecked(
            False)
        self.dialogUpdateThemeOfGroup.checkBoxUpdateSupplementaryPolygonFeatures.setChecked(
            False)
        self.dialogUpdateThemeOfGroup.checkBoxUpdateLineFeatures.setChecked(
            False)
        self.dialogUpdateThemeOfGroup.checkBoxUpdatePointFeatures.setChecked(
            False)

        self.hasUserSelectedPolygonFeaturesForUpdate = False
        self.hasUserSelectedSuplementaryPolygonFeaturesForUpdate = False
        self.hasUserSelectedLineFeaturesForUpdate = False
        self.hasUserSelectedPointFeaturesForUpdate = False

        self.updateUserSelectionsBasedOnLayers()

    def updateUserSelectionsBasedOnLayers(self):
        layer = QgsProject.instance().mapLayersByName(
            YleiskaavaDatabase.KAAVAOBJEKTI_ALUE)[0]
        if layer.selectedFeatureCount() > 0:
            self.hasUserSelectedPolygonFeaturesForUpdate = True
            self.dialogUpdateThemeOfGroup.checkBoxUpdatePolygonFeatures.setChecked(
                True)
        layer = QgsProject.instance().mapLayersByName(
            YleiskaavaDatabase.KAAVAOBJEKTI_ALUE_TAYDENTAVA)[0]
        if layer.selectedFeatureCount() > 0:
            self.hasUserSelectedSuplementaryPolygonFeaturesForUpdate = True
            self.dialogUpdateThemeOfGroup.checkBoxUpdateSupplementaryPolygonFeatures.setChecked(
                True)
        layer = QgsProject.instance().mapLayersByName(
            YleiskaavaDatabase.KAAVAOBJEKTI_VIIVA)[0]
        if layer.selectedFeatureCount() > 0:
            self.hasUserSelectedLineFeaturesForUpdate = True
            self.dialogUpdateThemeOfGroup.checkBoxUpdateLineFeatures.setChecked(
                True)
        layer = QgsProject.instance().mapLayersByName(
            YleiskaavaDatabase.KAAVAOBJEKTI_PISTE)[0]
        if layer.selectedFeatureCount() > 0:
            self.hasUserSelectedPointFeaturesForUpdate = True
            self.dialogUpdateThemeOfGroup.checkBoxUpdatePointFeatures.setChecked(
                True)

    def updateSpatialFeatures(self, featureType):
        if self.currentTheme != None:
            themeID = self.currentTheme["id"]
            themeName = self.currentTheme["nimi"]
            shouldRemoveOldThemeRelations = self.dialogUpdateThemeOfGroup.checkBoxRemoveOldThemesFromSpatialFeatures.isChecked(
            )

            # self.yleiskaavaDatabase.reconnectToDB()

            self.updateThemesOfGroupTask = UpdateThemesOfGroupTask(
                self.yleiskaavaDatabase, featureType, themeID, themeName,
                shouldRemoveOldThemeRelations)

            targetLayer = self.yleiskaavaDatabase.getTargetLayer(featureType)
            themeLayer = self.yleiskaavaDatabase.getProjectLayer(
                "yk_kuvaustekniikka.teema")
            themeRelationLayer = self.yleiskaavaDatabase.getProjectLayer(
                "yk_kuvaustekniikka.kaavaobjekti_teema_yhteys")
            self.updateThemesOfGroupTask.setDependentLayers(
                [targetLayer, themeLayer, themeRelationLayer])

            self.progressDialog.canceled.connect(
                self.handleUpdateThemesOfGroupTaskStopRequestedByUser)
            self.updateThemesOfGroupTask.progressChanged.connect(
                self.handleUpdateThemesOfGroupTaskProgressChanged)
            self.updateThemesOfGroupTask.taskCompleted.connect(
                self.handleUpdateThemesOfGroupTaskCompleted)
            self.updateThemesOfGroupTask.taskTerminated.connect(
                self.handleUpdateThemesOfGroupTaskTerminated)

            self.progressDialog.setValue(0)
            self.progressDialog.show()
            QgsApplication.taskManager().addTask(self.updateThemesOfGroupTask)

    def handleUpdateThemesOfGroupTaskStopRequestedByUser(self):
        self.hasUserCanceledCopy = True
        self.updateThemesOfGroupTask.cancel()

    def handleUpdateThemesOfGroupTaskProgressChanged(self, progress):
        self.progressDialog.setValue(int(progress))

    def handleUpdateThemesOfGroupTaskCompleted(self):
        self.progressDialog.hide()
        self.finishUpdate()
        if not self.hasUserCanceledCopy:
            self.iface.messageBar().pushMessage(
                'Valittujen kaavakohteiden teemat päivitetty',
                Qgis.Info,
                duration=30)
        else:
            self.iface.messageBar().pushMessage(
                'Valittujen kaavakohteiden teemoja ei päivitetty kokonaisuudessaan tietokantaan',
                Qgis.Info,
                duration=30)
        self.hasUserCanceledCopy = False

    def handleUpdateThemesOfGroupTaskTerminated(self):
        if not self.hasUserCanceledCopy:
            self.iface.messageBar().pushMessage(
                "Teemojen päivityksessä tapahtui virhe",
                Qgis.Critical,
                duration=0)
        else:
            self.hasUserCanceledCopy = False
        self.progressDialog.hide()
        self.finishUpdate()

    def removeThemesFromSpatialFeatures(self, featureType):

        # self.yleiskaavaDatabase.reconnectToDB()

        spatialFeatures = self.yleiskaavaDatabase.getSelectedFeatures(
            featureType, ["id"])
        # spatialFeatures = self.yleiskaavaDatabase.getSpatialFeaturesWithRegulationForType(regulationID, featureType)

        for feature in spatialFeatures:
            success = self.yleiskaavaDatabase.removeSpatialFeatureThemes(
                feature["id"], featureType)

            if not success:
                self.iface.messageBar().pushMessage(
                    "Kaavakohteelta, jonka tyyppi on " +
                    self.yleiskaavaDatabase.
                    getUserFriendlySpatialFeatureTypeName(featureType) +
                    " ja id on " + str(feature["id"]) +
                    " ei voitu poistaa teemoja",
                    Qgis.Critical,
                    duration=0)

                return False

        return True

    def setupThemesInDialog(self):
        # self.yleiskaavaDatabase.reconnectToDB()

        self.themes = sorted(self.yleiskaavaDatabase.getThemes(),
                             key=itemgetter('alpha_sort_key'))
        self.themeNames = []
        for index, theme in enumerate(self.themes):
            # QgsMessageLog.logMessage("setupThemesInDialog - index: " + str(index) + ", theme['kuvaus']: " + str(theme['kuvaus']) + ", theme['nimi']: " + str(theme['nimi']), 'Yleiskaava-työkalu', Qgis.Info)
            nimi = ""
            kuvaus = ""
            if theme["nimi"] is not None or theme["kuvaus"] is not None:
                if theme["kuvaus"] is not None:
                    kuvaus = (
                        theme["kuvaus"][:25] +
                        '..') if len(theme["kuvaus"]) > 25 else theme["kuvaus"]
            self.themeNames.append(str(theme["nimi"]) + ' - ' + kuvaus)
        self.dialogUpdateThemeOfGroup.comboBoxThemeNames.clear()
        self.dialogUpdateThemeOfGroup.comboBoxThemeNames.addItems(
            self.themeNames)

        self.dialogUpdateThemeOfGroup.comboBoxThemeNames.insertItem(
            0, "Valitse teema")
        self.dialogUpdateThemeOfGroup.comboBoxThemeNames.setCurrentIndex(0)
        self.currentTheme = None

    def handleComboBoxThemeNameChanged(self, currentIndex):
        self.currentTheme = self.themes[currentIndex - 1]

        if currentIndex > 0:
            self.dialogUpdateThemeOfGroup.lineEditThemeName.setText(
                self.currentTheme["nimi"])
            if self.currentTheme["kuvaus"] is not None:
                self.dialogUpdateThemeOfGroup.plainTextEditThemeDescription.setPlainText(
                    self.currentTheme["kuvaus"])
            else:
                self.dialogUpdateThemeOfGroup.plainTextEditThemeDescription.setPlainText(
                    "")
            if self.currentTheme["yleiskaava_nimi"] is not None:
                self.dialogUpdateThemeOfGroup.lineEditPlanName.setText(
                    self.currentTheme["yleiskaava_nimi"])
            else:
                self.dialogUpdateThemeOfGroup.lineEditPlanName.setText("")
        else:
            self.currentTheme = None
            self.dialogUpdateThemeOfGroup.lineEditThemeName.setText("")
            self.dialogUpdateThemeOfGroup.plainTextEditThemeDescription.setPlainText(
                "")
            self.dialogUpdateThemeOfGroup.lineEditPlanName.setText("")
예제 #3
0
class UpdateRegulationOfGroup:
    def __init__(self, iface, plugin_dir, yleiskaavaSettings,
                 yleiskaavaDatabase, yleiskaavaUtils):

        self.iface = iface

        self.yleiskaavaSettings = yleiskaavaSettings
        self.yleiskaavaDatabase = yleiskaavaDatabase
        self.yleiskaavaUtils = yleiskaavaUtils

        self.plugin_dir = plugin_dir

        self.dialogUpdateRegulationOfGroup = uic.loadUi(
            os.path.join(self.plugin_dir, 'ui',
                         'yleiskaava_dialog_update_regulation_of_group.ui'))

        self.regulations = None
        self.regulationTitles = None

        self.currentRegulation = None

        self.hasUserSelectedPolygonFeaturesForUpdate = False
        self.hasUserSelectedSuplementaryPolygonFeaturesForUpdate = False
        self.hasUserSelectedLineFeaturesForUpdate = False
        self.hasUserSelectedPointFeaturesForUpdate = False

        self.hasUserCanceledCopy = False
        self.progressDialog = None
        self.shouldHide = False

    def setup(self):
        self.setupDialogUpdateRegulationOfGroup()

    def setupDialogUpdateRegulationOfGroup(self):

        self.dialogUpdateRegulationOfGroup.comboBoxRegulationTitles.currentIndexChanged.connect(
            self.handleComboBoxRegulationTitleChanged)

        self.dialogUpdateRegulationOfGroup.checkBoxShowOnlyUsedRegulations.stateChanged.connect(
            self.checkBoxShowOnlyUsedRegulationsStateChanged)
        self.dialogUpdateRegulationOfGroup.checkBoxShowAreaRegulations.stateChanged.connect(
            self.checkBoxShowAreaRegulationsStateChanged)
        self.dialogUpdateRegulationOfGroup.checkBoxShowSuplementaryAreaRegulations.stateChanged.connect(
            self.checkBoxShowSuplementaryAreaRegulationsStateChanged)
        self.dialogUpdateRegulationOfGroup.checkBoxShowLineRegulations.stateChanged.connect(
            self.checkBoxShowLineRegulationsStateChanged)
        self.dialogUpdateRegulationOfGroup.checkBoxShowPointRegulations.stateChanged.connect(
            self.checkBoxShowPointRegulationsStateChanged)

        self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForPolygonFeatures.stateChanged.connect(
            self.
            checkBoxUpdateLandUseClassificationsForPolygonFeaturesStateChanged)
        self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForSupplementaryPolygonFeatures.stateChanged.connect(
            self.
            checkBoxUpdateLandUseClassificationsForSupplementaryPolygonFeaturesStateChanged
        )
        self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForLineFeatures.stateChanged.connect(
            self.
            checkBoxUpdateLandUseClassificationsForLineFeaturesStateChanged)
        self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForPointFeatures.stateChanged.connect(
            self.
            checkBoxUpdateLandUseClassificationsForPointFeaturesStateChanged)

        # Varoita käyttäjää, jos jo valmiiksi valittuja kohteita
        self.dialogUpdateRegulationOfGroup.pushButtonSelectPolygonFeatures.clicked.connect(
            self.selectPolygonFeatures)
        self.dialogUpdateRegulationOfGroup.pushButtonSelectSupplementaryPolygonFeatures.clicked.connect(
            self.selectSupplementaryPolygonFeatures)
        self.dialogUpdateRegulationOfGroup.pushButtonSelectLineFeatures.clicked.connect(
            self.selectLineFeatures)
        self.dialogUpdateRegulationOfGroup.pushButtonSelectPointFeatures.clicked.connect(
            self.selectPointFeatures)

        self.dialogUpdateRegulationOfGroup.pushButtonUpdate.clicked.connect(
            self.handleUpdateRegulation)
        self.dialogUpdateRegulationOfGroup.pushButtonUpdateAndClose.clicked.connect(
            self.handleUpdateRegulationAndClose)

        self.dialogUpdateRegulationOfGroup.pushButtonCancel.clicked.connect(
            self.dialogUpdateRegulationOfGroup.hide)

    def selectPolygonFeatures(self):
        layer = QgsProject.instance().mapLayersByName(
            YleiskaavaDatabase.KAAVAOBJEKTI_ALUE)[0]
        if layer.selectedFeatureCount() > 0:
            self.iface.messageBar().pushMessage(
                'Aluevaraukset karttatasolla on jo valmiiksi valittuja kohteita',
                Qgis.Info,
                duration=20)
        self.iface.showAttributeTable(layer)
        self.hasUserSelectedPolygonFeaturesForUpdate = True

        self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForPolygonFeatures.setChecked(
            True)

    def selectSupplementaryPolygonFeatures(self):
        layer = QgsProject.instance().mapLayersByName(
            YleiskaavaDatabase.KAAVAOBJEKTI_ALUE_TAYDENTAVA)[0]
        if layer.selectedFeatureCount() > 0:
            self.iface.messageBar().pushMessage(
                'Täydentävät aluekohteet karttatasolla on jo valmiiksi valittuja kohteita',
                Qgis.Info,
                duration=20)
        self.iface.showAttributeTable(layer)
        self.hasUserSelectedSuplementaryPolygonFeaturesForUpdate = True

        self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForSupplementaryPolygonFeatures.setChecked(
            True)

    def selectLineFeatures(self):
        layer = QgsProject.instance().mapLayersByName(
            YleiskaavaDatabase.KAAVAOBJEKTI_VIIVA)[0]
        if layer.selectedFeatureCount() > 0:
            self.iface.messageBar().pushMessage(
                'Viivamaiset kaavakohteet karttatasolla on jo valmiiksi valittuja kohteita',
                Qgis.Info,
                duration=20)
        self.iface.showAttributeTable(layer)
        self.hasUserSelectedLineFeaturesForUpdate = True

        self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForLineFeatures.setChecked(
            True)

    def selectPointFeatures(self):
        layer = QgsProject.instance().mapLayersByName(
            YleiskaavaDatabase.KAAVAOBJEKTI_PISTE)[0]
        if layer.selectedFeatureCount() > 0:
            self.iface.messageBar().pushMessage(
                'Pistemäiset kaavakohteet karttatasolla on jo valmiiksi valittuja kohteita',
                Qgis.Info,
                duration=20)
        self.iface.showAttributeTable(layer)
        self.hasUserSelectedPointFeaturesForUpdate = True

        self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForPointFeatures.setChecked(
            True)

    def checkBoxUpdateLandUseClassificationsForPolygonFeaturesStateChanged(
            self):
        pass
        # if self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForPolygonFeatures.isChecked():
        #     self.dialogUpdateRegulationOfGroup.pushButtonSelectPolygonFeatures.setEnabled(True)
        # else:
        #     self.dialogUpdateRegulationOfGroup.pushButtonSelectPolygonFeatures.setEnabled(False)

    def checkBoxUpdateLandUseClassificationsForSupplementaryPolygonFeaturesStateChanged(
            self):
        pass
        # if self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForSupplementaryPolygonFeatures.isChecked():
        #     self.dialogUpdateRegulationOfGroup.pushButtonSelectSupplementaryPolygonFeatures.setEnabled(True)
        # else:
        #     self.dialogUpdateRegulationOfGroup.pushButtonSelectSupplementaryPolygonFeatures.setEnabled(False)

    def checkBoxUpdateLandUseClassificationsForLineFeaturesStateChanged(self):
        pass
        # if self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForLineFeatures.isChecked():
        #     self.dialogUpdateRegulationOfGroup.pushButtonSelectLineFeatures.setEnabled(True)
        # else:
        #     self.dialogUpdateRegulationOfGroup.pushButtonSelectLineFeatures.setEnabled(False)

    def checkBoxUpdateLandUseClassificationsForPointFeaturesStateChanged(self):
        pass
        # if self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForPointFeatures.isChecked():
        #     self.dialogUpdateRegulationOfGroup.pushButtonSelectPointFeatures.setEnabled(True)
        # else:
        #     self.dialogUpdateRegulationOfGroup.pushButtonSelectPointFeatures.setEnabled(False)

    def openDialogUpdateRegulationOfGroup(self):
        self.reset()
        if self.yleiskaavaSettings.shouldKeepDialogsOnTop():
            self.dialogUpdateRegulationOfGroup.setWindowFlags(
                Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint
                | Qt.WindowCloseButtonHint | Qt.WindowStaysOnTopHint)
        else:
            self.dialogUpdateRegulationOfGroup.setWindowFlags(
                Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint
                | Qt.WindowCloseButtonHint)
        self.dialogUpdateRegulationOfGroup.show()

    def handleUpdateRegulation(self):
        self.shouldHide = False
        self.updateRegulation()

    def handleUpdateRegulationAndClose(self):
        self.shouldHide = True
        self.updateRegulation()

    def updateRegulation(self):
        # Päivitä kaavamääräys ja siihen liitetyt kaavakohteet ja huomio asetukset, sekä mahd. useat määräykset kohteella kayttotarkoitus_lyhenne-päivityksessä.
        # Tarkista, onko kaavamääräyksen lomaketiedoissa eroa ja jos ei, niin ilmoita käyttäjälle.
        # Lisää kaavamääräys sellaisille kaavakohteille, joilla sitä ei vielä ole, mutta käyttäjä on ko. kaavakohteen valinnut / valitsee
        # Anna käyttäjän valita kaavakohteet, joille kaavamääräys päivitetään.
        # Varmista, että käyttäjä ei voi vahingossa päivittää jo aiemmin valitsemiaan kaavaobjekteja.
        # Varmista jotenkin, että käyttäjän valitsemat kohteet päivitetään vaikka niillä olisi eri kaavamääräys kuin muutettava kaavamääräys / rajoita valintamahdollisuus kohteisiin, joilla muutettavan kaavamääräyksen relaatio
        # Ilmoita käyttäjälle, että valitse kohteet, tms., jos ei ole valinnut.
        # Varmista, että self.currentRegulation != None jo vaikka käyttäjä ei ole valinnut dialogista kohteita / lisää ensimmäiseksi vaihtoehdoksi comboboxiin "Valitse kaavamääräys"
        # Huomioi, "Poista kaavakohteilta vanhat kaavamääräykset"-asetuksen pois päältä olo, kun käyttäjä vain päivittää kohteilla jo olevaa kaavamääräystä -> ei siis tehdä duplikaattirelaatiota
        # Kun "Päivitä käyttötarkoitus vaikka kohteella olisi useita kaavamääräyksiä"-asetus on pois päältä, niin lisää kuitenkin kaavamääräys
        if self.currentRegulation != None:
            regulationID = self.currentRegulation["id"]
            regulationTitle = self.dialogUpdateRegulationOfGroup.plainTextEditRegulationTitle.toPlainText(
            )
            regulationText = self.dialogUpdateRegulationOfGroup.plainTextEditRegulationText.toPlainText(
            )
            regulationDescription = self.dialogUpdateRegulationOfGroup.plainTextEditRegulationDescription.toPlainText(
            )

            if not self.equalsRegulationAndFormTexts(
                    regulationTitle, regulationText, regulationDescription):

                # self.yleiskaavaDatabase.reconnectToDB()

                success = self.yleiskaavaDatabase.updateRegulation(
                    regulationID, regulationTitle, regulationText,
                    regulationDescription)

                if success:
                    self.currentRegulation["alpha_sort_key"] = regulationTitle
                    self.currentRegulation["kaavamaarays_otsikko"] = QVariant(
                        regulationTitle)
                    self.currentRegulation["maaraysteksti"] = QVariant(
                        regulationText)
                    self.currentRegulation["kuvaus_teksti"] = QVariant(
                        regulationDescription)

                    self.iface.messageBar().pushMessage(
                        'Kaavamääräys päivitetty', Qgis.Info, duration=30)
            elif not self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForPolygonFeatures.isChecked(
            ) and not self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForSupplementaryPolygonFeatures.isChecked(
            ) and not self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForLineFeatures.isChecked(
            ) and not self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForPointFeatures.isChecked(
            ):
                self.iface.messageBar().pushMessage(
                    'Kaavamääräykseen ei ole tehty muutoksia eikä päivitettäviä kaavakohteita ole valittu. Ei tehdä päivityksiä',
                    Qgis.Info,
                    duration=30)

            if self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForPolygonFeatures.isChecked(
            ):
                if not self.hasUserSelectedPolygonFeaturesForUpdate:
                    self.iface.messageBar().pushMessage(
                        'Et ole valinnut päivitettäviä aluevarauksia; aluevarauksia ei päivitetty',
                        Qgis.Warning,
                        duration=0)
                else:
                    self.progressDialog = QProgressDialog(
                        "Päivitetään aluevarausten kaavamääräyksiä...",
                        "Keskeytä", 0, 100)
                    self.progressDialog.setWindowFlags(
                        Qt.WindowMinimizeButtonHint
                        | Qt.WindowMaximizeButtonHint
                        | Qt.WindowStaysOnTopHint)
                    self.updateRegulationsAndLandUseClassificationsForSpatialFeatures(
                        "alue")
            if self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForSupplementaryPolygonFeatures.isChecked(
            ):
                if not self.hasUserSelectedSuplementaryPolygonFeaturesForUpdate:
                    self.iface.messageBar().pushMessage(
                        'Et ole valinnut päivitettäviä täydentäviä aluekohteita; täydentäviä aluekohteita ei päivitetty',
                        Qgis.Warning,
                        duration=0)
                else:
                    self.progressDialog = QProgressDialog(
                        "Päivitetään täydentävien aluekohteiden kaavamääräyksiä...",
                        "Keskeytä", 0, 100)
                    self.progressDialog.setWindowFlags(
                        Qt.WindowMinimizeButtonHint
                        | Qt.WindowMaximizeButtonHint
                        | Qt.WindowStaysOnTopHint)
                    self.updateRegulationsAndLandUseClassificationsForSpatialFeatures(
                        "alue_taydentava")
            if self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForLineFeatures.isChecked(
            ):
                if not self.hasUserSelectedLineFeaturesForUpdate:
                    self.iface.messageBar().pushMessage(
                        'Et ole valinnut päivitettäviä viivamaisia kohteita; viivamaisia ei päivitetty',
                        Qgis.Warning,
                        duration=0)
                else:
                    self.progressDialog = QProgressDialog(
                        "Päivitetään viivamaisten kohteiden kaavamääräyksiä...",
                        "Keskeytä", 0, 100)
                    self.progressDialog.setWindowFlags(
                        Qt.WindowMinimizeButtonHint
                        | Qt.WindowMaximizeButtonHint
                        | Qt.WindowStaysOnTopHint)
                    self.updateRegulationsAndLandUseClassificationsForSpatialFeatures(
                        "viiva")
            if self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForPointFeatures.isChecked(
            ):
                if not self.hasUserSelectedPointFeaturesForUpdate:
                    self.iface.messageBar().pushMessage(
                        'Et ole valinnut päivitettäviä pistemäisiä kohteita; pistemäisiä kohteita ei päivitetty',
                        Qgis.Warning,
                        duration=0)
                else:
                    self.progressDialog = QProgressDialog(
                        "Päivitetään pistemäisten kohteiden kaavamääräyksiä...",
                        "Keskeytä", 0, 100)
                    self.progressDialog.setWindowFlags(
                        Qt.WindowMinimizeButtonHint
                        | Qt.WindowMaximizeButtonHint
                        | Qt.WindowStaysOnTopHint)
                    self.updateRegulationsAndLandUseClassificationsForSpatialFeatures(
                        "piste")
            # else:
            #     self.iface.messageBar().pushMessage("Kaavakohteita ei päivitetty", Qgis.Critical)
            if self.shouldHide:
                self.dialogUpdateRegulationOfGroup.hide()

        elif self.dialogUpdateRegulationOfGroup.checkBoxRemoveOldRegulationsFromSpatialFeatures.isChecked(
        ):
            shouldUpdateOnlyRelation = False

            if not self.dialogUpdateRegulationOfGroup.checkBoxUpdateRegulationTextsEvenIfSpatialFeatureHasMultipleRegulations.isChecked(
            ):
                shouldUpdateOnlyRelation = True

            # ainoastaan poistetaan vanha(t) kaavamääys/kaavamääräykset valituilta kohteilta
            if self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForPolygonFeatures.isChecked(
            ):
                if not self.hasUserSelectedPolygonFeaturesForUpdate:
                    self.iface.messageBar().pushMessage(
                        'Et ole valinnut päivitettäviä aluevarauksia; aluevarauksia ei päivitetty',
                        Qgis.Warning,
                        duration=0)
                else:
                    success = self.removeRegulationsAndLandUseClassificationsFromSpatialFeatures(
                        "alue", shouldUpdateOnlyRelation)
                    if success:
                        if shouldUpdateOnlyRelation:
                            self.iface.messageBar().pushMessage(
                                'Aluvarausten kaavamääräykset poistettu',
                                Qgis.Info,
                                duration=30)
                        else:
                            self.iface.messageBar().pushMessage(
                                'Aluvarausten kaavamääräykset ja käyttötarkoitus poistettu',
                                Qgis.Info,
                                duration=30)
            if self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForSupplementaryPolygonFeatures.isChecked(
            ):
                if not self.hasUserSelectedSuplementaryPolygonFeaturesForUpdate:
                    self.iface.messageBar().pushMessage(
                        'Et ole valinnut päivitettäviä täydentäviä aluekohteita; täydentäviä aluekohteita ei päivitetty',
                        Qgis.Warning,
                        duration=0)
                else:
                    success = self.removeRegulationsAndLandUseClassificationsFromSpatialFeatures(
                        "alue_taydentava", shouldUpdateOnlyRelation)
                    if success:
                        if shouldUpdateOnlyRelation:
                            self.iface.messageBar().pushMessage(
                                'Täydentävien aluekohteiden kaavamääräykset poistettu',
                                Qgis.Info,
                                duration=30)
                        else:
                            self.iface.messageBar().pushMessage(
                                'Täydentävien aluekohteiden kaavamääräykset ja käyttötarkoitus poistettu',
                                Qgis.Info,
                                duration=30)
            if self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForLineFeatures.isChecked(
            ):
                if not self.hasUserSelectedLineFeaturesForUpdate:
                    self.iface.messageBar().pushMessage(
                        'Et ole valinnut päivitettäviä viivamaisia kohteita; viivamaisia ei päivitetty',
                        Qgis.Warning,
                        duration=0)
                else:
                    success = self.removeRegulationsAndLandUseClassificationsFromSpatialFeatures(
                        "viiva", shouldUpdateOnlyRelation)
                    if success:
                        if shouldUpdateOnlyRelation:
                            self.iface.messageBar().pushMessage(
                                'Viivamaisten kohteiden kaavamääräykset poistettu',
                                Qgis.Info,
                                duration=30)
                        else:
                            self.iface.messageBar().pushMessage(
                                'Viivamaisten kohteiden kaavamääräykset ja käyttötarkoitus poistettu',
                                Qgis.Info,
                                duration=30)
            if self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForPointFeatures.isChecked(
            ):
                if not self.hasUserSelectedPointFeaturesForUpdate:
                    self.iface.messageBar().pushMessage(
                        'Et ole valinnut päivitettäviä pistemäisiä kohteita; pistemäisiä kohteita ei päivitetty',
                        Qgis.Warning,
                        duration=0)
                else:
                    success = self.removeRegulationsAndLandUseClassificationsFromSpatialFeatures(
                        "piste", shouldUpdateOnlyRelation)
                    if success:
                        if shouldUpdateOnlyRelation:
                            self.iface.messageBar().pushMessage(
                                'Pistemäisten kohteiden kaavamääräykset poistettu',
                                Qgis.Info,
                                duration=30)
                        else:
                            self.iface.messageBar().pushMessage(
                                'Pistemäisten kohteiden kaavamääräykset ja käyttötarkoitus poistettu',
                                Qgis.Info,
                                duration=30)

            if self.shouldHide:
                self.dialogUpdateRegulationOfGroup.hide()
            self.finishUpdate()
        else:
            self.iface.messageBar().pushMessage('Valitse kaavamääräys',
                                                Qgis.Info,
                                                duration=30)

    def equalsRegulationAndFormTexts(self, formRegulationTitle,
                                     formRegulationText,
                                     formRegulationDescription):
        regulationTitle = self.currentRegulation["kaavamaarays_otsikko"].value(
        )
        regulationText = ""
        regulationDescription = ""
        if not self.currentRegulation["maaraysteksti"].isNull():
            regulationText = self.currentRegulation["maaraysteksti"].value()
        if not self.currentRegulation["kuvaus_teksti"].isNull():
            regulationDescription = self.currentRegulation[
                "kuvaus_teksti"].value()

        if formRegulationTitle == regulationTitle and formRegulationText == regulationText and formRegulationDescription == regulationDescription:
            return True

        return False

    def finishUpdate(self):
        self.yleiskaavaUtils.refreshTargetLayersInProject()

    def reset(self):
        self.setupRegulationsInDialog()

        self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForPolygonFeatures.setChecked(
            False)
        self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForSupplementaryPolygonFeatures.setChecked(
            False)
        self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForLineFeatures.setChecked(
            False)
        self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForPointFeatures.setChecked(
            False)

        self.hasUserSelectedPolygonFeaturesForUpdate = False
        self.hasUserSelectedSuplementaryPolygonFeaturesForUpdate = False
        self.hasUserSelectedLineFeaturesForUpdate = False
        self.hasUserSelectedPointFeaturesForUpdate = False

    def updateRegulationsAndLandUseClassificationsForSpatialFeatures(
            self, featureType):
        if self.currentRegulation != None:

            # self.yleiskaavaDatabase.reconnectToDB()

            regulationID = self.currentRegulation["id"]
            regulationTitle = self.currentRegulation[
                "kaavamaarays_otsikko"].value(
                ) if not self.currentRegulation["kaavamaarays_otsikko"].isNull(
                ) else None
            shouldRemoveOldRegulationRelations = self.dialogUpdateRegulationOfGroup.checkBoxRemoveOldRegulationsFromSpatialFeatures.isChecked(
            )
            shouldUpdateOnlyRelation = False
            shouldUpdateRegulationTextsEvenIfSpatialFeatureHasMultipleRegulations = self.dialogUpdateRegulationOfGroup.checkBoxUpdateRegulationTextsEvenIfSpatialFeatureHasMultipleRegulations.isChecked(
            )

            self.updateRegulationOfGroupTask = UpdateRegulationOfGroupTask(
                self.yleiskaavaDatabase, featureType, regulationID,
                regulationTitle, shouldRemoveOldRegulationRelations,
                shouldUpdateRegulationTextsEvenIfSpatialFeatureHasMultipleRegulations
            )

            targetLayer = self.yleiskaavaDatabase.getTargetLayer(featureType)
            regulationLayer = self.yleiskaavaDatabase.getProjectLayer(
                "yk_yleiskaava.kaavamaarays")
            regulationRelationLayer = self.yleiskaavaDatabase.getProjectLayer(
                "yk_yleiskaava.kaavaobjekti_kaavamaarays_yhteys")
            self.updateRegulationOfGroupTask.setDependentLayers(
                [targetLayer, regulationLayer, regulationRelationLayer])

            self.progressDialog.canceled.connect(
                self.handleUpdateRegulationOfGroupTaskStopRequestedByUser)
            self.updateRegulationOfGroupTask.progressChanged.connect(
                self.handleUpdateRegulationOfGroupTaskProgressChanged)
            self.updateRegulationOfGroupTask.taskCompleted.connect(
                self.handleUpdateRegulationOfGroupTaskCompleted)
            self.updateRegulationOfGroupTask.taskTerminated.connect(
                self.handleUpdateRegulationOfGroupTaskTerminated)

            self.progressDialog.setValue(0)
            self.progressDialog.show()
            QgsApplication.taskManager().addTask(
                self.updateRegulationOfGroupTask)

    def handleUpdateRegulationOfGroupTaskStopRequestedByUser(self):
        self.hasUserCanceledCopy = True
        self.updateRegulationOfGroupTask.cancel()

    def handleUpdateRegulationOfGroupTaskProgressChanged(self, progress):
        self.progressDialog.setValue(int(progress))

    def handleUpdateRegulationOfGroupTaskCompleted(self):
        self.progressDialog.hide()
        self.finishUpdate()
        if not self.hasUserCanceledCopy:
            self.iface.messageBar().pushMessage(
                'Valittujen kaavakohteiden kaavamääräykset päivitetty',
                Qgis.Info,
                duration=30)
        else:
            self.iface.messageBar().pushMessage(
                'Valittujen kaavakohteiden kaavamääräyksiä ei päivitetty kokonaisuudessaan tietokantaan',
                Qgis.Info,
                duration=30)
        self.hasUserCanceledCopy = False
        #if success:
        #    self.iface.messageBar().pushMessage('Aluvarausten käyttötarkoitukset päivitetty', Qgis.Info, 30)
        #                         self.iface.messageBar().pushMessage('Täydentävien aluekohteiden käyttötarkoitukset päivitetty', Qgis.Info, 30)
        #                        self.iface.messageBar().pushMessage('Viivamaisten kohteiden käyttötarkoitukset päivitetty', Qgis.Info, 30)
        #                        self.iface.messageBar().pushMessage('Pistemäisten kohteiden käyttötarkoitukset päivitetty', Qgis.Info, 30)

    def handleUpdateRegulationOfGroupTaskTerminated(self):
        if not self.hasUserCanceledCopy:
            self.iface.messageBar().pushMessage(
                "Kaavamääräyksen sekä kaavamaaraysteksti- ja kayttotarkoitus_lyhenne-kenttien tekstien päivityksessä tapahtui virhe",
                Qgis.Critical,
                duration=0)
        else:
            self.hasUserCanceledCopy = False
        self.progressDialog.hide()
        self.finishUpdate()

    def removeRegulationsAndLandUseClassificationsFromSpatialFeatures(
            self, featureType, shouldUpdateOnlyRelation):

        # self.yleiskaavaDatabase.reconnectToDB()

        spatialFeatures = self.yleiskaavaDatabase.getSelectedFeatures(
            featureType, ["id"])
        # spatialFeatures = self.yleiskaavaDatabase.getSpatialFeaturesWithRegulationForType(regulationID, featureType)

        for feature in spatialFeatures:
            success = self.yleiskaavaDatabase.removeSpatialFeatureRegulationAndLandUseClassification(
                feature["id"], featureType, shouldUpdateOnlyRelation)

            if not success:
                self.iface.messageBar().pushMessage(
                    "Kaavakohteelta, jonka tyyppi on " +
                    self.yleiskaavaDatabase.
                    getUserFriendlySpatialFeatureTypeName(featureType) +
                    " ja id on " + str(feature["id"]) +
                    " ei voitu poistaa kaavamääräystä eikä kaavamaaraysteksti- ja kayttotarkoitus_lyhenne-kenttien tekstejä",
                    Qgis.Critical,
                    duration=0)

                return False

        return True

    def setupRegulationsInDialog(self):
        shouldShowOnlyUsedRegulations = False
        includeAreaRegulations = False
        includeSuplementaryAreaRegulations = False
        includeLineRegulations = False
        includePointRegulations = False
        if self.dialogUpdateRegulationOfGroup.checkBoxShowOnlyUsedRegulations.isChecked(
        ):
            shouldShowOnlyUsedRegulations = True
        if self.dialogUpdateRegulationOfGroup.checkBoxShowAreaRegulations.isChecked(
        ):
            includeAreaRegulations = True
        if self.dialogUpdateRegulationOfGroup.checkBoxShowSuplementaryAreaRegulations.isChecked(
        ):
            includeSuplementaryAreaRegulations = True
        if self.dialogUpdateRegulationOfGroup.checkBoxShowLineRegulations.isChecked(
        ):
            includeLineRegulations = True
        if self.dialogUpdateRegulationOfGroup.checkBoxShowPointRegulations.isChecked(
        ):
            includePointRegulations = True

        # self.yleiskaavaDatabase.reconnectToDB()

        self.regulations = sorted(
            self.yleiskaavaDatabase.getSpecificRegulations(
                shouldShowOnlyUsedRegulations, includeAreaRegulations,
                includeSuplementaryAreaRegulations, includeLineRegulations,
                includePointRegulations),
            key=itemgetter('alpha_sort_key'))
        self.regulationTitles = []
        for index, regulation in enumerate(self.regulations):
            #QgsMessageLog.logMessage("setupRegulationsInDialog - index: " + str(index) + ", regulation['kaavamaarays_otsikko']: " + str(regulation['kaavamaarays_otsikko'].value()) + ", regulation['maaraysteksti']: " + str(regulation['maaraysteksti'].value()) + ", regulation['kuvaus_teksti']: " + str(regulation['kuvaus_teksti'].value()), 'Yleiskaava-työkalu', Qgis.Info)
            # QgsMessageLog.logMessage("setupRegulationsInDialog - index: " + str(index) + ", regulation['kaavamaarays_otsikko']: " + str(regulation['kaavamaarays_otsikko'].value()), 'Yleiskaava-työkalu', Qgis.Info)
            self.regulationTitles.append(
                regulation["kaavamaarays_otsikko"].value())
        self.dialogUpdateRegulationOfGroup.comboBoxRegulationTitles.clear()
        self.dialogUpdateRegulationOfGroup.comboBoxRegulationTitles.addItems(
            self.regulationTitles)

        self.dialogUpdateRegulationOfGroup.comboBoxRegulationTitles.insertItem(
            0, "Valitse kaavamääräys")
        self.dialogUpdateRegulationOfGroup.comboBoxRegulationTitles.setCurrentIndex(
            0)
        self.currentRegulation = None

    def handleComboBoxRegulationTitleChanged(self, currentIndex):
        # QgsMessageLog.logMessage("handleComboBoxRegulationTitleChanged - currentIndex: " + str(currentIndex) + ", len(self.regulations): " + str(len(self.regulations)), 'Yleiskaava-työkalu', Qgis.Info)
        if currentIndex > 0 and self.regulations is not None and len(
                self.regulations) >= (currentIndex - 1):
            self.currentRegulation = self.regulations[currentIndex - 1]

            self.dialogUpdateRegulationOfGroup.plainTextEditRegulationTitle.setPlainText(
                self.currentRegulation["kaavamaarays_otsikko"].value())
            if not self.currentRegulation["maaraysteksti"].isNull():
                self.dialogUpdateRegulationOfGroup.plainTextEditRegulationText.setPlainText(
                    self.currentRegulation["maaraysteksti"].value())
            else:
                self.dialogUpdateRegulationOfGroup.plainTextEditRegulationText.setPlainText(
                    "")
            if not self.currentRegulation["kuvaus_teksti"].isNull():
                self.dialogUpdateRegulationOfGroup.plainTextEditRegulationDescription.setPlainText(
                    self.currentRegulation["kuvaus_teksti"].value())
            else:
                self.dialogUpdateRegulationOfGroup.plainTextEditRegulationDescription.setPlainText(
                    "")
        else:
            self.currentRegulation = None
            self.dialogUpdateRegulationOfGroup.plainTextEditRegulationTitle.setPlainText(
                "")
            self.dialogUpdateRegulationOfGroup.plainTextEditRegulationText.setPlainText(
                "")
            self.dialogUpdateRegulationOfGroup.plainTextEditRegulationDescription.setPlainText(
                "")

    def checkBoxShowOnlyUsedRegulationsStateChanged(self):
        self.setupRegulationsInDialog()

    def checkBoxShowAreaRegulationsStateChanged(self):
        self.setupRegulationsInDialog()

    def checkBoxShowSuplementaryAreaRegulationsStateChanged(self):
        self.setupRegulationsInDialog()

    def checkBoxShowLineRegulationsStateChanged(self):
        self.setupRegulationsInDialog()

    def checkBoxShowPointRegulationsStateChanged(self):
        self.setupRegulationsInDialog()