treesmap.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. from importlib import import_module
  2. from misago.conf import settings
  3. class TreesMap(object):
  4. """Object that maps trees to strategies"""
  5. def __init__(self, types_modules):
  6. self.is_loaded = False
  7. self.types_modules = types_modules
  8. def load(self):
  9. self.types = self.load_types(self.types_modules)
  10. self.trees = self.load_trees(self.types)
  11. self.roots = self.get_roots(self.trees)
  12. self.is_loaded = True
  13. def load_types(self, types_modules):
  14. loaded_types = {}
  15. for path in types_modules:
  16. module = import_module('.'.join(path.split('.')[:-1]))
  17. type_cls = getattr(module, path.split('.')[-1])
  18. loaded_types[type_cls.root_name] = type_cls()
  19. return loaded_types
  20. def load_trees(self, types):
  21. from misago.categories.models import Category
  22. trees = {}
  23. for category in Category.objects.filter(level=0, special_role__in=types.keys()):
  24. trees[category.tree_id] = types[category.special_role]
  25. return trees
  26. def get_roots(self, trees):
  27. roots = {}
  28. for tree_id in trees:
  29. roots[trees[tree_id].root_name] = tree_id
  30. return roots
  31. def get_type_for_tree_id(self, tree_id):
  32. if not self.is_loaded:
  33. self.load()
  34. try:
  35. return self.trees[tree_id]
  36. except KeyError:
  37. raise KeyError("'%s' tree id has no type defined" % tree_id)
  38. def get_tree_id_for_root(self, root_name):
  39. if not self.is_loaded:
  40. self.load()
  41. try:
  42. return self.roots[root_name]
  43. except KeyError:
  44. raise KeyError('"%s" root has no tree defined' % root_name)
  45. trees_map = TreesMap(settings.MISAGO_THREAD_TYPES)