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))
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))
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))
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
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'])
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'])