Example #1
0
    def __init__(self, parent = None):
        self._gui = load_ui_file("stats.ui")
        self.report_chooser = None
        self.window = self.get_widget("stats_window")

        self.parent = parent# determine if app should shut down on close

        self.stat_facts = None

        day_start = conf.get("day_start_minutes")
        day_start = dt.time(day_start / 60, day_start % 60)
        self.timechart = widgets.TimeChart()
        self.timechart.interactive = False
        self.timechart.day_start = day_start

        self.get_widget("explore_everything").add(self.timechart)
        self.get_widget("explore_everything").show_all()

        runtime.storage.connect('activities-changed',self.after_fact_update)
        runtime.storage.connect('facts-changed',self.after_fact_update)

        self.init_stats()

        self.window.set_position(gtk.WIN_POS_CENTER)

        self._gui.connect_signals(self)
        self.window.show_all()
        self.stats()
Example #2
0
    def __init__(self, parent = None):
        self.parent = parent# determine if app should shut down on close
        self._gui = load_ui_file("overview.ui")
        self.report_chooser = None
        self.window = self.get_widget("tabs_window")
        self.window.connect("delete_event", self.on_delete_window)

        self.range_pick = widgets.RangePick()
        self.get_widget("range_pick_box").add(self.range_pick)
        self.range_pick.connect("range-selected", self.on_range_selected)

        self.overview = OverviewBox()
        self.get_widget("overview_tab").add(self.overview)
        self.fact_tree = self.overview.fact_tree # TODO - this is upside down, should maybe get the overview tab over here
        self.fact_tree.connect("cursor-changed", self.on_fact_selection_changed)

        self.fact_tree.connect("button-press-event", self.on_fact_tree_button_press)

        self.reports = TotalsBox()
        self.get_widget("reports_tab").add(self.reports)

        self.timechart = widgets.TimeChart()
        self.timechart.connect("zoom-out-clicked", self.on_timechart_zoom_out_clicked)
        self.timechart.connect("range-picked", self.on_timechart_new_range)
        self.get_widget("by_day_box").add(self.timechart)

        self._gui.connect_signals(self)
        runtime.storage.connect('activities-changed',self.after_activity_update)
        runtime.storage.connect('facts-changed',self.after_activity_update)

        conf.connect('conf-changed', self.on_conf_change)
        self.show()
Example #3
0
    def __init__(self, parent = None):
        self._gui = load_ui_file("stats.ui")
        self.report_chooser = None
        self.window = self.get_widget("stats_window")

        self.parent = parent# determine if app should shut down on close

        self.stat_facts = None

        day_start = conf.get("day_start_minutes")
        day_start = dt.time(day_start / 60, day_start % 60)
        self.timechart = widgets.TimeChart()
        self.timechart.interactive = False
        self.timechart.day_start = day_start

        self.get_widget("explore_everything").add(self.timechart)
        self.get_widget("explore_everything").show_all()

        runtime.storage.connect('activities-changed',self.after_fact_update)
        runtime.storage.connect('facts-changed',self.after_fact_update)

        self.init_stats()

        self.window.set_position(gtk.WIN_POS_CENTER)

        self._gui.connect_signals(self)
        self.window.show_all()
        self.stats()
Example #4
0
    def __init__(self, applet):
        self.applet = applet

        self.button = PanelButton()
        self.button.connect('toggled', self.on_toggle)
        self.applet.add(self.button)

        self.applet.setup_menu_from_file(
            runtime.data_dir, "Hamster_Applet.xml", None, [
                ("about", self.on_about),
                ("overview", self.show_overview),
                ("preferences", self.show_preferences),
                ("help", self.on_help_clicked),
            ])

        # load window of activity switcher and todays view
        self._gui = load_ui_file("applet.ui")
        self.window = self._gui.get_object('hamster-window')
        # on close don't destroy the popup, just hide it instead
        self.window.connect("delete_event",
                            lambda *args: self.__show_toggle(False))
        self.window.connect("window-state-event", self.on_window_state_changed)

        self.new_name = widgets.ActivityEntry()
        self.new_name.connect("value-entered", self.on_switch_activity_clicked)

        self.new_name.set_property("secondary-icon-name", "help-contents")
        self.new_name.connect("icon-press", self.on_more_info_button_clicked)

        widgets.add_hint(self.new_name, _("Activity"))
        self.get_widget("new_name_box").add(self.new_name)
        self.new_name.connect("changed", self.on_activity_text_changed)

        self.new_tags = widgets.TagsEntry()
        self.new_tags.connect("tags_selected", self.on_switch_activity_clicked)
        widgets.add_hint(self.new_tags, _("Tags"))
        self.get_widget("new_tags_box").add(self.new_tags)

        self.tag_box = widgets.TagBox(interactive=False)
        self.get_widget("tag_box").add(self.tag_box)

        self.treeview = widgets.FactTree()
        self.treeview.connect("key-press-event", self.on_todays_keys)
        self.treeview.connect("edit-clicked", self._open_edit_activity)
        self.treeview.connect("row-activated", self.on_today_row_activated)

        self.get_widget("today_box").add(self.treeview)

        # DBus Setup
        try:
            dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
            # Set up connection to the screensaver
            self.dbusIdleListener = idle.DbusIdleListener()
            self.dbusIdleListener.connect('idle-changed', self.on_idle_changed)

        except dbus.DBusException, e:
            logging.error("Can't init dbus: %s" % e)
Example #5
0
    def __init__(self, applet):
        self.applet = applet

        self.button = PanelButton()
        self.button.connect('toggled', self.on_toggle)
        self.applet.add(self.button)

        self.applet.setup_menu_from_file (runtime.data_dir,
                                          "Hamster_Applet.xml",
                                          None,
                                          [("about", self.on_about),
                                          ("overview", self.show_overview),
                                          ("preferences", self.show_preferences),
                                          ("help", self.on_help_clicked),
                                          ])

        # load window of activity switcher and todays view
        self._gui = load_ui_file("applet.ui")
        self.window = self._gui.get_object('hamster-window')
        # on close don't destroy the popup, just hide it instead
        self.window.connect("delete_event", lambda *args: self.__show_toggle(False))
        self.window.connect("window-state-event", self.on_window_state_changed)

        self.new_name = widgets.ActivityEntry()
        self.new_name.connect("value-entered", self.on_switch_activity_clicked)

        self.new_name.set_property("secondary-icon-name", "help")
        self.new_name.connect("icon-press", self.on_more_info_button_clicked)

        widgets.add_hint(self.new_name, _("Activity"))
        self.get_widget("new_name_box").add(self.new_name)
        self.new_name.connect("changed", self.on_activity_text_changed)

        self.new_tags = widgets.TagsEntry()
        self.new_tags.connect("tags_selected", self.on_switch_activity_clicked)
        widgets.add_hint(self.new_tags, _("Tags"))
        self.get_widget("new_tags_box").add(self.new_tags)

        self.tag_box = widgets.TagBox(interactive = False)
        self.get_widget("tag_box").add(self.tag_box)

        self.treeview = widgets.FactTree()
        self.treeview.connect("key-press-event", self.on_todays_keys)
        self.treeview.connect("edit-clicked", self._open_edit_activity)
        self.treeview.connect("row-activated", self.on_today_row_activated)

        self.get_widget("today_box").add(self.treeview)

        # DBus Setup
        try:
            dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
            # Set up connection to the screensaver
            self.dbusIdleListener = idle.DbusIdleListener()
            self.dbusIdleListener.connect('idle-changed', self.on_idle_changed)

        except dbus.DBusException, e:
            logging.error("Can't init dbus: %s" % e)
