Exemplo n.º 1
0
    def get_registrations(self, interval, days, graph_key, select_box_value):
        """ Returns an array with new users count per interval."""
        try:
            conf_data = DashboardStats.objects.get(graph_key=graph_key)
            model_name = apps.get_model(conf_data.model_app_name,
                                        conf_data.model_name)
            kwargs = {}
            for i in conf_data.criteria.all():
                # fixed mapping value passed info kwargs
                if i.criteria_fix_mapping:
                    for key in i.criteria_fix_mapping:
                        # value => i.criteria_fix_mapping[key]
                        kwargs[key] = i.criteria_fix_mapping[key]

                # dynamic mapping value passed info kwargs
                if i.dynamic_criteria_field_name and select_box_value:
                    kwargs[i.dynamic_criteria_field_name] = select_box_value

            aggregate = None
            if conf_data.type_operation_field_name and conf_data.operation_field_name:
                operation = {
                    'Count': Count(conf_data.operation_field_name),
                    'Sum': Sum(conf_data.operation_field_name),
                    'Avg': Avg(conf_data.operation_field_name),
                    'StdDev': StdDev(conf_data.operation_field_name),
                    'Max': Max(conf_data.operation_field_name),
                    'Min': Min(conf_data.operation_field_name),
                    'Variance': Variance(conf_data.operation_field_name),
                }
                aggregate = operation[conf_data.type_operation_field_name]

            stats = QuerySetStats(model_name.objects.filter(**kwargs),
                                  conf_data.date_field_name, aggregate)
            # stats = QuerySetStats(User.objects.filter(is_active=True), 'date_joined')
            today = now()
            if days == 24:
                begin = today - timedelta(hours=days - 1)
                return stats.time_series(begin, today + timedelta(hours=1),
                                         interval)

            begin = today - timedelta(days=days - 1)
            return stats.time_series(begin, today + timedelta(days=1),
                                     interval)
        except (LookupError, FieldError, TypeError) as e:
            self.error_message = str(e)
            User = get_user_model()
            stats = QuerySetStats(User.objects.filter(is_active=True),
                                  'date_joined')
            today = now()
            if days == 24:
                begin = today - timedelta(hours=days - 1)
                return stats.time_series(begin, today + timedelta(hours=1),
                                         interval)
            begin = today - timedelta(days=days - 1)
            return stats.time_series(begin, today + timedelta(days=1),
                                     interval)
Exemplo n.º 2
0
    def test_time_series_weeks(self):
        day = datetime.date(year=2013, month=4, day=5)

        u = User.objects.create_user('user', '*****@*****.**')
        u.date_joined = day
        u.save()

        qs = User.objects.all()
        qss = QuerySetStats(qs, 'date_joined')
        qss.time_series(day - datetime.timedelta(days=30), day, interval='weeks')
Exemplo n.º 3
0
    def test_time_series_weeks(self):
        day = datetime.date(year=2013, month=4, day=5)

        u = User.objects.create_user('user', '*****@*****.**')
        u.date_joined = day
        u.save()

        qs = User.objects.all()
        qss = QuerySetStats(qs, 'date_joined')
        qss.time_series(day - datetime.timedelta(days=30), day, interval='weeks')
Exemplo n.º 4
0
def graph(request):
    start = datetime.datetime(2013, 11, 21, 00, 00).date()
    end = datetime.datetime.now().date()
    users = User.objects.all()
    qsstats = QuerySetStats(users, date_field='last_login', aggregate=Count('id'))
    values = qsstats.time_series(start , end , interval='days' )

    staff = User.objects.all().filter(is_staff = '1').count()
    other = User.objects.all().count() - staff
    type_of_user = [['Суперпользователи',staff],['Пользователи',other]]
    start = datetime.datetime(2013, 12, 3, 00, 00).date()
    answer = Answer.objects.all()
    qsstats2 = QuerySetStats(answer, date_field='date', aggregate=Count('id'))
    ans = qsstats2.time_series(start,end, interval="days")
    return render(request,'graph.html', { 'ans':ans , 'users': values , 'type' : type_of_user })
