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()
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