dashboard.py 7.1 KB

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