示例#1
0
    def setUp(self):
        """Before each individual test, create a dummy exploration."""
        super(ExplorationServicesUnitTests, self).setUp()

        self.EXP_ID = 'An exploration_id'

        self.OWNER_EMAIL = '*****@*****.**'
        self.EDITOR_EMAIL = '*****@*****.**'
        self.VIEWER_EMAIL = '*****@*****.**'

        self.OWNER_ID = self.get_user_id_from_email(self.OWNER_EMAIL)
        self.EDITOR_ID = self.get_user_id_from_email(self.EDITOR_EMAIL)
        self.VIEWER_ID = self.get_user_id_from_email(self.VIEWER_EMAIL)

        self.OWNER_NAME = 'owner'
        self.EDITOR_NAME = 'editor'
        self.VIEWER_NAME = 'viewer'

        user_services.get_or_create_user(self.OWNER_ID, self.OWNER_EMAIL)
        user_services.get_or_create_user(self.EDITOR_ID, self.EDITOR_EMAIL)
        user_services.get_or_create_user(self.VIEWER_ID, self.VIEWER_EMAIL)

        self.register_editor(self.OWNER_EMAIL, username=self.OWNER_NAME)
        self.register_editor(self.EDITOR_EMAIL, username=self.EDITOR_NAME)
        self.register_editor(self.VIEWER_EMAIL, username=self.VIEWER_NAME)

        config_services.set_property(
            feconf.ADMIN_COMMITTER_ID, 'admin_emails', ['*****@*****.**'])
        self.user_id_admin = self.get_user_id_from_email('*****@*****.**')
示例#2
0
文件: admin.py 项目: aldeka/oppia
    def post(self):
        """Handles POST requests."""
        try:
            if self.payload.get('action') == 'reload_exploration':
                exploration_id = self.payload.get('explorationId')
                logging.info(
                    '[ADMIN] %s reloaded exploration %s' %
                    (self.user_id, exploration_id))
                exp_services.delete_demo(unicode(exploration_id))
                exp_services.load_demo(unicode(exploration_id))
            elif self.payload.get('action') == 'save_config_properties':
                new_config_property_values = self.payload.get(
                    'new_config_property_values')
                logging.info('[ADMIN] %s saved config property values: %s' %
                             (self.user_id, new_config_property_values))
                for (name, value) in new_config_property_values.iteritems():
                    config_services.set_property(self.user_id, name, value)
            elif self.payload.get('action') == 'revert_config_property':
                config_property_id = self.payload.get('config_property_id')
                logging.info('[ADMIN] %s reverted config property: %s' %
                             (self.user_id, config_property_id))
                config_services.revert_property(
                    self.user_id, config_property_id)
            elif self.payload.get('action') == 'refresh_computed_property':
                computed_property_name = self.payload.get(
                    'computed_property_name')
                config_domain.Registry.get_config_property(
                    computed_property_name).refresh_default_value()

            self.render_json({})
        except Exception as e:
            self.render_json({'error': unicode(e)})
            raise
示例#3
0
    def test_send_email_does_not_resend_within_duplicate_interval(self):
        can_send_emails_ctx = self.swap(
            feconf, 'CAN_SEND_EMAILS_TO_USERS', True)

        duplicate_email_ctx = self.swap(
            feconf, 'DUPLICATE_EMAIL_INTERVAL_MINS', 2)

        logged_errors = []

        def _log_error_for_tests(error_message):
            logged_errors.append(error_message)

        log_new_error_counter = test_utils.CallCounter(_log_error_for_tests)
        log_new_error_ctx = self.swap(
            email_manager, 'log_new_error', log_new_error_counter)

        with can_send_emails_ctx, duplicate_email_ctx, log_new_error_ctx:
            config_services.set_property(
                self.admin_id, email_manager.EMAIL_SENDER_NAME.name,
                'Email Sender')

            all_models = email_models.SentEmailModel.get_all().fetch()
            self.assertEqual(len(all_models), 0)

            # pylint: disable=protected-access
            email_manager._send_email(
                self.new_user_id, feconf.SYSTEM_COMMITTER_ID,
                feconf.EMAIL_INTENT_SIGNUP, 'Email Subject', 'Email Body',
                feconf.SYSTEM_EMAIL_ADDRESS)

            # Check that a new email was sent.
            messages = self.mail_stub.get_sent_messages(to=self.NEW_USER_EMAIL)
            self.assertEqual(1, len(messages))

            # Check that the content of this email was recorded in
            # SentEmailModel.
            all_models = email_models.SentEmailModel.get_all().fetch()
            self.assertEqual(len(all_models), 1)

            # No error should be recorded in the logs.
            self.assertEqual(log_new_error_counter.times_called, 0)

            email_manager._send_email(
                self.new_user_id, feconf.SYSTEM_COMMITTER_ID,
                feconf.EMAIL_INTENT_SIGNUP, 'Email Subject', 'Email Body',
                feconf.SYSTEM_EMAIL_ADDRESS)
            # pylint: enable=protected-access

            # An error should be recorded in the logs.
            self.assertEqual(log_new_error_counter.times_called, 1)
            self.assertRegexpMatches(logged_errors[0], 'Duplicate email')

            # Check that a new email was not sent.
            messages = self.mail_stub.get_sent_messages(to=self.NEW_USER_EMAIL)
            self.assertEqual(1, len(messages))

            # Check that the content of this email was not recorded in
            # SentEmailModel.
            all_models = email_models.SentEmailModel.get_all().fetch()
            self.assertEqual(len(all_models), 1)
示例#4
0
 def setUp(self):
     super(EmailDashboardDataHandlerTests, self).setUp()
     self.signup(self.SUBMITTER_EMAIL, self.SUBMITTER_USERNAME)
     self.submitter_id = self.get_user_id_from_email(self.SUBMITTER_EMAIL)
     self.signup(self.USER_A_EMAIL, self.USER_A_USERNAME)
     self.user_a_id = self.get_user_id_from_email(self.USER_A_EMAIL)
     config_services.set_property(self.submitter_id, "whitelisted_email_senders", [self.SUBMITTER_USERNAME])
示例#5
0
    def setUp(self):
        super(ModeratorEmailsTest, self).setUp()
        self.signup(self.EDITOR_EMAIL, self.EDITOR_USERNAME)
        self.EDITOR_ID = self.get_user_id_from_email(self.EDITOR_EMAIL)

        self.signup(self.MODERATOR_EMAIL, self.MODERATOR_USERNAME)
        self.MODERATOR_ID = self.get_user_id_from_email(self.MODERATOR_EMAIL)
        self.set_moderators([self.MODERATOR_EMAIL])

        # The editor publishes an exploration.
        self.EXP_ID = 'eid'
        self.save_new_valid_exploration(
            self.EXP_ID, self.EDITOR_ID, title='My Exploration',
            end_state_name='END')
        rights_manager.publish_exploration(self.EDITOR_ID, self.EXP_ID)

        # Set the default email config.
        self.signup(self.ADMIN_EMAIL, self.ADMIN_USERNAME)
        self.ADMIN_ID = self.get_user_id_from_email(self.ADMIN_EMAIL)
        config_services.set_property(
            self.ADMIN_ID, 'publicize_exploration_email_html_body',
            'Default publicization email body')
        config_services.set_property(
            self.ADMIN_ID, 'unpublish_exploration_email_html_body',
            'Default unpublishing email body')
    def test_email_only_sent_once_for_repeated_signups_by_same_user(self):
        with self.swap(feconf, 'CAN_SEND_EMAILS_TO_USERS', True):
            config_services.set_property(
                self.admin_id, email_manager.EMAIL_FOOTER.name,
                self.new_footer)
            config_services.set_property(
                self.admin_id, email_manager.SIGNUP_EMAIL_CONTENT.name,
                self.new_email_content)

            self.login(self.EDITOR_EMAIL)
            response = self.testapp.get(feconf.SIGNUP_URL)
            csrf_token = self.get_csrf_token_from_response(response)

            self.post_json(feconf.SIGNUP_DATA_URL, {
                'agreed_to_terms': True,
                'username': self.EDITOR_USERNAME
            }, csrf_token=csrf_token)

            # Check that an email was sent.
            messages = self.mail_stub.get_sent_messages(to=self.EDITOR_EMAIL)
            self.assertEqual(1, len(messages))

            # Send a second POST request.
            self.post_json(feconf.SIGNUP_DATA_URL, {
                'agreed_to_terms': True,
                'username': self.EDITOR_USERNAME
            }, csrf_token=csrf_token)

            # Check that no new email was sent.
            messages = self.mail_stub.get_sent_messages(to=self.EDITOR_EMAIL)
            self.assertEqual(1, len(messages))
