src/pyams_content/shared/blog/zmi/manager.py
changeset 1394 ed31bfceddda
parent 1070 ea0c7ac589c4
child 1429 9b93fdd5ba30
equal deleted inserted replaced
1393:9479901b53a5 1394:ed31bfceddda
     8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
     9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
    10 # FOR A PARTICULAR PURPOSE.
    10 # FOR A PARTICULAR PURPOSE.
    11 #
    11 #
    12 
    12 
    13 __docformat__ = 'restructuredtext'
       
    14 
       
    15 from datetime import datetime
    13 from datetime import datetime
    16 
    14 
    17 from pyramid.events import subscriber
    15 from pyramid.events import subscriber
    18 from pyramid.path import DottedNameResolver
    16 from pyramid.path import DottedNameResolver
    19 from z3c.form import field
    17 from z3c.form import field
    20 from z3c.form.interfaces import IDataExtractedEvent
    18 from z3c.form.interfaces import IDataExtractedEvent
    21 from zope.interface import Invalid
    19 from zope.interface import Invalid
    22 
    20 
    23 from pyams_content.interfaces import MANAGE_SITE_ROOT_PERMISSION, MANAGE_SITE_PERMISSION, MANAGE_TOOL_PERMISSION
    21 from pyams_content.interfaces import MANAGE_SITE_PERMISSION, MANAGE_SITE_ROOT_PERMISSION, \
       
    22     MANAGE_TOOL_PERMISSION
    24 from pyams_content.root.interfaces import ISiteRoot
    23 from pyams_content.root.interfaces import ISiteRoot
    25 from pyams_content.shared.blog.interfaces import IBlogManager, IBlogManagerFactory
    24 from pyams_content.shared.blog.interfaces import IBlogManager, IBlogManagerFactory
    26 from pyams_content.shared.blog.manager import BlogManager
    25 from pyams_content.shared.blog.manager import BlogManager
    27 from pyams_content.shared.common import IBaseSharedTool
    26 from pyams_content.shared.common import IBaseSharedTool, IDashboardTypeColumnValue
       
    27 from pyams_content.shared.common.interfaces.zmi import IDashboardTable
    28 from pyams_content.shared.common.zmi.manager import SharedToolPropertiesEditForm
    28 from pyams_content.shared.common.zmi.manager import SharedToolPropertiesEditForm
    29 from pyams_content.zmi.interfaces import ISiteTreeTable, IUserAddingsMenuLabel
    29 from pyams_content.zmi.interfaces import ISiteTreeTable, IUserAddingsMenuLabel
    30 from pyams_form.form import AJAXAddForm, ajax_config
    30 from pyams_form.form import AJAXAddForm, ajax_config
    31 from pyams_i18n.interfaces import II18n, INegotiator
    31 from pyams_i18n.interfaces import II18n, INegotiator
    32 from pyams_pagelet.pagelet import pagelet_config
    32 from pyams_pagelet.pagelet import pagelet_config
    33 from pyams_skin.interfaces.container import ITableElementEditor
    33 from pyams_skin.interfaces.container import ITableElementEditor
    34 from pyams_skin.interfaces.viewlet import IToolbarAddingMenu, ITableItemColumnActionsMenu, IMenuHeader
    34 from pyams_skin.interfaces.viewlet import IMenuHeader, ITableItemColumnActionsMenu, \
       
    35     IToolbarAddingMenu
    35 from pyams_skin.layer import IPyAMSLayer
    36 from pyams_skin.layer import IPyAMSLayer
    36 from pyams_skin.table import DefaultElementEditorAdapter
    37 from pyams_skin.table import DefaultElementEditorAdapter
    37 from pyams_skin.viewlet.menu import MenuItem
    38 from pyams_skin.viewlet.menu import MenuItem
    38 from pyams_skin.viewlet.toolbar import ToolbarMenuItem
    39 from pyams_skin.viewlet.toolbar import ToolbarMenuItem
    39 from pyams_utils.adapter import adapter_config, ContextRequestAdapter
    40 from pyams_utils.adapter import ContextRequestAdapter, adapter_config
    40 from pyams_utils.registry import query_utility
    41 from pyams_utils.registry import query_utility
    41 from pyams_utils.timezone import tztime
    42 from pyams_utils.timezone import tztime
    42 from pyams_utils.unicode import translate_string
    43 from pyams_utils.unicode import translate_string
    43 from pyams_utils.url import absolute_url
    44 from pyams_utils.url import absolute_url
    44 from pyams_viewlet.viewlet import viewlet_config
    45 from pyams_viewlet.viewlet import viewlet_config
    45 from pyams_workflow.interfaces import IWorkflowPublicationInfo
    46 from pyams_workflow.interfaces import IWorkflowPublicationInfo
    46 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm
    47 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm
    47 from pyams_zmi.interfaces.menu import IPropertiesMenu, ISiteManagementMenu
    48 from pyams_zmi.interfaces.menu import IPropertiesMenu, ISiteManagementMenu
    48 from pyams_zmi.layer import IAdminLayer
    49 from pyams_zmi.layer import IAdminLayer
    49 
    50 
       
    51 
       
    52 __docformat__ = 'restructuredtext'
       
    53 
    50 from pyams_content import _
    54 from pyams_content import _
       
    55 
       
    56 
       
    57 @adapter_config(context=(IDashboardTable, IPyAMSLayer, IBlogManager),
       
    58                 provides=IDashboardTypeColumnValue)
       
    59 def blog_manager_dashboard_type(context, request):
       
    60     """Blog manager dashboard type column adapter"""
       
    61     return request.localizer.translate(context.content_name)
    51 
    62 
    52 
    63 
    53 @adapter_config(context=(IBlogManager, ISiteManagementMenu), provides=IMenuHeader)
    64 @adapter_config(context=(IBlogManager, ISiteManagementMenu), provides=IMenuHeader)
    54 class BlogManagerSiteManagementMenuHeader(ContextRequestAdapter):
    65 class BlogManagerSiteManagementMenuHeader(ContextRequestAdapter):
    55     """Blog manager site management menu header adapter"""
    66     """Blog manager site management menu header adapter"""
    66     """Blog manager user addings menu label adapter"""
    77     """Blog manager user addings menu label adapter"""
    67 
    78 
    68     @property
    79     @property
    69     def label(self):
    80     def label(self):
    70         return '{content} ({blog})'.format(
    81         return '{content} ({blog})'.format(
    71             content=self.request.localizer.translate(self.context.shared_content_factory.content_class.content_name),
    82             content=self.request.localizer.translate(
       
    83                 self.context.shared_content_factory.content_class.content_name),
    72             blog=II18n(self.context).query_attribute('title', request=self.request))
    84             blog=II18n(self.context).query_attribute('title', request=self.request))
    73 
    85 
    74 
    86 
    75 @viewlet_config(name='add-blog-manager.menu', context=ISiteRoot, layer=IAdminLayer,
    87 @viewlet_config(name='add-blog-manager.menu', context=ISiteRoot, layer=IAdminLayer,
    76                 view=ISiteTreeTable, manager=IToolbarAddingMenu, permission=MANAGE_SITE_ROOT_PERMISSION)
    88                 view=ISiteTreeTable, manager=IToolbarAddingMenu,
       
    89                 permission=MANAGE_SITE_ROOT_PERMISSION)
    77 class BlogManagerAddMenu(ToolbarMenuItem):
    90 class BlogManagerAddMenu(ToolbarMenuItem):
    78     """Blog manager add menu"""
    91     """Blog manager add menu"""
    79 
    92 
    80     label = _("Add blog manager")
    93     label = _("Add blog manager")
    81     label_css_class = 'fa fa-fw fa-tags'
    94     label_css_class = 'fa fa-fw fa-tags'
   119     """Handle new blog manager data extraction"""
   132     """Handle new blog manager data extraction"""
   120     container = event.form.context
   133     container = event.form.context
   121     negotiator = query_utility(INegotiator)
   134     negotiator = query_utility(INegotiator)
   122     short_name = event.data['short_name'].get(negotiator.server_language)
   135     short_name = event.data['short_name'].get(negotiator.server_language)
   123     if not short_name:
   136     if not short_name:
   124         event.form.widgets.errors += (Invalid(_("You must provide a short name for default server language!")),)
   137         event.form.widgets.errors += (Invalid(_("You must provide a short name for default "
       
   138                                                 "server language!")),)
   125         return
   139         return
   126     name = translate_string(short_name, force_lower=True, spaces='-')
   140     name = translate_string(short_name, force_lower=True, spaces='-')
   127     if name in container:
   141     if name in container:
   128         event.form.widgets.errors += (Invalid(_("Specified blog manager name is already used!")),)
   142         event.form.widgets.errors += (Invalid(_("Specified blog manager name is already "
       
   143                                                 "used!")),)
   129         return
   144         return
   130     blog = query_utility(IBlogManager, name=short_name)
   145     blog = query_utility(IBlogManager, name=short_name)
   131     if blog is not None:
   146     if blog is not None:
   132         event.form.widgets.errors += (Invalid(_("A blog manager is already registered with this name!!")),)
   147         event.form.widgets.errors += (Invalid(_("A blog manager is already registered with "
   133 
   148                                                 "this name!!")),)
   134 
   149 
   135 @adapter_config(context=(IBlogManager, IAdminLayer, ISiteTreeTable), provides=ITableElementEditor)
   150 
       
   151 @adapter_config(context=(IBlogManager, IAdminLayer, ISiteTreeTable),
       
   152                 provides=ITableElementEditor)
   136 class BlogManagerTableElementEditor(DefaultElementEditorAdapter):
   153 class BlogManagerTableElementEditor(DefaultElementEditorAdapter):
   137     """Blog manager table element editor"""
   154     """Blog manager table element editor"""
   138 
   155 
   139     view_name = 'admin'
   156     view_name = 'admin'
   140     modal_target = False
   157     modal_target = False
   141 
   158 
   142 
   159 
   143 @pagelet_config(name='properties.html', context=IBlogManager, layer=IPyAMSLayer, permission=MANAGE_TOOL_PERMISSION)
   160 @pagelet_config(name='properties.html', context=IBlogManager, layer=IPyAMSLayer,
       
   161                 permission=MANAGE_TOOL_PERMISSION)
   144 @ajax_config(name='properties.json', context=IBlogManager, layer=IPyAMSLayer)
   162 @ajax_config(name='properties.json', context=IBlogManager, layer=IPyAMSLayer)
   145 class BlogManagerPropertiesEditForm(SharedToolPropertiesEditForm):
   163 class BlogManagerPropertiesEditForm(SharedToolPropertiesEditForm):
   146     """Site folder properties edit form"""
   164     """Site folder properties edit form"""
   147 
   165 
   148     legend = _("Blog properties")
   166     legend = _("Blog properties")
   149 
   167 
   150     fields = field.Fields(IBlogManager).select('title', 'short_name', 'description', 'notepad') + \
   168     fields = field.Fields(IBlogManager).select('title', 'short_name', 'description',
       
   169                                                'notepad') + \
   151         field.Fields(IBaseSharedTool).select('shared_content_workflow')
   170         field.Fields(IBaseSharedTool).select('shared_content_workflow')
   152 
   171 
   153 
   172 
   154 #
   173 #
   155 # Blog manager publication views
   174 # Blog manager publication views
   156 #
   175 #
   157 
   176 
   158 @viewlet_config(name='workflow-publication.menu', context=IBlogManager, layer=IPyAMSLayer, view=ISiteTreeTable,
   177 @viewlet_config(name='workflow-publication.menu', context=IBlogManager, layer=IPyAMSLayer,
   159                 manager=ITableItemColumnActionsMenu, permission=MANAGE_SITE_PERMISSION, weight=210)
   178                 view=ISiteTreeTable, manager=ITableItemColumnActionsMenu,
       
   179                 permission=MANAGE_SITE_PERMISSION, weight=210)
   160 class BlogManagerTableItemWorkflowPublicationMenu(ToolbarMenuItem):
   180 class BlogManagerTableItemWorkflowPublicationMenu(ToolbarMenuItem):
   161     """Blog manager tree item workflow publication menu"""
   181     """Blog manager tree item workflow publication menu"""
   162 
   182 
   163     label = _("Publication dates...")
   183     label = _("Publication dates...")
   164     label_css_class = 'fa fa-fw fa-eye'
   184     label_css_class = 'fa fa-fw fa-eye'
   165     url = 'workflow-publication.html'
   185     url = 'workflow-publication.html'
   166     modal_target = True
   186     modal_target = True
   167     stop_propagation = True
   187     stop_propagation = True
   168 
   188 
   169 
   189 
   170 @viewlet_config(name='workflow-publication.menu', context=IBlogManager, layer=IAdminLayer, manager=IPropertiesMenu,
   190 @viewlet_config(name='workflow-publication.menu', context=IBlogManager, layer=IAdminLayer,
   171                 permission=MANAGE_SITE_PERMISSION, weight=210)
   191                 manager=IPropertiesMenu, permission=MANAGE_SITE_PERMISSION, weight=210)
   172 class BlogManagerWorkflowPublicationMenu(MenuItem):
   192 class BlogManagerWorkflowPublicationMenu(MenuItem):
   173     """Blog manager workflow publication menu"""
   193     """Blog manager workflow publication menu"""
   174 
   194 
   175     label = _("Publication dates...")
   195     label = _("Publication dates...")
   176     icon_class = 'fa-eye'
   196     icon_class = 'fa-eye'
   186 
   206 
   187     prefix = 'blog_publication.'
   207     prefix = 'blog_publication.'
   188 
   208 
   189     legend = _("Update publication dates")
   209     legend = _("Update publication dates")
   190 
   210 
   191     fields = field.Fields(IWorkflowPublicationInfo).select('publication_effective_date', 'publication_expiration_date')
   211     fields = field.Fields(IWorkflowPublicationInfo).select('publication_effective_date',
       
   212                                                            'publication_expiration_date')
   192     edit_permission = MANAGE_SITE_PERMISSION
   213     edit_permission = MANAGE_SITE_PERMISSION
   193 
   214 
   194     def updateWidgets(self, prefix=None):
   215     def updateWidgets(self, prefix=None):
   195         super(BlogManagerWorkflowPublicationEditForm, self).updateWidgets(prefix)
   216         super(BlogManagerWorkflowPublicationEditForm, self).updateWidgets(prefix)
   196         if 'publication_effective_date' in self.widgets:
   217         if 'publication_effective_date' in self.widgets:
   197             pub_info = IWorkflowPublicationInfo(self.context)
   218             pub_info = IWorkflowPublicationInfo(self.context)
   198             if pub_info.publication_effective_date is None:
   219             if pub_info.publication_effective_date is None:
   199                 self.widgets['publication_effective_date'].value = tztime(datetime.utcnow()).strftime('%d/%m/%y %H:%M')
   220                 self.widgets['publication_effective_date'].value = \
       
   221                     tztime(datetime.utcnow()).strftime('%d/%m/%y %H:%M')