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())
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)
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
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)
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)
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))