Skip to main content

Client for Yandex.Tracker

Project description

yandex_tracker_client

yandex_tracker_client provides python interface to Yandex Tracker v2 API <https://tech.yandex.com/connect/tracker/>_.

Installation

yandex_tracker_client could be installed by pip:

.. code:: bash

pip install yandex_tracker_client

Configuring

The Yandex Tracker API uses the OAuth 2.0 protocol for application authorization. Applications use the OAuth 2.0 protocol to access Yandex services on behalf of a user. You can get your token here <https://tech.yandex.com/connect/tracker/api/concepts/access-docpage/>. You can also use IAM tokens for Yandex Cloud organizations. Read here <https://cloud.yandex.com/en/docs/iam/concepts/authorization/iam-token> about IAM tokens.

Usage

To use client you need to initialize client first:

.. code:: python

from yandex_tracker_client import TrackerClient

client = TrackerClient(token=, org_id=<org_id>)

For Yandex Cloud organizations you need to use cloud_org_id instead of org_id parameter. Use iam_token parameter for temporary IAM tokens.

.. code:: python from yandex_tracker_client import TrackerClient client = TrackerClient(iam_token=, cloud_org_id=<org_id>)

Getting issue:

.. code:: python

issue = client.issues['MYQUEUE-42'] print issue.deadline, issue.updatedAt

Handling 404 exceptions:

.. code:: python

from yandex_tracker_client.exceptions import NotFound

try: issue = client.issues['MYQUEUE-42'] except NotFound: pass

Creating issue: Full field list here <https://tech.yandex.com/connect/tracker/api/concepts/issues/create-issue-docpage/>_. .. code:: python

client.issues.create( queue='MYQUEUE', summary='API Test Issue', type={'name': 'Bug'}, description='test description' )

Updating issue:

.. code:: python

issue = client.issues['MYQUEUE-42'] issue.update(summary='East or west, Yandex Tracker is the best', priority='minor')

Searching for issues:

.. code:: python

issues = client.issues.find('Queue: MYQUEUE Assignee: me()') #You can copy this query from ui tracker interface print [issue.key for issue in issues]

Using the 'filter' parameter possible to pass the parameters of the filtering as a dictionary:

.. code:: python

issues = client.issues.find( filter={'queue': 'MYQUEUE', 'assignee': 'me()', 'created': {'from': '2019-03-02'}}, order=['update','-status', '+priority'], per_page=15 ) print [issue.key for issue in issues]

Obtaining list of transitions:

.. code:: python

transitions = issue.transitions.get_all() for transition in transitions: print transition

Executing transition:

.. code:: python

issue = client.issues['MYQUEUE-42'] issue.transitions['close'].execute()

Executing transition with comment and resolution:

.. code:: python

issue = client.issues['MYQUEUE-42'] transition = issue.transitions['close'] transition.execute(comment='Fixed', resolution='fixed')

Queue info:

.. code:: python

queue = client.queues['MYQUEUE']

or:

.. code:: python

queue = client.issues['MYQUEUE-42'].queue

Queue list:

.. code:: python

queues = client.queues.get_all()[:3]

List issue attachments:

.. code:: python

attachments = client.issues['MYQUEUE-42'].attachments

Downloading attachments to specified directory:

.. code:: python

[attachment.download_to('some/path') for attachments in client.get_attachments('MYQUEUE-42')]

Uploading an attachment

.. code:: python

issue = client.issues['MYQUEUE-42'] issue.attachments.create('path/to/file')

Deleting an attachment

.. code:: python

ATTACHMENTS_TO_DELETE = {'to_delete.txt', 'smth.jpeg'} issue = client.issues['MYQUEUE-42'] for attach in issue.attachments: if attach.name in ATTACHMENTS_TO_DELETE: attach.delete()

or

.. code:: python

issue.attachments[42].delete()

List issue comments:

.. code:: python

issue = client.issues['MYQUEUE-42'] comments = list(issue.comments.get_all())[:3]

Add comment:

.. code:: python

issue = client.issues['MYQUEUE-42'] comment = issue.comments.create(text='Test Comment')

Add comment with attachments:

.. code:: python

issue = client.issues['MYQUEUE-42'] comment = issue.comments.create(text='Test comment', attachments=['path/to/file1', 'path/to/file2'])

Update comment:

.. code:: python

issue = client.issues['MYQUEUE-42'] comment = issue.comments[42] comment.update(text='New Text')

Deleting a comment:

.. code:: python

issue = client.issues['MYQUEUE-42'] comment = issue.comments[42] comment.delete()

List issue links:

.. code:: python

issue = client.issues['MYQUEUE-42'] links = issue.links

