Example #1
0
    def import_departments(self, cr, uid, ids, context=None):
        dept_pool = self.pool.get('kayako.department')
        klog      = self.pool.get('kayako.logs')

        sobj = self.browse(cr, uid, ids[0])

        kayako_obj = KayakoAPI(sobj.api_url, sobj.api_key, sobj.secret_key)
        departments = kayako_obj.get_all(Department)

        for dept in departments:
            dept_ids =  dept_pool.search(cr, uid, [('kayako_id', '=', dept.id)])
            if not dept_ids:
                dept_pool.create(cr, uid, {'name' : dept.title, 'kayako_id' : dept.id})

        klog.create(cr, uid, {'config_id' : sobj.id,  'message': "Departments Synced: " + ", ".join([x.title for x in departments])})
            
        return True
Example #2
0
    def import_ticket_status(self, cr, uid, ids, context=None):
        ptt_pool = self.pool.get('project.task.type')
        klog          = self.pool.get('kayako.logs')

        sobj = self.browse(cr, uid, ids[0])

        existing_type_ids = ptt_pool.search(cr,uid,[('kayako_id','=',False)])
        if existing_type_ids:
            raise osv.except_osv(_("Can not Proceed!"), _("First delete all default stages "))

        kayako_obj = KayakoAPI(sobj.api_url, sobj.api_key, sobj.secret_key)
        states = kayako_obj.get_all(TicketStatus)
        
        for state in states:
            type_ids = ptt_pool.search(cr, uid, [('kayako_id', '=', state.id)])
            if not type_ids:
                ptt_pool.create(cr, uid, {'name' : state.title, 'kayako_id' : state.id, 'sequence' : state.displayorder})
        
        klog.create(cr, uid, {'config_id' : sobj.id,  'message': "Ticket Status Synced: " + ", ".join([x.title for x in states])})

        return True
Example #3
0
            previous = pickle.load(fi)
    except:
        first = True

    APIKEYS = 'APIKEYS.TXT'
    APIKEYS = path + APIKEYS
    ak = open(APIKEYS, 'r')

    lines = ak.readlines()
    for i in range(len(lines)):
        lines[i] = lines[i].strip("\n")

    API_URL = lines[0]
    API_KEY = lines[1]
    SECRET_KEY = lines[2]
    api = KayakoAPI(API_URL, API_KEY, SECRET_KEY)


    tickets = api.get_all(Ticket, 5, ticketstatusid=4)
    ticketcount = len(tickets)
    if first == True:
        previous = ticketcount
        
    new = ''
    if ticketcount == previous + 1:
        new = '1'
    elif ticketcount == previous + 2:
        new = '2'
    elif ticketcount == previous + 3:
        new = '3'
    elif ticketcount == previous + 4:
