def setUp(self):
     super(StampMergeTestCase, self).setUp()
     item = pim.ContentItem(itsParent=self.sandbox, displayName=u'Item')
     schema.itemFor(S1, self.sandbox.itsView)
     self.view.commit()
     self.view2 = self.view.repository.createView('Woo')
     self.uuid = item.itsUUID
Пример #2
0
 def setUp(self):
     super(StampMergeTestCase, self).setUp()
     item = pim.ContentItem(itsParent=self.sandbox, displayName=u'Item')
     schema.itemFor(S1, self.sandbox.itsView)
     self.view.commit()
     self.view2 = self.view.repository.createView('Woo')
     self.uuid = item.itsUUID
Пример #3
0
    def testTask(self):
        """ Simple test for creating instances of tasks """

        def _verifyTask(taskItem):
            self.failUnless(has_stamp(taskItem, TaskStamp))
            self.failUnlessEqual(taskItem.displayName, uw("test headline"))
            self.failUnlessEqual(taskItem.importance, 'important')

        self.loadParcel("osaf.pim.tasks")

        # Check that the globals got created by the parcel
        view = self.view
        taskPath = Path('//parcels/osaf/pim/tasks')
        self.failIfEqual(schema.itemFor(TaskStamp, view), None)
        self.failIfEqual(view.find(Path(taskPath, 'TaskStamp')), None)

        self.failUnlessEqual(schema.itemFor(TaskStamp, view),
                         view.find(Path(taskPath, 'TaskStamp')))

        # Construct A Sample Item
        task = Task("TestTask", itsView=view)
        task.itsItem.displayName = uw("test headline")
        task.itsItem.importance = "important"

        self._reopenRepository()
        view = self.view

        contentItemParent = view.findPath("//userdata")

        taskItem2 = contentItemParent.getItemChild("TestTask")
        _verifyTask(taskItem2)
Пример #4
0
    def testTask(self):
        """ Simple test for creating instances of tasks """
        def _verifyTask(taskItem):
            self.failUnless(has_stamp(taskItem, TaskStamp))
            self.failUnlessEqual(taskItem.displayName, uw("test headline"))
            self.failUnlessEqual(taskItem.importance, 'important')

        self.loadParcel("osaf.pim.tasks")

        # Check that the globals got created by the parcel
        view = self.view
        taskPath = Path('//parcels/osaf/pim/tasks')
        self.failIfEqual(schema.itemFor(TaskStamp, view), None)
        self.failIfEqual(view.find(Path(taskPath, 'TaskStamp')), None)

        self.failUnlessEqual(schema.itemFor(TaskStamp, view),
                             view.find(Path(taskPath, 'TaskStamp')))

        # Construct A Sample Item
        task = Task("TestTask", itsView=view)
        task.itsItem.displayName = uw("test headline")
        task.itsItem.importance = "important"

        self._reopenRepository()
        view = self.view

        contentItemParent = view.findPath("//userdata")

        taskItem2 = contentItemParent.getItemChild("TestTask")
        _verifyTask(taskItem2)
Пример #5
0
 def testAttrKindType(self):
     self.assertEqual(
         schema.itemFor(Dummy.attr, self.rv).getAspect('type'),
         self.rv.findPath('//Schema/Core/Text'))
     self.assertEqual(
         schema.itemFor(Other.thing, self.rv).getAspect('type'),
         schema.itemFor(Dummy, self.rv))
     self.assertRaises(TypeError, schema.Descriptor, str)
Пример #6
0
    def remove(self):
        item = self.itsItem
        stampClass = self.__class__
        stampCollection = schema.itemFor(stampClass, item.itsView).collection

        if not stampCollection in self.stampCollections:
            raise StampNotPresentError, \
                  "Item %r doesn't have stamp %r" % (item, self)

        addBack = None
        
        if not item.isProxy:
            
            # This is gross, and was in the old stamping code.
            # Some items, like Mail messages, end up in the
            # all collection by virtue of their stamp. So, we
            # explicitly re-add the item to all after unstamping
            # if necessary.
            all = schema.ns("osaf.pim", item.itsView).allCollection
            if item in all:
                addBack = all
    
            if not self.itsItem.hasLocalAttributeValue(Stamp.stampCollections.name):
                self.stampCollections = list(self.stampCollections)

        self.stampCollections.remove(stampCollection)

        if addBack is not None and not item in addBack:
            addBack.add(item)
Пример #7
0
    def add(self):
        item = self.itsItem
        stampClass = self.__class__
        stampCollection = schema.itemFor(stampClass, item.itsView).collection

        if stampCollection in self.stampCollections:
            raise StampAlreadyPresentError, \
                "Item %r already has stamp %r" % (item, self)

        if (not self.itsItem.isProxy
                and not self.itsItem.hasLocalAttributeValue(
                    Stamp.stampCollections.name)):
            self.stampCollections = []
        self.stampCollections.add(stampCollection)

        if not item.isProxy:

            for attr, callback in stampClass.__all_ivs__:
                if not hasattr(self, attr):
                    setattr(self, attr, callback(self))

            for cls in stampClass.__mro__:
                # Initialize values for annotation attributes
                for attr, val in getattr(cls, '__initialValues__', ()):
                    if not hasattr(self, attr):
                        setattr(self, attr, val)
Пример #8
0
    def add(self):
        item = self.itsItem
        stampClass = self.__class__
        stampCollection = schema.itemFor(stampClass, item.itsView).collection

        if stampCollection in self.stampCollections:
            raise StampAlreadyPresentError, \
                "Item %r already has stamp %r" % (item, self)
        
        if (not self.itsItem.isProxy and
            not self.itsItem.hasLocalAttributeValue(Stamp.stampCollections.name)):
            self.stampCollections = []
        self.stampCollections.add(stampCollection)
        
        if not item.isProxy:
        
            for attr, callback in stampClass.__all_ivs__:
                if not hasattr(self, attr):
                    setattr(self, attr, callback(self))
            
            for cls in stampClass.__mro__:
                # Initialize values for annotation attributes
                for attr, val in getattr(cls,'__initialValues__',()):
                    if not hasattr(self, attr):
                        setattr(self, attr, val)
Пример #9
0
    def remove(self):
        item = self.itsItem
        stampClass = self.__class__
        stampCollection = schema.itemFor(stampClass, item.itsView).collection

        if not stampCollection in self.stampCollections:
            raise StampNotPresentError, \
                  "Item %r doesn't have stamp %r" % (item, self)

        addBack = None

        if not item.isProxy:

            # This is gross, and was in the old stamping code.
            # Some items, like Mail messages, end up in the
            # all collection by virtue of their stamp. So, we
            # explicitly re-add the item to all after unstamping
            # if necessary.
            all = schema.ns("osaf.pim", item.itsView).allCollection
            if item in all:
                addBack = all

            if not self.itsItem.hasLocalAttributeValue(
                    Stamp.stampCollections.name):
                self.stampCollections = list(self.stampCollections)

        self.stampCollections.remove(stampCollection)

        if addBack is not None and not item in addBack:
            addBack.add(item)
Пример #10
0
def getExtent(cls, view=None, exact=False):
    kind = schema.itemFor(cls, view)
    # XXX Should get the names from some shared source because they are used
    # XXX in data.py as well.
    if exact:
        name = 'exactExtent'
    else:
        name = 'fullExtent'

    return kind[name]
Пример #11
0
def getExtent(cls, view=None, exact=False):
    kind = schema.itemFor(cls, view)
    # XXX Should get the names from some shared source because they are used
    # XXX in data.py as well.
    if exact:
        name = 'exactExtent'
    else:
        name = 'fullExtent'

    return kind[name]
Пример #12
0
 def testAnnotateKind(self):
     kind_kind = schema.itemFor(schema.Kind, self.rv)
     CoreAnnotation(kind_kind).extraInfo = uw("Foo")
     self.assertEqual(CoreAnnotation(kind_kind).extraInfo, uw("Foo"))
     parcel = schema.parcel_for_module(__name__, self.rv)
     CoreAnnotation(kind_kind).otherItem = parcel
     self.assertEqual(
         list(getattr(parcel, __name__+".CoreAnnotation.otherItem.inverse")),
         [kind_kind]
     )
Пример #13
0
def installParcel(parcel, oldVersion=None):

    loadCerts(parcel, __name__)
    
    from osaf.pim.collections import KindCollection

    cert = schema.ns('osaf.framework.certstore', parcel)
    kind = schema.itemFor(cert.Certificate, parcel.itsView)
    KindCollection.update(kind, 'fullExtent',  kind=kind, recursive=True)
    KindCollection.update(kind, 'exactExtent', kind=kind, recursive=False)
Пример #14
0
 def testAnnotateKind(self):
     kind_kind = schema.itemFor(schema.Kind, self.rv)
     CoreAnnotation(kind_kind).extraInfo = uw("Foo")
     self.assertEqual(CoreAnnotation(kind_kind).extraInfo, uw("Foo"))
     parcel = schema.parcel_for_module(__name__, self.rv)
     CoreAnnotation(kind_kind).otherItem = parcel
     self.assertEqual(
         list(
             getattr(parcel,
                     __name__ + ".CoreAnnotation.otherItem.inverse")),
         [kind_kind])
Пример #15
0
def importCertificate(x509, fingerprint, trust, repView):
    """
    Import X.509 certificate.

    @param x509:        The X.509 certificate to import
    @param fingerprint: The fingerprint of the certificate (in SHA1)
    @param trust:       The trust value for this certificate
    """
    pem = x509.as_pem()
    if findCertificate(repView, pem) is not None:
        raise utils.CertificateException(
            _(u'This certificate has already been imported.'))

    commonName = x509.get_subject().CN

    if commonName is None:
        commonName = ""

    asText = x509.as_text()

    purpose = certificatePurpose(x509)
    if purpose & constants.PURPOSE_CA:
        if not x509.verify():
            raise utils.CertificateException(
                _(u'Unable to verify certificate.'))

    lobType = schema.itemFor(schema.Lob, repView)
    pem = lobType.makeValue(pem, compression=None)
    text = lobType.makeValue(asText)

    #XXX [i18n] Can a commonName contain non-ascii characters?
    cert = Certificate(itsView=repView,
                       trust=trust,
                       purpose=purpose,
                       fingerprint=fingerprint,
                       fingerprintAlgorithm='sha1',
                       displayName=unicode(commonName),
                       pem=pem,
                       asText=text)

    log.info('Imported certificate: CN=%s, purpose=%s, fp=%s' %
             (commonName, purpose, fingerprint))
    return cert
