Exemplo n.º 1
0
def callback_cdr(callid):
    crm_callback = conf_callback['update_campaign']
    try:
        cdr = db.select_one(table='cdr', where=dict(uniqueid=callid))
        payload = dict(campaignid=cdr['campaign_id'],
                       contact_id=cdr['contact_id'],
                       phonenumber=cdr['phone_number'],
                       agentcode=cdr['agent'],
                       station_id=cdr['station_id'],
                       starttime=cdr['time_start'],
                       answertime=cdr['time_answer'],
                       endtime=cdr['time_end'],
                       duration=cdr['duration'],
                       ringtime=cdr['duration'] - cdr['billsec'],
                       link_down_record=cdr['record_url'],
                       status=cdr['disposition'],
                       callid=cdr['uniqueid'])
        response = requests.post(url=crm_callback,
                                 json=payload,
                                 timeout=int(conf_callback['timeout']))
        logger.info("CALLBACK_CDR: uniqueid={0}|{1}".format(
            cdr['uniqueid'], response.status_code))
    except DBError as e:
        logger.error("CALLBACK_CDR: uniqueid={0}|{1}".format(callid, e.msg))
    except Exception:
        logger.error("CALLBACK_CDR: uniqueid={0}|failed".format(callid))
Exemplo n.º 2
0
def callback_campaign(campaign_id):
    crm_callback = conf_callback['finish_campaign']
    try:
        campaign = db.select_one(table='campaigns',
                                 where=dict(campaign_id=campaign_id))
        status = 'RECEIVED'
        if campaign['status_completed']:
            status = 'COMPLETED'
        elif campaign['status_closed']:
            status = 'CANCELED'
        elif campaign['status_scheduled']:
            status = 'SCHEDULED'
        data = dict(campaignid=campaign_id,
                    status=status,
                    contact_total=campaign['number_contacts'],
                    contact_success=campaign['number_contacts_success'])
        response = requests.post(url=crm_callback,
                                 json=data,
                                 timeout=int(conf_callback['timeout']))
        logger.info("CALLBACK_CAMPAIGN: campaignid={0}|{1}".format(
            campaign_id, response.status_code))
    except DBError as e:
        logger.error("CALLBACK_CAMPAIGN: campaignid={0}|{1}".format(
            campaign_id, e.msg))
    except Exception:
        logger.error(
            "CALLBACK_CAMPAIGN: campaignid={0}|failed".format(campaign_id))
Exemplo n.º 3
0
def send_campaign():
    payload = request.json
    try:
        """ Insert campaign """
        camp.insert(data=payload)
        """ Create schedule """
        cid = int(payload['campaignid'])
        campaign = db.select_one(table='campaigns',
                                 where=dict(campaign_id=cid))
        conf_sched = conf.section(name='scheduler')
        retries = int(conf_sched['retries'])
        interval = int(conf_sched['interval'])
        for i in range(retries):
            scheduler.add_job(func=create_jobs,
                              trigger='date',
                              run_date=campaign['time_start'] +
                              timedelta(seconds=(i * interval)),
                              args=[cid],
                              id='{0}.p{1}'.format(cid, i))
        db.update(table='campaigns',
                  where=['campaign_id'],
                  data=dict(campaign_id=cid, status_scheduled=True))
    except (CampaignError, DBError) as e:
        return jsonify(
            dict(campaignid=int(payload['campaignid']),
                 status=0,
                 error_msg=e.msg)), 400
    else:
        return jsonify(dict(campaignid=int(payload['campaignid']), status=1))
Exemplo n.º 4
0
    def insert(self, data):
        # Check payload
        required_fields = self.__config['required_fields_campaign'].split(',')
        if data is None:
            raise CampaignError('PAYLOAD_EMPTY')
        for f in required_fields:
            if f not in data:
                raise CampaignError('PARAM_MISS')

        cid = int(data['campaignid'])
        # Check unique id
        if db.select_one(table='cdr', where=dict(campaign_id=cid)):
            raise CampaignError('ID_EXISTED')

        # Parse datetime
        try:
            fmt = self.__config['datetime_format']
            time_start = datetime.strptime(data['starttime'], fmt)
            time_end = datetime.strptime(data['endtime'], fmt)
            if time_end < time_start or time_end < datetime.now():
                raise CampaignError('PARAM_INVALID')
        except ValueError:
            raise CampaignError('DATETIME_FORMAT')

        # Insert
        # Todo: start transaction, rollback if failure
        db.insert_one(table='campaigns', data=dict(campaign_id=cid, time_start=time_start, time_end=time_end))
        cts_valid = list(filter(lambda c: self.__config['required_field_contacts'] in c, data['contact']))
        cts = list(map(lambda c: dict(campaign_id=cid,
                                      contact_id=int(c['id']),
                                      phone_number=c['phonenumber'],
                                      linkedit=c.get('linkedit', None)), cts_valid))
        db.insert_many(table='cdr', data=cts)

        return True
Exemplo n.º 5
0
def listener_cdr(manager, event):
    if not db.select_one(table='cdr', where=dict(uniqueid=event['UniqueID'])):
        return False
    fmt = "%Y-%m-%d %H:%M:%S"
    cdr = dict(time_start=datetime.strptime(event['StartTime'], fmt),
               time_end=datetime.strptime(event['EndTime'], fmt),
               agent=event['Destination'],
               station_id=event['Destination'],
               duration=event['Duration'],
               billsec=event['BillableSeconds'],
               disposition=event['Disposition'],
               uniqueid=event['UniqueID'],
               linkedid=event['Linkedid'])
    if event['RecordingFile'] != '':
        cdr['record_url'] = conf.section(
            name='originate')['record_url'] + event['RecordingFile']
    if event['AnswerTime'] != '':
        cdr['time_answer'] = datetime.strptime(event['AnswerTime'], fmt)
    db.update(table='cdr', where=['uniqueid'], data=cdr)
    cworker.callback_cdr.delay(callid=event['UniqueID'])
Exemplo n.º 6
0
def originate(cdrid, extension):
    conf_originate = conf.section(name='originate')
    conf_asterisk = conf.section(name='asterisk')

    job = db.select_one(table='cdr', where=dict(id=cdrid))

    manager = Manager(**conf_asterisk)
    yield from manager.connect()
    action = dict(Action='Originate',
                  Channel='{0}/{1}'.format(conf_originate['channel'],
                                           job['phone_number']),
                  Context=conf_originate['context'],
                  Exten=extension,
                  Priority=conf_originate['priority'],
                  Timeout=int(conf_originate['timeout']),
                  WaitTime=25,
                  CallerID=job['callerid'],
                  Async=True)
    responses = yield from manager.send_action(action=action, as_list=True)
    manager.close()

    print(responses[1]['Uniqueid'])