示例#1
0
def cart(request):
    _cart = Cart(request)
    items = len(list(_cart.cart.item_set.all()))
    item_ct = get_model_content_type(Item)
    addon_ct = get_model_content_type(Addon)

    products = _cart.cart.item_set.filter(content_type=item_ct)
    addons = _cart.cart.item_set.filter(content_type=addon_ct)
    total_price = _cart.get_total_price()
    bonus_max = round(total_price * Decimal(str(0.1 / settings.DEFAULT_EXCHANGE_RATE)))
    service = None
    deliver_cost = None

    if products:
        # item could be deleted so careful
        try:
            service = products.all()[0].product.container.owner
            deliver_cost = service.get_deliver_cost(total_price)
        except ObjectDoesNotExist:
            _cart.cart.item_set.all().delete()
    context = {
        "cart": _cart,
        "kart": {
            "total_price": _cart.get_total_price(),
            "products": products,
            "cart_items": items or None,
            "addons": addons,
            "bonus_max": int(bonus_max),
            "service": service,
            "deliver_cost": int(deliver_cost) if deliver_cost is not None else None,
        },
    }

    return context
示例#2
0
文件: views.py 项目: stden/colortek
def remove_item_from_cart(request, item_pk):
    cart = Cart(request)
    item = get_object_or_404(Item, pk=item_pk)
    item_ct = get_model_content_type(Item)
    addon_ct = get_model_content_type(Addon)
    try:
        cart.remove(item)
        items = cart.cart.item_set.filter(content_type=item_ct).count()
        if items == 0:
            # remove all addons if items drops to zero
            cart.cart.item_set.filter(content_type=addon_ct).delete()
    except ItemDoesNotExist:
        return redirect('catalog:cart')
    return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))
示例#3
0
文件: forms.py 项目: stden/colortek
    def clean(self):
        # deliver_date, deliver_time
        dd = self.cleaned_data.get('deliver_date', None)
        dt = self.cleaned_data.get('deliver_time', None)

        cart = Cart(self.request)
        total_price = cart.get_total_price()
        item_ct = get_model_content_type(Item)
        item = cart.cart.item_set.filter(content_type=item_ct)

        minimal_cost = item[0].product.container.owner.minimal_cost if len(item) else 0
        if total_price < minimal_cost and total_price > 0:
            msg = _("Minimal cost for order is '%s' for this service, "
            "you should get more items to process") % minimal_cost
            self._errors['name'] = ErrorList([msg])

        if all((dd, dt)):
            now = datetime.now()
            offset = now + timedelta(minutes=30)
            st = datetime(dd.year, dd.month, dd.day, dt.hour, dt.minute, dt.second)
            if st <= offset:
                msg = _("You can not order in the past")
                self._errors['deliver_date'] = ErrorList([msg])

        return self.cleaned_data
示例#4
0
        def wrapper(request, *args, **kwargs):
            cart = Cart(request)
            pk = kwargs[field]
            if type == 'item':
                item = get_object_or_None(Item, pk=pk)
            elif type == 'addon':
                item = get_object_or_None(Addon, pk=pk)
            else:
                return func(request, *args, **kwargs)

            if not item:
                return func(request, *args, **kwargs)

            # always proceed if cart is clean
            if not cart.cart.item_set.count():
                return func(request, *args, **kwargs)
            item_ct = get_model_content_type(Item)
            addon_ct = get_model_content_type(Addon)

            if type == 'item':
                source_item = cart.cart.item_set.filter(
                    content_type=item_ct)[0]
                source_owner = source_item.product.container.owner
                dst_owner = item.container.owner
            elif type == 'addon':
                source_item = cart.cart.item_set.filter(
                    content_type=item_ct)[0]
                source_owner = source_item.product.container.owner
                dst_owner = item.list.container.owner
            else:
                source_owner = True
                dst_owner = False  # some sort of trick

            #validate source and dst owners
            if source_owner != dst_owner:
                messages.info(
                    request,
                    _("You can not order stuff with \
another services or providers")
                )
                return redirect(request.META.get('HTTP_REFERER', '/'))
            return func(request, *args, **kwargs)
