Skip to content

Commit 32bbccf

Browse files
authored
Merge branch 'atlassian-api:master' into master
2 parents c41e576 + 16f762f commit 32bbccf

File tree

6 files changed

+88
-38
lines changed

6 files changed

+88
-38
lines changed

atlassian/VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4.0.3
1+
4.0.4

atlassian/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
"""
2+
Atlassian Python API
3+
"""
4+
15
from .bamboo import Bamboo
26
from .bitbucket import Bitbucket
37
from .bitbucket import Bitbucket as Stash

atlassian/bitbucket/cloud/__init__.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
# coding=utf-8
22

33
from .base import BitbucketCloudBase
4-
from .workspaces import Workspaces
54
from .repositories import Repositories
6-
5+
from .workspaces import Workspaces
76

87
class Cloud(BitbucketCloudBase):
98
def __init__(self, url="https://api.bitbucket.org/", *args, **kwargs):

atlassian/bitbucket/cloud/base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
# coding=utf-8
22

33
import logging
4-
from ..base import BitbucketBase
5-
64
from requests import HTTPError
75

6+
from ..base import BitbucketBase
7+
88
log = logging.getLogger(__name__)
99

1010

atlassian/jira.py

Lines changed: 77 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4993,6 +4993,19 @@ def tempo_teams_get_memberships_for_member(self, username: str) -> T_resp_json:
49934993
# Resource: https://docs.atlassian.com/jira-software/REST/7.3.1/
49944994
#######################################################################
49954995
# /rest/agile/1.0/backlog/issue
4996+
def get_agile_resource_url(self, resource: str, legacy_api: bool = False) -> str:
4997+
"""
4998+
Prepare an 'Agile' API-specific URL relying on defaults set for the client.
4999+
5000+
:param resource: Name of an endpoint
5001+
:param legacy_api: If True - use 'greenhopper' as an API type, else - use a newer, 'agile', name.
5002+
:return: String with a full URL path to resource
5003+
"""
5004+
api_version = "1.0"
5005+
api_type = "greenhopper" if legacy_api else "agile"
5006+
api_root = self.api_root.replace("rest/api", f"rest/{api_type}")
5007+
return self.resource_url(resource=resource, api_root=api_root, api_version=api_version)
5008+
49965009
def move_issues_to_backlog(self, issue_keys: list) -> T_resp_json:
49975010
"""
49985011
Move issues to backlog
@@ -5012,7 +5025,8 @@ def add_issues_to_backlog(self, issues: list) -> T_resp_json:
50125025
"""
50135026
if not isinstance(issues, list):
50145027
raise ValueError("`issues` param should be List of Issue Keys")
5015-
url = "/rest/agile/1.0/backlog/issue"
5028+
resource = "backlog/issue"
5029+
url = self.get_agile_resource_url(resource)
50165030
data = dict(issues=issues)
50175031
return self.post(url, data=data)
50185032

@@ -5021,7 +5035,8 @@ def get_agile_board_by_filter_id(self, filter_id: T_id) -> T_resp_json:
50215035
Gets an agile board by the filter id
50225036
:param filter_id: int, str
50235037
"""
5024-
url = f"rest/agile/1.0/board/filter/{filter_id}"
5038+
resource = f"board/filter/{filter_id}"
5039+
url = self.get_agile_resource_url(resource)
50255040
return self.get(url)
50265041

50275042
# /rest/agile/1.0/board
@@ -5033,10 +5048,11 @@ def create_agile_board(self, name: str, type: str, filter_id: T_id, location: Op
50335048
:param filter_id: int
50345049
:param location: dict, Optional. Only specify this for Jira Cloud!
50355050
"""
5051+
resource = "board"
5052+
url = self.get_agile_resource_url(resource)
50365053
data: dict = {"name": name, "type": type, "filterId": filter_id}
50375054
if location:
50385055
data["location"] = location
5039-
url = "rest/agile/1.0/board"
50405056
return self.post(url, data=data)
50415057

