2015-09-30 18:46:11 -07:00
|
|
|
import os
|
|
|
|
import stripe
|
2015-09-30 13:33:05 -07:00
|
|
|
import uuid
|
|
|
|
|
2015-09-22 07:29:29 -07:00
|
|
|
from annoying.decorators import render_to
|
2015-09-30 18:46:11 -07:00
|
|
|
from django.conf import settings
|
2015-10-18 12:46:21 -07:00
|
|
|
from django.contrib.auth.decorators import login_required
|
2015-09-22 07:29:29 -07:00
|
|
|
from django.contrib.auth.models import User
|
2015-10-25 20:19:22 -07:00
|
|
|
from django.core.mail import send_mail
|
2015-10-15 19:37:54 -07:00
|
|
|
from django.http import Http404, HttpResponseRedirect, HttpResponseBadRequest
|
2015-09-30 13:33:05 -07:00
|
|
|
from django.shortcuts import get_object_or_404
|
2015-09-22 07:29:29 -07:00
|
|
|
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 {}
|
|
|
|
|
|
|
|
|
2015-10-25 19:36:19 -07:00
|
|
|
@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)
|
2015-11-13 12:48:57 -08:00
|
|
|
except stripe.CardError as e:
|
2015-10-25 19:36:19 -07:00
|
|
|
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()
|
|
|
|
|
2015-10-25 20:19:22 -07:00
|
|
|
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)
|
|
|
|
|
2015-10-25 19:36:19 -07:00
|
|
|
return {
|
|
|
|
'team': team
|
|
|
|
}
|
|
|
|
else:
|
|
|
|
return HttpResponseBadRequest()
|
|
|
|
|
|
|
|
|
2015-10-18 12:46:21 -07:00
|
|
|
@login_required
|
2015-10-15 19:37:54 -07:00
|
|
|
@render_to('teams/team-billing.html')
|
|
|
|
def team_billing(request, username):
|
2015-10-18 18:07:01 -07:00
|
|
|
team = get_object_or_404(Team, slug=username, disabled=False)
|
2015-10-16 05:34:52 -07:00
|
|
|
if team.owner != request.user:
|
|
|
|
raise Http404
|
2015-10-25 19:36:19 -07:00
|
|
|
|
2015-10-26 08:29:29 -07:00
|
|
|
if team.stripe_id == 'COMP':
|
|
|
|
return {
|
|
|
|
'name': 'Promotional trial',
|
2015-10-26 08:30:11 -07:00
|
|
|
'team': team,
|
|
|
|
'status': 'promo'
|
2015-10-26 08:29:29 -07:00
|
|
|
}
|
|
|
|
|
2015-10-25 19:36:19 -07:00
|
|
|
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
|
2015-10-15 19:37:54 -07:00
|
|
|
return {
|
|
|
|
'team': team
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-10-18 12:46:21 -07:00
|
|
|
@login_required
|
2015-09-30 13:33:05 -07:00
|
|
|
@render_to('teams/team-members.html')
|
|
|
|
def team_members(request, username):
|
2015-10-18 18:07:01 -07:00
|
|
|
team = get_object_or_404(Team, slug=username, disabled=False)
|
2015-10-18 12:46:21 -07:00
|
|
|
if not team.user_is_member(request.user):
|
|
|
|
raise Http404
|
2015-09-30 13:33:05 -07:00
|
|
|
return {
|
|
|
|
'team': team
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-10-18 12:46:21 -07:00
|
|
|
@login_required
|
2015-10-17 11:46:37 -07:00
|
|
|
def add_team_member(request, username, member):
|
2015-10-18 18:07:01 -07:00
|
|
|
team = get_object_or_404(Team, slug=username, disabled=False)
|
2015-10-17 11:46:37 -07:00
|
|
|
user = get_object_or_404(User, username=member)
|
|
|
|
|
|
|
|
if (team.owner != request.user):
|
|
|
|
raise Http404
|
|
|
|
|
2015-10-18 12:55:32 -07:00
|
|
|
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/')
|
2015-10-17 11:58:43 -07:00
|
|
|
|
|
|
|
|
2015-10-18 12:46:21 -07:00
|
|
|
@login_required
|
2015-10-17 11:58:43 -07:00
|
|
|
def remove_team_member(request, username, member):
|
2015-10-18 18:07:01 -07:00
|
|
|
team = get_object_or_404(Team, slug=username, disabled=False)
|
2015-10-17 11:58:43 -07:00
|
|
|
user = get_object_or_404(User, username=member)
|
|
|
|
|
|
|
|
if (team.owner != request.user):
|
|
|
|
raise Http404
|
|
|
|
|
|
|
|
team.members.remove(user)
|
2015-10-17 11:46:37 -07:00
|
|
|
|
|
|
|
return HttpResponseRedirect('/' + team.slug + '/members/')
|
|
|
|
|
|
|
|
|
2015-10-18 12:46:21 -07:00
|
|
|
@login_required
|
2015-10-25 19:36:19 -07:00
|
|
|
def cancel_team_subscription(request, username):
|
2015-09-30 18:46:11 -07:00
|
|
|
|
2015-10-25 19:36:19 -07:00
|
|
|
if request.method != 'POST':
|
|
|
|
raise Http404
|
2015-09-30 18:46:11 -07:00
|
|
|
|
2015-10-25 19:36:19 -07:00
|
|
|
team = get_object_or_404(Team, slug=username, disabled=False)
|
|
|
|
if team.owner != request.user:
|
|
|
|
raise Http404
|
2015-09-22 07:29:29 -07:00
|
|
|
|
2015-10-25 19:36:19 -07:00
|
|
|
stripe.api_key = os.environ.get('STRIPE_SECRET_KEY',
|
|
|
|
settings.STRIPE_SECRET_KEY)
|
|
|
|
customer = stripe.Customer.retrieve(team.stripe_id)
|
|
|
|
customer.delete()
|
2015-09-22 07:29:29 -07:00
|
|
|
|
2015-10-25 19:36:19 -07:00
|
|
|
team.disabled = True
|
|
|
|
team.stripe_id = None
|
2015-10-25 19:53:16 -07:00
|
|
|
team.plan = None
|
2015-10-25 19:36:19 -07:00
|
|
|
team.save()
|
2015-09-22 07:29:29 -07:00
|
|
|
|
2015-10-25 20:19:22 -07:00
|
|
|
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)
|
|
|
|
|
2015-10-25 19:36:19 -07:00
|
|
|
return HttpResponseRedirect('/' + team.slug + '/?team-cancelled=true')
|