Last active
November 13, 2016 01:07
-
-
Save rightx2/6dcd6c3f9e7a65272c2c80b9c7da946c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def post(self, request, *args, **kwargs): | |
''' | |
ajax -> just orderForm validation check | |
general request -> Create order data after payment | |
''' | |
# OrderForm validation check | |
if request.is_ajax(): | |
form = OrderForm( | |
request.POST, | |
) | |
if form.is_valid(): | |
return JsonResponse( | |
data={ | |
"valid": True, | |
} | |
) | |
else: | |
return JsonResponse( | |
data={ | |
"valid": False, | |
"errors": form.errors | |
} | |
) | |
# Create Order db after paying | |
else: | |
merchant_uid = request.POST.get('merchant_uid') | |
# Disable javascript한 경우도 고려해주기.. | |
# 이 경우, submit버튼 누르면, 아무 check 없이 바로 | |
# OrderView의 post로 오게되고, | |
# 그냥 빈 Order 데이터가 생기는 것을 방지하기 위함임 | |
pay_info = services.payment_information( | |
merchant_uid | |
) | |
if not pay_info: | |
return HttpResponseForbidden( | |
'결제가 이루어지지 않은 거래입니다. <a href="/"> 홈으로 가기 </a>' | |
) | |
# create order | |
# 무조건 valid한 merchant_id만 오게 되어있음. | |
# 조작하면 --> OrderPayCheckView 에서 알아서 걸러짐 | |
order_form = OrderForm(request.POST) | |
order = order_form.save(user=request.user) | |
if request.session.get('from_product'): | |
item_data = request.session['item'] | |
variation = Variation.objects.get(id=item_data['variation']) | |
Item.objects.create( | |
order=order, | |
variation=variation, | |
width=item_data['width'], | |
height=item_data['height'], | |
quantity=item_data['quantity'] | |
) | |
del request.session['item'] | |
else: | |
for item in request.user.cart.item_set.all(): | |
item.order = order | |
item.cart = None | |
item.save() | |
try: | |
# 순서는 항상 server_merchant_uid가 먼저 delete되어야함 | |
# from_product먼저 지우면 exception발생할 수도 있음 | |
del request.session['server_merchant_uid'] | |
# from_product를 delete하지 않는 이유는 | |
# 만약 지운다면, 다음과 같은 경우가 발생한다 | |
# 마트에 물건 A가 있음. 그상태에서 물건 B를 buy-now로 구매함 | |
# 결제가 완료되고 주문도 완료됨. order/success페이지에서 | |
# 뒤로가기를 누르면 --> 뜬금포로 카트에 있는 물건A페이지가 나와버리기 때문 | |
# 이게 다 request.session['from_product']를 지워서 그런거임 | |
# 어차피 얘는 지워도 상관없는 것이, 장바구니에 들어가거나 | |
# buy-now 를 때리면 바로바로 갱신되기 때문에 굳이 del안해도됨 | |
# del request.session['from_product'] | |
except: | |
pass | |
request.session['order_complete'] = True | |
return redirect(reverse('orders:order_success')) | |
def test_OrderForm_invalid_data_on_ajax_POST_request(self): | |
response = self.client.post( | |
reverse('orders:order'), | |
{ | |
"merchant_uid": "1475633246629", | |
"customer_name": "ㅎ", | |
"address": "서울특별시" | |
"address_detail": "상세주소", | |
"postal_code": "123-456", | |
"phone_number": "01012341-234", # invalid field | |
"email": "[email protected]", | |
"work_date": "2016-01-01", | |
}, | |
HTTP_X_REQUESTED_WITH='XMLHttpRequest' | |
) | |
self.assertFalse(response.json()['valid']) | |
self.assertIsNotNone(response.json()['errors']) | |
self.assertTrue(len(response.json()['errors'])) | |
self.assertIsNotNone(response.json()['errors']['phone_number']) | |
# js side | |
function OrderFormCheck(IMP) { | |
var formData = $("#order-form").serialize(); | |
var orderURL = $('#order-form').attr('action'); | |
var dataValid; | |
$.ajax({ | |
type: "POST", | |
url: orderURL, | |
data: formData, | |
success: function(data) { | |
if (data.valid){ | |
IMPORT_pay(IMP); | |
} else{ | |
// error들을 표시한다 | |
for (var key in data.errors){ | |
var element_id = "#div_id_" + key; | |
var element = $(element_id); | |
var error_element = $('<span />').attr('id', 'error_id_' + key).attr('class', 'help-block').html(data.errors[key]); | |
element.addClass('has-error'); | |
element.append(error_element); | |
} | |
} | |
}, | |
error: function(response, error) { | |
console.log(error); | |
} | |
}); | |
}; | |
$("#order-submit").click(function(event){ | |
event.preventDefault(); // | |
// 모든 input div element의 error를 없앤다 | |
$('.has-error span').hide(); | |
$('form > div').removeClass('has-error'); | |
OrderFormCheck(IMP); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment