Skip to content

Commit 0a8a304

Browse files
7 - Filter by Range of Time
1 parent b9f8bb1 commit 0a8a304

File tree

3 files changed

+107
-16
lines changed

3 files changed

+107
-16
lines changed

src/analytics/templates/analytics/sales.html

Lines changed: 66 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,30 +11,33 @@ <h1>Sales Data</h1>
1111
</div>
1212

1313
<div class='row'>
14+
<div class='col-12'>
15+
<h1>Today's sales</h1>
16+
</div>
1417
<div class='col'>
15-
<p>Recent Total: ${{ recent_orders_data.total__sum }}</p>
18+
<p>Recent Total: ${{ today.recent_data.total__sum }}</p>
1619
<ol>
17-
{% for order in recent_orders %}
20+
{% for order in today.recent %}
1821
<li>{{ order.order_id }}
1922
{{ order.total }}
2023
{{ order.updated }}</li>
2124
{% endfor %}
2225
</ol>
2326
</div>
2427
<div class='col'>
25-
<p>Shipped Total: ${{ shipped_orders_data.total__sum }}</p>
28+
<p>Shipped Total: ${{ today.shipped_data.total__sum }}</p>
2629
<ol>
27-
{% for order in shipped_orders %}
30+
{% for order in today.shipped %}
2831
<li>{{ order.order_id }}
2932
{{ order.total }}
3033
{{ order.updated }} </li>
3134
{% endfor %}
3235
</ol>
3336
</div>
3437
<div class='col'>
35-
<p>Paid Totals: ${{ paid_orders_data.total__sum }}</p>
38+
<p>Paid Totals: ${{ today.paid_data.total__sum }}</p>
3639
<ol>
37-
{% for order in paid_orders %}
40+
{% for order in today.paid %}
3841
<li>{{ order.order_id }}
3942
{{ order.total }}
4043
{{ order.updated }} </li>
@@ -45,5 +48,62 @@ <h1>Sales Data</h1>
4548

4649

4750

51+
<div class='row'>
52+
<div class='col-12'>
53+
<h1>This week's sales</h1>
54+
</div>
55+
<div class='col'>
56+
<p>Recent Total: ${{ this_week.recent_data.total__sum }}</p>
57+
<ol>
58+
{% for order in this_week.recent %}
59+
<li>{{ order.order_id }}
60+
{{ order.total }}
61+
{{ order.updated }}</li>
62+
{% endfor %}
63+
</ol>
64+
</div>
65+
<div class='col'>
66+
<p>Shipped Total: ${{ this_week.shipped_data.total__sum }}</p>
67+
<ol>
68+
{% for order in this_week.shipped %}
69+
<li>{{ order.order_id }}
70+
{{ order.total }}
71+
{{ order.updated }} </li>
72+
{% endfor %}
73+
</ol>
74+
</div>
75+
<div class='col'>
76+
<p>Paid Totals: ${{ this_week.paid_data.total__sum }}</p>
77+
<ol>
78+
{% for order in this_week.paid %}
79+
<li>{{ order.order_id }}
80+
{{ order.total }}
81+
{{ order.updated }} </li>
82+
{% endfor %}
83+
</ol>
84+
</div>
85+
</div>
86+
87+
88+
89+
<div class='row'>
90+
<div class='col-12'>
91+
<h1>Previous 4 weeks</h1>
92+
</div>
93+
<div class='col'>
94+
<p>Orders Total: ${{ last_four_weeks.recent_data.total__sum }}</p>
95+
</div>
96+
<div class='col'>
97+
<p>Shipped Total: {% if last_four_weeks.shipped_data.total__sum %}
98+
${{ last_four_weeks.shipped_data.total__sum }} {% endif %}</p>
99+
</div>
100+
<div class='col'>
101+
<p>Paid Totals: ${{ last_four_weeks.paid_data.total__sum }}</p>
102+
</div>
103+
</div>
104+
105+
106+
107+
48108