Пример #16
0
def importCertificate(x509, fingerprint, trust, repView):
    """
    Import X.509 certificate.

    @param x509:        The X.509 certificate to import
    @param fingerprint: The fingerprint of the certificate (in SHA1)
    @param trust:       The trust value for this certificate
    """
    pem = x509.as_pem()
    if findCertificate(repView, pem) is not None:
        raise utils.CertificateException(_(u'This certificate has already been imported.'))

    commonName = x509.get_subject().CN

    if commonName is None:
        commonName = ""

    asText = x509.as_text()

    purpose = certificatePurpose(x509)
    if purpose & constants.PURPOSE_CA:
        if not x509.verify():
            raise utils.CertificateException(_(u'Unable to verify certificate.'))

    lobType = schema.itemFor(schema.Lob, repView)
    pem = lobType.makeValue(pem, compression=None)
    text = lobType.makeValue(asText)

    #XXX [i18n] Can a commonName contain non-ascii characters?
    cert = Certificate(itsView=repView,
                       trust=trust,
                       purpose=purpose,
                       fingerprint=fingerprint,
                       fingerprintAlgorithm='sha1',
                       displayName=unicode(commonName),
                       pem=pem,
                       asText=text)

    log.info('Imported certificate: CN=%s, purpose=%s, fp=%s' % (commonName,
                                                                 purpose,
                                                                 fingerprint))
    return cert
Пример #17
0
    def testResetCache(self):
        # Parcel/kind/attr caches should be cleared between resets
        parcel1 = schema.parcel_for_module(this_module)
        kind1 = schema.itemFor(Dummy)
        attr1 = schema.itemFor(Dummy.attr)

        old = schema.reset()
        parcel2 = schema.parcel_for_module(this_module)
        kind2 = schema.itemFor(Dummy)
        attr2 = schema.itemFor(Dummy.attr)

        self.failIf(parcel2 is parcel1)
        self.failIf(kind2 is kind1)
        self.failIf(attr2 is attr1)

        # But switching back to an old state should restore the cache
        schema.reset(old)
        parcel3 = schema.parcel_for_module(this_module)
        kind3 = schema.itemFor(Dummy)
        attr3 = schema.itemFor(Dummy.attr)
        self.failUnless(parcel3 is parcel1)
        self.failUnless(attr3 is attr1)
        self.failUnless(attr3 is attr1)
