diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..4d889c0 --- /dev/null +++ b/Pipfile @@ -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" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 0000000..61b3295 --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,38 @@ +{ + "_meta": { + "hash": { + "sha256": "4ea06a97d861011c36a50ddc97277d6c215877a6683f4261e381562e11eb6742" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "2.7" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "e1839a8": { + "editable": true, + "path": "." + }, + "iso8601": { + "hashes": [ + "sha256:13858f8bfa913ccc0a08649598da7fe9d43197e546dd71f0aa7ad57c65196368" + ], + "version": "==0.1.8" + }, + "requests": { + "hashes": [ + "sha256:8cfddb97667c2a9edaf28b506d2479f1b8dc0631cbdcd0ea8c8864def59c698b", + "sha256:f4ebc402e0ea5a87a3d42e300b76c292612d8467024f45f9858a8768f9fb6f6e" + ], + "version": "==2.0.1" + } + }, + "develop": {} +} diff --git a/toggl/api.py b/toggl/api.py index 9312f39..19a0e0a 100644 --- a/toggl/api.py +++ b/toggl/api.py @@ -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) diff --git a/toggl/base.py b/toggl/base.py index 4e49ef1..4e1527a 100644 --- a/toggl/base.py +++ b/toggl/base.py @@ -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) @@ -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] @@ -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 diff --git a/toggl/project.py b/toggl/project.py index 61935ae..1c552af 100644 --- a/toggl/project.py +++ b/toggl/project.py @@ -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.""" diff --git a/toggl/session.py b/toggl/session.py index 12d8702..5c0afcd 100644 --- a/toggl/session.py +++ b/toggl/session.py @@ -1,5 +1,5 @@ import requests -from urllib import urlencode +from urllib.parse import urlencode import logging import json @@ -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)) diff --git a/toggl/time_entries.py b/toggl/time_entries.py new file mode 100644 index 0000000..3ee0ec1 --- /dev/null +++ b/toggl/time_entries.py @@ -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