src/pyams_media/zmi/media.py
changeset 47 44889107d310
parent 19 179f9381965b
child 50 03d7f86e8ceb
equal deleted inserted replaced
46:55d5fde71e8f 47:44889107d310
    14 
    14 
    15 
    15 
    16 # import standard library
    16 # import standard library
    17 
    17 
    18 # import interfaces
    18 # import interfaces
    19 from pyams_file.interfaces import IVideo, IThumbnail, IAudio
    19 from pyams_file.interfaces import IVideo, IThumbnail, IAudio, IMediaFile
    20 from pyams_form.interfaces.form import IWidgetsPrefixViewletsManager
    20 from pyams_form.interfaces.form import IWidgetsPrefixViewletsManager, IFormHelp
    21 from pyams_media.interfaces import IMediaConversionUtility, VIDEO_FRAME_SIZE, IMediaConverter, IMediaConversions
    21 from pyams_media.interfaces import IMediaConversionUtility, VIDEO_FRAME_SIZE, IMediaConverter, IMediaConversions
       
    22 from pyams_media.zmi.interfaces import IMediaConversionsForm
    22 from pyams_skin.interfaces.viewlet import IContextActions
    23 from pyams_skin.interfaces.viewlet import IContextActions
    23 from pyams_skin.layer import IPyAMSLayer
    24 from pyams_skin.layer import IPyAMSLayer
    24 from pyams_zmi.layer import IAdminLayer
    25 from pyams_zmi.layer import IAdminLayer
       
    26 from transaction.interfaces import ITransactionManager
       
    27 from z3c.form.interfaces import DISPLAY_MODE
    25 
    28 
    26 # import packages
    29 # import packages
       
    30 from pyams_form.form import AJAXEditForm
       
    31 from pyams_form.help import FormHelp
       
    32 from pyams_form.schema import CloseButton
       
    33 from pyams_media.media import check_media_conversion
    27 from pyams_pagelet.pagelet import pagelet_config
    34 from pyams_pagelet.pagelet import pagelet_config
    28 from pyams_skin.viewlet.toolbar import ToolbarMenuItem
    35 from pyams_skin.viewlet.toolbar import ToolbarActionItem
    29 from pyams_template.template import template_config
    36 from pyams_template.template import template_config
       
    37 from pyams_utils.adapter import adapter_config
    30 from pyams_utils.interfaces import MANAGE_PERMISSION
    38 from pyams_utils.interfaces import MANAGE_PERMISSION
    31 from pyams_utils.registry import query_utility
    39 from pyams_utils.registry import query_utility
    32 from pyams_viewlet.viewlet import viewlet_config, Viewlet
    40 from pyams_viewlet.viewlet import viewlet_config, Viewlet
    33 from pyams_zmi.form import AdminDialogDisplayForm
    41 from pyams_zmi.form import AdminDialogEditForm
    34 from z3c.form import field
    42 from pyramid.view import view_config
    35 from zope.interface import Interface
    43 from z3c.form import field, button
       
    44 from zope.interface import implementer, Interface
    36 
    45 
    37 from pyams_media import _
    46 from pyams_media import _
       
    47 
       
    48 
       
    49 class IMediaConversionsFormButtons(Interface):
       
    50     """Media conversions form buttons"""
       
    51 
       
    52     close = CloseButton(name='close', title=_("Cancel"))
       
    53     convert = button.Button(name='convert', title=_("Restart missing conversions"))
       
    54 
       
    55 
       
    56 @adapter_config(context=(IMediaFile, IAdminLayer, IMediaConversionsForm), provides=IFormHelp)
       
    57 class MediaConversionsFormHelpAdapter(FormHelp):
       
    58     """Medias conversions form help adapter"""
       
    59 
       
    60     message = _("""Several formats are required to handle different browsers and screen resolutions.
       
    61     
       
    62 Conversion process may require some time based on media format and duration; this dashboard gives
       
    63 you indications about required conversions.""")
       
    64     message_format = 'rest'
    38 
    65 
    39 
    66 
    40 #
    67 #
    41 # Video conversions
    68 # Video conversions
    42 #
    69 #
    43 
    70 
    44 @viewlet_config(name='video.conversions.action', context=IVideo, layer=IPyAMSLayer, view=Interface,
    71 @viewlet_config(name='video.conversions.action', context=IVideo, layer=IPyAMSLayer, view=Interface,
    45                 manager=IContextActions, permission=MANAGE_PERMISSION, weight=15)
    72                 manager=IContextActions, permission=MANAGE_PERMISSION, weight=15)
    46 class VideoConversionsAction(ToolbarMenuItem):
    73 class VideoConversionsAction(ToolbarActionItem):
    47     """Video conversions action"""
    74     """Video conversions action"""
    48 
    75 
    49     label = _("Video conversions...")
    76     label = _("Video conversions...")
    50     label_css_class = 'fa fa-fw fa-compress'
    77     label_css_class = 'fa fa-fw fa-compress'
    51 
    78 
    52     url = 'video-conversions.html'
    79     url = 'video-conversions.html'
    53     modal_target = True
    80     modal_target = True
    54 
    81 
    55 
    82 
    56 @pagelet_config(name='video-conversions.html', context=IVideo, layer=IPyAMSLayer, permission=MANAGE_PERMISSION)
    83 @pagelet_config(name='video-conversions.html', context=IVideo, layer=IPyAMSLayer, permission=MANAGE_PERMISSION)
    57 class VideoConversionsDisplayForm(AdminDialogDisplayForm):
    84 @implementer(IMediaConversionsForm)
       
    85 class VideoConversionsEditForm(AdminDialogEditForm):
    58     """Video conversions display form"""
    86     """Video conversions display form"""
    59 
    87 
    60     legend = _("Selected video conversions")
    88     legend = _("Selected video conversions")
    61     icon_css_class = 'fa fa-fw fa-compress'
    89     icon_css_class = 'fa fa-fw fa-compress'
    62 
    90 
    63     fields = field.Fields(Interface)
    91     fields = field.Fields(Interface)
       
    92     buttons = button.Buttons(IMediaConversionsFormButtons)
       
    93     edit_permission = MANAGE_PERMISSION
       
    94     ajax_handler = 'restart-video-conversions.json'
    64 
    95 
    65     @property
    96     @property
    66     def title(self):
    97     def title(self):
    67         return self.context.title or self.context.filename
    98         return self.context.title or self.context.filename
    68 
    99 
       
   100     def check_mode(self):
       
   101         if not self.request.has_permission(self.edit_permission, self.getContent()):
       
   102             self.mode = DISPLAY_MODE
       
   103 
       
   104     def updateActions(self):
       
   105         super(VideoConversionsEditForm, self).updateActions()
       
   106         if 'convert' in self.actions:
       
   107             self.actions['convert'].addClass('btn-primary')
       
   108 
       
   109     def applyChanges(self, data):
       
   110         media = self.getContent()
       
   111         ITransactionManager(media).get().addAfterCommitHook(check_media_conversion, kws={'media': media})
       
   112         return True
       
   113 
       
   114 
       
   115 @view_config(name='restart-video-conversions.json', context=IVideo, request_type=IPyAMSLayer,
       
   116              permission=MANAGE_PERMISSION, renderer='json', xhr=True)
       
   117 class VideoConversionsAJAXEditForm(AJAXEditForm, VideoConversionsEditForm):
       
   118     """Video conversions edit form, JSON renderer"""
       
   119 
       
   120     def get_ajax_output(self, changes):
       
   121         return {'status': 'success',
       
   122                 'message': self.request.localizer.translate(_("Media conversions restarted!"))}
       
   123 
    69 
   124 
    70 @viewlet_config(name='video-conversions-prefix', context=IVideo, layer=IAdminLayer,
   125 @viewlet_config(name='video-conversions-prefix', context=IVideo, layer=IAdminLayer,
    71                 view=VideoConversionsDisplayForm, manager=IWidgetsPrefixViewletsManager)
   126                 view=VideoConversionsEditForm, manager=IWidgetsPrefixViewletsManager)
    72 @template_config(template='templates/video-conversions.pt')
   127 @template_config(template='templates/video-conversions.pt')
    73 class VideoConversionsViewletsPrefix(Viewlet):
   128 class VideoConversionsViewletsPrefix(Viewlet):
    74     """Video conversions display form viewlets prefix"""
   129     """Video conversions display form viewlets prefix"""
    75 
   130 
    76     @property
   131     @property
   110 # Audio conversions
   165 # Audio conversions
   111 #
   166 #
   112 
   167 
   113 @viewlet_config(name='audio.conversions.action', context=IAudio, layer=IPyAMSLayer, view=Interface,
   168 @viewlet_config(name='audio.conversions.action', context=IAudio, layer=IPyAMSLayer, view=Interface,
   114                 manager=IContextActions, permission=MANAGE_PERMISSION, weight=15)
   169                 manager=IContextActions, permission=MANAGE_PERMISSION, weight=15)
   115 class AudioConversionsAction(ToolbarMenuItem):
   170 class AudioConversionsAction(ToolbarActionItem):
   116     """Audio conversions action"""
   171     """Audio conversions action"""
   117 
   172 
   118     label = _("Audio conversions...")
   173     label = _("Audio conversions...")
   119     label_css_class = 'fa fa-fw fa-compress'
   174     label_css_class = 'fa fa-fw fa-compress'
   120 
   175 
   121     url = 'audio-conversions.html'
   176     url = 'audio-conversions.html'
   122     modal_target = True
   177     modal_target = True
   123 
   178 
   124 
   179 
   125 @pagelet_config(name='audio-conversions.html', context=IAudio, layer=IPyAMSLayer, permission=MANAGE_PERMISSION)
   180 @pagelet_config(name='audio-conversions.html', context=IAudio, layer=IPyAMSLayer, permission=MANAGE_PERMISSION)
   126 class AudioConversionsDisplayForm(AdminDialogDisplayForm):
   181 @implementer(IMediaConversionsForm)
       
   182 class AudioConversionsEditForm(AdminDialogEditForm):
   127     """Audio conversions display form"""
   183     """Audio conversions display form"""
   128 
   184 
   129     legend = _("Selected audio conversions")
   185     legend = _("Selected audio conversions")
   130     icon_css_class = 'fa fa-fw fa-compress'
   186     icon_css_class = 'fa fa-fw fa-compress'
   131 
   187 
   132     fields = field.Fields(Interface)
   188     fields = field.Fields(Interface)
       
   189     buttons = button.Buttons(IMediaConversionsFormButtons)
       
   190     edit_permission = MANAGE_PERMISSION
       
   191     ajax_handler = 'restart-audio-conversions.json'
   133 
   192 
   134     @property
   193     @property
   135     def title(self):
   194     def title(self):
   136         return self.context.title or self.context.filename
   195         return self.context.title or self.context.filename
   137 
   196 
       
   197     def check_mode(self):
       
   198         if not self.request.has_permission(self.edit_permission, self.getContent()):
       
   199             self.mode = DISPLAY_MODE
       
   200 
       
   201     def updateActions(self):
       
   202         super(AudioConversionsEditForm, self).updateActions()
       
   203         if 'convert' in self.actions:
       
   204             self.actions['convert'].addClass('btn-primary')
       
   205 
       
   206     def applyChanges(self, data):
       
   207         media = self.getContent()
       
   208         ITransactionManager(media).get().addAfterCommitHook(check_media_conversion, kws={'media': media})
       
   209         return True
       
   210 
       
   211 
       
   212 @view_config(name='restart-audio-conversions.json', context=IAudio, request_type=IPyAMSLayer,
       
   213              permission=MANAGE_PERMISSION, renderer='json', xhr=True)
       
   214 class AudioConversionsAJAXEditForm(AJAXEditForm, AudioConversionsEditForm):
       
   215     """Audio conversions edit form, JSON renderer"""
       
   216 
       
   217     def get_ajax_output(self, changes):
       
   218         return {'status': 'success',
       
   219                 'message': self.request.localizer.translate(_("Media conversions restarted!"))}
       
   220 
   138 
   221 
   139 @viewlet_config(name='audio-conversions-prefix', context=IAudio, layer=IAdminLayer,
   222 @viewlet_config(name='audio-conversions-prefix', context=IAudio, layer=IAdminLayer,
   140                 view=AudioConversionsDisplayForm, manager=IWidgetsPrefixViewletsManager)
   223                 view=AudioConversionsEditForm, manager=IWidgetsPrefixViewletsManager)
   141 @template_config(template='templates/audio-conversions.pt')
   224 @template_config(template='templates/audio-conversions.pt')
   142 class AudioConversionsViewletsPrefix(Viewlet):
   225 class AudioConversionsViewletsPrefix(Viewlet):
   143     """Audio conversions display form viewlets prefix"""
   226     """Audio conversions display form viewlets prefix"""
   144 
   227 
   145     @property
   228     @property