Пример #18
0
def makeSummaryBlocks(parcel):
    from osaf.framework.blocks.calendar import (
        CalendarContainer, CalendarControl, MultiWeekControl,
        CanvasSplitterWindow, AllDayEventsCanvas, TimedEventsCanvas,
        MultiWeekContainer
        )

    from Dashboard import DashboardBlock
    
    view = parcel.itsView
    detailblocks = schema.ns('osaf.views.detail', view)
    pim_ns = schema.ns('osaf.pim', view)
    blocks = schema.ns('osaf.framework.blocks', view)
    main = schema.ns("osaf.views.main", view)
    repositoryView = parcel.itsView
    
    # Register our attribute editors.
    # If you edit this dictionary, please keep it in alphabetical order by key.
    aeDict = {
        'EventStamp': 'ReminderColumnAttributeEditor',
        'MailStamp': 'CommunicationsColumnAttributeEditor',
        'TaskStamp': 'TaskColumnAttributeEditor',
        'Text+who': 'WhoAttributeEditor',
        'TriageEnum': 'TriageAttributeEditor',
    }
    attributeEditors.AttributeEditorMapping.register(parcel, aeDict, __name__)
    
    
    iconColumnWidth = 23 # temporarily not 20, to work around header bug 6168    
    
    def makeColumnAndIndexes(colName, **kwargs):
        # Create an IndexDefinition that will be used later (when the user
        # clicks on the column header) to build the actual index.
        # By default, we always create index defs that will lazily create a
        # master index when the subindex is needed.
        indexName = kwargs['indexName']
        attributes = kwargs.pop('attributes', [])
        useCompare = kwargs.pop('useCompare', False)
        useMaster = kwargs.pop('useMaster', True)
        baseClass = kwargs.pop('baseClass', pim.AttributeIndexDefinition)
        columnClass = kwargs.pop('columnClass', Column)
        indexDefinition = baseClass.update(parcel, 
                                           indexName,
                                           useMaster=useMaster,
                                           attributes=attributes)

        # If we want master indexes precreated, here's where
        # to do it.
        if useMaster: indexDefinition.makeMasterIndex()
            
        # Create the column
        return columnClass.update(parcel, colName, **kwargs)

    # We have to build the triage column first, because the other columns 
    # delegate to its index
    triageColumn = makeColumnAndIndexes('SumColTriage',
        icon = 'ColHTriageStatus',
        useSortArrows = False,
        defaultSort = True,
        scaleColumn = wxGrid.Grid.GRID_COLUMN_FIXED_SIZE,
        columnClass = TriageColumn,
        attributeName = 'sectionTriageStatus',
        indexName = '%s.triage' % __name__,
        baseClass=TriageColumnIndexDefinition,
        attributes=list(dict(TriageColumnIndexDefinition.findParams)))
        
    taskColumn = makeColumnAndIndexes('SumColTask',
        icon='ColHTask',
        valueType = 'stamp',
        stamp=pim.TaskStamp,
        width=iconColumnWidth,
        useSortArrows=False,
        scaleColumn = wxGrid.Grid.GRID_COLUMN_FIXED_SIZE,
        readOnly=True,
        indexName='%s.taskStatus' % __name__,
        baseClass=TaskColumnIndexDefinition,
        attributes=list(dict(TaskColumnIndexDefinition.findParams)),)

    commColumn = makeColumnAndIndexes('SumColMail',
        icon='ColHMail',
        valueType='stamp',
        stamp=pim.mail.MailStamp,
        width=iconColumnWidth,
        useSortArrows=False,
        scaleColumn = wxGrid.Grid.GRID_COLUMN_FIXED_SIZE,
        readOnly=True,
        indexName=CommunicationStatus.status.name,
        attributeName=CommunicationStatus.status.name,
        baseClass=CommunicationColumnIndexDefinition,
        attributes=list(dict(CommunicationStatus.attributeValues)),)

    whoColumn = makeColumnAndIndexes('SumColWho',
        heading=_(u'Who'),
        width=85,
        scaleColumn = wxGrid.Grid.GRID_COLUMN_SCALABLE,
        readOnly=True,
        indexName='%s.displayWho' % __name__,
        attributeName='displayWho',
        attributeSourceName = 'displayWhoSource',
        format='who',
        baseClass=WhoColumnIndexDefinition,
        attributes=list(dict(WhoColumnIndexDefinition.findParams)),)
    
    titleColumn = makeColumnAndIndexes('SumColAbout',
        heading=_(u'Title'),
        width=120,
        scaleColumn = wxGrid.Grid.GRID_COLUMN_SCALABLE,
        indexName='%s.displayName' % __name__,
        attributeName='displayName',
        baseClass=TitleColumnIndexDefinition,
        attributes=list(dict(TitleColumnIndexDefinition.findParams)),)

    reminderColumn = makeColumnAndIndexes('SumColCalendarEvent',
        icon = 'ColHEvent',
        valueType = 'stamp',
        stamp = pim.EventStamp,
        useSortArrows = False,
        width = iconColumnWidth,
        scaleColumn = wxGrid.Grid.GRID_COLUMN_FIXED_SIZE,
        readOnly = True,
        indexName = '%s.calendarStatus' % __name__,
        baseClass=CalendarColumnIndexDefinition,
        attributes=list(dict(CalendarColumnIndexDefinition.findParams)) + \
                   ['displayDateSource'])

    dateColumn = makeColumnAndIndexes('SumColDate',
        heading = _(u'Date'),
        width = 115,
        scaleColumn = wxGrid.Grid.GRID_COLUMN_SCALABLE,
        readOnly = True,
        attributeName = 'displayDate',
        attributeSourceName = 'displayDateSource',
        indexName = '%s.displayDate' % __name__,
        baseClass=DateColumnIndexDefinition,
        attributes=list(dict(DateColumnIndexDefinition.findParams)) + \
                   ['displayDateSource'])

    rankColumn = makeColumnAndIndexes('SumColRank',
        heading = _(u'Rank'),
        valueType = 'None',
        defaultSort = True,
        useSortArrows = False,
        useMaster = False,
        width = 46,
        scaleColumn = wxGrid.Grid.GRID_COLUMN_SCALABLE,
        readOnly = True,
        indexName ='%s.rank' % __name__,
        format='rank',
        baseClass = pim.NumericIndexDefinition,
        attributes = [])

    # Our detail views share the same delegate instance and contents collection
    detailBranchPointDelegate = detailblocks.DetailBranchPointDelegate.update(
        parcel, 'DetailBranchPointDelegateInstance',
        branchStub = detailblocks.DetailRoot)

    iconColumnWidth = 23 # temporarily not 20, to work around header bug 6168
    DashboardSummaryViewTemplate = SplitterWindow.template(
        'DashboardSummaryViewTemplate',
        eventBoundary = True,
        orientationEnum = "Vertical",
        splitPercentage = 0.65,
        childBlocks = [
            BoxContainer.template('DashboardSummaryContainer',
                orientationEnum = 'Vertical',
                childBlocks = [
                    DashboardBlock.template('DashboardSummaryView',
                        contents = pim_ns.allCollection,
                        scaleWidthsToFit = True,
                        columns = [
                            taskColumn,
                            commColumn,
                            whoColumn,
                            titleColumn,
                            reminderColumn,
                            dateColumn,
                            triageColumn                    
                        ],
                        characterStyle = blocks.SummaryRowStyle,
                        headerCharacterStyle = blocks.SummaryHeaderStyle,
                        prefixCharacterStyle = blocks.SummaryPrefixStyle,
                        sectionLabelCharacterStyle = blocks.SummarySectionLabelStyle,
                        sectionCountCharacterStyle = blocks.SummarySectionCountStyle,
                        rowHeight = 19,
                        elementDelegate = 'osaf.views.main.SectionedGridDelegate',
                        defaultEditableAttribute = u'displayName',
                        emptyContentsShow = False,
                        contextMenu = "ItemContextMenu",
                        miniCalendar = main.MiniCalendar,
                        activeView = True),
                    HTML.template('SummaryEmptyDashBoardView',
                        text = u'<html><body><center>&nbsp;<br>&nbsp;<br>%s</center></body></html>' % _(u'0 items'),
                        treatAsURL = False,
                        contextMenu = "ItemContextMenu",
                        emptyContentsShow = True)
                ]
            ),
            BranchPointBlock.template('DashboardDetailBranchPointBlock',
                delegate = detailBranchPointDelegate)
        ]).install(parcel) # SplitterWindow DashboardSummaryViewTemplate

    searchRankColumn = makeColumnAndIndexes('SearchColRank',
        heading = _(u'Rank'),
        valueType = 'None',
        defaultSort = True,
        useSortArrows = False,
        useMaster = False,
        width = 39,
        scaleColumn = wxGrid.Grid.GRID_COLUMN_NON_SCALABLE,
        readOnly = True,
        indexName ='%s.rank' % __name__,
        format='rank',
        baseClass = pim.NumericIndexDefinition,
        attributes = [])

    searchTaskColumn = makeColumnAndIndexes('SearchColTask',
        icon='ColHTask',
        valueType = 'stamp',
        stamp=pim.TaskStamp,
        width=iconColumnWidth,
        useSortArrows=False,
        scaleColumn = wxGrid.Grid.GRID_COLUMN_FIXED_SIZE,
        readOnly=True,
        indexName='%s.taskStatus' % __name__,
        baseClass=TaskColumnIndexDefinition,
        attributes=list(dict(TaskColumnIndexDefinition.findParams)),)

    searchCommColumn = makeColumnAndIndexes('SearchColMail',
        icon='ColHMail',
        valueType='stamp',
        stamp=pim.mail.MailStamp,
        width=iconColumnWidth,
        useSortArrows=False,
        scaleColumn = wxGrid.Grid.GRID_COLUMN_FIXED_SIZE,
        readOnly=True,
        indexName=CommunicationStatus.status.name,
        attributeName=CommunicationStatus.status.name,
        baseClass=CommunicationColumnIndexDefinition,
        attributes=list(dict(CommunicationStatus.attributeValues)),)

    searchWhoColumn = makeColumnAndIndexes('SearchColWho',
        heading=_(u'Who'),
        width=100,
        scaleColumn = wxGrid.Grid.GRID_COLUMN_SCALABLE,
        readOnly=True,
        indexName='%s.displayWho' % __name__,
        attributeName='displayWho',
        attributeSourceName = 'displayWhoSource',
        format='who',
        baseClass=WhoColumnIndexDefinition,
        attributes=list(dict(WhoColumnIndexDefinition.findParams)),)
    
    searchTitleColumn = makeColumnAndIndexes('SearchColAbout',
        heading=_(u'Title'),
        width=120,
        scaleColumn = wxGrid.Grid.GRID_COLUMN_SCALABLE,
        indexName='%s.displayName' % __name__,
        attributeName='displayName',
        baseClass=TitleColumnIndexDefinition,
        attributes=list(dict(TitleColumnIndexDefinition.findParams)),)

    searchReminderColumn = makeColumnAndIndexes('SearchColCalendarEvent',
        icon = 'ColHEvent',
        valueType = 'stamp',
        stamp = pim.EventStamp,
        useSortArrows = False,
        width = iconColumnWidth,
        scaleColumn = wxGrid.Grid.GRID_COLUMN_FIXED_SIZE,
        readOnly = True,
        indexName = '%s.calendarStatus' % __name__,
        baseClass=CalendarColumnIndexDefinition,
        attributes=list(dict(CalendarColumnIndexDefinition.findParams)) + \
                   ['displayDateSource'])

    searchDateColumn = makeColumnAndIndexes('SearchColDate',
        heading = _(u'Date'),
        width = 100,
        scaleColumn = wxGrid.Grid.GRID_COLUMN_SCALABLE,
        readOnly = True,
        attributeName = 'displayDate',
        attributeSourceName = 'displayDateSource',
        indexName = '%s.displayDate' % __name__,
        baseClass=DateColumnIndexDefinition,
        attributes=list(dict(DateColumnIndexDefinition.findParams)) + \
                   ['displayDateSource'])

    searchTriageColumn = makeColumnAndIndexes('SearchColTriage',
        icon = 'ColHTriageStatus',
        useSortArrows = False,
        width = 39,
        scaleColumn = wxGrid.Grid.GRID_COLUMN_FIXED_SIZE,
        collapsedSections=set([str(pim.TriageEnum.later), str(pim.TriageEnum.done)]), 
        attributeName = 'sectionTriageStatus',
        indexName = '%s.triage' % __name__,
        baseClass=TriageColumnIndexDefinition,
        attributes=list(dict(TriageColumnIndexDefinition.findParams)))
        
    SplitterWindow.template(
        'SearchResultsViewTemplate',
        orientationEnum = "Vertical",
        splitPercentage = 0.65,
        eventBoundary = True,
        childBlocks = [
            BoxContainer.template('SearchResultsSummaryContainer',
                orientationEnum = 'Vertical',
                childBlocks = [
                    DashboardBlock.template('SearchResultsSummaryView',
                        contents = pim_ns.allCollection,
                        scaleWidthsToFit = True,
                        columns = [
                            searchRankColumn,
                            searchTaskColumn,
                            searchCommColumn,
                            searchWhoColumn,
                            searchTitleColumn,
                            searchReminderColumn,
                            searchDateColumn,
                            searchTriageColumn                    
                        ],
                        characterStyle = blocks.SummaryRowStyle,
                        headerCharacterStyle = blocks.SummaryHeaderStyle,
                        prefixCharacterStyle = blocks.SummaryPrefixStyle,
                        sectionLabelCharacterStyle = blocks.SummarySectionLabelStyle,
                        sectionCountCharacterStyle = blocks.SummarySectionCountStyle,
                        rowHeight = 19,
                        elementDelegate = 'osaf.views.main.SectionedGridDelegate',
                        defaultEditableAttribute = u'displayName',
                        miniCalendar = main.MiniCalendar,
                        emptyContentsShow = False,
                        activeView = True),
                    HTML.template('SearchResultsEmptyDashBoardView',
                        text = u'<html><body><center>&nbsp;<br>&nbsp;<br>%s</center></body></html>' % _(u'0 items'),
                        treatAsURL = False,
                        emptyContentsShow = True)
                ]
            ),
            BranchPointBlock.template('SearchResultsSummaryDetailBranchPointBlock',
                delegate = detailBranchPointDelegate)
        ]
    ).install(parcel) # SplitterWindow SearchResultsViewTemplate

    TimeZoneChange = BlockEvent.template(
        'TimeZoneChange',
        dispatchEnum = 'BroadcastEverywhere').install(parcel)

    DefaultCharacterStyle = CharacterStyle.update(
        parcel, 'DefaultCharacterStyle',
        fontFamily = 'DefaultUIFont')

    DefaultSmallBoldStyle = CharacterStyle.update(
        parcel, 'DefaultSmallBoldStyle',
        fontFamily = 'DefaultUIFont',
        fontSize = 10.0,
        fontStyle = 'bold')

    DefaultBigStyle = CharacterStyle.update(
        parcel, 'DefaultBigStyle',
        fontFamily = 'DefaultUIFont',
        fontSize = 12.0)

    DefaultBoldStyle = CharacterStyle.update(
        parcel, 'DefaultBoldStyle',
        fontFamily = 'DefaultUIFont',
        fontStyle = 'bold')

    DefaultBigBoldStyle = CharacterStyle.update(
        parcel, 'DefaultBigBoldStyle',
        fontFamily = 'DefaultUIFont',
        fontSize = 13,
        fontStyle = 'bold')

    # save the template because we'll need it for later
    MainMultiWeekControlTemplate = MultiWeekControl.template(
        'MainMultiWeekControl',
        tzCharacterStyle = DefaultCharacterStyle,
        dayMode = 'multiweek',
        stretchFactor = 0)

    MainMultiWeekControl = MainMultiWeekControlTemplate.install(parcel)

    MultiWeekDetailBranchPointBlock = BranchPointBlock.template(
        'MultiWeekDetailBranchPointBlock',
        delegate = detailBranchPointDelegate,
        ).install(parcel)

    MultiWeekCalendarView = MultiWeekContainer.template(
        'MultiWeekCalendarView',
        calendarControl = MainMultiWeekControl,
        monthLabelStyle = blocks.BigTextStyle,
        eventLabelStyle = DefaultCharacterStyle,
        eventTimeStyle = DefaultSmallBoldStyle,
        legendStyle = DefaultCharacterStyle,
        orientationEnum = 'Vertical',
        dayMode = 'multiweek',
        eventsForNamedLookup = [TimeZoneChange]).install(parcel)
    
    SplitterWindow.template('MultiWeekViewTemplate',
        eventBoundary = True,
        orientationEnum = 'Vertical',
        splitPercentage = 0.65,
        treeController = MainMultiWeekControl,
        childBlocks = [
            MultiWeekContainer.template('MultiWeekCalendarView',
                childBlocks = [
                    MainMultiWeekControlTemplate,
                    calendar.MultiWeekCanvas.template('MultiWeekCanvas',
                        calendarContainer = MultiWeekCalendarView,
                        contextMenu = "ItemContextMenu",
                        miniCalendar = main.MiniCalendar,
                        dayMode = 'multiweek',
                        activeView = True)
                    ]),
            MultiWeekDetailBranchPointBlock
            ]).install(parcel)
    
    MultiWeekControl.update(
        parcel, 'MainMultiWeekControl',
        calendarContainer = MultiWeekCalendarView)
                                

    # save the template because we'll need it for later
    MainCalendarControlT = CalendarControl.template(
        'MainCalendarControl',
        tzCharacterStyle = DefaultCharacterStyle,
        stretchFactor = 0)
    
    MainCalendarControl = MainCalendarControlT.install(parcel)

    CalendarDetailBranchPointBlock = BranchPointBlock.template(
        'CalendarDetailBranchPointBlock',
        delegate = detailBranchPointDelegate,
        ).install(parcel)

    WelcomeEvent = schema.ns('osaf.app', view).WelcomeEvent
    CalendarDetailBranchPointBlock.selectedItem = WelcomeEvent

    CalendarSummaryView = CalendarContainer.template(
        'CalendarSummaryView',
        calendarControl = MainCalendarControl,
        monthLabelStyle = blocks.BigTextStyle,
        eventLabelStyle = DefaultCharacterStyle,
        eventTimeStyle = DefaultSmallBoldStyle,
        legendStyle = DefaultCharacterStyle,
        orientationEnum = 'Vertical',
        eventsForNamedLookup = [TimeZoneChange]).install(parcel)
    
    SplitterWindow.template('CalendarSummaryViewTemplate',
        eventBoundary = True,
        orientationEnum = 'Vertical',
        splitPercentage = 0.65,
        treeController = MainCalendarControl,
        childBlocks = [
            CalendarContainer.template('CalendarSummaryView',
                childBlocks = [
                    MainCalendarControlT,
                    CanvasSplitterWindow.template('MainCalendarCanvasSplitter',
                        # as small as possible; AllDayEvents's
                        # SetMinSize() should override?
                        splitPercentage = 0.06,
                        orientationEnum = 'Horizontal',
                        calendarControl = MainCalendarControl,
                        childBlocks = [
                            calendar.AllDayEventsCanvas.template('AllDayEvents',
                                calendarContainer = CalendarSummaryView,
                                contextMenu = "ItemContextMenu"),
                            calendar.TimedEventsCanvas.template('TimedEvents',
                                calendarContainer = CalendarSummaryView,
                                contextMenu = "ItemContextMenu",
                                miniCalendar = main.MiniCalendar,
                                activeView = True)
                            ]),
                    ]),
            CalendarDetailBranchPointBlock
            ]).install(parcel)
    

    CalendarControl.update(
        parcel, 'MainCalendarControl',
        calendarContainer = CalendarSummaryView)
                                
    # Precache detail views for the basic pim types (and "Block",
    # which is the key used for the None item). Note that the basic
    # stamps (Event, Task, Mail) are now covered by Note
    for keyType in (pim.Note, Block.Block):
        detailBranchPointDelegate.getBranchForKeyItem(
                            schema.itemFor(keyType, view))
