def project_report(self, total_seconds, colorize_fn): colour_hash = lambda s: _hashtag_finder.sub(lambda x: colorize_fn('hashtag', x.group(0)), s) report = (colorize_fn('project_name', self.name) + ": {} ({:.2%})\n".format(format_timedelta(self.total_time), self.total_time.total_seconds() / float(total_seconds))) # group timelogs by message so that we only get a single line per log message grouped = {} for tl in self.timelogs: grouped[tl.log] = grouped.get(tl.log, timedelta()) + tl.duration sorted_timelogs = sorted(grouped.items(), key=lambda el: el[1], reverse=True) for log, duration in sorted_timelogs: report += " {:>7}".format(format_timedelta(duration)) report += ": {}\n".format(colour_hash(colorize_fn('log', log))) if log else '\n' return report
def stats(args): if args.yesterday: yesterday_obj = dt.now() - timedelta(days=1) date_from = date_to = dt.combine(yesterday_obj, time.min) elif args.day: date_from = date_to = dt.strptime(args.day, DATE_FORMAT) elif args.week: # TODO: this currently doesn't work. Fix or delete. date_from, date_to = get_week_range(args.week) elif args.last_week: date_from, date_to = get_last_week() elif args.month: date_from, date_to = get_month_range(args.month) elif args.last_month: date_from, date_to = get_last_month() elif args._from and not args.to: date_from = dt.combine(dt.strptime(args._from, DATE_FORMAT), time.min) date_to = dt.combine(dt.now(), time.min) elif args._from and args.to: date_from = dt.combine(dt.strptime(args._from, DATE_FORMAT), time.min) date_to = dt.combine(dt.strptime(args.to, DATE_FORMAT), time.min) else: # default action is to show today's stats date_from = date_to = dt.combine(dt.now(), time.min) projects = get_projects(date_from, date_to) if args.summary: print_stats(projects) else: print_report(projects, date_from, date_to, colorize=args.no_color) if date_from == date_to == dt.combine(dt.now(), time.min): # then we are looking at today only earliest_start = min(min(tl.start for tl in p.timelogs) for p in projects) print('\nToday working for: {}'.format(format_timedelta(dt.now() - earliest_start)))