From 7607d9c94c7d449b818dc8a6a306b64bcb20befb Mon Sep 17 00:00:00 2001 From: piyush-kr Date: Fri, 23 Jun 2017 22:31:38 +0530 Subject: [PATCH 1/3] subsriber status and activation report --- cloud/endagaweb/stats_app/stats_client.py | 27 ++++- cloud/endagaweb/stats_app/views.py | 8 +- .../endagaweb/templates/dashboard/layout.html | 3 +- .../templates/dashboard/report/filter.html | 75 +++++++++++++ .../templates/dashboard/report/header.html | 19 ++++ .../templates/dashboard/report/nav.html | 18 ++++ .../dashboard/report/subscriber.html | 100 ++++++++++++++++++ cloud/endagaweb/urls.py | 9 ++ cloud/endagaweb/views/__init__.py | 1 + 9 files changed, 257 insertions(+), 3 deletions(-) create mode 100644 cloud/endagaweb/templates/dashboard/report/filter.html create mode 100644 cloud/endagaweb/templates/dashboard/report/header.html create mode 100644 cloud/endagaweb/templates/dashboard/report/nav.html create mode 100644 cloud/endagaweb/templates/dashboard/report/subscriber.html diff --git a/cloud/endagaweb/stats_app/stats_client.py b/cloud/endagaweb/stats_app/stats_client.py index 5ebe043f..13f96bcd 100644 --- a/cloud/endagaweb/stats_app/stats_client.py +++ b/cloud/endagaweb/stats_app/stats_client.py @@ -25,7 +25,10 @@ SMS_KINDS = [ 'local_sms', 'local_recv_sms', 'outside_sms', 'incoming_sms', 'free_sms', 'error_sms'] -USAGE_EVENT_KINDS = CALL_KINDS + SMS_KINDS + ['gprs'] +SUBSCRIBER_KINDS = ['provisioned', 'deprovisioned'] +ZERO_BALANCE_SUBSCRIBER = ['zero_balance_subscriber'] +INACTIVE_SUBSCRIBER = ['expired', 'first_expired', 'blocked'] +USAGE_EVENT_KINDS = CALL_KINDS + SMS_KINDS + ['gprs'] + SUBSCRIBER_KINDS TIMESERIES_STAT_KEYS = [ 'ccch_sdcch4_load', 'tch_f_max', 'tch_f_load', 'sdcch8_max', 'tch_f_pdch_load', 'tch_f_pdch_max', 'tch_h_load', 'tch_h_max', 'sdcch8_load', 'ccch_sdcch4_max', 'sdcch_load', 'sdcch_available', 'tchf_load', 'tchf_available', @@ -114,6 +117,14 @@ def aggregate_timeseries(self, param, **kwargs): elif param in TIMESERIES_STAT_KEYS: objects = models.TimeseriesStat.objects filters = Q(key=param) + elif param in ZERO_BALANCE_SUBSCRIBER: + objects = models.UsageEvent.objects + filters = Q(oldamt__gt=0, newamt__lte=0) + elif param in INACTIVE_SUBSCRIBER: + aggregation = 'valid_through' + objects = models.Subscriber.objects + filters = Q(state=param) + # Filter by infrastructure level. if self.level == 'tower': filters = filters & Q(bts__id=self.level_id) @@ -136,6 +147,8 @@ def aggregate_timeseries(self, param, **kwargs): elif aggregation == 'average_value': queryset_stats = qsstats.QuerySetStats( queryset, 'date', aggregate=aggregates.Avg('value')) + elif aggregation == 'valid_through': + queryset_stats = qsstats.QuerySetStats(queryset, 'valid_through') else: queryset_stats = qsstats.QuerySetStats(queryset, 'date') timeseries = queryset_stats.time_series(start, end, interval=interval) @@ -369,3 +382,15 @@ def timeseries(self, key=None, **kwargs): if 'aggregation' not in kwargs: kwargs['aggregation'] = 'average_value' return self.aggregate_timeseries(key, **kwargs) + +class SubscriberStatsClient(StatsClientBase): + """Gathers data on SubscriberStats instance at tower and network level""" + + def __init__(self, *args, **kwargs): + super(SubscriberStatsClient, self).__init__(*args, **kwargs) + + def timeseries(self, key=None, **kwargs): + if 'aggregation' not in kwargs: + kwargs['aggregation'] = 'average_value' + return self.aggregate_timeseries(key, **kwargs) + diff --git a/cloud/endagaweb/stats_app/views.py b/cloud/endagaweb/stats_app/views.py index df6c88df..d1af604e 100644 --- a/cloud/endagaweb/stats_app/views.py +++ b/cloud/endagaweb/stats_app/views.py @@ -26,7 +26,11 @@ CALL_KINDS = stats_client.CALL_KINDS + ['call'] GPRS_KINDS = ['total_data', 'uploaded_data', 'downloaded_data'] TIMESERIES_STAT_KEYS = stats_client.TIMESERIES_STAT_KEYS -VALID_STATS = SMS_KINDS + CALL_KINDS + GPRS_KINDS + TIMESERIES_STAT_KEYS +SUBSCRIBER_KINDS = stats_client.SUBSCRIBER_KINDS + \ + stats_client.ZERO_BALANCE_SUBSCRIBER + \ + stats_client.INACTIVE_SUBSCRIBER +VALID_STATS = SMS_KINDS + CALL_KINDS + GPRS_KINDS + TIMESERIES_STAT_KEYS + \ + SUBSCRIBER_KINDS # Set valid intervals. INTERVALS = ['years', 'months', 'weeks', 'days', 'hours', 'minutes'] # Set valid aggregation types. @@ -135,6 +139,8 @@ def get(self, request, infrastructure_level): client_type = stats_client.GPRSStatsClient elif stat_type in TIMESERIES_STAT_KEYS: client_type = stats_client.TimeseriesStatsClient + elif stat_type in SUBSCRIBER_KINDS: + client_type = stats_client.SubscriberStatsClient # Instantiate the client at an infrastructure level. if infrastructure_level == 'global': client = client_type('global') diff --git a/cloud/endagaweb/templates/dashboard/layout.html b/cloud/endagaweb/templates/dashboard/layout.html index c4567a7f..f5705d6d 100644 --- a/cloud/endagaweb/templates/dashboard/layout.html +++ b/cloud/endagaweb/templates/dashboard/layout.html @@ -23,7 +23,7 @@ - + {% block pagestyle %} @@ -74,6 +74,7 @@
  • Towers
  • Subscribers
  • Network
  • +
  • Reports