Skip to content

Instantly share code, notes, and snippets.

@rightx2
Last active November 13, 2016 01:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rightx2/6dcd6c3f9e7a65272c2c80b9c7da946c to your computer and use it in GitHub Desktop.
Save rightx2/6dcd6c3f9e7a65272c2c80b9c7da946c to your computer and use it in GitHub Desktop.
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": "asdf@gmail.com",
"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