Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow setting remote related WI relations #1239

Merged
merged 3 commits into from
Dec 28, 2021
Merged
Show file tree
Hide file tree
Changes from 2 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
2 changes: 2 additions & 0 deletions azure-devops/azext_devops/dev/boards/arguments.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ def load_work_arguments(self, _):
context.argument('relation_type', help='Relation type to create. Example: parent, child ')
context.argument('target_id', help='ID(s) of work-items to create relation with. \
Multiple values can be passed comma separated. Example: 1,2 ')
context.argument('target_url', help='URL(s) of work-items to create relation with. \
Multiple values can be passed comma separated.')

with self.argument_context('boards work-item relation remove') as context:
context.argument('relation_type', help='Relation type to remove. Example: parent, child ')
Expand Down
43 changes: 27 additions & 16 deletions azure-devops/azext_devops/dev/boards/relations.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,36 +21,47 @@ def get_relation_types_show(organization=None, detect=None):
return client.get_relation_types()


def add_relation(id, relation_type, target_id, organization=None, detect=None): # pylint: disable=redefined-builtin
def add_relation(id, relation_type, target_id=None, target_url=None, organization=None, detect=None): # pylint: disable=redefined-builtin
""" Add relation(s) to work item.
"""

if target_id is None and target_url is None:
raise CLIError('--target-id or --target-url shall be provided')
roshan-sy marked this conversation as resolved.
Show resolved Hide resolved

organization = resolve_instance(detect=detect, organization=organization)
patch_document = []
client = get_work_item_tracking_client(organization)

relation_types_from_service = client.get_relation_types()
relation_type_system_name = get_system_relation_name(relation_types_from_service, relation_type)

target_work_item_ids = target_id.split(',')
work_item_query_clause = []
for target_work_item_id in target_work_item_ids:
work_item_query_clause.append('[System.Id] = {}'.format(target_work_item_id))
patch_document = []
if target_id is not None:
target_work_item_ids = target_id.split(',')
work_item_query_clause = []
for target_work_item_id in target_work_item_ids:
work_item_query_clause.append('[System.Id] = {}'.format(target_work_item_id))

wiql_query_format = 'SELECT [System.Id] FROM WorkItems WHERE ({})'
wiql_query_to_get_target_work_items = wiql_query_format.format(' OR '.join(work_item_query_clause))
wiql_query_format = 'SELECT [System.Id] FROM WorkItems WHERE ({})'
wiql_query_to_get_target_work_items = wiql_query_format.format(' OR '.join(work_item_query_clause))

wiql_object = Wiql()
wiql_object.query = wiql_query_to_get_target_work_items
target_work_items = client.query_by_wiql(wiql=wiql_object).work_items
wiql_object = Wiql()
wiql_object.query = wiql_query_to_get_target_work_items
target_work_items = client.query_by_wiql(wiql=wiql_object).work_items

if len(target_work_items) != len(target_work_item_ids):
raise CLIError('Id(s) supplied in --target-id is not valid')
if len(target_work_items) != len(target_work_item_ids):
raise CLIError('Id(s) supplied in --target-id is not valid')

patch_document = []
for target_work_item in target_work_items:
op = _create_patch_operation('add', '/relations/-', relation_type_system_name, target_work_item.url)
patch_document.append(op)

if target_url is not None:
target_urls = target_url.split(',')

for target_work_item in target_work_items:
op = _create_patch_operation('add', '/relations/-', relation_type_system_name, target_work_item.url)
patch_document.append(op)
for url in target_urls:
op = _create_patch_operation('add', '/relations/-', relation_type_system_name, url)
patch_document.append(op)

client.update_work_item(document=patch_document, id=id)
work_item = client.get_work_item(id, expand='All')
Expand Down