示例#5
0
文件: forms.py 项目: stden/colortek
 def clean_deliver_cost(self):
     deliver_cost = self.cleaned_data['deliver_cost']
     _cart = Cart(self.request)
     item_ct = get_model_content_type(Item)
     items = _cart.cart.item_set.filter(content_type=item_ct)
     if items:
         owner = items[0].product.container.owner
         dcost = owner.get_deliver_cost(_cart.get_total_price())
         if dcost > deliver_cost:
             raise forms.ValidationError(
                 _("Deliver cost should not be lower than"
                 "'%s' value") % dcost
             )
     return deliver_cost
示例#6
0
文件: forms.py 项目: stden/colortek
 def save(self):
     addons = self.cleaned_data['addons']
     addon_ct = get_model_content_type(Addon)
     cart = Cart(self.request)
     for addon in addons:
         quantity = self.data.get('quantity-%s' % addon.pk, 0)
         addon_pk = addon.pk
         try:
             if int(quantity) > 0:
                 cart.add(addon, addon.get_cost(), quantity)
         except ItemAlreadyExists:
             cart_item = cart.cart.item_set.get(
                 object_id=addon_pk, content_type=addon_ct
             )
             cart_item.quantity += int(quantity)
             cart_item.save()
     return
示例#7
0
文件: forms.py 项目: stden/colortek
 def clean_addons(self):
     addons = self.cleaned_data['addons']
     cart = Cart(self.request)
     item_ct = get_model_content_type(Item)
     product = cart.cart.item_set.filter(content_type=item_ct)
     if not product:
         raise forms.ValidationError(_("You can not order addons without any items"))
     owner = product[0].product.container.owner
     for addon in addons:
         if owner != addon.list.container.owner:
             #messages.info(
             #    self.request,
             #    _("You can not order stuff with"
             #    "another services or providers")
             #)
             raise forms.ValidationError(_("You can not choose addons of the side services"))
     return addons
示例#8
0
文件: views.py 项目: stden/colortek
def cart(request):
    _cart = Cart(request)
    item_ct = get_model_content_type(Item)

    products = _cart.cart.item_set.filter(content_type=item_ct)
    context = {
        'cart': _cart, 'total_price': _cart.get_total_price(),
        'products': products,
    }
    if products:
        service = products.all()[0].product.container.owner
        return {
            'redirect': 'catalog:service-page',
            'redirect-args': (service.pk,)
        }
    else:
        context.update({
            '_template': 'catalog/cart.html'
        })
    return context
示例#9
0
文件: views.py 项目: stden/colortek
def add_addon_to_cart(request, addon_pk, quantity=1, checkout=False):
    cart = Cart(request)
    addon = get_object_or_404(Addon, pk=addon_pk)
    # item = get_object_or_404(Item, pk=item_pk)
    addon_ct = get_model_content_type(Addon)
    # item_ct = get_model_content_type(Item)
    try:
        # cart.add(addon, addon.cost, quantity, item_ct, item.pk)
        cart.add(addon, addon.get_cost(), quantity)
    except ItemAlreadyExists:
        cart_item = cart.cart.item_set.get(
            object_id=addon_pk, content_type=addon_ct
        )
        if checkout:
            cart_item.quantity = quantity
        else:
            cart_item.quantity += quantity
        cart_item.save()
        return redirect('catalog:cart')
    return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))
