def fill_calendar_with_time_logs(self): """fill the calendar with daily time log info """ resource_id = self.get_current_resource_id() # do not update if the calendar is showing the same user if self.calendar_widget.resource_id == resource_id or resource_id == -1: return tool_tip_text_format = u'{start:%H:%M} - {end:%H:%M} | {task_name}' # import time # start = time.time() # get all the TimeLogs grouped daily sql = """-- TOP DOWN SEARCH -- select "TimeLogs".start::date as date, array_agg(task_rec_data.full_path) as task_name, array_agg("TimeLogs".start) as start, array_agg("TimeLogs".end) as end, sum(extract(epoch from ("TimeLogs".end - "TimeLogs".start))) from "TimeLogs" join ( with recursive recursive_task(id, parent_id, path_names) as ( select task.id, task.project_id, -- task.project_id::text as path, ("Projects".code || '') as path_names from "Tasks" as task join "Projects" on task.project_id = "Projects".id where task.parent_id is NULL union all select task.id, task.parent_id, -- (parent.path || '|' || task.parent_id:: text) as path, (parent.path_names || ' | ' || "Parent_SimpleEntities".name) as path_names from "Tasks" as task inner join recursive_task as parent on task.parent_id = parent.id inner join "SimpleEntities" as "Parent_SimpleEntities" on parent.id = "Parent_SimpleEntities".id ) select recursive_task.id, "SimpleEntities".name || ' (' || recursive_task.path_names || ')' as full_path from recursive_task join "SimpleEntities" on recursive_task.id = "SimpleEntities".id ) as task_rec_data on "TimeLogs".task_id = task_rec_data.id -- getting all the data is as fast as getting one, so get all the TimeLogs of this user where "TimeLogs".resource_id = :resource_id group by cast("TimeLogs".start as date) order by cast("TimeLogs".start as date) """ from sqlalchemy import text from stalker.db.session import DBSession result = DBSession.connection().execute( text(sql), resource_id=resource_id ).fetchall() # end = time.time() # print('getting data from sql: %0.3f sec' % (end - start)) from anima.utils import utc_to_local time_shifter = utc_to_local import stalker # TODO: Remove this in a later version from distutils.version import LooseVersion if LooseVersion(stalker.__version__) >= LooseVersion('0.2.18'): def time_shifter(x): return x for r in result: calendar_day = r[0] year = calendar_day.year month = calendar_day.month day = calendar_day.day daily_logged_seconds = r[4] daily_logged_hours = daily_logged_seconds // 3600 daily_logged_minutes = \ (daily_logged_seconds - daily_logged_hours * 3600) // 60 tool_tip_text_data = [ u'Total: %i h %i min logged' % (daily_logged_hours, daily_logged_minutes) if daily_logged_hours else u'Total: %i min logged' % daily_logged_minutes ] for task_name, start, end in sorted( zip(r[1], r[2], r[3]), key=lambda x: x[1]): time_log_tool_tip_text = tool_tip_text_format.format( start=time_shifter(start), end=time_shifter(end), task_name=task_name ) tool_tip_text_data.append(time_log_tool_tip_text) merged_tool_tip = u'\n'.join(tool_tip_text_data) date_format = QtGui.QTextCharFormat() bg_brush = QtGui.QBrush() bg_brush.setColor( QtGui.QColor(0, 255.0 / 86400.0 * daily_logged_seconds, 0) ) date_format.setBackground(bg_brush) date_format.setToolTip(merged_tool_tip) date = QtCore.QDate(year, month, day) self.calendar_widget.setDateTextFormat(date, date_format)
def _set_defaults(self): """sets the defaults for the ui """ logger.debug("started setting up interface defaults") # Set Default Value for time current_time = QtCore.QTime.currentTime() # round the minutes to the resolution minute = current_time.minute() hour = current_time.hour() minute = int(minute / float(timing_resolution)) * timing_resolution current_time = QtCore.QTime(hour, minute) self.start_time_edit.setTime(current_time) self.end_time_edit.setTime(current_time.addSecs(timing_resolution * 60)) self.calendar_widget.resource_id = -1 # enter revision types revision_types = [ 'Yetistiremedim', 'Ajans', 'Yonetmen', 'Ic Revizyon', ] self.revision_type_combo_box.addItems(revision_types) if not self.logged_in_user: self.logged_in_user = self.get_logged_in_user() # fill the tasks comboBox from stalker import Status, Task status_wfd = Status.query.filter(Status.code == 'WFD').first() status_cmpl = Status.query.filter(Status.code == 'CMPL').first() status_prev = Status.query.filter(Status.code == 'PREV').first() if not self.timelog: # dialog is in create TimeLog mode # if a task has been given just feed that task to the comboBox if self.task: all_tasks = [self.task] else: # no Task is given nor updating a TimeLog # show all the suitable tasks of the logged_in_user all_tasks = Task.query \ .filter(Task.resources.contains(self.logged_in_user)) \ .filter(Task.status != status_wfd) \ .filter(Task.status != status_cmpl) \ .filter(Task.status != status_prev) \ .all() # sort the task labels all_tasks = sorted( all_tasks, key=lambda task: '%s | %s' % ( task.project.name.lower(), ' | '.join(map(lambda x: x.name.lower(), task.parents)) ) ) else: # dialog is working in update TimeLog mode all_tasks = [self.timelog.task] self.tasks_combo_box.setSizeAdjustPolicy( QtWidgets.QComboBox.AdjustToContentsOnFirstShow ) self.tasks_combo_box.setFixedWidth(360) self.tasks_combo_box.clear() self.tasks_combo_box.addTasks(all_tasks) self.tasks_combo_box.setSizePolicy( QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Minimum ) # if a time log is given set the fields from the given time log if self.timelog: # first update Task try: self.tasks_combo_box.setCurrentTask(self.timelog.task) except IndexError as e: return # set the resource # and disable the tasks_combo_box and resource_combo_box self.tasks_combo_box.setEnabled(False) self.resource_combo_box.setEnabled(False) # set the start and end time from anima.utils import utc_to_local start_date = utc_to_local(self.timelog.start) end_date = utc_to_local(self.timelog.end) # set the date self.calendar_widget.setSelectedDate( QtCore.QDate(start_date.year, start_date.month, start_date.day) ) # first reset the start and end time values self.start_time_edit.setTime(QtCore.QTime(0, 0)) self.end_time_edit.setTime(QtCore.QTime(23, 50)) # now set the timelog time self.start_time_edit.setTime( QtCore.QTime( start_date.hour, start_date.minute ) ) self.end_time_edit.setTime( QtCore.QTime( end_date.hour, end_date.minute ) ) self.fill_calendar_with_time_logs() # also trigger an update to the side info bar self.calendar_widget_selection_changed()