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 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)
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
def results_from_feature(self, feature): return values_from_feature(feature)