Пример #1
0
def _get_x_labels() -> List[str]:
    # labels on x axis
    # we only show important days
    important_days = (
        datetime_util.first_date_current_month(),
        datetime_util.today(),
        datetime_util.last_date_current_month(),
    )
    return [
        date.strftime('%d/%m') if date in important_days else ''
        for date in datetime_util.get_date_iterator(
            datetime_util.first_date_current_month(),
            datetime_util.last_date_current_month())
    ]
Пример #2
0
    def test_get_current_accumulated_expenses_first_day(self):
        group = ExpenseGroup.objects.first()
        day1 = datetime_util.first_date_current_month()
        day1_expense = Expense.get_expense_value_in(day1, day1, group=group)

        rs = admin._get_current_accumulated_expenses(group)
        self.assertCountEqual([day1_expense], rs)
Пример #3
0
class ExpenseReportForm(forms.Form):
    from_date = forms.DateField(
        initial=datetime_util.first_date_current_month(),
        required=True,
        widget=forms.DateInput(attrs={
            'type': 'date',
            'class': 'form-control',
        }),
    )
    to_date = forms.DateField(
        initial=datetime_util.today(),
        required=True,
        widget=forms.DateInput(attrs={
            'type': 'date',
            'class': 'form-control',
        }),
    )

    def clean(self):
        super().clean()

        from_date = self.cleaned_data.get('from_date')
        to_date = self.cleaned_data.get('to_date')

        if from_date and to_date:
            if from_date > to_date:
                raise ValidationError(
                    "from_date must not be later than to_date")
Пример #4
0
    def current_percent(self) -> int:
        expenses = Expense.get_expenses_in(
            start_date=datetime_util.first_date_current_month(),
            end_date=datetime_util.last_date_current_month(),
        ).filter(category__group=self.expense_group).only('value')

        total_value = sum([ex.value for ex in expenses])
        return int(total_value / self.limit * 100)
Пример #5
0
class ExpenseReportDefaultView(RedirectView):
    permanent = True
    url = reverse_lazy(
        "homie_admin:expense_report",
        kwargs={
            'from_date':
            datetime_util.first_date_current_month().strftime(DATE_FORMAT),
            'to_date':
            datetime_util.today().strftime(DATE_FORMAT),
        })
Пример #6
0
    def test_get_current_accumulated_expenses(self):
        group = ExpenseGroup.objects.first()
        day1 = datetime_util.first_date_current_month()
        day1_expense = Expense.get_expense_value_in(day1, day1, group=group)

        day2 = day1 + timedelta(days=1)
        Expense.objects.create(
            wallet=Wallet.objects.first(),
            category=ExpenseCategory.objects.filter(group=group).first(),
            value=50,
            pay_date=day2,
        )
        day2_expense = Expense.get_expense_value_in(day2, day2, group=group)

        rs = admin._get_current_accumulated_expenses(group)
        self.assertEqual(day1_expense, rs[0])
        self.assertEqual(day1_expense + day2_expense, rs[1])
Пример #7
0
def _get_current_accumulated_expenses(group: ExpenseGroup) -> List[int]:
    """
    Returns a list of accumulated expense. The i-th element is the expense
    from day 1 of this month until day i-th.
    """

    expense_til_today = []
    for date in datetime_util.get_date_iterator(
            datetime_util.first_date_current_month(), datetime_util.today()):
        expense = sum([
            ex.value for ex in Expense.get_expenses_in(
                start_date=date, end_date=date).filter(category__group=group)
        ])
        expense_til_today.append(expense if len(expense_til_today) ==
                                 0 else expense_til_today[-1] + expense)

    return expense_til_today
Пример #8
0
    def app_index(self, request, app_label, extra_context=None):
        from_date = datetime_util.first_date_current_month()
        to_date = datetime_util.today()
        income = Income.get_income_value_in(from_date, to_date)
        expense = Expense.get_expense_value_in(from_date, to_date)

        return super().app_index(request,
                                 app_label,
                                 extra_context={
                                     'net_worth':
                                     finance_util.get_net_worth(),
                                     'income_this_month':
                                     income,
                                     'expense_this_month':
                                     expense,
                                     'balance_this_month':
                                     income - expense,
                                     'pinned_models': [
                                         model_cls._meta.object_name
                                         for model_cls in (Budget, Expense,
                                                           Income)
                                     ]
                                 })
Пример #9
0
 def test_expense_report_view_redirect(self):
     res = self.client.get(_default_expense_report_url)
     self.assertEqual(301, res.status_code)
     self.assertEqual(
         _expense_report_url(datetime_util.first_date_current_month(),
                             datetime_util.today()), res.url)
Пример #10
0
 def setUp(self) -> None:
     super().setUp()
     self.month_start = datetime_util.first_date_current_month()
     self.month_end = datetime_util.today()
     self.this_month_report_url = _expense_report_url(
         self.month_start, self.month_end)
Пример #11
0
 def test_first_day_current_month(self):
     rs = datetime_util.first_date_current_month()
     self.assertEqual(1, rs.day)