Changeset 809

Show
Ignore:
Timestamp:
05/17/07 16:00:11 (2 years ago)
Author:
sgillies
Message:

IGeoCollectionSimple adapter with new members and info properties

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • Geographer/trunk/configure.zcml

    r808 r809  
    1111  <adapter factory=".geo.GeoContentSimple"/> 
    1212  <adapter factory=".geo.GeoBrainSimple"/> 
     13  <adapter factory=".geo.GeoCollectionSimple"/> 
    1314 
    1415  <five:implements 
     
    2223    /> 
    2324 
     25  <five:implements 
     26    class="Products.ATContentTypes.content.folder.ATFolder" 
     27    interface=".interfaces.IGeoreferenceable" 
     28    /> 
     29 
     30  <five:implements 
     31    class="Products.ATContentTypes.content.topic.ATTopic" 
     32    interface=".interfaces.IGeoreferenceable" 
     33    /> 
     34 
    2435</configure> 
    2536 
  • Geographer/trunk/geo.py

    r808 r809  
    2828# =========================================================================== 
    2929 
    30 from zope.component import adapts, createObject 
     30from zope.component import adapts, createObject, getUtility 
    3131from zope.component.factory import Factory 
    3232from zope.component.interfaces import ComponentLookupError 
     
    4141 
    4242from Products.ZCatalog.CatalogBrains import AbstractCatalogBrain 
     43from Products.CMFCore.interfaces import ICatalogTool 
    4344from Products.CMFPlone import CatalogTool as catalogtool 
     45from Products.ATContentTypes.interface.topic import IATTopic 
     46from Products.ATContentTypes.interface.folder import IATFolder 
    4447 
    4548from Products.Geographer.interfaces import IGeometry, IGeoItemSimple 
     49from Products.Geographer.interfaces import IGeoCollectionSimple 
    4650from Products.Geographer.interfaces import IGeoreferenceable 
    4751from Products.Geographer.interfaces import IReadOnlyGeoreferenceableBrain 
     
    6468    title=u'Create a new geometry property', 
    6569    ) 
    66  
    6770 
    6871# Geo-referenced item 
     
    114117    info = property(getInfo,) 
    115118 
    116  
    117 # Adapts catalog brains 
     119# Support for indexing geo-referencing 
     120 
     121def getGeometryType(object, portal, **kw): 
     122    item = IGeoItemSimple(object, None) 
     123    if item is not None: 
     124        return item.geometry.type 
     125    return None 
     126 
     127def getCoordinates(object, portal, **kw): 
     128    item = IGeoItemSimple(object, None) 
     129    if item is not None: 
     130        return item.geometry.coordinates 
     131    return None 
     132 
     133catalogtool.registerIndexableAttribute('geom_type', getGeometryType) 
     134catalogtool.registerIndexableAttribute('geom_coordinates', getCoordinates) 
     135 
     136 
     137# Adapt catalog brains 
    118138 
    119139class GeoBrainSimple(object): 
     
    156176 
    157177 
    158 # Support for indexing geo-referencing 
    159  
    160 def getGeometryType(object, portal, **kw): 
    161     item = IGeoItemSimple(object, None) 
    162     if item is not None: 
    163         return item.geometry.type 
    164     return None 
    165  
    166 def getCoordinates(object, portal, **kw): 
    167     item = IGeoItemSimple(object, None) 
    168     if item is not None: 
    169         return item.geometry.coordinates 
    170     return None 
    171  
    172 catalogtool.registerIndexableAttribute('geom_type', getGeometryType) 
    173 catalogtool.registerIndexableAttribute('geom_coordinates', getCoordinates) 
    174  
     178# Adapt folderish objects to geo-referenced collections 
     179 
     180class GeoCollectionSimple(object): 
     181 
     182    """Adapts AT folderish objects to collections. 
     183    """ 
     184    implements(IGeoCollectionSimple) 
     185    adapts(IGeoreferenceable) 
     186 
     187    def __init__(self, context): 
     188        """Initialize.""" 
     189        self.context = context 
     190         
     191        # Is the catalog schema geo-enabled? 
     192        catalog_tool = getUtility(ICatalogTool) 
     193        schema = catalog_tool.schema() 
     194        if 'geom_type' in schema and 'geom_coordinates' in schema: 
     195            self._catalog_geo = True 
     196        else: 
     197            self._catalog_geo = False 
     198 
     199    def geoItems(self): 
     200        if IATTopic.providedBy(self.context): 
     201            for brain in self.context.queryCatalog(): 
     202                item = IGeoItemSimple(brain, None) 
     203                if item is not None: 
     204                    yield item 
     205 
     206        elif IATFolder.providedBy(self.context): 
     207            if self._catalog_geo: 
     208                catalog_tool = getUtility(ICatalogTool) 
     209                for brain in catalog_tool( 
     210                    path='/'.join(self.context.getPhysicalPath()) 
     211                    ): 
     212                    item = IGeoItemSimple(brain, None) 
     213                    if item is not None: 
     214                        yield item 
     215            else: 
     216                for ob in self.context.listFolderContents(): 
     217                    item = IGeoItemSimple(ob, None) 
     218                    if item is not None: 
     219                        yield item 
     220 
     221        else: 
     222            item = IGeoItemSimple(self.context, None) 
     223            if item is not None: 
     224                yield item 
     225 
     226    def getItemsInfo(self): 
     227        for item in self.geoItems(): 
     228            yield item.getInfo() 
     229 
     230    def getInfo(self): 
     231        return {'members': list(self.getItemsInfo())} 
     232 
     233    def getBoundingBox(self): 
     234        raise NotImplementedError 
     235        
     236    members = property(geoItems,) 
     237    info = property(getInfo,) 
     238 
  • Geographer/trunk/interfaces.py

    r808 r809  
    3737 
    3838from zope.interface import Interface 
    39 from zope.schema import Choice, Dict, Id, Object, Tuple, URI 
     39from zope.schema import Choice, Dict, Id, Iterable, Object, Tuple, URI 
    4040 
    4141# Marker interfaces. These are on the "for" side of a Zope3 adapter. 
     
    133133        ) 
    134134 
     135 
    135136class IGeoCollectionSimple(Interface): 
    136137 
    137     """A folder-ish collection of objects that provide IGeoItemSimple. 
     138    """A collection of objects that provide IGeoItemSimple. 
    138139    """ 
    139140 
     
    149150        (minx, miny, maxx, maxy).""" 
    150151 
     152    members = Iterable( 
     153        title=u"Geo-referenced Members", 
     154        description=u"Iterator over geo-referenced members of the collection", 
     155        readonly=True, 
     156        ) 
     157     
    151158 
  • Geographer/trunk/tests/adapters.txt

    r808 r809  
    33 
    44  >>> from Products.Geographer.interfaces import IGeoItemSimple 
     5  >>> from Products.Geographer.interfaces import IGeoCollectionSimple 
    56  >>> folder = self.folder 
    67  >>> catalog = self.portal.portal_catalog 
     
    89  >>> catalog.addColumn('geom_coordinates') 
    910 
    10 Target: an AT content object 
    11 ---------------------------- 
     11Adapt a document to IGeoItemSimple 
     12---------------------------------- 
    1213 
    1314Add a new document and geo-reference it 
     
    2627  >>> folder.document.reindexObject() 
    2728 
    28 Check info 
     29Info property holds a python feature 
    2930 
    3031  >>> item.info 
    3132  {'geometry': {'type': 'Point', 'coordinates': ((0.0, 0.0, 0.0),)}, 'id': 'document', 'properties': {'uri': 'http://nohost/plone/Members/test_user_1_/document', 'description': u'This is a document', 'title': u'A Document'}} 
    3233     
    33 Target: a catalog brain 
    34 ----------------------- 
     34Adapt a catalog brain to IGeoItemSimple 
     35--------------------------------------- 
    3536 
    3637Query catalog for the test document 
     
    5051  >>> item.info 
    5152  {'geometry': {'type': 'Point', 'coordinates': ((0.0, 0.0, 0.0),)}, 'id': 'document', 'properties': {'uri': 'http://nohost/plone/Members/test_user_1_/document', 'description': u'This is a document', 'title': u'A Document'}} 
    52       
     53  
     54Adapt a folder to IGeoCollectionSimple 
     55-------------------------------------- 
     56 
     57Since the catalog has geo metadata, this will return brain adapters 
     58 
     59  >>> collection = IGeoCollectionSimple(folder) 
     60  >>> list(collection.members) 
     61  [<Products.Geographer.geo.GeoBrainSimple object at ...>] 
     62 
     63Without geo metadata, we get content adapters to the same interface 
     64 
     65  >>> catalog.delColumn('geom_type') 
     66  >>> catalog.delColumn('geom_coordinates') 
     67  >>> collection = IGeoCollectionSimple(folder) 
     68  >>> list(collection.members) 
     69  [<Products.Geographer.geo.GeoContentSimple object at ...>] 
     70 
     71The info property returns a feature collection 
     72 
     73  >>> collection.info 
     74  {'members': [{'geometry': {'type': 'Point', 'coordinates': ((0.0, 0.0, 0.0),)}, 'id': 'document', 'properties': {'uri': 'http://nohost/plone/Members/test_user_1_/document', 'description': u'This is a document', 'title': u'A Document'}}]} 
     75 
     76