示例#1
0
    def awakeFromNib(self):
        def onGrowlClick():
            self.applicationRef.unhide()
            self.cbxInput.becomeFirstResponder()

        self.notification = Notification(onGrowlClick)
        self.initControls()
        self.initWindow()
        self.readCounters()
        self._timer = (
            NSTimer.
            scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_(
                userPrefs.timerInterval, self, self.timerFunction, None, True))
    def test_message_producer_send(self):
        # given
        EVENT_TYPE = "create_user"
        self.ps.subscribe(EVENT_TYPE)
        # when
        message_producer = MessageProducer()
        event = DomainEventImpl("v1")
        notification = Notification(notification_id=1,
                                    event=event,
                                    type_name=EVENT_TYPE,
                                    version="v1")
        # when
        # sleep for 0.5 sec to ensure successfully subscribe topic
        time.sleep(0.5)
        message_producer.send(notification)

        # then
        self.ps.get_message()  # first message is channel message

        @retry(stop=stop_after_delay(10),
               wait=wait_exponential(multiplier=1, min=1, max=2))
        def retry_get_message():
            message = self.ps.get_message()
            if message is None or message['type'] is 'subscribe':
                raise Exception(
                    "message is None or type is subscribe, retry...")
            # then
            result = pickle.loads(message['data'])
            self.assertEqual(result, event)

        retry_get_message()
    def test_properties(self):
        event = DomainEventImpl("v1")
        noti = Notification(notification_id=1,
                            event=event,
                            type_name="create_user",
                            version="v1")

        self.assertEqual(noti.notification_id, 1)
        self.assertEqual(noti.event, event)
        self.assertEqual(noti.type_name, "create_user")
        self.assertEqual(noti.version, "v1")
        self.assertIsNotNone(noti.occurred_on)
示例#4
0
    def awakeFromNib(self):
        def onGrowlClick():
            self.applicationRef.unhide()
            self.cbxInput.becomeFirstResponder()

        self.notification = Notification(onGrowlClick)
        self.initControls()
        self.initWindow()
        self.readCounters()
        self._timer = (NSTimer.
            scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_(
                userPrefs.timerInterval, self, self.timerFunction, None, True))
