def test_subscribe_create(self):
        """Test create a subscription."""

        plans.sync_plans()

        self.client.credentials(HTTP_AUTHORIZATION='Token ' +
                                self.normal_user_token.key)

        data = {
            'plan_id': "MF-MONTHLY",
        }
        data.update(self.card)

        url = reverse('stripe-api:subscription-create')
        response = self.client.post(url, data, format='json')
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)

        # Check that the customer was created and has a subscription
        customer = Customer.objects.get(user=self.normal_user)
        self.assertTrue(subscriptions.has_active_subscription(customer))

        if self.display_doc:
            # Generate documentation
            content = {
                'title': "Subscribe",
                'http_method': 'POST',
                'url': url,
                'payload': self.jsonify(data),
                'response': self.jsonify(response.data),
                'response_status': response.status_code,
                'description': ("Subscribe to a give plan with card details.")
            }
            self.doc.display_section(content)
예제 #2
0
def check_valid_subscription(user):
    products = Product.objects.filter(user=user).count()
    if (products < 5):
        return True
    customer = Customer.objects.filter(user_id=user).first()
    valid_subscription = False
    if customer != None:
        valid_subscription = subscriptions.has_active_subscription(
            customer=customer)
    return valid_subscription
예제 #3
0
def cancel_subscription(request, uuid):
    if request.method == 'GET':
        customer = Customer.objects.filter(user_id=request.user).first()
        valid_subscription = False
        if (customer != None):
            valid_subscription = subscriptions.has_active_subscription(
                customer=customer)
        if (valid_subscription == True):
            subscription = Subscription.objects.get(
                id=urlsafe_base64_decode(force_text(uuid)))
            cancel(subscription=subscription, at_period_end=False)
        return redirect('dashboard_settings')
예제 #4
0
def dashboard(request):
  key = settings.PINAX_STRIPE_PUBLIC_KEY
  products = Product.objects.filter(user=request.user)
  customer = Customer.objects.filter(user_id=request.user).first()
  valid_subscription = False
  if customer != None:
    valid_subscription = subscriptions.has_active_subscription(customer=customer)
  form = PlanForm()
  data = { 'products': products, 
    'product_count': len(products), 
    'valid': valid_subscription, 
    'form': form,
    'key': key
  }
  return render(request, 'dashboard.html', data)
예제 #5
0
def stripe_sub_status(store):

    stripe_customer = get_customer_for_user(store)
    active = has_active_subscription(customer=stripe_customer)

    subscription = Subscription.objects.filter(customer=stripe_customer).order_by('-start').first()
    if not subscription:
        plan = "No plan"
    else:
        plan = subscription.plan.name

    if active:
        return "<span class='label label-success'>Stripe: Active - " + str(plan)+ "</span>"
    else:
        return "<span class='label label-default'>Stripe: Inactive - " + str(plan)+ "</span>"
예제 #6
0
    def process_request(self, request):
        # TODO Add messages limit check.
        is_authenticated = request.user.is_authenticated
        if django.VERSION < (1, 10):
            is_authenticated = is_authenticated()

        if is_authenticated and not request.user.is_staff:
            url_name = resolve(request.path).url_name
            if url_name in settings.PINAX_STRIPE_SUBSCRIPTION_REQUIRED_URLS:
                customer = customers.get_customer_for_user(request.user)
                user_plan = UserPlan.objects.filter(user=request.user)[0]
                if not subscriptions.has_active_subscription(
                        customer) and user_plan.exceeded_limit(
                        ) or user_plan.exceeded_limit():
                    return redirect(
                        settings.PINAX_STRIPE_SUBSCRIPTION_REQUIRED_REDIRECT)
