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), '')
Esempio n. 3
0
    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))
Esempio n. 4
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), '')
Esempio n. 5
0
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)
Esempio n. 6
0
    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
Esempio n. 7
0
	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
Esempio n. 8
0
	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
Esempio n. 9
0
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))
Esempio n. 10
0
    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
Esempio n. 11
0
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)
Esempio n. 12
0
    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
Esempio n. 13
0
	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()
Esempio n. 14
0
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))
Esempio n. 15
0
    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
Esempio n. 16
0
    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
Esempio n. 17
0
    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
Esempio n. 18
0
def generate_password(request):
	"""
	Generate random password
	:param request: HTTP request
	:return: dict with 'password' key
	"""
	return JsonResponse({'password': CommonService.get_random_string(10)})
Esempio n. 19
0
def get_transact_id(request):
	"""
	Get transact id
	:param request: HTTP request
	:return: guid
	"""
	return JsonResponse({'id': CommonService.get_guid()})
Esempio n. 20
0
	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)
Esempio n. 22
0
	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
Esempio n. 23
0
	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()
Esempio n. 24
0
    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)
Esempio n. 25
0
 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()
Esempio n. 26
0
    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
        })
Esempio n. 27
0
	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)
Esempio n. 29
0
    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)
Esempio n. 30
0
    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
Esempio n. 31
0
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))
Esempio n. 32
0
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)
Esempio n. 33
0
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)
Esempio n. 34
0
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))
Esempio n. 35
0
    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)
Esempio n. 36
0
    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
Esempio n. 37
0
	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)
Esempio n. 38
0
	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
Esempio n. 39
0
	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))
Esempio n. 40
0
	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
Esempio n. 41
0
	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
Esempio n. 42
0
    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
Esempio n. 43
0
	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
Esempio n. 44
0
	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