Example #1
0
File: api.py Project: conrado/atmt
 def __init__(self, consumer_key, consumer_secret, pin=None,
         host='api.assembla.com', search_host=None,
         cache=None, secure=False, api_root='/v1/', search_root='',
         retry_count=0, retry_delay=0, retry_errors=None,
         parser=None):
     self.client = HttpClient(consumer_key, consumer_secret, pin)
     self.host = host
     self.search_host = search_host
     self.api_root = api_root
     self.search_root = search_root
     self.cache = cache
     self.secure = secure
     self.retry_count = retry_count
     self.retry_delay = retry_delay
     self.retry_errors = retry_errors
     self.okay_status = [200, 201]
     self.parser = parser or ModelParser()
Example #2
0
File: api.py Project: conrado/atmt
class API(object):
    """Assembla API"""

    def __init__(self, consumer_key, consumer_secret, pin=None,
            host='api.assembla.com', search_host=None,
            cache=None, secure=False, api_root='/v1/', search_root='',
            retry_count=0, retry_delay=0, retry_errors=None,
            parser=None):
        self.client = HttpClient(consumer_key, consumer_secret, pin)
        self.host = host
        self.search_host = search_host
        self.api_root = api_root
        self.search_root = search_root
        self.cache = cache
        self.secure = secure
        self.retry_count = retry_count
        self.retry_delay = retry_delay
        self.retry_errors = retry_errors
        self.okay_status = [200, 201]
        self.parser = parser or ModelParser()

    def getAuthorizeUrl(self):
        return self.client.getAuthorizeUrl()

    def initClient(self, pin):
        self.client.initClient(pin)

    def initTokens(self, access_token, refresh_token):
        self.client.initTokens(access_token, refresh_token)

    """ Get the authenticated user """
    me = bind_api(
        path="user.json",
        payload_type="user"
    )

    """ Get the spaces current user has """
    get_spaces = bind_api(
        path="spaces.json",
        payload_type="space", payload_list = True
    )

    """ Get users belonging to a space """
    get_space_users = bind_api(
        path="spaces/{space}/users.json",
        payload_type="user", payload_list = True,
        allowed_param = ['space']
    )

    """ Get tickets belonging to a space """
    get_space_tickets = bind_api(
        path='spaces/{space}/tickets.json',
        payload_type="ticket", payload_list = True,
        allowed_params = ['space', 'page', 'per_page']
    )
    get_space_tickets.pagination_mode = 'page'

    """ Get possible ticket statuses for a space """
    get_ticket_statuses = bind_api(
        path='spaces/{space}/tickets/statuses.json',
        method='GET',
        payload_type='ticketstatus', payload_list = True,
        allowed_params = ['space',]
    )

    """ Create ticket status in a space """
    def create_ticket_status(self, status, *args, **kargs):
        post_data=status.toJSON()
        kargs['post_data'] = post_data
        return bind_api(
            path='spaces/{space}/tickets/statuses.json',
            method='POST',
            payload_type='ticketstatus',
            allowed_params = ['space']
        )(self, *args, **kargs)

    """ Get possible ticket custom fields"""
    get_custom_fields = bind_api(
        path='spaces/{space}/tickets/custom_fields.json',
        method='GET',
        payload_type='ticketcustomfield', payload_list=True,
        allowed_params = ['space',]
    )

    """ Create ticket custom field """
    def create_custom_field(self, field, *args, **kargs):
        post_data=field.toJSON()
        kargs['post_data'] = post_data
        return bind_api(
            path='spaces/{space}/tickets/custom_fields.json',
            method='POST',
            payload_type='ticketcustomfield',
            allowed_params = ['space']
        )(self, *args, **kargs)

    """ Get ticket components """
    get_ticket_components = bind_api(
        path='spaces/{space}/ticket_components.json',
        method='GET',
        payload_type='ticketcomponent', payload_list=True,
        allowed_params = ['space',]
    )

    """ Create ticket component """
    def create_ticket_component(self, component, *args, **kargs):
        post_data=component.toJSON()
        kargs['post_data'] = post_data
        return bind_api(
            path='spaces/{space}/ticket_components.json',
            method='POST',
            payload_type='ticketcomponent',
            allowed_params = ['space']
        )(self, *args, **kargs)

    """ Get space milestones """
    get_milestone = bind_api(
        path='spaces/{space}/milestones/{milestone}.json',
        method='GET',
        payload_type='milestone',
        allowed_params = ['space','milestone']
    )

    """ Get space milestones """
    get_milestones = bind_api(
        path='spaces/{space}/milestones/all.json',
        method='GET',
        payload_type='milestone', payload_list=True,
        allowed_params = ['space','page','per_page']
    )
    get_milestones.pagination_mode = 'page'

    """ Create milestone """
    def create_milestone(self, milestone, *args, **kargs):
        post_data=milestone.toJSON()
        kargs['post_data'] = post_data
        return bind_api(
            path='spaces/{space}/milestones.json',
            method='POST',
            payload_type='milestone',
            allowed_params = ['space']
        )(self, *args, **kargs)

    """ Get ticket associations """
    get_associations = bind_api(
        path='spaces/{space}/tickets/{ticket}/ticket_associations.json',
        method='GET',
        payload_type='ticketassociation', payload_list=True,
        allowed_params = ['space', 'ticket']
    )

    """ Create milestone """
    def create_association(self, association, *args, **kargs):
        post_data=association.toJSON()
        kargs['post_data'] = post_data
        return bind_api(
            path='spaces/{space}/tickets/{ticket}/ticket_associations.json',
            method='POST',
            payload_type='ticketassociation',
            allowed_params = ['space', 'ticket']
        )(self, *args, **kargs)

    """ Get tickets """
    get_tickets = bind_api(
        path='spaces/{space}/tickets.json',
        method='GET',
        payload_type='ticket', payload_list=True,
        allowed_params = ['space', 'page', 'per_page']
    )
    get_tickets.pagination_mode = 'page'

    """ Get ticket """
    get_ticket = bind_api(
        path='spaces/{space}/tickets/{ticket}.json',
        method='GET',
        payload_type='ticket',
        allowed_params = ['space', 'ticket']
    )

    """ Get ticket by id """
    get_ticket_by_id = bind_api(
        path='spaces/{space}/tickets/id/{ticket}.json',
        method='GET',
        payload_type='ticket',
        allowed_params = ['space', 'ticket']
    )

    """ Create ticket in a space """
    def create_ticket(self, ticket, *args, **kargs):
        post_data=ticket.toJSON()
        kargs['post_data'] = post_data
        return bind_api(
            path='spaces/{space}/tickets.json',
            method='POST',
            payload_type='ticket',
            allowed_params = ['space',]
        )(self, *args, **kargs)

    """ Delete ticket """
    delete_ticket = bind_api(
        path='spaces/{space}/tickets/{ticket}.json',
        method='DELETE',
        allowed_params = ['space', 'ticket']
    )

    """ Get ticket comment """
    get_ticket_comment = bind_api(
        path='spaces/{space}/tickets/{ticket}/ticket_comments/{comment}.json',
        method='GET',
        payload_type='ticketcomment',
        allowed_params = ['space', 'ticket', 'comment']
    )

    """ Get ticket comments """
    get_ticket_comments = bind_api(
        path='spaces/{space}/tickets/{ticket}/ticket_comments.json',
        method='GET',
        payload_type='ticketcomment', payload_list=True,
        allowed_params = ['space', 'ticket', 'page', 'per_page']
    )
    get_ticket_comments.pagination_mode = 'page'

    """ Create ticket comment """
    def create_ticket_comment(self, comment, *args, **kargs):
        post_data=comment.toJSON()
        kargs['post_data'] = post_data
        return bind_api(
            path='spaces/{space}/tickets/{ticket}/ticket_comments.json',
            method='POST',
            payload_type='ticketcomment',
            allowed_params = ['space', 'ticket']
        )(self, *args, **kargs)

    """ Update ticket comment """
    def update_ticket_comment(self, comment, *args, **kargs):
        post_data = comment.toJSON()
        kargs['post_data'] = post_data
        return bind_api(
            path='spaces/{space}/tickets/{ticket}/ticket_comments.json',
            method='POST',
            payload_type='ticketcomment'
        )(self, *args, **kargs)

    """ Get all document for space """
    get_documents = bind_api(
        path='spaces/{space}/documents.json',
        method='GET',
        allowed_params = ['space', 'page', 'per_page'],
        payload_type='document', payload_list=True
    )
    get_documents.pagination_mode = 'page'

    """ Get a document by id """
    get_document = bind_api(
        path='spaces/{space}/documents/{document}.json',
        method='GET',
        allowed_params = ['space', 'document'],
        payload_type='document'
    )

    """ Create document """
    def create_document(self, filecontent, docmeta, *args, **kargs):
        headers, post_data = API._pack_file(filecontent, docmeta)
        kargs['post_data'] = post_data
        kargs['headers'] = headers
        return bind_api(
            path = 'spaces/{space}/documents.json',
            method = 'POST',
            payload_type = 'document'
        )(self, *args, **kargs)


    """ Internal use only """
    @staticmethod
    def _pack_file(fileresponse, docmeta):

        fields = ['name', 'attachable_id', 'description', 'attachable_type']

        # build the mulitpart-formdata body
        BOUNDARY = '4079f119cf48'
        body = []
        body.append('--'+BOUNDARY)
        body.append('Content-Disposition: form-data; name="document[file]"; filename="%s"' % docmeta.name)
        body.append('Content-Type: application/octet-stream')
        body.append('')
        body.append(fileresponse.content)
        for field in fields:
            body.append('--'+BOUNDARY)
            body.append('Content-Disposition: form-data; name="document[%s]"' % field)
            body.append('')
            body.append(str(getattr(docmeta, field, '')))
        body.append('--'+BOUNDARY + '--')
        body.append('')
        body = '\r\n'.join(body)

        # build headers
        headers = {
            'Content-Type': 'multipart/form-data; boundary=%s' %BOUNDARY,
        }

        return headers, body