示例#7
0
    def test_email_only_sent_if_signup_was_successful(self):
        with self.swap(feconf, 'CAN_SEND_EMAILS_TO_USERS', True):
            config_services.set_property(
                self.ADMIN_ID, email_manager.EMAIL_FOOTER.name,
                self.NEW_FOOTER)
            config_services.set_property(
                self.ADMIN_ID, email_manager.SIGNUP_EMAIL_CONTENT.name,
                self.NEW_EMAIL_CONTENT)

            self.login(self.EDITOR_EMAIL)
            response = self.testapp.get(feconf.SIGNUP_URL)
            csrf_token = self.get_csrf_token_from_response(response)

            self.post_json(feconf.SIGNUP_DATA_URL, {
                'agreed_to_terms': True,
                'username': '******'
            },
            csrf_token=csrf_token, expect_errors=True, expected_status_int=400)

            # Check that no email was sent.
            messages = self.mail_stub.get_sent_messages(to=self.EDITOR_EMAIL)
            self.assertEqual(0, len(messages))

            # Redo the signup process with a good username.
            self.post_json(feconf.SIGNUP_DATA_URL, {
                'agreed_to_terms': True,
                'username': self.EDITOR_USERNAME
            }, csrf_token=csrf_token)

            # Check that a new email was sent.
            messages = self.mail_stub.get_sent_messages(to=self.EDITOR_EMAIL)
            self.assertEqual(1, len(messages))
示例#8
0
文件: admin.py 项目: danieljjh/oppia
    def post(self):
        """Handles POST requests."""
        try:
            if self.payload.get('action') == 'reload_exploration':
                exploration_id = self.payload.get('exploration_id')
                logging.info(
                    '[ADMIN] %s reloaded exploration %s' %
                    (self.user_id, exploration_id))
                exp_services.delete_demo(unicode(exploration_id))
                exp_services.load_demo(unicode(exploration_id))
            elif self.payload.get('action') == 'clear_search_index':
                exp_services.clear_search_index()
            elif self.payload.get('action') == 'save_config_properties':
                new_config_property_values = self.payload.get(
                    'new_config_property_values')
                logging.info('[ADMIN] %s saved config property values: %s' %
                             (self.user_id, new_config_property_values))
                for (name, value) in new_config_property_values.iteritems():
                    config_services.set_property(self.user_id, name, value)
            elif self.payload.get('action') == 'revert_config_property':
                config_property_id = self.payload.get('config_property_id')
                logging.info('[ADMIN] %s reverted config property: %s' %
                             (self.user_id, config_property_id))
                config_services.revert_property(
                    self.user_id, config_property_id)
            elif self.payload.get('action') == 'refresh_computed_property':
                computed_property_name = self.payload.get(
                    'computed_property_name')
                config_domain.Registry.get_config_property(
                    computed_property_name).refresh_default_value()
            elif self.payload.get('action') == 'start_new_job':
                for klass in jobs_registry.ONE_OFF_JOB_MANAGERS:
                    if klass.__name__ == self.payload.get('job_type'):
                        klass.enqueue(klass.create_new())
                        break
            elif self.payload.get('action') == 'cancel_job':
                job_id = self.payload.get('job_id')
                job_type = self.payload.get('job_type')
                for klass in jobs_registry.ONE_OFF_JOB_MANAGERS:
                    if klass.__name__ == job_type:
                        klass.cancel(job_id, self.user_id)
                        break
            elif self.payload.get('action') == 'start_computation':
                computation_type = self.payload.get('computation_type')
                for klass in jobs_registry.ALL_CONTINUOUS_COMPUTATION_MANAGERS:
                    if klass.__name__ == computation_type:
                        klass.start_computation()
                        break
            elif self.payload.get('action') == 'stop_computation':
                computation_type = self.payload.get('computation_type')
                for klass in jobs_registry.ALL_CONTINUOUS_COMPUTATION_MANAGERS:
                    if klass.__name__ == computation_type:
                        klass.stop_computation(self.user_id)
                        break

            self.render_json({})
        except Exception as e:
            self.render_json({'error': unicode(e)})
            raise
示例#9
0
    def test_derived_config_properties_cannot_be_set_directly(self):
        self.signup(self.MODERATOR_EMAIL, self.MODERATOR_USERNAME)

        with self.assertRaisesRegexp(Exception, "Cannot modify value of config property moderator_ids directly"):
            config_services.set_property(
                self.MODERATOR_EMAIL,
                config_domain.MODERATOR_IDS.name,
                [self.get_user_id_from_email(self.MODERATOR_EMAIL)],
            )
示例#10
0
    def test_unpublished_explorations_are_visible_to_admins(self):
        config_services.set_property(
            feconf.ADMIN_COMMITTER_ID, 'admin_emails', ['*****@*****.**'])

        self.login('*****@*****.**')
        response = self.testapp.get(
            '%s/%s' % (feconf.EXPLORATION_URL_PREFIX, self.EXP_ID))
        self.assertEqual(response.status_int, 200)
        self.assertIn('This is a preview', response.body)
        self.logout()
示例#11
0
    def init_csrf_secret(cls):
        """Verify that non-default CSRF secret exists; creates one if not."""

        # Any non-default value is fine.
        if CSRF_SECRET.value and CSRF_SECRET.value != DEFAULT_CSRF_SECRET:
            return

        # Initialize to random value.
        config_services.set_property(
            CSRF_SECRET.name, base64.urlsafe_b64encode(os.urandom(20)))
示例#12
0
    def init_csrf_secret(cls):
        """Verify that non-default CSRF secret exists; creates one if not."""

        # Any non-default value is fine.
        if CSRF_SECRET.value and CSRF_SECRET.value != DEFAULT_CSRF_SECRET:
            return

        # Initialize to random value.
        config_services.set_property(feconf.SYSTEM_COMMITTER_ID,
                                     CSRF_SECRET.name,
                                     base64.urlsafe_b64encode(os.urandom(20)))
示例#13
0
    def test_guest_user_check_contribution_rights(self):
        response = self.get_json('/usercontributionrightsdatahandler')
        config_services.set_property(
            'admin', 'contributor_can_suggest_questions', False)

        self.assertEqual(
            response, {
                'can_review_translation_for_language_codes': [],
                'can_review_voiceover_for_language_codes': [],
                'can_review_questions': False,
                'can_suggest_questions': False
            })
示例#14
0
    def put(self):
        promo_bar_enabled_value = self.payload.get('promo_bar_enabled')
        promo_bar_message_value = self.payload.get('promo_bar_message')

        logging.info(
            '[RELEASE COORDINATOR] %s saved promo-bar config property values: '
            '%s' % (self.user_id, promo_bar_message_value))
        config_services.set_property(self.user_id, 'promo_bar_enabled',
                                     promo_bar_enabled_value)
        config_services.set_property(self.user_id, 'promo_bar_message',
                                     promo_bar_message_value)

        self.render_json({})
示例#15
0
 def test_can_get_classroom_by_url_fragment(self):
     topic_id = topic_services.get_new_topic_id()
     config_services.set_property(
         self.user_id_admin, 'classroom_pages_data', [{
             'name': 'math',
             'url_fragment': 'math',
             'topic_ids': [topic_id],
             'course_details': '',
             'topic_list_intro': ''
         }])
     classroom = classroom_services.get_classroom_by_url_fragment('math')
     self.assertEqual(classroom.name, 'math')
     self.assertEqual(classroom.url_fragment, 'math')
     self.assertEqual(classroom.topic_ids, [topic_id])
示例#16
0
    def test_splash_page_demo_exploration(self):
        config_services.set_property(feconf.ADMIN_COMMITTER_ID,
                                     'splash_page_exploration_id', '1')

        exp_services.load_demo('1')

        self.assertTrue(rights_manager.Actor(self.user_id_a).can_view('1'))
        self.assertTrue(rights_manager.Actor(self.user_id_a).can_edit('1'))
        self.assertFalse(rights_manager.Actor(self.user_id_a).can_delete('1'))

        self.assertTrue(rights_manager.Actor(self.user_id_admin).can_view('1'))
        self.assertTrue(rights_manager.Actor(self.user_id_admin).can_edit('1'))
        self.assertTrue(
            rights_manager.Actor(self.user_id_admin).can_delete('1'))