示例#10
0
文件: forms.py 项目: stden/colortek
    def clean(self):
        cd = self.cleaned_data
        item = self.cleaned_data.get('item') or None
        item_instance = get_object_or_None(Item, pk=item)

        if item_instance:
            cart = Cart(self.request)
            item_ct = get_model_content_type(Item)
            items = cart.cart.item_set.filter(content_type=item_ct)
            if items:
                cart_item = items[0].product
                if cart_item.container.owner != item_instance.container.owner:
                    dst = item_instance.container.owner.service_name or "-"
                    src = cart_item.container.owner.service_name or "-"

                    msg = _("You can not add multiply service items")
                    if settings.PARTNER_ORDER_ITEM_MESSAGES_WARNING:
                        messages.warning(
                            self.request,
                            _('You\'re trying to stock items from "%(dst)s" delivery. '
                            'Do you want to cleanse "%(src)s" items?') % {
                                'dst': dst,
                                'src': src
                            },
                            extra_tags='cleanse_cart'
                        )

                    self._errors['item'] = ErrorList([msg, 400])
                    if 'item' in cd:
                        del cd['item']
        else:
            msg = _("No item was found with such id")
            self._errors['item'] = ErrorList([msg])
            if 'item' in cd:
                del cd['item']
        return cd
示例#11
0
文件: views.py 项目: stden/colortek
def service_orders_nc(request):
    dt = {}
    if not any((request.user.is_operator, request.user.is_partner)):
        raise Http404("Because I want")

    # if request.user.is_partner:
    #    return {'redirect': 'catalog:service-orders-confirmed'}

    client = request.GET.get('client', '')
    items = request.GET.get('item', '')
    min_cost = request.GET.get('min_cost', None)
    max_cost = request.GET.get('max_cost', None)
    date = request.GET.get('date', None)
    _format = request.GET.get('format', None)
    status = deepcopy(request.GET.getlist('status', []))

    statuses = ['finished', 'rejected', 'processed', 'approved']
    statuses_not_confirmed = [
        'not_confirmed',
        'checking'
    ]
    if request.user.is_partner:
        statuses.pop(statuses.index('approved'))
        statuses_not_confirmed.append('approved')
        statuses_not_confirmed.pop(statuses_not_confirmed.index('not_confirmed'))
        statuses_not_confirmed.pop(statuses_not_confirmed.index('checking'))

    orders = Order.objects.filter(status__in=statuses_not_confirmed).order_by('-id')
    offset = datetime.now() - timedelta(**settings.NOT_CONFIRMED_INTERVAL)
    orders_nc = Order.objects.filter(
        status__in=statuses_not_confirmed,
        created_on__lte=offset
    ).order_by('created_on')
    not_confirmed = orders_nc.count()

    if request.user.is_partner:
        orders = orders.exclude(status__in=['not_confirmed', 'checking'])
        not_confirmed = orders.count()
    if min_cost:
        orders = orders.filter(cost__gte=min_cost)
    if max_cost:
        orders = orders.filter(cost__lte=max_cost)
    if client:
        orders = (orders.filter(offline_client__name__icontains=client))
    if date:
        _date = datetime.strptime(date, '%d.%m.%Y')
        _stop_date = _date + timedelta(hours=23, minutes=59, seconds=59)
        orders = orders.filter(
            created_on__gte=_date, created_on__lte=_stop_date
        )
        # filtering for partners
    if request.user.is_partner and not request.user.is_operator:
        orders = orders.filter(container__owner=request.user)
        dt.update({'_template': 'catalog/service_partner_orders.html'})

    if items:
        itemz = Item.objects.filter(title__icontains=items)
        addons = Addon.objects.filter(title__icontains=items)

        items_ct = get_model_content_type(Item)
        addon_ct = get_model_content_type(Addon)
        item_containers = OrderContainer.objects.filter(
            content_type=items_ct, object_id__in=itemz
        )
        addon_containers = OrderContainer.objects.filter(
            content_type=addon_ct, object_id__in=addons
        )

        orders = (
            orders.filter(order_container_order_set__in=item_containers) |
            orders.filter(order_container_order_set__in=addon_containers)
        ).distinct()

    if 'is_paid' in status:
        orders = orders.filter(is_paid=True)
        status.pop(status.index('is_paid'))

    if status:
        orders = orders.filter(
            Q(status__in=status)  # | Q(is_paid=is_paid)
        )
    total_price = sum([i['cost'] - i.get('discount', 0) for i in
                       orders.values('cost', 'discount')])

    orders = process_filter_orders(request, orders)
    if _format == 'csv':
        return {
            '_template': 'catalog/service_orders.csv',
            '_content_type': 'text/csv',
            'orders': orders
        }
    dt.update({
        'orders': orders,
        'orders_nc': orders_nc,
        'total_price': total_price,
        'not_confirmed': not_confirmed,
        'ORDERS': ORDER_STATUSES,
        'G': request.GET,
        'status': request.GET.getlist('status', []),
    })
    # if not request.session.get('city'):
    #     geoip(request)
    return dt
