src/pyams_content/features/redirect/zmi/container.py
changeset 1436 758f1ae21724
parent 1295 6aded60a6fe7
equal deleted inserted replaced
1435:347a4c2ef20c 1436:758f1ae21724
    26 from zope.interface import Interface
    26 from zope.interface import Interface
    27 from zope.schema import Bool, TextLine
    27 from zope.schema import Bool, TextLine
    28 
    28 
    29 from pyams_catalog.query import CatalogResultSet
    29 from pyams_catalog.query import CatalogResultSet
    30 from pyams_content import _
    30 from pyams_content import _
    31 from pyams_content.features.redirect.interfaces import IRedirectionManager, IRedirectionManagerTarget
    31 from pyams_content.features.redirect.interfaces import IRedirectionManager, \
       
    32     IRedirectionManagerTarget
    32 from pyams_content.interfaces import MANAGE_SITE_ROOT_PERMISSION
    33 from pyams_content.interfaces import MANAGE_SITE_ROOT_PERMISSION
    33 from pyams_content.zmi import pyams_content
    34 from pyams_content.zmi import pyams_content
    34 from pyams_form.form import AJAXAddForm
    35 from pyams_form.form import AJAXAddForm
    35 from pyams_form.interfaces.form import IWidgetsSuffixViewletsManager
    36 from pyams_form.interfaces.form import IWidgetsSuffixViewletsManager
    36 from pyams_form.schema import CloseButton
    37 from pyams_form.schema import CloseButton
    41 from pyams_skin.interfaces import IContentHelp, IPageHeader, IUserSkinnable
    42 from pyams_skin.interfaces import IContentHelp, IPageHeader, IUserSkinnable
    42 from pyams_skin.interfaces.viewlet import IToolbarViewletManager
    43 from pyams_skin.interfaces.viewlet import IToolbarViewletManager
    43 from pyams_skin.layer import IPyAMSLayer
    44 from pyams_skin.layer import IPyAMSLayer
    44 from pyams_skin.page import DefaultPageHeaderAdapter
    45 from pyams_skin.page import DefaultPageHeaderAdapter
    45 from pyams_skin.skin import apply_skin
    46 from pyams_skin.skin import apply_skin
    46 from pyams_skin.table import AttributeSwitcherColumn, BaseTable, I18nColumn, ImageColumn, SorterColumn, TrashColumn
    47 from pyams_skin.table import AttributeSwitcherColumn, BaseTable, I18nColumn, ImageColumn, \
       
    48     SorterColumn, TrashColumn
    47 from pyams_skin.viewlet.menu import MenuItem
    49 from pyams_skin.viewlet.menu import MenuItem
    48 from pyams_skin.viewlet.toolbar import ToolbarAction
    50 from pyams_skin.viewlet.toolbar import ToolbarAction
    49 from pyams_template.template import template_config
    51 from pyams_template.template import template_config
    50 from pyams_utils.adapter import ContextRequestViewAdapter, adapter_config
    52 from pyams_utils.adapter import ContextRequestViewAdapter, adapter_config
    51 from pyams_utils.fanstatic import get_resource_path
    53 from pyams_utils.fanstatic import get_resource_path
   123             translate = self.request.localizer.translate
   125             translate = self.request.localizer.translate
   124             return translate(_("No currently defined redirection rule."))
   126             return translate(_("No currently defined redirection rule."))
   125         return super(RedirectionsContainerTable, self).render()
   127         return super(RedirectionsContainerTable, self).render()
   126 
   128 
   127 
   129 
   128 @adapter_config(context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable), provides=IValues)
   130 @adapter_config(context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable),
       
   131                 provides=IValues)
   129 class RedirectionsContainerValues(ContextRequestViewAdapter):
   132 class RedirectionsContainerValues(ContextRequestViewAdapter):
   130     """Redirections container values"""
   133     """Redirections container values"""
   131 
   134 
   132     @property
   135     @property
   133     def values(self):
   136     def values(self):
   134         return IRedirectionManager(self.context).values()
   137         return IRedirectionManager(self.context).values()
   135 
   138 
   136 
   139 
   137 @adapter_config(name='sorter', context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable),
   140 @adapter_config(name='sorter',
       
   141                 context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable),
   138                 provides=IColumn)
   142                 provides=IColumn)
   139 class RedirectionsContainerSorterColumn(SorterColumn):
   143 class RedirectionsContainerSorterColumn(SorterColumn):
   140     """Redirections container sorter column"""
   144     """Redirections container sorter column"""
   141 
   145 
   142 
   146 
   147     order = list(map(str, json.loads(request.params.get('names'))))
   151     order = list(map(str, json.loads(request.params.get('names'))))
   148     request.context.updateOrder(order)
   152     request.context.updateOrder(order)
   149     return {'status': 'success'}
   153     return {'status': 'success'}
   150 
   154 
   151 
   155 
   152 @adapter_config(name='enable-disable', context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable),
   156 @adapter_config(name='enable-disable',
       
   157                 context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable),
   153                 provides=IColumn)
   158                 provides=IColumn)
   154 class RedirectionsContainerEnablerColumn(AttributeSwitcherColumn):
   159 class RedirectionsContainerEnablerColumn(AttributeSwitcherColumn):
   155     """Redirections container enabler switcher column"""
   160     """Redirections container enabler switcher column"""
   156 
   161 
   157     switch_attribute = 'active'
   162     switch_attribute = 'active'
   162     icon_hint = _("Enable/disable rule")
   167     icon_hint = _("Enable/disable rule")
   163 
   168 
   164     weight = 6
   169     weight = 6
   165 
   170 
   166 
   171 
   167 @view_config(name='switch-rule-activity.json', context=IRedirectionManager, request_type=IPyAMSLayer,
   172 @view_config(name='switch-rule-activity.json', context=IRedirectionManager,
   168              permission=MANAGE_SITE_ROOT_PERMISSION, renderer='json', xhr=True)
   173              request_type=IPyAMSLayer, permission=MANAGE_SITE_ROOT_PERMISSION,
       
   174              renderer='json', xhr=True)
   169 def switch_rule_activity(request):
   175 def switch_rule_activity(request):
   170     """Switch rule activity"""
   176     """Switch rule activity"""
   171     container = IRedirectionManager(request.context)
   177     container = IRedirectionManager(request.context)
   172     rule = container.get(str(request.params.get('object_name')))
   178     rule = container.get(str(request.params.get('object_name')))
   173     if rule is None:
   179     if rule is None:
   174         raise NotFound()
   180         raise NotFound()
   175     rule.active = not rule.active
   181     rule.active = not rule.active
   176     return {'on': rule.active}
   182     return {
   177 
   183         'status': 'success',
   178 
   184         'on': rule.active
   179 @adapter_config(name='chain-unchain', context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable),
   185     }
       
   186 
       
   187 
       
   188 @adapter_config(name='chain-unchain',
       
   189                 context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable),
   180                 provides=IColumn)
   190                 provides=IColumn)
   181 class RedirectionsContainerChainedColumn(AttributeSwitcherColumn):
   191 class RedirectionsContainerChainedColumn(AttributeSwitcherColumn):
   182     """Redirections container chained switcher column"""
   192     """Redirections container chained switcher column"""
   183 
   193 
   184     switch_attribute = 'chained'
   194     switch_attribute = 'chained'
   201         raise NotFound()
   211         raise NotFound()
   202     rule.chained = not rule.chained
   212     rule.chained = not rule.chained
   203     return {'chained': rule.chained}
   213     return {'chained': rule.chained}
   204 
   214 
   205 
   215 
   206 @adapter_config(name='name', context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable),
   216 @adapter_config(name='name',
       
   217                 context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable),
   207                 provides=IColumn)
   218                 provides=IColumn)
   208 class RedirectionsContainerNameColumn(I18nColumn, GetAttrColumn):
   219 class RedirectionsContainerNameColumn(I18nColumn, GetAttrColumn):
   209     """Redirections container name column"""
   220     """Redirections container name column"""
   210 
   221 
   211     _header = _("URL pattern")
   222     _header = _("URL pattern")
   214 
   225 
   215 
   226 
   216 MISSING_TARGET = object()
   227 MISSING_TARGET = object()
   217 
   228 
   218 
   229 
   219 @adapter_config(name='visible', context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable),
   230 @adapter_config(name='visible',
       
   231                 context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable),
   220                 provides=IColumn)
   232                 provides=IColumn)
   221 class RedirectionsContainerVisibleColumn(ImageColumn):
   233 class RedirectionsContainerVisibleColumn(ImageColumn):
   222     """Redirections container visible column"""
   234     """Redirections container visible column"""
   223 
   235 
   224     cssClasses = {'th': 'action', 'td': 'action'}
   236     cssClasses = {'th': 'action', 'td': 'action'}
   276             return self.request.localizer.translate(hint)
   288             return self.request.localizer.translate(hint)
   277         else:
   289         else:
   278             return self.request.localizer.translate(_("External link"))
   290             return self.request.localizer.translate(_("External link"))
   279 
   291 
   280 
   292 
   281 @adapter_config(name='target', context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable),
   293 @adapter_config(name='target',
       
   294                 context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable),
   282                 provides=IColumn)
   295                 provides=IColumn)
   283 class RedirectionsContainerTargetColumn(I18nColumn, GetAttrColumn):
   296 class RedirectionsContainerTargetColumn(I18nColumn, GetAttrColumn):
   284     """Redirections container target column"""
   297     """Redirections container target column"""
   285 
   298 
   286     _header = _("Target")
   299     _header = _("Target")
   297                 return self.request.localizer.translate(_("Internal reference: {0} (not found)")).format(obj.reference)
   310                 return self.request.localizer.translate(_("Internal reference: {0} (not found)")).format(obj.reference)
   298         else:
   311         else:
   299             return super(RedirectionsContainerTargetColumn, self).getValue(obj)
   312             return super(RedirectionsContainerTargetColumn, self).getValue(obj)
   300 
   313 
   301 
   314 
   302 @adapter_config(name='trash', context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable),
   315 @adapter_config(name='trash',
       
   316                 context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable),
   303                 provides=IColumn)
   317                 provides=IColumn)
   304 class RedirectionsContainerTrashColumn(TrashColumn):
   318 class RedirectionsContainerTrashColumn(TrashColumn):
   305     """Redirections container trash column"""
   319     """Redirections container trash column"""
   306 
   320 
   307     permission = MANAGE_SITE_ROOT_PERMISSION
   321     permission = MANAGE_SITE_ROOT_PERMISSION
   314 
   328 
   315     title = _("Redirections list")
   329     title = _("Redirections list")
   316     table_class = RedirectionsContainerTable
   330     table_class = RedirectionsContainerTable
   317 
   331 
   318 
   332 
   319 @adapter_config(context=(IRedirectionManagerTarget, IAdminLayer, RedirectionsContainerView), provides=IPageHeader)
   333 @adapter_config(context=(IRedirectionManagerTarget, IAdminLayer, RedirectionsContainerView),
       
   334                 provides=IPageHeader)
   320 class RedirectionsContainerViewHeaderAdapter(DefaultPageHeaderAdapter):
   335 class RedirectionsContainerViewHeaderAdapter(DefaultPageHeaderAdapter):
   321     """Redirections container view header adapter"""
   336     """Redirections container view header adapter"""
   322 
   337 
   323     icon_class = 'fa fa-fw fa-map-signs'
   338     icon_class = 'fa fa-fw fa-map-signs'
   324 
   339 
   325 
   340 
   326 @adapter_config(context=(IRedirectionManagerTarget, IAdminLayer, RedirectionsContainerView), provides=IContentHelp)
   341 @adapter_config(context=(IRedirectionManagerTarget, IAdminLayer, RedirectionsContainerView),
       
   342                 provides=IContentHelp)
   327 class RedirectionsContainerHelpAdapter(ContentHelp):
   343 class RedirectionsContainerHelpAdapter(ContentHelp):
   328     """Redirections container help adapter"""
   344     """Redirections container help adapter"""
   329 
   345 
   330     header = _("Redirection rules")
   346     header = _("Redirection rules")
   331     message = _("""Redirection rules are use to handle redirections responses when a request generates 
   347     message = _("""Redirection rules are use to handle redirections responses when a request generates 
   381 
   397 
   382     close = CloseButton(name='close', title=_("Close"))
   398     close = CloseButton(name='close', title=_("Close"))
   383     test = button.Button(name='test', title=_("Test rules"))
   399     test = button.Button(name='test', title=_("Test rules"))
   384 
   400 
   385 
   401 
   386 @pagelet_config(name='test-redirection-rules.html', context=IRedirectionManagerTarget, layer=IPyAMSLayer,
   402 @pagelet_config(name='test-redirection-rules.html', context=IRedirectionManagerTarget,
   387                 permission=MANAGE_SITE_ROOT_PERMISSION)
   403                 layer=IPyAMSLayer, permission=MANAGE_SITE_ROOT_PERMISSION)
   388 class RedirectionsContainerTestForm(AdminDialogAddForm):
   404 class RedirectionsContainerTestForm(AdminDialogAddForm):
   389     """Redirections container test form"""
   405     """Redirections container test form"""
   390 
   406 
   391     dialog_class = 'modal-max'
   407     dialog_class = 'modal-max'
   392     legend = _("Test redirection rules")
   408     legend = _("Test redirection rules")
   409 
   425 
   410     def createAndAdd(self, data):
   426     def createAndAdd(self, data):
   411         data = data.get(self, data)
   427         data = data.get(self, data)
   412         request = copy_request(self.request)
   428         request = copy_request(self.request)
   413         apply_skin(request, IUserSkinnable(self.context).get_skin())
   429         apply_skin(request, IUserSkinnable(self.context).get_skin())
   414         return IRedirectionManager(self.context).test_rules(data['source_url'], request, data['check_inactive_rules'])
   430         return IRedirectionManager(self.context).test_rules(data['source_url'], request,
   415 
   431                                                             data['check_inactive_rules'])
   416 
   432 
   417 @viewlet_config(name='test-indexer-process.suffix', layer=IAdminLayer, manager=IWidgetsSuffixViewletsManager,
   433 
   418                 view=RedirectionsContainerTestForm, weight=50)
   434 @viewlet_config(name='test-indexer-process.suffix', layer=IAdminLayer,
       
   435                 manager=IWidgetsSuffixViewletsManager, view=RedirectionsContainerTestForm,
       
   436                 weight=50)
   419 @template_config(template='templates/manager-test.pt')
   437 @template_config(template='templates/manager-test.pt')
   420 class RedirectionsContainerTestSuffix(Viewlet):
   438 class RedirectionsContainerTestSuffix(Viewlet):
   421     """Redirections container test form suffix"""
   439     """Redirections container test form suffix"""
   422 
   440 
   423 
   441 
   424 @view_config(name='test-redirection-rules.json', context=IRedirectionManagerTarget, request_type=IPyAMSLayer,
   442 @view_config(name='test-redirection-rules.json', context=IRedirectionManagerTarget,
   425              permission=MANAGE_SITE_ROOT_PERMISSION, renderer='json', xhr=True)
   443              request_type=IPyAMSLayer, permission=MANAGE_SITE_ROOT_PERMISSION,
       
   444              renderer='json', xhr=True)
   426 class RedirectionsContainerAJAXTestForm(AJAXAddForm, RedirectionsContainerTestForm):
   445 class RedirectionsContainerAJAXTestForm(AJAXAddForm, RedirectionsContainerTestForm):
   427     """Redirections container test form, JSON renderer"""
   446     """Redirections container test form, JSON renderer"""
   428 
   447 
   429     def get_ajax_output(self, changes):
   448     def get_ajax_output(self, changes):
   430         message = []
   449         message = []
   433             if not message:
   452             if not message:
   434                 message.append('{:<40} | {:<40} | {:<40}'.format(translate(_("Input URL")),
   453                 message.append('{:<40} | {:<40} | {:<40}'.format(translate(_("Input URL")),
   435                                                                  translate(_("URL pattern")),
   454                                                                  translate(_("URL pattern")),
   436                                                                  translate(_("Output URL"))))
   455                                                                  translate(_("Output URL"))))
   437                 message.append('{:<40}-|-{:<40}-|-{:<40}'.format('-' * 40, '-' * 40, '-' * 40))
   456                 message.append('{:<40}-|-{:<40}-|-{:<40}'.format('-' * 40, '-' * 40, '-' * 40))
   438             message.append('{:<40} | {:<40} | {:<40}'.format(source_url, rule.url_pattern, target_url))
   457             message.append('{:<40} | {:<40} | {:<40}'.format(source_url, rule.url_pattern,
       
   458                                                              target_url))
   439         if not message:
   459         if not message:
   440             message.append(translate(_("No matching rule!")))
   460             message.append(translate(_("No matching rule!")))
   441         return {
   461         return {
   442             'status': 'success',
   462             'status': 'success',
   443             'content': {'html': '\n'.join(message)},
   463             'content': {'html': '\n'.join(message)},