示例#17
0
    def test_get_featured_translation_languages(self):
        response = self.get_json('/retrivefeaturedtranslationlanguages')
        self.assertEqual(response, {'featured_translation_languages': []})

        new_value = [{
            'language_code': 'en',
            'explanation': 'Partnership with ABC'
        }]
        config_services.set_property('admin', 'featured_translation_languages',
                                     new_value)

        response = self.get_json('/retrivefeaturedtranslationlanguages')
        self.assertEqual(response,
                         {'featured_translation_languages': new_value})
示例#18
0
    def test_handler_with_disabled_dashboard_flag_raise_404(self):
        config_services.set_property(
            'admin', 'contributor_dashboard_is_enabled', True)

        self.get_json(
            '%s/skill' % feconf.CONTRIBUTOR_OPPORTUNITIES_DATA_URL,
            params={}, expected_status_int=200)

        config_services.set_property(
            'admin', 'contributor_dashboard_is_enabled', False)

        self.get_json(
            '%s/skill' % feconf.CONTRIBUTOR_OPPORTUNITIES_DATA_URL,
            params={}, expected_status_int=404)
示例#19
0
    def test_splash_page_demo_exploration(self):
        config_services.set_property(
            feconf.ADMIN_COMMITTER_ID, 'splash_page_exploration_id', '1')

        exp_services.load_demo('1')

        self.assertTrue(rights_manager.Actor(self.user_id_a).can_view('1'))
        self.assertTrue(rights_manager.Actor(self.user_id_a).can_edit('1'))
        self.assertFalse(rights_manager.Actor(self.user_id_a).can_delete('1'))

        self.assertTrue(rights_manager.Actor(self.user_id_admin).can_view('1'))
        self.assertTrue(rights_manager.Actor(self.user_id_admin).can_edit('1'))
        self.assertTrue(
            rights_manager.Actor(self.user_id_admin).can_delete('1'))
示例#20
0
 def test_get_classroom_url_fragment_for_topic_id(self):
     topic_id = topic_services.get_new_topic_id()
     config_services.set_property(
         self.user_id_admin, 'classroom_pages_data', [{
             'name': 'math',
             'url_fragment': 'math-one',
             'topic_ids': [topic_id],
             'course_details': '',
             'topic_list_intro': ''
         }])
     classroom_url_fragment = (
         classroom_services.get_classroom_url_fragment_for_topic_id(
             topic_id))
     self.assertEqual(classroom_url_fragment, 'math-one')
示例#21
0
    def test_exploration_upload_button(self):
        """Test that the exploration upload button appears when appropriate."""
        self.login(self.EDITOR_EMAIL)

        response = self.testapp.get(feconf.GALLERY_URL)
        self.assertEqual(response.status_int, 200)
        response.mustcontain(no=['Upload Exploration'])

        config_services.set_property(
            feconf.SYSTEM_COMMITTER_ID, 'allow_yaml_file_upload', True)

        response = self.testapp.get(feconf.GALLERY_URL)
        self.assertEqual(response.status_int, 200)
        response.mustcontain('Upload Exploration')

        self.logout()
示例#22
0
    def test_exploration_upload_button(self):
        """Test that the exploration upload button appears when appropriate."""
        self.login(self.EDITOR_EMAIL)

        response = self.testapp.get(feconf.GALLERY_URL)
        self.assertEqual(response.status_int, 200)
        response.mustcontain(no=['Upload Exploration'])

        config_services.set_property(feconf.SYSTEM_COMMITTER_ID,
                                     'allow_yaml_file_upload', True)

        response = self.testapp.get(feconf.GALLERY_URL)
        self.assertEqual(response.status_int, 200)
        response.mustcontain('Upload Exploration')

        self.logout()
示例#23
0
 def test_return_default_if_associated_classroom_is_not_found(self):
     topic_id = topic_services.get_new_topic_id()
     config_services.set_property(
         self.user_id_admin, 'classroom_pages_data', [{
             'name': 'math',
             'url_fragment': 'math-two',
             'topic_ids': [],
             'course_details': '',
             'topic_list_intro': ''
         }])
     classroom_url_fragment = (
         classroom_services.get_classroom_url_fragment_for_topic_id(
             topic_id))
     self.assertNotEqual(classroom_url_fragment, 'math-two')
     self.assertEqual(
         classroom_url_fragment,
         constants.CLASSROOM_URL_FRAGMENT_FOR_UNATTACHED_TOPICS)
    def test_exploration_upload_button(self):
        """Test that the exploration upload button appears when appropriate."""
        self.register_editor('*****@*****.**')
        self.login('*****@*****.**')

        response = self.testapp.get(feconf.CONTRIBUTE_GALLERY_URL)
        self.assertEqual(response.status_int, 200)
        response.mustcontain(no=['Upload Existing Exploration'])

        config_services.set_property(
            feconf.ADMIN_COMMITTER_ID, 'allow_yaml_file_upload', True)

        response = self.testapp.get(feconf.CONTRIBUTE_GALLERY_URL)
        self.assertEqual(response.status_int, 200)
        response.mustcontain('Upload Existing Exploration')

        self.logout()
示例#25
0
    def test_exploration_upload_button(self):
        """Test that the exploration upload button appears when appropriate."""
        self.register_editor('*****@*****.**')
        self.login('*****@*****.**')

        response = self.testapp.get(feconf.CONTRIBUTE_GALLERY_URL)
        self.assertEqual(response.status_int, 200)
        response.mustcontain(no=['Upload Existing Exploration'])

        config_services.set_property(
            feconf.ADMIN_COMMITTER_ID, 'allow_yaml_file_upload', True)

        response = self.testapp.get(feconf.CONTRIBUTE_GALLERY_URL)
        self.assertEqual(response.status_int, 200)
        response.mustcontain('Upload Existing Exploration')

        self.logout()
示例#26
0
 def post(self) -> None:
     """Handles POST requests."""
     result = {}
     if self.normalized_payload.get('action') == 'save_config_properties':
         new_config_property_values = self.normalized_payload.get(
             'new_config_property_values')
         for (name, value) in new_config_property_values.items():
             config_services.set_property(self.user_id, name, value)
         logging.info('[BLOG ADMIN] %s saved config property values: %s' %
                      (self.user_id, new_config_property_values))
     elif self.normalized_payload.get('action') == 'revert_config_property':
         config_property_id = (
             self.normalized_payload.get('config_property_id'))
         config_services.revert_property(self.user_id, config_property_id)
         logging.info('[BLOG ADMIN] %s reverted config property: %s' %
                      (self.user_id, config_property_id))
     self.render_json(result)
示例#27
0
    def test_email_not_sent_if_content_config_is_partially_modified(self):
        can_send_emails_ctx = self.swap(feconf, 'CAN_SEND_EMAILS_TO_USERS',
                                        True)

        config_services.set_property(
            self.ADMIN_ID, email_manager.SIGNUP_EMAIL_CONTENT.name, {
                'subject':
                (email_manager.SIGNUP_EMAIL_CONTENT.default_value['subject']),
                'html_body':
                'New HTML body.',
            })

        logged_errors = []

        def _log_error_for_tests(error_message):
            logged_errors.append(error_message)

        log_new_error_counter = test_utils.CallCounter(_log_error_for_tests)
        log_new_error_ctx = self.swap(email_manager, 'log_new_error',
                                      log_new_error_counter)

        with can_send_emails_ctx, log_new_error_ctx:
            self.assertEqual(log_new_error_counter.times_called, 0)

            self.login(self.EDITOR_EMAIL)
            response = self.testapp.get(feconf.SIGNUP_URL)
            csrf_token = self.get_csrf_token_from_response(response)

            # No user-facing error should surface.
            response_dict = self.post_json(feconf.SIGNUP_DATA_URL, {
                'agreed_to_terms': True,
                'username': self.EDITOR_USERNAME
            },
                                           csrf_token=csrf_token)

            # However, an error should be recorded in the logs.
            self.assertEqual(log_new_error_counter.times_called, 1)
            self.assertEqual(
                logged_errors[0],
                'Please ensure that the value for the admin config property '
                'SIGNUP_EMAIL_CONTENT is set, before allowing post-signup '
                'emails to be sent.')

            # Check that no email was sent.
            messages = self.mail_stub.get_sent_messages(to=self.EDITOR_EMAIL)
            self.assertEqual(0, len(messages))
