images.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. from django.db import models
  2. from django import forms
  3. from django.utils.translation import ugettext as _
  4. from django.utils.safestring import mark_safe
  5. from xadmin.sites import site
  6. from xadmin.views import BaseAdminPlugin, ModelFormAdminView, DetailAdminView, ListAdminView
  7. def get_gallery_modal():
  8. return """
  9. <!-- modal-gallery is the modal dialog used for the image gallery -->
  10. <div id="modal-gallery" class="modal modal-gallery fade" tabindex="-1">
  11. <div class="modal-dialog">
  12. <div class="modal-content">
  13. <div class="modal-header">
  14. <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
  15. <h4 class="modal-title"></h4>
  16. </div>
  17. <div class="modal-body"><div class="modal-image"><h1 class="loader"><i class="fa-spinner fa-spin fa fa-large loader"></i></h1></div></div>
  18. <div class="modal-footer">
  19. <a class="btn btn-info modal-prev"><i class="fa fa-arrow-left"></i> <span>%s</span></a>
  20. <a class="btn btn-primary modal-next"><span>%s</span> <i class="fa fa-arrow-right"></i></a>
  21. <a class="btn btn-success modal-play modal-slideshow" data-slideshow="5000"><i class="fa fa-play"></i> <span>%s</span></a>
  22. <a class="btn btn-default modal-download" target="_blank"><i class="fa fa-download"></i> <span>%s</span></a>
  23. </div>
  24. </div><!-- /.modal-content -->
  25. </div><!-- /.modal-dialog -->
  26. </div>
  27. """ % (_('Previous'), _('Next'), _('Slideshow'), _('Download'))
  28. class AdminImageField(forms.ImageField):
  29. def widget_attrs(self, widget):
  30. return {'label': self.label}
  31. class AdminImageWidget(forms.FileInput):
  32. """
  33. A ImageField Widget that shows its current value if it has one.
  34. """
  35. def __init__(self, attrs={}):
  36. super(AdminImageWidget, self).__init__(attrs)
  37. def render(self, name, value, attrs=None, renderer=None):
  38. output = []
  39. if value and hasattr(value, "url"):
  40. label = self.attrs.get('label', name)
  41. output.append('<a href="%s" target="_blank" title="%s" data-gallery="gallery"><img src="%s" class="field_img"/></a><br/>%s ' %
  42. (value.url, label, value.url, _('Change:')))
  43. output.append(super(AdminImageWidget, self).render(name, value, attrs, renderer))
  44. return mark_safe(u''.join(output))
  45. class ModelDetailPlugin(BaseAdminPlugin):
  46. def __init__(self, admin_view):
  47. super(ModelDetailPlugin, self).__init__(admin_view)
  48. self.include_image = False
  49. def get_field_attrs(self, attrs, db_field, **kwargs):
  50. if isinstance(db_field, models.ImageField):
  51. attrs['widget'] = AdminImageWidget
  52. attrs['form_class'] = AdminImageField
  53. self.include_image = True
  54. return attrs
  55. def get_field_result(self, result, field_name):
  56. if isinstance(result.field, models.ImageField):
  57. if result.value:
  58. img = getattr(result.obj, field_name)
  59. result.text = mark_safe('<a href="%s" target="_blank" title="%s" data-gallery="gallery"><img src="%s" class="field_img"/></a>' % (img.url, result.label, img.url))
  60. self.include_image = True
  61. return result
  62. # Media
  63. def get_media(self, media):
  64. if self.include_image:
  65. media = media + self.vendor('image-gallery.js',
  66. 'image-gallery.css')
  67. return media
  68. def block_before_fieldsets(self, context, node):
  69. if self.include_image:
  70. return '<div id="gallery" data-toggle="modal-gallery" data-target="#modal-gallery">'
  71. def block_after_fieldsets(self, context, node):
  72. if self.include_image:
  73. return "</div>"
  74. def block_extrabody(self, context, node):
  75. if self.include_image:
  76. return get_gallery_modal()
  77. class ModelListPlugin(BaseAdminPlugin):
  78. list_gallery = False
  79. def init_request(self, *args, **kwargs):
  80. return bool(self.list_gallery)
  81. # Media
  82. def get_media(self, media):
  83. return media + self.vendor('image-gallery.js', 'image-gallery.css')
  84. def block_results_top(self, context, node):
  85. return '<div id="gallery" data-toggle="modal-gallery" data-target="#modal-gallery">'
  86. def block_results_bottom(self, context, node):
  87. return "</div>"
  88. def block_extrabody(self, context, node):
  89. return get_gallery_modal()
  90. site.register_plugin(ModelDetailPlugin, DetailAdminView)
  91. site.register_plugin(ModelDetailPlugin, ModelFormAdminView)
  92. site.register_plugin(ModelListPlugin, ListAdminView)