63 lines
1.5 KiB
Python
63 lines
1.5 KiB
Python
from dataclasses import dataclass, field
|
|
from datetime import datetime
|
|
from clockify_sdk import Clockify
|
|
|
|
class NotFound(Exception):
|
|
pass
|
|
|
|
|
|
@dataclass()
|
|
class Project:
|
|
api: Clockify = field(repr=False)
|
|
id: str
|
|
name: str
|
|
workspace_id: str
|
|
|
|
@staticmethod
|
|
def list(api):
|
|
projects = api.projects.get_all()
|
|
return [
|
|
Project(api, p['id'], p['name'], p['workspaceId'])
|
|
for p in projects
|
|
]
|
|
|
|
@staticmethod
|
|
def get_by_id(api, project_id):
|
|
return api.projects.get_by_id(project_id)
|
|
|
|
|
|
def sync_projects(api, db):
|
|
"""Sync Clockify projects to local database"""
|
|
from .db import ClockifyProject
|
|
|
|
# Fetch and store all projects
|
|
projects = Project.list(api)
|
|
with db.atomic():
|
|
# Delete all existing projects
|
|
ClockifyProject.delete().execute()
|
|
|
|
query = ClockifyProject.insert_many(
|
|
[
|
|
{
|
|
"clockify_id": project.id,
|
|
"name": project.name,
|
|
"workspace_id": project.workspace_id
|
|
}
|
|
for project in projects
|
|
]
|
|
)
|
|
query.execute()
|
|
return len(projects)
|
|
|
|
|
|
def export_fact(api, project_id, start, end, description=None):
|
|
"""Export a Hamster fact to Clockify as a time entry"""
|
|
time_entry = api.time_entries.create(
|
|
project_id=project_id,
|
|
start=start,
|
|
end=end,
|
|
description=description,
|
|
billable=True
|
|
)
|
|
return time_entry['id']
|