Skip to content

Models

Abstract Classes

toggl_api.models.TogglClass dataclass

Bases: ABC

Base class for all Toggl dataclasses.

PARAMETER DESCRIPTION
id

Toggl API / Database ID (Primary Key) of the Toggl model.

TYPE: int

name

Name or description of the Toggl project.

TYPE: str

timestamp

Local timestamp of when the Toggl project was last modified.

TYPE: datetime DEFAULT: partial(now, tz=utc)()

METHOD DESCRIPTION
from_kwargs

Convert an arbitrary amount of kwargs to a model.

Source code in src/toggl_api/models/_models.py
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
@dataclass
class TogglClass(ABC):
    """Base class for all Toggl dataclasses.

    Params:
        id: Toggl API / Database ID (Primary Key) of the Toggl model.
        name: Name or description of the Toggl project.
        timestamp: Local timestamp of when the Toggl project was last modified.
    """

    __tablename__ = "base"
    id: int
    name: str
    timestamp: datetime = field(
        compare=False,
        repr=False,
        default_factory=partial(
            datetime.now,
            tz=timezone.utc,
        ),
    )

    def __post_init__(self) -> None:
        if isinstance(self.timestamp, str):
            self.timestamp = parse_iso(self.timestamp)
        elif self.timestamp is None:
            self.timestamp = datetime.now(tz=timezone.utc)

        self.timestamp = self.timestamp.replace(tzinfo=timezone.utc)

    @classmethod
    @abstractmethod
    def from_kwargs(cls, **kwargs: Any) -> Self:
        """Convert an arbitrary amount of kwargs to a model.

        Returns:
            A newly created `TogglClass`.
        """
        return cls(
            id=kwargs["id"],
            name=kwargs["name"],
            timestamp=kwargs.get("timestamp") or datetime.now(tz=timezone.utc),
        )

    def __getitem__(self, item: str) -> Any:
        return getattr(self, item)

    def __setitem__(self, item: str, value: Any) -> None:
        setattr(self, item, value)

from_kwargs abstractmethod classmethod

from_kwargs(**kwargs: Any) -> Self

Convert an arbitrary amount of kwargs to a model.

RETURNS DESCRIPTION
Self

A newly created TogglClass.

Source code in src/toggl_api/models/_models.py
53
54
55
56
57
58
59
60
61
62
63
64
65
@classmethod
@abstractmethod
def from_kwargs(cls, **kwargs: Any) -> Self:
    """Convert an arbitrary amount of kwargs to a model.

    Returns:
        A newly created `TogglClass`.
    """
    return cls(
        id=kwargs["id"],
        name=kwargs["name"],
        timestamp=kwargs.get("timestamp") or datetime.now(tz=timezone.utc),
    )

toggl_api.models.WorkspaceChild dataclass

Bases: TogglClass

Base class for all Toggl workspace objects.

PARAMETER DESCRIPTION
id

Toggl API / Database ID (Primary Key) of the Toggl object.

TYPE: int

name

Name of the object.

TYPE: str

timestamp

Local timestamp of when the Toggl object was last modified.

TYPE: datetime DEFAULT: partial(now, tz=utc)()

workspace

The workspace id the Toggl object belongs to.

TYPE: int DEFAULT: 0

METHOD DESCRIPTION
from_kwargs

Convert an arbitrary amount of kwargs to workspace object.

ATTRIBUTE DESCRIPTION
workspace

The id of the workspace that the model belongs to.

TYPE: int

Source code in src/toggl_api/models/_models.py
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
@dataclass
class WorkspaceChild(TogglClass):
    """Base class for all Toggl workspace objects.

    Params:
        id: Toggl API / Database ID (Primary Key) of the Toggl object.
        name: Name of the object.
        timestamp: Local timestamp of when the Toggl object was last modified.
        workspace: The workspace id the Toggl object belongs to.
    """

    __tablename__ = "workspace_child"

    workspace: int = field(default=0)
    """The id of the workspace that the model belongs to."""

    def __post_init__(self) -> None:
        super().__post_init__()

    @classmethod
    def from_kwargs(cls, **kwargs: Any) -> Self:
        """Convert an arbitrary amount of kwargs to workspace object.

        Args:
            **kwargs: Arbitary values values to convert.

        Returns:
            An initialized `WorkspaceChild` object.
        """
        return cls(
            id=kwargs["id"],
            name=kwargs["name"],
            workspace=get_workspace(kwargs),
            timestamp=kwargs.get("timestamp") or datetime.now(tz=timezone.utc),
        )

workspace class-attribute instance-attribute

workspace: int = field(default=0)

The id of the workspace that the model belongs to.

from_kwargs classmethod

from_kwargs(**kwargs: Any) -> Self

Convert an arbitrary amount of kwargs to workspace object.

PARAMETER DESCRIPTION
**kwargs

Arbitary values values to convert.

TYPE: Any DEFAULT: {}

RETURNS DESCRIPTION
Self

An initialized WorkspaceChild object.

Source code in src/toggl_api/models/_models.py
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
@classmethod
def from_kwargs(cls, **kwargs: Any) -> Self:
    """Convert an arbitrary amount of kwargs to workspace object.

    Args:
        **kwargs: Arbitary values values to convert.

    Returns:
        An initialized `WorkspaceChild` object.
    """
    return cls(
        id=kwargs["id"],
        name=kwargs["name"],
        workspace=get_workspace(kwargs),
        timestamp=kwargs.get("timestamp") or datetime.now(tz=timezone.utc),
    )

Main Models

toggl_api.TogglOrganization dataclass

Bases: TogglClass

Data structure for Toggl organizations.

PARAMETER DESCRIPTION
id

Toggl API / Database ID (Primary Key) of the Toggl organization.

TYPE: int

name

Name of the Toggl organization. Max 140 characters and min 1 character.

TYPE: str

timestamp

Local timestamp of when the Toggl organization was last modified.

TYPE: datetime DEFAULT: partial(now, tz=utc)()

METHOD DESCRIPTION
validate_name

Check if a organization name is valid for the API.

from_kwargs

Convert an arbitrary amount of kwargs to an organization.

Source code in src/toggl_api/models/_models.py
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
@dataclass
class TogglOrganization(TogglClass):
    """Data structure for Toggl organizations.

    Params:
        id: Toggl API / Database ID (Primary Key) of the Toggl organization.
        name: Name of the Toggl organization. Max 140 characters and min 1 character.
        timestamp: Local timestamp of when the Toggl organization was last modified.
    """

    ___tablename__ = "organization"

    def __post_init__(self) -> None:
        self.validate_name(self.name)
        super().__post_init__()

    @classmethod
    def from_kwargs(cls, **kwargs: Any) -> Self:
        """Convert an arbitrary amount of kwargs to an organization.

        Returns:
            A new created `TogglOrganization` object.
        """
        return super().from_kwargs(**kwargs)

    @staticmethod
    def validate_name(name: str, *, max_len: int = 140) -> None:
        """Check if a organization name is valid for the API.

        Args:
            name: The name to check as a string.
            max_len: Maximum length to allow.

        Raises:
            NamingError: If the name provided is not valid.
        """
        if not name:
            msg = "The organization name need at least have one letter!"
            raise NamingError(msg)
        if max_len and len(name) > max_len:
            msg = f"Max organization name length is {max_len}!"
            raise NamingError(msg)

validate_name staticmethod

validate_name(name: str, *, max_len: int = 140) -> None

Check if a organization name is valid for the API.

PARAMETER DESCRIPTION
name

The name to check as a string.

TYPE: str

max_len

Maximum length to allow.

TYPE: int DEFAULT: 140

RAISES DESCRIPTION
NamingError

If the name provided is not valid.

