示例#1
0
文件: signals.py 项目: stden/colortek
def order_post_save_action(instance, **kwargs):
    bonus_rate = settings.DEFAULT_BONUS_RATE
    bonus_threshold = settings.DEFAULT_BONUS_RATE_THRESHOLD
    # do not proceed offline orders
    if not instance.client:
        return instance

    invites = instance.client.invite_reciever_user_set.filter(
        is_expired=False, is_verified=True
    ).order_by('id')  # order by first invite initiated

    if instance.status == 'rejected':
        bonuses = instance.bonus_order_set.filter(amount__lt=0)
        bonuses.delete()
        if instance.client:
            instance.client.reload_bonus_score(rebuild=True)

    if instance.status == 'approved':
        mail_code = MailCode()
        mail_code.save()
        emails = instance.container.owner.get_emails()
        phone = instance.container.owner.phone
        link = reverse('catalog:service-orders')

        async_send_mail(
            subject=unicode(_(u"Поступил новый заказ")),
            body=render_to_string(settings.NEW_ORDER_MESSAGE_TEMPLATE_NAME,
    {'link': link, 'object': instance, 'order_statuses': ORDER_STATUSES,
    'site_url': settings. SITE_URL,
    'refuse_url': reverse_lazy('catalog:update_order_status',
                     kwargs=dict(pk=instance.pk, status='rejected')),
     'accept_url': reverse_lazy('catalog:update_order_status',
                     kwargs=dict(pk=instance.pk, status='finished')),
     'mail_code': mail_code,
     }),
            from_email=settings.EMAIL_FROM,
            recipient_list=emails,
        )
        amount = instance.cost
        amount_curr = numeral.choose_plural(int(round(float(str(amount)))), (u"рубль", u"рубля", u"рублей"))
        sms = SMSLogger.objects.create(
            provider='disms',
            text=settings.NEW_ORDER_SMS % {
                'time': instance.created_on.strftime("%H:%M"),
                'amount': "%s %s" % (amount, amount_curr)
            },
            phone=phone
        )
        sms.send_message()
        sms.save()

        amount_bonus = (
                instance.cost / Decimal(str(bonus_threshold)) *
                Decimal(str(bonus_rate))
        )
        if instance.client:
            user_sms = SMSLogger.objects.create(
                provider='disms',
                text=settings.USER_ORDER % {
                    'amount': amount_bonus,
                },
                phone=instance.client.phone
            )
            user_sms.send_message()
            user_sms.save()

    if instance.status == 'processed':
        # send votes
        for vote in instance.votes.all():
            if vote.is_send:
                continue

            link = settings.SITE_URL + reverse(
                'catalog:order-vote', args=(vote.sid,)
            )
            email = vote.client.email
            company = vote.order.container.owner.service_name
            message = unicode(settings.VOTE_MESSAGE % {
                'link': link,
                'company': company
            })

            async_send_mail(
                subject=unicode(_("Please vote for your order")),
                # message=unicode(settings.VOTE_MESSAGE % {
                #    'link': link,
                #    'company': company
                # }),
                body=message,
                from_email=settings.EMAIL_FROM,
                recipient_list=[email, ],
                fail_silently=True
            )
            # if not vote.is_send and vote.client.phone and settings.SEND_VOTE_SMS_ACTIVE:
            #    sms = SMSLogger.objects.create(
            #        provider='disms', text=unicode(message), phone=vote.client.phone
            #    )
            #    sms.send_message()

            vote.is_send = True
            vote.save()

        # create bonuses
        # only for authenticated users
        # saving bonus transaction

        total_price = (instance.cost - instance.discount)

        if instance.client:
            amount = (
                total_price / Decimal(str(bonus_threshold)) *
                Decimal(str(bonus_rate))
            )
            kw = dict(
                client=instance.client,
                order=instance,
                amount=amount,
                description="bonus up"
            )
            bonus_transaction = BonusTransaction.objects.filter(**kw)
            if bonus_transaction:
                bonus_transaction[0].save()
                bonus_transaction[0].client.reload_bonus_score(rebuild=True)
            else:
                kw.update({
                    'is_processed': False,
                    'is_discount': False,
                })
                bonus_transaction = BonusTransaction.objects.create(**kw)

        if instance.client:
            # initial
            if settings.FIRST_USER_ORDER_BONUS_ENABLE:
                kw = {
                    'client': instance.client,
                    'amount': Decimal(str(settings.FIRST_ORDER_BONUS)),
                    'description': 'first %s user bonus' % instance.client.pk
                }
                transaction = BonusTransaction.objects.filter(**kw)
                if not transaction:
                    transaction = BonusTransaction.objects.create(**kw)
                    phone = instance.client.phone

                    bonus_amount = (
                        total_price / Decimal(str(bonus_threshold)) *
                        Decimal(str(bonus_rate))
                    )

                    sms = SMSLogger.objects.get_or_create(
                        provider='disms',
                        text=settings.FIRST_USER_ORDER % {
                            'amount': settings.FIRST_ORDER_BONUS,
                            'bonus_amount': bonus_amount
                        },
                        phone=phone
                    )
                    sms[0].send_message()
                    sms[0].save()
                else:
                    transaction = transaction[0]
                transaction.client.save()
                transaction.client.reload_bonus_score(rebuild=True)

    if invites:
        count = instance.client.orders.count()
        if count == 1:
            sender = invites[0].sender  # use only first sender
            # invited
            transaction = BonusTransaction.objects.filter(
                client=sender,
                amount=Decimal(str(settings.BONUS_PER_INVITE_ORDER)),
                description='invited %s user' % instance.client.pk
            )

            if not transaction:
                transaction = BonusTransaction.objects.create(
                    client=sender,
                    amount=Decimal(str(settings.BONUS_PER_INVITE_ORDER)),
                    description='invited %s user' % instance.client.pk
                )
            else:
                transaction = transaction[0]
            transaction.client.save()
            transaction.client.reload_bonus_score(rebuild=True)
    #
    return instance
示例#2
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
    }