Пример #19
0
def installParcel(parcel, oldVersion=None):
    # Load cacert.pem into the repository

    from M2Crypto import X509, BIO, util
    from M2Crypto.EVP import MessageDigest
    import os, sys, time
    chop = -1

    from application import schema
    cert = schema.ns('osaf.framework.certstore', parcel)
    lobType = schema.itemFor(schema.Lob, parcel.itsView)

    def fingerprint(x509):
        der = x509.as_der()
        md = MessageDigest('sha1')
        md.update(der)
        digest = md.final()
        return hex(util.octx_to_num(digest))

    lastLine = ''
    pem = []

    for line in open(os.path.join(os.path.dirname(__file__),'cacert.pem'),'rU'):
        if line[:3] == '===':
            itsName = lastLine
            itsName = itsName[:chop]
        elif line[:chop] == '-----BEGIN CERTIFICATE-----':
            pem = [line]
        elif line[:chop] == '-----END CERTIFICATE-----':
            pem.append(line[:chop])
            x509 = X509.load_cert_string(''.join(pem))

            commonName = itsName.replace('&', '&amp;')
            commonName = commonName.replace('<', '&gt;')
            itsName = commonName.replace('/', '_')

            if not x509.verify():
                subject = x509.get_subject()
                # XXX log message?  remove old certificate?
                #print 'Skipping, does not verify:', subject.O, subject.CN
                #print x509.as_text()
                continue

            # More tests, although verify() should have caught these
            after = x509.get_not_after()
            try:
                if time.gmtime() > time.strptime(str(after), '%b %d %H:%M:%S %Y %Z'):
                    subject = x509.get_subject()
                    # XXX log message?  remove old certificate?
                    #print 'Skipping expired:', subject.O, subject.CN, after
                    #print x509.as_text()
                    continue
            except ValueError:
                # XXX log message?  remove old certificate?
                #print 'ERROR: Bad certificate format (skipping)'
                #print x509.as_text()
                continue

            cert.Certificate.update(parcel, itsName,
                subjectCommonName = commonName,
                type="root", trust=3, fingerprintAlgorithm="sha1",
                fingerprint=fingerprint(x509),
                pem=lobType.makeValue(''.join(pem)),
                asText=lobType.makeValue(x509.as_text()),
            )
            pem = []

        elif pem:
            pem.append(line)

        lastLine = line
Пример #20
0
 def testAttrKindType(self):
     self.assertEqual(schema.itemFor(Dummy.attr, self.rv).getAspect('type'),
         self.rv.findPath('//Schema/Core/Text'))
     self.assertEqual(schema.itemFor(Other.thing, self.rv).getAspect('type'),
                      schema.itemFor(Dummy, self.rv))
     self.assertRaises(TypeError, schema.Descriptor, str)
Пример #21
0
 def getCollection(cls, repoView):
     if cls.__use_collection__:
         return schema.itemFor(cls, repoView).collection
     else:
         return None
Пример #22
0
 def testAttrKindType(self):
     self.assertEqual(schema.itemFor(Dummy.attr).getAspect('type'),
         schema.nrv.findPath('//Schema/Core/String'))
     self.assertEqual(schema.itemFor(Other.thing).getAspect('type'),
                      schema.itemFor(Dummy))
     self.assertRaises(TypeError, schema.Role, str)
Пример #23
0
    def testMail(self):
        """ Simple test for creating instances of email related kinds """

        self.loadParcel("osaf.pim.mail")

        # Test the globals
        mailPath = Path('//parcels/osaf/pim/mail')
        view = self.view

        self.assertEqual(Mail.AccountBase.getKind(view),
                         view.find(Path(mailPath, 'AccountBase')))

        self.assertEqual(Mail.IMAPAccount.getKind(view),
                         view.find(Path(mailPath, 'IMAPAccount')))

        self.assertEqual(Mail.SMTPAccount.getKind(view),
                         view.find(Path(mailPath, 'SMTPAccount')))

        self.assertEqual(schema.itemFor(Mail.MIMEBase, view),
                         view.find(Path(mailPath, 'MIMEBase')))

        self.assertEqual(schema.itemFor(Mail.MIMENote, view),
                         view.find(Path(mailPath, 'MIMENote')))

        self.assertEqual(schema.itemFor(Mail.MailStamp, view),
                         view.find(Path(mailPath, 'MailStamp')))

        self.assertEqual(schema.itemFor(Mail.MIMEBinary, view),
                         view.find(Path(mailPath, 'MIMEBinary')))

        self.assertEqual(schema.itemFor(Mail.MIMEText, view),
                         view.find(Path(mailPath, 'MIMEText')))

        self.assertEqual(schema.itemFor(Mail.MIMEContainer, view),
                         view.find(Path(mailPath, 'MIMEContainer')))

        self.assertEqual(schema.itemFor(Mail.MIMESecurity, view),
                         view.find(Path(mailPath, 'MIMESecurity')))

        self.assertEqual(Mail.EmailAddress.getKind(view),
                         view.find(Path(mailPath, 'EmailAddress')))

        # Construct sample items
        accountBaseItem = Mail.AccountBase("accountBaseItem", itsView=view)
        imapAccountItem = Mail.IMAPAccount("imapAccountItem", itsView=view)
        smtpAccountItem = Mail.SMTPAccount("smtpAccountItem", itsView=view)

        mimeBaseObject = Mail.MIMEBase("mimeBaseItem", itsView=view)
        mimeNoteObject = Mail.MIMENote("mimeNoteItem", itsView=view)
        mailMessageObject = Mail.MailMessage("mailMessageItem", itsView=view)
        mimeBinaryObject = Mail.MIMEBinary("mimeBinaryItem", itsView=view)
        mimeTextObject = Mail.MIMEText("mimeTextItem", itsView=view)
        mimeContainerObject = Mail.MIMEContainer("mimeContainerItem",
                                                 itsView=view)
        mimeSecurityObject = Mail.MIMESecurity("mimeSecurityItem",
                                               itsView=view)
        emailAddressItem = Mail.EmailAddress("emailAddressItem", itsView=view)

        # Double check kinds
        self.assertEqual(accountBaseItem.itsKind,
                         Mail.AccountBase.getKind(view))

        self.assertEqual(imapAccountItem.itsKind,
                         Mail.IMAPAccount.getKind(view))

        self.assertEqual(smtpAccountItem.itsKind,
                         Mail.SMTPAccount.getKind(view))

        self.failUnless(isinstance(mimeBaseObject, Mail.MIMEBase))
        self.failUnless(isinstance(mimeNoteObject, Mail.MIMENote))

        self.failUnless(isinstance(mailMessageObject, Mail.MailStamp))
        self.failUnless(isinstance(mailMessageObject.itsItem, Note))
        self.failUnless(has_stamp(mailMessageObject, Mail.MailStamp))

        self.failUnless(isinstance(mimeBinaryObject, Mail.MIMEBinary))

        self.failUnless(isinstance(mimeTextObject, Mail.MIMEText))

        self.failUnless(isinstance(mimeContainerObject, Mail.MIMEContainer))

        self.failUnless(isinstance(mimeSecurityObject, Mail.MIMESecurity))

        self.assertEqual(emailAddressItem.itsKind,
                         Mail.EmailAddress.getKind(view))

        accountBaseItem = self.__populateAccount(accountBaseItem)
        smtpAccountItem = self.__populateAccount(smtpAccountItem)
        imapAccountItem = self.__populateAccount(imapAccountItem)

        mimeBaseObject.mimeType = "SGML"
        mimeBinaryObject.mimeType = "APPLICATION"
        mimeTextObject.mimeType = "PLAIN"
        mimeContainerObject.mimeType = "ALTERNATIVE"
        mimeSecurityObject.mimeType = "SIGNED"

        # Literal properties
        mailMessageObject.dateSent = datetime.now(view.tzinfo.default)
        mailMessageObject.subject = uw("Hello")
        self.assertEqual(mailMessageObject.subject,
                         mailMessageObject.itsItem.displayName)
        #mailMessageObject.spamScore = 5

        # Item Properties
        emailAddressItem.emailAddress = u"*****@*****.**"
        mailMessageObject.replyToAddress = emailAddressItem

        self._reopenRepository()
        view = self.view

        contentItemParent = view.findPath("//userdata")
        mailMessageItem = contentItemParent.getItemChild("mailMessageItem")

        #Test cloud membership

        items = mailMessageItem.getItemCloud('copying')
        self.assertEqual(len(items), 3)  # item & reply-to address, mimeContent