Example #6
0
    def __init__(self):
        gtk.VBox.__init__(self)
        self._gui = load_ui_file("overview_totals.ui")
        self.get_widget("reports_vbox").reparent(self) #mine!

        self.start_date, self.end_date = None, None

        #graphs
        x_offset = 0.4 # align all graphs to the left edge


        self.category_chart = charting.Chart(max_bar_width = 20,
                                             legend_width = x_offset,
                                             value_format = "%.2f")
        self.category_chart.connect("bar-clicked", self.on_category_clicked)
        self.selected_categories = []
        self.category_sums = None

        self.get_widget("totals_by_category").add(self.category_chart);

        self.activity_chart = charting.Chart(max_bar_width = 20,
                                             legend_width = x_offset,
                                             value_format = "%.2f")
        self.activity_chart.connect("bar-clicked", self.on_activity_clicked)
        self.selected_activities = []
        self.activity_sums = None

        self.get_widget("totals_by_activity").add(self.activity_chart);

        self.tag_chart = charting.Chart(max_bar_width = 20,
                                        legend_width = x_offset,
                                        value_format = "%.2f")
        self.tag_chart.connect("bar-clicked", self.on_tag_clicked)
        self.selected_tags = []
        self.tag_sums = None

        self.get_widget("totals_by_tag").add(self.tag_chart);

        self._gui.connect_signals(self)

        self.report_chooser = None
Example #7
0
    def __init__(self):
        gtk.VBox.__init__(self)
        self._gui = load_ui_file("overview_totals.ui")
        self.get_widget("reports_vbox").reparent(self) #mine!

        self.start_date, self.end_date = None, None

        #graphs
        x_offset = 0.4 # align all graphs to the left edge


        self.category_chart = charting.Chart(max_bar_width = 20,
                                             legend_width = x_offset,
                                             value_format = "%.1f")
        self.category_chart.connect("bar-clicked", self.on_category_clicked)
        self.selected_categories = []
        self.category_sums = None

        self.get_widget("totals_by_category").add(self.category_chart);

        self.activity_chart = charting.Chart(max_bar_width = 20,
                                             legend_width = x_offset,
                                             value_format = "%.1f")
        self.activity_chart.connect("bar-clicked", self.on_activity_clicked)
        self.selected_activities = []
        self.activity_sums = None

        self.get_widget("totals_by_activity").add(self.activity_chart);

        self.tag_chart = charting.Chart(max_bar_width = 20,
                                        legend_width = x_offset,
                                        value_format = "%.1f")
        self.tag_chart.connect("bar-clicked", self.on_tag_clicked)
        self.selected_tags = []
        self.tag_sums = None

        self.get_widget("totals_by_tag").add(self.tag_chart);

        self._gui.connect_signals(self)

        self.report_chooser = None
Example #8
0
    def __init__(self, parent=None, facts=None):
        gtk.Object.__init__(self)

        self.source = conf.get("activities_source")

        if self.source == "redmine":
            self.rt_url = conf.get("rt_url")
            self.rt_apikey = conf.get("rt_apikey")

            if self.rt_url and self.rt_apikey:
                try:
                    self.tracker = redmine.Redmine(self.rt_url,
                                                   auth=(self.rt_apikey,
                                                         "placeholder"))
                    if not self.tracker:
                        self.source = ""
                except:
                    self.source = ""
            else:
                self.source = ""

        print self.source + " source"

        self._gui = load_ui_file("export_rt.ui")
        self.window = self.get_widget('report_rt_window')

        self.parent, self.facts = parent, facts

        self.done_button = self.get_widget("done_button")
        #        self.done_button.set_sensitive(False)

        #        Model
        self.tree_store = gtk.TreeStore(gobject.TYPE_PYOBJECT)
        self.rows = list([ExportRow(fact) for fact in facts])
        self.rows.sort(key=lambda row: row.id)
        tickets = {}
        for ticket, rows in groupby(self.rows,
                                    lambda export_row: export_row.id):
            tickets[ticket] = list(rows)
        for item in tickets.keys():
            #please name the ticket
            ticket = {}
            if self.source == "redmine":
                issue = self.tracker.getIssue(item)
                ticket['id'] = issue.id
                ticket['Subject'] = issue.subject

            if ticket:
                parent = self.tree_store.append(None, (TicketRow(ticket), ))
                for row in tickets[item]:
                    row.activity = self.tracker.getRedmineActivities(
                        row.activity)
                    self.tree_store.append(parent, (row, ))

#        self.tree_store.append(parent, (row.comment))
        self.view = gtk.TreeView(self.tree_store)
        self.view.set_headers_visible(False)

        id_cell = gtk.CellRendererText()
        id_column = gtk.TreeViewColumn("", id_cell, text=0)
        id_column.set_cell_data_func(id_cell, id_painter)
        id_column.set_max_width(100)
        self.view.append_column(id_column)

        name_comment_cell = gtk.CellRendererText()
        name_comment_cell.connect("edited", self.on_comment_edited)
        name_comment_column = gtk.TreeViewColumn("", name_comment_cell, text=0)
        name_comment_column.set_cell_data_func(name_comment_cell,
                                               name_comment_painter)
        name_comment_column.set_expand(True)
        self.view.append_column(name_comment_column)

        time_cell = gtk.CellRendererSpin()
        time_cell.connect("edited", self.on_time_worked_edited)
        time_column = gtk.TreeViewColumn("", time_cell, text=0)
        time_column.set_cell_data_func(time_cell, time_painter)
        time_column.set_min_width(60)
        self.view.append_column(time_column)
        self.view.expand_all()

        self.start_button = self.get_widget("start_button")
        self.get_widget("activities").add(self.view)
        self.aggregate_comments_checkbox = self.get_widget(
            "aggregate_comments_checkbox")
        self.aggregate_comments_checkbox.set_active(True)
        self.test_checkbox = self.get_widget("test_checkbox")
        self.test_checkbox.set_active(False)
        self.progressbar = self.get_widget("progressbar")
        self.progressbar.set_text(_("Waiting for action"))
        self.progressbar.set_orientation(gtk.PROGRESS_LEFT_TO_RIGHT)

        self._gui.connect_signals(self)

        self.window.show_all()
