from django.db import models from django import forms from django.utils.translation import ugettext as _ from django.utils.safestring import mark_safe from xadmin.sites import site from xadmin.views import BaseAdminPlugin, ModelFormAdminView, DetailAdminView, ListAdminView def get_gallery_modal(): return """ """ % (_('Previous'), _('Next'), _('Slideshow'), _('Download')) class AdminImageField(forms.ImageField): def widget_attrs(self, widget): return {'label': self.label} class AdminImageWidget(forms.FileInput): """ A ImageField Widget that shows its current value if it has one. """ def __init__(self, attrs={}): super(AdminImageWidget, self).__init__(attrs) def render(self, name, value, attrs=None, renderer=None): output = [] if value and hasattr(value, "url"): label = self.attrs.get('label', name) output.append('
%s ' % (value.url, label, value.url, _('Change:'))) output.append(super(AdminImageWidget, self).render(name, value, attrs, renderer)) return mark_safe(u''.join(output)) class ModelDetailPlugin(BaseAdminPlugin): def __init__(self, admin_view): super(ModelDetailPlugin, self).__init__(admin_view) self.include_image = False def get_field_attrs(self, attrs, db_field, **kwargs): if isinstance(db_field, models.ImageField): attrs['widget'] = AdminImageWidget attrs['form_class'] = AdminImageField self.include_image = True return attrs def get_field_result(self, result, field_name): if isinstance(result.field, models.ImageField): if result.value: img = getattr(result.obj, field_name) result.text = mark_safe('' % (img.url, result.label, img.url)) self.include_image = True return result # Media def get_media(self, media): if self.include_image: media = media + self.vendor('image-gallery.js', 'image-gallery.css') return media def block_before_fieldsets(self, context, node): if self.include_image: return '" def block_extrabody(self, context, node): if self.include_image: return get_gallery_modal() class ModelListPlugin(BaseAdminPlugin): list_gallery = False def init_request(self, *args, **kwargs): return bool(self.list_gallery) # Media def get_media(self, media): return media + self.vendor('image-gallery.js', 'image-gallery.css') def block_results_top(self, context, node): return '" def block_extrabody(self, context, node): return get_gallery_modal() site.register_plugin(ModelDetailPlugin, DetailAdminView) site.register_plugin(ModelDetailPlugin, ModelFormAdminView) site.register_plugin(ModelListPlugin, ListAdminView)