Beispiel #1
0
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('-l',
                        '--logfile',
                        nargs=1,
                        metavar='LOGFILE',
                        help='Path to the gtimelog logfile to be use')
    args = parser.parse_args()

    if args.logfile is not None:
        LogFile = set_logfile(args.logfile)
    else:
        LogFile = set_logfile()

    (week_first, week_last) = get_time()
    Log = TimeLog(LogFile, virtual_midnight)
    log_entries = Log.window_for(week_first, week_last)
    total_work, _ = log_entries.totals()
    _, totals = log_entries.categorized_work_entries()

    ordered_by_time = [(time, cat) for cat, time in totals.items()]
    ordered_by_time.sort(reverse=True)
    max_cat_length = max([len(cat) for cat in totals.keys()])
    line_format = '  %-' + str(max_cat_length + 4) + 's %+5s\t %.0f%%'
    print("\nTotal work done so far : %s\n" %
          format_duration_short(total_work))
    print('Categories by time spent:')
    for time, cat in ordered_by_time:
        print(line_format %
              (cat, format_duration_short(time), time / total_work * 100))
Beispiel #2
0
class GtimelogParser(object):
    def __init__(self, config):
        self.settings = Settings()
        self.timelog = TimeLog(self.settings.get_timelog_file(),
                               self.settings.virtual_midnight)
        self.aliases = config.get('aliases', {})

    def skip_entry(self, entry):
        if '**' in entry:
            return True
        if entry.strip() in ('arrive', 'arrived', 'start'):
            return True
        return False

    def get_entries(self, date_window):
        window = self.timelog.window_for(date_window.start, date_window.stop)

        worklogs = []
        attendances = []
        for start, stop, duration, tags, entry in window.all_entries():
            if self.skip_entry(entry):
                continue
            if attendances and attendances[-1][1] == start:
                attendances[-1] = (attendances[-1][0], stop)
            else:
                attendances += [(start, stop)]
            try:
                issue, description = [
                    x.strip() for x in entry.split(':', 1) if x.strip()
                ]
            except ValueError:
                print(
                    'Entry must be in the format `task: description`. '
                    'Got ', entry)
                continue

            # no matter what we find as `issue`:
            # if we have an alias override it takes precedence
            if issue in self.aliases:
                issue = self.aliases[issue]
            worklogs.append(
                MultiLog(None, issue, int(duration.total_seconds()),
                         start.date(), description))

        # Dangling attendance for today
        if attendances and attendances[-1][1].date() == date.today():
            attendances[-1] = (attendances[-1][0], None)

        return attendances, worklogs
Beispiel #3
0
def task_summary(category, task=None):

    total_delta = datetime.timedelta()
    today = datetime.datetime.today()
    epoch = datetime.datetime(1970, 10, 1)
    Log = TimeLog(LogFile, virtual_midnight)
    log_entries = Log.window_for(epoch, today)
    entries, _ = log_entries.categorized_work_entries()

    for (_, entry, entry_time) in entries[Categories[category] + ' ']:
        if entry.lstrip() == task:
            total_delta += entry_time
    print("total time spent on %s : %d.%d" % (
        task, int(total_delta.seconds / 3600) + int(total_delta.days * 24),
        int(total_delta.seconds / 60 % 60)))
    return 0