예제 #7
0
def dashboard_settings(request):
  if request.method == 'GET':
    profile = Profile.objects.get(user_id=request.user)
    referral = Referral.objects.filter(user_id=request.user).first()
    if (referral != None):
      responses = ReferralResponse.objects.filter(referral_id=referral)
    else:
      responses = []
    cant_referrals = 0
    for response in responses:
      if (response.action == 'SIGN_UP'):
        cant_referrals += 1
    initial_dict = dict()
    c = Customer.objects.filter(user_id=request.user).first()
    if c == None:
      card = []
      valid_subscription = False
    else:
      card = Card.objects.filter(customer_id=c.id)
      valid_subscription = subscriptions.has_active_subscription(customer=c)
    data = { 'user': request.user, 'referrals': cant_referrals}
    if (valid_subscription == True):
      subs = Subscription.objects.filter(customer_id=c)
      data['subs'] = subs
    form = SettingsForm(initial=initial_dict, instance=request.user)
    data['form'] = form 
    return render(request, 'settings.html', data)
  elif request.method == 'POST':
    form = SettingsForm(request.POST, instance=request.user)
    if form.is_valid():
      try:
        form.save()
        data = { 'form': form }
        messages.success(request, 'Saved Successfully!')
        return render(request, 'settings.html', data)
      except:
        data = { 'form': form }
        messages.error(request, 'invalid update')
        return render(request, 'settings.html', data)
    data = { 'form': form }
    messages.error(request, 'Invalid data submitted')
    return render(request, 'settings.html', data)
  raise ValueError('Invalid request type at dashboad settings')
예제 #8
0
def create_stripe_user_subscription(store, stripe_customer=None):

    if not stripe_customer:
        stripe_customer = get_customer_for_user(store)

    if subscriptions.has_active_subscription(stripe_customer):
        return True

    plan, reason = estimate_donation_volume(store)

    subscription = subscriptions.create(stripe_customer, plan)

    StripeCustomerSubReason.objects.update_or_create(store=store,
                                                     defaults={
                                                         "subscription":
                                                         subscription,
                                                         'reason': reason
                                                     })

    return True
예제 #9
0
def app_uninstall_task(data, **kwargs):
    try:
        user = models.AuthAppShopUser.objects.get(
            myshopify_domain=kwargs['domain'])

        user.token = '00000000000000000000000000000000'
        user.save()

        # Cancel any Stripe subscriptions
        try:
            stripe_customer = get_customer_for_user(user)
            if subscriptions.has_active_subscription(stripe_customer):
                user_subscriptions = models.Subscription.objects.filter(
                    customer=stripe_customer).filter(
                        Q(ended_at__isnull=True)
                        | Q(ended_at__gt=timezone.now()))
                for subscription in user_subscriptions:
                    subscriptions.cancel(subscription, at_period_end=False)

                # Clear subscription reason
                models.StripeCustomerSubReason.objects.update_or_create(
                    store=user,
                    defaults={
                        "subscription": None,
                        'reason': None
                    })

                # Clear stripe cards
                user_cards = Card.objects.filter(
                    customer=stripe_customer).order_by("created_at")
                for card in user_cards:
                    delete_card(stripe_customer, card.stripe_id)
        except StripeError as e:
            logging.error(str(e.message))

        # Send an email to the user to welcome them
        try:
            ctx = {
                "myshopify_domain": user.myshopify_domain,
            }
            subject = render_to_string("main_app/email/uninstall_subject.txt",
                                       ctx)
            subject = subject.strip()
            message = render_to_string("main_app/email/uninstall_body.txt",
                                       ctx)

            email = user.userprofile.shop_contact_email

            num_sent = EmailMessage(
                subject,
                message,
                to=[email],
                from_email=settings.PINAX_STRIPE_INVOICE_FROM_EMAIL).send()
        except Exception:
            pass

        # Invalidate any existing user sessions.
        user.clear_user_sessions()
        connection.close()

    except ObjectDoesNotExist:
        if kwargs['domain']:
            logging.warning("App-Uninstall-Webhook-No-User-Found:  " +
                            str(kwargs['domain']))
            return
    except Exception as e:
        logging.error("App-Uninstall-Webhook-Unknown-Exception: " +
                      str(e.message))
        raise e