Exemple #1
0
    def get_budget_stats(qs: QuerySet) -> list:
        if len(qs) == 0:
            return []

        budgets = Budget.objects.filter(
            id__in=set(qs.values_list("budget", flat=True)))
        start_date = qs.last().date
        end_date = qs.first().date
        date_range = (start_date, end_date)

        stats = []
        for budget in budgets:
            budget_stats = {
                "id":
                budget.id,
                "name":
                budget.name,
                "initial_balance":
                budget.balance(Q(date__lt=start_date)),
                "final_balance":
                budget.balance(Q(date__lte=end_date)),
                "income":
                Transaction.objects.filter(
                    budget=budget, date__range=date_range,
                    income=True).aggregate(total=Sum("amount"))["total"] or 0,
                "outcome":
                Transaction.objects.filter(
                    budget=budget, date__range=date_range,
                    income=False).aggregate(total=Sum("amount"))["total"] or 0,
            }
            budget_stats["difference"] = (budget_stats["income"] +
                                          budget_stats["outcome"])
            stats.append(budget_stats)

        return stats
def test_order_manager_get_overlapping_entries(orders: QuerySet):
    """Should return the overlapping entries."""
    manager = Order.objects
    order = orders.last()
    assert not manager.get_overlapping_entries(order).count()

    order.start_datetime = arrow.utcnow().shift(days=1, hours=4).datetime
    order.end_datetime = arrow.utcnow().shift(days=1, hours=14).datetime
    assert manager.get_overlapping_entries(order).count()

    order.start_datetime = arrow.utcnow().shift(days=1, hours=8).datetime
    order.end_datetime = arrow.utcnow().shift(days=1, hours=9).datetime
    assert manager.get_overlapping_entries(order).count()
Exemple #3
0
def _daily_count(subjects_queryset: QuerySet):

    dates = []
    men_count = []
    women_count = []

    if subjects_queryset.count():
        subjects_queryset = subjects_queryset.order_by('faces__created_at')
        oldest_subject = subjects_queryset.first()
        newest_subject = subjects_queryset.last()

        lower_timestamp = min(
            [face.created_at for face in oldest_subject.faces.all()])
        upper_timestamp = max(
            [face.created_at for face in newest_subject.faces.all()])

        lower_date = timezone.localtime(lower_timestamp).date()
        upper_date = timezone.localtime(upper_timestamp).date()

        curr_date = lower_date
        ind = 0

        while curr_date <= upper_date:
            next_date = curr_date + datetime.timedelta(days=1)

            subjects = subjects_queryset.filter(
                faces__created_at__date__gte=curr_date,
                faces__created_at__date__lt=next_date)
            men_count.append(
                len(
                    set([
                        subject.id for subject in subjects
                        if subject.pred_sex == Subject.SEX_MAN
                    ])))
            women_count.append(
                len(
                    set([
                        subject.id for subject in subjects
                        if subject.pred_sex == Subject.SEX_WOMAN
                    ])))

            dates.append(str(curr_date))
            curr_date = next_date
            ind += 1

    return {
        'dates': dates,
        'men_count': men_count,
        'women_count': women_count,
    }
def test_order_manager_get_between_dates(orders: QuerySet):
    """Should return the entries between dates."""
    now = arrow.utcnow()
    order = orders.last()
    order.service.is_enabled = True
    Service.objects.update(is_enabled=True)
    manager = Order.objects

    assert manager.get_between_dates(
        now,
        now.shift(days=2),
        professional=order.service.professional,
    ).count() == 2

    assert manager.get_between_dates(
        now,
        now.shift(days=2),
        professional=order.service.professional,
        service=order.service,
    ).count() == 1