示例#28
0
 def setUp(self) -> None:
     super(ClassroomPageAccessValidationHandlerTests, self).setUp()
     self.signup(
         self.CURRICULUM_ADMIN_EMAIL, self.CURRICULUM_ADMIN_USERNAME)
     self.set_curriculum_admins([self.CURRICULUM_ADMIN_USERNAME]) # type: ignore[no-untyped-call]
     self.user_id_admin = (
         self.get_user_id_from_email(self.CURRICULUM_ADMIN_EMAIL)) # type: ignore[no-untyped-call]
     self.signup(self.EDITOR_EMAIL, self.EDITOR_USERNAME)
     self.editor_id = self.get_user_id_from_email(self.EDITOR_EMAIL) # type: ignore[no-untyped-call]
     config_services.set_property( # type: ignore[no-untyped-call]
         self.user_id_admin, 'classroom_pages_data', [{
             'name': 'math',
             'url_fragment': 'math',
             'topic_ids': [],
             'course_details': '',
             'topic_list_intro': ''
         }])
示例#29
0
 def test_can_get_classroom_by_url_fragment(self) -> None:
     topic_id = topic_fetchers.get_new_topic_id(
     )  # type: ignore[no-untyped-call]
     config_services.set_property(self.user_id_admin,
                                  'classroom_pages_data',
                                  [{
                                      'name': 'math',
                                      'url_fragment': 'math',
                                      'topic_ids': [topic_id],
                                      'course_details': '',
                                      'topic_list_intro': ''
                                  }])
     classroom = classroom_services.get_classroom_by_url_fragment('math')
     assert classroom is not None
     self.assertEqual(classroom.name, 'math')
     self.assertEqual(classroom.url_fragment, 'math')
     self.assertEqual(classroom.topic_ids, [topic_id])
示例#30
0
    def test_email_not_sent_if_content_config_is_partially_modified(self):
        can_send_emails_ctx = self.swap(
            feconf, 'CAN_SEND_EMAILS_TO_USERS', True)

        config_services.set_property(
            self.admin_id, email_manager.SIGNUP_EMAIL_CONTENT.name, {
                'subject': (
                    email_manager.SIGNUP_EMAIL_CONTENT.default_value[
                        'subject']),
                'html_body': 'New HTML body.',
            })

        logged_errors = []

        def _log_error_for_tests(error_message):
            logged_errors.append(error_message)

        log_new_error_counter = test_utils.CallCounter(_log_error_for_tests)
        log_new_error_ctx = self.swap(
            email_manager, 'log_new_error', log_new_error_counter)

        with can_send_emails_ctx, log_new_error_ctx:
            self.assertEqual(log_new_error_counter.times_called, 0)

            self.login(self.EDITOR_EMAIL)
            response = self.testapp.get(feconf.SIGNUP_URL)
            csrf_token = self.get_csrf_token_from_response(response)

            # No user-facing error should surface.
            self.post_json(feconf.SIGNUP_DATA_URL, {
                'agreed_to_terms': True,
                'username': self.EDITOR_USERNAME
            }, csrf_token=csrf_token)

            # However, an error should be recorded in the logs.
            self.assertEqual(log_new_error_counter.times_called, 1)
            self.assertEqual(
                logged_errors[0],
                'Please ensure that the value for the admin config property '
                'SIGNUP_EMAIL_CONTENT is set, before allowing post-signup '
                'emails to be sent.')

            # Check that no email was sent.
            messages = self.mail_stub.get_sent_messages(to=self.EDITOR_EMAIL)
            self.assertEqual(0, len(messages))
示例#31
0
    def test_email_not_sent_if_sending_emails_is_not_enabled(self):
        self.login(self.ADMIN_EMAIL, is_super_admin=True)
        config_services.set_property(
            'committer_id', 'contributor_dashboard_reviewer_emails_is_enabled',
            True)

        with self.cannot_send_emails, self.testapp_swap:
            with self.swap(
                    email_manager,
                    'send_mail_to_notify_contributor_dashboard_reviewers',
                    self._mock_send_contributor_dashboard_reviewers_emails):
                self.get_html_response(
                    '/cron/mail/reviewers/contributor_dashboard_suggestions')

        self.assertEqual(len(self.reviewer_ids), 0)
        self.assertEqual(len(self.reviewers_suggestion_email_infos), 0)

        self.logout()
示例#32
0
 def setUp(self):
     super(EmailDashboardResultTests, self).setUp()
     self.signup(self.USER_A_EMAIL, self.USER_A_USERNAME)
     # User A has one created exploration.
     # User B has one created exploration.
     # Submitter and new_submitter are submitter of query.
     self.user_a_id = self.get_user_id_from_email(self.USER_A_EMAIL)
     self.signup(self.USER_B_EMAIL, self.USER_B_USERNAME)
     self.user_b_id = self.get_user_id_from_email(self.USER_B_EMAIL)
     self.save_new_valid_exploration(self.EXP_ID_1, self.user_a_id, end_state_name="End")
     self.save_new_valid_exploration(self.EXP_ID_2, self.user_b_id, end_state_name="End")
     self.signup(self.SUBMITTER_EMAIL, self.SUBMITTER_USERNAME)
     self.submitter_id = self.get_user_id_from_email(self.SUBMITTER_EMAIL)
     self.signup(self.NEW_SUBMITTER_EMAIL, self.NEW_SUBMITTER_USERNAME)
     self.new_submitter_id = self.get_user_id_from_email(self.NEW_SUBMITTER_EMAIL)
     config_services.set_property(
         self.submitter_id, "whitelisted_email_senders", [self.SUBMITTER_USERNAME, self.NEW_SUBMITTER_USERNAME]
     )
示例#33
0
    def test_email_not_sent_if_notifying_admins_about_suggestions_is_disabled(
            self):
        self.login(self.CURRICULUM_ADMIN_EMAIL, is_super_admin=True)
        config_services.set_property(
            'committer_id',
            'notify_admins_suggestions_waiting_too_long_is_enabled', False)

        with self.can_send_emails, self.testapp_swap:
            with self.swap(
                email_manager,
                'send_mail_to_notify_admins_that_reviewers_are_needed',
                self.mock_send_mail_to_notify_admins_that_reviewers_are_needed):
                self.get_json(
                    '/cron/mail/admins/contributor_dashboard_bottlenecks')

        self.assertEqual(len(self.admin_ids), 0)
        self.assertDictEqual(self.suggestion_types_needing_reviewers, {})

        self.logout()
示例#34
0
    def test_user_banning(self):
        """Test that banned users are banned."""

        exp_id = '0'
        exp_services.load_demo(exp_id)
        rights_manager.release_ownership_of_exploration(
            feconf.SYSTEM_COMMITTER_ID, exp_id)

        # Sign-up new editors Joe and Sandra.
        self.signup('*****@*****.**', 'joe')
        self.signup('*****@*****.**', 'sandra')

        # Joe logs in.
        self.login('*****@*****.**')

        response = self.testapp.get(feconf.LIBRARY_INDEX_URL)
        self.assertEqual(response.status_int, 200)
        response = self.testapp.get('/create/%s' % exp_id)
        self.assertEqual(response.status_int, 200)
        self.assert_can_edit(response.body)

        # Ban joe.
        config_services.set_property(
            feconf.SYSTEM_COMMITTER_ID, 'banned_usernames', ['joe'])

        # Test that Joe is banned. (He can still access the library page.)
        response = self.testapp.get(
            feconf.LIBRARY_INDEX_URL, expect_errors=True)
        self.assertEqual(response.status_int, 200)
        response = self.testapp.get('/create/%s' % exp_id, expect_errors=True)
        self.assertEqual(response.status_int, 200)
        self.assert_cannot_edit(response.body)

        # Joe logs out.
        self.logout()

        # Sandra logs in and is unaffected.
        self.login('*****@*****.**')
        response = self.testapp.get('/create/%s' % exp_id)
        self.assertEqual(response.status_int, 200)
        self.assert_can_edit(response.body)
        self.logout()