49109
{% endblock %}

src/analytics/views.py

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
import datetime
12
from django.contrib.auth.mixins import LoginRequiredMixin
23
from django.db.models import Count, Sum, Avg
34
from django.http import HttpResponse
45
from django.views.generic import TemplateView
56
from django.shortcuts import render
67

8+
from django.utils import timezone
79

810

911
from orders.models import Order
@@ -20,14 +22,10 @@ def dispatch(self, *args, **kwargs):
2022

2123
def get_context_data(self, *args, **kwargs):
2224
context = super(SalesView, self).get_context_data(*args, **kwargs)
23-
qs = Order.objects.all().by_date()
24-
context['orders'] = qs
25-
context['recent_orders'] = qs.recent().not_refunded()
26-
context['recent_orders_data'] = context['recent_orders'].totals_data()
27-
context['recent_orders_cart_data'] = context['recent_orders'].cart_data()
28-
context['shipped_orders'] = qs.recent().not_refunded().by_status(status='shipped')
29-
context['shipped_orders_data'] = context['shipped_orders'].totals_data()
30-
context['paid_orders'] = qs.recent().not_refunded().by_status(status='paid')
31-
context['paid_orders_data'] = context['paid_orders'].totals_data()
32-
25+
#two_weeks_ago = timezone.now() - datetime.timedelta(days=14)
26+
#one_week_ago = timezone.now() - datetime.timedelta(days=7)
27+
qs = Order.objects.all().by_weeks_range(weeks_ago=10, number_of_weeks=10)
28+
context['today'] = qs.by_range(start_date=timezone.now().date()).get_sales_breakdown()
29+
context['this_week'] = qs.by_weeks_range(weeks_ago=1, number_of_weeks=1).get_sales_breakdown()
30+
context['last_four_weeks'] = qs.by_weeks_range(weeks_ago=5, number_of_weeks=4).get_sales_breakdown()
3331
return context

src/orders/models.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,39 @@ class OrderManagerQuerySet(models.query.QuerySet):
2424
def recent(self):
2525
return self.order_by("-updated", "-timestamp")
2626

27+
def get_sales_breakdown(self):
28+
recent = self.recent().not_refunded()
29+
recent_data = recent.totals_data()
30+
recent_cart_data = recent.cart_data()
31+
shipped = recent.not_refunded().by_status(status='shipped')
32+
shipped_data = shipped.totals_data()
33+
paid = recent.by_status(status='paid')
34+
paid_data = paid.totals_data()
35+
data = {
36+
'recent': recent,
37+
'recent_data':recent_data,
38+
'recent_cart_data': recent_cart_data,
39+
'shipped': shipped,
40+
'shipped_data': shipped_data,
41+
'paid': paid,
42+
'paid_data': paid_data
43+
}
44+
return data
45+
46+
def by_weeks_range(self, weeks_ago=7, number_of_weeks=2):
47+
if number_of_weeks > weeks_ago:
48+
number_of_weeks = weeks_ago
49+
days_ago_start = weeks_ago * 7 # days_ago_start = 49
50+
days_ago_end = days_ago_start - (number_of_weeks * 7) #days_ago_end = 49 - 14 = 35
51+
start_date = timezone.now() - datetime.timedelta(days=days_ago_start)
52+
end_date = timezone.now() - datetime.timedelta(days=days_ago_end)
53+
return self.by_range(start_date, end_date=end_date)
54+
55+
def by_range(self, start_date, end_date=None):
56+
if end_date is None:
57+
return self.filter(updated__gte=start_date)
58+
return self.filter(updated__gte=start_date).filter(updated__lte=end_date)
59+
2760
def by_date(self):
2861
now = timezone.now() - datetime.timedelta(days=9)
2962
return self.filter(updated__day__gte=now.day)

0 commit comments

Comments
 (0)