Example #9
0
    def __init__(self, parent = None):
        gtk.Object.__init__(self)
        self.parent = parent
        self._gui = load_ui_file("preferences.ui")
        self.window = self.get_widget('preferences_window')
        self.window.connect("delete_event", self.on_delete_window)

        # Translators: 'None' refers here to the Todo list choice in Hamster preferences (Tracking tab)
        self.activities_sources = [("", _("None")),
                                   ("evo", "Evolution"),
                                   ("gtg", "Getting Things Gnome"),
                                   ("redmine", "Redmine")]
        self.todo_combo = gtk.combo_box_new_text()
        for code, label in self.activities_sources:
            self.todo_combo.append_text(label)
        self.todo_combo.connect("changed", self.on_todo_combo_changed)
        self.get_widget("todo_pick").add(self.todo_combo)

        # RT prefs
        self.rt_url = gtk.Entry()
        self.rt_url.connect("changed", self.on_rt_url_changed)
        self.get_widget('rt_url').add(self.rt_url)
        
        self.rt_apikey = gtk.Entry()
        self.rt_apikey.connect("changed", self.on_rt_apikey_changed)
        self.get_widget('rt_apikey').add(self.rt_apikey)

        # create and fill activity tree
        self.activity_tree = self.get_widget('activity_list')
        self.get_widget("activities_label").set_mnemonic_widget(self.activity_tree)
        self.activity_store = ActivityStore()

        self.external_listeners = []

        self.activityColumn = gtk.TreeViewColumn(_("Name"))
        self.activityColumn.set_expand(True)
        self.activityCell = gtk.CellRendererText()
        self.external_listeners.extend([
            (self.activityCell, self.activityCell.connect('edited', self.activity_name_edited_cb, self.activity_store))
        ])
        self.activityColumn.pack_start(self.activityCell, True)
        self.activityColumn.set_attributes(self.activityCell, text=1)
        self.activityColumn.set_sort_column_id(1)
        self.activity_tree.append_column(self.activityColumn)

        self.activity_tree.set_model(self.activity_store)

        self.selection = self.activity_tree.get_selection()

        self.external_listeners.extend([
            (self.selection, self.selection.connect('changed', self.activity_changed, self.activity_store))
        ])


        # create and fill category tree
        self.category_tree = self.get_widget('category_list')
        self.get_widget("categories_label").set_mnemonic_widget(self.category_tree)
        self.category_store = CategoryStore()

        self.categoryColumn = gtk.TreeViewColumn(_("Category"))
        self.categoryColumn.set_expand(True)
        self.categoryCell = gtk.CellRendererText()

        self.external_listeners.extend([
            (self.categoryCell, self.categoryCell.connect('edited', self.category_edited_cb, self.category_store))
        ])

        self.categoryColumn.pack_start(self.categoryCell, True)
        self.categoryColumn.set_attributes(self.categoryCell, text=1)
        self.categoryColumn.set_sort_column_id(1)
        self.categoryColumn.set_cell_data_func(self.categoryCell, self.unsorted_painter)
        self.category_tree.append_column(self.categoryColumn)

        self.category_store.load()
        self.category_tree.set_model(self.category_store)

        selection = self.category_tree.get_selection()
        self.external_listeners.extend([
            (selection, selection.connect('changed', self.category_changed_cb, self.category_store))
        ])

        self.day_start = widgets.TimeInput(dt.time(5,30))
        self.get_widget("day_start_placeholder").add(self.day_start)


        self.load_config()

        # Allow enable drag and drop of rows including row move
        self.activity_tree.enable_model_drag_source( gtk.gdk.BUTTON1_MASK,
                                                self.TARGETS,
                                                gtk.gdk.ACTION_DEFAULT|
                                                gtk.gdk.ACTION_MOVE)

        self.category_tree.enable_model_drag_dest(self.TARGETS,
                                                  gtk.gdk.ACTION_MOVE)

        self.activity_tree.connect("drag_data_get", self.drag_data_get_data)

        self.category_tree.connect("drag_data_received", self.on_category_drop)

        #select first category
        selection = self.category_tree.get_selection()
        selection.select_path((0,))

        self.prev_selected_activity = None
        self.prev_selected_category = None


        # create and fill workspace tree
        self.workspace_tree = self.get_widget('workspace_list')
        self.workspace_store = WorkspaceStore()

        self.wNameColumn = gtk.TreeViewColumn(_("Name"))
        self.wNameColumn.set_expand(True)
        self.wNameCell = gtk.CellRendererText()
        self.wNameCell.set_property('editable', False)
        self.wActivityColumn = gtk.TreeViewColumn(_("Activity"))
        self.wActivityColumn.set_expand(True)
        self.wActivityCell = gtk.CellRendererText()
        self.wActivityCell.set_property('editable', True)

        self.external_listeners.extend([
            (self.wActivityCell, self.wActivityCell.connect('edited', self.on_workspace_activity_edited))
        ])

        self.wNameColumn.pack_start(self.wNameCell, True)
        self.wNameColumn.set_attributes(self.wNameCell)
        self.wNameColumn.set_sort_column_id(1)
        self.wNameColumn.set_cell_data_func(self.wNameCell, self.workspace_name_celldata)
        self.workspace_tree.append_column(self.wNameColumn)
        self.wActivityColumn.pack_start(self.wActivityCell, True)
        self.wActivityColumn.set_attributes(self.wActivityCell, text=2)
        self.wActivityColumn.set_sort_column_id(1)
        self.workspace_tree.append_column(self.wActivityColumn)

        self.workspace_tree.set_model(self.workspace_store)

        # disable notification thing if pynotify is not available
        try:
            import pynotify
        except:
            self.get_widget("notification_preference_frame").hide()


        self.external_listeners.extend([
            (self.day_start, self.day_start.connect("time-entered", self.on_day_start_changed))
        ])

        # disable workspace tracking if wnck is not there
        if wnck:
            self.screen = wnck.screen_get_default()
            for workspace in self.screen.get_workspaces():
                self.on_workspace_created(self.screen, workspace)

            self.external_listeners.extend([
                (self.screen, self.screen.connect("workspace-created", self.on_workspace_created)),
                (self.screen, self.screen.connect("workspace-destroyed", self.on_workspace_deleted))
            ])
        else:
            self.get_widget("workspace_tab").hide()


        self._gui.connect_signals(self)
        self.show()
Example #10
0
    def __init__(self, parent = None, facts = None):
        gtk.Object.__init__(self)
        
        self.source = conf.get("activities_source")

        if self.source == "redmine":
            self.rt_url = conf.get("rt_url")
            self.rt_apikey = conf.get("rt_apikey")

            if self.rt_url and self.rt_apikey:
                try:
                    self.tracker = redmine.Redmine(self.rt_url, auth=(self.rt_apikey, "placeholder"))
                    if not self.tracker:
                        self.source = ""
                except:
                    self.source = ""
            else:
                self.source = ""

        print self.source + " source"
                
        self._gui = load_ui_file("export_rt.ui")
        self.window = self.get_widget('report_rt_window')

        self.parent, self.facts = parent, facts

        self.done_button = self.get_widget("done_button")
#        self.done_button.set_sensitive(False)
        
#        Model
        self.tree_store = gtk.TreeStore(gobject.TYPE_PYOBJECT)
        self.rows = list([ExportRow(fact) for fact in facts])
        self.rows.sort(key = lambda row: row.id)
        tickets = {}
        for ticket, rows in groupby(self.rows, lambda export_row: export_row.id):
            tickets[ticket] = list(rows)
        for item in tickets.keys():
            #please name the ticket
            ticket = {};
            if self.source == "redmine":
                issue = self.tracker.getIssue(item);
                ticket['id'] = issue.id
                ticket['Subject'] = issue.subject

            if ticket:
                parent = self.tree_store.append( None, (TicketRow(ticket), ) )
                for row in tickets[item]:
                    row.activity = self.tracker.getRedmineActivities(row.activity);
                    self.tree_store.append(parent, (row, ))
            
#        self.tree_store.append(parent, (row.comment))
        self.view = gtk.TreeView(self.tree_store);
        self.view.set_headers_visible(False)
        
        
        id_cell = gtk.CellRendererText()
        id_column = gtk.TreeViewColumn("", id_cell, text=0)
        id_column.set_cell_data_func(id_cell, id_painter)
        id_column.set_max_width(100)
        self.view.append_column(id_column)
        
        name_comment_cell = gtk.CellRendererText()
        name_comment_cell.connect("edited", self.on_comment_edited)
        name_comment_column = gtk.TreeViewColumn("", name_comment_cell, text=0)
        name_comment_column.set_cell_data_func(name_comment_cell, name_comment_painter)
        name_comment_column.set_expand(True)
        self.view.append_column(name_comment_column)
        
        time_cell = gtk.CellRendererSpin()
        time_cell.connect("edited", self.on_time_worked_edited)
        time_column = gtk.TreeViewColumn("", time_cell, text=0)
        time_column.set_cell_data_func(time_cell, time_painter)
        time_column.set_min_width(60)
        self.view.append_column(time_column)
        self.view.expand_all()
        
        self.start_button = self.get_widget("start_button")
        self.get_widget("activities").add(self.view)
        self.aggregate_comments_checkbox = self.get_widget("aggregate_comments_checkbox")
        self.aggregate_comments_checkbox.set_active(True)
        self.test_checkbox = self.get_widget("test_checkbox")
        self.test_checkbox.set_active(False)
        self.progressbar = self.get_widget("progressbar")
        self.progressbar.set_text(_("Waiting for action"))
        self.progressbar.set_orientation(gtk.PROGRESS_LEFT_TO_RIGHT)
        
        self._gui.connect_signals(self)

        self.window.show_all()