Example #4
0
    def import_ticket(self, cr, uid, ids, context=None):
        task_pool     = self.pool.get('project.task')
        ttype_pool    = self.pool.get('project.task.type')
        project_pool  = self.pool.get('project.project')
        partner_pool  = self.pool.get('res.partner')
        klog          = self.pool.get('kayako.logs')

        sobj = self.browse(cr, uid, ids[0])

        if not sobj.ticket_state: 
            raise osv.except_osv(_("Can not Proceed!"), _("Missing Tickets status in configuration!"))
        
        if not sobj.department_id:
            raise osv.except_osv(_("Can not Proceed!"), _("Missing Department in configuration!"))

        kayako_obj = KayakoAPI(sobj.api_url, sobj.api_key, sobj.secret_key)


        # UPDATE STATUS BACK TO KAYAKO FIRST 
        
        update_task_ids = task_pool.search(cr, uid, [('update_state','=',True)])
        klog.create(cr, uid, {'config_id':sobj.id,  'message': " %s Tickets to update back to kayako  ..." %(len(update_task_ids))})

        for task in task_pool.browse(cr, uid, update_task_ids):
            ticket = kayako_obj.get(Ticket, task.kayako_ticket_id)
            if ticket:
                _logger.warning('Ticket %s : Status ID %s' %(ticket.displayid, ticket.statusid))
                if ticket.statusid != task.kayako_config_id.export_state.kayako_id:
                    ticket.ticketstatusid = task.kayako_config_id.export_state and task.kayako_config_id.export_state.kayako_id
                    ticket.save() 

                    response = save_status(sobj.api_url, sobj.api_key, sobj.secret_key, ticket.id, task.kayako_config_id.export_state.kayako_id)
                    if response and response.code == 200:
                        klog.create(cr, uid, {'config_id':sobj.id,  'message': "Invoiced Ticket Updated ..."+ str(ticket.id)+" "+str(ticket.displayid)})
                        task.write({'update_state':False, 'stage_id' : task.kayako_config_id.export_state.id })
                    else:
                        klog.create(cr, uid, {'config_id':sobj.id,  'message': "Invoiced Ticket Update Fail ..."+ str(ticket.id)+" "+str(ticket.displayid)})
                else:
                    task.write({'update_state':False, 'stage_id' : task.kayako_config_id.export_state.id})
                    
        # Start Import        
        tickets = kayako_obj.get_all(Ticket, sobj.department_id.kayako_id, ticketstatusid=sobj.ticket_state.kayako_id)
        if not tickets:
            _logger.warning('No Tickets to download')

        kayako_ticket_ids = []
        
        if tickets:
            worker_staff = kayako_obj.get_all(Staff)
            
        for ticket in tickets:
            
            ticket_handle = str(ticket.id) + " " + str(ticket.displayid)

            kayako_ticket_ids.append(ticket.id)
            task_exists = task_pool.search(cr, uid, [('kayako_ticket_id', '=', ticket.id)])
            if task_exists:

                task_val = {}
                
                task = task_pool.browse(cr, uid, task_exists[0])
                if task.name != ticket.subject:
                    task_val['name'] = ticket.subject

                if task.stage_id.id != sobj.ticket_state.id:
                    task_val['stage_id'] = sobj.ticket_state.id
                    
                user = kayako_obj.get(User, ticket.userid)
                if not user.userorganizationid:
                    klog.create(cr, uid, {'config_id':sobj.id,  'message': "Organization is missing, Update aborted..."+ str(ticket.id)+" "+str(ticket.displayid)})
                    continue

                customer_data = kayako_obj.get(UserOrganization, user.userorganizationid)
                customer_ids = partner_pool.search(cr, uid, [('name','=', customer_data.name)])
                if not customer_ids:
                    klog.create(cr, uid, {'config_id':sobj.id, 'message': "Organization is not found, Update aborted... - Ticket: %s" + str(ticket.id) + " " + str(ticket.displayid) })
                    continue
                elif task.project_id.partner_id.id != customer_ids[0]:
                    task_val['partner_id'] = customer_ids[0]
                    project_ids = project_pool.search(cr,uid,[('partner_id','=',customer_ids[0])])
                    if project_ids:
                        task_val['project_id'] = project_ids[0]

                if task_val:                        
                    task_pool.write(cr, uid, [task_exists[0]], task_val)
                    klog.create(cr, uid, {'config_id':sobj.id, 'message': "Ticket Updated : " + str(ticket.id) + " " + str(ticket.displayid) })
                else:
                    klog.create(cr, uid, {'config_id':sobj.id, 'message': "Ticket Update - No Change : " + str(ticket.id) + " " + str(ticket.displayid) })
                    

                if ticket.timetracks:
                    for timetrack in ticket.timetracks:
                        hours = round(float(timetrack.timespent) / 3600,2)
                        work_ids = self.pool.get('project.task.work').search(cr, uid, [('kayako_timetrack_id','=', timetrack.id)])
                        work_line = {
                                        'name' : timetrack.contents,
                                        'task_id' : task_exists[0],
                                        'user_id' : self.get_staff_user(cr, uid, worker_staff, timetrack.workerstaffid) or 1,
                                        'date' : str(timetrack.worktimeline) or False,
                                        'hours' : hours,
                                        'kayako_timetrack_id':timetrack.id
                                    }
                        if not work_ids: 
                            self.pool.get('project.task.work').create(cr, uid, work_line)
                        else:
                            self.pool.get('project.task.work').write(cr, uid, work_ids, work_line)
                continue

            # FROM HERE ON -- IF TASK IS NOT EXISTS
            user = kayako_obj.get(User, ticket.userid)
            if not user.userorganizationid:
                klog.create(cr, uid, {'config_id':sobj.id,  'message': "Organization is missing, Skipped..."+ str(ticket.id)+" "+str(ticket.displayid)})
                continue

            user_email=(user.email)[0]
            inactive_taskid = task_pool.search(cr, uid, [('kayako_ticket_id', '=', ticket.id),('active', '=', False)])
            if inactive_taskid:
                self.pool.get('project.task').write(cr, uid,inactive_taskid, {'active':True,'stage_id':stage_id})
                continue

            partner_ids = partner_pool.search(cr, uid, [('name','=', user.fullname)])
            if partner_ids:
                partner_id = partner_ids[0]
                partner = partner_pool.browse(cr, uid, partner_id)
                if not partner.parent_id:
                    customer_data = kayako_obj.get(UserOrganization, user.userorganizationid)
                    klog.create(cr, uid, {'config_id':sobj.id, 'message': "User (%s) Exists, User's Organization (%s) missing, Skipped... - Ticket: %s" %(user.fullname, customer_data.name, ticket_handle)})
                    continue
                else:
                    customer_id = partner.parent_id.id
                    
            elif sobj.create_user:
                customer_data = kayako_obj.get(UserOrganization, user.userorganizationid)
                customer_ids = partner_pool.search(cr, uid, [('name','=', customer_data.name)])
                if not customer_ids:
                    klog.create(cr, uid, {'config_id':sobj.id, 'message': "User (%s) and Organization (%s), both missing, Skipped... - Ticket: %s" %(user.fullname, customer_data.name, ticket_handle) })
                    continue
                else:
                    customer_id = customer_ids[0]
                    partner_id = partner_pool.create(cr, uid, {'name': user.fullname, 'email' : user_email, 'is_company': False, 'parent_id':customer_id, 'kayako_user_id':ticket.userid })
            else:
                klog.create(cr, uid, {'config_id':sobj.id, 'message': "User is missing, Skipped..."+ str(ticket.id)+" "+str(ticket.displayid)})
                continue

            print "Customer IDS", customer_id

            project_ids = project_pool.search(cr, uid, [('partner_id','=', customer_id)])
            if not project_ids:
                customer = partner_pool.browse(cr, uid, customer_id)
                project_id = project_pool.create(cr, uid, { 'name' : customer.name, 'partner_id' : customer.id})
            else:
                project_id = project_ids[0]

            
            task_vals = {
                            'project_id' : project_id,
                            'name'       : ticket.subject,
                            'partner_id' : partner_id,
                            'kayako_ticket_id' : ticket.id,
                            'kayako_ticket_displayid' : ticket.displayid,
                            'kayako_config_id' :sobj.id,
                            'stage_id'   :sobj.ticket_state.id
            }

            task_id = task_pool.create(cr, uid, task_vals)
            if ticket.timetracks:
                for timetrack in ticket.timetracks:
                    hours = round(float(timetrack.timespent) / 3600,2)
                    self.pool.get('project.task.work').create(cr, uid, {
                                                                        'name' : timetrack.contents,
                                                                        'task_id' : task_id,
                                                                        'user_id' : self.get_staff_user(cr, uid, worker_staff, timetrack.workerstaffid) or 1,
                                                                        'date' : str(timetrack.worktimeline) or False,
                                                                        'hours' : hours,
                                                                        'kayako_timetrack_id':timetrack.id
                                                                        })
            klog.create(cr, uid, {'config_id':sobj.id, 'message': "Ticket Created Successfully :" +str(ticket.id)+" "+str(ticket.displayid)})

        # Update moved status tickets  - 
        moved_task_ids = task_pool.search(cr, uid, [('kayako_ticket_id', 'not in', kayako_ticket_ids), ('stage_id', '=', sobj.ticket_state.id), ('invoiced', '!=', True)])
        klog.create(cr, uid, {'config_id':sobj.id, 'message': "Checking/Updating Status of %s Tickets" %(len(moved_task_ids))})

        if moved_task_ids:
            tt_status_map = dict( [ (tt.kayako_id, tt.id) for tt in ttype_pool.browse(cr, uid, ttype_pool.search(cr, uid, [])) if tt.kayako_id ] )

            for moved_task in task_pool.browse(cr, uid, moved_task_ids):
                mv_ticket = kayako_obj.get(Ticket, moved_task.kayako_ticket_id)
                if moved_task.stage_id.id != tt_status_map[mv_ticket.statusid]:
                    moved_task.write({ 'stage_id' : tt_status_map[mv_ticket.statusid] })
                    klog.create(cr, uid, {'config_id':sobj.id, 'message': "Ticket Status Updated (Moved Tickets) :" +str(mv_ticket.id)+" "+str(mv_ticket.displayid)})



        return True
