소스 검색

Add is_ajax helper to utils.py (#3741)

master
Martin Winkel 3 년 전
부모
커밋
b63467fc3b
No account linked to committer's email address
3개의 변경된 파일17개의 추가작업 그리고 4개의 파일을 삭제
  1. 2
    1
      docs/source/releases/v3.2.rst
  2. 3
    3
      src/oscar/apps/basket/views.py
  3. 12
    0
      src/oscar/core/utils.py

+ 2
- 1
docs/source/releases/v3.2.rst 파일 보기

@@ -34,7 +34,8 @@ Removal of deprecated features
34 34
 Minor changes
35 35
 ~~~~~~~~~~~~~
36 36
 
37
-
37
+- Added a new helper ``core.utils.is_ajax`` which replicates the logic of Django's ``HttpRequest.is_ajax``
38
+  method that was deprecated in Django 3.1.
38 39
 
39 40
 .. _dependency_changes_in_3.2:
40 41
 

+ 3
- 3
src/oscar/apps/basket/views.py 파일 보기

@@ -14,7 +14,7 @@ from oscar.apps.basket.signals import (
14 14
 from oscar.core import ajax
15 15
 from oscar.core.compat import url_has_allowed_host_and_scheme
16 16
 from oscar.core.loading import get_class, get_classes, get_model
17
-from oscar.core.utils import redirect_to_referrer, safe_referrer
17
+from oscar.core.utils import is_ajax, redirect_to_referrer, safe_referrer
18 18
 
19 19
 Applicator = get_class('offer.applicator', 'Applicator')
20 20
 (BasketLineForm, AddToBasketForm, BasketVoucherForm, SavedLineForm) = get_classes(
@@ -186,7 +186,7 @@ class BasketView(ModelFormSetView):
186 186
             response = super().formset_valid(formset)
187 187
 
188 188
         # If AJAX submission, don't redirect but reload the basket content HTML
189
-        if self.request.headers.get('x-requested-with') == 'XMLHttpRequest':
189
+        if is_ajax(self.request):
190 190
             # Reload basket and apply offers again
191 191
             self.request.basket = get_model('basket', 'Basket').objects.get(
192 192
                 id=self.request.basket.id)
@@ -247,7 +247,7 @@ class BasketView(ModelFormSetView):
247 247
             "Your basket has got some issues. "
248 248
             "Please correct any validation errors below."))
249 249
 
250
-        if self.request.headers.get('x-requested-with') == 'XMLHttpRequest':
250
+        if is_ajax(self.request):
251 251
             ctx = self.get_context_data(formset=formset,
252 252
                                         basket=self.request.basket)
253 253
             return self.json_response(ctx, flash_messages)

+ 12
- 0
src/oscar/core/utils.py 파일 보기

@@ -183,3 +183,15 @@ def round_half_up(money):
183 183
     Decimal('1.01')
184 184
     """
185 185
     return money.quantize(decimal.Decimal('0.01'), decimal.ROUND_HALF_UP)
186
+
187
+
188
+def is_ajax(request):
189
+    """
190
+    Django 3.1 deprecated the  HttpRequest.is_ajax method as it relies on
191
+    a jQuery-specific way of signifying AJAX calls.
192
+
193
+    https://docs.djangoproject.com/en/3.1/releases/3.1/#id2
194
+
195
+    For Oscar projects that's usually not a concern though.
196
+    """
197
+    return request.META.get("HTTP_X_REQUESTED_WITH") == "XMLHttpRequest"

Loading…
취소
저장