Browse Source

Limit access to dashboard for partners to show only their stats

master
Aliaksei Urbanski 7 years ago
parent
commit
d2b21f29ff
2 changed files with 38 additions and 30 deletions
  1. 35
    28
      src/oscar/apps/dashboard/views.py
  2. 3
    2
      tests/functional/dashboard/test_dashboard.py

+ 35
- 28
src/oscar/apps/dashboard/views.py View File

75
                 total += cls.objects.count()
75
                 total += cls.objects.count()
76
         return total
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
         Get report of order revenue split up in hourly chunks. A report is
80
         Get report of order revenue split up in hourly chunks. A report is
91
         generated for the last *hours* (default=24) from the current time.
81
         generated for the last *hours* (default=24) from the current time.
95
         *segments* defines the number of labeling segments used for the y-axis
85
         *segments* defines the number of labeling segments used for the y-axis
96
         when generating the y-axis labels (default=10).
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
         time_now = now().replace(minute=0, second=0)
89
         time_now = now().replace(minute=0, second=0)
100
         start_time = time_now - timedelta(hours=hours - 1)
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
         order_total_hourly = []
92
         order_total_hourly = []
105
         for hour in range(0, hours, 2):
93
         for hour in range(0, hours, 2):
106
             end_time = start_time + timedelta(hours=2)
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
             total = hourly_orders.aggregate(
97
             total = hourly_orders.aggregate(
110
                 Sum('total_incl_tax')
98
                 Sum('total_incl_tax')
111
             )['total_incl_tax__sum'] or D('0.0')
99
             )['total_incl_tax__sum'] or D('0.0')
146
         datetime_24hrs_ago = now() - timedelta(hours=24)
134
         datetime_24hrs_ago = now() - timedelta(hours=24)
147
 
135
 
148
         orders = Order.objects.all()
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
         orders_last_day = orders.filter(date_placed__gt=datetime_24hrs_ago)
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
         stats = {
163
         stats = {
157
             'total_orders_last_day': orders_last_day.count(),
164
             'total_orders_last_day': orders_last_day.count(),
158
             'total_lines_last_day': total_lines_last_day,
165
             'total_lines_last_day': total_lines_last_day,
165
                 Sum('total_incl_tax')
172
                 Sum('total_incl_tax')
166
             )['total_incl_tax__sum'] or D('0.00'),
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
                 date_joined__gt=datetime_24hrs_ago,
177
                 date_joined__gt=datetime_24hrs_ago,
171
             ).count(),
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
             'total_products': Product.objects.count(),
184
             'total_products': Product.objects.count(),
178
             'total_open_stock_alerts': open_alerts.count(),
185
             'total_open_stock_alerts': open_alerts.count(),
182
             'total_vouchers': self.get_active_vouchers().count(),
189
             'total_vouchers': self.get_active_vouchers().count(),
183
             'total_promotions': self.get_number_of_promotions(),
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
             'total_orders': orders.count(),
194
             'total_orders': orders.count(),
188
-            'total_lines': Line.objects.count(),
195
+            'total_lines': lines.count(),
189
             'total_revenue': orders.aggregate(
196
             'total_revenue': orders.aggregate(
190
                 Sum('total_incl_tax')
197
                 Sum('total_incl_tax')
191
             )['total_incl_tax__sum'] or D('0.00'),
198
             )['total_incl_tax__sum'] or D('0.00'),

+ 3
- 2
tests/functional/dashboard/test_dashboard.py View File

4
 
4
 
5
 from oscar.core import prices
5
 from oscar.core import prices
6
 from oscar.apps.dashboard.views import IndexView
6
 from oscar.apps.dashboard.views import IndexView
7
+from oscar.apps.order.models import Order
7
 from oscar.test.testcases import WebTestCase
8
 from oscar.test.testcases import WebTestCase
8
 from oscar.test.factories import create_order
9
 from oscar.test.factories import create_order
9
 
10
 
28
             self.assertTrue('Password' not in response.content.decode('utf8'))
29
             self.assertTrue('Password' not in response.content.decode('utf8'))
29
 
30
 
30
     def test_includes_hourly_report_with_no_orders(self):
31
     def test_includes_hourly_report_with_no_orders(self):
31
-        report = IndexView().get_hourly_report()
32
+        report = IndexView().get_hourly_report(Order.objects.all())
32
         self.assertEqual(len(report), 3)
33
         self.assertEqual(len(report), 3)
33
 
34
 
34
         keys = ['max_revenue', 'order_total_hourly', 'y_range']
35
         keys = ['max_revenue', 'order_total_hourly', 'y_range']
44
                                         tax=D('0.00')))
45
                                         tax=D('0.00')))
45
         create_order(total=prices.Price('GBP', excl_tax=D('21.90'),
46
         create_order(total=prices.Price('GBP', excl_tax=D('21.90'),
46
                                         tax=D('0.00')))
47
                                         tax=D('0.00')))
47
-        report = IndexView().get_hourly_report()
48
+        report = IndexView().get_hourly_report(Order.objects.all())
48
 
49
 
49
         self.assertEqual(len(report['order_total_hourly']), 12)
50
         self.assertEqual(len(report['order_total_hourly']), 12)
50
         self.assertEqual(len(report['y_range']), 11)
51
         self.assertEqual(len(report['y_range']), 11)

Loading…
Cancel
Save