Source code in src/toggl_api/models/_models.py
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
@staticmethod
def validate_name(name: str, *, max_len: int = 140) -> None:
    """Check if a organization name is valid for the API.

    Args:
        name: The name to check as a string.
        max_len: Maximum length to allow.

    Raises:
        NamingError: If the name provided is not valid.
    """
    if not name:
        msg = "The organization name need at least have one letter!"
        raise NamingError(msg)
    if max_len and len(name) > max_len:
        msg = f"Max organization name length is {max_len}!"
        raise NamingError(msg)

from_kwargs classmethod

from_kwargs(**kwargs: Any) -> Self

Convert an arbitrary amount of kwargs to an organization.

RETURNS DESCRIPTION
Self

A new created TogglOrganization object.

Source code in src/toggl_api/models/_models.py
90
91
92
93
94
95
96
97
@classmethod
def from_kwargs(cls, **kwargs: Any) -> Self:
    """Convert an arbitrary amount of kwargs to an organization.

    Returns:
        A new created `TogglOrganization` object.
    """
    return super().from_kwargs(**kwargs)

toggl_api.TogglWorkspace dataclass

Bases: TogglClass

Data structure for Toggl workspaces.

PARAMETER DESCRIPTION
id

Toggl API / Database ID (Primary Key) of the Toggl workspace.

TYPE: int

name

Name of the workspace.

TYPE: str

timestamp

Local timestamp of when the Toggl workspace was last modified.

TYPE: datetime DEFAULT: partial(now, tz=utc)()

organization

Organization id the workspace belongs to.

TYPE: int DEFAULT: 0

METHOD DESCRIPTION
validate_name

Check if a workspace name is valid for the API.

from_kwargs

Convert an arbitrary amount of kwargs to a workspace.

Source code in src/toggl_api/models/_models.py
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
@dataclass
class TogglWorkspace(TogglClass):
    """Data structure for Toggl workspaces.

    Params:
        id: Toggl API / Database ID (Primary Key) of the Toggl workspace.
        name: Name of the workspace.
        timestamp: Local timestamp of when the Toggl workspace was last modified.
        organization: Organization id the workspace belongs to.
    """

    ___tablename__ = "workspace"

    organization: int = field(default=0)

    def __post_init__(self) -> None:
        super().__post_init__()
        try:
            TogglWorkspace.validate_name(self.name)
        except NamingError as err:
            if str(err) != "No spaces allowed in the workspace name!":
                raise
            log.warning(err)
            self.name = self.name.replace(" ", "-")
            log.warning("Updated to new name: %s!", self.name)

    @classmethod
    def from_kwargs(cls, **kwargs: Any) -> Self:
        """Convert an arbitrary amount of kwargs to a workspace.

        Args:
            **kwargs: Arbitary values values to convert.

        Returns:
            An initialized `TogglWorkspace` object.
        """
        return cls(
            id=kwargs["id"],
            name=kwargs["name"],
            timestamp=kwargs.get("timestamp") or datetime.now(tz=timezone.utc),
            organization=kwargs.get("organization", 0),
        )

    @staticmethod
    def validate_name(name: str, *, max_len: int = 140) -> None:
        """Check if a workspace name is valid for the API.

        Args:
            name: The name to check as a string.
            max_len: Maximum length to allow.

        Raises:
            NamingError: If the name provided is not valid.
        """
        if not name:
            msg = "The workspace name need at least have one character!"
            raise NamingError(msg)
        if max_len and len(name) > max_len:
            msg = f"The max workspace name length is {max_len}!"
            raise NamingError(msg)
        if " " in name:
            msg = "No spaces allowed in the workspace name!"
            raise NamingError(msg)

validate_name staticmethod

validate_name(name: str, *, max_len: int = 140) -> None

Check if a workspace name is valid for the API.

PARAMETER DESCRIPTION
name

The name to check as a string.

TYPE: str

max_len

Maximum length to allow.

TYPE: int DEFAULT: 140

RAISES DESCRIPTION
NamingError

If the name provided is not valid.

