support grass algorithms in profile folder

This commit is contained in:
AlisterH 2023-05-27 03:08:40 +12:00 committed by Nyall Dawson
parent 9eb449edcc
commit f08e5e9469
3 changed files with 28 additions and 20 deletions

View File

@ -25,6 +25,7 @@ import re
import uuid import uuid
import math import math
import importlib import importlib
from pathlib import Path
from qgis.PyQt.QtCore import QCoreApplication, QUrl from qgis.PyQt.QtCore import QCoreApplication, QUrl
@ -139,11 +140,16 @@ class Grass7Algorithm(QgsProcessingAlgorithm):
# Use the ext mechanism # Use the ext mechanism
name = self.name().replace('.', '_') name = self.name().replace('.', '_')
self.module = None
try: try:
self.module = importlib.import_module( extpath = Path(self.descriptionFile).parents[1].joinpath('ext', name + '.py')
'grassprovider.ext.{}'.format(name)) # this check makes it a bit faster
except ImportError: if extpath.exists():
self.module = None spec = importlib.util.spec_from_file_location('grassprovider.ext.' + name, extpath)
self.module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(self.module)
except:
pass
def createInstance(self): def createInstance(self):
return self.__class__(self.descriptionFile) return self.__class__(self.descriptionFile)

View File

@ -31,11 +31,12 @@ from qgis.core import (Qgis,
from processing.core.ProcessingConfig import (ProcessingConfig, Setting) from processing.core.ProcessingConfig import (ProcessingConfig, Setting)
from grassprovider.Grass7Utils import Grass7Utils from grassprovider.Grass7Utils import Grass7Utils
from grassprovider.Grass7Algorithm import Grass7Algorithm from grassprovider.Grass7Algorithm import Grass7Algorithm
from processing.tools.system import isWindows, isMac from processing.tools.system import isWindows, isMac, mkdir
class Grass7AlgorithmProvider(QgsProcessingProvider): class Grass7AlgorithmProvider(QgsProcessingProvider):
descriptionFolder = Grass7Utils.grassDescriptionPath() descriptionFolders = Grass7Utils.grassDescriptionFolders()
mkdir(descriptionFolders[0])
def __init__(self): def __init__(self):
super().__init__() super().__init__()
@ -85,18 +86,19 @@ class Grass7AlgorithmProvider(QgsProcessingProvider):
def createAlgsList(self): def createAlgsList(self):
algs = [] algs = []
folder = self.descriptionFolder folders = self.descriptionFolders
for descriptionFile in os.listdir(folder): for folder in folders:
if descriptionFile.endswith('txt'): for descriptionFile in os.listdir(folder):
try: if descriptionFile.endswith('txt'):
alg = Grass7Algorithm(os.path.join(folder, descriptionFile)) try:
if alg.name().strip() != '': alg = Grass7Algorithm(os.path.join(folder, descriptionFile))
algs.append(alg) if alg.name().strip() != '':
else: algs.append(alg)
QgsMessageLog.logMessage(self.tr('Could not open GRASS GIS 7 algorithm: {0}').format(descriptionFile), self.tr('Processing'), Qgis.Critical) else:
except Exception as e: QgsMessageLog.logMessage(self.tr('Could not open GRASS GIS 7 algorithm: {0}').format(descriptionFile), self.tr('Processing'), Qgis.Critical)
QgsMessageLog.logMessage( except Exception as e:
self.tr('Could not open GRASS GIS 7 algorithm: {0}\n{1}').format(descriptionFile, str(e)), self.tr('Processing'), Qgis.Critical) QgsMessageLog.logMessage(
self.tr('Could not open GRASS GIS 7 algorithm: {0}\n{1}').format(descriptionFile, str(e)), self.tr('Processing'), Qgis.Critical)
return algs return algs
def loadAlgorithms(self): def loadAlgorithms(self):

View File

@ -254,8 +254,8 @@ class Grass7Utils:
return folder or '' return folder or ''
@staticmethod @staticmethod
def grassDescriptionPath(): def grassDescriptionFolders():
return os.path.join(os.path.dirname(__file__), 'description') return [ os.path.join(userFolder(), 'grassaddons', 'description'), os.path.join(os.path.dirname(__file__), 'description')]
@staticmethod @staticmethod
def getWindowsCodePage(): def getWindowsCodePage():