def parse_other(stat_common, stat_pbx_typed, userprofile): parsed = [] for spt in stat_pbx_typed: call = CallRecord() call_common = filter( lambda x: CommonService.is_dates_equals( x.date, spt.date, True), stat_common) if len(call_common) > 0: call_common = call_common[0] call = spt call.set_params(description=call_common.description, bill_seconds=call_common.bill_seconds, cost=call_common.cost, bill_cost=call_common.bill_cost, currency=call_common.currency) parsed.append(call) call_common.merged = True spt.merged = True else: if len(str(spt.sip)) == 3 and len(str(spt.destination)) == 3: spt.call_type = CallsConstants.INTERNAL call = spt spt.merged = True parsed.append(call) return parsed
def parse_other(stat_common, stat_pbx_typed, userprofile): parsed = [] for spt in stat_pbx_typed: call = CallRecord() call_common = filter(lambda x: CommonService.is_dates_equals(x.date, spt.date, True), stat_common) if len(call_common) > 0: call_common = call_common[0] call = spt call.set_params( description=call_common.description, bill_seconds=call_common.bill_seconds, cost=call_common.cost, bill_cost=call_common.bill_cost, currency=call_common.currency ) parsed.append(call) call_common.merged = True spt.merged = True else: if len(str(spt.sip)) == 3 and len(str(spt.destination)) == 3: spt.call_type = CallsConstants.INTERNAL call = spt spt.merged = True parsed.append(call) return parsed
def get_statistic(request, template): """ Controller to get test calls file :param request: HTTP GET request :param template: html template :return: json format """ params = ApiParams(request.GET or None) update_res = PBXDataService.update_calls_list(params, request.user) logger.info(Code.UCLEXE, is_success=update_res.is_success, status_code=update_res.status_code, message=update_res.message, data=update_res.data) filter_params = CallsFilterParams(request.GET) calls = [ CallRecord(call=call) for call in request.user.userprofile.call_set.filter( **filter_params.params).exclude(**filter_params.exclude_params). filter(filter_params.call_type_query).order_by('date') ] calls_stat = CallsStat(calls) # send_mail.apply_async((MailMessage(settings.INFO_EMAIL, 'Попытка обновления статы', 'mail_stat_updated.html', {'username': request.user.username}, request.user.email),), countdown=60) return render_to_response(template, { 'calls': calls, 'calls_stat': calls_stat }, context_instance=RequestContext(request))
def merge(stat_common, stat_pbx_typed, userprofile): merged = [] # Находим строку вида АТС - Номер А pbx_caller_calls = filter( lambda x: str(x.caller) == userprofile.profile_phone_number and not PBXDataService.is_number_known(x.destination, userprofile), stat_common) # начинаем проверку не является ли она калбеком for pcc in pbx_caller_calls: call = CallRecord() # Если ей нет соответствия во второй таблице, значит двустрочный калбек # Второй вид двустрочного калбека, это у которого вторая строка имеет вид Номер А - Номер Б second_row = filter( lambda x: str(x.caller) == str(pcc.destination) and CommonService.is_dates_equals(x.date, pcc.date, False), stat_common) if len(second_row) == 1: # страка может иметь соответствующий входящий во второй таблице, может не иметь. # Если имеет, то записи должны упоминатся номера А и Б second_row = second_row[0] pbx_call = PBXDataService.find_in_pbx_typed( second_row, filter(lambda x: x.call_type == 'incoming', stat_pbx_typed), False) if pbx_call: call = pbx_call call.set_params(clid=second_row.destination, destination=pbx_call.clid, description=pcc.description, bill_seconds=pcc.bill_seconds, cost=pcc.cost + second_row.cost, bill_cost=pcc.bill_cost + second_row.bill_cost, currency=pcc.currency, sip=second_row.destination, disposition=pcc.disposition) pbx_call.merged = True else: call.set_params(call_id=pcc.call_id, clid=pcc.sip, sip=second_row.destination, date=pcc.date, destination=pcc.destination, disposition=pcc.disposition, description=pcc.description, bill_seconds=pcc.bill_seconds, cost=pcc.cost + second_row.cost, bill_cost=pcc.bill_cost + second_row.bill_cost, currency=pcc.currency) call.call_type = CallsConstants.COMING call.is_callback = True pcc.merged = True second_row.merged = True merged.append(call) continue # При первом варианте: двустрочный калбек. Он бывает двух видов в котором вторая строка(фактически она первая) # имеет вид АТС - Номер Б, находим её. second_row = filter( lambda x: str(x.caller) == str(userprofile.profile_phone_number ) and CommonService. is_dates_equals(x.date, pcc.date, False) and not str( x.destination) == str(pcc.destination), stat_common) if len(second_row) == 1: # Ей должна соответствовать запись о входящем звонке в которой содержится номер А. # Если это так - значит всё это колбек(исходящий) second_row = second_row[0] pbx_call = PBXDataService.find_in_pbx_typed( second_row, filter(lambda x: x.call_type == 'incoming', stat_pbx_typed), False) if pbx_call: call = pbx_call call.call_type = CallsConstants.COMING call.set_params(sip=second_row.destination, destination=pcc.destination, description=pcc.description, bill_seconds=pcc.bill_seconds, cost=pcc.cost + second_row.cost, bill_cost=pcc.bill_cost + second_row.bill_cost, currency=pcc.currency, disposition=pcc.disposition) call.is_callback = True merged.append(call) pcc.merged = True pbx_call.merged = True continue # искаем однострочный pbx_call = PBXDataService.find_in_pbx_typed( pcc, filter(lambda x: x.call_type == 'coming', stat_pbx_typed)) if pbx_call: # Если соответствие есть - и это исходящий, значит это не калбек, а обычный исходящий звонок. call = pbx_call call.call_type = CallsConstants.COMING call.set_params(disposition=pcc.disposition, description=pcc.description, bill_seconds=pcc.bill_seconds, cost=pcc.cost, bill_cost=pcc.bill_cost, currency=pcc.currency) merged.append(call) pcc.merged = True pbx_call.merged = True continue pbx_call = PBXDataService.find_in_pbx_typed( pcc, filter(lambda x: x.call_type == 'incoming', stat_pbx_typed), False) if pbx_call: # Если соответствие есть, это входящий. значит однострочный калбек. call = pbx_call call.call_type = CallsConstants.COMING call.set_params(disposition=pcc.disposition, destination=pcc.destination, sip=pbx_call.destination, clid=pbx_call.destination, description=pcc.description, bill_seconds=pcc.bill_seconds, cost=pcc.cost, bill_cost=pcc.bill_cost, currency=pcc.currency) call.is_callback = True merged.append(call) pcc.merged = True pbx_call.merged = True continue return merged
def parse_calls(stat_common, stat_pbx_grouped, userprofile): coming = [] incoming = [] internal = [] for stat_pbx_group in stat_pbx_grouped: call = CallRecord() pbx_incoming = filter( lambda x: x.destination == CallsConstants.INCOMING, stat_pbx_group) if len(pbx_incoming) is not 0: pbx_incoming_call = pbx_incoming[0] pbx_call_same_disp = None if not pbx_incoming_call.disposition in CallsConstants.FAIL_TYPES: pbx_call_same_disp = filter( lambda x: x.disposition == pbx_incoming_call. disposition and not x.destination == CallsConstants. INCOMING, stat_pbx_group)[0] else: pbx_call_same_disp = filter( lambda x: not x.destination == CallsConstants.INCOMING, stat_pbx_group) pbx_call_same_disp = stat_pbx_group[0] if len( pbx_call_same_disp) == 0 else pbx_call_same_disp[0] call.set_params(call_id=pbx_call_same_disp.call_id, clid=pbx_call_same_disp.clid, sip=pbx_call_same_disp.sip, date=pbx_call_same_disp.date, destination=pbx_call_same_disp.destination, disposition=pbx_incoming_call.disposition, bill_seconds=pbx_incoming_call.seconds) else: pbx_call = stat_pbx_group[0] call.set_params(call_id=pbx_call.call_id, clid=pbx_call.clid, sip=pbx_call.sip, date=pbx_call.date, destination=pbx_call.destination, disposition=pbx_call.disposition, bill_seconds=pbx_call.seconds) if PBXDataService.is_number_known(call.clid, userprofile): # звонок исходящий либо внутренний if PBXDataService.is_number_known(call.destination, userprofile): # номер известный - звонок внутренний call.call_type = CallsConstants.INTERNAL if call.disposition in CallsConstants.FAIL_TYPES: call.destination = '' internal.append(call) else: # звонок исходящий call.call_type = CallsConstants.COMING if call.disposition in CallsConstants.FAIL_TYPES: call.destination = '' coming.append(call) else: # звонок входящий call.call_type = CallsConstants.INCOMING if call.disposition in CallsConstants.FAIL_TYPES: call.destination = '' incoming.append(call) return coming + incoming + internal
def merge(stat_common, stat_pbx_typed, userprofile): merged = [] # Находим строку вида АТС - Номер А pbx_caller_calls = filter(lambda x: str(x.caller) == userprofile.profile_phone_number and not PBXDataService.is_number_known(x.destination, userprofile), stat_common) # начинаем проверку не является ли она калбеком for pcc in pbx_caller_calls: call = CallRecord() # Если ей нет соответствия во второй таблице, значит двустрочный калбек # Второй вид двустрочного калбека, это у которого вторая строка имеет вид Номер А - Номер Б second_row = filter(lambda x: str(x.caller) == str(pcc.destination) and CommonService.is_dates_equals(x.date, pcc.date, False), stat_common) if len(second_row) == 1: # страка может иметь соответствующий входящий во второй таблице, может не иметь. # Если имеет, то записи должны упоминатся номера А и Б second_row = second_row[0] pbx_call = PBXDataService.find_in_pbx_typed(second_row, filter(lambda x: x.call_type == 'incoming', stat_pbx_typed), False) if pbx_call: call = pbx_call call.set_params( clid=second_row.destination, destination=pbx_call.clid, description=pcc.description, bill_seconds=pcc.bill_seconds, cost=pcc.cost + second_row.cost, bill_cost=pcc.bill_cost + second_row.bill_cost, currency=pcc.currency, sip=second_row.destination, disposition=pcc.disposition ) pbx_call.merged = True else: call.set_params( call_id=pcc.call_id, clid=pcc.sip, sip=second_row.destination, date=pcc.date, destination=pcc.destination, disposition=pcc.disposition, description=pcc.description, bill_seconds=pcc.bill_seconds, cost=pcc.cost + second_row.cost, bill_cost=pcc.bill_cost + second_row.bill_cost, currency=pcc.currency ) call.call_type = CallsConstants.COMING call.is_callback = True pcc.merged = True second_row.merged = True merged.append(call) continue # При первом варианте: двустрочный калбек. Он бывает двух видов в котором вторая строка(фактически она первая) # имеет вид АТС - Номер Б, находим её. second_row = filter(lambda x: str(x.caller) == str(userprofile.profile_phone_number) and CommonService.is_dates_equals(x.date, pcc.date, False) and not str(x.destination) == str(pcc.destination), stat_common) if len(second_row) == 1: # Ей должна соответствовать запись о входящем звонке в которой содержится номер А. # Если это так - значит всё это колбек(исходящий) second_row = second_row[0] pbx_call = PBXDataService.find_in_pbx_typed(second_row, filter(lambda x: x.call_type == 'incoming', stat_pbx_typed), False) if pbx_call: call = pbx_call call.call_type = CallsConstants.COMING call.set_params( sip=second_row.destination, destination=pcc.destination, description=pcc.description, bill_seconds=pcc.bill_seconds, cost=pcc.cost + second_row.cost, bill_cost=pcc.bill_cost + second_row.bill_cost, currency=pcc.currency, disposition=pcc.disposition ) call.is_callback = True merged.append(call) pcc.merged = True pbx_call.merged = True continue # искаем однострочный pbx_call = PBXDataService.find_in_pbx_typed(pcc, filter(lambda x: x.call_type == 'coming', stat_pbx_typed)) if pbx_call: # Если соответствие есть - и это исходящий, значит это не калбек, а обычный исходящий звонок. call = pbx_call call.call_type = CallsConstants.COMING call.set_params( disposition=pcc.disposition, description=pcc.description, bill_seconds=pcc.bill_seconds, cost=pcc.cost, bill_cost=pcc.bill_cost, currency=pcc.currency ) merged.append(call) pcc.merged = True pbx_call.merged = True continue pbx_call = PBXDataService.find_in_pbx_typed(pcc, filter(lambda x: x.call_type == 'incoming', stat_pbx_typed), False) if pbx_call: # Если соответствие есть, это входящий. значит однострочный калбек. call = pbx_call call.call_type = CallsConstants.COMING call.set_params( disposition=pcc.disposition, destination=pcc.destination, sip=pbx_call.destination, clid=pbx_call.destination, description=pcc.description, bill_seconds=pcc.bill_seconds, cost=pcc.cost, bill_cost=pcc.bill_cost, currency=pcc.currency ) call.is_callback = True merged.append(call) pcc.merged = True pbx_call.merged = True continue return merged
def parse_calls(stat_common, stat_pbx_grouped, userprofile): coming = [] incoming = [] internal = [] for stat_pbx_group in stat_pbx_grouped: call = CallRecord() pbx_incoming = filter(lambda x: x.destination == CallsConstants.INCOMING, stat_pbx_group) if len(pbx_incoming) is not 0: pbx_incoming_call = pbx_incoming[0] pbx_call_same_disp = None if not pbx_incoming_call.disposition in CallsConstants.FAIL_TYPES: pbx_call_same_disp = filter(lambda x: x.disposition == pbx_incoming_call.disposition and not x.destination == CallsConstants.INCOMING, stat_pbx_group)[0] else: pbx_call_same_disp = filter(lambda x: not x.destination == CallsConstants.INCOMING, stat_pbx_group) pbx_call_same_disp = stat_pbx_group[0] if len(pbx_call_same_disp) == 0 else pbx_call_same_disp[0] call.set_params( call_id=pbx_call_same_disp.call_id, clid=pbx_call_same_disp.clid, sip=pbx_call_same_disp.sip, date=pbx_call_same_disp.date, destination=pbx_call_same_disp.destination, disposition=pbx_incoming_call.disposition, bill_seconds=pbx_incoming_call.seconds ) else: pbx_call = stat_pbx_group[0] call.set_params( call_id=pbx_call.call_id, clid=pbx_call.clid, sip=pbx_call.sip, date=pbx_call.date, destination=pbx_call.destination, disposition=pbx_call.disposition, bill_seconds=pbx_call.seconds ) if PBXDataService.is_number_known(call.clid, userprofile): # звонок исходящий либо внутренний if PBXDataService.is_number_known(call.destination, userprofile): # номер известный - звонок внутренний call.call_type = CallsConstants.INTERNAL if call.disposition in CallsConstants.FAIL_TYPES: call.destination = '' internal.append(call) else: # звонок исходящий call.call_type = CallsConstants.COMING if call.disposition in CallsConstants.FAIL_TYPES: call.destination = '' coming.append(call) else: # звонок входящий call.call_type = CallsConstants.INCOMING if call.disposition in CallsConstants.FAIL_TYPES: call.destination = '' incoming.append(call) return coming + incoming + internal