src/pyams_content/component/gallery/zmi/__init__.py
changeset 363 86d1a240d4dc
parent 362 8fc21a7ef206
child 395 2a39b333a585
equal deleted inserted replaced
362:8fc21a7ef206 363:86d1a240d4dc
    19 
    19 
    20 from io import BytesIO
    20 from io import BytesIO
    21 
    21 
    22 # import interfaces
    22 # import interfaces
    23 from pyams_content.component.gallery.interfaces import IGallery, IGalleryRenderer
    23 from pyams_content.component.gallery.interfaces import IGallery, IGalleryRenderer
    24 from pyams_content.component.gallery.zmi.interfaces import IGalleryImageAddFields, IGalleryImagesView
    24 from pyams_content.component.gallery.zmi.interfaces import IGalleryMediasAddFields, IGalleryContentsView
    25 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
    25 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
    26 from pyams_file.interfaces import IFileInfo
    26 from pyams_file.interfaces import IFileInfo
    27 from pyams_form.interfaces.form import IWidgetsPrefixViewletsManager
    27 from pyams_form.interfaces.form import IWidgetsPrefixViewletsManager
    28 from pyams_i18n.interfaces import II18n
    28 from pyams_i18n.interfaces import II18n
    29 from pyams_skin.layer import IPyAMSLayer
    29 from pyams_skin.layer import IPyAMSLayer
    86 #
    86 #
    87 # Gallery contents
    87 # Gallery contents
    88 #
    88 #
    89 
    89 
    90 @pagelet_config(name='contents.html', context=IGallery, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
    90 @pagelet_config(name='contents.html', context=IGallery, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
    91 @implementer(IGalleryImagesView)
    91 @implementer(IGalleryContentsView)
    92 class GalleryContentForm(AdminDialogDisplayForm):
    92 class GalleryContentForm(AdminDialogDisplayForm):
    93     """Gallery contents form"""
    93     """Gallery contents form"""
    94 
    94 
    95     legend = _("Update gallery contents")
    95     legend = _("Update gallery contents")
    96     dialog_class = 'modal-max'
    96     dialog_class = 'modal-max'
    97 
    97 
    98     fields = field.Fields(Interface)
    98     fields = field.Fields(Interface)
    99     show_widget_title = True
    99     show_widget_title = True
   100 
   100 
   101 
   101 
   102 @viewlet_config(name='gallery-images', context=IGallery, view=IGalleryImagesView, manager=IWidgetsPrefixViewletsManager)
   102 @viewlet_config(name='gallery-medias', context=IGallery, view=IGalleryContentsView, manager=IWidgetsPrefixViewletsManager)
   103 @template_config(template='templates/gallery-images.pt', layer=IPyAMSLayer)
   103 @template_config(template='templates/gallery-medias.pt', layer=IPyAMSLayer)
   104 @implementer(IGalleryImagesView)
   104 @implementer(IGalleryContentsView)
   105 class GalleryImagesViewlet(Viewlet):
   105 class GalleryMediasViewlet(Viewlet):
   106     """Gallery images viewlet"""
   106     """Gallery medias viewlet"""
   107 
   107 
   108     def get_title(self, image):
   108     def get_title(self, media):
   109         return II18n(image).query_attribute('title', request=self.request)
   109         return II18n(media).query_attribute('title', request=self.request)
   110 
   110 
   111 
   111 
   112 @view_config(name='get-gallery-images.html', context=IGallery, request_type=IPyAMSLayer,
   112 @view_config(name='get-gallery-medias.html', context=IGallery, request_type=IPyAMSLayer,
   113              permission=VIEW_SYSTEM_PERMISSION)
   113              permission=VIEW_SYSTEM_PERMISSION)
   114 @implementer(IGalleryImagesView)
   114 @implementer(IGalleryContentsView)
   115 class GalleryImagesView(WfSharedContentPermissionMixin):
   115 class GalleryMediasView(WfSharedContentPermissionMixin):
   116     """Gallery images view"""
   116     """Gallery medias view"""
   117 
   117 
   118     def __init__(self, context, request):
   118     def __init__(self, context, request):
   119         self.context = context
   119         self.context = context
   120         self.request = request
   120         self.request = request
   121 
   121 
   122     def __call__(self):
   122     def __call__(self):
   123         return render_to_response('templates/gallery-images.pt', {'view': self}, request=self.request)
   123         return render_to_response('templates/gallery-medias.pt', {'view': self}, request=self.request)
   124 
   124 
   125     def get_title(self, image):
   125     def get_title(self, media):
   126         return II18n(image).query_attribute('title', request=self.request)
   126         return II18n(media).query_attribute('title', request=self.request)
   127 
   127 
   128     def get_thumbnail_target(self, media):
   128     def get_thumbnail_target(self, media):
   129         registry = self.request.registry
   129         registry = self.request.registry
   130         view = registry.queryMultiAdapter((media, self.request), IView, name='preview.html')
   130         view = registry.queryMultiAdapter((media, self.request), IView, name='preview.html')
   131         if view is not None:
   131         if view is not None:
   132             return absolute_url(media, self.request, 'preview.html')
   132             return absolute_url(media, self.request, 'preview.html')
   133 
   133 
   134 
   134 
   135 @view_config(name='set-images-order.json', context=IGallery, request_type=IPyAMSLayer,
   135 @view_config(name='set-medias-order.json', context=IGallery, request_type=IPyAMSLayer,
   136              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
   136              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
   137 def set_images_order(request):
   137 def set_medias_order(request):
   138     """Set gallery images order"""
   138     """Set gallery medias order"""
   139     images_names = json.loads(request.params.get('images'))
   139     medias_names = json.loads(request.params.get('medias'))
   140     request.context.updateOrder(images_names)
   140     request.context.updateOrder(medias_names)
   141     return {'status': 'success'}
   141     return {'status': 'success'}
   142 
   142 
   143 
   143 
   144 @view_config(name='set-image-visibility.json', context=IGallery, request_type=IPyAMSLayer,
   144 @view_config(name='set-media-visibility.json', context=IGallery, request_type=IPyAMSLayer,
   145              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
   145              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
   146 def set_image_visibility(request):
   146 def set_media_visibility(request):
   147     """Set gallery image visibility"""
   147     """Set gallery media visibility"""
   148     gallery = IGallery(request.context)
   148     gallery = IGallery(request.context)
   149     image = gallery.get(str(request.params.get('object_name')))
   149     media = gallery.get(str(request.params.get('object_name')))
   150     if image is None:
   150     if media is None:
   151         raise NotFound()
   151         raise NotFound()
   152     image.visible = not image.visible
   152     media.visible = not media.visible
   153     return {'visible': image.visible}
   153     return {'visible': media.visible}
   154 
   154 
   155 
   155 
   156 #
   156 #
   157 # Gallery renderers
   157 # Gallery renderers
   158 #
   158 #
   174     label = _("Default gallery renderer")
   174     label = _("Default gallery renderer")
   175     weight = 1
   175     weight = 1
   176 
   176 
   177 
   177 
   178 #
   178 #
   179 # Gallery images downloader
   179 # Gallery medias downloader
   180 #
   180 #
   181 
   181 
   182 @view_config(name='get-images.zip', context=IGallery, request_type=IPyAMSLayer,
   182 @view_config(name='get-medias.zip', context=IGallery, request_type=IPyAMSLayer,
   183              permission=VIEW_SYSTEM_PERMISSION)
   183              permission=VIEW_SYSTEM_PERMISSION)
   184 def get_images_archive(request):
   184 def get_medias_archive(request):
   185     """Get all gallery images as ZIP file"""
   185     """Get all gallery medias as ZIP file"""
   186     zip_data = BytesIO()
   186     zip_data = BytesIO()
   187     zip_file = zipfile.ZipFile(zip_data, mode='w')
   187     zip_file = zipfile.ZipFile(zip_data, mode='w')
   188     for image in IGallery(request.context).values():
   188     for media in IGallery(request.context).values():
   189         zip_file.writestr(IFileInfo(image.data).filename, image.data.data)
   189         zip_file.writestr(IFileInfo(media.data).filename, media.data.data)
   190     zip_file.close()
   190     zip_file.close()
   191     zip_data.seek(0)
   191     zip_data.seek(0)
   192     response = Response(content_type='application/zip',
   192     response = Response(content_type='application/zip',
   193                         content_disposition='attachment; filename="gallery.zip"')
   193                         content_disposition='attachment; filename="gallery.zip"')
   194     response.body_file = zip_data
   194     response.body_file = zip_data