codepedia2/xadmin/plugins/layout.py

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)