Exemplo n.º 5
0
    def get_registrations(self, interval, days, graph_key, select_box_value):
        """ Returns an array with new users count per interval."""
        try:
            conf_data = DashboardStats.objects.get(graph_key=graph_key)
            model_name = get_model(conf_data.model_app_name, conf_data.model_name)
            kwargs = {}
            for i in conf_data.criteria.all():
                # fixed mapping value passed info kwargs
                if i.criteria_fix_mapping:
                    for key in i.criteria_fix_mapping:
                       # value => i.criteria_fix_mapping[key]
                        kwargs[key] = i.criteria_fix_mapping[key]

                # dynamic mapping value passed info kwargs
                if i.dynamic_criteria_field_name and select_box_value:
                    kwargs[i.dynamic_criteria_field_name] = select_box_value

            aggregate = None
            if conf_data.type_operation_field_name and conf_data.operation_field_name:
                operation={'Sum': Sum(conf_data.operation_field_name),
                        'Avg':Avg(conf_data.operation_field_name),
                        'StdDev':StdDev(conf_data.operation_field_name),
                        'Max':Max(conf_data.operation_field_name),
                        'Min':Min(conf_data.operation_field_name),
                        'Variance':Variance(conf_data.operation_field_name),
                        }
                aggregate=operation[conf_data.type_operation_field_name]

            stats = QuerySetStats(model_name.objects.filter(**kwargs),
                                      conf_data.date_field_name, aggregate)
            #stats = QuerySetStats(User.objects.filter(is_active=True), 'date_joined')
            today = now()
            if days == 24:
                begin = today - timedelta(hours=days - 1)
                return stats.time_series(begin, today + timedelta(hours=1), interval)

            begin = today - timedelta(days=days - 1)
            return stats.time_series(begin, today + timedelta(days=1), interval)
        except:
            User = get_user_model()
            stats = QuerySetStats(
                User.objects.filter(is_active=True), 'date_joined')
            today = now()
            if days == 24:
                begin = today - timedelta(hours=days - 1)
                return stats.time_series(begin, today + timedelta(hours=1), interval)
            begin = today - timedelta(days=days - 1)
            return stats.time_series(begin, today + timedelta(days=1), interval)
Exemplo n.º 6
0
def process_hourly_activity(user, start, end, modelclass):
    if modelclass == AdRecord:
        qs = modelclass.objects.filter(_user_id=user.id, date__range=(start, end))
    else:
        qs = modelclass.objects.filter(user=user, date__range=(start, end))
    if not qs:
        return {}
    qss = QuerySetStats(qs, 'date')
    start_date = start.date()
    end_date = end.date()
    if start_date == end_date:
        end_date = start_date + timedelta(days=1)
    timeseries = qss.time_series(
                        start_date, end=end_date, interval='hours', date_field='date')
    activities = {}
    for t in timeseries:
        if t[1]:
            d = t[0]
            activity = get_hourly_activity(user, start_date, d.hour)
            if modelclass == AdRecord:
                for r in qs.filter(date__hour=d.hour):
                    activity.adrecords.add(r)
            elif modelclass == FBSponsored:
                for r in qs.filter(date__hour=d.hour):
                    activity.fbsponsored.add(r)
            elif modelclass == FBAd:
                for r in qs.filter(date__hour=d.hour):
                    activity.fbads.add(r)
            activity.adtotal = activity.adrecords.count()
            activity.fbadtotal = activity.fbads.count()
            activity.fbsptotal = activity.fbsponsored.count()
            activity.save()
            activities[d] = activity    
    return activities
Exemplo n.º 7
0
def get_scan_per_day(start_date, end_date):
    scan_qsstats = QuerySetStats(
        Scan.objects.all(),
        date_field='start',
    )
    scan_values = scan_qsstats.time_series(start_date,
                                           end_date,
                                           interval='days')
    return format_date(scan_values)