50425058
def get_all_agile_boards(
@@ -5056,7 +5072,8 @@ def get_all_agile_boards(
50565072
:param limit:
50575073
:return:
50585074
"""
5059-
url = "rest/agile/1.0/board"
5075+
resource = "board"
5076+
url = self.get_agile_resource_url(resource)
50605077
params: dict = {}
50615078
if board_name:
50625079
params["name"] = board_name
@@ -5077,7 +5094,8 @@ def delete_agile_board(self, board_id: T_id) -> T_resp_json:
50775094
:param board_id:
50785095
:return:
50795096
"""
5080-
url = f"rest/agile/1.0/board/{str(board_id)}"
5097+
resource = f"board/{board_id}"
5098+
url = self.get_agile_resource_url(resource)
50815099
return self.delete(url)
50825100

50835101
def get_agile_board(self, board_id: T_id) -> T_resp_json:
@@ -5086,7 +5104,8 @@ def get_agile_board(self, board_id: T_id) -> T_resp_json:
50865104
:param board_id:
50875105
:return:
50885106
"""
5089-
url = f"rest/agile/1.0/board/{str(board_id)}"
5107+
resource = f"board/{board_id}"
5108+
url = self.get_agile_resource_url(resource)
50905109
return self.get(url)
50915110

50925111
def get_issues_for_backlog(self, board_id: T_id) -> T_resp_json:
@@ -5099,7 +5118,8 @@ def get_issues_for_backlog(self, board_id: T_id) -> T_resp_json:
50995118
By default, the returned issues are ordered by rank.
51005119
:param board_id: int, str
51015120
"""
5102-
url = f"rest/agile/1.0/board/{board_id}/backlog"
5121+
resource = f"board/{board_id}/backlog"
5122+
url = self.get_agile_resource_url(resource)
51035123
return self.get(url)
51045124

51055125
def get_agile_board_configuration(self, board_id: T_id) -> T_resp_json:
@@ -5126,7 +5146,8 @@ def get_agile_board_configuration(self, board_id: T_id) -> T_resp_json:
51265146
:param board_id:
51275147
:return:
51285148
"""
5129-
url = f"rest/agile/1.0/board/{str(board_id)}/configuration"
5149+
resource = f"board/{board_id}/configuration"
5150+
url = self.get_agile_resource_url(resource)
51305151
return self.get(url)
51315152

51325153
def get_issues_for_board(
@@ -5153,6 +5174,8 @@ def get_issues_for_board(
51535174
:param expand: OPTIONAL: expand the search result
51545175
:return:
51555176
"""
5177+
resource = f"board/{board_id}/issue"
5178+
url = self.get_agile_resource_url(resource)
51565179
params: dict = {}
51575180
if start is not None:
51585181
params["startAt"] = int(start)
@@ -5167,7 +5190,6 @@ def get_issues_for_board(
51675190
if expand is not None:
51685191
params["expand"] = expand
51695192

5170-
url = f"rest/agile/1.0/board/{board_id}/issue"
51715193
return self.get(url, params=params)
51725194

51735195
# /rest/agile/1.0/board/{boardId}/epic
@@ -5190,7 +5212,8 @@ def get_epics(
51905212
See the 'Pagination' section at the top of this page for more details.
51915213
:return:
51925214
"""
5193-
url = f"rest/agile/1.0/board/{board_id}/epic"
5215+
resource = f"board/{board_id}/epic"
5216+
url = self.get_agile_resource_url(resource)
51945217
params: dict = {}
51955218
if done:
51965219
params["done"] = done
@@ -5236,7 +5259,8 @@ def get_issues_for_epic(
52365259
If you exceed this limit, your results will be truncated.
52375260
:return:
52385261
"""
5239-
url = f"/rest/agile/1.0/board/{board_id}/epic/{epic_id}/issue"
5262+
resource = f"board/{board_id}/epic/{epic_id}/issue"
5263+
url = self.get_agile_resource_url(resource)
52405264
params: dict = {}
52415265
if jql:
52425266
params["jql"] = jql
@@ -5285,7 +5309,8 @@ def get_issues_without_epic(
52855309
If you exceed this limit, your results will be truncated.
52865310
:return:
52875311
"""
5288-
url = f"/rest/agile/1.0/board/{board_id}/epic/none/issue"
5312+
resource = f"board/{board_id}/epic/none/issue"
5313+
url = self.get_agile_resource_url(resource)
52895314
params: dict = {}
52905315
if jql:
52915316
params["jql"] = jql
@@ -5321,7 +5346,8 @@ def get_all_projects_associated_with_board(self, board_id: T_id, start: int = 0,
53215346
See the 'Pagination' section at the top of this page for more details
53225347
:return:
53235348
"""
5324-
url = f"/rest/agile/1.0/board/{board_id}/project"
5349+
resource = f"board/{board_id}/project"
5350+
url = self.get_agile_resource_url(resource)
53255351
params: dict = {}
53265352
if start:
53275353
params["startAt"] = start
@@ -5336,7 +5362,8 @@ def get_agile_board_properties(self, board_id: T_id) -> T_resp_json:
53365362
The user who retrieves the property keys is required to have permissions to view the board.
53375363
:param board_id: int, str
53385364
"""
5339-
url = f"rest/agile/1.0/board/{board_id}/properties"
5365+
resource = f"board/{board_id}/properties"
5366+
url = self.get_agile_resource_url(resource)
53405367
return self.get(url)
53415368

53425369
def set_agile_board_property(self, board_id: T_id, property_key: str) -> T_resp_json:
@@ -5349,7 +5376,8 @@ def set_agile_board_property(self, board_id: T_id, property_key: str) -> T_resp_
53495376
:param property_key:
53505377
:return:
53515378
"""
5352-
url = f"/rest/agile/1.0/board/{board_id}/properties/{property_key}"
5379+
resource = f"board/{board_id}/properties/{property_key}"
5380+
url = self.get_agile_resource_url(resource)
53535381
return self.put(url)
53545382

53555383
def get_agile_board_property(self, board_id: T_id, property_key: str) -> T_resp_json:
@@ -5360,7 +5388,8 @@ def get_agile_board_property(self, board_id: T_id, property_key: str) -> T_resp_
53605388
:param property_key:
53615389
:return:
53625390
"""
5363-
url = f"/rest/agile/1.0/board/{board_id}/properties/{property_key}"
5391+
resource = f"board/{board_id}/properties/{property_key}"
5392+
url = self.get_agile_resource_url(resource)
53645393
return self.get(url)
53655394

53665395
def delete_agile_board_property(self, board_id: T_id, property_key: str) -> T_resp_json:
@@ -5371,7 +5400,8 @@ def delete_agile_board_property(self, board_id: T_id, property_key: str) -> T_re
53715400
:param property_key:
53725401
:return:
53735402
"""
5374-
url = f"/rest/agile/1.0/board/{board_id}/properties/{property_key}"
5403+
resource = f"board/{board_id}/properties/{property_key}"
5404+
url = self.get_agile_resource_url(resource)
53755405
return self.delete(url)
53765406

53775407
# /rest/agile/1.0/board/{boardId}/settings/refined-velocity
@@ -5381,7 +5411,8 @@ def get_agile_board_refined_velocity(self, board_id: T_id) -> T_resp_json:
53815411
:param board_id:
53825412
:return:
53835413
"""
5384-
url = f"/rest/agile/1.0/board/{board_id}/settings/refined-velocity"
5414+
resource = f"board/{board_id}/settings/refined-velocity"
5415+
url = self.get_agile_resource_url(resource)
53855416
return self.get(url)
53865417

53875418
def set_agile_board_refined_velocity(self, board_id: T_id, data: dict) -> T_resp_json:
@@ -5391,7 +5422,8 @@ def set_agile_board_refined_velocity(self, board_id: T_id, data: dict) -> T_resp
53915422
:param data:
53925423
:return:
53935424
"""
5394-
url = f"/rest/agile/1.0/board/{board_id}/settings/refined-velocity"
5425+
resource = f"board/{board_id}/settings/refined-velocity"
5426+
url = self.get_agile_resource_url(resource)
53955427
return self.put(url, data=data)
53965428

53975429
# /rest/agile/1.0/board/{boardId}/sprint
@@ -5414,14 +5446,15 @@ def get_all_sprints_from_board(
54145446
See the 'Pagination' section at the top of this page for more details.
54155447
:return:
54165448
"""
5449+
resource = f"board/{board_id}/sprint"
5450+
url = self.get_agile_resource_url(resource)
54175451
params: dict = {}
54185452
if start:
54195453
params["startAt"] = start
54205454
if limit:
54215455
params["maxResults"] = limit
54225456
if state:
54235457
params["state"] = state
5424-
url = f"rest/agile/1.0/board/{board_id}/sprint"
54255458
return self.get(url, params=params)
54265459

54275460
@deprecated(version="3.42.0", reason="Use get_all_sprints_from_board instead")
@@ -5472,7 +5505,8 @@ def get_all_issues_for_sprint_in_board(
54725505
'jira.search.views.default.max' in your JIRA instance.
54735506
If you exceed this limit, your results will be truncated.
54745507
"""
5475-
url = f"/rest/agile/1.0/board/{board_id}/sprint/{sprint_id}/issue"
5508+
resource = f"board/{board_id}/sprint/{sprint_id}/issue"
5509+
url = self.get_agile_resource_url(resource)
54765510
params: dict = {}
54775511
if jql:
54785512
params["jql"] = jql
@@ -5510,14 +5544,15 @@ def get_all_versions_from_board(
55105544
See the 'Pagination' section at the top of this page for more details.
55115545
:return:
55125546
"""
5547+
resource = f"board/{board_id}/version"
5548+
url = self.get_agile_resource_url(resource)
55135549
params: dict = {}
55145550
if released:
55155551
params["released"] = released
55165552
if start:
55175553
params["startAt"] = start
55185554
if limit:
55195555
params["maxResults"] = limit
5520-
url = f"rest/agile/1.0/board/{board_id}/version"
55215556
return self.get(url, params=params)
55225557

55235558
def create_sprint(
@@ -5544,7 +5579,8 @@ def create_sprint(
55445579
https://docs.atlassian.com/jira-software/REST/8.9.0/#agile/1.0/sprint
55455580
isoformat can be created with datetime.datetime.isoformat()
55465581
"""
5547-
url = "/rest/agile/1.0/sprint"
5582+
resource = "sprint"
5583+
url = self.get_agile_resource_url(resource)
55485584
data = dict(name=name, originBoardId=board_id)
55495585
if start_date:
55505586
data["startDate"] = start_date
@@ -5580,7 +5616,8 @@ def get_sprint(self, sprint_id: T_id) -> T_resp_json:
55805616
:param sprint_id:
55815617
:return:
55825618
"""
5583-
url = f"rest/agile/1.0/sprint/{sprint_id}"
5619+
resource = f"sprint/{sprint_id}"
5620+
url = self.get_agile_resource_url(resource)
55845621
return self.get(url)
55855622

55865623
def rename_sprint(self, sprint_id: T_id, name: str, start_date: str, end_date: str) -> T_resp_json:
@@ -5592,8 +5629,10 @@ def rename_sprint(self, sprint_id: T_id, name: str, start_date: str, end_date: s
55925629
:param end_date:
55935630
:return:
55945631
"""
5632+
resource = f"sprint/{sprint_id}"
5633+
url = self.get_agile_resource_url(resource, legacy_api=True)
55955634
return self.put(
5596-
f"rest/greenhopper/1.0/sprint/{sprint_id}",
5635+
url,
55975636
data={"name": name, "startDate": start_date, "endDate": end_date},
55985637
)
55995638

@@ -5605,7 +5644,9 @@ def delete_sprint(self, sprint_id: T_id) -> T_resp_json:
56055644
:param sprint_id:
56065645
:return:
56075646
"""
5608-
return self.delete(f"rest/agile/1.0/sprint/{sprint_id}")
5647+
resource = f"sprint/{sprint_id}"
5648+
url = self.get_agile_resource_url(resource)
5649+
return self.delete(url)
56095650

56105651
def update_partially_sprint(self, sprint_id: T_id, data: dict) -> T_resp_json:
56115652
"""
@@ -5625,7 +5666,9 @@ def update_partially_sprint(self, sprint_id: T_id, data: dict) -> T_resp_json:
56255666
:param data: { "name": "new name"}
56265667
:return:
56275668
"""
5628-
return self.post(f"rest/agile/1.0/sprint/{sprint_id}", data=data)
5669+
resource = f"sprint/{sprint_id}"
5670+
url = self.get_agile_resource_url(resource)
5671+
return self.post(url, data=data)
56295672

56305673
def get_sprint_issues(self, sprint_id: T_id, start: T_id, limit: T_id) -> T_resp_json:
56315674
"""
@@ -5644,12 +5687,13 @@ def get_sprint_issues(self, sprint_id: T_id, start: T_id, limit: T_id) -> T_resp
56445687
If you exceed this limit, your results will be truncated.
56455688
:return:
56465689
"""
5690+
resource = f"sprint/{sprint_id}/issue"
5691+
url = self.get_agile_resource_url(resource)
56475692
params: dict = {}
56485693
if start:
56495694
params["startAt"] = start
56505695
if limit:
56515696
params["maxResults"] = limit
5652-
url = f"rest/agile/1.0/sprint/{sprint_id}/issue"
56535697
return self.get(url, params=params)
56545698

56555699
def update_rank(self, issues_to_rank: list, rank_before: str, customfield_number: T_id) -> T_resp_json:
@@ -5660,9 +5704,11 @@ def update_rank(self, issues_to_rank: list, rank_before: str, customfield_number
56605704
:param customfield_number: The number of the custom field Rank
56615705
:return:
56625706
"""
5707+
resource = "issue/rank"
5708+
url = self.get_agile_resource_url(resource)
56635709

56645710
return self.put(
5665-
"rest/agile/1.0/issue/rank",
5711+
url,
56665712
data={
56675713
"issues": issues_to_rank,
56685714
"rankBeforeIssue": rank_before,
@@ -5698,7 +5744,8 @@ def flag_issue(self, issue_keys: List[T_id], flag: bool = True) -> T_resp_json:
56985744
:return: POST request response.
56995745
:rtype: dict
57005746
"""
5701-
url = "rest/greenhopper/1.0/xboard/issue/flag/flag.json"
5747+
resource = "xboard/issue/flag/flag.json"
5748+
url = self.get_agile_resource_url(resource, legacy_api=True)
57025749
data = {"issueKeys": issue_keys, "flag": flag}
57035750
return self.post(url, data)
57045751

0 commit comments

Comments
 (0)