Example #1
0
    def activate_free_trial(self, request, card):
        user = User.objects.get(email=request.user.email)

        if user.has_used_free_trial:
            return Response(status=status.HTTP_400_BAD_REQUEST)

        serializer = CardSerializer(
            card,
            data={
                "status": int(CardStatus.ON_FREE_TRIAL),
                "next_plan": "",
                "free_trial_end": date.today() + timedelta(days=14),
                "plan": PlanKind.FREE_TRIAL.value,
            },
            partial=True,
        )

        context = CardActivationValidationContext(serializer)
        context.is_valid()

        serializer.is_valid(raise_exception=True)
        serializer.save()

        user.has_used_free_trial = True
        user.save()

        reset_free_trial_draft_cards(request)

        return Response(serializer.data)
Example #2
0
    def create(self, request):
        request.data["owner"] = request.user.id
        serializer = CardSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()

        return Response(serializer.data, status=status.HTTP_201_CREATED)
Example #3
0
def reset_free_trial_draft_cards(request):
    free_trial_draft_cards = (get_user_cards(request).filter(
        Q(plan=PlanKind.FREE_TRIAL.value)
        | Q(next_plan=PlanKind.FREE_TRIAL.value)).exclude(
            status=int(CardStatus.ON_FREE_TRIAL)))
    for free_card in free_trial_draft_cards:
        free_card_serializer = CardSerializer(
            free_card,
            data={
                "status": int(CardStatus.DRAFT),
                "next_plan": PlanKind.BASIC.value,
                "plan": "",
            },
            partial=True,
        )
        free_card_serializer.is_valid(raise_exception=True)
        free_card_serializer.save()
Example #4
0
    def create_with_subscription(self, request):
        data = {
            "owner": request.user.id,
            "status": int(CardStatus.ACTIVE),
            "nextPlan": "",
            "plan": PlanKind.PREMIUM.value,
            "free_trial_end": None
        }

        card_serializer = CardSerializer(data=data)
        card_serializer.is_valid(raise_exception=True)

        activation_serializer = CardActivationRequestSerializer(
            data=request.data)
        activation_serializer.is_valid(raise_exception=True)

        # Create Stripe Customer ID and Subscription
        customer_id = generate_user_customer_id(request.user,
                                                request.data["payment_method"])
        subscription_id = create_subscription(customer_id,
                                              PlanKind.PREMIUM.value,
                                              request.data["payment_method"])

        # Create and save card
        card = card_serializer.save()
        card.subscription_id = subscription_id
        card.save()

        # Send notification to designers
        task = Thread(
            target=self.send_card_created_email,
            args=(
                _("mail_user_new_card_notification_subject"),
                render_to_string(
                    "mailers/new_card_created.html",
                    {"email": request.user.email},
                    request=request,
                ),
            ),
        )
        task.start()

        return Response(CardSerializer(card).data)
Example #5
0
    def handle(self, *args, **options):
        cards = Card.objects.filter(
            status=CardStatus.ON_FREE_TRIAL.value).exclude(free_trial_end=None)
        today = date.today()
        for card in cards:
            if card.free_trial_end < today:
                print(f"Ending free trial for card {card.id}")

                serializer = CardSerializer(
                    card,
                    data={
                        "status": int(CardStatus.SUBSCRIPTION_INACTIVE),
                        "plan": "",
                        "next_plan": PlanKind.PLUS.value,
                        "free_trial_end": None,
                    },
                    partial=True,
                )
                serializer.is_valid(raise_exception=True)
                serializer.save()

                print("Ending free trial done")
Example #6
0
    def activate_plan(self, request, card):
        activation_serializer = CardActivationRequestSerializer(
            data=request.data)
        activation_serializer.is_valid(raise_exception=True)

        serializer = CardSerializer(
            card,
            data={
                "status":
                int(CardStatus.VIRTUAL)
                if card.need_virtual and card.next_plan != PlanKind.BASIC.value
                else int(CardStatus.ACTIVE),
                **({
                    "next_plan": "",
                    "plan": card.next_plan
                } if (card.next_plan and card.next_plan != card.plan) else {}),
                "free_trial_end":
                None,
            },
            partial=True,
        )

        context = CardActivationValidationContext(serializer)
        context.is_valid()

        serializer.is_valid(raise_exception=True)

        customer_id = generate_user_customer_id(
            request.user,
            activation_serializer.data["payment_method"]
            if "payment_method" in activation_serializer.data else None,
        )

        if card.purchase_domain:
            domain_infos = get_domain_infos(card)

            if not domain_infos["available"]:
                return Response(ErrorCodes.UNAVAILABLE_DOMAIN)

            price = domain_infos["price"] - domain_infos["rebate"]

            need_payment = price > 0

            if need_payment:
                payment_intent_id = generate_manual_payment_intent(
                    price, activation_serializer.data["payment_method"],
                    customer_id)

            success, order_id = register_domain(card.purchase_domain)

            if not success:
                if need_payment:
                    cancel_payment_intent(payment_intent_id)
                return Response(
                    {"errors": [ErrorCodes.DOMAIN_REGISTRATION_ERROR.value]})

            task = Thread(target=self.setup_dns,
                          args=(
                              order_id,
                              card.purchase_domain,
                          ))

            task.start()

            if need_payment:
                charge_payment_intent(payment_intent_id)

            Domain.objects.create(owner=request.user,
                                  domain=card.purchase_domain)
            card.url = card.purchase_domain
            card.purchase_domain = None

            if domain_infos["rebate"] > 0:
                card.rebate_used = True

            card.save()

        subscription_plan = card.next_plan or card.plan

        if (card.next_plan and
            (card.next_plan in PLANS_HAVE_SUBSCRIPTION)) or (
                card.status == CardStatus.SUBSCRIPTION_INACTIVE and
                (subscription_plan in PLANS_HAVE_SUBSCRIPTION)):
            payment_method = activation_serializer.data["payment_method"]
            if card.status == CardStatus.SUBSCRIPTION_INACTIVE:
                card.subscription_id = create_subscription(
                    customer_id, subscription_plan, payment_method)
            else:
                if card.subscription_id:
                    modify_subscription(card.subscription_id, card.next_plan,
                                        payment_method)
                else:
                    card.subscription_id = create_subscription(
                        customer_id, card.next_plan, payment_method)
            card.save()

        serializer.save()

        return Response(serializer.data)