def ItemsToVobject(self): """Tests itemsToVObject, which converts Chandler items to vobject.""" event = Calendar.CalendarEvent(view = self.repo.view) event.displayName = "test" event.startTime = datetime.datetime(2010, 1, 1, 10) event.endTime = datetime.datetime(2010, 1, 1, 11) cal = ICalendar.itemsToVObject(self.repo.view, [event]) self.assert_(cal.vevent[0].summary[0].value == "test", "summary not set properly, summary is %s" % cal.vevent[0].summary[0].value) start = event.startTime.replace(tzinfo=ICalendar.localtime) self.assert_(cal.vevent[0].dtstart[0].value == start, "dtstart not set properly, dtstart is %s" % cal.vevent[0].summary[0].value) event = Calendar.CalendarEvent(view = self.repo.view) event.displayName = "test2" event.startTime = datetime.datetime(2010, 1, 1) event.allDay = True cal = ICalendar.itemsToVObject(self.repo.view, [event]) self.assert_(cal.vevent[0].dtstart[0].value == datetime.date(2010,1,1), "dtstart for allDay event not set properly, dtstart is %s" % cal.vevent[0].summary[0].value)
def processRequest(self, view, request): if view is None: view = self._repository.createView(self.getName(), pruneSize=50) view.refresh() try: data, path = request dir, filename = path.split('/', 1) events, name = ICalendar.itemsFromVObject(view, data) if name is None: name = filename c = SmartCollection(itsView=view, displayName=name) schema.ns("osaf.app", view).sidebarCollection.add(c) for event in events: c.add(event.getMaster().itsItem) view.commit() except Exception, e: print traceback.format_exc() view.cancel()
def testExportFreeBusy(self): self.Import(self.view, u'AllDay.ics') schema.ns('osaf.pim', self.view).mine.addSource(self.importedCollection) start = datetime.datetime(2005,1,1, tzinfo=self.view.tzinfo.floating) end = start + datetime.timedelta(2) cal = ICalendar.itemsToFreeBusy(self.view, start, end) busy_start, busy_end = cal.vfreebusy.freebusy.value[0] self.assertEqual(busy_end - busy_start, datetime.timedelta(1))
def testExportFreeBusy(self): self.Import(self.view, u'AllDay.ics') schema.ns('osaf.pim', self.view).mine.addSource(self.importedCollection) start = datetime.datetime(2005, 1, 1, tzinfo=self.view.tzinfo.floating) end = start + datetime.timedelta(2) cal = ICalendar.itemsToFreeBusy(self.view, start, end) busy_start, busy_end = cal.vfreebusy.freebusy.value[0] self.assertEqual(busy_end - busy_start, datetime.timedelta(1))
def testImport(self): if os.environ.get('CHANDLER_PERFORMANCE_TEST'): self.loadParcel("parcel:osaf.pim.calendar") path = os.path.join(os.getenv('CHANDLERHOME') or '.', 'parcels', 'osaf', 'sharing', 'tests') conduit = Sharing.FileSystemConduit(name="conduit", sharePath=path, shareName="3kevents.ics", view=self.rep.view) format = ICalendar.ICalendarFormat(name="format", view=self.rep.view) share = Sharing.Share(name="share", conduit=conduit, format=format, view=self.rep.view) share.get()
def Import(self, view, filename): path = os.path.join(os.getenv('CHANDLERHOME') or '.', 'parcels', 'osaf', 'sharing', 'tests') sandbox = self.repo.findPath("//sandbox") conduit = Sharing.FileSystemConduit(parent=sandbox, sharePath=path, shareName=filename, view=view) format = ICalendar.ICalendarFormat(parent=sandbox) self.share = Sharing.Share(parent=sandbox, conduit=conduit, format=format) self.share.get() return format
def writeICalendarUnicodeBug3338(self): event = Calendar.CalendarEvent(view = self.repo.view) event.displayName = u"unicode \u0633\u0644\u0627\u0645" event.startTime = datetime.datetime(2010, 1, 1, 10) event.endTime = datetime.datetime(2010, 1, 1, 11) coll = ItemCollection(name="testcollection", parent=self.sandbox) coll.add(event) filename = "unicode_export.ics" conduit = Sharing.FileSystemConduit(name="conduit", sharePath=".", shareName=filename, view=self.repo.view) format = ICalendar.ICalendarFormat(name="format", view=self.repo.view) self.share = Sharing.Share(name="share",contents=coll, conduit=conduit, format=format, view=self.repo.view) if self.share.exists(): self.share.destroy() self.share.create() self.share.put() cal=vobject.readComponents(file(filename, 'rb')).next() self.assertEqual(cal.vevent[0].summary[0].value, event.displayName) self.share.destroy()
def open(self, path, flags): if flags == os.O_RDONLY: if path.startswith('sidebar/'): if path in self.openFiles: self.openFiles[path][1] += 1 return True self.view.refresh() dir, name = path.split('/', 1) sidebar = schema.ns('osaf.app', self.view).sidebarCollection for c in sidebar: if c.displayName == name: for item in c: if has_stamp(item, EventStamp): break else: return False cal = ICalendar.itemsToVObject(self.view, c) data = cal.serialize() self.openFiles[path] = [data, 1, flags] return True elif flags == os.O_WRONLY: if path.startswith('sidebar/'): if path.endswith('.ics'): self.openFiles[path] = ['', 1, flags] return True elif flags == os.O_CREAT: # coming from mknod (FUSE pre 2.5) if path.endswith('.ics'): self.openFiles[path] = ['', 1, 0] return True return False
def OnOk(self, evt): title = self.textTitle.GetValue() shareName = self.textShareName.GetValue() accountIndex = self.choiceAccount.GetSelection() - 1 account = self.accounts[accountIndex] if not self.join: collIndex = self.choiceColl.GetSelection() - 1 collection = self.collections[collIndex] if self.share is None: conduit = Sharing.WebDAVConduit(account=account, shareName=shareName, view=self.view) if shareName.endswith('.ics'): format = ICalendar.ICalendarFormat(view=self.view) else: format = Sharing.CloudXMLFormat(view=self.view) if self.join: self.share = Sharing.Share(conduit=conduit, format=format, view=self.view) else: self.share = Sharing.Share(contents=collection, conduit=conduit, format=format, view=self.view) self.share.displayName = title else: self.share.displayName = title self.share.conduit.account = account self.share.conduit.shareName = shareName self.share.contents = collection self.EndModal(True)
def OnPublish(self, evt): # Publish the collection # Update the UI by disabling/hiding various panels, and swapping in a # new set of buttons self.mainPanel.Enable(False) self.buttonPanel.Hide() self.mySizer.Detach(self.buttonPanel) self.buttonPanel = self.resources.LoadPanel(self, "PublishingButtonsPanel") self.mySizer.Add(self.buttonPanel, 0, wx.GROW|wx.ALL, 5) publishingButton = wx.xrc.XRCCTRL(self, "BUTTON_PUBLISHING") publishingButton.Enable(False) self.Bind(wx.EVT_BUTTON, self.OnPublishDone, id=wx.ID_CANCEL) self._clearStatus() self._resize() wx.Yield() try: # Populate the list of existing shares on the selected webdav server self.existing = self._getExistingFiles() suggestedName = self._suggestName() shareName = suggestedName shareNameSafe = urllib.quote_plus(shareName.encode('utf-8')) accountIndex = self.accountsControl.GetSelection() account = self.accountsControl.GetClientData(accountIndex) # Create the main share object shareXML = Sharing.newOutboundShare(self.view, self.collection, kinds=self.filterKinds, shareName=shareNameSafe, account=account) self.shareXML = shareXML shareXML.displayName = shareName self._saveAttributeFilterState(shareXML) # Create the secondary (.ics) share object iCalName = "%s.ics" % shareNameSafe shareICal = Sharing.newOutboundShare(self.view, self.collection, kinds=self.filterKinds, shareName=iCalName, account=account) self.shareICal = shareICal shareICal.displayName = "%s.ics" % shareName self._saveAttributeFilterState(shareICal) # For the .ics share, use ICalendarFormat instead format = ICalendar.ICalendarFormat(view=self.view) shareICal.mode = "put" shareICal.format = format shareICal.hidden = True self._showStatus("Wait for Sharing URLs...\n") if shareXML.exists(): raise Sharing.SharingError("Share already exists") else: self._showStatus("Creating collection on server...") shareXML.create() self._showStatus(" done.\n") self._showStatus("Publishing collection to server...") shareXML.put() self._showStatus(" done.\n") self._showStatus("Publishing calendar file to server...") shareICal.put() self._showStatus(" done.\n") except (Sharing.SharingError, zanshin.error.Error), e: # Display the error # self._clearStatus() self._showStatus("\nSharing error:\n%s\n" % e.message) logger.exception("Failed to publish collection") # self._showStatus("Exception:\n%s" % traceback.format_exc(10)) # Clean up all share objects we created try: shareXML.delete(True) shareICal.delete(True) except: pass # Re-enable the main panel and switch back to the "Share" button self.mainPanel.Enable(True) self.buttonPanel.Hide() self.mySizer.Detach(self.buttonPanel) self.buttonPanel = self.resources.LoadPanel(self, "PublishButtonsPanel") self.mySizer.Add(self.buttonPanel, 0, wx.GROW|wx.ALL, 5) self.Bind(wx.EVT_BUTTON, self.OnPublish, id=wx.ID_OK) self.Bind(wx.EVT_BUTTON, self.OnCancel, id=wx.ID_CANCEL) self._resize() return