示例#35
0
    def setUp(self):
        super(ExplorationRightsTests, self).setUp()
        self.register_editor('*****@*****.**', 'A')
        self.register_editor('*****@*****.**', 'B')
        self.register_editor('*****@*****.**', 'C')
        self.register_editor('*****@*****.**', 'D')
        self.register_editor('*****@*****.**', 'E')
        self.register_editor('*****@*****.**', 'adm')

        self.user_id_a = self.get_user_id_from_email('*****@*****.**')
        self.user_id_b = self.get_user_id_from_email('*****@*****.**')
        self.user_id_c = self.get_user_id_from_email('*****@*****.**')
        self.user_id_d = self.get_user_id_from_email('*****@*****.**')
        self.user_id_e = self.get_user_id_from_email('*****@*****.**')
        self.user_id_admin = self.get_user_id_from_email('*****@*****.**')

        config_services.set_property(feconf.ADMIN_COMMITTER_ID, 'admin_emails',
                                     ['*****@*****.**'])

        self.EXP_ID = 'exp_id'
示例#36
0
    def setUp(self):
        super(ExplorationRightsTests, self).setUp()
        self.register_editor('*****@*****.**', 'A')
        self.register_editor('*****@*****.**', 'B')
        self.register_editor('*****@*****.**', 'C')
        self.register_editor('*****@*****.**', 'D')
        self.register_editor('*****@*****.**', 'E')
        self.register_editor('*****@*****.**', 'adm')

        self.user_id_a = self.get_user_id_from_email('*****@*****.**')
        self.user_id_b = self.get_user_id_from_email('*****@*****.**')
        self.user_id_c = self.get_user_id_from_email('*****@*****.**')
        self.user_id_d = self.get_user_id_from_email('*****@*****.**')
        self.user_id_e = self.get_user_id_from_email('*****@*****.**')
        self.user_id_admin = self.get_user_id_from_email('*****@*****.**')

        config_services.set_property(
            feconf.ADMIN_COMMITTER_ID, 'admin_emails', ['*****@*****.**'])

        self.EXP_ID = 'exp_id'
示例#37
0
    def test_email_sent_to_admin_if_sending_admin_need_reviewers_emails_enabled(
            self):
        self.login(self.ADMIN_EMAIL, is_super_admin=True)
        config_services.set_property(
            'committer_id', 'enable_admin_notifications_for_reviewer_shortage',
            True)

        with self.can_send_emails, self.testapp_swap:
            with self.swap(
                    email_manager,
                    'send_mail_to_notify_admins_that_reviewers_are_needed',
                    self.
                    mock_send_mail_to_notify_admins_that_reviewers_are_needed):
                self.get_html_response(
                    '/cron/mail/admins/contributor_dashboard_bottlenecks')

        self.assertEqual(len(self.admin_ids), 1)
        self.assertEqual(self.admin_ids[0], self.admin_id)
        self.assertDictEqual(self.suggestion_types_needing_reviewers,
                             self.expected_suggestion_types_needing_reviewers)
示例#38
0
    def test_email_not_sent_if_reviewer_ids_is_empty(self):
        self.login(self.CURRICULUM_ADMIN_EMAIL, is_super_admin=True)
        config_services.set_property(
            'committer_id', 'contributor_dashboard_reviewer_emails_is_enabled',
            True)
        user_services.remove_translation_review_rights_in_language(
            self.reviewer_id, self.language_code)

        with self.can_send_emails, self.testapp_swap:
            with self.swap(
                    email_manager,
                    'send_mail_to_notify_contributor_dashboard_reviewers',
                    self._mock_send_contributor_dashboard_reviewers_emails):
                self.get_html_response(
                    '/cron/mail/reviewers/contributor_dashboard_suggestions')

        self.assertEqual(len(self.reviewer_ids), 0)
        self.assertEqual(len(self.reviewers_suggestion_email_infos), 0)

        self.logout()
示例#39
0
    def test_email_with_bad_content_is_not_sent(self):
        can_send_emails_ctx = self.swap(feconf, 'CAN_SEND_EMAILS_TO_USERS',
                                        True)

        config_services.set_property(
            self.ADMIN_ID, email_manager.SIGNUP_EMAIL_CONTENT.name, {
                'subject': 'New email subject',
                'html_body': 'New HTML body.<script>alert(3);</script>',
            })

        logged_errors = []

        def _log_error_for_tests(error_message):
            logged_errors.append(error_message)

        log_new_error_counter = test_utils.CallCounter(_log_error_for_tests)
        log_new_error_ctx = self.swap(email_manager, 'log_new_error',
                                      log_new_error_counter)

        with can_send_emails_ctx, log_new_error_ctx:
            self.assertEqual(log_new_error_counter.times_called, 0)

            self.login(self.EDITOR_EMAIL)
            response = self.testapp.get(feconf.SIGNUP_URL)
            csrf_token = self.get_csrf_token_from_response(response)

            # No user-facing error should surface.
            response_dict = self.post_json(feconf.SIGNUP_DATA_URL, {
                'agreed_to_terms': True,
                'username': self.EDITOR_USERNAME
            },
                                           csrf_token=csrf_token)

            # However, an error should be recorded in the logs.
            self.assertEqual(log_new_error_counter.times_called, 1)
            self.assertTrue(logged_errors[0].startswith(
                'Original email HTML body does not match cleaned HTML body'))

            # Check that no email was sent.
            messages = self.mail_stub.get_sent_messages(to=self.EDITOR_EMAIL)
            self.assertEqual(0, len(messages))
示例#40
0
    def test_user_banning(self):
        """Test that banned users are banned."""

        exp_id = '0'
        exp_services.load_demo(exp_id)
        rights_manager.release_ownership_of_exploration(
            feconf.SYSTEM_COMMITTER_ID, exp_id)

        # Sign-up new editors Joe and Sandra.
        self.signup('*****@*****.**', 'joe')
        self.signup('*****@*****.**', 'sandra')

        # Joe logs in.
        self.login('*****@*****.**')

        response = self.testapp.get(feconf.GALLERY_URL)
        self.assertEqual(response.status_int, 200)
        response = self.testapp.get('/create/%s' % exp_id)
        self.assertEqual(response.status_int, 200)
        self.assert_can_edit(response.body)

        # Ban joe.
        config_services.set_property(
            feconf.SYSTEM_COMMITTER_ID, 'banned_usernames', ['joe'])

        # Test that Joe is banned. (He can still access the gallery.)
        response = self.testapp.get(feconf.GALLERY_URL, expect_errors=True)
        self.assertEqual(response.status_int, 200)
        response = self.testapp.get('/create/%s' % exp_id, expect_errors=True)
        self.assertEqual(response.status_int, 200)
        self.assert_cannot_edit(response.body)

        # Joe logs out.
        self.logout()

        # Sandra logs in and is unaffected.
        self.login('*****@*****.**')
        response = self.testapp.get('/create/%s' % exp_id)
        self.assertEqual(response.status_int, 200)
        self.assert_can_edit(response.body)
        self.logout()
示例#41
0
    def setUp(self):
        """Creates dummy users."""
        super(ExplorationDeletionRightsTest, self).setUp()
        self.admin_email = '*****@*****.**'
        self.owner_email = '*****@*****.**'
        self.editor_email = '*****@*****.**'
        self.viewer_email = '*****@*****.**'

        # Usernames containing the string 'admin' are reserved.
        self.register_editor(self.admin_email, username='******')
        self.register_editor(self.owner_email, username='******')
        self.register_editor(self.editor_email, username='******')
        self.register_editor(self.viewer_email, username='******')

        self.admin_id = self.get_user_id_from_email(self.admin_email)
        self.owner_id = self.get_user_id_from_email(self.owner_email)
        self.editor_id = self.get_user_id_from_email(self.editor_email)
        self.viewer_id = self.get_user_id_from_email(self.viewer_email)

        config_services.set_property(
            feconf.ADMIN_COMMITTER_ID, 'admin_emails', ['*****@*****.**'])