Пример #24
0
 def testDeriveFromCore(self):
     self.assertEqual(
         list(schema.itemFor(Mixed).superKinds),
         [schema.itemFor(Dummy), schema.itemFor(Query)]
     )
Пример #25
0
def loadCerts(parcel, moduleName, filename=u'cacert.pem'):
    # Load cacert.pem into the repository

    import os, sys
    import logging

    from M2Crypto import X509

    log = logging.getLogger(__name__)

    if isinstance(filename, unicode):
        filename = filename.encode('utf8')

    chop = -1

    cert = schema.ns('osaf.framework.certstore', parcel)
    lobType = schema.itemFor(schema.Lob, parcel.itsView)

    from osaf.framework.certstore import utils, constants

    lastLine = ''
    pem = []

    certificates = 0
    itsName = None
    
    for line in open(
        os.path.join(
            os.path.dirname(sys.modules[moduleName].__file__),filename
        ), 'rU'
    ):
        if line[:3] == '===':
            itsName = lastLine
            itsName = itsName[:chop]
        elif line[:chop] == '-----BEGIN CERTIFICATE-----':
            pem = [line]
        elif line[:chop] == '-----END CERTIFICATE-----':
            pem.append(line[:chop])
            x509 = X509.load_cert_string(''.join(pem))

            if itsName is not None:
                commonName = itsName
                itsName = itsName.replace('/', '_')
            else:
                commonName = x509.get_subject().commonName or ''

            if not x509.verify():
                log.warn('Skipping certificate, does not verify: %s' % \
                         (commonName))
                #print x509.as_text()
                continue

            try:
                trust = constants.TRUST_AUTHENTICITY | constants.TRUST_SERVER
                purpose = cert.certificatePurpose(x509)
                if not (purpose & constants.PURPOSE_CA):
                    trust &= ~constants.TRUST_SERVER
                    log.warn('Importing non-root certificate: %s' % \
                             (commonName))
            except utils.CertificateException:
                log.warn('Could not determine certificate type, assuming "%s": %s' % \
                              (constants.PURPOSE_CA, commonName))
                purpose = constants.PURPOSE_CA
                #print x509.as_text()

            #XXX [i18n] Can a commonName contain non-ascii characters?
            cert.Certificate.update(parcel, itsName,
                displayName = unicode(commonName),
                purpose=purpose,
                trust=trust,
                fingerprintAlgorithm='sha1',
                fingerprint=utils.fingerprint(x509),
                pem=lobType.makeValue(''.join(pem)),
                asText=lobType.makeValue(x509.as_text()),
            )
            pem = []
            certificates += 1
            itsName = None

        elif pem:
            pem.append(line)

        lastLine = line

    log.info(
        'Imported %d certificates from %s in %s',
        certificates, filename, moduleName
    )
Пример #26
0
    def testCalendar(self):
        """ Simple test for creating instances of calendar related kinds """

        def getEventValue(event, attrName):
            try:
                attrName = getattr(type(event), attrName).name
            except AttributeError:
                pass
            return getattr(event.itsItem, attrName)

        def _verifyCalendarEvent(event):
            self.failUnless(stamping.has_stamp(event, Calendar.EventStamp))

            self.assertEqual(event.summary, uw("simple headline"))

            self.assertEqual(event.itsItem.importance, "fyi")
            self.assertEqual(getEventValue(event, "importance"), "fyi")

            self.assertEqual(event.transparency, "confirmed")
            self.assertEqual(getEventValue(event, "transparency"), "confirmed")

            self.assertEqual(event.allDay, False)
            self.assertEqual(getEventValue(event, "allDay"), False)

            self.assertEqual(event.anyTime, True)
            self.assertEqual(getEventValue(event, "anyTime"), True)

        def _verifyCalendarItems(location, recurrence):
            self.assertEqual(location.displayName, uw("simple location"))

        # Check that the globals got created by the parcel
        calendarPath = Path("//parcels/osaf/pim/calendar")
        view = self.sandbox.itsView

        self.assertEqual(schema.itemFor(Calendar.EventStamp, view), view.find(Path(calendarPath, "EventStamp")))
        self.assertEqual(Calendar.Location.getKind(view), view.find(Path(calendarPath, "Location")))
        self.assertEqual(Calendar.RecurrencePattern.getKind(view), view.find(Path(calendarPath, "RecurrencePattern")))

        # Construct a sample item
        calendarEventItem = Calendar.CalendarEvent("calendarEventItem", itsParent=self.sandbox)
        locationItem = Calendar.Location("locationItem", itsParent=self.sandbox)
        recurrenceItem = Calendar.RecurrencePattern("recurrenceItem", itsParent=self.sandbox)

        # CalendarEvent properties
        calendarEventItem.summary = uw("simple headline")
        calendarEventItem.itsItem.importance = "fyi"
        _verifyCalendarEvent(calendarEventItem)
        calendarEventItem.location = locationItem

        # Calendar properties
        locationItem.displayName = uw("simple location")
        _verifyCalendarItems(locationItem, recurrenceItem)

        # Check cloud membership - event + location
        items = calendarEventItem.itsItem.getItemCloud("copying")
        self.assertEqual(len(items), 2)

        # Re-examine items
        self.reopenRepository()
        view = self.sandbox.itsView

        calendarEventItem = Calendar.EventStamp(self.sandbox.getItemChild("calendarEventItem"))
        locationItem = self.sandbox.getItemChild("locationItem")
        recurrenceItem = self.sandbox.getItemChild("recurrenceItem")

        _verifyCalendarEvent(calendarEventItem)
        _verifyCalendarItems(locationItem, recurrenceItem)
Пример #27
0
 def testDeriveFromCore(self):
     self.assertEqual(list(schema.itemFor(Mixed, self.rv).superKinds), [
         schema.itemFor(Dummy, self.rv),
         schema.itemFor(Types.Type, self.rv)
     ])
Пример #28
0
 def testAnnotateForwardRefs(self):
     schema.itemFor(ForwardAnnotation, self.rv)
