Changeset 809
- Timestamp:
- 05/17/07 16:00:11 (2 years ago)
- Files:
-
- Geographer/trunk/configure.zcml (modified) (2 diffs)
- Geographer/trunk/geo.py (modified) (5 diffs)
- Geographer/trunk/interfaces.py (modified) (3 diffs)
- Geographer/trunk/tests/adapters.txt (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
Geographer/trunk/configure.zcml
r808 r809 11 11 <adapter factory=".geo.GeoContentSimple"/> 12 12 <adapter factory=".geo.GeoBrainSimple"/> 13 <adapter factory=".geo.GeoCollectionSimple"/> 13 14 14 15 <five:implements … … 22 23 /> 23 24 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 24 35 </configure> 25 36 Geographer/trunk/geo.py
r808 r809 28 28 # =========================================================================== 29 29 30 from zope.component import adapts, createObject 30 from zope.component import adapts, createObject, getUtility 31 31 from zope.component.factory import Factory 32 32 from zope.component.interfaces import ComponentLookupError … … 41 41 42 42 from Products.ZCatalog.CatalogBrains import AbstractCatalogBrain 43 from Products.CMFCore.interfaces import ICatalogTool 43 44 from Products.CMFPlone import CatalogTool as catalogtool 45 from Products.ATContentTypes.interface.topic import IATTopic 46 from Products.ATContentTypes.interface.folder import IATFolder 44 47 45 48 from Products.Geographer.interfaces import IGeometry, IGeoItemSimple 49 from Products.Geographer.interfaces import IGeoCollectionSimple 46 50 from Products.Geographer.interfaces import IGeoreferenceable 47 51 from Products.Geographer.interfaces import IReadOnlyGeoreferenceableBrain … … 64 68 title=u'Create a new geometry property', 65 69 ) 66 67 70 68 71 # Geo-referenced item … … 114 117 info = property(getInfo,) 115 118 116 117 # Adapts catalog brains 119 # Support for indexing geo-referencing 120 121 def getGeometryType(object, portal, **kw): 122 item = IGeoItemSimple(object, None) 123 if item is not None: 124 return item.geometry.type 125 return None 126 127 def getCoordinates(object, portal, **kw): 128 item = IGeoItemSimple(object, None) 129 if item is not None: 130 return item.geometry.coordinates 131 return None 132 133 catalogtool.registerIndexableAttribute('geom_type', getGeometryType) 134 catalogtool.registerIndexableAttribute('geom_coordinates', getCoordinates) 135 136 137 # Adapt catalog brains 118 138 119 139 class GeoBrainSimple(object): … … 156 176 157 177 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 180 class 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 37 37 38 38 from zope.interface import Interface 39 from zope.schema import Choice, Dict, Id, Object, Tuple, URI39 from zope.schema import Choice, Dict, Id, Iterable, Object, Tuple, URI 40 40 41 41 # Marker interfaces. These are on the "for" side of a Zope3 adapter. … … 133 133 ) 134 134 135 135 136 class IGeoCollectionSimple(Interface): 136 137 137 """A folder-ishcollection of objects that provide IGeoItemSimple.138 """A collection of objects that provide IGeoItemSimple. 138 139 """ 139 140 … … 149 150 (minx, miny, maxx, maxy).""" 150 151 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 151 158 Geographer/trunk/tests/adapters.txt
r808 r809 3 3 4 4 >>> from Products.Geographer.interfaces import IGeoItemSimple 5 >>> from Products.Geographer.interfaces import IGeoCollectionSimple 5 6 >>> folder = self.folder 6 7 >>> catalog = self.portal.portal_catalog … … 8 9 >>> catalog.addColumn('geom_coordinates') 9 10 10 Target: an AT content object 11 ---------------------------- 11 Adapt a document to IGeoItemSimple 12 ---------------------------------- 12 13 13 14 Add a new document and geo-reference it … … 26 27 >>> folder.document.reindexObject() 27 28 28 Check info 29 Info property holds a python feature 29 30 30 31 >>> item.info 31 32 {'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'}} 32 33 33 Target: a catalog brain 34 ----------------------- 34 Adapt a catalog brain to IGeoItemSimple 35 --------------------------------------- 35 36 36 37 Query catalog for the test document … … 50 51 >>> item.info 51 52 {'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 54 Adapt a folder to IGeoCollectionSimple 55 -------------------------------------- 56 57 Since 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 63 Without 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 71 The 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
