treesmap.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. from django.utils.module_loading import import_string
  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. type_cls = import_string(path)
  17. loaded_types[type_cls.root_name] = type_cls()
  18. return loaded_types
  19. def load_trees(self, types):
  20. from misago.categories.models import Category
  21. trees = {}
  22. for category in Category.objects.filter(level=0, special_role__in=types.keys()):
  23. trees[category.tree_id] = types[category.special_role]
  24. return trees
  25. def get_roots(self, trees):
  26. roots = {}
  27. for tree_id in trees:
  28. roots[trees[tree_id].root_name] = tree_id
  29. return roots
  30. def get_type_for_tree_id(self, tree_id):
  31. if not self.is_loaded:
  32. self.load()
  33. try:
  34. return self.trees[tree_id]
  35. except KeyError:
  36. raise KeyError("'%s' tree id has no type defined" % tree_id)
  37. def get_tree_id_for_root(self, root_name):
  38. if not self.is_loaded:
  39. self.load()
  40. try:
  41. return self.roots[root_name]
  42. except KeyError:
  43. raise KeyError('"%s" root has no tree defined' % root_name)
  44. trees_map = TreesMap(settings.MISAGO_THREAD_TYPES)