Example #11
0
    def __init__(self, parent=None):
        self.parent = parent  # determine if app should shut down on close
        self._gui = load_ui_file("overview.ui")
        self.report_chooser = None

        self.facts = None

        self.window = self.get_widget("tabs_window")

        self.day_start = conf.get("day_start_minutes")
        self.day_start = dt.time(self.day_start / 60, self.day_start % 60)

        self.view_date = (dt.datetime.today() - dt.timedelta(
            hours=self.day_start.hour, minutes=self.day_start.minute)).date()

        self.range_pick = widgets.RangePick()
        self.get_widget("range_pick_box").add(self.range_pick)
        self.range_pick.connect("range-selected", self.on_range_selected)

        #set to monday
        self.start_date = self.view_date - dt.timedelta(
            self.view_date.weekday() + 1)

        # look if we need to start on sunday or monday
        self.start_date = self.start_date + dt.timedelta(
            stuff.locale_first_weekday())

        # see if we have not gotten carried away too much in all these calculations
        if (self.view_date - self.start_date) == dt.timedelta(7):
            self.start_date += dt.timedelta(7)

        self.end_date = self.start_date + dt.timedelta(6)

        self.overview = OverviewBox()
        self.get_widget("overview_tab").add(self.overview)
        self.fact_tree = self.overview.fact_tree  # TODO - this is upside down, should maybe get the overview tab over here
        self.fact_tree.connect("cursor-changed",
                               self.on_fact_selection_changed)

        self.fact_tree.connect("button-press-event",
                               self.on_fact_tree_button_press)

        self.reports = TotalsBox()
        self.get_widget("reports_tab").add(self.reports)

        self.current_range = "week"

        self.timechart = widgets.TimeChart()
        self.timechart.connect("zoom-out-clicked",
                               self.on_timechart_zoom_out_clicked)
        self.timechart.connect("range-picked", self.on_timechart_new_range)
        self.timechart.day_start = self.day_start

        self.get_widget("by_day_box").add(self.timechart)

        self._gui.connect_signals(self)
        runtime.storage.connect('activities-changed',
                                self.after_activity_update)
        runtime.storage.connect('facts-changed', self.after_activity_update)

        conf.connect('conf-changed', self.on_conf_change)

        if conf.get("overview_window_maximized"):
            self.window.maximize()
        else:
            window_box = conf.get("overview_window_box")
            if window_box:
                x, y, w, h = (int(i) for i in window_box)
                self.window.move(x, y)
                self.window.resize(w, h)
            else:
                self.window.set_position(gtk.WIN_POS_CENTER)

        self.window.show_all()

        self.search()
Example #12
0
    def __init__(self, parent=None, fact_date=None, fact_id=None):
        gtk.Object.__init__(self)

        self._gui = load_ui_file("edit_activity.ui")
        self.window = self.get_widget("custom_fact_window")

        self.parent, self.fact_id = parent, fact_id
        start_date, end_date = None, None

        # TODO - should somehow hint that time is not welcome here
        self.new_name = widgets.ActivityEntry()
        self.get_widget("activity_box").add(self.new_name)

        self.new_tags = widgets.TagsEntry()
        self.get_widget("tags_box").add(self.new_tags)

        day_start = conf.get("day_start_minutes")
        self.day_start = dt.time(day_start / 60, day_start % 60)

        if fact_id:
            fact = runtime.storage.get_fact(fact_id)

            label = fact.activity
            if fact.category != _("Unsorted"):
                label += "@%s" % fact.category

            self.new_name.set_text(label)

            self.new_tags.set_text(", ".join(fact.tags))

            start_date = fact.start_time
            end_date = fact.end_time

            buf = gtk.TextBuffer()
            buf.set_text(fact.description or "")
            self.get_widget("description").set_buffer(buf)

            self.get_widget("save_button").set_label("gtk-save")
            self.window.set_title(_("Update activity"))
        else:
            self.get_widget("delete_button").set_sensitive(False)

            # if there is previous activity with end time - attach to it
            # otherwise let's start at 8am (unless it is today - in that case
            # we will assume that the user wants to start from this moment)
            fact_date = fact_date or dt.date.today()

            last_activity = runtime.storage.get_facts(fact_date)
            if last_activity and last_activity[-1].end_time:
                start_date = last_activity[-1].end_time

                if fact_date != dt.date.today():
                    end_date = start_date + dt.timedelta(minutes=30)
            else:
                if fact_date == dt.date.today():
                    start_date = dt.datetime.now()
                else:
                    start_date = dt.datetime(fact_date.year, fact_date.month, fact_date.day, 8)

        if not end_date:
            self.get_widget("in_progress").set_active(True)
            if (dt.datetime.now() - start_date).days == 0:
                end_date = dt.datetime.now()

        start_date = start_date or dt.datetime.now()
        end_date = end_date or start_date + dt.timedelta(minutes=30)

        self.start_date = widgets.DateInput(start_date)
        self.get_widget("start_date_placeholder").add(self.start_date)

        self.start_time = widgets.TimeInput(start_date)
        self.get_widget("start_time_placeholder").add(self.start_time)

        self.end_time = widgets.TimeInput(end_date, start_date)
        self.get_widget("end_time_placeholder").add(self.end_time)
        self.set_end_date_label(end_date)

        self.dayline = widgets.DayLine()
        self.dayline.connect("on-time-chosen", self.update_time)
        self._gui.get_object("day_preview").add(self.dayline)

        self.on_in_progress_toggled(self.get_widget("in_progress"))

        self.start_date.connect("date-entered", self.on_start_date_entered)
        self.start_time.connect("time-entered", self.on_start_time_entered)
        self.new_name.connect("changed", self.on_new_name_changed)
        self.end_time.connect("time-entered", self.on_end_time_entered)
        self._gui.connect_signals(self)

        self.window.show_all()
