def refund_enable(transaction, user): """ Returns True if *user* is able to trigger a refund on *transaction*. """ subscription = Subscription.objects.filter(pk=transaction.event_id).first() if subscription: try: valid_manager_for_organization(user, subscription.plan.organization) return True except PermissionDenied: pass return False
def get_context_data(self, **kwargs): organizations = Organization.objects.all() all_values = [] for organization_all in organizations: organization = valid_manager_for_organization( self.request.user, organization_all) values = [] today = date.today() end = datetime(day=today.day, month=today.month, year=today.year, tzinfo=utc) for _ in range(0, 12): first = datetime(day=1, month=end.month, year=end.year, tzinfo=utc) usages = Transaction.objects.filter( orig_organization=organization, orig_account='Usage', created_at__lt=first).aggregate(Sum('amount')) amount = usages.get('amount__sum', 0) if not amount: # The key could be associated with a "None". amount = 0 values += [{"x": date.strftime(first, "%Y/%m/%d"), "y": amount}] end = first - timedelta(days=1) all_values += [{ "key": str(organization_all.slug), "values": values}] context = {'data' : all_values} return context
def organization_usage(request, organization_id): organization = valid_manager_for_organization(request.user, organization_id) # Note: There is a way to get the result in a single SQL statement # but that requires to deal with differences in database backends # (MySQL: date_format, SQLite: strftime) and get around the # "Raw query must include the primary key" constraint. values = [] today = datetime.date.today() end = datetime.datetime(day=today.day, month=today.month, year=today.year, tzinfo=utc) for month in range(0, 12): first = datetime.datetime(day=1, month=end.month, year=end.year, tzinfo=utc) usages = Transaction.objects.filter( orig_organization=organization, orig_account='Usage', created_at__lt=first).aggregate(Sum('amount')) amount = usages.get('amount__sum',0) if not amount: # The key could be associated with a "None". amount = 0 values += [{ "x": datetime.date.strftime(first, "%Y/%m/%d"), "y": amount }] end = first - datetime.timedelta(days=1) context = { 'data': [{ "key": "Usage", "values": values }],"organization_id":organization_id} return render(request, "saas/usage_chart.html", context)
def update_card(request, organization_id): context = { 'user': request.user } context.update(csrf(request)) customer = valid_manager_for_organization(request.user, organization_id) context.update({ 'organization': customer }) if request.method == 'POST': form = CreditCardForm(request.POST) if form.is_valid(): now = datetime.datetime.now() stripe_token = form.cleaned_data['stripeToken'] # With Stripe, we don't need to wait on an IPN. We get # a card token here. Organization.objects.associate_processor(customer, stripe_token) email = None if customer.managers.count() > 0: email = customer.managers.all()[0].email messages.success(request, "Your credit card on file was sucessfully updated") return redirect(reverse('saas_billing_info', args=(customer.name,))) else: messages.error(request, "The form did not validates") else: form = CreditCardForm() context.update({'form': form}) context.update({ 'STRIPE_PUB_KEY': settings.STRIPE_PUB_KEY }) return render(request, "saas/update_card.html", context)
def dispatch(self, *args, **kwargs): organization = self.kwargs.get('organization_id') if not organization: organizations = managed_organizations(self.request.user) if len(organizations) == 1: organization = organizations[0] self.customer = valid_manager_for_organization( self.request.user, organization) return super(PlaceOrderView, self).dispatch(*args, **kwargs)
def get_queryset(self): """ Get the cart for this customer. """ queryset = Charge.objects.filter( processor_id=self.kwargs.get(self.slug_url_kwarg)) if queryset.exists(): self.customer = valid_manager_for_organization( self.request.user, queryset.get().customer) else: raise PermissionDenied return queryset
def organization_profile(request, organization_id): context = { 'user': request.user } context.update(csrf(request)) organization = valid_manager_for_organization(request.user, organization_id) balance_dues = balance(organization) if balance_dues < 0: balance_credits = - balance_dues balance_dues = 0 else: balance_credits = None context.update({'organization': organization, 'managers': organization.managers.all(), 'contributors': organization.contributors.all(), 'balance_due': balance_dues, 'balance_credits': balance_credits, }) return render(request, "saas/organization_profile.html", context)
def redeem_coupon(request, organization_id): """Adds a coupon to the user cart.""" context = { 'user': request.user } context.update(csrf(request)) customer = valid_manager_for_organization(request.user, organization_id) context.update({ 'organization': customer }) if request.method == 'POST': form = RedeemCouponForm(request.POST) if form.is_valid(): coupon = get_object_or_404(Coupon, code=form.cleaned_data['code']) coupon.user = request.user coupon.customer = customer coupon.save() else: # XXX on error find a way to get a message back to User. pass return redirect(reverse('saas_pay_cart', args=(customer.name,)))
def billing_info(request, organization_id): context = { 'user': request.user } context.update(csrf(request)) customer = valid_manager_for_organization(request.user, organization_id) context.update({'organization': customer }) # Retrieve customer information from the backend last4, exp_date = backend.retrieve_card(customer) # Retrieve latest transactions period_end = datetime.datetime.now() - datetime.timedelta(days=31) transactions = Transaction.objects.filter( Q(orig_organization=customer) | Q(dest_organization=customer) ).order_by('created_at')[:25] context.update({ 'last4': last4, 'exp_date': exp_date, 'transactions': transactions, }) return render(request, "saas/billing_info.html", context)
def organization_remove_managers(request, organization_id): organization = valid_manager_for_organization(request.user, organization_id) if request.method == 'POST': form = UserRelationForm(request.POST) if form.is_valid(): username = form.cleaned_data['username'] organization.managers.remove( User.objects.get(username=username)) return redirect(reverse( 'saas_organization_profile', args=(organization_id,))) else: form = UserRelationForm() context = { 'user': request.user, 'organization': organization, 'form': form, 'call': reverse( 'saas_remove_managers', args=(organization_id,)), } context.update(csrf(request)) return render(request, "saas/organization_user_relation.html", context)
def pay_now(request, organization_id): context = { 'user': request.user } context.update(csrf(request)) customer = valid_manager_for_organization(request.user, organization_id) context.update({'organization': customer }) balance_dues = balance(customer) if balance_dues < 0: balance_credits = - balance_dues balance_dues = 0 else: balance_credits = None if request.method == 'POST': form = PayNowForm(request.POST) if form.is_valid(): amount = int(form.cleaned_data['amount'] * 100) if form.cleaned_data['full_amount']: amount = balance_dues if amount > 50: # Stripe will not processed charges less than 50 cents. last4, exp_date = backend.retrieve_card(customer) charge = Charge.objects.charge_card( customer, amount=amount, user=request.user) context.update({ 'charge_id': charge.pk, 'amount': amount, 'last4': last4, 'exp_date': exp_date}) return render(request, "saas/payment_receipt.html", context) else: messages.error(request, 'We do not create charges for less than 50 cents') else: messages.error(request,'Unable to create charge') else: form = PayNowForm() context.update({'balance_credits': balance_credits, 'balance_dues': balance_dues, 'form': form}) return render(request, "saas/pay_now.html", context)
def get_context_data(self, **kwargs): organizations = Organization.objects.all() all_values = [] for organization_all in organizations: organization = valid_manager_for_organization( self.request.user, organization_all) values = [] today = date.today() end = datetime(day=today.day, month=today.month, year=today.year, tzinfo=utc) for _ in range(0, 12): first = datetime(day=1, month=end.month, year=end.year, tzinfo=utc) usages = Transaction.objects.filter( orig_organization=organization, orig_account='Usage', created_at__lt=first).aggregate(Sum('amount')) amount = usages.get('amount__sum', 0) if not amount: # The key could be associated with a "None". amount = 0 values += [{ "x": date.strftime(first, "%Y/%m/%d"), "y": amount }] end = first - timedelta(days=1) all_values += [{ "key": str(organization_all.slug), "values": values }] context = {'data': all_values} return context
def is_manager(request, organization): try: valid_manager_for_organization(request.user, organization) except PermissionDenied: return False return True
def organization_engagement(request, organization_id, from_date=None): organization = valid_manager_for_organization(request.user, organization_id) table = organization_monthly_revenue_customers(organization, from_date) context = { "organization": organization, "table": table, "table_json": json.dumps(table, cls=DjangoJSONEncoder) } return render(request, "saas/engagement.html", context)
def dispatch(self, *args, **kwargs): self.customer = valid_manager_for_organization( self.request.user, self.kwargs.get('organization_id')) return super(TransactionListView, self).dispatch(*args, **kwargs)