Пример #29
0
def installParcel(parcel, oldVersion=None):
    # Load cacert.pem into the repository

    from M2Crypto import X509, BIO, util
    from M2Crypto.EVP import MessageDigest
    import os, sys, time
    chop = -1

    from application import schema
    cert = schema.ns('osaf.framework.certstore', parcel)
    lobType = schema.itemFor(schema.Lob, parcel.itsView)

    def fingerprint(x509):
        der = x509.as_der()
        md = MessageDigest('sha1')
        md.update(der)
        digest = md.final()
        return hex(util.octx_to_num(digest))

    lastLine = ''
    pem = []

    for line in open(os.path.join(os.path.dirname(__file__), 'cacert.pem'),
                     'rU'):
        if line[:3] == '===':
            itsName = lastLine
            itsName = itsName[:chop]
        elif line[:chop] == '-----BEGIN CERTIFICATE-----':
            pem = [line]
        elif line[:chop] == '-----END CERTIFICATE-----':
            pem.append(line[:chop])
            x509 = X509.load_cert_string(''.join(pem))

            commonName = itsName.replace('&', '&amp;')
            commonName = commonName.replace('<', '&gt;')
            itsName = commonName.replace('/', '_')

            if not x509.verify():
                subject = x509.get_subject()
                # XXX log message?  remove old certificate?
                #print 'Skipping, does not verify:', subject.O, subject.CN
                #print x509.as_text()
                continue

            # More tests, although verify() should have caught these
            after = x509.get_not_after()
            try:
                if time.gmtime() > time.strptime(str(after),
                                                 '%b %d %H:%M:%S %Y %Z'):
                    subject = x509.get_subject()
                    # XXX log message?  remove old certificate?
                    #print 'Skipping expired:', subject.O, subject.CN, after
                    #print x509.as_text()
                    continue
            except ValueError:
                # XXX log message?  remove old certificate?
                #print 'ERROR: Bad certificate format (skipping)'
                #print x509.as_text()
                continue

            cert.Certificate.update(
                parcel,
                itsName,
                subjectCommonName=commonName,
                type="root",
                trust=3,
                fingerprintAlgorithm="sha1",
                fingerprint=fingerprint(x509),
                pem=lobType.makeValue(''.join(pem)),
                asText=lobType.makeValue(x509.as_text()),
            )
            pem = []

        elif pem:
            pem.append(line)

        lastLine = line
    def testCalendar(self):
        """ Simple test for creating instances of calendar related kinds """
        def getEventValue(event, attrName):
            try:
                attrName = getattr(type(event), attrName).name
            except AttributeError:
                pass
            return getattr(event.itsItem, attrName)

        def _verifyCalendarEvent(event):
            self.failUnless(stamping.has_stamp(event, Calendar.EventStamp))

            self.assertEqual(event.summary, uw("simple headline"))

            self.assertEqual(event.itsItem.importance, 'fyi')
            self.assertEqual(getEventValue(event, 'importance'), 'fyi')

            self.assertEqual(event.transparency, "confirmed")
            self.assertEqual(getEventValue(event, 'transparency'), "confirmed")

            self.assertEqual(event.allDay, False)
            self.assertEqual(getEventValue(event, 'allDay'), False)

            self.assertEqual(event.anyTime, True)
            self.assertEqual(getEventValue(event, 'anyTime'), True)

        def _verifyCalendarItems(location, recurrence):
            self.assertEqual(location.displayName, uw("simple location"))

        # Check that the globals got created by the parcel
        calendarPath = Path('//parcels/osaf/pim/calendar')
        view = self.sandbox.itsView

        self.assertEqual(schema.itemFor(Calendar.EventStamp, view),
                         view.find(Path(calendarPath, 'EventStamp')))
        self.assertEqual(Calendar.Location.getKind(view),
                         view.find(Path(calendarPath, 'Location')))
        self.assertEqual(Calendar.RecurrencePattern.getKind(view),
                         view.find(Path(calendarPath, 'RecurrencePattern')))

        # Construct a sample item
        calendarEventItem = Calendar.CalendarEvent("calendarEventItem",
                                                   itsParent=self.sandbox)
        locationItem = Calendar.Location("locationItem",
                                         itsParent=self.sandbox)
        recurrenceItem = Calendar.RecurrencePattern("recurrenceItem",
                                                    itsParent=self.sandbox)

        # CalendarEvent properties
        calendarEventItem.summary = uw("simple headline")
        calendarEventItem.itsItem.importance = "fyi"
        _verifyCalendarEvent(calendarEventItem)
        calendarEventItem.location = locationItem

        # Calendar properties
        locationItem.displayName = uw("simple location")
        _verifyCalendarItems(locationItem, recurrenceItem)

        # Check cloud membership - event + location
        items = calendarEventItem.itsItem.getItemCloud('copying')
        self.assertEqual(len(items), 2)

        # Re-examine items
        self.reopenRepository()
        view = self.sandbox.itsView

        calendarEventItem = Calendar.EventStamp(
            self.sandbox.getItemChild("calendarEventItem"))
        locationItem = self.sandbox.getItemChild("locationItem")
        recurrenceItem = self.sandbox.getItemChild("recurrenceItem")

        _verifyCalendarEvent(calendarEventItem)
        _verifyCalendarItems(locationItem, recurrenceItem)
Пример #31
0
 def testAnnotateForwardRefs(self):
     schema.itemFor(ForwardAnnotation, self.rv)
Пример #32
0
 def testDeriveFromCore(self):
     self.assertEqual(
         list(schema.itemFor(Mixed, self.rv).superKinds),
         [schema.itemFor(Dummy, self.rv), schema.itemFor(Types.Type, self.rv)]
     )
Пример #33
0
 def getCollection(cls, repoView):
     if cls.__use_collection__:
         return schema.itemFor(cls, repoView).collection
     else:
         return None
