ExecuteSQLWidget.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. """
  2. ***************************************************************************
  3. ExecuteSQLWidget.py
  4. ---------------------
  5. Date : November 2017
  6. Copyright : (C) 2017 by Paul Blottiere
  7. Email : blottiere dot paul at gmail dot com
  8. ***************************************************************************
  9. * *
  10. * This program is free software; you can redistribute it and/or modify *
  11. * it under the terms of the GNU General Public License as published by *
  12. * the Free Software Foundation; either version 2 of the License, or *
  13. * (at your option) any later version. *
  14. * *
  15. ***************************************************************************
  16. """
  17. __author__ = 'Paul Blottiere'
  18. __date__ = 'November 2018'
  19. __copyright__ = '(C) 2018, Paul Blottiere'
  20. import os
  21. from qgis.PyQt import uic
  22. from qgis.core import (
  23. Qgis,
  24. QgsExpressionContextScope,
  25. QgsProcessingParameterString,
  26. QgsProcessingParameterNumber,
  27. QgsExpression,
  28. QgsProcessingModelChildParameterSource
  29. )
  30. from qgis.gui import QgsFieldExpressionWidget
  31. from processing.gui.wrappers import (WidgetWrapper,
  32. dialogTypes,
  33. DIALOG_MODELER)
  34. pluginPath = os.path.dirname(__file__)
  35. WIDGET, BASE = uic.loadUiType(os.path.join(pluginPath, 'ExecuteSQLWidgetBase.ui'))
  36. class ExecuteSQLWidget(BASE, WIDGET):
  37. def __init__(self, dialog):
  38. super().__init__(None)
  39. self.setupUi(self)
  40. self.dialog = dialog
  41. self.dialogType = dialogTypes[dialog.__class__.__name__]
  42. self.mExpressionWidget = QgsFieldExpressionWidget()
  43. # add model parameters in context scope if called from modeler
  44. if self.dialogType == DIALOG_MODELER:
  45. strings = dialog.getAvailableValuesOfType(
  46. [QgsProcessingParameterString, QgsProcessingParameterNumber], [])
  47. model_params = [dialog.resolveValueDescription(s) for s in strings]
  48. scope = QgsExpressionContextScope()
  49. for param in model_params:
  50. var = QgsExpressionContextScope.StaticVariable(param)
  51. scope.addVariable(var)
  52. self.mExpressionWidget.appendScope(scope)
  53. self.mHLayout.insertWidget(0, self.mExpressionWidget)
  54. self.mInsert.clicked.connect(self.insert)
  55. def insert(self):
  56. if self.mExpressionWidget.currentText():
  57. exp = f'[%{self.mExpressionWidget.currentText()}%]'
  58. self.mText.insertPlainText(exp)
  59. def setValue(self, value):
  60. text = value
  61. if self.dialogType == DIALOG_MODELER:
  62. if isinstance(value, list):
  63. for v in value:
  64. if isinstance(v, QgsProcessingModelChildParameterSource) \
  65. and v.source() == Qgis.ProcessingModelChildParameterSource.ExpressionText:
  66. text = v.expressionText()
  67. # replace parameter's name by expression (diverging after model save)
  68. names = QgsExpression.referencedVariables(text)
  69. strings = self.dialog.getAvailableValuesOfType(
  70. [QgsProcessingParameterString, QgsProcessingParameterNumber], [])
  71. model_params = [(self.dialog.resolveValueDescription(s), s) for s in strings]
  72. for k, v in model_params:
  73. if v.parameterName() in names:
  74. text = text.replace(f'[% @{v.parameterName()} %]', f'[% @{k} %]')
  75. self.mText.setPlainText(text)
  76. def value(self):
  77. value = self.mText.toPlainText()
  78. if self.dialogType == DIALOG_MODELER:
  79. expression_values = self._expressionValues(value)
  80. if len(expression_values) > 1:
  81. value = expression_values
  82. return value
  83. def _expressionValues(self, text):
  84. strings = self.dialog.getAvailableValuesOfType(
  85. [QgsProcessingParameterString, QgsProcessingParameterNumber], [])
  86. model_params = [(self.dialog.resolveValueDescription(s), s) for s in strings]
  87. variables = QgsExpression.referencedVariables(text)
  88. # replace description by parameter's name (diverging after model save)
  89. descriptions = QgsExpression.referencedVariables(text)
  90. for k, v in model_params:
  91. if k in descriptions:
  92. text = text.replace(f'[% @{k} %]', f'[% @{v.parameterName()} %]')
  93. src = QgsProcessingModelChildParameterSource.fromExpressionText(text)
  94. # add parameters currently used by the expression
  95. expression_values = [src]
  96. for k, v in model_params:
  97. if k in variables:
  98. expression_values.append(v)
  99. return expression_values
  100. class ExecuteSQLWidgetWrapper(WidgetWrapper):
  101. def createWidget(self):
  102. return ExecuteSQLWidget(self.dialog)
  103. def setValue(self, value):
  104. self.widget.setValue(value)
  105. def value(self):
  106. return self.widget.value()