def cdr_overview(request): """CDR graph by hourly/daily/monthly basis **Attributes**: * ``template`` - cdr/overview.html * ``form`` - CdrOverviewForm **Logic Description**: Get Call records from Postgresql table and build all monthly, daily, hourly analytics """ # initialize variables hourly_charttype = "lineWithFocusChart" daily_charttype = "lineWithFocusChart" hourly_chartdata = {'x': []} daily_chartdata = {'x': []} metric = 'nbcalls' # Default metric action = 'tabs-1' tday = datetime.today() switch_id = 0 # assign initial value in form fields form = CdrOverviewForm(request.POST or None, initial={'from_date': tday.strftime('%Y-%m-%d 00:00'), 'to_date': tday.strftime('%Y-%m-%d 23:55'), 'switch_id': switch_id}) start_date = trunc_date_start(tday) end_date = trunc_date_end(tday) if form.is_valid(): from_date = getvar(request, 'from_date') to_date = getvar(request, 'to_date') start_date = trunc_date_start(from_date) end_date = trunc_date_end(to_date) switch_id = getvar(request, 'switch_id') metric = getvar(request, 'metric') # get the number of hour that diff the date delta = end_date - start_date hour_diff = abs(divmod(delta.days * 86400 + delta.seconds, 60)[0]) / 60 if hour_diff <= 72: display_chart = 'hourly' else: display_chart = 'daily' # check metric is valid if metric not in ['nbcalls', 'duration', 'billsec', 'buy_cost', 'sell_cost']: metric = 'nbcalls' extra_serie = { "tooltip": {"y_start": "", "y_end": " " + metric}, "date_format": "%d %b %y %H:%M%p" } if display_chart == 'hourly': hourly_data = get_report_cdr_per_switch(request.user, 'hour', start_date, end_date, switch_id) for switch in hourly_data[metric]["columns"]: hourly_chartdata['x'] = hourly_data[metric]["x_timestamp"] hourly_chartdata['name' + str(switch)] = get_switch_ip_addr(switch) hourly_chartdata['y' + str(switch)] = hourly_data[metric]["values"][str(switch)] hourly_chartdata['extra' + str(switch)] = extra_serie total_calls = hourly_data["nbcalls"]["total"] total_duration = hourly_data["duration"]["total"] total_billsec = hourly_data["billsec"]["total"] total_buy_cost = hourly_data["buy_cost"]["total"] total_sell_cost = hourly_data["sell_cost"]["total"] elif display_chart == 'daily': daily_data = get_report_cdr_per_switch(request.user, 'day', start_date, end_date, switch_id) for switch in daily_data[metric]["columns"]: daily_chartdata['x'] = daily_data[metric]["x_timestamp"] daily_chartdata['name' + str(switch)] = get_switch_ip_addr(switch) daily_chartdata['y' + str(switch)] = daily_data[metric]["values"][str(switch)] daily_chartdata['extra' + str(switch)] = extra_serie total_calls = daily_data["nbcalls"]["total"] total_duration = daily_data["duration"]["total"] total_billsec = daily_data["billsec"]["total"] total_buy_cost = daily_data["buy_cost"]["total"] total_sell_cost = daily_data["sell_cost"]["total"] # Calculate the Average Time of Call metric_aggr = calculate_act_acd(total_calls, total_duration) # Get top 10 of country calls country_data = custom_sql_aggr_top_country(request.user, switch_id, 10, start_date, end_date) variables = { 'action': action, 'form': form, 'display_chart': display_chart, 'start_date': start_date, 'end_date': end_date, 'metric': metric, 'hourly_chartdata': hourly_chartdata, 'hourly_charttype': hourly_charttype, 'hourly_chartcontainer': 'hourly_container', 'hourly_extra': { 'x_is_date': True, 'x_axis_format': '%d %b %y %H%p', 'tag_script_js': True, 'jquery_on_ready': True, }, 'daily_chartdata': daily_chartdata, 'daily_charttype': daily_charttype, 'daily_chartcontainer': 'daily_container', 'daily_extra': { 'x_is_date': True, 'x_axis_format': '%d %b %Y', 'tag_script_js': True, 'jquery_on_ready': True, }, 'total_calls': total_calls, 'total_duration': total_duration, 'total_billsec': total_billsec, 'total_buy_cost': total_buy_cost, 'total_sell_cost': total_sell_cost, 'metric_aggr': metric_aggr, 'country_data': country_data, } return render_to_response('cdr/overview.html', variables, context_instance=RequestContext(request))
def run_alarm(alarm_obj, logger): """ Perform Alarm Check """ running_alarm_test_data = { 'running_alarm_status': True, 'current_value': None, 'previous_value': None, } user = False switch_id = 0 if alarm_obj.type == ALARM_TYPE.ALOC: # ALOC (average length of call) logger.debug('ALOC (Average Length Of Call)') # return start and end date of previous/current day date_dict = get_start_end_date(alarm_obj.alert_condition_add_on) # Previous date data start_date = date_dict['p_start_date'] end_date = date_dict['p_end_date'] daily_data = get_report_cdr_per_switch(user, 'day', start_date, end_date, switch_id) total_calls = daily_data["nbcalls"]["total"] total_duration = daily_data["duration"]["total"] ACD = math.floor(total_duration / total_calls) if alarm_obj.alert_condition == ALERT_CONDITION.IS_LESS_THAN or \ alarm_obj.alert_condition == ALERT_CONDITION.IS_GREATER_THAN: running_alarm_test_data['previous_value'] = ACD chk_alert_value(alarm_obj, ACD) else: previous_date_duration = ACD # Current date data start_date = date_dict['c_start_date'] end_date = date_dict['c_end_date'] daily_data = get_report_cdr_per_switch(user, 'day', start_date, end_date, switch_id) total_calls = daily_data["nbcalls"]["total"] total_duration = daily_data["duration"]["total"] ACD = math.floor(total_duration / total_calls) if alarm_obj.alert_condition == ALERT_CONDITION.IS_LESS_THAN or \ alarm_obj.alert_condition == ALERT_CONDITION.IS_GREATER_THAN: running_alarm_test_data['current_value'] = ACD chk_alert_value(alarm_obj, ACD) else: current_date_duration = ACD running_alarm_test_data['current_value'] = ACD running_alarm_test_data['previous_value'] = previous_date_duration chk_alert_value(alarm_obj, current_date_duration, previous_date_duration) elif alarm_obj.type == ALARM_TYPE.ASR: # ASR (Answer Seize Ratio) logger.debug('ASR (Answer Seize Ratio)') # return start and end date of previous/current day date_dict = get_start_end_date(alarm_obj.alert_condition_add_on) # hangup_cause_q850 - 16 - NORMAL_CLEARING hangup_cause_q850 = 16 # Previous date data start_date = date_dict['p_start_date'] end_date = date_dict['p_end_date'] limit = 10 hangup_cause_id = False # TODO: Regroup the 2 calls to custom_sql_aggr_top_hangup to get the hangup (hangup_cause_data, total_calls, total_duration, total_billsec, total_buy_cost, total_sell_cost) = \ custom_sql_aggr_top_hangup(user, switch_id, hangup_cause_id, limit, start_date, end_date) pre_total_record = total_calls hangup_cause_id = get_hangupcause_id(hangup_cause_q850) (hangup_cause_data, total_calls, total_duration, total_billsec, total_buy_cost, total_sell_cost) = \ custom_sql_aggr_top_hangup(user, switch_id, hangup_cause_id, limit, start_date, end_date) pre_total_answered_record = total_calls # pre_total_record should not be 0 pre_total_record = 1 if pre_total_record == 0 else pre_total_record previous_asr = pre_total_answered_record / pre_total_record if alarm_obj.alert_condition == ALERT_CONDITION.IS_LESS_THAN or \ alarm_obj.alert_condition == ALERT_CONDITION.IS_GREATER_THAN: running_alarm_test_data['previous_value'] = previous_asr chk_alert_value(alarm_obj, previous_asr) else: previous_asr = previous_asr # Current date data start_date = date_dict['c_start_date'] end_date = date_dict['c_end_date'] limit = 10 hangup_cause_id = False # TODO: Regroup the 2 calls to custom_sql_aggr_top_hangup to get the hangup (hangup_cause_data, total_calls, total_duration, total_billsec, total_buy_cost, total_sell_cost) = \ custom_sql_aggr_top_hangup(user, switch_id, hangup_cause_id, limit, start_date, end_date) cur_total_record = total_calls hangup_cause_id = get_hangupcause_id(hangup_cause_q850) (hangup_cause_data, total_calls, total_duration, total_billsec, total_buy_cost, total_sell_cost) = \ custom_sql_aggr_top_hangup(user, switch_id, hangup_cause_id, limit, start_date, end_date) cur_total_answered_record = total_calls # cur_total_record should not be 0 cur_total_record = 1 if cur_total_record == 0 else cur_total_record current_asr = cur_total_answered_record / cur_total_record if alarm_obj.alert_condition == ALERT_CONDITION.IS_LESS_THAN or \ alarm_obj.alert_condition == ALERT_CONDITION.IS_GREATER_THAN: running_alarm_test_data['current_value'] = current_asr chk_alert_value(alarm_obj, current_asr) else: running_alarm_test_data['current_value'] = current_asr running_alarm_test_data['previous_value'] = previous_asr chk_alert_value(alarm_obj, current_asr, previous_asr) return running_alarm_test_data
def billing_report(request): """CDR billing graph by daily basis **Attributes**: * ``template`` - voip_billing/billing_report.html * ``form`` - BillingReportForm **Logic Description**: Retrieve call records from PostgreSQL and build the daily billing analytics for given date range """ switch_id = 0 tday = datetime.today() total_data = [] charttype = "lineWithFocusChart" hourly_chartdata = {"x": []} form = BillingReportForm(request.POST or None, initial={'from_date': tday.strftime('%Y-%m-%d 00:00'), 'to_date': tday.strftime('%Y-%m-%d 23:55'), 'switch_id': switch_id}) start_date = trunc_date_start(tday) end_date = trunc_date_end(tday) if form.is_valid(): from_date = getvar(request, 'from_date') to_date = getvar(request, 'to_date') start_date = trunc_date_start(from_date) end_date = trunc_date_end(to_date) switch_id = getvar(request, 'switch_id') metrics = ['buy_cost', 'sell_cost'] hourly_data = get_report_cdr_per_switch(request.user, 'hour', start_date, end_date, switch_id) hourly_chartdata['x'] = hourly_data["nbcalls"]["x_timestamp"] i = 0 for metric in metrics: extra_serie = { "tooltip": {"y_start": "", "y_end": " " + metric}, "date_format": "%d %b %y %H:%M%p" } for switch in hourly_data[metric]["columns"]: i = i + 1 hourly_chartdata['name' + str(i)] = get_switch_ip_addr(switch) + "_" + metric hourly_chartdata['y' + str(i)] = hourly_data[metric]["values"][str(switch)] hourly_chartdata['extra' + str(i)] = extra_serie total_calls = hourly_data["nbcalls"]["total"] total_duration = hourly_data["duration"]["total"] total_billsec = hourly_data["billsec"]["total"] total_buy_cost = hourly_data["buy_cost"]["total"] total_sell_cost = hourly_data["sell_cost"]["total"] # Calculate the Average Time of Call metric_aggr = calculate_act_acd(total_calls, total_duration) # Get top 10 of country calls country_data = custom_sql_aggr_top_country(request.user, switch_id, 10, start_date, end_date) data = { 'form': form, 'total_data': total_data, 'start_date': start_date, 'end_date': end_date, 'charttype': charttype, 'chartdata': hourly_chartdata, 'chartcontainer': 'chart_container', 'extra': { 'x_is_date': True, 'x_axis_format': '%d %b %Y', 'tag_script_js': True, 'jquery_on_ready': True, }, 'total_calls': total_calls, 'total_duration': total_duration, 'total_billsec': total_billsec, 'total_buy_cost': total_buy_cost, 'total_sell_cost': total_sell_cost, 'metric_aggr': metric_aggr, 'country_data': country_data, } return render_to_response('voip_billing/billing_report.html', data, context_instance=RequestContext(request))
def billing_report(request): """CDR billing graph by daily basis **Attributes**: * ``template`` - voip_billing/billing_report.html * ``form`` - BillingReportForm **Logic Description**: Retrieve call records from PostgreSQL and build the daily billing analytics for given date range """ switch_id = 0 tday = datetime.today() total_data = [] charttype = "lineWithFocusChart" hourly_chartdata = {"x": []} form = BillingReportForm(request.POST or None, initial={ 'from_date': tday.strftime('%Y-%m-%d 00:00'), 'to_date': tday.strftime('%Y-%m-%d 23:55'), 'switch_id': switch_id }) start_date = trunc_date_start(tday) end_date = trunc_date_end(tday) if form.is_valid(): from_date = getvar(request, 'from_date') to_date = getvar(request, 'to_date') start_date = trunc_date_start(from_date) end_date = trunc_date_end(to_date) switch_id = getvar(request, 'switch_id') metrics = ['buy_cost', 'sell_cost'] hourly_data = get_report_cdr_per_switch(request.user, 'hour', start_date, end_date, switch_id) hourly_chartdata['x'] = hourly_data["nbcalls"]["x_timestamp"] i = 0 for metric in metrics: extra_serie = { "tooltip": { "y_start": "", "y_end": " " + metric }, "date_format": "%d %b %y %H:%M%p" } for switch in hourly_data[metric]["columns"]: i = i + 1 hourly_chartdata[ 'name' + str(i)] = get_switch_ip_addr(switch) + "_" + metric hourly_chartdata['y' + str(i)] = hourly_data[metric]["values"][str( switch)] hourly_chartdata['extra' + str(i)] = extra_serie total_calls = hourly_data["nbcalls"]["total"] total_duration = hourly_data["duration"]["total"] total_billsec = hourly_data["billsec"]["total"] total_buy_cost = hourly_data["buy_cost"]["total"] total_sell_cost = hourly_data["sell_cost"]["total"] # Calculate the Average Time of Call metric_aggr = calculate_act_acd(total_calls, total_duration) # Get top 10 of country calls country_data = custom_sql_aggr_top_country(request.user, switch_id, 10, start_date, end_date) data = { 'form': form, 'total_data': total_data, 'start_date': start_date, 'end_date': end_date, 'charttype': charttype, 'chartdata': hourly_chartdata, 'chartcontainer': 'chart_container', 'extra': { 'x_is_date': True, 'x_axis_format': '%d %b %Y', 'tag_script_js': True, 'jquery_on_ready': True, }, 'total_calls': total_calls, 'total_duration': total_duration, 'total_billsec': total_billsec, 'total_buy_cost': total_buy_cost, 'total_sell_cost': total_sell_cost, 'metric_aggr': metric_aggr, 'country_data': country_data, } return render_to_response('voip_billing/billing_report.html', data, context_instance=RequestContext(request))
def run_alarm(alarm_obj, logger): """ Perform Alarm Check """ running_alarm_test_data = {"running_alarm_status": True, "current_value": None, "previous_value": None} user = False switch_id = 0 if alarm_obj.type == ALARM_TYPE.ALOC: # ALOC (average length of call) logger.debug("ALOC (Average Length Of Call)") # return start and end date of previous/current day date_dict = get_start_end_date(alarm_obj.alert_condition_add_on) # Previous date data start_date = date_dict["p_start_date"] end_date = date_dict["p_end_date"] daily_data = get_report_cdr_per_switch(user, "day", start_date, end_date, switch_id) total_calls = daily_data["nbcalls"]["total"] total_duration = daily_data["duration"]["total"] ACD = math.floor(total_duration / total_calls) if ( alarm_obj.alert_condition == ALERT_CONDITION.IS_LESS_THAN or alarm_obj.alert_condition == ALERT_CONDITION.IS_GREATER_THAN ): running_alarm_test_data["previous_value"] = ACD chk_alert_value(alarm_obj, ACD) else: previous_date_duration = ACD # Current date data start_date = date_dict["c_start_date"] end_date = date_dict["c_end_date"] daily_data = get_report_cdr_per_switch(user, "day", start_date, end_date, switch_id) total_calls = daily_data["nbcalls"]["total"] total_duration = daily_data["duration"]["total"] ACD = math.floor(total_duration / total_calls) if ( alarm_obj.alert_condition == ALERT_CONDITION.IS_LESS_THAN or alarm_obj.alert_condition == ALERT_CONDITION.IS_GREATER_THAN ): running_alarm_test_data["current_value"] = ACD chk_alert_value(alarm_obj, ACD) else: current_date_duration = ACD running_alarm_test_data["current_value"] = ACD running_alarm_test_data["previous_value"] = previous_date_duration chk_alert_value(alarm_obj, current_date_duration, previous_date_duration) elif alarm_obj.type == ALARM_TYPE.ASR: # ASR (Answer Seize Ratio) logger.debug("ASR (Answer Seize Ratio)") # return start and end date of previous/current day date_dict = get_start_end_date(alarm_obj.alert_condition_add_on) # hangup_cause_q850 - 16 - NORMAL_CLEARING hangup_cause_q850 = 16 # Previous date data start_date = date_dict["p_start_date"] end_date = date_dict["p_end_date"] limit = 10 hangup_cause_id = False # TODO: Regroup the 2 calls to custom_sql_aggr_top_hangup to get the hangup ( hangup_cause_data, total_calls, total_duration, total_billsec, total_buy_cost, total_sell_cost, ) = custom_sql_aggr_top_hangup(user, switch_id, hangup_cause_id, limit, start_date, end_date) pre_total_record = total_calls hangup_cause_id = get_hangupcause_id(hangup_cause_q850) ( hangup_cause_data, total_calls, total_duration, total_billsec, total_buy_cost, total_sell_cost, ) = custom_sql_aggr_top_hangup(user, switch_id, hangup_cause_id, limit, start_date, end_date) pre_total_answered_record = total_calls # pre_total_record should not be 0 pre_total_record = 1 if pre_total_record == 0 else pre_total_record previous_asr = pre_total_answered_record / pre_total_record if ( alarm_obj.alert_condition == ALERT_CONDITION.IS_LESS_THAN or alarm_obj.alert_condition == ALERT_CONDITION.IS_GREATER_THAN ): running_alarm_test_data["previous_value"] = previous_asr chk_alert_value(alarm_obj, previous_asr) else: previous_asr = previous_asr # Current date data start_date = date_dict["c_start_date"] end_date = date_dict["c_end_date"] limit = 10 hangup_cause_id = False # TODO: Regroup the 2 calls to custom_sql_aggr_top_hangup to get the hangup ( hangup_cause_data, total_calls, total_duration, total_billsec, total_buy_cost, total_sell_cost, ) = custom_sql_aggr_top_hangup(user, switch_id, hangup_cause_id, limit, start_date, end_date) cur_total_record = total_calls hangup_cause_id = get_hangupcause_id(hangup_cause_q850) ( hangup_cause_data, total_calls, total_duration, total_billsec, total_buy_cost, total_sell_cost, ) = custom_sql_aggr_top_hangup(user, switch_id, hangup_cause_id, limit, start_date, end_date) cur_total_answered_record = total_calls # cur_total_record should not be 0 cur_total_record = 1 if cur_total_record == 0 else cur_total_record current_asr = cur_total_answered_record / cur_total_record if ( alarm_obj.alert_condition == ALERT_CONDITION.IS_LESS_THAN or alarm_obj.alert_condition == ALERT_CONDITION.IS_GREATER_THAN ): running_alarm_test_data["current_value"] = current_asr chk_alert_value(alarm_obj, current_asr) else: running_alarm_test_data["current_value"] = current_asr running_alarm_test_data["previous_value"] = previous_asr chk_alert_value(alarm_obj, current_asr, previous_asr) return running_alarm_test_data