def update_mailchimp_subscription(user, list_name, subscription, send_goodbye=True): """ 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: try: mailchimp_utils.subscribe_mailchimp(list_name, user._id) except mailchimp.Error: pass else: try: mailchimp_utils.unsubscribe_mailchimp_async( list_name, user._id, username=user.username, send_goodbye=send_goodbye) except mailchimp.Error: # User has already unsubscribed, so nothing to do pass
def update_mailchimp_subscription(user, list_name, subscription, send_goodbye=True): """ 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_async( list_name, user._id, username=user.username, send_goodbye=send_goodbye) 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 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_async(list_name, user._id) handlers.celery_teardown_request() mock_client.lists.unsubscribe.assert_called_with(id=list_id, email={'email': user.username}, send_goodbye=True)
def update_mailchimp_subscription(user, list_name, subscription, send_goodbye=True): """ 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_async(list_name, user._id, username=user.username, send_goodbye=send_goodbye) 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_mailchimp_subscription(user, list_name, subscription, send_goodbye=True): """ 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: try: mailchimp_utils.subscribe_mailchimp(list_name, user._id) except mailchimp.Error: pass else: try: mailchimp_utils.unsubscribe_mailchimp_async(list_name, user._id, username=user.username, send_goodbye=send_goodbye) except mailchimp.Error: # User has already unsubscribed, so nothing to do pass
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.strip().lower() not in emails_list: raise HTTPError(httplib.FORBIDDEN) available_emails = [each.strip().lower() for each in user.emails + user.unconfirmed_emails] # removals removed_emails = [each.strip().lower() for each in available_emails if each not in emails_list] if user.username.strip().lower() 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 available_emails ] for address in added_emails: try: user.add_unconfirmed_email(address) except (ValidationError, ValueError): raise HTTPError(http.BAD_REQUEST, data=dict(message_long="Invalid Email")) # 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 [each.strip().lower() for each 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.mailchimp_mailing_lists.iteritems(): if subscription: mailchimp_utils.unsubscribe_mailchimp_async(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.mailchimp_mailing_lists.iteritems(): if subscription: mailchimp_utils.subscribe_mailchimp(list_name, user._id) return _profile_view(user, is_profile=True)
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.strip().lower() not in emails_list: raise HTTPError(httplib.FORBIDDEN) available_emails = [ each.strip().lower() for each in user.emails + user.unconfirmed_emails ] # removals removed_emails = [ each.strip().lower() for each in available_emails if each not in emails_list ] if user.username.strip().lower() 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 available_emails ] for address in added_emails: try: user.add_unconfirmed_email(address) except (ValidationError, ValueError): raise HTTPError(http.BAD_REQUEST, data=dict(message_long="Invalid Email")) # 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 [ each.strip().lower() for each 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.mailchimp_mailing_lists.iteritems( ): if subscription: mailchimp_utils.unsubscribe_mailchimp_async( 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.mailchimp_mailing_lists.iteritems(): if subscription: mailchimp_utils.subscribe_mailchimp(list_name, user._id) return _profile_view(user, is_profile=True)
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.strip().lower() not in emails_list: raise HTTPError(httplib.FORBIDDEN) available_emails = [ each.strip().lower() for each in list(user.emails.values_list('address', flat=True)) + user.unconfirmed_emails ] # removals removed_emails = [ each.strip().lower() for each in available_emails if each not in emails_list ] if user.username.strip().lower() in removed_emails: raise HTTPError(httplib.FORBIDDEN) for address in removed_emails: if user.emails.filter(address=address): try: user.remove_email(address) except PermissionsError as e: raise HTTPError(httplib.FORBIDDEN, str(e)) user.remove_unconfirmed_email(address) # additions added_emails = [ each['address'].strip().lower() for each in data['emails'] if each['address'].strip().lower() not in available_emails ] for address in added_emails: try: user.add_unconfirmed_email(address) except (ValidationError, ValueError): raise HTTPError(http.BAD_REQUEST, data=dict(message_long='Invalid Email')) except BlacklistedEmailError: sentry.log_message('User attempted to add a blacklisted email', extra_data={ 'user_id': user.id, 'address': address, }) raise HTTPError( http.BAD_REQUEST, data=dict(message_long=language.BLACKLISTED_EMAIL)) # TODO: This setting is now named incorrectly. if settings.CONFIRM_REGISTRATIONS_BY_EMAIL: if not throttle_period_expired(user.email_last_sent, settings.SEND_EMAIL_THROTTLE): raise HTTPError( httplib.BAD_REQUEST, data={ 'message_long': 'Too many requests. Please wait a while before adding an email to your account.' }) 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 [ each.strip().lower() for each in user.emails.values_list('address', flat=True) ]: raise HTTPError(httplib.FORBIDDEN) username = primary_email_address # make sure the new username has already been confirmed if username and username != user.username and user.emails.filter( address=username).exists(): mails.send_mail(user.username, mails.PRIMARY_EMAIL_CHANGED, user=user, new_address=username, can_change_preferences=False, osf_contact_email=settings.OSF_CONTACT_EMAIL) # Remove old primary email from subscribed mailing lists for list_name, subscription in user.mailchimp_mailing_lists.items( ): if subscription: mailchimp_utils.unsubscribe_mailchimp_async( 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.mailchimp_mailing_lists.items(): if subscription: mailchimp_utils.subscribe_mailchimp(list_name, user._id) return _profile_view(user, is_profile=True)
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.strip().lower() not in emails_list: raise HTTPError(httplib.FORBIDDEN) available_emails = [ each.strip().lower() for each in list(user.emails.values_list('address', flat=True)) + user.unconfirmed_emails ] # removals removed_emails = [ each.strip().lower() for each in available_emails if each not in emails_list ] if user.username.strip().lower() in removed_emails: raise HTTPError(httplib.FORBIDDEN) for address in removed_emails: if user.emails.filter(address=address): 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 available_emails ] for address in added_emails: try: user.add_unconfirmed_email(address) except (ValidationError, ValueError): raise HTTPError(http.BAD_REQUEST, data=dict( message_long='Invalid Email') ) except BlacklistedEmailError: raise HTTPError(http.BAD_REQUEST, data=dict( message_long=language.BLACKLISTED_EMAIL) ) # 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 [each.strip().lower() for each in user.emails.values_list('address', flat=True)]: raise HTTPError(httplib.FORBIDDEN) username = primary_email_address # make sure the new username has already been confirmed if username and username != user.username and user.emails.filter(address=username).exists(): mails.send_mail( user.username, mails.PRIMARY_EMAIL_CHANGED, user=user, new_address=username, can_change_preferences=False, osf_contact_email=settings.OSF_CONTACT_EMAIL ) # Remove old primary email from subscribed mailing lists for list_name, subscription in user.mailchimp_mailing_lists.iteritems(): if subscription: mailchimp_utils.unsubscribe_mailchimp_async(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.mailchimp_mailing_lists.iteritems(): if subscription: mailchimp_utils.subscribe_mailchimp(list_name, user._id) return _profile_view(user, is_profile=True)