Example #13
0
    def __init__(self, parent=None):
        gtk.Object.__init__(self)
        self.parent = parent
        self._gui = load_ui_file("preferences.ui")
        self.window = self.get_widget('preferences_window')
        self.window.connect("delete_event", self.on_delete_window)

        # Translators: 'None' refers here to the Todo list choice in Hamster preferences (Tracking tab)
        self.activities_sources = [("", _("None")), ("evo", "Evolution"),
                                   ("gtg", "Getting Things Gnome"),
                                   ("rt", "Request Tracker"),
                                   ("redmine", "Redmine"), ("jira", "JIRA")]
        self.todo_combo = gtk.combo_box_new_text()
        for code, label in self.activities_sources:
            self.todo_combo.append_text(label)
        self.todo_combo.connect("changed", self.on_todo_combo_changed)
        self.get_widget("todo_pick").add(self.todo_combo)

        # RT prefs
        self.rt_url = gtk.Entry()
        self.rt_url.connect("changed", self.on_rt_url_changed)
        self.get_widget('rt_url').add(self.rt_url)

        self.rt_user = gtk.Entry()
        self.rt_user.connect("changed", self.on_rt_user_changed)
        self.get_widget('rt_user').add(self.rt_user)

        self.rt_pass = gtk.Entry()
        self.rt_pass.set_visibility(False)
        self.rt_pass.connect("changed", self.on_rt_pass_changed)
        self.get_widget('rt_pass').add(self.rt_pass)

        self.rt_query = gtk.Entry()
        self.rt_query.connect("changed", self.on_rt_query_changed)
        self.get_widget('rt_query').add(self.rt_query)

        self.rt_category_field = gtk.Entry()
        self.rt_category_field.connect("changed",
                                       self.on_rt_category_field_changed)
        self.get_widget('rt_category_field').add(self.rt_category_field)

        # JIRA prefs
        self.jira_url = gtk.Entry()
        self.jira_url.connect("changed", self.on_jira_url_changed)
        self.get_widget('jira_url').add(self.jira_url)

        self.jira_user = gtk.Entry()
        self.jira_user.connect("changed", self.on_jira_user_changed)
        self.get_widget('jira_user').add(self.jira_user)

        self.jira_pass = gtk.Entry()
        self.jira_pass.set_visibility(False)
        self.jira_pass.connect("changed", self.on_jira_pass_changed)
        self.get_widget('jira_pass').add(self.jira_pass)

        self.jira_query = gtk.Entry()
        self.jira_query.connect("changed", self.on_jira_query_changed)
        self.get_widget('jira_query').add(self.jira_query)

        self.jira_category_field = gtk.Entry()
        self.jira_category_field.connect("changed",
                                         self.on_jira_category_field_changed)
        self.get_widget('jira_category_field').add(self.jira_category_field)

        # Redmine prefs
        self.redmine_url = gtk.Entry()
        self.redmine_url.connect("changed", self.on_redmine_url_changed)
        self.get_widget('redmine_url').add(self.redmine_url)

        self.redmine_user = gtk.Entry()
        self.redmine_user.connect("changed", self.on_redmine_user_changed)
        self.get_widget('redmine_user').add(self.redmine_user)

        self.redmine_pass = gtk.Entry()
        self.redmine_pass.set_visibility(False)
        self.redmine_pass.connect("changed", self.on_redmine_pass_changed)
        self.get_widget('redmine_pass').add(self.redmine_pass)

        self.redmine_query = gtk.Entry()
        self.redmine_query.connect("changed", self.on_redmine_query_changed)
        self.get_widget('redmine_query').add(self.redmine_query)

        # create and fill activity tree
        self.activity_tree = self.get_widget('activity_list')
        self.get_widget("activities_label").set_mnemonic_widget(
            self.activity_tree)
        self.activity_store = ActivityStore()

        self.external_listeners = []

        self.activityColumn = gtk.TreeViewColumn(_("Name"))
        self.activityColumn.set_expand(True)
        self.activityCell = gtk.CellRendererText()
        self.external_listeners.extend([
            (self.activityCell,
             self.activityCell.connect('edited', self.activity_name_edited_cb,
                                       self.activity_store))
        ])
        self.activityColumn.pack_start(self.activityCell, True)
        self.activityColumn.set_attributes(self.activityCell, text=1)
        self.activityColumn.set_sort_column_id(1)
        self.activity_tree.append_column(self.activityColumn)

        self.activity_tree.set_model(self.activity_store)

        self.selection = self.activity_tree.get_selection()

        self.external_listeners.extend([
            (self.selection,
             self.selection.connect('changed', self.activity_changed,
                                    self.activity_store))
        ])

        # create and fill category tree
        self.category_tree = self.get_widget('category_list')
        self.get_widget("categories_label").set_mnemonic_widget(
            self.category_tree)
        self.category_store = CategoryStore()

        self.categoryColumn = gtk.TreeViewColumn(_("Category"))
        self.categoryColumn.set_expand(True)
        self.categoryCell = gtk.CellRendererText()

        self.external_listeners.extend([
            (self.categoryCell,
             self.categoryCell.connect('edited', self.category_edited_cb,
                                       self.category_store))
        ])

        self.categoryColumn.pack_start(self.categoryCell, True)
        self.categoryColumn.set_attributes(self.categoryCell, text=1)
        self.categoryColumn.set_sort_column_id(1)
        self.categoryColumn.set_cell_data_func(self.categoryCell,
                                               self.unsorted_painter)
        self.category_tree.append_column(self.categoryColumn)

        self.category_store.load()
        self.category_tree.set_model(self.category_store)

        selection = self.category_tree.get_selection()
        self.external_listeners.extend([
            (selection,
             selection.connect('changed', self.category_changed_cb,
                               self.category_store))
        ])

        self.day_start = widgets.TimeInput(dt.time(5, 30))
        self.get_widget("day_start_placeholder").add(self.day_start)

        self.load_config()

        # Allow enable drag and drop of rows including row move
        self.activity_tree.enable_model_drag_source(
            gtk.gdk.BUTTON1_MASK, self.TARGETS,
            gtk.gdk.ACTION_DEFAULT | gtk.gdk.ACTION_MOVE)

        self.category_tree.enable_model_drag_dest(self.TARGETS,
                                                  gtk.gdk.ACTION_MOVE)

        self.activity_tree.connect("drag_data_get", self.drag_data_get_data)

        self.category_tree.connect("drag_data_received", self.on_category_drop)

        #select first category
        selection = self.category_tree.get_selection()
        selection.select_path((0, ))

        self.prev_selected_activity = None
        self.prev_selected_category = None

        # create and fill workspace tree
        self.workspace_tree = self.get_widget('workspace_list')
        self.workspace_store = WorkspaceStore()

        self.wNameColumn = gtk.TreeViewColumn(_("Name"))
        self.wNameColumn.set_expand(True)
        self.wNameCell = gtk.CellRendererText()
        self.wNameCell.set_property('editable', False)
        self.wActivityColumn = gtk.TreeViewColumn(_("Activity"))
        self.wActivityColumn.set_expand(True)
        self.wActivityCell = gtk.CellRendererText()
        self.wActivityCell.set_property('editable', True)

        self.external_listeners.extend([
            (self.wActivityCell,
             self.wActivityCell.connect('edited',
                                        self.on_workspace_activity_edited))
        ])

        self.wNameColumn.pack_start(self.wNameCell, True)
        self.wNameColumn.set_attributes(self.wNameCell)
        self.wNameColumn.set_sort_column_id(1)
        self.wNameColumn.set_cell_data_func(self.wNameCell,
                                            self.workspace_name_celldata)
        self.workspace_tree.append_column(self.wNameColumn)
        self.wActivityColumn.pack_start(self.wActivityCell, True)
        self.wActivityColumn.set_attributes(self.wActivityCell, text=2)
        self.wActivityColumn.set_sort_column_id(1)
        self.workspace_tree.append_column(self.wActivityColumn)

        self.workspace_tree.set_model(self.workspace_store)

        # disable notification thing if pynotify is not available
        try:
            import pynotify
        except:
            self.get_widget("notification_preference_frame").hide()

        self.external_listeners.extend([
            (self.day_start,
             self.day_start.connect("time-entered", self.on_day_start_changed))
        ])

        # disable workspace tracking if wnck is not there
        if wnck:
            self.screen = wnck.screen_get_default()
            for workspace in self.screen.get_workspaces():
                self.on_workspace_created(self.screen, workspace)

            self.external_listeners.extend([
                (self.screen,
                 self.screen.connect("workspace-created",
                                     self.on_workspace_created)),
                (self.screen,
                 self.screen.connect("workspace-destroyed",
                                     self.on_workspace_deleted))
            ])
        else:
            self.get_widget("workspace_tab").hide()

        if not appindicator:
            self.get_widget("tray_tab").hide()

        self._gui.connect_signals(self)
        self.show()
Example #14
0
    def __init__(self, parent = None, facts = None):
        gtk.Object.__init__(self)
        
        self.source = conf.get("activities_source")
                
        self._gui = load_ui_file("export_rt.ui")
        self.window = self.get_widget('report_rt_window')

        self.parent, self.facts = parent, facts

        self.done_button = self.get_widget("done_button")
#        self.done_button.set_sensitive(False)
        
#        Model
        self.tree_store = gtk.TreeStore(gobject.TYPE_PYOBJECT)
        self.rows = list([ExportRow(fact) for fact in facts])
        self.rows.sort(key = lambda row: row.id)
        grouped_rows = {}
        for issue_id, rows in groupby(self.rows, lambda export_row: export_row.id):
            grouped_rows[issue_id] = list(rows)
        for issue_id in grouped_rows.keys():
            #ściągnąć nazwę ticketa
            if self.source == SOURCE_RT:
                row_data = runtime.get_external().rt.get_ticket(issue_id)
#                 row_data['source'] = SOURCE_RT
            elif self.source == SOURCE_REDMINE:
                issue = runtime.get_external().redmine.getIssue(issue_id)
                row_data = {}
                row_data['id'] = issue.id
                row_data['Subject'] = str(issue_id)+': '+issue.fields.summary
#                 row_data['source'] = SOURCE_REDMINE
            elif self.source == SOURCE_JIRA:
                issue = runtime.get_external().jira.issue(issue_id)
                row_data = {}
                row_data['id'] = issue.key
                row_data['Subject'] = issue.fields.summary
