Skip to content

Commit

Permalink
Merge pull request #28 from gitRigge/add_create_worklogs
Browse files Browse the repository at this point in the history
Added worklogs operation "Create Worklog" for version 4 of the Tempo REST API.
  • Loading branch information
stanislavulrych authored Mar 11, 2024
2 parents 6ed9bd9 + a46bcf8 commit e46ac75
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 4 deletions.
17 changes: 15 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ pip install tempo-api-python-client

You need an API token for communicating with tempo REST APIs.

For v3 use
### For v3 use

from tempoapiclient import client_v3

Expand All @@ -38,14 +38,16 @@ For v3 use
for i in worklogs:
print(i)

For v4 use
### For v4 use

from tempoapiclient import client_v4

tempo = client_v4.Tempo(
auth_token="<your_tempo_api_key>",
)

#### Retrieve Worklogs

worklogs = tempo.get_worklogs(
dateFrom="2019-11-10",
dateTo="2019-11-11"
Expand All @@ -55,6 +57,17 @@ For v4 use
print(i)


#### Create Worklog

logged_worklog = tempo.create_worklog(
accountId="<your_jira_account_id>",
issueId=12345,
dateFrom="2019-11-11",
timeSpentSeconds=3600,
description="Something",
startTime="17:00:00"
)

There are also functions to retrieve `user` and `team`-specific worklogs.


Expand Down
1 change: 0 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
requests==2.31.0
six==1.16.0
74 changes: 74 additions & 0 deletions tempoapiclient/client_v4.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,38 @@ def _resolve_date(self, value):
parsed = datetime.strptime(value, r"%Y-%m-%d").date()

return parsed

def _resolve_time(self, value):
_v = self.strip_hrs(value)
_h = 0
_m = 0
_s = 0
if _v.__contains__("pm"):
_v = _v.replace("pm","")
_h = int(_v.split(":")[0])
if _h < 12:
_h = _h+12
elif _h == 12:
_h = 0
else:
_h = int(_v.split(":")[0])
if _h > 99:
_h = int(_h/100)
if _v.count(":") == 2:
_m = int(_v.split(":")[1])
_s = int(_v.split(":")[2])
elif _v.count(":") == 1:
_m = int(_v.split(":")[1])
value = "{:02d}:{:02d}:{:02d}".format(_h, _m, _s)
parsed = datetime.strptime(value, r"%H:%M:%S").time()
return parsed

def strip_hrs(self, value):
_hrs = ["am", "uhr", "hrs", "hours", "hour"]
retval = value.lower().replace(" ","").replace(".",":")
for i in _hrs:
retval = retval.replace(i, "")
return retval.strip()

def get(self, path, data=None, flags=None, params=None, headers=None, not_json_response=None, trailing=None):
path_absolute = super().url_joiner(self._base_url, path)
Expand Down Expand Up @@ -573,6 +605,46 @@ def search_worklogs(self, dateFrom, dateTo, updatedFrom=None, authorIds=None, is
url = f"/worklogs/search"

return self.post(url, params=params, data=data)

def create_worklog(self, accountId, issueId, dateFrom, timeSpentSeconds, billableSeconds=None, description=None,
remainingEstimateSeconds=None, startTime=None):
"""
Creates a new Worklog using the provided input and returns the newly created Worklog.
:param accountId:
:param issueId:
:param dateFrom:
:param timeSpentSeconds:
:param billableSeconds:
:param description:
:param remainingEstimateSeconds:
:param startTime:
"""

url = f"/worklogs"

data = {
"authorAccountId": str(accountId),
"issueId": int(issueId),
"startDate": self._resolve_date(dateFrom).isoformat(),
"timeSpentSeconds": int(timeSpentSeconds)
}

if billableSeconds:
data["billableSeconds"] = int(billableSeconds)
if description:
data["description"] = str(description)
if remainingEstimateSeconds:
data["remainingEstimateSeconds"] = int(remainingEstimateSeconds)
if startTime:
data["startTime"] = self._resolve_time(startTime).isoformat()

return self.post(url, data=data)




# Customer

def create_customer(self, key=None, name=None, data=None):
"""
Create customer
Expand Down Expand Up @@ -608,6 +680,8 @@ def update_customer(self, key=None, name=None, data=None):

return self.put(url, data=data)

# Account

def create_account(self, key=None, leadAccountId=None, name=None, status=None, categoryKey=None, contactAccountId=None, customerKey=None, externalContactName=None, isGlobal=None, data=None):
"""
Create account
Expand Down
4 changes: 3 additions & 1 deletion tempoapiclient/rest_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import requests
from requests.exceptions import HTTPError
from json import dumps
from six.moves.urllib.parse import urlencode
from urllib.parse import urlencode

log = logging.getLogger()

Expand Down Expand Up @@ -128,6 +128,8 @@ def get(self, path, data=None, flags=None, params=None, headers=None, not_json_r
return self._response_handler(response)

def post(self, path, data=None, json=None, headers=None, files=None, params=None, trailing=None):
headers = self.default_headers
headers["Authorization"] = "Bearer {}".format(self._auth_token)
response = self._request('POST', path=path, data=data, json=json, headers=headers, files=files, params=params,
trailing=trailing)
return self._response_handler(response)
Expand Down

0 comments on commit e46ac75

Please sign in to comment.