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 |