def makeSummaryBlocks(parcel):
    from osaf.framework.blocks.calendar import (
        CalendarContainer, CalendarControl, MultiWeekControl,
        CanvasSplitterWindow, AllDayEventsCanvas, TimedEventsCanvas,
        MultiWeekContainer)

    from Dashboard import DashboardBlock

    view = parcel.itsView
    detailblocks = schema.ns('osaf.views.detail', view)
    pim_ns = schema.ns('osaf.pim', view)
    blocks = schema.ns('osaf.framework.blocks', view)
    main = schema.ns("osaf.views.main", view)
    repositoryView = parcel.itsView

    # Register our attribute editors.
    # If you edit this dictionary, please keep it in alphabetical order by key.
    aeDict = {
        'EventStamp': 'ReminderColumnAttributeEditor',
        'MailStamp': 'CommunicationsColumnAttributeEditor',
        'TaskStamp': 'TaskColumnAttributeEditor',
        'Text+who': 'WhoAttributeEditor',
        'TriageEnum': 'TriageAttributeEditor',
    }
    attributeEditors.AttributeEditorMapping.register(parcel, aeDict, __name__)

    iconColumnWidth = 23  # temporarily not 20, to work around header bug 6168

    def makeColumnAndIndexes(colName, **kwargs):
        # Create an IndexDefinition that will be used later (when the user
        # clicks on the column header) to build the actual index.
        # By default, we always create index defs that will lazily create a
        # master index when the subindex is needed.
        indexName = kwargs['indexName']
        attributes = kwargs.pop('attributes', [])
        useCompare = kwargs.pop('useCompare', False)
        useMaster = kwargs.pop('useMaster', True)
        baseClass = kwargs.pop('baseClass', pim.AttributeIndexDefinition)
        columnClass = kwargs.pop('columnClass', Column)
        indexDefinition = baseClass.update(parcel,
                                           indexName,
                                           useMaster=useMaster,
                                           attributes=attributes)

        # If we want master indexes precreated, here's where
        # to do it.
        if useMaster: indexDefinition.makeMasterIndex()

        # Create the column
        return columnClass.update(parcel, colName, **kwargs)

    # We have to build the triage column first, because the other columns
    # delegate to its index
    triageColumn = makeColumnAndIndexes(
        'SumColTriage',
        icon='ColHTriageStatus',
        useSortArrows=False,
        defaultSort=True,
        scaleColumn=wxGrid.Grid.GRID_COLUMN_FIXED_SIZE,
        columnClass=TriageColumn,
        attributeName='sectionTriageStatus',
        indexName='%s.triage' % __name__,
        baseClass=TriageColumnIndexDefinition,
        attributes=list(dict(TriageColumnIndexDefinition.findParams)))

    taskColumn = makeColumnAndIndexes(
        'SumColTask',
        icon='ColHTask',
        valueType='stamp',
        stamp=pim.TaskStamp,
        width=iconColumnWidth,
        useSortArrows=False,
        scaleColumn=wxGrid.Grid.GRID_COLUMN_FIXED_SIZE,
        readOnly=True,
        indexName='%s.taskStatus' % __name__,
        baseClass=TaskColumnIndexDefinition,
        attributes=list(dict(TaskColumnIndexDefinition.findParams)),
    )

    commColumn = makeColumnAndIndexes(
        'SumColMail',
        icon='ColHMail',
        valueType='stamp',
        stamp=pim.mail.MailStamp,
        width=iconColumnWidth,
        useSortArrows=False,
        scaleColumn=wxGrid.Grid.GRID_COLUMN_FIXED_SIZE,
        readOnly=True,
        indexName=CommunicationStatus.status.name,
        attributeName=CommunicationStatus.status.name,
        baseClass=CommunicationColumnIndexDefinition,
        attributes=list(dict(CommunicationStatus.attributeValues)),
    )

    whoColumn = makeColumnAndIndexes(
        'SumColWho',
        heading=_(u'Who'),
        width=85,
        scaleColumn=wxGrid.Grid.GRID_COLUMN_SCALABLE,
        readOnly=True,
        indexName='%s.displayWho' % __name__,
        attributeName='displayWho',
        attributeSourceName='displayWhoSource',
        format='who',
        baseClass=WhoColumnIndexDefinition,
        attributes=list(dict(WhoColumnIndexDefinition.findParams)),
    )

    titleColumn = makeColumnAndIndexes(
        'SumColAbout',
        heading=_(u'Title'),
        width=120,
        scaleColumn=wxGrid.Grid.GRID_COLUMN_SCALABLE,
        indexName='%s.displayName' % __name__,
        attributeName='displayName',
        baseClass=TitleColumnIndexDefinition,
        attributes=list(dict(TitleColumnIndexDefinition.findParams)),
    )

    reminderColumn = makeColumnAndIndexes('SumColCalendarEvent',
        icon = 'ColHEvent',
        valueType = 'stamp',
        stamp = pim.EventStamp,
        useSortArrows = False,
        width = iconColumnWidth,
        scaleColumn = wxGrid.Grid.GRID_COLUMN_FIXED_SIZE,
        readOnly = True,
        indexName = '%s.calendarStatus' % __name__,
        baseClass=CalendarColumnIndexDefinition,
        attributes=list(dict(CalendarColumnIndexDefinition.findParams)) + \
                   ['displayDateSource'])

    dateColumn = makeColumnAndIndexes('SumColDate',
        heading = _(u'Date'),
        width = 115,
        scaleColumn = wxGrid.Grid.GRID_COLUMN_SCALABLE,
        readOnly = True,
        attributeName = 'displayDate',
        attributeSourceName = 'displayDateSource',
        indexName = '%s.displayDate' % __name__,
        baseClass=DateColumnIndexDefinition,
        attributes=list(dict(DateColumnIndexDefinition.findParams)) + \
                   ['displayDateSource'])

    rankColumn = makeColumnAndIndexes(
        'SumColRank',
        heading=_(u'Rank'),
        valueType='None',
        defaultSort=True,
        useSortArrows=False,
        useMaster=False,
        width=46,
        scaleColumn=wxGrid.Grid.GRID_COLUMN_SCALABLE,
        readOnly=True,
        indexName='%s.rank' % __name__,
        format='rank',
        baseClass=pim.NumericIndexDefinition,
        attributes=[])

    # Our detail views share the same delegate instance and contents collection
    detailBranchPointDelegate = detailblocks.DetailBranchPointDelegate.update(
        parcel,
        'DetailBranchPointDelegateInstance',
        branchStub=detailblocks.DetailRoot)

    iconColumnWidth = 23  # temporarily not 20, to work around header bug 6168
    DashboardSummaryViewTemplate = SplitterWindow.template(
        'DashboardSummaryViewTemplate',
        eventBoundary=True,
        orientationEnum="Vertical",
        splitPercentage=0.65,
        childBlocks=[
            BoxContainer.template(
                'DashboardSummaryContainer',
                orientationEnum='Vertical',
                childBlocks=[
                    DashboardBlock.template(
                        'DashboardSummaryView',
                        contents=pim_ns.allCollection,
                        scaleWidthsToFit=True,
                        columns=[
                            taskColumn, commColumn, whoColumn, titleColumn,
                            reminderColumn, dateColumn, triageColumn
                        ],
                        characterStyle=blocks.SummaryRowStyle,
                        headerCharacterStyle=blocks.SummaryHeaderStyle,
                        prefixCharacterStyle=blocks.SummaryPrefixStyle,
                        sectionLabelCharacterStyle=blocks.
                        SummarySectionLabelStyle,
                        sectionCountCharacterStyle=blocks.
                        SummarySectionCountStyle,
                        rowHeight=19,
                        elementDelegate='osaf.views.main.SectionedGridDelegate',
                        defaultEditableAttribute=u'displayName',
                        emptyContentsShow=False,
                        contextMenu="ItemContextMenu",
                        miniCalendar=main.MiniCalendar,
                        activeView=True),
                    HTML.template(
                        'SummaryEmptyDashBoardView',
                        text=
                        u'<html><body><center>&nbsp;<br>&nbsp;<br>%s</center></body></html>'
                        % _(u'0 items'),
                        treatAsURL=False,
                        contextMenu="ItemContextMenu",
                        emptyContentsShow=True)
                ]),
            BranchPointBlock.template('DashboardDetailBranchPointBlock',
                                      delegate=detailBranchPointDelegate)
        ]).install(parcel)  # SplitterWindow DashboardSummaryViewTemplate

    searchRankColumn = makeColumnAndIndexes(
        'SearchColRank',
        heading=_(u'Rank'),
        valueType='None',
        defaultSort=True,
        useSortArrows=False,
        useMaster=False,
        width=39,
        scaleColumn=wxGrid.Grid.GRID_COLUMN_NON_SCALABLE,
        readOnly=True,
        indexName='%s.rank' % __name__,
        format='rank',
        baseClass=pim.NumericIndexDefinition,
        attributes=[])

    searchTaskColumn = makeColumnAndIndexes(
        'SearchColTask',
        icon='ColHTask',
        valueType='stamp',
        stamp=pim.TaskStamp,
        width=iconColumnWidth,
        useSortArrows=False,
        scaleColumn=wxGrid.Grid.GRID_COLUMN_FIXED_SIZE,
        readOnly=True,
        indexName='%s.taskStatus' % __name__,
        baseClass=TaskColumnIndexDefinition,
        attributes=list(dict(TaskColumnIndexDefinition.findParams)),
    )

    searchCommColumn = makeColumnAndIndexes(
        'SearchColMail',
        icon='ColHMail',
        valueType='stamp',
        stamp=pim.mail.MailStamp,
        width=iconColumnWidth,
        useSortArrows=False,
        scaleColumn=wxGrid.Grid.GRID_COLUMN_FIXED_SIZE,
        readOnly=True,
        indexName=CommunicationStatus.status.name,
        attributeName=CommunicationStatus.status.name,
        baseClass=CommunicationColumnIndexDefinition,
        attributes=list(dict(CommunicationStatus.attributeValues)),
    )

    searchWhoColumn = makeColumnAndIndexes(
        'SearchColWho',
        heading=_(u'Who'),
        width=100,
        scaleColumn=wxGrid.Grid.GRID_COLUMN_SCALABLE,
        readOnly=True,
        indexName='%s.displayWho' % __name__,
        attributeName='displayWho',
        attributeSourceName='displayWhoSource',
        format='who',
        baseClass=WhoColumnIndexDefinition,
        attributes=list(dict(WhoColumnIndexDefinition.findParams)),
    )

    searchTitleColumn = makeColumnAndIndexes(
        'SearchColAbout',
        heading=_(u'Title'),
        width=120,
        scaleColumn=wxGrid.Grid.GRID_COLUMN_SCALABLE,
        indexName='%s.displayName' % __name__,
        attributeName='displayName',
        baseClass=TitleColumnIndexDefinition,
        attributes=list(dict(TitleColumnIndexDefinition.findParams)),
    )

    searchReminderColumn = makeColumnAndIndexes('SearchColCalendarEvent',
        icon = 'ColHEvent',
        valueType = 'stamp',
        stamp = pim.EventStamp,
        useSortArrows = False,
        width = iconColumnWidth,
        scaleColumn = wxGrid.Grid.GRID_COLUMN_FIXED_SIZE,
        readOnly = True,
        indexName = '%s.calendarStatus' % __name__,
        baseClass=CalendarColumnIndexDefinition,
        attributes=list(dict(CalendarColumnIndexDefinition.findParams)) + \
                   ['displayDateSource'])

    searchDateColumn = makeColumnAndIndexes('SearchColDate',
        heading = _(u'Date'),
        width = 100,
        scaleColumn = wxGrid.Grid.GRID_COLUMN_SCALABLE,
        readOnly = True,
        attributeName = 'displayDate',
        attributeSourceName = 'displayDateSource',
        indexName = '%s.displayDate' % __name__,
        baseClass=DateColumnIndexDefinition,
        attributes=list(dict(DateColumnIndexDefinition.findParams)) + \
                   ['displayDateSource'])

    searchTriageColumn = makeColumnAndIndexes(
        'SearchColTriage',
        icon='ColHTriageStatus',
        useSortArrows=False,
        width=39,
        scaleColumn=wxGrid.Grid.GRID_COLUMN_FIXED_SIZE,
        collapsedSections=set(
            [str(pim.TriageEnum.later),
             str(pim.TriageEnum.done)]),
        attributeName='sectionTriageStatus',
        indexName='%s.triage' % __name__,
        baseClass=TriageColumnIndexDefinition,
        attributes=list(dict(TriageColumnIndexDefinition.findParams)))

    SplitterWindow.template(
        'SearchResultsViewTemplate',
        orientationEnum="Vertical",
        splitPercentage=0.65,
        eventBoundary=True,
        childBlocks=[
            BoxContainer.template(
                'SearchResultsSummaryContainer',
                orientationEnum='Vertical',
                childBlocks=[
                    DashboardBlock.template(
                        'SearchResultsSummaryView',
                        contents=pim_ns.allCollection,
                        scaleWidthsToFit=True,
                        columns=[
                            searchRankColumn, searchTaskColumn,
                            searchCommColumn, searchWhoColumn,
                            searchTitleColumn, searchReminderColumn,
                            searchDateColumn, searchTriageColumn
                        ],
                        characterStyle=blocks.SummaryRowStyle,
                        headerCharacterStyle=blocks.SummaryHeaderStyle,
                        prefixCharacterStyle=blocks.SummaryPrefixStyle,
                        sectionLabelCharacterStyle=blocks.
                        SummarySectionLabelStyle,
                        sectionCountCharacterStyle=blocks.
                        SummarySectionCountStyle,
                        rowHeight=19,
                        elementDelegate='osaf.views.main.SectionedGridDelegate',
                        defaultEditableAttribute=u'displayName',
                        miniCalendar=main.MiniCalendar,
                        emptyContentsShow=False,
                        activeView=True),
                    HTML.template(
                        'SearchResultsEmptyDashBoardView',
                        text=
                        u'<html><body><center>&nbsp;<br>&nbsp;<br>%s</center></body></html>'
                        % _(u'0 items'),
                        treatAsURL=False,
                        emptyContentsShow=True)
                ]),
            BranchPointBlock.template(
                'SearchResultsSummaryDetailBranchPointBlock',
                delegate=detailBranchPointDelegate)
        ]).install(parcel)  # SplitterWindow SearchResultsViewTemplate

    TimeZoneChange = BlockEvent.template(
        'TimeZoneChange', dispatchEnum='BroadcastEverywhere').install(parcel)

    DefaultCharacterStyle = CharacterStyle.update(parcel,
                                                  'DefaultCharacterStyle',
                                                  fontFamily='DefaultUIFont')

    DefaultSmallBoldStyle = CharacterStyle.update(parcel,
                                                  'DefaultSmallBoldStyle',
                                                  fontFamily='DefaultUIFont',
                                                  fontSize=10.0,
                                                  fontStyle='bold')

    DefaultBigStyle = CharacterStyle.update(parcel,
                                            'DefaultBigStyle',
                                            fontFamily='DefaultUIFont',
                                            fontSize=12.0)

    DefaultBoldStyle = CharacterStyle.update(parcel,
                                             'DefaultBoldStyle',
                                             fontFamily='DefaultUIFont',
                                             fontStyle='bold')

    DefaultBigBoldStyle = CharacterStyle.update(parcel,
                                                'DefaultBigBoldStyle',
                                                fontFamily='DefaultUIFont',
                                                fontSize=13,
                                                fontStyle='bold')

    # save the template because we'll need it for later
    MainMultiWeekControlTemplate = MultiWeekControl.template(
        'MainMultiWeekControl',
        tzCharacterStyle=DefaultCharacterStyle,
        dayMode='multiweek',
        stretchFactor=0)

    MainMultiWeekControl = MainMultiWeekControlTemplate.install(parcel)

    MultiWeekDetailBranchPointBlock = BranchPointBlock.template(
        'MultiWeekDetailBranchPointBlock',
        delegate=detailBranchPointDelegate,
    ).install(parcel)

    MultiWeekCalendarView = MultiWeekContainer.template(
        'MultiWeekCalendarView',
        calendarControl=MainMultiWeekControl,
        monthLabelStyle=blocks.BigTextStyle,
        eventLabelStyle=DefaultCharacterStyle,
        eventTimeStyle=DefaultSmallBoldStyle,
        legendStyle=DefaultCharacterStyle,
        orientationEnum='Vertical',
        dayMode='multiweek',
        eventsForNamedLookup=[TimeZoneChange]).install(parcel)

    SplitterWindow.template(
        'MultiWeekViewTemplate',
        eventBoundary=True,
        orientationEnum='Vertical',
        splitPercentage=0.65,
        treeController=MainMultiWeekControl,
        childBlocks=[
            MultiWeekContainer.template(
                'MultiWeekCalendarView',
                childBlocks=[
                    MainMultiWeekControlTemplate,
                    calendar.MultiWeekCanvas.template(
                        'MultiWeekCanvas',
                        calendarContainer=MultiWeekCalendarView,
                        contextMenu="ItemContextMenu",
                        miniCalendar=main.MiniCalendar,
                        dayMode='multiweek',
                        activeView=True)
                ]), MultiWeekDetailBranchPointBlock
        ]).install(parcel)

    MultiWeekControl.update(parcel,
                            'MainMultiWeekControl',
                            calendarContainer=MultiWeekCalendarView)

    # save the template because we'll need it for later
    MainCalendarControlT = CalendarControl.template(
        'MainCalendarControl',
        tzCharacterStyle=DefaultCharacterStyle,
        stretchFactor=0)

    MainCalendarControl = MainCalendarControlT.install(parcel)

    CalendarDetailBranchPointBlock = BranchPointBlock.template(
        'CalendarDetailBranchPointBlock',
        delegate=detailBranchPointDelegate,
    ).install(parcel)

    WelcomeEvent = schema.ns('osaf.app', view).WelcomeEvent
    CalendarDetailBranchPointBlock.selectedItem = WelcomeEvent

    CalendarSummaryView = CalendarContainer.template(
        'CalendarSummaryView',
        calendarControl=MainCalendarControl,
        monthLabelStyle=blocks.BigTextStyle,
        eventLabelStyle=DefaultCharacterStyle,
        eventTimeStyle=DefaultSmallBoldStyle,
        legendStyle=DefaultCharacterStyle,
        orientationEnum='Vertical',
        eventsForNamedLookup=[TimeZoneChange]).install(parcel)

    SplitterWindow.template(
        'CalendarSummaryViewTemplate',
        eventBoundary=True,
        orientationEnum='Vertical',
        splitPercentage=0.65,
        treeController=MainCalendarControl,
        childBlocks=[
            CalendarContainer.template(
                'CalendarSummaryView',
                childBlocks=[
                    MainCalendarControlT,
                    CanvasSplitterWindow.template(
                        'MainCalendarCanvasSplitter',
                        # as small as possible; AllDayEvents's
                        # SetMinSize() should override?
                        splitPercentage=0.06,
                        orientationEnum='Horizontal',
                        calendarControl=MainCalendarControl,
                        childBlocks=[
                            calendar.AllDayEventsCanvas.template(
                                'AllDayEvents',
                                calendarContainer=CalendarSummaryView,
                                contextMenu="ItemContextMenu"),
                            calendar.TimedEventsCanvas.template(
                                'TimedEvents',
                                calendarContainer=CalendarSummaryView,
                                contextMenu="ItemContextMenu",
                                miniCalendar=main.MiniCalendar,
                                activeView=True)
                        ]),
                ]),
            CalendarDetailBranchPointBlock
        ]).install(parcel)

    CalendarControl.update(parcel,
                           'MainCalendarControl',
                           calendarContainer=CalendarSummaryView)

    # Precache detail views for the basic pim types (and "Block",
    # which is the key used for the None item). Note that the basic
    # stamps (Event, Task, Mail) are now covered by Note
    for keyType in (pim.Note, Block.Block):
        detailBranchPointDelegate.getBranchForKeyItem(
            schema.itemFor(keyType, view))
