You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
5.5 KiB
185 lines
5.5 KiB
import os |
|
import stripe |
|
import uuid |
|
|
|
from annoying.decorators import render_to |
|
from django.conf import settings |
|
from django.contrib.auth.decorators import login_required |
|
from django.contrib.auth.models import User |
|
from django.core.mail import send_mail |
|
from django.http import Http404, HttpResponseRedirect, HttpResponseBadRequest |
|
from django.shortcuts import get_object_or_404 |
|
from teams.models import Team |
|
|
|
|
|
@render_to('teams/for-teams.html') |
|
def for_teams(request): |
|
if request.user.is_authenticated(): |
|
profile = request.user.profile |
|
profile.teams_beta_seen = True |
|
profile.save() |
|
return {} |
|
|
|
|
|
@login_required |
|
@render_to('teams/for-teams-complete.html') |
|
def for_teams_complete(request): |
|
if request.method == 'POST' and request.user.is_authenticated(): |
|
|
|
token = request.POST['token'] |
|
stripe.api_key = os.environ.get('STRIPE_SECRET_KEY', |
|
settings.STRIPE_SECRET_KEY) |
|
|
|
plan = request.POST['plan'] |
|
|
|
try: |
|
customer = stripe.Customer.create(card=token, |
|
plan=plan, |
|
email=request.user.email) |
|
except stripe.CardError as e: |
|
error_message = e.json_body['error']['message'] |
|
return HttpResponseRedirect('/for-teams/?declined=%s' % |
|
error_message or |
|
'Your card was declined.') |
|
|
|
team = Team(name=request.POST['team-name'], |
|
email=request.POST['email'], |
|
plan=plan, |
|
owner=request.user) |
|
team.stripe_id = customer.id |
|
team.save() |
|
|
|
user = User.objects.create_user(team.slug, |
|
team.email, |
|
str(uuid.uuid4())) |
|
|
|
team.user = user |
|
team.save() |
|
|
|
send_mail('[Snipt] New team signup: {}'.format(team.name), |
|
""" |
|
Team: https://snipt.net/{} |
|
Email: {} |
|
Plan: {} |
|
""".format(team.slug, team.email, team.plan), |
|
'support@snipt.net', |
|
['nick@snipt.net'], |
|
fail_silently=False) |
|
|
|
return { |
|
'team': team |
|
} |
|
else: |
|
return HttpResponseBadRequest() |
|
|
|
|
|
@login_required |
|
@render_to('teams/team-billing.html') |
|
def team_billing(request, username): |
|
team = get_object_or_404(Team, slug=username, disabled=False) |
|
if team.owner != request.user: |
|
raise Http404 |
|
|
|
if team.stripe_id == 'COMP': |
|
return { |
|
'name': 'Promotional trial', |
|
'team': team, |
|
'status': 'promo' |
|
} |
|
|
|
stripe.api_key = os.environ.get('STRIPE_SECRET_KEY', |
|
settings.STRIPE_SECRET_KEY) |
|
customer = stripe.Customer.retrieve(team.stripe_id) |
|
|
|
data = { |
|
'last4': customer.active_card.last4, |
|
'created': customer.created, |
|
'email': customer.email, |
|
'team': team |
|
} |
|
|
|
if customer.subscription: |
|
data['amount'] = customer.subscription.plan.amount |
|
data['interval'] = customer.subscription.plan.interval |
|
data['name'] = customer.subscription.plan.name |
|
data['status'] = customer.subscription.status |
|
data['nextBill'] = customer.subscription.current_period_end |
|
else: |
|
data['status'] = 'inactive' |
|
|
|
return data |
|
return { |
|
'team': team |
|
} |
|
|
|
|
|
@login_required |
|
@render_to('teams/team-members.html') |
|
def team_members(request, username): |
|
team = get_object_or_404(Team, slug=username, disabled=False) |
|
if not team.user_is_member(request.user): |
|
raise Http404 |
|
return { |
|
'team': team |
|
} |
|
|
|
|
|
@login_required |
|
def add_team_member(request, username, member): |
|
team = get_object_or_404(Team, slug=username, disabled=False) |
|
user = get_object_or_404(User, username=member) |
|
|
|
if (team.owner != request.user): |
|
raise Http404 |
|
|
|
if ((team.members.all().count() + 1) > team.member_limit): |
|
return HttpResponseRedirect('/' + team.slug + |
|
'/members/?limit-reached') |
|
else: |
|
team.members.add(user) |
|
return HttpResponseRedirect('/' + team.slug + '/members/') |
|
|
|
|
|
@login_required |
|
def remove_team_member(request, username, member): |
|
team = get_object_or_404(Team, slug=username, disabled=False) |
|
user = get_object_or_404(User, username=member) |
|
|
|
if (team.owner != request.user): |
|
raise Http404 |
|
|
|
team.members.remove(user) |
|
|
|
return HttpResponseRedirect('/' + team.slug + '/members/') |
|
|
|
|
|
@login_required |
|
def cancel_team_subscription(request, username): |
|
|
|
if request.method != 'POST': |
|
raise Http404 |
|
|
|
team = get_object_or_404(Team, slug=username, disabled=False) |
|
if team.owner != request.user: |
|
raise Http404 |
|
|
|
stripe.api_key = os.environ.get('STRIPE_SECRET_KEY', |
|
settings.STRIPE_SECRET_KEY) |
|
customer = stripe.Customer.retrieve(team.stripe_id) |
|
customer.delete() |
|
|
|
team.disabled = True |
|
team.stripe_id = None |
|
team.plan = None |
|
team.save() |
|
|
|
send_mail('[Snipt] Team cancelled plan: {}'.format(team.name), |
|
""" |
|
Team: https://snipt.net/{} |
|
Email: {} |
|
""".format(team.slug, team.email), |
|
'support@snipt.net', |
|
['nick@snipt.net'], |
|
fail_silently=False) |
|
|
|
return HttpResponseRedirect('/' + team.slug + '/?team-cancelled=true')
|
|
|