# vim: set fileencoding=utf-8 : ############################################################################### # # # Copyright (c) 2019 Idiap Research Institute, http://www.idiap.ch/ # # Contact: beat.support@idiap.ch # # # # This file is part of the beat.editor module of the BEAT platform. # # # # Commercial License Usage # # Licensees holding valid commercial BEAT licenses may use this file in # # accordance with the terms contained in a written agreement between you # # and Idiap. For further information contact tto@idiap.ch # # # # Alternatively, this file may be used under the terms of the GNU Affero # # Public License version 3 as published by the Free Software and appearing # # in the file LICENSE.AGPL included in the packaging of this file. # # The BEAT platform is distributed in the hope that it will be useful, but # # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY # # or FITNESS FOR A PARTICULAR PURPOSE. # # # # You should have received a copy of the GNU Affero Public License along # # with the BEAT platform. If not, see http://www.gnu.org/licenses/. # # # ############################################################################### import os from PyQt5.QtCore import pyqtSignal from PyQt5.QtCore import pyqtSlot from PyQt5.QtCore import pyqtProperty from PyQt5.QtCore import Q_ENUMS from PyQt5.QtCore import QStringListModel class AssetType: """All possible assets available on the BEAT platform""" Unknown = 0 Algorithm = 1 Database = 2 Dataformat = 3 Experiment = 4 Library = 5 Plotter = 6 Toolchain = 7 @classmethod def path(cls, type_): path = "unkown" if type_ == cls.Algorithm: path = "algorithms" elif type_ == cls.Database: path = "databases" elif type_ == cls.Dataformat: path = "dataformats" elif type_ == cls.Experiment: path = "experiments" elif type_ == cls.Library: path = "libraries" elif type_ == cls.Plotter: path = "plotters" elif type_ == cls.Toolchain: path = "toolchains" return path class AssetModel(QStringListModel, AssetType): """The asset model present a list of available asset from a given type""" Q_ENUMS(AssetType) assetTypeChanged = pyqtSignal(AssetType) prefixPathChanged = pyqtSignal(str) def __init__(self, parent=None): """Constructor""" super(QStringListModel, self).__init__(parent) self.__prefix_path = AssetType.Unknown self.__asset_type = None @pyqtSlot() def reload(self): """Loads the content regarding the asset property from the prefix""" if not self.__prefix_path or self.__asset_type == AssetType.Unknown: return asset_folder = os.path.join( self.__prefix_path, AssetType.path(self.__asset_type) ) asset_users = os.scandir(asset_folder) latest_assets_list = [] for asset_user in asset_users: for asset_folder in os.scandir(asset_user): if self.asset_type == AssetType.Experiment: for root, dirs, files in os.walk(asset_folder, topdown=False): if dirs: continue anchor = "experiments/" position = root.index(anchor) + len(anchor) experiment_path = root[position:] for json_file in [ file for file in files if file.endswith("json") ]: latest_assets_list.append( "{experiment_path}/{name}".format( experiment_path=experiment_path, name=json_file.split(".")[0], ) ) else: asset_items = os.scandir(asset_folder) json_files = sorted( [ item.name for item in asset_items if item.is_file() and item.name.endswith("json") ] ) if json_files: latest_assets_list.append( "{user}/{name}/{version}".format( user=asset_user.name, name=asset_folder.name, version=json_files[-1].split(".")[0], ) ) self.setStringList(sorted(latest_assets_list)) def assetType(self): """Returns the asset type of this model :return: Asset type of this model """ return self.__asset_type def setAssetType(self, type_): """Set the asset type of this model :param AssetType type_: Asset type this model should show """ if self.__asset_type == type_: return self.__asset_type = type_ self.reload() self.assetTypeChanged.emit(type_) asset_type = pyqtProperty( AssetType, fget=assetType, fset=setAssetType, notify=assetTypeChanged ) def prefixPath(self): """Returns the prefix path use by this model :return: the prefix path used """ return self.__prefix_path def setPrefixPath(self, path): """Set the prefix path use by this model :param str path: Path to prefix """ if self.__prefix_path == path: return self.__prefix_path = path self.reload() self.prefixPathChanged.emit(path) prefix_path = pyqtProperty( str, fget=prefixPath, fset=setPrefixPath, notify=prefixPathChanged )