#                 row_data['source'] = SOURCE_JIRA

            if row_data:
                parent = self.tree_store.append( None, (TicketRow(row_data), ) )
                for row in grouped_rows[issue_id]:
                    self.tree_store.append(parent, (row, ))
            
#        self.tree_store.append(parent, (row.comment))
        self.view = gtk.TreeView(self.tree_store);
        self.view.set_headers_visible(False)
        
        
        id_cell = gtk.CellRendererText()
        id_column = gtk.TreeViewColumn("", id_cell, text=0)
        id_column.set_cell_data_func(id_cell, id_painter)
        id_column.set_max_width(100)
        self.view.append_column(id_column)
        
        name_comment_cell = gtk.CellRendererText()
        name_comment_cell.connect("edited", self.on_comment_edited)
        name_comment_column = gtk.TreeViewColumn("", name_comment_cell, text=0)
        name_comment_column.set_cell_data_func(name_comment_cell, name_comment_painter)
        name_comment_column.set_expand(True)
        self.view.append_column(name_comment_column)
        
        time_cell = gtk.CellRendererSpin()
        time_cell.connect("edited", self.on_time_worked_edited)
        time_column = gtk.TreeViewColumn("", time_cell, text=0)
        time_column.set_cell_data_func(time_cell, time_painter)
        time_column.set_min_width(60)
        self.view.append_column(time_column)
        self.view.expand_all()
        
        self.start_button = self.get_widget("start_button")
        self.get_widget("activities").add(self.view)
        self.aggregate_comments_checkbox = self.get_widget("aggregate_comments_checkbox")
        self.test_checkox = self.get_widget("test_checkbox")
        self.test_checkox.set_active(False)
        self.progressbar = self.get_widget("progressbar")
        self.progressbar.set_text(_("Waiting for action"))
        self.progressbar.set_orientation(gtk.PROGRESS_LEFT_TO_RIGHT)
        
        self._gui.connect_signals(self)

        self.window.show_all()
Example #15
0
    def __init__(self, parent=None, fact_date=None, fact_id=None):
        gtk.Object.__init__(self)

        self._gui = load_ui_file("edit_activity.ui")
        self.window = self.get_widget('custom_fact_window')

        self.parent, self.fact_id = parent, fact_id
        start_date, end_date = None, None

        #TODO - should somehow hint that time is not welcome here
        self.new_name = widgets.ActivityEntry()
        self.get_widget("activity_box").add(self.new_name)

        self.new_tags = widgets.TagsEntry()
        self.get_widget("tags_box").add(self.new_tags)

        day_start = conf.get("day_start_minutes")
        self.day_start = dt.time(day_start / 60, day_start % 60)

        if fact_id:
            fact = runtime.storage.get_fact(fact_id)

            label = fact.activity
            if fact.category != _("Unsorted"):
                label += "@%s" % fact.category

            self.new_name.set_text(label)

            self.new_tags.set_text(", ".join(fact.tags))

            start_date = fact.start_time
            end_date = fact.end_time

            buf = gtk.TextBuffer()
            buf.set_text(fact.description or "")
            self.get_widget('description').set_buffer(buf)

            self.get_widget("save_button").set_label("gtk-save")
            self.window.set_title(_("Update activity"))
        else:
            self.get_widget("delete_button").set_sensitive(False)

            # if there is previous activity with end time - attach to it
            # otherwise let's start at 8am (unless it is today - in that case
            # we will assume that the user wants to start from this moment)
            fact_date = fact_date or dt.date.today()

            last_activity = runtime.storage.get_facts(fact_date)
            if last_activity and last_activity[-1].end_time:
                start_date = last_activity[-1].end_time

                if fact_date != dt.date.today():
                    end_date = start_date + dt.timedelta(minutes=30)
            else:
                if fact_date == dt.date.today():
                    start_date = dt.datetime.now()
                else:
                    start_date = dt.datetime(fact_date.year, fact_date.month,
                                             fact_date.day, 8)

        if not end_date:
            self.get_widget("in_progress").set_active(True)
            if (dt.datetime.now() - start_date).days == 0:
                end_date = dt.datetime.now()

        start_date = start_date or dt.datetime.now()
        end_date = end_date or start_date + dt.timedelta(minutes=30)

        self.start_date = widgets.DateInput(start_date)
        self.get_widget("start_date_placeholder").add(self.start_date)

        self.start_time = widgets.TimeInput(start_date)
        self.get_widget("start_time_placeholder").add(self.start_time)

        self.end_time = widgets.TimeInput(end_date, start_date)
        self.get_widget("end_time_placeholder").add(self.end_time)
        self.set_end_date_label(end_date)

        self.dayline = widgets.DayLine()
        self.dayline.connect("on-time-chosen", self.update_time)
        self._gui.get_object("day_preview").add(self.dayline)

        self.on_in_progress_toggled(self.get_widget("in_progress"))

        self.start_date.connect("date-entered", self.on_start_date_entered)
        self.start_time.connect("time-entered", self.on_start_time_entered)
        self.new_name.connect("changed", self.on_new_name_changed)
        self.end_time.connect("time-entered", self.on_end_time_entered)
        self._gui.connect_signals(self)

        self.window.show_all()
Example #16
0
    def __init__(self, applet):
        self.applet = applet

        self.button = PanelButton()
        self.button.connect('toggled', self.on_toggle)
        self.applet.add(self.button)

        self.applet.setup_menu_from_file (runtime.data_dir,
                                          "Hamster_Applet.xml",
                                          None,
                                          [("about", self.on_about),
                                          ("overview", self.show_overview),
                                          ("preferences", self.show_preferences),
                                          ("help", self.on_help_clicked),
                                          ])

        # load window of activity switcher and todays view
        self._gui = load_ui_file("applet.ui")
        self.window = self._gui.get_object('hamster-window')
        # on close don't destroy the popup, just hide it instead
        self.window.connect("delete_event", lambda *args: self.__show_toggle(False))
        self.window.connect("window-state-event", self.on_window_state_changed)

        self.new_name = widgets.ActivityEntry()
        self.new_name.connect("value-entered", self.on_switch_activity_clicked)

        self.new_name.set_property("secondary-icon-name", "help-contents")
        self.new_name.connect("icon-press", self.on_more_info_button_clicked)

        widgets.add_hint(self.new_name, _("Activity"))
        self.get_widget("new_name_box").add(self.new_name)
        self.new_name.connect("changed", self.on_activity_text_changed)

        self.new_tags = widgets.TagsEntry()
        self.new_tags.connect("tags_selected", self.on_switch_activity_clicked)
        widgets.add_hint(self.new_tags, _("Tags"))
        self.get_widget("new_tags_box").add(self.new_tags)

        self.tag_box = widgets.TagBox(interactive = False)
        self.get_widget("tag_box").add(self.tag_box)

        self.treeview = widgets.FactTree()
        self.treeview.connect("key-press-event", self.on_todays_keys)
        self.treeview.connect("edit-clicked", self._open_edit_activity)
        self.treeview.connect("row-activated", self.on_today_row_activated)

        self.get_widget("today_box").add(self.treeview)

        # configuration
        self.workspace_tracking = conf.get("workspace_tracking")

        conf.connect('conf-changed', self.on_conf_changed)

        # Load today's data, activities and set label
        self.last_activity = None
        self.todays_facts = None


        runtime.storage.connect('activities-changed', self.after_activity_update)
        runtime.storage.connect('facts-changed', self.after_fact_update)
        runtime.storage.connect('toggle-called', self.on_toggle_called)

        self.screen = None
        if self.workspace_tracking:
            self.init_workspace_tracking()

        self._gui.connect_signals(self)
        self.prev_size = None

        self.load_day()
        gobject.timeout_add_seconds(60, self.refresh_hamster) # refresh hamster every 60 seconds to update duration
        self.refresh_hamster()
