def create_visit(self, request, card_id): statistics = Card.objects.get(pk=card_id).statistics statistics.visits += 1 statistics.save() new_card = CardSerializer(Card.objects.get(pk=card_id)) return Response(new_card.data)
def home(request): assets_manifest_data = open( os.path.join(settings.BASE_DIR, "ifiveme/home/static/home/js/manifest.json")) assets_manifest = json.load(assets_manifest_data) context = {"js_path": assets_manifest["app.js"]} card_data = None try: url = request.build_absolute_uri() card_name = get_card_name_from_url(url) if card_name != "": card = Card.objects.filter( Q(disabled=False), Q(status=int(CardStatus.ACTIVE)) | Q(status=int(CardStatus.ON_FREE_TRIAL)), ).get(Q(subdomain=card_name) | Q(url=card_name)) if card is not None: serializer = CardSerializer(card) card_data = serializer.data context["is_card"] = True context["card_full_name"] = card_data["full_name"] context["card_company_name"] = card_data["company_name"] context["card_job_title"] = card_data["job_title"] context["card_front_url"] = card_data["front_url"] context["card_url"] = card_data["url"] except: card_data = None return render(request, "home/index.html", context)
def retrieve(self, request, pk): card = Card.objects.filter(owner_id=request.user.id).get(pk=pk) if card.subscription_id and not is_subscription_active(card): card.status = CardStatus.SUBSCRIPTION_INACTIVE card.save() serializer = CardSerializer(card) return Response(serializer.data)
def prospect(self, request): url = request.GET.get("url") card = Card.objects.filter( Q(disabled=False), Q(status=int(CardStatus.ACTIVE)) | Q(status=int(CardStatus.ON_FREE_TRIAL)), ).get(Q(subdomain=url) | Q(url=url)) serializer = CardSerializer(card) return Response(serializer.data)
def partial_update(self, request, pk): card = get_user_cards(request).get(pk=pk) data = {**request.data} def patch_address(name): address_serializer = CardAddressPatchSerializer( getattr(card, name, False), data=request.data[name], partial=True) address_serializer.is_valid(raise_exception=True) address_serializer.save() if "address2" in request.data: if request.data["address2"] is None: card.address2 = None card.save() else: if card.address2 is None: card.address2 = CardAddress.objects.create() card.save() patch_address("address2") if "address1" in request.data: patch_address("address1") if "need_virtual" in request.data: if card.status == CardStatus.ACTIVE: card.status = CardStatus.VIRTUAL elif card.status == CardStatus.VIRTUAL: card.status = CardStatus.ACTIVE card.save() if "saved_background" in request.data: saved_background = SavedBackground.objects.get( pk=request.data["saved_background"]["id"]) card.saved_background = saved_background card.save() if "background_url" in request.data: card.save() if "next_plan" in request.data: if card.plan == PlanKind.FREE.value: del data["next_plan"] serializer = CardPatchSerializer(card, data=data, partial=True) serializer.is_valid(raise_exception=True) serializer.save() patchedCard = CardSerializer(card) return Response(patchedCard.data)
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)
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)
def create_clicks(self, request, card_id): statistics = Card.objects.get(pk=card_id).statistics allowed_fields = [ 'change_side', 'infos', 'download_card', 'email', 'website', 'phone_home', 'phone_work', 'phone_mobile', 'address1', 'address2' ] if isinstance(request.data, collections.Sequence): for field in request.data: if field in allowed_fields: field_name = field + '_clicks' value = getattr(statistics, field_name) setattr(statistics, field_name, value + 1) statistics.save() new_card = CardSerializer(Card.objects.get(pk=card_id)) return Response(new_card.data)
def partial_update(self, request, card_id): card = get_user_cards(request).get(pk=card_id) if card.appearance is None: card.appearance = CardAppearance.objects.create() card.save() if "background_color" in request.data: card.tab = "color" card.appearance.background_color = request.data["background_color"] card.save() card.appearance.save() if "border" in request.data: if not request.data["border"]: card.appearance.border = None card.appearance.save() else: if not card.appearance.border: serializer = CardAppearanceBorderSerializer( data=request.data["border"]) serializer.is_valid(raise_exception=True) border = serializer.save() card.appearance.border = border card.appearance.save() else: serializer = CardAppearanceBorderSerializer( card.appearance.border, data=request.data["border"], partial=True, ) serializer.is_valid(raise_exception=True) serializer.save() appearance_serializer = CardAppearancePatchSerializer(card.appearance, request.data, partial=True) appearance_serializer.is_valid(raise_exception=True) appearance_serializer.save() return Response(CardSerializer(Card.objects.get(pk=card_id)).data)
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()
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)
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")
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)