Exemplo n.º 1
0
Arquivo: views.py Projeto: z0rr0/eshop
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))
Exemplo n.º 2
0
Arquivo: views.py Projeto: z0rr0/eshop
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)
Exemplo n.º 3
0
Arquivo: views.py Projeto: z0rr0/eshop
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)
Exemplo n.º 4
0
Arquivo: views.py Projeto: z0rr0/eshop
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)
Exemplo n.º 5
0
Arquivo: views.py Projeto: z0rr0/eshop
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)
Exemplo n.º 6
0
Arquivo: views.py Projeto: z0rr0/eshop
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)
Exemplo n.º 7
0
Arquivo: views.py Projeto: z0rr0/eshop
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)
Exemplo n.º 8
0
Arquivo: views.py Projeto: z0rr0/eshop
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))
Exemplo n.º 9
0
Arquivo: views.py Projeto: z0rr0/eshop
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)
Exemplo n.º 10
0
Arquivo: views.py Projeto: z0rr0/eshop
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)