Example #5
0
auth_token  = "08eee0fc2c0bebf2132ddeaaaf173576"  # Your Auth Token from www.twilio.com/console

client = Client(account_sid, auth_token)

message = client.messages.create(to="+14232404107", 
    from_="+14232914011",
    body="A new support ticket is available!")

print(message.sid)
"""
"""

if "totalunresolveditems" in line[x]:
    sep = 'totalunresolveditems='
    unresolved = line[n].split(sep, 1)[1]

    for dig in range(len(unresolved)):
        if unresolved[dig].isdigit() == False:
            unresolved[dig] = ''
"""

#from kayako import Ticket, TicketAttachment, TicketNote, TicketPost, TicketPriority, TicketStatus, TicketType
from kayako import KayakoAPI
API_URL = 'https://support.fused.com/api/'
API_KEY = '0b85616f-556b-8234-6146-acafbe3d5552'
SECRET_KEY = 'NDMwMGFiZDEtZmJiMC02NDE0LTE5MjMtNDJlMzI4MzExNmViODE2ZjUwMzMtMDA0Ny1lMmE0LTI5OGItZTg5ZjI1M2NkZTFh'
api = KayakoAPI(API_URL, API_KEY, SECRET_KEY)

print(api.get_all(TicketCount))
#print(api.get_all(Ticket, 5, ticketstatusid=4))
Example #6
0

"""