Source code in src/toggl_api/models/_models.py
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
@staticmethod
def validate_name(name: str, *, max_len: int = 140) -> None:
    """Check if a workspace name is valid for the API.

    Args:
        name: The name to check as a string.
        max_len: Maximum length to allow.

    Raises:
        NamingError: If the name provided is not valid.
    """
    if not name:
        msg = "The workspace name need at least have one character!"
        raise NamingError(msg)
    if max_len and len(name) > max_len:
        msg = f"The max workspace name length is {max_len}!"
        raise NamingError(msg)
    if " " in name:
        msg = "No spaces allowed in the workspace name!"
        raise NamingError(msg)

from_kwargs classmethod

from_kwargs(**kwargs: Any) -> Self

Convert an arbitrary amount of kwargs to a workspace.

PARAMETER DESCRIPTION
**kwargs

Arbitary values values to convert.

TYPE: Any DEFAULT: {}

RETURNS DESCRIPTION
Self

An initialized TogglWorkspace object.

Source code in src/toggl_api/models/_models.py
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
@classmethod
def from_kwargs(cls, **kwargs: Any) -> Self:
    """Convert an arbitrary amount of kwargs to a workspace.

    Args:
        **kwargs: Arbitary values values to convert.

    Returns:
        An initialized `TogglWorkspace` object.
    """
    return cls(
        id=kwargs["id"],
        name=kwargs["name"],
        timestamp=kwargs.get("timestamp") or datetime.now(tz=timezone.utc),
        organization=kwargs.get("organization", 0),
    )

toggl_api.TogglClient dataclass

Bases: WorkspaceChild

Data structure for Toggl clients.

PARAMETER DESCRIPTION
id

Toggl API / Database ID (Primary Key) of the Toggl client.

TYPE: int

name

Name of the client.

TYPE: str

timestamp

Local timestamp of when the Toggl client was last modified.

TYPE: datetime DEFAULT: partial(now, tz=utc)()

workspace

The workspace id the Toggl client belongs to.

TYPE: int DEFAULT: 0

METHOD DESCRIPTION
from_kwargs

Convert an arbitrary amount of kwargs to a client.

Source code in src/toggl_api/models/_models.py
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
@dataclass
class TogglClient(WorkspaceChild):
    """Data structure for Toggl clients.

    Params:
        id: Toggl API / Database ID (Primary Key) of the Toggl client.
        name: Name of the client.
        timestamp: Local timestamp of when the Toggl client was last modified.
        workspace: The workspace id the Toggl client belongs to.
    """

    __tablename__ = "client"

    def __post_init__(self) -> None:
        super().__post_init__()

    @classmethod
    def from_kwargs(cls, **kwargs: Any) -> TogglClient:
        """Convert an arbitrary amount of kwargs to a client.

        Args:
            **kwargs: Arbitary values values to convert.

        Returns:
            An initialized `TogglClient` object.
        """
        return super().from_kwargs(**kwargs)

from_kwargs classmethod

from_kwargs(**kwargs: Any) -> TogglClient

Convert an arbitrary amount of kwargs to a client.

PARAMETER DESCRIPTION
**kwargs

Arbitary values values to convert.

TYPE: Any DEFAULT: {}

RETURNS DESCRIPTION
TogglClient

An initialized TogglClient object.

Source code in src/toggl_api/models/_models.py
236
237
238
239
240
241
242
243
244
245
246
@classmethod
def from_kwargs(cls, **kwargs: Any) -> TogglClient:
    """Convert an arbitrary amount of kwargs to a client.

    Args:
        **kwargs: Arbitary values values to convert.

    Returns:
        An initialized `TogglClient` object.
    """
    return super().from_kwargs(**kwargs)

toggl_api.TogglProject dataclass

Bases: WorkspaceChild

Data structure for Toggl projects.

ATTRIBUTE DESCRIPTION
Status

An enumeration with all project statuses supported by the API.

PARAMETER DESCRIPTION
id

Toggl API / Database ID (Primary Key) of the Toggl project.

