Example #1
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
	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
Example #3
0
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))
Example #4
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
Example #5
0
    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