Package: kayako
Usage:Set up the API:>>> from kayako import KayakoAPI,
>>> API_URL = 'http://example.com/api/index.php'
>>> API_KEY = 'abc3r4f-alskcv3-kvj4'
>>> SECRET_KEY = 'vkl239vLKMNvlik42fv9IsflkFJlkckfjs'
>>> api = KayakoAPI(API_URL, API_KEY, SECRET_KEY)Add a department:>>> from kayako import Department
>>>
>>> # The following is equivalent to: department = api.create(Department, title='Customer Support Department', type='public', module='tickets'); department.add()
>>> department = api.create(Department)
>>> department.title = 'Customer Support Department'
>>> department.type = 'public'
>>> department.module = 'tickets'
>>> department.add()
>>> department.id
84
>>>
>>> # Cool, we now have a ticket department.
>>> # Lets say we want to make it private now
>>>
>>> department.type = 'private'
>>> department.save()
>>>
>>> # Ok, great.  Lets delete this test object.
>>>
>>> department.delete()
>>> department.id
UnsetParameter()
>>>
>>> # We can re-add it if we want to...
>>>
>>> department.save()
>>> department.id
85
>>>
>>> # Lets see all of our Departments (yours will vary.)
>>> for dept in api.get_all(Department):
...     print dept
...
<Department (1): General/tickets>
<Department (2): Suggest A Store/tickets>
<Department (3): Report A Bug/tickets>
<Department (4): Sales/livechat>
<Department (5): Commissions/livechat>
<Department (6): Missing Order/livechat>
<Department (7): Suggest A Feature/tickets>
<Department (8): Other/livechat>
<Department (49): Offers/tickets>
<Department (85): Customer Support Department/tickets>
>>>
>>> # Lets see all of our ticket Departments
>>>
>>> for dept in api.filter(Department, module='tickets')
>>>    print dept
<Department (1): General/tickets>
<Department (2): Suggest A Store/tickets>
<Department (3): Report A Bug/tickets>
<Department (7): Suggest A Feature/tickets>
<Department (49): Offers/tickets>
<Department (85): Customer Support Department/tickets>
>>>
>>> # We will use this Department in the next example so lets wait to clean up the test data...
>>> #department.delete()Add a Staff member:>>> from kayako import Staff, StaffGroup
>>>
>>> # You can set parameters in the create method.
>>> staff = api.create(Staff, firstname='John', lastname='Doe', email='foo@example.com', username='explodes', password='easypass332')
>>>
>>> # We need to add a Staff member to a staff group.
>>> # Lets get the first StaffGroup titled "Administrator"
>>>
>>> admin_group = api.first(StaffGroup, title="Administrator")
>>> staff.staffgroupid = admin_group.id
>>>
>>> # And save the new Staff
>>>
>>> staff.add()
>>>
>>> # We will use this Staff in the next example so lets wait to clean up the test data...
>>> #staff.delete()Add a User:>>> from kayako import User, UserGroup, FOREVER
>>>
>>> # What fields can we add to this User?
>>> User.__add_parameters__
['fullname', 'usergroupid', 'password', 'email', 'userorganizationid', 'salutation', 'designation', 'phone', 'isenabled', 'userrole', 'timezone', 'enabledst', 'slaplanid', 'slaplanexpiry', 'userexpiry', 'sendwelcomeemail']
>>>
>>> # Lets make a new User, but not send out a welcome email.
>>> # Lets add the User to the "Registered" user group.
>>> registered = api.first(UserGroup, title='Registered')
>>> user = api.create(User, fullname="Ang Gary", password="easypass332", email="bar@example.com", usergroupid=registered.id, sendwelcomeemail=False, phone='1-800-555-5555', userexpiry=FOREVER)
>>> user.add()
>>>
>>> # Its that easy.  We will use this user in the next example so lets wait to clean up the test data...
>>> # user.delete()Add a Ticket and a TicketNote:>>> from kayako import TicketStatus, TicketPriority, TicketType, TicketNote, TicketAttachment
>>>
>>> # Lets add a "Bug" Ticket to any Ticket Department, with "Open" status and "High" priority for a user. Lets use the user and department from above.
>>>
>>> bug = api.first(TicketType, title="Bug")
>>> open = api.first(TicketStatus, title="Open")
>>> high = api.first(TicketPriority, title="High")
>>>
>>> ticket = api.create(Ticket, tickettypeid=bug.id, ticketstatusid=open.id, ticketpriorityid=high.id, departmentid=department.id, userid=user.id)
>>> ticket.subject = 'I found a bug and its making me very angry.'
>>> ticket.fullname = 'Ang Gary'
>>> ticket.email = 'bar@example.com'
>>> ticket.contents = 'I am an angry customer you need to make me happy.'
>>> ticket.add()
>>>
>>> # The ticket was added, lets let the customer know that everything will be fine.
>>>
>>> print 'Thanks, %s, your inquiry with reference number %s will be answered shortly.' % (ticket.fullname, ticket.displayid)
Thanks, Ang Gary, your inquiry with reference number TOJ-838-99722 will be answered shortly.'
>>>
>>> # Lets add a note to this Ticket, using the Staff member we created above.
>>>
>>> note = api.create(TicketNote, ticketid=ticket.id, contents='Customer was hostile. Will pursue anyway as this bug is serious.')
>>> note.staffid = staff.id # Alternatively, we could do: staff.fullname = 'John Doe'
>>> note.add()
>>>
>>> # Lets say the bug is fixed, we want to let the User know.
>>>
>>> post = api.create(TicketPost, ticketid=ticket.id, subject="We fixed it.", contents="We have a patch that will fix the bug.")
>>> post.add()
>>>
>>> # Now lets add an attachment to this TicketPost.
>>>
>>> with open('/var/patches/foo.diff', 'rb') as patch:
...    binary_data = patch.read()
>>>
>>> attachment = api.create(TicketAttachment, ticketid=ticket.id, ticketpostid=post.id, filename='foo.diff', filetype='application/octet-stream')
>>> attachment.set_contents(binary_data) # set_contents encodes data into base 64. get_contents decodes base64 contents into the original data.
>>> attachment.add()
>>>
>>> # Lets clean up finally.
>>> ticket.delete() # This deletes the attachment, post, and note.
>>> user.delete()
>>> staff.delete()
>>> department.delete()API Factory Methods:api.create(Object, *args, **kwargs)Create and return a newKayakoObjectof the type given passing in args and kwargs.api.get_all(Object, *args, **kwargs)Get all ``KayakoObjects`` of the given type.In most cases, all items are returned.e.x.>>> api.get_all(Department)
[<Department....>, ....]Special Cases:api.get_all(User, marker=1, maxitems=1000)Return allUsersfrom useridmarkerwith up tomaxitemsresults (max 1000.)api.get_all(Ticket, departmentid,ticketstatusid=-1,ownerstaffid=-1,userid=-1)Return allTicketsfiltered by the required argumentdepartmentidand by the optional keyword arguments.api.get_all(TicketAttachment, ticketid)Return allTicketAttachmentsfor aTicketwith the given ID.api.get_all(TicketPost, ticketid)Return allTicketPostsfor aTicketwith the given ID.api.get_all(TicketCustomField, ticketid)Return allTicketCustomFieldGroupsfor aTicketwith the given ID.
Returns alistofTicketCustomFieldGroups.api.get_all(TicketCount)Returns only one object:TicketCountnot alistof objects.api.filter(Object,args=(),kwargs={},**filter)Gets allKayakoObjectsmatching a filter.e.x.>>> api.filter(Department, args=(2), module='tickets')
[<Department module='tickets'...>, <Department module='tickets'...>, ...]api.first(Object,args=(),kwargs={},**filter)Returns the firstKayakoObjectfound matching a given filter.e.x.>>> api.filter(Department, args=(2), module='tickets')
<Department module='tickets'>api.get(Object, *args)Get a ``KayakoObject`` of the given type by ID.e.x.>>> api.get(User, 112359)
<User (112359)....>Special Cases:api.get(TicketAttachment, ticketid, attachmentid)Return aTicketAttachmentfor aTicketwith the givenTicketID andTicketAttachmentID.  Getting a specificTicketAttachmentgets aTicketAttachmentwith the actual attachment contents.api.get(TicketPost, ticketid, ticketpostid)Return aTicketPostfor a ticket with the givenTicketID andTicketPostID.api.get(TicketNote, ticketid, ticketnoteid)Return aTicketNotefor a ticket with the givenTicketID andTicketNoteID.Object persistence methodskayakoobject.add()Adds the instance to Kayako.kayakoobject.save()Saves an existing object the instance to Kayako.kayakoobject.delete()Removes the instance from KayakoThese methods can raise exceptions:RaisesKayakoRequestErrorif one of the following is true:The action is not available for the objectA required object parameter is UnsetParameter or None (add/save)The API URL cannot be reachedRaisesKayakoResponseErrorif one of the following is true:There is an error with the request (not HTTP 200 Ok)The XML is in an unexpected format indicating a possible Kayako version mismatchMisc API Callsapi.ticket_search(query, ticketid=False, contents=False, author=False, email=False, creatoremail=False, fullname=False, notes=False, usergroup=False, userorganization=False, user=False, tags=False)Search tickets with a query in the specified fieldsChanges1.1.5FixStaff.__str__.Ticket.__str__includesdisplayid.TicketPost.subjectis not returned in any responses, so it is not always available, removed it fromTicketPost.__str__.1.1.4Requires Kayako 4.01.240, use 1.1.3 for Kayako 4.01.204TicketNotenow supports get and deleteAddedapi.ticket_search, see Misc API Calls for details.Refactored ticket module into ticket package. This could cause problems
if things were not imported likefrom kayako.objects import XAddedTicketCountobject. Useapi.get_all(TicketCount)to
retrieve.AddedTicketTimeTrackobject.api.get_all(TicketTimeTrack, ticket.id)orapi.get(TicketTimeTrack, ticket.id, ticket_time_track_id)AddedTicket.timetracksQuick ReferenceObjectGet AllGetAddSaveDeleteDepartmentYesYesYesYesYesStaffYesYesYesYesYesStaffGroupYesYesYesYesYesTicketdepartmentid, ticketstatusid= -1, ownerstaffid= -1, userid= -1YesYesYesYesTicketAttachmentticketidticketid, attachmentidYesNoYesTicketCustomFieldticketidNoNoNoNoTicketCountYesNoNoNoNoTicketNoteticketidYesYesNoYesTicketPostticketidticketid, postidYesNoYesTicketPriorityYesYesNoNoNoTicketStatusYesYesNoNoNoTicketTimeTrackticketidticketid, idYesNoYesTicketTypeYesYesNoNoNoUsermarker=1, maxitems=1000YesYesYesYesUserGroupYesYesYesYesYesUserOrganizationYesYesYesYesYes