示例#5
0
class MainController(NSObject):

    outputArea = objc.IBOutlet("outputArea")

    lblTimeLeft = objc.IBOutlet("lblTimeLeft")

    lblTimeSpentCurr = objc.IBOutlet("lblTimeSpentCurr")

    cbxInput = objc.IBOutlet("cbxInput")

    lblSlackingTime = objc.IBOutlet("lblSlackingTime")

    lblTimeSpent = objc.IBOutlet("lblTimeSpent")

    lblWorkTill = objc.IBOutlet("lblWorkTill")

    pbtnProject = objc.IBOutlet("pbtnProject")

    workTillBox = objc.IBOutlet("workTillBox")

    mainWindow = objc.IBOutlet("mainWindow")

    applicationRef = objc.IBOutlet("applicationRef")

    btnDone = objc.IBOutlet("btnDone")

    reportWindow = None

    tasks = None

    @property
    @memoize
    def reportsController(self):
        controller = ReportsController.alloc().init()
        self.reportWindow = controller.window()
        return controller

    @property
    @memoize
    def preferencesController(self):
        return PreferencesController.alloc().initWithMainContorller(self)

    def awakeFromNib(self):
        def onGrowlClick():
            self.applicationRef.unhide()
            self.cbxInput.becomeFirstResponder()

        self.notification = Notification(onGrowlClick)
        self.initControls()
        self.initWindow()
        self.readCounters()
        self._timer = (
            NSTimer.
            scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_(
                userPrefs.timerInterval, self, self.timerFunction, None, True))

    def initControls(self):
        """Init basic controls"""
        self.outputArea.setString_("")

        self.tasks = Tasks()

        if userPrefs.showWorkTill:
            self.workTillBox.setHidden_(False)
        else:
            self.workTillBox.setHidden_(True)

        self.pbtnProject.removeAllItems()
        self.pbtnProject.addItemsWithTitles_(Projects.get())
        self.pbtnProject.selectItemWithTitle_(userPrefs.selectedProject)

        self.projectChange_(None)

        self.initDoneButton()

        self.fillTasks()
        self.scrollToEnd()

    def initDoneButton(self):
        if self.tasks.dayStarted():
            self.btnDone.setTitle_("Done")
        else:
            self.btnDone.setTitle_("Start")

    def initWindow(self):
        """Init window sizes and positions"""
        self.mainWindow.setFrameAutosaveName_("mainWindow")

    def timerFunction(self):
        """Timer callback function"""
        self.tasks.setCurrentTask(self.cbxInput.stringValue())
        self.readCounters()

        self.notification.idleNotify(self.tasks.timings.currentSeconds)

        if self.tasks.timings.isNextDay():
            self.initControls()

    def readCounters(self):
        """Read counters"""
        self.lblTimeSpent.setStringValue_(
            fh.secToTimeStr(self.tasks.timings.spentSeconds))
        self.lblSlackingTime.setStringValue_(
            fh.secToTimeStr(self.tasks.timings.slackingSeconds))
        self.lblTimeLeft.setStringValue_(
            fh.secToTimeStr(self.tasks.timings.leftSeconds))
        self.lblTimeSpentCurr.setStringValue_(
            fh.secToTimeStr(self.tasks.timings.currentSeconds))
        self.lblWorkTill.setStringValue_(
            fh.timeStructToTimeStr(self.tasks.timings.workTillTime))

    def appendTask(self, taskString, color):
        def appendText(text, color=None):
            """Append text to task text area"""
            endRange = NSRange()
            endRange.location = self.outputArea.textStorage().length()
            endRange.length = 0
            self.outputArea.replaceCharactersInRange_withString_(
                endRange, text)
            if color:
                colorRange = NSRange()
                colorRange.location = (self.outputArea.textStorage().length() -
                                       len(text))
                colorRange.length = len(text)
                self.outputArea.setTextColor_range_(color, colorRange)

        appendText(taskString, color)

        if self.reportWindow and self.reportWindow.isVisible():
            self.reportsController.generateChart()

    def fillTasks(self):
        """Fill text area with tasks"""
        for task in self.tasks.taskList:
            self.appendTask(*fh.formatTaskString(*task))

    def scrollToEnd(self):
        """Scroll tasks textarea to the end"""
        self.outputArea.scrollRangeToVisible_(
            NSMakeRange(self.outputArea.string().length(), 0))

    def showStartHelpMessage(self):
        """Show alert with help message"""
        alert = NSAlert.alloc().init()
        alert.addButtonWithTitle_('OK')
        alert.setMessageText_("Congrats, you started your working day!")
        alert.setInformativeText_(
            "Now start doing your working activity "
            "(e.g reading mail). When you finish with your activity "
            "go back to MacTimeLog and type it in. If your activity is "
            "slacking, use 2 asterisks (**) at the end of the activity's "
            "name.")
        alert.setShowsSuppressionButton_(True)
        alert.runModal()
        if alert.suppressionButton().state() == NSOnState:
            userPrefs.showHelpMessageOnStart = False
            userPrefs.save()

    @objc.IBAction
    def btnDonePress_(self, sender):
        """On done button press"""
        if self.tasks.dayStarted():
            if self.cbxInput.stringValue().strip():
                taskName = self.cbxInput.stringValue()
                self.appendTask(*fh.formatTaskString(*self.tasks.add(
                    taskName, self.pbtnProject.titleOfSelectedItem())))
                self.readCounters()
                self.cbxInput.setStringValue_("")
                self.scrollToEnd()

                if Tasks.taskType(taskName) == "work":
                    Projects.addAutocomplete(
                        self.pbtnProject.titleOfSelectedItem(), taskName)
                else:
                    SlackingAutocompletes.add(taskName)
                self.cbxInput.addItemWithObjectValue_(taskName)
        else:
            if userPrefs.showHelpMessageOnStart:
                self.showStartHelpMessage()
            taskName = userPrefs.startPlaceholder
            self.appendTask(*fh.formatTaskString(*self.tasks.add(taskName)))
            self.initDoneButton()

    @objc.IBAction
    def projectChange_(self, sender):
        """Project changed event"""
        if self.pbtnProject.titleOfSelectedItem():
            self.cbxInput.removeAllItems()
            self.cbxInput.addItemsWithObjectValues_(
                Projects.getAutocomleteList(
                    self.pbtnProject.titleOfSelectedItem(),
                    SlackingAutocompletes.get()))

        if sender:
            userPrefs.selectedProject = unicode(
                self.pbtnProject.titleOfSelectedItem())
            userPrefs.save()

    @objc.IBAction
    def openLog_(self, sender):
        """ Open log in text editor"""
        os.system(userPrefs.logEditCommand % settings.LOG_PATH)

    @objc.IBAction
    def openReports_(self, sender):
        """Open reports window"""
        self.reportsController.showWindow_(sender)

    @objc.IBAction
    def openPreferences_(self, sender):
        """Open preferences window"""
        self.preferencesController.showWindow_(sender)
