|
|
@@ -75,17 +75,7 @@ class IndexView(TemplateView):
|
|
75
|
75
|
total += cls.objects.count()
|
|
76
|
76
|
return total
|
|
77
|
77
|
|
|
78
|
|
- def get_open_baskets(self, filters=None):
|
|
79
|
|
- """
|
|
80
|
|
- Get all open baskets. If *filters* dictionary is provided they will
|
|
81
|
|
- be applied on all open baskets and return only filtered results.
|
|
82
|
|
- """
|
|
83
|
|
- if filters is None:
|
|
84
|
|
- filters = {}
|
|
85
|
|
- filters['status'] = Basket.OPEN
|
|
86
|
|
- return Basket.objects.filter(**filters)
|
|
87
|
|
-
|
|
88
|
|
- def get_hourly_report(self, hours=24, segments=10):
|
|
|
78
|
+ def get_hourly_report(self, orders, hours=24, segments=10):
|
|
89
|
79
|
"""
|
|
90
|
80
|
Get report of order revenue split up in hourly chunks. A report is
|
|
91
|
81
|
generated for the last *hours* (default=24) from the current time.
|
|
|
@@ -95,17 +85,15 @@ class IndexView(TemplateView):
|
|
95
|
85
|
*segments* defines the number of labeling segments used for the y-axis
|
|
96
|
86
|
when generating the y-axis labels (default=10).
|
|
97
|
87
|
"""
|
|
98
|
|
- # Get datetime for 24 hours agao
|
|
|
88
|
+ # Get datetime for 24 hours ago
|
|
99
|
89
|
time_now = now().replace(minute=0, second=0)
|
|
100
|
90
|
start_time = time_now - timedelta(hours=hours - 1)
|
|
101
|
91
|
|
|
102
|
|
- orders_last_day = Order.objects.filter(date_placed__gt=start_time)
|
|
103
|
|
-
|
|
104
|
92
|
order_total_hourly = []
|
|
105
|
93
|
for hour in range(0, hours, 2):
|
|
106
|
94
|
end_time = start_time + timedelta(hours=2)
|
|
107
|
|
- hourly_orders = orders_last_day.filter(date_placed__gt=start_time,
|
|
108
|
|
- date_placed__lt=end_time)
|
|
|
95
|
+ hourly_orders = orders.filter(date_placed__gte=start_time,
|
|
|
96
|
+ date_placed__lt=end_time)
|
|
109
|
97
|
total = hourly_orders.aggregate(
|
|
110
|
98
|
Sum('total_incl_tax')
|
|
111
|
99
|
)['total_incl_tax__sum'] or D('0.0')
|
|
|
@@ -146,13 +134,32 @@ class IndexView(TemplateView):
|
|
146
|
134
|
datetime_24hrs_ago = now() - timedelta(hours=24)
|
|
147
|
135
|
|
|
148
|
136
|
orders = Order.objects.all()
|
|
|
137
|
+ alerts = StockAlert.objects.all()
|
|
|
138
|
+ baskets = Basket.objects.filter(status=Basket.OPEN)
|
|
|
139
|
+ customers = User.objects.filter(orders__isnull=False).distinct()
|
|
|
140
|
+ lines = Line.objects.filter()
|
|
|
141
|
+
|
|
|
142
|
+ user = self.request.user
|
|
|
143
|
+ if not user.is_staff:
|
|
|
144
|
+ partners_ids = tuple(user.partners.values_list('id', flat=True))
|
|
|
145
|
+ orders = orders.filter(
|
|
|
146
|
+ lines__partner_id__in=partners_ids
|
|
|
147
|
+ ).distinct()
|
|
|
148
|
+ alerts = alerts.filter(stockrecord__partner_id__in=partners_ids)
|
|
|
149
|
+ baskets = baskets.filter(
|
|
|
150
|
+ lines__stockrecord__partner_id__in=partners_ids
|
|
|
151
|
+ ).distinct()
|
|
|
152
|
+ customers = customers.filter(
|
|
|
153
|
+ orders__lines__partner_id__in=partners_ids
|
|
|
154
|
+ ).distinct()
|
|
|
155
|
+ lines = lines.filter(partner_id__in=partners_ids)
|
|
|
156
|
+
|
|
149
|
157
|
orders_last_day = orders.filter(date_placed__gt=datetime_24hrs_ago)
|
|
150
|
158
|
|
|
151
|
|
- open_alerts = StockAlert.objects.filter(status=StockAlert.OPEN)
|
|
152
|
|
- closed_alerts = StockAlert.objects.filter(status=StockAlert.CLOSED)
|
|
|
159
|
+ open_alerts = alerts.filter(status=StockAlert.OPEN)
|
|
|
160
|
+ closed_alerts = alerts.filter(status=StockAlert.CLOSED)
|
|
153
|
161
|
|
|
154
|
|
- total_lines_last_day = Line.objects.filter(
|
|
155
|
|
- order__in=orders_last_day).count()
|
|
|
162
|
+ total_lines_last_day = lines.filter(order__in=orders_last_day).count()
|
|
156
|
163
|
stats = {
|
|
157
|
164
|
'total_orders_last_day': orders_last_day.count(),
|
|
158
|
165
|
'total_lines_last_day': total_lines_last_day,
|
|
|
@@ -165,14 +172,14 @@ class IndexView(TemplateView):
|
|
165
|
172
|
Sum('total_incl_tax')
|
|
166
|
173
|
)['total_incl_tax__sum'] or D('0.00'),
|
|
167
|
174
|
|
|
168
|
|
- 'hourly_report_dict': self.get_hourly_report(hours=24),
|
|
169
|
|
- 'total_customers_last_day': User.objects.filter(
|
|
|
175
|
+ 'hourly_report_dict': self.get_hourly_report(orders),
|
|
|
176
|
+ 'total_customers_last_day': customers.filter(
|
|
170
|
177
|
date_joined__gt=datetime_24hrs_ago,
|
|
171
|
178
|
).count(),
|
|
172
|
179
|
|
|
173
|
|
- 'total_open_baskets_last_day': self.get_open_baskets({
|
|
174
|
|
- 'date_created__gt': datetime_24hrs_ago
|
|
175
|
|
- }).count(),
|
|
|
180
|
+ 'total_open_baskets_last_day': baskets.filter(
|
|
|
181
|
+ date_created__gt=datetime_24hrs_ago
|
|
|
182
|
+ ).count(),
|
|
176
|
183
|
|
|
177
|
184
|
'total_products': Product.objects.count(),
|
|
178
|
185
|
'total_open_stock_alerts': open_alerts.count(),
|
|
|
@@ -182,10 +189,10 @@ class IndexView(TemplateView):
|
|
182
|
189
|
'total_vouchers': self.get_active_vouchers().count(),
|
|
183
|
190
|
'total_promotions': self.get_number_of_promotions(),
|
|
184
|
191
|
|
|
185
|
|
- 'total_customers': User.objects.count(),
|
|
186
|
|
- 'total_open_baskets': self.get_open_baskets().count(),
|
|
|
192
|
+ 'total_customers': customers.count(),
|
|
|
193
|
+ 'total_open_baskets': baskets.count(),
|
|
187
|
194
|
'total_orders': orders.count(),
|
|
188
|
|
- 'total_lines': Line.objects.count(),
|
|
|
195
|
+ 'total_lines': lines.count(),
|
|
189
|
196
|
'total_revenue': orders.aggregate(
|
|
190
|
197
|
Sum('total_incl_tax')
|
|
191
|
198
|
)['total_incl_tax__sum'] or D('0.00'),
|