示例#12
0
文件: views.py 项目: stden/colortek
def service_orders(request):
    dt = {}
    if not any((request.user.is_operator, request.user.is_partner)):
        raise Http404("Because I want")
    status = deepcopy(request.GET.getlist('status', ''))
    client = request.GET.get('client', '')
    items = request.GET.get('item', '')
    min_cost = request.GET.get('min_cost', None)
    max_cost = request.GET.get('max_cost', None)
    date = request.GET.get('date', None)
    _format = request.GET.get('format', None)

    excludes = ['not_confirmed',
                'approved',
                'checking'
    ]
    statuses = [
        'approved',
        'finished',
        'rejected',
        'processed',
    ]

    if request.user.is_partner:
        # excludes.pop(excludes.index('approved'))
        statuses.pop(statuses.index('approved'))
        if settings.HIDE_REJECTED_FROM_PARTNER:
            excludes.append('rejected')
    if request.user.is_operator:
        excludes.pop(excludes.index('approved'))

    is_paid = ('is_paid' in status)
    if is_paid:
        status.pop(status.index('is_paid'))

    orders = Order.objects.order_by('-id')

    orders = orders.filter(status__in=statuses)
    if is_paid:
        orders = orders.filter(is_paid=is_paid)

    # if request.user.is_partner:
    #    orders = orders.exclude(status='rejected')
    not_confirmed = orders.filter(status='not_confirmed').count()
    if min_cost:
        orders = orders.filter(cost__gte=min_cost)
    if max_cost:
        orders = orders.filter(cost__lte=max_cost)
    if status:
        orders = orders.filter(status__in=status)
    if client:
        orders = (
            orders.filter(offline_client__name__icontains=client)
        )
    if date:
        _date = datetime.strptime(date, '%d.%m.%Y')
        _stop_date = _date + timedelta(hours=23, minutes=59, seconds=59)
        orders = orders.filter(
            created_on__gte=_date, created_on__lte=_stop_date
        )

    # filtering for partners
    if request.user.is_partner and not request.user.is_operator:
        orders = orders.filter(container__owner=request.user)
        dt.update({'_template': 'catalog/service_partner_orders.html'})

    if items:
        itemz = Item.objects.filter(title__icontains=items)
        addons = Addon.objects.filter(title__icontains=items)

        items_ct = get_model_content_type(Item)
        addon_ct = get_model_content_type(Addon)
        item_containers = OrderContainer.objects.filter(
            content_type=items_ct, object_id__in=itemz
        )
        addon_containers = OrderContainer.objects.filter(
            content_type=addon_ct, object_id__in=addons
        )

        orders = (
            orders.filter(order_container_order_set__in=item_containers) |
            orders.filter(order_container_order_set__in=addon_containers)
        ).distinct()

    total_price = sum([i['cost'] - i.get('discount', 0) for i in
                       orders.values('cost', 'discount')])
    orders = process_filter_orders(request, orders)

    if _format == 'csv':
        return {
            '_template': 'catalog/service_orders.csv',
            '_content_type': 'text/csv',
            'orders': orders
        }

    dt.update({
        'orders': orders,
        'total_price': total_price,
        'not_confirmed': not_confirmed,
        'ORDERS': ORDER_STATUSES,
        'G': request.GET,
        'status': request.GET.getlist('status', []),
        'has_status': True
    })
    return dt
