def test_unsubscribe_called_with_correct_arguments(self, mock_get_mailchimp_api): list_name = 'foo' user = UserFactory() mock_client = mock.MagicMock() mock_get_mailchimp_api.return_value = mock_client mock_client.lists.list.return_value = {'data': [{'id': 2, 'list_name': list_name}]} list_id = mailchimp_utils.get_list_id_from_name(list_name) mailchimp_utils.unsubscribe_mailchimp(list_name, user._id) mock_client.lists.unsubscribe.assert_called_with(id=list_id, email={'email': user.username})
def disable_account(self): """ Disables user account, making is_disabled true, while also unsubscribing user from mailchimp emails. """ from website import mailchimp_utils mailchimp_utils.unsubscribe_mailchimp( list_name=settings.MAILCHIMP_GENERAL_LIST, user_id=self._id, username=self.username) self.is_disabled = True
def disable_account(self): """ Disables user account, making is_disabled true, while also unsubscribing user from mailchimp emails. """ from website import mailchimp_utils mailchimp_utils.unsubscribe_mailchimp( list_name=settings.MAILCHIMP_GENERAL_LIST, user_id=self._id, username=self.username ) self.is_disabled = True
def update_subscription(user, list_name, subscription): """ Update mailing list subscription in mailchimp. :param obj user: current user :param str list_name: mailing list :param boolean subscription: true if user is subscribed """ if subscription: mailchimp_utils.subscribe_mailchimp(list_name, user._id) else: try: mailchimp_utils.unsubscribe_mailchimp(list_name, user._id) except mailchimp_utils.mailchimp.ListNotSubscribedError: raise HTTPError(http.BAD_REQUEST, data=dict(message_short="ListNotSubscribedError", message_long="The user is already unsubscribed from this mailing list.", error_type="not_subscribed") )
def update_subscription(user, list_name, subscription): """ Update mailing list subscription in mailchimp. :param obj user: current user :param str list_name: mailing list :param boolean subscription: true if user is subscribed """ if subscription: mailchimp_utils.subscribe_mailchimp(list_name, user._id) else: try: mailchimp_utils.unsubscribe_mailchimp(list_name, user._id) except mailchimp_utils.mailchimp.ListNotSubscribedError: raise HTTPError(http.BAD_REQUEST, data=dict(message_short="ListNotSubscribedError", message_long="The user is already unsubscribed from this mailing list.", error_type="not_subscribed") )
def update_user(auth): """Update the logged-in user's profile.""" # trust the decorator to handle auth user = auth.user data = request.get_json() validate_user(data, user) # TODO: Expand this to support other user attributes ########## # Emails # ########## if 'emails' in data: emails_list = [x['address'].strip().lower() for x in data['emails']] if user.username not in emails_list: raise HTTPError(httplib.FORBIDDEN) # removals removed_emails = [ each for each in user.emails + user.unconfirmed_emails if each not in emails_list ] if user.username in removed_emails: raise HTTPError(httplib.FORBIDDEN) for address in removed_emails: if address in user.emails: try: user.remove_email(address) except PermissionsError as e: raise HTTPError(httplib.FORBIDDEN, e.message) user.remove_unconfirmed_email(address) # additions added_emails = [ each['address'].strip().lower() for each in data['emails'] if each['address'].strip().lower() not in user.emails and each['address'].strip().lower() not in user.unconfirmed_emails ] for address in added_emails: try: user.add_unconfirmed_email(address) except (ValidationError, ValueError): continue # TODO: This setting is now named incorrectly. if settings.CONFIRM_REGISTRATIONS_BY_EMAIL: send_confirm_email(user, email=address) ############ # Username # ############ # get the first email that is set to primary and has an address primary_email = next(( each for each in data['emails'] # email is primary if each.get('primary') and each.get('confirmed') # an address is specified (can't trust those sneaky users!) and each.get('address'))) if primary_email: primary_email_address = primary_email['address'].strip().lower() if primary_email_address not in user.emails: raise HTTPError(httplib.FORBIDDEN) username = primary_email_address # make sure the new username has already been confirmed if username and username in user.emails and username != user.username: mails.send_mail(user.username, mails.PRIMARY_EMAIL_CHANGED, user=user, new_address=username) # Remove old primary email from subscribed mailing lists for list_name, subscription in user.mailing_lists.iteritems(): if subscription: mailchimp_utils.unsubscribe_mailchimp( list_name, user._id, username=user.username) user.username = username ################### # Timezone/Locale # ################### if 'locale' in data: if data['locale']: locale = data['locale'].replace('-', '_') user.locale = locale # TODO: Refactor to something like: # user.timezone = data.get('timezone', user.timezone) if 'timezone' in data: if data['timezone']: user.timezone = data['timezone'] user.save() # Update subscribed mailing lists with new primary email # TODO: move to user.save() for list_name, subscription in user.mailing_lists.iteritems(): if subscription: mailchimp_utils.subscribe_mailchimp(list_name, user._id) return _profile_view(user)
def update_user(auth): """Update the logged-in user's profile.""" # trust the decorator to handle auth user = auth.user data = request.get_json() validate_user(data, user) # TODO: Expand this to support other user attributes ########## # Emails # ########## if 'emails' in data: emails_list = [x['address'].strip().lower() for x in data['emails']] if user.username not in emails_list: raise HTTPError(httplib.FORBIDDEN) # removals removed_emails = [ each for each in user.emails + user.unconfirmed_emails if each not in emails_list ] if user.username in removed_emails: raise HTTPError(httplib.FORBIDDEN) for address in removed_emails: if address in user.emails: try: user.remove_email(address) except PermissionsError as e: raise HTTPError(httplib.FORBIDDEN, e.message) user.remove_unconfirmed_email(address) # additions added_emails = [ each['address'].strip().lower() for each in data['emails'] if each['address'].strip().lower() not in user.emails and each['address'].strip().lower() not in user.unconfirmed_emails ] for address in added_emails: try: user.add_unconfirmed_email(address) except (ValidationError, ValueError): continue # TODO: This setting is now named incorrectly. if settings.CONFIRM_REGISTRATIONS_BY_EMAIL: send_confirm_email(user, email=address) ############ # Username # ############ # get the first email that is set to primary and has an address primary_email = next( ( each for each in data['emails'] # email is primary if each.get('primary') and each.get('confirmed') # an address is specified (can't trust those sneaky users!) and each.get('address') ) ) if primary_email: primary_email_address = primary_email['address'].strip().lower() if primary_email_address not in user.emails: raise HTTPError(httplib.FORBIDDEN) username = primary_email_address # make sure the new username has already been confirmed if username and username in user.emails and username != user.username: mails.send_mail(user.username, mails.PRIMARY_EMAIL_CHANGED, user=user, new_address=username) # Remove old primary email from subscribed mailing lists for list_name, subscription in user.mailing_lists.iteritems(): if subscription: mailchimp_utils.unsubscribe_mailchimp(list_name, user._id, username=user.username) user.username = username ################### # Timezone/Locale # ################### if 'locale' in data: if data['locale']: locale = data['locale'].replace('-', '_') user.locale = locale # TODO: Refactor to something like: # user.timezone = data.get('timezone', user.timezone) if 'timezone' in data: if data['timezone']: user.timezone = data['timezone'] user.save() # Update subscribed mailing lists with new primary email # TODO: move to user.save() for list_name, subscription in user.mailing_lists.iteritems(): if subscription: mailchimp_utils.subscribe_mailchimp(list_name, user._id) return _profile_view(user)