示例#1
0
文件: views.py 项目: pincoin/rakmai
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)
示例#2
0
文件: views.py 项目: pincoin/rakmai
 def post(self, request, store):
     if request.is_ajax():
         cart = Cart(request.session, shop_settings.CARD_CART_SESSION_KEY)
         cart.clear()
         return JsonResponse({})
示例#3
0
文件: views.py 项目: pincoin/rakmai
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))