Пример #35
0
        module = schema.importString(modname)
        if cls not in module.__dict__.values():
            imports_needed.setdefault(modname,[]).append(classname)

    if not isinstance(cls,schema.ItemClass) and cls not in schema.nrv._schema_cache:
        if schema.Base in cls.__bases__:
            non_schema.append(classname)
        else:
            for b in cls.__mro__:
                if schema.Base in b.__bases__:
                    non_schema.append(name_of(b))
            derived_non_schema.append(classname)
        continue

    try:
        item = schema.itemFor(cls)
    except:
        unloadable.append(classname)
        continue

    _hash = item.hashItem()
    attrs = item_names_of(item,'attributes')
    clouds = item_names_of(item,'clouds')
    supers = [sk.itsName for sk in item.superKinds]

    for kind in kinds:
        if kind.itsPath<>item.itsPath:
            diff_path.append(classname)
        if kind.itsName<>item.itsName:
            print
            print classname, "has a different name than", kind.itsPath
Пример #36
0
    def testMail(self):
        """ Simple test for creating instances of email related kinds """

        self.loadParcel("osaf.pim.mail")


        # Test the globals
        mailPath = Path('//parcels/osaf/pim/mail')
        view = self.view

        self.assertEqual(Mail.AccountBase.getKind(view),
                         view.find(Path(mailPath, 'AccountBase')))

        self.assertEqual(Mail.IMAPAccount.getKind(view),
                         view.find(Path(mailPath, 'IMAPAccount')))

        self.assertEqual(Mail.SMTPAccount.getKind(view),
                         view.find(Path(mailPath, 'SMTPAccount')))

        self.assertEqual(schema.itemFor(Mail.MIMEBase, view),
                         view.find(Path(mailPath, 'MIMEBase')))

        self.assertEqual(schema.itemFor(Mail.MIMENote, view),
                         view.find(Path(mailPath, 'MIMENote')))

        self.assertEqual(schema.itemFor(Mail.MailStamp, view),
                         view.find(Path(mailPath, 'MailStamp')))

        self.assertEqual(schema.itemFor(Mail.MIMEBinary, view),
                         view.find(Path(mailPath, 'MIMEBinary')))

        self.assertEqual(schema.itemFor(Mail.MIMEText, view),
                         view.find(Path(mailPath, 'MIMEText')))

        self.assertEqual(schema.itemFor(Mail.MIMEContainer, view),
                         view.find(Path(mailPath, 'MIMEContainer')))

        self.assertEqual(schema.itemFor(Mail.MIMESecurity, view),
                         view.find(Path(mailPath, 'MIMESecurity')))

        self.assertEqual(Mail.EmailAddress.getKind(view),
                         view.find(Path(mailPath, 'EmailAddress')))


        # Construct sample items
        accountBaseItem = Mail.AccountBase("accountBaseItem", itsView=view)
        imapAccountItem = Mail.IMAPAccount("imapAccountItem", itsView=view)
        smtpAccountItem = Mail.SMTPAccount("smtpAccountItem", itsView=view)

        mimeBaseObject = Mail.MIMEBase("mimeBaseItem", itsView=view)
        mimeNoteObject = Mail.MIMENote("mimeNoteItem", itsView=view)
        mailMessageObject = Mail.MailMessage("mailMessageItem", itsView=view)
        mimeBinaryObject = Mail.MIMEBinary("mimeBinaryItem", itsView=view)
        mimeTextObject = Mail.MIMEText("mimeTextItem", itsView=view)
        mimeContainerObject = Mail.MIMEContainer("mimeContainerItem", itsView=view)
        mimeSecurityObject = Mail.MIMESecurity("mimeSecurityItem", itsView=view)
        emailAddressItem = Mail.EmailAddress("emailAddressItem", itsView=view)

        # Double check kinds
        self.assertEqual(accountBaseItem.itsKind,
                         Mail.AccountBase.getKind(view))

        self.assertEqual(imapAccountItem.itsKind,
                         Mail.IMAPAccount.getKind(view))

        self.assertEqual(smtpAccountItem.itsKind,
                         Mail.SMTPAccount.getKind(view))

        self.failUnless(isinstance(mimeBaseObject, Mail.MIMEBase))
        self.failUnless(isinstance(mimeNoteObject, Mail.MIMENote))

        self.failUnless(isinstance(mailMessageObject, Mail.MailStamp))
        self.failUnless(isinstance(mailMessageObject.itsItem, Note))
        self.failUnless(has_stamp(mailMessageObject, Mail.MailStamp))

        self.failUnless(isinstance(mimeBinaryObject, Mail.MIMEBinary))

        self.failUnless(isinstance(mimeTextObject, Mail.MIMEText))

        self.failUnless(isinstance(mimeContainerObject, Mail.MIMEContainer))

        self.failUnless(isinstance(mimeSecurityObject, Mail.MIMESecurity))

        self.assertEqual(emailAddressItem.itsKind, Mail.EmailAddress.getKind(view))

        accountBaseItem = self.__populateAccount(accountBaseItem)
        smtpAccountItem = self.__populateAccount(smtpAccountItem)
        imapAccountItem = self.__populateAccount(imapAccountItem)

        mimeBaseObject.mimeType = "SGML"
        mimeBinaryObject.mimeType = "APPLICATION"
        mimeTextObject.mimeType = "PLAIN"
        mimeContainerObject.mimeType = "ALTERNATIVE"
        mimeSecurityObject.mimeType = "SIGNED"

        # Literal properties
        mailMessageObject.dateSent = datetime.now(view.tzinfo.default)
        mailMessageObject.subject = uw("Hello")
        self.assertEqual(mailMessageObject.subject,
                         mailMessageObject.itsItem.displayName)
        #mailMessageObject.spamScore = 5

        # Item Properties
        emailAddressItem.emailAddress = u"*****@*****.**"
        mailMessageObject.replyToAddress = emailAddressItem

        self._reopenRepository()
        view = self.view

        contentItemParent = view.findPath("//userdata")
        mailMessageItem = contentItemParent.getItemChild("mailMessageItem")

        #Test cloud membership

        items = mailMessageItem.getItemCloud('copying')
        self.assertEqual(len(items), 3) # item & reply-to address, mimeContent