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()
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()
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)
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)
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
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
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()