import os import importlib class Model(object): LABEL = None not_found_error = type('NotFoundError', (Exception, ), {}) def __init__(self, **kwargs): self.initialized = False self._uses = {} self.attributes = kwargs def detect(self, *args, **kwargs): raise NotImplementedError def load(self, *args, **kwargs): raise NotImplementedError def unload(self, *args, **kwargs): raise NotImplementedError def filter(self, *args, **kwargs): raise NotImplementedError @classmethod def list(cls): models = {} for module in os.listdir(os.path.dirname(__file__)): if module[-3:] != '.py': continue if module[:-3] == 'model' or module[:-3] == "__init__": continue capital_only_first = "{}{}".format(module[0].upper(), module[1:-3]) class_imported = getattr(importlib.import_module("AI.tools.models.{}".format(module[:-3])), capital_only_first) try: models[class_imported.LABEL] = class_imported except AttributeError: print('WARNING, Model {} has no attribute LABEL, it is required'.format(capital_only_first)) return models @classmethod def search_by(cls, field, value): # Listing all models models = cls.list() for model in models: if getattr(models[model], field) == value: return models[model] else: print('No model found, field: {}; Value:{}'.format(field, value)) def _add_use(self, task_id): self._uses[task_id] = True def _remove_use(self, task_id): self._uses[task_id] = False def _load(self, task_id): if not self.initialized: super(Model, self).__getattribute__('load')() self.initialized = True self._add_use(task_id) def _unload(self, task_id): # Check all uses self._remove_use(task_id) uses_true = [not self._uses[i] for i in self._uses] if all(uses_true): super(Model, self).__getattribute__('unload')() self.initialized = False self._uses = {} def __getattribute__(self, item): if item in ['load', 'unload']: return super(Model, self).__getattribute__('_{}'.format(item)) return super(Model, self).__getattribute__(item) def __getitem__(self, item): return self.attributes[item]