Esempio n. 1
0
 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})
Esempio n. 2
0
 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
Esempio n. 3
0
 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
Esempio n. 4
0
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")
            )
Esempio n. 5
0
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")
            )
Esempio n. 6
0
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)
Esempio n. 7
0
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)