Changeset 810 for Geographer

Show
Ignore:
Timestamp:
05/21/07 19:11:57 (2 years ago)
Author:
sgillies
Message:

Added adapter for plone site members

Files:

Legend:

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

    r809 r810  
    1111  <adapter factory=".geo.GeoContentSimple"/> 
    1212  <adapter factory=".geo.GeoBrainSimple"/> 
     13  <adapter factory=".geo.GeoMemberSimple"/> 
    1314  <adapter factory=".geo.GeoCollectionSimple"/> 
    1415 
     
    2122    class="Products.ZCatalog.CatalogBrains.AbstractCatalogBrain" 
    2223    interface=".interfaces.IReadOnlyGeoreferenceableBrain" 
     24    /> 
     25 
     26  <five:implements 
     27    class="Products.PlonePAS.tools.memberdata.MemberData" 
     28    interface=".interfaces.IGeoreferenceableMember" 
    2329    /> 
    2430 
  • Geographer/trunk/geo.py

    r809 r810  
    5050from Products.Geographer.interfaces import IGeoreferenceable 
    5151from Products.Geographer.interfaces import IReadOnlyGeoreferenceableBrain 
     52from Products.Geographer.interfaces import IGeoreferenceableMember 
    5253 
    5354 
     
    6869    title=u'Create a new geometry property', 
    6970    ) 
     71 
     72 
     73class MemberdataBoundGeometry(object): 
     74 
     75    """A simple geometry bound to the PAS mutable property provider. 
     76    """ 
     77    implements(IGeometry) 
     78 
     79    def __init__(self, memberdata): 
     80        self.memberdata = memberdata 
     81 
     82    def getType(self): 
     83        return self.memberdata.getProperty('geom_type', None) 
     84 
     85    def setType(self, value): 
     86        self.memberdata.setMemberProperties({'geom_type': value}) 
     87 
     88    def getCoordinates(self): 
     89        coordinates = self.memberdata.getProperty('geom_coordinates', '()') 
     90        return eval("tuple(%s)" % coordinates) 
     91 
     92    def setCoordinates(self, value): 
     93        self.memberdata.setMemberProperties({'geom_coordinates': str(value)}) 
     94 
     95    type = property(getType, setType) 
     96    coordinates = property(getCoordinates, setCoordinates) 
     97 
    7098 
    7199# Geo-referenced item 
     
    166194                'description': unicode(self.description), 
    167195                'uri': self.uri, 
     196                }, 
     197            'geometry': { 
     198                'type': self.geometry.type, 
     199                'coordinates': self.geometry.coordinates, 
     200                } 
     201            } 
     202 
     203    info = property(getInfo,) 
     204 
     205 
     206# Adapt member 
     207 
     208class GeoMemberSimple(object): 
     209 
     210    """Provides geo-referencing properties and the Python feature protocol. 
     211    """ 
     212    implements(IGeoItemSimple) 
     213    adapts(IGeoreferenceableMember) 
     214 
     215    def __init__(self, context): 
     216        """Initialize adapter.""" 
     217        self.context = context 
     218        self.geometry = MemberdataBoundGeometry(context) 
     219 
     220    def getInfo(self): 
     221        context = self.context 
     222        user_id = context.getId() 
     223        return { 
     224            'id': user_id, 
     225            'properties': { 
     226                'title' : context.getProperty('fullname', user_id), 
     227                'description' : context.getProperty('fullname', user_id), 
     228                'uri': None, 
    168229                }, 
    169230            'geometry': { 
  • Geographer/trunk/interfaces.py

    r809 r810  
    4343class IGeoreferenceable(IAttributeAnnotatable): 
    4444     
    45     """Marks an object that may be annotated with georeferencing properties. 
     45    """Marks classes that may be annotated with georeferencing properties. 
    4646    """ 
    4747 
     
    4949class IReadOnlyGeoreferenceableBrain(Interface): 
    5050     
    51     """Marks a catalog brain
     51    """Marks catalog brains
    5252    """ 
    53    
     53 
     54 
     55class IGeoreferenceableMember(Interface): 
     56     
     57    """Marks site members. 
     58    """ 
     59 
    5460 
    5561class IGeoserializable(Interface): 
     
    156162        ) 
    157163     
     164    info = Dict( 
     165        title=u"Info Dictionary", 
     166        description=u"Dictionary which provides the Python feature protocol", 
     167        readonly=True, 
     168        ) 
    158169 
  • Geographer/trunk/tests/adapters.txt

    r809 r810  
    88  >>> catalog.addColumn('geom_type') 
    99  >>> catalog.addColumn('geom_coordinates') 
     10 
    1011 
    1112Adapt a document to IGeoItemSimple 
     
    3233  {'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'}} 
    3334     
     35 
    3436Adapt a catalog brain to IGeoItemSimple 
    3537--------------------------------------- 
     
    5153  >>> item.info 
    5254  {'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'}} 
    53   
     55  >>> item = None 
     56 
     57 
     58Adapt a site member to IGeoItemSimple 
     59------------------------------------- 
     60 
     61  Add georeferencing properties to the memberdata schema 
     62 
     63  >>> from zope.component import getUtility 
     64  >>> from Products.CMFCore.interfaces import IMemberDataTool 
     65  >>> md_tool = getUtility(IMemberDataTool) 
     66  >>> md_tool.manage_addProperty('geom_type', '', 'string') 
     67  >>> md_tool.manage_addProperty('geom_coordinates', '()', 'string') 
     68 
     69  Georeference the test member 
     70 
     71  >>> from Products.CMFCore.interfaces import IMembershipTool 
     72  >>> mt = getUtility(IMembershipTool) 
     73  >>> member = mt.getMemberById('test_user_1_') 
     74  >>> bool(member.hasProperty('geom_type')) 
     75  True 
     76  >>> bool(member.hasProperty('geom_coordinates')) 
     77  True 
     78  >>> bool(member.hasProperty('utterly_bogus')) 
     79  False 
     80 
     81  >>> item = IGeoItemSimple(member) 
     82  >>> item.geometry.type = 'Point' 
     83  >>> item.geometry.coordinates = ((0.0, 0.0, 0.0),) 
     84   
     85  Refresh the member and check properties 
     86 
     87  >>> member = mt.getMemberById('test_user_1_') 
     88  >>> member.getProperty('geom_type') 
     89  'Point' 
     90  >>> member.getProperty('geom_coordinates') 
     91  '((0.0, 0.0, 0.0),)' 
     92 
     93  >>> item = IGeoItemSimple(member) 
     94  >>> item.geometry.type 
     95  'Point' 
     96  >>> item.geometry.coordinates 
     97  ((0.0, 0.0, 0.0),) 
     98 
     99 
    54100Adapt a folder to IGeoCollectionSimple 
    55101-------------------------------------- 
  • Geographer/trunk/tests/test_doctests.py

    r803 r810  
    1616 
    1717def list_doctests(): 
    18     return ['adapters.txt'
     18    return ['adapters.txt', 'views.txt'
    1919 
    2020def test_suite():