TYPE: int

name

Name of the project.

TYPE: str

timestamp

Local timestamp of when the Toggl project was last modified.

TYPE: datetime DEFAULT: partial(now, tz=utc)()

workspace

The workspace id the project belongs to.

TYPE: int DEFAULT: 0

color

Color of the project. Defaults to blue. Refer to this endpoint attribute for basic colors.

TYPE: str DEFAULT: '#0b83d9'

client

ID of the client the project belongs to. Defaults to None.

TYPE: int | None DEFAULT: None

active

Whether the project is archived or not. Defaults to True.

TYPE: bool DEFAULT: True

start_date

When the project is supposed to start. Will default to the original date.

TYPE: date DEFAULT: lambda: date()()

end_date

When the projects is supposed to end. None if there is no deadline. Optional.

TYPE: date | None DEFAULT: None

CLASS DESCRIPTION
Status
METHOD DESCRIPTION
get_status

Derive the project status from instance attributes.

from_kwargs

Convert an arbitrary amount of kwargs to a project.

Source code in src/toggl_api/models/_models.py
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
@dataclass
class TogglProject(WorkspaceChild):
    """Data structure for Toggl projects.

    Attributes:
        Status: An enumeration with all project statuses supported by the API.

    Params:
        id: Toggl API / Database ID (Primary Key) of the Toggl project.
        name: Name of the project.
        timestamp: Local timestamp of when the Toggl project was last modified.
        workspace: The workspace id the project belongs to.
        color: Color of the project. Defaults to blue. Refer to this endpoint
            [attribute][toggl_api.ProjectEndpoint.BASIC_COLORS] for basic colors.
        client: ID of the client the project belongs to. Defaults to None.
        active: Whether the project is archived or not. Defaults to True.
        start_date: When the project is supposed to start. Will default to
            the original date.
        end_date: When the projects is supposed to end. None if there is no
            deadline. Optional.
    """

    class Status(enum.Enum):
        UPCOMING = enum.auto()
        ACTIVE = enum.auto()
        ENDED = enum.auto()
        ARCHIVED = enum.auto()
        DELETED = enum.auto()

    __tablename__ = "project"

    color: str = field(default="#0b83d9")
    client: int | None = field(default=None)
    active: bool = field(default=True)

    start_date: date = field(
        default_factory=lambda: datetime.now(tz=timezone.utc).date(),
    )
    end_date: date | None = field(default=None)

    def __post_init__(self) -> None:
        super().__post_init__()
        if isinstance(self.client, TogglClient):
            self.client = self.client.id

        if isinstance(self.start_date, str):
            self.start_date = parse_iso(self.start_date).date()

        if isinstance(self.end_date, str):
            self.stop_date = parse_iso(self.end_date).date()

    @classmethod
    def from_kwargs(cls, **kwargs: Any) -> TogglProject:
        """Convert an arbitrary amount of kwargs to a project.

        Args:
            **kwargs: Arbitary values values to convert.

        Returns:
            An initialized `TogglProject` object.
        """
        return cls(
            id=kwargs["id"],
            name=kwargs["name"],
            workspace=get_workspace(kwargs),
            color=kwargs["color"],
            client=kwargs.get("client_id") or kwargs.get("client"),
            active=kwargs["active"],
            timestamp=kwargs.get("timestamp") or datetime.now(tz=timezone.utc),
            start_date=kwargs.get("start_date") or datetime.now(tz=timezone.utc).date(),
            end_date=kwargs.get("end_date"),
        )

    def get_status(self) -> TogglProject.Status:
        """Derive the project status from instance attributes.

        Returns:
            A status enumeration based on the project attributes.
        """
        if not self.active:
            return TogglProject.Status.ARCHIVED
        now = datetime.now(timezone.utc)
        if now < self.start_date:
            return TogglProject.Status.UPCOMING
        if self.end_date and now >= self.end_date:
            return TogglProject.Status.ENDED
        return TogglProject.Status.ACTIVE

