82 lines
2.9 KiB
Python
82 lines
2.9 KiB
Python
# coding=utf-8
|
|
from django.template import loader
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
from xadmin.plugins.utils import get_context_dict
|
|
from xadmin.sites import site
|
|
from xadmin.views import BaseAdminPlugin, ListAdminView
|
|
from xadmin.util import label_for_field
|
|
|
|
LAYOUT_VAR = '_layout'
|
|
|
|
DEFAULT_LAYOUTS = {
|
|
'table': {
|
|
'key': 'table',
|
|
'icon': 'fa fa-table',
|
|
'name': _(u'Table'),
|
|
'template': 'views/model_list.html',
|
|
},
|
|
'thumbnails': {
|
|
'key': 'thumbnails',
|
|
'icon': 'fa fa-th-large',
|
|
'name': _(u'Thumbnails'),
|
|
'template': 'grids/thumbnails.html',
|
|
},
|
|
}
|
|
|
|
|
|
class GridLayoutPlugin(BaseAdminPlugin):
|
|
|
|
grid_layouts = []
|
|
|
|
_active_layouts = []
|
|
_current_layout = None
|
|
_current_icon = 'table'
|
|
|
|
def get_layout(self, l):
|
|
item = (type(l) is dict) and l or DEFAULT_LAYOUTS[l]
|
|
return dict({'url': self.admin_view.get_query_string({LAYOUT_VAR: item['key']}), 'selected': False}, **item)
|
|
|
|
def init_request(self, *args, **kwargs):
|
|
active = bool(self.request.method == 'GET' and self.grid_layouts)
|
|
if active:
|
|
layouts = (type(self.grid_layouts) in (list, tuple)) and self.grid_layouts or (self.grid_layouts,)
|
|
self._active_layouts = [self.get_layout(l) for l in layouts]
|
|
self._current_layout = self.request.GET.get(LAYOUT_VAR, self._active_layouts[0]['key'])
|
|
for layout in self._active_layouts:
|
|
if self._current_layout == layout['key']:
|
|
self._current_icon = layout['icon']
|
|
layout['selected'] = True
|
|
self.admin_view.object_list_template = self.admin_view.get_template_list(layout['template'])
|
|
return active
|
|
|
|
def result_item(self, item, obj, field_name, row):
|
|
if self._current_layout == 'thumbnails':
|
|
if getattr(item.attr, 'is_column', True):
|
|
item.field_label = label_for_field(
|
|
field_name, self.model,
|
|
model_admin=self.admin_view,
|
|
return_attr=False
|
|
)
|
|
if getattr(item.attr, 'thumbnail_img', False):
|
|
setattr(item, 'thumbnail_hidden', True)
|
|
row['thumbnail_img'] = item
|
|
elif item.is_display_link:
|
|
setattr(item, 'thumbnail_hidden', True)
|
|
row['thumbnail_label'] = item
|
|
|
|
return item
|
|
|
|
# Block Views
|
|
def block_top_toolbar(self, context, nodes):
|
|
if len(self._active_layouts) > 1:
|
|
context.update({
|
|
'layouts': self._active_layouts,
|
|
'current_icon': self._current_icon,
|
|
})
|
|
nodes.append(loader.render_to_string('xadmin/blocks/model_list.top_toolbar.layouts.html',
|
|
context=get_context_dict(context)))
|
|
|
|
|
|
site.register_plugin(GridLayoutPlugin, ListAdminView)
|