import six
from pyutrack.util import Type
# Admin types
[docs]@six.add_metaclass(Type)
class Permission(object):
__list__ = {'url': 'admin/permission', 'hydrate': False}
__render__ = ('name', 'description')
__label__ = '%(name)s'
[docs]@six.add_metaclass(Type)
class Role(object):
__get__ = {'url': 'admin/role/%(name)s'}
__create__ = {
'url': 'admin/role/%(name)s',
'args': ('name', ),
'kwargs': {
'description': ''
}
}
__delete__ = {
'url': 'admin/role/%(name)s',
}
__update__ = {
'url': 'admin/role/%(name)s',
'args': ('description', 'newName')
}
__list__ = {'url': 'admin/role', 'hydrate': True}
__label__ = '%(name)s'
__render__ = ('name', 'description')
__associations__ = {
'permissions': {
'type': Permission,
'get': {
'url': 'admin/role/%(name)s/permission',
'hydrate': False
},
'add': {
'url': 'admin/role/%(name)s/permission/%(permission)s',
'key': 'permission',
'method': 'post'
},
'remove': {
'url': 'admin/role/%(name)s/permission/%(permission)s',
'key': 'permission'
}
}
}
[docs]@six.add_metaclass(Type)
class Group(object):
__get__ = {'url': 'admin/group/%(name)s'}
__create__ = {
'url': 'admin/group/%(name)s',
'args': ('name', ),
'kwargs': {
'autoJoin': False,
'description': ''
}
}
__delete__ = {
'url': 'admin/group/%(name)s',
}
__update__ = {
'url': 'admin/group/%(name)s',
'args': ('description', 'autoJoin', 'newName')
}
__list__ = {'url': 'admin/group', 'hydrate': True}
__render__ = ('name', 'description', 'autoJoin')
__label__ = '%(name)s'
__associations__ = {
'roles': {
'type': Role,
'get': {
'url': 'admin/group/%(name)s/role',
'hydrate': True
},
'add': {
'url': 'admin/group/%(name)s/role/%(role)s',
'key': 'role',
'method': 'put'
},
'remove': {
'url': 'admin/group/%(name)s/role/%(role)s',
'key': 'role'
}
}
}
[docs]@six.add_metaclass(Type)
class User(object):
__get__ = {'url': 'admin/user/%(login)s'}
__create__ = {
'url': 'admin/user/%(login)s',
'args': ('login', 'fullName', 'email', 'password')
}
__delete__ = {'url': 'admin/user/%(login)s'}
__update__ = {
'url': 'admin/user',
'kwargs': {
'login': '',
'fullName': '',
'email': '',
'password': ''
}
}
__list__ = {
'url':
'admin/user?q=%(query)s&role=%(role)s&permission=%(permission)s&group=%(group)s',
'hydrate':
True,
'kwargs': {
'project': '',
'role': '',
'permission': '',
'query': '',
'group': ''
}
}
__render__ = ('login', 'email', 'fullName')
__label__ = '%(name)s'
__aliases__ = {'name': 'fullName'}
__associations__ = {
'groups': {
'type': Group,
'get': {
'url': 'admin/user/%(login)s/group',
'hydrate': False
},
'add': {
'url': 'admin/user/%(login)s/group/%(group)s',
'key': 'group',
'method': 'post'
},
'remove': {
'url': 'admin/user/%(login)s/group/%(group)s',
'key': 'group'
}
},
'roles': {
'type': Role,
'get': {
'url': 'admin/user/%(login)s/role',
'hydrate': True
},
}
}
[docs]@six.add_metaclass(Type)
class IssueLinkType(object):
__get__ = {'url': 'admin/issueLinkType/%(name)s'}
__create__ = {
'url': 'admin/issueLinkType/%(name)s',
'args': ('outwardName', 'inwardName'),
'kwargs': {
'directed': False
}
}
__delete__ = {'url': 'admin/issueLinkType/%(name)s'}
__update__ = {
'url': 'admin/issueLinkType/%(name)s',
'kwargs': {
'newName': '',
'outwardName': '',
'inwardName': '',
'directed': ''
}
}
__list__ = {'url': 'admin/issueLinkType', 'hydrate': False}
__render__ = ('name', 'inwardName', 'outwardName')
__label__ = '[%(name)s] X->%(inwardName)s->Y, Y->%(outwardName)s->X'
[docs]@six.add_metaclass(Type)
class IssueLink(object):
__render__ = ('source', 'typeOutward', 'target')
__label__ = '%(typeOutward)s %(target)s'
pass
[docs]@six.add_metaclass(Type)
class Issue(object):
__get__ = {'url': 'issue/%(id)s'}
__create__ = {
'url': 'issue/',
'args': ('project', ),
'kwargs': {
'summary': '',
'description': ''
}
}
__delete__ = {'url': 'issue/%(id)s'}
__update__ = {
'url': 'issue/%(id)s/',
'kwargs': {
'summary': '',
'description': ''
}
}
__list__ = {
'url': 'issue?filter=%(filter)s&max=%(max)d',
'args': ('filter', ),
'kwargs': {
'max': 100
},
'hydrate': False,
'callback': lambda response: response['issue']
}
__aliases__ = {'project': 'projectShortName'}
__label__ = '%(id)s'
__attributes__ = {
'id': 'id',
'assignee': 'Assignee/0/value',
'reporter': 'reporterName',
'updater': 'updaterName',
'priority': 'Priority',
'status': 'Status'
}
__render__ = (
'id', 'summary', 'status', 'assignee', 'reporter', 'updater',
'priority', 'link'
)
__render_min__ = ('id', 'summary')
__associations__ = {
'issue_links': {
'type': IssueLink,
'get': {
'url': 'issue/%(id)s/link'
}
}
}
@property
def link(self):
return "%s/issue/%s" % (self.connection.base_url, self.id)
[docs] def command(self, command=None, comment=None):
"""
executes a command for the given issue.
:param str command: The youtrack command to execute. See
https://www.jetbrains.com/help/youtrack/standalone/Commands.html
for command grammar.
"""
url = 'issue/%(id)s/execute' % {
'id': self.id,
}
self.connection.post(
url, {'command': command, 'comment': comment}, parse=False
)
self.get()
[docs]@six.add_metaclass(Type)
class Project(object):
__get__ = {
'url': 'admin/project/%(projectId)s',
}
__create__ = {
'url': 'admin/project/%(projectId)s',
'args': ('projectName', 'projectLeadLogin'),
'kwargs': {
'projectId': None,
'startingNumber': 1,
'description': ''
}
}
__delete__ = {'url': 'admin/project/%(projectId)s'}
__list__ = {'url': 'project/all?verbose=true', 'hydrate': False}
__associations__ = {
'issues': {
'type': Issue,
'get': {
'url':
'issue/byproject/%(projectId)s?filter=%(filter)s&max=%(max)d',
'kwargs': {
'filter': '',
'max': 100
}
}
}
}
__attributes__ = {
'id': 'id',
'lead': 'lead',
'description': 'description',
}
__aliases__ = {
'id': 'shortName',
'shortName': 'projectId',
'lead': 'projectLeadLogin'
}
__label__ = '%(id)s'
__render__ = ('id', 'name', 'description', 'lead')
__render_min__ = ('id', 'name')