示例#6
0
class MainController(NSObject):

    outputArea = objc.IBOutlet("outputArea")

    lblTimeLeft = objc.IBOutlet("lblTimeLeft")

    lblTimeSpentCurr = objc.IBOutlet("lblTimeSpentCurr")

    cbxInput = objc.IBOutlet("cbxInput")

    lblSlackingTime = objc.IBOutlet("lblSlackingTime")

    lblTimeSpent = objc.IBOutlet("lblTimeSpent")

    lblWorkTill = objc.IBOutlet("lblWorkTill")

    pbtnProject = objc.IBOutlet("pbtnProject")

    workTillBox = objc.IBOutlet("workTillBox")

    mainWindow = objc.IBOutlet("mainWindow")

    applicationRef = objc.IBOutlet("applicationRef")

    btnDone = objc.IBOutlet("btnDone")

    reportWindow = None

    tasks = None

    @property
    @memoize
    def reportsController(self):
        controller = ReportsController.alloc().init()
        self.reportWindow = controller.window()
        return controller

    @property
    @memoize
    def preferencesController(self):
        return PreferencesController.alloc().initWithMainContorller(self)

    def awakeFromNib(self):
        def onGrowlClick():
            self.applicationRef.unhide()
            self.cbxInput.becomeFirstResponder()

        self.notification = Notification(onGrowlClick)
        self.initControls()
        self.initWindow()
        self.readCounters()
        self._timer = (NSTimer.
            scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_(
                userPrefs.timerInterval, self, self.timerFunction, None, True))

    def initControls(self):
        """Init basic controls"""
        self.outputArea.setString_("")

        self.tasks = Tasks()

        if userPrefs.showWorkTill:
            self.workTillBox.setHidden_(False)
        else:
            self.workTillBox.setHidden_(True)

        self.pbtnProject.removeAllItems()
        self.pbtnProject.addItemsWithTitles_(Projects.get())
        self.pbtnProject.selectItemWithTitle_(userPrefs.selectedProject)

        self.projectChange_(None)

        self.initDoneButton()

        self.fillTasks()
        self.scrollToEnd()

    def initDoneButton(self):
        if self.tasks.dayStarted():
            self.btnDone.setTitle_("Done")
        else:
            self.btnDone.setTitle_("Start")

    def initWindow(self):
        """Init window sizes and positions"""
        self.mainWindow.setFrameAutosaveName_("mainWindow")

    def timerFunction(self):
        """Timer callback function"""
        self.tasks.setCurrentTask(self.cbxInput.stringValue())
        self.readCounters()

        self.notification.idleNotify(self.tasks.timings.currentSeconds)

        if self.tasks.timings.isNextDay():
            self.initControls()

    def readCounters(self):
        """Read counters"""
        self.lblTimeSpent.setStringValue_(fh.secToTimeStr(
                self.tasks.timings.spentSeconds))
        self.lblSlackingTime.setStringValue_(fh.secToTimeStr(
                self.tasks.timings.slackingSeconds))
        self.lblTimeLeft.setStringValue_(fh.secToTimeStr(
                self.tasks.timings.leftSeconds))
        self.lblTimeSpentCurr.setStringValue_(fh.secToTimeStr(
                self.tasks.timings.currentSeconds))
        self.lblWorkTill.setStringValue_(fh.timeStructToTimeStr(
                self.tasks.timings.workTillTime))

    def appendTask(self, taskString, color):
        def appendText(text, color=None):
            """Append text to task text area"""
            endRange = NSRange()
            endRange.location = self.outputArea.textStorage().length()
            endRange.length = 0
            self.outputArea.replaceCharactersInRange_withString_(endRange, text)
            if color:
                colorRange = NSRange()
                colorRange.location = (
                        self.outputArea.textStorage().length() - len(text))
                colorRange.length = len(text)
                self.outputArea.setTextColor_range_(color, colorRange)
        appendText(taskString, color)

        if self.reportWindow and self.reportWindow.isVisible():
            self.reportsController.generateChart()

    def fillTasks(self):
        """Fill text area with tasks"""
        for task in self.tasks.taskList:
            self.appendTask(*fh.formatTaskString(*task))

    def scrollToEnd(self):
        """Scroll tasks textarea to the end"""
        self.outputArea.scrollRangeToVisible_(
                NSMakeRange(self.outputArea.string().length(), 0))

    def showStartHelpMessage(self):
        """Show alert with help message"""
        alert = NSAlert.alloc().init()
        alert.addButtonWithTitle_('OK')
        alert.setMessageText_("Congrats, you started your working day!")
        alert.setInformativeText_("Now start doing your working activity "
                "(e.g reading mail). When you finish with your activity "
                "go back to MacTimeLog and type it in. If your activity is "
                "slacking, use 2 asterisks (**) at the end of the activity's "
                "name.")
        alert.setShowsSuppressionButton_(True)
        alert.runModal()
        if alert.suppressionButton().state() == NSOnState:
            userPrefs.showHelpMessageOnStart = False
            userPrefs.save()

    @objc.IBAction
    def btnDonePress_(self, sender):
        """On done button press"""
        if self.tasks.dayStarted():
            if self.cbxInput.stringValue().strip():
                taskName = self.cbxInput.stringValue()
                self.appendTask(*fh.formatTaskString(
                        *self.tasks.add(taskName,
                            self.pbtnProject.titleOfSelectedItem())))
                self.readCounters()
                self.cbxInput.setStringValue_("")
                self.scrollToEnd()

                if Tasks.taskType(taskName) == "work":
                    Projects.addAutocomplete(
                            self.pbtnProject.titleOfSelectedItem(), taskName)
                else:
                    SlackingAutocompletes.add(taskName)
                self.cbxInput.addItemWithObjectValue_(taskName)
        else:
            if userPrefs.showHelpMessageOnStart:
                self.showStartHelpMessage()
            taskName = userPrefs.startPlaceholder
            self.appendTask(*fh.formatTaskString(*self.tasks.add(taskName)))
            self.initDoneButton()

    @objc.IBAction
    def projectChange_(self, sender):
        """Project changed event"""
        if self.pbtnProject.titleOfSelectedItem():
            self.cbxInput.removeAllItems()
            self.cbxInput.addItemsWithObjectValues_(Projects.getAutocomleteList(
                    self.pbtnProject.titleOfSelectedItem(),
                    SlackingAutocompletes.get()))

        if sender:
            userPrefs.selectedProject = unicode(
                    self.pbtnProject.titleOfSelectedItem())
            userPrefs.save()

    @objc.IBAction
    def openLog_(self, sender):
        """ Open log in text editor"""
        os.system(userPrefs.logEditCommand % settings.LOG_PATH)

    @objc.IBAction
    def openReports_(self, sender):
        """Open reports window"""
        self.reportsController.showWindow_(sender)

    @objc.IBAction
    def openPreferences_(self, sender):
        """Open preferences window"""
        self.preferencesController.showWindow_(sender)