Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions Pipfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[dev-packages]

[packages]
"e1839a8" = {path = ".", editable = true}

[requires]
python_version = "2.7"
38 changes: 38 additions & 0 deletions Pipfile.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions toggl/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,11 @@ def __init__(self, api_token):
from .workspace import WorkspaceList
from .project import ProjectList
from .reports import Reports
from .time_entries import TimeEntryList

self.session = Session(self.BASE_URL, api_token)
self.clients = ClientList(self)
self.workspaces = WorkspaceList(self)
self.projects = ProjectList(self)
self.reports = Reports(api_token)
self.time_entries = TimeEntryList(self)
13 changes: 10 additions & 3 deletions toggl/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ def __init__(self, api, url=None):
self.url = url
self.api = api
self._instance_cache = {}
self.filters = {}

def list(self):
return list(self)
Expand All @@ -24,8 +25,14 @@ def __iter__(self):
if not hasattr(self, '_datalist'):
self._datalist = self.api.session.get(self.url)

for data in self._datalist:
yield self.get_instance_cls()(self.api, **data)
for data in self._datalist or []:
instance = self.get_instance_cls()(self.api, **data)
if any(self.filters):
for f in self.filters:
if f in data and data[f] == self.filters[f]:
yield instance
else:
yield instance

def get(self, object_id):
return self[object_id]
Expand Down Expand Up @@ -60,7 +67,7 @@ def __init__(self, api, **kwargs):
self._update_attrs(kwargs)

def _update_attrs(self, attrs):
for k, v in attrs.iteritems():
for k, v in iter(attrs.items()):
try:
v = iso8601.parse_date(v)
attrs[k] = v
Expand Down
6 changes: 6 additions & 0 deletions toggl/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,12 @@ def tasks(self):
from .task import TaskList
return TaskList(self.api, url='projects/%d/tasks' % self.id)

@cached_property
def time_entries(self):
from .time_entries import TimeEntryList
l = TimeEntryList(self.api, self.id)
return l


class ProjectUserList(ObjectList):
"""A collection of Project-User mappings."""
Expand Down
10 changes: 5 additions & 5 deletions toggl/session.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import requests
from urllib import urlencode
from urllib.parse import urlencode
import logging
import json

Expand All @@ -17,11 +17,11 @@ def __init__(self, base_url, api_token):

def _exec(self, method, url, *args, **kwargs):
try:
log.debug("[req]: %s?%s [data: %s]" % (self.base_url + url,
urlencode(kwargs.get('params', {})), kwargs.get('data')))
# log.debug("[req]: %s?%s [data: %s]" % (self.base_url + url,
# urlencode(kwargs.get('params', {})), kwargs.get('data')))
response = method(self.base_url + url, *args, **kwargs)
log.debug("[resp %d]: %s" % (response.status_code,
repr(response.text)))
# log.debug("[resp %d]: %s" % (response.status_code,
# repr(response.text)))
except Exception as ex:
log.debug("[err]: %s" % str(ex))
raise Error(str(ex))
Expand Down
35 changes: 35 additions & 0 deletions toggl/time_entries.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from urllib.parse import urlencode
from datetime import datetime

from .base import ObjectList, Object, cached_property

__all__ = ['TimeEntryList', 'TimeEntry']


class TimeEntryList(ObjectList):
"""A collection of Time Entries."""

def __init__(self, api, project_id = None):
super(TimeEntryList, self).__init__(api)
if project_id:
self.filters = {
"pid": project_id
}

get_instance_cls = lambda self: TimeEntry
url = 'time_entries?%s' % urlencode({"start_date": "2017-01-01T00:00:00+00:00"})


class TimeEntry(Object):
"""TimeEntry object.

API doc: https://github.com/toggl/toggl_api_docs/blob/master/chapters/time_entries.md

"""

def get_instance_url(self):
return "time_entries"

@cached_property
def name(self):
return self.description