コード例 #1
0
def main():
    dry = '--dry' in sys.argv
    if not dry:
        # If we're not running in dry mode log everything to a file
        script_utils.add_file_logger(logger, __file__)

    with transaction.atomic():
        start_time = datetime(2017, 12, 20, 8, 25, 25, tzinfo=pytz.UTC)
        end_time = datetime(2017, 12, 20, 18, 5, 1, tzinfo=pytz.UTC)

        users = OSFUser.objects.filter(is_registered=True, date_disabled__isnull=True, date_registered__range=[start_time, end_time])

        count = 0
        for user in users:
            if settings.MAILCHIMP_GENERAL_LIST not in user.mailchimp_mailing_lists:
                if not dry:
                    subscribe_mailchimp(settings.MAILCHIMP_GENERAL_LIST, user._id)
                    logger.info('User {} has been subscribed to OSF general mailing list'.format(user._id))
                count += 1

        logger.info('{} users have been subscribed to OSF general mailing list'.format(count))

        if dry:
            raise Exception('Abort Transaction - Dry Run')
    print('Done')
コード例 #2
0
ファイル: test_mailchimp.py プロジェクト: GageGaskins/osf.io
 def test_subscribe_fake_email_does_not_throw_validation_error(self, mock_get_mailchimp_api):
     list_name = 'foo'
     user = UserFactory(username='******')
     mock_client = mock.MagicMock()
     mock_get_mailchimp_api.return_value = mock_client
     mock_client.lists.list.return_value = {'data': [{'id': 1, 'list_name': list_name}]}
     mock_client.lists.subscribe.side_effect = mailchimp.ValidationError
     mailchimp_utils.subscribe_mailchimp(list_name, user._id)
     assert_false(user.mailing_lists[list_name])
コード例 #3
0
ファイル: views.py プロジェクト: DanielSBrown/osf.io
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")
            )
コード例 #4
0
ファイル: test_mailchimp.py プロジェクト: GageGaskins/osf.io
 def test_subscribe_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': 1, 'list_name': list_name}]}
     list_id = mailchimp_utils.get_list_id_from_name(list_name)
     mailchimp_utils.subscribe_mailchimp(list_name, user._id)
     mock_client.lists.subscribe.assert_called_with(
         id=list_id,
         email={'email': user.username},
         merge_vars={
             'fname': user.given_name,
             'lname': user.family_name,
         },
         double_optin=False,
         update_existing=True,
     )
コード例 #5
0
ファイル: views.py プロジェクト: mfraezz/osf.io
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
コード例 #6
0
 def test_subscribe_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': 1, 'list_name': list_name}]}
     list_id = mailchimp_utils.get_list_id_from_name(list_name)
     mailchimp_utils.subscribe_mailchimp(list_name, user._id)
     handlers.celery_teardown_request()
     mock_client.lists.subscribe.assert_called_with(
         id=list_id,
         email={'email': user.username},
         merge_vars={
             'fname': user.given_name,
             'lname': user.family_name,
         },
         double_optin=False,
         update_existing=True,
     )
コード例 #7
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"))
コード例 #8
0
ファイル: views.py プロジェクト: cwisecarver/osf.io
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)
コード例 #9
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.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)
コード例 #10
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.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)
コード例 #11
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.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)