def test_add_months(self): """ Test two cases of add_month method """ date = datetime.datetime(2015, 10, 30, 20, 0, 0) self.assertEquals(CommonService.add_months(date, 1), datetime.datetime(2015, 11, 30, 20, 0, 0)) self.assertEquals(CommonService.add_months(date, 4), datetime.datetime(2016, 02, 29, 20, 0, 0))
def test_get_params_string(self): """ Test for get_params_string method """ params = {'a': 'foo', 'b': 'bar', 'c': 42} self.assertEqual(CommonService.get_params_string(params), 'a=foo&b=bar&c=42') params_1 = {} self.assertEqual(CommonService.get_params_string(params_1), '')
def test_add_months(self): """ Test two cases of add_month method """ date = datetime.datetime(2015, 10, 30, 20, 0, 0) self.assertEquals(CommonService.add_months(date, 1), datetime.datetime(2015, 11, 30, 20, 0, 0)) self.assertEquals(CommonService.add_months(date, 4), datetime.datetime(2016, 02, 29, 20, 0, 0))
def test_get_params_string(self): """ Test for get_params_string method """ params = {'a': 'foo', 'b': 'bar', 'c': 42} self.assertEqual(CommonService.get_params_string(params), 'a=foo&b=bar&c=42') params_1 = {} self.assertEqual(CommonService.get_params_string(params_1), '')
def request_callback(request): """ Request the callback :param request: HTTP request :return: HttpResponse instance """ from_number = CommonService.reduce_number(request.GET.get('cbFromNumber') or request.user.userprofile.sip) to_number = CommonService.reduce_number(request.GET.get('cbToNumber')) result = PBXDataService.request_callback(request.user, from_number, to_number) if result: return HttpResponse(status=200, content=result) return HttpResponse(status=500)
def load_call_record_file(call, user): """ Load audio, convert, upload to disk and update db with filename :param call: Call instance :param user: current user :return: File instance """ # get audio call_audio = PBXDataService.get_audio(call.call_id, user) if not call_audio: return None # # # convert audio # # write temp file # path = CommonService.write_temp_file(call_audio) # if not path: # return None # # call_audio.path = path # # # convert wav to mp3 # # call_audio_mp3 = CommonService.convert_to_mp3(call_audio) # if not call_audio_mp3: # return None call_audio_mp3 = call_audio # upload new file to Disk disk_service = DiskService(user.userprofile.token) result = disk_service.upload_file(call_audio_mp3) if not result.is_success: return None filename = call_audio_mp3.filename # delete mp3 file form filesystem and save to db CommonService.delete_temp_file(filename) try: call.record_filename = filename call.save() except Exception as e: logger = LogService() logger.error(Code.UPDATE_CALL_ERR, message=str(e), call_id=call.pk, filename=filename) return None return filename
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 group_stat_pbx(stat_pbx): """ Filter stat_pbx calls :param stat_pbx: List of calls :return: List of filtered calls """ result = [] key_date_val = None key_sip_val = None group = [] for s in stat_pbx: if not key_date_val: # init key_date_val key_date_val = s.date if not key_sip_val: # init key_sip_val key_sip_val = s.sip if (s.sip == key_sip_val and CommonService.is_dates_equals(key_date_val, s.date, True)) or not group: # add to group if values are equals group.append(s) else: result.append(group) # set current call as the first group item group = [s] # update key values key_date_val = s.date key_sip_val = s.sip if s == stat_pbx[-1] and group: # add last group result.append(group) return result
def get_subscribe_transacts(request, transact_type): """ Controller to get subscribe transacts partial :param request: HTTP request :return: HttpResponse instance """ order = '-creation_date' # TODO: refactor if transact_type == 'pending': transacts = [SubscribeTransactionVM(transact) for transact in SubscribeTransaction.objects.filter(status_id=1, is_archive=False).order_by(order)] template = 'pending_transacts.html' elif transact_type == 'archive': transacts = [SubscribeTransactionVM(transact) for transact in SubscribeTransaction.objects.filter(is_archive=True).order_by(order)] template = 'archive_transacts.html' elif transact_type == 'history': transacts = [SubscribeTransactionVM(transact) for transact in SubscribeTransaction.objects.filter().order_by(order)] template = 'history_transacts.html' else: return HttpResponse(status=400) page_number = request.GET.get('page') pager_data = CommonService.define_page(transacts, page_number, data_field_name='transacts') pager_data['transact_type'] = transact_type return render_to_response(template, pager_data, context_instance=RequestContext(request))
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 request_callback(request): """ Request the callback :param request: HTTP request :return: HttpResponse instance """ from_number = CommonService.reduce_number( request.GET.get('cbFromNumber') or request.user.userprofile.sip) to_number = CommonService.reduce_number(request.GET.get('cbToNumber')) result = PBXDataService.request_callback(request.user, from_number, to_number) if result: return HttpResponse(status=200, content=result) return HttpResponse(status=500)
def group_stat_pbx(stat_pbx): """ Filter stat_pbx calls :param stat_pbx: List of calls :return: List of filtered calls """ result = [] key_date_val = None key_sip_val = None group = [] for s in stat_pbx: if not key_date_val: # init key_date_val key_date_val = s.date if not key_sip_val: # init key_sip_val key_sip_val = s.sip if (s.sip == key_sip_val and CommonService.is_dates_equals( key_date_val, s.date, True)) or not group: # add to group if values are equals group.append(s) else: result.append(group) # set current call as the first group item group = [s] # update key values key_date_val = s.date key_sip_val = s.sip if s == stat_pbx[-1] and group: # add last group result.append(group) return result
def extend_subscription(user_profile, duration): """ Extend profile subscription :param user: User instance :param duration: {int} duration in month :return: """ user_profile = UserProfile.objects.get(pk=user_profile.pk) if user_profile.date_subscribe_ended and user_profile.date_subscribe_ended.replace(tzinfo=pytz.utc).replace(tzinfo=None) > datetime.datetime.now(tz=pytz.timezone(pytz.country_timezones['RU'][1])).replace(tzinfo=None): new_date = CommonService.add_months(user_profile.date_subscribe_ended, duration) else: new_date = CommonService.add_months(datetime.datetime.now(), duration) user_profile.date_subscribe_ended = new_date user_profile.save()
def login(request, template): """ Controller to show login page :param request: HTTP GET request :param template: html template :return: HttpResponse """ redirect_property_name = 'redirect_url' if request.method == 'POST': result = AuthService().sign_in(request) if not result.is_success: data = [{ key: LocalizeService(value[0]).get_localized_value() } for key, value in result.data.iteritems()] logger.warning(Code.INVLOG, data=data, POST=request.POST, path=request.path) return JsonResponse(CommonService.parse_form_errors(data), status=400) redirect_url = request.POST.get(redirect_property_name) return JsonResponse({redirect_property_name: redirect_url}) redirect_url = request.GET.get('next') if request.GET.get('next') else '/' return render_to_response(template, {redirect_property_name: redirect_url}, context_instance=RequestContext(request))
def get_pbx_sip(user): """ Get sip number :param user: user :return: sip """ method = settings.API_URLS['api']['sip'] # WARNING: Creates ApiParams with {start} and {end} params. Needs to be refactored params = ApiParams() url = params.get_request_string(method) response = requests.get( url, headers={ 'Authorization': '%s:%s' % (user.userprofile.user_key, CommonService.get_sign(params, method, params.api_version, user.userprofile.secret_key)) }) content = response.content if response.ok: sips = json.loads(content)['sips'] sip = int( filter(lambda s: s['display_name'] == 'SIP', sips)[0]['id']) return sip logger = LogService() logger.error(Code.SIP_GETTING_ERR, data=json.loads(content), status_code=response.status_code) return None
def get_pbx_account_balance(user): """ Get current user account balance :param user: user instance :return: {float} current balance """ host = settings.API_URLS['api']['host'] api_version = settings.API_URLS['api']['api_version'] method = settings.API_URLS['api']['balance'] url = '{host}{api_version}{method}'.format(host=host, api_version=api_version, method=method) response = requests.get( url, headers={ 'Authorization': '%s:%s' % (user.userprofile.user_key, CommonService.get_sign({}, method, api_version, user.userprofile.secret_key)) }) content = response.content if response.ok: return json.loads(content)['balance'] logger = LogService() logger.error(Code.GET_BALANCE_ERR, data=json.loads(content), status_code=response.status_code) return None
def get_call_cost(user, to): """ Get the cost of the call :param to: target phone number :return: """ method = settings.API_URLS['api']['call_cost'] # WARNING: Creates ApiParams with {start} and {end} params. Needs to be refactored params = ApiParams({'number': to}) url = params.get_request_string(method) response = requests.get( url, headers={ 'Authorization': '%s:%s' % (user.userprofile.user_key, CommonService.get_sign(params, method, params.api_version, user.userprofile.secret_key)) }) content = response.content if response.ok: return json.loads(content)['info'] logger = LogService() logger.error(Code.GET_CALL_COST_ERR, data=json.loads(content), status_code=response.status_code) return None
def generate_password(request): """ Generate random password :param request: HTTP request :return: dict with 'password' key """ return JsonResponse({'password': CommonService.get_random_string(10)})
def get_transact_id(request): """ Get transact id :param request: HTTP request :return: guid """ return JsonResponse({'id': CommonService.get_guid()})
def generate_mailbox_data(): """ Generate new mailbox data :return: ServiceResponse: {'login': <login>, 'password': <password>} """ login = CommonService.get_random_string(6, only_digits=True) password = ApiService.generate_email_password(login) return ServiceResponse(True, {'login': '******' % (login, settings.DOMAIN), 'password': password})
def confirm(self, **kwargs): """ Execute confirm transaction :return: transact """ self.__transact.status_id = 2 self.__transact.expiration_date = CommonService.add_months(datetime.datetime.now(), self.__transact.duration) return self.__save(self.__extend_subscription)
def load_call_record_file(call, user): """ Load audio, convert, upload to disk and update db with filename :param call: Call instance :param user: current user :return: File instance """ # get audio call_audio = PBXDataService.get_audio(call.call_id, user) if not call_audio: return None # # # convert audio # # write temp file # path = CommonService.write_temp_file(call_audio) # if not path: # return None # # call_audio.path = path # # # convert wav to mp3 # # call_audio_mp3 = CommonService.convert_to_mp3(call_audio) # if not call_audio_mp3: # return None call_audio_mp3 = call_audio # upload new file to Disk disk_service = DiskService(user.userprofile.token) result = disk_service.upload_file(call_audio_mp3) if not result.is_success: return None filename = call_audio_mp3.filename # delete mp3 file form filesystem and save to db CommonService.delete_temp_file(filename) try: call.record_filename = filename call.save() except Exception as e: logger = LogService() logger.error(Code.UPDATE_CALL_ERR, message=str(e), call_id=call.pk, filename=filename) return None return filename
def __init__(self): self.__receiver = settings.W_NUMBER self.__form_comment = 'from comments' self.__short_dest = 'form comments' self.__quickpay_form = 'shop' self.__targets = 'targets' self.__sum = 500 self.__payment_type = 'PC' self.__label = CommonService.get_guid()
def confirm(self, **kwargs): """ Execute confirm transaction :return: transact """ self.__transact.status_id = 2 self.__transact.expiration_date = CommonService.add_months( datetime.datetime.now(), self.__transact.duration) return self.__save(self.__extend_subscription)
def __init__(self): self.__receiver = settings.W_NUMBER self.__form_comment = 'from comments' self.__short_dest = 'form comments' self.__quickpay_form = 'shop' self.__targets = 'targets' self.__sum = 500 self.__payment_type = 'PC' self.__label = CommonService.get_guid()
def generate_mailbox_data(): """ Generate new mailbox data :return: ServiceResponse: {'login': <login>, 'password': <password>} """ login = CommonService.get_random_string(6, only_digits=True) password = ApiService.generate_email_password(login) return ServiceResponse(True, { 'login': '******' % (login, settings.DOMAIN), 'password': password })
def find_in_pbx_typed(common_call, pbx_typed, with_seconds=True): """ Find suitable call in pbx_typed by date :param common_call: :param pbx_typed: :return: """ calls = filter(lambda x: CommonService.is_dates_equals(x.date, common_call.date, with_seconds), pbx_typed) if len(calls) == 1: return calls[0] return None
def test_is_dates_equals(self): """ Test for is_dates_equals """ date = datetime.datetime(2015, 10, 30, 20, 0, 0) # Dates are the same date2 = datetime.datetime(2015, 10, 30, 20, 0, 0) self.assertEquals(CommonService.is_dates_equals(date, date2, False), True) # The first date is less in 1 min date3 = datetime.datetime(2015, 10, 30, 20, 1, 0) self.assertEquals(CommonService.is_dates_equals(date, date3, False), True) # The first date is less in 2 min date4 = datetime.datetime(2015, 10, 30, 20, 2, 0) self.assertEquals(CommonService.is_dates_equals(date, date4, False), False) # The first date is less in 1 hour date5 = datetime.datetime(2015, 10, 30, 21, 0, 0) self.assertEquals(CommonService.is_dates_equals(date, date5, False), False) # Comparison with seconds date6 = datetime.datetime(2015, 10, 30, 20, 0, 3) self.assertEquals(CommonService.is_dates_equals(date, date6, True), True) # Comparison with seconds date7 = datetime.datetime(2015, 10, 30, 20, 0, 4) self.assertEquals(CommonService.is_dates_equals(date, date7, True), False)
def test_is_dates_equals(self): """ Test for is_dates_equals """ date = datetime.datetime(2015, 10, 30, 20, 0, 0) # Dates are the same date2 = datetime.datetime(2015, 10, 30, 20, 0, 0) self.assertEquals(CommonService.is_dates_equals(date, date2, False), True) # The first date is less in 1 min date3 = datetime.datetime(2015, 10, 30, 20, 1, 0) self.assertEquals(CommonService.is_dates_equals(date, date3, False), True) # The first date is less in 2 min date4 = datetime.datetime(2015, 10, 30, 20, 2, 0) self.assertEquals(CommonService.is_dates_equals(date, date4, False), False) # The first date is less in 1 hour date5 = datetime.datetime(2015, 10, 30, 21, 0, 0) self.assertEquals(CommonService.is_dates_equals(date, date5, False), False) # Comparison with seconds date6 = datetime.datetime(2015, 10, 30, 20, 0, 3) self.assertEquals(CommonService.is_dates_equals(date, date6, True), True) # Comparison with seconds date7 = datetime.datetime(2015, 10, 30, 20, 0, 4) self.assertEquals(CommonService.is_dates_equals(date, date7, True), False)
def find_in_pbx_typed(common_call, pbx_typed, with_seconds=True): """ Find suitable call in pbx_typed by date :param common_call: :param pbx_typed: :return: """ calls = filter( lambda x: CommonService.is_dates_equals(x.date, common_call.date, with_seconds), pbx_typed) if len(calls) == 1: return calls[0] return None
def login(request, template): """ Controller to show login page :param request: HTTP GET request :param template: html template :return: HttpResponse """ redirect_property_name = 'redirect_url' if request.method == 'POST': result = AuthService().sign_in(request) if not result.is_success: data = [{key: LocalizeService(value[0]).get_localized_value()} for key, value in result.data.iteritems()] logger.warning(Code.INVLOG, data=data, POST=request.POST, path=request.path) return JsonResponse(CommonService.parse_form_errors(data), status=400) redirect_url = request.POST.get(redirect_property_name) return JsonResponse({redirect_property_name: redirect_url}) redirect_url = request.GET.get('next') if request.GET.get('next') else '/' return render_to_response(template, {redirect_property_name: redirect_url}, context_instance=RequestContext(request))
def get_call_cost(request): """ Request to the api to get call cost by target phone number :param request: HTTP request :return: HttpResponse Instance """ to = request.GET.get('n') if not to: return HttpResponse(status=400) if len(to) < 6: return JsonResponse({'phone': to, 'notAvalible': True}) result = PBXDataService.get_call_cost(request.user, CommonService.reduce_number(to)) if result: result['phone'] = to return JsonResponse(result) return HttpResponse(status=500)
def get_call_cost(request): """ Request to the api to get call cost by target phone number :param request: HTTP request :return: HttpResponse Instance """ to = request.GET.get('n') if not to: return HttpResponse(status=400) if len(to) < 6: return JsonResponse({'phone': to, 'notAvalible': True}) result = PBXDataService.get_call_cost(request.user, CommonService.reduce_number(to)) if result: result['phone'] = to return JsonResponse(result) return HttpResponse(status=500)
def get_pr_transacts(request, transact_type): """ Controller to get profile request transacts partial :param request: HTTP request :return: HttpResponse instance """ order = '-creation_date' if transact_type == 'pending': transacts = [ProfileRequestTransactionVM(transact) for transact in ProfileRequestTransaction.objects.filter(status_id=1).order_by(order)] template = 'pending_pr_transacts.html' elif transact_type == 'history': transacts = [ProfileRequestTransactionVM(transact) for transact in ProfileRequestTransaction.objects.filter().order_by(order)] template = 'history_pr_transacts.html' else: return HttpResponse(status=400) page_number = request.GET.get('page') pager_data = CommonService.define_page(transacts, page_number, data_field_name='transacts') pager_data['transact_type'] = transact_type return render_to_response(template, pager_data, context_instance=RequestContext(request))
def get_common_stat(params, user): """ Get statistics from api :param params: ApiParameters instance :param user: User instance :return: json type """ method = settings.API_URLS['api']['common_stat'] api_response = requests.get( params.get_request_string(method), headers={ 'Authorization': '%s:%s' % (user.userprofile.user_key, CommonService.get_sign(params, method, params.api_version, user.userprofile.secret_key)) }) if api_response.ok: return ServiceResponse( api_response.ok, [Call(s) for s in json.loads(api_response.content)['stats']]) return ServiceResponse(api_response.ok, status_code=api_response.status_code)
def request_callback(user, from_number, to_number): """ Request the callback :param user: user instance :param form: prom number :param to: to number :return: """ method = settings.API_URLS['api']['request_callback'] # WARNING: Creates ApiParams with {start} and {end} params. Needs to be refactored params = ApiParams({'from': from_number, 'to': to_number}) url = params.get_request_string(method) response = requests.get( url, headers={ 'Authorization': '%s:%s' % (user.userprofile.user_key, CommonService.get_sign(params, method, params.api_version, user.userprofile.secret_key)) }) content = response.content if response.ok: callback = DBService.register_callback(user.userprofile, from_number, to_number) if callback: return json.loads(content) logger = LogService() logger.error(Code.REQUEST_CALLBACK_ERR, data=json.loads(content), status_code=response.status_code) return None
def get_pbx_stat(params, user): """ Get ats statistics from api :param params: CallParameters instance :param user: User instance :return: json type """ method = settings.API_URLS['api']['pbx_stat'] api_response = requests.get(params.get_request_string(method), headers={'Authorization': '%s:%s' % (user.userprofile.user_key, CommonService.get_sign(params, method, params.api_version, user.userprofile.secret_key))}) if api_response.ok: return ServiceResponse(api_response.ok, [CallPBX(s) for s in json.loads(api_response.content)['stats']]) return ServiceResponse(api_response.ok, status_code=api_response.status_code)
def get_pbx_account_balance(user): """ Get current user account balance :param user: user instance :return: {float} current balance """ host = settings.API_URLS['api']['host'] api_version = settings.API_URLS['api']['api_version'] method = settings.API_URLS['api']['balance'] url = '{host}{api_version}{method}'.format(host=host, api_version=api_version, method=method) response = requests.get(url, headers={'Authorization': '%s:%s' % (user.userprofile.user_key, CommonService.get_sign({}, method, api_version, user.userprofile.secret_key))}) content = response.content if response.ok: return json.loads(content)['balance'] logger = LogService() logger.error(Code.GET_BALANCE_ERR, data=json.loads(content), status_code=response.status_code) return None
def get_request_string(self, method): """ Generate full request string from parameters :return: request string """ return '%s%s' % (self.__get_domain_url(method), CommonService.get_params_string(self.__params))
def request_callback(user, from_number, to_number): """ Request the callback :param user: user instance :param form: prom number :param to: to number :return: """ method = settings.API_URLS['api']['request_callback'] # WARNING: Creates ApiParams with {start} and {end} params. Needs to be refactored params = ApiParams({'from': from_number, 'to': to_number}) url = params.get_request_string(method) response = requests.get(url, headers={'Authorization': '%s:%s' % (user.userprofile.user_key, CommonService.get_sign(params, method, params.api_version, user.userprofile.secret_key))}) content = response.content if response.ok: callback = DBService.register_callback(user.userprofile, from_number, to_number) if callback: return json.loads(content) logger = LogService() logger.error(Code.REQUEST_CALLBACK_ERR, data=json.loads(content), status_code=response.status_code) return None
def get_pbx_sip(user): """ Get sip number :param user: user :return: sip """ method = settings.API_URLS['api']['sip'] # WARNING: Creates ApiParams with {start} and {end} params. Needs to be refactored params = ApiParams() url = params.get_request_string(method) response = requests.get(url, headers={'Authorization': '%s:%s' % (user.userprofile.user_key, CommonService.get_sign(params, method, params.api_version, user.userprofile.secret_key))}) content = response.content if response.ok: sips = json.loads(content)['sips'] sip = int(filter(lambda s: s['display_name'] == 'SIP', sips)[0]['id']) return sip logger = LogService() logger.error(Code.SIP_GETTING_ERR, data=json.loads(content), status_code=response.status_code) return None
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 get_call_cost(user, to): """ Get the cost of the call :param to: target phone number :return: """ method = settings.API_URLS['api']['call_cost'] # WARNING: Creates ApiParams with {start} and {end} params. Needs to be refactored params = ApiParams({'number': to}) url = params.get_request_string(method) response = requests.get(url, headers={'Authorization': '%s:%s' % (user.userprofile.user_key, CommonService.get_sign(params, method, params.api_version, user.userprofile.secret_key))}) content = response.content if response.ok: return json.loads(content)['info'] logger = LogService() logger.error(Code.GET_CALL_COST_ERR, data=json.loads(content), status_code=response.status_code) return None
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