def __init__(self, backend, parent=None): super().__init__(parent) self.backend = backend self.ui = Ui_mainwindow() self.ui.setupUi(self) self.setWindowTitle('qTimer v%s' % VERSION) session = self.backend.session # Setup initial projects self.backend.syncConditionally() for project in session.query(Project): parent = QTreeWidgetItem([project.name]) parent.project = project self.ui.projects.addTopLevelItem(parent) for ticket in project.tickets: child = QTreeWidgetItem([ticket.name]) child.ticket = ticket parent.addChild(child) for timer in session.query(Timer): item = QTreeWidgetItem([ timer.status, timer.name, format_time(timer.start), str(self.backend.roundTime(timer.duration)), str(timer.posted) ]) item.timer = timer self.ui.timers.addTopLevelItem(item) self.ui.date_from.setDate(QDate.currentDate()) self.ui.date_to.setDate(QDate.currentDate()) self.actionMenu = QMenu() self.actionMenu.triggered.connect(self.onActionClicked) self.actionMenu.addAction('Start') self.actionMenu.addAction('Stop') self.actionMenu.addAction('Post') self.ui.actions.setMenu(self.actionMenu) self.readSettings() self.dateFromChanged = lambda date: self.onDateChanged(self.ui.date_from_label) self.dateToChanged = lambda date: self.onDateChanged(self.ui.date_to_label) self.ui.projects.itemClicked.connect(self.onFilterClicked) self.ui.date_from.dateChanged.connect(self.dateFromChanged) self.ui.date_to.dateChanged.connect(self.dateToChanged) self.durationTimer = QTimer(self) self.durationTimer.timeout.connect(self.onRefreshDurations) self.durationTimer.start(int(self.backend.config.timers.rounding) * 1000)
def _formatRow(self, row, fieldNames, core): items = vars(row) if isinstance(row, Timer): items['start'] = format_time(row.start) items['duration'] = timedelta() items['duration'] = core.roundTime(row.duration) items['ticket'] = '%d: %s' % (row.ticket.id, row.ticket.name) \ if row.ticket else None items['status'] = row.status.title() return tuple([items[key] for key in fieldNames])
def _formatRow(self, row, fieldNames, core): items = vars(row) if isinstance(row, Timer): items['start'] = format_time(row.start) items['duration'] = timedelta() items['duration'] = core.roundTime(row.duration) items['ticket'] = '%d: %s' % (row.ticket.id, row.ticket.name) \ if row.ticket else None items['status'] = row.status.title() return tuple([ items[key] for key in fieldNames ])
def _formatRow(self, row, fieldNames, program): items = vars(row) if isinstance(row, Timer): items["start"] = format_time(row.sessions[0].start) items["duration"] = timedelta() for session in row.sessions: end = session.end if session.end else datetime.utcnow() items["duration"] += end - session.start items["duration"] = program.roundTime(items["duration"]) items["ticket"] = "%d: %s" % (row.ticket.id, row.ticket.name) if row.ticket else None return tuple([items[key] for key in fieldNames])
def onFilterClicked(self, item, column): self.ui.timers.clear() query = self.backend.session.query(Timer) if hasattr(item, 'ticket'): query = query.filter(Timer.ticket_id == item.ticket.id) elif hasattr(item, 'project'): query = query.join(Ticket).filter(Ticket.project_id == item.project.id) for timer in query: item = QTreeWidgetItem([ timer.status, timer.name, format_time(timer.start), str(self.backend.roundTime(timer.duration)), str(timer.posted) ]) item.timer = timer self.ui.timers.addTopLevelItem(item)