示例#42
0
    def test_email_sent_to_reviewer_if_sending_reviewer_emails_is_enabled(self):
        self.login(self.CURRICULUM_ADMIN_EMAIL, is_super_admin=True)
        config_services.set_property(
            'committer_id',
            'contributor_dashboard_reviewer_emails_is_enabled', True)

        with self.can_send_emails, self.testapp_swap:
            with self.swap(
                email_manager,
                'send_mail_to_notify_contributor_dashboard_reviewers',
                self._mock_send_contributor_dashboard_reviewers_emails):
                self.get_json(
                    '/cron/mail/reviewers/contributor_dashboard_suggestions')

        self.assertEqual(len(self.reviewer_ids), 1)
        self.assertEqual(self.reviewer_ids[0], self.reviewer_id)
        self.assertEqual(len(self.reviewers_suggestion_email_infos), 1)
        self.assertEqual(len(self.reviewers_suggestion_email_infos[0]), 1)
        self._assert_reviewable_suggestion_email_infos_are_equal(
            self.reviewers_suggestion_email_infos[0][0],
            self.expected_reviewable_suggestion_email_info)
示例#43
0
    def test_email_not_sent_if_config_does_not_permit_it(self):
        with self.swap(feconf, 'CAN_SEND_EMAILS_TO_USERS', False):
            config_services.set_property(
                self.admin_id, email_manager.EMAIL_FOOTER.name,
                self.new_footer)
            config_services.set_property(
                self.admin_id, email_manager.SIGNUP_EMAIL_CONTENT.name,
                self.new_email_content)

            self.login(self.EDITOR_EMAIL)
            response = self.testapp.get(feconf.SIGNUP_URL)
            csrf_token = self.get_csrf_token_from_response(response)

            self.post_json(feconf.SIGNUP_DATA_URL, {
                'agreed_to_terms': True,
                'username': self.EDITOR_USERNAME
            }, csrf_token=csrf_token)

            # Check that no email was sent.
            messages = self.mail_stub.get_sent_messages(to=self.EDITOR_EMAIL)
            self.assertEqual(0, len(messages))
示例#44
0
    def test_email_with_bad_content_is_not_sent(self):
        can_send_emails_ctx = self.swap(
            feconf, 'CAN_SEND_EMAILS_TO_USERS', True)

        config_services.set_property(
            self.admin_id, email_manager.SIGNUP_EMAIL_CONTENT.name, {
                'subject': 'New email subject',
                'html_body': 'New HTML body.<script>alert(3);</script>',
            })

        logged_errors = []

        def _log_error_for_tests(error_message):
            logged_errors.append(error_message)

        log_new_error_counter = test_utils.CallCounter(_log_error_for_tests)
        log_new_error_ctx = self.swap(
            email_manager, 'log_new_error', log_new_error_counter)

        with can_send_emails_ctx, log_new_error_ctx:
            self.assertEqual(log_new_error_counter.times_called, 0)

            self.login(self.EDITOR_EMAIL)
            response = self.testapp.get(feconf.SIGNUP_URL)
            csrf_token = self.get_csrf_token_from_response(response)

            # No user-facing error should surface.
            self.post_json(feconf.SIGNUP_DATA_URL, {
                'agreed_to_terms': True,
                'username': self.EDITOR_USERNAME
            }, csrf_token=csrf_token)

            # However, an error should be recorded in the logs.
            self.assertEqual(log_new_error_counter.times_called, 1)
            self.assertTrue(logged_errors[0].startswith(
                'Original email HTML body does not match cleaned HTML body'))

            # Check that no email was sent.
            messages = self.mail_stub.get_sent_messages(to=self.EDITOR_EMAIL)
            self.assertEqual(0, len(messages))
示例#45
0
    def test_contents_of_signup_email_are_correct(self):
        with self.swap(feconf, 'CAN_SEND_EMAILS_TO_USERS', True):
            config_services.set_property(
                self.admin_id, email_manager.EMAIL_FOOTER.name,
                self.new_footer)
            config_services.set_property(
                self.admin_id, email_manager.SIGNUP_EMAIL_CONTENT.name,
                self.new_email_content)
            config_services.set_property(
                self.admin_id, email_manager.EMAIL_SENDER_NAME.name,
                'Email Sender')

            self.login(self.EDITOR_EMAIL)
            response = self.testapp.get(feconf.SIGNUP_URL)
            csrf_token = self.get_csrf_token_from_response(response)

            self.post_json(feconf.SIGNUP_DATA_URL, {
                'agreed_to_terms': True,
                'username': self.EDITOR_USERNAME
            }, csrf_token=csrf_token)

            # Check that an email was sent with the correct content.
            messages = self.mail_stub.get_sent_messages(to=self.EDITOR_EMAIL)
            self.assertEqual(1, len(messages))

            self.assertEqual(
                messages[0].sender,
                'Email Sender <%s>' % feconf.SYSTEM_EMAIL_ADDRESS)
            self.assertEqual(messages[0].to, self.EDITOR_EMAIL)
            self.assertEqual(messages[0].subject, 'Welcome!')
            self.assertEqual(
                messages[0].body.decode(), self.expected_text_email_content)
            self.assertEqual(
                messages[0].html.decode(), self.expected_html_email_content)
示例#46
0
    def test_contents_of_signup_email_are_correct(self):
        with self.swap(feconf, 'CAN_SEND_EMAILS_TO_USERS', True):
            config_services.set_property(self.ADMIN_ID,
                                         email_manager.EMAIL_FOOTER.name,
                                         self.NEW_FOOTER)
            config_services.set_property(
                self.ADMIN_ID, email_manager.SIGNUP_EMAIL_CONTENT.name,
                self.NEW_EMAIL_CONTENT)
            config_services.set_property(self.ADMIN_ID,
                                         email_manager.EMAIL_SENDER_NAME.name,
                                         'Email Sender')

            self.login(self.EDITOR_EMAIL)
            response = self.testapp.get(feconf.SIGNUP_URL)
            csrf_token = self.get_csrf_token_from_response(response)

            response_dict = self.post_json(feconf.SIGNUP_DATA_URL, {
                'agreed_to_terms': True,
                'username': self.EDITOR_USERNAME
            },
                                           csrf_token=csrf_token)

            # Check that an email was sent with the correct content.
            messages = self.mail_stub.get_sent_messages(to=self.EDITOR_EMAIL)
            self.assertEqual(1, len(messages))

            self.assertEqual(messages[0].sender,
                             'Email Sender <%s>' % feconf.SYSTEM_EMAIL_ADDRESS)
            self.assertEqual(messages[0].to, self.EDITOR_EMAIL)
            self.assertEqual(messages[0].subject, 'Welcome!')
            self.assertEqual(messages[0].body.decode(),
                             self.EXPECTED_PLAINTEXT_EMAIL_CONTENT)
            self.assertEqual(messages[0].html.decode(),
                             self.EXPECTED_HTML_EMAIL_CONTENT)
    def test_can_suggest_questions_flag_in_response(self):
        user_email = '*****@*****.**'
        self.signup(user_email, 'user')
        user_id = self.get_user_id_from_email(user_email)
        self.login(user_email)
        config_services.set_property('admin',
                                     'contributor_can_suggest_questions',
                                     False)

        response = self.get_json('/usercontributionrightsdatahandler')
        self.assertEqual(
            response, {
                'can_review_translation_for_language_codes': [],
                'can_review_voiceover_for_language_codes': [],
                'can_review_questions': False,
                'can_suggest_questions': False
            })

        user_services.allow_user_to_submit_question(user_id)

        response = self.get_json('/usercontributionrightsdatahandler')
        self.assertEqual(
            response, {
                'can_review_translation_for_language_codes': [],
                'can_review_voiceover_for_language_codes': [],
                'can_review_questions': False,
                'can_suggest_questions': False
            })

        config_services.set_property('admin',
                                     'contributor_can_suggest_questions', True)

        response = self.get_json('/usercontributionrightsdatahandler')
        self.assertEqual(
            response, {
                'can_review_translation_for_language_codes': [],
                'can_review_voiceover_for_language_codes': [],
                'can_review_questions': False,
                'can_suggest_questions': True
            })
