TogglPy
Forked: The original project was archived, this is fork partially patched for Toggl API v9. For fully patched project check out other forks.
TogglPy is a python library for interacting with the Toggl API.
Features
- Make requests against any (Toggl) API endpoint with request data as a dictionary
- Generate and save PDFs of summary, weekly, or detailed reports
- Fetch reports as JSON
- Get all workspaces or all clients
- Get a specific workspace or client, by ID or name
- Query projects, by client, or by a single name
- Add custom time entries
Setup
- Install the project with pip:
pip install -U TogglPy
- Import the content:
from toggl.TogglPy import Toggl
- Create a Toggl object:
toggl = Toggl()
- Authenticate either by Toggl credentials OR using your personal API token:
- If trying to access any of the Reports API endpoints, you need to use your personal API token
toggl.setAuthCredentials('<EMAIL>', '<PASSWORD>')
OR:
toggl.setAPIKey('<API-TOKEN>')
I learn best by examples:
Manual GET requests against any Toggl endpoint:
from toggl.TogglPy import Toggl
# create a Toggl object and set our API key
toggl = Toggl()
toggl.setAPIKey("mytogglapikey")
response = toggl.request("https://api.track.toggl.com/api/v8/clients")
# print the client name and ID for each client in the response
# list of returned values can be found in the Toggl docs:
# https://github.com/toggl/toggl_api_docs/blob/master/chapters/clients.md
for client in response:
print("Client name: %s Client ID: %s" % (client['name'], client['id']))
Or, if you want to add some data to your request:
data = {
'id': 42,
'some_key': 'some_value',
'user_agent': 'TogglPy_test',
}
response = toggl.request("https://api.track.toggl.com/api/v8/some/endpoint", parameters=data)
Making a POST request to any Toggl endpoint:
data = {
"project":
{
"name": "some project",
"wid":777,
"template_id":10237,
"is_private":true,
"cid":123397
}
}
response = toggl.postRequest("https://api.track.toggl.com/api/v8/projects", parameters=data)
Generating PDF reports:
Must authenticate with your personal API token to use these endpoints.
# specify that we want reports from this week
data = {
'workspace_id': 0000, # see the next example for getting a workspace ID
'since': '2015-04-27',
'until': '2015-05-03',
}
# download one of each type of report for this time period
toggl.getWeeklyReportPDF(data, "weekly-report.pdf")
toggl.getDetailedReportPDF(data, "detailed-report.pdf")
toggl.getSummaryReportPDF(data, "summary-report.pdf")
Finding workspaces and clients
This will print some raw data that will give you all the info you need to identify clients and workspaces quickly:
print(toggl.getWorkspaces())
print(toggl.getClients())
If you want to clean it up a little replace those print statements with
for workspace in toggl.getWorkspaces():
print("Workspace name: %s\tWorkspace ID:%s" % (workspace['name'], workspace['id']))
for client in toggl.getClients():
print("Client name: %s\tClient ID:%s" % (client['name'], client['id']))
If you want to find a specific client or workspace:
john_doe = toggl.getClient(name="John Doe")
personal = toggl.getWorkspace(name="Personal")
print("John's client ID is %s" % john_doe['id'])
print("The workspace ID for 'Personal' is %s" % personal['id'])
The reverse can also be done; use .getClient(id=0000) or .getWorkspace(id=000) to find items by ID.
Starting New Timer
# You can get your project PID in toggl.com->Projects->(select your project)
# and copying the last number of the url
myprojectpid = 10959693
toggl.startTimeEntry("my description", myprojectpid)
Stopping Current Timer
currentTimer = currentRunningTimeEntry()
stopTimeEntry(currentTimer['data']['id'])
Creating a custom time entry
# Create a custom entry for today, of a 9 hour duration, starting at 10 AM:
toggl.createTimeEntry(hourduration=9, projectname='GoogleDrive', hour=10)
# Or speed up the query process and provide the client's name:
toggl.createTimeEntry(hourduration=9, projectname='GoogleDrive', clientname='Google', hour=10)
# Provide *month* and/or *day* too for specific dates:
toggl.createTimeEntry(hourduration=9, projectname='GoogleDrive', clientname='Google', month=1, day=31, hour=10)
# Automate missing time entries!
for day in (29, 30, 31):
toggl.createTimeEntry(hourduration=9, projectname='someproject', day=day, hour=10)
Automate daily records
# toggle_entry.py
import datetime
if datetime.datetime.today().weekday() not in (4, 5):
toggl.createTimeEntry(hourduration=9, projectname='someproject', hour=10)
Add your daily records as a cron job:
(crontab -l ; echo "0 22 * * * toggl_entry.py")| crontab -
Metadata
Release files for skip-TogglPy 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| skip_togglpy-0.2.0.tar.gz | 11.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| skip_TogglPy-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 22.8 kB
Release files / skip_togglpy-0.2.0.tar.gz
| Download URL | skip_togglpy-0.2.0.tar.gz |
|---|---|
| Size | 11.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fcd11e447fc62b8328716e790062850aad318ebcdd99d024c5d8c3fb6f8524b6
|
|
BLAKE2b-256 checksum How to use checksums |
c90f6ce56be0e65b8ea0d1c12d501a7918782f44ca1c6ca82520873ff637de46
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/5.1.0 CPython/3.12.4
|
Release files / skip_TogglPy-0.2.0-py3-none-any.whl
| Download URL | skip_TogglPy-0.2.0-py3-none-any.whl |
|---|---|
| Size | 11.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d261c010c398c03d31cad13ac8b2cfef61a108cc7095f69a298bd5c2335e4fa8
|
|
BLAKE2b-256 checksum How to use checksums |
09acdb0ba9e3499277cbc8b4ce0e5b70068e40fcdaff03a8b046912c79d741c1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/5.1.0 CPython/3.12.4
|