29 # import packages |
29 # import packages |
30 from pyams_content.skin import pyams_content |
30 from pyams_content.skin import pyams_content |
31 from pyams_i18n.column import I18nAttrColumn |
31 from pyams_i18n.column import I18nAttrColumn |
32 from pyams_pagelet.pagelet import pagelet_config |
32 from pyams_pagelet.pagelet import pagelet_config |
33 from pyams_skin.page import DefaultPageHeaderAdapter |
33 from pyams_skin.page import DefaultPageHeaderAdapter |
34 from pyams_skin.table import BaseTable, SorterColumn, JsActionColumn, I18nColumn, TrashColumn |
34 from pyams_skin.table import BaseTable, SorterColumn, I18nColumn, TrashColumn, VisibilitySwitcherColumn |
35 from pyams_skin.viewlet.menu import MenuItem |
35 from pyams_skin.viewlet.menu import MenuItem |
36 from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter |
36 from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter |
37 from pyams_utils.fanstatic import get_resource_path |
37 from pyams_utils.fanstatic import get_resource_path |
38 from pyams_utils.text import get_text_start |
38 from pyams_utils.text import get_text_start |
39 from pyams_utils.url import absolute_url |
39 from pyams_utils.url import absolute_url |
73 'id': self.id, |
74 'id': self.id, |
74 'data-ams-plugins': 'pyams_content', |
75 'data-ams-plugins': 'pyams_content', |
75 'data-ams-plugin-pyams_content-src': get_resource_path(pyams_content), |
76 'data-ams-plugin-pyams_content-src': get_resource_path(pyams_content), |
76 'data-ams-location': absolute_url(IAlertContainer(self.context), self.request), |
77 'data-ams-location': absolute_url(IAlertContainer(self.context), self.request), |
77 'data-ams-tablednd-drag-handle': 'td.sorter', |
78 'data-ams-tablednd-drag-handle': 'td.sorter', |
78 'data-ams-tablednd-drop-target': 'set-alerts-order.json' |
79 'data-ams-tablednd-drop-target': 'set-alerts-order.json', |
79 }) |
80 'data-ams-visibility-switcher': 'switch-alert-visibility.json' |
80 attributes.setdefault('tr', {}).update({ |
|
81 'id': lambda x, col: 'alert_{0}'.format(x.__name__), |
|
82 'data-ams-delete-target': 'delete-alert.json' |
|
83 }) |
81 }) |
84 return attributes |
82 return attributes |
85 |
83 |
86 @reify |
84 @reify |
87 def values(self): |
85 def values(self): |
116 request.context.updateOrder(order) |
114 request.context.updateOrder(order) |
117 return {'status': 'success'} |
115 return {'status': 'success'} |
118 |
116 |
119 |
117 |
120 @adapter_config(name='show-hide', context=(IAlertTarget, IPyAMSLayer, AlertContainerTable), provides=IColumn) |
118 @adapter_config(name='show-hide', context=(IAlertTarget, IPyAMSLayer, AlertContainerTable), provides=IColumn) |
121 class AlertContainerShowHideColumn(JsActionColumn): |
119 class AlertContainerShowHideColumn(VisibilitySwitcherColumn): |
122 """Alert container visibility switcher column""" |
120 """Alert container visibility switcher column""" |
123 |
121 |
124 cssClasses = {'th': 'action', |
122 |
125 'td': 'action switcher'} |
123 @view_config(name='switch-alert-visibility.json', context=IAlertContainer, request_type=IPyAMSLayer, |
126 |
|
127 icon_class = 'fa fa-fw fa-eye' |
|
128 icon_hint = _("Switch alert visibility") |
|
129 |
|
130 url = 'PyAMS_content.alerts.switchVisibility' |
|
131 |
|
132 weight = 5 |
|
133 |
|
134 def get_icon_class(self, item): |
|
135 if item.visible: |
|
136 return self.icon_class |
|
137 else: |
|
138 return 'fa fa-fw fa-eye-slash text-danger' |
|
139 |
|
140 |
|
141 @view_config(name='set-alert-visibility.json', context=IAlertContainer, request_type=IPyAMSLayer, |
|
142 permission=MANAGE_SITE_ROOT_PERMISSION, renderer='json', xhr=True) |
124 permission=MANAGE_SITE_ROOT_PERMISSION, renderer='json', xhr=True) |
143 def set_alert_visibility(request): |
125 def switch_alert_visibility(request): |
144 """Set alert visibility""" |
126 """Switch alert visibility""" |
145 container = IAlertContainer(request.context) |
127 container = IAlertContainer(request.context) |
146 alert = container.get(str(request.params.get('object_name'))) |
128 alert = container.get(str(request.params.get('object_name'))) |
147 if alert is None: |
129 if alert is None: |
148 raise NotFound() |
130 raise NotFound() |
149 alert.visible = not alert.visible |
131 alert.visible = not alert.visible |
198 |
180 |
199 @adapter_config(name='trash', context=(IAlertTarget, IPyAMSLayer, AlertContainerTable), provides=IColumn) |
181 @adapter_config(name='trash', context=(IAlertTarget, IPyAMSLayer, AlertContainerTable), provides=IColumn) |
200 class AlertContainerTrashColumn(TrashColumn): |
182 class AlertContainerTrashColumn(TrashColumn): |
201 """Alert container trash column""" |
183 """Alert container trash column""" |
202 |
184 |
203 |
185 permission = MANAGE_SITE_ROOT_PERMISSION |
204 @view_config(name='delete-alert.json', context=IAlertTarget, request_type=IPyAMSLayer, |
|
205 permission=MANAGE_SITE_ROOT_PERMISSION, renderer='json', xhr=True) |
|
206 def delete_alert(request): |
|
207 """Delete alert""" |
|
208 translate = request.localizer.translate |
|
209 name = request.params.get('object_name') |
|
210 if not name: |
|
211 return { |
|
212 'status': 'message', |
|
213 'messagebox': { |
|
214 'status': 'error', |
|
215 'content': translate(_("No provided object_name argument!")) |
|
216 } |
|
217 } |
|
218 if name not in request.context: |
|
219 return { |
|
220 'status': 'message', |
|
221 'messagebox': { |
|
222 'status': 'error', |
|
223 'content': translate(_("Given alert name doesn't exist!")) |
|
224 } |
|
225 } |
|
226 del request.context[name] |
|
227 return {'status': 'success'} |
|
228 |
186 |
229 |
187 |
230 @pagelet_config(name='alerts.html', context=IAlertTarget, layer=IPyAMSLayer, permission=MANAGE_SITE_ROOT_PERMISSION) |
188 @pagelet_config(name='alerts.html', context=IAlertTarget, layer=IPyAMSLayer, permission=MANAGE_SITE_ROOT_PERMISSION) |
231 class AlertContainerView(ContainerAdminView): |
189 class AlertContainerView(ContainerAdminView): |
232 """Alerts container view""" |
190 """Alerts container view""" |