OpenDroneMap-WebODM/coreplugins/cloudimport/platform_helper.py

54 wiersze
2.0 KiB
Python

import importlib
from os import path, listdir
from app.plugins import logger
from .platform_extension import PlatformExtension
platforms = None
def get_all_platforms():
# Cache platforms search
global platforms
if platforms == None:
platforms = read_platform_from_files()
return platforms
def get_platform_by_name(platform_name):
platforms = get_all_platforms()
for platform in platforms:
if platform.name == platform_name:
return platform
return None
def get_all_extended_platforms():
return [platform for platform in get_all_platforms() if isinstance(platform, PlatformExtension)]
def read_platform_from_files():
platforms_path = get_platforms_path()
platforms = []
for platform_script in [platform for platform in listdir(platforms_path) if path.isfile(path.join(platforms_path, platform))]:
# Each python script must have a class called Platform
# Instantiate the platform
try:
module_path = "coreplugins.cloudimport.platforms.{}".format(path.splitext(platform_script)[0])
module = importlib.import_module(module_path)
platform = (getattr(module, "Platform"))()
platforms.append(platform)
except Exception as e:
logger.warning("Failed to instantiate platform {}: {}".format(platform_script, e))
assert_all_platforms_are_called_differently(platforms)
return platforms
def assert_all_platforms_are_called_differently(platforms):
platform_names = []
for platform in platforms:
if platform.name in platform_names:
# ToDo: throw an error
logger.warning('Found multiple platforms with the name {}. This will cause problems...'.format(platform.name))
else:
platform_names.append(platform.name)
def get_platforms_path():
current_path = path.dirname(path.realpath(__file__))
return path.abspath(path.join(current_path, 'platforms'))