示例#1
0
    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)
示例#2
0
    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 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()
示例#4
0
    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))
示例#5
0
    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))
示例#6
0
    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()
示例#7
0
    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
示例#8
0
    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()
示例#9
0
    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
示例#10
0
    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)
示例#11
0
    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
示例#12
0
    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