Exemplo n.º 1
0
 def _handle(self, *args, **options):
     db_name = options['database']
     if db_name:
         set_current_site(get_site_model().objects.get(
             slug=options['provider'], db_name=db_name),
                          path_prefix='')
     else:
         set_current_site(
             get_site_model().objects.get(slug=options['provider']),
             path_prefix='')
     now = datetime.datetime.utcnow().replace(tzinfo=utc)
     from_date = now
     from_date = datetime.datetime(year=from_date.year,
                                   month=from_date.month,
                                   day=1)
     if args:
         from_date = datetime.datetime.strptime(args[0], '%Y-%m-%d')
     provider = Organization.objects.get(slug=options['provider'])
     processor = Organization.objects.get(pk=PROCESSOR_ID)
     self.generate_coupons(provider)
     self.generate_transactions(provider, processor, from_date, now)
     subscriber = Organization.objects.filter(slug='stephanie').first()
     if subscriber:
         self.generate_subscriptions(subscriber)
     coupon_code = options['coupon']
     if coupon_code:
         self.generate_coupon_uses(coupon_code, provider=provider)
 def handle(self, *args, **options):
     #pylint:disable=broad-except
     recipient_list = [options['recipient']]
     for site in get_site_model().objects.filter(slug__in=options['sites']):
         send_mail("test",
                   "hello",
                   site.get_from_email(),
                   recipient_list,
                   connection=site.get_email_connection())
Exemplo n.º 3
0
    def _handle(self, *args, **options):
        # forces to use the fake processor. We don't want to take a lot
        # of time to go to Stripe to create test charges.
        settings.SAAS['PROCESSOR']['BACKEND'] = \
            'saas.backends.fake_processor.FakeProcessorBackend'

        db_name = options['database']
        if db_name:
            set_current_site(get_site_model().objects.get(
                slug=options['provider'], db_name=db_name),
                             path_prefix='')
        else:
            set_current_site(
                get_site_model().objects.get(slug=options['provider']),
                path_prefix='')
        now = datetime.datetime.utcnow().replace(tzinfo=utc)
        from_date = now
        from_date = datetime.datetime(year=from_date.year,
                                      month=from_date.month,
                                      day=1)
        if args:
            from_date = datetime.datetime.strptime(args[0], '%Y-%m-%d')
        provider = Organization.objects.get(slug=options['provider'])
        processor = Organization.objects.get(pk=saas_settings.PROCESSOR_ID)
        self.generate_coupons(provider)
        self.generate_transactions(
            provider,
            processor,
            from_date,
            now,
            profile_pictures_dir=options['profile_pictures'])
        subscriber = Organization.objects.filter(slug='stephanie').first()
        if subscriber:
            self.generate_subscriptions(subscriber)
        coupon_code = options['coupon']
        if coupon_code:
            self.generate_coupon_uses(coupon_code, provider=provider)
Exemplo n.º 4
0
def _provider_as_site(provider):
    site = None
    if not provider or is_current_broker(provider):
        site = get_current_site()
    else:
        site_model = get_site_model()
        candidates = list(
            site_model.objects.filter(account=provider, domain__isnull=False))
        if candidates:
            site = candidates[0]  # XXX works as long as domain
            #     is explicitely set.
        else:
            candidates = list(site_model.objects.filter(account=provider))
            if candidates:
                site = candidates[0]  # XXX Testing on local systems
    LOGGER.debug("_provider_as_site(%s): %s", provider, site)
    return site
Exemplo n.º 5
0
 def _handle(self, *args, **options):
     if 'database' in options:
         db_name = options['database']
         set_current_site(get_site_model().objects.get(
             slug=options['provider'], db_name=db_name),
                          path_prefix='')
     else:
         db_name = 'default'
     now = datetime.datetime.utcnow().replace(tzinfo=utc)
     from_date = now
     from_date = datetime.datetime(year=from_date.year,
                                   month=from_date.month,
                                   day=1)
     if args:
         from_date = datetime.datetime.strptime(args[0], '%Y-%m-%d')
     provider = Organization.objects.get(slug=options['provider'])
     processor = Organization.objects.get(pk=PROCESSOR_ID)
     self.generate_coupons(provider)
     self.generate_transactions(provider, processor, from_date, now)
Exemplo n.º 6
0
def processor_redirect(request, site=None):
    """
    Full URL redirect after the processor connected the organization
    account with our system.
    """
    site_model = get_site_model()
    if site is None:
        site = get_current_site()
    elif not isinstance(site, site_model):
        try:
            site = site_model.objects.get(slug=site)
        except site_model.DoesNotExist:
            #pylint:disable=protected-access
            raise Http404("No %s with slug '%s' can be found." %
                          (site_model._meta.object_name, site))
    return build_absolute_uri(request,
                              location=reverse(
                                  'saas_update_bank',
                                  kwargs={'organization': site.account}),
                              site=site)