Status

Bases: Enum

Source code in src/toggl_api/models/_models.py
271
272
273
274
275
276
class Status(enum.Enum):
    UPCOMING = enum.auto()
    ACTIVE = enum.auto()
    ENDED = enum.auto()
    ARCHIVED = enum.auto()
    DELETED = enum.auto()

get_status

get_status() -> Status

Derive the project status from instance attributes.

RETURNS DESCRIPTION
Status

A status enumeration based on the project attributes.

Source code in src/toggl_api/models/_models.py
322
323
324
325
326
327
328
329
330
331
332
333
334
335
def get_status(self) -> TogglProject.Status:
    """Derive the project status from instance attributes.

    Returns:
        A status enumeration based on the project attributes.
    """
    if not self.active:
        return TogglProject.Status.ARCHIVED
    now = datetime.now(timezone.utc)
    if now < self.start_date:
        return TogglProject.Status.UPCOMING
    if self.end_date and now >= self.end_date:
        return TogglProject.Status.ENDED
    return TogglProject.Status.ACTIVE

from_kwargs classmethod

from_kwargs(**kwargs: Any) -> TogglProject

Convert an arbitrary amount of kwargs to a project.

PARAMETER DESCRIPTION
**kwargs

Arbitary values values to convert.

TYPE: Any DEFAULT: {}

RETURNS DESCRIPTION
TogglProject

An initialized TogglProject object.

Source code in src/toggl_api/models/_models.py
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
@classmethod
def from_kwargs(cls, **kwargs: Any) -> TogglProject:
    """Convert an arbitrary amount of kwargs to a project.

    Args:
        **kwargs: Arbitary values values to convert.

    Returns:
        An initialized `TogglProject` object.
    """
    return cls(
        id=kwargs["id"],
        name=kwargs["name"],
        workspace=get_workspace(kwargs),
        color=kwargs["color"],
        client=kwargs.get("client_id") or kwargs.get("client"),
        active=kwargs["active"],
        timestamp=kwargs.get("timestamp") or datetime.now(tz=timezone.utc),
        start_date=kwargs.get("start_date") or datetime.now(tz=timezone.utc).date(),
        end_date=kwargs.get("end_date"),
    )

toggl_api.TogglTracker dataclass

Bases: WorkspaceChild

Data structure for trackers.

PARAMETER DESCRIPTION
id

Toggl API / Database ID (Primary Key) of the Toggl tracker.

TYPE: int

name

Description of the tracker. Refers to tracker description inside the Toggl API.

TYPE: str

timestamp

Local timestamp of when the Toggl tracker was last modified.

TYPE: datetime DEFAULT: partial(now, tz=utc)()

workspace

The workspace id the tracker belongs to.

TYPE: int DEFAULT: 0

start

Start time of the tracker. Defaults to time created if nothing is passed.

TYPE: datetime DEFAULT: partial(now, tz=utc)()

duration

Duration of the tracker

TYPE: timedelta | None DEFAULT: None

stop

Stop time of the tracker.

TYPE: datetime | str | None DEFAULT: None

project

Id of the project the tracker is assigned to.

TYPE: int | None DEFAULT: None

tags

List of tags.

TYPE: list[TogglTag] DEFAULT: list()

METHOD DESCRIPTION
running

Whether the tracker is running.