Add link:

.. code:: python

issue = client.issues['MYQUEUE-42'] link = issue.links.create(issue='TEST-42', relationship='relates')

Deleting a link:

.. code:: python

issue = client.issues['MYQUEUE-42'] link = issue.links[42] link.delete()

Add remote link:

.. code:: python

issue = client.issues['MYQUEUE-42'] link = issue.remotelinks.create(origin="ru.yandex.lunapark", key="MYQUEUE-42", relationship="relates")

Advanced Usage

Bulk update:

.. code:: python

bulkchange = client.bulkchange.update( ['MYQUEUE-42', 'MYQUEUE-43', 'MYQUEUE-44'], priority='minor', tags={'add': ['minored']}) print bulkchange.status bulkchange = bulkchange.wait() print bulkchange.status

Bulk transition:

.. code:: python

bulkchange = client.bulkchange.transition( ['MYQUEUE-42', 'MYQUEUE-43'], 'need_info', priority='minor') bulkchange.wait()

Bulk move:

.. code:: python

bulkchange = client.bulkchange.move(['MYQUEUE-42', 'MYQUEUE-43'], 'TEST') bulkchange.wait()

Perform actions with objects

Client allows to make arbitrary subqueries to entities, for example in order to archive version you have to make request POST /v2/versions/<id>/_archive

In order to support such separate subqueries exists method perform_action, usage example:

::

version = client.versions[60031] version.perform_action('_archive', 'post', ignore_empty_body=True)

Some of tracker api endpoints doesn't work correctly with blank ({}) body, in this case you should pass ignore_empty_body=True to this method. If endpoint require list in body use list_data param and just pass needed kwargs otherwise.

Examples

Change assignee in all tickets

.. code:: python

from yandex_tracker_client import TrackerClient

client = TrackerClient(token=, org_id=<org_id>)

def sent_employee_to_vacation(assignee, replace_with): """ :param assignee: login in Yandex Tracker :type assignee: str

   :param replace_with: login in Yandex Tracker
   :type replace_with: ``str``

   :return: is operation was successful
   :rtype: ``bool``
   """
   issues_to_transfer = client.issues.find(filter={'queue': 'MYQUEUE', 'assignee': assignee})
   bulk_change = client.bulkchange.update(issues_to_transfer, assignee=replace_with)
   bulk_change.wait()

   if bulk_change.status == 'COMPLETED':
       log.info('Successfully change assignee in bulkchange {}'.format(bulk_change.id))
       for issue in issues_to_transfer:
           issue.comments.create('Your ticket will be processed by another employee - {}'.format(replace_with))
       successful = True
   else:
       log.error('Bulkchange operation {} failed'.format(bulk_change.id))
       successful = False

   return successful

Create related issues

.. code:: python

   def start_new_feature_creation_process(feature):
       feature_type = get_feature_type(feature)
       manager = get_manager_by_type(feature_type)
       # manager = 'manager_login'
       main_issue = client.issues.create(
           queue='MAINQUEUE',
           assignee=manager,
           summary='New feature request: {}'.format(feature),
           type={'name': 'Task'},
           description='New feature request arrived'
       )
       if feature_type.need_design:
           design_issue = client.issues.create(
               queue='DESIGN',
               summary='Feature "{}" design'.format(feature),
               type={'name': 'Task'},
               description='Need design for new feature, main task: {}'.format(main_issue.id)
           )
           main_issue.links.create(issue=design_issue.id, relationship='relates')

       if feature_type.add_followers:
           followers = get_followers(feature_type)
           # followers = ['my_login', 'someoneelse_login']
           main_issue.update(followers={'add': followers})

       if feature_type.need_testing:
           tester = get_random_tester()
           # tester = 'tester_login'
           main_issue.update(qa=tester)

       log.info('Successfully start new feature creation process')
       return main_issue.id

Run tests

::

./run_tests.sh

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

yandex_tracker_client-2.9.tar.gz (22.5 kB view details)

Uploaded Source

File details

Details for the file yandex_tracker_client-2.9.tar.gz.

File metadata

  • Download URL: yandex_tracker_client-2.9.tar.gz
  • Upload date:
  • Size: 22.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.10.12

File hashes

Hashes for yandex_tracker_client-2.9.tar.gz
Algorithm Hash digest
SHA256 68cf56877ceaf7127c8fe9cbf6f7442bfc59d5e72e7509cff6cd09bfad04d8dc
MD5 a6a00707232f92c6c476c8470a8783e8
BLAKE2b-256 ada4d7ca6f2501a5c7c0d86f252682eb96b28ec484bc86ba9a88019cd4191954

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page