Exemplo n.º 8
0
    def get_registrations(self, interval, days, graph_key, select_box_value):
        """ Returns an array with new users count per interval."""
        try:
            conf_data = DashboardStats.objects.get(graph_key=graph_key)
            model_name = get_model(conf_data.model_app_name,
                                   conf_data.model_name)
            kwargs = {}

            for i in conf_data.criteria.all():
                # fixed mapping value passed info kwargs
                if i.criteria_fix_mapping:
                    for key in i.criteria_fix_mapping:
                        # value => i.criteria_fix_mapping[key]
                        kwargs[key] = i.criteria_fix_mapping[key]

                # dynamic mapping value passed info kwargs
                if i.dynamic_criteria_field_name and select_box_value:
                    kwargs[i.dynamic_criteria_field_name] = select_box_value

            stats = QuerySetStats(model_name.objects.filter(**kwargs),
                                  conf_data.date_field_name)
            #stats = QuerySetStats(User.objects.filter(is_active=True), 'date_joined')
            today = now()
            if days == 24:
                begin = today - timedelta(hours=days - 1)
                return stats.time_series(begin, today + timedelta(hours=1),
                                         interval)

            begin = today - timedelta(days=days - 1)
            return stats.time_series(begin, today + timedelta(days=1),
                                     interval)
        except:
            User = get_user_model()
            stats = QuerySetStats(User.objects.filter(is_active=True),
                                  'date_joined')
            today = now()
            if days == 24:
                begin = today - timedelta(hours=days - 1)
                return stats.time_series(begin, today + timedelta(hours=1),
                                         interval)
            begin = today - timedelta(days=days - 1)
            return stats.time_series(begin, today + timedelta(days=1),
                                     interval)
Exemplo n.º 9
0
 def assertTimeSeriesWorks(self, today):
     seven_days_ago = today - datetime.timedelta(days=7)
     for j in range(1,8):
         for i in range(0,j):
             u = User.objects.create_user('p-%s-%s' % (j, i), '*****@*****.**' % (j, i))
             u.date_joined = today - datetime.timedelta(days=i)
             u.save()
     qs = User.objects.all()
     qss = QuerySetStats(qs, 'date_joined')
     time_series = qss.time_series(seven_days_ago, today)
     self.assertEqual([t[1] for t in time_series], [0, 1, 2, 3, 4, 5, 6, 7])
Exemplo n.º 10
0
def test(request):
    """Just test page."""
    template_name = 'runstat/test.html'
    #
    start_date = datetime.strptime('2016-05-01', '%Y-%m-%d').date()
    end_date = datetime.strptime('2016-05-31', '%Y-%m-%d').date()
    qs = GroupPost.objects.all()
    qss = QuerySetStats(qs, date_field='created_time')
    values = qss.time_series(start_date, end_date, interval='days')

    return render(request, template_name, {'values': values})
Exemplo n.º 11
0
 def assertTimeSeriesWorks(self, today):
     seven_days_ago = today - datetime.timedelta(days=7)
     for j in range(1,8):
         for i in range(0,j):
             u = User.objects.create_user('p-%s-%s' % (j, i), '*****@*****.**' % (j, i))
             u.date_joined = today - datetime.timedelta(days=i)
             u.save()
     qs = User.objects.all()
     qss = QuerySetStats(qs, 'date_joined')
     time_series = qss.time_series(seven_days_ago, today)
     self.assertEqual([t[1] for t in time_series], [0, 1, 2, 3, 4, 5, 6, 7])
Exemplo n.º 12
0
def detail(request, user_id):
    try:
        user = User.objects.get(id=user_id)
        statistic = Statistic.objects.filter(user=user_id)

        if 'start' in request.GET and request.GET[
                'start'] and 'end' in request.GET and request.GET['end']:
            start_date = datetime.strptime(request.GET['start'],
                                           '%Y-%m-%d').date()
            end_date = datetime.strptime(request.GET['end'], '%Y-%m-%d').date()
        else:
            end_date = Statistic.get_end_date(user_id=user_id)
            start_date = end_date - timedelta(days=6)

        qsstats_page_views = QuerySetStats(statistic,
                                           date_field='date',
                                           aggregate=Sum('page_views'))
        charts_page_views = qsstats_page_views.time_series(start_date,
                                                           end_date,
                                                           interval='days')

        qsstats_clicks = QuerySetStats(statistic,
                                       date_field='date',
                                       aggregate=Sum('clicks'))
        charts_clicks = qsstats_clicks.time_series(start_date,
                                                   end_date,
                                                   interval='days')

        context = {
            'user': user,
            'statistic': statistic,
            'start_date': start_date,
            'end_date': end_date,
            'charts_page_views': charts_page_views,
            'charts_clicks': charts_clicks
        }
    except:
        raise Http404('User is not found.')
    return render(request, 'users/detail.html', context=context)