Source code in src/toggl_api/models/_models.py
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
@dataclass
class TogglTracker(WorkspaceChild):
    """Data structure for trackers.

    Params:
        id: Toggl API / Database ID (Primary Key) of the Toggl tracker.
        name: Description of the tracker. Refers to tracker **description**
            inside the Toggl API.
        timestamp: Local timestamp of when the Toggl tracker was last modified.
        workspace: The workspace id the tracker belongs to.
        start: Start time of the tracker. Defaults to time created if nothing
            is passed.
        duration: Duration of the tracker
        stop: Stop time of the tracker.
        project: Id of the project the tracker is assigned to.
        tags: List of tags.

    Methods:
        running: Whether the tracker is running.
    """

    __tablename__ = "tracker"

    start: datetime = field(
        default_factory=partial(
            datetime.now,
            tz=timezone.utc,
        ),
    )
    duration: timedelta | None = field(default=None)
    stop: datetime | str | None = field(default=None)
    project: int | None = field(default=None)
    tags: list[TogglTag] = field(default_factory=list)

    def __post_init__(self) -> None:
        super().__post_init__()
        if isinstance(self.project, TogglProject):
            self.project = self.project.id
        if isinstance(self.start, str | datetime):
            self.start = parse_iso(self.start)  # type: ignore[assignment]
        if isinstance(self.duration, float | int):
            self.duration = timedelta(seconds=self.duration)

        if self.stop:
            self.stop = parse_iso(self.stop)  # type: ignore[assignment]
        else:
            now = datetime.now(tz=timezone.utc)
            self.duration = now - self.start

        if isinstance(self.stop, str | datetime):
            self.stop = parse_iso(self.stop)  # type: ignore[assignment]

    def running(self) -> bool:
        """Is the tracker running.

        Returns:
            True if the tracker is running.
        """
        return self.stop is None

    @classmethod
    def from_kwargs(cls, **kwargs: Any) -> Self:
        """Convert an arbitrary amount of kwargs to a tracker.

        Args:
            **kwargs: Arbitary values values to convert.

        Returns:
            An initialized `TogglTracker` object.
        """
        start = kwargs.get("start")
        if start is None:
            start = datetime.now(tz=timezone.utc)
            log.info(
                "No start time provided. Using current time as start time: %s",
                start,
            )

        return cls(
            id=kwargs["id"],
            name=kwargs.get("description", kwargs.get("name", "")),
            workspace=get_workspace(kwargs),
            start=start,
            duration=kwargs.get("duration"),
            stop=kwargs.get("stop"),
            project=kwargs.get("project_id", kwargs.get("project")),
            tags=TogglTracker.get_tags(**kwargs),
            timestamp=kwargs.get("timestamp", datetime.now(tz=timezone.utc)),
        )

    @staticmethod
    def get_tags(**kwargs: Any) -> list[TogglTag]:
        tag_id = kwargs.get("tag_ids")
        tag = kwargs.get("tags")
        tags = []
        if tag and isinstance(tag[0], dict):
            for t in tag:
                tags.append(TogglTag.from_kwargs(**t))  # noqa: PERF401
        elif tag_id and tag:
            workspace = get_workspace(kwargs)
            for i, t in zip(tag_id, tag, strict=True):
                tags.append(TogglTag(id=i, name=t, workspace=workspace))
        else:
            tags = tag or tags

        return tags

    @property
    def description(self) -> str:
        """Alias for the name of the tracker.

        Returns:
            Description of the tracker.
        """
        return self.name

    @property
    def running_duration(self) -> timedelta:
        """Duration that gets calculated even if the tracker is running."""
        return self.duration or (datetime.now(tz=timezone.utc) - self.start)

running

running() -> bool

Is the tracker running.

RETURNS DESCRIPTION
bool

True if the tracker is running.

Source code in src/toggl_api/models/_models.py
390
391
392
393
394
395
396
def running(self) -> bool:
    """Is the tracker running.

    Returns:
        True if the tracker is running.
    """
    return self.stop is None

from_kwargs classmethod

from_kwargs(**kwargs: Any) -> Self

Convert an arbitrary amount of kwargs to a tracker.

PARAMETER DESCRIPTION
**kwargs

Arbitary values values to convert.

TYPE: Any DEFAULT: {}

RETURNS DESCRIPTION
Self

An initialized TogglTracker object.

