示例#1
0
    def get_context_data(self, **kwargs):
        context = super(TrendTimeView, self).get_context_data(**kwargs)
        context['bankaccount'] = self.bankaccount

        filters = self.session_data.get('filters', {})
        context['has_filters'] = bool(filters)

        if filters:

            # Get first and last bank transaction to prevent infinite pager. If
            # one is missing, it just mean that there is no data at all.
            first, last = self.get_queryset_dates_delimiters()
            if first and last:
                base_date = datetime.date(**filters['date_kwargs'])
                granularity = filters['granularity']

                if self.request.GET.get('date'):
                    try:
                        base_date = datetime.datetime.strptime(
                            self.request.GET.get('date'),
                            '%Y-%m-%d',
                        ).date()

                    except ValueError:
                        pass

                # Requested date is not out of range?
                first_range = get_date_ranges(first, granularity)[0]
                last_range = get_date_ranges(last, granularity)[1]
                if first_range <= base_date <= last_range:

                    date_start, date_end = get_date_ranges(
                        base_date,
                        granularity,
                    )

                    balance = self.get_queryset_balance(date_start)['sum'] or 0
                    balance += self.bankaccount.balance_initial
                    context['balance_initial'] = balance

                    items_qs = self.get_queryset_items(date_start, date_end)
                    items = {item['date']: item for item in items_qs}

                    # Start and end iterator at first/last bank transaction,
                    # not the range calculated.
                    iterator = DateIterator(
                        first if first > date_start else date_start,
                        last if last < date_end else date_end,
                    )
                    rows = []
                    for date_step in iterator:
                        delta = percentage = count = 0

                        # If no new bank transaction, same as previous.
                        if date_step in items:
                            delta = items[date_step]['sum']
                            percentage = (delta * 100 /
                                          balance) if balance else 0
                            balance += items[date_step]['sum']
                            count = items[date_step]['count']

                        rows.append({
                            'date': date_step,
                            'count': count,
                            'balance': balance,
                            'delta': delta,
                            'percentage': round(percentage, 2),
                        })

                    context['rows'] = rows
                    context['chart_data'] = json.dumps({
                        'data': {
                            'labels': [
                                formats.date_format(
                                    row['date'],
                                    'SHORT_DATE_FORMAT',
                                ) for row in rows
                            ],
                            'datasets': [{
                                'fillColor':
                                "rgba(66, 139, 202, 0.5)",
                                'strokeColor':
                                "rgba(66, 139, 202, 0.8)",
                                'pointColor':
                                "rgba(66, 139, 202, 0.75)",
                                'pointHighlightFill':
                                "#fff",
                                'pointHighlightStroke':
                                "rgba(66, 139, 202, 1)",
                                'data':
                                [float(row['balance']) for row in rows],
                            }],
                        },
                        'type':
                        filters['chart'],
                    })
                    paginator = DatePaginator(first_range, last_range,
                                              granularity)
                    context['page_obj'] = paginator.page(base_date)

        return context
示例#2
0
文件: views.py 项目: ychab/mymoney
    def get_context_data(self, **kwargs):
        context = super(TrendTimeView, self).get_context_data(**kwargs)
        context['bankaccount'] = self.bankaccount

        filters = self.session_data.get('filters', {})
        context['has_filters'] = bool(filters)

        if filters:

            # Get first and last bank transaction to prevent infinite pager. If
            # one is missing, it just mean that there is no data at all.
            first, last = self.get_queryset_dates_delimiters()
            if first and last:
                base_date = datetime.date(**filters['date_kwargs'])
                granularity = filters['granularity']

                if self.request.GET.get('date'):
                    try:
                        base_date = datetime.datetime.strptime(
                            self.request.GET.get('date'),
                            '%Y-%m-%d',
                        ).date()

                    except ValueError:
                        pass

                # Requested date is not out of range?
                first_range = get_date_ranges(first, granularity)[0]
                last_range = get_date_ranges(last, granularity)[1]
                if first_range <= base_date <= last_range:

                    date_start, date_end = get_date_ranges(
                        base_date,
                        granularity,
                    )

                    balance = self.get_queryset_balance(date_start)['sum'] or 0
                    balance += self.bankaccount.balance_initial
                    context['balance_initial'] = balance

                    items_qs = self.get_queryset_items(date_start, date_end)
                    items = {item['date']: item for item in items_qs}

                    # Start and end iterator at first/last bank transaction,
                    # not the range calculated.
                    iterator = DateIterator(
                        first if first > date_start else date_start,
                        last if last < date_end else date_end,
                    )
                    rows = []
                    for date_step in iterator:
                        delta = percentage = count = 0

                        # If no new bank transaction, same as previous.
                        if date_step in items:
                            delta = items[date_step]['sum']
                            percentage = (delta * 100 / balance) if balance else 0
                            balance += items[date_step]['sum']
                            count = items[date_step]['count']

                        rows.append({
                            'date': date_step,
                            'count': count,
                            'balance': balance,
                            'delta': delta,
                            'percentage': round(percentage, 2),
                        })

                    context['rows'] = rows
                    context['chart_data'] = json.dumps({
                        'data': {
                            'labels': [
                                formats.date_format(
                                    row['date'], 'SHORT_DATE_FORMAT',
                                )
                                for row in rows
                            ],
                            'datasets': [
                                {
                                    'fillColor': "rgba(66, 139, 202, 0.5)",
                                    'strokeColor': "rgba(66, 139, 202, 0.8)",
                                    'pointColor': "rgba(66, 139, 202, 0.75)",
                                    'pointHighlightFill': "#fff",
                                    'pointHighlightStroke': "rgba(66, 139, 202, 1)",
                                    'data': [
                                        float(row['balance']) for row in rows
                                    ],
                                }
                            ],
                        },
                        'type': filters['chart'],
                    })
                    paginator = DatePaginator(
                        first_range, last_range, granularity
                    )
                    context['page_obj'] = paginator.page(base_date)

        return context