Exemplo n.º 13
0
    def get_registrations(self, interval, days, graph_key, select_box_value):
        """ Returns an array with new users count per interval."""
        try:
            conf_data = DashboardStats.objects.get(graph_key=graph_key)
            model_name = get_model(
                conf_data.model_app_name, conf_data.model_name)
            kwargs = {}

            for i in conf_data.criteria.all():
                # fixed mapping value passed info kwargs
                if i.criteria_fix_mapping:
                    for key in i.criteria_fix_mapping:
                        # value => i.criteria_fix_mapping[key]
                        kwargs[key] = i.criteria_fix_mapping[key]

                # dynamic mapping value passed info kwargs
                if i.dynamic_criteria_field_name and select_box_value:
                    kwargs[i.dynamic_criteria_field_name] = select_box_value

            stats = QuerySetStats(model_name.objects.filter(**kwargs),
                                  conf_data.date_field_name)
            #stats = QuerySetStats(User.objects.filter(is_active=True), 'date_joined')
            today = now()
            if days == 24:
                begin = today - timedelta(hours=days - 1)
                return stats.time_series(begin, today + timedelta(hours=1), interval)

            begin = today - timedelta(days=days - 1)
            return stats.time_series(begin, today + timedelta(days=1), interval)
        except:
            stats = QuerySetStats(
                User.objects.filter(is_active=True), 'date_joined')
            today = now()
            if days == 24:
                begin = today - timedelta(hours=days - 1)
                return stats.time_series(begin, today + timedelta(hours=1), interval)
            begin = today - timedelta(days=days - 1)
            return stats.time_series(begin, today + timedelta(days=1), interval)
Exemplo n.º 14
0
    def get_models_data(self, querysets):
        """ querysets = {model: (queryset, time_field)} """
        for model_type, (queryset, time_field) in querysets.iteritems():
            qss = QuerySetStats(queryset, time_field)

            data = qss.time_series(self.startdate, self.enddate)

            counts = [d[1] for d in data]
            qss.last_week = sum(counts[-7:])
            qss.last_month = sum(counts[-30:])

            self.day_captions = [t[0].day for t in data]

            setattr(self, model_type+'_qss', qss)
            setattr(self, model_type+'_values', counts)
Exemplo n.º 15
0
def time_series(queryset, date_field, interval, func=None, agg=None, annotate_field=None):
    if agg in (None, "daily"):
        qsstats = QuerySetStats(queryset, date_field, func)
        return qsstats.time_series(*interval)
    else:
        # Custom aggregation was set (weekly/monthly/yearly)
        agg_by = agg[:-2]

        # We need to set the range dynamically
        interval_filter = {date_field + "__gte": interval[0], date_field + "__lte": interval[1]}

        # Slightly raw-ish SQL query using extra

        truncate_date = connections[queryset.db].ops.date_trunc_sql(agg_by, date_field)
        if not annotate_field:
            # By default we always annotate by dates, counting all the
            # records recovered for the given dates
            annotate_field = date_field
            result = (
                queryset.extra(select={agg_by: truncate_date})
                .values_list(agg_by)
                .annotate(Count(annotate_field))
                .filter(**interval_filter)
                .order_by(agg_by)
            )
        else:
            # We do a Sum by annotation field, we are assuming if the
            # annotation is not by dates it will be a field which type can be
            # added, like prices for example.
            result = (
                queryset.extra(select={agg_by: truncate_date})
                .values_list(agg_by)
                .annotate(Sum(annotate_field))
                .filter(**interval_filter)
                .order_by(agg_by)
            )

        return fill_missing_dates_with_zeros(result, agg_by, interval)
Exemplo n.º 16
0
 def changelist_view(self, request, **kwargs):
     from qsstats import QuerySetStats
     from django.db.models import Count, Min
     from django.utils import timezone
     today = timezone.now()
     start_day = Visits.objects.all().aggregate(Min('datetime')).values()
     #print(start_day[0])
     #print(today)
     qsstats = QuerySetStats(Visits.objects.all(),
                             date_field='datetime',
                             aggregate=Count('id'))
     values = qsstats.time_series(start_day[0], today, interval='days')
     args = {
         'values': values,
         'opts': Visits._meta,
         'app_label': Visits._meta.app_label,
         'site_header': 'Welcome page visits statistic',
         'site_title': "Statistic"
     }
     from django.shortcuts import render_to_response
     from django.template import RequestContext
     return render_to_response('admin/app/visits/change_list.html',
                               args,
                               context_instance=RequestContext(request))
Exemplo n.º 17
0
    def get(self, request, format=None):
        """
        return data for graph
        """
        try:

            obj_id = request.query_params.get('equipment', 0)
            end_date = request.query_params.get('end_date', timezone.now())
            start_date = request.query_params.get('start_date')

            equip = Equipment.objects.filter(id=obj_id).first()
            if isinstance(end_date, str):
                end_date = parse_datetime(end_date) or parse_date(end_date)
            if start_date is None:
                start_date = end_date - datetime.timedelta(days=1)

            qs = RawData.objects.filter(
                mac_address=equip.xbee_mac,
                channel=equip.main_channel).order_by('date')
            qss = QuerySetStats(qs=qs,
                                date_field='date',
                                aggregate=Avg('value'))
            time_series = qss.time_series(start_date,
                                          end_date,
                                          interval='minutes')

            data = {
                'equipment': str(equip),
                'end_date': end_date,
                'ts': time_series
            }

        except Exception as e:
            raise Http404('Error in parameters')

        return Response(data)
Exemplo n.º 18
0
 def response_timeseries(self):
     """
     Returns a list of timeseries from the responses.
     """
     qss = QuerySetStats(self.all(), "created")
     return qss.time_series(timezone.now() - timedelta(days=7), timezone.now())
Exemplo n.º 19
0
def time_series(queryset, date_field, interval, func=None):
    qsstats = QuerySetStats(queryset, date_field, func)
    return qsstats.time_series(*interval)
Exemplo n.º 20
0
 def get_data(self, interval, days):
     """ Returns an array with new users count per interval """
     stats = QuerySetStats(self.queryset, self.date_field, aggregate=self.aggregate)
     today = now()
     begin = today - timedelta(days=days - 1)
     return stats.time_series(begin, today + timedelta(days=1), interval)
Exemplo n.º 21
0
def valuebase(request):
    # формирование данных (таблица + фильтр)
    form = ValuebaseFilterForm(request.POST)
    values = Valuebase.objects.all()
    if form.is_valid():
        if form.cleaned_data['min_value']:
            values = values.filter(value__gte=form.cleaned_data['min_value'])

        if form.cleaned_data['max_value']:
            values = values.filter(value__lte=form.cleaned_data['max_value'])

        if form.cleaned_data['min_date']:
            values = values.filter(date__gte=form.cleaned_data['min_date'])

        if form.cleaned_data['max_date']:
            values = values.filter(date__lte=form.cleaned_data['max_date'])

        if form.cleaned_data['bt']:
            values = values.filter(id_bt__name=form.cleaned_data['bt'])

        if form.cleaned_data['office']:
            values = values.filter(
                id_office__office=form.cleaned_data['office'])

        if form.cleaned_data['city']:
            values = values.filter(id_city__city=form.cleaned_data['city'])
    table = ValuebaseTable(values)
    RequestConfig(request).configure(table)

    # формирование таблицы показателей
    res_form = ResForm(request.POST)
    res = Valuebase.objects.all()
    min_date = date(2019, 1, 1)
    max_date = date.today()
    if res_form.is_valid():
        if res_form.cleaned_data['bt_res']:
            res = res.filter(id_bt__name=res_form.cleaned_data['bt_res'])

        if res_form.cleaned_data['city_res']:
            res = res.filter(id_city__city=res_form.cleaned_data['city_res'])

        if res_form.cleaned_data['office_res']:
            res = res.filter(
                id_office__office=res_form.cleaned_data['office_res'])

        if res_form.cleaned_data['min_date_res']:
            res = res.filter(date__gte=res_form.cleaned_data['min_date_res'])
            # проверка на существование записей с минимальной датой
            if res_form.cleaned_data['min_date_res'] < values.aggregate(
                    Min('date')).get('date__min'):
                min_date = values.aggregate(Min('date')).get('date__min')
            else:
                min_date = res_form.cleaned_data['min_date_res']

        if res_form.cleaned_data['max_date_res']:
            res = res.filter(date__lte=res_form.cleaned_data['max_date_res'])
            # проверка на существование записей с максимальной датой
            if res_form.cleaned_data['max_date_res'] > values.aggregate(
                    Max('date')).get('date__max'):
                max_date = values.aggregate(Max('date')).get('date__max')
            else:
                max_date = res_form.cleaned_data['max_date_res']

        # вычисляем отношение показателя "Активные клиенты"
        act_clients = get_stat(res, 1, max_date, min_date)
        # вычисляем отношение показателя "Кредитные карты"
        credit_cards = get_stat(res, 2, max_date, min_date)
        # вычисляем отношение показателя "Costs"
        costs = get_stat(res, 3, max_date, min_date)
        # вычисляем отношение показателя "NBI"
        nbi = get_stat(res, 4, max_date, min_date)
    else:
        # задаем начальные значения для показателей, если форма не заполнена
        act_clients = get_stat_def(res, 1)
        credit_cards = get_stat_def(res, 2)
        costs = get_stat_def(res, 3)
        nbi = get_stat_def(res, 4)

    # формирование диаграммы

    start_date = min_date
    end_date = max_date
    queryset = Valuebase.objects.values_list('date', 'value')
    qss = QuerySetStats(
        queryset, date_field='date',
        aggregate=Avg('value'))  # вычисление среднего значения показателей
    graph = qss.time_series(start_date, end_date,
                            interval='months')  # за указанный период

    return render(
        request, 'valuebase.html', {
            'valuebase': table,
            'form': form,
            'res_form': res_form,
            'act_clients': round(act_clients * 100),
            'credit_cards': round(credit_cards * 100),
            'costs': round(costs * 100),
            'nbi': round(nbi * 100),
            'graph': graph,
            'queryset': qss.__dict__
        })
 def get_registrations(self, interval, days):
     """ Returns an array with new users count per interval """
     stats = QuerySetStats(User.objects.filter(is_active=True), 'date_joined')
     today = datetime.today()
     begin = today - timedelta(days=days-1)
     return stats.time_series(begin, today+timedelta(days=1), interval)
Exemplo n.º 23
0
 def data_for_period(self, qs, start, end, interval='days'):
     """Return a time series of data for the given period."""
     qss = QuerySetStats(qs, self.datetime_field, aggregate=self.aggregate)
     return qss.time_series(start, end, interval=interval)
Exemplo n.º 24
0
 def get_data(self, interval, days):
     """ Returns an array with new users count per interval """
     stats = QuerySetStats(self.queryset, self.date_field)
     today = datetime.date.today()
     begin = today - datetime.timedelta(days=days - 1)
     return stats.time_series(begin, today, interval)
Exemplo n.º 25
0
def get_scan_per_day(start_date, end_date):
    scan_qsstats = QuerySetStats(Scan.objects.all(),
                                 date_field='start',)
    scan_values = scan_qsstats.time_series(start_date, end_date, interval='days')
    return format_date(scan_values)
Exemplo n.º 26
0
 def get_data(self, interval, days):
     """ Returns an array with new users count per interval """
     stats = QuerySetStats(self.queryset, self.date_field)
     today = datetime.date.today()
     begin = today - datetime.timedelta(days=days-1)
     return stats.time_series(begin, today, interval)
Exemplo n.º 27
0
def time_series(queryset, date_field, interval, func=None):
    qsstats = QuerySetStats(queryset, date_field, func)
    return qsstats.time_series(*interval)
Exemplo n.º 28
0
 def data_for_period(self, qs, start, end, interval='days'):
     """Return a time series of data for the given period."""
     qss = QuerySetStats(qs, self.datetime_field,
                         aggregate=self.aggregate)
     return qss.time_series(start, end, interval=interval)