from django.conf import settings from django.contrib.auth.models import User from django.db import models if settings.USE_PAYMENTS: import braintree else: # hc.payments tests mock this object, so tests should # still be able to run: braintree = None class SubscriptionManager(models.Manager): def for_user(self, user): sub, created = Subscription.objects.get_or_create(user_id=user.id) return sub class Subscription(models.Model): user = models.OneToOneField(User, models.CASCADE, blank=True, null=True) customer_id = models.CharField(max_length=36, blank=True) payment_method_token = models.CharField(max_length=35, blank=True) subscription_id = models.CharField(max_length=10, blank=True) plan_id = models.CharField(max_length=10, blank=True) objects = SubscriptionManager() def price(self): if self.plan_id == "P5": return 5 elif self.plan_id == "P50": return 50 return 0 def _get_braintree_payment_method(self): if not hasattr(self, "_pm"): self._pm = braintree.PaymentMethod.find(self.payment_method_token) return self._pm def cancel(self): if self.subscription_id: braintree.Subscription.cancel(self.subscription_id) self.subscription_id = "" self.plan_id = "" self.save() def pm_is_credit_card(self): return isinstance(self._get_braintree_payment_method(), braintree.credit_card.CreditCard) def pm_is_paypal(self): return isinstance(self._get_braintree_payment_method(), braintree.paypal_account.PayPalAccount) def card_type(self): o = self._get_braintree_payment_method() return o.card_type def last_4(self): o = self._get_braintree_payment_method() return o.last_4 def paypal_email(self): o = self._get_braintree_payment_method() return o.email