layout.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. # coding=utf-8
  2. from django.template import loader
  3. from django.utils.translation import ugettext_lazy as _
  4. from xadmin.plugins.utils import get_context_dict
  5. from xadmin.sites import site
  6. from xadmin.views import BaseAdminPlugin, ListAdminView
  7. from xadmin.util import label_for_field
  8. LAYOUT_VAR = '_layout'
  9. DEFAULT_LAYOUTS = {
  10. 'table': {
  11. 'key': 'table',
  12. 'icon': 'fa fa-table',
  13. 'name': _(u'Table'),
  14. 'template': 'views/model_list.html',
  15. },
  16. 'thumbnails': {
  17. 'key': 'thumbnails',
  18. 'icon': 'fa fa-th-large',
  19. 'name': _(u'Thumbnails'),
  20. 'template': 'grids/thumbnails.html',
  21. },
  22. }
  23. class GridLayoutPlugin(BaseAdminPlugin):
  24. grid_layouts = []
  25. _active_layouts = []
  26. _current_layout = None
  27. _current_icon = 'table'
  28. def get_layout(self, l):
  29. item = (type(l) is dict) and l or DEFAULT_LAYOUTS[l]
  30. return dict({'url': self.admin_view.get_query_string({LAYOUT_VAR: item['key']}), 'selected': False}, **item)
  31. def init_request(self, *args, **kwargs):
  32. active = bool(self.request.method == 'GET' and self.grid_layouts)
  33. if active:
  34. layouts = (type(self.grid_layouts) in (list, tuple)) and self.grid_layouts or (self.grid_layouts,)
  35. self._active_layouts = [self.get_layout(l) for l in layouts]
  36. self._current_layout = self.request.GET.get(LAYOUT_VAR, self._active_layouts[0]['key'])
  37. for layout in self._active_layouts:
  38. if self._current_layout == layout['key']:
  39. self._current_icon = layout['icon']
  40. layout['selected'] = True
  41. self.admin_view.object_list_template = self.admin_view.get_template_list(layout['template'])
  42. return active
  43. def result_item(self, item, obj, field_name, row):
  44. if self._current_layout == 'thumbnails':
  45. if getattr(item.attr, 'is_column', True):
  46. item.field_label = label_for_field(
  47. field_name, self.model,
  48. model_admin=self.admin_view,
  49. return_attr=False
  50. )
  51. if getattr(item.attr, 'thumbnail_img', False):
  52. setattr(item, 'thumbnail_hidden', True)
  53. row['thumbnail_img'] = item
  54. elif item.is_display_link:
  55. setattr(item, 'thumbnail_hidden', True)
  56. row['thumbnail_label'] = item
  57. return item
  58. # Block Views
  59. def block_top_toolbar(self, context, nodes):
  60. if len(self._active_layouts) > 1:
  61. context.update({
  62. 'layouts': self._active_layouts,
  63. 'current_icon': self._current_icon,
  64. })
  65. nodes.append(loader.render_to_string('xadmin/blocks/model_list.top_toolbar.layouts.html',
  66. context=get_context_dict(context)))
  67. site.register_plugin(GridLayoutPlugin, ListAdminView)