From f858d4a5f04f7b536734ceb71027730f493f3b12 Mon Sep 17 00:00:00 2001 From: 3wc <3wc@doesthisthing.work> Date: Sat, 8 Jul 2023 13:13:07 +0100 Subject: [PATCH] Support multiple mapping files --- README.md | 6 +++--- hamstertools/__init__.py | 32 ++++++++++++++++++++++---------- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index c098a15..0695472 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ hamster](https://github.com/projecthamster/hamster-lib) is ready. 1. Run `python -m hamstertools activities list --csv` to get a dump of all activities 2. Review the export to check for any duplicates, typoes, etc. 3. Use e.g. `python -m hamstertools activities move-facts ...` to clean them up -4. Run `python -m hamstertools kimai import --mapping-path mapping.kimai.csv --show-missing --after 2021-09-07 --category-search auto 3wordchant` to find entries in your time tracking which don't yet have a mapping to Kimai. You might notice some extra tidying needed here. -5. Run `python -m hamstertools kimai sync --mapping-path mapping.kimai.csv --just-errors --ignore-activities 3wordchant $(pass users/calix/logins/kimai.autonomic.zone/api)` to find items in your mapping file which don't exist on Kimai -5. Run `python -m hamstertools kimai import --mapping-path mapping.kimai.csv --after 2021-09-07 --category-search auto 3wordchant --output kimai_$(date +%F).csv` to generate a CSV of your time entries +4. Run `python -m hamstertools kimai import --mapping-path data/mapping.2023.kimai.csv --show-missing --after 2023-09-07 --category-search auto 3wordchant` to find entries in your time tracking which don't yet have a mapping to Kimai. You might notice some extra tidying needed here. +5. Run `python -m hamstertools kimai sync --mapping-path data/mapping.2023.kimai.csv --just-errors --ignore-activities 3wordchant $(pass users/calix/logins/kimai.autonomic.zone/api)` to find items in your mapping file which don't exist on Kimai +5. Run `python -m hamstertools kimai import --mapping-path data/mapping.2023.kimai.csv --after 2023-09-07 --category-search auto 3wordchant --output data/kimai_$(date +%F).csv` to generate a CSV of your time entries 6. Review your timesheet -- NB it might not be sorted in date order by default - to make sure it has the expected entries, and remove any entries already in Kimai. diff --git a/hamstertools/__init__.py b/hamstertools/__init__.py index e7e21de..6a8b83d 100755 --- a/hamstertools/__init__.py +++ b/hamstertools/__init__.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3.7 import csv from datetime import datetime +from itertools import chain from pathlib import Path import sys @@ -398,7 +399,7 @@ def kimai(): pass -def _get_kimai_mapping_file(path): +def _get_kimai_mapping_file(path, category_search=None): try: return open(path) except FileNotFoundError: @@ -431,7 +432,7 @@ def _get_kimai_mapping_file(path): @kimai.command() -@click.option('--mapping-path', help='Mapping file (default ~/.local/share/hamster/mapping.kimai.csv)') +@click.option('--mapping-path', help='Mapping file (default ~/.local/share/hamster/mapping.kimai.csv)', multiple=True) @click.argument('username') @click.argument('api_key') @click.option('--just-errors', 'just_errors', is_flag=True, help='Only display errors') @@ -546,7 +547,7 @@ def sync(username, api_key, just_errors, ignore_activities, mapping_path=None): @kimai.command('import') -@click.option('--mapping-path', help='Mapping file (default ~/.local/share/hamster/mapping.kimai.csv)') +@click.option('--mapping-path', help='Mapping file (default ~/.local/share/hamster/mapping.kimai.csv)', multiple=True) @click.option('--output', help='Output file (default kimai.csv)') @click.option('--category-search', help='Category search string') @click.option('--after', help='Only show time entries after this date') @@ -564,17 +565,28 @@ def _import(username, mapping_path=None, output=None, category_search=None, afte timestamp = datetime.now().strftime('%F') output = f'kimai_{timestamp}.csv' - mapping_file = _get_kimai_mapping_file(mapping_path) - mapping_reader = csv.reader(mapping_file) - - next(mapping_reader) + if type(mapping_path) == tuple: + mapping_files = [] + for mapping_path_item in mapping_path: + mapping_file = _get_kimai_mapping_file(mapping_path_item, category_search) + next(mapping_file) + mapping_files.append(mapping_file) + mapping_reader = csv.reader(chain(*mapping_files)) + else: + mapping_file = _get_kimai_mapping_file(mapping_path, category_search) + next(mapping_file) + mapping_reader = csv.reader(mapping_file) mapping = { '{0}:{1}'.format(row[0], row[1]): [row[2], row[3], row[4], row[5]] for row in mapping_reader } - mapping_file.close() + if type(mapping_path) == tuple: + for mapping_file in mapping_files: + mapping_file.close() + else: + mapping_file.close() output_file = open(output, 'w') output_writer = csv.writer(output_file) @@ -623,8 +635,8 @@ def _import(username, mapping_path=None, output=None, category_search=None, afte "Description", "Exported", "Tags", - "Hourly rate", - "Fixed rate" + "HourlyRate", + "FixedRate" ]) for fact in results: