108 lines
2.9 KiB
Python
108 lines
2.9 KiB
Python
import os
|
|
import sys
|
|
|
|
sys.path.append(os.path.join(os.path.dirname(__file__), ".."))
|
|
|
|
from datetime import datetime
|
|
|
|
from peewee import JOIN
|
|
|
|
from hamstertools.db import (
|
|
HamsterCategory,
|
|
HamsterActivity,
|
|
HamsterFact,
|
|
HamsterFactKimaiImport,
|
|
)
|
|
from hamstertools.kimai import KimaiAPI, Timesheet, Project, Activity
|
|
|
|
api = KimaiAPI()
|
|
|
|
DATE_FROM = "2023-10-01"
|
|
DATE_TO = "2023-11-01"
|
|
SEARCH = "auto"
|
|
|
|
facts = (
|
|
HamsterFact.select(HamsterFact, HamsterActivity, HamsterCategory)
|
|
.join(HamsterActivity, JOIN.LEFT_OUTER)
|
|
.join(HamsterCategory, JOIN.LEFT_OUTER)
|
|
.where(
|
|
(HamsterFact.start_time > datetime.strptime(DATE_FROM, "%Y-%m-%d"))
|
|
& (HamsterFact.start_time < datetime.strptime(DATE_TO, "%Y-%m-%d"))
|
|
& HamsterCategory.name.contains(SEARCH)
|
|
)
|
|
)
|
|
|
|
has_errors = False
|
|
|
|
# check data
|
|
for f in facts:
|
|
mappings = f.activity.mappings
|
|
if len(mappings) == 0:
|
|
print(
|
|
f"fact {f.id}: @{f.activity.category.id} {f.activity.category.name} » @{f.activity.id} {f.activity.name} has no mapping"
|
|
)
|
|
has_errors = True
|
|
continue
|
|
if len(mappings) > 1:
|
|
print(
|
|
f"fact {f.id}: activity @{f.activity.id} {f.activity.name} has multiple mappings"
|
|
)
|
|
has_errors = True
|
|
continue
|
|
if (
|
|
mappings[0].kimai_activity.project is None
|
|
and not mappings[0].kimai_project.allow_global_activities
|
|
):
|
|
print(
|
|
f"fact {f.id}: project @{mappings[0].kimai_project.id} {mappings[0].kimai_project.name} does not allow global activity {mappings[0].kimai_activity}"
|
|
)
|
|
has_errors = True
|
|
continue
|
|
if f.imports.count() > 0:
|
|
print(
|
|
f"fact {f.id}: activity @{f.activity.id} {f.activity.name} was already imported {f.imports.count()} time(s)"
|
|
)
|
|
has_errors = True
|
|
continue
|
|
|
|
|
|
# if has_errors:
|
|
# sys.exit(1)
|
|
|
|
# upload data
|
|
for f in facts:
|
|
try:
|
|
mapping = f.activity.mappings[0]
|
|
except IndexError:
|
|
print(
|
|
f"no mapping, skipping {f.id} ({f.activity.category.name} » {f.activity.name})"
|
|
)
|
|
continue
|
|
|
|
if f.imports.count() > 0:
|
|
print(
|
|
f"already imported, skipping {f.id} ({f.activity.category.name} » {f.activity.name})"
|
|
)
|
|
continue
|
|
|
|
t = Timesheet(
|
|
api,
|
|
activity=mapping.kimai_activity,
|
|
project=mapping.kimai_project,
|
|
begin=f.start_time,
|
|
end=f.end_time,
|
|
description=f.description if f.description != "" else mapping.kimai_description,
|
|
# tags=f.tags if f.tags != '' else mapping.kimai_tags
|
|
)
|
|
r = t.upload().json()
|
|
if r.get("code", 200) != 200:
|
|
print(r)
|
|
print(f"{f.id} ({f.activity.category.name} » {f.activity.name})")
|
|
from pdb import set_trace
|
|
|
|
set_trace()
|
|
|
|
else:
|
|
HamsterFactKimaiImport.create(hamster_fact=f, kimai_id=r["id"]).save()
|
|
print(f'Created Kimai timesheet {r["id"]}')
|