def test_valid(self): """ If everything is right, the form should come back valid. """ token = make_tier_change_token(self.tier1) form = TierChangeForm({'tier': self.tier1.slug, 'token': token}) self.assertTrue(form.is_valid())
def test_bad_token(self): """ The form should be invalid if the token is invalid. """ self.assertNotEqual(self.tier_info.tier, self.tier1) token = 'not_a_token' form = TierChangeForm({'tier': self.tier1.slug, 'token': token}) self.assertFalse(form.is_valid()) self.assertEqual(form.errors.keys(), ['__all__'])
def test_same_tier(self): """ The form should be invalid if the tier we're changing to is the same as the current tier. """ self.assertEqual(self.tier_info.tier, self.tier2) token = make_tier_change_token(self.tier2) form = TierChangeForm({'tier': self.tier2.slug, 'token': token}) self.assertFalse(form.is_valid()) self.assertEqual(form.errors.keys(), ['tier'])
def test_bad_slug(self): """ The form should be invalid if the slug given doesn't refer to an available tier. """ tier3 = self.create_tier(name='Tier3', slug='tier3', price=30) token = make_tier_change_token(tier3) form = TierChangeForm({'tier': tier3.slug, 'token': token}) self.assertFalse(form.is_valid()) self.assertEqual(form.errors.keys(), ['tier'])
def test_save(self): """ Saving the form should update the last tier changed date and actually change the tier. """ token = make_tier_change_token(self.tier1) form = TierChangeForm({'tier': self.tier1.slug, 'token': token}) self.assertTrue(form.is_valid()) self.assertEqual(self.tier_info.tier, self.tier2) old_tier_changed = self.tier_info.tier_changed form.save() self.assertEqual(self.tier_info.tier, self.tier1) self.assertGreater(self.tier_info.tier_changed, old_tier_changed)
def get_context_data(self, **kwargs): context = super(DowngradeConfirmationView, self).get_context_data(**kwargs) tier_info = SiteTierInfo.objects.get_current() slug = self.request.GET.get('tier', '') try: tier = tier_info.available_tiers.get(slug=slug) except Tier.DoesNotExist: raise Http404 if tier.price >= tier_info.tier.price: raise Http404 if tier_info.enforce_payments: if tier.price == 0: if tier_info.subscription: form = PayPalCancellationForm() else: # If they don't have an active subscription, we can't very # well cancel it. form = TierChangeForm(initial={'tier': tier}) else: form = PayPalSubscriptionForm(tier) else: form = TierChangeForm(initial={'tier': tier}) context.update({ 'form': form, 'tier': tier, 'tier_info': tier_info, 'admins_to_demote': admins_to_demote(tier), 'videos_to_deactivate': videos_to_deactivate(tier), 'have_theme': Theme.objects.filter(default=True).exists() }) return context
def get_context_data(self, **kwargs): context = super(TierView, self).get_context_data(**kwargs) tier_info = SiteTierInfo.objects.get_current() if tier_info.enforce_payments: price = (0 if tier_info.subscription is None else tier_info.subscription.signup_or_modify.amount3) try: set_tier(price) except Tier.DoesNotExist: logging.error('No tier matching current subscription.', exc_info=True) except Tier.MultipleObjectsReturned: logging.error( 'Multiple tiers found matching current' 'subscription.', exc_info=True) forms = SortedDict() tiers = tier_info.available_tiers.order_by('price') for tier in tiers: if tier.price < tier_info.tier.price: forms[tier] = DowngradeConfirmationForm(tier) else: if tier_info.enforce_payments: forms[tier] = PayPalSubscriptionForm(tier) else: forms[tier] = TierChangeForm(initial={'tier': tier}) # Here we build a list of prices of current subscriptions, sorted # by the date the subscription started. This lets us check in the # template whether a tier's subscription should be considered # "upcoming" or "old". subscriptions = sorted([ subscr for subscr in tier_info.subscriptions if not subscr.is_cancelled ], key=lambda s: s.signup_or_modify.subscr_date, reverse=True) subscription_prices = [subscr.price for subscr in subscriptions] context.update({ 'subscription_prices': subscription_prices, 'cancellation_form': PayPalCancellationForm(), 'forms': forms, 'tier_info': tier_info, }) return context
def handle_form(self, data): form = TierChangeForm(data) if form.is_valid(): form.save()