Example #17
0
    def __init__(self, parent = None):
        self.parent = parent# determine if app should shut down on close
        self._gui = load_ui_file("overview.ui")
        self.report_chooser = None

        self.facts = None

        self.window = self.get_widget("tabs_window")

        self.day_start = conf.get("day_start_minutes")
        self.day_start = dt.time(self.day_start / 60, self.day_start % 60)

        self.view_date = (dt.datetime.today() - dt.timedelta(hours = self.day_start.hour,
                                                        minutes = self.day_start.minute)).date()

        self.range_pick = widgets.RangePick()
        self.get_widget("range_pick_box").add(self.range_pick)
        self.range_pick.connect("range-selected", self.on_range_selected)

        #set to monday
        self.start_date = self.view_date - dt.timedelta(self.view_date.weekday() + 1)

        # look if we need to start on sunday or monday
        self.start_date = self.start_date + dt.timedelta(stuff.locale_first_weekday())

        # see if we have not gotten carried away too much in all these calculations
        if (self.view_date - self.start_date) == dt.timedelta(7):
            self.start_date += dt.timedelta(7)

        self.end_date = self.start_date + dt.timedelta(6)

        self.overview = OverviewBox()
        self.get_widget("overview_tab").add(self.overview)
        self.fact_tree = self.overview.fact_tree # TODO - this is upside down, should maybe get the overview tab over here
        self.fact_tree.connect("cursor-changed", self.on_fact_selection_changed)

        self.fact_tree.connect("button-press-event", self.on_fact_tree_button_press)

        self.reports = TotalsBox()
        self.get_widget("reports_tab").add(self.reports)

        self.current_range = "week"

        self.timechart = widgets.TimeChart()
        self.timechart.connect("zoom-out-clicked", self.on_timechart_zoom_out_clicked)
        self.timechart.connect("range-picked", self.on_timechart_new_range)
        self.timechart.day_start = self.day_start

        self.get_widget("by_day_box").add(self.timechart)

        self._gui.connect_signals(self)
        runtime.storage.connect('activities-changed',self.after_activity_update)
        runtime.storage.connect('facts-changed',self.after_activity_update)

        conf.connect('conf-changed', self.on_conf_change)

        if conf.get("overview_window_maximized"):
            self.window.maximize()
        else:
            window_box = conf.get("overview_window_box")
            if window_box:
                x, y, w, h = (int(i) for i in window_box)
                self.window.move(x, y)
                self.window.resize(w, h)
            else:
                self.window.set_position(gtk.WIN_POS_CENTER)

        self.window.show_all()

        self.search()
Example #18
0
    def __init__(self, parent=None):
        self._gui = load_ui_file("stats.ui")
        self.report_chooser = None
        self.window = self.get_widget("stats_window")

        self.parent = parent  # determine if app should shut down on close

        self.timechart = widgets.TimeChart()
        self.timechart.interactive = False

        self.get_widget("explore_everything").add(self.timechart)
        self.get_widget("explore_everything").show_all()

        runtime.storage.connect('activities-changed', self.after_fact_update)
        runtime.storage.connect('facts-changed', self.after_fact_update)
        self.window.set_position(gtk.WIN_POS_CENTER)

        self.chart_category_totals = charting.Chart(value_format="%.1f",
                                                    max_bar_width=20,
                                                    legend_width=70,
                                                    interactive=False)
        self.get_widget("explore_category_totals").add(
            self.chart_category_totals)

        self.chart_weekday_totals = charting.Chart(value_format="%.1f",
                                                   max_bar_width=20,
                                                   legend_width=70,
                                                   interactive=False)
        self.get_widget("explore_weekday_totals").add(
            self.chart_weekday_totals)

        self.chart_weekday_starts_ends = charting.HorizontalDayChart(
            max_bar_width=20, legend_width=70)
        self.get_widget("explore_weekday_starts_ends").add(
            self.chart_weekday_starts_ends)

        self.chart_category_starts_ends = charting.HorizontalDayChart(
            max_bar_width=20, legend_width=70)
        self.get_widget("explore_category_starts_ends").add(
            self.chart_category_starts_ends)

        #ah, just want summary look just like all the other text on the page
        class CairoText(graphics.Scene):
            def __init__(self):
                graphics.Scene.__init__(self)
                self.text = ""
                self.label = graphics.Label(self.text, 10)
                self.label.wrap = pango.WRAP_WORD
                self.add_child(self.label)
                self.connect("on-enter-frame", self.on_enter_frame)

            def set_text(self, text):
                self.label.text = text
                self.redraw()

            def on_enter_frame(self, scene, context):
                # now for the text - we want reduced contrast for relaxed visuals
                fg_color = self.get_style().fg[gtk.STATE_NORMAL].to_string()
                self.label.color = self.colors.contrast(fg_color, 80)

                self.label.width = self.width

        self.explore_summary = CairoText()
        self.get_widget("explore_summary").add(self.explore_summary)
        self.get_widget("explore_summary").show_all()

        self._gui.connect_signals(self)
        self.show()
Example #19
0
    def __init__(self, parent=None, facts=None):
        gtk.Object.__init__(self)

        self.source = conf.get("activities_source")

        self._gui = load_ui_file("exporter.ui")
        self.window = self.get_widget('exporter_window')

        self.parent, self.facts = parent, facts

        self.done_button = self.get_widget("done_button")

#        Model
        self.tree_store = gtk.TreeStore(gobject.TYPE_PYOBJECT)
        self.rows = list([ExportRow(fact) for fact in facts])
        self.rows.sort(key = lambda row: row.id)
        grouped_rows = {}
        for issue_id, rows in groupby(self.rows, lambda export_row: export_row.id):
            grouped_rows[issue_id] = list(rows)
        for issue_id in grouped_rows.keys():
            # ściągnąć nazwę ticketa
            row_data = None
            if self.source == SOURCE_RT:
                row_data = runtime.get_external().rt.get_ticket(issue_id)
            elif self.source == SOURCE_REDMINE:
                issue = runtime.get_external().redmine.getIssue(issue_id)
                row_data = {'id': issue.id, 'Subject': str(issue_id) + ': ' + issue.fields.summary}
            elif self.source == SOURCE_JIRA and runtime.get_external().is_issue_from_existing_jira_project(issue_id):
                try:
                    issue = runtime.get_external().jira.issue(issue_id)
                    row_data = {'id': issue.key, 'Subject': issue.fields.summary}
                except:
                    logging.error("Issue not found: %s" % (issue_id))

            if row_data:
                parent = self.tree_store.append(None, (TicketRow(row_data),))
                for row in grouped_rows[issue_id]:
                    self.tree_store.append(parent, (row, ))

        self.view = gtk.TreeView(self.tree_store)
        self.view.set_headers_visible(False)

        id_cell = gtk.CellRendererText()
        id_column = gtk.TreeViewColumn("", id_cell, text=0)
        id_column.set_cell_data_func(id_cell, id_painter)
        id_column.set_max_width(100)
        self.view.append_column(id_column)

        name_comment_cell = gtk.CellRendererText()
        name_comment_cell.connect("edited", self.on_comment_edited)
        name_comment_column = gtk.TreeViewColumn("", name_comment_cell, text=0)
        name_comment_column.set_cell_data_func(name_comment_cell, name_comment_painter)
        name_comment_column.set_expand(True)
        self.view.append_column(name_comment_column)

        time_cell = gtk.CellRendererSpin()
        time_cell.connect("edited", self.on_time_worked_edited)
        time_column = gtk.TreeViewColumn("", time_cell, text=0)
        time_column.set_cell_data_func(time_cell, time_painter)
        time_column.set_min_width(60)
        self.view.append_column(time_column)
        self.view.expand_all()

        self.start_button = self.get_widget("start_button")
        self.get_widget("activities").add(self.view)
        self.aggregate_comments_checkbox = self.get_widget("aggregate_comments_checkbox")
        self.test_checkox = self.get_widget("test_checkbox")
        self.test_checkox.set_active(False)
        self.progressbar = self.get_widget("progressbar")
        self.progressbar.set_text(_("Waiting for action"))
        self.progressbar.set_orientation(gtk.PROGRESS_LEFT_TO_RIGHT)

        self._gui.connect_signals(self)

        self.window.show_all()
