Example #1
0
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
Example #2
0
    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
Example #3
0
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)
Example #4
0
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)
Example #5
0
 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)
Example #6
0
 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
Example #7
0
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)
Example #8
0
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,)))
Example #9
0
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)
Example #10
0
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)
Example #11
0
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)
Example #12
0
    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
Example #13
0
def is_manager(request, organization):
    try:
        valid_manager_for_organization(request.user, organization)
    except PermissionDenied:
        return False
    return True
Example #14
0
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)
Example #15
0
 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)