Exemple #1
0
    def results_from_query(self, infoblockdef, layer, feature, mapkey, lastresults=None):
        def get_key():
            try:
                keycolumn = infoblockdef['mapping']['mapkey']
                if keycolumn == 'from_info1':
                    if 'mapkey' in lastresults:
                        return lastresults['mapkey']
                    else:
                        return []
                else:
                    return feature[keycolumn]
            except KeyError:
                return mapkey

        def get_layer():
            connection = infoblockdef.get('connection', "from_layer")
            if isinstance(connection, dict):
                return layer_by_name(connection['layer'])
            elif connection == "from_layer":
                return layer
            else:
                raise NotImplementedError("{} is not a supported connection type".format(connection))

        if not lastresults:
            lastresults = {}

        sql = infoblockdef['query']
        layer = get_layer()

        db = database.Database.fromLayer(layer)
        mapkey = get_key()
        attributes = values_from_feature(feature)
        results = db.query(sql, mapkey=mapkey, **attributes)
        results = list(results)
        return results
    def results_from_query(self, infoblockdef, layer, feature, mapkey, lastresults=None):
        def get_key():
            try:
                keycolumn = infoblockdef['mapping']['mapkey']
                if keycolumn == 'from_info1':
                    if 'mapkey' in lastresults:
                        return lastresults['mapkey']
                    else:
                        return []
                else:
                    return feature[keycolumn]
            except KeyError:
                return mapkey

        def get_layer():
            connection = infoblockdef.get('connection', "from_layer")
            if isinstance(connection, dict):
                return layer_by_name(connection['layer'])
            elif connection == "from_layer":
                return layer
            else:
                raise NotImplementedError("{} is not a supported connection type".format(connection))

        if not lastresults:
            lastresults = {}

        sql = infoblockdef['query']
        layer = get_layer()

        db = database.Database.fromLayer(layer)
        mapkey = get_key()
        attributes = values_from_feature(feature)
        results = db.query(sql, mapkey=mapkey, **attributes)
        results = list(results)
        return results
Exemple #3
0
    def test_query(self):
        if not self.layer:
            return

        layer = self.layer
        db = Database.fromLayer(layer)
        try:
            if not self.mapKeyEdit.text():
                feature = next(layer.getFeatures())
                self.mapKeyEdit.setText(str(feature.id()))
            else:
                try:
                    mapkey = int(self.mapKeyEdit.text())
                    rq = QgsFeatureRequest().setFilterFid(mapkey)
                    feature = next(layer.getFeatures(rq))
                except ValueError:
                    self.attributesLabel.setText("")
                    self.previewGrid.setModel(None)
                    self.resultsLabel.setText(
                        "Error in mapkey. Map key is invalid. Should be a valid number"
                    )
                    return
        except StopIteration:
            self.attributesLabel.setText("")
            self.previewGrid.setModel(None)
            self.resultsLabel.setText(
                "No features found. No results or map key not found in layer")
            return

        self.resultsLabel.setText("")

        dbkey = self.dbKeyEdit.text()

        attributes = utils.values_from_feature(feature,
                                               safe_names=True,
                                               ordered=True)
        attributes['mapkey'] = feature.id()
        attributes['dbkey'] = dbkey
        # Run the SQL text though the QGIS expression engine first.
        sql = self.Editor.text()
        sql = roam.api.utils.replace_expression_placeholders(sql, feature)
        results = db.querymodel(sql, **attributes)
        self.previewGrid.setModel(results)
        labelText = ""
        for key, value in attributes.items():
            labelText += "<br> {}: {}".format(key, value)
        print(labelText)
        self.attributesLabel.setText("Feature Attributes Used:<br>" +
                                     labelText)
Exemple #4
0
    def results_from_query(self, infoblockdef, layer, feature, mapkey, lastresults=None) -> list:
        """
        Return the resutls from running a database query to get the feature results.
        :param infoblockdef: The info block project config section.
        :param layer: The QgsVectorLayer to get the connection from.
        :param feature: The feature to pull the map key from.
        :param mapkey: The mapkey to use if not set in the info block config or found in the last results.
        :param lastresults: Results of another info results block. Normally info 1
        :return: List of query results from running the query on the layer.
        """
        def get_key() -> str:
            try:
                keycolumn = infoblockdef['mapping']['mapkey']
                if keycolumn == 'from_info1':
                    if 'mapkey' in lastresults:
                        return lastresults['mapkey']
                    else:
                        # TODO Umm wat? Why is this returning a list?
                        return []
                else:
                    return feature[keycolumn]
            except KeyError:
                return mapkey

        def get_layer() -> str:
            connection = infoblockdef.get('connection', "from_layer")
            if isinstance(connection, dict):
                return layer_by_name(connection['layer'])
            elif connection == "from_layer":
                return layer
            else:
                raise NotImplementedError("{} is not a supported connection type".format(connection))

        if not lastresults:
            lastresults = {}

        sql = infoblockdef['query']
        layer = get_layer()

        db = database.Database.fromLayer(layer)
        mapkey = get_key()
        attributes = values_from_feature(feature, safe_names=True)
        attributes['mapkey'] = mapkey
        # Run the SQL text though the QGIS expression engine first.
        sql = roam.api.utils.replace_expression_placeholders(sql, feature)
        results = db.query(sql, **attributes)
        results = list(results)
        return results
Exemple #5
0
 def results_from_feature(self, feature):
     return values_from_feature(feature)