def user_settings(request, post_change_redirect=None): user = request.user if post_change_redirect is None: post_change_redirect = reverse('apps.user_settings.views.user_settings') if request.method == 'POST': resp = HttpResponseRedirect(post_change_redirect) pw_form = PasswordChangeForm(user, data=request.POST) email_form = EmailChangeForm(user=user, data=request.POST) subscription_form = SubscriptionForm(user=user, data=request.POST) https_form = SecureOnlyForm(request.user, request.COOKIES, http_response=resp, data=request.POST) browsing_form = BrowsingSettingsForm(user, data=request.POST) connections_form = ConnectionsForm(user, data=request.POST) all_forms = [pw_form, email_form, subscription_form, https_form, browsing_form, connections_form] views.handle_unsubscribe_post(user, request.REQUEST, request) if all(form.is_valid() for form in all_forms): for form in all_forms: form.save() if pw_form.password_changed(): request.session['password_updated'] = True return resp else: pw_form = PasswordChangeForm(user) email_form = EmailChangeForm(user=user) subscription_form = SubscriptionForm(user=user, initial={ 'newsletter': not EmailUnsubscribe.objects.get_or_none(email=user.email), }) https_form = SecureOnlyForm(user, request.COOKIES) browsing_form = BrowsingSettingsForm(user) connections_form = ConnectionsForm(user) all_forms = [pw_form, email_form, subscription_form, https_form, browsing_form, connections_form] context = { 'pw_form': pw_form, 'email_form': email_form, 'subscription_form': subscription_form, 'https_form': https_form, 'browsing_form': browsing_form, 'all_forms': all_forms, 'connections_form': connections_form, 'is_staff': request.user.is_staff, 'email_confirmation': EmailConfirmation.objects.get_or_none(user=user), 'unsubscribed_settings': views.get_unsubscriptions(user), } def handle_updated_field(name): if request.session.get(name, False): context[name] = True del request.session[name] map(handle_updated_field, ['email_updated', 'password_updated']) return render_to_response('user/settings.django.html', context, context_instance=RequestContext(request))
def validate_unsubscript(self, actions_dict, canvas_user=None, all_actions=None): if not canvas_user: canvas_user = create_user() if not all_actions: all_actions = EmailChannel.all_handled_actions() request = FakeRequest() views.handle_unsubscribe_post(canvas_user, actions_dict, request) unsubscriptions = views.get_unsubscriptions(canvas_user, all_actions) for action in all_actions: if action == 'newsletter': continue value = action if action == "ALL": value = not action if actions_dict.get(action) == "on": assert not unsubscriptions.get(value) else: assert unsubscriptions.get(value) return unsubscriptions
def test_granualr_unsubscribe_blanket_ban(self): all_actions = EmailChannel.all_handled_actions() # ALL has inverted semantics ... make sure it works. all_actions.append("ALL") # Reuse the same user canvas_user = create_user() action = "ALL" actions_dict = {action: "on"} unsubscriptions = self.validate_unsubscript(actions_dict, canvas_user, all_actions) for action in all_actions: # Ensure that we unsubscribed from all of them! assert unsubscriptions.get(action) action = "ALL" # Remove blanket subscription actions_dict = {} request = FakeRequest() views.handle_unsubscribe_post(canvas_user, actions_dict, request) unsubscriptions = views.get_unsubscriptions(canvas_user, all_actions) for action in all_actions: # Ensure that the user is now subscribed for everything, which is the default without the blanket ban. assert not unsubscriptions.get(action)