示例#48
0
    def test_user_banning(self):
        """Test that banned users are banned."""
        EXP_ID = '0'
        exp_services.delete_demo(EXP_ID)
        exp_services.load_demo(EXP_ID)

        # Register new editors Joe and Sandra.
        self.register_editor('*****@*****.**', username='******')
        self.register_editor('*****@*****.**', username='******')

        # Joe logs in.
        self.login('*****@*****.**')

        response = self.testapp.get('/contribute', expect_errors=True)
        self.assertEqual(response.status_int, 200)
        response = self.testapp.get('/create/%s' % EXP_ID)
        self.assertEqual(response.status_int, 200)
        self.assert_can_edit(response.body)

        # Ban joe.
        config_services.set_property(
            feconf.ADMIN_COMMITTER_ID, 'banned_usernames', ['joe'])

        # Test that Joe is banned.
        response = self.testapp.get('/contribute', expect_errors=True)
        self.assertEqual(response.status_int, 401)
        response = self.testapp.get('/create/%s' % EXP_ID, expect_errors=True)
        self.assertEqual(response.status_int, 200)
        self.assert_cannot_edit(response.body)

        # Joe logs out.
        self.logout()

        # Sandra logs in and is unaffected.
        self.login('*****@*****.**')
        response = self.testapp.get('/create/%s' % EXP_ID)
        self.assertEqual(response.status_int, 200)
        self.assert_can_edit(response.body)
        self.logout()
示例#49
0
    def test_email_not_sent_if_config_does_not_permit_it(self):
        with self.swap(feconf, 'CAN_SEND_EMAILS_TO_USERS', False):
            config_services.set_property(self.ADMIN_ID,
                                         email_manager.EMAIL_FOOTER.name,
                                         self.NEW_FOOTER)
            config_services.set_property(
                self.ADMIN_ID, email_manager.SIGNUP_EMAIL_CONTENT.name,
                self.NEW_EMAIL_CONTENT)

            self.login(self.EDITOR_EMAIL)
            response = self.testapp.get(feconf.SIGNUP_URL)
            csrf_token = self.get_csrf_token_from_response(response)

            response_dict = self.post_json(feconf.SIGNUP_DATA_URL, {
                'agreed_to_terms': True,
                'username': self.EDITOR_USERNAME
            },
                                           csrf_token=csrf_token)

            # Check that no email was sent.
            messages = self.mail_stub.get_sent_messages(to=self.EDITOR_EMAIL)
            self.assertEqual(0, len(messages))
示例#50
0
    def test_user_banning(self):
        """Test that banned users are banned."""
        EXP_ID = '0'
        exp_services.delete_demo(EXP_ID)
        exp_services.load_demo(EXP_ID)

        # Sign-up new editors Joe and Sandra.
        self.signup('*****@*****.**', 'joe')
        self.signup('*****@*****.**', 'sandra')

        # Joe logs in.
        self.login('*****@*****.**')

        response = self.testapp.get(feconf.GALLERY_URL)
        self.assertEqual(response.status_int, 200)
        response = self.testapp.get('/create/%s' % EXP_ID)
        self.assertEqual(response.status_int, 200)
        self.assert_can_edit(response.body)

        # Ban joe.
        config_services.set_property(
            feconf.SYSTEM_COMMITTER_ID, 'banned_usernames', ['joe'])

        # Test that Joe is banned. (He can still access the gallery.)
        response = self.testapp.get(feconf.GALLERY_URL, expect_errors=True)
        self.assertEqual(response.status_int, 200)
        response = self.testapp.get('/create/%s' % EXP_ID, expect_errors=True)
        self.assertEqual(response.status_int, 200)
        self.assert_cannot_edit(response.body)

        # Joe logs out.
        self.logout()

        # Sandra logs in and is unaffected.
        self.login('*****@*****.**')
        response = self.testapp.get('/create/%s' % EXP_ID)
        self.assertEqual(response.status_int, 200)
        self.assert_can_edit(response.body)
        self.logout()
示例#51
0
    def test_user_banning(self):
        """Test that banned users are banned."""

        EXP_ID = "0"
        exp_services.load_demo(EXP_ID)
        rights_manager.release_ownership_of_exploration(feconf.SYSTEM_COMMITTER_ID, EXP_ID)

        # Sign-up new editors Joe and Sandra.
        self.signup("*****@*****.**", "joe")
        self.signup("*****@*****.**", "sandra")

        # Joe logs in.
        self.login("*****@*****.**")

        response = self.testapp.get(feconf.GALLERY_URL)
        self.assertEqual(response.status_int, 200)
        response = self.testapp.get("/create/%s" % EXP_ID)
        self.assertEqual(response.status_int, 200)
        self.assert_can_edit(response.body)

        # Ban joe.
        config_services.set_property(feconf.SYSTEM_COMMITTER_ID, "banned_usernames", ["joe"])

        # Test that Joe is banned. (He can still access the gallery.)
        response = self.testapp.get(feconf.GALLERY_URL, expect_errors=True)
        self.assertEqual(response.status_int, 200)
        response = self.testapp.get("/create/%s" % EXP_ID, expect_errors=True)
        self.assertEqual(response.status_int, 200)
        self.assert_cannot_edit(response.body)

        # Joe logs out.
        self.logout()

        # Sandra logs in and is unaffected.
        self.login("*****@*****.**")
        response = self.testapp.get("/create/%s" % EXP_ID)
        self.assertEqual(response.status_int, 200)
        self.assert_can_edit(response.body)
        self.logout()
示例#52
0
 def setUp(self):
     super(EmailDashboardResultTests, self).setUp()
     self.signup(self.USER_A_EMAIL, self.USER_A_USERNAME)
     # User A has one created exploration.
     # User B has one created exploration.
     # Submitter and new_submitter are submitter of query.
     self.user_a_id = self.get_user_id_from_email(self.USER_A_EMAIL)
     self.signup(self.USER_B_EMAIL, self.USER_B_USERNAME)
     self.user_b_id = self.get_user_id_from_email(self.USER_B_EMAIL)
     self.save_new_valid_exploration(self.EXP_ID_1,
                                     self.user_a_id,
                                     end_state_name='End')
     self.save_new_valid_exploration(self.EXP_ID_2,
                                     self.user_b_id,
                                     end_state_name='End')
     self.signup(self.SUBMITTER_EMAIL, self.SUBMITTER_USERNAME)
     self.submitter_id = self.get_user_id_from_email(self.SUBMITTER_EMAIL)
     self.signup(self.NEW_SUBMITTER_EMAIL, self.NEW_SUBMITTER_USERNAME)
     self.new_submitter_id = self.get_user_id_from_email(
         self.NEW_SUBMITTER_EMAIL)
     config_services.set_property(
         self.submitter_id, 'whitelisted_email_senders',
         [self.SUBMITTER_USERNAME, self.NEW_SUBMITTER_USERNAME])
示例#53
0
    def setUp(self):
        super(ModeratorEmailsTest, self).setUp()
        self.signup(self.EDITOR_EMAIL, self.EDITOR_USERNAME)
        self.editor_id = self.get_user_id_from_email(self.EDITOR_EMAIL)

        self.signup(self.MODERATOR_EMAIL, self.MODERATOR_USERNAME)
        self.set_moderators([self.MODERATOR_EMAIL])

        # The editor publishes an exploration.
        self.save_new_valid_exploration(
            self.EXP_ID, self.editor_id, title='My Exploration',
            end_state_name='END')
        rights_manager.publish_exploration(self.editor_id, self.EXP_ID)

        # Set the default email config.
        self.signup(self.ADMIN_EMAIL, self.ADMIN_USERNAME)
        self.admin_id = self.get_user_id_from_email(self.ADMIN_EMAIL)
        config_services.set_property(
            self.admin_id, 'publicize_exploration_email_html_body',
            'Default publicization email body')
        config_services.set_property(
            self.admin_id, 'unpublish_exploration_email_html_body',
            'Default unpublishing email body')