Example #20
0
    def __init__(self, parent = None):
        gtk.Object.__init__(self)
        self._gui = load_ui_file("stats.ui")
        self.report_chooser = None
        self.window = self.get_widget("stats_window")

        self.parent = parent# determine if app should shut down on close

        self.timechart = widgets.TimeChart()
        self.timechart.interactive = False

        self.get_widget("explore_everything").add(self.timechart)
        self.get_widget("explore_everything").show_all()

        self.window.set_position(gtk.WIN_POS_CENTER)
        self.chart_category_totals = charting.Chart(value_format = "%.1f",
                                                       max_bar_width = 20,
                                                       legend_width = 70,
                                                       interactive = False)
        self.get_widget("explore_category_totals").add(self.chart_category_totals)


        self.chart_weekday_totals = charting.Chart(value_format = "%.1f",
                                                      max_bar_width = 20,
                                                      legend_width = 70,
                                                      interactive = False)
        self.get_widget("explore_weekday_totals").add(self.chart_weekday_totals)

        self.chart_weekday_starts_ends = charting.HorizontalDayChart(max_bar_width = 20,
                                                                     legend_width = 70)
        self.get_widget("explore_weekday_starts_ends").add(self.chart_weekday_starts_ends)

        self.chart_category_starts_ends = charting.HorizontalDayChart(max_bar_width = 20,
                                                                      legend_width = 70)
        self.get_widget("explore_category_starts_ends").add(self.chart_category_starts_ends)


        #ah, just want summary look just like all the other text on the page
        class CairoText(graphics.Scene):
            def __init__(self):
                graphics.Scene.__init__(self)
                self.text = ""
                self.label = graphics.Label(self.text, 10)
                self.label.wrap = pango.WRAP_WORD
                self.add_child(self.label)
                self.connect("on-enter-frame", self.on_enter_frame)

            def set_text(self, text):
                self.label.text = text
                self.redraw()

            def on_enter_frame(self, scene, context):
                # now for the text - we want reduced contrast for relaxed visuals
                fg_color = self.get_style().fg[gtk.STATE_NORMAL].to_string()
                self.label.color = self.colors.contrast(fg_color,  80)

                self.label.width = self.width


        self.explore_summary = CairoText()
        self.get_widget("explore_summary").add(self.explore_summary)
        self.get_widget("explore_summary").show_all()

        self.external_listeners = [
            (runtime.storage, runtime.storage.connect('activities-changed',self.after_fact_update)),
            (runtime.storage, runtime.storage.connect('facts-changed',self.after_fact_update))
        ]

        self._gui.connect_signals(self)
        self.show()
Example #21
0
    def __init__(self, parent = None, facts = None):
        gtk.Object.__init__(self)
        
        self.source = conf.get("activities_source")
        self.rt = None
        self.redmine = None
        self.jira = None

        if self.source == SOURCE_RT:
#            Init RT
            self.rt_url = conf.get("rt_url")
            self.rt_user = conf.get("rt_user")
            self.rt_pass = conf.get("rt_pass")

            self.rt = rt.Rt(self.rt_url, self.rt_user, self.rt_pass)
            if not self.rt.login():
                self.rt = None
        elif self.source == SOURCE_REDMINE:
            self.rt_url = conf.get("rt_url")
            self.rt_user = conf.get("rt_user")
            self.rt_pass = conf.get("rt_pass")

            if self.rt_url and self.rt_user and self.rt_pass:
                try:
                    self.redmine = redmine.Redmine(self.rt_url, auth=(self.rt_user,self.rt_pass))
                    if not self.redmine:
                        self.source = SOURCE_NONE
                except:
                    self.source = SOURCE_NONE
            else:
                self.source = SOURCE_NONE

        elif jira_active and self.source == SOURCE_JIRA:
            self.jira_url = conf.get("jira_url")
            self.jira_user = conf.get("jira_user")
            self.jira_pass = conf.get("jira_pass")
            self.jira_query = conf.get("jira_query")
            self.jira_category = conf.get("jira_category_field")
            self.jira_fields=','.join(['summary', self.jira_category])
            if self.jira_url and self.jira_user and self.jira_pass:
                try:
                    options = {'server': self.jira_url}
                    self.jira = JIRA(options, basic_auth = (self.jira_user, self.jira_pass), validate = True)
                except Exception as e:
                    logging.warn('jira connection failed: '+str(e))
                    self.source = SOURCE_NONE
            else:
                self.source = SOURCE_NONE
                
        self._gui = load_ui_file("export_rt.ui")
        self.window = self.get_widget('report_rt_window')

        self.parent, self.facts = parent, facts

        self.done_button = self.get_widget("done_button")
#        self.done_button.set_sensitive(False)
        
#        Model
        self.tree_store = gtk.TreeStore(gobject.TYPE_PYOBJECT)
        self.rows = list([ExportRow(fact) for fact in facts])
        self.rows.sort(key = lambda row: row.id)
        grouped_rows = {}
        for issue_id, rows in groupby(self.rows, lambda export_row: export_row.id):
            grouped_rows[issue_id] = list(rows)
        for issue_id in grouped_rows.keys():
            #ściągnąć nazwę ticketa
            if self.source == SOURCE_RT:
                row_data = self.rt.get_ticket(issue_id)
#                 row_data['source'] = SOURCE_RT
            elif self.source == SOURCE_REDMINE:
                issue = self.redmine.getIssue(issue_id)
                row_data = {}
                row_data['id'] = issue.id
                row_data['Subject'] = str(issue_id)+': '+issue.fields.summary
#                 row_data['source'] = SOURCE_REDMINE
            elif self.source == SOURCE_JIRA:
                issue = self.jira.issue(issue_id)
                row_data = {}
                row_data['id'] = issue.id
                row_data['Subject'] = issue.fields.summary
#                 row_data['source'] = SOURCE_JIRA

            if row_data:
                parent = self.tree_store.append( None, (TicketRow(row_data), ) )
                for row in grouped_rows[issue_id]:
                    self.tree_store.append(parent, (row, ))
            
#        self.tree_store.append(parent, (row.comment))
        self.view = gtk.TreeView(self.tree_store);
        self.view.set_headers_visible(False)
        
        
        id_cell = gtk.CellRendererText()
        id_column = gtk.TreeViewColumn("", id_cell, text=0)
        id_column.set_cell_data_func(id_cell, id_painter)
        id_column.set_max_width(100)
        self.view.append_column(id_column)
        
        name_comment_cell = gtk.CellRendererText()
        name_comment_cell.connect("edited", self.on_comment_edited)
        name_comment_column = gtk.TreeViewColumn("", name_comment_cell, text=0)
        name_comment_column.set_cell_data_func(name_comment_cell, name_comment_painter)
        name_comment_column.set_expand(True)
        self.view.append_column(name_comment_column)
        
        time_cell = gtk.CellRendererSpin()
        time_cell.connect("edited", self.on_time_worked_edited)
        time_column = gtk.TreeViewColumn("", time_cell, text=0)
        time_column.set_cell_data_func(time_cell, time_painter)
        time_column.set_min_width(60)
        self.view.append_column(time_column)
        self.view.expand_all()
        
        self.start_button = self.get_widget("start_button")
        self.get_widget("activities").add(self.view)
        self.aggregate_comments_checkbox = self.get_widget("aggregate_comments_checkbox")
        self.aggregate_comments_checkbox.set_active(True)
        self.test_checkox = self.get_widget("test_checkbox")
        self.test_checkox.set_active(False)
        self.progressbar = self.get_widget("progressbar")
        self.progressbar.set_text(_("Waiting for action"))
        self.progressbar.set_orientation(gtk.PROGRESS_LEFT_TO_RIGHT)
        
        self._gui.connect_signals(self)

        self.window.show_all()