Source code in src/toggl_api/models/_models.py
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
@classmethod
def from_kwargs(cls, **kwargs: Any) -> Self:
    """Convert an arbitrary amount of kwargs to a tracker.

    Args:
        **kwargs: Arbitary values values to convert.

    Returns:
        An initialized `TogglTracker` object.
    """
    start = kwargs.get("start")
    if start is None:
        start = datetime.now(tz=timezone.utc)
        log.info(
            "No start time provided. Using current time as start time: %s",
            start,
        )

    return cls(
        id=kwargs["id"],
        name=kwargs.get("description", kwargs.get("name", "")),
        workspace=get_workspace(kwargs),
        start=start,
        duration=kwargs.get("duration"),
        stop=kwargs.get("stop"),
        project=kwargs.get("project_id", kwargs.get("project")),
        tags=TogglTracker.get_tags(**kwargs),
        timestamp=kwargs.get("timestamp", datetime.now(tz=timezone.utc)),
    )

toggl_api.TogglTag dataclass

Bases: WorkspaceChild

Data structure for Toggl tags.

PARAMETER DESCRIPTION
id

Toggl API / Database ID (Primary Key) of the Toggl tag.

TYPE: int

name

Name of the tag.

TYPE: str

timestamp

Local timestamp of when the Toggl tag was last modified.

TYPE: datetime DEFAULT: partial(now, tz=utc)()

workspace

The workspace id the tag belongs to.

TYPE: int DEFAULT: 0

METHOD DESCRIPTION
from_kwargs

Convert an arbitrary amount of kwargs to a tag.

Source code in src/toggl_api/models/_models.py
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
@dataclass
class TogglTag(WorkspaceChild):
    """Data structure for Toggl tags.

    Params:
        id: Toggl API / Database ID (Primary Key) of the Toggl tag.
        name: Name of the tag.
        timestamp: Local timestamp of when the Toggl tag was last modified.
        workspace: The workspace id the tag belongs to.
    """

    __tablename__ = "tag"

    def __post_init__(self) -> None:
        super().__post_init__()

    @classmethod
    def from_kwargs(cls, **kwargs: Any) -> TogglTag:
        """Convert an arbitrary amount of kwargs to a tag.

        Args:
            **kwargs: Arbitary values values to convert.

        Returns:
            An initialized `TogglTag` object.
        """
        return super().from_kwargs(**kwargs)

from_kwargs classmethod

from_kwargs(**kwargs: Any) -> TogglTag

Convert an arbitrary amount of kwargs to a tag.

PARAMETER DESCRIPTION
**kwargs

Arbitary values values to convert.

TYPE: Any DEFAULT: {}

RETURNS DESCRIPTION
TogglTag

An initialized TogglTag object.

Source code in src/toggl_api/models/_models.py
476
477
478
479
480
481
482
483
484
485
486
@classmethod
def from_kwargs(cls, **kwargs: Any) -> TogglTag:
    """Convert an arbitrary amount of kwargs to a tag.

    Args:
        **kwargs: Arbitary values values to convert.

    Returns:
        An initialized `TogglTag` object.
    """
    return super().from_kwargs(**kwargs)

toggl_api.models.as_dict_custom

as_dict_custom(obj: TogglClass) -> dict[str, Any]

Convert a TogglClass` to a dictionary.

PARAMETER DESCRIPTION
obj

A ToggClass instance.

TYPE: TogglClass

RETURNS DESCRIPTION
dict[str, Any]

TogglClass converted to a dictionary.

Source code in src/toggl_api/models/__init__.py
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
def as_dict_custom(obj: TogglClass) -> dict[str, Any]:
    """Convert a TogglClass` to a dictionary.

    Args:
        obj: A `ToggClass` instance.

    Returns:
        `TogglClass` converted to a dictionary.
    """
    data: dict[str, Any] = {"class": obj.__tablename__}

    for field in fields(obj):
        field_data = getattr(obj, field.name)

        if isinstance(field_data, TogglClass):
            data[field.name] = as_dict_custom(field_data)
        elif isinstance(field_data, list):
            data[field.name] = [as_dict_custom(item) for item in field_data]
        else:
            data[field.name] = field_data

    return data