src/pyams_gis/zmi/utility.py
changeset 0 c73bb834ccbe
child 5 2c525ccb478c
equal deleted inserted replaced
-1:000000000000 0:c73bb834ccbe
       
     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_gis.interfaces.configuration import IMapConfiguration
       
    20 from pyams_gis.interfaces.utility import IMapManager
       
    21 from pyams_gis.zmi.interfaces import IMapManagerMenu
       
    22 from pyams_skin.interfaces import IInnerPage, IPageHeader
       
    23 from pyams_skin.interfaces.container import ITableElementEditor
       
    24 from pyams_skin.layer import IPyAMSLayer
       
    25 from pyams_utils.interfaces import MANAGE_SYSTEM_PERMISSION, VIEW_SYSTEM_PERMISSION
       
    26 from pyams_zmi.interfaces.menu import IControlPanelMenu
       
    27 from pyams_zmi.layer import IAdminLayer
       
    28 from z3c.table.interfaces import IColumn, IValues
       
    29 from zope.component.interfaces import ISite
       
    30 
       
    31 # import packages
       
    32 from pyams_form.form import AJAXEditForm
       
    33 from pyams_i18n.column import I18nAttrColumn
       
    34 from pyams_pagelet.pagelet import pagelet_config
       
    35 from pyams_skin.container import ContainerView
       
    36 from pyams_skin.page import DefaultPageHeaderAdapter
       
    37 from pyams_skin.table import DefaultElementEditorAdapter, BaseTable, I18nColumn, TrashColumn
       
    38 from pyams_skin.viewlet.menu import MenuItem
       
    39 from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter
       
    40 from pyams_utils.registry import query_utility
       
    41 from pyams_utils.traversing import get_parent
       
    42 from pyams_utils.url import absolute_url
       
    43 from pyams_viewlet.manager import viewletmanager_config
       
    44 from pyams_viewlet.viewlet import viewlet_config
       
    45 from pyams_zmi.form import AdminDialogEditForm
       
    46 from pyams_zmi.view import AdminView
       
    47 from pyramid.url import resource_url
       
    48 from pyramid.view import view_config
       
    49 from z3c.form import field
       
    50 from z3c.table.column import GetAttrColumn
       
    51 from zope.interface import implementer, Interface
       
    52 
       
    53 from pyams_gis import _
       
    54 
       
    55 
       
    56 @adapter_config(context=(IMapManager, IAdminLayer, Interface), provides=ITableElementEditor)
       
    57 class MapManagerTableElementEditor(DefaultElementEditorAdapter):
       
    58     """Map manager table element editor"""
       
    59 
       
    60     view_name = 'map-manager.html'
       
    61     modal_target = False
       
    62 
       
    63     @property
       
    64     def url(self):
       
    65         site = get_parent(self.context, ISite)
       
    66         return resource_url(site, self.request, 'admin#{0}'.format(self.view_name))
       
    67 
       
    68 
       
    69 @viewlet_config(name='map-manager.menu', context=ISite, layer=IAdminLayer, manager=IControlPanelMenu,
       
    70                 permission=VIEW_SYSTEM_PERMISSION, weight=6)
       
    71 @viewletmanager_config(name='map-manager.menu', context=ISite, layer=IAdminLayer)
       
    72 @implementer(IMapManagerMenu)
       
    73 class MapManagerMenuItem(MenuItem):
       
    74     """Map manager menu"""
       
    75 
       
    76     label = _("Maps manager")
       
    77     icon_class = 'fa-map-marker'
       
    78     url = '#map-manager.html'
       
    79 
       
    80 
       
    81 class MapManagerLayersTable(BaseTable):
       
    82     """Map manager layers table"""
       
    83 
       
    84     id = 'map_manager_layers_table'
       
    85     title = _("Map manager layers")
       
    86 
       
    87     @property
       
    88     def data_attributes(self):
       
    89         manager = query_utility(IMapManager)
       
    90         attributes = super(MapManagerLayersTable, self).data_attributes
       
    91         table_attrs = {'data-ams-location': absolute_url(manager, self.request),
       
    92                        'data-ams-delete-target': 'delete-layer.json'}
       
    93         if 'table' in attributes:
       
    94             attributes['table'].update(table_attrs)
       
    95         else:
       
    96             attributes['table'] = table_attrs
       
    97         return attributes
       
    98 
       
    99 
       
   100 @adapter_config(name='name', context=(Interface, IAdminLayer, MapManagerLayersTable), provides=IColumn)
       
   101 class MapManagerLayersNameColumn(I18nColumn, GetAttrColumn):
       
   102     """Map manager layers name column"""
       
   103 
       
   104     _header = _("Name")
       
   105     attrName = 'name'
       
   106     weight = 10
       
   107 
       
   108 
       
   109 @adapter_config(name='layer_type', context=(Interface, IAdminLayer, MapManagerLayersTable), provides=IColumn)
       
   110 class MapManagerLayersTypeColumn(I18nColumn, GetAttrColumn):
       
   111     """Map manager layers type column"""
       
   112 
       
   113     _header = _("Type")
       
   114     attrName = 'layer_type'
       
   115     weight = 15
       
   116     
       
   117     def getValue(self, obj):
       
   118         return self.request.localizer.translate(super(MapManagerLayersTypeColumn, self).getValue(obj))
       
   119 
       
   120 
       
   121 @adapter_config(name='title', context=(Interface, IAdminLayer, MapManagerLayersTable), provides=IColumn)
       
   122 class MapManagerLayersTitleColumn(I18nColumn, I18nAttrColumn):
       
   123     """Map manager layers title column"""
       
   124 
       
   125     _header = _("Title")
       
   126     attrName = 'title'
       
   127     defaultValue = '--'
       
   128     weight = 20
       
   129 
       
   130 
       
   131 @adapter_config(name='trash', context=(Interface, IAdminLayer, MapManagerLayersTable), provides=IColumn)
       
   132 class MapManagerLayersTrashCOlumn(TrashColumn):
       
   133     """Map manager layer trash column"""
       
   134 
       
   135     icon_hint = _("Delete layer")
       
   136     permission = MANAGE_SYSTEM_PERMISSION
       
   137 
       
   138 
       
   139 @adapter_config(context=(ISite, IAdminLayer, MapManagerLayersTable), provides=IValues)
       
   140 class MapManagerValuesAdapter(ContextRequestViewAdapter):
       
   141     """Map manager layers table values adapter"""
       
   142 
       
   143     @property
       
   144     def values(self):
       
   145         manager = query_utility(IMapManager)
       
   146         if manager is not None:
       
   147             return list(manager.values())
       
   148         return ()
       
   149 
       
   150 
       
   151 @pagelet_config(name='map-manager.html', context=ISite, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
       
   152 @implementer(IInnerPage)
       
   153 class MapManagerView(AdminView, ContainerView):
       
   154     """Map manager layers view"""
       
   155 
       
   156     table_class = MapManagerLayersTable
       
   157 
       
   158 
       
   159 @adapter_config(context=(ISite, IAdminLayer, MapManagerView), provides=IPageHeader)
       
   160 class MapManagerHeaderAdapter(DefaultPageHeaderAdapter):
       
   161     """Map manager view header adapter"""
       
   162 
       
   163     icon_class = 'fa fa-fw fa-map-marker'
       
   164     title = _("Control panel")
       
   165     subtitle = _("Maps manager")
       
   166 
       
   167 
       
   168 @viewlet_config(name='map-manager.configuration.menu', context=ISite, layer=IAdminLayer,
       
   169                 manager=IMapManagerMenu, permission=VIEW_SYSTEM_PERMISSION, weight=1)
       
   170 class MapManagerConfigurationMenuItem(MenuItem):
       
   171     """Map manager properties menu"""
       
   172 
       
   173     label = _("Configuration...")
       
   174     url = 'configuration.html'
       
   175     modal_target = True
       
   176 
       
   177     def get_url(self):
       
   178         manager = query_utility(IMapManager)
       
   179         return resource_url(manager, self.request, self.url)
       
   180 
       
   181 
       
   182 @pagelet_config(name='configuration.html', context=IMapManager, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
       
   183 class MapManagerConfigurationEditForm(AdminDialogEditForm):
       
   184     """Map manager edit form"""
       
   185 
       
   186     title = _("Maps manager")
       
   187     legend = _("Default map configuration")
       
   188     icon_css_class = 'fa fa-fw fa-map-marker'
       
   189     dialog_class = 'modal-large'
       
   190 
       
   191     fields = field.Fields(IMapConfiguration)
       
   192 
       
   193     ajax_handler = 'configuration.json'
       
   194     edit_permission = MANAGE_SYSTEM_PERMISSION
       
   195 
       
   196     def getContent(self):
       
   197         return query_utility(IMapManager)
       
   198 
       
   199 
       
   200 @view_config(name='configuration.json', context=IMapManager, request_type=IPyAMSLayer,
       
   201              permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True)
       
   202 class MapManagerConfigurationAJAXEditForm(AJAXEditForm, MapManagerConfigurationEditForm):
       
   203     """Map manager edit form, JSON renderer"""
       
   204 
       
   205 
       
   206 @view_config(name='delete-layer.json', context=IMapManager, request_type=IPyAMSLayer,
       
   207              permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True)
       
   208 def delete_map_manager_layer(request):
       
   209     """Delete layer from map manager"""
       
   210     translate = request.localizer.translate
       
   211     name = request.params.get('object_name')
       
   212     if not name:
       
   213         return {'status': 'message',
       
   214                 'messagebox': {'status': 'error',
       
   215                                'content': translate(_("No provided object_name argument!"))}}
       
   216     if name not in request.context:
       
   217         return {'status': 'message',
       
   218                 'messagebox': {'status': 'error',
       
   219                                'content': translate(_("Given layer name doesn't exist!"))}}
       
   220     del request.context[name]
       
   221     return {'status': 'success'}
       
   222 
       
   223 
       
   224 @view_config(name='get-map-configuration.json', context=Interface, request_type=IPyAMSLayer,
       
   225              renderer='json', xhr=True)
       
   226 def get_map_configuration(request):
       
   227     """Get map configuration in JSON format"""
       
   228     manager = query_utility(IMapManager)
       
   229     if manager is not None:
       
   230         configuration = IMapConfiguration(manager)
       
   231         if configuration is not None:
       
   232             return configuration.get_configuration()