Exemplo n.º 7
0
def _provider_as_site(provider):
    site = None
    if not provider or get_current_broker().slug == str(provider):
        # We compare the slugs directly here instead of using
        # `is_current_broker` because the call there to `is_testing`
        # (aka shared database) interfers with finding the site matching
        # the domain.
        site = get_current_site()
    else:
        site_model = get_site_model()
        candidates = list(
            site_model.objects.filter(account=provider, domain__isnull=False))
        if candidates:
            site = candidates[0]  # XXX works as long as domain
            #     is explicitely set.
        else:
            candidates = list(site_model.objects.filter(account=provider))
            if candidates:
                site = candidates[0]  # XXX Testing on local systems
    LOGGER.debug("_provider_as_site(%s): %s", provider, site)
    return site
    def _handle(self, *args, **options):
        #pylint: disable=too-many-locals,too-many-statements
        from saas.managers.metrics import month_periods  # avoid import loop
        from saas.models import (Charge, ChargeItem, Organization, Plan,
                                 Subscription)

        if 'database' in options:
            db_name = options['database']
            set_current_site(get_site_model().objects.get(
                slug=options['provider'], db_name=db_name),
                             path_prefix='')
        else:
            db_name = 'default'
        now = datetime.datetime.utcnow().replace(tzinfo=utc)
        from_date = now
        from_date = datetime.datetime(year=from_date.year,
                                      month=from_date.month,
                                      day=1)
        if args:
            from_date = datetime.datetime.strptime(args[0], '%Y-%m-%d')
        # Create Income transactions that represents a growing bussiness.
        provider = Organization.objects.get(slug=options['provider'])
        processor = Organization.objects.get(pk=PROCESSOR_ID)
        for end_period in month_periods(from_date=from_date):
            nb_new_customers = random.randint(0, 9)
            for _ in range(nb_new_customers):
                queryset = Plan.objects.filter(organization=provider,
                                               period_amount__gt=0)
                plan = queryset[random.randint(0, queryset.count() - 1)]
                created = False
                trials = 0
                while not created:
                    try:
                        first_name = self.FIRST_NAMES[random.randint(
                            0,
                            len(self.FIRST_NAMES) - 1)]
                        last_name = self.LAST_NAMES[random.randint(
                            0,
                            len(self.LAST_NAMES) - 1)]
                        full_name = '%s %s' % (first_name, last_name)
                        slug = slugify('demo%d' % random.randint(1, 1000))
                        customer, created = Organization.objects.get_or_create(
                            slug=slug, full_name=full_name)
                    #pylint: disable=catching-non-exception
                    except IntegrityError:
                        trials = trials + 1
                        if trials > 10:
                            raise RuntimeError(
                                'impossible to create a new customer after 10 trials.'
                            )
                Organization.objects.filter(pk=customer.id).update(
                    created_at=end_period)
                subscription = Subscription.objects.create(
                    organization=customer,
                    plan=plan,
                    ends_at=now + datetime.timedelta(days=31))
                Subscription.objects.filter(pk=subscription.id).update(
                    created_at=end_period)
            # Insert some churn in %
            churn_rate = 2
            all_subscriptions = Subscription.objects.filter(
                plan__organization=provider)
            nb_churn_customers = (all_subscriptions.count() * churn_rate //
                                  100)
            subscriptions = random.sample(
                list(all_subscriptions),
                all_subscriptions.count() - nb_churn_customers)
            for subscription in subscriptions:
                nb_periods = random.randint(1, 6)
                transaction_item = Transaction.objects.new_subscription_order(
                    subscription,
                    nb_natural_periods=nb_periods,
                    created_at=end_period)
                if transaction_item.dest_amount < 50:
                    continue
                transaction_item.orig_amount = transaction_item.dest_amount
                transaction_item.orig_unit = transaction_item.dest_unit
                transaction_item.save()
                charge = Charge.objects.create(
                    created_at=transaction_item.created_at,
                    amount=transaction_item.dest_amount,
                    customer=subscription.organization,
                    description='Charge for %d periods' % nb_periods,
                    last4=1241,
                    exp_date=datetime_or_now(),
                    processor=processor,
                    processor_key=transaction_item.pk,
                    # XXX We can't do that yet because of
                    # ``processor_backend.charge_distribution(self)``
                    #                    unit=transaction_item.dest_unit,
                    state=Charge.CREATED)
                charge.created_at = transaction_item.created_at
                charge.save()
                ChargeItem.objects.create(invoiced=transaction_item,
                                          charge=charge)
                charge.payment_successful()
            churned = all_subscriptions.exclude(
                pk__in=[subscription.pk for subscription in subscriptions])
            for subscription in churned:
                subscription.ends_at = end_period
                subscription.save()
            self.stdout.write(
                "%d new and %d churned customers at %s\n" %
                (nb_new_customers, nb_churn_customers, end_period))