text: from decimal import Decimal as D
  
  from django.urls import reverse
  
  from oscar.apps.dashboard.views import IndexView
  from oscar.apps.order.models import Order
  from oscar.core import prices
  from oscar.core.loading import get_model
  from oscar.test.factories import (
      UserFactory, create_basket, create_order, create_product)
  from oscar.test.testcases import WebTestCase
  
  StockAlert = get_model('partner', 'StockAlert')
  
  
  GENERIC_STATS_KEYS = (
      'total_orders_last_day',
      'total_lines_last_day',
      'average_order_costs',
      'total_revenue_last_day',
      'hourly_report_dict',
      'total_customers_last_day',
      'total_open_baskets_last_day',
      'total_products',
      'total_open_stock_alerts',
      'total_closed_stock_alerts',
      'total_customers',
      'total_open_baskets',
      'total_orders',
      'total_lines',
      'total_revenue',
      'order_status_breakdown',
  )
  STAFF_STATS_KEYS = (
      'total_site_offers',
      'total_vouchers',
  )
  
  
  class TestDashboardIndexForAnonUser(WebTestCase):
      is_anonymous = True
  
      def test_is_not_available(self):
          response = self.get(reverse('dashboard:index')).follow()
          self.assertContains(response, 'username', status_code=200)
  
  
  class TestDashboardIndexForStaffUser(WebTestCase):
      is_staff = True
  
      def test_is_available(self):
          urls = ('dashboard:index',
                  'dashboard:order-list',
                  'dashboard:users-index',)
          for name in urls:
              response = self.get(reverse(name))
              self.assertContains(response, 'Welcome')
  
      def test_includes_hourly_report_with_no_orders(self):
          report = IndexView().get_hourly_report(Order.objects.all())
          self.assertEqual(len(report), 3)
  
          keys = ['max_revenue', 'order_total_hourly', 'y_range']
          for i, j in zip(sorted(report.keys()), keys):
              self.assertEqual(i, j)
  
          self.assertEqual(len(report['order_total_hourly']), 12)
          self.assertEqual(len(report['y_range']), 0)
          self.assertEqual(report['max_revenue'], 0)
  
      def test_includes_hourly_report_with_orders(self):
          create_order(total=prices.Price('GBP', excl_tax=D('34.05'),
                                          tax=D('0.00')))
          create_order(total=prices.Price('GBP', excl_tax=D('21.90'),
                                          tax=D('0.00')))
          report = IndexView().get_hourly_report(Order.objects.all())
  
          self.assertEqual(len(report['order_total_hourly']), 12)
          self.assertEqual(len(report['y_range']), 11)
          self.assertEqual(report['max_revenue'], D('60'))
  
      def test_has_stats_vars_in_context(self):
          response = self.get(reverse('dashboard:index'))
          for key in GENERIC_STATS_KEYS + STAFF_STATS_KEYS:
              self.assertInContext(response, key)
  
  
  class TestDashboardIndexForPartnerUser(WebTestCase):
      permissions = ['partner.dashboard_access']
  
      def test_is_available(self):
          urls = ('dashboard:index', 'dashboard:order-list')
          for name in urls:
              response = self.get(reverse(name))
              self.assertContains(response, 'Welcome')
  
      def test_is_not_available(self):
          urls = ('dashboard:users-index',
                  'dashboard:partner-list',
                  'dashboard:partner-create',
                  'dashboard:offer-list',
                  'dashboard:reports-index')
          for name in urls:
              response = self.get(reverse(name), expect_errors=True)
              self.assertContains(response, 'Permission denied!',
                                  status_code=403)
  
      def test_stats(self):
          response = self.get(reverse('dashboard:index'))
          for key in GENERIC_STATS_KEYS:
              self.assertInContext(response, key)
          for key in STAFF_STATS_KEYS:
              self.assertNotInContext(response, key)
  
  
  class TestDashboardIndexStatsForNonStaffUser(WebTestCase):
      permissions = ['partner.dashboard_access']
  
      def setUp(self):
          super().setUp()
          customer = UserFactory()
          product1 = create_product(partner_name='Partner 1', price=D(5))
          product2 = create_product(partner_name='Partner 2', price=D(10))
          create_product(partner_name='Partner 2', price=D(15))
          basket1 = create_basket(empty=True)
          basket1.add_product(product1)
          create_order(basket=basket1, user=customer)
          basket2 = create_basket(empty=True)
          basket2.add_product(product1)
          basket2 = create_basket(empty=True)
          basket2.add_product(product2)
          for i in range(9):
              create_order(basket=basket2, user=customer, number='1000%s' % i)
          stockrecord1 = product1.stockrecords.first()
          stockrecord2 = product2.stockrecords.first()
          self.partner1 = stockrecord1.partner
          self.partner2 = stockrecord2.partner
          StockAlert.objects.create(stockrecord=stockrecord1, threshold=10)
          StockAlert.objects.create(stockrecord=stockrecord2, threshold=5)
  
      def test_partner1(self):
          user = self.create_user(username='user', email='testuser@example.com')
          self.partner1.users.add(self.user)
          self.partner2.users.add(user)
          response = self.get(reverse('dashboard:index'))
          context = response.context
          self.assertEqual(context['total_orders_last_day'], 1)
          self.assertEqual(context['total_lines_last_day'], 1)
          self.assertEqual(context['total_revenue_last_day'], D(5))
          self.assertEqual(context['total_customers_last_day'], 1)
          self.assertEqual(context['total_open_baskets_last_day'], 1)
          self.assertEqual(context['total_products'], 1)
          self.assertEqual(context['total_open_stock_alerts'], 1)
          self.assertEqual(context['total_closed_stock_alerts'], 0)
          self.assertEqual(context['total_customers'], 1)
          self.assertEqual(context['total_open_baskets'], 1)
          self.assertEqual(context['total_orders'], 1)
          self.assertEqual(context['total_lines'], 1)
          self.assertEqual(context['total_revenue'], D(5))
  
      def test_partner2(self):
          user = self.create_user(username='user', email='testuser@example.com')
          self.partner1.users.add(user)
          self.partner2.users.add(self.user)
          response = self.get(reverse('dashboard:index'))
          context = response.context
          self.assertEqual(context['total_orders_last_day'], 9)
          self.assertEqual(context['total_lines_last_day'], 9)
          self.assertEqual(context['total_revenue_last_day'], D(90))
          self.assertEqual(context['total_customers_last_day'], 1)
          self.assertEqual(context['total_open_baskets_last_day'], 0)
          self.assertEqual(context['total_products'], 2)
          self.assertEqual(context['total_open_stock_alerts'], 1)
          self.assertEqual(context['total_closed_stock_alerts'], 0)
          self.assertEqual(context['total_customers'], 1)
          self.assertEqual(context['total_open_baskets'], 0)
          self.assertEqual(context['total_orders'], 9)
          self.assertEqual(context['total_lines'], 9)
          self.assertEqual(context['total_revenue'], D(90))
  