if "totalunresolveditems" in line[x]:
    sep = 'totalunresolveditems='
    unresolved = line[n].split(sep, 1)[1]

    for dig in range(len(unresolved)):
        if unresolved[dig].isdigit() == False:
            unresolved[dig] = ''
"""


#from kayako import Ticket, TicketAttachment, TicketNote, TicketPost, TicketPriority, TicketStatus, TicketType
from kayako import KayakoAPI
API_URL = 'https://support.fused.com/api/'
API_KEY = '0b85616f-556b-8234-6146-acafbe3d5552'
SECRET_KEY = 'NDMwMGFiZDEtZmJiMC02NDE0LTE5MjMtNDJlMzI4MzExNmViODE2ZjUwMzMtMDA0Ny1lMmE0LTI5OGItZTg5ZjI1M2NkZTFh'
api = KayakoAPI(API_URL, API_KEY, SECRET_KEY)


print(api.get_all(TicketCount))
#print(api.get_all(Ticket, 5, ticketstatusid=4))






Example #7
0
                        TicketAttachment,
                        TicketNote,
                        TicketStatus,
                        TicketPriority)
except ImportError:
    print "kayako not found"
    print "try: pip install kayako"


PHONE_NUMBER_REGEXP = re.compile(r"^[\+]?\d{6,29}$")#{{{

"""
The handle kApi is for communicating with the
Kayako API respectively.
"""
kApi = KayakoAPI(KAYAKO_API_URL, KAYAKO_API_KEY, KAYAKO_SECRET_KEY)
hApi = (HF_API_KEY, HF_AUTH_KEY)#}}}

def getKayakoSignature():#{{{
    """
    This functions creates a random salt and hashes the salt
    with KAYAKO_SECRET_KEY. This is required only if directly
    calling the XML API of kayako instead of using the python
    API
    """
    salt = ''.join([random.choice(string.ascii_letters+string.digits) for _ in range(30)])
    signature = hmac.new(KAYAKO_SECRET_KEY, msg=salt, digestmod=hashlib.sha256).digest()
    encodedSignature = base64.b64encode(signature)
    return salt, encodedSignature#}}}

def postToHappyFox(endpoint, payload, headers=None, files=None):#{{{
            previous = pickle.load(fi)
    except:
        first = True

    APIKEYS = 'APIKEYS.TXT'
    APIKEYS = path + APIKEYS
    ak = open(APIKEYS, 'r')

    lines = ak.readlines()
    for i in range(len(lines)):
        lines[i] = lines[i].strip("\n")

    API_URL = lines[0]
    API_KEY = lines[1]
    SECRET_KEY = lines[2]
    api = KayakoAPI(API_URL, API_KEY, SECRET_KEY)

    tickets = api.get_all(Ticket, 5, ticketstatusid=4)
    ticketcount = len(tickets)
    if first == True:
        previous = ticketcount
    print(ticketcount)
    for n in range(ticketcount):
        print(tickets[n])

    new = ''
    if ticketcount == previous + 1:
        new = '1'
    elif ticketcount == previous + 2:
        new = '2'
    elif ticketcount == previous + 3: