Esempio n. 1
0
    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
Esempio n. 2
0
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)))