def cart(request): """It showes customer's cart and allows to change products numbers. """ cart = Cart(request) products = cart.get() products_ids = {p.id: p for p in products} OrderFormSet = formset_factory(OrderForm, extra=0) if request.method == 'POST': formset = OrderFormSet(request.POST) if formset.is_valid() and formset.has_changed(): for cd in formset.cleaned_data: product = get_object_or_404(Product, pk=cd['product']) cart.add_or_update(product, cd['count']) else: data = [{'product': p.id, 'count': c} for p, c in products.items()] formset = OrderFormSet(initial=data) for form in formset: form.product_info = products_ids[int(form.hidden_fields()[0].value())] context = { 'products': products, 'formset': formset, 'cart_count': cart.count(), 'total': cart.total(), } return cart.set(render(request, 'sales/cart.html', context))
def registration(request): """User registration""" if request.user.is_authenticated(): return redirect(reverse('index')) if request.method == 'POST': form = Registration(request.POST) if form.is_valid(): data = form.cleaned_data with transaction.atomic(): user = User( username=data['email'], first_name=data['first_name'], last_name=data['last_name'], email=data['email'], ) user.set_password(data['password']) user.save() customer = Customer( user=user, phone=data['phone'], patronymic=data['middle_name'], ) customer.save() return redirect(reverse('profile')) else: form = Registration() cart = Cart(request) context = { 'form': form, 'cart_count': cart.count(), } return render(request, 'accounts/create.html', context)
def update(request): """User profile update""" if not hasattr(request.user, 'customer'): raise Http404("user is not related with a customer") customer = request.user.customer if request.method == 'POST': form = Profile(request.POST) if form.is_valid(): data = form.cleaned_data with transaction.atomic(): user = customer.user user.first_name = data['first_name'] user.last_name = data['last_name'] user.email = user.username = data['email'] user.save() customer.patronymic = data['middle_name'] customer.phone = data['phone'] customer.save() return redirect(reverse('profile')) else: data = { 'first_name': customer.user.first_name, 'middle_name': customer.patronymic, 'last_name': customer.user.last_name, 'email': customer.user.email, 'phone': customer.phone, } form = Profile(data) cart = Cart(request) context = { 'customer': request.user.customer, 'form': form, 'cart_count': cart.count(), } return render(request, 'accounts/update.html', context)
def confirm(request): """It confirms a customer's order and sets delivery address """ if not hasattr(request.user, 'customer'): raise Http404("user is not related with a customer") customer = request.user.customer cart = Cart(request) if cart.is_empty(): # empty cart can't approve any order return redirect(reverse('index')) products = [] try: for product, count in cart.get().items(): product.count = count product.total = round(product.price * int(count), 2) products.append(product) except (ValueError,) as err: raise Http404(err) if request.method == 'POST': form = DeliveryForm(request.POST) form.set_choises(customer) if form.is_valid(): data = form.cleaned_data with transaction.atomic(): if data['new']: # create new delivery address delivery = Delivery( customer=customer, address=data['new'], ) delivery.save() else: # use existed address delivery = get_object_or_404(Delivery, pk=data['existed']) order = Order( customer=customer, desc=data['comment'], ) order.save() for product in products: ProductSet.objects.create( product=product, order=order, number=product.count, ) return cart.clean(redirect(reverse('order', args=[order.id]))) else: form = DeliveryForm() form.set_choises(customer) context = { 'products': products, 'cart_count': cart.count(), 'total': cart.total(), 'form': form, } return render(request, 'sales/confirm.html', context)
def show(request, id): """Product card page""" product = get_object_or_404(Product, pk=id) cart = Cart(request) context = { 'product': product, 'in_cart': cart.has(product), 'cart_count': cart.count(), } return render(request, 'sales/show.html', context)
def order(request, id): if not hasattr(request.user, 'customer'): raise Http404("user is not related with a customer") cart = Cart(request) order = get_object_or_404(Order, pk=id, customer=request.user.customer) context = { 'order': order, 'cart_count': cart.count(), } return render(request, 'sales/order.html', context)
def orders(request): if not hasattr(request.user, 'customer'): raise Http404("user is not related with a customer") cart = Cart(request) orders = request.user.customer.order_set.all() context = { 'orders': orders, 'cart_count': cart.count(), } return render(request, 'sales/orders.html', context)
def add(request, id): """It adds the product to the Cart""" product = get_object_or_404(Product, pk=id) cart = Cart(request) cart.add_or_update(product, 1) context = { 'product': product, 'in_cart': cart.has(product), 'cart_count': cart.count(), } return cart.set(render(request, 'sales/show.html', context))
def profile(request): if not hasattr(request.user, 'customer'): LOGGER.error("user is not related with a customer") raise Http404("user is not related with a customer") cart = Cart(request) context = { 'customer': request.user.customer, 'cart_count': cart.count(), 'customer': request.user.customer, } return render(request, 'accounts/profile.html', context)
def index(request): categories = Category.objects.all().order_by('name') # filter params: page, category, name category = None params = {'cat_url': [], 'page_url': []} products = Product.objects.all().order_by('-modified') # text search filter search = request.GET.get('name', '') if search: products = products.filter(name__icontains=request.GET['name']) params['cat_url'].append('name=' + request.GET['name']) params['page_url'].append('name=' + request.GET['name']) # categories filter try: if request.GET.get('cat'): category = Category.objects.get(pk=int(request.GET['cat'])) products = products.filter(category=category) params['page_url'].append('cat=' + str(category.id)) except (ValueError, Category.DoesNotExist) as err: LOGGER.error(err) # pagination filter paginator = Paginator(products, settings.PRODUCTS_ON_PAGE) page = request.GET.get('page', 1) try: products = paginator.page(page) except PageNotAnInteger: page = 1 products = paginator.page(page) except EmptyPage: page = paginator.num_pages products = paginator.page(page) params['cat_url'].append('page=' + str(page)) cart = Cart(request) context = { 'categories': categories, 'request': request, 'params': params, 'products': products, 'search': search, 'category': category, 'cart_count': cart.count(), } return render(request, 'sales/index.html', context)