class OrderAgainView(LoginRequiredMixin, StoreContextMixin, HostRestrict, generic.FormView): logger = logging.getLogger(__name__) sub_domain = 'card' form_class = forms.DummyForm def form_valid(self, form): queryset = models.Order.objects \ .valid(self.request.user) \ .select_related('parent') \ .prefetch_related('products', 'products__codes') order = get_object_or_404(queryset, order_no=self.kwargs['uuid']) self.cart = Cart(self.request.session, shop_settings.CART_SESSION_KEY) self.cart.clear() order_product_dict = { op.code: op.quantity for op in order.products.all() } products = models.Product.objects \ .enabled() \ .available() \ .filter(code__in=order_product_dict.keys()) for product in products: self.cart.add(product=product, price=product.pg_selling_price, quantity=order_product_dict[product.code]) return super(OrderAgainView, self).form_valid(form) def form_invalid(self, form): return JsonResponse({ 'status': 'false', 'message': 'Bad Request' }, status=400) def get_success_url(self): return reverse('card:cart', args=(self.store.code, )) def get_template_names(self): return 'card/{}/error.html'.format(self.store.theme)
def post(self, request, store): if request.is_ajax(): cart = Cart(request.session, shop_settings.CARD_CART_SESSION_KEY) cart.clear() return JsonResponse({})
class CartView(LoginRequiredMixin, StoreContextMixin, HostRestrict, generic.CreateView): logger = logging.getLogger(__name__) sub_domain = 'card' form_class = OrderForm def get_context_data(self, **kwargs): context = super(CartView, self).get_context_data(**kwargs) context['page_title'] = _('Cart') try: member = Profile.objects.select_related('user').get( user__pk=self.request.user.id) context['member'] = member except Profile.DoesNotExist: raise Http404('Your profile does not exist.') return context def get_form_kwargs(self): kwargs = super(CartView, self).get_form_kwargs() self.cart = Cart(self.request.session, shop_settings.CARD_CART_SESSION_KEY) kwargs['cart'] = self.cart kwargs['request'] = self.request return kwargs def get_template_names(self): return 'card/{}/cart.html'.format(self.store.theme) def form_valid(self, form): order_product_list = [] total_list_price = 0 total_selling_price = 0 # 1. Construct order products for item in self.cart.items: order_product_list.append( models.OrderProduct( order=None, name=item.product.name, subtitle=item.product.subtitle, code=item.product.code, list_price=item.product.list_price, selling_price=item.product.pg_selling_price, quantity=item.quantity, )) total_list_price += item.product.list_price * item.quantity total_selling_price += item.product.pg_selling_price * item.quantity # 2. Setup order meta information form.instance.ip_address = get_client_ip(self.request)[0] form.instance.user = self.request.user pattern = re.compile(r'^[가-힣]+$') # Only Hangul if pattern.match(self.request.user.last_name) and pattern.match( self.request.user.first_name): form.instance.fullname = '{}{}'.format( self.request.user.last_name, self.request.user.first_name) else: form.instance.fullname = '{} {}'.format( self.request.user.first_name, self.request.user.last_name) form.instance.accept_language = self.request.META['HTTP_ACCEPT_LANGUAGE'] \ if 'HTTP_ACCEPT_LANGUAGE' in self.request.META.keys() else _('No language set') form.instance.user_agent = self.request.META['HTTP_USER_AGENT'] form.instance.total_list_price = total_list_price form.instance.total_selling_price = total_selling_price # Restrict currency according to payment method form.instance.currency = 'KRW' response = super(CartView, self).form_valid(form) # 3. Associate order for product in order_product_list: product.order = self.object models.OrderProduct.objects.bulk_create(order_product_list) # 4. Destroy cart session self.cart.clear() # 5. Send notification email html_message = render_to_string( 'card/{}/email/order_complete.html'.format(self.store.theme), { 'order': self.object, 'store_code': self.store.code }) send_notification_email.delay( _('[site] Order complete: {}').format(self.object.order_no), 'dummy', settings.EMAIL_NO_REPLY, [self.request.user.email], html_message, ) return response def get_success_url(self): return reverse('card:order-detail', args=(self.store.code, self.object.order_no))