示例#13
0
文件: views.py 项目: stden/colortek
def order(request):
    form = OrderForm(request.POST or None, request=request)
    if request.method == 'POST':
        if form.is_valid():
            order = form.save(commit=False)
            cart = Cart(request)
            item_ct = get_model_content_type(Item)
            addon_ct = get_model_content_type(Addon)

            for item in cart.cart.item_set.filter(content_type=item_ct):
                container = item.product.container
                service = container.service
                break
            order.service = service
            order.container = container
            order.offline_client = form.save_offline_client()
            order.commission = container.owner.commission
            order.save()
            # generating discount
            discount = form.cleaned_data['discount'] or 0
            if discount:
                discount_transaction = BonusTransaction.objects.create(
                    client=request.user,
                    order=order,
                    amount=str(discount * -1),
                    is_processed=False,
                    is_discount=True,
                    description='discount'
                )
                if order.client:
                    order.client.reload_bonus_score(rebuild=True)
            order.generate_vote_instance()

            # saving items and addons as order relations
            # savin items
            # for item in cart.cart.item_set.filter(content_type=item_ct):
            #    order_container = OrderContainer.objects.create(
            #        content_type=item_ct, object_id=item.product.pk,
            #        quantity=item.quantity,
            #        total_price=item.total_price,
            #        order=order)
            #
            # savin addons separate inside of items
            # for addon in cart.cart.item_set.filter(content_type=addon_ct):
            #    order_container_item = OrderContainer.objects.get(
            #        content_type=item_ct,
            #        object_id=addon.link.pk, order=order)
            #    order_container = OrderContainer.objects.create(
            #        parent=order_container_item,
            #        content_type=addon_ct,
            #        object_id=addon.product.pk,
            #        total_price=addon.total_price,
            #        order=order)

            for item in cart:
                if isinstance(item.product, Item):
                    order_container = OrderContainer.objects.create(
                        content_type=item_ct, object_id=item.product.pk,
                        quantity=item.quantity,
                        total_price=item.total_price,
                        order=order)
                    # for x in range(item.quantity):
                    #    order.items.add(item.product)
                elif isinstance(item.product, Addon):
                    order_container = OrderContainer.objects.create(
                        content_type=addon_ct, object_id=item.product.pk,
                        quantity=item.quantity,
                        total_price=item.total_price,
                        order=order)
                    # for x in range(item.quantity):
                    #    order.addons.add(item.product)
                else:
                    pass

            cart.delete_items()

            if order.status == 'not_confirmed':
                for i in User.objects.filter(is_operator=True):
                    emails = i.get_emails()
                    phone = order.container.owner.phone
                    link = reverse('catalog:service-orders')
                    async_send_mail(
                        unicode(_(u"Поступил новый заказ")),
                        render_to_string(settings.NEW_ORDER_MESSAGE_TEMPLATE_NAME,
                                         {'link': link, 'object': order, 'order_statuses': ORDER_STATUSES,
                                          'site_url': settings.SITE_URL}),
                        settings.EMAIL_FROM,
                        emails
                    )
                    # message.content_subtype = 'html'

                    # message.send(fail_silently=True)
            if form.cleaned_data['payment_redirect'] == 'online':
                order = form.instance
                url = order.get_online_payment_url()
                return {
                    'payment_redirect': url,
                    'order_id': form.instance.pk,
                    'order_amount': order.cost
                }
            return {
                # 'redirect': 'catalog:order-success',
                'order_id': form.instance.pk,
                'order_amount': order.cost
            }
    addon_ct = get_model_content_type(Addon)
    item_ct = get_model_content_type(Item)
    cart = Cart(request)
    products = cart.cart.item_set.filter(content_type=item_ct)
    addons = cart.cart.item_set.filter(content_type=addon_ct)

    return {
        'form': form,
        'products': products,
        'addons': addons
    }