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('.', '_')
try:
self.module = importlib.import_module(
'grassprovider.ext.{}'.format(name))
except ImportError:
self.module = None self.module = None
try:
extpath = Path(self.descriptionFile).parents[1].joinpath('ext', name + '.py')
# this check makes it a bit faster
if extpath.exists():
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,7 +86,8 @@ class Grass7AlgorithmProvider(QgsProcessingProvider):
def createAlgsList(self): def createAlgsList(self):
algs = [] algs = []
folder = self.descriptionFolder folders = self.descriptionFolders
for folder in folders:
for descriptionFile in os.listdir(folder): for descriptionFile in os.listdir(folder):
if descriptionFile.endswith('txt'): if descriptionFile.endswith('txt'):
try: try:

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():