示例#54
0
    def test_record_of_sent_email_is_written_to_datastore(self):
        with self.swap(feconf, 'CAN_SEND_EMAILS_TO_USERS', True):
            config_services.set_property(
                self.admin_id, email_manager.EMAIL_FOOTER.name,
                self.new_footer)
            config_services.set_property(
                self.admin_id, email_manager.SIGNUP_EMAIL_CONTENT.name,
                self.new_email_content)
            config_services.set_property(
                self.admin_id, email_manager.EMAIL_SENDER_NAME.name,
                'Email Sender')

            all_models = email_models.SentEmailModel.get_all().fetch()
            self.assertEqual(len(all_models), 0)

            self.login(self.EDITOR_EMAIL)
            response = self.testapp.get(feconf.SIGNUP_URL)
            csrf_token = self.get_csrf_token_from_response(response)

            self.post_json(feconf.SIGNUP_DATA_URL, {
                'agreed_to_terms': True,
                'username': self.EDITOR_USERNAME
            }, csrf_token=csrf_token)

            # Check that a new email was sent.
            messages = self.mail_stub.get_sent_messages(to=self.EDITOR_EMAIL)
            self.assertEqual(1, len(messages))

            # Check that the content of this email was recorded in
            # SentEmailModel.
            all_models = email_models.SentEmailModel.get_all().fetch()
            self.assertEqual(len(all_models), 1)

            # Check that the contents of the model are correct.
            sent_email_model = all_models[0]

            self.assertEqual(
                sent_email_model.recipient_id,
                self.get_user_id_from_email(self.EDITOR_EMAIL))
            self.assertEqual(
                sent_email_model.recipient_email, self.EDITOR_EMAIL)
            self.assertEqual(
                sent_email_model.sender_id, feconf.SYSTEM_COMMITTER_ID)
            self.assertEqual(
                sent_email_model.sender_email,
                'Email Sender <%s>' % feconf.SYSTEM_EMAIL_ADDRESS)
            self.assertEqual(
                sent_email_model.intent, feconf.EMAIL_INTENT_SIGNUP)
            self.assertEqual(
                sent_email_model.subject, 'Welcome!')
            self.assertEqual(
                sent_email_model.html_body, self.expected_html_email_content)
示例#55
0
    def post(self):
        """Handles POST requests."""
        try:
            if self.payload.get('action') == 'reload_exploration':
                exploration_id = self.payload.get('exploration_id')
                logging.info(
                    '[ADMIN] %s reloaded exploration %s' %
                    (self.user_id, exploration_id))
                exp_services.load_demo(unicode(exploration_id))
                rights_manager.release_ownership_of_exploration(
                    feconf.SYSTEM_COMMITTER_ID, unicode(exploration_id))
            elif self.payload.get('action') == 'reload_collection':
                collection_id = self.payload.get('collection_id')
                logging.info(
                    '[ADMIN] %s reloaded collection %s' %
                    (self.user_id, collection_id))
                collection_services.load_demo(unicode(collection_id))
                rights_manager.release_ownership_of_collection(
                    feconf.SYSTEM_COMMITTER_ID, unicode(collection_id))
            elif self.payload.get('action') == 'clear_search_index':
                exp_services.clear_search_index()
            elif self.payload.get('action') == 'save_config_properties':
                new_config_property_values = self.payload.get(
                    'new_config_property_values')
                logging.info('[ADMIN] %s saved config property values: %s' %
                             (self.user_id, new_config_property_values))
                for (name, value) in new_config_property_values.iteritems():
                    config_services.set_property(self.user_id, name, value)
            elif self.payload.get('action') == 'revert_config_property':
                config_property_id = self.payload.get('config_property_id')
                logging.info('[ADMIN] %s reverted config property: %s' %
                             (self.user_id, config_property_id))
                config_services.revert_property(
                    self.user_id, config_property_id)
            elif self.payload.get('action') == 'start_new_job':
                for klass in jobs_registry.ONE_OFF_JOB_MANAGERS:
                    if klass.__name__ == self.payload.get('job_type'):
                        klass.enqueue(klass.create_new())
                        break
            elif self.payload.get('action') == 'cancel_job':
                job_id = self.payload.get('job_id')
                job_type = self.payload.get('job_type')
                for klass in jobs_registry.ONE_OFF_JOB_MANAGERS:
                    if klass.__name__ == job_type:
                        klass.cancel(job_id, self.user_id)
                        break
            elif self.payload.get('action') == 'start_computation':
                computation_type = self.payload.get('computation_type')
                for klass in jobs_registry.ALL_CONTINUOUS_COMPUTATION_MANAGERS:
                    if klass.__name__ == computation_type:
                        klass.start_computation()
                        break
            elif self.payload.get('action') == 'stop_computation':
                computation_type = self.payload.get('computation_type')
                for klass in jobs_registry.ALL_CONTINUOUS_COMPUTATION_MANAGERS:
                    if klass.__name__ == computation_type:
                        klass.stop_computation(self.user_id)
                        break
            elif self.payload.get('action') == 'upload_topic_similarities':
                data = self.payload.get('data')
                recommendations_services.update_topic_similarities(data)

            self.render_json({})
        except Exception as e:
            self.render_json({'error': unicode(e)})
            raise
示例#56
0
    def test_exploration_rights_handler(self):
        """Test exploration rights handler."""

        # Create several users
        self.register_editor(self.ADMIN_EMAIL, username='******')
        self.register_editor(self.OWNER_EMAIL, username='******')
        self.register_editor(self.COLLABORATOR_EMAIL, username='******')
        self.register_editor(self.VIEWER_EMAIL, username='******')

        self.admin_id = self.get_user_id_from_email(self.ADMIN_EMAIL)
        self.owner_id = self.get_user_id_from_email(self.OWNER_EMAIL)
        self.collaborator_id = self.get_user_id_from_email(
            self.COLLABORATOR_EMAIL)
        self.viewer_id = self.get_user_id_from_email(self.VIEWER_EMAIL)

        config_services.set_property(
            feconf.ADMIN_COMMITTER_ID, 'admin_emails', ['*****@*****.**'])

        # Owner creates exploration
        self.login(self.OWNER_EMAIL)
        EXP_ID = 'eid'
        exploration = exp_domain.Exploration.create_default_exploration(
            EXP_ID, 'Title for rights handler test!',
            'My category')
        exploration.add_states(['State A', 'State 2', 'State 3'])
        exp_services.save_new_exploration(self.owner_id, exploration)

        response = self.testapp.get(
            '%s/%s' % (feconf.EDITOR_URL_PREFIX, EXP_ID))
        csrf_token = self.get_csrf_token_from_response(response)

        # Owner adds rights for other users
        rights_url = '%s/%s' % (feconf.EXPLORATION_RIGHTS_PREFIX, EXP_ID)
        response_dict = self.put_json(
            rights_url, {
                'version': exploration.version,
                'new_member_email': self.VIEWER_EMAIL,
                'new_member_role': rights_manager.ROLE_VIEWER
            }, csrf_token)
        response_dict = self.put_json(
            rights_url, {
                'version': exploration.version,
                'new_member_email': self.COLLABORATOR_EMAIL,
                'new_member_role': rights_manager.ROLE_EDITOR
            }, csrf_token)

        self.logout()

        # Check that viewer can access editor page but cannot edit.
        self.login(self.VIEWER_EMAIL)
        response = self.testapp.get('/create/%s' % EXP_ID, expect_errors=True)
        self.assertEqual(response.status_int, 200)
        self.assert_cannot_edit(response.body)
        self.logout()

        # Check that collaborator can access editor page and can edit.
        self.login(self.COLLABORATOR_EMAIL)
        response = self.testapp.get('/create/%s' % EXP_ID)
        self.assertEqual(response.status_int, 200)
        self.assert_can_edit(response.body)
        csrf_token = self.get_csrf_token_from_response(response)

        # Check that collaborator can add a new state called 'State 4'
        add_url = '%s/%s' % (feconf.EXPLORATION_DATA_PREFIX, EXP_ID)
        response_dict = self.put_json(
            add_url,
            {
                'version': exploration.version,
                'commit_message': 'Added State 4',
                'change_list': [{
                    'cmd': 'add_state',
                    'state_name': 'State 4'
                }]
            },
            csrf_token=csrf_token,
            expected_status_int=200
        )
        self.assertIn('State 4', response_dict['states'])

        # Check that collaborator cannot add new members
        exploration = exp_services.get_exploration_by_id(EXP_ID)
        rights_url = '%s/%s' % (feconf.EXPLORATION_RIGHTS_PREFIX, EXP_ID)
        response_dict = self.put_json(
            rights_url, {
                'version': exploration.version,
                'new_member_email': self.VIEWER2_EMAIL,
                'new_member_role': rights_manager.ROLE_VIEWER
            }, csrf_token, expect_errors=True, expected_status_int=401)
        self.assertEqual(response_dict['code'], 401)

        response_dict = self.put_json(
            rights_url, {
                'version': exploration.version,
                'new_member_email': self.COLLABORATOR2_EMAIL,
                'new_member_role': rights_manager.ROLE_EDITOR,
                }, csrf_token, expect_errors=True, expected_status_int=401)
        self.assertEqual(response_dict['code'], 401)

        self.logout()