dashboard.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. from importlib import import_module
  2. from django.core.urlresolvers import resolve, reverse
  3. from django.template.loader import render_to_string
  4. from jet import modules
  5. from jet.models import UserDashboardModule
  6. from django.core.context_processors import csrf
  7. from django.utils.translation import ugettext_lazy as _
  8. from jet.ordered_set import OrderedSet
  9. from jet.utils import get_admin_site_name
  10. class Dashboard(object):
  11. columns = 2
  12. children = None
  13. available_children = None
  14. app_label = None
  15. context = None
  16. modules = None
  17. class Media:
  18. css = ()
  19. js = ()
  20. def __init__(self, context, **kwargs):
  21. for key in kwargs:
  22. if hasattr(self.__class__, key):
  23. setattr(self, key, kwargs[key])
  24. self.children = self.children or []
  25. self.available_children = self.available_children or []
  26. self.set_context(context)
  27. def set_context(self, context):
  28. self.context = context
  29. self.update_app_label()
  30. self.init_with_context(context)
  31. self.load_modules()
  32. def init_with_context(self, context):
  33. pass
  34. def load_module(self, module_fullname):
  35. package, module_name = module_fullname.rsplit('.', 1)
  36. package = import_module(package)
  37. module = getattr(package, module_name)
  38. return module
  39. def update_app_label(self):
  40. pass
  41. def create_initial_module_models(self, user):
  42. module_models = []
  43. i = 0
  44. for module in self.children:
  45. column = module.column if module.column else i % self.columns
  46. order = module.order if module.order else int(i / self.columns)
  47. module_models.append(UserDashboardModule.objects.create(
  48. title=module.title,
  49. app_label=self.app_label,
  50. user=user.pk,
  51. module=module.fullname(),
  52. column=column,
  53. order=order,
  54. settings=module.dump_settings(),
  55. children=module.dump_children()
  56. ))
  57. i += 1
  58. return module_models
  59. def load_modules(self):
  60. module_models = UserDashboardModule.objects.filter(
  61. app_label=self.app_label,
  62. user=self.context['request'].user.pk
  63. ).all()
  64. if len(module_models) == 0:
  65. module_models = self.create_initial_module_models(self.context['request'].user)
  66. loaded_modules = []
  67. for module_model in module_models:
  68. module_cls = module_model.load_module()
  69. module = module_cls(model=module_model, context=self.context)
  70. loaded_modules.append(module)
  71. self.modules = loaded_modules
  72. def render(self):
  73. context = self.context
  74. context.update({
  75. 'columns': range(self.columns),
  76. 'modules': self.modules,
  77. 'app_label': self.app_label,
  78. })
  79. context.update(csrf(context['request']))
  80. return render_to_string('jet/dashboard/dashboard.html', context)
  81. def render_tools(self):
  82. context = self.context
  83. context.update({
  84. 'children': self.children,
  85. 'app_label': self.app_label,
  86. 'available_children': self.available_children
  87. })
  88. context.update(csrf(context['request']))
  89. return render_to_string('jet/dashboard/dashboard_tools.html', context)
  90. def media(self):
  91. unique_css = OrderedSet()
  92. unique_js = OrderedSet()
  93. for js in getattr(self.Media, 'js', ()):
  94. unique_js.add(js)
  95. for css in getattr(self.Media, 'css', ()):
  96. unique_css.add(css)
  97. for module in self.modules:
  98. for js in getattr(module.Media, 'js', ()):
  99. unique_js.add(js)
  100. for css in getattr(module.Media, 'css', ()):
  101. unique_css.add(css)
  102. class Media:
  103. css = list(unique_css)
  104. js = list(unique_js)
  105. return Media
  106. class AppIndexDashboard(Dashboard):
  107. def update_app_label(self):
  108. resolver = resolve(self.context['request'].path)
  109. self.app_label = resolver.kwargs.get('app_label')
  110. def get_app_content_types(self):
  111. return self.app_label + '.*',
  112. def models(self):
  113. return self.app_label + '.*',
  114. class DefaultIndexDashboard(Dashboard):
  115. columns = 3
  116. def init_with_context(self, context):
  117. self.available_children.append(modules.LinkList)
  118. self.available_children.append(modules.Feed)
  119. site_name = get_admin_site_name(context)
  120. # append a link list module for "quick links"
  121. self.children.append(modules.LinkList(
  122. _('Quick links'),
  123. layout='inline',
  124. draggable=False,
  125. deletable=False,
  126. collapsible=False,
  127. children=[
  128. [_('Return to site'), '/'],
  129. [_('Change password'),
  130. reverse('%s:password_change' % site_name)],
  131. [_('Log out'), reverse('%s:logout' % site_name)],
  132. ],
  133. column=0,
  134. order=0
  135. ))
  136. # append an app list module for "Applications"
  137. self.children.append(modules.AppList(
  138. _('Applications'),
  139. exclude=('auth.*',),
  140. column=1,
  141. order=0
  142. ))
  143. # append an app list module for "Administration"
  144. self.children.append(modules.AppList(
  145. _('Administration'),
  146. models=('auth.*',),
  147. column=2,
  148. order=0
  149. ))
  150. # append a recent actions module
  151. self.children.append(modules.RecentActions(
  152. _('Recent Actions'),
  153. 10,
  154. column=0,
  155. order=1
  156. ))
  157. # append a feed module
  158. self.children.append(modules.Feed(
  159. _('Latest Django News'),
  160. feed_url='http://www.djangoproject.com/rss/weblog/',
  161. limit=5,
  162. column=1,
  163. order=1
  164. ))
  165. # append another link list module for "support".
  166. self.children.append(modules.LinkList(
  167. _('Support'),
  168. children=[
  169. {
  170. 'title': _('Django documentation'),
  171. 'url': 'http://docs.djangoproject.com/',
  172. 'external': True,
  173. },
  174. {
  175. 'title': _('Django "django-users" mailing list'),
  176. 'url': 'http://groups.google.com/group/django-users',
  177. 'external': True,
  178. },
  179. {
  180. 'title': _('Django irc channel'),
  181. 'url': 'irc://irc.freenode.net/django',
  182. 'external': True,
  183. },
  184. ],
  185. column=2,
  186. order=1
  187. ))
  188. class DefaultAppIndexDashboard(AppIndexDashboard):
  189. def init_with_context(self, context):
  190. self.available_children.append(modules.LinkList)
  191. self.children.append(modules.ModelList(
  192. title=_('Application models'),
  193. models=self.models(),
  194. column=0,
  195. order=0
  196. ))
  197. self.children.append(modules.RecentActions(
  198. include_list=self.get_app_content_types(),
  199. column=1,
  200. order=0
  201. ))