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
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)
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)
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)
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)
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)
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)
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]
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] )
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)
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])
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
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
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)
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> <br> <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> <br> <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))
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('&', '&') commonName = commonName.replace('<', '>') 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 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)
def getCollection(cls, repoView): if cls.__use_collection__: return schema.itemFor(cls, repoView).collection else: return None
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)
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
def testDeriveFromCore(self): self.assertEqual( list(schema.itemFor(Mixed).superKinds), [schema.itemFor(Dummy), schema.itemFor(Query)] )
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 )
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)
def testDeriveFromCore(self): self.assertEqual(list(schema.itemFor(Mixed, self.rv).superKinds), [ schema.itemFor(Dummy, self.rv), schema.itemFor(Types.Type, self.rv) ])
def testAnnotateForwardRefs(self): schema.itemFor(ForwardAnnotation, self.rv)
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('&', '&') commonName = commonName.replace('<', '>') 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)
def testDeriveFromCore(self): self.assertEqual( list(schema.itemFor(Mixed, self.rv).superKinds), [schema.itemFor(Dummy, self.rv), schema.itemFor(Types.Type, self.rv)] )
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> <br> <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> <br> <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))
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