src/pyams_content/shared/site/zmi/manager.py
changeset 277 9649f8ce3b1c
child 279 c31da1985a3b
equal deleted inserted replaced
276:78422a1c4228 277:9649f8ce3b1c
       
     1 #
       
     2 # Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
       
     3 # All Rights Reserved.
       
     4 #
       
     5 # This software is subject to the provisions of the Zope Public License,
       
     6 # Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
       
     7 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
       
     8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
       
     9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
       
    10 # FOR A PARTICULAR PURPOSE.
       
    11 #
       
    12 
       
    13 __docformat__ = 'restructuredtext'
       
    14 
       
    15 
       
    16 # import standard library
       
    17 
       
    18 # import interfaces
       
    19 from pyams_content.interfaces import MANAGE_SITE_ROOT_PERMISSION
       
    20 from pyams_content.root.interfaces import ISiteRoot
       
    21 from pyams_content.shared.site.interfaces import ISiteManager
       
    22 from pyams_content.zmi.interfaces import IUserAddingsMenuLabel
       
    23 from pyams_i18n.interfaces import II18n, INegotiator
       
    24 from pyams_skin.interfaces.container import ITableElementEditor
       
    25 from pyams_skin.interfaces.viewlet import IToolbarAddingMenu
       
    26 from pyams_skin.layer import IPyAMSLayer
       
    27 from pyams_zmi.layer import IAdminLayer
       
    28 from z3c.form.interfaces import IDataExtractedEvent
       
    29 
       
    30 # import packages
       
    31 from pyams_content.shared.site.manager import SiteManager
       
    32 from pyams_content.shared.zmi.sites import SiteTreeTable
       
    33 from pyams_form.form import AJAXAddForm
       
    34 from pyams_pagelet.pagelet import pagelet_config
       
    35 from pyams_skin.table import DefaultElementEditorAdapter
       
    36 from pyams_skin.viewlet.toolbar import ToolbarMenuItem
       
    37 from pyams_utils.adapter import adapter_config, ContextRequestAdapter
       
    38 from pyams_utils.registry import query_utility
       
    39 from pyams_utils.unicode import translate_string
       
    40 from pyams_utils.url import absolute_url
       
    41 from pyams_viewlet.viewlet import viewlet_config
       
    42 from pyams_zmi.form import AdminDialogAddForm
       
    43 from pyramid.events import subscriber
       
    44 from pyramid.view import view_config
       
    45 from z3c.form import field
       
    46 from zope.interface import Invalid
       
    47 
       
    48 from pyams_content import _
       
    49 
       
    50 
       
    51 @adapter_config(context=(ISiteManager, IAdminLayer), provides=IUserAddingsMenuLabel)
       
    52 class SiteManageruserAddingsMenuLabelAdapter(ContextRequestAdapter):
       
    53     """Site manager user addings menu label adapter"""
       
    54 
       
    55     @property
       
    56     def label(self):
       
    57         return '{content} ({blog})'.format(
       
    58             content=self.request.localizer.translate(self.context.shared_content_factory.content_class.content_name),
       
    59             blog=II18n(self.context).query_attribute('title', request=self.request))
       
    60 
       
    61 
       
    62 @viewlet_config(name='add-site-manager.menu', context=ISiteRoot, layer=IAdminLayer,
       
    63                 view=SiteTreeTable, manager=IToolbarAddingMenu, permission=MANAGE_SITE_ROOT_PERMISSION)
       
    64 class SiteManagerAddMenu(ToolbarMenuItem):
       
    65     """Site manager add menu"""
       
    66 
       
    67     label = _("Add site manager")
       
    68     label_css_class = 'fa fa-fw fa-sitemap'
       
    69     url = 'add-site-manager.html'
       
    70     modal_target = True
       
    71 
       
    72 
       
    73 @pagelet_config(name='add-site-manager.html', context=ISiteRoot, layer=IPyAMSLayer,
       
    74                 permission=MANAGE_SITE_ROOT_PERMISSION)
       
    75 class SiteManagerAddForm(AdminDialogAddForm):
       
    76     """Site manager add form"""
       
    77 
       
    78     title = _("Site manager")
       
    79     legend = _("Add site manager")
       
    80     icon_css_class = 'fa fa-fw fa-sitemap'
       
    81 
       
    82     fields = field.Fields(ISiteManager).select('title', 'short_name')
       
    83     ajax_handler = 'add-site-manager.json'
       
    84     edit_permission = None
       
    85 
       
    86     def create(self, data):
       
    87         return SiteManager()
       
    88 
       
    89     def add(self, object):
       
    90         short_name = II18n(object).query_attribute('short_name', request=self.request)
       
    91         name = translate_string(short_name, force_lower=True, spaces='-')
       
    92         self.context[name] = object
       
    93 
       
    94     def nextURL(self):
       
    95         return absolute_url(self.context, self.request, 'site-tree.html')
       
    96 
       
    97 
       
    98 @subscriber(IDataExtractedEvent, form_selector=SiteManagerAddForm)
       
    99 def handle_new_site_manager_data_extraction(event):
       
   100     """Handle new site manager data extraction"""
       
   101     container = event.form.context
       
   102     negotiator = query_utility(INegotiator)
       
   103     short_name = event.data['short_name'].get(negotiator.server_language)
       
   104     if not short_name:
       
   105         event.form.widgets.errors += (Invalid(_("You must provide a short name for default server language!")),)
       
   106         return
       
   107     name = translate_string(short_name, force_lower=True, spaces='-')
       
   108     if name in container:
       
   109         event.form.widgets.errors += (Invalid(_("Specified site manager name is already used!")),)
       
   110         return
       
   111     site = query_utility(ISiteManager, name=short_name)
       
   112     if site is not None:
       
   113         event.form.widgets.errors += (Invalid(_("A site manager is already registered with this name!!")),)
       
   114 
       
   115 
       
   116 @view_config(name='add-site-manager.json', context=ISiteRoot, request_type=IPyAMSLayer,
       
   117              permission=MANAGE_SITE_ROOT_PERMISSION, renderer='json', xhr=True)
       
   118 class SiteManagerAJAXAddForm(AJAXAddForm, SiteManagerAddForm):
       
   119     """Site manager add form, JSOn renderer"""
       
   120 
       
   121 
       
   122 @adapter_config(context=(ISiteManager, IAdminLayer, SiteTreeTable), provides=ITableElementEditor)
       
   123 class SiteManagerTableElementEditor(DefaultElementEditorAdapter):
       
   124     """Site tree table element editor"""
       
   125 
       
   126     view_name = 'admin'
       
   127     modal_target = False