diff --git a/front/js/components/headerCart.es6 b/front/js/components/headerCart.es6 index 59619f96..1ffc3521 100644 --- a/front/js/components/headerCart.es6 +++ b/front/js/components/headerCart.es6 @@ -8,6 +8,8 @@ }; const init = () => { + // @todo #789:60m Load cart lazily. + // See the parent task for details. setUpListeners(); }; diff --git a/front/js/shared/server.es6 b/front/js/shared/server.es6 index 43e5dd56..6a03e357 100644 --- a/front/js/shared/server.es6 +++ b/front/js/shared/server.es6 @@ -6,6 +6,7 @@ const server = (() => { // Ignore ESLintBear (no-unused-vars) changeCartUrl: '/shop/cart-change/', removeFromCartUrl: '/shop/cart-remove/', flushCartUrl: '/shop/cart-flush/', + getCartUrl: '/shop/cart-get/', yandexOrderUrl: '/shop/yandex-order/', setViewTypeUrl: '/set-view-type/', saveFeedback: '/save-feedback/', @@ -103,12 +104,20 @@ const server = (() => { // Ignore ESLintBear (no-unused-vars) ); } + /** + * Return $.get request, which gives Cart data. + */ + function getCart() { + return $.get(config.getCartUrl); + } + const sendYandexOrder = data => $.post(config.yandexOrderUrl, data); return { addToCart, changeInCart, deleteFeedback, + getCart, loadProducts, flushCart, oneClickBuy, diff --git a/shopelectro/settings/base.py b/shopelectro/settings/base.py index df9fbfea..cf060337 100644 --- a/shopelectro/settings/base.py +++ b/shopelectro/settings/base.py @@ -77,18 +77,20 @@ 'shopelectro', ] +# Stick to this ordering +# https://docs.djangoproject.com/en/1.11/ref/middleware/#middleware-ordering MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.cache.UpdateCacheMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware', - 'django.middleware.cache.FetchFromCacheMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.cache.FetchFromCacheMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', - 'django.middleware.locale.LocaleMiddleware', 'django_user_agents.middleware.UserAgentMiddleware', 'debug_toolbar.middleware.DebugToolbarMiddleware', 'refarm_redirects.middleware.RedirectAllMiddleware', diff --git a/shopelectro/tests/tests_views.py b/shopelectro/tests/tests_views.py index dd99d6a1..395d8a4a 100644 --- a/shopelectro/tests/tests_views.py +++ b/shopelectro/tests/tests_views.py @@ -788,3 +788,21 @@ def test_disabled_cache(self): self.client.get(url)['Cache-Control'], 'max-age=0, no-cache, no-store, must-revalidate', ) + + +@tag('fast') +class Cart(TestCase): + + fixtures = ['dump.json'] + + def test_get_cart(self): + response = self.client.get(reverse('cart_get')) + self.assertEqual(response.status_code, 200) + self.assertTrue(json_to_dict(response)) + + def test_disabled_cache(self): + """Cache-Control is disabled for the cart-get.""" + self.assertEqual( + self.client.get(reverse('cart_get'))['Cache-Control'], + 'max-age=0, no-cache, no-store, must-revalidate', + ) diff --git a/shopelectro/urls.py b/shopelectro/urls.py index dde65396..cdb59f6a 100644 --- a/shopelectro/urls.py +++ b/shopelectro/urls.py @@ -87,6 +87,7 @@ def cache_page(arg): # Ignore PyFlakesBear ] ecommerce_urls = [ + url(r'^cart-get/$', never_cache(views.Cart.as_view()), name='cart_get'), url(r'^cart-add/$', views.AddToCart.as_view(), name='cart_add'), url(r'^cart-change/$', views.ChangeCount.as_view(), name='cart_set_count'), url(r'^cart-flush/$', views.FlushCart.as_view(), name='cart_flush'), diff --git a/shopelectro/views/ecommerce.py b/shopelectro/views/ecommerce.py index 5a2cc0d2..11488a92 100644 --- a/shopelectro/views/ecommerce.py +++ b/shopelectro/views/ecommerce.py @@ -34,6 +34,19 @@ def get_context_data(self, request, **kwargs): } +# @todo #789:60m Make cart routes REST style instead of RPC. + + +class Cart(ec_views.CartModifier): + + cart = SECart + position_model = Product + order_form = OrderForm + + def get(self, request): + return self.json_response(request) + + class AddToCart(ec_views.AddToCart): cart = SECart position_model = Product