mirror of
https://github.com/zulip/zulip.git
synced 2025-11-02 04:53:36 +00:00
billing: Move billing management commands from zilencer to corporate.
This commit is contained in:
0
corporate/management/__init__.py
Normal file
0
corporate/management/__init__.py
Normal file
0
corporate/management/commands/__init__.py
Normal file
0
corporate/management/commands/__init__.py
Normal file
47
corporate/management/commands/process_billing_updates.py
Normal file
47
corporate/management/commands/process_billing_updates.py
Normal file
@@ -0,0 +1,47 @@
|
||||
"""\
|
||||
Run BillingProcessors.
|
||||
|
||||
This management command is run via supervisor. Do not run on multiple
|
||||
machines, as the code has not been made robust to race conditions from doing
|
||||
so. (Alternatively, you can set `BILLING_PROCESSOR_ENABLED=False` on all but
|
||||
one machine to make the command have no effect.)
|
||||
"""
|
||||
|
||||
import time
|
||||
from typing import Any
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.management.base import BaseCommand
|
||||
|
||||
from zerver.lib.context_managers import lockfile
|
||||
from zerver.lib.management import sleep_forever
|
||||
from corporate.lib.stripe import StripeConnectionError, \
|
||||
run_billing_processor_one_step
|
||||
from zilencer.models import BillingProcessor
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = """Run BillingProcessors, to sync billing-relevant updates into Stripe.
|
||||
|
||||
Run this command under supervisor.
|
||||
|
||||
Usage: ./manage.py process_billing_updates
|
||||
"""
|
||||
|
||||
def handle(self, *args: Any, **options: Any) -> None:
|
||||
if not settings.BILLING_PROCESSOR_ENABLED:
|
||||
sleep_forever()
|
||||
|
||||
with lockfile("/tmp/zulip_billing_processor.lockfile"):
|
||||
while True:
|
||||
for processor in BillingProcessor.objects.exclude(
|
||||
state=BillingProcessor.STALLED):
|
||||
try:
|
||||
entry_processed = run_billing_processor_one_step(processor)
|
||||
except StripeConnectionError:
|
||||
time.sleep(5*60)
|
||||
# Less load on the db during times of activity
|
||||
# and more responsiveness when the load is low
|
||||
if entry_processed:
|
||||
time.sleep(10)
|
||||
else:
|
||||
time.sleep(2)
|
||||
55
corporate/management/commands/setup_stripe.py
Normal file
55
corporate/management/commands/setup_stripe.py
Normal file
@@ -0,0 +1,55 @@
|
||||
from zerver.lib.management import ZulipBaseCommand
|
||||
from zilencer.models import Plan, Coupon, Customer
|
||||
from zproject.settings import get_secret
|
||||
|
||||
from typing import Any
|
||||
|
||||
import stripe
|
||||
stripe.api_key = get_secret('stripe_secret_key')
|
||||
|
||||
class Command(ZulipBaseCommand):
|
||||
help = """Script to add the appropriate products and plans to Stripe."""
|
||||
|
||||
def handle(self, *args: Any, **options: Any) -> None:
|
||||
Customer.objects.all().delete()
|
||||
Plan.objects.all().delete()
|
||||
Coupon.objects.all().delete()
|
||||
|
||||
# Zulip Cloud offerings
|
||||
product = stripe.Product.create(
|
||||
name="Zulip Cloud Premium",
|
||||
type='service',
|
||||
statement_descriptor="Zulip Cloud Premium",
|
||||
unit_label="user")
|
||||
|
||||
plan = stripe.Plan.create(
|
||||
currency='usd',
|
||||
interval='month',
|
||||
product=product.id,
|
||||
amount=800,
|
||||
billing_scheme='per_unit',
|
||||
nickname=Plan.CLOUD_MONTHLY,
|
||||
usage_type='licensed')
|
||||
Plan.objects.create(nickname=Plan.CLOUD_MONTHLY, stripe_plan_id=plan.id)
|
||||
|
||||
plan = stripe.Plan.create(
|
||||
currency='usd',
|
||||
interval='year',
|
||||
product=product.id,
|
||||
amount=8000,
|
||||
billing_scheme='per_unit',
|
||||
nickname=Plan.CLOUD_ANNUAL,
|
||||
usage_type='licensed')
|
||||
Plan.objects.create(nickname=Plan.CLOUD_ANNUAL, stripe_plan_id=plan.id)
|
||||
|
||||
coupon = stripe.Coupon.create(
|
||||
duration='forever',
|
||||
name='25% discount',
|
||||
percent_off=25)
|
||||
Coupon.objects.create(percent_off=25, stripe_coupon_id=coupon.id)
|
||||
|
||||
coupon = stripe.Coupon.create(
|
||||
duration='forever',
|
||||
name='85% discount',
|
||||
percent_off=85)
|
||||
Coupon.objects.create(percent_off=85, stripe_coupon_id=coupon.id)
|
||||
Reference in New Issue
Block a user