Beispiel #4
0
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('-l',
                        '--logfile',
                        nargs=1,
                        metavar='LOGFILE',
                        help='Path to the gtimelog logfile to be use')
    parser.add_argument('-u',
                        '--user',
                        nargs=1,
                        metavar='USER',
                        help='User Identification to be used for report')
    parser.add_argument('-n',
                        '--no-time',
                        help='Print weekly report without spent time',
                        action='store_true')
    parser.add_argument('-m',
                        '--minutes',
                        help='Print weekly report with spent time in minutes',
                        action='store_true')
    parser.add_argument('-d',
                        '--days',
                        help='Print weekly report with spent time in days',
                        action='store_true')
    parser.add_argument('-b',
                        '--back',
                        help='Print weekly report back # of weeks',
                        nargs=1)
    args = parser.parse_args()

    if args.logfile is not None:
        LogFile = set_logfile(args.logfile)
    else:
        LogFile = set_logfile()

    if args.user is not None:
        UserId = set_userid(args.user)
    else:
        UserId = set_userid()

    (week_first, week_last) = get_time(args.back)
    Log = TimeLog(LogFile, virtual_midnight)
    log_entries = Log.window_for(week_first, week_last)
    total_work, _ = log_entries.totals()
    entries, totals = log_entries.categorized_work_entries()

    print("[ACTIVITY] %s to %s (%s)" %
          (week_first.isoformat().split("T")[0],
           week_last.isoformat().split("T")[0], UserId))
    if entries:
        if None in entries:
            categories = sorted(entries)
            categories.append('No category')
            entries['No category'] = e
            t = totals.pop(None)
            totals['No category'] = t
        else:
            categories = sorted(entries)
        for cat in categories:
            print('%s:' % cat)

            work = [(entry, duration)
                    for start, entry, duration in entries[cat]]
            work.sort()
            for entry, duration in work:
                if not duration:
                    continue  # skip empty "arrival" entries

                entry = entry[:1].upper() + entry[1:]
                if args.no_time:
                    print(u"  %-61s  " % entry)
                elif args.minutes:
                    print(u"  %-85s  %+5s %+4s" %
                          (entry, format_duration_short(duration),
                           as_minutes(duration)))
                elif args.days:
                    print(u"  %-85s  %+5s %.1f" %
                          (entry, format_duration_short(duration),
                           as_minutes(duration) / 480))
                else:
                    print(u"  %-85s  %+5s" %
                          (entry, format_duration_short(duration)))

            if args.no_time:
                print("")
            else:
                if args.minutes:
                    print('-' * 100)
                    print(u"%+94s %4s" % (format_duration_short(
                        totals[cat]), as_minutes(totals[cat])))
                elif args.days:
                    print('-' * 98)
                    print(u"%+94s %.1f" % (format_duration_short(
                        totals[cat]), as_minutes(totals[cat]) / 480))
                else:
                    print('-' * 94)
                    print(u"%+94s" % (format_duration_short(totals[cat])))

        print("Total work done : %s" % format_duration_short(total_work))
Beispiel #5
0
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('-l',
                        '--logfile',
                        nargs=1,
                        metavar='LOGFILE',
                        help='Path to the gtimelog logfile to be use')
    parser.add_argument('-u',
                        '--user',
                        nargs=1,
                        metavar='USER',
                        help='User Identification to be used for report')
    parser.add_argument('-t',
                        '--time',
                        help='Print daily report with spent time',
                        action='store_false')
    parser.add_argument('-H',
                        '--header',
                        help='Print category headers',
                        action='store_true')
    parser.add_argument('-m',
                        '--minutes',
                        help='Print daily report with spent time in minutes',
                        action='store_true')
    parser.add_argument('-b',
                        '--back',
                        help='Print daily report back # of days',
                        metavar='BACK',
                        type=int)
    args = parser.parse_args()

    if args.logfile is not None:
        LogFile = set_logfile(args.logfile)
    else:
        LogFile = set_logfile()

    if args.user is not None:
        UserId = set_userid(args.user)
    else:
        UserId = set_userid()

    day_start = datetime.datetime.today().replace(hour=0,
                                                  minute=0,
                                                  second=0,
                                                  microsecond=0)
    if args.back:
        day_start = day_start - datetime.timedelta(days=args.back)
    day_end = day_start.replace(hour=23, minute=59, second=59, microsecond=999)
    Log = TimeLog(LogFile, virtual_midnight)
    log_entries = Log.window_for(day_start, day_end)
    total_work, _ = log_entries.totals()
    entries, totals = log_entries.categorized_work_entries()

    print("Today's work for %s" % UserId)
    if entries:
        if None in entries:
            categories = sorted(entries)
            categories.append('No category')
            entries['No category'] = e
            t = totals.pop(None)
            totals['No category'] = t
        else:
            categories = sorted(entries)
        for cat in categories:
            if args.header:
                print('- %s:' % cat)

            work = [(entry, duration)
                    for start, entry, duration in entries[cat]]
            work.sort()
            for entry, duration in work:
                if not duration:
                    continue  # skip empty "arrival" entries

                entry = entry[:1].upper() + entry[1:]
                if args.time:
                    print(u"  - %-61s  " % entry)
                else:
                    if args.minutes:
                        print(u"  - %-59s  %+5s %+4s" %
                              (entry, format_duration_short(duration),
                               as_minutes(duration)))
                    else:
                        print(u"  - %-59s  %+5s" %
                              (entry, format_duration_short(duration)))

            if args.time:
                pass
                # print("")
            else:
                if args.minutes:
                    print('-' * 75)
                    print(u"%+70s %4s" % (format_duration_short(
                        totals[cat]), as_minutes(totals[cat])))
                else:
                    print('-' * 70)
                    print(u"%+70s" % (format_duration_short(totals[cat])))
        print("Total work done : %s" % format_duration_short(total_work))